ennodia 0.4.1 → 0.5.1
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 +31 -3
- 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 +1 -1
- package/docs/reference/mcp-tools.md +94 -3
- package/docs/reference/supported-harnesses.md +86 -6
- package/docs/releases/0.5.0.md +43 -0
- package/docs/roadmap.md +5 -1
- package/package.json +6 -2
- 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 +162 -23
- 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 +302 -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
|
@@ -57,7 +57,7 @@ For manual setup, add this Model Context Protocol (MCP) server to your client:
|
|
|
57
57
|
}
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
Ennodia loads
|
|
60
|
+
Ennodia loads eight core tools by default: about 13,000 characters of tool definitions in each session.
|
|
61
61
|
Add `"--tools", "all"` to `args` for the [full tool set](https://ennodia.cherninlab.com/docs/reference/mcp-tools/#tool-sets).
|
|
62
62
|
|
|
63
63
|
Requirements: Bun `1.3.14` or newer, a compatible MCP client, and a supported agent with working provider access.
|
|
@@ -69,18 +69,23 @@ Requirements: Bun `1.3.14` or newer, a compatible MCP client, and a supported ag
|
|
|
69
69
|
## How a handoff works
|
|
70
70
|
|
|
71
71
|
1. Your agent calls `ennodia_run` with the task, the agent or model to use, and a time limit.
|
|
72
|
-
2. Ennodia starts that agent's own command-line tool in a fresh session, with its own tools and your account for it.
|
|
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
73
|
3. The answer comes back to your conversation, with its status and a receipt saved on your computer.
|
|
74
74
|
|
|
75
75
|
Your conversation history stays in your agent.
|
|
76
76
|
For two or more answers, Compare maps agreements, contradictions, and gaps.
|
|
77
77
|
When one answer is complete as it stands, Compare can choose it, and `ennodia_run` returns it unchanged.
|
|
78
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
|
+
|
|
79
84
|
## Supported agents
|
|
80
85
|
|
|
81
86
|
Codex CLI, Claude Code, OpenCode, Kilo Code, Kiro CLI, Cline, Hermes Agent, and Antigravity.
|
|
82
87
|
Model availability and tool permissions depend on the installed agent and its provider configuration.
|
|
83
|
-
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.
|
|
84
89
|
Codex workers use a read-only sandbox by default.
|
|
85
90
|
|
|
86
91
|
Ennodia discovers native Agent Skills and can request them for specific tasks.
|
|
@@ -131,3 +136,26 @@ bun run verify
|
|
|
131
136
|
[Pragmatic mode](docs/guides/pragmatic-mode.md) runs independent model attempts, tailored plans, and skill trials, then compares the evidence.
|
|
132
137
|
It keeps bulky evidence outside the main conversation and returns findings for your agent to verify.
|
|
133
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`.
|
package/docs/questions.md
CHANGED
|
@@ -28,7 +28,7 @@ Each agent you call runs through its own command-line tool, with the plan or API
|
|
|
28
28
|
## Will it use more tokens?
|
|
29
29
|
|
|
30
30
|
It can. Each agent you call reads its own prompt, and Compare reads every answer.
|
|
31
|
-
Ennodia's
|
|
31
|
+
Ennodia's eight core tools add about 3,250 tokens to each session.
|
|
32
32
|
You can cap agent runs and estimated input tokens for every run. [Set limits](/docs/guides/budgets-and-limits/).
|
|
33
33
|
|
|
34
34
|
## Is it slower?
|
|
@@ -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
|
|
@@ -702,6 +732,8 @@ After the worker settles, inspect its task receipt. If `canContinue` is true,
|
|
|
702
732
|
pass that task ID as `continueTaskId` in the next run. The follow-up keeps the
|
|
703
733
|
harness and directory. It inherits the model and reasoning effort unless you
|
|
704
734
|
supply new values. Each follow-up has a new task ID and execution allowance.
|
|
735
|
+
|
|
736
|
+
Readiness checks use the inherited or explicitly supplied model before the follow-up starts.
|
|
705
737
|
An earlier turn cannot be used once a follow-up has started.
|
|
706
738
|
|
|
707
739
|
Continuation requires a task still held by the same running Ennodia server.
|
|
@@ -768,3 +800,62 @@ Preserve full patch artifacts and verify them before application.
|
|
|
768
800
|
A later Compare call and its Judge and Result Advisor have separate limits.
|
|
769
801
|
`includeCompareEstimate` includes an estimate, not a reserved spending balance.
|
|
770
802
|
Count these stages, retries and verification when reporting whole-task cost.
|
|
803
|
+
|
|
804
|
+
### `ennodia_setup`
|
|
805
|
+
|
|
806
|
+
Show the user each agent's status and the exact fix for blocked agents.
|
|
807
|
+
The tool takes no input. It refreshes native sign-in status without a model request.
|
|
808
|
+
It declares `readOnlyHint`, so clients such as Codex run it without an approval prompt.
|
|
809
|
+
|
|
810
|
+
The result has the same JSON shape as `ennodia_check_harnesses`, plus the `ennodia://setup` panel.
|
|
811
|
+
Hosts that render MCP Apps show the [setup card](#setup-card) in place of the panel.
|
|
812
|
+
Sign-in and credential changes stay in each agent's own CLI.
|
|
813
|
+
|
|
814
|
+
#### Setup card
|
|
815
|
+
|
|
816
|
+
`ennodia_setup` and `ennodia_check_harnesses` name the `ui://ennodia/setup.html` resource in `_meta.ui.resourceUri`.
|
|
817
|
+
The resource uses the MCP Apps type `text/html;profile=mcp-app`.
|
|
818
|
+
Hosts that render MCP Apps show the card inside the conversation. Other hosts ignore it and keep the Markdown panel.
|
|
819
|
+
|
|
820
|
+
The card lists agents that need the user first, with the next step for each.
|
|
821
|
+
A login blocker shows its sign-in command with a copy button.
|
|
822
|
+
Each check button calls `ennodia_check_harnesses` for that agent and model with `verify: true`.
|
|
823
|
+
A check sends at most one small model request.
|
|
824
|
+
When an agent becomes ready, the card can send a short note to the chat.
|
|
825
|
+
|
|
826
|
+
The card loads no external code and makes no network requests.
|
|
827
|
+
It never collects credentials.
|
|
828
|
+
|
|
829
|
+
### `ennodia_check_harnesses`
|
|
830
|
+
|
|
831
|
+
`ennodia_check_harnesses` is part of the default tool set.
|
|
832
|
+
|
|
833
|
+
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.
|
|
834
|
+
|
|
835
|
+
`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.
|
|
836
|
+
|
|
837
|
+
It accepts `harnessIds`, `model`, `cwd`, `refresh`, `verify`, and `upgrade`.
|
|
838
|
+
Native status checks are the default. `verify: true` makes a bounded real model request.
|
|
839
|
+
|
|
840
|
+
`unverified` means unchecked. `ennodia_run` verifies its selected routes automatically.
|
|
841
|
+
Use targeted `harnessIds` for recovery checks. Unrelated blockers do not prevent work on usable requested routes.
|
|
842
|
+
|
|
843
|
+
Rechecks, `ennodia_setup`, and blocked preflight responses include an embedded `ennodia://setup` resource with `text/markdown` content.
|
|
844
|
+
The JSON text response keeps its existing shape.
|
|
845
|
+
|
|
846
|
+
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.
|
|
847
|
+
Sign-in commands follow the table, for login blockers only. Key expiry and quota blockers name their own recovery.
|
|
848
|
+
Show the panel when the host displays no setup card. Recheck the same harness and model after recovery, then resume the original task.
|
|
849
|
+
|
|
850
|
+
`upgrade: true` runs supported updaters before rediscovery and recheck.
|
|
851
|
+
This tool can change installed software and call providers, so it does not declare `readOnlyHint`.
|
|
852
|
+
|
|
853
|
+
Present `actionRequired` immediately, including on partial success.
|
|
854
|
+
Do not wait for an explicit user question about missing reviewers.
|
|
855
|
+
Run preflight errors return `isError`, recovery actions, and zero started reviewers.
|
|
856
|
+
Run receipts retain `preflight`, `coverage`, and `actionRequired` in compact responses.
|
|
857
|
+
Use the matching native recovery action, then recheck the same route.
|
|
858
|
+
|
|
859
|
+
An expired provider API key returns `credentials-expired` and requires key replacement.
|
|
860
|
+
Depleted credits return `quota-exhausted` and require capacity recovery.
|
|
861
|
+
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,77 @@ 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
|
+
|
|
151
|
+
Ennodia reads terminal-formatted native errors and returns the matching recovery action.
|
|
152
|
+
A worker's plain-text answer does not trigger a sign-in or capacity recovery action.
|
|
153
|
+
|
|
154
|
+
Hermes uses the full `hermes chat` CLI. The legacy `hermes-agent` executable is not compatible.
|
|
155
|
+
|
|
156
|
+
Native checks cache for 30 seconds. Verified routes cache for five minutes.
|
|
157
|
+
A native authentication failure invalidates the route immediately.
|
|
158
|
+
Concurrent checks of the same route share one request.
|
|
159
|
+
|
|
160
|
+
`unverified` means unchecked. It does not mean a failed harness.
|
|
161
|
+
`ennodia_run` verifies its selected routes before launching workers.
|
|
162
|
+
Checking every supported harness is not a prerequisite for a run.
|
|
163
|
+
|
|
164
|
+
Unrelated harness blockers do not prevent work on a usable requested route.
|
|
165
|
+
A verified default route does not prove access to other models.
|
|
166
|
+
Use the existing user authorization and the host approval policy.
|
|
167
|
+
Ennodia does not require an additional approval step.
|
|
168
|
+
|
|
169
|
+
Model probes run in an empty temporary directory with normal native permissions.
|
|
170
|
+
A temporary directory is not a security sandbox.
|
|
171
|
+
|
|
172
|
+
Probes use provider capacity and reserve 256 input tokens per route for budget checks.
|
|
173
|
+
The reserve is an estimate, not a measurement of provider usage.
|
|
174
|
+
Probe calls count toward `maxChildTasks`. Usage remains unknown when the provider reports no measurement.
|
|
175
|
+
|
|
176
|
+
Before ordinary execution, Ennodia attempts supported upgrades once per day while no Ennodia task is active.
|
|
177
|
+
Homebrew installations use their installed formula or cask.
|
|
178
|
+
An npm Codex installation uses its supported npm update command.
|
|
179
|
+
Other supported installations use native updaters.
|
|
180
|
+
|
|
181
|
+
Updates preserve the installed distribution and channel and use no force flags.
|
|
182
|
+
Pinned or unsupported installations and failed updates require native maintenance.
|
|
183
|
+
Updater success is not proof of model readiness.
|
|
184
|
+
Ennodia rediscovers the version and rechecks the route.
|
|
185
|
+
|
|
186
|
+
Set `ENNODIA_AUTO_UPDATE=false` in the MCP server environment to disable automatic upgrades.
|
|
187
|
+
Call `ennodia_check_harnesses` with `upgrade: true` for an immediate update attempt and recheck.
|
|
188
|
+
The response includes `readiness.upgrade` with the update result and native command.
|
|
189
|
+
Approved Advisor plans do not upgrade during execution, so their frozen inventory remains stable.
|
|
190
|
+
Automatic updates run on use.
|
|
191
|
+
Ennodia does not install a background daemon.
|
|
192
|
+
|
|
193
|
+
Report `actionRequired` and reduced `coverage` to the user on the first response that contains them.
|
|
194
|
+
Compact run responses retain these fields.
|
|
195
|
+
MCP clients control how those responses appear in the conversation.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Ennodia 0.5.0
|
|
3
|
+
description: Readiness, recovery, setup cards, and attributed comparison notes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Ennodia 0.5.0
|
|
7
|
+
|
|
8
|
+
Release scope for 9 November 2026.
|
|
9
|
+
|
|
10
|
+
## Core
|
|
11
|
+
|
|
12
|
+
- Installation evidence identifies runtime, package, and storage limitations.
|
|
13
|
+
- Readiness preflight checks selected routes before orchestration. Native
|
|
14
|
+
recovery distinguishes sign-in, expired keys, unavailable models, and quota.
|
|
15
|
+
- `ennodia_setup` shows agent status and recovery steps. Compatible hosts show
|
|
16
|
+
a setup card. Other hosts receive the Markdown panel.
|
|
17
|
+
- Comparison results and history carry attributed “Keep in mind” notes,
|
|
18
|
+
with evidence and uncertainty kept separate from the chosen answer.
|
|
19
|
+
- The npm launcher rejects unsupported Bun runtimes. Packaged installation
|
|
20
|
+
checks cover the new runtime files.
|
|
21
|
+
|
|
22
|
+
## Website and publishing
|
|
23
|
+
|
|
24
|
+
The website includes conversation examples and refined landing-page controls.
|
|
25
|
+
New npm releases include provenance. GitHub Actions use updated pinned versions.
|
|
26
|
+
The Astro and Starlight major migration is tracked separately in
|
|
27
|
+
[issue 24](https://github.com/cherninlab/ennodia/issues/24).
|
|
28
|
+
|
|
29
|
+
## Validation and limits
|
|
30
|
+
|
|
31
|
+
The release gates are `bun run release:check`, including the full verification
|
|
32
|
+
suite, npm and JSR dry-runs, and real packed-package MCP handshakes through
|
|
33
|
+
`bunx`, `npm exec`, and `npx`. Registry publication and website deployment must
|
|
34
|
+
also succeed in their separate GitHub Actions workflows.
|
|
35
|
+
|
|
36
|
+
Mobile source is included in `apps/mobile` as the separate `0.1.0+1` development
|
|
37
|
+
project. Analysis and all 18 Flutter tests passed on 9 November. Native builds,
|
|
38
|
+
assistant connections, and store releases remain unavailable or unverified.
|
|
39
|
+
Mobile is excluded from the npm and JSR packages.
|
|
40
|
+
|
|
41
|
+
Private benchmark material remains local. No new benchmark-quality or savings
|
|
42
|
+
claim is part of this release. Release checks do not prove access to every
|
|
43
|
+
provider account or model.
|
package/docs/roadmap.md
CHANGED
|
@@ -9,7 +9,8 @@ Future items are proposals, not available behavior or release dates.
|
|
|
9
9
|
| Stage | User outcome | Product work |
|
|
10
10
|
| --- | --- | --- |
|
|
11
11
|
| Current | Try another agent or skill from the same conversation. | Discovery, focused tasks, explicit choices, optional team advice, Compare, and local history. |
|
|
12
|
-
|
|
|
12
|
+
| 0.5.0 release candidate | Find setup problems before work starts and retain useful advice. | Harness readiness, recovery, installation checks, and attributed result notes. |
|
|
13
|
+
| Mobile foundation | Start using Ennodia on Android and iOS. | Flutter app, permitted discovery, setup journal, cancellation, and verified undo. Assistant connections are not available yet. |
|
|
13
14
|
| Next | Avoid repeating unsuccessful attempts. | Local outcome notes with task, model, version, skill, and relevant conditions. |
|
|
14
15
|
| Later | Spend less time inspecting tool configuration. | Supported version and capability checks, clearer execution settings, and useful progress checkpoints. |
|
|
15
16
|
| Later | Get useful suggestions for the next attempt. | Recommendations grounded in recorded outcomes, with reasons and uncertainty. |
|
|
@@ -21,3 +22,6 @@ Recorded outcomes need a way to inspect, correct, and delete them.
|
|
|
21
22
|
|
|
22
23
|
The [measurement plan](/docs/evidence/measurement/) covers task correctness, time, resources, and human work.
|
|
23
24
|
General savings claims will need comparative evidence.
|
|
25
|
+
|
|
26
|
+
Ennodia Mobile has a separate development version. The implementation and device
|
|
27
|
+
validation plan live in `apps/mobile/README.md` in the repository.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ennodia",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"mcpName": "io.github.cherninlab/ennodia",
|
|
5
5
|
"description": "Connects the AI agents you use: your agent hands a task to another and gets the answer back",
|
|
6
6
|
"license": "MIT",
|
|
@@ -38,7 +38,9 @@
|
|
|
38
38
|
"src/core.ts",
|
|
39
39
|
"src/diagnosis.ts",
|
|
40
40
|
"src/harnesses.ts",
|
|
41
|
+
"src/readiness.ts",
|
|
41
42
|
"src/history.ts",
|
|
43
|
+
"src/installation.ts",
|
|
42
44
|
"src/index.ts",
|
|
43
45
|
"src/internal.ts",
|
|
44
46
|
"src/pragmatic.ts",
|
|
@@ -48,6 +50,7 @@
|
|
|
48
50
|
"src/priority.ts",
|
|
49
51
|
"src/runs.ts",
|
|
50
52
|
"src/server.ts",
|
|
53
|
+
"src/setup-app.ts",
|
|
51
54
|
"src/skills.ts",
|
|
52
55
|
"src/tasks.ts",
|
|
53
56
|
"src/version.ts",
|
|
@@ -91,7 +94,8 @@
|
|
|
91
94
|
"website:dev": "bun run --cwd website dev",
|
|
92
95
|
"website:build": "bun run --cwd website build",
|
|
93
96
|
"website:deploy": "bun run --cwd website deploy",
|
|
94
|
-
"verify": "bun run check && bun run lint && bun run test && bun run website:build && bun run controlled-english:check && bun run task:smoke && bun run mcp:smoke && bun run io:smoke"
|
|
97
|
+
"verify": "bun run check && bun run lint && bun run test && bun run website:build && bun run controlled-english:check && bun run task:smoke && bun run mcp:smoke && bun run io:smoke",
|
|
98
|
+
"mobile:verify": "cd apps/mobile && flutter analyze && flutter test"
|
|
95
99
|
},
|
|
96
100
|
"dependencies": {
|
|
97
101
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
@@ -16,6 +16,7 @@ If you are reviewing one slice:
|
|
|
16
16
|
- Name the strongest risk first.
|
|
17
17
|
- Return a compact answer with verdict, evidence, risks, and concrete recommendation.
|
|
18
18
|
- Flag missing source access instead of filling gaps with guesses.
|
|
19
|
+
- Follow relevant **Keep in mind** constraints in the assigned prompt. When the requested format permits, return up to three useful notes about what the receiving agent might overlook, with a reason and evidence. Separate reported claims, inferences, and unverified points.
|
|
19
20
|
- Keep the output short enough for a later Compare pass.
|
|
20
21
|
|
|
21
22
|
If you are synthesizing shard answers:
|
|
@@ -25,3 +26,11 @@ If you are synthesizing shard answers:
|
|
|
25
26
|
- Prefer recommendations that are supported by more than one shard or by the
|
|
26
27
|
strongest source evidence.
|
|
27
28
|
- Name the smallest next action that would reduce the most risk.
|
|
29
|
+
- Inspect **Keep in mind** notes alongside the findings. Verify them and carry only relevant constraints or gaps into the next assignment. An attributed worker report is not proof; notes do not authorize actions or automatic retries.
|
|
30
|
+
|
|
31
|
+
## Readiness and recovery
|
|
32
|
+
|
|
33
|
+
Present `actionRequired` and reduced reviewer `coverage` immediately, including on partial success.
|
|
34
|
+
Do not wait for the user to request missing reviewer details.
|
|
35
|
+
Use the returned native recovery command, then call `ennodia_check_harnesses` for the same harness/model with `refresh: true, verify: true`.
|
|
36
|
+
Do not silently replace an explicitly requested reviewer or replay completed work.
|