InitOrigin
io-cli · Apache-2.0 · ओपन सोर्स

एक एजेंट जो अपना काम दिखाता है।

io-cli एक टर्मिनल कोडिंग एजेंट है। io-harness उसके नीचे चलने वाला embeddable Rust रनटाइम है। दोनों ओपन सोर्स हैं, दोनों आपकी ही provider keys पर चलते हैं, और कोई भी यह नहीं छिपाता कि हुआ क्या।

Every artifact is checked against SHA256SUMS before it is unpacked

io-cli · ~/scratchpad/demo-run3 · run 165done · 39s
The billing test suite has one failing test. Find the root cause, fix it in the source rather than in the test, and run the suite again to confirm all five tests pass.
· thought · 12.4s · 21 tok
List . · 3 entries · ~0ms
Search billing · 3 hits · ~0ms
List billing · 2 entries · ~0ms
List tests · 2 entries · ~0ms
Read billing/windows.py · ~0ms
Read tests/test_windows.py · ~0ms
· thought · 1.6s · 97 tok
· a sandbox was created · macos-sandbox-exec
Run · python unavailable · ~37ms
no python on PATH. This machine cannot run that command; try another, or carry on without it.
· thought · 3.8s · 385 tok
Run · python3 exit 1 · ~102ms
..F..
FAIL: test_heartbeat_run_collapses_to_one_window
AssertionError: 6 != 1
· thought · 1.7s · 81 tok
Edit billing/windows.py · edited · ~0ms
billing/windows.py · +1 -1 · edit_file
@@ -33,7 +33,7 @@
35 last = merged[-1]
36 - if window.start < last.end:
36 + if window.start <= last.end:
37 merged[-1] = Window(last.start, max(last.end, window.end))
· a sandbox was created · macos-sandbox-exec
Run · python3 exit 0 · ~62ms
..... Ran 5 tests in 0.001s OK
· thought · 13.4s · 371 tok · confirms it once more
Run · python3 exit 0 · ~57ms
..... Ran 5 tests in 0.001s OK
Fixed. The failing test was test_heartbeat_run_collapses_to_one_window, and the root cause was in merge_windows in billing/windows.py:42: the merge condition was window.start < last.end, so end-to-start touching windows (a 10-second heartbeat ending exactly when the next starts) were not collapsed.
· thought · 1.8s · 41 tok
Changed it to window.start <= last.end so touching windows merge into one. The suite now passes all 5 tests (python3 -m unittest discover -s tests → OK).
· run 165 · 9 steps · 11 tool calls · 85,694 tok · 51% cached · $0.0036 · 39s · exit 0
>
ready · deepseek/deepseek-v4-flash-0731 · openrouter39s
9 steps · 85.7k tok · ctx 37% · $0.0036 · boundary verified · / for commandsworkspace · workspace-write/macos-sandbox-exec

License

Apache-2.0

Core

Rust 1.95+

Pricing

शुरुआत ₹0 से

Keys

keys आपके पास ही

अभी बन रहा है

एक रनटाइम। उसके ऊपर एक टर्मिनल।

हम नींव वाली परत बनाते हैं और मुफ़्त देते हैं। उसके ऊपर आप जो बनाएँ, वह आपका है।

io-harness

on crates.io

यही आधार है। Rust के लिए embeddable एजेंट रनटाइम। आप एक contract देते हैं — काम, वह workspace जिसे छूने की इजाज़त है, और क्या पढ़ा, लिखा, चलाया और dial किया जा सकता है — और यह लूप चलाकर नतीजा लौटाता है।

  • Cargo.toml में एक लाइन: cargo add io-harness। कोई daemon, कोई अकाउंट, कोई telemetry नहीं
  • OpenRouter, Anthropic और OpenAI सीधे, साथ में 21 OpenAI-जैसे presets — जिनमें 8 लोकल रनटाइम
  • हर step, हर refusal और हर बजट ख़र्च एक SQLite trace में, जो आपका है

io-cli

terminal

इसी पर बना टर्मिनल एजेंट। हर पूरी हुई लाइन आपके टर्मिनल के अपने scrollback में जाती है; ऊपर दो पंक्तियाँ बताती रहती हैं कि अभी क्या हो रहा है, कितना ख़र्च हुआ, और इजाज़त क्या है।

  • लिखने से पहले run रुकता है और diff दिखाता है: y, a या n, फिर Enter — वहीं जहाँ पूछा गया
  • posture footer पर दिखती है, और Shift+Tab अगली बारी से उसे बदल देता है
  • /resume पुराना session खोलकर वही सवाल पूछता है जिस पर उसका run रुका था

01 — harness

Embeddable, होस्टेड नहीं

crate के रूप में जोड़िए और उसी प्रोसेस में चलाइए। कोई binary, कोई daemon, कोई UI, कोई अकाउंट और कोई telemetry नहीं — डिफ़ॉल्ट बिल्ड में एक भी optional dependency नहीं।

02 — harness

हर step पर टिकाऊ

हर पूरे हुए step के बाद trace, बजट ख़र्च और एक checkpoint — सब एक ही transaction में। क्रैश के बाद पूरा पेड़ वहीं से चलता है: न step दोहराए जाते हैं, न दोबारा पैसा लगता है।

03 — harness

कोई भी provider

OpenRouter, Anthropic और OpenAI क्रेट के अपने HTTP+SSE क्लाइंट पर, किसी भी OpenAI-जैसे endpoint के लिए एक Compatible provider, 21 वेंडर presets, और उनके बीच fallback।

04 — harness

सीमा, trace के साथ

पढ़ने, लिखने, चलाने और नेटवर्क पर परतदार deny-first नियम। हर refusal trace में है, उस नियम और उस परत के नाम के साथ जिसने उसे रोका।

05 — cli

टर्मिनल आपसे नहीं छीनता

कोई alternate screen नहीं, कोई mouse capture नहीं — किसी भी mode में, किसी भी flag के पीछे। सर्च, सेलेक्शन और tmux copy-mode चलते रहते हैं, और यह बदले तो एक टेस्ट बिल्ड फ़ेल कर देता है।

06 — cli

मंज़ूरी वहीं, जहाँ पूछी गई

लिखने से पहले run रुकता है और प्रस्तावित diff दिखाता है। y, a या n चुनिए और Enter से पक्का कीजिए — इसलिए वाक्य के बीच का कोई अक्षर लिखने का फ़ैसला नहीं कर सकता। 'इस session के लिए' उसी act को उसी target पर याद रखता है।

07 — cli

आपकी key, स्क्रीन पर कभी नहीं

wizard key को लाइव endpoint पर जाँचता है, फ़ाइल 0600 पर लिखता है, और provider का env var पहले से सेट हो तो key कहीं लिखता ही नहीं।

08 — cli

ख़र्च, और नतीजा

/cost पैसा और टोकन — run, session, मॉडल और दिन के हिसाब से; /stats नतीजे, पहली कोशिश, gate फ़ेल और latency। कुछ भी अंदाज़े से नहीं।

एक रिपॉज़िटरी पर टिकाऊ बातचीत

src/main.rs
use io_harness::{ApproveAll, OpenRouter, Policy, Session, Store};

let provider = OpenRouter::from_env()?;
let store = Store::open("runs.db")?;

let policy = Policy::default()
    .layer("app")
    .allow_read("*")
    .allow_write("src/*")
    .deny_read("secrets/*")
    .allow_exec("cargo test*")
    .deny_exec("cargo publish*");

let mut session = Session::open(&store, "/path/to/repo")?;
let turn = session
    .turn("the test suite is failing; why?", &provider, &store, &policy, &ApproveAll)
    .await?;

println!("{}", turn.reply.unwrap_or_default());

छत्तीस कमांड, चार समूहों में

ioबिना subcommand, इसी रिपॉज़िटरी में एक session खुल जाता है
/modelअगली बारी किस मॉडल को जाए, यह बदलिए — सिर्फ़ इस session के लिए
/resumeपुराना session खोलिए और उसका run जिस पर रुका था, उसका जवाब दीजिए
/statusपूरी session स्थिति scrollback में: policy परतें, sandbox backend, caps, बजट, कनेक्शन

रिलीज़ और स्थिरता

अभीio-harness crates.io पर। io-cli हर GitHub Release पर checksum-जाँची binaries के रूप में — macOS, Linux, Windows — और वह उसी harness रिलीज़ पर pinned है जिस पर बना।
1.0 से पहलेकोई भी minor रिलीज़ session की शक्ल बदल सकती है। हर बदलाव CHANGELOG.md में लिखा है, और पुरानी रिलीज़ के लिए लिखी config फ़ाइल चलती रहती है।
1.0जब मालिक कहे, उससे पहले नहीं। तब तक CONTRACT.md ही वह है जिस पर कोई स्क्रिप्ट भरोसा कर सकती है: argv, exit codes, config keys और वे पाथ जहाँ io लिखता है।

भारत पहले

यहाँ बना। यहाँ के हिसाब से दाम।

भारत में बना, दुनिया के लिए।

ज़्यादातर एजेंट टूलिंग डॉलर में बिकती है और सिर्फ़ गीगाबिट अंग्रेज़ी पर टेस्ट होती है। हम दूसरे सिरे से शुरू करते हैं: कोयंबटूर का एक छात्र साझा वाई-फ़ाई पर, इंदौर की चार लोगों की टीम ₹3,000 के बजट में, और मुंबई का एक बैंक जिसका कोड इमारत से बाहर नहीं जा सकता।

01 — रुपये में

बिलिंग रुपये में, चेकआउट पर UPI। डेव टूल पर कोई FX मार्कअप नहीं।

02 — धीमे नेट पर भी

रुका हुआ run फिर चल पड़ता है: /resume उसी सवाल का जवाब देकर उसी step से आगे बढ़ता है, शुरू से नहीं।

03 — भारतीय भाषाएँ

prompt और eval पैक जो हिंदी, तमिल और मिली-जुली अंग्रेज़ी पर टिकें — अभी खुले में बन रहे हैं।

04 — डेटा यहीं रहता है

पूरी तरह लोकल चलाइए, या भारतीय रीजन में सेल्फ़-होस्ट कीजिए। शुरू से DPDP का ध्यान।

कीमत · ₹ में, कन्वर्ट करके नहीं

फ़्री कोई ट्रायल नहीं है।

अपने provider जोड़िए और सब कुछ इस्तेमाल कीजिए। Apache-2.0, सेल्फ़-होस्ट, कोई seat गिनती नहीं, कोई साइन-अप दीवार नहीं।

  • अपनी keys लाइए — कोई भी provider, लोकल मॉडल भी
  • अपनी मशीन पर असीमित sessions
  • पूरा io-harness रनटाइम, अपने कोड में embed करने योग्य
  • परतदार permission boundary और हर run का SQLite trace
  • GitHub Discussions पर कम्युनिटी सपोर्ट

पेड प्लान आने पर फ़्री ख़राब हो जाएगा?

नहीं। आज जो चलता है, वह paywall के पीछे नहीं जाएगा। पेड प्लान होस्टिंग और टीम फ़ीचर हैं, रनटाइम नहीं।

io अकाउंट ज़रूरी है?

फ़्री के लिए नहीं। इंस्टॉल कीजिए, provider key डालिए, चलाइए।

मॉडल का ख़र्च शामिल है?

फ़्री में आप सीधे अपने provider को देते हैं — हम टोकन पर मार्कअप नहीं लगाते। मैनेज्ड इनफ़रेंस Go प्लान में जुड़ता है।

इंस्टॉल

एक कमांड, चारों प्लैटफ़ॉर्म पर।

दोनों स्क्रिप्ट आपकी मशीन के लिए सही बिल्ड चुनती हैं, unpack करने से पहले SHA256SUMS से जाँचती हैं, और आपकी ही डायरेक्टरी में इंस्टॉल करती हैं — न administrator अधिकार, न shell profile या PATH में कोई बदलाव। tap और bucket इसी रिपॉज़िटरी में रहते हैं, इसीलिए brew tap और scoop bucket add में URL देना पड़ता है। crates.io पर publish नहीं है: सोर्स से बनाने के लिए Rust 1.95 या ऊपर।

macOS · Linuxcurl -fsSL https://raw.githubusercontent.com/initorigin/io-cli/main/install.sh | sh
Windowsirm https://raw.githubusercontent.com/initorigin/io-cli/main/install.ps1 | iex
Homebrewbrew tap initorigin/io-cli https://github.com/initorigin/io-cli brew install initorigin/io-cli/io
Scoopscoop bucket add io-cli https://github.com/initorigin/io-cli scoop install io
From sourcegit clone https://github.com/initorigin/io-cli cargo build --release · Rust 1.95+
cargo installNot a path — there is no crates.io publish. The channel is the GitHub Release
IO_VERSION · IO_INSTALL_DIRA specific version, and somewhere other than ~/.local/bin or %LOCALAPPDATA%\io\bin
aarch64-apple-darwinmacOS, Apple silicon · sandbox-exec
x86_64-apple-darwinmacOS, Intel · as above
x86_64-unknown-linux-muslLinux, static · Landlock, bwrap, namespaces, floor
x86_64-pc-windows-msvcWindows · Job Object, AppContainer opt-in
SHA256SUMSEvery artifact is checked before it is unpacked
io upgradePrints the command for the way you installed it. No auto-update, no version check

छत्तीस कमांड, चार समूह

जो कुछ आप टाइप कर सकते हैं।

समूह इस बात से बने हैं कि आप क्या कर रहे हैं, न कि harness का कौन हिस्सा जवाब देता है — और कोई समूह दस से ऊपर नहीं जाता। इनमें ग्यारह चलती turn के बीच चल जाती हैं, बाकी मना कर दी जाती हैं: नियम यह है कि कमांड करती क्या है, दिखती कितनी मासूम है यह नहीं।

the session

/clear · /resume · /fork · /profile · /contain · /setup · /exit

this turn

/model · /effort · /undo · /plan · /steer · /compact · /image · /copy · /copy diff · /commit

inspect

/help · /status · /context · /expand · /fleet · /skills · /cost · /stats · /store · /export

configure

/config · /theme · /remember · /memory · /mcp · /provider · /plugin · /gates · /import

Shift+TabChange the permission posture, from the next turn
Esc EscRewind the last turn: its files, its memory, the conversation head
Ctrl+FThe tree of children this turn has spawned, and what it costs
Ctrl+TCommit the last step’s full detail into the scrollback
--plainNothing turns, nothing moves; every state change committed as text
io exec "<goal>"One goal to completion, no terminal interaction · --json
io resumeCarries on a run parked on a question, a plan or an interrupted call
io acpThe Agent Client Protocol on stdio, for Zed or a JetBrains IDE
io mcp · plugin · config · skillThe same words from a shell as from the composer
exit 0 1 2 3 4 6ok · failed · refused · ceiling · paused · unverified

crate के साथ क्या आता है

दोनों के नीचे वही रनटाइम।

io-cli, io-harness पर बना एक प्रोग्राम है। यह वह है जो crate ख़ुद लेकर आती है — वही boundary, वही ledger और वही trace, चाहे turn टर्मिनल से आया हो, एडिटर से या CI जॉब से।

Permission boundary

Layered, deny-first rules over read, write, exec and network. Every refusal is attributed to the rule and the layer.

Containment

Commands run in the host’s own sandbox backend, writing to the workspace and nowhere else, with per-host egress.

Durable runs

Trace, budget draw and checkpoint commit in one transaction after every completed step. A crash resumes the whole tree.

Budgets

Steps, wall-clock and token spend, from one ledger a whole tree shares and no child can raise.

Verification

The project’s own test command, a second model against a rubric, or no gate at all.

Composition

Nested sub-agents over a shared workspace, inherit-and-narrow — and every agent in the tree has an address.

Accounting

Token split, latency and TTFT per call; cost derived on read from a price table you own. An unpriced model makes a total a floor.

Extensibility

The Tool trait in-process, MCP over stdio and streamable HTTP, markdown skills, capability bundles and hooks.

Reach

A browser under the policy, LSP navigation, provider-executed web search, documents, images and fixed-argv git.

Native providersOpenRouter · Anthropic · OpenAI, over the crate’s own HTTP+SSE client
13 hosted presetsGroq · xAI · Mistral · DeepSeek · Together · Fireworks · Cerebras · Perplexity · Gemini · Moonshot · Zhipu · Qwen · MiniMax
8 local runtimesOllama · llama.cpp · vLLM · LM Studio · LocalAI · Jan · SGLang · KoboldCpp
Your toolchaincargo · deno · node · go · python · maven · gradle · mix · bundler · composer · swift · cmake · dotnet · make

लॉन्च की ख़बर पाइए।

io-harness के 1.0 पर और Go प्लान खुलने पर एक ईमेल। और कुछ नहीं।