@roarpeng/graphflow 1.4.4 → 1.7.4

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.
Files changed (227) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +72 -0
  3. package/CLAUDE.md +1 -1
  4. package/README.md +76 -50
  5. package/dist/agents/atp-schema.d.ts +59 -0
  6. package/dist/agents/atp-schema.d.ts.map +1 -0
  7. package/dist/agents/atp-schema.js +3 -0
  8. package/dist/agents/atp-schema.js.map +1 -0
  9. package/dist/agents/decision-engine.d.ts +55 -0
  10. package/dist/agents/decision-engine.d.ts.map +1 -0
  11. package/dist/agents/decision-engine.js +338 -0
  12. package/dist/agents/decision-engine.js.map +1 -0
  13. package/dist/agents/insight.d.ts +69 -2
  14. package/dist/agents/insight.d.ts.map +1 -1
  15. package/dist/agents/insight.js +420 -27
  16. package/dist/agents/insight.js.map +1 -1
  17. package/dist/agents/task-profile.d.ts +19 -0
  18. package/dist/agents/task-profile.d.ts.map +1 -0
  19. package/dist/agents/task-profile.js +64 -0
  20. package/dist/agents/task-profile.js.map +1 -0
  21. package/dist/agents/validator.js +1 -1
  22. package/dist/agents/validator.js.map +1 -1
  23. package/dist/config/defaults.d.ts.map +1 -1
  24. package/dist/config/defaults.js +4 -3
  25. package/dist/config/defaults.js.map +1 -1
  26. package/dist/config/discover-workspace.d.ts.map +1 -1
  27. package/dist/config/discover-workspace.js +13 -2
  28. package/dist/config/discover-workspace.js.map +1 -1
  29. package/dist/config/embedding-factory.d.ts.map +1 -1
  30. package/dist/config/embedding-factory.js +87 -8
  31. package/dist/config/embedding-factory.js.map +1 -1
  32. package/dist/config/loader.d.ts.map +1 -1
  33. package/dist/config/loader.js +10 -4
  34. package/dist/config/loader.js.map +1 -1
  35. package/dist/config/provider-env.d.ts +32 -0
  36. package/dist/config/provider-env.d.ts.map +1 -0
  37. package/dist/config/provider-env.js +51 -0
  38. package/dist/config/provider-env.js.map +1 -0
  39. package/dist/config/resolve.d.ts.map +1 -1
  40. package/dist/config/resolve.js +7 -2
  41. package/dist/config/resolve.js.map +1 -1
  42. package/dist/config/schema.d.ts +17 -3
  43. package/dist/config/schema.d.ts.map +1 -1
  44. package/dist/config/workspace-root.d.ts +0 -12
  45. package/dist/config/workspace-root.d.ts.map +1 -1
  46. package/dist/config/workspace-root.js +21 -5
  47. package/dist/config/workspace-root.js.map +1 -1
  48. package/dist/core/agent-delegation.d.ts +8 -1
  49. package/dist/core/agent-delegation.d.ts.map +1 -1
  50. package/dist/core/agent-delegation.js +233 -38
  51. package/dist/core/agent-delegation.js.map +1 -1
  52. package/dist/core/cancellation.d.ts +57 -0
  53. package/dist/core/cancellation.d.ts.map +1 -0
  54. package/dist/core/cancellation.js +195 -0
  55. package/dist/core/cancellation.js.map +1 -0
  56. package/dist/core/dag-engine.d.ts +6 -1
  57. package/dist/core/dag-engine.d.ts.map +1 -1
  58. package/dist/core/dag-engine.js +67 -9
  59. package/dist/core/dag-engine.js.map +1 -1
  60. package/dist/core/orchestrator-context.d.ts.map +1 -1
  61. package/dist/core/orchestrator-context.js +28 -3
  62. package/dist/core/orchestrator-context.js.map +1 -1
  63. package/dist/core/orchestrator-route.d.ts +1 -1
  64. package/dist/core/orchestrator-route.d.ts.map +1 -1
  65. package/dist/core/orchestrator-route.js.map +1 -1
  66. package/dist/core/orchestrator.js +6 -1
  67. package/dist/core/orchestrator.js.map +1 -1
  68. package/dist/core/runtime-controller.d.ts +19 -0
  69. package/dist/core/runtime-controller.d.ts.map +1 -0
  70. package/dist/core/runtime-controller.js +89 -0
  71. package/dist/core/runtime-controller.js.map +1 -0
  72. package/dist/core/types.d.ts +17 -0
  73. package/dist/core/types.d.ts.map +1 -1
  74. package/dist/graph/context-slicer-types.d.ts +2 -4
  75. package/dist/graph/context-slicer-types.d.ts.map +1 -1
  76. package/dist/graph/context-slicer-types.js.map +1 -1
  77. package/dist/graph/context-slicer.d.ts +1 -0
  78. package/dist/graph/context-slicer.d.ts.map +1 -1
  79. package/dist/graph/context-slicer.js +54 -18
  80. package/dist/graph/context-slicer.js.map +1 -1
  81. package/dist/graph/file-indexer-walker.d.ts +3 -0
  82. package/dist/graph/file-indexer-walker.d.ts.map +1 -1
  83. package/dist/graph/file-indexer-walker.js.map +1 -1
  84. package/dist/graph/file-indexer.d.ts +1 -0
  85. package/dist/graph/file-indexer.d.ts.map +1 -1
  86. package/dist/graph/file-indexer.js +14 -18
  87. package/dist/graph/file-indexer.js.map +1 -1
  88. package/dist/graph/file-watcher.d.ts.map +1 -1
  89. package/dist/graph/file-watcher.js +9 -2
  90. package/dist/graph/file-watcher.js.map +1 -1
  91. package/dist/graph/graph-utils.d.ts +6 -1
  92. package/dist/graph/graph-utils.d.ts.map +1 -1
  93. package/dist/graph/graph-utils.js +116 -2
  94. package/dist/graph/graph-utils.js.map +1 -1
  95. package/dist/graph/graphify-file-client.d.ts.map +1 -1
  96. package/dist/graph/graphify-file-client.js +2 -1
  97. package/dist/graph/graphify-file-client.js.map +1 -1
  98. package/dist/graph/hit-diversify.d.ts +31 -0
  99. package/dist/graph/hit-diversify.d.ts.map +1 -0
  100. package/dist/graph/hit-diversify.js +270 -0
  101. package/dist/graph/hit-diversify.js.map +1 -0
  102. package/dist/graph/language-indexers/go.d.ts.map +1 -1
  103. package/dist/graph/language-indexers/go.js +2 -3
  104. package/dist/graph/language-indexers/go.js.map +1 -1
  105. package/dist/graph/language-indexers/incremental-parse.d.ts +9 -0
  106. package/dist/graph/language-indexers/incremental-parse.d.ts.map +1 -0
  107. package/dist/graph/language-indexers/incremental-parse.js +114 -0
  108. package/dist/graph/language-indexers/incremental-parse.js.map +1 -0
  109. package/dist/graph/language-indexers/python.d.ts.map +1 -1
  110. package/dist/graph/language-indexers/python.js +2 -3
  111. package/dist/graph/language-indexers/python.js.map +1 -1
  112. package/dist/graph/language-indexers/rust.d.ts.map +1 -1
  113. package/dist/graph/language-indexers/rust.js +2 -3
  114. package/dist/graph/language-indexers/rust.js.map +1 -1
  115. package/dist/graph/language-indexers/tree-sitter-loader.d.ts +19 -3
  116. package/dist/graph/language-indexers/tree-sitter-loader.d.ts.map +1 -1
  117. package/dist/graph/language-indexers/tree-sitter-loader.js +24 -4
  118. package/dist/graph/language-indexers/tree-sitter-loader.js.map +1 -1
  119. package/dist/graph/query-expand.d.ts.map +1 -1
  120. package/dist/graph/query-expand.js +2 -0
  121. package/dist/graph/query-expand.js.map +1 -1
  122. package/dist/index.d.ts +1 -1
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +2 -1
  125. package/dist/index.js.map +1 -1
  126. package/dist/integrations/agent-mcp-installer.d.ts +39 -0
  127. package/dist/integrations/agent-mcp-installer.d.ts.map +1 -1
  128. package/dist/integrations/agent-mcp-installer.js +220 -14
  129. package/dist/integrations/agent-mcp-installer.js.map +1 -1
  130. package/dist/learning/embedding-quality.d.ts +46 -0
  131. package/dist/learning/embedding-quality.d.ts.map +1 -0
  132. package/dist/learning/embedding-quality.js +131 -0
  133. package/dist/learning/embedding-quality.js.map +1 -0
  134. package/dist/learning/embeddings.d.ts +46 -3
  135. package/dist/learning/embeddings.d.ts.map +1 -1
  136. package/dist/learning/embeddings.js +186 -26
  137. package/dist/learning/embeddings.js.map +1 -1
  138. package/dist/learning/hnsw-index.d.ts +9 -35
  139. package/dist/learning/hnsw-index.d.ts.map +1 -1
  140. package/dist/learning/hnsw-index.js +8 -154
  141. package/dist/learning/hnsw-index.js.map +1 -1
  142. package/dist/learning/skill-flywheel.d.ts +1 -1
  143. package/dist/learning/skill-flywheel.d.ts.map +1 -1
  144. package/dist/learning/skill-flywheel.js +10 -3
  145. package/dist/learning/skill-flywheel.js.map +1 -1
  146. package/dist/routing/deepseek-tools.d.ts +7 -0
  147. package/dist/routing/deepseek-tools.d.ts.map +1 -0
  148. package/dist/routing/deepseek-tools.js +154 -0
  149. package/dist/routing/deepseek-tools.js.map +1 -0
  150. package/dist/routing/model-router.d.ts +1 -1
  151. package/dist/routing/model-router.d.ts.map +1 -1
  152. package/dist/routing/model-router.js +5 -1
  153. package/dist/routing/model-router.js.map +1 -1
  154. package/dist/routing/provider-adapters/anthropic.d.ts.map +1 -1
  155. package/dist/routing/provider-adapters/anthropic.js +7 -4
  156. package/dist/routing/provider-adapters/anthropic.js.map +1 -1
  157. package/dist/routing/provider-adapters/bailian.d.ts.map +1 -1
  158. package/dist/routing/provider-adapters/bailian.js +7 -4
  159. package/dist/routing/provider-adapters/bailian.js.map +1 -1
  160. package/dist/routing/provider-adapters/deepseek.d.ts +5 -0
  161. package/dist/routing/provider-adapters/deepseek.d.ts.map +1 -0
  162. package/dist/routing/provider-adapters/deepseek.js +109 -0
  163. package/dist/routing/provider-adapters/deepseek.js.map +1 -0
  164. package/dist/routing/provider-adapters/doubao.d.ts.map +1 -1
  165. package/dist/routing/provider-adapters/doubao.js +7 -4
  166. package/dist/routing/provider-adapters/doubao.js.map +1 -1
  167. package/dist/routing/provider-adapters/openai.d.ts +2 -4
  168. package/dist/routing/provider-adapters/openai.d.ts.map +1 -1
  169. package/dist/routing/provider-adapters/openai.js +23 -32
  170. package/dist/routing/provider-adapters/openai.js.map +1 -1
  171. package/dist/routing/provider-adapters/types.d.ts +61 -0
  172. package/dist/routing/provider-adapters/types.d.ts.map +1 -0
  173. package/dist/routing/provider-adapters/types.js +56 -0
  174. package/dist/routing/provider-adapters/types.js.map +1 -0
  175. package/dist/routing/provider-executor.d.ts +6 -1
  176. package/dist/routing/provider-executor.d.ts.map +1 -1
  177. package/dist/routing/provider-executor.js +70 -39
  178. package/dist/routing/provider-executor.js.map +1 -1
  179. package/dist/routing/provider-health.d.ts.map +1 -1
  180. package/dist/routing/provider-health.js +7 -1
  181. package/dist/routing/provider-health.js.map +1 -1
  182. package/dist/routing/role-capabilities.d.ts +11 -0
  183. package/dist/routing/role-capabilities.d.ts.map +1 -0
  184. package/dist/routing/role-capabilities.js +94 -0
  185. package/dist/routing/role-capabilities.js.map +1 -0
  186. package/dist/surfaces/antigravity-rules/graphflow.md +8 -8
  187. package/dist/surfaces/cli/runtime/env.d.ts.map +1 -1
  188. package/dist/surfaces/cli/runtime/env.js +3 -0
  189. package/dist/surfaces/cli/runtime/env.js.map +1 -1
  190. package/dist/surfaces/cli/runtime/facade.d.ts +2 -1
  191. package/dist/surfaces/cli/runtime/facade.d.ts.map +1 -1
  192. package/dist/surfaces/cli/runtime/facade.js +1 -0
  193. package/dist/surfaces/cli/runtime/facade.js.map +1 -1
  194. package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
  195. package/dist/surfaces/cli/runtime/graph.js +7 -1
  196. package/dist/surfaces/cli/runtime/graph.js.map +1 -1
  197. package/dist/surfaces/cli/runtime/routing.d.ts +3 -0
  198. package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
  199. package/dist/surfaces/cli/runtime/routing.js +31 -4
  200. package/dist/surfaces/cli/runtime/routing.js.map +1 -1
  201. package/dist/surfaces/cli/runtime/settings.d.ts.map +1 -1
  202. package/dist/surfaces/cli/runtime/settings.js +0 -5
  203. package/dist/surfaces/cli/runtime/settings.js.map +1 -1
  204. package/dist/surfaces/cli/runtime/types.d.ts +23 -9
  205. package/dist/surfaces/cli/runtime/types.d.ts.map +1 -1
  206. package/dist/surfaces/cli/runtime.d.ts +1 -1
  207. package/dist/surfaces/cli/runtime.d.ts.map +1 -1
  208. package/dist/surfaces/cli/runtime.js +2 -1
  209. package/dist/surfaces/cli/runtime.js.map +1 -1
  210. package/dist/surfaces/copilot-instructions/graphflow.md +6 -6
  211. package/dist/surfaces/cursor-rules/graphflow.mdc +20 -27
  212. package/dist/surfaces/mcp/server.js +17 -6
  213. package/dist/surfaces/mcp/server.js.map +1 -1
  214. package/dist/surfaces/mcp/tool-definitions.d.ts.map +1 -1
  215. package/dist/surfaces/mcp/tool-definitions.js +31 -124
  216. package/dist/surfaces/mcp/tool-definitions.js.map +1 -1
  217. package/dist/surfaces/mcp/tool-handlers.d.ts.map +1 -1
  218. package/dist/surfaces/mcp/tool-handlers.js +80 -42
  219. package/dist/surfaces/mcp/tool-handlers.js.map +1 -1
  220. package/dist/surfaces/trae-rules/graphflow.md +9 -9
  221. package/dist/surfaces/trae-skill/graphflow/SKILL.md +68 -75
  222. package/package.json +2 -2
  223. package/src/surfaces/antigravity-rules/graphflow.md +8 -8
  224. package/src/surfaces/copilot-instructions/graphflow.md +6 -6
  225. package/src/surfaces/cursor-rules/graphflow.mdc +20 -27
  226. package/src/surfaces/trae-rules/graphflow.md +9 -9
  227. package/src/surfaces/trae-skill/graphflow/SKILL.md +68 -75
@@ -1,16 +1,27 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EMBEDDING_DIM = void 0;
3
+ exports.GRAPHFLOW_EMBEDDING_CACHE_DIR_ENV = exports.HASH_EMBEDDING_MODEL = exports.EMBEDDING_DIM = void 0;
4
4
  exports.warmupEmbeddingProvider = warmupEmbeddingProvider;
5
5
  exports.cosineSimilarity = cosineSimilarity;
6
- exports.hashEmbedding = hashEmbedding;
7
6
  exports.createHashEmbeddingProvider = createHashEmbeddingProvider;
7
+ exports.resolveTransformersCacheDir = resolveTransformersCacheDir;
8
+ exports.applyTransformersCacheDir = applyTransformersCacheDir;
9
+ exports.loadTransformersModule = loadTransformersModule;
10
+ exports.createTransformersEmbeddingProvider = createTransformersEmbeddingProvider;
11
+ exports.createResilientLocalEmbeddingProvider = createResilientLocalEmbeddingProvider;
8
12
  exports.createOpenAiEmbeddingProvider = createOpenAiEmbeddingProvider;
9
13
  exports.extractEmbedding = extractEmbedding;
10
14
  exports.attachEmbedding = attachEmbedding;
11
15
  exports.embedAndAttachNodes = embedAndAttachNodes;
12
16
  exports.reciprocalRankFusion = reciprocalRankFusion;
13
- exports.EMBEDDING_DIM = 256;
17
+ const node_fs_1 = require("node:fs");
18
+ const node_module_1 = require("node:module");
19
+ const node_path_1 = require("node:path");
20
+ const node_url_1 = require("node:url");
21
+ const logger_1 = require("../utils/logger");
22
+ exports.EMBEDDING_DIM = 384;
23
+ exports.HASH_EMBEDDING_MODEL = "fnv1a-384";
24
+ exports.GRAPHFLOW_EMBEDDING_CACHE_DIR_ENV = "GRAPHFLOW_EMBEDDING_CACHE_DIR";
14
25
  /**
15
26
  * 安全地预热 embedding provider。不会抛出异常,适合用 `void warmupEmbeddingProvider(p)` 非阻塞调用。
16
27
  * 预热失败不影响主流程,首个真实请求会再次尝试加载/推理。
@@ -44,41 +55,190 @@ function cosineSimilarity(a, b) {
44
55
  return 0;
45
56
  return dot / (Math.sqrt(na) * Math.sqrt(nb));
46
57
  }
47
- function fnv1a(str) {
58
+ function fnv1a32(input) {
48
59
  let hash = 0x811c9dc5;
49
- for (let i = 0; i < str.length; i += 1) {
50
- hash ^= str.charCodeAt(i);
51
- hash = (hash + ((hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24))) >>> 0;
60
+ for (let i = 0; i < input.length; i += 1) {
61
+ hash ^= input.charCodeAt(i);
62
+ hash = Math.imul(hash, 0x01000193);
52
63
  }
53
64
  return hash >>> 0;
54
65
  }
55
- function hashEmbedding(text, dim = exports.EMBEDDING_DIM) {
56
- const vec = new Array(dim).fill(0);
57
- if (!text)
58
- return vec;
59
- const tokens = text.toLowerCase().split(/[^a-z0-9_]+/g).filter((t) => t.length > 0);
60
- for (const tok of tokens) {
61
- const idx = fnv1a(tok) % dim;
62
- vec[idx] = (vec[idx] ?? 0) + 1;
63
- }
66
+ function l2Normalize(vec) {
64
67
  let norm = 0;
65
- for (let i = 0; i < dim; i += 1)
66
- norm += (vec[i] ?? 0) * (vec[i] ?? 0);
67
- if (norm === 0)
68
+ for (const v of vec) {
69
+ norm += v * v;
70
+ }
71
+ if (norm === 0) {
68
72
  return vec;
73
+ }
69
74
  const inv = 1 / Math.sqrt(norm);
70
- for (let i = 0; i < dim; i += 1)
71
- vec[i] = (vec[i] ?? 0) * inv;
72
- return vec;
75
+ return vec.map((v) => v * inv);
76
+ }
77
+ /**
78
+ * Zero-cost deterministic embedding (FNV-1a bag-of-tokens).
79
+ * Used when `@xenova/transformers` is unavailable (e.g. VS Code extension vendor bundle).
80
+ */
81
+ function createHashEmbeddingProvider(dimensions = exports.EMBEDDING_DIM) {
82
+ const dim = dimensions > 0 ? dimensions : exports.EMBEDDING_DIM;
83
+ return {
84
+ async embed(text) {
85
+ const vec = new Array(dim).fill(0);
86
+ const normalized = text.toLowerCase();
87
+ const tokens = normalized.split(/[^a-z0-9_\u4e00-\u9fff]+/).filter(Boolean);
88
+ const parts = tokens.length > 0 ? tokens : [normalized || "empty"];
89
+ for (const token of parts) {
90
+ const h1 = fnv1a32(token);
91
+ const h2 = fnv1a32(`${token}::2`);
92
+ vec[h1 % dim] = (vec[h1 % dim] ?? 0) + 1;
93
+ vec[h2 % dim] = (vec[h2 % dim] ?? 0) + 0.5;
94
+ }
95
+ return l2Normalize(vec);
96
+ },
97
+ async warmup() {
98
+ /* no-op: pure CPU hash */
99
+ },
100
+ };
101
+ }
102
+ function isModuleNotFoundError(error) {
103
+ if (!error || typeof error !== "object") {
104
+ return false;
105
+ }
106
+ const err = error;
107
+ if (err.code === "ERR_MODULE_NOT_FOUND" || err.code === "MODULE_NOT_FOUND") {
108
+ return true;
109
+ }
110
+ const message = err.message ?? "";
111
+ return (message.includes("Cannot find package '@xenova/transformers'") ||
112
+ message.includes("Cannot find module '@xenova/transformers'"));
113
+ }
114
+ function normalizeOptionalPath(value) {
115
+ const trimmed = value?.trim();
116
+ return trimmed ? trimmed : undefined;
117
+ }
118
+ function resolveTransformersCacheDir(modelCacheDir) {
119
+ return normalizeOptionalPath(modelCacheDir) ?? normalizeOptionalPath(process.env[exports.GRAPHFLOW_EMBEDDING_CACHE_DIR_ENV]);
120
+ }
121
+ function applyTransformersCacheDir(transformers, modelCacheDir) {
122
+ const cacheDir = resolveTransformersCacheDir(modelCacheDir);
123
+ if (!cacheDir) {
124
+ return undefined;
125
+ }
126
+ transformers.env ??= {};
127
+ transformers.env.cacheDir = cacheDir;
128
+ return cacheDir;
129
+ }
130
+ async function importTransformersFromRoot(root) {
131
+ const pkgJson = (0, node_path_1.join)(root, "package.json");
132
+ if (!(0, node_fs_1.existsSync)(pkgJson)) {
133
+ return null;
134
+ }
135
+ try {
136
+ const requireFromRoot = (0, node_module_1.createRequire)(pkgJson);
137
+ const resolved = requireFromRoot.resolve("@xenova/transformers");
138
+ return (await import((0, node_url_1.pathToFileURL)(resolved).href));
139
+ }
140
+ catch {
141
+ return null;
142
+ }
143
+ }
144
+ /**
145
+ * Load `@xenova/transformers`, optionally resolving from workspace node_modules
146
+ * when the bundled runtime (extension vendor) does not include the package.
147
+ */
148
+ async function loadTransformersModule(resolveRoots = []) {
149
+ try {
150
+ return (await import("@xenova/transformers"));
151
+ }
152
+ catch (primaryError) {
153
+ const roots = [...new Set(resolveRoots.filter((r) => typeof r === "string" && r.length > 0))];
154
+ for (const root of roots) {
155
+ const loaded = await importTransformersFromRoot(root);
156
+ if (loaded) {
157
+ logger_1.logger.info({ root }, "Loaded @xenova/transformers from workspace resolve root");
158
+ return loaded;
159
+ }
160
+ }
161
+ throw primaryError;
162
+ }
163
+ }
164
+ function createTransformersEmbeddingProvider(options) {
165
+ let extractor = null;
166
+ let loadError = null;
167
+ const resolveRoots = options?.resolveRoots ?? [];
168
+ const loadModule = options?.loadModule ?? loadTransformersModule;
169
+ async function getExtractor() {
170
+ if (extractor)
171
+ return extractor;
172
+ if (loadError)
173
+ throw loadError;
174
+ try {
175
+ const transformers = await loadModule(resolveRoots);
176
+ applyTransformersCacheDir(transformers, options?.modelCacheDir);
177
+ const { pipeline } = transformers;
178
+ extractor = await pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2");
179
+ return extractor;
180
+ }
181
+ catch (error) {
182
+ loadError = error;
183
+ throw error;
184
+ }
185
+ }
186
+ return {
187
+ async embed(text) {
188
+ const ext = await getExtractor();
189
+ const output = await ext(text, { pooling: "mean", normalize: true });
190
+ const data = output.data;
191
+ if (data instanceof Float32Array) {
192
+ return Array.from(data);
193
+ }
194
+ return Array.from(data);
195
+ },
196
+ async warmup() {
197
+ await this.embed("warmup");
198
+ },
199
+ };
73
200
  }
74
- function createHashEmbeddingProvider(dim = exports.EMBEDDING_DIM) {
201
+ /**
202
+ * Prefer transformers; on missing package / first load failure, permanently fall back to hash.
203
+ * Prevents ERR_MODULE_NOT_FOUND spam from vector recall in extension vendor runtimes.
204
+ */
205
+ function createResilientLocalEmbeddingProvider(options) {
206
+ const primary = createTransformersEmbeddingProvider({
207
+ resolveRoots: options?.resolveRoots ?? [],
208
+ ...(options?.modelCacheDir ? { modelCacheDir: options.modelCacheDir } : {}),
209
+ ...(options?.loadModule ? { loadModule: options.loadModule } : {}),
210
+ });
211
+ const fallback = createHashEmbeddingProvider();
212
+ let backend = "pending";
75
213
  return {
214
+ getBackend() {
215
+ return backend;
216
+ },
76
217
  async embed(text) {
77
- return hashEmbedding(text, dim);
218
+ if (backend === "hash") {
219
+ return fallback.embed(text);
220
+ }
221
+ if (backend === "transformers") {
222
+ return primary.embed(text);
223
+ }
224
+ try {
225
+ const vector = await primary.embed(text);
226
+ backend = "transformers";
227
+ return vector;
228
+ }
229
+ catch (error) {
230
+ backend = "hash";
231
+ logger_1.logger.warn({
232
+ error,
233
+ fallback: exports.HASH_EMBEDDING_MODEL,
234
+ reason: isModuleNotFoundError(error) ? "module-not-found" : "load-or-inference-failed",
235
+ }, "Transformers embedding unavailable; falling back to hash embedding");
236
+ options?.onFallback?.(error);
237
+ return fallback.embed(text);
238
+ }
78
239
  },
79
- // hash 嵌入无懒加载,预热仅做一次廉价推理以保持接口一致
80
240
  async warmup() {
81
- await hashEmbedding("warmup", dim);
241
+ await this.embed("warmup");
82
242
  },
83
243
  };
84
244
  }
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/learning/embeddings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/learning/embeddings.ts"],"names":[],"mappings":"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"}
@@ -2,64 +2,38 @@ import type { GraphNode } from "../core/types";
2
2
  /**
3
3
  * HNSW (Hierarchical Navigable Small World) vector index.
4
4
  *
5
- * For large repos (1000+ nodes), linear cosine scan becomes a bottleneck.
6
- * This module uses hnswlib-node for ANN search (10-100x faster).
7
- * Small datasets (<200 nodes) still use linear scan to avoid HNSW build overhead.
8
- *
9
- * Design: the index is built lazily and cached. Adding/removing nodes marks
10
- * the index dirty so it rebuilds on next search.
5
+ * Previously used hnswlib-node for ANN search, but that has been removed
6
+ * due to C++ compilation dependency issues. Now always uses linear scan.
11
7
  */
12
8
  export interface VectorSearchResult {
13
9
  node: GraphNode;
14
10
  similarity: number;
15
11
  }
16
12
  export interface HnswVectorIndexOptions {
17
- /** Cosine space recommended for normalized embeddings. */
18
- space?: "cosine" | "l2" | "ip";
19
- /** Force linear scan even if hnswlib is available (for testing). */
13
+ /** Force linear scan (always true now, kept for API compatibility). */
20
14
  forceLinear?: boolean;
21
- /** Max elements to auto-switch to HNSW. Below this, linear scan is used. Default 200. */
15
+ /** Max elements threshold (no longer used, kept for API compatibility). */
22
16
  linearThreshold?: number;
23
- /** HNSW M parameter (number of bi-directional links). Default 16. */
24
- m?: number;
25
- /** HNSW efConstruction parameter. Higher = better recall, slower build. Default 200. */
26
- efConstruction?: number;
27
- /** HNSW efSearch parameter. Higher = better recall, slower search. Default 64. */
28
- efSearch?: number;
29
- /** Optional path to persist / load the index. */
30
- indexPath?: string;
31
17
  }
32
18
  /**
33
19
  * A vector index over graph nodes that have embeddings attached.
34
- * Uses HNSW when available and beneficial, otherwise brute-force cosine similarity.
20
+ * Uses brute-force cosine similarity (linear scan).
35
21
  */
36
22
  export declare class HnswVectorIndex {
37
23
  private nodes;
38
24
  private embeddings;
39
25
  private dim;
40
- private hnswIndex;
41
- private dirty;
42
- private readonly space;
43
- private readonly forceLinear;
44
- private readonly linearThreshold;
45
- private readonly m;
46
- private readonly efConstruction;
47
- private readonly efSearch;
48
- private readonly indexPath;
49
- private backendResolved;
50
- constructor(options?: HnswVectorIndexOptions);
26
+ constructor(_options?: HnswVectorIndexOptions);
51
27
  /** Loads nodes with embeddings into the index. */
52
28
  load(nodes: GraphNode[]): void;
53
29
  get size(): number;
54
- get backend(): "hnsw" | "linear" | "pending";
55
- /** Persist the built HNSW index to disk. No-op for linear backend. */
30
+ get backend(): "linear";
31
+ /** Persist is a no-op now. */
56
32
  save(): void;
57
- /** Attempt to load a previously persisted HNSW index from disk. */
33
+ /** Load index is a no-op now. */
58
34
  loadIndex(): Promise<boolean>;
59
- private ensureIndex;
60
35
  /** Returns top-K nodes by similarity to the query embedding. */
61
36
  search(queryEmbedding: number[], topK: number, minSimilarity?: number): Promise<VectorSearchResult[]>;
62
- private searchHnsw;
63
37
  private searchLinear;
64
38
  }
65
39
  //# sourceMappingURL=hnsw-index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hnsw-index.d.ts","sourceRoot":"","sources":["../../src/learning/hnsw-index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C;;;;;;;;;GASG;AAEH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAoCD,MAAM,WAAW,sBAAsB;IACrC,0DAA0D;IAC1D,KAAK,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/B,oEAAoE;IACpE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,eAAe,CAA4C;gBAEvD,OAAO,CAAC,EAAE,sBAAsB;IAU5C,kDAAkD;IAClD,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI;IAc9B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE3C;IAED,sEAAsE;IACtE,IAAI,IAAI,IAAI;IAWZ,mEAAmE;IAC7D,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;YAqCrB,WAAW;IAqDzB,gEAAgE;IAC1D,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,SAAI,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAatG,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,YAAY;CAWrB"}
1
+ {"version":3,"file":"hnsw-index.d.ts","sourceRoot":"","sources":["../../src/learning/hnsw-index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C;;;;;GAKG;AAEH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,GAAG,CAAK;gBAEJ,QAAQ,CAAC,EAAE,sBAAsB;IAI7C,kDAAkD;IAClD,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI;IAa9B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,QAAQ,CAEtB;IAED,8BAA8B;IAC9B,IAAI,IAAI,IAAI;IAIZ,iCAAiC;IAC3B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC,gEAAgE;IAC1D,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,SAAI,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAOtG,OAAO,CAAC,YAAY;CAWrB"}
@@ -1,54 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HnswVectorIndex = void 0;
4
- const logger_1 = require("../utils/logger");
5
4
  const embeddings_1 = require("./embeddings");
6
- let hnswModulePromise = null;
7
- async function loadHnswlib() {
8
- if (hnswModulePromise)
9
- return hnswModulePromise;
10
- hnswModulePromise = (async () => {
11
- try {
12
- const mod = (await import("hnswlib-node"));
13
- if (mod && typeof mod.HierarchicalNSW === "function") {
14
- return mod;
15
- }
16
- logger_1.logger.warn("hnswlib-node loaded but HierarchicalNSW not found; falling back to linear scan");
17
- return null;
18
- }
19
- catch (err) {
20
- logger_1.logger.warn({ error: err }, "Failed to load hnswlib-node; falling back to linear scan");
21
- return null;
22
- }
23
- })();
24
- return hnswModulePromise;
25
- }
26
5
  /**
27
6
  * A vector index over graph nodes that have embeddings attached.
28
- * Uses HNSW when available and beneficial, otherwise brute-force cosine similarity.
7
+ * Uses brute-force cosine similarity (linear scan).
29
8
  */
30
9
  class HnswVectorIndex {
31
10
  nodes = [];
32
11
  embeddings = [];
33
12
  dim = 0;
34
- hnswIndex = null;
35
- dirty = true;
36
- space;
37
- forceLinear;
38
- linearThreshold;
39
- m;
40
- efConstruction;
41
- efSearch;
42
- indexPath;
43
- backendResolved = "pending";
44
- constructor(options) {
45
- this.space = options?.space ?? "cosine";
46
- this.forceLinear = options?.forceLinear ?? false;
47
- this.linearThreshold = options?.linearThreshold ?? 200;
48
- this.m = options?.m ?? 16;
49
- this.efConstruction = options?.efConstruction ?? 200;
50
- this.efSearch = options?.efSearch ?? 64;
51
- this.indexPath = options?.indexPath;
13
+ constructor(_options) {
14
+ // options accepted for API compat; no-op for linear scan
52
15
  }
53
16
  /** Loads nodes with embeddings into the index. */
54
17
  load(nodes) {
@@ -65,137 +28,28 @@ class HnswVectorIndex {
65
28
  this.nodes.push(node);
66
29
  this.embeddings.push(emb);
67
30
  }
68
- this.dirty = true;
69
31
  }
70
32
  get size() {
71
33
  return this.nodes.length;
72
34
  }
73
35
  get backend() {
74
- return this.backendResolved;
36
+ return "linear";
75
37
  }
76
- /** Persist the built HNSW index to disk. No-op for linear backend. */
38
+ /** Persist is a no-op now. */
77
39
  save() {
78
- if (this.backendResolved === "hnsw" && this.hnswIndex && this.indexPath) {
79
- try {
80
- this.hnswIndex.writeIndexSync(this.indexPath);
81
- logger_1.logger.debug({ path: this.indexPath }, "HNSW index saved");
82
- }
83
- catch (error) {
84
- logger_1.logger.warn({ error, path: this.indexPath }, "Failed to save HNSW index");
85
- }
86
- }
40
+ // no-op
87
41
  }
88
- /** Attempt to load a previously persisted HNSW index from disk. */
42
+ /** Load index is a no-op now. */
89
43
  async loadIndex() {
90
- if (!this.indexPath)
91
- return false;
92
- if (this.nodes.length === 0 || this.dim === 0)
93
- return false;
94
- if (this.forceLinear || this.nodes.length < this.linearThreshold) {
95
- this.backendResolved = "linear";
96
- return false;
97
- }
98
- const mod = await loadHnswlib();
99
- if (!mod) {
100
- this.backendResolved = "linear";
101
- return false;
102
- }
103
- try {
104
- const index = new mod.HierarchicalNSW(this.space, this.dim);
105
- index.readIndexSync(this.indexPath);
106
- // Validate loaded index size matches current nodes
107
- if (index.getCurrentCount() !== this.nodes.length) {
108
- logger_1.logger.warn({ expected: this.nodes.length, actual: index.getCurrentCount() }, "HNSW index size mismatch; rebuilding");
109
- return false;
110
- }
111
- index.setEf(this.efSearch);
112
- this.hnswIndex = index;
113
- this.backendResolved = "hnsw";
114
- this.dirty = false;
115
- logger_1.logger.debug({ path: this.indexPath }, "HNSW index loaded from disk");
116
- return true;
117
- }
118
- catch (error) {
119
- logger_1.logger.warn({ error, path: this.indexPath }, "Failed to load HNSW index; will rebuild");
120
- return false;
121
- }
122
- }
123
- async ensureIndex() {
124
- if (!this.dirty)
125
- return;
126
- if (this.forceLinear || this.nodes.length === 0) {
127
- this.backendResolved = "linear";
128
- this.hnswIndex = null;
129
- this.dirty = false;
130
- return;
131
- }
132
- // Auto-downgrade to linear for small datasets
133
- if (this.nodes.length < this.linearThreshold) {
134
- this.backendResolved = "linear";
135
- this.hnswIndex = null;
136
- this.dirty = false;
137
- return;
138
- }
139
- // Try to load persisted index first
140
- if (this.indexPath) {
141
- const loaded = await this.loadIndex();
142
- if (loaded)
143
- return;
144
- }
145
- const mod = await loadHnswlib();
146
- if (!mod) {
147
- this.backendResolved = "linear";
148
- this.hnswIndex = null;
149
- this.dirty = false;
150
- return;
151
- }
152
- try {
153
- const index = new mod.HierarchicalNSW(this.space, this.dim);
154
- index.initIndex(this.nodes.length, this.m, this.efConstruction);
155
- for (let i = 0; i < this.embeddings.length; i += 1) {
156
- index.addPoint(this.embeddings[i], i);
157
- }
158
- index.setEf(this.efSearch);
159
- this.hnswIndex = index;
160
- this.backendResolved = "hnsw";
161
- this.save(); // persist for next time
162
- logger_1.logger.debug({ nodes: this.nodes.length, dim: this.dim, m: this.m, efConstruction: this.efConstruction, efSearch: this.efSearch }, "HNSW index built");
163
- }
164
- catch (error) {
165
- logger_1.logger.warn({ error }, "HNSW index build failed; using linear scan");
166
- this.hnswIndex = null;
167
- this.backendResolved = "linear";
168
- }
169
- this.dirty = false;
44
+ return false;
170
45
  }
171
46
  /** Returns top-K nodes by similarity to the query embedding. */
172
47
  async search(queryEmbedding, topK, minSimilarity = 0) {
173
48
  if (this.nodes.length === 0 || !queryEmbedding || queryEmbedding.length === 0) {
174
49
  return [];
175
50
  }
176
- await this.ensureIndex();
177
- if (this.hnswIndex && this.backendResolved === "hnsw") {
178
- return this.searchHnsw(queryEmbedding, topK, minSimilarity);
179
- }
180
51
  return this.searchLinear(queryEmbedding, topK, minSimilarity);
181
52
  }
182
- searchHnsw(queryEmbedding, topK, minSimilarity) {
183
- const k = Math.min(topK, this.nodes.length);
184
- const result = this.hnswIndex.searchKnn(queryEmbedding, k);
185
- const out = [];
186
- for (let i = 0; i < result.neighbors.length; i += 1) {
187
- const label = result.neighbors[i];
188
- const node = this.nodes[label];
189
- if (!node)
190
- continue;
191
- // For cosine space, hnswlib distance = 1 - cosine_similarity.
192
- const similarity = this.space === "cosine" ? 1 - result.distances[i] : result.distances[i];
193
- if (similarity >= minSimilarity) {
194
- out.push({ node, similarity });
195
- }
196
- }
197
- return out;
198
- }
199
53
  searchLinear(queryEmbedding, topK, minSimilarity) {
200
54
  const scored = [];
201
55
  for (let i = 0; i < this.nodes.length; i += 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"hnsw-index.js","sourceRoot":"","sources":["../../src/learning/hnsw-index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hnsw-index.js","sourceRoot":"","sources":["../../src/learning/hnsw-index.ts"],"names":[],"mappings":";;;AACA,6CAAkE;AAqBlE;;;GAGG;AACH,MAAa,eAAe;IAClB,KAAK,GAAgB,EAAE,CAAC;IACxB,UAAU,GAAe,EAAE,CAAC;IAC5B,GAAG,GAAG,CAAC,CAAC;IAEhB,YAAY,QAAiC;QAC3C,yDAAyD;IAC3D,CAAC;IAED,kDAAkD;IAClD,IAAI,CAAC,KAAkB;QACrB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAA,6BAAgB,EAAC,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC;gBAAE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;YAC1C,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG;gBAAE,SAAS,CAAC,uBAAuB;YAC9D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,8BAA8B;IAC9B,IAAI;QACF,QAAQ;IACV,CAAC;IAED,iCAAiC;IACjC,KAAK,CAAC,SAAS;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,MAAM,CAAC,cAAwB,EAAE,IAAY,EAAE,aAAa,GAAG,CAAC;QACpE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9E,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;IAChE,CAAC;IAEO,YAAY,CAAC,cAAwB,EAAE,IAAY,EAAE,aAAqB;QAChF,MAAM,MAAM,GAAyB,EAAE,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAA,6BAAgB,EAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,CAAC;YAClE,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF;AA5DD,0CA4DC"}
@@ -3,6 +3,6 @@ import type { GraphClient } from "../graph/client-factory";
3
3
  export type { SkillState, CompositeSkillState } from "./skill-types";
4
4
  export { composeSkillId, loadCompositeSkill } from "./skill-store";
5
5
  export declare function extractSkillAtoms(task: string): string[];
6
- export declare function applySkillLearning(client: GraphClient, task: string, run: TaskRunResult): Promise<void>;
6
+ export declare function applySkillLearning(client: GraphClient, task: string, run: TaskRunResult, lessons?: string[]): Promise<number>;
7
7
  export declare function suggestSkillHints(client: GraphClient, task: string, maxHints: number): Promise<string[]>;
8
8
  //# sourceMappingURL=skill-flywheel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-flywheel.d.ts","sourceRoot":"","sources":["../../src/learning/skill-flywheel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA2B3D,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AA6CnE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAuCxD;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,IAAI,CAAC,CA8Ef;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CA2FnB"}
1
+ {"version":3,"file":"skill-flywheel.d.ts","sourceRoot":"","sources":["../../src/learning/skill-flywheel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA2B3D,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AA6CnE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAuCxD;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,aAAa,EAClB,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,MAAM,CAAC,CAqFjB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CA2FnB"}
@@ -73,10 +73,16 @@ function extractSkillAtoms(task) {
73
73
  .filter((skill) => !isBareStopword(skill))
74
74
  .slice(0, 8);
75
75
  }
76
- async function applySkillLearning(client, task, run) {
77
- const skills = extractSkillAtoms(task);
76
+ async function applySkillLearning(client, task, run, lessons) {
77
+ const lessonText = (lessons ?? [])
78
+ .map((lesson) => lesson.trim())
79
+ .filter((lesson) => lesson.length > 0);
80
+ // Prefer task atoms; fold reported lessons so bridge report_outcome can seed skills
81
+ // even when the original task string is too short/generic to extract atoms.
82
+ const learningCorpus = [task, ...lessonText].filter(Boolean).join(" and ");
83
+ const skills = extractSkillAtoms(learningCorpus);
78
84
  if (skills.length === 0) {
79
- return;
85
+ return 0;
80
86
  }
81
87
  const passed = run.status === "COMPLETED";
82
88
  const now = Date.now();
@@ -142,6 +148,7 @@ async function applySkillLearning(client, task, run) {
142
148
  }
143
149
  await client.upsertNodes(nodes);
144
150
  await client.upsertEdges((0, skill_store_1.dedupEdges)(edges));
151
+ return skills.length;
145
152
  }
146
153
  async function suggestSkillHints(client, task, maxHints) {
147
154
  const atoms = extractSkillAtoms(task);