oiia by SubgroupX
Browser-driven multi-agent sessions that execute on the machine you point at — cloud sandbox, SSH host, or one with no public IP.
- Source repo
- n-WN/SubgroupX
- Stars
- ★ 374
- Last updated
- 3mo ago
- Primary language
- TypeScript
- FA score
- 49/100 · Major gaps
At a glance
- Works with
- Universal · cross-platformOpenAI API
- You'll need
- Typical use
- Security assessors running authorized engagements who want sessions scoped to an assessment profile and an E2B template preloaded with Java 8/11, recon tooling with SecLists, and WASM reversing tools.
- Main limitation
- License status is unknown — the repository does not state one, so adoption terms must be confirmed with the maintainers before commercial use.
- Source review
- 49/100 · Major gaps
What does this agent do, and when should you use it?
oiia is a multi-user agent platform from the SubgroupX team, reached from a browser. The server is Node/Express with ws, and SQLite (node:sqlite in WAL mode) is the single source of truth. Where a session executes is a per-session creation choice among four backends behind one Sandbox interface: connector (a daemon on the target machine dials out over WebSocket), ssh (outbound SSH from the server), e2b (a disposable cloud VM), and local (the server itself, bwrap on Linux and seatbelt on macOS). The agent engine is not a reimplementation — oiia is a stateful adapter around the pi-mono Agent, with pi-ai supplying multi-provider streaming and pi-agent-core the turn loop. Sessions persist server-side, so refreshes, network loss, redeploys and device switches all replay the same ordered history. The client is a React SPA that also installs as a PWA, hitting the same sessions whether installed or not.
A turn starts when the client sends send_message: the runtime claims the turn, composes the toolset (connecting MCP servers the first time), and calls agent.prompt. The pi Agent loop streams from the provider and deltas become assistant_* and tool_* wire events tagged with a normalized toolKind. Before each tool call the approval gate runs; under the on-request policy it emits a permission_request and blocks until the answer returns over the socket. Approved tools execute on the capability bus — built-ins inside the chosen sandbox, MCP tools in their own server, and spawn_subagent as a nested child whose run streams as a nested timeline. Orchestration persists an agent tree in SQLite, with a permit-based dispatcher task queue, agent teams spanning sessions through a shared queue, and declarative workflows; agents are addressable, so you can steer one mid-run or follow up on a finished one. The runtime stamps every frame (epoch, seq) and the client converges on server truth; a single pure reducer in shared/src/timeline-reducer.ts runs on both server and browser to build the timeline and messages projections. Around the core sit a workspace file tree with preview and uploads, three approval policies, reconnect with replay, share links that redact secrets, and an audit log.
- Security assessors running authorized engagements who want sessions scoped to an assessment profile and an E2B template preloaded with Java 8/11, recon tooling with SecLists, and WASM reversing tools.
- Developers whose workstation sits behind NAT or on a corporate network and who want the agent working on the real files there, without a port forward, inbound rule or VPN.
- Teams that start a long run on a laptop and want to watch progress and approve commands from a phone — the session lives on the server, so closing the tab changes nothing.
- Work that parallelizes naturally: split work via spawn_subagent and watch the whole agent tree live instead of discovering at the end what the fleet did.
- Self-hosters who want one server running the full stack with provider keys encrypted at rest (AES-256-GCM), and no upstream domain, model id or credential compiled into the tree.
- Small organizations needing several people on the same sessions and tools, separated by permission, with an audit trail.
How do you install or deploy this agent?
Node 22.19–24 is required (native PTY caps the upper bound, the current pi/undici set the floor); CI and deploy use 24. Install dependencies, build the web client, then boot the server with tsx:
npm install
npm --prefix web install
npm run build:web
PORT=4317 AGENT_WEB_DATA_DIR=./data npx tsx server/src/index.tsDev mode with hot reload uses two terminals, and the web dev server proxies /api and /ws:
PORT=4317 npx tsx watch server/src/index.ts # terminal 1
npm --prefix web run dev # terminal 2Configuration is environment variables; every entry has a default or may stay unset:
PORT=4317 # HTTP/WS port
AGENT_WEB_DATA_DIR=./data # SQLite DB and per-session workspaces
AGENT_WEB_SECRET=... # JWT signing secret; set it for stable logins
AGENT_WEB_KEY_SECRET=... # provider-key encryption secret, defaults to the above
AGENT_WEB_SEATBELT=1 # wrap bash in macOS sandbox-exec
AGENT_WEB_E2B_KEY=... # enable E2B cloud sandboxes
AGENT_WEB_E2B_TEMPLATE=...
AGENT_WEB_MCP='[...]' # MCP servers as a JSON arrayHow do you use this agent?
Open http://localhost:4317, sign up, and create a session with the Mock Coder model — it needs no key and understands directives, so you can drive the real tools offline:
/bash
/write <path>
/read
/ls
/edit
/subagent <task>
/mcpTo use a real model, put your own provider key in Settings (encrypted AES-256-GCM at rest); any model pi-ai supports then appears. An operator can provision a shared default channel, but AGENT_WEB_JAIL_KEY and AGENT_WEB_JAIL_BASE_URL are both required and there is no endpoint fallback.
To execute on a machine with no public IP, run the connector daemon from the repo's scripts/ directory on that machine, let it dial out to the server over WebSocket, then pick connector as the backend when creating the session. Checks and tests:
npm run e2e:install # one-time: download Chromium
npm run e2e # builds web, boots a server, runs the 141-case Playwright suite (mock model)
npm run e2e:real # same flows against a real model (skips without a key)
npm run test:resume # timeline + transcript survive a full server restart
npm run typecheck
npm run check:layout # source placement and inward dependency boundariesWhat are this agent's strengths and limitations?
- Four sandbox backends behind one Sandbox interface, and the connector in particular reaches machines with no public IP by dialing out over WebSocket — no port forward, inbound rule or VPN needed. The UI is identical across all four.
- Sessions are durable server-side objects with the database as source of truth and the runtime as a rebuildable cache, which makes idle-release, session switch, redeploy and rewind the same disposal-then-rehydrate operation.
- It does not reinvent the agent engine: it adapts pi-mono's Agent and pi-ai, so multi-provider streaming and the turn loop come from upstream and oiia stays a stateful adapter.
- Architectural rules are enforced, not just documented — check:layout asserts source roots and inward-only imports and fails the build, and a layout check forbids the public landing component from importing the API client at all.
- Testing is end-to-end heavy: 141 Playwright cases drive a real browser against the real server, runtime, sandbox and filesystem, alongside 120 check:* conformance harnesses.
- No upstream domain, model id or credential is compiled into the tree; an unconfigured build simply leaves the operator channel dormant, which keeps self-hosted deployments honest.
- License status is unknown — the repository does not state one, so adoption terms must be confirmed with the maintainers before commercial use.
- Setup is a real chore: two dependency installs, a web build, a tsx boot, plus decisions about model channel, key handling and sandbox backend.
- The local sandbox isolates file operations but not arbitrary code; the README itself points untrusted execution at E2B or a connector machine you are willing to hand over.
- Node is pinned to 22.19–24 by native PTY on the top and pi/undici on the bottom, so runtime upgrades need joint verification.
- The connector model means the daemon on the target machine dials back into your deployment — effectively handing that machine's execution to the server, a trust boundary you must draw yourself.
- There is no unit-test framework; correctness rests on e2e cases and check:* harnesses, which slows feedback when changing low-level modules.
How does this agent compare with similar options?
Key facts side by side with the most closely related agents.
| Agent | Source review | Form / cost | Stars | Updated | Language | Full support on |
|---|---|---|---|---|---|---|
| oiia by SubgroupX This agent | 49 · Major gaps | — | ★ 374 | 3mo ago | TypeScript | OpenAI API |
| Cotal | 77 · Good | CLIFree | ★ 381 | today | TypeScript | Codex · Claude Code |
| Rovai AI | 49 · Major gaps | — | ★ 247 | today | Rust | Codex · Claude Code |
| Agor | 45 · Major gaps | CLIFree + model costs | ★ 1.5k | 1d ago | TypeScript | Codex · Claude Code |
How does FollowAgents rate this agent?
Why each dimension lost points
Trust: the README documents three approval policies, an on-request approval gate, AES-256-GCM encryption of provider keys at rest, bwrap/seatbelt local sandboxing, an SSH guard, and an outbound-dialing connector; e2e tests cover approval restore and denial, so least_privilege and user_confirmation score 2. However the README itself states the local sandbox isolates file operations but not arbitrary code, and the connector hands over a whole machine, which is a large privilege surface; data-flow transparency is prose only with no verifiable transport/storage detail, so 1. Dependency security: many third-party deps plus a postinstall patch script, with check:dependencies and overrides but no vulnerability scanning or SBOM, so 1. External effects and rollback: rewind, audit log and durable sessions exist, but there is no mechanism to undo already-executed external commands, so 1. Source attribution: contributors are credited and commits are SSH-signed, but publisher identity is unverified and license metadata is unknown, so 1.
Reliability: the README describes (epoch, seq) ordering, a pure timeline reducer shared by server and browser, SQLite as source of truth, check:layout enforcing dependency direction, plus test:resume and 141 Playwright cases, so self_consistency scores 2. Dependency availability: engines pin Node 22.19–24, native PTY caps the upper bound, a postinstall patch is applied, and deps float on ^ ranges, making installs fragile, so 1. Failure messages: e2e explicitly asserts human-readable, localized errors for connection failure and 502 instead of raw browser text, so 2.
Adaptability: the README clearly distinguishes four sandbox backends and their scenarios (no public IP, SSH, E2B, local), so audience_and_scenarios scores 2; capability boundaries are stated in Notes (local sandbox does not isolate arbitrary code), so 2; trigger precision is limited to a few directive examples (/bash, /write) with no precise rules for when each tool fires, so 1; environment fit is supported by a full env-var table and PWA multi-device notes, so 2.
Convention: README is well structured with a Layout section and run steps, so information_architecture scores 2; install notes give Node version, npm commands and an offline Mock Coder path, so 2; naming stability is weak (repo SubgroupX, product oiia, image agent-web), so 1; examples_and_faq has only a few directive examples and no FAQ, so 1; known_limitations is present in Notes, so 2; license metadata is unknown and no LICENSE file appears in the provided sources, so 0; version is 0.1.0 with no CHANGELOG, so 1; maintenance responsibility rests on credits and an unverified publisher, so 1.
Effectiveness: output_usability is strong with file tree, terminal, approvals, share links and audit log, so 2; marginal_value comes from the connector letting machines without public IPs act as execution endpoints, multi-agent orchestration and durable sessions, which differentiates it from generic coding agents, so 2; cost_benefit requires self-hosting a Node service, SQLite and optional E2B/SSH/connector daemons with no benchmark data, so 1.
Verifiability: the README claims 141 Playwright cases and 120 check:* contracts, and package.json plus the CI workflow do list many check scripts, so claim_traceability scores 1 (lists exist but no results are shown); cross_source_corroboration is 1 because README, package.json, CI and test files are mutually consistent; fact_inference_separation is 1 because the README is largely assertive and some claims (e.g. check:layout forbidding the API client import) can only be inferred from script names, not seen implemented.
- The local sandbox isolates file operations but not arbitrary code; connector mode effectively hands over a whole machine, so use it only on disposable or trusted hosts.
- License metadata is unknown and no LICENSE file appears in the provided sources; confirm authorization before commercial use or redistribution.
- Publisher identity is unverified; independently verify the source and container image before installing or deploying.
- Dependencies float on ^ ranges and a postinstall patch script runs at install time; assess build reproducibility and supply-chain risk yourself.
- Test counts and contract claims in the README come without results; this is a static review and no tests were executed.