@executioncontrolprotocol/runtime 0.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/dist/engine/context-loader.d.ts +31 -0
- package/dist/engine/context-loader.d.ts.map +1 -0
- package/dist/engine/context-loader.js +90 -0
- package/dist/engine/context-loader.js.map +1 -0
- package/dist/engine/index.d.ts +6 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +6 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/runner.d.ts +92 -0
- package/dist/engine/runner.d.ts.map +1 -0
- package/dist/engine/runner.js +852 -0
- package/dist/engine/runner.js.map +1 -0
- package/dist/engine/schema-validator.d.ts +32 -0
- package/dist/engine/schema-validator.d.ts.map +1 -0
- package/dist/engine/schema-validator.js +69 -0
- package/dist/engine/schema-validator.js.map +1 -0
- package/dist/engine/system-config-loader.d.ts +39 -0
- package/dist/engine/system-config-loader.d.ts.map +1 -0
- package/dist/engine/system-config-loader.js +80 -0
- package/dist/engine/system-config-loader.js.map +1 -0
- package/dist/engine/types.d.ts +324 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +10 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/evals/index.d.ts +3 -0
- package/dist/evals/index.d.ts.map +1 -0
- package/dist/evals/index.js +3 -0
- package/dist/evals/index.js.map +1 -0
- package/dist/evals/scorer.d.ts +23 -0
- package/dist/evals/scorer.d.ts.map +1 -0
- package/dist/evals/scorer.js +133 -0
- package/dist/evals/scorer.js.map +1 -0
- package/dist/evals/types.d.ts +128 -0
- package/dist/evals/types.d.ts.map +1 -0
- package/dist/evals/types.js +11 -0
- package/dist/evals/types.js.map +1 -0
- package/dist/extensions/builtin.d.ts +44 -0
- package/dist/extensions/builtin.d.ts.map +1 -0
- package/dist/extensions/builtin.js +66 -0
- package/dist/extensions/builtin.js.map +1 -0
- package/dist/extensions/index.d.ts +4 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +4 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/progress-loggers/file-logger.d.ts +27 -0
- package/dist/extensions/progress-loggers/file-logger.d.ts.map +1 -0
- package/dist/extensions/progress-loggers/file-logger.js +54 -0
- package/dist/extensions/progress-loggers/file-logger.js.map +1 -0
- package/dist/extensions/registry.d.ts +74 -0
- package/dist/extensions/registry.d.ts.map +1 -0
- package/dist/extensions/registry.js +126 -0
- package/dist/extensions/registry.js.map +1 -0
- package/dist/extensions/types.d.ts +78 -0
- package/dist/extensions/types.d.ts.map +1 -0
- package/dist/extensions/types.js +7 -0
- package/dist/extensions/types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/mounts/hydrator.d.ts +46 -0
- package/dist/mounts/hydrator.d.ts.map +1 -0
- package/dist/mounts/hydrator.js +142 -0
- package/dist/mounts/hydrator.js.map +1 -0
- package/dist/mounts/index.d.ts +4 -0
- package/dist/mounts/index.d.ts.map +1 -0
- package/dist/mounts/index.js +4 -0
- package/dist/mounts/index.js.map +1 -0
- package/dist/mounts/interpolation.d.ts +33 -0
- package/dist/mounts/interpolation.d.ts.map +1 -0
- package/dist/mounts/interpolation.js +59 -0
- package/dist/mounts/interpolation.js.map +1 -0
- package/dist/mounts/types.d.ts +80 -0
- package/dist/mounts/types.d.ts.map +1 -0
- package/dist/mounts/types.js +10 -0
- package/dist/mounts/types.js.map +1 -0
- package/dist/policies/enforcer.d.ts +23 -0
- package/dist/policies/enforcer.d.ts.map +1 -0
- package/dist/policies/enforcer.js +111 -0
- package/dist/policies/enforcer.js.map +1 -0
- package/dist/policies/index.d.ts +3 -0
- package/dist/policies/index.d.ts.map +1 -0
- package/dist/policies/index.js +3 -0
- package/dist/policies/index.js.map +1 -0
- package/dist/policies/types.d.ts +87 -0
- package/dist/policies/types.d.ts.map +1 -0
- package/dist/policies/types.js +11 -0
- package/dist/policies/types.js.map +1 -0
- package/dist/protocols/a2a/a2a-transport.d.ts +40 -0
- package/dist/protocols/a2a/a2a-transport.d.ts.map +1 -0
- package/dist/protocols/a2a/a2a-transport.js +212 -0
- package/dist/protocols/a2a/a2a-transport.js.map +1 -0
- package/dist/protocols/a2a/index.d.ts +3 -0
- package/dist/protocols/a2a/index.d.ts.map +1 -0
- package/dist/protocols/a2a/index.js +2 -0
- package/dist/protocols/a2a/index.js.map +1 -0
- package/dist/protocols/agent-transport.d.ts +101 -0
- package/dist/protocols/agent-transport.d.ts.map +1 -0
- package/dist/protocols/agent-transport.js +11 -0
- package/dist/protocols/agent-transport.js.map +1 -0
- package/dist/protocols/index.d.ts +5 -0
- package/dist/protocols/index.d.ts.map +1 -0
- package/dist/protocols/index.js +5 -0
- package/dist/protocols/index.js.map +1 -0
- package/dist/protocols/mcp/index.d.ts +2 -0
- package/dist/protocols/mcp/index.d.ts.map +1 -0
- package/dist/protocols/mcp/index.js +2 -0
- package/dist/protocols/mcp/index.js.map +1 -0
- package/dist/protocols/mcp/mcp-tool-invoker.d.ts +30 -0
- package/dist/protocols/mcp/mcp-tool-invoker.d.ts.map +1 -0
- package/dist/protocols/mcp/mcp-tool-invoker.js +121 -0
- package/dist/protocols/mcp/mcp-tool-invoker.js.map +1 -0
- package/dist/protocols/tool-invoker.d.ts +91 -0
- package/dist/protocols/tool-invoker.d.ts.map +1 -0
- package/dist/protocols/tool-invoker.js +11 -0
- package/dist/protocols/tool-invoker.js.map +1 -0
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +4 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/model-provider.d.ts +132 -0
- package/dist/providers/model-provider.d.ts.map +1 -0
- package/dist/providers/model-provider.js +10 -0
- package/dist/providers/model-provider.js.map +1 -0
- package/dist/providers/ollama/index.d.ts +3 -0
- package/dist/providers/ollama/index.d.ts.map +1 -0
- package/dist/providers/ollama/index.js +2 -0
- package/dist/providers/ollama/index.js.map +1 -0
- package/dist/providers/ollama/ollama-provider.d.ts +41 -0
- package/dist/providers/ollama/ollama-provider.d.ts.map +1 -0
- package/dist/providers/ollama/ollama-provider.js +113 -0
- package/dist/providers/ollama/ollama-provider.js.map +1 -0
- package/dist/providers/openai/index.d.ts +3 -0
- package/dist/providers/openai/index.d.ts.map +1 -0
- package/dist/providers/openai/index.js +2 -0
- package/dist/providers/openai/index.js.map +1 -0
- package/dist/providers/openai/openai-provider.d.ts +41 -0
- package/dist/providers/openai/openai-provider.d.ts.map +1 -0
- package/dist/providers/openai/openai-provider.js +150 -0
- package/dist/providers/openai/openai-provider.js.map +1 -0
- package/dist/testing/cassette.d.ts +88 -0
- package/dist/testing/cassette.d.ts.map +1 -0
- package/dist/testing/cassette.js +123 -0
- package/dist/testing/cassette.js.map +1 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-agent-transport.d.ts +49 -0
- package/dist/testing/mock-agent-transport.d.ts.map +1 -0
- package/dist/testing/mock-agent-transport.js +71 -0
- package/dist/testing/mock-agent-transport.js.map +1 -0
- package/dist/testing/mock-model-provider.d.ts +69 -0
- package/dist/testing/mock-model-provider.d.ts.map +1 -0
- package/dist/testing/mock-model-provider.js +92 -0
- package/dist/testing/mock-model-provider.js.map +1 -0
- package/dist/testing/mock-tool-invoker.d.ts +65 -0
- package/dist/testing/mock-tool-invoker.d.ts.map +1 -0
- package/dist/testing/mock-tool-invoker.js +85 -0
- package/dist/testing/mock-tool-invoker.js.map +1 -0
- package/dist/tracing/collector.d.ts +75 -0
- package/dist/tracing/collector.d.ts.map +1 -0
- package/dist/tracing/collector.js +106 -0
- package/dist/tracing/collector.js.map +1 -0
- package/dist/tracing/exporters/console.d.ts +17 -0
- package/dist/tracing/exporters/console.d.ts.map +1 -0
- package/dist/tracing/exporters/console.js +76 -0
- package/dist/tracing/exporters/console.js.map +1 -0
- package/dist/tracing/exporters/index.d.ts +4 -0
- package/dist/tracing/exporters/index.d.ts.map +1 -0
- package/dist/tracing/exporters/index.js +3 -0
- package/dist/tracing/exporters/index.js.map +1 -0
- package/dist/tracing/exporters/json-file.d.ts +30 -0
- package/dist/tracing/exporters/json-file.d.ts.map +1 -0
- package/dist/tracing/exporters/json-file.js +28 -0
- package/dist/tracing/exporters/json-file.js.map +1 -0
- package/dist/tracing/formatter.d.ts +16 -0
- package/dist/tracing/formatter.d.ts.map +1 -0
- package/dist/tracing/formatter.js +81 -0
- package/dist/tracing/formatter.js.map +1 -0
- package/dist/tracing/graph.d.ts +17 -0
- package/dist/tracing/graph.d.ts.map +1 -0
- package/dist/tracing/graph.js +116 -0
- package/dist/tracing/graph.js.map +1 -0
- package/dist/tracing/index.d.ts +6 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +6 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/types.d.ts +124 -0
- package/dist/tracing/types.d.ts.map +1 -0
- package/dist/tracing/types.js +11 -0
- package/dist/tracing/types.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock agent transport for deterministic testing.
|
|
3
|
+
*
|
|
4
|
+
* Pre-programmed delegation results keyed by executor name.
|
|
5
|
+
*
|
|
6
|
+
* @category Testing
|
|
7
|
+
*/
|
|
8
|
+
import type { AgentTransport, AgentRef, AgentCapabilities, DelegatedTask, DelegationResult } from "../protocols/agent-transport.js";
|
|
9
|
+
/**
|
|
10
|
+
* A pre-programmed agent response for delegation.
|
|
11
|
+
*
|
|
12
|
+
* @category Testing
|
|
13
|
+
*/
|
|
14
|
+
export interface MockAgentResponse {
|
|
15
|
+
output: Record<string, unknown>;
|
|
16
|
+
success?: boolean;
|
|
17
|
+
error?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A recorded delegation made to the mock transport.
|
|
21
|
+
*
|
|
22
|
+
* @category Testing
|
|
23
|
+
*/
|
|
24
|
+
export interface RecordedDelegation {
|
|
25
|
+
agent: AgentRef;
|
|
26
|
+
task: DelegatedTask;
|
|
27
|
+
timestamp: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Mock implementation of {@link AgentTransport} for unit testing.
|
|
31
|
+
*
|
|
32
|
+
* @category Testing
|
|
33
|
+
*/
|
|
34
|
+
export declare class MockAgentTransport implements AgentTransport {
|
|
35
|
+
readonly name = "mock-agent-transport";
|
|
36
|
+
private responses;
|
|
37
|
+
private callIndices;
|
|
38
|
+
readonly delegations: RecordedDelegation[];
|
|
39
|
+
/**
|
|
40
|
+
* Register a response for a specific executor name.
|
|
41
|
+
* Multiple responses are consumed in FIFO order.
|
|
42
|
+
*/
|
|
43
|
+
addResponse(executorName: string, response: MockAgentResponse): this;
|
|
44
|
+
capabilities(agent: AgentRef): Promise<AgentCapabilities>;
|
|
45
|
+
delegate(agent: AgentRef, task: DelegatedTask): Promise<DelegationResult>;
|
|
46
|
+
close(): Promise<void>;
|
|
47
|
+
reset(): void;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=mock-agent-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-agent-transport.d.ts","sourceRoot":"","sources":["../../src/testing/mock-agent-transport.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,QAAQ,EACR,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EACjB,MAAM,iCAAiC,CAAC;AAEzC;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,IAAI,0BAA0B;IAEvC,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,WAAW,CAA6B;IAChD,QAAQ,CAAC,WAAW,EAAE,kBAAkB,EAAE,CAAM;IAEhD;;;OAGG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAQ9D,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQzD,QAAQ,CACZ,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,gBAAgB,CAAC;IAgCtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAE5B,KAAK,IAAI,IAAI;CAKd"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock agent transport for deterministic testing.
|
|
3
|
+
*
|
|
4
|
+
* Pre-programmed delegation results keyed by executor name.
|
|
5
|
+
*
|
|
6
|
+
* @category Testing
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Mock implementation of {@link AgentTransport} for unit testing.
|
|
10
|
+
*
|
|
11
|
+
* @category Testing
|
|
12
|
+
*/
|
|
13
|
+
export class MockAgentTransport {
|
|
14
|
+
name = "mock-agent-transport";
|
|
15
|
+
responses = new Map();
|
|
16
|
+
callIndices = new Map();
|
|
17
|
+
delegations = [];
|
|
18
|
+
/**
|
|
19
|
+
* Register a response for a specific executor name.
|
|
20
|
+
* Multiple responses are consumed in FIFO order.
|
|
21
|
+
*/
|
|
22
|
+
addResponse(executorName, response) {
|
|
23
|
+
if (!this.responses.has(executorName)) {
|
|
24
|
+
this.responses.set(executorName, []);
|
|
25
|
+
}
|
|
26
|
+
this.responses.get(executorName).push(response);
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
async capabilities(agent) {
|
|
30
|
+
return {
|
|
31
|
+
name: agent.name,
|
|
32
|
+
skills: ["mock-skill"],
|
|
33
|
+
supportsStreaming: false,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
async delegate(agent, task) {
|
|
37
|
+
this.delegations.push({
|
|
38
|
+
agent,
|
|
39
|
+
task,
|
|
40
|
+
timestamp: new Date().toISOString(),
|
|
41
|
+
});
|
|
42
|
+
const responses = this.responses.get(task.executorName) ?? [];
|
|
43
|
+
const idx = this.callIndices.get(task.executorName) ?? 0;
|
|
44
|
+
const responseIdx = Math.min(idx, responses.length - 1);
|
|
45
|
+
const response = responses[responseIdx];
|
|
46
|
+
this.callIndices.set(task.executorName, idx + 1);
|
|
47
|
+
if (!response) {
|
|
48
|
+
return {
|
|
49
|
+
taskId: task.id,
|
|
50
|
+
executorName: task.executorName,
|
|
51
|
+
output: {},
|
|
52
|
+
success: false,
|
|
53
|
+
error: `No mock response configured for "${task.executorName}"`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
taskId: task.id,
|
|
58
|
+
executorName: task.executorName,
|
|
59
|
+
output: response.output,
|
|
60
|
+
success: response.success ?? true,
|
|
61
|
+
error: response.error,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async close() { }
|
|
65
|
+
reset() {
|
|
66
|
+
this.responses.clear();
|
|
67
|
+
this.callIndices.clear();
|
|
68
|
+
this.delegations.length = 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=mock-agent-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-agent-transport.js","sourceRoot":"","sources":["../../src/testing/mock-agent-transport.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgCH;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IACpB,IAAI,GAAG,sBAAsB,CAAC;IAE/B,SAAS,GAAG,IAAI,GAAG,EAA+B,CAAC;IACnD,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,WAAW,GAAyB,EAAE,CAAC;IAEhD;;;OAGG;IACH,WAAW,CAAC,YAAoB,EAAE,QAA2B;QAC3D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAe;QAChC,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,CAAC,YAAY,CAAC;YACtB,iBAAiB,EAAE,KAAK;SACzB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,KAAe,EACf,IAAmB;QAEnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACpB,KAAK;YACL,IAAI;YACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;QACxC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAEjD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,MAAM,EAAE,EAAE;gBACV,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,oCAAoC,IAAI,CAAC,YAAY,GAAG;aAChE,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI;YACjC,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,KAAmB,CAAC;IAE/B,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock model provider for deterministic testing.
|
|
3
|
+
*
|
|
4
|
+
* Supports pre-programmed responses, tool call sequences, and
|
|
5
|
+
* cassette-based record/replay.
|
|
6
|
+
*
|
|
7
|
+
* @category Testing
|
|
8
|
+
*/
|
|
9
|
+
import type { ModelProvider, GenerateOptions, GenerateResult, TokenUsage } from "../providers/model-provider.js";
|
|
10
|
+
/**
|
|
11
|
+
* A pre-programmed response the mock will return for a given call.
|
|
12
|
+
*
|
|
13
|
+
* @category Testing
|
|
14
|
+
*/
|
|
15
|
+
export interface MockResponse {
|
|
16
|
+
content: string;
|
|
17
|
+
toolCalls?: GenerateResult["toolCalls"];
|
|
18
|
+
finishReason?: GenerateResult["finishReason"];
|
|
19
|
+
usage?: Partial<TokenUsage>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A recorded call made to the mock provider.
|
|
23
|
+
*
|
|
24
|
+
* @category Testing
|
|
25
|
+
*/
|
|
26
|
+
export interface RecordedCall {
|
|
27
|
+
messages: GenerateOptions["messages"];
|
|
28
|
+
model?: string;
|
|
29
|
+
tools?: GenerateOptions["tools"];
|
|
30
|
+
temperature?: number;
|
|
31
|
+
timestamp: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Mock implementation of {@link ModelProvider} for unit testing.
|
|
35
|
+
*
|
|
36
|
+
* Responses are queued and returned in FIFO order. If no responses
|
|
37
|
+
* are queued, returns a default empty response.
|
|
38
|
+
*
|
|
39
|
+
* @category Testing
|
|
40
|
+
*/
|
|
41
|
+
export declare class MockModelProvider implements ModelProvider {
|
|
42
|
+
readonly name = "mock";
|
|
43
|
+
private responses;
|
|
44
|
+
private callIndex;
|
|
45
|
+
readonly calls: RecordedCall[];
|
|
46
|
+
/**
|
|
47
|
+
* Queue one or more responses that will be returned in order.
|
|
48
|
+
*/
|
|
49
|
+
addResponses(...responses: MockResponse[]): this;
|
|
50
|
+
/**
|
|
51
|
+
* Queue a simple text response.
|
|
52
|
+
*/
|
|
53
|
+
addTextResponse(content: string): this;
|
|
54
|
+
/**
|
|
55
|
+
* Queue a JSON response (stringified automatically).
|
|
56
|
+
*/
|
|
57
|
+
addJsonResponse(data: Record<string, unknown>): this;
|
|
58
|
+
/**
|
|
59
|
+
* Queue a tool-call response.
|
|
60
|
+
*/
|
|
61
|
+
addToolCallResponse(toolCalls: GenerateResult["toolCalls"], content?: string): this;
|
|
62
|
+
supportsToolCalling(): boolean;
|
|
63
|
+
generate(options: GenerateOptions): Promise<GenerateResult>;
|
|
64
|
+
/**
|
|
65
|
+
* Reset all queued responses and recorded calls.
|
|
66
|
+
*/
|
|
67
|
+
reset(): void;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=mock-model-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-model-provider.d.ts","sourceRoot":"","sources":["../../src/testing/mock-model-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,cAAc,EACd,UAAU,EACX,MAAM,gCAAgC,CAAC;AAExC;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;CAC7B;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,UAAU;IAEvB,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,SAAS,CAAK;IACtB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAM;IAEpC;;OAEG;IACH,YAAY,CAAC,GAAG,SAAS,EAAE,YAAY,EAAE,GAAG,IAAI;IAKhD;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAItC;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIpD;;OAEG;IACH,mBAAmB,CACjB,SAAS,EAAE,cAAc,CAAC,WAAW,CAAC,EACtC,OAAO,SAAK,GACX,IAAI;IAQP,mBAAmB,IAAI,OAAO;IAIxB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAiCjE;;OAEG;IACH,KAAK,IAAI,IAAI;CAKd"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock model provider for deterministic testing.
|
|
3
|
+
*
|
|
4
|
+
* Supports pre-programmed responses, tool call sequences, and
|
|
5
|
+
* cassette-based record/replay.
|
|
6
|
+
*
|
|
7
|
+
* @category Testing
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Mock implementation of {@link ModelProvider} for unit testing.
|
|
11
|
+
*
|
|
12
|
+
* Responses are queued and returned in FIFO order. If no responses
|
|
13
|
+
* are queued, returns a default empty response.
|
|
14
|
+
*
|
|
15
|
+
* @category Testing
|
|
16
|
+
*/
|
|
17
|
+
export class MockModelProvider {
|
|
18
|
+
name = "mock";
|
|
19
|
+
responses = [];
|
|
20
|
+
callIndex = 0;
|
|
21
|
+
calls = [];
|
|
22
|
+
/**
|
|
23
|
+
* Queue one or more responses that will be returned in order.
|
|
24
|
+
*/
|
|
25
|
+
addResponses(...responses) {
|
|
26
|
+
this.responses.push(...responses);
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Queue a simple text response.
|
|
31
|
+
*/
|
|
32
|
+
addTextResponse(content) {
|
|
33
|
+
return this.addResponses({ content });
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Queue a JSON response (stringified automatically).
|
|
37
|
+
*/
|
|
38
|
+
addJsonResponse(data) {
|
|
39
|
+
return this.addResponses({ content: JSON.stringify(data) });
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Queue a tool-call response.
|
|
43
|
+
*/
|
|
44
|
+
addToolCallResponse(toolCalls, content = "") {
|
|
45
|
+
return this.addResponses({
|
|
46
|
+
content,
|
|
47
|
+
toolCalls,
|
|
48
|
+
finishReason: "tool-calls",
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
supportsToolCalling() {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
async generate(options) {
|
|
55
|
+
this.calls.push({
|
|
56
|
+
messages: options.messages,
|
|
57
|
+
model: options.model,
|
|
58
|
+
tools: options.tools,
|
|
59
|
+
temperature: options.temperature,
|
|
60
|
+
timestamp: new Date().toISOString(),
|
|
61
|
+
});
|
|
62
|
+
const response = this.responses[this.callIndex];
|
|
63
|
+
this.callIndex++;
|
|
64
|
+
if (!response) {
|
|
65
|
+
return {
|
|
66
|
+
content: '{"error": "no mock response configured"}',
|
|
67
|
+
toolCalls: [],
|
|
68
|
+
finishReason: "stop",
|
|
69
|
+
usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
content: response.content,
|
|
74
|
+
toolCalls: response.toolCalls ?? [],
|
|
75
|
+
finishReason: response.finishReason ?? "stop",
|
|
76
|
+
usage: {
|
|
77
|
+
promptTokens: response.usage?.promptTokens ?? 100,
|
|
78
|
+
completionTokens: response.usage?.completionTokens ?? 50,
|
|
79
|
+
totalTokens: response.usage?.totalTokens ?? 150,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Reset all queued responses and recorded calls.
|
|
85
|
+
*/
|
|
86
|
+
reset() {
|
|
87
|
+
this.responses = [];
|
|
88
|
+
this.callIndex = 0;
|
|
89
|
+
this.calls.length = 0;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=mock-model-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-model-provider.js","sourceRoot":"","sources":["../../src/testing/mock-model-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkCH;;;;;;;GAOG;AACH,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,MAAM,CAAC;IAEf,SAAS,GAAmB,EAAE,CAAC;IAC/B,SAAS,GAAG,CAAC,CAAC;IACb,KAAK,GAAmB,EAAE,CAAC;IAEpC;;OAEG;IACH,YAAY,CAAC,GAAG,SAAyB;QACvC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAe;QAC7B,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,IAA6B;QAC3C,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,mBAAmB,CACjB,SAAsC,EACtC,OAAO,GAAG,EAAE;QAEZ,OAAO,IAAI,CAAC,YAAY,CAAC;YACvB,OAAO;YACP,SAAS;YACT,YAAY,EAAE,YAAY;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS,EAAE,CAAC;QAEjB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,OAAO,EAAE,0CAA0C;gBACnD,SAAS,EAAE,EAAE;gBACb,YAAY,EAAE,MAAM;gBACpB,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;aAChE,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,EAAE;YACnC,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,MAAM;YAC7C,KAAK,EAAE;gBACL,YAAY,EAAE,QAAQ,CAAC,KAAK,EAAE,YAAY,IAAI,GAAG;gBACjD,gBAAgB,EAAE,QAAQ,CAAC,KAAK,EAAE,gBAAgB,IAAI,EAAE;gBACxD,WAAW,EAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,IAAI,GAAG;aAChD;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock tool invoker for deterministic testing.
|
|
3
|
+
*
|
|
4
|
+
* Pre-programmed tool responses keyed by `server:tool` name.
|
|
5
|
+
*
|
|
6
|
+
* @category Testing
|
|
7
|
+
*/
|
|
8
|
+
import type { ToolInvoker, ToolServerConfig, DiscoveredTool, ToolResult } from "../protocols/tool-invoker.js";
|
|
9
|
+
/**
|
|
10
|
+
* A pre-programmed tool that the mock will expose.
|
|
11
|
+
*
|
|
12
|
+
* @category Testing
|
|
13
|
+
*/
|
|
14
|
+
export interface MockTool {
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
inputSchema: Record<string, unknown>;
|
|
18
|
+
responses: MockToolResponse[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A pre-programmed response for a tool call.
|
|
22
|
+
* Responses are consumed in FIFO order; the last one is reused indefinitely.
|
|
23
|
+
*
|
|
24
|
+
* @category Testing
|
|
25
|
+
*/
|
|
26
|
+
export interface MockToolResponse {
|
|
27
|
+
content: unknown;
|
|
28
|
+
isError?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A recorded tool call made to the mock invoker.
|
|
32
|
+
*
|
|
33
|
+
* @category Testing
|
|
34
|
+
*/
|
|
35
|
+
export interface RecordedToolCall {
|
|
36
|
+
serverName: string;
|
|
37
|
+
toolName: string;
|
|
38
|
+
args: Record<string, unknown>;
|
|
39
|
+
timestamp: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Mock implementation of {@link ToolInvoker} for unit testing.
|
|
43
|
+
*
|
|
44
|
+
* @category Testing
|
|
45
|
+
*/
|
|
46
|
+
export declare class MockToolInvoker implements ToolInvoker {
|
|
47
|
+
readonly name = "mock-tool-invoker";
|
|
48
|
+
private servers;
|
|
49
|
+
readonly calls: RecordedToolCall[];
|
|
50
|
+
/**
|
|
51
|
+
* Register a mock tool on a server.
|
|
52
|
+
*/
|
|
53
|
+
addTool(serverName: string, tool: MockTool): this;
|
|
54
|
+
/**
|
|
55
|
+
* Convenience: register a tool that always returns the same data.
|
|
56
|
+
*/
|
|
57
|
+
addSimpleTool(serverName: string, toolName: string, response: unknown): this;
|
|
58
|
+
connect(_config: ToolServerConfig): Promise<void>;
|
|
59
|
+
listTools(serverName: string): Promise<DiscoveredTool[]>;
|
|
60
|
+
callTool(serverName: string, toolName: string, args: Record<string, unknown>): Promise<ToolResult>;
|
|
61
|
+
disconnect(_serverName: string): Promise<void>;
|
|
62
|
+
disconnectAll(): Promise<void>;
|
|
63
|
+
reset(): void;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=mock-tool-invoker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-tool-invoker.d.ts","sourceRoot":"","sources":["../../src/testing/mock-tool-invoker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,UAAU,EACX,MAAM,8BAA8B,CAAC;AAEtC;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACjD,QAAQ,CAAC,IAAI,uBAAuB;IAEpC,OAAO,CAAC,OAAO,CAAyE;IACxF,QAAQ,CAAC,KAAK,EAAE,gBAAgB,EAAE,CAAM;IAExC;;OAEG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IAQjD;;OAEG;IACH,aAAa,CACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,GAChB,IAAI;IASD,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAWxD,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,UAAU,CAAC;IAiChB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC9C,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAEpC,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock tool invoker for deterministic testing.
|
|
3
|
+
*
|
|
4
|
+
* Pre-programmed tool responses keyed by `server:tool` name.
|
|
5
|
+
*
|
|
6
|
+
* @category Testing
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Mock implementation of {@link ToolInvoker} for unit testing.
|
|
10
|
+
*
|
|
11
|
+
* @category Testing
|
|
12
|
+
*/
|
|
13
|
+
export class MockToolInvoker {
|
|
14
|
+
name = "mock-tool-invoker";
|
|
15
|
+
servers = new Map();
|
|
16
|
+
calls = [];
|
|
17
|
+
/**
|
|
18
|
+
* Register a mock tool on a server.
|
|
19
|
+
*/
|
|
20
|
+
addTool(serverName, tool) {
|
|
21
|
+
if (!this.servers.has(serverName)) {
|
|
22
|
+
this.servers.set(serverName, new Map());
|
|
23
|
+
}
|
|
24
|
+
this.servers.get(serverName).set(tool.name, { tool, callIndex: 0 });
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Convenience: register a tool that always returns the same data.
|
|
29
|
+
*/
|
|
30
|
+
addSimpleTool(serverName, toolName, response) {
|
|
31
|
+
return this.addTool(serverName, {
|
|
32
|
+
name: toolName,
|
|
33
|
+
description: `Mock ${toolName}`,
|
|
34
|
+
inputSchema: { type: "object" },
|
|
35
|
+
responses: [{ content: response }],
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async connect(_config) {
|
|
39
|
+
// no-op for mock
|
|
40
|
+
}
|
|
41
|
+
async listTools(serverName) {
|
|
42
|
+
const server = this.servers.get(serverName);
|
|
43
|
+
if (!server)
|
|
44
|
+
return [];
|
|
45
|
+
return [...server.values()].map((entry) => ({
|
|
46
|
+
name: entry.tool.name,
|
|
47
|
+
description: entry.tool.description,
|
|
48
|
+
inputSchema: entry.tool.inputSchema,
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
async callTool(serverName, toolName, args) {
|
|
52
|
+
this.calls.push({
|
|
53
|
+
serverName,
|
|
54
|
+
toolName,
|
|
55
|
+
args,
|
|
56
|
+
timestamp: new Date().toISOString(),
|
|
57
|
+
});
|
|
58
|
+
const server = this.servers.get(serverName);
|
|
59
|
+
const entry = server?.get(toolName);
|
|
60
|
+
if (!entry) {
|
|
61
|
+
return {
|
|
62
|
+
content: { error: `Mock tool ${serverName}:${toolName} not found` },
|
|
63
|
+
isError: true,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const { tool, callIndex } = entry;
|
|
67
|
+
const responseIdx = Math.min(callIndex, tool.responses.length - 1);
|
|
68
|
+
const response = tool.responses[responseIdx];
|
|
69
|
+
entry.callIndex++;
|
|
70
|
+
if (!response) {
|
|
71
|
+
return { content: null, isError: true };
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
content: response.content,
|
|
75
|
+
isError: response.isError ?? false,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
async disconnect(_serverName) { }
|
|
79
|
+
async disconnectAll() { }
|
|
80
|
+
reset() {
|
|
81
|
+
this.servers.clear();
|
|
82
|
+
this.calls.length = 0;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=mock-tool-invoker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-tool-invoker.js","sourceRoot":"","sources":["../../src/testing/mock-tool-invoker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4CH;;;;GAIG;AACH,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,mBAAmB,CAAC;IAE5B,OAAO,GAAG,IAAI,GAAG,EAA8D,CAAC;IAC/E,KAAK,GAAuB,EAAE,CAAC;IAExC;;OAEG;IACH,OAAO,CAAC,UAAkB,EAAE,IAAc;QACxC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,aAAa,CACX,UAAkB,EAClB,QAAgB,EAChB,QAAiB;QAEjB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YAC9B,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,QAAQ,QAAQ,EAAE;YAC/B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAyB;QACrC,iBAAiB;IACnB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,UAAkB;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAEvB,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;YACrB,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW;YACnC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW;SACpC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,UAAkB,EAClB,QAAgB,EAChB,IAA6B;QAE7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,UAAU;YACV,QAAQ;YACR,IAAI;YACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,EAAE,KAAK,EAAE,aAAa,UAAU,IAAI,QAAQ,YAAY,EAAE;gBACnE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC7C,KAAK,CAAC,SAAS,EAAE,CAAC;QAElB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC;QAED,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,KAAK;SACnC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB,IAAkB,CAAC;IACvD,KAAK,CAAC,aAAa,KAAmB,CAAC;IAEvC,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace collector — accumulates spans during a Context execution
|
|
3
|
+
* and produces a complete {@link ExecutionTrace}.
|
|
4
|
+
*
|
|
5
|
+
* @category Tracing
|
|
6
|
+
*/
|
|
7
|
+
import type { ExecutionTrace, TraceSpan, SpanType, SpanTokenUsage, TraceExporter } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Collects trace spans during an execution run.
|
|
10
|
+
*
|
|
11
|
+
* Call {@link startSpan} at the beginning of each unit of work and
|
|
12
|
+
* {@link endSpan} when it completes. After the run finishes, call
|
|
13
|
+
* {@link buildTrace} to produce the finalized {@link ExecutionTrace},
|
|
14
|
+
* then {@link exportAll} to push it to all registered exporters.
|
|
15
|
+
*
|
|
16
|
+
* @category Tracing
|
|
17
|
+
*/
|
|
18
|
+
export declare class TraceCollector {
|
|
19
|
+
private spans;
|
|
20
|
+
private openSpans;
|
|
21
|
+
private stepCounter;
|
|
22
|
+
private readonly exporters;
|
|
23
|
+
/**
|
|
24
|
+
* Register one or more trace exporters.
|
|
25
|
+
*/
|
|
26
|
+
addExporters(...exporters: TraceExporter[]): this;
|
|
27
|
+
/**
|
|
28
|
+
* Begin a new span. Returns the span ID for later reference.
|
|
29
|
+
*/
|
|
30
|
+
startSpan(opts: {
|
|
31
|
+
type: SpanType;
|
|
32
|
+
executorName: string;
|
|
33
|
+
parentId?: string;
|
|
34
|
+
model?: string;
|
|
35
|
+
toolName?: string;
|
|
36
|
+
toolArgs?: Record<string, unknown>;
|
|
37
|
+
mountName?: string;
|
|
38
|
+
mountStage?: string;
|
|
39
|
+
}): string;
|
|
40
|
+
/**
|
|
41
|
+
* End an open span, recording its results.
|
|
42
|
+
*/
|
|
43
|
+
endSpan(spanId: string, result?: {
|
|
44
|
+
output?: unknown;
|
|
45
|
+
reasoning?: string;
|
|
46
|
+
tokens?: SpanTokenUsage;
|
|
47
|
+
toolResult?: unknown;
|
|
48
|
+
toolIsError?: boolean;
|
|
49
|
+
mountItemCount?: number;
|
|
50
|
+
error?: string;
|
|
51
|
+
}): void;
|
|
52
|
+
/**
|
|
53
|
+
* Build the finalized execution trace.
|
|
54
|
+
*/
|
|
55
|
+
buildTrace(meta: {
|
|
56
|
+
executionId: string;
|
|
57
|
+
contextName: string;
|
|
58
|
+
contextVersion: string;
|
|
59
|
+
strategy: string;
|
|
60
|
+
startedAt: string;
|
|
61
|
+
endedAt: string;
|
|
62
|
+
durationMs: number;
|
|
63
|
+
success: boolean;
|
|
64
|
+
error?: string;
|
|
65
|
+
}): ExecutionTrace;
|
|
66
|
+
/**
|
|
67
|
+
* Export the trace to all registered exporters.
|
|
68
|
+
*/
|
|
69
|
+
exportAll(trace: ExecutionTrace): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Return the current collected spans (for testing).
|
|
72
|
+
*/
|
|
73
|
+
getSpans(): ReadonlyArray<TraceSpan>;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=collector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/tracing/collector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,QAAQ,EACR,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;GASG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,SAAS,CAAsE;IACvF,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IAEjD;;OAEG;IACH,YAAY,CAAC,GAAG,SAAS,EAAE,aAAa,EAAE,GAAG,IAAI;IAKjD;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE;QACd,IAAI,EAAE,QAAQ,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,MAAM;IAyBV;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE;QAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,cAAc,CAAC;QACxB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GAAG,IAAI;IAsBb;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,cAAc;IAOlB;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrD;;OAEG;IACH,QAAQ,IAAI,aAAa,CAAC,SAAS,CAAC;CAGrC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace collector — accumulates spans during a Context execution
|
|
3
|
+
* and produces a complete {@link ExecutionTrace}.
|
|
4
|
+
*
|
|
5
|
+
* @category Tracing
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Collects trace spans during an execution run.
|
|
9
|
+
*
|
|
10
|
+
* Call {@link startSpan} at the beginning of each unit of work and
|
|
11
|
+
* {@link endSpan} when it completes. After the run finishes, call
|
|
12
|
+
* {@link buildTrace} to produce the finalized {@link ExecutionTrace},
|
|
13
|
+
* then {@link exportAll} to push it to all registered exporters.
|
|
14
|
+
*
|
|
15
|
+
* @category Tracing
|
|
16
|
+
*/
|
|
17
|
+
export class TraceCollector {
|
|
18
|
+
spans = [];
|
|
19
|
+
openSpans = new Map();
|
|
20
|
+
stepCounter = 0;
|
|
21
|
+
exporters = [];
|
|
22
|
+
/**
|
|
23
|
+
* Register one or more trace exporters.
|
|
24
|
+
*/
|
|
25
|
+
addExporters(...exporters) {
|
|
26
|
+
this.exporters.push(...exporters);
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Begin a new span. Returns the span ID for later reference.
|
|
31
|
+
*/
|
|
32
|
+
startSpan(opts) {
|
|
33
|
+
this.stepCounter++;
|
|
34
|
+
const id = `span_${this.stepCounter}_${Date.now()}`;
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
this.openSpans.set(id, {
|
|
37
|
+
span: {
|
|
38
|
+
id,
|
|
39
|
+
parentId: opts.parentId,
|
|
40
|
+
type: opts.type,
|
|
41
|
+
executorName: opts.executorName,
|
|
42
|
+
startedAt: new Date(now).toISOString(),
|
|
43
|
+
step: this.stepCounter,
|
|
44
|
+
model: opts.model,
|
|
45
|
+
toolName: opts.toolName,
|
|
46
|
+
toolArgs: opts.toolArgs,
|
|
47
|
+
mountName: opts.mountName,
|
|
48
|
+
mountStage: opts.mountStage,
|
|
49
|
+
},
|
|
50
|
+
startTime: now,
|
|
51
|
+
});
|
|
52
|
+
return id;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* End an open span, recording its results.
|
|
56
|
+
*/
|
|
57
|
+
endSpan(spanId, result = {}) {
|
|
58
|
+
const entry = this.openSpans.get(spanId);
|
|
59
|
+
if (!entry)
|
|
60
|
+
return;
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
const span = {
|
|
63
|
+
...entry.span,
|
|
64
|
+
endedAt: new Date(now).toISOString(),
|
|
65
|
+
durationMs: now - entry.startTime,
|
|
66
|
+
output: result.output,
|
|
67
|
+
reasoning: result.reasoning,
|
|
68
|
+
tokens: result.tokens,
|
|
69
|
+
toolResult: result.toolResult,
|
|
70
|
+
toolIsError: result.toolIsError,
|
|
71
|
+
mountItemCount: result.mountItemCount,
|
|
72
|
+
error: result.error,
|
|
73
|
+
};
|
|
74
|
+
this.spans.push(span);
|
|
75
|
+
this.openSpans.delete(spanId);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Build the finalized execution trace.
|
|
79
|
+
*/
|
|
80
|
+
buildTrace(meta) {
|
|
81
|
+
return {
|
|
82
|
+
...meta,
|
|
83
|
+
spans: [...this.spans],
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Export the trace to all registered exporters.
|
|
88
|
+
*/
|
|
89
|
+
async exportAll(trace) {
|
|
90
|
+
for (const exporter of this.exporters) {
|
|
91
|
+
try {
|
|
92
|
+
await exporter.export(trace);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
console.error(`[ECP TRACE] Exporter "${exporter.name}" failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Return the current collected spans (for testing).
|
|
101
|
+
*/
|
|
102
|
+
getSpans() {
|
|
103
|
+
return this.spans;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/tracing/collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console trace exporter — prints a human-readable execution trace
|
|
3
|
+
* to stderr.
|
|
4
|
+
*
|
|
5
|
+
* @category Tracing
|
|
6
|
+
*/
|
|
7
|
+
import type { ExecutionTrace, TraceExporter } from "../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Exports execution traces as formatted text to the console.
|
|
10
|
+
*
|
|
11
|
+
* @category Tracing
|
|
12
|
+
*/
|
|
13
|
+
export declare class ConsoleTraceExporter implements TraceExporter {
|
|
14
|
+
readonly name = "console";
|
|
15
|
+
export(trace: ExecutionTrace): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=console.d.ts.map
|