ennodia 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +6 -0
- package/README.md +78 -28
- package/bin/ennodia +14 -3
- package/docs/getting-started.md +15 -3
- package/docs/guides/understand-results.md +45 -0
- package/docs/install.md +9 -3
- package/docs/questions.md +56 -0
- package/docs/reference/mcp-tools.md +92 -3
- package/docs/reference/supported-harnesses.md +84 -6
- package/docs/releases/0.5.0.md +43 -0
- package/docs/roadmap.md +5 -1
- package/package.json +7 -3
- package/skills/compositional-audit/SKILL.md +9 -0
- package/skills/pragmatic/SKILL.md +11 -0
- package/src/advisor.ts +3 -1
- package/src/budget.ts +5 -4
- package/src/compare.ts +83 -8
- package/src/core.ts +160 -21
- package/src/harnesses.ts +27 -2
- package/src/history.ts +2 -0
- package/src/index.ts +3 -0
- package/src/installation.ts +143 -0
- package/src/plan-advice.ts +20 -9
- package/src/planner.ts +4 -1
- package/src/readiness.ts +298 -0
- package/src/runs.ts +40 -1
- package/src/server.ts +106 -7
- package/src/setup-app.ts +338 -0
- package/src/tasks.ts +15 -0
- package/src/version.ts +1 -1
package/CONTRIBUTING.md
CHANGED
|
@@ -122,6 +122,12 @@ the root install. `bun run release:check` enforces these rules.
|
|
|
122
122
|
The workflow passes it to npm as `NODE_AUTH_TOKEN`. JSR uses GitHub Actions
|
|
123
123
|
OpenID Connect (OIDC) without a JSR token.
|
|
124
124
|
|
|
125
|
+
Both npm packages publish with `--provenance` from the GitHub-hosted runner.
|
|
126
|
+
The existing `id-token: write` permission lets npm attach a signed record of
|
|
127
|
+
the source and build. This requires a public repository matching each
|
|
128
|
+
package's `repository.url`. Previously published versions keep their
|
|
129
|
+
original metadata. Provenance takes effect on the next new version.
|
|
130
|
+
|
|
125
131
|
Link scope `@cherninlab`, package `ennodia`, to
|
|
126
132
|
`cherninlab/ennodia` in JSR package settings. The workflow's `id-token: write`
|
|
127
133
|
permission enables that authentication. To reconfigure npm, ensure the token
|
package/README.md
CHANGED
|
@@ -3,32 +3,42 @@
|
|
|
3
3
|
<img alt="Ennodia" src="docs/assets/logo.svg" width="235" height="50">
|
|
4
4
|
</picture>
|
|
5
5
|
|
|
6
|
-
**
|
|
6
|
+
**Ennodia isn't another agent. It connects the agents you use.**
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
Stay in Codex, Claude Code, or any agent you like.
|
|
9
|
+
When a task needs another model, your agent hands that part over through Ennodia and brings the answer back.
|
|
10
|
+
Ennodia runs on your computer, and each agent uses your own account.
|
|
11
11
|
|
|
12
12
|
```text
|
|
13
|
-
|
|
14
|
-
Give one available agent the failing test and our attempted fixes.
|
|
15
|
-
Request a different explanation and a way to test it.
|
|
16
|
-
Bring the findings back here.
|
|
13
|
+
Have Gemini listen to meeting.mp3 through Ennodia and tell me what was decided.
|
|
17
14
|
```
|
|
18
15
|
|
|
19
|
-
##
|
|
16
|
+
## Why use it
|
|
20
17
|
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
18
|
+
- **Keep the app you like.** Ennodia has no window of its own. You work in your agent as before, and it can now reach the others.
|
|
19
|
+
- **Your agents work together.** Any agent can hand part of a task to any other and get the answer back in your chat.
|
|
20
|
+
- **Nothing to pay, nothing to join.** Ennodia is free and open source, with no account. It uses the agents and plans you have.
|
|
21
|
+
- **It grows with your agents.** It is a set of tools, not a framework or a method. Each new model one agent gains becomes an ability for all of them.
|
|
22
|
+
- **It stays on your computer.** Every handoff leaves a receipt there: who did the work, how long it took, and what came back.
|
|
23
|
+
- **Less to keep up with.** You don't need to follow every new model. Name the task, and your agent hands it to one that can do it.
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
Next on the [roadmap](https://ennodia.cherninlab.com/docs/roadmap/): Ennodia reads its receipts, so your agent stops repeating what failed.
|
|
26
|
+
|
|
27
|
+
## What each agent adds
|
|
28
|
+
|
|
29
|
+
No model leads every task, so each agent you connect brings an ability the others lack.
|
|
30
|
+
|
|
31
|
+
- **Listen.** Gemini hears audio files. Codex hands it the file path and gets back what Gemini heard.
|
|
32
|
+
- **Draw.** Codex draws with GPT Image. Claude Code can hand it a brief and get the images back.
|
|
33
|
+
- **Review.** Two other agents review the same patch in fresh sessions. Compare maps where they agree and differ.
|
|
34
|
+
- **Read.** Kimi K3 in OpenCode reads long documents. Your agent hands it a spec and gets back the rules, each with its line number.
|
|
35
|
+
|
|
36
|
+
When your own agent has the ability, it does the task itself, with no handoff.
|
|
37
|
+
[See each route](https://ennodia.cherninlab.com/#abilities) and the [public scores behind each strength](https://ennodia.cherninlab.com/#evidence).
|
|
28
38
|
|
|
29
39
|
## Install
|
|
30
40
|
|
|
31
|
-
Send this address to your
|
|
41
|
+
Send this address to your agent:
|
|
32
42
|
|
|
33
43
|
```text
|
|
34
44
|
try-ennodia.cherninlab.com
|
|
@@ -47,7 +57,8 @@ For manual setup, add this Model Context Protocol (MCP) server to your client:
|
|
|
47
57
|
}
|
|
48
58
|
```
|
|
49
59
|
|
|
50
|
-
Ennodia loads
|
|
60
|
+
Ennodia loads eight core tools by default: about 13,000 characters of tool definitions in each session.
|
|
61
|
+
Add `"--tools", "all"` to `args` for the [full tool set](https://ennodia.cherninlab.com/docs/reference/mcp-tools/#tool-sets).
|
|
51
62
|
|
|
52
63
|
Requirements: Bun `1.3.14` or newer, a compatible MCP client, and a supported agent with working provider access.
|
|
53
64
|
`npx` downloads Ennodia. Bun runs it. You can also use `bunx ennodia`.
|
|
@@ -55,11 +66,26 @@ Requirements: Bun `1.3.14` or newer, a compatible MCP client, and a supported ag
|
|
|
55
66
|
[Get your first result](https://ennodia.cherninlab.com/docs/getting-started/) ·
|
|
56
67
|
[Installation for agents](https://ennodia.cherninlab.com/docs/install/)
|
|
57
68
|
|
|
58
|
-
##
|
|
69
|
+
## How a handoff works
|
|
70
|
+
|
|
71
|
+
1. Your agent calls `ennodia_run` with the task, the agent or model to use, and a time limit.
|
|
72
|
+
2. Ennodia checks the selected route, then starts that agent's own command-line tool in a fresh session, with its own tools and your account for it.
|
|
73
|
+
3. The answer comes back to your conversation, with its status and a receipt saved on your computer.
|
|
74
|
+
|
|
75
|
+
Your conversation history stays in your agent.
|
|
76
|
+
For two or more answers, Compare maps agreements, contradictions, and gaps.
|
|
77
|
+
When one answer is complete as it stands, Compare can choose it, and `ennodia_run` returns it unchanged.
|
|
78
|
+
|
|
79
|
+
Include relevant constraints and prior decisions in your task prompt under **Keep in mind**.
|
|
80
|
+
Ennodia asks workers and Compare to return useful reminders with reasons and evidence.
|
|
81
|
+
Your agent verifies them before carrying them into the next task.
|
|
82
|
+
See [how to read these notes](https://ennodia.cherninlab.com/docs/guides/understand-results/#keep-in-mind).
|
|
83
|
+
|
|
84
|
+
## Supported agents
|
|
59
85
|
|
|
60
|
-
|
|
86
|
+
Codex CLI, Claude Code, OpenCode, Kilo Code, Kiro CLI, Cline, Hermes Agent, and Antigravity.
|
|
61
87
|
Model availability and tool permissions depend on the installed agent and its provider configuration.
|
|
62
|
-
Discovery
|
|
88
|
+
Discovery reports native login checks and recovery actions. Before execution, Ennodia verifies each selected model route with a small request when recent success is unavailable.
|
|
63
89
|
Codex workers use a read-only sandbox by default.
|
|
64
90
|
|
|
65
91
|
Ennodia discovers native Agent Skills and can request them for specific tasks.
|
|
@@ -70,10 +96,11 @@ Native agents can also select unrequested skills from their own environment.
|
|
|
70
96
|
[Using skills](https://ennodia.cherninlab.com/docs/guides/agent-skills/) ·
|
|
71
97
|
[Understand results](https://ennodia.cherninlab.com/docs/guides/understand-results/)
|
|
72
98
|
|
|
73
|
-
##
|
|
99
|
+
## Evidence
|
|
74
100
|
|
|
75
101
|
- [Can Gemini hear this file?](https://ennodia.cherninlab.com/articles/can-gemini-hear-this-file/): a Codex conversation hands an audio file to Gemini through Antigravity.
|
|
76
|
-
- [Measurement plan](https://ennodia.cherninlab.com/docs/evidence/measurement/): how Ennodia
|
|
102
|
+
- [Measurement plan](https://ennodia.cherninlab.com/docs/evidence/measurement/): how Ennodia compares single agents with teams on public benchmarks.
|
|
103
|
+
- [Audio routing pilot](bench/audio-routing/pilot-2026-09-26.md): Codex got 10 of 10 speech questions right through Gemini, and 4 of 10 alone. Across all 30 clips the gain was not significant, and each answer took about twice as long.
|
|
77
104
|
|
|
78
105
|
## Data and limits
|
|
79
106
|
|
|
@@ -81,9 +108,10 @@ Ennodia runs locally without an Ennodia-hosted service.
|
|
|
81
108
|
Selected agents can send material to their configured model providers.
|
|
82
109
|
Terminal run history is stored locally and can be disabled with `ENNODIA_HISTORY=0`.
|
|
83
110
|
|
|
111
|
+
Each handoff costs time and uses your agents' own quotas and charges.
|
|
112
|
+
General time or token savings have not been established.
|
|
84
113
|
Ennodia can limit child tasks and estimated input tokens.
|
|
85
114
|
Those estimates exclude internal harness work and are not provider bills.
|
|
86
|
-
Automatic agent updates and recommendations learned from past results remain future work.
|
|
87
115
|
|
|
88
116
|
[Data governance](https://ennodia.cherninlab.com/docs/concepts/data-governance/) ·
|
|
89
117
|
[Budgets](https://ennodia.cherninlab.com/docs/guides/budgets-and-limits/) ·
|
|
@@ -91,8 +119,8 @@ Automatic agent updates and recommendations learned from past results remain fut
|
|
|
91
119
|
|
|
92
120
|
## Technical reference and contribution
|
|
93
121
|
|
|
94
|
-
The main
|
|
95
|
-
Compare
|
|
122
|
+
The main entry point is `ennodia_run`.
|
|
123
|
+
The full tool set adds raw tasks, separate Compare calls, budget estimates, and the Plan Advisor, which proposes explicit tasks before execution.
|
|
96
124
|
|
|
97
125
|
[MCP tools](https://ennodia.cherninlab.com/docs/reference/mcp-tools/) ·
|
|
98
126
|
[Experimental Ennodia IO](https://ennodia.cherninlab.com/docs/reference/ennodia-io/) ·
|
|
@@ -105,7 +133,29 @@ bun run verify
|
|
|
105
133
|
|
|
106
134
|
### Experimental Pragmatic mode
|
|
107
135
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
[Pragmatic mode](docs/guides/pragmatic-mode.md) keeps bulky evidence outside the main conversation and returns findings for verification.
|
|
136
|
+
[Pragmatic mode](docs/guides/pragmatic-mode.md) runs independent model attempts, tailored plans, and skill trials, then compares the evidence.
|
|
137
|
+
It keeps bulky evidence outside the main conversation and returns findings for your agent to verify.
|
|
111
138
|
Savings are not yet validated.
|
|
139
|
+
|
|
140
|
+
## Login recovery and updates
|
|
141
|
+
|
|
142
|
+
Ennodia checks selected workers, Judge, and Advisor routes before execution.
|
|
143
|
+
Blocked routes return a native recovery action before reviewers start.
|
|
144
|
+
Ennodia says nothing about its own status unless an agent you asked for is blocked.
|
|
145
|
+
Rechecks, setup, and blocked starts include a setup panel with the exact fix.
|
|
146
|
+
|
|
147
|
+
Your agent calls `ennodia_setup` to show each agent's status and fix in your current session.
|
|
148
|
+
Hosts that render MCP Apps, such as Claude Desktop and Visual Studio Code, can show it as a card with check buttons.
|
|
149
|
+
Other hosts, such as Codex and Claude Code, show the Markdown panel.
|
|
150
|
+
|
|
151
|
+
Run that action in an interactive terminal, then call `ennodia_check_harnesses` with the same harness and model and `refresh: true, verify: true`.
|
|
152
|
+
Run receipts keep missing reviewer coverage visible, including in compact responses.
|
|
153
|
+
|
|
154
|
+
Supported harness upgrades run once per day on use while Ennodia has no active tasks.
|
|
155
|
+
Set `ENNODIA_AUTO_UPDATE=false` to disable them.
|
|
156
|
+
Use `ennodia_check_harnesses` with `upgrade: true` to update and recheck immediately.
|
|
157
|
+
|
|
158
|
+
Ennodia also checks its own installation automatically. Run results report the loaded code location, version, runtime, and installation scope. The report checks required files, bundled skills, and storage access. The recheck tool refreshes this report. MCP startup instructions carry only installation problems.
|
|
159
|
+
|
|
160
|
+
Mention installation limitations when they affect the request. Cache installs can change on a future unpinned launch. These local checks do not verify the latest registry version or provider access.
|
|
161
|
+
See [recovery and updates](https://ennodia.cherninlab.com/docs/reference/supported-harnesses/#recovery-and-updates).
|
package/bin/ennodia
CHANGED
|
@@ -5,19 +5,30 @@ import { fileURLToPath } from "node:url";
|
|
|
5
5
|
|
|
6
6
|
const cliPath = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "src", "cli.ts");
|
|
7
7
|
|
|
8
|
-
const bunCheck = spawnSync("bun", ["--version"], {
|
|
8
|
+
const bunCheck = spawnSync("bun", ["--version"], { encoding: "utf8", timeout: 5_000 });
|
|
9
9
|
|
|
10
|
-
if (bunCheck.error) {
|
|
10
|
+
if (bunCheck.error || bunCheck.status !== 0) {
|
|
11
11
|
process.stderr.write(
|
|
12
|
-
"Ennodia requires Bun (1.3.14 or newer)
|
|
12
|
+
"Ennodia requires Bun (1.3.14 or newer). Bun wasn't available on PATH or failed its version check.\n" +
|
|
13
13
|
"Install Bun from https://bun.sh, then try again:\n" +
|
|
14
14
|
" curl -fsSL https://bun.sh/install | bash\n",
|
|
15
15
|
);
|
|
16
16
|
process.exit(1);
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
const bunVersion = bunCheck.stdout.trim();
|
|
20
|
+
const minimum = [1, 3, 14];
|
|
21
|
+
const parsed = /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:[-+].*)?$/.exec(bunVersion);
|
|
22
|
+
const parts = parsed?.slice(1, 4).map(Number);
|
|
23
|
+
const firstDifference = parts?.findIndex((part, index) => part !== minimum[index]);
|
|
24
|
+
if (!parts || (firstDifference !== -1 && parts[firstDifference] < minimum[firstDifference]) || (firstDifference === -1 && bunVersion.split("+")[0].includes("-"))) {
|
|
25
|
+
process.stderr.write(`Ennodia requires Bun >=1.3.14; found ${bunVersion}. Upgrade Bun with bun upgrade, then restart Ennodia.\n`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
|
|
19
29
|
const result = spawnSync("bun", ["run", cliPath, ...process.argv.slice(2)], {
|
|
20
30
|
stdio: "inherit",
|
|
31
|
+
env: { ...process.env, ENNODIA_LAUNCHER_PATH: fileURLToPath(import.meta.url) },
|
|
21
32
|
});
|
|
22
33
|
|
|
23
34
|
process.exit(result.status ?? 1);
|
package/docs/getting-started.md
CHANGED
|
@@ -31,8 +31,20 @@ Bring the findings back to this conversation.
|
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
Start with one worker and a small set of files.
|
|
34
|
-
|
|
35
|
-
A
|
|
34
|
+
Ennodia checks each selected agent before execution. Your agent hears nothing about Ennodia's status unless an agent you requested is blocked.
|
|
35
|
+
A blocked agent comes with its exact fix, such as a sign-in command.
|
|
36
|
+
|
|
37
|
+
For setup or recovery, give your agent this request:
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
Show Ennodia setup in this session. Help me fix the agent I choose.
|
|
41
|
+
After I complete native sign-in or configuration, recheck that agent and continue my task.
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Your agent calls `ennodia_setup` and shows you each agent's status, with the exact fix for blocked agents.
|
|
45
|
+
Hosts that render MCP Apps can show it as a card with check buttons. A check sends at most one small model request.
|
|
46
|
+
|
|
47
|
+
Complete sign-in and credential changes in the native tool. Keep credentials out of chat.
|
|
36
48
|
|
|
37
49
|
Your agent can call `ennodia_list_harnesses`, then `ennodia_run` with a selected `harnessId`, `mode: "single"`, and `compare: false`.
|
|
38
50
|
Poll `ennodia_get_run` with the returned run identifier (ID).
|
|
@@ -111,7 +123,7 @@ For a local checkout, use the source file:
|
|
|
111
123
|
|
|
112
124
|
Replace `/absolute/path/to/ennodia` with your local repository path.
|
|
113
125
|
|
|
114
|
-
Ennodia loads
|
|
126
|
+
Ennodia loads eight core tools by default. For Plan Advisor, compositional slices, raw tasks, and skill installation, add `"--tools", "all"` to `args`. See [tool sets](/docs/reference/mcp-tools/#tool-sets).
|
|
115
127
|
|
|
116
128
|
Use your client's supported configuration method.
|
|
117
129
|
Preserve existing server entries.
|
|
@@ -27,6 +27,51 @@ When Judge output is unusable, the result exposes `analysisAvailable: false`.
|
|
|
27
27
|
The Result Advisor can continue with `basis: "candidates-only"`.
|
|
28
28
|
That result has less analysis behind it and needs corresponding scrutiny.
|
|
29
29
|
|
|
30
|
+
## Keep in mind
|
|
31
|
+
|
|
32
|
+
One agent can notice a constraint or gap that another agent misses.
|
|
33
|
+
Put relevant known constraints and prior decisions in the normal task prompt under **Keep in mind**.
|
|
34
|
+
For a task where the same function serves a web route and a command-line tool, a prompt could include:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
Review the proposed retry change.
|
|
38
|
+
|
|
39
|
+
Keep in mind:
|
|
40
|
+
- This function also serves the command-line tool. Preserve that behavior and check both callers.
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Ennodia asks workers to return up to three concise, task-specific notes when useful and compatible with the requested answer format.
|
|
44
|
+
Each note states what matters, why it matters, and what evidence supports it.
|
|
45
|
+
This is prompt guidance. A worker can miss a useful note.
|
|
46
|
+
|
|
47
|
+
Compare returns structured notes in `advisor.keepInMind`, for example:
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"keepInMind": [
|
|
52
|
+
{
|
|
53
|
+
"note": "Reviewer B reports running only the web-route test.",
|
|
54
|
+
"whyItMatters": "A passing web-route test does not cover that caller.",
|
|
55
|
+
"evidence": "Reviewer B reports running only the web-route test.",
|
|
56
|
+
"sourceIds": ["review-b"],
|
|
57
|
+
"status": "reported"
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`reported` attributes a point to a candidate. It does not prove the point.
|
|
64
|
+
`inferred` marks a conclusion drawn from the available answers.
|
|
65
|
+
`unverified` marks a point that still needs evidence.
|
|
66
|
+
Source IDs identify the candidates behind a note.
|
|
67
|
+
An empty list can identify coverage that no candidate supplied.
|
|
68
|
+
|
|
69
|
+
The list is empty when Compare has no useful notes.
|
|
70
|
+
Run results also expose nonempty notes as `keepInMind`, including in compact output.
|
|
71
|
+
This field stays separate from `finalAnswer` so a chosen file or patch stays unchanged.
|
|
72
|
+
The primary agent checks each note and carries only relevant ones into the next assignment.
|
|
73
|
+
Notes do not grant permissions, trigger another run, or create memory across runs.
|
|
74
|
+
|
|
30
75
|
## Read the attempt record
|
|
31
76
|
|
|
32
77
|
Task records include the selected agent, requested skills, status, elapsed time, and bounded output.
|
package/docs/install.md
CHANGED
|
@@ -70,7 +70,7 @@ For a local Ennodia checkout, use:
|
|
|
70
70
|
}
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
Ennodia loads
|
|
73
|
+
Ennodia loads eight core tools by default. For Plan Advisor, compositional slices, raw tasks, and skill installation, add `"--tools", "all"` to `args`. See [tool sets](/docs/reference/mcp-tools/#tool-sets).
|
|
74
74
|
|
|
75
75
|
The configuration above shows the server command and arguments.
|
|
76
76
|
Adapt its format to the client's documented configuration method.
|
|
@@ -79,10 +79,16 @@ Tell the user which step is needed before trying to call Ennodia.
|
|
|
79
79
|
|
|
80
80
|
## Get one useful result
|
|
81
81
|
|
|
82
|
+
Ennodia includes an installation self-check in run results and rechecks. Its MCP startup instructions carry only installation problems. It uses the loaded code location to identify a source checkout, project-local dependency, global installation, package cache, or unknown scope. It checks the Bun version, package version, core files, bundled skills, and filesystem access for temporary workspaces, history, and harness update receipts. Development files are not required for a packaged install. The npm launcher stops before startup if Bun is too old.
|
|
83
|
+
|
|
84
|
+
Tell the user about reported installation problems before the first run. Call `ennodia_check_harnesses` with `refresh: true` to refresh the installation report and native harness status after a repair. Filesystem access checks do not prove free disk space or future writes. They do not verify provider access or the latest published package version. A global install gives no extra permissions. The user's normal permissions still apply.
|
|
85
|
+
|
|
86
|
+
The report also identifies compiled code. A compiled executable does not need separate source entrypoints. Missing bundled skills remain a reported limitation. Compilation is currently an experimental build path.
|
|
87
|
+
|
|
82
88
|
After the client exposes Ennodia's tools, start with one small task:
|
|
83
89
|
|
|
84
|
-
1. Call `
|
|
85
|
-
2. Choose one
|
|
90
|
+
1. Call `ennodia_setup`. Show the user its panel: which agents are ready, and the exact fix for each blocked agent.
|
|
91
|
+
2. Choose one ready or unchecked worker for a focused, read-only check from the user's current task.
|
|
86
92
|
3. Call `ennodia_run` with `prompt`, `harnessId`, `mode: "single"`, `compare: false`, and the relevant `cwd`.
|
|
87
93
|
4. Poll `ennodia_get_run` with the returned `id` as `runId`.
|
|
88
94
|
5. Stop when the status is `succeeded`, `failed`, or `cancelled`.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Questions
|
|
3
|
+
description: Short answers about switching agents, setup, data, cost, time, and what Ennodia remembers.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Do I need to switch agents?
|
|
7
|
+
|
|
8
|
+
No. You keep the agent you use, in the app you like.
|
|
9
|
+
Ennodia adds a few tools to it, and your agent calls another agent only when a task needs it.
|
|
10
|
+
|
|
11
|
+
## Where does Ennodia run?
|
|
12
|
+
|
|
13
|
+
On your computer. Your agent starts it as a local Model Context Protocol (MCP) server.
|
|
14
|
+
It needs Bun 1.3.14 or newer.
|
|
15
|
+
Your agent can [set it up for you](/docs/install/), or you can [add the server entry yourself](/docs/getting-started/#manual-setup).
|
|
16
|
+
|
|
17
|
+
## Which agents can I use?
|
|
18
|
+
|
|
19
|
+
Ennodia uses the agents on your computer, with the models and access you have set up.
|
|
20
|
+
It supports Codex CLI, Claude Code, OpenCode, Antigravity, Kilo Code, Kiro, Cline, and Hermes Agent.
|
|
21
|
+
[Check compatibility](/docs/reference/supported-harnesses/).
|
|
22
|
+
|
|
23
|
+
## What does it cost?
|
|
24
|
+
|
|
25
|
+
Ennodia is free and MIT licensed, with no account and no subscription of its own.
|
|
26
|
+
Each agent you call runs through its own command-line tool, with the plan or API key you set up for it.
|
|
27
|
+
|
|
28
|
+
## Will it use more tokens?
|
|
29
|
+
|
|
30
|
+
It can. Each agent you call reads its own prompt, and Compare reads every answer.
|
|
31
|
+
Ennodia's eight core tools add about 3,250 tokens to each session.
|
|
32
|
+
You can cap agent runs and estimated input tokens for every run. [Set limits](/docs/guides/budgets-and-limits/).
|
|
33
|
+
|
|
34
|
+
## Is it slower?
|
|
35
|
+
|
|
36
|
+
A handoff takes as long as the other agent's session.
|
|
37
|
+
In the [audio pilot](https://github.com/cherninlab/ennodia/blob/main/bench/audio-routing/pilot-2026-09-26.md), Codex with Ennodia took a median of 57 seconds per clip, against 27 seconds alone.
|
|
38
|
+
Alone, Codex answered without listening.
|
|
39
|
+
|
|
40
|
+
## What data leaves my computer?
|
|
41
|
+
|
|
42
|
+
Ennodia has no hosted service and sends nothing to its authors.
|
|
43
|
+
The agents you call send prompts and files to their own model providers, as they do without Ennodia.
|
|
44
|
+
[How data is handled](/docs/concepts/data-governance/).
|
|
45
|
+
|
|
46
|
+
## Does my agent hand off work on its own?
|
|
47
|
+
|
|
48
|
+
Only when you let it. Say it in your own words, like "get Codex's opinion".
|
|
49
|
+
Or install the pragmatic skill, so your agent can hand off bounded work within the limits you set.
|
|
50
|
+
[The delegation skill](/docs/guides/agent-skills/#main-agent-delegation-skill).
|
|
51
|
+
|
|
52
|
+
## Does it remember what worked?
|
|
53
|
+
|
|
54
|
+
It keeps a local run history, including outputs and failures, so you can look back.
|
|
55
|
+
Learning which agent or skill to choose next is the [next step on the roadmap](/docs/roadmap/).
|
|
56
|
+
[What the history records](/docs/guides/understand-results/).
|
|
@@ -11,8 +11,8 @@ events, child task IDs, Judge + Result Advisor state, and the final answer.
|
|
|
11
11
|
## Tool sets
|
|
12
12
|
|
|
13
13
|
An agent loads every tool definition into each session where Ennodia is configured, even when the session never calls Ennodia.
|
|
14
|
-
By default, Ennodia loads
|
|
15
|
-
They cover handing work to one agent or a team, Compare, waiting, cancelling, and
|
|
14
|
+
By default, Ennodia loads eight core tools, about 13,000 characters of definitions.
|
|
15
|
+
They cover handing work to one agent or a team, Compare, waiting, cancelling, run history, and harness recovery.
|
|
16
16
|
|
|
17
17
|
The full set adds 20 tools for raw tasks, compositional slices, Plan Advisor, budget estimates, separate Compare calls, and skill installation.
|
|
18
18
|
It loads about 46,000 characters of definitions.
|
|
@@ -50,7 +50,9 @@ This setting approves Ennodia runs only. Codex's sandbox and its other tools kee
|
|
|
50
50
|
|
|
51
51
|
| Goal | Tool sequence | Tool set |
|
|
52
52
|
| --- | --- | --- |
|
|
53
|
-
|
|
|
53
|
+
| Show agent status and fixes in this session | `ennodia_setup` | core |
|
|
54
|
+
| Recheck an agent after a fix | `ennodia_check_harnesses` | core |
|
|
55
|
+
| List agents for routing | `ennodia_list_harnesses` | core |
|
|
54
56
|
| Start a visible end-to-end run | `ennodia_run` -> `ennodia_get_run` | core |
|
|
55
57
|
| Inspect terminal receipts after restart | `ennodia_history` | core |
|
|
56
58
|
| Preview route and cost | `ennodia_estimate_budget` | full |
|
|
@@ -172,6 +174,9 @@ Version probes have bounded deadlines. A failed probe appears in adapter notes w
|
|
|
172
174
|
| --- | --- | --- |
|
|
173
175
|
| `refresh` | `false` | Ignore the short discovery cache and re-scan. |
|
|
174
176
|
|
|
177
|
+
The result is JSON only. Agents call this tool for routing, so it carries no setup panel.
|
|
178
|
+
Use `ennodia_setup` to show the user each agent's status and fix.
|
|
179
|
+
|
|
175
180
|
Use this first when a client setup, command path, or adapter is not behaving as
|
|
176
181
|
expected.
|
|
177
182
|
|
|
@@ -238,6 +243,8 @@ arguments, permissions, isolation, timeouts, retries, or budgets.
|
|
|
238
243
|
Harness inventory entries preserve optional `inputGuidance: string[]` from discovery.
|
|
239
244
|
Plan Advisor treats this bounded guidance as observations, not proof of native media support.
|
|
240
245
|
Slices execute concurrently. For unverified native access, its instructions request a probe-only plan, followed by a new plan after the probe.
|
|
246
|
+
Plan Advisor also asks each slice prompt to carry relevant constraints and prior decisions from the original task under **Keep in mind**.
|
|
247
|
+
This guidance does not pass one independent candidate's findings to another.
|
|
241
248
|
|
|
242
249
|
The lifecycle is deliberately two-phase: request and inspect advice first, then
|
|
243
250
|
launch the exact validated plan in a separate call. Ennodia rejects invalid
|
|
@@ -419,6 +426,12 @@ It also returns the final answer when available. The important value is `id`.
|
|
|
419
426
|
Poll it with
|
|
420
427
|
`ennodia_get_run`.
|
|
421
428
|
|
|
429
|
+
Include relevant constraints and prior decisions under **Keep in mind** in the normal `prompt`.
|
|
430
|
+
There is no separate input field.
|
|
431
|
+
Workers are asked to return up to three useful notes with reasons and evidence when the requested answer format permits.
|
|
432
|
+
For compared runs, nonempty Result Advisor notes appear in `keepInMind`, separate from `finalAnswer`.
|
|
433
|
+
Normal and compact run views preserve this field.
|
|
434
|
+
|
|
422
435
|
### `ennodia_get_run`
|
|
423
436
|
|
|
424
437
|
Returns the current run state. Set `waitMs` to wait for completion without repeated immediate polls. A wait timeout leaves the run running.
|
|
@@ -615,6 +628,23 @@ blind spots, and risks. The Result Advisor uses that analysis plus the original
|
|
|
615
628
|
candidates to return a typed answer, basis, confidence, and open questions.
|
|
616
629
|
This is model-led comparison, not formal voting.
|
|
617
630
|
|
|
631
|
+
The Result Advisor also returns `keepInMind`: up to three task-specific notes that the receiving agent could overlook.
|
|
632
|
+
The field defaults to `[]` when omitted or when no useful notes are available.
|
|
633
|
+
Each note has these fields:
|
|
634
|
+
|
|
635
|
+
| Field | Meaning |
|
|
636
|
+
| --- | --- |
|
|
637
|
+
| `note` | Constraint, connection, assumption, or gap to carry forward (at most 1000 characters). |
|
|
638
|
+
| `whyItMatters` | Effect on the task or next decision (at most 1000 characters). |
|
|
639
|
+
| `evidence` | Supporting observation or explicit evidence gap (at most 2000 characters). |
|
|
640
|
+
| `sourceIds` | Up to 64 listed candidate IDs supporting the note. A `reported` note requires a source. Use `[]` for inferred or unverified missing coverage. |
|
|
641
|
+
| `status` | `reported` for an attributed candidate report, `inferred` for a conclusion from available answers, or `unverified` for a point that needs evidence. |
|
|
642
|
+
|
|
643
|
+
A `reported` note is not independent proof.
|
|
644
|
+
Invalid optional notes are omitted with an `advisor-notes-ignored` event. The valid answer and candidate choice are preserved.
|
|
645
|
+
The primary agent verifies notes and carries only relevant ones into later prompts.
|
|
646
|
+
These notes do not change permissions, start another run, or create memory across runs.
|
|
647
|
+
|
|
618
648
|
When one candidate fully answers the prompt as it stands, such as a complete
|
|
619
649
|
file, the Result Advisor names it in `chosenSourceId`. A caller can then use
|
|
620
650
|
that candidate's own text, not a rewrite. `ennodia_run` does this for you: its
|
|
@@ -768,3 +798,62 @@ Preserve full patch artifacts and verify them before application.
|
|
|
768
798
|
A later Compare call and its Judge and Result Advisor have separate limits.
|
|
769
799
|
`includeCompareEstimate` includes an estimate, not a reserved spending balance.
|
|
770
800
|
Count these stages, retries and verification when reporting whole-task cost.
|
|
801
|
+
|
|
802
|
+
### `ennodia_setup`
|
|
803
|
+
|
|
804
|
+
Show the user each agent's status and the exact fix for blocked agents.
|
|
805
|
+
The tool takes no input. It refreshes native sign-in status without a model request.
|
|
806
|
+
It declares `readOnlyHint`, so clients such as Codex run it without an approval prompt.
|
|
807
|
+
|
|
808
|
+
The result has the same JSON shape as `ennodia_check_harnesses`, plus the `ennodia://setup` panel.
|
|
809
|
+
Hosts that render MCP Apps show the [setup card](#setup-card) in place of the panel.
|
|
810
|
+
Sign-in and credential changes stay in each agent's own CLI.
|
|
811
|
+
|
|
812
|
+
#### Setup card
|
|
813
|
+
|
|
814
|
+
`ennodia_setup` and `ennodia_check_harnesses` name the `ui://ennodia/setup.html` resource in `_meta.ui.resourceUri`.
|
|
815
|
+
The resource uses the MCP Apps type `text/html;profile=mcp-app`.
|
|
816
|
+
Hosts that render MCP Apps show the card inside the conversation. Other hosts ignore it and keep the Markdown panel.
|
|
817
|
+
|
|
818
|
+
The card lists agents that need the user first, with the next step for each.
|
|
819
|
+
A login blocker shows its sign-in command with a copy button.
|
|
820
|
+
Each check button calls `ennodia_check_harnesses` for that agent and model with `verify: true`.
|
|
821
|
+
A check sends at most one small model request.
|
|
822
|
+
When an agent becomes ready, the card can send a short note to the chat.
|
|
823
|
+
|
|
824
|
+
The card loads no external code and makes no network requests.
|
|
825
|
+
It never collects credentials.
|
|
826
|
+
|
|
827
|
+
### `ennodia_check_harnesses`
|
|
828
|
+
|
|
829
|
+
`ennodia_check_harnesses` is part of the default tool set.
|
|
830
|
+
|
|
831
|
+
The result includes `installation`, a local self-check of Ennodia's loaded code root, version, installation scope, Bun runtime, core files, bundled skills, and storage access. MCP initialization sends only its problems to the host, and a healthy installation adds nothing. `ennodia_run` and `ennodia_get_run` include the full report even in compact results. Mention its limitations when they affect the request.
|
|
832
|
+
|
|
833
|
+
`refresh: true` refreshes installation evidence as well as harness readiness. Scope remains `unknown` when filesystem evidence is insufficient. The report does not verify registry freshness, provider access, disk capacity, or future writes.
|
|
834
|
+
|
|
835
|
+
It accepts `harnessIds`, `model`, `cwd`, `refresh`, `verify`, and `upgrade`.
|
|
836
|
+
Native status checks are the default. `verify: true` makes a bounded real model request.
|
|
837
|
+
|
|
838
|
+
`unverified` means unchecked. `ennodia_run` verifies its selected routes automatically.
|
|
839
|
+
Use targeted `harnessIds` for recovery checks. Unrelated blockers do not prevent work on usable requested routes.
|
|
840
|
+
|
|
841
|
+
Rechecks, `ennodia_setup`, and blocked preflight responses include an embedded `ennodia://setup` resource with `text/markdown` content.
|
|
842
|
+
The JSON text response keeps its existing shape.
|
|
843
|
+
|
|
844
|
+
The panel is a table of agents, with agents that need the user first. Each row gives the status in plain words and the next step.
|
|
845
|
+
Sign-in commands follow the table, for login blockers only. Key expiry and quota blockers name their own recovery.
|
|
846
|
+
Show the panel when the host displays no setup card. Recheck the same harness and model after recovery, then resume the original task.
|
|
847
|
+
|
|
848
|
+
`upgrade: true` runs supported updaters before rediscovery and recheck.
|
|
849
|
+
This tool can change installed software and call providers, so it does not declare `readOnlyHint`.
|
|
850
|
+
|
|
851
|
+
Present `actionRequired` immediately, including on partial success.
|
|
852
|
+
Do not wait for an explicit user question about missing reviewers.
|
|
853
|
+
Run preflight errors return `isError`, recovery actions, and zero started reviewers.
|
|
854
|
+
Run receipts retain `preflight`, `coverage`, and `actionRequired` in compact responses.
|
|
855
|
+
Use the matching native recovery action, then recheck the same route.
|
|
856
|
+
|
|
857
|
+
An expired provider API key returns `credentials-expired` and requires key replacement.
|
|
858
|
+
Depleted credits return `quota-exhausted` and require capacity recovery.
|
|
859
|
+
See [Recovery and updates](/docs/reference/supported-harnesses/#recovery-and-updates).
|
|
@@ -7,6 +7,12 @@ Ennodia coordinates local agents through thin adapters. Each harness uses a
|
|
|
7
7
|
local command-line interface (CLI). Use `ennodia_list_harnesses` to see what is
|
|
8
8
|
installed and runnable on the current machine.
|
|
9
9
|
|
|
10
|
+
On macOS, discovery checks the existing `PATH` first, then `/opt/homebrew/bin`,
|
|
11
|
+
`/usr/local/bin`, and `~/.local/bin`. This covers restricted GUI and MCP launch
|
|
12
|
+
paths without changing the selected account, model, or child process environment.
|
|
13
|
+
Explicit command paths and routes with no command candidates stay unchanged.
|
|
14
|
+
Restart the MCP server after updating Ennodia to load discovery changes.
|
|
15
|
+
|
|
10
16
|
## Adapter IDs
|
|
11
17
|
|
|
12
18
|
| ID | Tool | Notes |
|
|
@@ -32,15 +38,18 @@ installed and runnable on the current machine.
|
|
|
32
38
|
```
|
|
33
39
|
|
|
34
40
|
The response reports availability, runnable state, command path, version,
|
|
35
|
-
capabilities, adapter notes,
|
|
41
|
+
capabilities, adapter notes, optional `inputGuidance`, and `readiness`.
|
|
36
42
|
|
|
37
43
|
`inputGuidance` is a bounded `string[]` of adapter observations and input advice.
|
|
38
44
|
It does not guarantee media support, authentication, or access to a requested model.
|
|
39
45
|
Plan Advisor receives this guidance in its harness inventory.
|
|
40
46
|
|
|
41
|
-
Discovery checks
|
|
42
|
-
|
|
43
|
-
|
|
47
|
+
Discovery checks installation and native login status through supported commands.
|
|
48
|
+
Model access remains unverified until a small real request or a recent successful task returns an answer.
|
|
49
|
+
A stalled check stops at its deadline and reports a blocker.
|
|
50
|
+
Ennodia checks selected worker, Judge, and Advisor routes before execution.
|
|
51
|
+
Known blockers prevent requested work from starting.
|
|
52
|
+
Automatic routing excludes blocked routes and reports missing coverage.
|
|
44
53
|
|
|
45
54
|
## Media inputs
|
|
46
55
|
|
|
@@ -110,6 +119,75 @@ agy --version
|
|
|
110
119
|
agy models
|
|
111
120
|
```
|
|
112
121
|
|
|
113
|
-
If the
|
|
114
|
-
CLI install or shell-integration flow first. Then restart the Model Context
|
|
122
|
+
If neither `PATH` nor the native install roots contain `agy`, open Antigravity
|
|
123
|
+
and use its supported CLI install or shell-integration flow first. Then restart the Model Context
|
|
115
124
|
Protocol (MCP) client and call `ennodia_list_harnesses` again.
|
|
125
|
+
|
|
126
|
+
## Recovery and updates
|
|
127
|
+
|
|
128
|
+
Run the native command returned in `readiness.recovery` in an interactive terminal.
|
|
129
|
+
Keep the intended account, provider, and model.
|
|
130
|
+
Call `ennodia_check_harnesses` after sign-in:
|
|
131
|
+
|
|
132
|
+
```json
|
|
133
|
+
{
|
|
134
|
+
"harnessIds": ["codex"],
|
|
135
|
+
"refresh": true,
|
|
136
|
+
"verify": true
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Pass the same `model` and `cwd` when rechecking an explicit route.
|
|
141
|
+
The check returns `actionRequired` for login, setup, model, capacity, and connectivity blockers.
|
|
142
|
+
A missing CLI requires installation. A capacity failure requires capacity recovery.
|
|
143
|
+
Neither is fixed by repeated sign-in.
|
|
144
|
+
|
|
145
|
+
`credentials-expired` means the configured provider API key has expired.
|
|
146
|
+
Replace the key through the native credential flow for the intended provider.
|
|
147
|
+
Signing in again does not renew an expired API key.
|
|
148
|
+
`quota-exhausted` includes depleted credits.
|
|
149
|
+
Restore credits or quota through the intended provider before rechecking.
|
|
150
|
+
Ennodia reads terminal-formatted native errors and returns the matching recovery action.
|
|
151
|
+
|
|
152
|
+
Hermes uses the full `hermes chat` CLI. The legacy `hermes-agent` executable is not compatible.
|
|
153
|
+
|
|
154
|
+
Native checks cache for 30 seconds. Verified routes cache for five minutes.
|
|
155
|
+
A native authentication failure invalidates the route immediately.
|
|
156
|
+
Concurrent checks of the same route share one request.
|
|
157
|
+
|
|
158
|
+
`unverified` means unchecked. It does not mean a failed harness.
|
|
159
|
+
`ennodia_run` verifies its selected routes before launching workers.
|
|
160
|
+
Checking every supported harness is not a prerequisite for a run.
|
|
161
|
+
|
|
162
|
+
Unrelated harness blockers do not prevent work on a usable requested route.
|
|
163
|
+
A verified default route does not prove access to other models.
|
|
164
|
+
Use the existing user authorization and the host approval policy.
|
|
165
|
+
Ennodia does not require an additional approval step.
|
|
166
|
+
|
|
167
|
+
Model probes run in an empty temporary directory with normal native permissions.
|
|
168
|
+
A temporary directory is not a security sandbox.
|
|
169
|
+
|
|
170
|
+
Probes use provider capacity and reserve 256 input tokens per route for budget checks.
|
|
171
|
+
The reserve is an estimate, not a measurement of provider usage.
|
|
172
|
+
Probe calls count toward `maxChildTasks`. Usage remains unknown when the provider reports no measurement.
|
|
173
|
+
|
|
174
|
+
Before ordinary execution, Ennodia attempts supported upgrades once per day while no Ennodia task is active.
|
|
175
|
+
Homebrew installations use their installed formula or cask.
|
|
176
|
+
An npm Codex installation uses its supported npm update command.
|
|
177
|
+
Other supported installations use native updaters.
|
|
178
|
+
|
|
179
|
+
Updates preserve the installed distribution and channel and use no force flags.
|
|
180
|
+
Pinned or unsupported installations and failed updates require native maintenance.
|
|
181
|
+
Updater success is not proof of model readiness.
|
|
182
|
+
Ennodia rediscovers the version and rechecks the route.
|
|
183
|
+
|
|
184
|
+
Set `ENNODIA_AUTO_UPDATE=false` in the MCP server environment to disable automatic upgrades.
|
|
185
|
+
Call `ennodia_check_harnesses` with `upgrade: true` for an immediate update attempt and recheck.
|
|
186
|
+
The response includes `readiness.upgrade` with the update result and native command.
|
|
187
|
+
Approved Advisor plans do not upgrade during execution, so their frozen inventory remains stable.
|
|
188
|
+
Automatic updates run on use.
|
|
189
|
+
Ennodia does not install a background daemon.
|
|
190
|
+
|
|
191
|
+
Report `actionRequired` and reduced `coverage` to the user on the first response that contains them.
|
|
192
|
+
Compact run responses retain these fields.
|
|
193
|
+
MCP clients control how those responses appear in the conversation.
|