model-orchestrator 0.1.34 → 1.0.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/AGENTS.md +31 -21
- package/CHANGELOG.md +51 -1
- package/README.md +127 -110
- package/bin/README.md +57 -6
- package/bin/aunx.js +7 -0
- package/bin/cli-run.mjs +21 -15
- package/bin/cli.js +376 -257
- package/docs/README.md +15 -18
- package/docs/catalog.md +228 -38
- package/docs/companions.md +28 -10
- package/docs/guarantees.md +21 -12
- package/docs/how-it-routes.md +49 -42
- package/docs/install.md +135 -33
- package/docs/part-1-beginner.md +37 -45
- package/docs/part-2-intermediate.md +34 -52
- package/docs/part-3-advanced.md +36 -26
- package/docs/security-review-history.md +38 -0
- package/llms.txt +24 -25
- package/package.json +16 -8
- package/proof/README.md +100 -0
- package/proof/gate-demo.cast +9 -0
- package/proof/gate-demo.gif +0 -0
- package/proof/results.json +198 -0
- package/proof/scripts/check-gate.js +26 -0
- package/proof/scripts/install-time.js +16 -0
- package/proof/scripts/lib.js +73 -0
- package/proof/scripts/measure.js +15 -0
- package/proof/scripts/missing-results.js +30 -0
- package/proof/scripts/record-gate.js +38 -0
- package/proof/scripts/render.js +18 -0
- package/proof/scripts/runner-overhead.js +21 -0
- package/src/README.md +9 -3
- package/src/activation-ownership.js +19 -0
- package/src/apply-companions.js +104 -0
- package/src/apply-snippets.js +60 -28
- package/src/aunx.js +262 -0
- package/src/catalog.js +253 -117
- package/src/install.js +478 -209
- package/src/plugin.js +13 -4
- package/src/postinstall.js +57 -0
- package/src/roles.js +184 -0
- package/src/uninstall.js +125 -8
- package/templates/README.md +19 -2
- package/templates/advanced/README.md +2 -2
- package/templates/advanced/vm/PRIVACY_GATES.md +17 -19
- package/templates/advanced/vm/README.md +25 -20
- package/templates/advanced/vm/box-CLAUDE.md +19 -18
- package/templates/advanced/vm/jobs/README.md +3 -1
- package/templates/advanced/vm/jobs/weekly-audit.service +3 -0
- package/templates/advanced/vm/jobs/weekly-audit.sh +2 -2
- package/templates/advanced/vm/setup-vm.sh +49 -2
- package/templates/agents/README.md +2 -2
- package/templates/agents/agy/README.md +20 -3
- package/templates/agents/agy/builder.md +11 -7
- package/templates/agents/agy/bulk-worker.md +9 -7
- package/templates/agents/agy/code-reviewer.md +13 -7
- package/templates/agents/agy/deep-planner.md +10 -7
- package/templates/agents/agy/done-verifier.md +13 -22
- package/templates/agents/agy/finding-verifier.md +14 -22
- package/templates/agents/agy/live-researcher.md +10 -7
- package/templates/agents/agy/reader.md +10 -12
- package/templates/agents/claude-code/README.md +18 -14
- package/templates/agents/claude-code/builder.md +10 -15
- package/templates/agents/claude-code/bulk-worker.md +8 -10
- package/templates/agents/claude-code/code-reviewer.md +11 -17
- package/templates/agents/claude-code/deep-planner.md +9 -11
- package/templates/agents/claude-code/done-verifier.md +12 -33
- package/templates/agents/claude-code/finding-verifier.md +13 -39
- package/templates/agents/claude-code/live-researcher.md +9 -11
- package/templates/agents/claude-code/reader.md +9 -18
- package/templates/agents/snippets/chat.md +9 -10
- package/templates/agents/snippets/claude-code.md +17 -18
- package/templates/agents/snippets/generic.md +9 -11
- package/templates/agents/snippets/route-gate.mjs +2 -2
- package/templates/agents/snippets/route-metrics.mjs +1 -1
- package/templates/agents/snippets/subagent-context.mjs +4 -4
- package/templates/beginner/ORCHESTRATOR.md +31 -36
- package/templates/beginner/README.md +1 -1
- package/templates/common/ACCEPTANCE_CHECKS.json +12 -0
- package/templates/common/CONTEXT.md +37 -0
- package/templates/common/DECISIONS.md +11 -0
- package/templates/common/README.md +24 -11
- package/templates/common/TASK_BRIEF.md +84 -0
- package/templates/common/protocols/README.md +14 -11
- package/templates/common/protocols/acceptance-checks.md +14 -0
- package/templates/common/protocols/build-protocol.md +91 -106
- package/templates/common/protocols/context-file.md +10 -0
- package/templates/common/protocols/decision-log.md +9 -0
- package/templates/common/protocols/deep-research.md +20 -34
- package/templates/common/protocols/docs-then-prove.md +13 -18
- package/templates/common/protocols/gap-analysis.md +15 -21
- package/templates/common/protocols/memory-and-record.md +21 -20
- package/templates/common/protocols/numbers-and-logic.md +20 -26
- package/templates/common/protocols/propagate.md +18 -27
- package/templates/intermediate/CLI-RUN.md +83 -113
- package/templates/intermediate/DELEGATION_MATRIX.md +9 -3
- package/templates/intermediate/README.md +3 -3
- package/templates/intermediate/RESEARCH_TRIAGE.md +23 -15
- package/templates/intermediate/ROUTING.md +54 -51
- package/templates/intermediate/TIERS.md +37 -76
- package/templates/tools/README.md +1 -1
- package/templates/tools/obsidian-tc/OBSIDIAN-TC.md +1 -1
- package/docs/audit-brief.md +0 -148
- package/scripts/README.md +0 -7
- package/scripts/gen-catalog.js +0 -81
- package/scripts/gen-plugin.js +0 -16
- package/scripts/record-demo.sh +0 -45
- package/templates/common/TASK_BUNDLE.md +0 -56
package/src/catalog.js
CHANGED
|
@@ -4,20 +4,24 @@
|
|
|
4
4
|
// Fields
|
|
5
5
|
// id stable key used in --ais and in generated files
|
|
6
6
|
// name what the prompt shows
|
|
7
|
-
//
|
|
7
|
+
// summary what the AI is and gives; role assignment is computed in roles.js
|
|
8
|
+
// facts capability claims, billing and model family; null means UNVERIFIED
|
|
9
|
+
// factNotes provenance caveats attached to the named capability facts
|
|
8
10
|
// bin binary to look for on PATH, or null
|
|
9
|
-
// access 'subscription' ($0 per call on a plan you already pay for), 'metered' (per token), 'free', 'local'
|
|
10
|
-
// lane 'A' = subscription CLI, 'B' = metered API, 'local' = stays on the machine
|
|
11
|
-
// laneCategories routing capabilities used to filter generated lane advice
|
|
12
|
-
// role the one job it wins at in a multi-AI stack
|
|
13
11
|
// minLevel 1 beginner, 2 intermediate, 3 advanced
|
|
14
|
-
// install { npm: pkg } for a global npm install
|
|
12
|
+
// install { npm: pkg } for a global npm install command printed for you to run,
|
|
15
13
|
// { script: url } for a vendor shell installer the installer only PRINTS, never runs,
|
|
16
14
|
// { url } for a download page
|
|
17
15
|
// auth how you sign in, always the vendor's own flow, never a key typed into this tool
|
|
16
|
+
// authStatus optional reliable read-only status command; unlisted CLIs get conditional sign-in guidance.
|
|
17
|
+
// trust: 'positive-only' means only a reported success is
|
|
18
|
+
// believed; every other outcome (a reported failure, a parse
|
|
19
|
+
// error, a timeout, a missing binary) keeps the conditional step.
|
|
20
|
+
// jsonField names the boolean field read from the command's JSON
|
|
21
|
+
// stdout under positive-only trust; default 'loggedIn'.
|
|
18
22
|
// rulesFile the instructions file that agent reads from a project root, if any
|
|
19
|
-
//
|
|
20
|
-
//
|
|
23
|
+
// projectMcp verified project-local MCP config: relative file and server-map key.
|
|
24
|
+
// Absent means setup remains a manual step; never infer a global path.
|
|
21
25
|
// builtAgainst the vendor version this release's lane wiring and judges were
|
|
22
26
|
// exercised against. ONE number per lane: the README compatibility
|
|
23
27
|
// table is generated from it, and where install.npm exists the pin
|
|
@@ -29,7 +33,10 @@
|
|
|
29
33
|
// a sentence you can read once (#22)
|
|
30
34
|
// chatSurface chat apps only: where the pasted block goes in that app
|
|
31
35
|
// plans optional known subscription plans: { id, name, headroom,
|
|
32
|
-
// source, checked }.
|
|
36
|
+
// source, checked, tierModels }. A null tierModels leaves model selection
|
|
37
|
+
// to the user's plan and agent configuration.
|
|
38
|
+
|
|
39
|
+
export const CATALOG_MODELS = { measuredAt: '2026-09-23', expiresAt: '2026-10-23', source: 'catalog compatibility snapshot; verify with the provider before use' };
|
|
33
40
|
|
|
34
41
|
export const LEVELS = [
|
|
35
42
|
{
|
|
@@ -44,228 +51,345 @@ export const LEVELS = [
|
|
|
44
51
|
key: 'intermediate',
|
|
45
52
|
name: 'Intermediate',
|
|
46
53
|
tagline: 'several LLMs and agents, called through their CLIs',
|
|
47
|
-
gives: 'everything in Beginner plus cli-run, a delegation matrix
|
|
54
|
+
gives: 'everything in Beginner plus cli-run, a delegation matrix and multi-engine research triage'
|
|
48
55
|
},
|
|
49
56
|
{
|
|
50
57
|
id: 3,
|
|
51
58
|
key: 'advanced',
|
|
52
59
|
name: 'Advanced',
|
|
53
|
-
tagline: 'everything above, plus
|
|
54
|
-
gives: 'everything in Intermediate plus a gateway config, scheduled
|
|
60
|
+
tagline: 'everything above, plus templates for your always-on Linux machine',
|
|
61
|
+
gives: 'everything in Intermediate plus a gateway config, a scheduled review job, dispatch guidance and configurable privacy gates'
|
|
55
62
|
}
|
|
56
63
|
];
|
|
57
64
|
|
|
58
65
|
export const AIS = [
|
|
59
66
|
{
|
|
60
67
|
id: 'claude-code',
|
|
68
|
+
facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
|
|
69
|
+
modelFamily: 'Anthropic',
|
|
70
|
+
kind: 'agent-cli',
|
|
71
|
+
billing: 'subscription',
|
|
72
|
+
pricing: null, // UNVERIFIED: check your provider's current rate.
|
|
73
|
+
headless: true,
|
|
74
|
+
cliRun: false,
|
|
75
|
+
writesFiles: true,
|
|
76
|
+
readOnlyMode: false,
|
|
77
|
+
liveWeb: true, // Source: templates/agents/claude-code/live-researcher.md grants WebSearch and WebFetch.
|
|
78
|
+
runsLocally: false,
|
|
79
|
+
fanOut: null, // UNVERIFIED: no vendor doc states N children in one call.
|
|
80
|
+
contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
|
|
81
|
+
// Verified at code.claude.com/docs/en/sub-agents (fetched 2026-09-10): "A
|
|
82
|
+
// non-fork subagent's initial context contains: CLAUDE.md files: every
|
|
83
|
+
// level of the CLAUDE.md hierarchy the main conversation loads ... The
|
|
84
|
+
// built-in Explore and Plan agents skip this." No other lane in this
|
|
85
|
+
// catalog has that documented, so the builder-by-default routing, the
|
|
86
|
+
// route-gate hook and the inline-threshold note are gated on this field
|
|
87
|
+
// and stay claude-code only.
|
|
88
|
+
loadsProjectRules: true,
|
|
89
|
+
agentDefinitions: '.claude/agents',
|
|
90
|
+
},
|
|
61
91
|
name: 'Claude Code (Anthropic)',
|
|
62
92
|
vendor: 'Anthropic',
|
|
63
|
-
kind: 'agent-cli',
|
|
64
93
|
bin: 'claude',
|
|
65
|
-
|
|
66
|
-
lane: 'A',
|
|
67
|
-
role: 'orchestrator: routes, maps, builds, verifies, records',
|
|
94
|
+
summary: 'Anthropic\'s terminal coding agent; its subagents load the project rules file',
|
|
68
95
|
minLevel: 1,
|
|
69
|
-
install: { npm: '@anthropic-ai/claude-code', pin: '2.1.226' },
|
|
96
|
+
install: { npm: '@anthropic-ai/claude-code', url: 'https://code.claude.com/docs/en/setup', pin: '2.1.226' },
|
|
70
97
|
builtAgainst: '2.1.226',
|
|
71
98
|
auth: 'run `claude` once and sign in with your Anthropic account',
|
|
99
|
+
// Positive-only (Q1): an author-machine probe of a working, authenticated
|
|
100
|
+
// session (2026-09-27) still returned {"loggedIn":false} with exit 1, so a
|
|
101
|
+
// reported failure is not trusted; only loggedIn:true skips the step.
|
|
102
|
+
authStatus: { args: ['auth', 'status'], reliable: true, trust: 'positive-only', jsonField: 'loggedIn', checked: '2026-09-27', source: 'author-machine probe: `claude auth status` (default JSON) returned {"loggedIn":false}, exit 1, inside a working authenticated session' },
|
|
72
103
|
rulesFile: 'CLAUDE.md',
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
104
|
+
// Project scope documented in templates/tools/context7/CONTEXT7.md.
|
|
105
|
+
projectMcp: { file: '.mcp.json', key: 'mcpServers' },
|
|
106
|
+
// tierModels is UNVERIFIED: no checked vendor source maps this plan to model aliases.
|
|
76
107
|
plans: [
|
|
77
|
-
{ id: 'pro', name: 'Claude Pro', headroom: 'base', source: 'https://
|
|
78
|
-
{ id: 'max-5x', name: 'Claude Max 5x', headroom: 'high', source: 'https://
|
|
79
|
-
{ id: 'max-20x', name: 'Claude Max 20x', headroom: 'max', source: 'https://
|
|
80
|
-
]
|
|
81
|
-
// Verified at code.claude.com/docs/en/sub-agents (fetched 2026-09-10): "A
|
|
82
|
-
// non-fork subagent's initial context contains: CLAUDE.md files: every
|
|
83
|
-
// level of the CLAUDE.md hierarchy the main conversation loads ... The
|
|
84
|
-
// built-in Explore and Plan agents skip this." No other lane in this
|
|
85
|
-
// catalog has that documented, so the builder-by-default routing, the
|
|
86
|
-
// route-gate hook and the inline-threshold note are gated on this field
|
|
87
|
-
// and stay claude-code only.
|
|
88
|
-
subagentsLoadRules: true
|
|
108
|
+
{ id: 'pro', name: 'Claude Pro', headroom: 'base', tierModels: null, source: 'https://claude.com/pricing', checked: '2026-09-12' },
|
|
109
|
+
{ id: 'max-5x', name: 'Claude Max 5x', headroom: 'high', tierModels: null, source: 'https://claude.com/pricing', checked: '2026-09-12' },
|
|
110
|
+
{ id: 'max-20x', name: 'Claude Max 20x', headroom: 'max', tierModels: null, source: 'https://claude.com/pricing', checked: '2026-09-12' }
|
|
111
|
+
]
|
|
89
112
|
},
|
|
90
113
|
{
|
|
91
114
|
id: 'codex',
|
|
92
|
-
|
|
115
|
+
facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
|
|
116
|
+
modelFamily: 'OpenAI',
|
|
117
|
+
kind: 'agent-cli',
|
|
118
|
+
billing: 'subscription',
|
|
119
|
+
pricing: null, // UNVERIFIED: check your provider's current rate.
|
|
120
|
+
headless: true,
|
|
121
|
+
cliRun: true,
|
|
122
|
+
writesFiles: true,
|
|
123
|
+
readOnlyMode: true, // Source: --audit maps to a read-only filesystem sandbox (src/install.js).
|
|
124
|
+
liveWeb: null, // UNVERIFIED: no checked capability source.
|
|
125
|
+
runsLocally: false,
|
|
126
|
+
fanOut: false,
|
|
127
|
+
contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
|
|
128
|
+
loadsProjectRules: false,
|
|
129
|
+
agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
|
|
130
|
+
},
|
|
93
131
|
name: 'Codex CLI (OpenAI, ChatGPT plan)',
|
|
94
132
|
vendor: 'OpenAI',
|
|
95
|
-
kind: 'agent-cli',
|
|
96
133
|
bin: 'codex',
|
|
97
|
-
|
|
98
|
-
lane: 'A',
|
|
99
|
-
role: 'second coder and second-opinion reviewer (a different model family reading your diff)',
|
|
134
|
+
summary: 'OpenAI\'s terminal coding agent on a ChatGPT plan; `--audit` runs it in a read-only filesystem sandbox',
|
|
100
135
|
minLevel: 1,
|
|
101
|
-
install: { npm: '@openai/codex', pin: '0.153.4' },
|
|
136
|
+
install: { npm: '@openai/codex', url: 'https://developers.openai.com/codex/cli', pin: '0.153.4' },
|
|
102
137
|
builtAgainst: '0.153.4',
|
|
103
138
|
auth: '`codex login` (add `--device-auth` on a machine with no browser)',
|
|
139
|
+
authStatus: { args: ['login', 'status'], reliable: true, checked: '2026-09-27', source: 'author-machine probe: Logged in using ChatGPT, exit 0' },
|
|
104
140
|
rulesFile: 'AGENTS.md',
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
{ id: '
|
|
109
|
-
{ id: 'pro-
|
|
110
|
-
{ id: 'pro-20x', name: 'ChatGPT Pro 20x', headroom: 'max', source: 'https://learn.chatgpt.com/codex/pricing.md', checked: '2026-09-12' }
|
|
141
|
+
// tierModels is UNVERIFIED: no checked vendor source maps this plan to model aliases.
|
|
142
|
+
plans: [
|
|
143
|
+
{ id: 'plus', name: 'ChatGPT Plus', headroom: 'base', tierModels: null, source: 'https://learn.chatgpt.com/codex/pricing.md', checked: '2026-09-12' },
|
|
144
|
+
{ id: 'pro-5x', name: 'ChatGPT Pro 5x', headroom: 'high', tierModels: null, source: 'https://learn.chatgpt.com/codex/pricing.md', checked: '2026-09-12' },
|
|
145
|
+
{ id: 'pro-20x', name: 'ChatGPT Pro 20x', headroom: 'max', tierModels: null, source: 'https://learn.chatgpt.com/codex/pricing.md', checked: '2026-09-12' }
|
|
111
146
|
]
|
|
112
147
|
},
|
|
113
148
|
{
|
|
114
149
|
id: 'agy',
|
|
115
|
-
|
|
150
|
+
factNotes: { fanOut: 'UNVERIFIED against a vendor doc; inherited from the 0.1.x catalog.' },
|
|
151
|
+
facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
|
|
152
|
+
modelFamily: 'Google',
|
|
153
|
+
kind: 'agent-cli',
|
|
154
|
+
billing: 'subscription',
|
|
155
|
+
pricing: null, // UNVERIFIED: check your provider's current rate.
|
|
156
|
+
headless: true,
|
|
157
|
+
cliRun: true,
|
|
158
|
+
writesFiles: true,
|
|
159
|
+
readOnlyMode: false,
|
|
160
|
+
liveWeb: null, // UNVERIFIED: no checked capability source.
|
|
161
|
+
runsLocally: false,
|
|
162
|
+
fanOut: true, // UNVERIFIED against a vendor doc; inherited from the 0.1.x catalog.
|
|
163
|
+
contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
|
|
164
|
+
loadsProjectRules: null, // UNVERIFIED: project rules inheritance needs a vendor-doc check.
|
|
165
|
+
agentDefinitions: '.agents/agents',
|
|
166
|
+
},
|
|
116
167
|
name: 'Antigravity CLI `agy` (Google AI plan)',
|
|
117
168
|
vendor: 'Google',
|
|
118
|
-
kind: 'agent-cli',
|
|
119
169
|
bin: 'agy',
|
|
120
|
-
|
|
121
|
-
lane: 'A',
|
|
122
|
-
role: 'deep research sweeps and concurrent fan-out (its subagent call takes an array)',
|
|
170
|
+
summary: 'Google\'s Antigravity terminal agent; one subagent call starts several children',
|
|
123
171
|
minLevel: 1,
|
|
124
172
|
install: { script: 'https://antigravity.google/cli/install.sh' },
|
|
125
173
|
builtAgainst: '1.1.27',
|
|
126
|
-
auth: 'first run opens a device-code sign-in with your Google account',
|
|
174
|
+
auth: 'run `agy`; the first run opens a device-code sign-in with your Google account',
|
|
127
175
|
rulesFile: 'GEMINI.md',
|
|
128
|
-
|
|
129
|
-
cliRun: true,
|
|
130
|
-
models: { deep: 'pro', standard: 'flash', fast: 'flash' },
|
|
176
|
+
// tierModels is UNVERIFIED: no checked vendor source maps this plan to model aliases.
|
|
131
177
|
plans: [
|
|
132
|
-
{ id: 'ai-pro', name: 'Google AI Pro', headroom: 'base', source: 'https://gemini.google/subscriptions/', checked: '2026-09-12' },
|
|
133
|
-
{ id: 'ultra-5x', name: 'Google AI Ultra 5x', headroom: 'high', source: 'https://gemini.google/subscriptions/', checked: '2026-09-12' },
|
|
134
|
-
{ id: 'ultra-20x', name: 'Google AI Ultra 20x', headroom: 'max', source: 'https://gemini.google/subscriptions/', checked: '2026-09-12' }
|
|
178
|
+
{ id: 'ai-pro', name: 'Google AI Pro', headroom: 'base', tierModels: null, source: 'https://gemini.google/subscriptions/', checked: '2026-09-12' },
|
|
179
|
+
{ id: 'ultra-5x', name: 'Google AI Ultra 5x', headroom: 'high', tierModels: null, source: 'https://gemini.google/subscriptions/', checked: '2026-09-12' },
|
|
180
|
+
{ id: 'ultra-20x', name: 'Google AI Ultra 20x', headroom: 'max', tierModels: null, source: 'https://gemini.google/subscriptions/', checked: '2026-09-12' }
|
|
135
181
|
],
|
|
136
182
|
note: 'Gemini CLI was retired by Google in June 2026. agy is the successor. Do not install `gemini`.'
|
|
137
183
|
},
|
|
138
184
|
{
|
|
139
185
|
id: 'grok',
|
|
140
|
-
|
|
186
|
+
factNotes: { liveWeb: 'UNVERIFIED against a vendor doc; inherited from the 0.1.x catalog.' },
|
|
187
|
+
facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
|
|
188
|
+
modelFamily: 'xAI',
|
|
189
|
+
kind: 'agent-cli',
|
|
190
|
+
billing: 'subscription',
|
|
191
|
+
pricing: null, // UNVERIFIED: check your provider's current rate.
|
|
192
|
+
headless: true,
|
|
193
|
+
cliRun: true,
|
|
194
|
+
writesFiles: true,
|
|
195
|
+
readOnlyMode: false,
|
|
196
|
+
liveWeb: true, // UNVERIFIED against a vendor doc; inherited first-party X and web search tools.
|
|
197
|
+
runsLocally: false,
|
|
198
|
+
fanOut: false,
|
|
199
|
+
contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
|
|
200
|
+
loadsProjectRules: false,
|
|
201
|
+
agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
|
|
202
|
+
},
|
|
141
203
|
name: 'Grok CLI (xAI, X Premium)',
|
|
142
204
|
vendor: 'xAI',
|
|
143
|
-
kind: 'agent-cli',
|
|
144
205
|
bin: 'grok',
|
|
145
|
-
|
|
146
|
-
lane: 'A',
|
|
147
|
-
role: 'X and live web reads at no per-call cost (its search tools bill on the API, not on the CLI)',
|
|
206
|
+
summary: 'xAI\'s terminal agent with first-party X and web search tools; searches are covered by the subscription rather than billed per call',
|
|
148
207
|
minLevel: 1,
|
|
149
208
|
install: { script: 'https://x.ai/cli/install.sh' },
|
|
150
209
|
builtAgainst: '1.0.5',
|
|
151
210
|
auth: '`grok login` (add `--device-auth` on a headless machine)',
|
|
152
211
|
rulesFile: null,
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
{ id: 'supergrok', name: 'SuperGrok', headroom: '
|
|
157
|
-
{ id: '
|
|
158
|
-
{ id: 'x-premium-plus', name: 'X Premium Plus', headroom: 'base', source: 'https://x.ai/news/grok-build-cli', checked: '2026-09-12' }
|
|
212
|
+
// tierModels is UNVERIFIED: no checked vendor source maps this plan to model aliases.
|
|
213
|
+
plans: [
|
|
214
|
+
{ id: 'supergrok', name: 'SuperGrok', headroom: 'base', tierModels: null, source: 'https://x.ai/news/grok-build-cli', checked: '2026-09-12' },
|
|
215
|
+
{ id: 'supergrok-plus', name: 'SuperGrok Plus', headroom: 'high', tierModels: null, source: 'https://x.ai/pricing', checked: '2026-09-12' },
|
|
216
|
+
{ id: 'x-premium-plus', name: 'X Premium Plus', headroom: 'base', tierModels: null, source: 'https://x.ai/news/grok-build-cli', checked: '2026-09-12' }
|
|
159
217
|
]
|
|
160
218
|
},
|
|
161
219
|
{
|
|
162
220
|
id: 'hermes',
|
|
163
|
-
|
|
221
|
+
facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
|
|
222
|
+
modelFamily: null, // UNVERIFIED: the configured provider or model determines the family.
|
|
223
|
+
kind: 'agent-cli',
|
|
224
|
+
billing: 'free',
|
|
225
|
+
pricing: null, // UNVERIFIED: check your provider's current rate.
|
|
226
|
+
headless: true,
|
|
227
|
+
cliRun: true,
|
|
228
|
+
writesFiles: true,
|
|
229
|
+
readOnlyMode: false,
|
|
230
|
+
liveWeb: null, // UNVERIFIED: no checked capability source.
|
|
231
|
+
runsLocally: false,
|
|
232
|
+
fanOut: false,
|
|
233
|
+
contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
|
|
234
|
+
loadsProjectRules: false,
|
|
235
|
+
agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
|
|
236
|
+
},
|
|
164
237
|
name: 'Hermes Agent (Nous Research)',
|
|
165
238
|
vendor: 'Nous Research',
|
|
166
|
-
kind: 'agent-cli',
|
|
167
239
|
bin: 'hermes',
|
|
168
|
-
|
|
169
|
-
lane: 'A',
|
|
170
|
-
role: 'the free tier: rough drafts, first-pass summaries, cheap divergent reads, cron jobs on a box',
|
|
240
|
+
summary: 'A free terminal agent that chains whichever providers you authenticate',
|
|
171
241
|
minLevel: 2,
|
|
172
242
|
install: { url: 'https://github.com/NousResearch/hermes-agent' },
|
|
173
243
|
builtAgainst: '0.20.0',
|
|
174
244
|
auth: '`hermes auth add <provider>` per provider; its own fallback chain handles outages',
|
|
175
245
|
rulesFile: null,
|
|
176
|
-
agentsDir: null,
|
|
177
|
-
cliRun: true
|
|
178
246
|
},
|
|
179
247
|
{
|
|
180
248
|
id: 'qwen',
|
|
181
|
-
|
|
249
|
+
facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
|
|
250
|
+
modelFamily: null, // UNVERIFIED: the configured provider or model determines the family.
|
|
251
|
+
kind: 'agent-cli',
|
|
252
|
+
billing: 'pay-per-token',
|
|
253
|
+
pricing: null, // UNVERIFIED: check your provider's current rate.
|
|
254
|
+
headless: true,
|
|
255
|
+
cliRun: true,
|
|
256
|
+
writesFiles: true,
|
|
257
|
+
readOnlyMode: false,
|
|
258
|
+
liveWeb: null, // UNVERIFIED: no checked capability source.
|
|
259
|
+
runsLocally: false,
|
|
260
|
+
fanOut: false,
|
|
261
|
+
contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
|
|
262
|
+
loadsProjectRules: false,
|
|
263
|
+
agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
|
|
264
|
+
},
|
|
182
265
|
name: 'Qwen Code CLI (Alibaba, provider-agnostic)',
|
|
183
266
|
vendor: 'Alibaba',
|
|
184
|
-
kind: 'agent-cli',
|
|
185
267
|
bin: 'qwen',
|
|
186
|
-
|
|
187
|
-
lane: 'B',
|
|
188
|
-
role: 'cheapest metered bulk lane for structured output; never for anything that cites a line, a number or a source',
|
|
268
|
+
summary: 'A provider-agnostic terminal agent; you supply the API key, so its rate is your provider\'s rate',
|
|
189
269
|
minLevel: 2,
|
|
190
|
-
install: { npm: '@qwen-code/qwen-code', pin: '0.22.3' },
|
|
270
|
+
install: { npm: '@qwen-code/qwen-code', url: 'https://qwenlm.github.io/qwen-code-docs/en/users/overview/', pin: '0.22.3' },
|
|
191
271
|
builtAgainst: '0.22.3',
|
|
192
|
-
auth: '
|
|
272
|
+
auth: 'run `qwen` and use `/auth` to configure your provider',
|
|
193
273
|
rulesFile: 'QWEN.md',
|
|
194
|
-
agentsDir: null,
|
|
195
|
-
cliRun: true,
|
|
196
274
|
note: 'Its own success flags lie on API failures. cli-run checks the two honest signals for you.'
|
|
197
275
|
},
|
|
198
276
|
{
|
|
199
277
|
id: 'ollama',
|
|
200
|
-
|
|
278
|
+
facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
|
|
279
|
+
modelFamily: null, // UNVERIFIED: the configured provider or model determines the family.
|
|
280
|
+
kind: 'local-runtime',
|
|
281
|
+
billing: 'local',
|
|
282
|
+
pricing: null, // UNVERIFIED: check your provider's current rate.
|
|
283
|
+
headless: true,
|
|
284
|
+
cliRun: false,
|
|
285
|
+
writesFiles: false,
|
|
286
|
+
readOnlyMode: false,
|
|
287
|
+
liveWeb: false,
|
|
288
|
+
runsLocally: true,
|
|
289
|
+
fanOut: false,
|
|
290
|
+
contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
|
|
291
|
+
loadsProjectRules: false,
|
|
292
|
+
agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
|
|
293
|
+
},
|
|
294
|
+
gatewayModel: 'ollama/llama3.2:3b',
|
|
295
|
+
modelsChecked: CATALOG_MODELS.measuredAt,
|
|
296
|
+
modelsExpires: CATALOG_MODELS.expiresAt,
|
|
201
297
|
name: 'Ollama (local models)',
|
|
202
298
|
vendor: 'Ollama',
|
|
203
|
-
kind: 'local',
|
|
204
299
|
bin: 'ollama',
|
|
205
|
-
|
|
206
|
-
lane: 'local',
|
|
207
|
-
role: 'the privacy lane: anything that must never leave the machine. Not a cost lane.',
|
|
300
|
+
summary: 'A local model runtime; work sent here stays on the machine',
|
|
208
301
|
minLevel: 2,
|
|
209
302
|
install: { url: 'https://ollama.com/download', brew: 'ollama' },
|
|
210
303
|
builtAgainst: '0.33.3',
|
|
211
304
|
auth: 'none',
|
|
212
305
|
rulesFile: null,
|
|
213
|
-
agentsDir: null,
|
|
214
|
-
cliRun: false
|
|
215
306
|
},
|
|
216
307
|
{
|
|
217
308
|
id: 'claude-app',
|
|
309
|
+
facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
|
|
310
|
+
modelFamily: 'Anthropic',
|
|
311
|
+
kind: 'chat',
|
|
312
|
+
billing: 'subscription',
|
|
313
|
+
pricing: null, // UNVERIFIED: check your provider's current rate.
|
|
314
|
+
headless: false,
|
|
315
|
+
cliRun: false,
|
|
316
|
+
writesFiles: false,
|
|
317
|
+
readOnlyMode: false,
|
|
318
|
+
liveWeb: null, // UNVERIFIED: no checked capability source.
|
|
319
|
+
runsLocally: false,
|
|
320
|
+
fanOut: false,
|
|
321
|
+
contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
|
|
322
|
+
loadsProjectRules: false,
|
|
323
|
+
agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
|
|
324
|
+
},
|
|
218
325
|
name: 'Claude app or claude.ai (chat only, no CLI)',
|
|
219
326
|
vendor: 'Anthropic',
|
|
220
|
-
kind: 'chat',
|
|
221
327
|
bin: null,
|
|
222
|
-
|
|
223
|
-
lane: 'chat',
|
|
224
|
-
role: 'single-agent use through Projects and custom instructions',
|
|
328
|
+
summary: 'A chat app; it reads pasted instructions, not files',
|
|
225
329
|
minLevel: 1,
|
|
226
330
|
install: { url: 'https://claude.ai' },
|
|
227
331
|
auth: 'sign in',
|
|
228
332
|
chatName: 'the Claude app or claude.ai',
|
|
229
333
|
chatSurface: 'custom instructions or a Project',
|
|
230
334
|
rulesFile: null,
|
|
231
|
-
agentsDir: null,
|
|
232
|
-
cliRun: false
|
|
233
335
|
},
|
|
234
336
|
{
|
|
235
337
|
id: 'chatgpt-app',
|
|
338
|
+
facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
|
|
339
|
+
modelFamily: 'OpenAI',
|
|
340
|
+
kind: 'chat',
|
|
341
|
+
billing: 'subscription',
|
|
342
|
+
pricing: null, // UNVERIFIED: check your provider's current rate.
|
|
343
|
+
headless: false,
|
|
344
|
+
cliRun: false,
|
|
345
|
+
writesFiles: false,
|
|
346
|
+
readOnlyMode: false,
|
|
347
|
+
liveWeb: null, // UNVERIFIED: no checked capability source.
|
|
348
|
+
runsLocally: false,
|
|
349
|
+
fanOut: false,
|
|
350
|
+
contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
|
|
351
|
+
loadsProjectRules: false,
|
|
352
|
+
agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
|
|
353
|
+
},
|
|
236
354
|
name: 'ChatGPT (chat only, no CLI)',
|
|
237
355
|
vendor: 'OpenAI',
|
|
238
|
-
kind: 'chat',
|
|
239
356
|
bin: null,
|
|
240
|
-
|
|
241
|
-
lane: 'chat',
|
|
242
|
-
role: 'single-agent use through custom instructions and Projects',
|
|
357
|
+
summary: 'A chat app; it reads pasted instructions, not files',
|
|
243
358
|
minLevel: 1,
|
|
244
359
|
install: { url: 'https://chatgpt.com' },
|
|
245
360
|
auth: 'sign in',
|
|
246
361
|
chatName: 'ChatGPT',
|
|
247
362
|
chatSurface: 'custom instructions or a Project',
|
|
248
363
|
rulesFile: null,
|
|
249
|
-
agentsDir: null,
|
|
250
|
-
cliRun: false
|
|
251
364
|
},
|
|
252
365
|
{
|
|
253
366
|
id: 'gemini-app',
|
|
367
|
+
facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
|
|
368
|
+
modelFamily: 'Google',
|
|
369
|
+
kind: 'chat',
|
|
370
|
+
billing: 'subscription',
|
|
371
|
+
pricing: null, // UNVERIFIED: check your provider's current rate.
|
|
372
|
+
headless: false,
|
|
373
|
+
cliRun: false,
|
|
374
|
+
writesFiles: false,
|
|
375
|
+
readOnlyMode: false,
|
|
376
|
+
liveWeb: null, // UNVERIFIED: no checked capability source.
|
|
377
|
+
runsLocally: false,
|
|
378
|
+
fanOut: false,
|
|
379
|
+
contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
|
|
380
|
+
loadsProjectRules: false,
|
|
381
|
+
agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
|
|
382
|
+
},
|
|
254
383
|
name: 'Gemini app (chat only, no CLI)',
|
|
255
384
|
vendor: 'Google',
|
|
256
|
-
kind: 'chat',
|
|
257
385
|
bin: null,
|
|
258
|
-
|
|
259
|
-
lane: 'chat',
|
|
260
|
-
role: 'single-agent use through Gems and saved instructions',
|
|
386
|
+
summary: 'A chat app; it reads pasted instructions, not files',
|
|
261
387
|
minLevel: 1,
|
|
262
388
|
install: { url: 'https://gemini.google.com' },
|
|
263
389
|
auth: 'sign in',
|
|
264
390
|
chatName: 'the Gemini app',
|
|
265
391
|
chatSurface: 'saved instructions or a Gem',
|
|
266
392
|
rulesFile: null,
|
|
267
|
-
agentsDir: null,
|
|
268
|
-
cliRun: false
|
|
269
393
|
}
|
|
270
394
|
];
|
|
271
395
|
|
|
@@ -278,9 +402,10 @@ export const TOOLS = [
|
|
|
278
402
|
role: 'exact arithmetic, code execution in 31 languages, SMT logic checks, complexity and equivalence proofs; offline, no key, no telemetry',
|
|
279
403
|
install: "uvx 'codecalc[full]' setup --write",
|
|
280
404
|
pin: '0.5.0',
|
|
405
|
+
mcpSnippets: { 'claude-code': 'mcp/mcpServers.json', codex: 'mcp/codex.config.toml', agy: 'mcp/agy.mcp_config.json', qwen: 'mcp/mcpServers.json' },
|
|
281
406
|
requires: 'uv (https://docs.astral.sh/uv/) and Python 3.10+',
|
|
282
407
|
autoClients: ['Claude Code', 'Claude Desktop', 'Cursor', 'VS Code', 'Zed'],
|
|
283
|
-
recommended:
|
|
408
|
+
recommended: false,
|
|
284
409
|
optionalNote: 'Optional. Needs Python 3.10+ and uv. Everything else runs offline.'
|
|
285
410
|
},
|
|
286
411
|
{
|
|
@@ -290,6 +415,7 @@ export const TOOLS = [
|
|
|
290
415
|
role: 'durable memory and record for your agents: hybrid retrieval (BM25 + dense + link graph), backlinks, compare-and-swap writes with a confirmation gate, folder ACLs, a poison scan on inferred writes; 163 tools, local by default',
|
|
291
416
|
install: 'npm install -g obsidian-tc && obsidian-tc /path/to/your/vault',
|
|
292
417
|
pin: '1.26.0',
|
|
418
|
+
mcpSnippets: { 'claude-code': 'mcp/obsidian-tc.mcpServers.json', codex: 'mcp/obsidian-tc.codex.config.toml', agy: 'mcp/obsidian-tc.agy.mcp_config.json', qwen: 'mcp/obsidian-tc.mcpServers.json' },
|
|
293
419
|
requires: 'an Obsidian vault folder (the Obsidian app itself is only needed for live plugin bridges); Node 24+ or Bun 1.1+ (stricter than this installer); Ollama with `nomic-embed-text` for local embeddings, or a cloud embeddings key; the Local REST API plugin only for bridge tools',
|
|
294
420
|
autoClients: ['Cursor', 'VS Code'],
|
|
295
421
|
recommended: false,
|
|
@@ -302,6 +428,7 @@ export const TOOLS = [
|
|
|
302
428
|
role: 'up-to-date, version-specific documentation and code examples for libraries, SDKs, APIs and CLIs, pulled into the prompt; tells the agent what the code is SUPPOSED to do. Paired with codecalc, which runs the code and proves what it actually does: docs never stand as proof, and where they disagree the run wins',
|
|
303
429
|
install: 'npx ctx7 setup',
|
|
304
430
|
pin: '4.1.1',
|
|
431
|
+
mcpSnippets: { 'claude-code': 'mcp/context7.claude-code.mcp.json', codex: 'mcp/context7.codex.config.toml', agy: 'mcp/context7.agy.mcp_config.json', qwen: 'mcp/context7.qwen.settings.json' },
|
|
305
432
|
requires: 'Node.js 18+ for the local server or the ctx7 CLI; a free CONTEXT7_API_KEY is optional, for higher rate limits (it works anonymously at the base rate)',
|
|
306
433
|
autoClients: ['Claude Code', 'Cursor', 'Codex CLI', 'Qwen Code'],
|
|
307
434
|
recommended: false,
|
|
@@ -313,12 +440,14 @@ export const toolById = Object.fromEntries(TOOLS.map((t) => [t.id, t]));
|
|
|
313
440
|
// Metered API providers for the level 3 gateway. Separate from the AI list on
|
|
314
441
|
// purpose: a Claude Code subscription is not an Anthropic API key, and a user
|
|
315
442
|
// can truthfully have one without the other. Only NAMES of variables live here.
|
|
443
|
+
// Model names are a dated compatibility snapshot, refreshed against vendor catalogs.
|
|
444
|
+
|
|
316
445
|
export const PROVIDERS = [
|
|
317
|
-
{ id: 'anthropic', name: 'Anthropic API', envName: 'ANTHROPIC_API_KEY', lanes: [['standard', 'anthropic/claude-sonnet-5'], ['deep', 'anthropic/claude-opus-5']] },
|
|
318
|
-
{ id: 'openai', name: 'OpenAI API', envName: 'OPENAI_API_KEY', lanes: [['second-opinion', 'openai/gpt-5.6-terra']] },
|
|
319
|
-
{ id: 'google', name: 'Google Gemini API', envName: 'GEMINI_API_KEY', lanes: [['long-context', 'gemini/gemini-3.1-pro']] },
|
|
320
|
-
{ id: 'xai', name: 'xAI API', envName: 'XAI_API_KEY', lanes: [['live-fast', 'xai/grok-4.1-fast']] },
|
|
321
|
-
{ id: 'openrouter', name: 'OpenRouter (many cheap models, one key)', envName: 'OPENROUTER_API_KEY', lanes: [['bulk-cheap', 'openrouter/qwen/qwen3.7-flash']] }
|
|
446
|
+
{ id: 'anthropic', name: 'Anthropic API', envName: 'ANTHROPIC_API_KEY', modelsChecked: CATALOG_MODELS.measuredAt, modelsExpires: CATALOG_MODELS.expiresAt, lanes: [['standard', 'anthropic/claude-sonnet-5'], ['deep', 'anthropic/claude-opus-5']] },
|
|
447
|
+
{ id: 'openai', name: 'OpenAI API', envName: 'OPENAI_API_KEY', modelsChecked: CATALOG_MODELS.measuredAt, modelsExpires: CATALOG_MODELS.expiresAt, lanes: [['second-opinion', 'openai/gpt-5.6-terra']] },
|
|
448
|
+
{ id: 'google', name: 'Google Gemini API', envName: 'GEMINI_API_KEY', modelsChecked: CATALOG_MODELS.measuredAt, modelsExpires: CATALOG_MODELS.expiresAt, lanes: [['long-context', 'gemini/gemini-3.1-pro']] },
|
|
449
|
+
{ id: 'xai', name: 'xAI API', envName: 'XAI_API_KEY', modelsChecked: CATALOG_MODELS.measuredAt, modelsExpires: CATALOG_MODELS.expiresAt, lanes: [['live-fast', 'xai/grok-4.1-fast']] },
|
|
450
|
+
{ id: 'openrouter', name: 'OpenRouter (many cheap models, one key)', envName: 'OPENROUTER_API_KEY', modelsChecked: CATALOG_MODELS.measuredAt, modelsExpires: CATALOG_MODELS.expiresAt, lanes: [['bulk-cheap', 'openrouter/qwen/qwen3.7-flash']] }
|
|
322
451
|
];
|
|
323
452
|
export const providerById = Object.fromEntries(PROVIDERS.map((p) => [p.id, p]));
|
|
324
453
|
|
|
@@ -331,7 +460,7 @@ export const IMAGES = {
|
|
|
331
460
|
|
|
332
461
|
export const byId = Object.fromEntries(AIS.map((a) => [a.id, a]));
|
|
333
462
|
|
|
334
|
-
// The ONE place an npm install spec is built.
|
|
463
|
+
// The ONE place an npm install spec is built. The printed
|
|
335
464
|
// fallback command, the install table and the box script all call this, so
|
|
336
465
|
// two users on two paths get the same version.
|
|
337
466
|
export function npmSpec(a) {
|
|
@@ -344,6 +473,13 @@ export function aisForLevel(level) {
|
|
|
344
473
|
}
|
|
345
474
|
|
|
346
475
|
export function agentCandidates(selected) {
|
|
347
|
-
// Which of the selected AIs can be the single
|
|
348
|
-
return selected.filter((a) => a.kind === 'agent-cli' || a.kind === 'chat');
|
|
476
|
+
// Which of the selected AIs can be the single main agent at level 1.
|
|
477
|
+
return selected.filter((a) => a.facts.kind === 'agent-cli' || a.facts.kind === 'chat');
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
// Preserve provenance when the compact summary is rendered away from facts.
|
|
482
|
+
export function summaryWithEvidence(ai) {
|
|
483
|
+
const notes = Object.entries(ai.factNotes || {}).map(([fact, note]) => `${fact}: ${note}`);
|
|
484
|
+
return notes.length ? `${ai.summary.replace(/\.$/, '')}. ${notes.join(' ')}` : ai.summary;
|
|
349
485
|
}
|