cognitive-core 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +302 -116
- package/SKILL.md +193 -0
- package/dist/agents/index.d.ts +3 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +5 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/mock-provider.d.ts +23 -0
- package/dist/agents/mock-provider.d.ts.map +1 -0
- package/dist/agents/mock-provider.js +71 -0
- package/dist/agents/mock-provider.js.map +1 -0
- package/dist/agents/types.d.ts +98 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +44 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/atlas.d.ts +196 -0
- package/dist/atlas.d.ts.map +1 -0
- package/dist/atlas.js +373 -0
- package/dist/atlas.js.map +1 -0
- package/dist/bin/cognitive-core.d.ts +18 -0
- package/dist/bin/cognitive-core.d.ts.map +1 -0
- package/dist/bin/cognitive-core.js +419 -0
- package/dist/bin/cognitive-core.js.map +1 -0
- package/dist/embeddings/bm25.d.ts +104 -0
- package/dist/embeddings/bm25.d.ts.map +1 -0
- package/dist/embeddings/bm25.js +264 -0
- package/dist/embeddings/bm25.js.map +1 -0
- package/dist/embeddings/index.d.ts +12 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +16 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/manager.d.ts +112 -0
- package/dist/embeddings/manager.d.ts.map +1 -0
- package/dist/embeddings/manager.js +215 -0
- package/dist/embeddings/manager.js.map +1 -0
- package/dist/embeddings/provider.d.ts +101 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +232 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/embeddings/vector-store.d.ts +101 -0
- package/dist/embeddings/vector-store.d.ts.map +1 -0
- package/dist/embeddings/vector-store.js +256 -0
- package/dist/embeddings/vector-store.js.map +1 -0
- package/dist/factory.d.ts +193 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +109 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +30 -453
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -509
- package/dist/index.js.map +1 -0
- package/dist/learning/analyzer.d.ts +110 -0
- package/dist/learning/analyzer.d.ts.map +1 -0
- package/dist/learning/analyzer.js +213 -0
- package/dist/learning/analyzer.js.map +1 -0
- package/dist/learning/effectiveness.d.ts +158 -0
- package/dist/learning/effectiveness.d.ts.map +1 -0
- package/dist/learning/effectiveness.js +251 -0
- package/dist/learning/effectiveness.js.map +1 -0
- package/dist/learning/index.d.ts +8 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +11 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/learning/llm-extractor.d.ts +88 -0
- package/dist/learning/llm-extractor.d.ts.map +1 -0
- package/dist/learning/llm-extractor.js +372 -0
- package/dist/learning/llm-extractor.js.map +1 -0
- package/dist/learning/meta-learner.d.ts +80 -0
- package/dist/learning/meta-learner.d.ts.map +1 -0
- package/dist/learning/meta-learner.js +355 -0
- package/dist/learning/meta-learner.js.map +1 -0
- package/dist/learning/pipeline.d.ts +65 -0
- package/dist/learning/pipeline.d.ts.map +1 -0
- package/dist/learning/pipeline.js +170 -0
- package/dist/learning/pipeline.js.map +1 -0
- package/dist/learning/playbook-extractor.d.ts +113 -0
- package/dist/learning/playbook-extractor.d.ts.map +1 -0
- package/dist/learning/playbook-extractor.js +523 -0
- package/dist/learning/playbook-extractor.js.map +1 -0
- package/dist/learning/usage-inference.d.ts +82 -0
- package/dist/learning/usage-inference.d.ts.map +1 -0
- package/dist/learning/usage-inference.js +261 -0
- package/dist/learning/usage-inference.js.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +6 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/playbook-server.d.ts +120 -0
- package/dist/mcp/playbook-server.d.ts.map +1 -0
- package/dist/mcp/playbook-server.js +427 -0
- package/dist/mcp/playbook-server.js.map +1 -0
- package/dist/memory/curated-loader.d.ts +62 -0
- package/dist/memory/curated-loader.d.ts.map +1 -0
- package/dist/memory/curated-loader.js +106 -0
- package/dist/memory/curated-loader.js.map +1 -0
- package/dist/memory/experience.d.ts +122 -0
- package/dist/memory/experience.d.ts.map +1 -0
- package/dist/memory/experience.js +392 -0
- package/dist/memory/experience.js.map +1 -0
- package/dist/memory/index.d.ts +6 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +9 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/meta.d.ts +90 -0
- package/dist/memory/meta.d.ts.map +1 -0
- package/dist/memory/meta.js +362 -0
- package/dist/memory/meta.js.map +1 -0
- package/dist/memory/playbook.d.ts +133 -0
- package/dist/memory/playbook.d.ts.map +1 -0
- package/dist/memory/playbook.js +357 -0
- package/dist/memory/playbook.js.map +1 -0
- package/dist/memory/system.d.ts +167 -0
- package/dist/memory/system.d.ts.map +1 -0
- package/dist/memory/system.js +383 -0
- package/dist/memory/system.js.map +1 -0
- package/dist/runtime/backends/acp.d.ts +67 -0
- package/dist/runtime/backends/acp.d.ts.map +1 -0
- package/dist/runtime/backends/acp.js +290 -0
- package/dist/runtime/backends/acp.js.map +1 -0
- package/dist/runtime/backends/index.d.ts +5 -0
- package/dist/runtime/backends/index.d.ts.map +1 -0
- package/dist/runtime/backends/index.js +6 -0
- package/dist/runtime/backends/index.js.map +1 -0
- package/dist/runtime/backends/mock.d.ts +67 -0
- package/dist/runtime/backends/mock.d.ts.map +1 -0
- package/dist/runtime/backends/mock.js +153 -0
- package/dist/runtime/backends/mock.js.map +1 -0
- package/dist/runtime/backends/subprocess.d.ts +56 -0
- package/dist/runtime/backends/subprocess.d.ts.map +1 -0
- package/dist/runtime/backends/subprocess.js +260 -0
- package/dist/runtime/backends/subprocess.js.map +1 -0
- package/dist/runtime/flows/learning.d.ts +73 -0
- package/dist/runtime/flows/learning.d.ts.map +1 -0
- package/dist/runtime/flows/learning.js +116 -0
- package/dist/runtime/flows/learning.js.map +1 -0
- package/dist/runtime/flows/validation.d.ts +122 -0
- package/dist/runtime/flows/validation.d.ts.map +1 -0
- package/dist/runtime/flows/validation.js +223 -0
- package/dist/runtime/flows/validation.js.map +1 -0
- package/dist/runtime/index.d.ts +6 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +8 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/manager.d.ts +116 -0
- package/dist/runtime/manager.d.ts.map +1 -0
- package/dist/runtime/manager.js +416 -0
- package/dist/runtime/manager.js.map +1 -0
- package/dist/runtime/types.d.ts +138 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/search/evaluator.d.ts +102 -0
- package/dist/search/evaluator.d.ts.map +1 -0
- package/dist/search/evaluator.js +352 -0
- package/dist/search/evaluator.js.map +1 -0
- package/dist/search/index.d.ts +7 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +11 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/refinement-loop.d.ts +73 -0
- package/dist/search/refinement-loop.d.ts.map +1 -0
- package/dist/search/refinement-loop.js +245 -0
- package/dist/search/refinement-loop.js.map +1 -0
- package/dist/search/refinement-types.d.ts +154 -0
- package/dist/search/refinement-types.d.ts.map +1 -0
- package/dist/search/refinement-types.js +99 -0
- package/dist/search/refinement-types.js.map +1 -0
- package/dist/search/router.d.ts +61 -0
- package/dist/search/router.d.ts.map +1 -0
- package/dist/search/router.js +197 -0
- package/dist/search/router.js.map +1 -0
- package/dist/search/solver.d.ts +75 -0
- package/dist/search/solver.d.ts.map +1 -0
- package/dist/search/solver.js +216 -0
- package/dist/search/solver.js.map +1 -0
- package/dist/search/verification-runner.d.ts +125 -0
- package/dist/search/verification-runner.d.ts.map +1 -0
- package/dist/search/verification-runner.js +440 -0
- package/dist/search/verification-runner.js.map +1 -0
- package/dist/surfacing/index.d.ts +2 -0
- package/dist/surfacing/index.d.ts.map +1 -0
- package/dist/surfacing/index.js +2 -0
- package/dist/surfacing/index.js.map +1 -0
- package/dist/surfacing/skill-library.d.ts +158 -0
- package/dist/surfacing/skill-library.d.ts.map +1 -0
- package/dist/surfacing/skill-library.js +429 -0
- package/dist/surfacing/skill-library.js.map +1 -0
- package/dist/types/config.d.ts +1113 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +274 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +14 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/memory.d.ts +339 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +207 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/types/meta.d.ts +146 -0
- package/dist/types/meta.d.ts.map +1 -0
- package/dist/types/meta.js +51 -0
- package/dist/types/meta.js.map +1 -0
- package/dist/types/outcome.d.ts +42 -0
- package/dist/types/outcome.d.ts.map +1 -0
- package/dist/types/outcome.js +50 -0
- package/dist/types/outcome.js.map +1 -0
- package/dist/types/playbook.d.ts +119 -0
- package/dist/types/playbook.d.ts.map +1 -0
- package/dist/types/playbook.js +71 -0
- package/dist/types/playbook.js.map +1 -0
- package/dist/types/step.d.ts +44 -0
- package/dist/types/step.d.ts.map +1 -0
- package/dist/types/step.js +32 -0
- package/dist/types/step.js.map +1 -0
- package/dist/types/task.d.ts +91 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +39 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/trajectory.d.ts +221 -0
- package/dist/types/trajectory.d.ts.map +1 -0
- package/dist/types/trajectory.js +60 -0
- package/dist/types/trajectory.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/similarity.d.ts +31 -0
- package/dist/utils/similarity.d.ts.map +1 -0
- package/dist/utils/similarity.js +107 -0
- package/dist/utils/similarity.js.map +1 -0
- package/dist/utils/storage.d.ts +106 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +203 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/validation.d.ts +129 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +171 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +50 -34
- package/scripts/migrate-to-playbooks.ts +307 -0
- package/src/agents/index.ts +14 -0
- package/src/agents/mock-provider.ts +93 -0
- package/src/agents/types.ts +137 -0
- package/src/atlas.ts +560 -0
- package/src/bin/cognitive-core.ts +470 -0
- package/src/embeddings/bm25.ts +337 -0
- package/src/embeddings/index.ts +39 -0
- package/src/embeddings/manager.ts +288 -0
- package/src/embeddings/provider.ts +311 -0
- package/src/embeddings/vector-store.ts +353 -0
- package/src/factory.ts +263 -0
- package/src/index.ts +246 -0
- package/src/learning/analyzer.ts +335 -0
- package/src/learning/effectiveness.ts +428 -0
- package/src/learning/index.ts +58 -0
- package/src/learning/llm-extractor.ts +542 -0
- package/src/learning/meta-learner.ts +516 -0
- package/src/learning/pipeline.ts +244 -0
- package/src/learning/playbook-extractor.ts +702 -0
- package/src/learning/usage-inference.ts +372 -0
- package/src/mcp/index.ts +12 -0
- package/src/mcp/playbook-server.ts +565 -0
- package/src/memory/curated-loader.ts +160 -0
- package/src/memory/experience.ts +515 -0
- package/src/memory/index.ts +27 -0
- package/src/memory/meta.ts +506 -0
- package/src/memory/playbook.ts +493 -0
- package/src/memory/system.ts +551 -0
- package/src/runtime/backends/acp.ts +378 -0
- package/src/runtime/backends/index.ts +24 -0
- package/src/runtime/backends/mock.ts +218 -0
- package/src/runtime/backends/subprocess.ts +356 -0
- package/src/runtime/flows/learning.ts +183 -0
- package/src/runtime/flows/validation.ts +381 -0
- package/src/runtime/index.ts +53 -0
- package/src/runtime/manager.ts +541 -0
- package/src/runtime/types.ts +157 -0
- package/src/search/evaluator.ts +474 -0
- package/src/search/index.ts +59 -0
- package/src/search/refinement-loop.ts +363 -0
- package/src/search/refinement-types.ts +159 -0
- package/src/search/router.ts +261 -0
- package/src/search/solver.ts +303 -0
- package/src/search/verification-runner.ts +570 -0
- package/src/surfacing/index.ts +6 -0
- package/src/surfacing/skill-library.ts +594 -0
- package/src/types/config.ts +333 -0
- package/src/types/index.ts +130 -0
- package/src/types/memory.ts +270 -0
- package/src/types/meta.ts +218 -0
- package/src/types/outcome.ts +66 -0
- package/src/types/playbook.ts +196 -0
- package/src/types/step.ts +40 -0
- package/src/types/task.ts +52 -0
- package/src/types/trajectory.ts +80 -0
- package/src/utils/index.ts +38 -0
- package/src/utils/similarity.ts +139 -0
- package/src/utils/storage.ts +249 -0
- package/src/utils/validation.ts +286 -0
- package/tests/embeddings/bm25.test.ts +130 -0
- package/tests/embeddings/manager.test.ts +205 -0
- package/tests/integration/atlas.test.ts +266 -0
- package/tests/integration/e2e.test.ts +929 -0
- package/tests/learning/analyzer.test.ts +426 -0
- package/tests/learning/effectiveness.test.ts +542 -0
- package/tests/learning/pipeline.test.ts +176 -0
- package/tests/learning/playbook-extractor-provenance.test.ts +114 -0
- package/tests/learning/usage-inference.test.ts +254 -0
- package/tests/mcp/playbook-server.test.ts +252 -0
- package/tests/memory/experience.test.ts +198 -0
- package/tests/memory/playbook.test.ts +338 -0
- package/tests/memory/provenance.test.ts +639 -0
- package/tests/memory/system.test.ts +325 -0
- package/tests/runtime/agent-manager.test.ts +512 -0
- package/tests/runtime/mock-backend.test.ts +248 -0
- package/tests/search/refinement-loop.test.ts +468 -0
- package/tests/search/refinement.test.ts +267 -0
- package/tests/search/router.test.ts +427 -0
- package/tests/surfacing/skill-library.test.ts +292 -0
- package/tests/types/outcome.test.ts +147 -0
- package/tests/types/step.test.ts +133 -0
- package/tests/types/task.test.ts +158 -0
- package/tests/types/trajectory.test.ts +253 -0
- package/tests/utils/similarity.test.ts +188 -0
- package/tests/utils/validation.test.ts +252 -0
- package/tsconfig.json +25 -0
- package/vitest.config.ts +22 -0
- package/dist/index.d.mts +0 -466
- package/dist/index.mjs +0 -478
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight file-based storage (Claudeception-inspired)
|
|
3
|
+
* Uses JSON files for simplicity and human-readability
|
|
4
|
+
*/
|
|
5
|
+
export interface StorageOptions {
|
|
6
|
+
baseDir: string;
|
|
7
|
+
prettyPrint?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Ensure directory exists
|
|
11
|
+
*/
|
|
12
|
+
export declare function ensureDir(path: string): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Save data to a JSON file
|
|
15
|
+
*/
|
|
16
|
+
export declare function saveJson<T>(filePath: string, data: T, options?: {
|
|
17
|
+
pretty?: boolean;
|
|
18
|
+
}): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Load data from a JSON file
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadJson<T>(filePath: string): Promise<T | null>;
|
|
23
|
+
/**
|
|
24
|
+
* List files in a directory
|
|
25
|
+
*/
|
|
26
|
+
export declare function listFiles(dir: string, extension?: string): Promise<string[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Check if a path exists
|
|
29
|
+
*/
|
|
30
|
+
export declare function exists(path: string): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Simple key-value store backed by JSON files
|
|
33
|
+
*/
|
|
34
|
+
export declare class JsonStore<T> {
|
|
35
|
+
private baseDir;
|
|
36
|
+
private collection;
|
|
37
|
+
private options;
|
|
38
|
+
private cache;
|
|
39
|
+
private dirty;
|
|
40
|
+
private autoSaveTimer;
|
|
41
|
+
constructor(baseDir: string, collection: string, options?: {
|
|
42
|
+
autoSaveInterval?: number;
|
|
43
|
+
pretty?: boolean;
|
|
44
|
+
});
|
|
45
|
+
/**
|
|
46
|
+
* Get the file path for a key
|
|
47
|
+
*/
|
|
48
|
+
private getPath;
|
|
49
|
+
/**
|
|
50
|
+
* Initialize the store and load existing data
|
|
51
|
+
*/
|
|
52
|
+
init(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Get an item by key
|
|
55
|
+
*/
|
|
56
|
+
get(key: string): T | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Set an item
|
|
59
|
+
*/
|
|
60
|
+
set(key: string, value: T): void;
|
|
61
|
+
/**
|
|
62
|
+
* Delete an item
|
|
63
|
+
*/
|
|
64
|
+
delete(key: string): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Check if key exists
|
|
67
|
+
*/
|
|
68
|
+
has(key: string): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Get all items
|
|
71
|
+
*/
|
|
72
|
+
values(): T[];
|
|
73
|
+
/**
|
|
74
|
+
* Get all keys
|
|
75
|
+
*/
|
|
76
|
+
keys(): string[];
|
|
77
|
+
/**
|
|
78
|
+
* Get all entries
|
|
79
|
+
*/
|
|
80
|
+
entries(): Array<[string, T]>;
|
|
81
|
+
/**
|
|
82
|
+
* Get item count
|
|
83
|
+
*/
|
|
84
|
+
size(): number;
|
|
85
|
+
/**
|
|
86
|
+
* Flush dirty items to disk
|
|
87
|
+
*/
|
|
88
|
+
flush(): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Save a single item immediately
|
|
91
|
+
*/
|
|
92
|
+
save(key: string): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Close the store (flush and stop auto-save)
|
|
95
|
+
*/
|
|
96
|
+
close(): Promise<void>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create a store index file (for quick lookups without loading all items)
|
|
100
|
+
*/
|
|
101
|
+
export declare function saveIndex(baseDir: string, collection: string, index: Record<string, unknown>): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Load a store index
|
|
104
|
+
*/
|
|
105
|
+
export declare function loadIndex(baseDir: string, collection: string): Promise<Record<string, unknown> | null>;
|
|
106
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3D;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAOrE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAUnB;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3D;AAED;;GAEG;AACH,qBAAa,SAAS,CAAC,CAAC;IAMpB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IAPjB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,aAAa,CAA+C;gBAG1D,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO;IAGvE;;OAEG;IACH,OAAO,CAAC,OAAO;IAIf;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAI/B;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAKhC;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAK5B;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,MAAM,IAAI,CAAC,EAAE;IAIb;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAIhB;;OAEG;IACH,OAAO,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAI7B;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5B;;OAEG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAGzC"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir, readdir, stat } from 'node:fs/promises';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
/**
|
|
5
|
+
* Ensure directory exists
|
|
6
|
+
*/
|
|
7
|
+
export async function ensureDir(path) {
|
|
8
|
+
if (!existsSync(path)) {
|
|
9
|
+
await mkdir(path, { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Save data to a JSON file
|
|
14
|
+
*/
|
|
15
|
+
export async function saveJson(filePath, data, options) {
|
|
16
|
+
await ensureDir(dirname(filePath));
|
|
17
|
+
const content = options?.pretty
|
|
18
|
+
? JSON.stringify(data, null, 2)
|
|
19
|
+
: JSON.stringify(data);
|
|
20
|
+
await writeFile(filePath, content, 'utf-8');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Load data from a JSON file
|
|
24
|
+
*/
|
|
25
|
+
export async function loadJson(filePath) {
|
|
26
|
+
try {
|
|
27
|
+
const content = await readFile(filePath, 'utf-8');
|
|
28
|
+
return JSON.parse(content);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* List files in a directory
|
|
36
|
+
*/
|
|
37
|
+
export async function listFiles(dir, extension) {
|
|
38
|
+
try {
|
|
39
|
+
const files = await readdir(dir);
|
|
40
|
+
if (extension) {
|
|
41
|
+
return files.filter((f) => f.endsWith(extension));
|
|
42
|
+
}
|
|
43
|
+
return files;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if a path exists
|
|
51
|
+
*/
|
|
52
|
+
export async function exists(path) {
|
|
53
|
+
try {
|
|
54
|
+
await stat(path);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Simple key-value store backed by JSON files
|
|
63
|
+
*/
|
|
64
|
+
export class JsonStore {
|
|
65
|
+
baseDir;
|
|
66
|
+
collection;
|
|
67
|
+
options;
|
|
68
|
+
cache = new Map();
|
|
69
|
+
dirty = new Set();
|
|
70
|
+
autoSaveTimer = null;
|
|
71
|
+
constructor(baseDir, collection, options = {}) {
|
|
72
|
+
this.baseDir = baseDir;
|
|
73
|
+
this.collection = collection;
|
|
74
|
+
this.options = options;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get the file path for a key
|
|
78
|
+
*/
|
|
79
|
+
getPath(key) {
|
|
80
|
+
return join(this.baseDir, this.collection, `${key}.json`);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Initialize the store and load existing data
|
|
84
|
+
*/
|
|
85
|
+
async init() {
|
|
86
|
+
const dir = join(this.baseDir, this.collection);
|
|
87
|
+
await ensureDir(dir);
|
|
88
|
+
// Load existing items
|
|
89
|
+
const files = await listFiles(dir, '.json');
|
|
90
|
+
for (const file of files) {
|
|
91
|
+
const key = file.replace('.json', '');
|
|
92
|
+
const data = await loadJson(join(dir, file));
|
|
93
|
+
if (data) {
|
|
94
|
+
this.cache.set(key, data);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Start auto-save if configured
|
|
98
|
+
if (this.options.autoSaveInterval) {
|
|
99
|
+
this.autoSaveTimer = setInterval(() => this.flush(), this.options.autoSaveInterval);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get an item by key
|
|
104
|
+
*/
|
|
105
|
+
get(key) {
|
|
106
|
+
return this.cache.get(key);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Set an item
|
|
110
|
+
*/
|
|
111
|
+
set(key, value) {
|
|
112
|
+
this.cache.set(key, value);
|
|
113
|
+
this.dirty.add(key);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Delete an item
|
|
117
|
+
*/
|
|
118
|
+
delete(key) {
|
|
119
|
+
this.dirty.add(key);
|
|
120
|
+
return this.cache.delete(key);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if key exists
|
|
124
|
+
*/
|
|
125
|
+
has(key) {
|
|
126
|
+
return this.cache.has(key);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get all items
|
|
130
|
+
*/
|
|
131
|
+
values() {
|
|
132
|
+
return Array.from(this.cache.values());
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get all keys
|
|
136
|
+
*/
|
|
137
|
+
keys() {
|
|
138
|
+
return Array.from(this.cache.keys());
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get all entries
|
|
142
|
+
*/
|
|
143
|
+
entries() {
|
|
144
|
+
return Array.from(this.cache.entries());
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get item count
|
|
148
|
+
*/
|
|
149
|
+
size() {
|
|
150
|
+
return this.cache.size;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Flush dirty items to disk
|
|
154
|
+
*/
|
|
155
|
+
async flush() {
|
|
156
|
+
for (const key of this.dirty) {
|
|
157
|
+
const value = this.cache.get(key);
|
|
158
|
+
const path = this.getPath(key);
|
|
159
|
+
if (value === undefined) {
|
|
160
|
+
// Item was deleted - we could delete the file too
|
|
161
|
+
// For now, we'll leave it (soft delete)
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
await saveJson(path, value, { pretty: this.options.pretty });
|
|
165
|
+
}
|
|
166
|
+
this.dirty.clear();
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Save a single item immediately
|
|
170
|
+
*/
|
|
171
|
+
async save(key) {
|
|
172
|
+
const value = this.cache.get(key);
|
|
173
|
+
if (value) {
|
|
174
|
+
await saveJson(this.getPath(key), value, { pretty: this.options.pretty });
|
|
175
|
+
this.dirty.delete(key);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Close the store (flush and stop auto-save)
|
|
180
|
+
*/
|
|
181
|
+
async close() {
|
|
182
|
+
if (this.autoSaveTimer) {
|
|
183
|
+
clearInterval(this.autoSaveTimer);
|
|
184
|
+
this.autoSaveTimer = null;
|
|
185
|
+
}
|
|
186
|
+
await this.flush();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Create a store index file (for quick lookups without loading all items)
|
|
191
|
+
*/
|
|
192
|
+
export async function saveIndex(baseDir, collection, index) {
|
|
193
|
+
const path = join(baseDir, collection, '_index.json');
|
|
194
|
+
await saveJson(path, index, { pretty: true });
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Load a store index
|
|
198
|
+
*/
|
|
199
|
+
export async function loadIndex(baseDir, collection) {
|
|
200
|
+
const path = join(baseDir, collection, '_index.json');
|
|
201
|
+
return loadJson(path);
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation utilities
|
|
3
|
+
* Provides validation helpers for API boundaries
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* Validation error with details
|
|
8
|
+
*/
|
|
9
|
+
export declare class ValidationError extends Error {
|
|
10
|
+
readonly field: string;
|
|
11
|
+
readonly value: unknown;
|
|
12
|
+
constructor(message: string, field: string, value: unknown);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Validate a string field
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateString(value: unknown, field: string, options?: {
|
|
18
|
+
minLength?: number;
|
|
19
|
+
maxLength?: number;
|
|
20
|
+
pattern?: RegExp;
|
|
21
|
+
allowEmpty?: boolean;
|
|
22
|
+
}): string;
|
|
23
|
+
/**
|
|
24
|
+
* Validate an optional string field
|
|
25
|
+
*/
|
|
26
|
+
export declare function validateOptionalString(value: unknown, field: string, options?: {
|
|
27
|
+
minLength?: number;
|
|
28
|
+
maxLength?: number;
|
|
29
|
+
pattern?: RegExp;
|
|
30
|
+
}): string | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Validate a number field
|
|
33
|
+
*/
|
|
34
|
+
export declare function validateNumber(value: unknown, field: string, options?: {
|
|
35
|
+
min?: number;
|
|
36
|
+
max?: number;
|
|
37
|
+
integer?: boolean;
|
|
38
|
+
}): number;
|
|
39
|
+
/**
|
|
40
|
+
* Validate an optional number field
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateOptionalNumber(value: unknown, field: string, options?: {
|
|
43
|
+
min?: number;
|
|
44
|
+
max?: number;
|
|
45
|
+
integer?: boolean;
|
|
46
|
+
}): number | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Validate an array field
|
|
49
|
+
*/
|
|
50
|
+
export declare function validateArray<T>(value: unknown, field: string, itemValidator: (item: unknown, index: number) => T, options?: {
|
|
51
|
+
minLength?: number;
|
|
52
|
+
maxLength?: number;
|
|
53
|
+
}): T[];
|
|
54
|
+
/**
|
|
55
|
+
* Validate a vector (array of numbers) for embeddings
|
|
56
|
+
*/
|
|
57
|
+
export declare function validateVector(value: unknown, field: string, expectedDimension?: number): number[];
|
|
58
|
+
/**
|
|
59
|
+
* Validate task input parameters
|
|
60
|
+
*/
|
|
61
|
+
export declare const TaskInputSchema: z.ZodObject<{
|
|
62
|
+
description: z.ZodString;
|
|
63
|
+
domain: z.ZodDefault<z.ZodString>;
|
|
64
|
+
context: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
65
|
+
constraints: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
66
|
+
metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
67
|
+
}, "strip", z.ZodTypeAny, {
|
|
68
|
+
domain: string;
|
|
69
|
+
description: string;
|
|
70
|
+
context: Record<string, unknown>;
|
|
71
|
+
metadata: Record<string, unknown>;
|
|
72
|
+
constraints: string[];
|
|
73
|
+
}, {
|
|
74
|
+
description: string;
|
|
75
|
+
domain?: string | undefined;
|
|
76
|
+
context?: Record<string, unknown> | undefined;
|
|
77
|
+
metadata?: Record<string, unknown> | undefined;
|
|
78
|
+
constraints?: string[] | undefined;
|
|
79
|
+
}>;
|
|
80
|
+
export type TaskInput = z.infer<typeof TaskInputSchema>;
|
|
81
|
+
/**
|
|
82
|
+
* Validate task input
|
|
83
|
+
*/
|
|
84
|
+
export declare function validateTaskInput(input: unknown): TaskInput;
|
|
85
|
+
/**
|
|
86
|
+
* Validate trajectory step count
|
|
87
|
+
*/
|
|
88
|
+
export declare function validateTrajectoryStepCount(stepCount: number, options?: {
|
|
89
|
+
minSteps?: number;
|
|
90
|
+
maxSteps?: number;
|
|
91
|
+
}): void;
|
|
92
|
+
/**
|
|
93
|
+
* MCP tool argument validation schemas
|
|
94
|
+
*/
|
|
95
|
+
export declare const MCPSearchPlaybooksSchema: z.ZodObject<{
|
|
96
|
+
query: z.ZodString;
|
|
97
|
+
domain: z.ZodOptional<z.ZodString>;
|
|
98
|
+
maxResults: z.ZodOptional<z.ZodNumber>;
|
|
99
|
+
}, "strip", z.ZodTypeAny, {
|
|
100
|
+
query: string;
|
|
101
|
+
domain?: string | undefined;
|
|
102
|
+
maxResults?: number | undefined;
|
|
103
|
+
}, {
|
|
104
|
+
query: string;
|
|
105
|
+
domain?: string | undefined;
|
|
106
|
+
maxResults?: number | undefined;
|
|
107
|
+
}>;
|
|
108
|
+
export declare const MCPGetPlaybookDetailsSchema: z.ZodObject<{
|
|
109
|
+
playbookId: z.ZodString;
|
|
110
|
+
}, "strip", z.ZodTypeAny, {
|
|
111
|
+
playbookId: string;
|
|
112
|
+
}, {
|
|
113
|
+
playbookId: string;
|
|
114
|
+
}>;
|
|
115
|
+
export declare const MCPGetPlaybooksByDomainSchema: z.ZodObject<{
|
|
116
|
+
domain: z.ZodString;
|
|
117
|
+
maxResults: z.ZodOptional<z.ZodNumber>;
|
|
118
|
+
}, "strip", z.ZodTypeAny, {
|
|
119
|
+
domain: string;
|
|
120
|
+
maxResults?: number | undefined;
|
|
121
|
+
}, {
|
|
122
|
+
domain: string;
|
|
123
|
+
maxResults?: number | undefined;
|
|
124
|
+
}>;
|
|
125
|
+
/**
|
|
126
|
+
* Validate MCP tool arguments
|
|
127
|
+
*/
|
|
128
|
+
export declare function validateMCPArgs<T>(schema: z.ZodSchema<T>, args: unknown, toolName: string): T;
|
|
129
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation utilities
|
|
3
|
+
* Provides validation helpers for API boundaries
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* Validation error with details
|
|
8
|
+
*/
|
|
9
|
+
export class ValidationError extends Error {
|
|
10
|
+
field;
|
|
11
|
+
value;
|
|
12
|
+
constructor(message, field, value) {
|
|
13
|
+
super(`Validation error for '${field}': ${message}`);
|
|
14
|
+
this.field = field;
|
|
15
|
+
this.value = value;
|
|
16
|
+
this.name = 'ValidationError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Validate a string field
|
|
21
|
+
*/
|
|
22
|
+
export function validateString(value, field, options) {
|
|
23
|
+
if (typeof value !== 'string') {
|
|
24
|
+
throw new ValidationError(`Expected string, got ${typeof value}`, field, value);
|
|
25
|
+
}
|
|
26
|
+
const str = value;
|
|
27
|
+
const opts = options ?? {};
|
|
28
|
+
if (!opts.allowEmpty && str.trim().length === 0) {
|
|
29
|
+
throw new ValidationError('Cannot be empty', field, value);
|
|
30
|
+
}
|
|
31
|
+
if (opts.minLength !== undefined && str.length < opts.minLength) {
|
|
32
|
+
throw new ValidationError(`Must be at least ${opts.minLength} characters`, field, value);
|
|
33
|
+
}
|
|
34
|
+
if (opts.maxLength !== undefined && str.length > opts.maxLength) {
|
|
35
|
+
throw new ValidationError(`Must be at most ${opts.maxLength} characters`, field, value);
|
|
36
|
+
}
|
|
37
|
+
if (opts.pattern && !opts.pattern.test(str)) {
|
|
38
|
+
throw new ValidationError(`Does not match required pattern`, field, value);
|
|
39
|
+
}
|
|
40
|
+
return str;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Validate an optional string field
|
|
44
|
+
*/
|
|
45
|
+
export function validateOptionalString(value, field, options) {
|
|
46
|
+
if (value === undefined || value === null) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
return validateString(value, field, options);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Validate a number field
|
|
53
|
+
*/
|
|
54
|
+
export function validateNumber(value, field, options) {
|
|
55
|
+
if (typeof value !== 'number' || isNaN(value)) {
|
|
56
|
+
throw new ValidationError(`Expected number, got ${typeof value}`, field, value);
|
|
57
|
+
}
|
|
58
|
+
const opts = options ?? {};
|
|
59
|
+
if (opts.integer && !Number.isInteger(value)) {
|
|
60
|
+
throw new ValidationError('Must be an integer', field, value);
|
|
61
|
+
}
|
|
62
|
+
if (opts.min !== undefined && value < opts.min) {
|
|
63
|
+
throw new ValidationError(`Must be at least ${opts.min}`, field, value);
|
|
64
|
+
}
|
|
65
|
+
if (opts.max !== undefined && value > opts.max) {
|
|
66
|
+
throw new ValidationError(`Must be at most ${opts.max}`, field, value);
|
|
67
|
+
}
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Validate an optional number field
|
|
72
|
+
*/
|
|
73
|
+
export function validateOptionalNumber(value, field, options) {
|
|
74
|
+
if (value === undefined || value === null) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
return validateNumber(value, field, options);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Validate an array field
|
|
81
|
+
*/
|
|
82
|
+
export function validateArray(value, field, itemValidator, options) {
|
|
83
|
+
if (!Array.isArray(value)) {
|
|
84
|
+
throw new ValidationError(`Expected array, got ${typeof value}`, field, value);
|
|
85
|
+
}
|
|
86
|
+
const opts = options ?? {};
|
|
87
|
+
if (opts.minLength !== undefined && value.length < opts.minLength) {
|
|
88
|
+
throw new ValidationError(`Must have at least ${opts.minLength} items`, field, value);
|
|
89
|
+
}
|
|
90
|
+
if (opts.maxLength !== undefined && value.length > opts.maxLength) {
|
|
91
|
+
throw new ValidationError(`Must have at most ${opts.maxLength} items`, field, value);
|
|
92
|
+
}
|
|
93
|
+
return value.map((item, index) => itemValidator(item, index));
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Validate a vector (array of numbers) for embeddings
|
|
97
|
+
*/
|
|
98
|
+
export function validateVector(value, field, expectedDimension) {
|
|
99
|
+
if (!Array.isArray(value)) {
|
|
100
|
+
throw new ValidationError(`Expected array, got ${typeof value}`, field, value);
|
|
101
|
+
}
|
|
102
|
+
for (let i = 0; i < value.length; i++) {
|
|
103
|
+
if (typeof value[i] !== 'number' || isNaN(value[i])) {
|
|
104
|
+
throw new ValidationError(`Element at index ${i} is not a valid number`, field, value[i]);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (expectedDimension !== undefined && value.length !== expectedDimension) {
|
|
108
|
+
throw new ValidationError(`Expected dimension ${expectedDimension}, got ${value.length}`, field, value);
|
|
109
|
+
}
|
|
110
|
+
return value;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Validate task input parameters
|
|
114
|
+
*/
|
|
115
|
+
export const TaskInputSchema = z.object({
|
|
116
|
+
description: z.string().min(1, 'Task description cannot be empty'),
|
|
117
|
+
domain: z.string().default('general'),
|
|
118
|
+
context: z.record(z.unknown()).default({}),
|
|
119
|
+
constraints: z.array(z.string()).default([]),
|
|
120
|
+
metadata: z.record(z.unknown()).default({}),
|
|
121
|
+
});
|
|
122
|
+
/**
|
|
123
|
+
* Validate task input
|
|
124
|
+
*/
|
|
125
|
+
export function validateTaskInput(input) {
|
|
126
|
+
const result = TaskInputSchema.safeParse(input);
|
|
127
|
+
if (!result.success) {
|
|
128
|
+
const firstError = result.error.errors[0];
|
|
129
|
+
throw new ValidationError(firstError.message, firstError.path.join('.'), input);
|
|
130
|
+
}
|
|
131
|
+
return result.data;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Validate trajectory step count
|
|
135
|
+
*/
|
|
136
|
+
export function validateTrajectoryStepCount(stepCount, options) {
|
|
137
|
+
const opts = options ?? { minSteps: 1, maxSteps: 10000 };
|
|
138
|
+
if (stepCount < (opts.minSteps ?? 1)) {
|
|
139
|
+
throw new ValidationError(`Must have at least ${opts.minSteps ?? 1} steps`, 'steps', stepCount);
|
|
140
|
+
}
|
|
141
|
+
if (opts.maxSteps !== undefined && stepCount > opts.maxSteps) {
|
|
142
|
+
throw new ValidationError(`Must have at most ${opts.maxSteps} steps`, 'steps', stepCount);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* MCP tool argument validation schemas
|
|
147
|
+
*/
|
|
148
|
+
export const MCPSearchPlaybooksSchema = z.object({
|
|
149
|
+
query: z.string().min(1, 'Query cannot be empty'),
|
|
150
|
+
domain: z.string().optional(),
|
|
151
|
+
maxResults: z.number().int().min(1).max(50).optional(),
|
|
152
|
+
});
|
|
153
|
+
export const MCPGetPlaybookDetailsSchema = z.object({
|
|
154
|
+
playbookId: z.string().min(1, 'Playbook ID cannot be empty'),
|
|
155
|
+
});
|
|
156
|
+
export const MCPGetPlaybooksByDomainSchema = z.object({
|
|
157
|
+
domain: z.string().min(1, 'Domain cannot be empty'),
|
|
158
|
+
maxResults: z.number().int().min(1).max(100).optional(),
|
|
159
|
+
});
|
|
160
|
+
/**
|
|
161
|
+
* Validate MCP tool arguments
|
|
162
|
+
*/
|
|
163
|
+
export function validateMCPArgs(schema, args, toolName) {
|
|
164
|
+
const result = schema.safeParse(args);
|
|
165
|
+
if (!result.success) {
|
|
166
|
+
const firstError = result.error.errors[0];
|
|
167
|
+
throw new ValidationError(`Invalid arguments for ${toolName}: ${firstError.message}`, firstError.path.join('.') || 'arguments', args);
|
|
168
|
+
}
|
|
169
|
+
return result.data;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|