agentfootprint 2.3.0 → 2.5.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 +293 -247
- package/dist/adapters/llm/AnthropicProvider.js +2 -2
- package/dist/adapters/llm/AnthropicProvider.js.map +1 -1
- package/dist/adapters/llm/BedrockProvider.js +2 -2
- package/dist/adapters/llm/BedrockProvider.js.map +1 -1
- package/dist/adapters/llm/BrowserAnthropicProvider.js +96 -28
- package/dist/adapters/llm/BrowserAnthropicProvider.js.map +1 -1
- package/dist/adapters/llm/OpenAIProvider.js +2 -2
- package/dist/adapters/llm/OpenAIProvider.js.map +1 -1
- package/dist/adapters/memory/agentcore.js +9 -3
- package/dist/adapters/memory/agentcore.js.map +1 -1
- package/dist/adapters/memory/redis.js +9 -3
- package/dist/adapters/memory/redis.js.map +1 -1
- package/dist/core/Agent.js +493 -79
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/flowchartAsTool.js +188 -0
- package/dist/core/flowchartAsTool.js.map +1 -0
- package/dist/core/outputSchema.js +119 -0
- package/dist/core/outputSchema.js.map +1 -0
- package/dist/core/slots/buildSystemPromptSlot.js +8 -0
- package/dist/core/slots/buildSystemPromptSlot.js.map +1 -1
- package/dist/core/slots/buildToolsSlot.js +56 -5
- package/dist/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/adapters/llm/AnthropicProvider.js +2 -2
- package/dist/esm/adapters/llm/AnthropicProvider.js.map +1 -1
- package/dist/esm/adapters/llm/BedrockProvider.js +2 -2
- package/dist/esm/adapters/llm/BedrockProvider.js.map +1 -1
- package/dist/esm/adapters/llm/BrowserAnthropicProvider.js +96 -28
- package/dist/esm/adapters/llm/BrowserAnthropicProvider.js.map +1 -1
- package/dist/esm/adapters/llm/OpenAIProvider.js +2 -2
- package/dist/esm/adapters/llm/OpenAIProvider.js.map +1 -1
- package/dist/esm/adapters/memory/agentcore.js +9 -3
- package/dist/esm/adapters/memory/agentcore.js.map +1 -1
- package/dist/esm/adapters/memory/redis.js +9 -3
- package/dist/esm/adapters/memory/redis.js.map +1 -1
- package/dist/esm/core/Agent.js +492 -78
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/flowchartAsTool.js +184 -0
- package/dist/esm/core/flowchartAsTool.js.map +1 -0
- package/dist/esm/core/outputSchema.js +113 -0
- package/dist/esm/core/outputSchema.js.map +1 -0
- package/dist/esm/core/slots/buildSystemPromptSlot.js +8 -0
- package/dist/esm/core/slots/buildSystemPromptSlot.js.map +1 -1
- package/dist/esm/core/slots/buildToolsSlot.js +56 -5
- package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/index.js +34 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/injection-engine/SkillRegistry.js +181 -0
- package/dist/esm/lib/injection-engine/SkillRegistry.js.map +1 -0
- package/dist/esm/lib/injection-engine/factories/defineSkill.js +35 -0
- package/dist/esm/lib/injection-engine/factories/defineSkill.js.map +1 -1
- package/dist/esm/lib/injection-engine/index.js +9 -1
- package/dist/esm/lib/injection-engine/index.js.map +1 -1
- package/dist/esm/lib/injection-engine/skillTools.js +125 -0
- package/dist/esm/lib/injection-engine/skillTools.js.map +1 -0
- package/dist/esm/lib/injection-engine/types.js +8 -0
- package/dist/esm/lib/injection-engine/types.js.map +1 -1
- package/dist/esm/lib/lazyRequire.js +33 -0
- package/dist/esm/lib/lazyRequire.js.map +1 -0
- package/dist/esm/lib/mcp/mcpClient.js +4 -6
- package/dist/esm/lib/mcp/mcpClient.js.map +1 -1
- package/dist/esm/llm-providers.js +31 -0
- package/dist/esm/llm-providers.js.map +1 -0
- package/dist/esm/locales/index.js +144 -0
- package/dist/esm/locales/index.js.map +1 -0
- package/dist/esm/memory-providers.js +44 -0
- package/dist/esm/memory-providers.js.map +1 -0
- package/dist/esm/providers.js +11 -0
- package/dist/esm/providers.js.map +1 -1
- package/dist/esm/recorders/core/contextEngineering.js +155 -0
- package/dist/esm/recorders/core/contextEngineering.js.map +1 -0
- package/dist/esm/recorders/observability/commentary/commentaryTemplates.js +6 -1
- package/dist/esm/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
- package/dist/esm/security/PermissionPolicy.js +135 -0
- package/dist/esm/security/PermissionPolicy.js.map +1 -0
- package/dist/esm/security/index.js +38 -0
- package/dist/esm/security/index.js.map +1 -0
- package/dist/esm/tool-providers/gatedTools.js +52 -0
- package/dist/esm/tool-providers/gatedTools.js.map +1 -0
- package/dist/esm/tool-providers/index.js +43 -0
- package/dist/esm/tool-providers/index.js.map +1 -0
- package/dist/esm/tool-providers/skillScopedTools.js +63 -0
- package/dist/esm/tool-providers/skillScopedTools.js.map +1 -0
- package/dist/esm/tool-providers/staticTools.js +33 -0
- package/dist/esm/tool-providers/staticTools.js.map +1 -0
- package/dist/esm/tool-providers/types.js +53 -0
- package/dist/esm/tool-providers/types.js.map +1 -0
- package/dist/index.js +57 -12
- package/dist/index.js.map +1 -1
- package/dist/lib/injection-engine/SkillRegistry.js +185 -0
- package/dist/lib/injection-engine/SkillRegistry.js.map +1 -0
- package/dist/lib/injection-engine/factories/defineSkill.js +37 -1
- package/dist/lib/injection-engine/factories/defineSkill.js.map +1 -1
- package/dist/lib/injection-engine/index.js +14 -1
- package/dist/lib/injection-engine/index.js.map +1 -1
- package/dist/lib/injection-engine/skillTools.js +130 -0
- package/dist/lib/injection-engine/skillTools.js.map +1 -0
- package/dist/lib/injection-engine/types.js +8 -0
- package/dist/lib/injection-engine/types.js.map +1 -1
- package/dist/lib/lazyRequire.js +37 -0
- package/dist/lib/lazyRequire.js.map +1 -0
- package/dist/lib/mcp/mcpClient.js +4 -6
- package/dist/lib/mcp/mcpClient.js.map +1 -1
- package/dist/llm-providers.js +47 -0
- package/dist/llm-providers.js.map +1 -0
- package/dist/locales/index.js +149 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/memory-providers.js +49 -0
- package/dist/memory-providers.js.map +1 -0
- package/dist/providers.js +11 -0
- package/dist/providers.js.map +1 -1
- package/dist/recorders/core/contextEngineering.js +161 -0
- package/dist/recorders/core/contextEngineering.js.map +1 -0
- package/dist/recorders/observability/commentary/commentaryTemplates.js +6 -1
- package/dist/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
- package/dist/security/PermissionPolicy.js +139 -0
- package/dist/security/PermissionPolicy.js.map +1 -0
- package/dist/security/index.js +42 -0
- package/dist/security/index.js.map +1 -0
- package/dist/tool-providers/gatedTools.js +56 -0
- package/dist/tool-providers/gatedTools.js.map +1 -0
- package/dist/tool-providers/index.js +51 -0
- package/dist/tool-providers/index.js.map +1 -0
- package/dist/tool-providers/skillScopedTools.js +67 -0
- package/dist/tool-providers/skillScopedTools.js.map +1 -0
- package/dist/tool-providers/staticTools.js +37 -0
- package/dist/tool-providers/staticTools.js.map +1 -0
- package/dist/tool-providers/types.js +54 -0
- package/dist/tool-providers/types.js.map +1 -0
- package/dist/types/adapters/llm/AnthropicProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/BedrockProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/BrowserAnthropicProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/OpenAIProvider.d.ts.map +1 -1
- package/dist/types/adapters/memory/agentcore.d.ts +7 -1
- package/dist/types/adapters/memory/agentcore.d.ts.map +1 -1
- package/dist/types/adapters/memory/redis.d.ts +7 -1
- package/dist/types/adapters/memory/redis.d.ts.map +1 -1
- package/dist/types/core/Agent.d.ts +216 -2
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/flowchartAsTool.d.ts +161 -0
- package/dist/types/core/flowchartAsTool.d.ts.map +1 -0
- package/dist/types/core/outputSchema.d.ts +128 -0
- package/dist/types/core/outputSchema.d.ts.map +1 -0
- package/dist/types/core/slots/buildSystemPromptSlot.d.ts.map +1 -1
- package/dist/types/core/slots/buildToolsSlot.d.ts +10 -0
- package/dist/types/core/slots/buildToolsSlot.d.ts.map +1 -1
- package/dist/types/index.d.ts +8 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/SkillRegistry.d.ts +148 -0
- package/dist/types/lib/injection-engine/SkillRegistry.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/factories/defineSkill.d.ts +99 -0
- package/dist/types/lib/injection-engine/factories/defineSkill.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/index.d.ts +5 -2
- package/dist/types/lib/injection-engine/index.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/skillTools.d.ts +73 -0
- package/dist/types/lib/injection-engine/skillTools.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/types.d.ts +28 -0
- package/dist/types/lib/injection-engine/types.d.ts.map +1 -1
- package/dist/types/lib/lazyRequire.d.ts +30 -0
- package/dist/types/lib/lazyRequire.d.ts.map +1 -0
- package/dist/types/lib/mcp/mcpClient.d.ts.map +1 -1
- package/dist/types/llm-providers.d.ts +31 -0
- package/dist/types/llm-providers.d.ts.map +1 -0
- package/dist/types/locales/index.d.ts +133 -0
- package/dist/types/locales/index.d.ts.map +1 -0
- package/dist/types/memory-providers.d.ts +41 -0
- package/dist/types/memory-providers.d.ts.map +1 -0
- package/dist/types/providers.d.ts +11 -0
- package/dist/types/providers.d.ts.map +1 -1
- package/dist/types/recorders/core/contextEngineering.d.ts +137 -0
- package/dist/types/recorders/core/contextEngineering.d.ts.map +1 -0
- package/dist/types/recorders/observability/commentary/commentaryTemplates.d.ts.map +1 -1
- package/dist/types/security/PermissionPolicy.d.ts +125 -0
- package/dist/types/security/PermissionPolicy.d.ts.map +1 -0
- package/dist/types/security/index.d.ts +40 -0
- package/dist/types/security/index.d.ts.map +1 -0
- package/dist/types/tool-providers/gatedTools.d.ts +37 -0
- package/dist/types/tool-providers/gatedTools.d.ts.map +1 -0
- package/dist/types/tool-providers/index.d.ts +42 -0
- package/dist/types/tool-providers/index.d.ts.map +1 -0
- package/dist/types/tool-providers/skillScopedTools.d.ts +46 -0
- package/dist/types/tool-providers/skillScopedTools.d.ts.map +1 -0
- package/dist/types/tool-providers/staticTools.d.ts +22 -0
- package/dist/types/tool-providers/staticTools.d.ts.map +1 -0
- package/dist/types/tool-providers/types.d.ts +103 -0
- package/dist/types/tool-providers/types.d.ts.map +1 -0
- package/package.json +62 -9
- package/README.proposed.md +0 -258
- package/dist/instructions.js +0 -21
- package/dist/instructions.js.map +0 -1
- package/dist/lib/instructions/defineInstruction.js +0 -35
- package/dist/lib/instructions/defineInstruction.js.map +0 -1
- package/dist/lib/instructions/evaluator.js +0 -38
- package/dist/lib/instructions/evaluator.js.map +0 -1
- package/dist/lib/instructions/index.js +0 -48
- package/dist/lib/instructions/index.js.map +0 -1
- package/dist/lib/instructions/types.js +0 -22
- package/dist/lib/instructions/types.js.map +0 -1
- package/dist/memory/conversationHelpers.js +0 -39
- package/dist/memory/conversationHelpers.js.map +0 -1
- package/dist/types/instructions.d.ts +0 -5
- package/dist/types/instructions.d.ts.map +0 -1
- package/dist/types/lib/instructions/defineInstruction.d.ts +0 -22
- package/dist/types/lib/instructions/defineInstruction.d.ts.map +0 -1
- package/dist/types/lib/instructions/evaluator.d.ts +0 -11
- package/dist/types/lib/instructions/evaluator.d.ts.map +0 -1
- package/dist/types/lib/instructions/index.d.ts +0 -44
- package/dist/types/lib/instructions/index.d.ts.map +0 -1
- package/dist/types/lib/instructions/types.d.ts +0 -100
- package/dist/types/lib/instructions/types.d.ts.map +0 -1
- package/dist/types/memory/conversationHelpers.d.ts +0 -19
- package/dist/types/memory/conversationHelpers.d.ts.map +0 -1
package/dist/esm/index.js
CHANGED
|
@@ -26,6 +26,7 @@ export { COMPOSITION_KEYS, } from './recorders/core/types.js';
|
|
|
26
26
|
export { buildEventMeta, parseSubflowPath } from './bridge/eventMeta.js';
|
|
27
27
|
// Core recorders
|
|
28
28
|
export { ContextRecorder } from './recorders/core/ContextRecorder.js';
|
|
29
|
+
export { contextEngineering, isEngineeredSource, isBaselineSource, ENGINEERED_SOURCES, BASELINE_SOURCES, } from './recorders/core/contextEngineering.js';
|
|
29
30
|
export { EmitBridge } from './recorders/core/EmitBridge.js';
|
|
30
31
|
export { streamRecorder } from './recorders/core/StreamRecorder.js';
|
|
31
32
|
export { agentRecorder } from './recorders/core/AgentRecorder.js';
|
|
@@ -62,6 +63,8 @@ export { defaultThinkingTemplates, selectThinkingState, renderThinkingLine, } fr
|
|
|
62
63
|
// Primitives (core/)
|
|
63
64
|
export { LLMCall, LLMCallBuilder, } from './core/LLMCall.js';
|
|
64
65
|
export { Agent, AgentBuilder, } from './core/Agent.js';
|
|
66
|
+
export { OutputSchemaError, applyOutputSchema, buildDefaultInstruction, } from './core/outputSchema.js';
|
|
67
|
+
export { flowchartAsTool, } from './core/flowchartAsTool.js';
|
|
65
68
|
export { defineTool } from './core/tools.js';
|
|
66
69
|
// Slot subflow builders are intentionally NOT exported. They are
|
|
67
70
|
// internal helpers used only by `Agent.buildChart()` and
|
|
@@ -79,10 +82,22 @@ export { Loop, LoopBuilder, } from './core-flow/Loop.js';
|
|
|
79
82
|
// Adapters — LLM providers
|
|
80
83
|
// `mock(...)` is the lowercase factory equivalent to `new MockProvider(...)`.
|
|
81
84
|
// `anthropic(...)` is the real Claude provider via `@anthropic-ai/sdk`.
|
|
85
|
+
// Zero-peer-dep providers — safe to re-export from the main barrel
|
|
86
|
+
// because bundlers walking these never touch optional peer-dep code.
|
|
87
|
+
//
|
|
88
|
+
// Vendor-SDK-backed providers (AnthropicProvider, OpenAIProvider,
|
|
89
|
+
// BedrockProvider) live ONLY at `agentfootprint/llm-providers` (or
|
|
90
|
+
// the legacy `agentfootprint/providers` alias). That subpath
|
|
91
|
+
// segregation means bundlers walking from `agentfootprint` main
|
|
92
|
+
// never see the lazy peer-dep requires for `@anthropic-ai/sdk`,
|
|
93
|
+
// `openai`, `@aws-sdk/client-bedrock-runtime`, etc. — automatic
|
|
94
|
+
// tree-shaking, no bundler-side workarounds.
|
|
95
|
+
//
|
|
96
|
+
// Migration (v2.4 → v2.5):
|
|
97
|
+
// import { AnthropicProvider } from 'agentfootprint'; // ❌ removed
|
|
98
|
+
// import { AnthropicProvider } from 'agentfootprint/llm-providers'; // ✓ canonical
|
|
99
|
+
// import { AnthropicProvider } from 'agentfootprint/providers'; // ✓ legacy alias
|
|
82
100
|
export { MockProvider, mock, } from './adapters/llm/MockProvider.js';
|
|
83
|
-
export { anthropic, AnthropicProvider, } from './adapters/llm/AnthropicProvider.js';
|
|
84
|
-
export { openai, OpenAIProvider, ollama, } from './adapters/llm/OpenAIProvider.js';
|
|
85
|
-
export { bedrock, BedrockProvider, } from './adapters/llm/BedrockProvider.js';
|
|
86
101
|
export { browserAnthropic, BrowserAnthropicProvider, } from './adapters/llm/BrowserAnthropicProvider.js';
|
|
87
102
|
export { browserOpenai, BrowserOpenAIProvider, } from './adapters/llm/BrowserOpenAIProvider.js';
|
|
88
103
|
export { createProvider, } from './adapters/llm/createProvider.js';
|
|
@@ -92,9 +107,9 @@ export { toSSE, SSEFormatter, encodeSSE } from './stream.js';
|
|
|
92
107
|
// One Injection type, four sugar factories, one engine subflow.
|
|
93
108
|
export {
|
|
94
109
|
// Engine
|
|
95
|
-
evaluateInjections, buildInjectionEngineSubflow,
|
|
110
|
+
evaluateInjections, buildInjectionEngineSubflow, projectActiveInjection,
|
|
96
111
|
// Sugar factories — one per injection flavor
|
|
97
|
-
defineInstruction, defineSkill, defineSteering, defineFact, } from './lib/injection-engine/index.js';
|
|
112
|
+
defineInstruction, defineSkill, resolveSurfaceMode, SkillRegistry, buildListSkillsTool, buildReadSkillTool, defineSteering, defineFact, } from './lib/injection-engine/index.js';
|
|
98
113
|
// Patterns — factory functions composing primitives + core-flow into
|
|
99
114
|
// well-known agent patterns from the research literature.
|
|
100
115
|
export * from './patterns/index.js';
|
|
@@ -128,4 +143,18 @@ export { defineRAG, indexDocuments, } from './lib/rag/index.js';
|
|
|
128
143
|
// `@modelcontextprotocol/sdk` is a lazy-required peer-dep (no runtime
|
|
129
144
|
// cost when MCP isn't used).
|
|
130
145
|
export { mcpClient, mockMcpClient, } from './lib/mcp/index.js';
|
|
146
|
+
// Tool dispatch primitives (v2.5+). New `agentfootprint/tool-providers`
|
|
147
|
+
// subpath bundles tool sources (mcpClient / mockMcpClient) with tool
|
|
148
|
+
// dispatch primitives (staticTools / gatedTools) so consumers find
|
|
149
|
+
// "everything tool-related" in one place. Top-level barrel re-exports
|
|
150
|
+
// the dispatch primitives too — `mcpClient` already re-exports above.
|
|
151
|
+
export { staticTools, gatedTools, skillScopedTools, } from './tool-providers/index.js';
|
|
152
|
+
// Cross-cutting authorization (v2.5+). `agentfootprint/security` is the
|
|
153
|
+
// dedicated subpath; the root barrel also re-exports `PermissionPolicy`
|
|
154
|
+
// so existing v2.4 consumers find it at the top level.
|
|
155
|
+
export { PermissionPolicy, } from './security/index.js';
|
|
156
|
+
// Message Catalog Pattern (v2.5+). `agentfootprint/locales` is the
|
|
157
|
+
// dedicated subpath; the root barrel also re-exports the helpers so
|
|
158
|
+
// existing v2.4 consumers find them at the top level.
|
|
159
|
+
export { defaultCommentaryMessages, defaultThinkingMessages, composeMessages, validateMessages, } from './locales/index.js';
|
|
131
160
|
//# 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;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAsCH,qCAAqC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACL,WAAW,EACX,eAAe,GAIhB,MAAM,sBAAsB,CAAC;AAE9B,aAAa;AACb,OAAO,EACL,eAAe,GAQhB,MAAM,wBAAwB,CAAC;AAEhC,6BAA6B;AAC7B,cAAc,qBAAqB,CAAC;AAEpC,yEAAyE;AACzE,uDAAuD;AACvD,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,cAAc,GAEf,MAAM,kBAAkB,CAAC;AAC1B,oEAAoE;AACpE,yEAAyE;AACzE,wEAAwE;AACxE,qEAAqE;AACrE,kDAAkD;AAClD,OAAO,EACL,gBAAgB,GAMjB,MAAM,2BAA2B,CAAC;AAEnC,gBAAgB;AAChB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAmB,MAAM,uBAAuB,CAAC;AAE1F,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAA+B,MAAM,qCAAqC,CAAC;AACnG,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,GAKjB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,UAAU,EAA0B,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAAE,cAAc,EAA8B,MAAM,oCAAoC,CAAC;AAChG,OAAO,EAAE,aAAa,EAA6B,MAAM,mCAAmC,CAAC;AAC7F,OAAO,EACL,mBAAmB,GAEpB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,YAAY,EAA4B,MAAM,kCAAkC,CAAC;AAC1F,OAAO,EACL,kBAAkB,GAEnB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,YAAY,EAA4B,MAAM,kCAAkC,CAAC;AAC1F,OAAO,EAAE,cAAc,EAA8B,MAAM,oCAAoC,CAAC;AAChG,OAAO,EAAE,aAAa,EAA6B,MAAM,mCAAmC,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAI1D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE7D,sEAAsE;AACtE,wEAAwE;AACxE,iEAAiE;AACjE,sEAAsE;AACtE,uEAAuE;AACvE,OAAO,EACL,SAAS,EACT,QAAQ,EACR,cAAc,EACd,QAAQ,GAET,MAAM,iBAAiB,CAAC;AAEzB,4CAA4C;AAC5C,OAAO,EACL,cAAc,GAGf,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACL,aAAa,EACb,cAAc,GAIf,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,eAAe,GAOhB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GAcjB,MAAM,+CAA+C,CAAC;AAEvD,qEAAqE;AACrE,kEAAkE;AAClE,kEAAkE;AAClE,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,GAGjB,MAAM,6DAA6D,CAAC;AAErE,kEAAkE;AAClE,mEAAmE;AACnE,8DAA8D;AAC9D,iEAAiE;AACjE,mEAAmE;AACnE,qEAAqE;AACrE,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,GAKnB,MAAM,yDAAyD,CAAC;AAEjE,qBAAqB;AACrB,OAAO,EACL,OAAO,EACP,cAAc,GAIf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,EACL,YAAY,GAIb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,GAGxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,eAAe,GAIhB,MAAM,2BAA2B,CAAC;AAOnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,iEAAiE;AACjE,yDAAyD;AACzD,kEAAkE;AAClE,6DAA6D;AAC7D,wEAAwE;AACxE,kEAAkE;AAClE,2DAA2D;AAC3D,sEAAsE;AAEtE,4BAA4B;AAC5B,OAAO,EACL,QAAQ,EACR,eAAe,GAIhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,QAAQ,EACR,eAAe,GAQhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,WAAW,EACX,kBAAkB,GAKnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,IAAI,EACJ,WAAW,GAKZ,MAAM,qBAAqB,CAAC;AAE7B,2BAA2B;AAC3B,8EAA8E;AAC9E,wEAAwE;AACxE,mEAAmE;AACnE,qEAAqE;AACrE,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,6DAA6D;AAC7D,gEAAgE;AAChE,gEAAgE;AAChE,gEAAgE;AAChE,6CAA6C;AAC7C,EAAE;AACF,2BAA2B;AAC3B,sFAAsF;AACtF,wFAAwF;AACxF,2FAA2F;AAC3F,OAAO,EACL,YAAY,EACZ,IAAI,GAGL,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,gBAAgB,EAChB,wBAAwB,GAEzB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,aAAa,EACb,qBAAqB,GAEtB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,cAAc,GAGf,MAAM,kCAAkC,CAAC;AAE1C,+DAA+D;AAC/D,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAqB,MAAM,aAAa,CAAC;AAEhF,oEAAoE;AACpE,gEAAgE;AAChE,OAAO;AAOL,SAAS;AACT,kBAAkB,EAClB,2BAA2B,EAC3B,sBAAsB;AAGtB,6CAA6C;AAC7C,iBAAiB,EAEjB,WAAW,EACX,kBAAkB,EAClB,aAAa,EAEb,mBAAmB,EACnB,kBAAkB,EAMlB,cAAc,EAEd,UAAU,GAEX,MAAM,iCAAiC,CAAC;AAEzC,qEAAqE;AACrE,0DAA0D;AAC1D,cAAc,qBAAqB,CAAC;AAEpC,uEAAuE;AACvE,uEAAuE;AACvE,oEAAoE;AACpE,sEAAsE;AACtE,8CAA8C;AAC9C,OAAO;AACL,YAAY;AACZ,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACb,MAAM,4BAA4B,CAAC;AACpC,OAAO;AACL,kBAAkB;AAClB,kBAAkB,EAClB,YAAY,GACb,MAAM,yBAAyB,CAAC;AACjC,OAAO;AACL,kBAAkB;AAClB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO;AACL,+DAA+D;AAC/D,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,oBAAoB;AAQpB,iEAAiE;AACjE,iEAAiE;AACjE,4BAA4B;AAC5B,aAAa,EACb,YAAY,EACZ,iBAAiB,GAGlB,MAAM,mBAAmB,CAAC;AAE3B,wEAAwE;AACxE,sEAAsE;AACtE,sEAAsE;AACtE,OAAO,EACL,SAAS,EAET,cAAc,GAGf,MAAM,oBAAoB,CAAC;AAE5B,kEAAkE;AAClE,sEAAsE;AACtE,sEAAsE;AACtE,6BAA6B;AAC7B,OAAO,EACL,SAAS,EACT,aAAa,GASd,MAAM,oBAAoB,CAAC;AAE5B,wEAAwE;AACxE,qEAAqE;AACrE,mEAAmE;AACnE,sEAAsE;AACtE,sEAAsE;AACtE,OAAO,EACL,WAAW,EACX,UAAU,EACV,gBAAgB,GAIjB,MAAM,2BAA2B,CAAC;AAEnC,wEAAwE;AACxE,wEAAwE;AACxE,uDAAuD;AACvD,OAAO,EACL,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAE7B,mEAAmE;AACnE,oEAAoE;AACpE,sDAAsD;AACtD,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,eAAe,EACf,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SkillRegistry — centralized governance for Skills across one or
|
|
3
|
+
* more Agents.
|
|
4
|
+
*
|
|
5
|
+
* Most apps register Skills directly on the Agent via `.skill(s)`.
|
|
6
|
+
* Once you have multiple Agents that share a common skill catalog
|
|
7
|
+
* (a customer-support pool, a research team, a multi-step workflow
|
|
8
|
+
* where each step uses different overlapping skills), hand-syncing
|
|
9
|
+
* `.skill()` calls per Agent gets fragile.
|
|
10
|
+
*
|
|
11
|
+
* `SkillRegistry` is the answer: register once, attach to many
|
|
12
|
+
* Agents via `.skills(registry)`. Add a Skill to the registry and
|
|
13
|
+
* every consumer Agent picks it up at next build.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const registry = new SkillRegistry();
|
|
17
|
+
* registry.register(billingSkill);
|
|
18
|
+
* registry.register(refundSkill);
|
|
19
|
+
*
|
|
20
|
+
* const supportAgent = Agent.create({ provider }).skills(registry).build();
|
|
21
|
+
* const escalationAgent = Agent.create({ provider }).skills(registry).build();
|
|
22
|
+
*
|
|
23
|
+
* // Add a new skill — both agents pick it up at next build.
|
|
24
|
+
* registry.register(complianceSkill);
|
|
25
|
+
*/
|
|
26
|
+
import { buildListSkillsTool, buildReadSkillTool } from './skillTools.js';
|
|
27
|
+
import { resolveSurfaceMode } from './factories/defineSkill.js';
|
|
28
|
+
export class SkillRegistry {
|
|
29
|
+
skills = new Map();
|
|
30
|
+
opts;
|
|
31
|
+
/**
|
|
32
|
+
* Construct an empty registry. Optional `{ surfaceMode, providerHint }`
|
|
33
|
+
* fields set registry-level defaults; absent both, the registry is a
|
|
34
|
+
* pure container (the v2.4 surface).
|
|
35
|
+
*/
|
|
36
|
+
constructor(opts = {}) {
|
|
37
|
+
this.opts = Object.freeze({ ...opts });
|
|
38
|
+
}
|
|
39
|
+
/** Registry-level default `surfaceMode`, or `undefined` if unset. */
|
|
40
|
+
get surfaceMode() {
|
|
41
|
+
return this.opts.surfaceMode;
|
|
42
|
+
}
|
|
43
|
+
/** Registry-level provider hint, or `undefined` if unset. */
|
|
44
|
+
get providerHint() {
|
|
45
|
+
return this.opts.providerHint;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Register a skill. Throws if `skill.flavor !== 'skill'` or if a
|
|
49
|
+
* skill with the same id is already registered (use `.replace(...)`
|
|
50
|
+
* to overwrite intentionally).
|
|
51
|
+
*/
|
|
52
|
+
register(skill) {
|
|
53
|
+
if (skill.flavor !== 'skill') {
|
|
54
|
+
throw new Error(`SkillRegistry.register: expected a Skill (flavor: 'skill'), got flavor: '${skill.flavor}' (id: '${skill.id}'). Use defineSkill(...) to construct.`);
|
|
55
|
+
}
|
|
56
|
+
if (this.skills.has(skill.id)) {
|
|
57
|
+
throw new Error(`SkillRegistry.register: skill '${skill.id}' is already registered. Use .replace('${skill.id}', skill) to overwrite.`);
|
|
58
|
+
}
|
|
59
|
+
this.skills.set(skill.id, skill);
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
/** Replace an existing skill by id. Throws if id is not registered. */
|
|
63
|
+
replace(id, skill) {
|
|
64
|
+
if (!this.skills.has(id)) {
|
|
65
|
+
throw new Error(`SkillRegistry.replace: no skill registered at '${id}'. Use .register(...) for new skills.`);
|
|
66
|
+
}
|
|
67
|
+
if (skill.flavor !== 'skill') {
|
|
68
|
+
throw new Error(`SkillRegistry.replace: expected a Skill (flavor: 'skill'), got '${skill.flavor}'.`);
|
|
69
|
+
}
|
|
70
|
+
if (skill.id !== id) {
|
|
71
|
+
throw new Error(`SkillRegistry.replace: skill.id ('${skill.id}') does not match the slot id ('${id}'). Either use .register(...) for the new id or pass a skill with the matching id.`);
|
|
72
|
+
}
|
|
73
|
+
this.skills.set(id, skill);
|
|
74
|
+
return this;
|
|
75
|
+
}
|
|
76
|
+
/** Remove a skill by id. No-op if not registered. */
|
|
77
|
+
unregister(id) {
|
|
78
|
+
this.skills.delete(id);
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
/** Look up by id. Returns undefined if not registered. */
|
|
82
|
+
get(id) {
|
|
83
|
+
return this.skills.get(id);
|
|
84
|
+
}
|
|
85
|
+
/** True iff a skill with the given id is registered. */
|
|
86
|
+
has(id) {
|
|
87
|
+
return this.skills.has(id);
|
|
88
|
+
}
|
|
89
|
+
/** All registered skills. Order matches registration order. */
|
|
90
|
+
list() {
|
|
91
|
+
return [...this.skills.values()];
|
|
92
|
+
}
|
|
93
|
+
/** Number of registered skills. */
|
|
94
|
+
get size() {
|
|
95
|
+
return this.skills.size;
|
|
96
|
+
}
|
|
97
|
+
/** Drop all registrations. */
|
|
98
|
+
clear() {
|
|
99
|
+
this.skills.clear();
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Materialize the LLM-facing skill discovery tools from the current
|
|
103
|
+
* registry contents. Returns `{ listSkills, readSkill }`:
|
|
104
|
+
*
|
|
105
|
+
* - `list_skills` — no-arg tool the LLM calls to enumerate
|
|
106
|
+
* `{ id, description }` for every registered skill. Lets the
|
|
107
|
+
* LLM discover skills without paying the prompt-token cost of
|
|
108
|
+
* a static catalog in the system prompt.
|
|
109
|
+
*
|
|
110
|
+
* - `read_skill({ id })` — activates the named skill for the
|
|
111
|
+
* NEXT iteration. The Agent's tool-calls subflow inspects this
|
|
112
|
+
* tool call by name and updates `scope.activatedInjectionIds`
|
|
113
|
+
* so the InjectionEngine on iter N+1 includes the skill in the
|
|
114
|
+
* active set (body lands in the system slot; gated tools land
|
|
115
|
+
* in the tools slot).
|
|
116
|
+
*
|
|
117
|
+
* Both entries are `undefined` when the registry is empty — filter
|
|
118
|
+
* before adding to a tool list:
|
|
119
|
+
*
|
|
120
|
+
* const { listSkills, readSkill } = registry.toTools();
|
|
121
|
+
* const tools = [listSkills, readSkill, ...other].filter(Boolean) as Tool[];
|
|
122
|
+
*
|
|
123
|
+
* Composes with `gatedTools` from `agentfootprint/tool-providers`
|
|
124
|
+
* so PermissionPolicy can scope which roles see the skill discovery
|
|
125
|
+
* surface.
|
|
126
|
+
*
|
|
127
|
+
* @returns A `SkillToolPair` (`{ listSkills, readSkill }`).
|
|
128
|
+
*/
|
|
129
|
+
toTools() {
|
|
130
|
+
const skills = this.list();
|
|
131
|
+
return {
|
|
132
|
+
listSkills: buildListSkillsTool(skills),
|
|
133
|
+
readSkill: buildReadSkillTool(skills),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Resolve the effective `surfaceMode` for a skill, applying the
|
|
138
|
+
* cascade:
|
|
139
|
+
*
|
|
140
|
+
* 1. If the skill's own `metadata.surfaceMode` is concrete
|
|
141
|
+
* (`'system-prompt'` / `'tool-only'` / `'both'`), return it.
|
|
142
|
+
* Per-skill explicit choice always wins.
|
|
143
|
+
* 2. Else if the registry was constructed with a concrete
|
|
144
|
+
* `surfaceMode`, return that.
|
|
145
|
+
* 3. Else delegate to `resolveSurfaceMode(provider, model)` using
|
|
146
|
+
* the explicit `provider` arg (or `this.providerHint` if
|
|
147
|
+
* omitted). Falls back to `'tool-only'` when no provider is
|
|
148
|
+
* known.
|
|
149
|
+
*
|
|
150
|
+
* Forward-compat for Block C / v2.5 per-mode runtime routing: the
|
|
151
|
+
* runtime calls this with the agent's provider + model to decide
|
|
152
|
+
* how to materialize the skill's body into slots.
|
|
153
|
+
*
|
|
154
|
+
* Throws if the skill is not registered (catches typos at the
|
|
155
|
+
* caller site rather than silently resolving against a stranger).
|
|
156
|
+
*
|
|
157
|
+
* @param skillOrId A registered Skill `Injection` OR its `id`.
|
|
158
|
+
* @param provider Provider name override (wins over `providerHint`).
|
|
159
|
+
* @param model Model name for the per-provider attention rule.
|
|
160
|
+
*/
|
|
161
|
+
resolveForSkill(skillOrId, provider, model) {
|
|
162
|
+
const skill = typeof skillOrId === 'string' ? this.get(skillOrId) : skillOrId;
|
|
163
|
+
if (!skill) {
|
|
164
|
+
const id = typeof skillOrId === 'string' ? skillOrId : skillOrId.id;
|
|
165
|
+
throw new Error(`SkillRegistry.resolveForSkill: no skill registered at id '${id}'.`);
|
|
166
|
+
}
|
|
167
|
+
if (skill.flavor !== 'skill') {
|
|
168
|
+
throw new Error(`SkillRegistry.resolveForSkill: '${skill.id}' has flavor '${skill.flavor}', expected 'skill'.`);
|
|
169
|
+
}
|
|
170
|
+
const meta = skill.metadata;
|
|
171
|
+
const skillMode = meta?.surfaceMode;
|
|
172
|
+
if (skillMode && skillMode !== 'auto')
|
|
173
|
+
return skillMode;
|
|
174
|
+
if (this.opts.surfaceMode && this.opts.surfaceMode !== 'auto') {
|
|
175
|
+
return this.opts.surfaceMode;
|
|
176
|
+
}
|
|
177
|
+
const effectiveProvider = provider ?? this.opts.providerHint ?? 'unknown';
|
|
178
|
+
return resolveSurfaceMode(effectiveProvider, model);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=SkillRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillRegistry.js","sourceRoot":"","sources":["../../../../src/lib/injection-engine/SkillRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,32 @@
|
|
|
26
26
|
* tools: [refundTool, chargeHistoryTool],
|
|
27
27
|
* });
|
|
28
28
|
*/
|
|
29
|
+
/**
|
|
30
|
+
* Resolve `surfaceMode: 'auto'` to a concrete mode based on provider
|
|
31
|
+
* + model. The defaults match the per-provider attention profile
|
|
32
|
+
* documented in the Skills, explained essay:
|
|
33
|
+
*
|
|
34
|
+
* - Claude >= 3.5 → 'both' (cheap to cache, high adherence)
|
|
35
|
+
* - Claude pre-3.5 → 'tool-only' (recency-first more reliable)
|
|
36
|
+
* - OpenAI / Bedrock / Ollama / Mock / unknown → 'tool-only'
|
|
37
|
+
*
|
|
38
|
+
* Pure function — no side effects. Consumers can call directly to
|
|
39
|
+
* inspect what `'auto'` will resolve to in their stack.
|
|
40
|
+
*/
|
|
41
|
+
export function resolveSurfaceMode(provider, model) {
|
|
42
|
+
const p = provider.toLowerCase();
|
|
43
|
+
if (p === 'anthropic') {
|
|
44
|
+
// Match both naming styles in current use:
|
|
45
|
+
// - claude-3-5-sonnet-..., claude-3.5-...
|
|
46
|
+
// - claude-sonnet-4-..., claude-haiku-4-..., claude-opus-4-..., claude-4-...
|
|
47
|
+
// Anything matching "Claude >= 3.5" gets 'both'; older Claudes get 'tool-only'.
|
|
48
|
+
if (model && /(claude-3-5|claude-3\.5|claude-(?:opus-|sonnet-|haiku-)?[4-9])/i.test(model)) {
|
|
49
|
+
return 'both';
|
|
50
|
+
}
|
|
51
|
+
return 'tool-only';
|
|
52
|
+
}
|
|
53
|
+
return 'tool-only';
|
|
54
|
+
}
|
|
29
55
|
export function defineSkill(opts) {
|
|
30
56
|
if (!opts.id || opts.id.trim().length === 0) {
|
|
31
57
|
throw new Error('defineSkill: `id` is required and must be non-empty.');
|
|
@@ -48,6 +74,15 @@ export function defineSkill(opts) {
|
|
|
48
74
|
systemPrompt: opts.body,
|
|
49
75
|
...(opts.tools && opts.tools.length > 0 && { tools: opts.tools }),
|
|
50
76
|
},
|
|
77
|
+
// Skill-specific options live in metadata. The engine reads them
|
|
78
|
+
// when present; absent metadata = current behavior. Forward-compat:
|
|
79
|
+
// when v2.5 implements per-mode routing diversity, this field is
|
|
80
|
+
// already where the runtime looks.
|
|
81
|
+
metadata: Object.freeze({
|
|
82
|
+
surfaceMode: opts.surfaceMode ?? 'auto',
|
|
83
|
+
...(opts.refreshPolicy && { refreshPolicy: opts.refreshPolicy }),
|
|
84
|
+
...(opts.autoActivate && { autoActivate: opts.autoActivate }),
|
|
85
|
+
}),
|
|
51
86
|
});
|
|
52
87
|
}
|
|
53
88
|
//# sourceMappingURL=defineSkill.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defineSkill.js","sourceRoot":"","sources":["../../../../../src/lib/injection-engine/factories/defineSkill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;
|
|
1
|
+
{"version":3,"file":"defineSkill.js","sourceRoot":"","sources":["../../../../../src/lib/injection-engine/factories/defineSkill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AA8GH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,KAAc;IACjE,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC;QACtB,2CAA2C;QAC3C,4CAA4C;QAC5C,+EAA+E;QAC/E,gFAAgF;QAChF,IAAI,KAAK,IAAI,iEAAiE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3F,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAwB;IAClD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,eAAe,IAAI,CAAC,EAAE,0EAA0E,CACjG,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC,EAAE,0BAA0B,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,OAAgB;QACxB,OAAO,EAAE;YACP,IAAI,EAAE,eAAwB;YAC9B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,YAAY;SAC9C;QACD,MAAM,EAAE;YACN,YAAY,EAAE,IAAI,CAAC,IAAI;YACvB,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;SAClE;QACD,iEAAiE;QACjE,oEAAoE;QACpE,iEAAiE;QACjE,mCAAmC;QACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;YACtB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,MAAM;YACvC,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;YAChE,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;SAC9D,CAAC;KACH,CAAyB,CAAC;AAC7B,CAAC"}
|
|
@@ -5,12 +5,20 @@
|
|
|
5
5
|
* One `Injection` type. One `InjectionEngine` subflow. N typed sugar
|
|
6
6
|
* factories. See `README.md` in this folder for the full concept.
|
|
7
7
|
*/
|
|
8
|
+
// POJO projection — used by slot subflows + advanced consumers
|
|
9
|
+
export { projectActiveInjection } from './types.js';
|
|
8
10
|
// Engine
|
|
9
11
|
export { evaluateInjections } from './evaluator.js';
|
|
10
12
|
export { buildInjectionEngineSubflow, } from './buildInjectionEngineSubflow.js';
|
|
11
13
|
// Sugar factories — Ships four; more flavors planned (RAG / Memory / Guardrail)
|
|
12
14
|
export { defineInstruction } from './factories/defineInstruction.js';
|
|
13
|
-
export { defineSkill } from './factories/defineSkill.js';
|
|
15
|
+
export { defineSkill, resolveSurfaceMode, } from './factories/defineSkill.js';
|
|
16
|
+
export { SkillRegistry } from './SkillRegistry.js';
|
|
17
|
+
// Skill-tool builders — used by SkillRegistry.toTools() and the Agent's
|
|
18
|
+
// auto-attach path. Exported so consumers building custom tool wiring
|
|
19
|
+
// (e.g., gatedTools chains) can compose the same `list_skills` /
|
|
20
|
+
// `read_skill` tools directly.
|
|
21
|
+
export { buildListSkillsTool, buildReadSkillTool } from './skillTools.js';
|
|
14
22
|
export { defineSteering } from './factories/defineSteering.js';
|
|
15
23
|
export { defineFact } from './factories/defineFact.js';
|
|
16
24
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/injection-engine/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/injection-engine/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,+DAA+D;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,SAAS;AACT,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EACL,2BAA2B,GAE5B,MAAM,kCAAkC,CAAC;AAE1C,gFAAgF;AAChF,OAAO,EAAE,iBAAiB,EAAiC,MAAM,kCAAkC,CAAC;AAEpG,OAAO,EACL,WAAW,EACX,kBAAkB,GAKnB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,aAAa,EAA6B,MAAM,oBAAoB,CAAC;AAE9E,wEAAwE;AACxE,sEAAsE;AACtE,iEAAiE;AACjE,+BAA+B;AAC/B,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAsB,MAAM,iBAAiB,CAAC;AAE9F,OAAO,EAAE,cAAc,EAA8B,MAAM,+BAA+B,CAAC;AAE3F,OAAO,EAAE,UAAU,EAA0B,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill-tool builders — shared source of truth for `list_skills` and
|
|
3
|
+
* `read_skill` tools used by the Agent's auto-attach path AND by
|
|
4
|
+
* `SkillRegistry.toTools()` (explicit composition path).
|
|
5
|
+
*
|
|
6
|
+
* Both tools work over the SAME catalog (a list of `Injection` skills).
|
|
7
|
+
* Pulling them out of `core/Agent.ts` removes the v2.4 duplication
|
|
8
|
+
* risk: the Agent auto-attaches its own `read_skill`, the registry
|
|
9
|
+
* builds a sibling — they MUST agree on schema + execute semantics.
|
|
10
|
+
*
|
|
11
|
+
* Pattern: pure builder functions over an `Injection[]` catalog.
|
|
12
|
+
* Tool execute is identity-style (returns confirmation
|
|
13
|
+
* string); the agent's tool-calls subflow inspects the
|
|
14
|
+
* tool name + args and updates `scope.activatedInjectionIds`
|
|
15
|
+
* so the next iteration's InjectionEngine sees the new
|
|
16
|
+
* activation.
|
|
17
|
+
*
|
|
18
|
+
* Closes Neo gap #3 (of 8) by making the LLM-facing skill discovery
|
|
19
|
+
* surface composable — consumers can plug `listSkills` / `readSkill`
|
|
20
|
+
* into their own ToolProvider chain (e.g., gatedTools → permission
|
|
21
|
+
* filter → static + skill-tools).
|
|
22
|
+
*/
|
|
23
|
+
import { defineTool } from '../../core/tools.js';
|
|
24
|
+
/**
|
|
25
|
+
* Build the `list_skills` tool — a no-arg tool that returns the
|
|
26
|
+
* registered skills as `{ id, description }[]`. Lets the LLM discover
|
|
27
|
+
* skills without paying the prompt-token cost of embedding the
|
|
28
|
+
* catalog into every system prompt.
|
|
29
|
+
*
|
|
30
|
+
* Pairs with `read_skill` (which actually activates a skill by id).
|
|
31
|
+
*
|
|
32
|
+
* Returns `undefined` when there are no skills — callers should
|
|
33
|
+
* guard or filter undefined out of their tool list.
|
|
34
|
+
*/
|
|
35
|
+
export function buildListSkillsTool(skills) {
|
|
36
|
+
if (skills.length === 0)
|
|
37
|
+
return undefined;
|
|
38
|
+
// Capture a stable snapshot — the registry/agent calls this at
|
|
39
|
+
// build time, so the tool reflects the catalog as of registration.
|
|
40
|
+
const catalog = skills.map((s) => ({
|
|
41
|
+
id: s.id,
|
|
42
|
+
description: s.description ?? '(no description)',
|
|
43
|
+
}));
|
|
44
|
+
return defineTool({
|
|
45
|
+
name: 'list_skills',
|
|
46
|
+
description: 'List all available skills with their ids and descriptions. ' +
|
|
47
|
+
'Use this to discover what skills exist before calling read_skill.',
|
|
48
|
+
inputSchema: { type: 'object', properties: {}, additionalProperties: false },
|
|
49
|
+
execute: () => {
|
|
50
|
+
// Return as a JSON-serialized string so the LLM can parse easily.
|
|
51
|
+
return JSON.stringify(catalog, null, 2);
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Build the `read_skill` tool — activates a skill for the next
|
|
57
|
+
* iteration. The LLM picks WHICH skill via the `id` argument.
|
|
58
|
+
*
|
|
59
|
+
* Tool execute() returns a confirmation string. The actual bookkeeping
|
|
60
|
+
* (appending the requested skill id to `scope.activatedInjectionIds`)
|
|
61
|
+
* is handled by the Agent's tool-calls subflow, which inspects every
|
|
62
|
+
* `read_skill` tool call by name. The next iteration's InjectionEngine
|
|
63
|
+
* matches Skills with `trigger.kind: 'llm-activated'` by id and
|
|
64
|
+
* includes them in the active set; slot subflows then inject the body
|
|
65
|
+
* + tools.
|
|
66
|
+
*
|
|
67
|
+
* The tool's description lists each Skill's `id` + `description` so
|
|
68
|
+
* the LLM can choose meaningfully without first calling `list_skills`
|
|
69
|
+
* (a perf trade-off — small registries can afford the inline catalog;
|
|
70
|
+
* large ones should use `list_skills` for discovery and rely on the
|
|
71
|
+
* shorter `read_skill` description.) See `surfaceMode` (Block A4) for
|
|
72
|
+
* tunable trade-offs.
|
|
73
|
+
*
|
|
74
|
+
* Returns `undefined` when there are no skills — callers should
|
|
75
|
+
* guard or filter undefined out of their tool list.
|
|
76
|
+
*/
|
|
77
|
+
export function buildReadSkillTool(skills) {
|
|
78
|
+
if (skills.length === 0)
|
|
79
|
+
return undefined;
|
|
80
|
+
const skillIds = skills.map((s) => s.id);
|
|
81
|
+
const skillCatalog = skills
|
|
82
|
+
.map((s) => ` - ${s.id}: ${s.description ?? '(no description)'}`)
|
|
83
|
+
.join('\n');
|
|
84
|
+
const byId = new Map();
|
|
85
|
+
for (const s of skills) {
|
|
86
|
+
const meta = s.metadata;
|
|
87
|
+
byId.set(s.id, {
|
|
88
|
+
body: s.inject.systemPrompt ?? '',
|
|
89
|
+
surfaceMode: meta?.surfaceMode ?? 'auto',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return defineTool({
|
|
93
|
+
name: 'read_skill',
|
|
94
|
+
description: `Activate a skill for the next iteration. Available skills:\n${skillCatalog}\n\n` +
|
|
95
|
+
`Pass the skill's id. The skill's body becomes part of the system prompt and any ` +
|
|
96
|
+
`gated tools become available on the next call.`,
|
|
97
|
+
inputSchema: {
|
|
98
|
+
type: 'object',
|
|
99
|
+
properties: {
|
|
100
|
+
id: {
|
|
101
|
+
type: 'string',
|
|
102
|
+
enum: skillIds,
|
|
103
|
+
description: 'The skill id to activate.',
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
required: ['id'],
|
|
107
|
+
},
|
|
108
|
+
execute: ({ id }) => {
|
|
109
|
+
const entry = byId.get(id);
|
|
110
|
+
if (!entry) {
|
|
111
|
+
return `Unknown skill '${id}'. Available: ${skillIds.join(', ')}`;
|
|
112
|
+
}
|
|
113
|
+
// Block C — per-mode tool-result dispatch:
|
|
114
|
+
// - 'tool-only' / 'both' → return body verbatim (recency-first
|
|
115
|
+
// delivery; LLM sees it as the most recent tool result).
|
|
116
|
+
// - 'system-prompt' / 'auto' / unspecified → return confirmation
|
|
117
|
+
// only; body lands via system slot on the next iteration.
|
|
118
|
+
if ((entry.surfaceMode === 'tool-only' || entry.surfaceMode === 'both') && entry.body) {
|
|
119
|
+
return entry.body;
|
|
120
|
+
}
|
|
121
|
+
return `Skill '${id}' activated for the next iteration.`;
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=skillTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillTools.js","sourceRoot":"","sources":["../../../../src/lib/injection-engine/skillTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,10 +18,18 @@
|
|
|
18
18
|
*/
|
|
19
19
|
/** Project a full Injection (with functions) into a scope-safe POJO. */
|
|
20
20
|
export function projectActiveInjection(inj) {
|
|
21
|
+
// Project per-skill metadata that slot subflows need to dispatch on.
|
|
22
|
+
// `surfaceMode` drives the system-prompt-suppression decision (Block C).
|
|
23
|
+
// `autoActivate` is reserved for runtime tool gating (forward-compat).
|
|
24
|
+
const meta = inj.metadata;
|
|
21
25
|
const out = {
|
|
22
26
|
id: inj.id,
|
|
23
27
|
flavor: inj.flavor,
|
|
24
28
|
...(inj.description && { description: inj.description }),
|
|
29
|
+
...(meta?.surfaceMode && { surfaceMode: meta.surfaceMode }),
|
|
30
|
+
...(meta?.autoActivate && {
|
|
31
|
+
autoActivate: meta.autoActivate,
|
|
32
|
+
}),
|
|
25
33
|
inject: {
|
|
26
34
|
...(inj.inject.systemPrompt && { systemPrompt: inj.inject.systemPrompt }),
|
|
27
35
|
...(inj.inject.messages && { messages: inj.inject.messages.map((m) => ({ ...m })) }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/injection-engine/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/injection-engine/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAuMH,wEAAwE;AACxE,MAAM,UAAU,sBAAsB,CAAC,GAAc;IACnD,qEAAqE;IACrE,yEAAyE;IACzE,uEAAuE;IACvE,MAAM,IAAI,GAAG,GAAG,CAAC,QAAuE,CAAC;IACzF,MAAM,GAAG,GAAoB;QAC3B,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;QACxD,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAA6C,EAAE,CAAC;QAC7F,GAAG,CAAC,IAAI,EAAE,YAAY,IAAI;YACxB,YAAY,EAAE,IAAI,CAAC,YAA+C;SACnE,CAAC;QACF,MAAM,EAAE;YACN,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACpF,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI;gBACtB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAClC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE;oBACvB,WAAW,EAAE,GAAG,CAAC,EAAE;iBACpB,CAAC,CAAC;aACJ,CAAC;SACH;KACF,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lazyRequire — module-path-indirect `require()` wrapper for lazy
|
|
3
|
+
* peer-dep loading.
|
|
4
|
+
*
|
|
5
|
+
* Why a wrapper: bundlers (Vite, esbuild, webpack, Rollup) statically
|
|
6
|
+
* analyze `require('literal-string')` calls and try to resolve the
|
|
7
|
+
* dependency at BUILD time — even when the function is never called
|
|
8
|
+
* at runtime. For optional peer-deps (`@modelcontextprotocol/sdk`,
|
|
9
|
+
* `@anthropic-ai/sdk`, `ioredis`, `@aws-sdk/client-bedrock-*`), this
|
|
10
|
+
* means consumers who never instantiate the matching adapter still
|
|
11
|
+
* get a build error if the peer-dep isn't installed.
|
|
12
|
+
*
|
|
13
|
+
* Wrapping the call in a function with a string PARAMETER hides the
|
|
14
|
+
* specifier from static analysis. At runtime this is exactly the
|
|
15
|
+
* same as inline `require()`, including the throwing behavior when
|
|
16
|
+
* the peer-dep isn't installed.
|
|
17
|
+
*
|
|
18
|
+
* Pattern: indirect require — used by Node's `createRequire`-style
|
|
19
|
+
* fallbacks for the same reason.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* try {
|
|
23
|
+
* const mod = lazyRequire<typeof import('ioredis')>('ioredis');
|
|
24
|
+
* this._client = new mod.default(...);
|
|
25
|
+
* } catch {
|
|
26
|
+
* throw new Error('install ioredis to use RedisStore');
|
|
27
|
+
* }
|
|
28
|
+
*/
|
|
29
|
+
export function lazyRequire(specifier) {
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
31
|
+
return require(specifier);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=lazyRequire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazyRequire.js","sourceRoot":"","sources":["../../../src/lib/lazyRequire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,WAAW,CAAc,SAAiB;IACxD,iEAAiE;IACjE,OAAO,OAAO,CAAC,SAAS,CAAM,CAAC;AACjC,CAAC"}
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
* loads only when a consumer actually constructs a client. Tests
|
|
34
34
|
* inject `_client` and skip the import path entirely.
|
|
35
35
|
*/
|
|
36
|
+
import { lazyRequire } from '../lazyRequire.js';
|
|
36
37
|
// Version-less identity. The MCP `clientInfo` field is informational
|
|
37
38
|
// (server logs it); a hardcoded number drifts every release. Consumers
|
|
38
39
|
// who care about wire-level identity pass `clientInfo` explicitly.
|
|
@@ -91,8 +92,7 @@ export async function mcpClient(opts) {
|
|
|
91
92
|
async function resolveClient(transport, clientInfo) {
|
|
92
93
|
let mod;
|
|
93
94
|
try {
|
|
94
|
-
|
|
95
|
-
mod = require('@modelcontextprotocol/sdk/client/index.js');
|
|
95
|
+
mod = lazyRequire('@modelcontextprotocol/sdk/client/index.js');
|
|
96
96
|
}
|
|
97
97
|
catch {
|
|
98
98
|
throw new Error('mcpClient requires @modelcontextprotocol/sdk.\n' +
|
|
@@ -110,8 +110,7 @@ async function buildTransport(t) {
|
|
|
110
110
|
if (t.transport === 'stdio') {
|
|
111
111
|
let stdioMod;
|
|
112
112
|
try {
|
|
113
|
-
|
|
114
|
-
stdioMod = require('@modelcontextprotocol/sdk/client/stdio.js');
|
|
113
|
+
stdioMod = lazyRequire('@modelcontextprotocol/sdk/client/stdio.js');
|
|
115
114
|
}
|
|
116
115
|
catch {
|
|
117
116
|
throw new Error('mcpClient(stdio) requires @modelcontextprotocol/sdk/client/stdio.js — ' +
|
|
@@ -127,8 +126,7 @@ async function buildTransport(t) {
|
|
|
127
126
|
// http transport
|
|
128
127
|
let httpMod;
|
|
129
128
|
try {
|
|
130
|
-
|
|
131
|
-
httpMod = require('@modelcontextprotocol/sdk/client/streamableHttp.js');
|
|
129
|
+
httpMod = lazyRequire('@modelcontextprotocol/sdk/client/streamableHttp.js');
|
|
132
130
|
}
|
|
133
131
|
catch {
|
|
134
132
|
throw new Error('mcpClient(http) requires @modelcontextprotocol/sdk/client/streamableHttp.js — ' +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpClient.js","sourceRoot":"","sources":["../../../../src/lib/mcp/mcpClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;
|
|
1
|
+
{"version":3,"file":"mcpClient.js","sourceRoot":"","sources":["../../../../src/lib/mcp/mcpClient.ts"],"names":[],"mappings":"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"}
|