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 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
- **Keep your agent. Get another way forward.**
6
+ **Ennodia isn't another agent. It connects the agents you use.**
7
7
 
8
- When a task stalls, Ennodia lets your primary artificial intelligence (AI) agent try another agent, model, or skill.
9
- The findings come back to the same conversation.
10
- You keep your familiar interface and decide what to try next.
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
- Use Ennodia MCP to get a second opinion on this bug.
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
- ## When it helps
16
+ ## Why use it
20
17
 
21
- - A task is stuck and you want to check another approach.
22
- - A skill looks useful, but you want to try it in a separate task first.
23
- - Two answers disagree and you need to identify the next check.
24
- - An unsuccessful attempt can help you avoid repeating the same approach under the same conditions.
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
- Your main agent checks the findings and integrates useful work.
27
- Additional attempts consume time and resources. General time or token savings have not been established.
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 primary agent:
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 six core tools by default. Add `"--tools", "all"` to `args` for the [full tool set](https://ennodia.cherninlab.com/docs/reference/mcp-tools/#tool-sets).
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
- ## Use your installed agents and skills
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
- Supported agents: Codex CLI, Claude Code, OpenCode, Kilo Code, Kiro CLI, Cline, Hermes Agent, and Antigravity.
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 finds executable commands. It does not verify authentication or model access.
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
- ## See it in practice
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 will compare single agents with teams on public benchmarks.
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 entrypoint is `ennodia_run`. The optional Plan Advisor proposes explicit tasks before execution.
95
- Compare examines completed answers and returns advice with its evidence and limitations.
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
- Version 0.3.0 supports independent model attempts, tailored planning, skill trials and evidence comparison.
109
- The published `ennodia@next` recipes retain the earlier single-worker restriction.
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"], { stdio: "ignore" });
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) to run, but it wasn't found on your PATH.\n" +
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);
@@ -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
- Discovery checks installed commands, not authentication, model access, or provider quota.
35
- A live task establishes which configuration works in your environment.
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 six 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).
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 six 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).
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 `ennodia_list_harnesses` with `refresh: true`.
85
- 2. Choose one available worker for a focused, read-only check from the user's current task.
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 six core tools, about 10,000 characters of definitions.
15
- They cover handing work to one agent or a team, Compare, waiting, cancelling, and run history.
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
- | Check local setup | `ennodia_list_harnesses` | core |
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, and optional `inputGuidance`.
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 installed commands, not active authentication or model access.
42
- A stalled version probe stops at its deadline and adds an adapter note.
43
- Use a small real task to check the selected agent before sending larger work.
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 shell cannot find `agy` at all, open Antigravity and use its supported
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.