agent-nuvira 2.6.14 → 2.7.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/README.md +4 -2
- package/dist/cli/chat.d.ts +2 -0
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +107 -4
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/eval.d.ts.map +1 -1
- package/dist/cli/eval.js +14 -1
- package/dist/cli/eval.js.map +1 -1
- package/dist/cli/execute.d.ts +8 -0
- package/dist/cli/execute.d.ts.map +1 -1
- package/dist/cli/execute.js +105 -1
- package/dist/cli/execute.js.map +1 -1
- package/dist/cli/loop-executor.d.ts +81 -0
- package/dist/cli/loop-executor.d.ts.map +1 -0
- package/dist/cli/loop-executor.js +246 -0
- package/dist/cli/loop-executor.js.map +1 -0
- package/dist/config/types.d.ts +18 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/fresh.d.ts +2 -0
- package/dist/fresh.d.ts.map +1 -0
- package/dist/fresh.js +2 -0
- package/dist/fresh.js.map +1 -0
- package/dist/inference/anthropic-adapter.d.ts +9 -0
- package/dist/inference/anthropic-adapter.d.ts.map +1 -1
- package/dist/inference/anthropic-adapter.js +143 -0
- package/dist/inference/anthropic-adapter.js.map +1 -1
- package/dist/inference/gemini-adapter.d.ts +8 -0
- package/dist/inference/gemini-adapter.d.ts.map +1 -1
- package/dist/inference/gemini-adapter.js +145 -0
- package/dist/inference/gemini-adapter.js.map +1 -1
- package/dist/inference/model-probe.d.ts.map +1 -1
- package/dist/inference/model-probe.js +14 -0
- package/dist/inference/model-probe.js.map +1 -1
- package/dist/inference/native-tools.d.ts +226 -0
- package/dist/inference/native-tools.d.ts.map +1 -0
- package/dist/inference/native-tools.js +389 -0
- package/dist/inference/native-tools.js.map +1 -0
- package/dist/learning/auto-router.d.ts +36 -4
- package/dist/learning/auto-router.d.ts.map +1 -1
- package/dist/learning/auto-router.js +103 -2
- package/dist/learning/auto-router.js.map +1 -1
- package/dist/learning/context-pruner.d.ts.map +1 -1
- package/dist/learning/context-pruner.js +4 -2
- package/dist/learning/context-pruner.js.map +1 -1
- package/dist/learning/engine-router.d.ts +90 -0
- package/dist/learning/engine-router.d.ts.map +1 -0
- package/dist/learning/engine-router.js +128 -0
- package/dist/learning/engine-router.js.map +1 -0
- package/dist/learning/eval-framework.d.ts +42 -1
- package/dist/learning/eval-framework.d.ts.map +1 -1
- package/dist/learning/eval-framework.js +163 -7
- package/dist/learning/eval-framework.js.map +1 -1
- package/dist/learning/routing-cache.d.ts +64 -0
- package/dist/learning/routing-cache.d.ts.map +1 -0
- package/dist/learning/routing-cache.js +100 -0
- package/dist/learning/routing-cache.js.map +1 -0
- package/dist/tools/loop-project-context.d.ts +47 -0
- package/dist/tools/loop-project-context.d.ts.map +1 -0
- package/dist/tools/loop-project-context.js +210 -0
- package/dist/tools/loop-project-context.js.map +1 -0
- package/dist/tools/loop-skill-hint.d.ts +110 -0
- package/dist/tools/loop-skill-hint.d.ts.map +1 -0
- package/dist/tools/loop-skill-hint.js +266 -0
- package/dist/tools/loop-skill-hint.js.map +1 -0
- package/dist/tools/registry.d.ts +10 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +66 -9
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/release-sync.d.ts.map +1 -1
- package/dist/tools/release-sync.js +5 -4
- package/dist/tools/release-sync.js.map +1 -1
- package/dist/tools/tool-loop.d.ts +28 -0
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +182 -6
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/tools/toolsets.d.ts +33 -0
- package/dist/tools/toolsets.d.ts.map +1 -1
- package/dist/tools/toolsets.js +84 -0
- package/dist/tools/toolsets.js.map +1 -1
- package/dist/web-dashboard/chat-console.d.ts +31 -0
- package/dist/web-dashboard/chat-console.d.ts.map +1 -1
- package/dist/web-dashboard/chat-console.js +73 -0
- package/dist/web-dashboard/chat-console.js.map +1 -1
- package/dist/web-dashboard/loop-turn-telemetry.d.ts +27 -0
- package/dist/web-dashboard/loop-turn-telemetry.d.ts.map +1 -0
- package/dist/web-dashboard/loop-turn-telemetry.js +43 -0
- package/dist/web-dashboard/loop-turn-telemetry.js.map +1 -0
- package/dist/web-dashboard/server.d.ts +62 -1
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +205 -4
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +44 -0
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/web-dashboard/public/assets/{index-Cg9LaToa.js → index-C4frng1Q.js} +79 -79
- package/src/web-dashboard/public/assets/{index-Cg9LaToa.js.map → index-C4frng1Q.js.map} +1 -1
- package/src/web-dashboard/public/assets/index-C507EUWf.css +1 -0
- package/src/web-dashboard/public/index.html +2 -2
- package/src/web-dashboard/public/assets/index-B47v8pr1.css +0 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loop skill hint (`src/tools/loop-skill-hint.ts`) — AGENTIC_CAPABILITY_ASSESSMENT
|
|
3
|
+
* Addendum v4 Phase 3.2: "The loop never hears about the orchestrator's skill
|
|
4
|
+
* layer: the pipeline consults SkillStore.findMatch + the hub catalog before
|
|
5
|
+
* planning and injects the matched methodology, but a chat/execute-loop goal
|
|
6
|
+
* starts with zero knowledge that a first-party playbook exists."
|
|
7
|
+
*
|
|
8
|
+
* This module closes that parity gap DETERMINISTICALLY (no LLM call): given
|
|
9
|
+
* the user's goal, it finds the best available skill the SAME way the
|
|
10
|
+
* orchestrator does —
|
|
11
|
+
*
|
|
12
|
+
* 1. compiled SkillStore.findMatch (the first-party capability batch),
|
|
13
|
+
* 2. the hub catalog (findHubSkillMatch — installed SKILL.md skills),
|
|
14
|
+
*
|
|
15
|
+
* then returns a system-prompt block that hands the model the skill's
|
|
16
|
+
* methodology with an EXPLICIT escape hatch ("this is a recommendation —
|
|
17
|
+
* ignore it when it does not fit") and the exact load syntax
|
|
18
|
+
* (`skill` tool, {"skill":"<name>"}).
|
|
19
|
+
*
|
|
20
|
+
* Why an evidence filter on top of findMatch: the compiled store's threshold
|
|
21
|
+
* is intentionally low (score >= 1, "manual discovery") and its scoring adds
|
|
22
|
+
* a quality/usage bonus to EVERY skill — so a goal merely containing a generic
|
|
23
|
+
* pattern word ("goal", "task") can false-positive. The chat loop runs on
|
|
24
|
+
* EVERY message (not just pipeline goals), so the loop hint requires REAL
|
|
25
|
+
* goal evidence: a name-word or tag hit, or two pattern-word hits. The
|
|
26
|
+
* orchestrator does not need this (its planner only sees pipeline goals); the
|
|
27
|
+
* hub catalog's own scoring is keyword-based and needs no filter.
|
|
28
|
+
*
|
|
29
|
+
* Safety rails (mirroring the orchestrator's injection contract):
|
|
30
|
+
* - skills.disabled[] gate — a dashboard/CLI-disabled skill is NEVER
|
|
31
|
+
* injected (the same "the toggle is never cosmetic" rule the match gates
|
|
32
|
+
* enforce elsewhere).
|
|
33
|
+
* - Website-deploy activation gate — the orchestrator requires
|
|
34
|
+
* hosting-specific intent before injecting website methodology; the loop
|
|
35
|
+
* hint applies the identical regex so "deploy the API" does not drag in
|
|
36
|
+
* static-site deployment steps.
|
|
37
|
+
* - Side-effect-free matching: the match itself marks nothing; usage is
|
|
38
|
+
* marked ONCE via markLoopSkillUsed by the caller (skillView()'s internal
|
|
39
|
+
* markUsed is deliberately avoided so the hint builder is idempotent).
|
|
40
|
+
* - Bounded injection: at most ONE methodology block per prompt, and the
|
|
41
|
+
* methodology text itself is capped (compiled: 8 steps; hub: 2000 chars)
|
|
42
|
+
* so a crowded catalog cannot balloon the system prompt.
|
|
43
|
+
* - Best-effort by construction: any store/catalog failure returns '' /
|
|
44
|
+
* null and the turn proceeds exactly as before (a hint must never break
|
|
45
|
+
* a turn).
|
|
46
|
+
*
|
|
47
|
+
* Consumers: chat's runChatAnswer (system prompt) and the execute loop's
|
|
48
|
+
* runLoopExecutor — the two runToolLoop callers that had no skill knowledge.
|
|
49
|
+
*/
|
|
50
|
+
/**
|
|
51
|
+
* Website-deploy activation gate — IDENTICAL to the orchestrator's
|
|
52
|
+
* (src/agents/orchestrator.ts §3c): a website-deployment skill (bundled OR
|
|
53
|
+
* hub-installed) is only injected when the goal carries hosting-specific
|
|
54
|
+
* intent. A generic "deploy the API" goal does NOT get website methodology.
|
|
55
|
+
*/
|
|
56
|
+
const WEBSITE_DEPLOY_ID = /website[-_ ]?deploy/i;
|
|
57
|
+
const HOSTING_INTENT = /cloudflare|netlify|vercel|github\s*pages|hosting|pages\.dev|web\s*site|website|static\s*site|landing\s*page/i;
|
|
58
|
+
/**
|
|
59
|
+
* Meta-words that appear in generic goalPatterns but carry NO goal evidence
|
|
60
|
+
* ("compile a plan for this goal"). Excluded from pattern-word matching so a
|
|
61
|
+
* goal containing only meta-vocabulary can never match a skill.
|
|
62
|
+
*/
|
|
63
|
+
const PATTERN_STOPWORDS = new Set([
|
|
64
|
+
'goal', 'goals', 'task', 'tasks', 'skill', 'skills', 'step', 'steps',
|
|
65
|
+
'plan', 'plans', 'planning', 'when', 'with', 'this', 'that', 'from',
|
|
66
|
+
'into', 'user', 'users', 'want', 'wants', 'need', 'needs', 'request',
|
|
67
|
+
'requests', 'help', 'make', 'using', 'used', 'work', 'works', 'some',
|
|
68
|
+
'onto', 'over', 'your', 'their', 'them', 'then', 'also', 'each',
|
|
69
|
+
]);
|
|
70
|
+
/** Cap on hub SKILL.md body text injected into the prompt (chars). */
|
|
71
|
+
const HUB_BODY_CAP = 2000;
|
|
72
|
+
/** Cap on compiled methodology steps injected into the prompt. */
|
|
73
|
+
const COMPILED_STEP_CAP = 8;
|
|
74
|
+
/** Cap on any single description line (chars). */
|
|
75
|
+
const LINE_CAP = 400;
|
|
76
|
+
/** The skills.disabled[] gate: a disabled skill is never injected. */
|
|
77
|
+
function isDisabled(id, cm) {
|
|
78
|
+
try {
|
|
79
|
+
const cfg = cm?.getAll?.();
|
|
80
|
+
const disabled = cfg?.skills?.disabled;
|
|
81
|
+
return Array.isArray(disabled) && disabled.includes(id);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return false; // config failure must not block matching (the injection is advisory)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Did the goal show REAL evidence for this skill — a name-word hit, a tag
|
|
89
|
+
* hit, or two pattern-word hits (meta-words excluded)? Guards the compiled
|
|
90
|
+
* store's intentionally loose threshold: findMatch adds a quality/usage bonus
|
|
91
|
+
* to every skill, so a generic word like "goal" alone must never inject
|
|
92
|
+
* methodology into a chat turn. Deterministic, no LLM.
|
|
93
|
+
*/
|
|
94
|
+
export function hasRealGoalEvidence(goal, skill) {
|
|
95
|
+
const q = goal.toLowerCase();
|
|
96
|
+
if (!q)
|
|
97
|
+
return false;
|
|
98
|
+
let nameHits = 0;
|
|
99
|
+
for (const word of skill.name.toLowerCase().split(/[^a-z0-9]+/)) {
|
|
100
|
+
if (word.length > 3 && q.includes(word))
|
|
101
|
+
nameHits++;
|
|
102
|
+
}
|
|
103
|
+
let tagHits = 0;
|
|
104
|
+
for (const tag of skill.tags) {
|
|
105
|
+
const t = tag.toLowerCase().trim();
|
|
106
|
+
if (t.length > 3 && q.includes(t))
|
|
107
|
+
tagHits++;
|
|
108
|
+
}
|
|
109
|
+
let patternHits = 0;
|
|
110
|
+
for (const word of skill.goalPattern.toLowerCase().split(/\s+/)) {
|
|
111
|
+
const w = word.trim();
|
|
112
|
+
if (w.length > 3 && !PATTERN_STOPWORDS.has(w) && q.includes(w))
|
|
113
|
+
patternHits++;
|
|
114
|
+
}
|
|
115
|
+
return nameHits >= 1 || tagHits >= 1 || patternHits >= 2;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Find the best skill for the goal across BOTH sources the orchestrator
|
|
119
|
+
* consults, honoring the disabled + website-deploy activation gates (+ the
|
|
120
|
+
* compiled evidence filter). Compiled wins ties (its id is the deterministic
|
|
121
|
+
* seed id). Returns null when nothing matches (never a forced match).
|
|
122
|
+
*/
|
|
123
|
+
export async function findLoopSkillMatch(goal, cm) {
|
|
124
|
+
const q = (goal || '').trim();
|
|
125
|
+
if (!q)
|
|
126
|
+
return null;
|
|
127
|
+
// 1. Compiled store (the first-party capability batch).
|
|
128
|
+
try {
|
|
129
|
+
const { getSkillStore } = await import('../learning/skill-store.js');
|
|
130
|
+
const match = getSkillStore().findMatch(q);
|
|
131
|
+
if (match && !isDisabled(match.id, cm) && hasRealGoalEvidence(q, match)) {
|
|
132
|
+
// Activation gate: website-deploy methodology needs hosting intent.
|
|
133
|
+
if (!(WEBSITE_DEPLOY_ID.test(match.id) || WEBSITE_DEPLOY_ID.test(match.name)) || HOSTING_INTENT.test(q)) {
|
|
134
|
+
return { name: match.name, id: match.id, source: 'compiled' };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Fall through to the hub catalog — a store failure must not block it.
|
|
140
|
+
}
|
|
141
|
+
// 2. Hub catalog (installed SKILL.md skills — first-class runtime
|
|
142
|
+
// capabilities; a fresh `nuvira skills install` is matchable with zero
|
|
143
|
+
// recompilation, exactly like the orchestrator's fallback path). Its
|
|
144
|
+
// scoring is pure keyword evidence (score >= 1), no filter needed.
|
|
145
|
+
try {
|
|
146
|
+
const { findHubSkillMatch } = await import('../learning/hub-skill-catalog.js');
|
|
147
|
+
const hub = findHubSkillMatch(q, cm);
|
|
148
|
+
if (hub && !isDisabled(hub.id, cm)) {
|
|
149
|
+
if (!(WEBSITE_DEPLOY_ID.test(hub.id) || WEBSITE_DEPLOY_ID.test(hub.name)) || HOSTING_INTENT.test(q)) {
|
|
150
|
+
return { name: hub.name, id: hub.id, source: 'hub' };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Best-effort — a catalog failure leaves no hint.
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Bounded, side-effect-free methodology text for a compiled skill (the full
|
|
161
|
+
* Skill shape is fetched via the public get(); step descriptions carry the
|
|
162
|
+
* Level-2 methodology). Deliberately NOT store.skillView() — that marks the
|
|
163
|
+
* skill used as a side effect and renders reference-doc/quality sections the
|
|
164
|
+
* prompt block does not need.
|
|
165
|
+
*/
|
|
166
|
+
function formatCompiledMethodology(skill) {
|
|
167
|
+
const lines = [];
|
|
168
|
+
if (skill.description)
|
|
169
|
+
lines.push(cap(skill.description));
|
|
170
|
+
if (skill.parameters.length > 0) {
|
|
171
|
+
lines.push('Parameters: ' +
|
|
172
|
+
skill.parameters
|
|
173
|
+
.map((p) => `${p.name}${p.required ? '' : ' (optional)'}`)
|
|
174
|
+
.join(', '));
|
|
175
|
+
}
|
|
176
|
+
const steps = skill.steps.slice(0, COMPILED_STEP_CAP);
|
|
177
|
+
steps.forEach((s, i) => {
|
|
178
|
+
lines.push(`Step ${i + 1} [${s.agentType}]: ${cap(s.description)}`);
|
|
179
|
+
});
|
|
180
|
+
if (skill.steps.length > steps.length) {
|
|
181
|
+
lines.push(`(+${skill.steps.length - steps.length} more steps — load the skill for the full methodology)`);
|
|
182
|
+
}
|
|
183
|
+
return lines.join('\n');
|
|
184
|
+
}
|
|
185
|
+
function cap(text, max = LINE_CAP) {
|
|
186
|
+
const t = text.trim();
|
|
187
|
+
return t.length > max ? t.slice(0, max - 1) + '…' : t;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Build the system-prompt block for a matched skill, or '' when there is no
|
|
191
|
+
* match. The block follows the orchestrator's injection contract:
|
|
192
|
+
*
|
|
193
|
+
* - the skill is a RECOMMENDATION, the model still owns the plan (the
|
|
194
|
+
* orchestrator's "model-selected activation" phrasing),
|
|
195
|
+
* - the methodology rides in as Level-2 content (progressive disclosure —
|
|
196
|
+
* the model sees the steps without paying a tool call for them),
|
|
197
|
+
* - the exact load syntax is included so the model can refresh/parameterize
|
|
198
|
+
* via the `skill` tool mid-turn,
|
|
199
|
+
* - ONE block max (bounded system-prompt growth).
|
|
200
|
+
*
|
|
201
|
+
* Marks nothing: usage tracking belongs to markLoopSkillUsed (the caller
|
|
202
|
+
* decides when a match actually got USED — i.e. was injected).
|
|
203
|
+
*
|
|
204
|
+
* @param goal the user's goal text (matched against skill triggers)
|
|
205
|
+
* @param cm ConfigManager for the disabled-skills gate (optional)
|
|
206
|
+
* @param injected out-param: when provided, receives the match that was
|
|
207
|
+
* injected (null when none).
|
|
208
|
+
*/
|
|
209
|
+
export async function buildLoopSkillHint(goal, cm, injected) {
|
|
210
|
+
const match = await findLoopSkillMatch(goal, cm).catch(() => null);
|
|
211
|
+
if (injected)
|
|
212
|
+
injected.value = match;
|
|
213
|
+
if (!match)
|
|
214
|
+
return '';
|
|
215
|
+
// Full methodology (Level 2). Compiled: the stored Skill (steps carry the
|
|
216
|
+
// methodology). Hub: the SKILL.md body.
|
|
217
|
+
let methodology = '';
|
|
218
|
+
if (match.source === 'hub') {
|
|
219
|
+
try {
|
|
220
|
+
const { findHubSkillMatch } = await import('../learning/hub-skill-catalog.js');
|
|
221
|
+
methodology = cap(findHubSkillMatch(goal, cm)?.body ?? '', HUB_BODY_CAP);
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
methodology = '';
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
try {
|
|
229
|
+
const { getSkillStore } = await import('../learning/skill-store.js');
|
|
230
|
+
methodology = formatCompiledMethodology(getSkillStore().get(match.id));
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
methodology = '';
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const lines = [
|
|
237
|
+
'',
|
|
238
|
+
'## Matched skill',
|
|
239
|
+
`A first-party skill matches this goal: **${match.name}** (${match.source} skill, id ${match.id}).`,
|
|
240
|
+
'This is a RECOMMENDATION — follow it when it fits the request; ignore it when it does not (you still own the plan).',
|
|
241
|
+
];
|
|
242
|
+
if (methodology) {
|
|
243
|
+
lines.push('', 'Its methodology:', '', methodology);
|
|
244
|
+
}
|
|
245
|
+
lines.push('', `To (re)load it with parameters mid-turn, call the skill tool with {"skill":"${match.name}"}.`);
|
|
246
|
+
return lines.join('\n');
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Mark an injected skill as used (usage tracking parity with the orchestrator
|
|
250
|
+
* — compiled skills only; hub skills have no compiled usage counter). The
|
|
251
|
+
* SINGLE usage marker for the loop hint path (the hint builder never marks).
|
|
252
|
+
* Best-effort, fire-and-forget: never throws, never awaited by callers on the
|
|
253
|
+
* hot path.
|
|
254
|
+
*/
|
|
255
|
+
export async function markLoopSkillUsed(match) {
|
|
256
|
+
if (!match || match.source !== 'compiled')
|
|
257
|
+
return;
|
|
258
|
+
try {
|
|
259
|
+
const { getSkillStore } = await import('../learning/skill-store.js');
|
|
260
|
+
getSkillStore().markUsed(match.id);
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
// Best-effort.
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=loop-skill-hint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-skill-hint.js","sourceRoot":"","sources":["../../src/tools/loop-skill-hint.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/registry.d.ts
CHANGED
|
@@ -122,6 +122,16 @@ export interface ToolContext {
|
|
|
122
122
|
* throws).
|
|
123
123
|
*/
|
|
124
124
|
planStore?: import('./plan-store.js').PlanStoreLike;
|
|
125
|
+
/**
|
|
126
|
+
* Tiered tool exposure (AGENTIC_CAPABILITY_ASSESSMENT Addendum v3/v4):
|
|
127
|
+
* when the loop runs in 'tiered' mode, tools outside the CORE set are
|
|
128
|
+
* hidden from the model's schema until loaded. A `tool_search` load action
|
|
129
|
+
* writes the loaded toolset names here; the tool loop reads this AFTER
|
|
130
|
+
* each tool execution and unions the loaded toolsets' tool schemas into
|
|
131
|
+
* the live set before the next model step. Optional — absent contexts
|
|
132
|
+
* (tests, non-tiered callers) simply never extend the schema set.
|
|
133
|
+
*/
|
|
134
|
+
loadedExtraTools?: Set<string>;
|
|
125
135
|
}
|
|
126
136
|
/** A clarify-style choice. */
|
|
127
137
|
export interface AskUserChoice {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,EAAE,CAAC,EAAgB,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AAKpD,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,CAAC;AAElE,oEAAoE;AACpE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED;;;;GAIG;AACH,MAAM,WAAW,IAAI;IACnB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,2EAA2E;IAC3E,WAAW,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,qEAAqE;IACrE,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3D;AAED,wCAAwC;AACxC,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,aAAa,EAAE,GAAG,CAAC;IACnB,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,4CAA4C;IAC5C,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACvG,kEAAkE;IAClE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/D,oEAAoE;IACpE,OAAO,CAAC,EAAE,OAAO,oBAAoB,EAAE,SAAS,CAAC;IACjD;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,qBAAqB,EAAE,YAAY,CAAC;IACvD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;YAAE,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;YAAC,IAAI,EAAE,UAAU,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/J,sFAAsF;QACtF,MAAM,CAAC,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QACjD;;2EAEmE;QACnE,gBAAgB,CAAC,CAAC,KAAK,EAAE;YAAE,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;YAAC,IAAI,EAAE,UAAU,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACtJ,SAAS,EAAE;YAAE,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG;gBAAE,QAAQ,EAAE,MAAM,CAAC;gBAAC,SAAS,EAAE,MAAM,CAAA;aAAE,GAAG,IAAI,CAAA;SAAE,CAAC;KACxF,CAAC;IACF;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,iBAAiB,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/registry.js
CHANGED
|
@@ -1598,24 +1598,81 @@ registerTool({
|
|
|
1598
1598
|
}),
|
|
1599
1599
|
});
|
|
1600
1600
|
// ─── Batch 5: Infrastructure ──────────────────────────────────────────────
|
|
1601
|
-
// Tool search tool
|
|
1601
|
+
// Tool search tool — the tiered-exposure discovery surface. Two actions:
|
|
1602
|
+
// - search (default): fuzzy-find tools by query (the pre-existing behavior).
|
|
1603
|
+
// - load: LOAD a whole toolset's tools into the CURRENT turn's model schema
|
|
1604
|
+
// (tiered exposure — assessment Addendum v3/v4). Writes the toolset's tool
|
|
1605
|
+
// names into ctx.loadedExtraTools; the tool loop unions them into the live
|
|
1606
|
+
// schema set before the next model step. Domain tools (media, browser,
|
|
1607
|
+
// channels, docker, …) stay out of every turn's schema until this runs —
|
|
1608
|
+
// ~85% of per-turn schema tokens saved, zero capability lost.
|
|
1602
1609
|
registerTool({
|
|
1603
1610
|
name: 'tool_search',
|
|
1604
|
-
description: '
|
|
1611
|
+
description: 'Discover and load tools. Actions: "search" fuzzy-finds tools by query; ' +
|
|
1612
|
+
'"load" activates a whole toolset (media, browser, channels, docker, ' +
|
|
1613
|
+
'productivity, publish, core-pipeline, …) for THIS turn — call it before ' +
|
|
1614
|
+
'using any tool outside the always-available core set. "load" returns ' +
|
|
1615
|
+
'the toolset\'s tool names, which become callable immediately.',
|
|
1605
1616
|
category: 'workflow',
|
|
1606
1617
|
inputSchema: z.object({
|
|
1607
|
-
|
|
1608
|
-
|
|
1618
|
+
action: z.enum(['search', 'load']).optional().describe('Defaults to "search".'),
|
|
1619
|
+
query: z.string().optional().describe('Search query (action=search)'),
|
|
1620
|
+
limit: z.number().optional().describe('Max results (action=search)'),
|
|
1621
|
+
toolset: z.string().optional().describe('Toolset name to load (action=load) — e.g. "media", "browser", "channels"'),
|
|
1609
1622
|
}),
|
|
1610
1623
|
endsAgentStep: false,
|
|
1611
|
-
run: (args
|
|
1612
|
-
const { query, limit } = args;
|
|
1624
|
+
run: async (args, ctx) => {
|
|
1625
|
+
const { action = 'search', query, limit, toolset } = args;
|
|
1626
|
+
// ── load: activate a toolset for this turn (tiered exposure) ──
|
|
1627
|
+
if (action === 'load') {
|
|
1628
|
+
if (!toolset) {
|
|
1629
|
+
// No toolset named — return the CATALOG so the model can pick one.
|
|
1630
|
+
// All enabled toolsets are listed; loading one whose tools are
|
|
1631
|
+
// already core-exposed is a harmless idempotent union.
|
|
1632
|
+
const { getToolsetStatus } = await import('./toolsets.js');
|
|
1633
|
+
const status = getToolsetStatus(ctx?.configManager)
|
|
1634
|
+
.filter((s) => s.enabled)
|
|
1635
|
+
.map((s) => ({ name: s.name, label: s.label, tools: s.tools }));
|
|
1636
|
+
return JSON.stringify({
|
|
1637
|
+
loaded: false,
|
|
1638
|
+
message: 'No toolset named. Loadable toolsets (call again with action:"load", toolset:<name>):',
|
|
1639
|
+
toolsets: status,
|
|
1640
|
+
});
|
|
1641
|
+
}
|
|
1642
|
+
const { TOOLSETS, isToolEnabled } = await import('./toolsets.js');
|
|
1643
|
+
const def = TOOLSETS.find((t) => t.name === toolset);
|
|
1644
|
+
if (!def) {
|
|
1645
|
+
const names = TOOLSETS.map((t) => t.name).join(', ');
|
|
1646
|
+
return `Error: unknown toolset "${toolset}". Available: ${names}.`;
|
|
1647
|
+
}
|
|
1648
|
+
// A user-disabled toolset must not resurrect through the load path —
|
|
1649
|
+
// the I1 enablement gate stays the single source of truth.
|
|
1650
|
+
if (!isToolEnabled(def.tools[0], ctx?.configManager)) {
|
|
1651
|
+
return `Error: toolset "${toolset}" is disabled by configuration — enable it with \`nuvira tools toolsets\` first.`;
|
|
1652
|
+
}
|
|
1653
|
+
const already = ctx?.loadedExtraTools instanceof Set ? ctx.loadedExtraTools : undefined;
|
|
1654
|
+
if (already) {
|
|
1655
|
+
for (const name of def.tools)
|
|
1656
|
+
already.add(name);
|
|
1657
|
+
}
|
|
1658
|
+
return JSON.stringify({
|
|
1659
|
+
loaded: true,
|
|
1660
|
+
toolset: def.name,
|
|
1661
|
+
label: def.label,
|
|
1662
|
+
tools: def.tools,
|
|
1663
|
+
note: already
|
|
1664
|
+
? 'Tools are now callable this turn.'
|
|
1665
|
+
: 'Toolset recorded, but this context has no live schema loader (loop not in tiered mode) — tools remain governed by the standard enablement gate.',
|
|
1666
|
+
});
|
|
1667
|
+
}
|
|
1668
|
+
// ── search: the pre-existing fuzzy find (unchanged behavior) ──
|
|
1669
|
+
const m = await import('./infra-tools.js');
|
|
1613
1670
|
const engine = m.getToolSearchEngine();
|
|
1614
1671
|
// Index from registry
|
|
1615
|
-
const { listTools } =
|
|
1672
|
+
const { listTools } = await import('./registry.js');
|
|
1616
1673
|
engine.index(listTools().map((t) => ({ name: t.name, description: t.description })));
|
|
1617
|
-
return JSON.stringify(engine.search(query, limit || 10));
|
|
1618
|
-
}
|
|
1674
|
+
return JSON.stringify(engine.search(query || '', limit || 10));
|
|
1675
|
+
},
|
|
1619
1676
|
});
|
|
1620
1677
|
// Budget config tool
|
|
1621
1678
|
registerTool({
|