ennodia 0.3.0 → 0.4.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 +2 -19
- package/README.md +4 -6
- package/docs/comparisons/agent-frameworks.md +5 -5
- package/docs/comparisons/autogen.md +4 -4
- package/docs/comparisons/chathub.md +4 -4
- package/docs/comparisons/index.md +4 -4
- package/docs/comparisons/langgraph.md +4 -4
- package/docs/comparisons/mixture-of-agents.md +5 -5
- package/docs/comparisons/model-merging.md +5 -5
- package/docs/comparisons/openrouter.md +4 -4
- package/docs/concepts/compositional-audits.md +8 -6
- package/docs/concepts/data-governance.md +5 -9
- package/docs/concepts/how-ennodia-works.md +2 -2
- package/docs/concepts/interfaces-and-core.md +1 -1
- package/docs/concepts/second-opinions.md +5 -5
- package/docs/evidence/index.md +6 -13
- package/docs/evidence/measurement.md +6 -5
- package/docs/getting-started.md +9 -6
- package/docs/guides/agent-skills.md +6 -5
- package/docs/guides/budgets-and-limits.md +8 -6
- package/docs/guides/pragmatic-mode.md +2 -0
- package/docs/guides/recipes.md +1 -4
- package/docs/guides/running-better-audits.md +7 -7
- package/docs/guides/troubleshooting.md +0 -2
- package/docs/guides/understand-results.md +0 -2
- package/docs/index.md +2 -4
- package/docs/install.md +11 -9
- package/docs/reference/controlled-english.md +1 -3
- package/docs/reference/ennodia-io.md +7 -7
- package/docs/reference/mcp-tools.md +69 -15
- package/docs/reference/supported-harnesses.md +9 -4
- package/docs/roadmap.md +0 -2
- package/package.json +3 -10
- package/skills/pragmatic/SKILL.md +2 -0
- package/src/cli.ts +31 -15
- package/src/compare.ts +37 -1
- package/src/core.ts +2 -4
- package/src/diagnosis.ts +48 -1
- package/src/harnesses.ts +54 -25
- package/src/index.ts +4 -0
- package/src/runs.ts +17 -8
- package/src/server.ts +55 -2
- package/src/tasks.ts +145 -37
- package/src/version.ts +1 -1
- package/bench/README.md +0 -34
- package/bench/bug-recall/run.ts +0 -339
- package/bench/bug-recall/scorer.ts +0 -424
- package/bench/fixtures/bug-recall/001-missing-await/input.ts +0 -33
- package/bench/fixtures/bug-recall/001-missing-await/oracle.json +0 -28
- package/bench/fixtures/bug-recall/001-missing-await/responses/claude-code-solo.md +0 -1
- package/bench/fixtures/bug-recall/001-missing-await/responses/codex-solo.md +0 -1
- package/bench/fixtures/bug-recall/001-missing-await/responses/ennodia-parallel-compare.md +0 -1
- package/bench/fixtures/bug-recall/002-timeout-drain/input.ts +0 -40
- package/bench/fixtures/bug-recall/002-timeout-drain/oracle.json +0 -28
- package/bench/fixtures/bug-recall/002-timeout-drain/responses/claude-code-solo.md +0 -1
- package/bench/fixtures/bug-recall/002-timeout-drain/responses/codex-solo.md +0 -1
- package/bench/fixtures/bug-recall/002-timeout-drain/responses/ennodia-parallel-compare.md +0 -1
- package/bench/fixtures/bug-recall/003-schema-contract/input.ts +0 -22
- package/bench/fixtures/bug-recall/003-schema-contract/oracle.json +0 -28
- package/bench/fixtures/bug-recall/003-schema-contract/responses/claude-code-solo.md +0 -1
- package/bench/fixtures/bug-recall/003-schema-contract/responses/codex-solo.md +0 -1
- package/bench/fixtures/bug-recall/003-schema-contract/responses/ennodia-parallel-compare.md +0 -1
- package/bench/fixtures/bug-recall/004-cancel-propagation/input.ts +0 -28
- package/bench/fixtures/bug-recall/004-cancel-propagation/oracle.json +0 -28
- package/bench/fixtures/bug-recall/004-cancel-propagation/responses/claude-code-solo.md +0 -1
- package/bench/fixtures/bug-recall/004-cancel-propagation/responses/codex-solo.md +0 -1
- package/bench/fixtures/bug-recall/004-cancel-propagation/responses/ennodia-parallel-compare.md +0 -1
- package/bench/results/.gitkeep +0 -1
- package/docs/evidence/building-ennodia.md +0 -66
- package/docs/evidence/docs-drift.md +0 -73
- package/docs/evidence/skill-trial.md +0 -68
- package/docs/reference/benchmarks.md +0 -64
- package/examples/docs-drift/README.md +0 -8
- package/examples/docs-drift/archive/migration.md +0 -4
- package/examples/docs-drift/check.ts +0 -7
- package/examples/docs-drift/config.ts +0 -8
- package/examples/docs-drift/demo.ts +0 -54
- package/examples/docs-drift/recorded-run.json +0 -16
- package/examples/skill-trial/README.md +0 -8
- package/examples/skill-trial/check.ts +0 -15
- package/examples/skill-trial/contract.md +0 -7
- package/examples/skill-trial/recorded-trial.json +0 -42
- package/examples/skill-trial/retry.ts +0 -4
|
@@ -3,6 +3,8 @@ title: Agent Skills
|
|
|
3
3
|
description: Install bundled Ennodia skills in native harness locations and tell child agents to use them during a run.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
+
Listing skills is in the core tool set. Installing them needs the [full tool set](/docs/reference/mcp-tools/#tool-sets).
|
|
7
|
+
|
|
6
8
|
A new Agent Skill can help a task, add irrelevant advice, or make no difference.
|
|
7
9
|
Try the skill in a separate Ennodia task and bring useful findings back to your main conversation.
|
|
8
10
|
|
|
@@ -11,9 +13,8 @@ Ennodia discovers that folder and requests the selected skill by name.
|
|
|
11
13
|
It does not inline the full instructions into each delegated prompt.
|
|
12
14
|
|
|
13
15
|
The primary agent can keep useful partial findings without adopting every recommendation.
|
|
14
|
-
The [skill trial example](/docs/evidence/skill-trial/) shows a controlled small exercise.
|
|
15
16
|
|
|
16
|
-
## List
|
|
17
|
+
## List available skills
|
|
17
18
|
|
|
18
19
|
```json
|
|
19
20
|
{
|
|
@@ -27,7 +28,7 @@ The [skill trial example](/docs/evidence/skill-trial/) shows a controlled small
|
|
|
27
28
|
The response includes bundled skills, installed native skills, searched
|
|
28
29
|
directories, and load warnings.
|
|
29
30
|
|
|
30
|
-
## Preview
|
|
31
|
+
## Preview installation
|
|
31
32
|
|
|
32
33
|
Bundled skills use dry-run installation by default. The caller can inspect the
|
|
33
34
|
planned writes before any change:
|
|
@@ -47,7 +48,7 @@ planned writes before any change:
|
|
|
47
48
|
|
|
48
49
|
Review the planned paths. If they are correct, repeat with `dryRun: false`.
|
|
49
50
|
|
|
50
|
-
## Use a
|
|
51
|
+
## Use a skill in a run
|
|
51
52
|
|
|
52
53
|
```json
|
|
53
54
|
{
|
|
@@ -81,7 +82,7 @@ Bundled skills include:
|
|
|
81
82
|
| `release-readiness` | Public release candidate checks. |
|
|
82
83
|
| `benchmark-critic` | Benchmark credibility and reproducibility review. |
|
|
83
84
|
|
|
84
|
-
## Native
|
|
85
|
+
## Native install locations
|
|
85
86
|
|
|
86
87
|
| Harness | Project path | User path |
|
|
87
88
|
| --- | --- | --- |
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Budgets and
|
|
2
|
+
title: Budgets and limits
|
|
3
3
|
description: How Ennodia estimates preflight input-token budgets and enforces local run limits before child agents start.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
+
The tools on this page are in the [full tool set](/docs/reference/mcp-tools/#tool-sets). Add `--tools all` to the Ennodia server arguments to load them.
|
|
7
|
+
|
|
6
8
|
Ennodia can estimate the input-token budget before a costly run starts. The
|
|
7
9
|
estimate is a budget limit check, not a provider invoice. Child-task estimates
|
|
8
10
|
are lower bounds.
|
|
@@ -13,7 +15,7 @@ not visible before the run.
|
|
|
13
15
|
Use it before parallel work or long reviews. Also use it when the user limits
|
|
14
16
|
cost, subscription use, or child-task count.
|
|
15
17
|
|
|
16
|
-
## What the
|
|
18
|
+
## What the estimate includes
|
|
17
19
|
|
|
18
20
|
`ennodia_estimate_budget` reports:
|
|
19
21
|
|
|
@@ -29,7 +31,7 @@ cost, subscription use, or child-task count.
|
|
|
29
31
|
The estimate does not claim to know provider billing, output tokens, tool-call
|
|
30
32
|
cost, cache behavior, harness-internal context, or private subscription quota.
|
|
31
33
|
|
|
32
|
-
## Estimate
|
|
34
|
+
## Estimate before a run
|
|
33
35
|
|
|
34
36
|
```json
|
|
35
37
|
{
|
|
@@ -54,7 +56,7 @@ If the estimate is too high, use one or more of these changes:
|
|
|
54
56
|
- Decrease `maxOutputChars`.
|
|
55
57
|
- Use a narrower first pass.
|
|
56
58
|
|
|
57
|
-
## Enforce
|
|
59
|
+
## Enforce limits on a run
|
|
58
60
|
|
|
59
61
|
The same budget object can be passed to `ennodia_run`:
|
|
60
62
|
|
|
@@ -78,7 +80,7 @@ Ennodia checks these local limits before child tasks start. The run fails early
|
|
|
78
80
|
if estimated input tokens or the child-task count exceed a cap. Ennodia does
|
|
79
81
|
not start the excess model work.
|
|
80
82
|
|
|
81
|
-
## Subscription
|
|
83
|
+
## Subscription limits
|
|
82
84
|
|
|
83
85
|
Subscription quota checks are conservative by design. Ennodia uses only
|
|
84
86
|
supported local command-line interface (CLI) and application programming
|
|
@@ -93,7 +95,7 @@ supported local surface exposes a reliable account limit. An older fail-closed
|
|
|
93
95
|
quota gate has been retired until at least one current harness exposes a real
|
|
94
96
|
supported quota surface.
|
|
95
97
|
|
|
96
|
-
## Practical
|
|
98
|
+
## Practical defaults
|
|
97
99
|
|
|
98
100
|
- Start with one agent and a narrow task. Add attempts when they address a specific uncertainty.
|
|
99
101
|
- Use `maxOutputChars` to keep Compare input bounded.
|
|
@@ -3,6 +3,8 @@ title: Pragmatic mode
|
|
|
3
3
|
description: Organize independent model attempts and compare evidence against complete acceptance criteria.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
+
The tools on this page are in the [full tool set](/docs/reference/mcp-tools/#tool-sets). Add `--tools all` to the Ennodia server arguments to load them.
|
|
7
|
+
|
|
6
8
|
Pragmatic mode is an opt-in beta in `0.3.0`, available through `ennodia`.
|
|
7
9
|
It helps your main agent delegate bounded work without loading entire logs or files into the main conversation.
|
|
8
10
|
It does not guarantee lower costs or select the cheapest model automatically.
|
package/docs/guides/recipes.md
CHANGED
|
@@ -3,9 +3,7 @@ title: Recipes
|
|
|
3
3
|
description: Three small ways to get useful help from Ennodia.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
A focused request is easier to check and integrate.
|
|
6
|
+
Start with one useful attempt. A focused request is easier to check and integrate.
|
|
9
7
|
Give your primary agent the relevant files, attempted fixes, and the result you need.
|
|
10
8
|
|
|
11
9
|
## A task is stuck
|
|
@@ -30,7 +28,6 @@ Show which skill and model were requested and what remains unverified.
|
|
|
30
28
|
|
|
31
29
|
Check native installation with your agent before the task starts.
|
|
32
30
|
A requested skill is not proof that the worker loaded it.
|
|
33
|
-
Use the [small skill trial](/docs/evidence/skill-trial/) to practice comparing two attempts.
|
|
34
31
|
|
|
35
32
|
## Two answers disagree
|
|
36
33
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Better
|
|
2
|
+
title: Better audits
|
|
3
3
|
description: How Ennodia audits can detect product problems that users see, not only consistency issues.
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -11,7 +11,7 @@ This pass can find broken links, mismatched documentation, release metadata erro
|
|
|
11
11
|
errors, and copy drift. It does not prove that the page is clear to a first-time
|
|
12
12
|
visitor.
|
|
13
13
|
|
|
14
|
-
## Quick
|
|
14
|
+
## Quick recipe
|
|
15
15
|
|
|
16
16
|
Use a source-grounded audit for answers that depend on documentation,
|
|
17
17
|
standards, package behavior, or another product's public surface:
|
|
@@ -31,7 +31,7 @@ standards, package behavior, or another product's public surface:
|
|
|
31
31
|
Install the skill first if the harness does not have it. See
|
|
32
32
|
[Agent Skills](/docs/guides/agent-skills/).
|
|
33
33
|
|
|
34
|
-
## Pick the
|
|
34
|
+
## Pick the audit mode
|
|
35
35
|
|
|
36
36
|
Name the failure mode you want reviewers to catch.
|
|
37
37
|
|
|
@@ -50,7 +50,7 @@ For a large review, split the work into focused slices. Do not send the entire
|
|
|
50
50
|
prompt to each reviewer. See
|
|
51
51
|
[Compositional Audits](/docs/concepts/compositional-audits/).
|
|
52
52
|
|
|
53
|
-
## Landing
|
|
53
|
+
## Landing page rubric
|
|
54
54
|
|
|
55
55
|
For landing pages, require each reviewer to answer these questions:
|
|
56
56
|
|
|
@@ -64,7 +64,7 @@ For landing pages, require each reviewer to answer these questions:
|
|
|
64
64
|
For Ennodia, use `mode: "parallel"` and `compare: true` for this type of review.
|
|
65
65
|
A single source-only answer is not sufficient for product pages.
|
|
66
66
|
|
|
67
|
-
## Include
|
|
67
|
+
## Include rendered evidence
|
|
68
68
|
|
|
69
69
|
Source-only review misses visual problems. Before an Ennodia website review,
|
|
70
70
|
include desktop and mobile screenshots. You can also use a harness with browser
|
|
@@ -79,7 +79,7 @@ Then inspect the child outputs for access errors.
|
|
|
79
79
|
If a harness cannot read the files, put them in an accessible location and run
|
|
80
80
|
the task again. Do not treat that failure as a normal design review.
|
|
81
81
|
|
|
82
|
-
## Ground
|
|
82
|
+
## Ground standards in sources
|
|
83
83
|
|
|
84
84
|
Include primary sources when an audit depends on an external standard, registry
|
|
85
85
|
convention, or product behavior. Require reviewers to separate facts from
|
|
@@ -99,7 +99,7 @@ The bundled `source-grounded-audit` skill supports this case. Install it in the
|
|
|
99
99
|
harnesses that perform standards-sensitive audits. Then tell Ennodia to use the
|
|
100
100
|
skill when the answer depends on external documentation.
|
|
101
101
|
|
|
102
|
-
## Good
|
|
102
|
+
## Good prompt shape
|
|
103
103
|
|
|
104
104
|
```text
|
|
105
105
|
Audit this landing page as a first-time visitor, not as a code consistency
|
|
@@ -3,8 +3,6 @@ title: Troubleshooting
|
|
|
3
3
|
description: Resolve failed starts without confusing configuration errors with model quality.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# When an attempt cannot finish
|
|
7
|
-
|
|
8
6
|
Start with the task’s failure reason and captured output.
|
|
9
7
|
Use `ennodia_get_task` for details and `ennodia_list_harnesses` to inspect supported commands.
|
|
10
8
|
|
|
@@ -3,8 +3,6 @@ title: Understand results
|
|
|
3
3
|
description: Distinguish useful findings, disagreement, missing evidence, and failed execution.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Understand the result
|
|
7
|
-
|
|
8
6
|
Process completion is one signal. A useful answer also needs evidence that fits your task.
|
|
9
7
|
|
|
10
8
|
| Result | Meaning | Next step |
|
package/docs/index.md
CHANGED
|
@@ -3,8 +3,6 @@ title: What is Ennodia?
|
|
|
3
3
|
description: Try other agents, models, and skills while staying in your familiar conversation.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Keep your agent. Get another way forward.
|
|
7
|
-
|
|
8
6
|
Ennodia lets your primary artificial intelligence (AI) agent try another agent, model, or skill on a focused task.
|
|
9
7
|
The findings return to your existing conversation.
|
|
10
8
|
|
|
@@ -17,7 +15,7 @@ Even an unsuccessful attempt can show which approach was tested under the record
|
|
|
17
15
|
- [Get your first result](/docs/getting-started/).
|
|
18
16
|
- [Choose a recipe](/docs/guides/recipes/).
|
|
19
17
|
- [Understand the result](/docs/guides/understand-results/).
|
|
20
|
-
- [Read a
|
|
18
|
+
- [Read a recorded run](/articles/can-gemini-hear-this-file/).
|
|
21
19
|
|
|
22
20
|
## Your existing tools
|
|
23
21
|
|
|
@@ -33,7 +31,7 @@ A native agent can also choose unrequested skills from its environment.
|
|
|
33
31
|
- [Agent skills](/docs/guides/agent-skills/)
|
|
34
32
|
- [Troubleshooting](/docs/guides/troubleshooting/)
|
|
35
33
|
- [Data movement and history](/docs/concepts/data-governance/)
|
|
36
|
-
- [
|
|
34
|
+
- [Evidence](/docs/evidence/)
|
|
37
35
|
- [Roadmap](/docs/roadmap/)
|
|
38
36
|
- [Technical reference](/docs/reference/mcp-tools/)
|
|
39
37
|
|
package/docs/install.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Installation for
|
|
2
|
+
title: Installation for agents
|
|
3
3
|
description: A copy-paste installation page for agents that install Ennodia in Codex, Claude Code, OpenCode, Antigravity, and other Model Context Protocol (MCP) clients.
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -7,7 +7,7 @@ This page gives setup instructions to the user's agent.
|
|
|
7
7
|
Install Ennodia as a local Model Context Protocol (MCP) server.
|
|
8
8
|
Then connect it to the user's preferred compatible client.
|
|
9
9
|
|
|
10
|
-
## Copy-Paste
|
|
10
|
+
## Copy-Paste prompt
|
|
11
11
|
|
|
12
12
|
```text
|
|
13
13
|
try-ennodia.cherninlab.com
|
|
@@ -16,7 +16,7 @@ try-ennodia.cherninlab.com
|
|
|
16
16
|
The user can send this address in a new or existing agent conversation.
|
|
17
17
|
The agent handles the setup steps below.
|
|
18
18
|
|
|
19
|
-
## Check the
|
|
19
|
+
## Check the environment
|
|
20
20
|
|
|
21
21
|
1. Identify the user's client and the machine where Ennodia will run.
|
|
22
22
|
2. Check that the client can launch a local standard input/output (stdio) MCP server.
|
|
@@ -31,7 +31,7 @@ If the current client cannot launch a local MCP server, explain the missing capa
|
|
|
31
31
|
Use a compatible local client for Ennodia.
|
|
32
32
|
See [Supported Harnesses](/docs/reference/supported-harnesses/) for the worker agents Ennodia can call.
|
|
33
33
|
|
|
34
|
-
## Install
|
|
34
|
+
## Install command
|
|
35
35
|
|
|
36
36
|
Use the npm package for normal MCP client installation:
|
|
37
37
|
|
|
@@ -42,7 +42,7 @@ npx -y ennodia
|
|
|
42
42
|
Ennodia requires Bun `1.3.14` or newer. `npx` downloads Ennodia. Bun runs it.
|
|
43
43
|
If the client supports Bun directly, use `bunx ennodia`.
|
|
44
44
|
|
|
45
|
-
## MCP
|
|
45
|
+
## MCP configuration
|
|
46
46
|
|
|
47
47
|
Add this server to the user's MCP client configuration:
|
|
48
48
|
|
|
@@ -70,12 +70,14 @@ 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).
|
|
74
|
+
|
|
73
75
|
The configuration above shows the server command and arguments.
|
|
74
76
|
Adapt its format to the client's documented configuration method.
|
|
75
77
|
Reload the tools or restart the client only when its setup instructions require this step.
|
|
76
78
|
Tell the user which step is needed before trying to call Ennodia.
|
|
77
79
|
|
|
78
|
-
## Get
|
|
80
|
+
## Get one useful result
|
|
79
81
|
|
|
80
82
|
After the client exposes Ennodia's tools, start with one small task:
|
|
81
83
|
|
|
@@ -98,7 +100,7 @@ The first run does not require separate planning, budget estimation, or Compare
|
|
|
98
100
|
These tools remain available for larger tasks.
|
|
99
101
|
See [MCP Tools](/docs/reference/mcp-tools/) for exact parameters and identifiers (IDs).
|
|
100
102
|
|
|
101
|
-
## Installed
|
|
103
|
+
## Installed components
|
|
102
104
|
|
|
103
105
|
Ennodia is a local MCP server. It lets the user's main agent request help from
|
|
104
106
|
other installed agent CLI programs during the same task.
|
|
@@ -123,7 +125,7 @@ answer.
|
|
|
123
125
|
Tell the user a real run can take minutes. Compare adds two serial model passes
|
|
124
126
|
after the selected child agents finish.
|
|
125
127
|
|
|
126
|
-
## Example
|
|
128
|
+
## Example requests
|
|
127
129
|
|
|
128
130
|
Use Ennodia when the user permits more model work to get a better answer than
|
|
129
131
|
one agent usually gives.
|
|
@@ -148,7 +150,7 @@ Compare the results before you recommend the final documentation edit.
|
|
|
148
150
|
Compare is model-led. The user does not normally need to judge the parallel
|
|
149
151
|
answers. The trace remains available for inspection.
|
|
150
152
|
|
|
151
|
-
## Optional
|
|
153
|
+
## Optional next steps
|
|
152
154
|
|
|
153
155
|
- Use [Budgets and Limits](/docs/guides/budgets-and-limits/) before costly
|
|
154
156
|
parallel runs.
|
|
@@ -3,15 +3,13 @@ title: Controlled English
|
|
|
3
3
|
description: Ennodia terminology and writing rules for ASD-STE100 Issue 9.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Controlled English
|
|
7
|
-
|
|
8
6
|
Ennodia documentation uses ASD-STE100 Issue 9 as its writing standard.
|
|
9
7
|
This policy applies to the README, documentation, website text, and visible asset text.
|
|
10
8
|
|
|
11
9
|
Commands, API fields, status values, model IDs, and quoted interface text are data.
|
|
12
10
|
Keep this data exact, even when its text does not use controlled English.
|
|
13
11
|
|
|
14
|
-
## Writing
|
|
12
|
+
## Writing rules
|
|
15
13
|
|
|
16
14
|
- Use American English.
|
|
17
15
|
- Use active voice when the agent is known.
|
|
@@ -57,7 +57,7 @@ Environment variables:
|
|
|
57
57
|
| `ENNODIA_IO_MAX_REQUEST_BODY_SIZE` | Default request body byte cap. |
|
|
58
58
|
| `ENNODIA_IO_MAX_CONCURRENT_CHAT_COMPLETIONS` | Default in-flight chat completion cap. |
|
|
59
59
|
|
|
60
|
-
## Security and
|
|
60
|
+
## Security and browser access
|
|
61
61
|
|
|
62
62
|
IO binds to loopback by default and refuses non-loopback hosts unless an API key
|
|
63
63
|
is configured. Bearer tokens are compared with a timing-safe comparison.
|
|
@@ -94,7 +94,7 @@ boundary.
|
|
|
94
94
|
| `GET /v1/models` | Supported | Returns local virtual model IDs for compatible clients. |
|
|
95
95
|
| `POST /v1/chat/completions` | Supported subset | Non-streaming text messages only. Requires a JSON media type. |
|
|
96
96
|
|
|
97
|
-
## Provider
|
|
97
|
+
## Provider options
|
|
98
98
|
|
|
99
99
|
Use provider options when building a settings screen:
|
|
100
100
|
|
|
@@ -135,7 +135,7 @@ Option statuses:
|
|
|
135
135
|
|
|
136
136
|
Add `?includeUnavailable=false` to return only ready options.
|
|
137
137
|
|
|
138
|
-
## Virtual
|
|
138
|
+
## Virtual models
|
|
139
139
|
|
|
140
140
|
`GET /v1/models` returns local virtual models for OpenAI-compatible clients:
|
|
141
141
|
|
|
@@ -148,7 +148,7 @@ Add `?includeUnavailable=false` to return only ready options.
|
|
|
148
148
|
Older aliases `ennodia-auto`, `ennodia/auto`, and `ennodia/compare` are accepted
|
|
149
149
|
for compatibility. Prefer `local/*` IDs in new app integrations.
|
|
150
150
|
|
|
151
|
-
## Chat
|
|
151
|
+
## Chat completions
|
|
152
152
|
|
|
153
153
|
Minimal request:
|
|
154
154
|
|
|
@@ -234,7 +234,7 @@ HTTP error response:
|
|
|
234
234
|
- timeout, disappeared run, or start failure -> `502 ennodia_run_error`
|
|
235
235
|
- failed run or run with `cancelled` status -> `502 ennodia_run_failed` plus run metadata
|
|
236
236
|
|
|
237
|
-
## Library
|
|
237
|
+
## Library use
|
|
238
238
|
|
|
239
239
|
Apps can import the same primitives without running the HTTP server:
|
|
240
240
|
|
|
@@ -249,7 +249,7 @@ const providerOptions = await listAppProviderOptions(core);
|
|
|
249
249
|
The app stays in control of its settings UI, labels, persistence, and consent
|
|
250
250
|
flow. Ennodia supplies local discovery and execution primitives.
|
|
251
251
|
|
|
252
|
-
## Smoke
|
|
252
|
+
## Smoke test
|
|
253
253
|
|
|
254
254
|
From a checkout:
|
|
255
255
|
|
|
@@ -260,7 +260,7 @@ bun run io:smoke
|
|
|
260
260
|
The smoke test starts a local IO server and checks `/health`,
|
|
261
261
|
`/v1/provider-options`, and `/v1/models` without launching child agents.
|
|
262
262
|
|
|
263
|
-
## Not
|
|
263
|
+
## Not implemented
|
|
264
264
|
|
|
265
265
|
IO deliberately rejects or omits:
|
|
266
266
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Model Context Protocol (MCP)
|
|
2
|
+
title: Model Context Protocol (MCP) tools
|
|
3
3
|
description: The public Model Context Protocol (MCP) tool surface exposed by Ennodia.
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -8,20 +8,58 @@ This page describes the tools exposed by the Ennodia Model Context Protocol
|
|
|
8
8
|
orchestration and returns a run ID. Use `ennodia_get_run` to poll status,
|
|
9
9
|
events, child task IDs, Judge + Result Advisor state, and the final answer.
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Tool sets
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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.
|
|
16
|
+
|
|
17
|
+
The full set adds 20 tools for raw tasks, compositional slices, Plan Advisor, budget estimates, separate Compare calls, and skill installation.
|
|
18
|
+
It loads about 46,000 characters of definitions.
|
|
19
|
+
Set `ENNODIA_TOOLS=all` in the server's environment, or add `--tools all` to its arguments:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"mcpServers": {
|
|
24
|
+
"ennodia": {
|
|
25
|
+
"command": "npx",
|
|
26
|
+
"args": ["-y", "ennodia", "--tools", "all"]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
An unknown `--tools` value stops the server with an error. An unknown `ENNODIA_TOOLS` value prints a warning and loads the core set.
|
|
33
|
+
|
|
34
|
+
### Approvals
|
|
35
|
+
|
|
36
|
+
Tools that only read declare the MCP `readOnlyHint` annotation. Clients such as Codex run them without an approval prompt, so polling a run never waits for approval.
|
|
37
|
+
Tools that start agents declare `openWorldHint`, because their workers call model providers. Their workers can change files when the caller allows it, so they claim neither read-only nor harmless.
|
|
38
|
+
|
|
39
|
+
Headless Codex, such as `codex exec`, never asks for approval. It refuses any tool that needs one.
|
|
40
|
+
To let it start Ennodia runs, add this to `~/.codex/config.toml`:
|
|
41
|
+
|
|
42
|
+
```toml
|
|
43
|
+
[mcp_servers.ennodia.tools.ennodia_run]
|
|
44
|
+
approval_mode = "approve"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
This setting approves Ennodia runs only. Codex's sandbox and its other tools keep their settings.
|
|
48
|
+
|
|
49
|
+
## Common workflows
|
|
50
|
+
|
|
51
|
+
| Goal | Tool sequence | Tool set |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| Check local setup | `ennodia_list_harnesses` | core |
|
|
54
|
+
| Start a visible end-to-end run | `ennodia_run` -> `ennodia_get_run` | core |
|
|
55
|
+
| Inspect terminal receipts after restart | `ennodia_history` | core |
|
|
56
|
+
| Preview route and cost | `ennodia_estimate_budget` | full |
|
|
57
|
+
| Preview compositional shard cost | `ennodia_estimate_compositional_budget` | full |
|
|
58
|
+
| Request a tailored team, inspect it, then launch it | `ennodia_start_plan_advice` -> `ennodia_get_plan_advice` -> `ennodia_start_advised_plan` | full |
|
|
59
|
+
| Start focused review shards | `ennodia_start_compositional` -> `ennodia_get_compositional_status` | full |
|
|
60
|
+
| Debug raw child tasks | `ennodia_start` -> `ennodia_get_task` | full |
|
|
61
|
+
| Judge completed outputs and advise on the result | `ennodia_start_compare` -> `ennodia_get_compare` | full |
|
|
62
|
+
| Install bundled skills | `ennodia_list_skills` -> `ennodia_install_skills` | full |
|
|
25
63
|
|
|
26
64
|
For harness IDs and setup notes, see
|
|
27
65
|
[Supported Harnesses](/docs/reference/supported-harnesses/). For budget request
|
|
@@ -84,6 +122,10 @@ For task views, `maxOutputChars` bounds each of `stdout`, `stderr`, and `finalMe
|
|
|
84
122
|
`includeOutput: false` omits their text. `hasOutput` and `finalMessageChars` remain available in compact views.
|
|
85
123
|
`hasOutput` includes captured diagnostic output. It does not establish correctness or a useful answer.
|
|
86
124
|
|
|
125
|
+
A worker CLI can stop at startup when another instance holds its local state, as OpenCode does with its database.
|
|
126
|
+
Ennodia restarts that start up to three times, records a `restart` task event, and reports `startupRestarts` in the task view.
|
|
127
|
+
Restarts keep the original deadline.
|
|
128
|
+
|
|
87
129
|
On macOS and Linux, tasks own process groups. Cancellation sends TERM, then KILL after a bounded grace period.
|
|
88
130
|
Cleanup also removes descendants that remain in the owned group after the parent exits.
|
|
89
131
|
Processes that create a separate session can escape that group.
|
|
@@ -573,6 +615,14 @@ blind spots, and risks. The Result Advisor uses that analysis plus the original
|
|
|
573
615
|
candidates to return a typed answer, basis, confidence, and open questions.
|
|
574
616
|
This is model-led comparison, not formal voting.
|
|
575
617
|
|
|
618
|
+
When one candidate fully answers the prompt as it stands, such as a complete
|
|
619
|
+
file, the Result Advisor names it in `chosenSourceId`. A caller can then use
|
|
620
|
+
that candidate's own text, not a rewrite. `ennodia_run` does this for you: its
|
|
621
|
+
final answer is the Advisor's reason, then the chosen candidate unchanged.
|
|
622
|
+
Ennodia keeps the field only when it names a listed candidate that the Advisor
|
|
623
|
+
saw in full. Otherwise it records an `advisor-choice-ignored` event. A blank
|
|
624
|
+
or null value means no choice.
|
|
625
|
+
|
|
576
626
|
### `ennodia_get_compare`
|
|
577
627
|
|
|
578
628
|
Returns comparison status, candidate inputs, Judge analysis, and typed Result
|
|
@@ -621,11 +671,15 @@ See [Pragmatic mode](/docs/guides/pragmatic-mode/) for examples, evidence retrie
|
|
|
621
671
|
|
|
622
672
|
Task receipts include `deadlineAt` and `timeoutSource` (`caller` or
|
|
623
673
|
`task-manager-default`). The deadline is the process cutoff, not a prediction
|
|
624
|
-
of completion. Every child
|
|
674
|
+
of completion. Every child task receives its execution allowance and source.
|
|
625
675
|
It asks for useful partial findings before the cutoff and reports of
|
|
626
676
|
missing tools or permissions. Caller tools are not
|
|
627
677
|
automatically inherited. This notice does not grant access or extend deadlines.
|
|
628
678
|
|
|
679
|
+
Claude Code receives the notice as operator instructions through `--append-system-prompt`.
|
|
680
|
+
Other agents receive it as a tagged block after the task, marked as coming from Ennodia.
|
|
681
|
+
The task command shows the notice as `<ennodia-notice>`.
|
|
682
|
+
|
|
629
683
|
A timed-out task is an interrupted attempt. Review its captured
|
|
630
684
|
output, events, partial changes, scope, and access before deciding how to proceed.
|
|
631
685
|
A timeout does not establish model inability.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Supported
|
|
2
|
+
title: Supported harnesses
|
|
3
3
|
description: Current Ennodia adapter IDs, local command-line interface (CLI) surfaces, and setup notes for each supported harness.
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -20,7 +20,7 @@ installed and runnable on the current machine.
|
|
|
20
20
|
| `hermes-agent` | <span class="agent-logo agent-logo--hermes-agent" aria-hidden="true"></span>Hermes Agent | Uses the supported Hermes Agent CLI surface when available. |
|
|
21
21
|
| `antigravity` | <span class="agent-logo agent-logo--antigravity" aria-hidden="true"></span>Antigravity | Runs through `agy` and supports browser-oriented review tasks. |
|
|
22
22
|
|
|
23
|
-
## First
|
|
23
|
+
## First check
|
|
24
24
|
|
|
25
25
|
```json
|
|
26
26
|
{
|
|
@@ -42,7 +42,7 @@ Discovery checks installed commands, not active authentication or model access.
|
|
|
42
42
|
A stalled version probe stops at its deadline and adds an adapter note.
|
|
43
43
|
Use a small real task to check the selected agent before sending larger work.
|
|
44
44
|
|
|
45
|
-
## Media
|
|
45
|
+
## Media inputs
|
|
46
46
|
|
|
47
47
|
Ennodia sends a text prompt through the selected CLI. Include local file paths and requested ranges in that prompt.
|
|
48
48
|
The harness must read those files through its available tools and normal permissions.
|
|
@@ -54,12 +54,14 @@ For audio comparisons, match excerpts, playback level, and reference material ac
|
|
|
54
54
|
Native audio findings need evidence of successful media ingestion and observations tied to the requested excerpt.
|
|
55
55
|
Transcription, digital signal processing (DSP), and text-only judging provide distinct evidence. Label each method explicitly.
|
|
56
56
|
|
|
57
|
-
## Claude Code
|
|
57
|
+
## Claude Code models
|
|
58
58
|
|
|
59
59
|
Claude Code model aliases can change. When exact model selection matters, pass
|
|
60
60
|
the full model ID, such as `claude-sonnet-5` or `claude-fable-5`, rather than an
|
|
61
61
|
alias like `sonnet` or `fable`.
|
|
62
62
|
|
|
63
|
+
Ennodia passes its execution notice through `--append-system-prompt`, so workers read it as their session's limits.
|
|
64
|
+
|
|
63
65
|
Do not add permission-bypass flags by default.
|
|
64
66
|
|
|
65
67
|
## Codex
|
|
@@ -75,6 +77,9 @@ profile. Ennodia passes the requested model through the `model` field.
|
|
|
75
77
|
OpenCode model IDs use the provider/model format reported by `opencode models`,
|
|
76
78
|
such as `opencode-go/kimi-k2.7-code`.
|
|
77
79
|
|
|
80
|
+
OpenCode runs that start at the same moment can fail with `database is locked`.
|
|
81
|
+
Ennodia restarts those starts automatically. A task that still fails reports the conflict as its likely cause.
|
|
82
|
+
|
|
78
83
|
## Antigravity
|
|
79
84
|
|
|
80
85
|
An explicit `jetski: no output produced` error is treated as a failed task even if the command exits with code zero.
|
package/docs/roadmap.md
CHANGED
|
@@ -3,8 +3,6 @@ title: Roadmap
|
|
|
3
3
|
description: Reduce the work of choosing, trying, and maintaining agent tools.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Make the next useful attempt easier
|
|
7
|
-
|
|
8
6
|
The roadmap follows the work a user wants to avoid.
|
|
9
7
|
Future items are proposals, not available behavior or release dates.
|
|
10
8
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ennodia",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"mcpName": "io.github.cherninlab/ennodia",
|
|
5
5
|
"description": "Try other agents, models, and skills from your familiar AI workflow through a local MCP server",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,12 +30,6 @@
|
|
|
30
30
|
"files": [
|
|
31
31
|
"bin/ennodia",
|
|
32
32
|
"CONTRIBUTING.md",
|
|
33
|
-
"bench/README.md",
|
|
34
|
-
"bench/bug-recall/run.ts",
|
|
35
|
-
"bench/bug-recall/scorer.ts",
|
|
36
|
-
"bench/fixtures/**/*",
|
|
37
|
-
"bench/results/.gitkeep",
|
|
38
|
-
"examples/**/*",
|
|
39
33
|
"src/cli.ts",
|
|
40
34
|
"src/advisor.ts",
|
|
41
35
|
"src/budget.ts",
|
|
@@ -78,7 +72,7 @@
|
|
|
78
72
|
"start": "bun run src/cli.ts",
|
|
79
73
|
"check": "tsc --noEmit",
|
|
80
74
|
"lint": "oxlint",
|
|
81
|
-
"test": "bun test",
|
|
75
|
+
"test": "bun test ./src ./packages ./website/src",
|
|
82
76
|
"version:sync": "bun run src/dev/sync-version.ts",
|
|
83
77
|
"discover": "bun run src/dev/discover.ts",
|
|
84
78
|
"smoke": "bun run src/dev/smoke.ts",
|
|
@@ -87,8 +81,7 @@
|
|
|
87
81
|
"controlled-english:check": "bun run src/dev/check-controlled-english.ts",
|
|
88
82
|
"io:smoke": "bun run --cwd packages/ennodia-io smoke",
|
|
89
83
|
"task:smoke": "bun run src/dev/task-smoke.ts",
|
|
90
|
-
"bench:
|
|
91
|
-
"bench:bug-recall:live": "bun run bench/bug-recall/run.ts --live",
|
|
84
|
+
"bench:audio-routing": "bun run bench/audio-routing/run.ts",
|
|
92
85
|
"pack:check": "npm pack --dry-run",
|
|
93
86
|
"publish:dry-run": "npm publish --dry-run --tag next",
|
|
94
87
|
"jsr:check": "npx jsr publish --dry-run --allow-dirty",
|
|
@@ -10,6 +10,8 @@ Use Ennodia MCP to finish the user's task with lower total cost per accepted res
|
|
|
10
10
|
## Organize the work
|
|
11
11
|
|
|
12
12
|
1. Establish the complete task, acceptance evidence, permitted actions, source paths, and an explained execution allowance with time for verification. A direct command is sufficient for a simple lookup. For difficult work, ask Ennodia to organize purposeful independent attempts rather than manually inventing every specialist question.
|
|
13
|
+
Steps 3 and 4 and a separate Compare use Ennodia's full tool set. If `ennodia_start_plan_advice` is missing, use `ennodia_run` with `pragmatic`, or tell the user to add `--tools all` to the Ennodia server arguments.
|
|
14
|
+
|
|
13
15
|
2. Discover `ennodia_list_harnesses` and `ennodia_list_skills` for the target cwd. Verify model IDs through supported harness configuration or CLI discovery. Read media `inputGuidance`; require a small native sample probe with file, range, tool and content-specific evidence. Caller tools may be absent in workers. Missing access, quota and deadlines require diagnosis, not a model-quality verdict.
|
|
14
16
|
3. Use `ennodia_start_plan_advice` with the full objective and discovered model allowlists. Request independent approaches, tailored questions and, when useful or requested, matched trials with a discovered skill and no requested skill. Let the Advisor choose assignments within the caller's limits. Inspect the validated plan, acceptance coverage and inventory. Launch a ready plan with `ennodia_start_advised_plan` and its exact digest. An invalid plan starts no workers: preserve it, inspect the validation issues, and correct the specific problem. Do not silently treat invalid advice as executable.
|
|
15
17
|
4. Use `ennodia_start_compositional` for caller-defined or revised slices with distinct models, prompts or skill lists. `skillIds: []` means no requested skills; it does not disable native skill discovery. Inspect `unrequestedSkillsPresent` and actual tool traces. A strict skill/no-skill experiment requires matching isolated environments and observed skill loading. Do not claim a skill effect when the trials also change model, prompt or fixtures.
|