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.
Files changed (212) hide show
  1. package/README.md +293 -247
  2. package/dist/adapters/llm/AnthropicProvider.js +2 -2
  3. package/dist/adapters/llm/AnthropicProvider.js.map +1 -1
  4. package/dist/adapters/llm/BedrockProvider.js +2 -2
  5. package/dist/adapters/llm/BedrockProvider.js.map +1 -1
  6. package/dist/adapters/llm/BrowserAnthropicProvider.js +96 -28
  7. package/dist/adapters/llm/BrowserAnthropicProvider.js.map +1 -1
  8. package/dist/adapters/llm/OpenAIProvider.js +2 -2
  9. package/dist/adapters/llm/OpenAIProvider.js.map +1 -1
  10. package/dist/adapters/memory/agentcore.js +9 -3
  11. package/dist/adapters/memory/agentcore.js.map +1 -1
  12. package/dist/adapters/memory/redis.js +9 -3
  13. package/dist/adapters/memory/redis.js.map +1 -1
  14. package/dist/core/Agent.js +493 -79
  15. package/dist/core/Agent.js.map +1 -1
  16. package/dist/core/flowchartAsTool.js +188 -0
  17. package/dist/core/flowchartAsTool.js.map +1 -0
  18. package/dist/core/outputSchema.js +119 -0
  19. package/dist/core/outputSchema.js.map +1 -0
  20. package/dist/core/slots/buildSystemPromptSlot.js +8 -0
  21. package/dist/core/slots/buildSystemPromptSlot.js.map +1 -1
  22. package/dist/core/slots/buildToolsSlot.js +56 -5
  23. package/dist/core/slots/buildToolsSlot.js.map +1 -1
  24. package/dist/esm/adapters/llm/AnthropicProvider.js +2 -2
  25. package/dist/esm/adapters/llm/AnthropicProvider.js.map +1 -1
  26. package/dist/esm/adapters/llm/BedrockProvider.js +2 -2
  27. package/dist/esm/adapters/llm/BedrockProvider.js.map +1 -1
  28. package/dist/esm/adapters/llm/BrowserAnthropicProvider.js +96 -28
  29. package/dist/esm/adapters/llm/BrowserAnthropicProvider.js.map +1 -1
  30. package/dist/esm/adapters/llm/OpenAIProvider.js +2 -2
  31. package/dist/esm/adapters/llm/OpenAIProvider.js.map +1 -1
  32. package/dist/esm/adapters/memory/agentcore.js +9 -3
  33. package/dist/esm/adapters/memory/agentcore.js.map +1 -1
  34. package/dist/esm/adapters/memory/redis.js +9 -3
  35. package/dist/esm/adapters/memory/redis.js.map +1 -1
  36. package/dist/esm/core/Agent.js +492 -78
  37. package/dist/esm/core/Agent.js.map +1 -1
  38. package/dist/esm/core/flowchartAsTool.js +184 -0
  39. package/dist/esm/core/flowchartAsTool.js.map +1 -0
  40. package/dist/esm/core/outputSchema.js +113 -0
  41. package/dist/esm/core/outputSchema.js.map +1 -0
  42. package/dist/esm/core/slots/buildSystemPromptSlot.js +8 -0
  43. package/dist/esm/core/slots/buildSystemPromptSlot.js.map +1 -1
  44. package/dist/esm/core/slots/buildToolsSlot.js +56 -5
  45. package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
  46. package/dist/esm/index.js +34 -5
  47. package/dist/esm/index.js.map +1 -1
  48. package/dist/esm/lib/injection-engine/SkillRegistry.js +181 -0
  49. package/dist/esm/lib/injection-engine/SkillRegistry.js.map +1 -0
  50. package/dist/esm/lib/injection-engine/factories/defineSkill.js +35 -0
  51. package/dist/esm/lib/injection-engine/factories/defineSkill.js.map +1 -1
  52. package/dist/esm/lib/injection-engine/index.js +9 -1
  53. package/dist/esm/lib/injection-engine/index.js.map +1 -1
  54. package/dist/esm/lib/injection-engine/skillTools.js +125 -0
  55. package/dist/esm/lib/injection-engine/skillTools.js.map +1 -0
  56. package/dist/esm/lib/injection-engine/types.js +8 -0
  57. package/dist/esm/lib/injection-engine/types.js.map +1 -1
  58. package/dist/esm/lib/lazyRequire.js +33 -0
  59. package/dist/esm/lib/lazyRequire.js.map +1 -0
  60. package/dist/esm/lib/mcp/mcpClient.js +4 -6
  61. package/dist/esm/lib/mcp/mcpClient.js.map +1 -1
  62. package/dist/esm/llm-providers.js +31 -0
  63. package/dist/esm/llm-providers.js.map +1 -0
  64. package/dist/esm/locales/index.js +144 -0
  65. package/dist/esm/locales/index.js.map +1 -0
  66. package/dist/esm/memory-providers.js +44 -0
  67. package/dist/esm/memory-providers.js.map +1 -0
  68. package/dist/esm/providers.js +11 -0
  69. package/dist/esm/providers.js.map +1 -1
  70. package/dist/esm/recorders/core/contextEngineering.js +155 -0
  71. package/dist/esm/recorders/core/contextEngineering.js.map +1 -0
  72. package/dist/esm/recorders/observability/commentary/commentaryTemplates.js +6 -1
  73. package/dist/esm/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
  74. package/dist/esm/security/PermissionPolicy.js +135 -0
  75. package/dist/esm/security/PermissionPolicy.js.map +1 -0
  76. package/dist/esm/security/index.js +38 -0
  77. package/dist/esm/security/index.js.map +1 -0
  78. package/dist/esm/tool-providers/gatedTools.js +52 -0
  79. package/dist/esm/tool-providers/gatedTools.js.map +1 -0
  80. package/dist/esm/tool-providers/index.js +43 -0
  81. package/dist/esm/tool-providers/index.js.map +1 -0
  82. package/dist/esm/tool-providers/skillScopedTools.js +63 -0
  83. package/dist/esm/tool-providers/skillScopedTools.js.map +1 -0
  84. package/dist/esm/tool-providers/staticTools.js +33 -0
  85. package/dist/esm/tool-providers/staticTools.js.map +1 -0
  86. package/dist/esm/tool-providers/types.js +53 -0
  87. package/dist/esm/tool-providers/types.js.map +1 -0
  88. package/dist/index.js +57 -12
  89. package/dist/index.js.map +1 -1
  90. package/dist/lib/injection-engine/SkillRegistry.js +185 -0
  91. package/dist/lib/injection-engine/SkillRegistry.js.map +1 -0
  92. package/dist/lib/injection-engine/factories/defineSkill.js +37 -1
  93. package/dist/lib/injection-engine/factories/defineSkill.js.map +1 -1
  94. package/dist/lib/injection-engine/index.js +14 -1
  95. package/dist/lib/injection-engine/index.js.map +1 -1
  96. package/dist/lib/injection-engine/skillTools.js +130 -0
  97. package/dist/lib/injection-engine/skillTools.js.map +1 -0
  98. package/dist/lib/injection-engine/types.js +8 -0
  99. package/dist/lib/injection-engine/types.js.map +1 -1
  100. package/dist/lib/lazyRequire.js +37 -0
  101. package/dist/lib/lazyRequire.js.map +1 -0
  102. package/dist/lib/mcp/mcpClient.js +4 -6
  103. package/dist/lib/mcp/mcpClient.js.map +1 -1
  104. package/dist/llm-providers.js +47 -0
  105. package/dist/llm-providers.js.map +1 -0
  106. package/dist/locales/index.js +149 -0
  107. package/dist/locales/index.js.map +1 -0
  108. package/dist/memory-providers.js +49 -0
  109. package/dist/memory-providers.js.map +1 -0
  110. package/dist/providers.js +11 -0
  111. package/dist/providers.js.map +1 -1
  112. package/dist/recorders/core/contextEngineering.js +161 -0
  113. package/dist/recorders/core/contextEngineering.js.map +1 -0
  114. package/dist/recorders/observability/commentary/commentaryTemplates.js +6 -1
  115. package/dist/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
  116. package/dist/security/PermissionPolicy.js +139 -0
  117. package/dist/security/PermissionPolicy.js.map +1 -0
  118. package/dist/security/index.js +42 -0
  119. package/dist/security/index.js.map +1 -0
  120. package/dist/tool-providers/gatedTools.js +56 -0
  121. package/dist/tool-providers/gatedTools.js.map +1 -0
  122. package/dist/tool-providers/index.js +51 -0
  123. package/dist/tool-providers/index.js.map +1 -0
  124. package/dist/tool-providers/skillScopedTools.js +67 -0
  125. package/dist/tool-providers/skillScopedTools.js.map +1 -0
  126. package/dist/tool-providers/staticTools.js +37 -0
  127. package/dist/tool-providers/staticTools.js.map +1 -0
  128. package/dist/tool-providers/types.js +54 -0
  129. package/dist/tool-providers/types.js.map +1 -0
  130. package/dist/types/adapters/llm/AnthropicProvider.d.ts.map +1 -1
  131. package/dist/types/adapters/llm/BedrockProvider.d.ts.map +1 -1
  132. package/dist/types/adapters/llm/BrowserAnthropicProvider.d.ts.map +1 -1
  133. package/dist/types/adapters/llm/OpenAIProvider.d.ts.map +1 -1
  134. package/dist/types/adapters/memory/agentcore.d.ts +7 -1
  135. package/dist/types/adapters/memory/agentcore.d.ts.map +1 -1
  136. package/dist/types/adapters/memory/redis.d.ts +7 -1
  137. package/dist/types/adapters/memory/redis.d.ts.map +1 -1
  138. package/dist/types/core/Agent.d.ts +216 -2
  139. package/dist/types/core/Agent.d.ts.map +1 -1
  140. package/dist/types/core/flowchartAsTool.d.ts +161 -0
  141. package/dist/types/core/flowchartAsTool.d.ts.map +1 -0
  142. package/dist/types/core/outputSchema.d.ts +128 -0
  143. package/dist/types/core/outputSchema.d.ts.map +1 -0
  144. package/dist/types/core/slots/buildSystemPromptSlot.d.ts.map +1 -1
  145. package/dist/types/core/slots/buildToolsSlot.d.ts +10 -0
  146. package/dist/types/core/slots/buildToolsSlot.d.ts.map +1 -1
  147. package/dist/types/index.d.ts +8 -4
  148. package/dist/types/index.d.ts.map +1 -1
  149. package/dist/types/lib/injection-engine/SkillRegistry.d.ts +148 -0
  150. package/dist/types/lib/injection-engine/SkillRegistry.d.ts.map +1 -0
  151. package/dist/types/lib/injection-engine/factories/defineSkill.d.ts +99 -0
  152. package/dist/types/lib/injection-engine/factories/defineSkill.d.ts.map +1 -1
  153. package/dist/types/lib/injection-engine/index.d.ts +5 -2
  154. package/dist/types/lib/injection-engine/index.d.ts.map +1 -1
  155. package/dist/types/lib/injection-engine/skillTools.d.ts +73 -0
  156. package/dist/types/lib/injection-engine/skillTools.d.ts.map +1 -0
  157. package/dist/types/lib/injection-engine/types.d.ts +28 -0
  158. package/dist/types/lib/injection-engine/types.d.ts.map +1 -1
  159. package/dist/types/lib/lazyRequire.d.ts +30 -0
  160. package/dist/types/lib/lazyRequire.d.ts.map +1 -0
  161. package/dist/types/lib/mcp/mcpClient.d.ts.map +1 -1
  162. package/dist/types/llm-providers.d.ts +31 -0
  163. package/dist/types/llm-providers.d.ts.map +1 -0
  164. package/dist/types/locales/index.d.ts +133 -0
  165. package/dist/types/locales/index.d.ts.map +1 -0
  166. package/dist/types/memory-providers.d.ts +41 -0
  167. package/dist/types/memory-providers.d.ts.map +1 -0
  168. package/dist/types/providers.d.ts +11 -0
  169. package/dist/types/providers.d.ts.map +1 -1
  170. package/dist/types/recorders/core/contextEngineering.d.ts +137 -0
  171. package/dist/types/recorders/core/contextEngineering.d.ts.map +1 -0
  172. package/dist/types/recorders/observability/commentary/commentaryTemplates.d.ts.map +1 -1
  173. package/dist/types/security/PermissionPolicy.d.ts +125 -0
  174. package/dist/types/security/PermissionPolicy.d.ts.map +1 -0
  175. package/dist/types/security/index.d.ts +40 -0
  176. package/dist/types/security/index.d.ts.map +1 -0
  177. package/dist/types/tool-providers/gatedTools.d.ts +37 -0
  178. package/dist/types/tool-providers/gatedTools.d.ts.map +1 -0
  179. package/dist/types/tool-providers/index.d.ts +42 -0
  180. package/dist/types/tool-providers/index.d.ts.map +1 -0
  181. package/dist/types/tool-providers/skillScopedTools.d.ts +46 -0
  182. package/dist/types/tool-providers/skillScopedTools.d.ts.map +1 -0
  183. package/dist/types/tool-providers/staticTools.d.ts +22 -0
  184. package/dist/types/tool-providers/staticTools.d.ts.map +1 -0
  185. package/dist/types/tool-providers/types.d.ts +103 -0
  186. package/dist/types/tool-providers/types.d.ts.map +1 -0
  187. package/package.json +62 -9
  188. package/README.proposed.md +0 -258
  189. package/dist/instructions.js +0 -21
  190. package/dist/instructions.js.map +0 -1
  191. package/dist/lib/instructions/defineInstruction.js +0 -35
  192. package/dist/lib/instructions/defineInstruction.js.map +0 -1
  193. package/dist/lib/instructions/evaluator.js +0 -38
  194. package/dist/lib/instructions/evaluator.js.map +0 -1
  195. package/dist/lib/instructions/index.js +0 -48
  196. package/dist/lib/instructions/index.js.map +0 -1
  197. package/dist/lib/instructions/types.js +0 -22
  198. package/dist/lib/instructions/types.js.map +0 -1
  199. package/dist/memory/conversationHelpers.js +0 -39
  200. package/dist/memory/conversationHelpers.js.map +0 -1
  201. package/dist/types/instructions.d.ts +0 -5
  202. package/dist/types/instructions.d.ts.map +0 -1
  203. package/dist/types/lib/instructions/defineInstruction.d.ts +0 -22
  204. package/dist/types/lib/instructions/defineInstruction.d.ts.map +0 -1
  205. package/dist/types/lib/instructions/evaluator.d.ts +0 -11
  206. package/dist/types/lib/instructions/evaluator.d.ts.map +0 -1
  207. package/dist/types/lib/instructions/index.d.ts +0 -44
  208. package/dist/types/lib/instructions/index.d.ts.map +0 -1
  209. package/dist/types/lib/instructions/types.d.ts +0 -100
  210. package/dist/types/lib/instructions/types.d.ts.map +0 -1
  211. package/dist/types/memory/conversationHelpers.d.ts +0 -19
  212. package/dist/types/memory/conversationHelpers.d.ts.map +0 -1
@@ -0,0 +1,52 @@
1
+ /**
2
+ * gatedTools — wrap any ToolProvider with a per-tool gating predicate.
3
+ *
4
+ * The DECORATOR for tool providers. Filters the inner provider's
5
+ * output by running the predicate against each tool name. Composes
6
+ * freely:
7
+ *
8
+ * gatedTools(
9
+ * gatedTools(staticTools(allTools), readOnlyPredicate),
10
+ * skillGatePredicate,
11
+ * )
12
+ *
13
+ * Reads as: "static list of all tools, filtered by readonly policy,
14
+ * then further filtered by the active skill's tool set." Each gate
15
+ * is one concern; composition handles the rest.
16
+ *
17
+ * Pattern: Decorator (GoF) — wraps any ToolProvider with an additional
18
+ * filter. Mirrors `withRetry` / `withFallback` over LLMProvider.
19
+ *
20
+ * @example Read-only enforcement
21
+ * const readOnly = gatedTools(
22
+ * staticTools([read, write]),
23
+ * (toolName) => toolName.startsWith('read_'),
24
+ * );
25
+ * readOnly.list(ctx); // → [read]
26
+ *
27
+ * @example Skill-gated dispatch (autoActivate use case)
28
+ * const skillGated = gatedTools(
29
+ * staticTools(allTools),
30
+ * (toolName, ctx) => ctx.activeSkillId
31
+ * ? skillToolMap[ctx.activeSkillId].includes(toolName)
32
+ * : alwaysVisible.includes(toolName),
33
+ * );
34
+ */
35
+ // #region gatedTools
36
+ export function gatedTools(inner, predicate) {
37
+ return {
38
+ id: 'gated',
39
+ list(ctx) {
40
+ // Pull from the inner provider first; each recomputation sees
41
+ // the freshest state from any nested gates.
42
+ const innerTools = inner.list(ctx);
43
+ // Filter by predicate — tool name from `tool.schema.name`.
44
+ // Predicates throwing escape: a buggy predicate should crash
45
+ // loudly, not silently allow tools through. Per the
46
+ // permission-as-defense-in-depth principle.
47
+ return innerTools.filter((t) => predicate(t.schema.name, ctx));
48
+ },
49
+ };
50
+ }
51
+ // #endregion gatedTools
52
+ //# sourceMappingURL=gatedTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gatedTools.js","sourceRoot":"","sources":["../../../src/tool-providers/gatedTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAIH,qBAAqB;AACrB,MAAM,UAAU,UAAU,CAAC,KAAmB,EAAE,SAA4B;IAC1E,OAAO;QACL,EAAE,EAAE,OAAO;QACX,IAAI,CAAC,GAAwB;YAC3B,8DAA8D;YAC9D,4CAA4C;YAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnC,2DAA2D;YAC3D,6DAA6D;YAC7D,oDAAoD;YACpD,4CAA4C;YAC5C,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACjE,CAAC;KACF,CAAC;AACJ,CAAC;AACD,wBAAwB"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * agentfootprint/tool-providers — chainable tool dispatch + tool sources.
3
+ *
4
+ * Two layers under one subpath:
5
+ *
6
+ * 1. Tool dispatch (this folder)
7
+ * - `staticTools(arr)` — wrap a flat tool list
8
+ * - `gatedTools(inner, predicate)` — decorator that filters
9
+ * - `ToolProvider` interface — the contract
10
+ * - `ToolDispatchContext` — read-only context per iteration
11
+ *
12
+ * 2. Tool sources (re-exported from existing modules)
13
+ * - `mcpClient(opts)` — connect to an MCP server (real)
14
+ * - `mockMcpClient({ tools })` — in-memory MCP source for dev / tests
15
+ *
16
+ * Compose freely. The dispatch layer is decorator-shaped (mirroring
17
+ * `withRetry` / `withFallback` over LLMProvider). Tool sources produce
18
+ * `Tool[]` that flow into a `staticTools(arr)` provider, which can
19
+ * then be wrapped by `gatedTools(...)` for permission gating or
20
+ * per-skill filtering.
21
+ *
22
+ * @example Static (90% case — what `agent.tools(arr)` does today)
23
+ * const provider = staticTools([weatherTool, lookupTool]);
24
+ *
25
+ * @example Read-only enforcement
26
+ * const readOnly = gatedTools(
27
+ * staticTools(allTools),
28
+ * (name) => policy.isAllowed(name),
29
+ * );
30
+ *
31
+ * @example MCP source + permission gate
32
+ * const slack = await mcpClient({ transport: ... });
33
+ * const slackTools = await slack.tools();
34
+ * const provider = gatedTools(staticTools(slackTools), (name) => allowed(name));
35
+ */
36
+ export { staticTools } from './staticTools.js';
37
+ export { gatedTools } from './gatedTools.js';
38
+ export { skillScopedTools } from './skillScopedTools.js';
39
+ // Re-export tool sources from the MCP module so consumers find them in
40
+ // one place. The top-level barrel still exports `mcpClient` for v2.2
41
+ // back-compat.
42
+ export { mcpClient, mockMcpClient } from '../lib/mcp/index.js';
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tool-providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,uEAAuE;AACvE,qEAAqE;AACrE,eAAe;AACf,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * skillScopedTools — ToolProvider that exposes a tool subset only when
3
+ * a specific Skill is active in the current iteration's context.
4
+ *
5
+ * The Block A5 piece. Pairs with `defineSkill({ autoActivate: 'currentSkill' })`
6
+ * to give the LLM a sharper choice space: when `billing` activates, the
7
+ * tool list flips from "all 25 agent tools" to "the 7 billing tools" +
8
+ * any baseline (always-on) tools the consumer composes alongside.
9
+ *
10
+ * Pattern: gated ToolProvider keyed by `ctx.activeSkillId`. Pure compute;
11
+ * no Agent-runtime dependency. Composes freely with `staticTools`
12
+ * for the always-on baseline.
13
+ *
14
+ * @example One skill's tools, scoped by activation
15
+ * const billingTools = skillScopedTools('billing', [refundTool, chargeTool]);
16
+ * billingTools.list({ iteration: 1, activeSkillId: 'billing', identity: ... });
17
+ * // → [refundTool, chargeTool]
18
+ * billingTools.list({ iteration: 1, activeSkillId: 'refund', identity: ... });
19
+ * // → [] (different skill active)
20
+ * billingTools.list({ iteration: 1, identity: ... });
21
+ * // → [] (no skill active)
22
+ *
23
+ * @example Compose with baseline + multiple skills
24
+ * const baseline = staticTools([lookupOrderTool, listSkills, readSkill]);
25
+ * const billingTbx = skillScopedTools('billing', [refundTool, chargeTool]);
26
+ * const refundTbx = skillScopedTools('refund', [reverseTool]);
27
+ *
28
+ * // Wrap each scope-provider in a gatedTools for downstream composition,
29
+ * // OR build a small wrapper that concatenates list(ctx) outputs:
30
+ * const provider: ToolProvider = {
31
+ * id: 'composite',
32
+ * list: (ctx) => [
33
+ * ...baseline.list(ctx),
34
+ * ...billingTbx.list(ctx),
35
+ * ...refundTbx.list(ctx),
36
+ * ],
37
+ * };
38
+ *
39
+ * Note: the runtime that POPULATES `ctx.activeSkillId` from
40
+ * `scope.activatedInjectionIds` lands in Block C / v2.5+. Today,
41
+ * consumers can drive it manually for tests + design-time inspection.
42
+ */
43
+ // #region skillScopedTools
44
+ export function skillScopedTools(skillId, tools) {
45
+ if (!skillId || skillId.trim().length === 0) {
46
+ throw new Error('skillScopedTools: `skillId` is required and must be non-empty.');
47
+ }
48
+ // Capture the tool list once. `list()` returns a fresh array each
49
+ // call (matches the staticTools / gatedTools convention so the
50
+ // agent's reference-equality check always sees an update).
51
+ const captured = [...tools];
52
+ return {
53
+ id: `skill-scoped:${skillId}`,
54
+ list(ctx) {
55
+ // Empty list when the skill is not active.
56
+ if (ctx.activeSkillId !== skillId)
57
+ return [];
58
+ return [...captured];
59
+ },
60
+ };
61
+ }
62
+ // #endregion skillScopedTools
63
+ //# sourceMappingURL=skillScopedTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillScopedTools.js","sourceRoot":"","sources":["../../../src/tool-providers/skillScopedTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAKH,2BAA2B;AAC3B,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,KAAsB;IACtE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IACD,kEAAkE;IAClE,+DAA+D;IAC/D,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC5B,OAAO;QACL,EAAE,EAAE,gBAAgB,OAAO,EAAE;QAC7B,IAAI,CAAC,GAAwB;YAC3B,2CAA2C;YAC3C,IAAI,GAAG,CAAC,aAAa,KAAK,OAAO;gBAAE,OAAO,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC;AACD,8BAA8B"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * staticTools — the simplest ToolProvider. Wraps a fixed Tool[] list.
3
+ *
4
+ * 90% case. What `agent.tools(arr)` does today, made composable.
5
+ * Equivalent to passing `arr` directly EXCEPT that `staticTools(arr)`
6
+ * is now a `ToolProvider` you can wrap with `gatedTools(...)` for
7
+ * permission filtering or per-skill gating.
8
+ *
9
+ * Pattern: identity ToolProvider — no filtering, just exposes the
10
+ * underlying list verbatim.
11
+ *
12
+ * @example
13
+ * const provider = staticTools([weatherTool, lookupTool]);
14
+ * // Materialize the visible list and register via .tools(...).
15
+ * // Direct .toolProvider(...) wiring on the builder lands in Block A5 / v2.5+.
16
+ * const visible = provider.list({ iteration: 0, identity: { conversationId: '_' } });
17
+ * const agent = Agent.create({ provider: llm, model }).tools(visible).build();
18
+ */
19
+ // #region staticTools
20
+ export function staticTools(tools) {
21
+ // Capture the input list once. `list()` returns a fresh array each
22
+ // call so the agent's reference-equality check always sees an update
23
+ // (matches the `gatedTools` decorator's per-call recomputation).
24
+ const captured = [...tools];
25
+ return {
26
+ id: 'static',
27
+ list(_ctx) {
28
+ return [...captured];
29
+ },
30
+ };
31
+ }
32
+ // #endregion staticTools
33
+ //# sourceMappingURL=staticTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staticTools.js","sourceRoot":"","sources":["../../../src/tool-providers/staticTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,sBAAsB;AACtB,MAAM,UAAU,WAAW,CAAC,KAAsB;IAChD,mEAAmE;IACnE,qEAAqE;IACrE,iEAAiE;IACjE,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC5B,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,IAAI,CAAC,IAAyB;YAC5B,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC;AACD,yBAAyB"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * ToolProvider — abstraction over tool dispatch.
3
+ *
4
+ * v2.4 shipped tools as a flat array on the agent (registered via
5
+ * `agent.tool(t)` / `agent.tools(arr)`). That model breaks down once
6
+ * production agents need:
7
+ * 1. Permission gating per-tool, per-caller (read-only roles, etc.)
8
+ * 2. Per-skill tool gating (only show the active skill's tools to
9
+ * the LLM each turn)
10
+ * 3. Composable filters (a `withReadonly` decorator over a `withSkill`
11
+ * decorator over the base tool list)
12
+ *
13
+ * `ToolProvider` is the answer: a chainable abstraction over "what
14
+ * tools does the LLM see right now?". The agent asks the provider
15
+ * each iteration; the provider returns the visible tool set computed
16
+ * from whatever predicates / role gates / skill filters the consumer
17
+ * composed.
18
+ *
19
+ * Pattern: Strategy (GoF) — each ToolProvider is a strategy for
20
+ * "compute the visible tool list given current context".
21
+ * Decorator (GoF) — `gatedTools(inner, predicate)` wraps any
22
+ * provider with an additional filter, mirroring how `withRetry`
23
+ * / `withFallback` decorate `LLMProvider`.
24
+ * Role: Layer-3 tool-dispatch primitive. Agent calls `provider.list(ctx)`
25
+ * each iteration to compute the visible tool set.
26
+ * Emits: N/A (pure compute; permission denials emit elsewhere via the
27
+ * permission subsystem).
28
+ *
29
+ * @example Static tool list (90% case — what `.tools(arr)` does today)
30
+ * const provider = staticTools([weather, lookupOrder]);
31
+ *
32
+ * @example Read-only enforcement (role-based gate)
33
+ * const readOnlyProvider = gatedTools(
34
+ * staticTools([weather, lookupOrder, processRefund]),
35
+ * (toolName) => policy.isAllowed(toolName),
36
+ * );
37
+ *
38
+ * @example Skill-gated dispatch (only active skill's tools visible)
39
+ * const skillGated = gatedTools(
40
+ * staticTools(allTools),
41
+ * (toolName, ctx) => ctx.activeSkillId
42
+ * ? skillsToolMap[ctx.activeSkillId].includes(toolName)
43
+ * : alwaysVisible.includes(toolName),
44
+ * );
45
+ *
46
+ * @example Stack: read-only over skill-gated
47
+ * const provider = gatedTools(
48
+ * gatedTools(staticTools(allTools), readOnlyPredicate),
49
+ * skillGatePredicate,
50
+ * );
51
+ */
52
+ export {};
53
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tool-providers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG"}
package/dist/index.js CHANGED
@@ -21,8 +21,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
21
21
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
22
22
  };
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.ConditionalBuilder = exports.Conditional = exports.ParallelBuilder = exports.Parallel = exports.SequenceBuilder = exports.Sequence = exports.defineTool = exports.AgentBuilder = exports.Agent = exports.LLMCallBuilder = exports.LLMCall = exports.renderThinkingLine = exports.selectThinkingState = exports.defaultThinkingTemplates = exports.renderCommentary = exports.extractCommentaryVars = exports.selectCommentaryKey = exports.defaultCommentaryTemplates = exports.boundaryRecorder = exports.BoundaryRecorder = exports.attachFlowchart = exports.LoggingDomains = exports.attachLogging = exports.attachThinking = exports.isPaused = exports.isPauseRequest = exports.askHuman = exports.pauseHere = exports.makeRunId = exports.RunnerBase = exports.typedEmit = exports.skillRecorder = exports.memoryRecorder = exports.evalRecorder = exports.permissionRecorder = exports.costRecorder = exports.compositionRecorder = exports.agentRecorder = exports.streamRecorder = exports.EmitBridge = exports.ContextRecorder = exports.parseSubflowPath = exports.buildEventMeta = exports.COMPOSITION_KEYS = exports.isInjectionKey = exports.injectionKeyForSlot = exports.INJECTION_KEYS = exports.EventDispatcher = exports.ALL_EVENT_TYPES = exports.EVENT_NAMES = void 0;
25
- exports.mockMcpClient = exports.mcpClient = exports.indexDocuments = exports.defineRAG = exports.identityNamespace = exports.mockEmbedder = exports.InMemoryStore = exports.SNAPSHOT_PROJECTIONS = exports.MEMORY_TIMING = exports.MEMORY_STRATEGIES = exports.MEMORY_TYPES = exports.defineMemory = exports.llmFactExtractor = exports.patternFactExtractor = exports.llmExtractor = exports.heuristicExtractor = exports.autoPipeline = exports.semanticPipeline = exports.narrativePipeline = exports.factPipeline = exports.ephemeralPipeline = exports.defaultPipeline = exports.defineFact = exports.defineSteering = exports.defineSkill = exports.defineInstruction = exports.buildInjectionEngineSubflow = exports.evaluateInjections = exports.encodeSSE = exports.SSEFormatter = exports.toSSE = exports.createProvider = exports.BrowserOpenAIProvider = exports.browserOpenai = exports.BrowserAnthropicProvider = exports.browserAnthropic = exports.BedrockProvider = exports.bedrock = exports.ollama = exports.OpenAIProvider = exports.openai = exports.AnthropicProvider = exports.anthropic = exports.mock = exports.MockProvider = exports.LoopBuilder = exports.Loop = void 0;
24
+ exports.applyOutputSchema = exports.OutputSchemaError = exports.AgentBuilder = exports.Agent = exports.LLMCallBuilder = exports.LLMCall = exports.renderThinkingLine = exports.selectThinkingState = exports.defaultThinkingTemplates = exports.renderCommentary = exports.extractCommentaryVars = exports.selectCommentaryKey = exports.defaultCommentaryTemplates = exports.boundaryRecorder = exports.BoundaryRecorder = exports.attachFlowchart = exports.LoggingDomains = exports.attachLogging = exports.attachThinking = exports.isPaused = exports.isPauseRequest = exports.askHuman = exports.pauseHere = exports.makeRunId = exports.RunnerBase = exports.typedEmit = exports.skillRecorder = exports.memoryRecorder = exports.evalRecorder = exports.permissionRecorder = exports.costRecorder = exports.compositionRecorder = exports.agentRecorder = exports.streamRecorder = exports.EmitBridge = exports.BASELINE_SOURCES = exports.ENGINEERED_SOURCES = exports.isBaselineSource = exports.isEngineeredSource = exports.contextEngineering = exports.ContextRecorder = exports.parseSubflowPath = exports.buildEventMeta = exports.COMPOSITION_KEYS = exports.isInjectionKey = exports.injectionKeyForSlot = exports.INJECTION_KEYS = exports.EventDispatcher = exports.ALL_EVENT_TYPES = exports.EVENT_NAMES = void 0;
25
+ exports.identityNamespace = exports.mockEmbedder = exports.InMemoryStore = exports.SNAPSHOT_PROJECTIONS = exports.MEMORY_TIMING = exports.MEMORY_STRATEGIES = exports.MEMORY_TYPES = exports.defineMemory = exports.llmFactExtractor = exports.patternFactExtractor = exports.llmExtractor = exports.heuristicExtractor = exports.autoPipeline = exports.semanticPipeline = exports.narrativePipeline = exports.factPipeline = exports.ephemeralPipeline = exports.defaultPipeline = exports.defineFact = exports.defineSteering = exports.buildReadSkillTool = exports.buildListSkillsTool = exports.SkillRegistry = exports.resolveSurfaceMode = exports.defineSkill = exports.defineInstruction = exports.projectActiveInjection = exports.buildInjectionEngineSubflow = exports.evaluateInjections = exports.encodeSSE = exports.SSEFormatter = exports.toSSE = exports.createProvider = exports.BrowserOpenAIProvider = exports.browserOpenai = exports.BrowserAnthropicProvider = exports.browserAnthropic = exports.mock = exports.MockProvider = exports.LoopBuilder = exports.Loop = exports.ConditionalBuilder = exports.Conditional = exports.ParallelBuilder = exports.Parallel = exports.SequenceBuilder = exports.Sequence = exports.defineTool = exports.flowchartAsTool = exports.buildDefaultInstruction = void 0;
26
+ exports.validateMessages = exports.composeMessages = exports.defaultThinkingMessages = exports.defaultCommentaryMessages = exports.PermissionPolicy = exports.skillScopedTools = exports.gatedTools = exports.staticTools = exports.mockMcpClient = exports.mcpClient = exports.indexDocuments = exports.defineRAG = void 0;
26
27
  // Events — registry, types, payloads
27
28
  __exportStar(require("./events/types.js"), exports);
28
29
  __exportStar(require("./events/payloads.js"), exports);
@@ -54,6 +55,12 @@ Object.defineProperty(exports, "parseSubflowPath", { enumerable: true, get: func
54
55
  // Core recorders
55
56
  var ContextRecorder_js_1 = require("./recorders/core/ContextRecorder.js");
56
57
  Object.defineProperty(exports, "ContextRecorder", { enumerable: true, get: function () { return ContextRecorder_js_1.ContextRecorder; } });
58
+ var contextEngineering_js_1 = require("./recorders/core/contextEngineering.js");
59
+ Object.defineProperty(exports, "contextEngineering", { enumerable: true, get: function () { return contextEngineering_js_1.contextEngineering; } });
60
+ Object.defineProperty(exports, "isEngineeredSource", { enumerable: true, get: function () { return contextEngineering_js_1.isEngineeredSource; } });
61
+ Object.defineProperty(exports, "isBaselineSource", { enumerable: true, get: function () { return contextEngineering_js_1.isBaselineSource; } });
62
+ Object.defineProperty(exports, "ENGINEERED_SOURCES", { enumerable: true, get: function () { return contextEngineering_js_1.ENGINEERED_SOURCES; } });
63
+ Object.defineProperty(exports, "BASELINE_SOURCES", { enumerable: true, get: function () { return contextEngineering_js_1.BASELINE_SOURCES; } });
57
64
  var EmitBridge_js_1 = require("./recorders/core/EmitBridge.js");
58
65
  Object.defineProperty(exports, "EmitBridge", { enumerable: true, get: function () { return EmitBridge_js_1.EmitBridge; } });
59
66
  var StreamRecorder_js_1 = require("./recorders/core/StreamRecorder.js");
@@ -123,6 +130,12 @@ Object.defineProperty(exports, "LLMCallBuilder", { enumerable: true, get: functi
123
130
  var Agent_js_1 = require("./core/Agent.js");
124
131
  Object.defineProperty(exports, "Agent", { enumerable: true, get: function () { return Agent_js_1.Agent; } });
125
132
  Object.defineProperty(exports, "AgentBuilder", { enumerable: true, get: function () { return Agent_js_1.AgentBuilder; } });
133
+ var outputSchema_js_1 = require("./core/outputSchema.js");
134
+ Object.defineProperty(exports, "OutputSchemaError", { enumerable: true, get: function () { return outputSchema_js_1.OutputSchemaError; } });
135
+ Object.defineProperty(exports, "applyOutputSchema", { enumerable: true, get: function () { return outputSchema_js_1.applyOutputSchema; } });
136
+ Object.defineProperty(exports, "buildDefaultInstruction", { enumerable: true, get: function () { return outputSchema_js_1.buildDefaultInstruction; } });
137
+ var flowchartAsTool_js_1 = require("./core/flowchartAsTool.js");
138
+ Object.defineProperty(exports, "flowchartAsTool", { enumerable: true, get: function () { return flowchartAsTool_js_1.flowchartAsTool; } });
126
139
  var tools_js_1 = require("./core/tools.js");
127
140
  Object.defineProperty(exports, "defineTool", { enumerable: true, get: function () { return tools_js_1.defineTool; } });
128
141
  // Slot subflow builders are intentionally NOT exported. They are
@@ -149,19 +162,24 @@ Object.defineProperty(exports, "LoopBuilder", { enumerable: true, get: function
149
162
  // Adapters — LLM providers
150
163
  // `mock(...)` is the lowercase factory equivalent to `new MockProvider(...)`.
151
164
  // `anthropic(...)` is the real Claude provider via `@anthropic-ai/sdk`.
165
+ // Zero-peer-dep providers — safe to re-export from the main barrel
166
+ // because bundlers walking these never touch optional peer-dep code.
167
+ //
168
+ // Vendor-SDK-backed providers (AnthropicProvider, OpenAIProvider,
169
+ // BedrockProvider) live ONLY at `agentfootprint/llm-providers` (or
170
+ // the legacy `agentfootprint/providers` alias). That subpath
171
+ // segregation means bundlers walking from `agentfootprint` main
172
+ // never see the lazy peer-dep requires for `@anthropic-ai/sdk`,
173
+ // `openai`, `@aws-sdk/client-bedrock-runtime`, etc. — automatic
174
+ // tree-shaking, no bundler-side workarounds.
175
+ //
176
+ // Migration (v2.4 → v2.5):
177
+ // import { AnthropicProvider } from 'agentfootprint'; // ❌ removed
178
+ // import { AnthropicProvider } from 'agentfootprint/llm-providers'; // ✓ canonical
179
+ // import { AnthropicProvider } from 'agentfootprint/providers'; // ✓ legacy alias
152
180
  var MockProvider_js_1 = require("./adapters/llm/MockProvider.js");
153
181
  Object.defineProperty(exports, "MockProvider", { enumerable: true, get: function () { return MockProvider_js_1.MockProvider; } });
154
182
  Object.defineProperty(exports, "mock", { enumerable: true, get: function () { return MockProvider_js_1.mock; } });
155
- var AnthropicProvider_js_1 = require("./adapters/llm/AnthropicProvider.js");
156
- Object.defineProperty(exports, "anthropic", { enumerable: true, get: function () { return AnthropicProvider_js_1.anthropic; } });
157
- Object.defineProperty(exports, "AnthropicProvider", { enumerable: true, get: function () { return AnthropicProvider_js_1.AnthropicProvider; } });
158
- var OpenAIProvider_js_1 = require("./adapters/llm/OpenAIProvider.js");
159
- Object.defineProperty(exports, "openai", { enumerable: true, get: function () { return OpenAIProvider_js_1.openai; } });
160
- Object.defineProperty(exports, "OpenAIProvider", { enumerable: true, get: function () { return OpenAIProvider_js_1.OpenAIProvider; } });
161
- Object.defineProperty(exports, "ollama", { enumerable: true, get: function () { return OpenAIProvider_js_1.ollama; } });
162
- var BedrockProvider_js_1 = require("./adapters/llm/BedrockProvider.js");
163
- Object.defineProperty(exports, "bedrock", { enumerable: true, get: function () { return BedrockProvider_js_1.bedrock; } });
164
- Object.defineProperty(exports, "BedrockProvider", { enumerable: true, get: function () { return BedrockProvider_js_1.BedrockProvider; } });
165
183
  var BrowserAnthropicProvider_js_1 = require("./adapters/llm/BrowserAnthropicProvider.js");
166
184
  Object.defineProperty(exports, "browserAnthropic", { enumerable: true, get: function () { return BrowserAnthropicProvider_js_1.browserAnthropic; } });
167
185
  Object.defineProperty(exports, "BrowserAnthropicProvider", { enumerable: true, get: function () { return BrowserAnthropicProvider_js_1.BrowserAnthropicProvider; } });
@@ -181,9 +199,14 @@ var index_js_1 = require("./lib/injection-engine/index.js");
181
199
  // Engine
182
200
  Object.defineProperty(exports, "evaluateInjections", { enumerable: true, get: function () { return index_js_1.evaluateInjections; } });
183
201
  Object.defineProperty(exports, "buildInjectionEngineSubflow", { enumerable: true, get: function () { return index_js_1.buildInjectionEngineSubflow; } });
202
+ Object.defineProperty(exports, "projectActiveInjection", { enumerable: true, get: function () { return index_js_1.projectActiveInjection; } });
184
203
  // Sugar factories — one per injection flavor
185
204
  Object.defineProperty(exports, "defineInstruction", { enumerable: true, get: function () { return index_js_1.defineInstruction; } });
186
205
  Object.defineProperty(exports, "defineSkill", { enumerable: true, get: function () { return index_js_1.defineSkill; } });
206
+ Object.defineProperty(exports, "resolveSurfaceMode", { enumerable: true, get: function () { return index_js_1.resolveSurfaceMode; } });
207
+ Object.defineProperty(exports, "SkillRegistry", { enumerable: true, get: function () { return index_js_1.SkillRegistry; } });
208
+ Object.defineProperty(exports, "buildListSkillsTool", { enumerable: true, get: function () { return index_js_1.buildListSkillsTool; } });
209
+ Object.defineProperty(exports, "buildReadSkillTool", { enumerable: true, get: function () { return index_js_1.buildReadSkillTool; } });
187
210
  Object.defineProperty(exports, "defineSteering", { enumerable: true, get: function () { return index_js_1.defineSteering; } });
188
211
  Object.defineProperty(exports, "defineFact", { enumerable: true, get: function () { return index_js_1.defineFact; } });
189
212
  // Patterns — factory functions composing primitives + core-flow into
@@ -236,4 +259,26 @@ Object.defineProperty(exports, "indexDocuments", { enumerable: true, get: functi
236
259
  var index_js_7 = require("./lib/mcp/index.js");
237
260
  Object.defineProperty(exports, "mcpClient", { enumerable: true, get: function () { return index_js_7.mcpClient; } });
238
261
  Object.defineProperty(exports, "mockMcpClient", { enumerable: true, get: function () { return index_js_7.mockMcpClient; } });
262
+ // Tool dispatch primitives (v2.5+). New `agentfootprint/tool-providers`
263
+ // subpath bundles tool sources (mcpClient / mockMcpClient) with tool
264
+ // dispatch primitives (staticTools / gatedTools) so consumers find
265
+ // "everything tool-related" in one place. Top-level barrel re-exports
266
+ // the dispatch primitives too — `mcpClient` already re-exports above.
267
+ var index_js_8 = require("./tool-providers/index.js");
268
+ Object.defineProperty(exports, "staticTools", { enumerable: true, get: function () { return index_js_8.staticTools; } });
269
+ Object.defineProperty(exports, "gatedTools", { enumerable: true, get: function () { return index_js_8.gatedTools; } });
270
+ Object.defineProperty(exports, "skillScopedTools", { enumerable: true, get: function () { return index_js_8.skillScopedTools; } });
271
+ // Cross-cutting authorization (v2.5+). `agentfootprint/security` is the
272
+ // dedicated subpath; the root barrel also re-exports `PermissionPolicy`
273
+ // so existing v2.4 consumers find it at the top level.
274
+ var index_js_9 = require("./security/index.js");
275
+ Object.defineProperty(exports, "PermissionPolicy", { enumerable: true, get: function () { return index_js_9.PermissionPolicy; } });
276
+ // Message Catalog Pattern (v2.5+). `agentfootprint/locales` is the
277
+ // dedicated subpath; the root barrel also re-exports the helpers so
278
+ // existing v2.4 consumers find them at the top level.
279
+ var index_js_10 = require("./locales/index.js");
280
+ Object.defineProperty(exports, "defaultCommentaryMessages", { enumerable: true, get: function () { return index_js_10.defaultCommentaryMessages; } });
281
+ Object.defineProperty(exports, "defaultThinkingMessages", { enumerable: true, get: function () { return index_js_10.defaultThinkingMessages; } });
282
+ Object.defineProperty(exports, "composeMessages", { enumerable: true, get: function () { return index_js_10.composeMessages; } });
283
+ Object.defineProperty(exports, "validateMessages", { enumerable: true, get: function () { return index_js_10.validateMessages; } });
239
284
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ /**
3
+ * SkillRegistry — centralized governance for Skills across one or
4
+ * more Agents.
5
+ *
6
+ * Most apps register Skills directly on the Agent via `.skill(s)`.
7
+ * Once you have multiple Agents that share a common skill catalog
8
+ * (a customer-support pool, a research team, a multi-step workflow
9
+ * where each step uses different overlapping skills), hand-syncing
10
+ * `.skill()` calls per Agent gets fragile.
11
+ *
12
+ * `SkillRegistry` is the answer: register once, attach to many
13
+ * Agents via `.skills(registry)`. Add a Skill to the registry and
14
+ * every consumer Agent picks it up at next build.
15
+ *
16
+ * @example
17
+ * const registry = new SkillRegistry();
18
+ * registry.register(billingSkill);
19
+ * registry.register(refundSkill);
20
+ *
21
+ * const supportAgent = Agent.create({ provider }).skills(registry).build();
22
+ * const escalationAgent = Agent.create({ provider }).skills(registry).build();
23
+ *
24
+ * // Add a new skill — both agents pick it up at next build.
25
+ * registry.register(complianceSkill);
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.SkillRegistry = void 0;
29
+ const skillTools_js_1 = require("./skillTools.js");
30
+ const defineSkill_js_1 = require("./factories/defineSkill.js");
31
+ class SkillRegistry {
32
+ skills = new Map();
33
+ opts;
34
+ /**
35
+ * Construct an empty registry. Optional `{ surfaceMode, providerHint }`
36
+ * fields set registry-level defaults; absent both, the registry is a
37
+ * pure container (the v2.4 surface).
38
+ */
39
+ constructor(opts = {}) {
40
+ this.opts = Object.freeze({ ...opts });
41
+ }
42
+ /** Registry-level default `surfaceMode`, or `undefined` if unset. */
43
+ get surfaceMode() {
44
+ return this.opts.surfaceMode;
45
+ }
46
+ /** Registry-level provider hint, or `undefined` if unset. */
47
+ get providerHint() {
48
+ return this.opts.providerHint;
49
+ }
50
+ /**
51
+ * Register a skill. Throws if `skill.flavor !== 'skill'` or if a
52
+ * skill with the same id is already registered (use `.replace(...)`
53
+ * to overwrite intentionally).
54
+ */
55
+ register(skill) {
56
+ if (skill.flavor !== 'skill') {
57
+ throw new Error(`SkillRegistry.register: expected a Skill (flavor: 'skill'), got flavor: '${skill.flavor}' (id: '${skill.id}'). Use defineSkill(...) to construct.`);
58
+ }
59
+ if (this.skills.has(skill.id)) {
60
+ throw new Error(`SkillRegistry.register: skill '${skill.id}' is already registered. Use .replace('${skill.id}', skill) to overwrite.`);
61
+ }
62
+ this.skills.set(skill.id, skill);
63
+ return this;
64
+ }
65
+ /** Replace an existing skill by id. Throws if id is not registered. */
66
+ replace(id, skill) {
67
+ if (!this.skills.has(id)) {
68
+ throw new Error(`SkillRegistry.replace: no skill registered at '${id}'. Use .register(...) for new skills.`);
69
+ }
70
+ if (skill.flavor !== 'skill') {
71
+ throw new Error(`SkillRegistry.replace: expected a Skill (flavor: 'skill'), got '${skill.flavor}'.`);
72
+ }
73
+ if (skill.id !== id) {
74
+ 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.`);
75
+ }
76
+ this.skills.set(id, skill);
77
+ return this;
78
+ }
79
+ /** Remove a skill by id. No-op if not registered. */
80
+ unregister(id) {
81
+ this.skills.delete(id);
82
+ return this;
83
+ }
84
+ /** Look up by id. Returns undefined if not registered. */
85
+ get(id) {
86
+ return this.skills.get(id);
87
+ }
88
+ /** True iff a skill with the given id is registered. */
89
+ has(id) {
90
+ return this.skills.has(id);
91
+ }
92
+ /** All registered skills. Order matches registration order. */
93
+ list() {
94
+ return [...this.skills.values()];
95
+ }
96
+ /** Number of registered skills. */
97
+ get size() {
98
+ return this.skills.size;
99
+ }
100
+ /** Drop all registrations. */
101
+ clear() {
102
+ this.skills.clear();
103
+ }
104
+ /**
105
+ * Materialize the LLM-facing skill discovery tools from the current
106
+ * registry contents. Returns `{ listSkills, readSkill }`:
107
+ *
108
+ * - `list_skills` — no-arg tool the LLM calls to enumerate
109
+ * `{ id, description }` for every registered skill. Lets the
110
+ * LLM discover skills without paying the prompt-token cost of
111
+ * a static catalog in the system prompt.
112
+ *
113
+ * - `read_skill({ id })` — activates the named skill for the
114
+ * NEXT iteration. The Agent's tool-calls subflow inspects this
115
+ * tool call by name and updates `scope.activatedInjectionIds`
116
+ * so the InjectionEngine on iter N+1 includes the skill in the
117
+ * active set (body lands in the system slot; gated tools land
118
+ * in the tools slot).
119
+ *
120
+ * Both entries are `undefined` when the registry is empty — filter
121
+ * before adding to a tool list:
122
+ *
123
+ * const { listSkills, readSkill } = registry.toTools();
124
+ * const tools = [listSkills, readSkill, ...other].filter(Boolean) as Tool[];
125
+ *
126
+ * Composes with `gatedTools` from `agentfootprint/tool-providers`
127
+ * so PermissionPolicy can scope which roles see the skill discovery
128
+ * surface.
129
+ *
130
+ * @returns A `SkillToolPair` (`{ listSkills, readSkill }`).
131
+ */
132
+ toTools() {
133
+ const skills = this.list();
134
+ return {
135
+ listSkills: (0, skillTools_js_1.buildListSkillsTool)(skills),
136
+ readSkill: (0, skillTools_js_1.buildReadSkillTool)(skills),
137
+ };
138
+ }
139
+ /**
140
+ * Resolve the effective `surfaceMode` for a skill, applying the
141
+ * cascade:
142
+ *
143
+ * 1. If the skill's own `metadata.surfaceMode` is concrete
144
+ * (`'system-prompt'` / `'tool-only'` / `'both'`), return it.
145
+ * Per-skill explicit choice always wins.
146
+ * 2. Else if the registry was constructed with a concrete
147
+ * `surfaceMode`, return that.
148
+ * 3. Else delegate to `resolveSurfaceMode(provider, model)` using
149
+ * the explicit `provider` arg (or `this.providerHint` if
150
+ * omitted). Falls back to `'tool-only'` when no provider is
151
+ * known.
152
+ *
153
+ * Forward-compat for Block C / v2.5 per-mode runtime routing: the
154
+ * runtime calls this with the agent's provider + model to decide
155
+ * how to materialize the skill's body into slots.
156
+ *
157
+ * Throws if the skill is not registered (catches typos at the
158
+ * caller site rather than silently resolving against a stranger).
159
+ *
160
+ * @param skillOrId A registered Skill `Injection` OR its `id`.
161
+ * @param provider Provider name override (wins over `providerHint`).
162
+ * @param model Model name for the per-provider attention rule.
163
+ */
164
+ resolveForSkill(skillOrId, provider, model) {
165
+ const skill = typeof skillOrId === 'string' ? this.get(skillOrId) : skillOrId;
166
+ if (!skill) {
167
+ const id = typeof skillOrId === 'string' ? skillOrId : skillOrId.id;
168
+ throw new Error(`SkillRegistry.resolveForSkill: no skill registered at id '${id}'.`);
169
+ }
170
+ if (skill.flavor !== 'skill') {
171
+ throw new Error(`SkillRegistry.resolveForSkill: '${skill.id}' has flavor '${skill.flavor}', expected 'skill'.`);
172
+ }
173
+ const meta = skill.metadata;
174
+ const skillMode = meta?.surfaceMode;
175
+ if (skillMode && skillMode !== 'auto')
176
+ return skillMode;
177
+ if (this.opts.surfaceMode && this.opts.surfaceMode !== 'auto') {
178
+ return this.opts.surfaceMode;
179
+ }
180
+ const effectiveProvider = provider ?? this.opts.providerHint ?? 'unknown';
181
+ return (0, defineSkill_js_1.resolveSurfaceMode)(effectiveProvider, model);
182
+ }
183
+ }
184
+ exports.SkillRegistry = SkillRegistry;
185
+ //# 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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"}