agentfootprint 2.1.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +80 -0
- package/CLAUDE.md +80 -0
- package/README.md +51 -1
- package/README.proposed.md +258 -0
- package/ai-instructions/claude-code/SKILL.md +56 -5
- package/ai-instructions/clinerules +44 -5
- package/ai-instructions/copilot-instructions.md +44 -5
- package/ai-instructions/cursor/agentfootprint.md +44 -5
- package/ai-instructions/kiro/agentfootprint.md +44 -5
- package/ai-instructions/windsurfrules +44 -5
- package/dist/adapters/llm/AnthropicProvider.js +0 -31
- package/dist/adapters/llm/AnthropicProvider.js.map +1 -1
- package/dist/adapters/llm/BedrockProvider.js +2 -28
- package/dist/adapters/llm/BedrockProvider.js.map +1 -1
- package/dist/adapters/llm/BrowserAnthropicProvider.js +1 -31
- package/dist/adapters/llm/BrowserAnthropicProvider.js.map +1 -1
- package/dist/adapters/llm/BrowserOpenAIProvider.js +1 -11
- package/dist/adapters/llm/BrowserOpenAIProvider.js.map +1 -1
- package/dist/adapters/llm/MockProvider.js +35 -1
- package/dist/adapters/llm/MockProvider.js.map +1 -1
- package/dist/adapters/llm/OpenAIProvider.js +3 -29
- package/dist/adapters/llm/OpenAIProvider.js.map +1 -1
- package/dist/adapters/memory/agentcore.js +305 -0
- package/dist/adapters/memory/agentcore.js.map +1 -0
- package/dist/adapters/memory/redis.js +287 -0
- package/dist/adapters/memory/redis.js.map +1 -0
- package/dist/core/Agent.js +11 -0
- package/dist/core/Agent.js.map +1 -1
- package/dist/esm/adapters/llm/AnthropicProvider.js +0 -31
- package/dist/esm/adapters/llm/AnthropicProvider.js.map +1 -1
- package/dist/esm/adapters/llm/BedrockProvider.js +2 -28
- package/dist/esm/adapters/llm/BedrockProvider.js.map +1 -1
- package/dist/esm/adapters/llm/BrowserAnthropicProvider.js +1 -31
- package/dist/esm/adapters/llm/BrowserAnthropicProvider.js.map +1 -1
- package/dist/esm/adapters/llm/BrowserOpenAIProvider.js +1 -11
- package/dist/esm/adapters/llm/BrowserOpenAIProvider.js.map +1 -1
- package/dist/esm/adapters/llm/MockProvider.js +35 -1
- package/dist/esm/adapters/llm/MockProvider.js.map +1 -1
- package/dist/esm/adapters/llm/OpenAIProvider.js +3 -29
- package/dist/esm/adapters/llm/OpenAIProvider.js.map +1 -1
- package/dist/esm/adapters/memory/agentcore.js +301 -0
- package/dist/esm/adapters/memory/agentcore.js.map +1 -0
- package/dist/esm/adapters/memory/redis.js +283 -0
- package/dist/esm/adapters/memory/redis.js.map +1 -0
- package/dist/esm/core/Agent.js +11 -0
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/index.js +6 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/injection-engine/index.js +0 -54
- package/dist/esm/lib/injection-engine/index.js.map +1 -1
- package/dist/esm/lib/mcp/index.js +9 -0
- package/dist/esm/lib/mcp/index.js.map +1 -0
- package/dist/esm/lib/mcp/mcpClient.js +176 -0
- package/dist/esm/lib/mcp/mcpClient.js.map +1 -0
- package/dist/esm/lib/mcp/mockMcpClient.js +97 -0
- package/dist/esm/lib/mcp/mockMcpClient.js.map +1 -0
- package/dist/esm/lib/mcp/types.js +24 -0
- package/dist/esm/lib/mcp/types.js.map +1 -0
- package/dist/esm/lib/rag/defineRAG.js +0 -18
- package/dist/esm/lib/rag/defineRAG.js.map +1 -1
- package/dist/esm/lib/rag/indexDocuments.js +39 -4
- package/dist/esm/lib/rag/indexDocuments.js.map +1 -1
- package/dist/esm/memory/causal/loadSnapshot.js +1 -1
- package/dist/esm/memory/define.js +0 -14
- package/dist/esm/memory/define.js.map +1 -1
- package/dist/esm/memory/define.types.js +0 -10
- package/dist/esm/memory/define.types.js.map +1 -1
- package/dist/esm/resilience/index.js +0 -44
- package/dist/esm/resilience/index.js.map +1 -1
- package/dist/esm/stream.js +0 -29
- package/dist/esm/stream.js.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/instructions.js +21 -0
- package/dist/instructions.js.map +1 -0
- package/dist/lib/injection-engine/index.js +0 -54
- package/dist/lib/injection-engine/index.js.map +1 -1
- package/dist/lib/instructions/defineInstruction.js +35 -0
- package/dist/lib/instructions/defineInstruction.js.map +1 -0
- package/dist/lib/instructions/evaluator.js +38 -0
- package/dist/lib/instructions/evaluator.js.map +1 -0
- package/dist/lib/instructions/index.js +48 -0
- package/dist/lib/instructions/index.js.map +1 -0
- package/dist/lib/instructions/types.js +22 -0
- package/dist/lib/instructions/types.js.map +1 -0
- package/dist/lib/mcp/index.js +14 -0
- package/dist/lib/mcp/index.js.map +1 -0
- package/dist/lib/mcp/mcpClient.js +180 -0
- package/dist/lib/mcp/mcpClient.js.map +1 -0
- package/dist/lib/mcp/mockMcpClient.js +101 -0
- package/dist/lib/mcp/mockMcpClient.js.map +1 -0
- package/dist/lib/mcp/types.js +25 -0
- package/dist/lib/mcp/types.js.map +1 -0
- package/dist/lib/rag/defineRAG.js +0 -18
- package/dist/lib/rag/defineRAG.js.map +1 -1
- package/dist/lib/rag/indexDocuments.js +39 -4
- package/dist/lib/rag/indexDocuments.js.map +1 -1
- package/dist/memory/causal/loadSnapshot.js +1 -1
- package/dist/memory/conversationHelpers.js +39 -0
- package/dist/memory/conversationHelpers.js.map +1 -0
- package/dist/memory/define.js +0 -14
- package/dist/memory/define.js.map +1 -1
- package/dist/memory/define.types.js +0 -10
- package/dist/memory/define.types.js.map +1 -1
- package/dist/resilience/index.js +0 -44
- package/dist/resilience/index.js.map +1 -1
- package/dist/stream.js +0 -29
- package/dist/stream.js.map +1 -1
- package/dist/types/adapters/llm/AnthropicProvider.d.ts +0 -31
- package/dist/types/adapters/llm/AnthropicProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/BedrockProvider.d.ts +2 -28
- package/dist/types/adapters/llm/BedrockProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/BrowserAnthropicProvider.d.ts +1 -31
- package/dist/types/adapters/llm/BrowserAnthropicProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/BrowserOpenAIProvider.d.ts +1 -11
- package/dist/types/adapters/llm/BrowserOpenAIProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/MockProvider.d.ts +45 -0
- package/dist/types/adapters/llm/MockProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/OpenAIProvider.d.ts +3 -29
- package/dist/types/adapters/llm/OpenAIProvider.d.ts.map +1 -1
- package/dist/types/adapters/memory/agentcore.d.ts +157 -0
- package/dist/types/adapters/memory/agentcore.d.ts.map +1 -0
- package/dist/types/adapters/memory/redis.d.ts +126 -0
- package/dist/types/adapters/memory/redis.d.ts.map +1 -0
- package/dist/types/core/Agent.d.ts +7 -0
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/instructions.d.ts +5 -0
- package/dist/types/instructions.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/index.d.ts +0 -54
- package/dist/types/lib/injection-engine/index.d.ts.map +1 -1
- package/dist/types/lib/instructions/defineInstruction.d.ts +22 -0
- package/dist/types/lib/instructions/defineInstruction.d.ts.map +1 -0
- package/dist/types/lib/instructions/evaluator.d.ts +11 -0
- package/dist/types/lib/instructions/evaluator.d.ts.map +1 -0
- package/dist/types/lib/instructions/index.d.ts +44 -0
- package/dist/types/lib/instructions/index.d.ts.map +1 -0
- package/dist/types/lib/instructions/types.d.ts +100 -0
- package/dist/types/lib/instructions/types.d.ts.map +1 -0
- package/dist/types/lib/mcp/index.d.ts +10 -0
- package/dist/types/lib/mcp/index.d.ts.map +1 -0
- package/dist/types/lib/mcp/mcpClient.d.ts +47 -0
- package/dist/types/lib/mcp/mcpClient.d.ts.map +1 -0
- package/dist/types/lib/mcp/mockMcpClient.d.ts +66 -0
- package/dist/types/lib/mcp/mockMcpClient.d.ts.map +1 -0
- package/dist/types/lib/mcp/types.d.ts +134 -0
- package/dist/types/lib/mcp/types.d.ts.map +1 -0
- package/dist/types/lib/rag/defineRAG.d.ts +18 -21
- package/dist/types/lib/rag/defineRAG.d.ts.map +1 -1
- package/dist/types/lib/rag/indexDocuments.d.ts +30 -1
- package/dist/types/lib/rag/indexDocuments.d.ts.map +1 -1
- package/dist/types/memory/causal/loadSnapshot.d.ts +1 -1
- package/dist/types/memory/conversationHelpers.d.ts +19 -0
- package/dist/types/memory/conversationHelpers.d.ts.map +1 -0
- package/dist/types/memory/define.d.ts +0 -14
- package/dist/types/memory/define.d.ts.map +1 -1
- package/dist/types/memory/define.types.d.ts +2 -12
- package/dist/types/memory/define.types.d.ts.map +1 -1
- package/dist/types/resilience/index.d.ts +0 -44
- package/dist/types/resilience/index.d.ts.map +1 -1
- package/dist/types/stream.d.ts +0 -29
- package/dist/types/stream.d.ts.map +1 -1
- package/package.json +20 -1
package/dist/esm/stream.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -22,7 +22,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
22
22
|
};
|
|
23
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
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.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;
|
|
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;
|
|
26
26
|
// Events — registry, types, payloads
|
|
27
27
|
__exportStar(require("./events/types.js"), exports);
|
|
28
28
|
__exportStar(require("./events/payloads.js"), exports);
|
|
@@ -229,4 +229,11 @@ Object.defineProperty(exports, "identityNamespace", { enumerable: true, get: fun
|
|
|
229
229
|
var index_js_6 = require("./lib/rag/index.js");
|
|
230
230
|
Object.defineProperty(exports, "defineRAG", { enumerable: true, get: function () { return index_js_6.defineRAG; } });
|
|
231
231
|
Object.defineProperty(exports, "indexDocuments", { enumerable: true, get: function () { return index_js_6.indexDocuments; } });
|
|
232
|
+
// MCP — Model Context Protocol client. Connect to MCP servers and
|
|
233
|
+
// expose their tools as agentfootprint Tool[] for `agent.tools(...)`.
|
|
234
|
+
// `@modelcontextprotocol/sdk` is a lazy-required peer-dep (no runtime
|
|
235
|
+
// cost when MCP isn't used).
|
|
236
|
+
var index_js_7 = require("./lib/mcp/index.js");
|
|
237
|
+
Object.defineProperty(exports, "mcpClient", { enumerable: true, get: function () { return index_js_7.mcpClient; } });
|
|
238
|
+
Object.defineProperty(exports, "mockMcpClient", { enumerable: true, get: function () { return index_js_7.mockMcpClient; } });
|
|
232
239
|
//# 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,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* agentfootprint/instructions — public re-export for the Instructions subsystem.
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
__exportStar(require("./lib/instructions/index.js"), exports);
|
|
21
|
+
//# sourceMappingURL=instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,8DAA4C"}
|
|
@@ -5,60 +5,6 @@
|
|
|
5
5
|
* The unifying primitive of agentfootprint context engineering.
|
|
6
6
|
* One `Injection` type. One `InjectionEngine` subflow. N typed sugar
|
|
7
7
|
* factories. See `README.md` in this folder for the full concept.
|
|
8
|
-
*
|
|
9
|
-
* ─── 7-panel design review (2026-04-28) ─────────────────────────────
|
|
10
|
-
*
|
|
11
|
-
* LLM-AI system design ✓ ONE primitive replaces N feature-specific
|
|
12
|
-
* subsystems. Skill, Steering, Instruction,
|
|
13
|
-
* Context (and RAG, Memory, Guardrail)
|
|
14
|
-
* are typed sugar producing the same shape.
|
|
15
|
-
* Engine is shared; observability is shared;
|
|
16
|
-
* Lens chips are shared.
|
|
17
|
-
*
|
|
18
|
-
* Performance ✓ Trigger evaluation O(N) per iteration.
|
|
19
|
-
* Subflow ceremony ~50µs per iteration.
|
|
20
|
-
* Negligible. Active set materialized once,
|
|
21
|
-
* consumed by 3 slot subflows.
|
|
22
|
-
*
|
|
23
|
-
* Scalability ✓ Adding a flavor = adding a sugar factory
|
|
24
|
-
* file. Zero engine change. Library scales
|
|
25
|
-
* to 50+ flavors without bloating the
|
|
26
|
-
* engine. The "narrow waist" pattern.
|
|
27
|
-
*
|
|
28
|
-
* Research alignment ✓ Maps to "Augmented LM" framing
|
|
29
|
-
* (Mialon et al. 2023): every external
|
|
30
|
-
* input is an augmentation; agentfootprint
|
|
31
|
-
* calls them Injections. Factory names
|
|
32
|
-
* preserve research vocabulary (Skill, RAG,
|
|
33
|
-
* Memory, Steering) at the API surface.
|
|
34
|
-
*
|
|
35
|
-
* Flexibility ✓ Discriminated `trigger` union handles
|
|
36
|
-
* always / rule / on-tool-return /
|
|
37
|
-
* llm-activated. New trigger kinds extend
|
|
38
|
-
* cleanly. Multi-slot per Injection covers
|
|
39
|
-
* Skills (system-prompt + tools).
|
|
40
|
-
*
|
|
41
|
-
* Abstraction-modular ✓ Engine = subflow (drill-able). Factories
|
|
42
|
-
* = small files (one per flavor). Slot
|
|
43
|
-
* subflows are unchanged consumers.
|
|
44
|
-
* Textbook narrow-waist architecture.
|
|
45
|
-
*
|
|
46
|
-
* Software engineering ✓ Predicate exceptions caught + reported
|
|
47
|
-
* via `skipped[]`, never propagate. Frozen
|
|
48
|
-
* Injections. Validation in factories.
|
|
49
|
-
* 7-pattern test coverage. Subpath export
|
|
50
|
-
* for tree-shake.
|
|
51
|
-
*
|
|
52
|
-
* Plus footprintjs integration check ✓ — uses existing slot subflow
|
|
53
|
-
* convention (writes activeInjections to scope; slots filter by
|
|
54
|
-
* targeted slot) + ContextRecorder picks up source field zero-change.
|
|
55
|
-
*
|
|
56
|
-
* Plus TypeScript engineer check ✓ — discriminated union, no `any`,
|
|
57
|
-
* frozen returns, exhaustiveness check on trigger kind.
|
|
58
|
-
*
|
|
59
|
-
* ─── 7-pattern test coverage ────────────────────────────────────────
|
|
60
|
-
*
|
|
61
|
-
* See `test/lib/injection-engine/*.test.ts`.
|
|
62
8
|
*/
|
|
63
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
64
10
|
exports.defineFact = exports.defineSteering = exports.defineSkill = exports.defineInstruction = exports.buildInjectionEngineSubflow = exports.evaluateInjections = void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/injection-engine/index.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/injection-engine/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAWH,SAAS;AACT,+CAAoD;AAA3C,kHAAA,kBAAkB,OAAA;AAC3B,mFAG0C;AAFxC,6IAAA,2BAA2B,OAAA;AAI7B,gFAAgF;AAChF,yEAAoG;AAA3F,yHAAA,iBAAiB,OAAA;AAE1B,6DAAkF;AAAzE,6GAAA,WAAW,OAAA;AAEpB,mEAA2F;AAAlF,mHAAA,cAAc,OAAA;AAEvB,2DAA+E;AAAtE,2GAAA,UAAU,OAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* defineInstruction — ergonomic builder for `Instruction`.
|
|
4
|
+
*
|
|
5
|
+
* Pattern: Builder pattern (GoF) for the Strategy interface.
|
|
6
|
+
* Role: Public surface — used by consumers to declare instructions.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* import { defineInstruction } from 'agentfootprint';
|
|
10
|
+
* import type { InstructionContext } from 'agentfootprint';
|
|
11
|
+
*
|
|
12
|
+
* const refundEmpathy = defineInstruction({
|
|
13
|
+
* id: 'refund-empathy',
|
|
14
|
+
* description: 'Calm tone for refund denials.',
|
|
15
|
+
* activeWhen: (ctx) => ctx.lastToolResult?.toolName === 'check_refund'
|
|
16
|
+
* && ctx.lastToolResult.result.includes('denied'),
|
|
17
|
+
* prompt: 'Be empathetic. Do NOT promise refund reversal.',
|
|
18
|
+
* });
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.defineInstruction = void 0;
|
|
22
|
+
function defineInstruction(options) {
|
|
23
|
+
if (!options.id || options.id.trim().length === 0) {
|
|
24
|
+
throw new Error('defineInstruction: `id` is required and must be non-empty.');
|
|
25
|
+
}
|
|
26
|
+
if (options.prompt === undefined
|
|
27
|
+
&& (!options.tools || options.tools.length === 0)) {
|
|
28
|
+
throw new Error(`defineInstruction(${options.id}): instruction must declare at least one of \`prompt\` or \`tools\`.`);
|
|
29
|
+
}
|
|
30
|
+
// Freeze for consumer protection — instructions should be immutable
|
|
31
|
+
// after construction so the agent can cache evaluations.
|
|
32
|
+
return Object.freeze({ ...options });
|
|
33
|
+
}
|
|
34
|
+
exports.defineInstruction = defineInstruction;
|
|
35
|
+
//# sourceMappingURL=defineInstruction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineInstruction.js","sourceRoot":"","sources":["../../../src/lib/instructions/defineInstruction.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAMH,SAAgB,iBAAiB,CAAC,OAAiC;IACjE,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,IACE,OAAO,CAAC,MAAM,KAAK,SAAS;WACzB,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EACjD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,qBAAqB,OAAO,CAAC,EAAE,sEAAsE,CACtG,CAAC;IACJ,CAAC;IACD,oEAAoE;IACpE,yDAAyD;IACzD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,CAAgB,CAAC;AACtD,CAAC;AAfD,8CAeC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Instruction evaluator — runs the `activeWhen` predicates and
|
|
4
|
+
* returns the active set + any skipped predicates.
|
|
5
|
+
*
|
|
6
|
+
* Pattern: Pure function. Stateless.
|
|
7
|
+
* Role: Internal helper used by Agent during pre-LLM stage.
|
|
8
|
+
* Emits: N/A — caller handles emit + observability.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.evaluateInstructions = void 0;
|
|
12
|
+
function evaluateInstructions(instructions, ctx) {
|
|
13
|
+
const active = [];
|
|
14
|
+
const skipped = [];
|
|
15
|
+
for (const inst of instructions) {
|
|
16
|
+
if (!inst.activeWhen) {
|
|
17
|
+
// No predicate → always active (unconditional injection).
|
|
18
|
+
active.push(inst);
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
let matched = false;
|
|
22
|
+
try {
|
|
23
|
+
matched = inst.activeWhen(ctx);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
skipped.push({
|
|
27
|
+
id: inst.id,
|
|
28
|
+
error: err instanceof Error ? err.message : String(err),
|
|
29
|
+
});
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (matched)
|
|
33
|
+
active.push(inst);
|
|
34
|
+
}
|
|
35
|
+
return { active, skipped };
|
|
36
|
+
}
|
|
37
|
+
exports.evaluateInstructions = evaluateInstructions;
|
|
38
|
+
//# sourceMappingURL=evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../src/lib/instructions/evaluator.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAQH,SAAgB,oBAAoB,CAClC,YAAoC,EACpC,GAAuB;IAEvB,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAoC,EAAE,CAAC;IAEpD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,0DAA0D;YAC1D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AA3BD,oDA2BC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Instructions — declarative rule-based system-prompt injection.
|
|
4
|
+
*
|
|
5
|
+
* Public API for the v2 Instructions subsystem. See `types.ts` for the
|
|
6
|
+
* full interface + the unified context-engineering model placement.
|
|
7
|
+
*
|
|
8
|
+
* ─── 7-panel design review (2026-04-28) ─────────────────────────────
|
|
9
|
+
*
|
|
10
|
+
* LLM-AI system design ✓ Maps cleanly to the unified context-
|
|
11
|
+
* engineering model: slot=system-prompt
|
|
12
|
+
* (+optional tools), role=system, timing=
|
|
13
|
+
* per-iteration, decision=rule.
|
|
14
|
+
* Performance ✓ Predicates run once per iteration (not
|
|
15
|
+
* per token / per event). O(N) in number
|
|
16
|
+
* of instructions; typical N ≤ 20.
|
|
17
|
+
* Scalability ✓ Stateless evaluator; many concurrent
|
|
18
|
+
* agents share the same instruction list
|
|
19
|
+
* via Object.freeze.
|
|
20
|
+
* Research alignment ✓ Mirrors v1 AgentInstruction's `activeWhen`
|
|
21
|
+
* shape (origin/main `c6e11d0`) but drops
|
|
22
|
+
* `onToolResult`, `safety`, decision-scope
|
|
23
|
+
* wrapping for v2 simplicity. Equivalent
|
|
24
|
+
* tool-result-driven behavior is expressed
|
|
25
|
+
* via `activeWhen: (ctx) =>
|
|
26
|
+
* ctx.lastToolResult?.toolName === 'X'`.
|
|
27
|
+
* Flexibility ✓ Same Instruction can be active across
|
|
28
|
+
* multiple iterations; can inject tools
|
|
29
|
+
* in addition to prompt; predicates can
|
|
30
|
+
* inspect history + last tool result.
|
|
31
|
+
* Abstraction-modular ✓ Three small files: types, builder,
|
|
32
|
+
* evaluator. Agent integration is one
|
|
33
|
+
* call into `evaluateInstructions()`.
|
|
34
|
+
* Software engineering ✓ Predicate errors are caught + surfaced
|
|
35
|
+
* (no crash). Frozen instructions prevent
|
|
36
|
+
* mutation. 7-pattern test coverage.
|
|
37
|
+
*
|
|
38
|
+
* ─── 7-pattern test coverage ────────────────────────────────────────
|
|
39
|
+
*
|
|
40
|
+
* See `test/lib/instructions/*.test.ts`.
|
|
41
|
+
*/
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.evaluateInstructions = exports.defineInstruction = void 0;
|
|
44
|
+
var defineInstruction_js_1 = require("./defineInstruction.js");
|
|
45
|
+
Object.defineProperty(exports, "defineInstruction", { enumerable: true, get: function () { return defineInstruction_js_1.defineInstruction; } });
|
|
46
|
+
var evaluator_js_1 = require("./evaluator.js");
|
|
47
|
+
Object.defineProperty(exports, "evaluateInstructions", { enumerable: true, get: function () { return evaluator_js_1.evaluateInstructions; } });
|
|
48
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/instructions/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;;;AAEH,+DAGgC;AAF9B,yHAAA,iBAAiB,OAAA;AAInB,+CAEwB;AADtB,oHAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Instructions — types.
|
|
4
|
+
*
|
|
5
|
+
* An Instruction is a declarative rule for conditional system-prompt
|
|
6
|
+
* injection. The agent evaluates each Instruction's `activeWhen`
|
|
7
|
+
* predicate at the start of every iteration; matching instructions'
|
|
8
|
+
* `prompt` text is prepended to the system prompt for that iteration.
|
|
9
|
+
*
|
|
10
|
+
* This is the rule-based flavor of the unified context-engineering
|
|
11
|
+
* model: slot=system-prompt, role=system, timing=per-iteration,
|
|
12
|
+
* decision=rule. (Compare with Skills: timing=on-activation,
|
|
13
|
+
* decision=LLM-guided.)
|
|
14
|
+
*
|
|
15
|
+
* Pattern: Strategy (GoF) — each Instruction is a strategy for
|
|
16
|
+
* "should I add this prompt to the next iteration?"
|
|
17
|
+
* Role: Consumer-facing shape. Agent.create(...).instruction(...).
|
|
18
|
+
* Emits: `agentfootprint.context.injected` with source='instruction'
|
|
19
|
+
* when an instruction activates.
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/instructions/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mockMcpClient = exports.mcpClient = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* MCP — Model Context Protocol client integration. Connect to an MCP
|
|
6
|
+
* server, register its tools on your Agent. Server-side support is
|
|
7
|
+
* separate (consumer exposes their agent as an MCP tool — different
|
|
8
|
+
* use case, not yet shipped).
|
|
9
|
+
*/
|
|
10
|
+
var mcpClient_js_1 = require("./mcpClient.js");
|
|
11
|
+
Object.defineProperty(exports, "mcpClient", { enumerable: true, get: function () { return mcpClient_js_1.mcpClient; } });
|
|
12
|
+
var mockMcpClient_js_1 = require("./mockMcpClient.js");
|
|
13
|
+
Object.defineProperty(exports, "mockMcpClient", { enumerable: true, get: function () { return mockMcpClient_js_1.mockMcpClient; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/mcp/index.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,+CAA2C;AAAlC,yGAAA,SAAS,OAAA;AAClB,uDAAgG;AAAvF,iHAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* mcpClient — connect to an MCP server, expose its tools to your Agent.
|
|
4
|
+
*
|
|
5
|
+
* const slack = await mcpClient({
|
|
6
|
+
* name: 'slack',
|
|
7
|
+
* transport: { transport: 'stdio', command: 'npx', args: ['@example/slack-mcp'] },
|
|
8
|
+
* });
|
|
9
|
+
*
|
|
10
|
+
* const tools = await slack.tools(); // → readonly Tool[]
|
|
11
|
+
* const agent = Agent.create({ ... }).tools(tools).build();
|
|
12
|
+
*
|
|
13
|
+
* // ...
|
|
14
|
+
*
|
|
15
|
+
* await slack.close();
|
|
16
|
+
*
|
|
17
|
+
* Pattern: Adapter (GoF) — translates MCP `listTools()` / `callTool()`
|
|
18
|
+
* into agentfootprint's `Tool` interface (schema + execute).
|
|
19
|
+
* Each MCP tool becomes ONE agentfootprint Tool. The agent's
|
|
20
|
+
* existing tool-call handler invokes `client.callTool()`
|
|
21
|
+
* inside the wrapped `execute`.
|
|
22
|
+
*
|
|
23
|
+
* Role: Layer-3 integration. Sits next to `defineTool` — same
|
|
24
|
+
* shape, different source. Once tools land on the agent,
|
|
25
|
+
* the rest of the library doesn't know they came from MCP.
|
|
26
|
+
*
|
|
27
|
+
* Emits: N/A — wrapped tools emit the standard
|
|
28
|
+
* `agentfootprint.stream.tool_start` / `tool_end` events
|
|
29
|
+
* when the agent calls them. Add `name: '<mcp-server>'` to
|
|
30
|
+
* `McpClientOptions` so observability surfaces can group
|
|
31
|
+
* tool calls by server.
|
|
32
|
+
*
|
|
33
|
+
* Lazy-require pattern: the `@modelcontextprotocol/sdk` peer-dep
|
|
34
|
+
* loads only when a consumer actually constructs a client. Tests
|
|
35
|
+
* inject `_client` and skip the import path entirely.
|
|
36
|
+
*/
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.mcpClient = void 0;
|
|
39
|
+
// Version-less identity. The MCP `clientInfo` field is informational
|
|
40
|
+
// (server logs it); a hardcoded number drifts every release. Consumers
|
|
41
|
+
// who care about wire-level identity pass `clientInfo` explicitly.
|
|
42
|
+
const DEFAULT_CLIENT_INFO = {
|
|
43
|
+
name: 'agentfootprint',
|
|
44
|
+
version: '0.0.0',
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Connect to an MCP server. Returns an `McpClient` that exposes the
|
|
48
|
+
* server's tools as agentfootprint `Tool[]` and a `close()` to tear
|
|
49
|
+
* down the transport.
|
|
50
|
+
*
|
|
51
|
+
* @throws when `@modelcontextprotocol/sdk` is not installed (see
|
|
52
|
+
* error message for `npm install` hint), or when the transport
|
|
53
|
+
* fails to connect.
|
|
54
|
+
*/
|
|
55
|
+
async function mcpClient(opts) {
|
|
56
|
+
const name = opts.name ?? 'mcp';
|
|
57
|
+
const sdk = opts._client ?? (await resolveClient(opts.transport, opts.clientInfo));
|
|
58
|
+
// Tool cache so consumers calling `.tools()` more than once don't
|
|
59
|
+
// hammer the server. `.refresh()` invalidates it.
|
|
60
|
+
let cache = null;
|
|
61
|
+
let closed = false;
|
|
62
|
+
const ensureOpen = (op) => {
|
|
63
|
+
if (closed) {
|
|
64
|
+
throw new Error(`mcpClient[${name}].${op}() called after close(). Construct a new client to reconnect.`);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const buildTools = async () => {
|
|
68
|
+
const listed = await sdk.listTools();
|
|
69
|
+
return listed.tools.map((t) => wrapMcpTool(name, sdk, t, opts.signal));
|
|
70
|
+
};
|
|
71
|
+
return {
|
|
72
|
+
name,
|
|
73
|
+
async tools() {
|
|
74
|
+
ensureOpen('tools');
|
|
75
|
+
if (!cache)
|
|
76
|
+
cache = await buildTools();
|
|
77
|
+
return cache;
|
|
78
|
+
},
|
|
79
|
+
async refresh() {
|
|
80
|
+
ensureOpen('refresh');
|
|
81
|
+
cache = await buildTools();
|
|
82
|
+
return cache;
|
|
83
|
+
},
|
|
84
|
+
async close() {
|
|
85
|
+
if (closed)
|
|
86
|
+
return;
|
|
87
|
+
closed = true;
|
|
88
|
+
cache = null;
|
|
89
|
+
await sdk.close();
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
exports.mcpClient = mcpClient;
|
|
94
|
+
// ─── SDK construction (lazy require) ───────────────────────────────
|
|
95
|
+
async function resolveClient(transport, clientInfo) {
|
|
96
|
+
let mod;
|
|
97
|
+
try {
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
99
|
+
mod = require('@modelcontextprotocol/sdk/client/index.js');
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
throw new Error('mcpClient requires @modelcontextprotocol/sdk.\n' +
|
|
103
|
+
' Install: npm install @modelcontextprotocol/sdk\n' +
|
|
104
|
+
' Or pass `_client` for test injection.');
|
|
105
|
+
}
|
|
106
|
+
const client = new mod.Client(clientInfo ?? DEFAULT_CLIENT_INFO, {
|
|
107
|
+
capabilities: {},
|
|
108
|
+
});
|
|
109
|
+
const transportImpl = await buildTransport(transport);
|
|
110
|
+
await client.connect(transportImpl);
|
|
111
|
+
return client;
|
|
112
|
+
}
|
|
113
|
+
async function buildTransport(t) {
|
|
114
|
+
if (t.transport === 'stdio') {
|
|
115
|
+
let stdioMod;
|
|
116
|
+
try {
|
|
117
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
118
|
+
stdioMod = require('@modelcontextprotocol/sdk/client/stdio.js');
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
throw new Error('mcpClient(stdio) requires @modelcontextprotocol/sdk/client/stdio.js — ' +
|
|
122
|
+
'check that @modelcontextprotocol/sdk is installed at the latest version.');
|
|
123
|
+
}
|
|
124
|
+
return new stdioMod.StdioClientTransport({
|
|
125
|
+
command: t.command,
|
|
126
|
+
args: t.args ? [...t.args] : [],
|
|
127
|
+
...(t.env && { env: { ...t.env } }),
|
|
128
|
+
...(t.cwd !== undefined && { cwd: t.cwd }),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
// http transport
|
|
132
|
+
let httpMod;
|
|
133
|
+
try {
|
|
134
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
135
|
+
httpMod = require('@modelcontextprotocol/sdk/client/streamableHttp.js');
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
throw new Error('mcpClient(http) requires @modelcontextprotocol/sdk/client/streamableHttp.js — ' +
|
|
139
|
+
'check that @modelcontextprotocol/sdk is installed at the latest version.');
|
|
140
|
+
}
|
|
141
|
+
return new httpMod.StreamableHTTPClientTransport(new URL(t.url), {
|
|
142
|
+
...(t.headers && { requestInit: { headers: { ...t.headers } } }),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
// ─── Tool wrapping ─────────────────────────────────────────────────
|
|
146
|
+
function wrapMcpTool(serverName, sdk, mcp, signal) {
|
|
147
|
+
const tool = {
|
|
148
|
+
schema: {
|
|
149
|
+
name: mcp.name,
|
|
150
|
+
description: mcp.description ?? `MCP tool: ${mcp.name}`,
|
|
151
|
+
inputSchema: mcp.inputSchema,
|
|
152
|
+
},
|
|
153
|
+
execute: async (args) => {
|
|
154
|
+
// The agent passes args as `unknown` per Tool contract. MCP
|
|
155
|
+
// expects a JSON object — non-object inputs become `{}` rather
|
|
156
|
+
// than failing the SDK call.
|
|
157
|
+
const argsObj = args !== null && typeof args === 'object' && !Array.isArray(args)
|
|
158
|
+
? args
|
|
159
|
+
: {};
|
|
160
|
+
const result = await sdk.callTool({
|
|
161
|
+
name: mcp.name,
|
|
162
|
+
arguments: argsObj,
|
|
163
|
+
...(signal && { signal }),
|
|
164
|
+
});
|
|
165
|
+
// MCP returns content blocks. We concatenate text blocks into
|
|
166
|
+
// a single string for the agent's tool-result event payload.
|
|
167
|
+
// Non-text blocks (images, resources) are summarized with their
|
|
168
|
+
// type — full multi-modal mapping is a future-release follow-up.
|
|
169
|
+
const text = result.content
|
|
170
|
+
.map((c) => (c.type === 'text' && c.text ? c.text : `[${c.type}]`))
|
|
171
|
+
.join('\n');
|
|
172
|
+
if (result.isError) {
|
|
173
|
+
throw new Error(`MCP tool '${mcp.name}' (server '${serverName}') returned an error: ${text}`);
|
|
174
|
+
}
|
|
175
|
+
return text;
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
return tool;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=mcpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpClient.js","sourceRoot":"","sources":["../../../src/lib/mcp/mcpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* mockMcpClient — in-memory MCP client for development and tests.
|
|
4
|
+
*
|
|
5
|
+
* const slack = mockMcpClient({
|
|
6
|
+
* tools: [
|
|
7
|
+
* {
|
|
8
|
+
* name: 'send_message',
|
|
9
|
+
* description: 'Post a message to a channel',
|
|
10
|
+
* inputSchema: { type: 'object' },
|
|
11
|
+
* handler: async ({ text }) => `Posted: ${text}`,
|
|
12
|
+
* },
|
|
13
|
+
* ],
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* const agent = Agent.create({ provider: mock({ reply: 'ok' }) })
|
|
17
|
+
* .tools(await slack.tools())
|
|
18
|
+
* .build();
|
|
19
|
+
*
|
|
20
|
+
* Pattern: Adapter (GoF) — produces an `McpClient` with the same shape
|
|
21
|
+
* as `mcpClient(opts)` but driven by an in-memory tool table
|
|
22
|
+
* instead of the MCP SDK + transport. Drop-in for development:
|
|
23
|
+
* start with `mockMcpClient`, swap to `mcpClient` once the
|
|
24
|
+
* real server is ready.
|
|
25
|
+
*
|
|
26
|
+
* Why public: `mcpClient`'s `_client` injection is `@internal` because
|
|
27
|
+
* the SDK shape isn't a stable public surface. `mockMcpClient` exposes
|
|
28
|
+
* a curated tool-handler shape that's tied to OUR Tool contract instead
|
|
29
|
+
* — stable, documented, and the right level of abstraction for
|
|
30
|
+
* mock-first development.
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.mockMcpClient = void 0;
|
|
34
|
+
/**
|
|
35
|
+
* Build an in-memory `McpClient`. Useful when you want to develop
|
|
36
|
+
* against MCP semantics without spawning subprocesses, hitting the
|
|
37
|
+
* network, or installing `@modelcontextprotocol/sdk`. Same `McpClient`
|
|
38
|
+
* shape as `mcpClient(opts)` — code that consumes one accepts the other.
|
|
39
|
+
*/
|
|
40
|
+
function mockMcpClient(options) {
|
|
41
|
+
const name = options.name ?? 'mock-mcp';
|
|
42
|
+
const toolMap = new Map(options.tools.map((t) => [t.name, t]));
|
|
43
|
+
let cache = null;
|
|
44
|
+
let closed = false;
|
|
45
|
+
const ensureOpen = (op) => {
|
|
46
|
+
if (closed) {
|
|
47
|
+
throw new Error(`mockMcpClient[${name}].${op}() called after close(). Construct a new client to reuse.`);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const buildTools = () => options.tools.map((mcp) => wrapMockTool(name, toolMap, mcp));
|
|
51
|
+
return {
|
|
52
|
+
name,
|
|
53
|
+
async tools() {
|
|
54
|
+
ensureOpen('tools');
|
|
55
|
+
if (!cache)
|
|
56
|
+
cache = buildTools();
|
|
57
|
+
return cache;
|
|
58
|
+
},
|
|
59
|
+
async refresh() {
|
|
60
|
+
ensureOpen('refresh');
|
|
61
|
+
cache = buildTools();
|
|
62
|
+
return cache;
|
|
63
|
+
},
|
|
64
|
+
async close() {
|
|
65
|
+
if (closed)
|
|
66
|
+
return;
|
|
67
|
+
closed = true;
|
|
68
|
+
cache = null;
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
exports.mockMcpClient = mockMcpClient;
|
|
73
|
+
function wrapMockTool(serverName, toolMap, mcp) {
|
|
74
|
+
const tool = {
|
|
75
|
+
schema: {
|
|
76
|
+
name: mcp.name,
|
|
77
|
+
description: mcp.description ?? `Mock MCP tool: ${mcp.name}`,
|
|
78
|
+
inputSchema: mcp.inputSchema,
|
|
79
|
+
},
|
|
80
|
+
execute: async (args) => {
|
|
81
|
+
const argsObj = args !== null && typeof args === 'object' && !Array.isArray(args)
|
|
82
|
+
? args
|
|
83
|
+
: {};
|
|
84
|
+
// Look up by name at call time so mid-test handler swaps via a
|
|
85
|
+
// mutable Map could be supported later. For now `toolMap` is
|
|
86
|
+
// built once at factory time.
|
|
87
|
+
const handler = toolMap.get(mcp.name)?.handler;
|
|
88
|
+
if (!handler)
|
|
89
|
+
return '[mock result]';
|
|
90
|
+
try {
|
|
91
|
+
return await handler(argsObj);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
95
|
+
throw new Error(`Mock MCP tool '${mcp.name}' (server '${serverName}') threw: ${msg}`);
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
return tool;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=mockMcpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockMcpClient.js","sourceRoot":"","sources":["../../../src/lib/mcp/mockMcpClient.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;;AAkCH;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,OAA6B;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAsB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpF,IAAI,KAAK,GAA2B,IAAI,CAAC;IACzC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,UAAU,GAAG,CAAC,EAAU,EAAQ,EAAE;QACtC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,iBAAiB,IAAI,KAAK,EAAE,2DAA2D,CACxF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAoB,EAAE,CACvC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAE/D,OAAO;QACL,IAAI;QACJ,KAAK,CAAC,KAAK;YACT,UAAU,CAAC,OAAO,CAAC,CAAC;YACpB,IAAI,CAAC,KAAK;gBAAE,KAAK,GAAG,UAAU,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,OAAO;YACX,UAAU,CAAC,SAAS,CAAC,CAAC;YACtB,KAAK,GAAG,UAAU,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,KAAK;YACT,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,GAAG,IAAI,CAAC;YACd,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC;AApCD,sCAoCC;AAED,SAAS,YAAY,CACnB,UAAkB,EAClB,OAAyC,EACzC,GAAgB;IAEhB,MAAM,IAAI,GAAS;QACjB,MAAM,EAAE;YACN,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,kBAAkB,GAAG,CAAC,IAAI,EAAE;YAC5D,WAAW,EAAE,GAAG,CAAC,WAAW;SAC7B;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,OAAO,GACX,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC/D,CAAC,CAAE,IAAgC;gBACnC,CAAC,CAAC,EAAE,CAAC;YACT,+DAA+D;YAC/D,6DAA6D;YAC7D,8BAA8B;YAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;YAC/C,IAAI,CAAC,OAAO;gBAAE,OAAO,eAAe,CAAC;YACrC,IAAI,CAAC;gBACH,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,IAAI,cAAc,UAAU,aAAa,GAAG,EAAE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;KACF,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC"}
|