harness-integration-guide
Reference guide for building new Omnigent harness integrations — covers SDK/subprocess harnesses and native harnesses as separate tracks, each with their own feature matrix, implementation patterns, and prioritized checklist.
git clone --depth 1 https://github.com/omnigent-ai/omnigent /tmp/harness-integration-guide && cp -r /tmp/harness-integration-guide/.claude/skills/harness-integration-guide ~/.claude/skills/harness-integration-guideSKILL.md
# Harness integration guide This skill describes the **feature matrix** every Omnigent harness must consider. Use it when planning, reviewing, or implementing a new harness. Omnigent has two distinct harness tracks with different architectures and feature sets: - **SDK/subprocess harnesses** — run the vendor model directly (in-process SDK, CLI subprocess, or ACP subprocess). They own the model lifecycle. - **Native harnesses** — wrap a vendor's own TUI or server and mirror its output into Omnigent. They observe and relay, rather than drive. --- ## Part 1 — SDK / subprocess harnesses These harnesses run the vendor model directly and bridge Omnigent tools into the vendor's tool-calling interface. ### Capability matrix | Capability | What it means | |---|---| | **Connects to Omnigent MCP** | Harness exposes/consumes tools via the MCP protocol (in-proc SDK MCP server) | | **Model override** | User can select a model via `--model` / config; some harnesses are vendor-locked (e.g. Claude-only, GPT-only, Gemini-only) | | **Auth** | How credentials are obtained — API key, gateway token, vendor CLI login, OAuth, etc. | | **Streaming** | Harness forwards token-level or delta-level streaming to the Omnigent forwarder | | **Omnigent policies** | Harness enforces Omnigent-side tool policies — must support ALLOW, ASK, and DENY verdicts for both tool calls and tool results | | **Native elicitation** | When a policy verdict is ASK, the harness surfaces the approval request in the Omnigent web UI so the user can approve or deny | | **Interrupt** | User can cancel a running turn mid-stream | | **Live queue (concurrent)** | Multiple turns can be queued and processed concurrently | | **Tool-boundary steer** | Omnigent can inject steering text at tool-call boundaries | | **Resume/fork from Omnigent transcript** | Rebuild a conversation from a stored Omnigent transcript (replay history, seed prompt, or vendor session ID) | | **Compaction** | Long conversations are compacted; harness surfaces `CompactionComplete` events | | **Reasoning** | Model reasoning/thinking tokens are forwarded | | **Images** | Image content (screenshots, diagrams) is forwarded — full binary, path reference, or text-flattened | | **Cost tracking** | Harness reports token usage and cost data back to Omnigent for each turn | ### MCP connectivity The harness must bridge Omnigent's builtin MCP tools so the model can call them. These tools provide session management, agent orchestration, policy control, and web access: - `sys_session_get_info`, `sys_session_list`, `sys_session_get_history` - `sys_agent_get`, `sys_agent_list`, `sys_agent_download` - `sys_call_async`, `sys_cancel_async`, `sys_cancel_task` - `sys_read_inbox` - `sys_add_policy`, `sys_policy_registry` - `load_skill` - `list_comments`, `update_comment` - `web_fetch`, `web_search` ### Omnigent policies The harness must support the Omnigent policy engine's three verdicts at two checkpoints: | Checkpoint | ALLOW | ASK | DENY | |---|---|---|---| | **Tool call** (before execution) | Proceed silently | Surface approval request to user (via elicitation) | Block the call and return a policy-denied error to the model | | **Tool result** (after execution) | Return result to model | Surface result for user review before returning | Suppress the result and return a policy-denied error to the model | ### Native elicitation When a policy verdict is ASK, the harness must surface the pending tool call or tool result in the Omnigent web UI as an approval card, then relay the user's approve/deny decision back to the harness to continue or block execution. ### Resume / fork strategies | Strategy | How it works | |---|---| | Full history replay | Replays the entire message history into a fresh thread/session | | History prefix replay | Replays a prefix of the history into a fresh session | | Text-prefix replay | Injects a text summary/prefix of prior history | | Prompt seeding | Seeds prior history into the system prompt on rebuild | | Vendor session ID | Relies on the vendor's own session persistence (no Omnigent-side rebuild) | ### Auth patterns | Pattern | Description | |---|---| | API key / Databricks gateway | Direct API key or routed through a Databricks gateway | | Vendor API key (direct) | Vendor-specific API key (e.g. Cursor, Gemini) | | Vendor CLI login / config file | Credentials stored in a vendor config file or managed via vendor CLI login | | OAuth / GitHub token | OAuth flow or platform token (e.g. GitHub PAT) | | Gateway + fallback | Primary gateway with fallback to vendor-native auth | ### Checklist for a new SDK/subprocess harness All capabilities are **required** for a complete harness integration: - [ ] Connects to Omnigent MCP (in-proc SDK MCP server or vendor-specific bridge) - [ ] Model override works (or document vendor lock-in) - [ ] Auth is configured and documented (setup flow in `omni setup`) - [ ] Streaming forwards to the Omnigent forwarder - [ ] Omnigent policies enforce tool-use rules - [ ] Native elicitation surfaces tool-approval requests to web UI - [ ] Interrupt cancels the running turn - [ ] Live queue supports concurrent turns - [ ] Tool-boundary steering injects correctly - [ ] Resume/fork rebuilds conversation from Omnigent transcript - [ ] Compaction is surfaced (`CompactionComplete` events) - [ ] Reasoning tokens are forwarded - [ ] Images are forwarded (full binary preferred; path or text-flattened acceptable) - [ ] Cost tracking reports token usage and cost per turn - [ ] Unit tests cover tool bridging, auth, model routing - [ ] Mock LLM tests cover the happy path without real API calls ### Shortcut: ACP CLI harnesses are one catalog row If the vendor CLI speaks the Agent Client Protocol on stdio (the `goose acp` / `qwen --acp` family), do NOT write a new inner module, registry entries, or a spawn-env builder. Add one row to `ACP_CLI_HARNESSES` in `omnigent/acp_cli_harnesses.py` (label, binary, ACP argv, aliases, install hint or
Spin up a live local Omnigent server + runner and exercise the native Antigravity (agy) TUI harness (antigravity-native) end-to-end — launch the real `agy` CLI via `omnigent antigravity`, drive turns through the web UI, smoke-test, and bug-bash. Load when developing, testing, or debugging the antigravity-native harness (omnigent/inner/antigravity_native_executor.py, omnigent/antigravity_native.py, antigravity_native_bridge.py, antigravity_native_rpc.py, antigravity_native_reader.py, antigravity_native_launch.py) or its agy launch / RPC mirror / tmux delivery / OAuth / MCP-relay behavior. NOT the in-process `antigravity` Gemini SDK harness.
Spin up a live local Omnigent server and exercise the Antigravity (Gemini) SDK harness end-to-end — build antigravity agents, run real turns, smoke-test, and bug-bash. Load when developing, testing, or debugging the antigravity harness (omnigent/inner/antigravity_executor.py, antigravity_harness.py, omnigent/onboarding/antigravity_auth.py) or its auth / model / tool-bridge behavior.
Document a module or public API surface (functions, classes, CLI commands, endpoints) from the code itself. Use when the user asks for API reference, to document a module, or to write usage docs for a public interface.
Patterns and templates for generating valid Omnigent agent directories. Load when ready to create files.
Verify the Omnigent CLI's setup/onboarding flow, terminal UI/UX, and critical user journeys in a completely isolated, reproducible loop. Drives the real `omnigent` binary through a PTY (pexpect) inside a throwaway OMNIGENT_CONFIG_HOME / OMNIGENT_DATA_DIR sandbox that never touches the user's real ~/.omnigent, captures ANSI-stripped frames for UX inspection, and proves a change is verifiable via a before→fix→after baseline diff. Load when developing or reviewing a CLI setup/onboarding/REPL/picker change (omnigent/cli.py, omnigent/onboarding/*, omnigent/repl/*, scripts/install_oss.sh), reproducing a cold-start/first-run UX bug, or confirming a fix actually lands. Several agents can run it concurrently on separate worktrees.
Test counter — codex skills e2e. The unique suffix b8d4e7 appears in the skill name so a string match in the agent's output proves codex loaded this skill.
Test greeter — codex skills e2e. The unique suffix a3f9c2 appears in the skill name so a string match in the agent's output proves codex loaded this skill.
Spin up a live local Omnigent server and exercise the GitHub Copilot SDK harness end-to-end — build copilot agents, run real turns, smoke-test, and bug-bash. Load when developing, testing, or debugging the copilot harness (omnigent/inner/copilot_executor.py, copilot_harness.py, omnigent/onboarding/copilot_auth.py) or its auth / model / tool-bridge behavior.