kairo-mcp 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/CHANGELOG.md +1122 -0
  2. package/LICENSE +21 -0
  3. package/README.md +662 -0
  4. package/dist/cli/cli.d.ts +3 -0
  5. package/dist/cli/cli.d.ts.map +1 -0
  6. package/dist/cli/cli.js +226 -0
  7. package/dist/cli/cli.js.map +1 -0
  8. package/dist/cli/commands.d.ts +10 -0
  9. package/dist/cli/commands.d.ts.map +1 -0
  10. package/dist/cli/commands.js +938 -0
  11. package/dist/cli/commands.js.map +1 -0
  12. package/dist/cli/flags.d.ts +30 -0
  13. package/dist/cli/flags.d.ts.map +1 -0
  14. package/dist/cli/flags.js +90 -0
  15. package/dist/cli/flags.js.map +1 -0
  16. package/dist/cli/output.d.ts +69 -0
  17. package/dist/cli/output.d.ts.map +1 -0
  18. package/dist/cli/output.js +166 -0
  19. package/dist/cli/output.js.map +1 -0
  20. package/dist/cli/types.d.ts +34 -0
  21. package/dist/cli/types.d.ts.map +1 -0
  22. package/dist/cli/types.js +2 -0
  23. package/dist/cli/types.js.map +1 -0
  24. package/dist/contracts/migrations.d.ts +31 -0
  25. package/dist/contracts/migrations.d.ts.map +1 -0
  26. package/dist/contracts/migrations.js +71 -0
  27. package/dist/contracts/migrations.js.map +1 -0
  28. package/dist/contracts/schemas.d.ts +53 -0
  29. package/dist/contracts/schemas.d.ts.map +1 -0
  30. package/dist/contracts/schemas.js +27 -0
  31. package/dist/contracts/schemas.js.map +1 -0
  32. package/dist/contracts/stability.d.ts +32 -0
  33. package/dist/contracts/stability.d.ts.map +1 -0
  34. package/dist/contracts/stability.js +140 -0
  35. package/dist/contracts/stability.js.map +1 -0
  36. package/dist/contracts/zodSchemas.d.ts +811 -0
  37. package/dist/contracts/zodSchemas.d.ts.map +1 -0
  38. package/dist/contracts/zodSchemas.js +139 -0
  39. package/dist/contracts/zodSchemas.js.map +1 -0
  40. package/dist/core/brief/budget.d.ts +21 -0
  41. package/dist/core/brief/budget.d.ts.map +1 -0
  42. package/dist/core/brief/budget.js +42 -0
  43. package/dist/core/brief/budget.js.map +1 -0
  44. package/dist/core/checkpoint/checkpointManager.d.ts +29 -0
  45. package/dist/core/checkpoint/checkpointManager.d.ts.map +1 -0
  46. package/dist/core/checkpoint/checkpointManager.js +49 -0
  47. package/dist/core/checkpoint/checkpointManager.js.map +1 -0
  48. package/dist/core/compaction/compactor.d.ts +40 -0
  49. package/dist/core/compaction/compactor.d.ts.map +1 -0
  50. package/dist/core/compaction/compactor.js +168 -0
  51. package/dist/core/compaction/compactor.js.map +1 -0
  52. package/dist/core/continuation/continuationBuilder.d.ts +19 -0
  53. package/dist/core/continuation/continuationBuilder.d.ts.map +1 -0
  54. package/dist/core/continuation/continuationBuilder.js +184 -0
  55. package/dist/core/continuation/continuationBuilder.js.map +1 -0
  56. package/dist/core/coordination/coordinationManager.d.ts +34 -0
  57. package/dist/core/coordination/coordinationManager.d.ts.map +1 -0
  58. package/dist/core/coordination/coordinationManager.js +253 -0
  59. package/dist/core/coordination/coordinationManager.js.map +1 -0
  60. package/dist/core/coordination/types.d.ts +52 -0
  61. package/dist/core/coordination/types.d.ts.map +1 -0
  62. package/dist/core/coordination/types.js +6 -0
  63. package/dist/core/coordination/types.js.map +1 -0
  64. package/dist/core/github/changelog.d.ts +9 -0
  65. package/dist/core/github/changelog.d.ts.map +1 -0
  66. package/dist/core/github/changelog.js +41 -0
  67. package/dist/core/github/changelog.js.map +1 -0
  68. package/dist/core/github/commitMessage.d.ts +4 -0
  69. package/dist/core/github/commitMessage.d.ts.map +1 -0
  70. package/dist/core/github/commitMessage.js +125 -0
  71. package/dist/core/github/commitMessage.js.map +1 -0
  72. package/dist/core/github/gitContext.d.ts +3 -0
  73. package/dist/core/github/gitContext.d.ts.map +1 -0
  74. package/dist/core/github/gitContext.js +67 -0
  75. package/dist/core/github/gitContext.js.map +1 -0
  76. package/dist/core/github/releasePlan.d.ts +8 -0
  77. package/dist/core/github/releasePlan.d.ts.map +1 -0
  78. package/dist/core/github/releasePlan.js +56 -0
  79. package/dist/core/github/releasePlan.js.map +1 -0
  80. package/dist/core/github/semver.d.ts +11 -0
  81. package/dist/core/github/semver.d.ts.map +1 -0
  82. package/dist/core/github/semver.js +23 -0
  83. package/dist/core/github/semver.js.map +1 -0
  84. package/dist/core/github/types.d.ts +36 -0
  85. package/dist/core/github/types.d.ts.map +1 -0
  86. package/dist/core/github/types.js +2 -0
  87. package/dist/core/github/types.js.map +1 -0
  88. package/dist/core/graph/derived.d.ts +6 -0
  89. package/dist/core/graph/derived.d.ts.map +1 -0
  90. package/dist/core/graph/derived.js +133 -0
  91. package/dist/core/graph/derived.js.map +1 -0
  92. package/dist/core/graph/graphEngine.d.ts +11 -0
  93. package/dist/core/graph/graphEngine.d.ts.map +1 -0
  94. package/dist/core/graph/graphEngine.js +28 -0
  95. package/dist/core/graph/graphEngine.js.map +1 -0
  96. package/dist/core/graph/imports.d.ts +19 -0
  97. package/dist/core/graph/imports.d.ts.map +1 -0
  98. package/dist/core/graph/imports.js +0 -0
  99. package/dist/core/graph/imports.js.map +1 -0
  100. package/dist/core/graph/mermaid.d.ts +6 -0
  101. package/dist/core/graph/mermaid.d.ts.map +1 -0
  102. package/dist/core/graph/mermaid.js +40 -0
  103. package/dist/core/graph/mermaid.js.map +1 -0
  104. package/dist/core/graph/moduleGraph.d.ts +27 -0
  105. package/dist/core/graph/moduleGraph.d.ts.map +1 -0
  106. package/dist/core/graph/moduleGraph.js +186 -0
  107. package/dist/core/graph/moduleGraph.js.map +1 -0
  108. package/dist/core/graph/types.d.ts +32 -0
  109. package/dist/core/graph/types.d.ts.map +1 -0
  110. package/dist/core/graph/types.js +2 -0
  111. package/dist/core/graph/types.js.map +1 -0
  112. package/dist/core/query/queryEngine.d.ts +26 -0
  113. package/dist/core/query/queryEngine.d.ts.map +1 -0
  114. package/dist/core/query/queryEngine.js +258 -0
  115. package/dist/core/query/queryEngine.js.map +1 -0
  116. package/dist/core/query/types.d.ts +70 -0
  117. package/dist/core/query/types.d.ts.map +1 -0
  118. package/dist/core/query/types.js +6 -0
  119. package/dist/core/query/types.js.map +1 -0
  120. package/dist/core/repo/fingerprint.d.ts +0 -0
  121. package/dist/core/repo/fingerprint.d.ts.map +1 -0
  122. package/dist/core/repo/fingerprint.js +17 -0
  123. package/dist/core/repo/fingerprint.js.map +1 -0
  124. package/dist/core/repo/frameworkDetectors.d.ts +14 -0
  125. package/dist/core/repo/frameworkDetectors.d.ts.map +1 -0
  126. package/dist/core/repo/frameworkDetectors.js +151 -0
  127. package/dist/core/repo/frameworkDetectors.js.map +1 -0
  128. package/dist/core/repo/repoScanner.d.ts +20 -0
  129. package/dist/core/repo/repoScanner.d.ts.map +1 -0
  130. package/dist/core/repo/repoScanner.js +290 -0
  131. package/dist/core/repo/repoScanner.js.map +1 -0
  132. package/dist/core/repo/summary.d.ts +7 -0
  133. package/dist/core/repo/summary.d.ts.map +1 -0
  134. package/dist/core/repo/summary.js +34 -0
  135. package/dist/core/repo/summary.js.map +1 -0
  136. package/dist/core/repo/types.d.ts +62 -0
  137. package/dist/core/repo/types.d.ts.map +1 -0
  138. package/dist/core/repo/types.js +10 -0
  139. package/dist/core/repo/types.js.map +1 -0
  140. package/dist/core/risk/guardrail.d.ts +3 -0
  141. package/dist/core/risk/guardrail.d.ts.map +1 -0
  142. package/dist/core/risk/guardrail.js +47 -0
  143. package/dist/core/risk/guardrail.js.map +1 -0
  144. package/dist/core/risk/riskEngine.d.ts +8 -0
  145. package/dist/core/risk/riskEngine.d.ts.map +1 -0
  146. package/dist/core/risk/riskEngine.js +112 -0
  147. package/dist/core/risk/riskEngine.js.map +1 -0
  148. package/dist/core/risk/riskHeuristics.d.ts +4 -0
  149. package/dist/core/risk/riskHeuristics.d.ts.map +1 -0
  150. package/dist/core/risk/riskHeuristics.js +36 -0
  151. package/dist/core/risk/riskHeuristics.js.map +1 -0
  152. package/dist/core/salience/config.d.ts +14 -0
  153. package/dist/core/salience/config.d.ts.map +1 -0
  154. package/dist/core/salience/config.js +87 -0
  155. package/dist/core/salience/config.js.map +1 -0
  156. package/dist/core/salience/salienceEngine.d.ts +16 -0
  157. package/dist/core/salience/salienceEngine.d.ts.map +1 -0
  158. package/dist/core/salience/salienceEngine.js +64 -0
  159. package/dist/core/salience/salienceEngine.js.map +1 -0
  160. package/dist/core/salience/signals.d.ts +4 -0
  161. package/dist/core/salience/signals.d.ts.map +1 -0
  162. package/dist/core/salience/signals.js +143 -0
  163. package/dist/core/salience/signals.js.map +1 -0
  164. package/dist/core/salience/types.d.ts +69 -0
  165. package/dist/core/salience/types.d.ts.map +1 -0
  166. package/dist/core/salience/types.js +7 -0
  167. package/dist/core/salience/types.js.map +1 -0
  168. package/dist/core/session/eventPayloads.d.ts +92 -0
  169. package/dist/core/session/eventPayloads.d.ts.map +1 -0
  170. package/dist/core/session/eventPayloads.js +2 -0
  171. package/dist/core/session/eventPayloads.js.map +1 -0
  172. package/dist/core/session/reducer.d.ts +14 -0
  173. package/dist/core/session/reducer.d.ts.map +1 -0
  174. package/dist/core/session/reducer.js +181 -0
  175. package/dist/core/session/reducer.js.map +1 -0
  176. package/dist/core/session/sessionManager.d.ts +252 -0
  177. package/dist/core/session/sessionManager.d.ts.map +1 -0
  178. package/dist/core/session/sessionManager.js +655 -0
  179. package/dist/core/session/sessionManager.js.map +1 -0
  180. package/dist/core/telemetry/analytics.d.ts +24 -0
  181. package/dist/core/telemetry/analytics.d.ts.map +1 -0
  182. package/dist/core/telemetry/analytics.js +167 -0
  183. package/dist/core/telemetry/analytics.js.map +1 -0
  184. package/dist/core/telemetry/exporter.d.ts +17 -0
  185. package/dist/core/telemetry/exporter.d.ts.map +1 -0
  186. package/dist/core/telemetry/exporter.js +31 -0
  187. package/dist/core/telemetry/exporter.js.map +1 -0
  188. package/dist/core/telemetry/recorder.d.ts +19 -0
  189. package/dist/core/telemetry/recorder.d.ts.map +1 -0
  190. package/dist/core/telemetry/recorder.js +43 -0
  191. package/dist/core/telemetry/recorder.js.map +1 -0
  192. package/dist/core/telemetry/reports.d.ts +6 -0
  193. package/dist/core/telemetry/reports.d.ts.map +1 -0
  194. package/dist/core/telemetry/reports.js +84 -0
  195. package/dist/core/telemetry/reports.js.map +1 -0
  196. package/dist/core/telemetry/types.d.ts +82 -0
  197. package/dist/core/telemetry/types.d.ts.map +1 -0
  198. package/dist/core/telemetry/types.js +9 -0
  199. package/dist/core/telemetry/types.js.map +1 -0
  200. package/dist/core/vector/chunking/memoryChunker.d.ts +10 -0
  201. package/dist/core/vector/chunking/memoryChunker.d.ts.map +1 -0
  202. package/dist/core/vector/chunking/memoryChunker.js +202 -0
  203. package/dist/core/vector/chunking/memoryChunker.js.map +1 -0
  204. package/dist/core/vector/compression/architectureDigest.d.ts +12 -0
  205. package/dist/core/vector/compression/architectureDigest.d.ts.map +1 -0
  206. package/dist/core/vector/compression/architectureDigest.js +37 -0
  207. package/dist/core/vector/compression/architectureDigest.js.map +1 -0
  208. package/dist/core/vector/embedding/deterministicEmbedder.d.ts +10 -0
  209. package/dist/core/vector/embedding/deterministicEmbedder.d.ts.map +1 -0
  210. package/dist/core/vector/embedding/deterministicEmbedder.js +84 -0
  211. package/dist/core/vector/embedding/deterministicEmbedder.js.map +1 -0
  212. package/dist/core/vector/memory/memoryEngine.d.ts +56 -0
  213. package/dist/core/vector/memory/memoryEngine.d.ts.map +1 -0
  214. package/dist/core/vector/memory/memoryEngine.js +204 -0
  215. package/dist/core/vector/memory/memoryEngine.js.map +1 -0
  216. package/dist/core/vector/memory/memoryFingerprint.d.ts +12 -0
  217. package/dist/core/vector/memory/memoryFingerprint.d.ts.map +1 -0
  218. package/dist/core/vector/memory/memoryFingerprint.js +33 -0
  219. package/dist/core/vector/memory/memoryFingerprint.js.map +1 -0
  220. package/dist/core/vector/providers/deterministicProvider.d.ts +14 -0
  221. package/dist/core/vector/providers/deterministicProvider.d.ts.map +1 -0
  222. package/dist/core/vector/providers/deterministicProvider.js +22 -0
  223. package/dist/core/vector/providers/deterministicProvider.js.map +1 -0
  224. package/dist/core/vector/providers/httpEmbeddingProvider.d.ts +32 -0
  225. package/dist/core/vector/providers/httpEmbeddingProvider.d.ts.map +1 -0
  226. package/dist/core/vector/providers/httpEmbeddingProvider.js +93 -0
  227. package/dist/core/vector/providers/httpEmbeddingProvider.js.map +1 -0
  228. package/dist/core/vector/providers/registry.d.ts +9 -0
  229. package/dist/core/vector/providers/registry.d.ts.map +1 -0
  230. package/dist/core/vector/providers/registry.js +79 -0
  231. package/dist/core/vector/providers/registry.js.map +1 -0
  232. package/dist/core/vector/providers/types.d.ts +23 -0
  233. package/dist/core/vector/providers/types.d.ts.map +1 -0
  234. package/dist/core/vector/providers/types.js +2 -0
  235. package/dist/core/vector/providers/types.js.map +1 -0
  236. package/dist/core/vector/retrieval/hybridRetriever.d.ts +37 -0
  237. package/dist/core/vector/retrieval/hybridRetriever.d.ts.map +1 -0
  238. package/dist/core/vector/retrieval/hybridRetriever.js +131 -0
  239. package/dist/core/vector/retrieval/hybridRetriever.js.map +1 -0
  240. package/dist/core/vector/types.d.ts +87 -0
  241. package/dist/core/vector/types.d.ts.map +1 -0
  242. package/dist/core/vector/types.js +6 -0
  243. package/dist/core/vector/types.js.map +1 -0
  244. package/dist/index.d.ts +3 -0
  245. package/dist/index.d.ts.map +1 -0
  246. package/dist/index.js +30 -0
  247. package/dist/index.js.map +1 -0
  248. package/dist/inspect/cli.d.ts +3 -0
  249. package/dist/inspect/cli.d.ts.map +1 -0
  250. package/dist/inspect/cli.js +40 -0
  251. package/dist/inspect/cli.js.map +1 -0
  252. package/dist/inspect/projections.d.ts +141 -0
  253. package/dist/inspect/projections.d.ts.map +1 -0
  254. package/dist/inspect/projections.js +311 -0
  255. package/dist/inspect/projections.js.map +1 -0
  256. package/dist/inspect/render.d.ts +27 -0
  257. package/dist/inspect/render.d.ts.map +1 -0
  258. package/dist/inspect/render.js +325 -0
  259. package/dist/inspect/render.js.map +1 -0
  260. package/dist/inspect/server.d.ts +18 -0
  261. package/dist/inspect/server.d.ts.map +1 -0
  262. package/dist/inspect/server.js +112 -0
  263. package/dist/inspect/server.js.map +1 -0
  264. package/dist/perf/index.d.ts +24 -0
  265. package/dist/perf/index.d.ts.map +1 -0
  266. package/dist/perf/index.js +38 -0
  267. package/dist/perf/index.js.map +1 -0
  268. package/dist/perf/report.d.ts +8 -0
  269. package/dist/perf/report.d.ts.map +1 -0
  270. package/dist/perf/report.js +52 -0
  271. package/dist/perf/report.js.map +1 -0
  272. package/dist/perf/runner.d.ts +29 -0
  273. package/dist/perf/runner.d.ts.map +1 -0
  274. package/dist/perf/runner.js +74 -0
  275. package/dist/perf/runner.js.map +1 -0
  276. package/dist/perf/scenarios.d.ts +8 -0
  277. package/dist/perf/scenarios.d.ts.map +1 -0
  278. package/dist/perf/scenarios.js +119 -0
  279. package/dist/perf/scenarios.js.map +1 -0
  280. package/dist/perf/types.d.ts +32 -0
  281. package/dist/perf/types.d.ts.map +1 -0
  282. package/dist/perf/types.js +6 -0
  283. package/dist/perf/types.js.map +1 -0
  284. package/dist/plugins/loader.d.ts +78 -0
  285. package/dist/plugins/loader.d.ts.map +1 -0
  286. package/dist/plugins/loader.js +193 -0
  287. package/dist/plugins/loader.js.map +1 -0
  288. package/dist/plugins/types.d.ts +38 -0
  289. package/dist/plugins/types.d.ts.map +1 -0
  290. package/dist/plugins/types.js +10 -0
  291. package/dist/plugins/types.js.map +1 -0
  292. package/dist/pressure/pressureModel.d.ts +6 -0
  293. package/dist/pressure/pressureModel.d.ts.map +1 -0
  294. package/dist/pressure/pressureModel.js +102 -0
  295. package/dist/pressure/pressureModel.js.map +1 -0
  296. package/dist/prompts/continuityPrompt.d.ts +7 -0
  297. package/dist/prompts/continuityPrompt.d.ts.map +1 -0
  298. package/dist/prompts/continuityPrompt.js +43 -0
  299. package/dist/prompts/continuityPrompt.js.map +1 -0
  300. package/dist/sdk/index.d.ts +53 -0
  301. package/dist/sdk/index.d.ts.map +1 -0
  302. package/dist/sdk/index.js +130 -0
  303. package/dist/sdk/index.js.map +1 -0
  304. package/dist/security/patterns.d.ts +16 -0
  305. package/dist/security/patterns.d.ts.map +1 -0
  306. package/dist/security/patterns.js +61 -0
  307. package/dist/security/patterns.js.map +1 -0
  308. package/dist/security/redactor.d.ts +20 -0
  309. package/dist/security/redactor.d.ts.map +1 -0
  310. package/dist/security/redactor.js +58 -0
  311. package/dist/security/redactor.js.map +1 -0
  312. package/dist/server/createServer.d.ts +10 -0
  313. package/dist/server/createServer.d.ts.map +1 -0
  314. package/dist/server/createServer.js +60 -0
  315. package/dist/server/createServer.js.map +1 -0
  316. package/dist/server/registerTools.d.ts +4 -0
  317. package/dist/server/registerTools.d.ts.map +1 -0
  318. package/dist/server/registerTools.js +1086 -0
  319. package/dist/server/registerTools.js.map +1 -0
  320. package/dist/server/responses.d.ts +17 -0
  321. package/dist/server/responses.d.ts.map +1 -0
  322. package/dist/server/responses.js +21 -0
  323. package/dist/server/responses.js.map +1 -0
  324. package/dist/snapshot/export.d.ts +26 -0
  325. package/dist/snapshot/export.d.ts.map +1 -0
  326. package/dist/snapshot/export.js +164 -0
  327. package/dist/snapshot/export.js.map +1 -0
  328. package/dist/snapshot/import.d.ts +34 -0
  329. package/dist/snapshot/import.d.ts.map +1 -0
  330. package/dist/snapshot/import.js +114 -0
  331. package/dist/snapshot/import.js.map +1 -0
  332. package/dist/snapshot/types.d.ts +63 -0
  333. package/dist/snapshot/types.d.ts.map +1 -0
  334. package/dist/snapshot/types.js +2 -0
  335. package/dist/snapshot/types.js.map +1 -0
  336. package/dist/storage/faultAdapter.d.ts +64 -0
  337. package/dist/storage/faultAdapter.d.ts.map +1 -0
  338. package/dist/storage/faultAdapter.js +134 -0
  339. package/dist/storage/faultAdapter.js.map +1 -0
  340. package/dist/storage/fileStorageAdapter.d.ts +55 -0
  341. package/dist/storage/fileStorageAdapter.d.ts.map +1 -0
  342. package/dist/storage/fileStorageAdapter.js +219 -0
  343. package/dist/storage/fileStorageAdapter.js.map +1 -0
  344. package/dist/storage/paths.d.ts +30 -0
  345. package/dist/storage/paths.d.ts.map +1 -0
  346. package/dist/storage/paths.js +32 -0
  347. package/dist/storage/paths.js.map +1 -0
  348. package/dist/storage/quarantine.d.ts +36 -0
  349. package/dist/storage/quarantine.d.ts.map +1 -0
  350. package/dist/storage/quarantine.js +26 -0
  351. package/dist/storage/quarantine.js.map +1 -0
  352. package/dist/storage/redactingAdapter.d.ts +13 -0
  353. package/dist/storage/redactingAdapter.d.ts.map +1 -0
  354. package/dist/storage/redactingAdapter.js +91 -0
  355. package/dist/storage/redactingAdapter.js.map +1 -0
  356. package/dist/storage/storageAdapter.d.ts +46 -0
  357. package/dist/storage/storageAdapter.d.ts.map +1 -0
  358. package/dist/storage/storageAdapter.js +2 -0
  359. package/dist/storage/storageAdapter.js.map +1 -0
  360. package/dist/types/domain.d.ts +139 -0
  361. package/dist/types/domain.d.ts.map +1 -0
  362. package/dist/types/domain.js +9 -0
  363. package/dist/types/domain.js.map +1 -0
  364. package/dist/types/events.d.ts +28 -0
  365. package/dist/types/events.d.ts.map +1 -0
  366. package/dist/types/events.js +7 -0
  367. package/dist/types/events.js.map +1 -0
  368. package/dist/utils/errors.d.ts +6 -0
  369. package/dist/utils/errors.d.ts.map +1 -0
  370. package/dist/utils/errors.js +10 -0
  371. package/dist/utils/errors.js.map +1 -0
  372. package/dist/utils/ids.d.ts +7 -0
  373. package/dist/utils/ids.d.ts.map +1 -0
  374. package/dist/utils/ids.js +22 -0
  375. package/dist/utils/ids.js.map +1 -0
  376. package/dist/utils/logger.d.ts +7 -0
  377. package/dist/utils/logger.d.ts.map +1 -0
  378. package/dist/utils/logger.js +26 -0
  379. package/dist/utils/logger.js.map +1 -0
  380. package/dist/utils/time.d.ts +8 -0
  381. package/dist/utils/time.d.ts.map +1 -0
  382. package/dist/utils/time.js +11 -0
  383. package/dist/utils/time.js.map +1 -0
  384. package/package.json +79 -0
@@ -0,0 +1,202 @@
1
+ import { readFile, readdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { scoreItems } from '../../salience/salienceEngine.js';
4
+ import { resolveConfig, inferProfile, CRITICAL_DIRS } from '../../salience/config.js';
5
+ /**
6
+ * Builds architecture-aware chunks (ADR-0005) across the five memory classes from
7
+ * artifacts Kairo already derives deterministically. It does NOT blindly chunk every
8
+ * file — structural knowledge comes from the salience-ranked module graph and repo
9
+ * intelligence, not a file dump.
10
+ */
11
+ function fold(strings) {
12
+ return strings
13
+ .map((s) => s.trim())
14
+ .filter(Boolean)
15
+ .join(' — ');
16
+ }
17
+ export function chunkRepoIntelligence(intel) {
18
+ const chunks = [];
19
+ // Salience for graph groups, reusing the ADR-0004 subsystem.
20
+ const profile = inferProfile({
21
+ topLevelDirs: intel.inventory.topLevelDirs,
22
+ frameworkCategories: intel.frameworks.map((f) => f.category),
23
+ });
24
+ const ctx = {
25
+ sourceRoots: ['src', 'lib', 'app', 'sources', 'packages', 'apps', 'libs'],
26
+ entryPoints: intel.entryPoints.map((e) => e.path),
27
+ workspaceGlobs: [],
28
+ frameworkDirs: [...CRITICAL_DIRS],
29
+ profile,
30
+ };
31
+ const config = resolveConfig(profile);
32
+ const g = intel.moduleGraph;
33
+ const idToLabel = new Map(g.nodes.map((n) => [n.id, n.label]));
34
+ const neighbors = new Map();
35
+ const degree = new Map();
36
+ for (const e of g.edges) {
37
+ const a = idToLabel.get(e.from);
38
+ const b = idToLabel.get(e.to);
39
+ if (!neighbors.has(a))
40
+ neighbors.set(a, new Set());
41
+ if (!neighbors.has(b))
42
+ neighbors.set(b, new Set());
43
+ neighbors.get(a).add(b);
44
+ neighbors.get(b).add(a);
45
+ degree.set(a, (degree.get(a) ?? 0) + (e.weight ?? 1));
46
+ degree.set(b, (degree.get(b) ?? 0) + (e.weight ?? 1));
47
+ }
48
+ const items = g.nodes.map((n) => ({
49
+ id: n.label,
50
+ path: n.label,
51
+ metrics: { fanIn: degree.get(n.label) ?? 0, fanOut: degree.get(n.label) ?? 0 },
52
+ }));
53
+ const salience = new Map(scoreItems(items, ctx, config).map((s) => [s.id, s.score]));
54
+ // Structural overview.
55
+ chunks.push({
56
+ id: 'struct:overview',
57
+ kind: 'structural',
58
+ // Logical locator — never the absolute local path (it would leak into memory).
59
+ locator: '(repository)',
60
+ text: fold([
61
+ `Repository architecture overview.`,
62
+ `Primary language ${intel.languages.primary}.`,
63
+ `Frameworks: ${intel.frameworks.map((f) => f.name).join(', ') || 'none'}.`,
64
+ `Top-level: ${intel.inventory.topLevelDirs.join(', ')}.`,
65
+ `Entry points: ${intel.entryPoints.map((e) => e.path).join(', ') || 'none'}.`,
66
+ `${g.nodes.length} module groups, ${g.edges.length} dependency edges${g.truncated ? ' (truncated)' : ''}.`,
67
+ ]),
68
+ salience: 1.5,
69
+ graphDegree: g.edges.length,
70
+ runtimeReachable: true,
71
+ neighbors: [],
72
+ });
73
+ // One structural chunk per module group (already salience-ranked & capped).
74
+ for (const n of g.nodes) {
75
+ const nbrs = [...(neighbors.get(n.label) ?? [])].sort();
76
+ chunks.push({
77
+ id: `struct:mod:${n.label}`,
78
+ kind: 'structural',
79
+ locator: n.label,
80
+ text: fold([
81
+ `Module group "${n.label}".`,
82
+ nbrs.length ? `Depends-with: ${nbrs.join(', ')}.` : 'Leaf module.',
83
+ `Graph degree ${degree.get(n.label) ?? 0}.`,
84
+ ]),
85
+ salience: salience.get(n.label) ?? 0,
86
+ graphDegree: degree.get(n.label) ?? 0,
87
+ runtimeReachable: intel.entryPoints.some((e) => e.path.includes(n.label)),
88
+ neighbors: nbrs,
89
+ });
90
+ }
91
+ // Operational memory: build/test/deploy facts.
92
+ chunks.push({
93
+ id: 'op:tooling',
94
+ kind: 'operational',
95
+ locator: 'tooling',
96
+ text: fold([
97
+ `Build & operational profile.`,
98
+ `Frameworks/tooling: ${intel.frameworks.map((f) => `${f.name}${f.version ? `@${f.version}` : ''}`).join(', ')}.`,
99
+ intel.ciWorkflows.length
100
+ ? `CI workflows: ${intel.ciWorkflows.join(', ')}.`
101
+ : 'No CI detected.',
102
+ ]),
103
+ salience: 0.8,
104
+ graphDegree: 0,
105
+ runtimeReachable: false,
106
+ neighbors: [],
107
+ });
108
+ // Repo intelligence is shared knowledge — workspace namespace (ADR-0007).
109
+ return chunks.map((c) => ({ ...c, namespace: 'workspace' }));
110
+ }
111
+ export function chunkSessionMemory(sessions, checkpoint,
112
+ /** sessionId → coordination namespace; defaults to the shared workspace. */
113
+ namespaceOf = () => 'workspace') {
114
+ const chunks = [];
115
+ // Decision memory (most recent first, bounded).
116
+ const decisions = sessions.flatMap((s) => s.decisions.map((d) => ({ d, sid: s.id }))).slice(-80);
117
+ for (const { d, sid } of decisions) {
118
+ chunks.push({
119
+ id: `decision:${sid}:${d.ts}`,
120
+ kind: 'decision',
121
+ locator: `session ${sid}`,
122
+ text: fold([
123
+ `Engineering decision: ${d.summary}.`,
124
+ d.rationale ? `Rationale: ${d.rationale}.` : '',
125
+ ]),
126
+ salience: 1.2,
127
+ graphDegree: 0,
128
+ runtimeReachable: false,
129
+ neighbors: [],
130
+ ts: d.ts,
131
+ namespace: namespaceOf(sid),
132
+ });
133
+ }
134
+ if (checkpoint) {
135
+ chunks.push({
136
+ id: `session:checkpoint:${checkpoint.id}`,
137
+ kind: 'session',
138
+ locator: `checkpoint ${checkpoint.id}`,
139
+ text: fold([
140
+ `Session checkpoint for task: ${checkpoint.task}.`,
141
+ checkpoint.remainingWork.length ? `Remaining: ${checkpoint.remainingWork.join('; ')}.` : '',
142
+ checkpoint.blockers.length ? `Blockers: ${checkpoint.blockers.join('; ')}.` : '',
143
+ `Risk ${checkpoint.risk.level}.`,
144
+ ]),
145
+ salience: 1.3,
146
+ graphDegree: 0,
147
+ runtimeReachable: false,
148
+ neighbors: [],
149
+ ts: checkpoint.createdAt,
150
+ // Checkpoints are team-level engineering continuity → shared (v0.7.1).
151
+ // (Private *reasoning* stays in worker-namespaced decision chunks.)
152
+ namespace: 'workspace',
153
+ });
154
+ }
155
+ return chunks;
156
+ }
157
+ const DOC_DIRS = ['docs', 'docs/adr'];
158
+ const ROOT_DOCS = ['README.md', 'ARCHITECTURE.md', 'CONTRIBUTING.md', 'SECURITY.md'];
159
+ const MAX_DOC_BYTES = 64 * 1024;
160
+ /** Decision/semantic memory from ADRs and architecture docs (bounded). */
161
+ export async function chunkDocs(projectRoot) {
162
+ const out = [];
163
+ const tryFile = async (rel, kind, salience) => {
164
+ try {
165
+ const buf = await readFile(join(projectRoot, rel), 'utf8');
166
+ const text = buf.slice(0, MAX_DOC_BYTES).replace(/\s+/g, ' ').trim();
167
+ if (text.length < 40)
168
+ return;
169
+ out.push({
170
+ id: `doc:${rel}`,
171
+ kind,
172
+ locator: rel,
173
+ text: `${rel}: ${text.slice(0, 4000)}`,
174
+ salience,
175
+ graphDegree: 0,
176
+ runtimeReachable: false,
177
+ neighbors: [],
178
+ });
179
+ }
180
+ catch {
181
+ /* missing/unreadable doc: skip */
182
+ }
183
+ };
184
+ for (const d of ROOT_DOCS)
185
+ await tryFile(d, 'semantic', 0.9);
186
+ for (const dir of DOC_DIRS) {
187
+ let entries = [];
188
+ try {
189
+ entries = (await readdir(join(projectRoot, dir))).filter((f) => f.endsWith('.md')).sort();
190
+ }
191
+ catch {
192
+ continue;
193
+ }
194
+ for (const f of entries) {
195
+ const rel = `${dir}/${f}`;
196
+ await tryFile(rel, dir.includes('adr') ? 'decision' : 'semantic', dir.includes('adr') ? 1.3 : 0.9);
197
+ }
198
+ }
199
+ // Docs/ADRs are shared knowledge — workspace namespace (ADR-0007).
200
+ return out.map((c) => ({ ...c, namespace: 'workspace' }));
201
+ }
202
+ //# sourceMappingURL=memoryChunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryChunker.js","sourceRoot":"","sources":["../../../../src/core/vector/chunking/memoryChunker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { MemoryChunk } from '../types.js';
2
+ /**
3
+ * Deterministic architecture compression (ADR-0005): turn the full memory set into a
4
+ * compact, salience-ordered digest an agent can read instead of rescanning the repo.
5
+ * Heuristic and bounded — stated honestly. Not an LLM summary; a structured extract.
6
+ */
7
+ export interface DigestOptions {
8
+ maxStructural?: number;
9
+ maxDecisions?: number;
10
+ }
11
+ export declare function architectureDigest(chunks: MemoryChunk[], opts?: DigestOptions): string;
12
+ //# sourceMappingURL=architectureDigest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architectureDigest.d.ts","sourceRoot":"","sources":["../../../../src/core/vector/compression/architectureDigest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,CAwC1F"}
@@ -0,0 +1,37 @@
1
+ export function architectureDigest(chunks, opts = {}) {
2
+ const byKind = (k) => chunks
3
+ .filter((c) => c.kind === k)
4
+ .sort((a, b) => b.salience - a.salience || (a.id < b.id ? -1 : 1));
5
+ const overview = chunks.find((c) => c.id === 'struct:overview');
6
+ const structural = byKind('structural')
7
+ .filter((c) => c.id !== 'struct:overview')
8
+ .slice(0, opts.maxStructural ?? 12);
9
+ const decisions = byKind('decision').slice(0, opts.maxDecisions ?? 8);
10
+ const operational = byKind('operational').slice(0, 3);
11
+ const lines = ['# Compressed Architectural Memory', ''];
12
+ if (overview)
13
+ lines.push(`> ${overview.text}`, '');
14
+ if (structural.length) {
15
+ lines.push('## Salient modules');
16
+ for (const c of structural) {
17
+ lines.push(`- **${c.locator}** (salience ${c.salience.toFixed(2)}, deg ${c.graphDegree})` +
18
+ `${c.neighbors.length ? ` ↔ ${c.neighbors.slice(0, 6).join(', ')}` : ''}`);
19
+ }
20
+ lines.push('');
21
+ }
22
+ if (decisions.length) {
23
+ lines.push('## Key decisions');
24
+ for (const c of decisions)
25
+ lines.push(`- ${c.text}`);
26
+ lines.push('');
27
+ }
28
+ if (operational.length) {
29
+ lines.push('## Operational');
30
+ for (const c of operational)
31
+ lines.push(`- ${c.text}`);
32
+ lines.push('');
33
+ }
34
+ lines.push('_Deterministic salience-ordered extract (heuristic). Use kairo_memory_search for targeted recall._');
35
+ return lines.join('\n');
36
+ }
37
+ //# sourceMappingURL=architectureDigest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architectureDigest.js","sourceRoot":"","sources":["../../../../src/core/vector/compression/architectureDigest.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,kBAAkB,CAAC,MAAqB,EAAE,OAAsB,EAAE;IAChF,MAAM,MAAM,GAAG,CAAC,CAAsB,EAAiB,EAAE,CACvD,MAAM;SACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;SAC3B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,iBAAiB,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,iBAAiB,CAAC;SACzC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEtD,MAAM,KAAK,GAAa,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC;IAClE,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAEnD,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,CAAC,OAAO,gBAAgB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,GAAG;gBAC5E,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5E,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,KAAK,CAAC,IAAI,CACR,oGAAoG,CACrG,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Embedder } from '../types.js';
2
+ export declare class DeterministicEmbedder implements Embedder {
3
+ readonly id = "kairo-deterministic-hash-v1";
4
+ readonly dim = 256;
5
+ embed(text: string): number[];
6
+ }
7
+ export declare function cosine(a: number[], b: number[]): number;
8
+ export declare function getEmbedder(id?: string): Embedder;
9
+ export declare function registerEmbedder(id: string, factory: () => Embedder): void;
10
+ //# sourceMappingURL=deterministicEmbedder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deterministicEmbedder.d.ts","sourceRoot":"","sources":["../../../../src/core/vector/embedding/deterministicEmbedder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAsC5C,qBAAa,qBAAsB,YAAW,QAAQ;IACpD,QAAQ,CAAC,EAAE,iCAAiC;IAC5C,QAAQ,CAAC,GAAG,OAAO;IAEnB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;CAkB9B;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAMvD;AAOD,wBAAgB,WAAW,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,QAAQ,CAGjD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAAQ,GAAG,IAAI,CAE1E"}
@@ -0,0 +1,84 @@
1
+ import { createHash } from 'node:crypto';
2
+ /**
3
+ * Deterministic, local, zero-dependency embedder (ADR-0005).
4
+ *
5
+ * HONEST SCOPE: this is **lexical/structural** similarity — a hashed bag of
6
+ * code/identifier/path tokens with sub-token splitting and bigrams, L2-normalised.
7
+ * It is NOT deep semantic similarity. It is the default because it is pure
8
+ * (byte-identical across runs/machines — required to seed stable memory), needs no
9
+ * network or secrets, and Kairo's hybrid ranking (salience/graph/runtime) carries
10
+ * the architecture awareness. Semantic providers are pluggable behind `Embedder`.
11
+ */
12
+ const DIM = 256;
13
+ function tokenize(text) {
14
+ const out = [];
15
+ // Split on non-alphanumerics; also split camelCase / snake / kebab into parts.
16
+ for (const rawTok of text.toLowerCase().split(/[^a-z0-9]+/)) {
17
+ if (!rawTok)
18
+ continue;
19
+ out.push(rawTok);
20
+ for (const part of rawTok.split(/(?<=[a-z])(?=[0-9])|_/)) {
21
+ if (part && part !== rawTok)
22
+ out.push(part);
23
+ }
24
+ }
25
+ // Adjacent bigrams add a little word-order signal without losing determinism.
26
+ const bigrams = [];
27
+ for (let i = 1; i < out.length; i++)
28
+ bigrams.push(`${out[i - 1]}~${out[i]}`);
29
+ return [...out, ...bigrams];
30
+ }
31
+ /** Stable signed bucket from a token (sha1 → bucket + sign). */
32
+ function hashToken(token) {
33
+ const h = createHash('sha1').update(token).digest();
34
+ const bucket = ((h[0] << 16) | (h[1] << 8) | h[2]) % DIM;
35
+ const sign = (h[3] & 1) === 0 ? 1 : -1;
36
+ return { bucket, sign };
37
+ }
38
+ export class DeterministicEmbedder {
39
+ id = 'kairo-deterministic-hash-v1';
40
+ dim = DIM;
41
+ embed(text) {
42
+ const vec = new Array(DIM).fill(0);
43
+ const tokens = tokenize(text);
44
+ if (tokens.length === 0)
45
+ return vec;
46
+ // Sublinear term weighting damps very repetitive text.
47
+ const tf = new Map();
48
+ for (const t of tokens)
49
+ tf.set(t, (tf.get(t) ?? 0) + 1);
50
+ for (const [tok, count] of tf) {
51
+ const { bucket, sign } = hashToken(tok);
52
+ vec[bucket] += sign * (1 + Math.log(count));
53
+ }
54
+ let norm = 0;
55
+ for (const v of vec)
56
+ norm += v * v;
57
+ norm = Math.sqrt(norm);
58
+ if (norm === 0)
59
+ return vec;
60
+ for (let i = 0; i < DIM; i++)
61
+ vec[i] = Number((vec[i] / norm).toFixed(8));
62
+ return vec;
63
+ }
64
+ }
65
+ export function cosine(a, b) {
66
+ let dot = 0;
67
+ const n = Math.min(a.length, b.length);
68
+ for (let i = 0; i < n; i++)
69
+ dot += a[i] * b[i];
70
+ // Vectors are pre-normalised, so dot == cosine. Clamp for float safety.
71
+ return Math.max(-1, Math.min(1, Number(dot.toFixed(8))));
72
+ }
73
+ /** Provider registry — keeps the door open without hardwiring a provider. */
74
+ const REGISTRY = new Map([
75
+ ['kairo-deterministic-hash-v1', () => new DeterministicEmbedder()],
76
+ ]);
77
+ export function getEmbedder(id) {
78
+ const factory = id ? REGISTRY.get(id) : undefined;
79
+ return factory ? factory() : new DeterministicEmbedder();
80
+ }
81
+ export function registerEmbedder(id, factory) {
82
+ REGISTRY.set(id, factory);
83
+ }
84
+ //# sourceMappingURL=deterministicEmbedder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deterministicEmbedder.js","sourceRoot":"","sources":["../../../../src/core/vector/embedding/deterministicEmbedder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { StorageAdapter } from '../../../storage/storageAdapter.js';
2
+ import type { RepoIntelligence } from '../../repo/types.js';
3
+ import type { Checkpoint, SessionState } from '../../../types/domain.js';
4
+ import type { MemoryChunk, RetrievalQuery, RetrievalResult } from '../types.js';
5
+ import type { EmbeddingProvider } from '../providers/types.js';
6
+ import { type RankContext } from '../retrieval/hybridRetriever.js';
7
+ export interface IndexInputs {
8
+ intel: RepoIntelligence;
9
+ sessions: SessionState[];
10
+ checkpoint: Checkpoint | undefined;
11
+ projectRoot: string;
12
+ /** sessionId → coordination namespace (v0.7.0); defaults to shared workspace. */
13
+ namespaceOf?: (sessionId: string) => string;
14
+ }
15
+ export interface IndexResult {
16
+ fingerprint: string;
17
+ embedderId: string;
18
+ memoryFingerprint: string;
19
+ chunks: number;
20
+ reused: boolean;
21
+ /** True if a configured remote provider failed and deterministic was used. */
22
+ fellBack: boolean;
23
+ /** v0.9.3: per-chunk incremental indexing counters. */
24
+ embedded: number;
25
+ reusedVectors: number;
26
+ }
27
+ /**
28
+ * Facade over chunking + embedding provider + storage + retrieval (ADR-0006).
29
+ *
30
+ * The index is keyed by repo fingerprint + embedder id: a match means NO re-embedding.
31
+ * A configured remote provider that errors degrades to the deterministic provider —
32
+ * an embedding outage must never break a session, and the index is stamped with the
33
+ * provider ACTUALLY used so a remote-labelled index never holds fallback vectors.
34
+ */
35
+ export declare class MemoryEngine {
36
+ private readonly adapter;
37
+ private readonly primary;
38
+ private readonly fallback;
39
+ constructor(adapter: StorageAdapter, provider?: EmbeddingProvider);
40
+ buildChunks(inputs: IndexInputs): Promise<MemoryChunk[]>;
41
+ /** Embed via the primary provider; on remote failure fall back to deterministic. */
42
+ private embedAll;
43
+ index(inputs: IndexInputs, force?: boolean): Promise<IndexResult>;
44
+ /** Load only an index whose embedder matches the active primary provider. */
45
+ private loadValid;
46
+ search(query: RetrievalQuery, ctx?: RankContext): Promise<RetrievalResult[]>;
47
+ compress(): Promise<string | undefined>;
48
+ stats(): Promise<{
49
+ chunks: number;
50
+ embedderId: string;
51
+ fingerprint: string;
52
+ memoryFingerprint: string;
53
+ dim: number;
54
+ } | undefined>;
55
+ }
56
+ //# sourceMappingURL=memoryEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryEngine.d.ts","sourceRoot":"","sources":["../../../../src/core/vector/memory/memoryEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,KAAK,EAEV,WAAW,EACX,cAAc,EACd,eAAe,EAEhB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAK7E,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,EAAE,OAAO,CAAC;IAClB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;gBAG1B,OAAO,EAAE,cAAc,EACxC,QAAQ,CAAC,EAAE,iBAAiB;IAiBxB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAY9D,oFAAoF;YACtE,QAAQ;IAkBhB,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;IAkGrE,6EAA6E;YAC/D,SAAS;IASjB,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,GAAE,WAAgB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAehF,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKvC,KAAK,IAAI,OAAO,CAClB;QACE,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,GAAG,EAAE,MAAM,CAAC;KACb,GACD,SAAS,CACZ;CAYF"}
@@ -0,0 +1,204 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { resolveProviderFromEnv, deterministicProvider } from '../providers/registry.js';
3
+ import { chunkRepoIntelligence, chunkSessionMemory, chunkDocs } from '../chunking/memoryChunker.js';
4
+ import { retrieve } from '../retrieval/hybridRetriever.js';
5
+ import { architectureDigest } from '../compression/architectureDigest.js';
6
+ import { computeMemoryFingerprint } from './memoryFingerprint.js';
7
+ import { logger } from '../../../utils/logger.js';
8
+ /**
9
+ * Facade over chunking + embedding provider + storage + retrieval (ADR-0006).
10
+ *
11
+ * The index is keyed by repo fingerprint + embedder id: a match means NO re-embedding.
12
+ * A configured remote provider that errors degrades to the deterministic provider —
13
+ * an embedding outage must never break a session, and the index is stamped with the
14
+ * provider ACTUALLY used so a remote-labelled index never holds fallback vectors.
15
+ */
16
+ export class MemoryEngine {
17
+ adapter;
18
+ primary;
19
+ fallback;
20
+ constructor(adapter, provider) {
21
+ this.adapter = adapter;
22
+ this.fallback = deterministicProvider();
23
+ let resolved;
24
+ try {
25
+ resolved = provider ?? resolveProviderFromEnv();
26
+ }
27
+ catch (e) {
28
+ logger.warn(`Embedding provider misconfigured; using deterministic. ${e instanceof Error ? e.message : String(e)}`);
29
+ resolved = this.fallback;
30
+ }
31
+ this.primary = resolved;
32
+ }
33
+ async buildChunks(inputs) {
34
+ return [
35
+ ...chunkRepoIntelligence(inputs.intel),
36
+ ...chunkSessionMemory(inputs.sessions, inputs.checkpoint, inputs.namespaceOf ?? (() => 'workspace')),
37
+ ...(await chunkDocs(inputs.projectRoot)),
38
+ ];
39
+ }
40
+ /** Embed via the primary provider; on remote failure fall back to deterministic. */
41
+ async embedAll(texts) {
42
+ try {
43
+ const vectors = await this.primary.embedBatch(texts);
44
+ return { vectors, provider: this.primary, fellBack: false };
45
+ }
46
+ catch (e) {
47
+ if (!this.primary.remote)
48
+ throw e; // deterministic failing is a real bug
49
+ logger.warn(`Embedding provider ${this.primary.id} failed; falling back to deterministic. ${e instanceof Error ? e.message : String(e)}`);
50
+ const vectors = await this.fallback.embedBatch(texts);
51
+ return { vectors, provider: this.fallback, fellBack: true };
52
+ }
53
+ }
54
+ async index(inputs, force = false) {
55
+ // Build chunks first (cheap, offline, deterministic). Only the embed step is
56
+ // skipped on a true match — so session/decision/checkpoint changes cannot make
57
+ // cross-worker memory stale (v0.7.1).
58
+ const chunks = await this.buildChunks(inputs);
59
+ const memoryFingerprint = computeMemoryFingerprint(chunks);
60
+ const existing = await this.adapter.loadVectorIndex();
61
+ if (!force &&
62
+ existing &&
63
+ existing.schema === 3 &&
64
+ existing.fingerprint === inputs.intel.fingerprint &&
65
+ existing.embedderId === this.primary.id &&
66
+ existing.memoryFingerprint === memoryFingerprint) {
67
+ return {
68
+ fingerprint: existing.fingerprint,
69
+ embedderId: existing.embedderId,
70
+ memoryFingerprint: existing.memoryFingerprint,
71
+ chunks: existing.chunks.length,
72
+ reused: true,
73
+ fellBack: false,
74
+ embedded: 0,
75
+ reusedVectors: existing.chunks.length,
76
+ };
77
+ }
78
+ // ── v0.9.3 incremental indexing ──────────────────────────────────────
79
+ // Build a lookup of existing vectors keyed by text-hash. Reuse vectors
80
+ // for any chunk whose text matches an existing chunk; only embed the
81
+ // ones that don't. Deterministic chunk ordering is preserved.
82
+ const reusable = existing &&
83
+ existing.schema === 3 &&
84
+ existing.embedderId === this.primary.id &&
85
+ existing.fingerprint === inputs.intel.fingerprint
86
+ ? indexByTextHash(existing.chunks)
87
+ : new Map();
88
+ const toEmbed = [];
89
+ const reusedVectors = Array.from({ length: chunks.length });
90
+ for (let i = 0; i < chunks.length; i++) {
91
+ const c = chunks[i];
92
+ const hash = textHash(c.text);
93
+ const v = reusable.get(hash);
94
+ if (v)
95
+ reusedVectors[i] = v;
96
+ else
97
+ toEmbed.push({ i, text: c.text });
98
+ }
99
+ let fellBack = false;
100
+ let provider = this.primary;
101
+ const finalVectors = Array.from({ length: chunks.length }, () => []);
102
+ if (toEmbed.length === 0) {
103
+ provider = this.primary;
104
+ }
105
+ else {
106
+ const r = await this.embedAll(toEmbed.map((t) => t.text));
107
+ provider = r.provider;
108
+ fellBack = r.fellBack;
109
+ for (let k = 0; k < toEmbed.length; k++) {
110
+ finalVectors[toEmbed[k].i] = r.vectors[k];
111
+ }
112
+ }
113
+ for (let i = 0; i < chunks.length; i++) {
114
+ if (reusedVectors[i])
115
+ finalVectors[i] = reusedVectors[i];
116
+ }
117
+ const embedded = chunks.map((c, i) => ({ ...c, vector: finalVectors[i] }));
118
+ const idx = {
119
+ schema: 3,
120
+ fingerprint: inputs.intel.fingerprint,
121
+ memoryFingerprint,
122
+ embedderId: provider.id, // the provider ACTUALLY used
123
+ dim: provider.dim,
124
+ builtAt: new Date(0).toISOString(), // deterministic; freshness via fingerprints
125
+ chunks: embedded,
126
+ };
127
+ await this.adapter.saveVectorIndex(idx);
128
+ const embeddedCount = toEmbed.length;
129
+ const reusedCount = chunks.length - embeddedCount;
130
+ logger.info('Vector memory indexed', {
131
+ chunks: embedded.length,
132
+ embedder: provider.id,
133
+ embedded: embeddedCount,
134
+ reused: reusedCount,
135
+ fellBack,
136
+ });
137
+ return {
138
+ fingerprint: idx.fingerprint,
139
+ embedderId: idx.embedderId,
140
+ memoryFingerprint: idx.memoryFingerprint,
141
+ chunks: embedded.length,
142
+ reused: false,
143
+ fellBack,
144
+ embedded: embeddedCount,
145
+ reusedVectors: reusedCount,
146
+ };
147
+ }
148
+ /** Load only an index whose embedder matches the active primary provider. */
149
+ async loadValid() {
150
+ const idx = await this.adapter.loadVectorIndex();
151
+ if (!idx || idx.schema !== 3)
152
+ return undefined;
153
+ if (idx.embedderId !== this.primary.id && idx.embedderId !== this.fallback.id) {
154
+ return undefined;
155
+ }
156
+ return idx;
157
+ }
158
+ async search(query, ctx = {}) {
159
+ const idx = await this.loadValid();
160
+ if (!idx)
161
+ return [];
162
+ // Query must be embedded with the SAME provider that built the index.
163
+ const useFallback = idx.embedderId === this.fallback.id && this.primary.id !== idx.embedderId;
164
+ let qVec;
165
+ try {
166
+ qVec = (await (useFallback ? this.fallback : this.primary).embed(query.text)) ?? [];
167
+ }
168
+ catch {
169
+ if (this.primary.remote)
170
+ qVec = await this.fallback.embed(query.text);
171
+ else
172
+ throw new Error('deterministic query embedding failed');
173
+ }
174
+ return retrieve(query, idx.chunks, qVec, ctx);
175
+ }
176
+ async compress() {
177
+ const idx = await this.loadValid();
178
+ return idx ? architectureDigest(idx.chunks) : undefined;
179
+ }
180
+ async stats() {
181
+ const idx = await this.loadValid();
182
+ return idx
183
+ ? {
184
+ chunks: idx.chunks.length,
185
+ embedderId: idx.embedderId,
186
+ fingerprint: idx.fingerprint,
187
+ memoryFingerprint: idx.memoryFingerprint,
188
+ dim: idx.dim,
189
+ }
190
+ : undefined;
191
+ }
192
+ }
193
+ function textHash(text) {
194
+ return createHash('sha256').update(text).digest('hex');
195
+ }
196
+ function indexByTextHash(chunks) {
197
+ const m = new Map();
198
+ for (const c of chunks) {
199
+ if (!m.has(textHash(c.text)))
200
+ m.set(textHash(c.text), c.vector);
201
+ }
202
+ return m;
203
+ }
204
+ //# sourceMappingURL=memoryEngine.js.map