@sprinterai/runtime 0.2.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/LICENSE +21 -0
- package/dist/adapters/a2a-adapter.d.ts +24 -0
- package/dist/adapters/a2a-adapter.d.ts.map +1 -0
- package/dist/adapters/a2a-adapter.js +13 -0
- package/dist/adapters/a2a-adapter.js.map +1 -0
- package/dist/adapters/http-agent-adapter.d.ts +22 -0
- package/dist/adapters/http-agent-adapter.d.ts.map +1 -0
- package/dist/adapters/http-agent-adapter.js +13 -0
- package/dist/adapters/http-agent-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +9 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +5 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/mcp-adapter.d.ts +19 -0
- package/dist/adapters/mcp-adapter.d.ts.map +1 -0
- package/dist/adapters/mcp-adapter.js +13 -0
- package/dist/adapters/mcp-adapter.js.map +1 -0
- package/dist/adapters/openclaw-adapter.d.ts +20 -0
- package/dist/adapters/openclaw-adapter.d.ts.map +1 -0
- package/dist/adapters/openclaw-adapter.js +13 -0
- package/dist/adapters/openclaw-adapter.js.map +1 -0
- package/dist/agent/agent-registry.d.ts +25 -0
- package/dist/agent/agent-registry.d.ts.map +1 -0
- package/dist/agent/agent-registry.js +42 -0
- package/dist/agent/agent-registry.js.map +1 -0
- package/dist/agent/agent-registry.test.d.ts +2 -0
- package/dist/agent/agent-registry.test.d.ts.map +1 -0
- package/dist/agent/agent-registry.test.js +55 -0
- package/dist/agent/agent-registry.test.js.map +1 -0
- package/dist/agent/agent-resolver.d.ts +41 -0
- package/dist/agent/agent-resolver.d.ts.map +1 -0
- package/dist/agent/agent-resolver.js +76 -0
- package/dist/agent/agent-resolver.js.map +1 -0
- package/dist/agent/agent-resolver.test.d.ts +2 -0
- package/dist/agent/agent-resolver.test.d.ts.map +1 -0
- package/dist/agent/agent-resolver.test.js +116 -0
- package/dist/agent/agent-resolver.test.js.map +1 -0
- package/dist/agent/delegate.d.ts +14 -0
- package/dist/agent/delegate.d.ts.map +1 -0
- package/dist/agent/delegate.js +35 -0
- package/dist/agent/delegate.js.map +1 -0
- package/dist/agent/delegate.test.d.ts +2 -0
- package/dist/agent/delegate.test.d.ts.map +1 -0
- package/dist/agent/delegate.test.js +64 -0
- package/dist/agent/delegate.test.js.map +1 -0
- package/dist/agent/execute-agent.d.ts +43 -0
- package/dist/agent/execute-agent.d.ts.map +1 -0
- package/dist/agent/execute-agent.js +43 -0
- package/dist/agent/execute-agent.js.map +1 -0
- package/dist/agent/index.d.ts +10 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +6 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/prompt-builder.d.ts +16 -0
- package/dist/agent/prompt-builder.d.ts.map +1 -0
- package/dist/agent/prompt-builder.js +17 -0
- package/dist/agent/prompt-builder.js.map +1 -0
- package/dist/agent/prompt-builder.test.d.ts +2 -0
- package/dist/agent/prompt-builder.test.d.ts.map +1 -0
- package/dist/agent/prompt-builder.test.js +60 -0
- package/dist/agent/prompt-builder.test.js.map +1 -0
- package/dist/chat/chat-handler.d.ts +63 -0
- package/dist/chat/chat-handler.d.ts.map +1 -0
- package/dist/chat/chat-handler.js +74 -0
- package/dist/chat/chat-handler.js.map +1 -0
- package/dist/chat/chat-handler.test.d.ts +2 -0
- package/dist/chat/chat-handler.test.d.ts.map +1 -0
- package/dist/chat/chat-handler.test.js +112 -0
- package/dist/chat/chat-handler.test.js.map +1 -0
- package/dist/chat/index.d.ts +4 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +3 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/message-utils.d.ts +26 -0
- package/dist/chat/message-utils.d.ts.map +1 -0
- package/dist/chat/message-utils.js +65 -0
- package/dist/chat/message-utils.js.map +1 -0
- package/dist/chat/message-utils.test.d.ts +2 -0
- package/dist/chat/message-utils.test.d.ts.map +1 -0
- package/dist/chat/message-utils.test.js +85 -0
- package/dist/chat/message-utils.test.js.map +1 -0
- package/dist/eval/eval-runner.d.ts +22 -0
- package/dist/eval/eval-runner.d.ts.map +1 -0
- package/dist/eval/eval-runner.js +56 -0
- package/dist/eval/eval-runner.js.map +1 -0
- package/dist/eval/eval-runner.test.d.ts +2 -0
- package/dist/eval/eval-runner.test.d.ts.map +1 -0
- package/dist/eval/eval-runner.test.js +89 -0
- package/dist/eval/eval-runner.test.js.map +1 -0
- package/dist/eval/index.d.ts +4 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +3 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/scorers.d.ts +26 -0
- package/dist/eval/scorers.d.ts.map +1 -0
- package/dist/eval/scorers.js +76 -0
- package/dist/eval/scorers.js.map +1 -0
- package/dist/eval/scorers.test.d.ts +2 -0
- package/dist/eval/scorers.test.d.ts.map +1 -0
- package/dist/eval/scorers.test.js +91 -0
- package/dist/eval/scorers.test.js.map +1 -0
- package/dist/guardrail/guardrail-pipeline.d.ts +37 -0
- package/dist/guardrail/guardrail-pipeline.d.ts.map +1 -0
- package/dist/guardrail/guardrail-pipeline.js +63 -0
- package/dist/guardrail/guardrail-pipeline.js.map +1 -0
- package/dist/guardrail/guardrail-pipeline.test.d.ts +2 -0
- package/dist/guardrail/guardrail-pipeline.test.d.ts.map +1 -0
- package/dist/guardrail/guardrail-pipeline.test.js +74 -0
- package/dist/guardrail/guardrail-pipeline.test.js.map +1 -0
- package/dist/guardrail/index.d.ts +3 -0
- package/dist/guardrail/index.d.ts.map +1 -0
- package/dist/guardrail/index.js +2 -0
- package/dist/guardrail/index.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +4 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +3 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +28 -0
- package/dist/memory/memory-manager.d.ts.map +1 -0
- package/dist/memory/memory-manager.js +34 -0
- package/dist/memory/memory-manager.js.map +1 -0
- package/dist/memory/memory-prompt.d.ts +10 -0
- package/dist/memory/memory-prompt.d.ts.map +1 -0
- package/dist/memory/memory-prompt.js +29 -0
- package/dist/memory/memory-prompt.js.map +1 -0
- package/dist/module/create-runtime.d.ts +65 -0
- package/dist/module/create-runtime.d.ts.map +1 -0
- package/dist/module/create-runtime.js +75 -0
- package/dist/module/create-runtime.js.map +1 -0
- package/dist/module/create-runtime.test.d.ts +2 -0
- package/dist/module/create-runtime.test.d.ts.map +1 -0
- package/dist/module/create-runtime.test.js +144 -0
- package/dist/module/create-runtime.test.js.map +1 -0
- package/dist/module/index.d.ts +5 -0
- package/dist/module/index.d.ts.map +1 -0
- package/dist/module/index.js +3 -0
- package/dist/module/index.js.map +1 -0
- package/dist/module/module-loader.d.ts +32 -0
- package/dist/module/module-loader.d.ts.map +1 -0
- package/dist/module/module-loader.js +123 -0
- package/dist/module/module-loader.js.map +1 -0
- package/dist/module/module-loader.test.d.ts +2 -0
- package/dist/module/module-loader.test.d.ts.map +1 -0
- package/dist/module/module-loader.test.js +96 -0
- package/dist/module/module-loader.test.js.map +1 -0
- package/dist/scoring/compute-score.d.ts +32 -0
- package/dist/scoring/compute-score.d.ts.map +1 -0
- package/dist/scoring/compute-score.js +54 -0
- package/dist/scoring/compute-score.js.map +1 -0
- package/dist/scoring/compute-score.test.d.ts +2 -0
- package/dist/scoring/compute-score.test.d.ts.map +1 -0
- package/dist/scoring/compute-score.test.js +99 -0
- package/dist/scoring/compute-score.test.js.map +1 -0
- package/dist/scoring/index.d.ts +3 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +2 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/testing/in-memory-agent-store.d.ts +16 -0
- package/dist/testing/in-memory-agent-store.d.ts.map +1 -0
- package/dist/testing/in-memory-agent-store.js +37 -0
- package/dist/testing/in-memory-agent-store.js.map +1 -0
- package/dist/testing/in-memory-agent-store.test.d.ts +2 -0
- package/dist/testing/in-memory-agent-store.test.d.ts.map +1 -0
- package/dist/testing/in-memory-agent-store.test.js +111 -0
- package/dist/testing/in-memory-agent-store.test.js.map +1 -0
- package/dist/testing/in-memory-chat-store.d.ts +28 -0
- package/dist/testing/in-memory-chat-store.d.ts.map +1 -0
- package/dist/testing/in-memory-chat-store.js +87 -0
- package/dist/testing/in-memory-chat-store.js.map +1 -0
- package/dist/testing/in-memory-entity-store.d.ts +34 -0
- package/dist/testing/in-memory-entity-store.d.ts.map +1 -0
- package/dist/testing/in-memory-entity-store.js +134 -0
- package/dist/testing/in-memory-entity-store.js.map +1 -0
- package/dist/testing/in-memory-entity-store.test.d.ts +2 -0
- package/dist/testing/in-memory-entity-store.test.d.ts.map +1 -0
- package/dist/testing/in-memory-entity-store.test.js +341 -0
- package/dist/testing/in-memory-entity-store.test.js.map +1 -0
- package/dist/testing/in-memory-memory-store.d.ts +25 -0
- package/dist/testing/in-memory-memory-store.d.ts.map +1 -0
- package/dist/testing/in-memory-memory-store.js +59 -0
- package/dist/testing/in-memory-memory-store.js.map +1 -0
- package/dist/testing/in-memory-task-store.d.ts +20 -0
- package/dist/testing/in-memory-task-store.d.ts.map +1 -0
- package/dist/testing/in-memory-task-store.js +59 -0
- package/dist/testing/in-memory-task-store.js.map +1 -0
- package/dist/testing/in-memory-tenant-store.d.ts +16 -0
- package/dist/testing/in-memory-tenant-store.d.ts.map +1 -0
- package/dist/testing/in-memory-tenant-store.js +46 -0
- package/dist/testing/in-memory-tenant-store.js.map +1 -0
- package/dist/testing/in-memory-tool-store.d.ts +17 -0
- package/dist/testing/in-memory-tool-store.d.ts.map +1 -0
- package/dist/testing/in-memory-tool-store.js +39 -0
- package/dist/testing/in-memory-tool-store.js.map +1 -0
- package/dist/testing/index.d.ts +8 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +8 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tool/ai-bridge.d.ts +13 -0
- package/dist/tool/ai-bridge.d.ts.map +1 -0
- package/dist/tool/ai-bridge.js +27 -0
- package/dist/tool/ai-bridge.js.map +1 -0
- package/dist/tool/ai-bridge.test.d.ts +2 -0
- package/dist/tool/ai-bridge.test.d.ts.map +1 -0
- package/dist/tool/ai-bridge.test.js +40 -0
- package/dist/tool/ai-bridge.test.js.map +1 -0
- package/dist/tool/entity-tools-factory.d.ts +7 -0
- package/dist/tool/entity-tools-factory.d.ts.map +1 -0
- package/dist/tool/entity-tools-factory.js +160 -0
- package/dist/tool/entity-tools-factory.js.map +1 -0
- package/dist/tool/entity-tools-factory.test.d.ts +2 -0
- package/dist/tool/entity-tools-factory.test.d.ts.map +1 -0
- package/dist/tool/entity-tools-factory.test.js +160 -0
- package/dist/tool/entity-tools-factory.test.js.map +1 -0
- package/dist/tool/index.d.ts +8 -0
- package/dist/tool/index.d.ts.map +1 -0
- package/dist/tool/index.js +6 -0
- package/dist/tool/index.js.map +1 -0
- package/dist/tool/resolve-tools.d.ts +28 -0
- package/dist/tool/resolve-tools.d.ts.map +1 -0
- package/dist/tool/resolve-tools.js +54 -0
- package/dist/tool/resolve-tools.js.map +1 -0
- package/dist/tool/resolve-tools.test.d.ts +2 -0
- package/dist/tool/resolve-tools.test.d.ts.map +1 -0
- package/dist/tool/resolve-tools.test.js +111 -0
- package/dist/tool/resolve-tools.test.js.map +1 -0
- package/dist/tool/tool-executor.d.ts +30 -0
- package/dist/tool/tool-executor.d.ts.map +1 -0
- package/dist/tool/tool-executor.js +64 -0
- package/dist/tool/tool-executor.js.map +1 -0
- package/dist/tool/tool-executor.test.d.ts +2 -0
- package/dist/tool/tool-executor.test.d.ts.map +1 -0
- package/dist/tool/tool-executor.test.js +105 -0
- package/dist/tool/tool-executor.test.js.map +1 -0
- package/dist/tool/tool-registry.d.ts +29 -0
- package/dist/tool/tool-registry.d.ts.map +1 -0
- package/dist/tool/tool-registry.js +59 -0
- package/dist/tool/tool-registry.js.map +1 -0
- package/dist/tool/tool-registry.test.d.ts +2 -0
- package/dist/tool/tool-registry.test.d.ts.map +1 -0
- package/dist/tool/tool-registry.test.js +76 -0
- package/dist/tool/tool-registry.test.js.map +1 -0
- package/dist/workflow/compile.d.ts +17 -0
- package/dist/workflow/compile.d.ts.map +1 -0
- package/dist/workflow/compile.js +83 -0
- package/dist/workflow/compile.js.map +1 -0
- package/dist/workflow/compile.test.d.ts +2 -0
- package/dist/workflow/compile.test.d.ts.map +1 -0
- package/dist/workflow/compile.test.js +154 -0
- package/dist/workflow/compile.test.js.map +1 -0
- package/dist/workflow/index.d.ts +4 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +3 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/status.d.ts +21 -0
- package/dist/workflow/status.d.ts.map +1 -0
- package/dist/workflow/status.js +55 -0
- package/dist/workflow/status.js.map +1 -0
- package/dist/workflow/status.test.d.ts +2 -0
- package/dist/workflow/status.test.d.ts.map +1 -0
- package/dist/workflow/status.test.js +176 -0
- package/dist/workflow/status.test.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export { computeResponseScore } from "@sprinterai/core";
|
|
2
|
+
/**
|
|
3
|
+
* Compute the mean of an array of numbers.
|
|
4
|
+
* Returns null if the array is empty.
|
|
5
|
+
*/
|
|
6
|
+
export declare function mean(values: number[]): number | null;
|
|
7
|
+
/**
|
|
8
|
+
* Compute the median of an array of numbers.
|
|
9
|
+
* Returns null if the array is empty.
|
|
10
|
+
*/
|
|
11
|
+
export declare function median(values: number[]): number | null;
|
|
12
|
+
/**
|
|
13
|
+
* Compute min of an array. Returns null if empty.
|
|
14
|
+
*/
|
|
15
|
+
export declare function min(values: number[]): number | null;
|
|
16
|
+
/**
|
|
17
|
+
* Compute max of an array. Returns null if empty.
|
|
18
|
+
*/
|
|
19
|
+
export declare function max(values: number[]): number | null;
|
|
20
|
+
/** Aggregation result for a set of scores. */
|
|
21
|
+
export interface ScoreAggregation {
|
|
22
|
+
count: number;
|
|
23
|
+
mean: number | null;
|
|
24
|
+
median: number | null;
|
|
25
|
+
min: number | null;
|
|
26
|
+
max: number | null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Compute full aggregation of an array of scores.
|
|
30
|
+
*/
|
|
31
|
+
export declare function aggregateScores(scores: number[]): ScoreAggregation;
|
|
32
|
+
//# sourceMappingURL=compute-score.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-score.d.ts","sourceRoot":"","sources":["../../src/scoring/compute-score.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;GAGG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAGpD;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAQtD;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAGnD;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAGnD;AAED,8CAA8C;AAC9C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAQlE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Re-export the core scoring function
|
|
2
|
+
export { computeResponseScore } from "@sprinterai/core";
|
|
3
|
+
/**
|
|
4
|
+
* Compute the mean of an array of numbers.
|
|
5
|
+
* Returns null if the array is empty.
|
|
6
|
+
*/
|
|
7
|
+
export function mean(values) {
|
|
8
|
+
if (values.length === 0)
|
|
9
|
+
return null;
|
|
10
|
+
return values.reduce((sum, v) => sum + v, 0) / values.length;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Compute the median of an array of numbers.
|
|
14
|
+
* Returns null if the array is empty.
|
|
15
|
+
*/
|
|
16
|
+
export function median(values) {
|
|
17
|
+
if (values.length === 0)
|
|
18
|
+
return null;
|
|
19
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
20
|
+
const mid = Math.floor(sorted.length / 2);
|
|
21
|
+
if (sorted.length % 2 === 0) {
|
|
22
|
+
return (sorted[mid - 1] + sorted[mid]) / 2;
|
|
23
|
+
}
|
|
24
|
+
return sorted[mid];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Compute min of an array. Returns null if empty.
|
|
28
|
+
*/
|
|
29
|
+
export function min(values) {
|
|
30
|
+
if (values.length === 0)
|
|
31
|
+
return null;
|
|
32
|
+
return Math.min(...values);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Compute max of an array. Returns null if empty.
|
|
36
|
+
*/
|
|
37
|
+
export function max(values) {
|
|
38
|
+
if (values.length === 0)
|
|
39
|
+
return null;
|
|
40
|
+
return Math.max(...values);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Compute full aggregation of an array of scores.
|
|
44
|
+
*/
|
|
45
|
+
export function aggregateScores(scores) {
|
|
46
|
+
return {
|
|
47
|
+
count: scores.length,
|
|
48
|
+
mean: mean(scores),
|
|
49
|
+
median: median(scores),
|
|
50
|
+
min: min(scores),
|
|
51
|
+
max: max(scores),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=compute-score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-score.js","sourceRoot":"","sources":["../../src/scoring/compute-score.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,MAAgB;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,MAAgB;IACrC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAC,MAAgB;IAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAC,MAAgB;IAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;AAC7B,CAAC;AAWD;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAgB;IAC9C,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC;QAChB,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-score.test.d.ts","sourceRoot":"","sources":["../../src/scoring/compute-score.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { mean, median, min, max, aggregateScores, computeResponseScore } from './compute-score';
|
|
3
|
+
describe('aggregation helpers', () => {
|
|
4
|
+
describe('mean', () => {
|
|
5
|
+
it('returns null for empty array', () => {
|
|
6
|
+
expect(mean([])).toBeNull();
|
|
7
|
+
});
|
|
8
|
+
it('computes mean of values', () => {
|
|
9
|
+
expect(mean([10, 20, 30])).toBe(20);
|
|
10
|
+
});
|
|
11
|
+
it('handles single value', () => {
|
|
12
|
+
expect(mean([5])).toBe(5);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
describe('median', () => {
|
|
16
|
+
it('returns null for empty array', () => {
|
|
17
|
+
expect(median([])).toBeNull();
|
|
18
|
+
});
|
|
19
|
+
it('returns middle for odd-length array', () => {
|
|
20
|
+
expect(median([1, 3, 5])).toBe(3);
|
|
21
|
+
});
|
|
22
|
+
it('returns average of middle two for even-length array', () => {
|
|
23
|
+
expect(median([1, 2, 3, 4])).toBe(2.5);
|
|
24
|
+
});
|
|
25
|
+
it('handles unsorted input', () => {
|
|
26
|
+
expect(median([5, 1, 3])).toBe(3);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('min', () => {
|
|
30
|
+
it('returns null for empty array', () => {
|
|
31
|
+
expect(min([])).toBeNull();
|
|
32
|
+
});
|
|
33
|
+
it('returns minimum value', () => {
|
|
34
|
+
expect(min([5, 2, 8, 1])).toBe(1);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('max', () => {
|
|
38
|
+
it('returns null for empty array', () => {
|
|
39
|
+
expect(max([])).toBeNull();
|
|
40
|
+
});
|
|
41
|
+
it('returns maximum value', () => {
|
|
42
|
+
expect(max([5, 2, 8, 1])).toBe(8);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe('aggregateScores', () => {
|
|
46
|
+
it('returns complete aggregation', () => {
|
|
47
|
+
const result = aggregateScores([10, 20, 30, 40]);
|
|
48
|
+
expect(result).toEqual({
|
|
49
|
+
count: 4,
|
|
50
|
+
mean: 25,
|
|
51
|
+
median: 25,
|
|
52
|
+
min: 10,
|
|
53
|
+
max: 40,
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
it('handles empty array', () => {
|
|
57
|
+
const result = aggregateScores([]);
|
|
58
|
+
expect(result).toEqual({
|
|
59
|
+
count: 0,
|
|
60
|
+
mean: null,
|
|
61
|
+
median: null,
|
|
62
|
+
min: null,
|
|
63
|
+
max: null,
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('computeResponseScore (re-exported)', () => {
|
|
69
|
+
it('computes weighted and normalized scores', () => {
|
|
70
|
+
const result = computeResponseScore({ quality: 8, relevance: 6 }, [
|
|
71
|
+
{
|
|
72
|
+
key: 'quality',
|
|
73
|
+
label: 'Quality',
|
|
74
|
+
type: 'rating',
|
|
75
|
+
scale: [0, 10],
|
|
76
|
+
weight: 2,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
key: 'relevance',
|
|
80
|
+
label: 'Relevance',
|
|
81
|
+
type: 'rating',
|
|
82
|
+
scale: [0, 10],
|
|
83
|
+
weight: 1,
|
|
84
|
+
},
|
|
85
|
+
]);
|
|
86
|
+
// weighted = (8*2 + 6*1) / (2+1) = 22/3 ~ 7.33
|
|
87
|
+
expect(result.weighted).toBeCloseTo(7.333, 2);
|
|
88
|
+
// normalized = (80*2 + 60*1) / 3 = 220/3 ~ 73.33
|
|
89
|
+
expect(result.normalized).toBeCloseTo(73.333, 2);
|
|
90
|
+
});
|
|
91
|
+
it('returns nulls for no qualifying dimensions', () => {
|
|
92
|
+
const result = computeResponseScore({ text: 'hello' }, [
|
|
93
|
+
{ key: 'text', label: 'Text', type: 'text' },
|
|
94
|
+
]);
|
|
95
|
+
expect(result.weighted).toBeNull();
|
|
96
|
+
expect(result.normalized).toBeNull();
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=compute-score.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-score.test.js","sourceRoot":"","sources":["../../src/scoring/compute-score.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scoring/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,IAAI,EACJ,MAAM,EACN,GAAG,EACH,GAAG,EACH,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scoring/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,IAAI,EACJ,MAAM,EACN,GAAG,EACH,GAAG,EACH,eAAe,GAChB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AgentStore, AgentRecord } from "@sprinterai/core";
|
|
2
|
+
/** In-memory AgentStore for testing. */
|
|
3
|
+
export declare class InMemoryAgentStore implements AgentStore {
|
|
4
|
+
private agents;
|
|
5
|
+
/** Seed an agent for test setup. */
|
|
6
|
+
seedAgent(agent: AgentRecord): void;
|
|
7
|
+
getAgentById(id: string): Promise<AgentRecord | null>;
|
|
8
|
+
getAgentBySlug(slug: string): Promise<AgentRecord | null>;
|
|
9
|
+
getFirstEnabledAgent(): Promise<AgentRecord | null>;
|
|
10
|
+
listAgents(options?: {
|
|
11
|
+
enabledOnly?: boolean;
|
|
12
|
+
}): Promise<AgentRecord[]>;
|
|
13
|
+
/** Test helper: clear all data. */
|
|
14
|
+
clear(): void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=in-memory-agent-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-agent-store.d.ts","sourceRoot":"","sources":["../../src/testing/in-memory-agent-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEhE,wCAAwC;AACxC,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,MAAM,CAAkC;IAEhD,oCAAoC;IACpC,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAI7B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAIrD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAOzD,oBAAoB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAOnD,UAAU,CAAC,OAAO,CAAC,EAAE;QACzB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAQ1B,mCAAmC;IACnC,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** In-memory AgentStore for testing. */
|
|
2
|
+
export class InMemoryAgentStore {
|
|
3
|
+
agents = new Map();
|
|
4
|
+
/** Seed an agent for test setup. */
|
|
5
|
+
seedAgent(agent) {
|
|
6
|
+
this.agents.set(agent.id, agent);
|
|
7
|
+
}
|
|
8
|
+
async getAgentById(id) {
|
|
9
|
+
return this.agents.get(id) ?? null;
|
|
10
|
+
}
|
|
11
|
+
async getAgentBySlug(slug) {
|
|
12
|
+
for (const agent of this.agents.values()) {
|
|
13
|
+
if (agent.slug === slug)
|
|
14
|
+
return agent;
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
async getFirstEnabledAgent() {
|
|
19
|
+
for (const agent of this.agents.values()) {
|
|
20
|
+
if (agent.is_enabled)
|
|
21
|
+
return agent;
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
async listAgents(options) {
|
|
26
|
+
const all = Array.from(this.agents.values());
|
|
27
|
+
if (options?.enabledOnly) {
|
|
28
|
+
return all.filter((a) => a.is_enabled);
|
|
29
|
+
}
|
|
30
|
+
return all;
|
|
31
|
+
}
|
|
32
|
+
/** Test helper: clear all data. */
|
|
33
|
+
clear() {
|
|
34
|
+
this.agents.clear();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=in-memory-agent-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-agent-store.js","sourceRoot":"","sources":["../../src/testing/in-memory-agent-store.ts"],"names":[],"mappings":"AAEA,wCAAwC;AACxC,MAAM,OAAO,kBAAkB;IACrB,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEhD,oCAAoC;IACpC,SAAS,CAAC,KAAkB;QAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAY;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAEhB;QACC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7C,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,mCAAmC;IACnC,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-agent-store.test.d.ts","sourceRoot":"","sources":["../../src/testing/in-memory-agent-store.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { InMemoryAgentStore } from './in-memory-agent-store';
|
|
3
|
+
function makeAgent(overrides) {
|
|
4
|
+
return {
|
|
5
|
+
id: 'agent-1',
|
|
6
|
+
tenant_id: 'test-tenant',
|
|
7
|
+
slug: 'analyst',
|
|
8
|
+
name: 'Analyst',
|
|
9
|
+
description: 'Analyzes data',
|
|
10
|
+
icon: 'bar-chart',
|
|
11
|
+
system_prompt: 'You are an analyst.',
|
|
12
|
+
model: null,
|
|
13
|
+
role_id: null,
|
|
14
|
+
config: null,
|
|
15
|
+
is_enabled: true,
|
|
16
|
+
created_at: new Date().toISOString(),
|
|
17
|
+
updated_at: new Date().toISOString(),
|
|
18
|
+
...overrides,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
describe('InMemoryAgentStore', () => {
|
|
22
|
+
let store;
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
store = new InMemoryAgentStore();
|
|
25
|
+
});
|
|
26
|
+
// ─── getAgentById ─────────────────────────────────────────
|
|
27
|
+
describe('getAgentById', () => {
|
|
28
|
+
it('returns null for unknown id', async () => {
|
|
29
|
+
expect(await store.getAgentById('nonexistent')).toBeNull();
|
|
30
|
+
});
|
|
31
|
+
it('returns seeded agent by id', async () => {
|
|
32
|
+
const agent = makeAgent();
|
|
33
|
+
store.seedAgent(agent);
|
|
34
|
+
const result = await store.getAgentById('agent-1');
|
|
35
|
+
expect(result).toEqual(agent);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
// ─── getAgentBySlug ───────────────────────────────────────
|
|
39
|
+
describe('getAgentBySlug', () => {
|
|
40
|
+
it('returns null for unknown slug', async () => {
|
|
41
|
+
expect(await store.getAgentBySlug('nonexistent')).toBeNull();
|
|
42
|
+
});
|
|
43
|
+
it('returns agent by slug', async () => {
|
|
44
|
+
store.seedAgent(makeAgent({ id: 'a1', slug: 'researcher' }));
|
|
45
|
+
store.seedAgent(makeAgent({ id: 'a2', slug: 'analyst' }));
|
|
46
|
+
const result = await store.getAgentBySlug('researcher');
|
|
47
|
+
expect(result?.id).toBe('a1');
|
|
48
|
+
});
|
|
49
|
+
it('returns first match when multiple agents have same slug', async () => {
|
|
50
|
+
store.seedAgent(makeAgent({ id: 'a1', slug: 'analyst' }));
|
|
51
|
+
store.seedAgent(makeAgent({ id: 'a2', slug: 'analyst' }));
|
|
52
|
+
const result = await store.getAgentBySlug('analyst');
|
|
53
|
+
expect(result?.id).toBe('a1');
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
// ─── getFirstEnabledAgent ─────────────────────────────────
|
|
57
|
+
describe('getFirstEnabledAgent', () => {
|
|
58
|
+
it('returns null for empty store', async () => {
|
|
59
|
+
expect(await store.getFirstEnabledAgent()).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
it('returns null when all agents are disabled', async () => {
|
|
62
|
+
store.seedAgent(makeAgent({ id: 'a1', is_enabled: false }));
|
|
63
|
+
store.seedAgent(makeAgent({ id: 'a2', is_enabled: false }));
|
|
64
|
+
expect(await store.getFirstEnabledAgent()).toBeNull();
|
|
65
|
+
});
|
|
66
|
+
it('returns the first enabled agent', async () => {
|
|
67
|
+
store.seedAgent(makeAgent({ id: 'a1', is_enabled: false }));
|
|
68
|
+
store.seedAgent(makeAgent({ id: 'a2', is_enabled: true, slug: 'enabled-one' }));
|
|
69
|
+
store.seedAgent(makeAgent({ id: 'a3', is_enabled: true, slug: 'enabled-two' }));
|
|
70
|
+
const result = await store.getFirstEnabledAgent();
|
|
71
|
+
expect(result?.id).toBe('a2');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
// ─── listAgents ───────────────────────────────────────────
|
|
75
|
+
describe('listAgents', () => {
|
|
76
|
+
it('returns empty array for empty store', async () => {
|
|
77
|
+
expect(await store.listAgents()).toEqual([]);
|
|
78
|
+
});
|
|
79
|
+
it('returns all agents by default', async () => {
|
|
80
|
+
store.seedAgent(makeAgent({ id: 'a1', is_enabled: true }));
|
|
81
|
+
store.seedAgent(makeAgent({ id: 'a2', is_enabled: false }));
|
|
82
|
+
const result = await store.listAgents();
|
|
83
|
+
expect(result).toHaveLength(2);
|
|
84
|
+
});
|
|
85
|
+
it('filters to enabled only when requested', async () => {
|
|
86
|
+
store.seedAgent(makeAgent({ id: 'a1', is_enabled: true }));
|
|
87
|
+
store.seedAgent(makeAgent({ id: 'a2', is_enabled: false }));
|
|
88
|
+
store.seedAgent(makeAgent({ id: 'a3', is_enabled: true }));
|
|
89
|
+
const result = await store.listAgents({ enabledOnly: true });
|
|
90
|
+
expect(result).toHaveLength(2);
|
|
91
|
+
expect(result.every((a) => a.is_enabled)).toBe(true);
|
|
92
|
+
});
|
|
93
|
+
it('returns all agents when enabledOnly is false', async () => {
|
|
94
|
+
store.seedAgent(makeAgent({ id: 'a1', is_enabled: true }));
|
|
95
|
+
store.seedAgent(makeAgent({ id: 'a2', is_enabled: false }));
|
|
96
|
+
const result = await store.listAgents({ enabledOnly: false });
|
|
97
|
+
expect(result).toHaveLength(2);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
// ─── clear ────────────────────────────────────────────────
|
|
101
|
+
describe('clear', () => {
|
|
102
|
+
it('removes all agents', async () => {
|
|
103
|
+
store.seedAgent(makeAgent({ id: 'a1' }));
|
|
104
|
+
store.seedAgent(makeAgent({ id: 'a2' }));
|
|
105
|
+
store.clear();
|
|
106
|
+
expect(await store.listAgents()).toEqual([]);
|
|
107
|
+
expect(await store.getAgentById('a1')).toBeNull();
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=in-memory-agent-store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-agent-store.test.js","sourceRoot":"","sources":["../../src/testing/in-memory-agent-store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ChatStore, MessageRecord, ConversationListItem, SendMessageInput } from "@sprinterai/core";
|
|
2
|
+
/** In-memory ChatStore for testing. */
|
|
3
|
+
export declare class InMemoryChatStore implements ChatStore {
|
|
4
|
+
private chats;
|
|
5
|
+
private messages;
|
|
6
|
+
private nextChatId;
|
|
7
|
+
private nextMessageId;
|
|
8
|
+
getChat(chatId: string): Promise<ConversationListItem | null>;
|
|
9
|
+
createChat(options: {
|
|
10
|
+
title?: string;
|
|
11
|
+
chatType: "ai" | "direct" | "group";
|
|
12
|
+
agentSlug?: string;
|
|
13
|
+
}): Promise<ConversationListItem>;
|
|
14
|
+
getMessages(chatId: string, options?: {
|
|
15
|
+
limit?: number;
|
|
16
|
+
before?: string;
|
|
17
|
+
}): Promise<MessageRecord[]>;
|
|
18
|
+
saveMessage(chatId: string, input: SendMessageInput & {
|
|
19
|
+
senderType: "user" | "agent" | "system";
|
|
20
|
+
senderId?: string;
|
|
21
|
+
}): Promise<MessageRecord>;
|
|
22
|
+
getChatsByUser(_userId: string, options?: {
|
|
23
|
+
limit?: number;
|
|
24
|
+
}): Promise<ConversationListItem[]>;
|
|
25
|
+
/** Test helper: clear all data. */
|
|
26
|
+
clear(): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=in-memory-chat-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-chat-store.d.ts","sourceRoot":"","sources":["../../src/testing/in-memory-chat-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAE1B,uCAAuC;AACvC,qBAAa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAK;IAEpB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAI7D,UAAU,CAAC,OAAO,EAAE;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,IAAI,GAAG,QAAQ,GAAG,OAAO,CAAC;QACpC,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2B3B,WAAW,CACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5C,OAAO,CAAC,aAAa,EAAE,CAAC;IAcrB,WAAW,CACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,GAAG;QACxB,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;QACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GACA,OAAO,CAAC,aAAa,CAAC;IA8BnB,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3B,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAWlC,mCAAmC;IACnC,KAAK,IAAI,IAAI;CAMd"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/** In-memory ChatStore for testing. */
|
|
2
|
+
export class InMemoryChatStore {
|
|
3
|
+
chats = new Map();
|
|
4
|
+
messages = new Map();
|
|
5
|
+
nextChatId = 1;
|
|
6
|
+
nextMessageId = 1;
|
|
7
|
+
async getChat(chatId) {
|
|
8
|
+
return this.chats.get(chatId) ?? null;
|
|
9
|
+
}
|
|
10
|
+
async createChat(options) {
|
|
11
|
+
const id = `chat-${this.nextChatId++}`;
|
|
12
|
+
const now = new Date().toISOString();
|
|
13
|
+
const chat = {
|
|
14
|
+
id,
|
|
15
|
+
title: options.title ?? null,
|
|
16
|
+
chat_type: options.chatType,
|
|
17
|
+
created_at: now,
|
|
18
|
+
updated_at: now,
|
|
19
|
+
participants: options.agentSlug
|
|
20
|
+
? [
|
|
21
|
+
{
|
|
22
|
+
participant_type: "agent",
|
|
23
|
+
participant_id: options.agentSlug,
|
|
24
|
+
display_name: options.agentSlug,
|
|
25
|
+
auto_respond: true,
|
|
26
|
+
},
|
|
27
|
+
]
|
|
28
|
+
: [],
|
|
29
|
+
unread_count: 0,
|
|
30
|
+
};
|
|
31
|
+
this.chats.set(id, chat);
|
|
32
|
+
this.messages.set(id, []);
|
|
33
|
+
return chat;
|
|
34
|
+
}
|
|
35
|
+
async getMessages(chatId, options) {
|
|
36
|
+
let msgs = this.messages.get(chatId) ?? [];
|
|
37
|
+
if (options?.before) {
|
|
38
|
+
msgs = msgs.filter((m) => m.created_at < options.before);
|
|
39
|
+
}
|
|
40
|
+
if (options?.limit) {
|
|
41
|
+
msgs = msgs.slice(-options.limit);
|
|
42
|
+
}
|
|
43
|
+
return msgs;
|
|
44
|
+
}
|
|
45
|
+
async saveMessage(chatId, input) {
|
|
46
|
+
const id = `msg-${this.nextMessageId++}`;
|
|
47
|
+
const now = new Date().toISOString();
|
|
48
|
+
const message = {
|
|
49
|
+
id,
|
|
50
|
+
chat_id: chatId,
|
|
51
|
+
sender_type: input.senderType,
|
|
52
|
+
sender_id: input.senderId ?? null,
|
|
53
|
+
content: input.content,
|
|
54
|
+
parts: input.parts ?? null,
|
|
55
|
+
metadata: null,
|
|
56
|
+
created_at: now,
|
|
57
|
+
};
|
|
58
|
+
const chatMessages = this.messages.get(chatId);
|
|
59
|
+
if (chatMessages) {
|
|
60
|
+
chatMessages.push(message);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this.messages.set(chatId, [message]);
|
|
64
|
+
}
|
|
65
|
+
// Update chat's updated_at
|
|
66
|
+
const chat = this.chats.get(chatId);
|
|
67
|
+
if (chat) {
|
|
68
|
+
this.chats.set(chatId, { ...chat, updated_at: now });
|
|
69
|
+
}
|
|
70
|
+
return message;
|
|
71
|
+
}
|
|
72
|
+
async getChatsByUser(_userId, options) {
|
|
73
|
+
const all = Array.from(this.chats.values()).sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime());
|
|
74
|
+
if (options?.limit) {
|
|
75
|
+
return all.slice(0, options.limit);
|
|
76
|
+
}
|
|
77
|
+
return all;
|
|
78
|
+
}
|
|
79
|
+
/** Test helper: clear all data. */
|
|
80
|
+
clear() {
|
|
81
|
+
this.chats.clear();
|
|
82
|
+
this.messages.clear();
|
|
83
|
+
this.nextChatId = 1;
|
|
84
|
+
this.nextMessageId = 1;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=in-memory-chat-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-chat-store.js","sourceRoot":"","sources":["../../src/testing/in-memory-chat-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { EntityStore, EntityRecord, EntityTypeRecord, CreateEntityInput, UpdateEntityInput } from "@sprinterai/core";
|
|
2
|
+
/** In-memory EntityStore for testing. */
|
|
3
|
+
export declare class InMemoryEntityStore implements EntityStore {
|
|
4
|
+
private entities;
|
|
5
|
+
private entityTypes;
|
|
6
|
+
private relations;
|
|
7
|
+
private nextId;
|
|
8
|
+
/** Seed entity types for test setup. */
|
|
9
|
+
seedEntityType(type: EntityTypeRecord): void;
|
|
10
|
+
/** Seed entities for test setup. */
|
|
11
|
+
seedEntity(entity: EntityRecord): void;
|
|
12
|
+
getEntityType(slugOrId: string): Promise<EntityTypeRecord | null>;
|
|
13
|
+
listEntityTypes(): Promise<EntityTypeRecord[]>;
|
|
14
|
+
getEntity(id: string): Promise<EntityRecord | null>;
|
|
15
|
+
searchEntities(query: string, options?: {
|
|
16
|
+
typeSlug?: string;
|
|
17
|
+
tag?: string;
|
|
18
|
+
limit?: number;
|
|
19
|
+
}): Promise<EntityRecord[]>;
|
|
20
|
+
createEntity(input: CreateEntityInput): Promise<EntityRecord>;
|
|
21
|
+
updateEntity(id: string, input: UpdateEntityInput): Promise<EntityRecord>;
|
|
22
|
+
deleteEntity(id: string): Promise<void>;
|
|
23
|
+
createRelation(fromId: string, toId: string, type: string): Promise<void>;
|
|
24
|
+
getEntityCounts(tenantId: string): Promise<Record<string, number>>;
|
|
25
|
+
/** Test helper: get all relations. */
|
|
26
|
+
getRelations(): Array<{
|
|
27
|
+
fromId: string;
|
|
28
|
+
toId: string;
|
|
29
|
+
type: string;
|
|
30
|
+
}>;
|
|
31
|
+
/** Test helper: clear all data. */
|
|
32
|
+
clear(): void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=in-memory-entity-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-entity-store.d.ts","sourceRoot":"","sources":["../../src/testing/in-memory-entity-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAE1B,yCAAyC;AACzC,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,WAAW,CAAuC;IAC1D,OAAO,CAAC,SAAS,CAIT;IACR,OAAO,CAAC,MAAM,CAAK;IAEnB,wCAAwC;IACxC,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAK5C,oCAAoC;IACpC,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIhC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAIjE,eAAe,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAY9C,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAInD,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5D,OAAO,CAAC,YAAY,EAAE,CAAC;IA8BpB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IA+B7D,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,YAAY,CAAC;IAwBlB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvC,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC;IAIV,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAWxE,sCAAsC;IACtC,YAAY,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAIrE,mCAAmC;IACnC,KAAK,IAAI,IAAI;CAMd"}
|