agentfootprint 1.15.0 → 1.16.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/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/concepts/AgentBuilder.js +66 -1
- package/dist/esm/lib/concepts/AgentBuilder.js.map +1 -1
- package/dist/esm/lib/skills/defineSkill.js +13 -0
- package/dist/esm/lib/skills/defineSkill.js.map +1 -0
- package/dist/esm/lib/skills/index.js +5 -0
- package/dist/esm/lib/skills/index.js.map +1 -0
- package/dist/esm/lib/skills/registry.js +197 -0
- package/dist/esm/lib/skills/registry.js.map +1 -0
- package/dist/esm/lib/skills/renderBody.js +34 -0
- package/dist/esm/lib/skills/renderBody.js.map +1 -0
- package/dist/esm/lib/skills/surfaceMode.js +52 -0
- package/dist/esm/lib/skills/surfaceMode.js.map +1 -0
- package/dist/esm/lib/skills/types.js +2 -0
- package/dist/esm/lib/skills/types.js.map +1 -0
- package/dist/esm/providers/prompt/skillBasedPrompt.js.map +1 -1
- package/dist/esm/skills.barrel.js +42 -0
- package/dist/esm/skills.barrel.js.map +1 -0
- package/dist/esm/tools/ToolRegistry.js +13 -0
- package/dist/esm/tools/ToolRegistry.js.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/concepts/AgentBuilder.js +66 -1
- package/dist/lib/concepts/AgentBuilder.js.map +1 -1
- package/dist/lib/skills/defineSkill.js +17 -0
- package/dist/lib/skills/defineSkill.js.map +1 -0
- package/dist/lib/skills/index.js +15 -0
- package/dist/lib/skills/index.js.map +1 -0
- package/dist/lib/skills/registry.js +201 -0
- package/dist/lib/skills/registry.js.map +1 -0
- package/dist/lib/skills/renderBody.js +39 -0
- package/dist/lib/skills/renderBody.js.map +1 -0
- package/dist/lib/skills/surfaceMode.js +58 -0
- package/dist/lib/skills/surfaceMode.js.map +1 -0
- package/dist/lib/skills/types.js +3 -0
- package/dist/lib/skills/types.js.map +1 -0
- package/dist/providers/prompt/skillBasedPrompt.js.map +1 -1
- package/dist/skills.barrel.js +48 -0
- package/dist/skills.barrel.js.map +1 -0
- package/dist/tools/ToolRegistry.js +13 -0
- package/dist/tools/ToolRegistry.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/concepts/AgentBuilder.d.ts +27 -1
- package/dist/types/lib/concepts/AgentBuilder.d.ts.map +1 -1
- package/dist/types/lib/skills/defineSkill.d.ts +10 -0
- package/dist/types/lib/skills/defineSkill.d.ts.map +1 -0
- package/dist/types/lib/skills/index.d.ts +6 -0
- package/dist/types/lib/skills/index.d.ts.map +1 -0
- package/dist/types/lib/skills/registry.d.ts +82 -0
- package/dist/types/lib/skills/registry.d.ts.map +1 -0
- package/dist/types/lib/skills/renderBody.d.ts +22 -0
- package/dist/types/lib/skills/renderBody.d.ts.map +1 -0
- package/dist/types/lib/skills/surfaceMode.d.ts +34 -0
- package/dist/types/lib/skills/surfaceMode.d.ts.map +1 -0
- package/dist/types/lib/skills/types.d.ts +128 -0
- package/dist/types/lib/skills/types.d.ts.map +1 -0
- package/dist/types/providers/index.d.ts +1 -1
- package/dist/types/providers/index.d.ts.map +1 -1
- package/dist/types/providers/prompt/index.d.ts +1 -1
- package/dist/types/providers/prompt/index.d.ts.map +1 -1
- package/dist/types/providers/prompt/skillBasedPrompt.d.ts +2 -2
- package/dist/types/providers/prompt/skillBasedPrompt.d.ts.map +1 -1
- package/dist/types/providers.barrel.d.ts +1 -1
- package/dist/types/providers.barrel.d.ts.map +1 -1
- package/dist/types/skills.barrel.d.ts +43 -0
- package/dist/types/skills.barrel.d.ts.map +1 -0
- package/dist/types/tools/ToolRegistry.d.ts +10 -0
- package/dist/types/tools/ToolRegistry.d.ts.map +1 -1
- package/package.json +6 -1
package/dist/esm/index.js
CHANGED
|
@@ -30,6 +30,8 @@ export { LLMError } from './types';
|
|
|
30
30
|
export { agentLoop } from './executor';
|
|
31
31
|
// ── Instructions (also available from agentfootprint/instructions) ──
|
|
32
32
|
export { defineInstruction, AgentPattern, quickBind } from './instructions.barrel';
|
|
33
|
+
// ── Skills (also available from agentfootprint/skills) ──
|
|
34
|
+
export { defineSkill, SkillRegistry } from './skills.barrel';
|
|
33
35
|
// ── Recorders (also available from agentfootprint/observe) ──
|
|
34
36
|
export { TokenRecorder, ToolUsageRecorder, TurnRecorder, CostRecorder } from './observe.barrel';
|
|
35
37
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,+DAA+D;AAC/D,OAAO,EACL,KAAK,EACL,WAAW,EACX,OAAO,EACP,aAAa,EACb,GAAG,EACH,SAAS,EACT,SAAS,EACT,eAAe,EACf,KAAK,EACL,WAAW,EACX,QAAQ,EACR,cAAc,EACd,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAQpB,sEAAsE;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,+DAA+D;AAC/D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE7D,iEAAiE;AACjE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAc3E,+DAA+D;AAC/D,OAAO,EACL,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,UAAU,EACV,WAAW,EACX,QAAQ,GACT,MAAM,SAAS,CAAC;AAEjB,+DAA+D;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA0BnC,8DAA8D;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,uEAAuE;AACvE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGnF,+DAA+D;AAC/D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,+DAA+D;AAC/D,OAAO,EACL,KAAK,EACL,WAAW,EACX,OAAO,EACP,aAAa,EACb,GAAG,EACH,SAAS,EACT,SAAS,EACT,eAAe,EACf,KAAK,EACL,WAAW,EACX,QAAQ,EACR,cAAc,EACd,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAQpB,sEAAsE;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,+DAA+D;AAC/D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE7D,iEAAiE;AACjE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAc3E,+DAA+D;AAC/D,OAAO,EACL,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,UAAU,EACV,WAAW,EACX,QAAQ,GACT,MAAM,SAAS,CAAC;AAEjB,+DAA+D;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA0BnC,8DAA8D;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,uEAAuE;AACvE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGnF,2DAA2D;AAC3D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG7D,+DAA+D;AAC/D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -25,6 +25,8 @@ export class Agent {
|
|
|
25
25
|
agentPattern = AgentPattern.Regular;
|
|
26
26
|
overrides = new Map();
|
|
27
27
|
agentInstructions = [];
|
|
28
|
+
skillsPromptAddition;
|
|
29
|
+
skillsTools;
|
|
28
30
|
initialDecisionScope;
|
|
29
31
|
enableStreaming = false;
|
|
30
32
|
enableVerboseNarrative = false;
|
|
@@ -250,6 +252,63 @@ export class Agent {
|
|
|
250
252
|
this.agentInstructions.push(i);
|
|
251
253
|
return this;
|
|
252
254
|
}
|
|
255
|
+
/**
|
|
256
|
+
* Attach a `SkillRegistry` — a typed, versioned bundle of procedures
|
|
257
|
+
* the model can discover via `list_skills` and activate via
|
|
258
|
+
* `read_skill(id)`. Registry's skills are wired through the existing
|
|
259
|
+
* AgentInstruction pipeline (each skill IS-A AgentInstruction) so
|
|
260
|
+
* per-skill `activeWhen` / `prompt` / `tools` / `onToolResult` rules
|
|
261
|
+
* fire exactly as with plain `.instruction(...)`.
|
|
262
|
+
*
|
|
263
|
+
* Idempotent: calling `.skills()` twice REPLACES the prior registry
|
|
264
|
+
* (panel #6). For additive composition, compose registries yourself
|
|
265
|
+
* before passing them in.
|
|
266
|
+
*
|
|
267
|
+
* @example
|
|
268
|
+
* ```ts
|
|
269
|
+
* const registry = new SkillRegistry<MyDecision>({ surfaceMode: 'auto' });
|
|
270
|
+
* registry.register(defineSkill({ id: 'port-triage', ... }));
|
|
271
|
+
*
|
|
272
|
+
* Agent.create({ provider: anthropic('claude-sonnet-4-5') })
|
|
273
|
+
* .skills(registry)
|
|
274
|
+
* .build();
|
|
275
|
+
* ```
|
|
276
|
+
*/
|
|
277
|
+
skills(registry) {
|
|
278
|
+
// Drop any previously-mounted skill state — idempotent replace.
|
|
279
|
+
this.agentInstructions = this.agentInstructions.filter((i) => !i.__skillMount);
|
|
280
|
+
if (this.skillsTools) {
|
|
281
|
+
for (const t of this.skillsTools)
|
|
282
|
+
this.registry.unregister(t.id);
|
|
283
|
+
}
|
|
284
|
+
this.skillsPromptAddition = undefined;
|
|
285
|
+
this.skillsTools = undefined;
|
|
286
|
+
// 1. Skill bodies → AgentInstructions (per-skill prompt/tools/onToolResult/activeWhen)
|
|
287
|
+
for (const instr of registry.toInstructions()) {
|
|
288
|
+
// Mark so a later .skills() call can strip this one without
|
|
289
|
+
// affecting hand-registered instructions.
|
|
290
|
+
const tagged = { ...instr, __skillMount: true };
|
|
291
|
+
this.agentInstructions.push(tagged);
|
|
292
|
+
}
|
|
293
|
+
// 2. Auto-generated tools (list_skills, read_skill). Always registered —
|
|
294
|
+
// these are the discovery path for the model and must remain callable
|
|
295
|
+
// regardless of any skill's `activeWhen`. The `has()` guard handles
|
|
296
|
+
// the edge case where a caller registered a tool with the same id
|
|
297
|
+
// manually BEFORE calling `.skills()`.
|
|
298
|
+
const { listSkills, readSkill } = registry.toTools();
|
|
299
|
+
this.skillsTools = [listSkills, readSkill];
|
|
300
|
+
if (!this.registry.has(listSkills.id))
|
|
301
|
+
this.registry.register(listSkills);
|
|
302
|
+
if (!this.registry.has(readSkill.id))
|
|
303
|
+
this.registry.register(readSkill);
|
|
304
|
+
// 3. System-prompt fragment (only under 'system-prompt' / 'both' modes).
|
|
305
|
+
// Stored as a separate field so it can be stripped if `.skills()` is
|
|
306
|
+
// called again with a different registry.
|
|
307
|
+
const fragment = registry.toPromptFragment();
|
|
308
|
+
if (fragment)
|
|
309
|
+
this.skillsPromptAddition = fragment;
|
|
310
|
+
return this;
|
|
311
|
+
}
|
|
253
312
|
/**
|
|
254
313
|
* Set the initial Decision Scope values.
|
|
255
314
|
* Tool handlers update these values; InstructionsToLLM reads them
|
|
@@ -303,10 +362,16 @@ export class Agent {
|
|
|
303
362
|
}
|
|
304
363
|
/** Build the agent and return a runner. */
|
|
305
364
|
build() {
|
|
365
|
+
// If `.skills(registry)` supplied a system-prompt fragment, append
|
|
366
|
+
// it to the user's base prompt. Separated with a blank line so the
|
|
367
|
+
// two blocks read as distinct sections to the model.
|
|
368
|
+
const effectivePrompt = this.skillsPromptAddition
|
|
369
|
+
? [this.systemPromptText, this.skillsPromptAddition].filter(Boolean).join('\n\n')
|
|
370
|
+
: this.systemPromptText;
|
|
306
371
|
return new AgentRunner({
|
|
307
372
|
provider: this.provider,
|
|
308
373
|
name: this.agentName,
|
|
309
|
-
systemPromptText:
|
|
374
|
+
systemPromptText: effectivePrompt,
|
|
310
375
|
registry: this.registry,
|
|
311
376
|
maxIterations: this.maxIter,
|
|
312
377
|
recorders: [...this.recorders],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentBuilder.js","sourceRoot":"","sources":["../../../../src/lib/concepts/AgentBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"AgentBuilder.js","sourceRoot":"","sources":["../../../../src/lib/concepts/AgentBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function defineSkill(skill) {
|
|
2
|
+
// Dev-mode: warn on empty description (panel #3: descriptions ≤200 chars
|
|
3
|
+
// are load-bearing for classification; empty strings are almost certainly
|
|
4
|
+
// a bug).
|
|
5
|
+
if (typeof process !== 'undefined' &&
|
|
6
|
+
process.env?.['NODE_ENV'] !== 'production' &&
|
|
7
|
+
skill.description.trim().length === 0) {
|
|
8
|
+
// eslint-disable-next-line no-console
|
|
9
|
+
console.warn(`[agentfootprint] defineSkill('${skill.id}'): empty description — the model classifies skills by description, an empty one will never be picked.`);
|
|
10
|
+
}
|
|
11
|
+
return skill;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=defineSkill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineSkill.js","sourceRoot":"","sources":["../../../../src/lib/skills/defineSkill.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,WAAW,CAAsB,KAAuB;IACtE,yEAAyE;IACzE,0EAA0E;IAC1E,UAAU;IACV,IACE,OAAO,OAAO,KAAK,WAAW;QAC9B,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,YAAY;QAC1C,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EACrC,CAAC;QACD,sCAAsC;QACtC,OAAO,CAAC,IAAI,CACV,iCAAiC,KAAK,CAAC,EAAE,wGAAwG,CAClJ,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { defineSkill } from './defineSkill';
|
|
2
|
+
export { SkillRegistry } from './registry';
|
|
3
|
+
export { renderSkillBody, resolveSkillBody } from './renderBody';
|
|
4
|
+
export { resolveSurfaceMode, parseAnthropicVersion, isClaudeStrongAdherence } from './surfaceMode';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/skills/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { defineTool } from '../../tools';
|
|
2
|
+
import { resolveSkillBody } from './renderBody';
|
|
3
|
+
import { resolveSurfaceMode } from './surfaceMode';
|
|
4
|
+
const DEFAULT_PROMPT_HEADER = 'Available skills — call `read_skill({ id })` to activate one:';
|
|
5
|
+
export class SkillRegistry {
|
|
6
|
+
skills = new Map();
|
|
7
|
+
options;
|
|
8
|
+
constructor(options = {}) {
|
|
9
|
+
this.options = {
|
|
10
|
+
surfaceMode: options.surfaceMode ?? 'tool-only',
|
|
11
|
+
promptHeader: options.promptHeader ?? DEFAULT_PROMPT_HEADER,
|
|
12
|
+
...(options.providerHint && { providerHint: options.providerHint }),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Register a skill.
|
|
17
|
+
*
|
|
18
|
+
* Behavior on duplicate `id`:
|
|
19
|
+
* - Same `version`: silent no-op (idempotent — safe to call during
|
|
20
|
+
* module init multiple times).
|
|
21
|
+
* - Different `version`: REPLACES the existing entry AND fires a
|
|
22
|
+
* dev-mode `console.warn`. Evals almost certainly need pinning
|
|
23
|
+
* to one version at a time, so the warning nudges authors to
|
|
24
|
+
* make the replacement intentional.
|
|
25
|
+
*
|
|
26
|
+
* Registration order is preserved by `list()` / `toPromptFragment()`.
|
|
27
|
+
*
|
|
28
|
+
* TODO(phase-2): when `refreshPolicy.afterTokens` lands, the registry
|
|
29
|
+
* must also expose a `hash` of its contents so the runtime can detect
|
|
30
|
+
* "registry changed since last read_skill surface" and re-inject.
|
|
31
|
+
*/
|
|
32
|
+
register(skill) {
|
|
33
|
+
const existing = this.skills.get(skill.id);
|
|
34
|
+
if (existing) {
|
|
35
|
+
if (existing.version === skill.version) {
|
|
36
|
+
// Idempotent — same version, no-op.
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
if (typeof process !== 'undefined' && process.env?.['NODE_ENV'] !== 'production') {
|
|
40
|
+
// eslint-disable-next-line no-console
|
|
41
|
+
console.warn(`[agentfootprint] SkillRegistry: replacing skill '${skill.id}' v${existing.version} → v${skill.version}. Pin explicitly if this is not intentional.`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
this.skills.set(skill.id, skill);
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
/** Register multiple skills. */
|
|
48
|
+
registerAll(skills) {
|
|
49
|
+
for (const s of skills)
|
|
50
|
+
this.register(s);
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
/** Look up a skill by id. Returns undefined when unknown. */
|
|
54
|
+
getById(id) {
|
|
55
|
+
return this.skills.get(id);
|
|
56
|
+
}
|
|
57
|
+
/** All registered skills, in insertion order. */
|
|
58
|
+
list() {
|
|
59
|
+
return Array.from(this.skills.values());
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Filter skills by scope tag and/or case-insensitive query over
|
|
63
|
+
* `title + description`. Used by the auto-generated `list_skills`
|
|
64
|
+
* tool — panel #3 (`scope` / `query` filtering in the signature
|
|
65
|
+
* from day one).
|
|
66
|
+
*/
|
|
67
|
+
search(options = {}) {
|
|
68
|
+
const { scope, query } = options;
|
|
69
|
+
const q = query?.trim().toLowerCase();
|
|
70
|
+
const out = [];
|
|
71
|
+
for (const s of this.skills.values()) {
|
|
72
|
+
if (scope && !(s.scope ?? []).includes(scope))
|
|
73
|
+
continue;
|
|
74
|
+
if (q) {
|
|
75
|
+
const haystack = `${s.title} ${s.description}`.toLowerCase();
|
|
76
|
+
if (!haystack.includes(q))
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
out.push(s);
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Resolve the effective surface mode for this registry, consulting
|
|
85
|
+
* the provider hint when `'auto'`. Stable — consumers can call this
|
|
86
|
+
* once at build time.
|
|
87
|
+
*/
|
|
88
|
+
effectiveSurfaceMode() {
|
|
89
|
+
return resolveSurfaceMode(this.options.surfaceMode, this.options.providerHint);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Compile skills into the `AgentInstruction[]` the Agent loop already
|
|
93
|
+
* knows how to evaluate. Every Skill already extends AgentInstruction —
|
|
94
|
+
* this is a type-narrowed passthrough.
|
|
95
|
+
*/
|
|
96
|
+
toInstructions() {
|
|
97
|
+
return Array.from(this.skills.values());
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Generate the `list_skills` + `read_skill` tool pair. Both tools go
|
|
101
|
+
* through `defineTool()` so they appear correctly in manifest /
|
|
102
|
+
* narrative / toOpenAPI output (panel #6).
|
|
103
|
+
*/
|
|
104
|
+
toTools() {
|
|
105
|
+
const registry = this;
|
|
106
|
+
const listSkills = defineTool({
|
|
107
|
+
id: 'list_skills',
|
|
108
|
+
description: 'List available skills. Returns {id, title, description, version} for each. Optional `scope` and `query` filters.',
|
|
109
|
+
inputSchema: {
|
|
110
|
+
type: 'object',
|
|
111
|
+
properties: {
|
|
112
|
+
scope: {
|
|
113
|
+
type: 'string',
|
|
114
|
+
description: 'Only return skills whose scope array includes this tag.',
|
|
115
|
+
},
|
|
116
|
+
query: {
|
|
117
|
+
type: 'string',
|
|
118
|
+
description: 'Case-insensitive search across title + description.',
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
handler: async (input) => {
|
|
123
|
+
const matches = registry.search({
|
|
124
|
+
...(input?.scope && { scope: input.scope }),
|
|
125
|
+
...(input?.query && { query: input.query }),
|
|
126
|
+
});
|
|
127
|
+
const entries = matches.map((s) => ({
|
|
128
|
+
id: s.id,
|
|
129
|
+
title: s.title,
|
|
130
|
+
description: s.description,
|
|
131
|
+
version: s.version,
|
|
132
|
+
...(s.scope && { scope: s.scope }),
|
|
133
|
+
}));
|
|
134
|
+
return { content: JSON.stringify({ skills: entries }, null, 2) };
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
const readSkill = defineTool({
|
|
138
|
+
id: 'read_skill',
|
|
139
|
+
description: 'Read a skill body by id. The returned text is the procedure to follow — treat it as active guidance for the current turn.',
|
|
140
|
+
inputSchema: {
|
|
141
|
+
type: 'object',
|
|
142
|
+
properties: {
|
|
143
|
+
id: { type: 'string', description: 'The skill id returned by list_skills.' },
|
|
144
|
+
},
|
|
145
|
+
required: ['id'],
|
|
146
|
+
},
|
|
147
|
+
handler: async (input) => {
|
|
148
|
+
const id = input?.id;
|
|
149
|
+
if (typeof id !== 'string' || id.length === 0) {
|
|
150
|
+
return {
|
|
151
|
+
content: 'Error: read_skill requires a non-empty `id` string.',
|
|
152
|
+
isError: true,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const skill = registry.getById(id);
|
|
156
|
+
if (!skill) {
|
|
157
|
+
// Panel #3 + #8: unknown id is a tool-result error the model
|
|
158
|
+
// can recover from — NOT a thrown exception.
|
|
159
|
+
return {
|
|
160
|
+
content: `Error: skill '${id}' not found. Call list_skills to see available skills.`,
|
|
161
|
+
isError: true,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
const body = await resolveSkillBody(skill);
|
|
166
|
+
return { content: body };
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
170
|
+
return {
|
|
171
|
+
content: `Error loading skill '${id}': ${msg}`,
|
|
172
|
+
isError: true,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
return { listSkills, readSkill };
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* System-prompt fragment listing skills + their descriptions. Returns
|
|
181
|
+
* `null` when the effective surface mode is `'tool-only'` (no prompt
|
|
182
|
+
* injection) OR when the registry is empty (no ghost header).
|
|
183
|
+
*/
|
|
184
|
+
toPromptFragment() {
|
|
185
|
+
const mode = this.effectiveSurfaceMode();
|
|
186
|
+
if (mode === 'tool-only')
|
|
187
|
+
return null;
|
|
188
|
+
if (this.skills.size === 0)
|
|
189
|
+
return null;
|
|
190
|
+
const lines = [this.options.promptHeader, ''];
|
|
191
|
+
for (const s of this.skills.values()) {
|
|
192
|
+
lines.push(`- ${s.id} — ${s.title}: ${s.description}`);
|
|
193
|
+
}
|
|
194
|
+
return lines.join('\n');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/lib/skills/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const TAG_REGEX = /<\/(memory|tool_use|skill)>/gi;
|
|
2
|
+
function escape(text) {
|
|
3
|
+
return text.replace(TAG_REGEX, (m) => `</m\u200D${m.slice(3)}`);
|
|
4
|
+
}
|
|
5
|
+
export function renderSkillBody(skill) {
|
|
6
|
+
const lines = [];
|
|
7
|
+
lines.push(`You are now following skill: ${skill.id} (v${skill.version}).`);
|
|
8
|
+
lines.push('');
|
|
9
|
+
lines.push(`Title: ${escape(skill.title)}`);
|
|
10
|
+
lines.push(`Purpose: ${escape(skill.description)}`);
|
|
11
|
+
if (skill.steps && skill.steps.length > 0) {
|
|
12
|
+
lines.push('');
|
|
13
|
+
lines.push('Procedure:');
|
|
14
|
+
for (let i = 0; i < skill.steps.length; i++) {
|
|
15
|
+
lines.push(`${i + 1}. ${escape(skill.steps[i])}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (skill.prompt) {
|
|
19
|
+
lines.push('');
|
|
20
|
+
lines.push(`Guidance: ${escape(skill.prompt)}`);
|
|
21
|
+
}
|
|
22
|
+
return lines.join('\n');
|
|
23
|
+
}
|
|
24
|
+
/** Resolve the body override — string, async loader, or default render. */
|
|
25
|
+
export async function resolveSkillBody(skill) {
|
|
26
|
+
if (typeof skill.body === 'string')
|
|
27
|
+
return skill.body;
|
|
28
|
+
if (typeof skill.body === 'function') {
|
|
29
|
+
const result = skill.body();
|
|
30
|
+
return result instanceof Promise ? await result : result;
|
|
31
|
+
}
|
|
32
|
+
return renderSkillBody(skill);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=renderBody.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderBody.js","sourceRoot":"","sources":["../../../../src/lib/skills/renderBody.ts"],"names":[],"mappings":"AAmBA,MAAM,SAAS,GAAG,+BAA+B,CAAC;AAElD,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,eAAe,CAAI,KAAe;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,gCAAgC,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAEpD,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAI,KAAe;IACvD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACtD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO,MAAM,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3D,CAAC;IACD,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse Anthropic model ids like `claude-3-5-sonnet-20240620`,
|
|
3
|
+
* `claude-sonnet-4-5-20250514`, `claude-opus-4-7` into a `{major, minor}`
|
|
4
|
+
* tuple. Returns `null` for ids we can't parse (unknown → fall back to
|
|
5
|
+
* the pre-3.5 path, which is the safe default).
|
|
6
|
+
*
|
|
7
|
+
* Handles the two id formats Anthropic has shipped:
|
|
8
|
+
* - Legacy: `claude-3-5-sonnet` / `claude-3-opus` (major.minor before family)
|
|
9
|
+
* - Current: `claude-sonnet-4-5` / `claude-opus-4-7` (family before major.minor)
|
|
10
|
+
*/
|
|
11
|
+
export function parseAnthropicVersion(modelId) {
|
|
12
|
+
// Current format: claude-{family}-{major}-{minor}[-date]
|
|
13
|
+
const current = modelId.match(/^claude-[a-z]+-(\d+)-(\d+)(?:[-].*)?$/);
|
|
14
|
+
if (current) {
|
|
15
|
+
const major = Number(current[1]);
|
|
16
|
+
const minor = Number(current[2]);
|
|
17
|
+
if (Number.isFinite(major) && Number.isFinite(minor))
|
|
18
|
+
return { major, minor };
|
|
19
|
+
}
|
|
20
|
+
// Legacy format: claude-{major}-{minor}-{family}[-date]
|
|
21
|
+
const legacy = modelId.match(/^claude-(\d+)(?:-(\d+))?-[a-z]+(?:[-].*)?$/);
|
|
22
|
+
if (legacy) {
|
|
23
|
+
const major = Number(legacy[1]);
|
|
24
|
+
const minor = legacy[2] !== undefined ? Number(legacy[2]) : 0;
|
|
25
|
+
if (Number.isFinite(major) && Number.isFinite(minor))
|
|
26
|
+
return { major, minor };
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
/** True if the parsed version is Claude ≥ 3.5. */
|
|
31
|
+
export function isClaudeStrongAdherence(version) {
|
|
32
|
+
if (!version)
|
|
33
|
+
return false;
|
|
34
|
+
if (version.major > 3)
|
|
35
|
+
return true;
|
|
36
|
+
if (version.major === 3 && version.minor >= 5)
|
|
37
|
+
return true;
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
export function resolveSurfaceMode(mode, hint) {
|
|
41
|
+
if (mode !== 'auto')
|
|
42
|
+
return mode;
|
|
43
|
+
if (!hint)
|
|
44
|
+
return 'tool-only';
|
|
45
|
+
if (hint.provider === 'anthropic' && hint.modelId) {
|
|
46
|
+
const version = parseAnthropicVersion(hint.modelId);
|
|
47
|
+
return isClaudeStrongAdherence(version) ? 'both' : 'tool-only';
|
|
48
|
+
}
|
|
49
|
+
// OpenAI / Ollama / Bedrock / mock / unknown → portable default
|
|
50
|
+
return 'tool-only';
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=surfaceMode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surfaceMode.js","sourceRoot":"","sources":["../../../../src/lib/skills/surfaceMode.ts"],"names":[],"mappings":"AAcA;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,yDAAyD;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACvE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAChF,CAAC;IAED,wDAAwD;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC3E,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAChF,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,uBAAuB,CAAC,OAAgD;IACtF,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,IAAiB,EACjB,IAAmB;IAEnB,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO,WAAW,CAAC;IAE9B,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;IACjE,CAAC;IAED,gEAAgE;IAChE,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/skills/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillBasedPrompt.js","sourceRoot":"","sources":["../../../../src/providers/prompt/skillBasedPrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAwBH,gEAAgE;AAEhE,MAAM,UAAU,gBAAgB,CAC9B,
|
|
1
|
+
{"version":3,"file":"skillBasedPrompt.js","sourceRoot":"","sources":["../../../../src/providers/prompt/skillBasedPrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAwBH,gEAAgE;AAEhE,MAAM,UAAU,gBAAgB,CAC9B,MAA8B,EAC9B,UAAmC,EAAE;IAErC,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAE5D,OAAO;QACL,OAAO,EAAE,CAAC,GAAkB,EAAE,EAAE;YAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACnD,MAAM,KAAK,GAAa,EAAE,CAAC;YAE3B,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5C,OAAO;gBACL,KAAK;gBACL,MAAM,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;gBAC/E,SAAS,EACP,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,iBAAiB,CAAC,CAAC,CAAC,mBAAmB;aACtF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentfootprint/skills — typed, versioned agent skills.
|
|
3
|
+
*
|
|
4
|
+
* A `Skill` is a named procedure the agent can discover via `list_skills`
|
|
5
|
+
* and activate via `read_skill(id)`. Each Skill is a typed bundle of
|
|
6
|
+
* prompt + tools + tool-result rules + metadata, composed over the
|
|
7
|
+
* existing `AgentInstruction` primitive.
|
|
8
|
+
*
|
|
9
|
+
* The pattern Anthropic popularized in the Claude Agent SDK, packaged
|
|
10
|
+
* at `agentfootprint`'s framework layer with two agentfootprint-native
|
|
11
|
+
* advantages over the Agent SDK: cross-provider correctness (recency-
|
|
12
|
+
* first delivery by default) and typed / composable authoring.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { Agent, anthropic } from 'agentfootprint';
|
|
17
|
+
* import { defineSkill, SkillRegistry } from 'agentfootprint/skills';
|
|
18
|
+
*
|
|
19
|
+
* const portTriage = defineSkill<TriageDecision>({
|
|
20
|
+
* id: 'port-error-triage',
|
|
21
|
+
* version: '1.0.0',
|
|
22
|
+
* title: 'Port error triage',
|
|
23
|
+
* description: 'Investigate interfaces reporting CRC or input errors.',
|
|
24
|
+
* steps: [
|
|
25
|
+
* 'Fetch interface metrics',
|
|
26
|
+
* 'Pull last 5m of logs',
|
|
27
|
+
* 'Report findings to operator',
|
|
28
|
+
* ],
|
|
29
|
+
* tools: [getMetrics, getLogs],
|
|
30
|
+
* activeWhen: (d) => d.currentSkill === 'port-error-triage',
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* const registry = new SkillRegistry<TriageDecision>({ surfaceMode: 'auto' });
|
|
34
|
+
* registry.register(portTriage);
|
|
35
|
+
*
|
|
36
|
+
* const agent = Agent.create({ provider: anthropic('claude-sonnet-4-5') })
|
|
37
|
+
* .skills(registry)
|
|
38
|
+
* .build();
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export { defineSkill, SkillRegistry, renderSkillBody } from './lib/skills';
|
|
42
|
+
//# sourceMappingURL=skills.barrel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.barrel.js","sourceRoot":"","sources":["../../src/skills.barrel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -12,6 +12,19 @@ export class ToolRegistry {
|
|
|
12
12
|
this.tools.set(tool.id, tool);
|
|
13
13
|
return this;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Remove a tool by ID. Silently no-ops when the tool isn't registered
|
|
17
|
+
* so callers can call safely before a re-registration.
|
|
18
|
+
*
|
|
19
|
+
* Intended for builder-layer idempotent replace flows (e.g.
|
|
20
|
+
* `AgentBuilder.skills(registry)` re-mounting skill tools) — NOT for
|
|
21
|
+
* runtime tool hot-removal, which would require coordinating with the
|
|
22
|
+
* LLM's recency window.
|
|
23
|
+
*/
|
|
24
|
+
unregister(id) {
|
|
25
|
+
this.tools.delete(id);
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
15
28
|
/** Get a tool by ID. */
|
|
16
29
|
get(id) {
|
|
17
30
|
return this.tools.get(id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolRegistry.js","sourceRoot":"","sources":["../../../src/tools/ToolRegistry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,OAAO,YAAY;IACN,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE3D,wDAAwD;IACxD,QAAQ,CAAC,IAAoB;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,EAAE,sBAAsB,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wBAAwB;IACxB,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,qCAAqC;IACrC,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,mCAAmC;IACnC,GAAG;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,gCAAgC;IAChC,GAAG;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,wEAAwE;IACxE,YAAY,CAAC,OAAkB;QAC7B,MAAM,KAAK,GAAG,OAAO;YACnB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;gBACjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChC,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;gBACnE,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAEf,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1B,IAAI,EAAE,IAAI,CAAC,EAAE;YACb,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,kCAAkC;IAClC,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,UAAU,CAAC,IAAoB;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;IAEhC,iEAAiE;IACjE,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,MAAa,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
1
|
+
{"version":3,"file":"ToolRegistry.js","sourceRoot":"","sources":["../../../src/tools/ToolRegistry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,OAAO,YAAY;IACN,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE3D,wDAAwD;IACxD,QAAQ,CAAC,IAAoB;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,EAAE,sBAAsB,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAU;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wBAAwB;IACxB,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,qCAAqC;IACrC,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,mCAAmC;IACnC,GAAG;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,gCAAgC;IAChC,GAAG;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,wEAAwE;IACxE,YAAY,CAAC,OAAkB;QAC7B,MAAM,KAAK,GAAG,OAAO;YACnB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;gBACjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChC,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;gBACnE,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAEf,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1B,IAAI,EAAE,IAAI,CAAC,EAAE;YACb,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,kCAAkC;IAClC,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,UAAU,CAAC,IAAoB;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;IAEhC,iEAAiE;IACjE,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,MAAa,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
* agentfootprint/stream → Real-time lifecycle events
|
|
14
14
|
*/
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.
|
|
16
|
+
exports.TurnRecorder = exports.ToolUsageRecorder = exports.TokenRecorder = exports.SkillRegistry = exports.defineSkill = exports.quickBind = exports.AgentPattern = exports.defineInstruction = exports.agentLoop = exports.LLMError = exports.urlImage = exports.base64Image = exports.imageBlock = exports.textBlock = exports.toolResultMessage = exports.assistantMessage = exports.userMessage = exports.systemMessage = exports.BrowserOpenAIAdapter = exports.BrowserAnthropicAdapter = exports.BedrockAdapter = exports.OpenAIAdapter = exports.AnthropicAdapter = exports.bedrock = exports.ollama = exports.openai = exports.anthropic = exports.createProvider = exports.MockRetriever = exports.mockRetriever = exports.MockAdapter = exports.mock = exports.ToolRegistry = exports.askHuman = exports.defineTool = exports.exportTrace = exports.ConditionalRunner = exports.Conditional = exports.ParallelRunner = exports.Parallel = exports.SwarmRunner = exports.Swarm = exports.FlowChartRunner = exports.FlowChart = exports.RAGRunner = exports.RAG = exports.LLMCallRunner = exports.LLMCall = exports.AgentRunner = exports.Agent = void 0;
|
|
17
|
+
exports.CostRecorder = void 0;
|
|
17
18
|
// ── Concepts (Builders + Runners) ───────────────────────────
|
|
18
19
|
var concepts_1 = require("./concepts");
|
|
19
20
|
Object.defineProperty(exports, "Agent", { enumerable: true, get: function () { return concepts_1.Agent; } });
|
|
@@ -78,6 +79,10 @@ var instructions_barrel_1 = require("./instructions.barrel");
|
|
|
78
79
|
Object.defineProperty(exports, "defineInstruction", { enumerable: true, get: function () { return instructions_barrel_1.defineInstruction; } });
|
|
79
80
|
Object.defineProperty(exports, "AgentPattern", { enumerable: true, get: function () { return instructions_barrel_1.AgentPattern; } });
|
|
80
81
|
Object.defineProperty(exports, "quickBind", { enumerable: true, get: function () { return instructions_barrel_1.quickBind; } });
|
|
82
|
+
// ── Skills (also available from agentfootprint/skills) ──
|
|
83
|
+
var skills_barrel_1 = require("./skills.barrel");
|
|
84
|
+
Object.defineProperty(exports, "defineSkill", { enumerable: true, get: function () { return skills_barrel_1.defineSkill; } });
|
|
85
|
+
Object.defineProperty(exports, "SkillRegistry", { enumerable: true, get: function () { return skills_barrel_1.SkillRegistry; } });
|
|
81
86
|
// ── Recorders (also available from agentfootprint/observe) ──
|
|
82
87
|
var observe_barrel_1 = require("./observe.barrel");
|
|
83
88
|
Object.defineProperty(exports, "TokenRecorder", { enumerable: true, get: function () { return observe_barrel_1.TokenRecorder; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;AAEH,+DAA+D;AAC/D,uCAeoB;AAdlB,iGAAA,KAAK,OAAA;AACL,uGAAA,WAAW,OAAA;AACX,mGAAA,OAAO,OAAA;AACP,yGAAA,aAAa,OAAA;AACb,+FAAA,GAAG,OAAA;AACH,qGAAA,SAAS,OAAA;AACT,qGAAA,SAAS,OAAA;AACT,2GAAA,eAAe,OAAA;AACf,iGAAA,KAAK,OAAA;AACL,uGAAA,WAAW,OAAA;AACX,oGAAA,QAAQ,OAAA;AACR,0GAAA,cAAc,OAAA;AACd,uGAAA,WAAW,OAAA;AACX,6GAAA,iBAAiB,OAAA;AASnB,sEAAsE;AACtE,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AAGpB,+DAA+D;AAC/D,iCAA6D;AAApD,mGAAA,UAAU,OAAA;AAAE,iGAAA,QAAQ,OAAA;AAAE,qGAAA,YAAY,OAAA;AAE3C,iEAAiE;AACjE,uCAA6F;AAApF,gGAAA,IAAI,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,0GAAA,cAAc,OAAA;AACxE,mCAA8D;AAArD,mGAAA,SAAS,OAAA;AAAE,gGAAA,MAAM,OAAA;AAAE,gGAAA,MAAM,OAAA;AAAE,iGAAA,OAAO,OAAA;AAC3C,uCAA6E;AAApE,4GAAA,gBAAgB,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,0GAAA,cAAc,OAAA;AACxD,uCAA2E;AAAlE,mHAAA,uBAAuB,OAAA;AAAE,gHAAA,oBAAoB,OAAA;AActD,+DAA+D;AAC/D,iCASiB;AARf,sGAAA,aAAa,OAAA;AACb,oGAAA,WAAW,OAAA;AACX,yGAAA,gBAAgB,OAAA;AAChB,0GAAA,iBAAiB,OAAA;AACjB,kGAAA,SAAS,OAAA;AACT,mGAAA,UAAU,OAAA;AACV,oGAAA,WAAW,OAAA;AACX,iGAAA,QAAQ,OAAA;AAGV,+DAA+D;AAC/D,iCAAmC;AAA1B,iGAAA,QAAQ,OAAA;AA0BjB,8DAA8D;AAC9D,uCAAuC;AAA9B,qGAAA,SAAS,OAAA;AAGlB,uEAAuE;AACvE,6DAAmF;AAA1E,wHAAA,iBAAiB,OAAA;AAAE,mHAAA,YAAY,OAAA;AAAE,gHAAA,SAAS,OAAA;AAGnD,2DAA2D;AAC3D,iDAA6D;AAApD,4GAAA,WAAW,OAAA;AAAE,8GAAA,aAAa,OAAA;AAGnC,+DAA+D;AAC/D,mDAAgG;AAAvF,+GAAA,aAAa,OAAA;AAAE,mHAAA,iBAAiB,OAAA;AAAE,8GAAA,YAAY,OAAA;AAAE,8GAAA,YAAY,OAAA"}
|