@planu/cli 0.27.0 → 0.29.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/config/model-routing-rules.json +98 -0
- package/dist/config/tool-groups.json +140 -0
- package/dist/engine/ai-cost-estimator/core.d.ts +1 -1
- package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -1
- package/dist/engine/ai-cost-estimator/core.js +3 -167
- package/dist/engine/ai-cost-estimator/core.js.map +1 -1
- package/dist/engine/ai-cost-estimator/recommender.d.ts +8 -0
- package/dist/engine/ai-cost-estimator/recommender.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/recommender.js +94 -0
- package/dist/engine/ai-cost-estimator/recommender.js.map +1 -0
- package/dist/engine/ai-cost-estimator/spec-loader.d.ts +13 -0
- package/dist/engine/ai-cost-estimator/spec-loader.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/spec-loader.js +102 -0
- package/dist/engine/ai-cost-estimator/spec-loader.js.map +1 -0
- package/dist/engine/code-transforms/transform-engine.d.ts +7 -0
- package/dist/engine/code-transforms/transform-engine.d.ts.map +1 -0
- package/dist/engine/code-transforms/transform-engine.js +67 -0
- package/dist/engine/code-transforms/transform-engine.js.map +1 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.d.ts +6 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.js +92 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.js.map +1 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts +6 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.js +83 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.js.map +1 -0
- package/dist/engine/code-transforms/typescript/add-types.d.ts +3 -0
- package/dist/engine/code-transforms/typescript/add-types.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/add-types.js +182 -0
- package/dist/engine/code-transforms/typescript/add-types.js.map +1 -0
- package/dist/engine/code-transforms/typescript/ast-utils.d.ts +38 -0
- package/dist/engine/code-transforms/typescript/ast-utils.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/ast-utils.js +90 -0
- package/dist/engine/code-transforms/typescript/ast-utils.js.map +1 -0
- package/dist/engine/code-transforms/typescript/extract-interface.d.ts +6 -0
- package/dist/engine/code-transforms/typescript/extract-interface.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/extract-interface.js +103 -0
- package/dist/engine/code-transforms/typescript/extract-interface.js.map +1 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts +3 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.js +213 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.js.map +1 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.d.ts +8 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.js +40 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.js.map +1 -0
- package/dist/engine/focus-tracker.d.ts.map +1 -1
- package/dist/engine/focus-tracker.js +1 -0
- package/dist/engine/focus-tracker.js.map +1 -1
- package/dist/engine/mermaid/core.d.ts +18 -0
- package/dist/engine/mermaid/core.d.ts.map +1 -0
- package/dist/engine/mermaid/core.js +88 -0
- package/dist/engine/mermaid/core.js.map +1 -0
- package/dist/engine/mermaid/diagram-generators.d.ts +22 -0
- package/dist/engine/mermaid/diagram-generators.d.ts.map +1 -0
- package/dist/engine/mermaid/diagram-generators.js +139 -0
- package/dist/engine/mermaid/diagram-generators.js.map +1 -0
- package/dist/engine/mermaid/helpers.d.ts +8 -0
- package/dist/engine/mermaid/helpers.d.ts.map +1 -0
- package/dist/engine/mermaid/helpers.js +61 -0
- package/dist/engine/mermaid/helpers.js.map +1 -0
- package/dist/engine/mermaid-generator.d.ts +2 -37
- package/dist/engine/mermaid-generator.d.ts.map +1 -1
- package/dist/engine/mermaid-generator.js +4 -276
- package/dist/engine/mermaid-generator.js.map +1 -1
- package/dist/engine/model-router/complexity-analyzer.d.ts +26 -0
- package/dist/engine/model-router/complexity-analyzer.d.ts.map +1 -0
- package/dist/engine/model-router/complexity-analyzer.js +182 -0
- package/dist/engine/model-router/complexity-analyzer.js.map +1 -0
- package/dist/engine/model-router/cost-estimator.d.ts +6 -0
- package/dist/engine/model-router/cost-estimator.d.ts.map +1 -0
- package/dist/engine/model-router/cost-estimator.js +60 -0
- package/dist/engine/model-router/cost-estimator.js.map +1 -0
- package/dist/engine/model-router/historical-learner.d.ts +26 -0
- package/dist/engine/model-router/historical-learner.d.ts.map +1 -0
- package/dist/engine/model-router/historical-learner.js +91 -0
- package/dist/engine/model-router/historical-learner.js.map +1 -0
- package/dist/engine/model-router/rules-engine.d.ts +13 -0
- package/dist/engine/model-router/rules-engine.d.ts.map +1 -0
- package/dist/engine/model-router/rules-engine.js +142 -0
- package/dist/engine/model-router/rules-engine.js.map +1 -0
- package/dist/engine/planu-config-writer.d.ts +2 -2
- package/dist/engine/planu-config-writer.d.ts.map +1 -1
- package/dist/engine/planu-config-writer.js +4 -6
- package/dist/engine/planu-config-writer.js.map +1 -1
- package/dist/engine/spec-coverage/criteria-mapper.d.ts +1 -2
- package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -1
- package/dist/engine/spec-coverage/criteria-mapper.js +4 -203
- package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -1
- package/dist/engine/spec-coverage/keyword-extractor.d.ts +10 -0
- package/dist/engine/spec-coverage/keyword-extractor.d.ts.map +1 -0
- package/dist/engine/spec-coverage/keyword-extractor.js +147 -0
- package/dist/engine/spec-coverage/keyword-extractor.js.map +1 -0
- package/dist/engine/spec-coverage/test-matchers.d.ts +9 -0
- package/dist/engine/spec-coverage/test-matchers.d.ts.map +1 -0
- package/dist/engine/spec-coverage/test-matchers.js +59 -0
- package/dist/engine/spec-coverage/test-matchers.js.map +1 -0
- package/dist/engine/spec-migrator.d.ts +17 -0
- package/dist/engine/spec-migrator.d.ts.map +1 -0
- package/dist/engine/spec-migrator.js +119 -0
- package/dist/engine/spec-migrator.js.map +1 -0
- package/dist/engine/spec-templates/catalog-extra.d.ts +1 -1
- package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -1
- package/dist/engine/spec-templates/catalog-extra.js +8 -363
- package/dist/engine/spec-templates/catalog-extra.js.map +1 -1
- package/dist/engine/spec-templates/catalog.d.ts.map +1 -1
- package/dist/engine/spec-templates/catalog.js +10 -381
- package/dist/engine/spec-templates/catalog.js.map +1 -1
- package/dist/engine/spec-templates/templates-api-ui.d.ts +6 -0
- package/dist/engine/spec-templates/templates-api-ui.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-api-ui.js +188 -0
- package/dist/engine/spec-templates/templates-api-ui.js.map +1 -0
- package/dist/engine/spec-templates/templates-auth-crud.d.ts +6 -0
- package/dist/engine/spec-templates/templates-auth-crud.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-auth-crud.js +198 -0
- package/dist/engine/spec-templates/templates-auth-crud.js.map +1 -0
- package/dist/engine/spec-templates/templates-data-security.d.ts +6 -0
- package/dist/engine/spec-templates/templates-data-security.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-data-security.js +172 -0
- package/dist/engine/spec-templates/templates-data-security.js.map +1 -0
- package/dist/engine/spec-templates/templates-perf-integration.d.ts +6 -0
- package/dist/engine/spec-templates/templates-perf-integration.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-perf-integration.js +199 -0
- package/dist/engine/spec-templates/templates-perf-integration.js.map +1 -0
- package/dist/engine/tool-groups/context-analyzer.d.ts +11 -0
- package/dist/engine/tool-groups/context-analyzer.d.ts.map +1 -0
- package/dist/engine/tool-groups/context-analyzer.js +40 -0
- package/dist/engine/tool-groups/context-analyzer.js.map +1 -0
- package/dist/engine/tool-groups/group-manager.d.ts +35 -0
- package/dist/engine/tool-groups/group-manager.d.ts.map +1 -0
- package/dist/engine/tool-groups/group-manager.js +201 -0
- package/dist/engine/tool-groups/group-manager.js.map +1 -0
- package/dist/engine/vector-store/hnsw.d.ts +37 -0
- package/dist/engine/vector-store/hnsw.d.ts.map +1 -0
- package/dist/engine/vector-store/hnsw.js +294 -0
- package/dist/engine/vector-store/hnsw.js.map +1 -0
- package/dist/engine/vector-store/similarity.d.ts +21 -0
- package/dist/engine/vector-store/similarity.d.ts.map +1 -0
- package/dist/engine/vector-store/similarity.js +86 -0
- package/dist/engine/vector-store/similarity.js.map +1 -0
- package/dist/engine/vector-store/tfidf.d.ts +35 -0
- package/dist/engine/vector-store/tfidf.d.ts.map +1 -0
- package/dist/engine/vector-store/tfidf.js +255 -0
- package/dist/engine/vector-store/tfidf.js.map +1 -0
- package/dist/engine/web-fetcher/registry-loader.d.ts.map +1 -1
- package/dist/engine/web-fetcher/registry-loader.js +2 -0
- package/dist/engine/web-fetcher/registry-loader.js.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/vector-store/backend-factory.d.ts +9 -0
- package/dist/storage/vector-store/backend-factory.d.ts.map +1 -0
- package/dist/storage/vector-store/backend-factory.js +33 -0
- package/dist/storage/vector-store/backend-factory.js.map +1 -0
- package/dist/storage/vector-store/json-fallback.d.ts +21 -0
- package/dist/storage/vector-store/json-fallback.d.ts.map +1 -0
- package/dist/storage/vector-store/json-fallback.js +85 -0
- package/dist/storage/vector-store/json-fallback.js.map +1 -0
- package/dist/storage/vector-store/migrator.d.ts +10 -0
- package/dist/storage/vector-store/migrator.d.ts.map +1 -0
- package/dist/storage/vector-store/migrator.js +139 -0
- package/dist/storage/vector-store/migrator.js.map +1 -0
- package/dist/storage/vector-store/sqlite-adapter.d.ts +28 -0
- package/dist/storage/vector-store/sqlite-adapter.d.ts.map +1 -0
- package/dist/storage/vector-store/sqlite-adapter.js +142 -0
- package/dist/storage/vector-store/sqlite-adapter.js.map +1 -0
- package/dist/tools/create-spec/constitution-validator.d.ts +4 -0
- package/dist/tools/create-spec/constitution-validator.d.ts.map +1 -0
- package/dist/tools/create-spec/constitution-validator.js +37 -0
- package/dist/tools/create-spec/constitution-validator.js.map +1 -0
- package/dist/tools/create-spec/post-creation.d.ts +11 -0
- package/dist/tools/create-spec/post-creation.d.ts.map +1 -0
- package/dist/tools/create-spec/post-creation.js +48 -0
- package/dist/tools/create-spec/post-creation.js.map +1 -0
- package/dist/tools/create-spec/spec-builder.d.ts +14 -0
- package/dist/tools/create-spec/spec-builder.d.ts.map +1 -0
- package/dist/tools/create-spec/spec-builder.js +131 -0
- package/dist/tools/create-spec/spec-builder.js.map +1 -0
- package/dist/tools/create-spec.d.ts.map +1 -1
- package/dist/tools/create-spec.js +42 -172
- package/dist/tools/create-spec.js.map +1 -1
- package/dist/tools/data-governance/audit-handler.d.ts.map +1 -1
- package/dist/tools/data-governance/audit-handler.js +1 -0
- package/dist/tools/data-governance/audit-handler.js.map +1 -1
- package/dist/tools/design-schema.d.ts.map +1 -1
- package/dist/tools/design-schema.js +1 -0
- package/dist/tools/design-schema.js.map +1 -1
- package/dist/tools/init-project/handler.d.ts.map +1 -1
- package/dist/tools/init-project/handler.js +48 -14
- package/dist/tools/init-project/handler.js.map +1 -1
- package/dist/tools/recommend-model-handler.d.ts +8 -0
- package/dist/tools/recommend-model-handler.d.ts.map +1 -0
- package/dist/tools/recommend-model-handler.js +65 -0
- package/dist/tools/recommend-model-handler.js.map +1 -0
- package/dist/tools/register-ai-cost-tools.js +1 -1
- package/dist/tools/register-ai-cost-tools.js.map +1 -1
- package/dist/tools/register-model-tools.d.ts +3 -0
- package/dist/tools/register-model-tools.d.ts.map +1 -0
- package/dist/tools/register-model-tools.js +50 -0
- package/dist/tools/register-model-tools.js.map +1 -0
- package/dist/tools/register-search-tools.d.ts +7 -0
- package/dist/tools/register-search-tools.d.ts.map +1 -0
- package/dist/tools/register-search-tools.js +34 -0
- package/dist/tools/register-search-tools.js.map +1 -0
- package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
- package/dist/tools/register-spec-tools/core-spec-tools.js +0 -4
- package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
- package/dist/tools/register-tool-groups.d.ts +7 -0
- package/dist/tools/register-tool-groups.d.ts.map +1 -0
- package/dist/tools/register-tool-groups.js +39 -0
- package/dist/tools/register-tool-groups.js.map +1 -0
- package/dist/tools/register-transform-tools.d.ts +3 -0
- package/dist/tools/register-transform-tools.d.ts.map +1 -0
- package/dist/tools/register-transform-tools.js +29 -0
- package/dist/tools/register-transform-tools.js.map +1 -0
- package/dist/tools/semantic-search-handler.d.ts +7 -0
- package/dist/tools/semantic-search-handler.d.ts.map +1 -0
- package/dist/tools/semantic-search-handler.js +72 -0
- package/dist/tools/semantic-search-handler.js.map +1 -0
- package/dist/tools/suggest-tooling/orchestration-generator.js +1 -1
- package/dist/tools/suggest-tooling/orchestration-generator.js.map +1 -1
- package/dist/tools/tool-group-handler.d.ts +9 -0
- package/dist/tools/tool-group-handler.d.ts.map +1 -0
- package/dist/tools/tool-group-handler.js +82 -0
- package/dist/tools/tool-group-handler.js.map +1 -0
- package/dist/tools/transform-code-handler.d.ts +7 -0
- package/dist/tools/transform-code-handler.d.ts.map +1 -0
- package/dist/tools/transform-code-handler.js +58 -0
- package/dist/tools/transform-code-handler.js.map +1 -0
- package/dist/types/advanced-framework.d.ts +47 -0
- package/dist/types/advanced-framework.d.ts.map +1 -0
- package/dist/types/advanced-framework.js +3 -0
- package/dist/types/advanced-framework.js.map +1 -0
- package/dist/types/code-transforms.d.ts +114 -0
- package/dist/types/code-transforms.d.ts.map +1 -0
- package/dist/types/code-transforms.js +11 -0
- package/dist/types/code-transforms.js.map +1 -0
- package/dist/types/css-framework.d.ts +110 -0
- package/dist/types/css-framework.d.ts.map +1 -0
- package/dist/types/css-framework.js +3 -0
- package/dist/types/css-framework.js.map +1 -0
- package/dist/types/dashboard.d.ts +77 -0
- package/dist/types/dashboard.d.ts.map +1 -0
- package/dist/types/dashboard.js +2 -0
- package/dist/types/dashboard.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/model-routing.d.ts +127 -0
- package/dist/types/model-routing.d.ts.map +1 -0
- package/dist/types/model-routing.js +3 -0
- package/dist/types/model-routing.js.map +1 -0
- package/dist/types/project/inputs.d.ts +0 -1
- package/dist/types/project/inputs.d.ts.map +1 -1
- package/dist/types/spec/core.d.ts +28 -1
- package/dist/types/spec/core.d.ts.map +1 -1
- package/dist/types/spec/inputs.d.ts +9 -6
- package/dist/types/spec/inputs.d.ts.map +1 -1
- package/dist/types/tool-groups.d.ts +57 -0
- package/dist/types/tool-groups.d.ts.map +1 -0
- package/dist/types/tool-groups.js +3 -0
- package/dist/types/tool-groups.js.map +1 -0
- package/dist/types/ui.d.ts +3 -231
- package/dist/types/ui.d.ts.map +1 -1
- package/dist/types/ui.js +7 -1
- package/dist/types/ui.js.map +1 -1
- package/dist/types/vector-store.d.ts +137 -0
- package/dist/types/vector-store.d.ts.map +1 -0
- package/dist/types/vector-store.js +3 -0
- package/dist/types/vector-store.js.map +1 -0
- package/package.json +1 -1
- package/src/config/model-routing-rules.json +98 -0
- package/src/config/tool-groups.json +140 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// engine/vector-store/similarity.ts — Similarity metrics for vector comparison.
|
|
2
|
+
// SPEC-075: cosine, jaccard, combined similarity functions.
|
|
3
|
+
/**
|
|
4
|
+
* Compute cosine similarity between two vectors.
|
|
5
|
+
* Returns a value in [0, 1] where 1 means identical direction.
|
|
6
|
+
*/
|
|
7
|
+
export function cosineSimilarity(a, b) {
|
|
8
|
+
if (a.length === 0 || b.length === 0) {
|
|
9
|
+
return 0;
|
|
10
|
+
}
|
|
11
|
+
if (a.length !== b.length) {
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
let dot = 0;
|
|
15
|
+
let normA = 0;
|
|
16
|
+
let normB = 0;
|
|
17
|
+
for (let i = 0; i < a.length; i++) {
|
|
18
|
+
/* v8 ignore start -- noUncheckedIndexedAccess: i always within bounds */
|
|
19
|
+
const ai = a[i] ?? 0;
|
|
20
|
+
const bi = b[i] ?? 0;
|
|
21
|
+
/* v8 ignore stop */
|
|
22
|
+
dot += ai * bi;
|
|
23
|
+
normA += ai * ai;
|
|
24
|
+
normB += bi * bi;
|
|
25
|
+
}
|
|
26
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
27
|
+
if (denom === 0) {
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
return dot / denom;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Compute Jaccard similarity between two binary-ish vectors.
|
|
34
|
+
* Treats non-zero values as "present". Returns value in [0, 1].
|
|
35
|
+
*/
|
|
36
|
+
export function jaccardSimilarity(a, b) {
|
|
37
|
+
if (a.length === 0 || b.length === 0) {
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
if (a.length !== b.length) {
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
let intersection = 0;
|
|
44
|
+
let union = 0;
|
|
45
|
+
for (let i = 0; i < a.length; i++) {
|
|
46
|
+
/* v8 ignore start -- noUncheckedIndexedAccess: i always within bounds */
|
|
47
|
+
const aPresent = (a[i] ?? 0) !== 0;
|
|
48
|
+
const bPresent = (b[i] ?? 0) !== 0;
|
|
49
|
+
/* v8 ignore stop */
|
|
50
|
+
if (aPresent || bPresent) {
|
|
51
|
+
union++;
|
|
52
|
+
if (aPresent && bPresent) {
|
|
53
|
+
intersection++;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (union === 0) {
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
return intersection / union;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Combined similarity: weighted average of cosine and jaccard.
|
|
64
|
+
* Default weights: 0.8 cosine + 0.2 jaccard.
|
|
65
|
+
*/
|
|
66
|
+
export function combinedSimilarity(a, b, cosineWeight = 0.8) {
|
|
67
|
+
const cos = cosineSimilarity(a, b);
|
|
68
|
+
const jac = jaccardSimilarity(a, b);
|
|
69
|
+
return cos * cosineWeight + jac * (1 - cosineWeight);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Normalize a vector to unit length (L2 norm).
|
|
73
|
+
* Returns a new array. If the vector is zero, returns a zero vector.
|
|
74
|
+
*/
|
|
75
|
+
export function normalizeVector(v) {
|
|
76
|
+
let norm = 0;
|
|
77
|
+
for (const val of v) {
|
|
78
|
+
norm += val * val;
|
|
79
|
+
}
|
|
80
|
+
norm = Math.sqrt(norm);
|
|
81
|
+
if (norm === 0) {
|
|
82
|
+
return v.map(() => 0);
|
|
83
|
+
}
|
|
84
|
+
return v.map((val) => val / norm);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=similarity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"similarity.js","sourceRoot":"","sources":["../../../src/engine/vector-store/similarity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { TFIDFConfig } from '../../types/index.js';
|
|
2
|
+
/** Tokenize text: split on whitespace/punctuation, split camelCase, lowercase, remove stop words. */
|
|
3
|
+
export declare function tokenize(text: string, stopWords?: Set<string>): string[];
|
|
4
|
+
/** TF-IDF engine: stateful, maintains vocabulary (IDF) across documents. */
|
|
5
|
+
export declare class TFIDFEngine {
|
|
6
|
+
private readonly config;
|
|
7
|
+
private readonly docFreq;
|
|
8
|
+
private docCount;
|
|
9
|
+
private vocabulary;
|
|
10
|
+
private vocabDirty;
|
|
11
|
+
constructor(config?: Partial<TFIDFConfig>);
|
|
12
|
+
/** Add a document to the corpus (updates IDF). */
|
|
13
|
+
addDocument(text: string): void;
|
|
14
|
+
/** Rebuild vocabulary: top-K most discriminating terms by IDF. */
|
|
15
|
+
private rebuildVocabulary;
|
|
16
|
+
/** Generate a normalized TF-IDF embedding for the given text. */
|
|
17
|
+
embed(text: string): number[];
|
|
18
|
+
/** Batch embed multiple texts. */
|
|
19
|
+
batchEmbed(texts: string[]): number[][];
|
|
20
|
+
/** Get current vocabulary size. */
|
|
21
|
+
getVocabularySize(): number;
|
|
22
|
+
/** Get document count in corpus. */
|
|
23
|
+
getDocumentCount(): number;
|
|
24
|
+
/** Export state for serialization. */
|
|
25
|
+
exportState(): {
|
|
26
|
+
docFreq: [string, number][];
|
|
27
|
+
docCount: number;
|
|
28
|
+
};
|
|
29
|
+
/** Import state from serialized form. */
|
|
30
|
+
importState(state: {
|
|
31
|
+
docFreq: [string, number][];
|
|
32
|
+
docCount: number;
|
|
33
|
+
}): void;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=tfidf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tfidf.d.ts","sourceRoot":"","sources":["../../../src/engine/vector-store/tfidf.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAwJxD,qGAAqG;AACrG,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,GAAG,CAAC,MAAM,CAAsB,GAAG,MAAM,EAAE,CAS5F;AAED,4EAA4E;AAC5E,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,UAAU,CAAQ;gBAEd,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;IAQzC,kDAAkD;IAClD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAU/B,kEAAkE;IAClE,OAAO,CAAC,iBAAiB;IAiBzB,iEAAiE;IACjE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IA0B7B,kCAAkC;IAClC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE;IAIvC,mCAAmC;IACnC,iBAAiB,IAAI,MAAM;IAK3B,oCAAoC;IACpC,gBAAgB,IAAI,MAAM;IAI1B,sCAAsC;IACtC,WAAW,IAAI;QAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAOhE,yCAAyC;IACzC,WAAW,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAQ5E"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
// engine/vector-store/tfidf.ts — TF-IDF embedding engine.
|
|
2
|
+
// SPEC-075 AC-01: Tokenize, compute TF-IDF, generate dense vectors.
|
|
3
|
+
import { normalizeVector } from './similarity.js';
|
|
4
|
+
const DEFAULT_STOP_WORDS = new Set([
|
|
5
|
+
// English
|
|
6
|
+
'the',
|
|
7
|
+
'a',
|
|
8
|
+
'an',
|
|
9
|
+
'is',
|
|
10
|
+
'are',
|
|
11
|
+
'was',
|
|
12
|
+
'were',
|
|
13
|
+
'be',
|
|
14
|
+
'been',
|
|
15
|
+
'being',
|
|
16
|
+
'have',
|
|
17
|
+
'has',
|
|
18
|
+
'had',
|
|
19
|
+
'do',
|
|
20
|
+
'does',
|
|
21
|
+
'did',
|
|
22
|
+
'will',
|
|
23
|
+
'would',
|
|
24
|
+
'could',
|
|
25
|
+
'should',
|
|
26
|
+
'may',
|
|
27
|
+
'might',
|
|
28
|
+
'shall',
|
|
29
|
+
'can',
|
|
30
|
+
'need',
|
|
31
|
+
'dare',
|
|
32
|
+
'ought',
|
|
33
|
+
'to',
|
|
34
|
+
'of',
|
|
35
|
+
'in',
|
|
36
|
+
'for',
|
|
37
|
+
'on',
|
|
38
|
+
'with',
|
|
39
|
+
'at',
|
|
40
|
+
'by',
|
|
41
|
+
'from',
|
|
42
|
+
'as',
|
|
43
|
+
'into',
|
|
44
|
+
'through',
|
|
45
|
+
'during',
|
|
46
|
+
'before',
|
|
47
|
+
'after',
|
|
48
|
+
'above',
|
|
49
|
+
'below',
|
|
50
|
+
'between',
|
|
51
|
+
'out',
|
|
52
|
+
'off',
|
|
53
|
+
'over',
|
|
54
|
+
'under',
|
|
55
|
+
'again',
|
|
56
|
+
'further',
|
|
57
|
+
'then',
|
|
58
|
+
'once',
|
|
59
|
+
'here',
|
|
60
|
+
'there',
|
|
61
|
+
'when',
|
|
62
|
+
'where',
|
|
63
|
+
'why',
|
|
64
|
+
'how',
|
|
65
|
+
'all',
|
|
66
|
+
'each',
|
|
67
|
+
'every',
|
|
68
|
+
'both',
|
|
69
|
+
'few',
|
|
70
|
+
'more',
|
|
71
|
+
'most',
|
|
72
|
+
'other',
|
|
73
|
+
'some',
|
|
74
|
+
'such',
|
|
75
|
+
'no',
|
|
76
|
+
'nor',
|
|
77
|
+
'not',
|
|
78
|
+
'only',
|
|
79
|
+
'own',
|
|
80
|
+
'same',
|
|
81
|
+
'so',
|
|
82
|
+
'than',
|
|
83
|
+
'too',
|
|
84
|
+
'very',
|
|
85
|
+
'just',
|
|
86
|
+
'because',
|
|
87
|
+
'but',
|
|
88
|
+
'and',
|
|
89
|
+
'or',
|
|
90
|
+
'if',
|
|
91
|
+
'while',
|
|
92
|
+
'this',
|
|
93
|
+
'that',
|
|
94
|
+
'these',
|
|
95
|
+
'those',
|
|
96
|
+
'it',
|
|
97
|
+
'its',
|
|
98
|
+
'i',
|
|
99
|
+
'me',
|
|
100
|
+
'my',
|
|
101
|
+
'we',
|
|
102
|
+
'our',
|
|
103
|
+
'you',
|
|
104
|
+
'your',
|
|
105
|
+
'he',
|
|
106
|
+
'him',
|
|
107
|
+
'his',
|
|
108
|
+
'she',
|
|
109
|
+
'her',
|
|
110
|
+
'they',
|
|
111
|
+
'them',
|
|
112
|
+
'their',
|
|
113
|
+
'what',
|
|
114
|
+
'which',
|
|
115
|
+
'who',
|
|
116
|
+
'whom',
|
|
117
|
+
'about',
|
|
118
|
+
'up',
|
|
119
|
+
// Spanish
|
|
120
|
+
'el',
|
|
121
|
+
'la',
|
|
122
|
+
'los',
|
|
123
|
+
'las',
|
|
124
|
+
'un',
|
|
125
|
+
'una',
|
|
126
|
+
'unos',
|
|
127
|
+
'unas',
|
|
128
|
+
'es',
|
|
129
|
+
'son',
|
|
130
|
+
'de',
|
|
131
|
+
'del',
|
|
132
|
+
'en',
|
|
133
|
+
'con',
|
|
134
|
+
'por',
|
|
135
|
+
'para',
|
|
136
|
+
'se',
|
|
137
|
+
'que',
|
|
138
|
+
'como',
|
|
139
|
+
'pero',
|
|
140
|
+
'si',
|
|
141
|
+
'su',
|
|
142
|
+
'al',
|
|
143
|
+
'lo',
|
|
144
|
+
'le',
|
|
145
|
+
'les',
|
|
146
|
+
'nos',
|
|
147
|
+
'ya',
|
|
148
|
+
'hay',
|
|
149
|
+
'o',
|
|
150
|
+
'y',
|
|
151
|
+
]);
|
|
152
|
+
/** Tokenize text: split on whitespace/punctuation, split camelCase, lowercase, remove stop words. */
|
|
153
|
+
export function tokenize(text, stopWords = DEFAULT_STOP_WORDS) {
|
|
154
|
+
// Split camelCase: "camelCase" -> "camel Case" -> "camel case"
|
|
155
|
+
const expanded = text.replace(/([a-z])([A-Z])/g, '$1 $2');
|
|
156
|
+
// Split on non-alphanumeric
|
|
157
|
+
const raw = expanded
|
|
158
|
+
.toLowerCase()
|
|
159
|
+
.split(/[^a-z0-9]+/)
|
|
160
|
+
.filter(Boolean);
|
|
161
|
+
return raw.filter((t) => t.length > 1 && !stopWords.has(t));
|
|
162
|
+
}
|
|
163
|
+
/** TF-IDF engine: stateful, maintains vocabulary (IDF) across documents. */
|
|
164
|
+
export class TFIDFEngine {
|
|
165
|
+
config;
|
|
166
|
+
docFreq = new Map();
|
|
167
|
+
docCount = 0;
|
|
168
|
+
vocabulary = [];
|
|
169
|
+
vocabDirty = true;
|
|
170
|
+
constructor(config) {
|
|
171
|
+
this.config = {
|
|
172
|
+
maxDimensions: config?.maxDimensions ?? 256,
|
|
173
|
+
minDocFrequency: config?.minDocFrequency ?? 1,
|
|
174
|
+
stopWords: config?.stopWords ?? DEFAULT_STOP_WORDS,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/** Add a document to the corpus (updates IDF). */
|
|
178
|
+
addDocument(text) {
|
|
179
|
+
const tokens = tokenize(text, this.config.stopWords);
|
|
180
|
+
const seen = new Set(tokens);
|
|
181
|
+
for (const term of seen) {
|
|
182
|
+
this.docFreq.set(term, (this.docFreq.get(term) ?? 0) + 1);
|
|
183
|
+
}
|
|
184
|
+
this.docCount++;
|
|
185
|
+
this.vocabDirty = true;
|
|
186
|
+
}
|
|
187
|
+
/** Rebuild vocabulary: top-K most discriminating terms by IDF. */
|
|
188
|
+
rebuildVocabulary() {
|
|
189
|
+
if (!this.vocabDirty) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const entries = [...this.docFreq.entries()]
|
|
193
|
+
.filter(([, df]) => df >= this.config.minDocFrequency)
|
|
194
|
+
.map(([term, df]) => ({
|
|
195
|
+
term,
|
|
196
|
+
idf: Math.log((this.docCount + 1) / (df + 1)) + 1,
|
|
197
|
+
}))
|
|
198
|
+
.sort((a, b) => b.idf - a.idf);
|
|
199
|
+
this.vocabulary = entries.slice(0, this.config.maxDimensions).map((e) => e.term);
|
|
200
|
+
this.vocabDirty = false;
|
|
201
|
+
}
|
|
202
|
+
/** Generate a normalized TF-IDF embedding for the given text. */
|
|
203
|
+
embed(text) {
|
|
204
|
+
this.rebuildVocabulary();
|
|
205
|
+
const tokens = tokenize(text, this.config.stopWords);
|
|
206
|
+
if (tokens.length === 0) {
|
|
207
|
+
return new Array(this.vocabulary.length).fill(0);
|
|
208
|
+
}
|
|
209
|
+
// Compute TF
|
|
210
|
+
const tf = new Map();
|
|
211
|
+
for (const t of tokens) {
|
|
212
|
+
tf.set(t, (tf.get(t) ?? 0) + 1);
|
|
213
|
+
}
|
|
214
|
+
// Build vector
|
|
215
|
+
const vector = this.vocabulary.map((term) => {
|
|
216
|
+
/* v8 ignore start -- ?? fallbacks: term always in tf/docFreq from vocabulary */
|
|
217
|
+
const termFreq = (tf.get(term) ?? 0) / tokens.length;
|
|
218
|
+
const df = this.docFreq.get(term) ?? 0;
|
|
219
|
+
/* v8 ignore stop */
|
|
220
|
+
const idf = Math.log((this.docCount + 1) / (df + 1)) + 1;
|
|
221
|
+
return termFreq * idf;
|
|
222
|
+
});
|
|
223
|
+
return normalizeVector(vector);
|
|
224
|
+
}
|
|
225
|
+
/** Batch embed multiple texts. */
|
|
226
|
+
batchEmbed(texts) {
|
|
227
|
+
return texts.map((t) => this.embed(t));
|
|
228
|
+
}
|
|
229
|
+
/** Get current vocabulary size. */
|
|
230
|
+
getVocabularySize() {
|
|
231
|
+
this.rebuildVocabulary();
|
|
232
|
+
return this.vocabulary.length;
|
|
233
|
+
}
|
|
234
|
+
/** Get document count in corpus. */
|
|
235
|
+
getDocumentCount() {
|
|
236
|
+
return this.docCount;
|
|
237
|
+
}
|
|
238
|
+
/** Export state for serialization. */
|
|
239
|
+
exportState() {
|
|
240
|
+
return {
|
|
241
|
+
docFreq: [...this.docFreq.entries()],
|
|
242
|
+
docCount: this.docCount,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/** Import state from serialized form. */
|
|
246
|
+
importState(state) {
|
|
247
|
+
this.docFreq.clear();
|
|
248
|
+
for (const [term, freq] of state.docFreq) {
|
|
249
|
+
this.docFreq.set(term, freq);
|
|
250
|
+
}
|
|
251
|
+
this.docCount = state.docCount;
|
|
252
|
+
this.vocabDirty = true;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=tfidf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tfidf.js","sourceRoot":"","sources":["../../../src/engine/vector-store/tfidf.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-loader.d.ts","sourceRoot":"","sources":["../../../src/engine/web-fetcher/registry-loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"registry-loader.d.ts","sourceRoot":"","sources":["../../../src/engine/web-fetcher/registry-loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAczD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CAa9D;AAGD,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAEjE;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,YAAY,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA2BzC"}
|
|
@@ -3,6 +3,7 @@ import { readFile } from 'node:fs/promises';
|
|
|
3
3
|
let docsRegistryCache = null;
|
|
4
4
|
let registryPath = null;
|
|
5
5
|
function getRegistryPath() {
|
|
6
|
+
/* v8 ignore next 3 -- internal cache: second call always returns cached value */
|
|
6
7
|
if (registryPath) {
|
|
7
8
|
return registryPath;
|
|
8
9
|
}
|
|
@@ -23,6 +24,7 @@ export async function loadDocsRegistry() {
|
|
|
23
24
|
return { frameworks: {}, languages: {}, services: {} };
|
|
24
25
|
}
|
|
25
26
|
}
|
|
27
|
+
/* v8 ignore next 3 -- simple cache reset, no tests import this utility directly */
|
|
26
28
|
export function resetRegistryCache() {
|
|
27
29
|
docsRegistryCache = null;
|
|
28
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-loader.js","sourceRoot":"","sources":["../../../src/engine/web-fetcher/registry-loader.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,IAAI,iBAAiB,GAAwB,IAAI,CAAC;AAClD,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,SAAS,eAAe;IACtB,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,YAAY,GAAG,IAAI,GAAG,CAAC,iCAAiC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IACpF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,iCAAiC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;QACxD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACzD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,iBAAiB,GAAG,QAAQ,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,GAAW,EACX,QAAsB;IAEtB,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE1D,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,OAAO,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,8BAA8B;IAC9B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,6BAA6B;IAC7B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
1
|
+
{"version":3,"file":"registry-loader.js","sourceRoot":"","sources":["../../../src/engine/web-fetcher/registry-loader.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,IAAI,iBAAiB,GAAwB,IAAI,CAAC;AAClD,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,SAAS,eAAe;IACtB,iFAAiF;IACjF,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,YAAY,GAAG,IAAI,GAAG,CAAC,iCAAiC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IACpF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,iCAAiC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;QACxD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACzD,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,kBAAkB;IAChC,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,iBAAiB,GAAG,QAAQ,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,GAAW,EACX,QAAsB;IAEtB,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE1D,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,OAAO,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,8BAA8B;IAC9B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,6BAA6B;IAC7B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -31,8 +31,14 @@ import { registerCITools } from './tools/register-ci-tools.js';
|
|
|
31
31
|
import { registerHooksTools } from './tools/register-hooks-tools.js';
|
|
32
32
|
import { registerTemplateTools } from './tools/register-template-tools.js';
|
|
33
33
|
import { registerRegistryTools } from './tools/register-registry-tools.js';
|
|
34
|
+
import { registerToolGroupTools } from './tools/register-tool-groups.js';
|
|
35
|
+
import { registerModelTools } from './tools/register-model-tools.js';
|
|
36
|
+
import { registerSearchTools } from './tools/register-search-tools.js';
|
|
37
|
+
import { registerTransformTools } from './tools/register-transform-tools.js';
|
|
34
38
|
import { PLANU_VERSION } from './config/version.js';
|
|
35
39
|
import { handleActivateLicense } from './tools/activate-license.js';
|
|
40
|
+
import { GroupManager } from './engine/tool-groups/group-manager.js';
|
|
41
|
+
import { setGroupManager } from './tools/tool-group-handler.js';
|
|
36
42
|
// ---------------------------------------------------------------------------
|
|
37
43
|
// Server setup
|
|
38
44
|
// ---------------------------------------------------------------------------
|
|
@@ -124,6 +130,10 @@ registerCITools(server);
|
|
|
124
130
|
registerHooksTools(server);
|
|
125
131
|
registerTemplateTools(server);
|
|
126
132
|
registerRegistryTools(server);
|
|
133
|
+
registerToolGroupTools(server);
|
|
134
|
+
registerModelTools(server);
|
|
135
|
+
registerSearchTools(server);
|
|
136
|
+
registerTransformTools(server);
|
|
127
137
|
// ---------------------------------------------------------------------------
|
|
128
138
|
// Start server
|
|
129
139
|
// ---------------------------------------------------------------------------
|
|
@@ -135,6 +145,15 @@ async function main() {
|
|
|
135
145
|
// Silent failure: env-based activation is best-effort
|
|
136
146
|
});
|
|
137
147
|
}
|
|
148
|
+
// SPEC-074: Initialize tool group manager after all tools are registered.
|
|
149
|
+
// Access SDK internal tool storage to get RegisteredTool refs for enable/disable.
|
|
150
|
+
const internalTools = server._registeredTools;
|
|
151
|
+
const toolMap = new Map(Object.entries(internalTools));
|
|
152
|
+
const groupManager = new GroupManager(toolMap, () => {
|
|
153
|
+
server.sendToolListChanged();
|
|
154
|
+
});
|
|
155
|
+
await groupManager.init();
|
|
156
|
+
setGroupManager(groupManager);
|
|
138
157
|
const transport = new StdioServerTransport();
|
|
139
158
|
await server.connect(transport);
|
|
140
159
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,+CAA+C;AAC/C,mFAAmF;AAEnF,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { StorageBackend } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Get or create a storage backend for the given project.
|
|
4
|
+
* Tries SQLite first, falls back to JSON.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getOrCreateBackend(projectId: string): Promise<StorageBackend>;
|
|
7
|
+
/** Clear all cached backends (for testing). */
|
|
8
|
+
export declare function clearBackendCache(): void;
|
|
9
|
+
//# sourceMappingURL=backend-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-factory.d.ts","sourceRoot":"","sources":["../../../src/storage/vector-store/backend-factory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAM3D;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAiBnF;AAED,+CAA+C;AAC/C,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// storage/vector-store/backend-factory.ts — Factory for selecting storage backend.
|
|
2
|
+
// SPEC-075 AC-06: Returns SQLite if available, JSON fallback otherwise.
|
|
3
|
+
import { createSqliteBackend } from './sqlite-adapter.js';
|
|
4
|
+
import { JsonFallbackBackend } from './json-fallback.js';
|
|
5
|
+
const backends = new Map();
|
|
6
|
+
/**
|
|
7
|
+
* Get or create a storage backend for the given project.
|
|
8
|
+
* Tries SQLite first, falls back to JSON.
|
|
9
|
+
*/
|
|
10
|
+
export async function getOrCreateBackend(projectId) {
|
|
11
|
+
const existing = backends.get(projectId);
|
|
12
|
+
if (existing) {
|
|
13
|
+
return existing;
|
|
14
|
+
}
|
|
15
|
+
// Try SQLite first
|
|
16
|
+
const sqlite = await createSqliteBackend(projectId);
|
|
17
|
+
if (sqlite) {
|
|
18
|
+
backends.set(projectId, sqlite);
|
|
19
|
+
return sqlite;
|
|
20
|
+
}
|
|
21
|
+
// Fall back to JSON
|
|
22
|
+
const json = new JsonFallbackBackend(projectId);
|
|
23
|
+
backends.set(projectId, json);
|
|
24
|
+
return json;
|
|
25
|
+
}
|
|
26
|
+
/** Clear all cached backends (for testing). */
|
|
27
|
+
export function clearBackendCache() {
|
|
28
|
+
for (const backend of backends.values()) {
|
|
29
|
+
backend.close?.();
|
|
30
|
+
}
|
|
31
|
+
backends.clear();
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=backend-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-factory.js","sourceRoot":"","sources":["../../../src/storage/vector-store/backend-factory.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,wEAAwE;AAGxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEnD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,MAAM,EAAE,CAAC;QACX,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,oBAAoB;IACpB,MAAM,IAAI,GAAG,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAChD,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,iBAAiB;IAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IACpB,CAAC;IACD,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { StorageBackend, VectorEntry, VectorEntryType, VectorSearchResult } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* JSON fallback storage backend.
|
|
4
|
+
* Used when better-sqlite3 is not available.
|
|
5
|
+
*/
|
|
6
|
+
export declare class JsonFallbackBackend implements StorageBackend {
|
|
7
|
+
private readonly filePath;
|
|
8
|
+
private cache;
|
|
9
|
+
constructor(projectId: string);
|
|
10
|
+
private load;
|
|
11
|
+
private save;
|
|
12
|
+
insert(entry: VectorEntry): Promise<void>;
|
|
13
|
+
update(id: string, partial: Partial<VectorEntry>): Promise<void>;
|
|
14
|
+
delete(id: string): Promise<void>;
|
|
15
|
+
getById(id: string): Promise<VectorEntry | undefined>;
|
|
16
|
+
getAll(type?: VectorEntryType): Promise<VectorEntry[]>;
|
|
17
|
+
searchSimilar(embedding: number[], topK: number, threshold: number, type?: VectorEntryType): Promise<VectorSearchResult[]>;
|
|
18
|
+
}
|
|
19
|
+
/** Reset the warning flag (for testing). */
|
|
20
|
+
export declare function resetJsonFallbackWarning(): void;
|
|
21
|
+
//# sourceMappingURL=json-fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-fallback.d.ts","sourceRoot":"","sources":["../../../src/storage/vector-store/json-fallback.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,eAAe,EACf,kBAAkB,EAEnB,MAAM,sBAAsB,CAAC;AAM9B;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,cAAc;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,KAAK,CAAgC;gBAEjC,SAAS,EAAE,MAAM;YAWf,IAAI;YAQJ,IAAI;IAKZ,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAehE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAKrD,MAAM,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAQtD,aAAa,CACjB,SAAS,EAAE,MAAM,EAAE,EACnB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,eAAe,GACrB,OAAO,CAAC,kBAAkB,EAAE,CAAC;CAejC;AAED,4CAA4C;AAC5C,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// storage/vector-store/json-fallback.ts — JSON-based fallback storage backend.
|
|
2
|
+
// SPEC-075 AC-04: Same interface as SQLite adapter, uses JSON files.
|
|
3
|
+
import { readJson, writeJson, projectDataDir } from '../base-store.js';
|
|
4
|
+
import { cosineSimilarity } from '../../engine/vector-store/similarity.js';
|
|
5
|
+
let warnedOnce = false;
|
|
6
|
+
/**
|
|
7
|
+
* JSON fallback storage backend.
|
|
8
|
+
* Used when better-sqlite3 is not available.
|
|
9
|
+
*/
|
|
10
|
+
export class JsonFallbackBackend {
|
|
11
|
+
filePath;
|
|
12
|
+
cache = null;
|
|
13
|
+
constructor(projectId) {
|
|
14
|
+
this.filePath = `${projectDataDir(projectId)}/vector-store.json`;
|
|
15
|
+
if (!warnedOnce) {
|
|
16
|
+
console.warn('[Planu] SQLite not available, using JSON fallback. ' +
|
|
17
|
+
'Install better-sqlite3 for better performance.');
|
|
18
|
+
warnedOnce = true;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async load() {
|
|
22
|
+
if (this.cache) {
|
|
23
|
+
return this.cache;
|
|
24
|
+
}
|
|
25
|
+
this.cache = await readJson(this.filePath, { entries: [] });
|
|
26
|
+
return this.cache;
|
|
27
|
+
}
|
|
28
|
+
async save(data) {
|
|
29
|
+
this.cache = data;
|
|
30
|
+
await writeJson(this.filePath, data);
|
|
31
|
+
}
|
|
32
|
+
async insert(entry) {
|
|
33
|
+
const data = await this.load();
|
|
34
|
+
data.entries.push(entry);
|
|
35
|
+
await this.save(data);
|
|
36
|
+
}
|
|
37
|
+
async update(id, partial) {
|
|
38
|
+
const data = await this.load();
|
|
39
|
+
const idx = data.entries.findIndex((e) => e.id === id);
|
|
40
|
+
if (idx === -1) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const existing = data.entries[idx];
|
|
44
|
+
/* v8 ignore start -- defensive: idx found via findIndex so entry always exists */
|
|
45
|
+
if (existing) {
|
|
46
|
+
/* v8 ignore stop */
|
|
47
|
+
data.entries[idx] = { ...existing, ...partial, id: existing.id };
|
|
48
|
+
}
|
|
49
|
+
await this.save(data);
|
|
50
|
+
}
|
|
51
|
+
async delete(id) {
|
|
52
|
+
const data = await this.load();
|
|
53
|
+
data.entries = data.entries.filter((e) => e.id !== id);
|
|
54
|
+
await this.save(data);
|
|
55
|
+
}
|
|
56
|
+
async getById(id) {
|
|
57
|
+
const data = await this.load();
|
|
58
|
+
return data.entries.find((e) => e.id === id);
|
|
59
|
+
}
|
|
60
|
+
async getAll(type) {
|
|
61
|
+
const data = await this.load();
|
|
62
|
+
if (!type) {
|
|
63
|
+
return [...data.entries];
|
|
64
|
+
}
|
|
65
|
+
return data.entries.filter((e) => e.type === type);
|
|
66
|
+
}
|
|
67
|
+
async searchSimilar(embedding, topK, threshold, type) {
|
|
68
|
+
const data = await this.load();
|
|
69
|
+
const filtered = type ? data.entries.filter((e) => e.type === type) : data.entries;
|
|
70
|
+
const results = [];
|
|
71
|
+
for (const entry of filtered) {
|
|
72
|
+
const similarity = cosineSimilarity(embedding, entry.embedding);
|
|
73
|
+
if (similarity >= threshold) {
|
|
74
|
+
results.push({ entry, similarity });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
results.sort((a, b) => b.similarity - a.similarity);
|
|
78
|
+
return results.slice(0, topK);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Reset the warning flag (for testing). */
|
|
82
|
+
export function resetJsonFallbackWarning() {
|
|
83
|
+
warnedOnce = false;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=json-fallback.js.map
|