@astragenie/astramemory-local 0.7.2

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 (493) hide show
  1. package/CHANGELOG.md +341 -0
  2. package/README.md +419 -0
  3. package/dist/backup/retention.d.ts +15 -0
  4. package/dist/backup/retention.js +62 -0
  5. package/dist/backup/retention.js.map +1 -0
  6. package/dist/backup/snapshot.d.ts +21 -0
  7. package/dist/backup/snapshot.js +55 -0
  8. package/dist/backup/snapshot.js.map +1 -0
  9. package/dist/backup/verify.d.ts +23 -0
  10. package/dist/backup/verify.js +77 -0
  11. package/dist/backup/verify.js.map +1 -0
  12. package/dist/budget/tracker.d.ts +58 -0
  13. package/dist/budget/tracker.js +102 -0
  14. package/dist/budget/tracker.js.map +1 -0
  15. package/dist/capture/codex.d.ts +63 -0
  16. package/dist/capture/codex.js +0 -0
  17. package/dist/capture/codex.js.map +1 -0
  18. package/dist/cli/backup.d.ts +1 -0
  19. package/dist/cli/backup.js +112 -0
  20. package/dist/cli/backup.js.map +1 -0
  21. package/dist/cli/budget.d.ts +7 -0
  22. package/dist/cli/budget.js +44 -0
  23. package/dist/cli/budget.js.map +1 -0
  24. package/dist/cli/capture.d.ts +10 -0
  25. package/dist/cli/capture.js +113 -0
  26. package/dist/cli/capture.js.map +1 -0
  27. package/dist/cli/consolidate.d.ts +16 -0
  28. package/dist/cli/consolidate.js +146 -0
  29. package/dist/cli/consolidate.js.map +1 -0
  30. package/dist/cli/doctor.d.ts +1 -0
  31. package/dist/cli/doctor.js +54 -0
  32. package/dist/cli/doctor.js.map +1 -0
  33. package/dist/cli/entity-backfill.d.ts +10 -0
  34. package/dist/cli/entity-backfill.js +46 -0
  35. package/dist/cli/entity-backfill.js.map +1 -0
  36. package/dist/cli/hook-install.d.ts +45 -0
  37. package/dist/cli/hook-install.js +77 -0
  38. package/dist/cli/hook-install.js.map +1 -0
  39. package/dist/cli/index.d.ts +2 -0
  40. package/dist/cli/index.js +312 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/cli/init.d.ts +16 -0
  43. package/dist/cli/init.js +431 -0
  44. package/dist/cli/init.js.map +1 -0
  45. package/dist/cli/mcp-stdio.d.ts +18 -0
  46. package/dist/cli/mcp-stdio.js +67 -0
  47. package/dist/cli/mcp-stdio.js.map +1 -0
  48. package/dist/cli/memory.d.ts +15 -0
  49. package/dist/cli/memory.js +52 -0
  50. package/dist/cli/memory.js.map +1 -0
  51. package/dist/cli/open-runtime-db.d.ts +15 -0
  52. package/dist/cli/open-runtime-db.js +37 -0
  53. package/dist/cli/open-runtime-db.js.map +1 -0
  54. package/dist/cli/pair.d.ts +29 -0
  55. package/dist/cli/pair.js +64 -0
  56. package/dist/cli/pair.js.map +1 -0
  57. package/dist/cli/providers.d.ts +10 -0
  58. package/dist/cli/providers.js +97 -0
  59. package/dist/cli/providers.js.map +1 -0
  60. package/dist/cli/queue-purge.d.ts +5 -0
  61. package/dist/cli/queue-purge.js +92 -0
  62. package/dist/cli/queue-purge.js.map +1 -0
  63. package/dist/cli/queue.d.ts +29 -0
  64. package/dist/cli/queue.js +73 -0
  65. package/dist/cli/queue.js.map +1 -0
  66. package/dist/cli/rebuild.d.ts +15 -0
  67. package/dist/cli/rebuild.js +70 -0
  68. package/dist/cli/rebuild.js.map +1 -0
  69. package/dist/cli/reembed-dim.d.ts +21 -0
  70. package/dist/cli/reembed-dim.js +199 -0
  71. package/dist/cli/reembed-dim.js.map +1 -0
  72. package/dist/cli/reinstall.d.ts +1 -0
  73. package/dist/cli/reinstall.js +205 -0
  74. package/dist/cli/reinstall.js.map +1 -0
  75. package/dist/cli/restore.d.ts +1 -0
  76. package/dist/cli/restore.js +167 -0
  77. package/dist/cli/restore.js.map +1 -0
  78. package/dist/cli/retag.d.ts +14 -0
  79. package/dist/cli/retag.js +62 -0
  80. package/dist/cli/retag.js.map +1 -0
  81. package/dist/cli/search.d.ts +66 -0
  82. package/dist/cli/search.js +174 -0
  83. package/dist/cli/search.js.map +1 -0
  84. package/dist/cli/serve.d.ts +9 -0
  85. package/dist/cli/serve.js +364 -0
  86. package/dist/cli/serve.js.map +1 -0
  87. package/dist/cli/service.d.ts +1 -0
  88. package/dist/cli/service.js +121 -0
  89. package/dist/cli/service.js.map +1 -0
  90. package/dist/cli/sync.d.ts +15 -0
  91. package/dist/cli/sync.js +61 -0
  92. package/dist/cli/sync.js.map +1 -0
  93. package/dist/cli/token.d.ts +24 -0
  94. package/dist/cli/token.js +77 -0
  95. package/dist/cli/token.js.map +1 -0
  96. package/dist/cli/wait-health.d.ts +4 -0
  97. package/dist/cli/wait-health.js +23 -0
  98. package/dist/cli/wait-health.js.map +1 -0
  99. package/dist/config/config.d.ts +127 -0
  100. package/dist/config/config.js +38 -0
  101. package/dist/config/config.js.map +1 -0
  102. package/dist/config/datadir.d.ts +30 -0
  103. package/dist/config/datadir.js +65 -0
  104. package/dist/config/datadir.js.map +1 -0
  105. package/dist/config/loader.d.ts +23 -0
  106. package/dist/config/loader.js +102 -0
  107. package/dist/config/loader.js.map +1 -0
  108. package/dist/config/migrate-dirs.d.ts +36 -0
  109. package/dist/config/migrate-dirs.js +132 -0
  110. package/dist/config/migrate-dirs.js.map +1 -0
  111. package/dist/config/persist-envs.d.ts +23 -0
  112. package/dist/config/persist-envs.js +119 -0
  113. package/dist/config/persist-envs.js.map +1 -0
  114. package/dist/config/resolve-runtime.d.ts +19 -0
  115. package/dist/config/resolve-runtime.js +53 -0
  116. package/dist/config/resolve-runtime.js.map +1 -0
  117. package/dist/config/secrets.d.ts +28 -0
  118. package/dist/config/secrets.js +38 -0
  119. package/dist/config/secrets.js.map +1 -0
  120. package/dist/config/sync-settings.d.ts +16 -0
  121. package/dist/config/sync-settings.js +34 -0
  122. package/dist/config/sync-settings.js.map +1 -0
  123. package/dist/config/writer.d.ts +19 -0
  124. package/dist/config/writer.js +121 -0
  125. package/dist/config/writer.js.map +1 -0
  126. package/dist/consolidate/consolidate.d.ts +80 -0
  127. package/dist/consolidate/consolidate.js +0 -0
  128. package/dist/consolidate/consolidate.js.map +1 -0
  129. package/dist/consolidate/proposals.d.ts +35 -0
  130. package/dist/consolidate/proposals.js +66 -0
  131. package/dist/consolidate/proposals.js.map +1 -0
  132. package/dist/contracts/atom-wire.d.ts +48 -0
  133. package/dist/contracts/atom-wire.js +55 -0
  134. package/dist/contracts/atom-wire.js.map +1 -0
  135. package/dist/contracts/embed.d.ts +41 -0
  136. package/dist/contracts/embed.js +20 -0
  137. package/dist/contracts/embed.js.map +1 -0
  138. package/dist/contracts/index.d.ts +5 -0
  139. package/dist/contracts/index.js +6 -0
  140. package/dist/contracts/index.js.map +1 -0
  141. package/dist/contracts/job.d.ts +113 -0
  142. package/dist/contracts/job.js +32 -0
  143. package/dist/contracts/job.js.map +1 -0
  144. package/dist/contracts/llm.d.ts +30 -0
  145. package/dist/contracts/llm.js +2 -0
  146. package/dist/contracts/llm.js.map +1 -0
  147. package/dist/contracts/memory.d.ts +47 -0
  148. package/dist/contracts/memory.js +5 -0
  149. package/dist/contracts/memory.js.map +1 -0
  150. package/dist/contracts/vector.d.ts +29 -0
  151. package/dist/contracts/vector.js +2 -0
  152. package/dist/contracts/vector.js.map +1 -0
  153. package/dist/distill/flatten-turns.d.ts +1 -0
  154. package/dist/distill/flatten-turns.js +50 -0
  155. package/dist/distill/flatten-turns.js.map +1 -0
  156. package/dist/distill/pipeline.d.ts +45 -0
  157. package/dist/distill/pipeline.js +113 -0
  158. package/dist/distill/pipeline.js.map +1 -0
  159. package/dist/distill/prompts/extract.d.ts +122 -0
  160. package/dist/distill/prompts/extract.js +67 -0
  161. package/dist/distill/prompts/extract.js.map +1 -0
  162. package/dist/distill/stages/01-cleanup.d.ts +9 -0
  163. package/dist/distill/stages/01-cleanup.js +67 -0
  164. package/dist/distill/stages/01-cleanup.js.map +1 -0
  165. package/dist/distill/stages/02-normalize.d.ts +9 -0
  166. package/dist/distill/stages/02-normalize.js +76 -0
  167. package/dist/distill/stages/02-normalize.js.map +1 -0
  168. package/dist/distill/stages/03-chunk.d.ts +22 -0
  169. package/dist/distill/stages/03-chunk.js +138 -0
  170. package/dist/distill/stages/03-chunk.js.map +1 -0
  171. package/dist/distill/stages/04-compact.d.ts +28 -0
  172. package/dist/distill/stages/04-compact.js +69 -0
  173. package/dist/distill/stages/04-compact.js.map +1 -0
  174. package/dist/distill/stages/05-extract.d.ts +35 -0
  175. package/dist/distill/stages/05-extract.js +101 -0
  176. package/dist/distill/stages/05-extract.js.map +1 -0
  177. package/dist/distill/stages/06-reduce.d.ts +16 -0
  178. package/dist/distill/stages/06-reduce.js +30 -0
  179. package/dist/distill/stages/06-reduce.js.map +1 -0
  180. package/dist/distill/stages/07-memory-normalize.d.ts +27 -0
  181. package/dist/distill/stages/07-memory-normalize.js +65 -0
  182. package/dist/distill/stages/07-memory-normalize.js.map +1 -0
  183. package/dist/distill/stages/08-embed-index.d.ts +31 -0
  184. package/dist/distill/stages/08-embed-index.js +82 -0
  185. package/dist/distill/stages/08-embed-index.js.map +1 -0
  186. package/dist/doctor/checks.d.ts +77 -0
  187. package/dist/doctor/checks.js +626 -0
  188. package/dist/doctor/checks.js.map +1 -0
  189. package/dist/doctor/hardening-checks.d.ts +9 -0
  190. package/dist/doctor/hardening-checks.js +182 -0
  191. package/dist/doctor/hardening-checks.js.map +1 -0
  192. package/dist/doctor/probes/embed-probe.d.ts +19 -0
  193. package/dist/doctor/probes/embed-probe.js +47 -0
  194. package/dist/doctor/probes/embed-probe.js.map +1 -0
  195. package/dist/doctor/probes/llm-chat-probe.d.ts +11 -0
  196. package/dist/doctor/probes/llm-chat-probe.js +41 -0
  197. package/dist/doctor/probes/llm-chat-probe.js.map +1 -0
  198. package/dist/doctor/probes/plugin-coexistence.d.ts +14 -0
  199. package/dist/doctor/probes/plugin-coexistence.js +60 -0
  200. package/dist/doctor/probes/plugin-coexistence.js.map +1 -0
  201. package/dist/doctor/runner.d.ts +17 -0
  202. package/dist/doctor/runner.js +53 -0
  203. package/dist/doctor/runner.js.map +1 -0
  204. package/dist/doctor/types.d.ts +12 -0
  205. package/dist/doctor/types.js +2 -0
  206. package/dist/doctor/types.js.map +1 -0
  207. package/dist/entity/backfill.d.ts +30 -0
  208. package/dist/entity/backfill.js +55 -0
  209. package/dist/entity/backfill.js.map +1 -0
  210. package/dist/entity/extract-entities.d.ts +27 -0
  211. package/dist/entity/extract-entities.js +86 -0
  212. package/dist/entity/extract-entities.js.map +1 -0
  213. package/dist/entity/normalize.d.ts +17 -0
  214. package/dist/entity/normalize.js +20 -0
  215. package/dist/entity/normalize.js.map +1 -0
  216. package/dist/eval/harness.d.ts +96 -0
  217. package/dist/eval/harness.js +119 -0
  218. package/dist/eval/harness.js.map +1 -0
  219. package/dist/eval/metrics.d.ts +23 -0
  220. package/dist/eval/metrics.js +44 -0
  221. package/dist/eval/metrics.js.map +1 -0
  222. package/dist/log/correlation.d.ts +24 -0
  223. package/dist/log/correlation.js +33 -0
  224. package/dist/log/correlation.js.map +1 -0
  225. package/dist/log/logger.d.ts +38 -0
  226. package/dist/log/logger.js +129 -0
  227. package/dist/log/logger.js.map +1 -0
  228. package/dist/log/scrub.d.ts +33 -0
  229. package/dist/log/scrub.js +91 -0
  230. package/dist/log/scrub.js.map +1 -0
  231. package/dist/mcp/server.d.ts +36 -0
  232. package/dist/mcp/server.js +553 -0
  233. package/dist/mcp/server.js.map +1 -0
  234. package/dist/memory-tool/adapter.d.ts +73 -0
  235. package/dist/memory-tool/adapter.js +269 -0
  236. package/dist/memory-tool/adapter.js.map +1 -0
  237. package/dist/pipeline/errors.d.ts +21 -0
  238. package/dist/pipeline/errors.js +34 -0
  239. package/dist/pipeline/errors.js.map +1 -0
  240. package/dist/pipeline/failure-classifier.d.ts +13 -0
  241. package/dist/pipeline/failure-classifier.js +72 -0
  242. package/dist/pipeline/failure-classifier.js.map +1 -0
  243. package/dist/pipeline/handler-ctx-ext.d.ts +23 -0
  244. package/dist/pipeline/handler-ctx-ext.js +19 -0
  245. package/dist/pipeline/handler-ctx-ext.js.map +1 -0
  246. package/dist/pipeline/handler.d.ts +20 -0
  247. package/dist/pipeline/handler.js +2 -0
  248. package/dist/pipeline/handler.js.map +1 -0
  249. package/dist/pipeline/handlers/cleanup.d.ts +14 -0
  250. package/dist/pipeline/handlers/cleanup.js +47 -0
  251. package/dist/pipeline/handlers/cleanup.js.map +1 -0
  252. package/dist/pipeline/handlers/consolidate.d.ts +8 -0
  253. package/dist/pipeline/handlers/consolidate.js +23 -0
  254. package/dist/pipeline/handlers/consolidate.js.map +1 -0
  255. package/dist/pipeline/handlers/distill-events.d.ts +15 -0
  256. package/dist/pipeline/handlers/distill-events.js +134 -0
  257. package/dist/pipeline/handlers/distill-events.js.map +1 -0
  258. package/dist/pipeline/handlers/distill.d.ts +17 -0
  259. package/dist/pipeline/handlers/distill.js +110 -0
  260. package/dist/pipeline/handlers/distill.js.map +1 -0
  261. package/dist/pipeline/handlers/reembed.d.ts +10 -0
  262. package/dist/pipeline/handlers/reembed.js +34 -0
  263. package/dist/pipeline/handlers/reembed.js.map +1 -0
  264. package/dist/pipeline/job-repo.d.ts +86 -0
  265. package/dist/pipeline/job-repo.js +168 -0
  266. package/dist/pipeline/job-repo.js.map +1 -0
  267. package/dist/pipeline/mock-providers.d.ts +49 -0
  268. package/dist/pipeline/mock-providers.js +175 -0
  269. package/dist/pipeline/mock-providers.js.map +1 -0
  270. package/dist/pipeline/registry.d.ts +15 -0
  271. package/dist/pipeline/registry.js +20 -0
  272. package/dist/pipeline/registry.js.map +1 -0
  273. package/dist/pipeline/worker.d.ts +41 -0
  274. package/dist/pipeline/worker.js +167 -0
  275. package/dist/pipeline/worker.js.map +1 -0
  276. package/dist/providers/embed/azure-openai.d.ts +25 -0
  277. package/dist/providers/embed/azure-openai.js +138 -0
  278. package/dist/providers/embed/azure-openai.js.map +1 -0
  279. package/dist/providers/embed/ollama.d.ts +17 -0
  280. package/dist/providers/embed/ollama.js +106 -0
  281. package/dist/providers/embed/ollama.js.map +1 -0
  282. package/dist/providers/index.d.ts +19 -0
  283. package/dist/providers/index.js +72 -0
  284. package/dist/providers/index.js.map +1 -0
  285. package/dist/providers/llm/azure-openai.d.ts +20 -0
  286. package/dist/providers/llm/azure-openai.js +135 -0
  287. package/dist/providers/llm/azure-openai.js.map +1 -0
  288. package/dist/providers/llm/ollama.d.ts +13 -0
  289. package/dist/providers/llm/ollama.js +113 -0
  290. package/dist/providers/llm/ollama.js.map +1 -0
  291. package/dist/providers/llm/pricing.d.ts +21 -0
  292. package/dist/providers/llm/pricing.js +22 -0
  293. package/dist/providers/llm/pricing.js.map +1 -0
  294. package/dist/recall/pack.d.ts +32 -0
  295. package/dist/recall/pack.js +90 -0
  296. package/dist/recall/pack.js.map +1 -0
  297. package/dist/recall/policy.d.ts +39 -0
  298. package/dist/recall/policy.js +96 -0
  299. package/dist/recall/policy.js.map +1 -0
  300. package/dist/redact/detectors.d.ts +20 -0
  301. package/dist/redact/detectors.js +85 -0
  302. package/dist/redact/detectors.js.map +1 -0
  303. package/dist/redact/entropy.d.ts +24 -0
  304. package/dist/redact/entropy.js +77 -0
  305. package/dist/redact/entropy.js.map +1 -0
  306. package/dist/redact/index.d.ts +47 -0
  307. package/dist/redact/index.js +165 -0
  308. package/dist/redact/index.js.map +1 -0
  309. package/dist/search/fuse.d.ts +108 -0
  310. package/dist/search/fuse.js +135 -0
  311. package/dist/search/fuse.js.map +1 -0
  312. package/dist/search/query.d.ts +28 -0
  313. package/dist/search/query.js +70 -0
  314. package/dist/search/query.js.map +1 -0
  315. package/dist/search/search.d.ts +164 -0
  316. package/dist/search/search.js +310 -0
  317. package/dist/search/search.js.map +1 -0
  318. package/dist/server/app.d.ts +17 -0
  319. package/dist/server/app.js +133 -0
  320. package/dist/server/app.js.map +1 -0
  321. package/dist/server/health-state.d.ts +29 -0
  322. package/dist/server/health-state.js +28 -0
  323. package/dist/server/health-state.js.map +1 -0
  324. package/dist/server/lib/network.d.ts +12 -0
  325. package/dist/server/lib/network.js +16 -0
  326. package/dist/server/lib/network.js.map +1 -0
  327. package/dist/server/lib/score-contract.d.ts +36 -0
  328. package/dist/server/lib/score-contract.js +54 -0
  329. package/dist/server/lib/score-contract.js.map +1 -0
  330. package/dist/server/lib/stable-stringify.d.ts +10 -0
  331. package/dist/server/lib/stable-stringify.js +27 -0
  332. package/dist/server/lib/stable-stringify.js.map +1 -0
  333. package/dist/server/lib/wire-meta.d.ts +7 -0
  334. package/dist/server/lib/wire-meta.js +29 -0
  335. package/dist/server/lib/wire-meta.js.map +1 -0
  336. package/dist/server/queries/dashboard.d.ts +142 -0
  337. package/dist/server/queries/dashboard.js +166 -0
  338. package/dist/server/queries/dashboard.js.map +1 -0
  339. package/dist/server/routes/consolidation.d.ts +14 -0
  340. package/dist/server/routes/consolidation.js +67 -0
  341. package/dist/server/routes/consolidation.js.map +1 -0
  342. package/dist/server/routes/dashboard-api-html.d.ts +15 -0
  343. package/dist/server/routes/dashboard-api-html.js +144 -0
  344. package/dist/server/routes/dashboard-api-html.js.map +1 -0
  345. package/dist/server/routes/dashboard-consolidation-html.d.ts +26 -0
  346. package/dist/server/routes/dashboard-consolidation-html.js +202 -0
  347. package/dist/server/routes/dashboard-consolidation-html.js.map +1 -0
  348. package/dist/server/routes/dashboard-html.d.ts +15 -0
  349. package/dist/server/routes/dashboard-html.js +365 -0
  350. package/dist/server/routes/dashboard-html.js.map +1 -0
  351. package/dist/server/routes/dashboard-jobs-html.d.ts +18 -0
  352. package/dist/server/routes/dashboard-jobs-html.js +186 -0
  353. package/dist/server/routes/dashboard-jobs-html.js.map +1 -0
  354. package/dist/server/routes/dashboard-search-html.d.ts +18 -0
  355. package/dist/server/routes/dashboard-search-html.js +189 -0
  356. package/dist/server/routes/dashboard-search-html.js.map +1 -0
  357. package/dist/server/routes/dashboard.d.ts +19 -0
  358. package/dist/server/routes/dashboard.js +68 -0
  359. package/dist/server/routes/dashboard.js.map +1 -0
  360. package/dist/server/routes/digest.d.ts +9 -0
  361. package/dist/server/routes/digest.js +37 -0
  362. package/dist/server/routes/digest.js.map +1 -0
  363. package/dist/server/routes/entities.d.ts +12 -0
  364. package/dist/server/routes/entities.js +46 -0
  365. package/dist/server/routes/entities.js.map +1 -0
  366. package/dist/server/routes/health.d.ts +14 -0
  367. package/dist/server/routes/health.js +100 -0
  368. package/dist/server/routes/health.js.map +1 -0
  369. package/dist/server/routes/ingest.d.ts +209 -0
  370. package/dist/server/routes/ingest.js +454 -0
  371. package/dist/server/routes/ingest.js.map +1 -0
  372. package/dist/server/routes/lifecycle.d.ts +21 -0
  373. package/dist/server/routes/lifecycle.js +132 -0
  374. package/dist/server/routes/lifecycle.js.map +1 -0
  375. package/dist/server/routes/mcp.d.ts +15 -0
  376. package/dist/server/routes/mcp.js +36 -0
  377. package/dist/server/routes/mcp.js.map +1 -0
  378. package/dist/server/routes/memory-tool.d.ts +14 -0
  379. package/dist/server/routes/memory-tool.js +28 -0
  380. package/dist/server/routes/memory-tool.js.map +1 -0
  381. package/dist/server/routes/memory.d.ts +7 -0
  382. package/dist/server/routes/memory.js +19 -0
  383. package/dist/server/routes/memory.js.map +1 -0
  384. package/dist/server/routes/recall.d.ts +15 -0
  385. package/dist/server/routes/recall.js +74 -0
  386. package/dist/server/routes/recall.js.map +1 -0
  387. package/dist/server/routes/search.d.ts +12 -0
  388. package/dist/server/routes/search.js +203 -0
  389. package/dist/server/routes/search.js.map +1 -0
  390. package/dist/server/routes/version.d.ts +2 -0
  391. package/dist/server/routes/version.js +11 -0
  392. package/dist/server/routes/version.js.map +1 -0
  393. package/dist/server/routes/why.d.ts +9 -0
  394. package/dist/server/routes/why.js +38 -0
  395. package/dist/server/routes/why.js.map +1 -0
  396. package/dist/service/index.d.ts +10 -0
  397. package/dist/service/index.js +25 -0
  398. package/dist/service/index.js.map +1 -0
  399. package/dist/service/install-flow.d.ts +18 -0
  400. package/dist/service/install-flow.js +47 -0
  401. package/dist/service/install-flow.js.map +1 -0
  402. package/dist/service/instance-lock.d.ts +26 -0
  403. package/dist/service/instance-lock.js +150 -0
  404. package/dist/service/instance-lock.js.map +1 -0
  405. package/dist/service/launchd.d.ts +11 -0
  406. package/dist/service/launchd.js +196 -0
  407. package/dist/service/launchd.js.map +1 -0
  408. package/dist/service/schtasks.d.ts +31 -0
  409. package/dist/service/schtasks.js +274 -0
  410. package/dist/service/schtasks.js.map +1 -0
  411. package/dist/service/shim.d.ts +21 -0
  412. package/dist/service/shim.js +80 -0
  413. package/dist/service/shim.js.map +1 -0
  414. package/dist/service/systemd.d.ts +11 -0
  415. package/dist/service/systemd.js +150 -0
  416. package/dist/service/systemd.js.map +1 -0
  417. package/dist/service/task-xml.d.ts +36 -0
  418. package/dist/service/task-xml.js +91 -0
  419. package/dist/service/task-xml.js.map +1 -0
  420. package/dist/service/types.d.ts +47 -0
  421. package/dist/service/types.js +2 -0
  422. package/dist/service/types.js.map +1 -0
  423. package/dist/storage/archival.d.ts +29 -0
  424. package/dist/storage/archival.js +47 -0
  425. package/dist/storage/archival.js.map +1 -0
  426. package/dist/storage/bearer-keystore.d.ts +34 -0
  427. package/dist/storage/bearer-keystore.js +75 -0
  428. package/dist/storage/bearer-keystore.js.map +1 -0
  429. package/dist/storage/db.d.ts +37 -0
  430. package/dist/storage/db.js +92 -0
  431. package/dist/storage/db.js.map +1 -0
  432. package/dist/storage/entities.d.ts +71 -0
  433. package/dist/storage/entities.js +141 -0
  434. package/dist/storage/entities.js.map +1 -0
  435. package/dist/storage/ingest-idempotency.d.ts +26 -0
  436. package/dist/storage/ingest-idempotency.js +29 -0
  437. package/dist/storage/ingest-idempotency.js.map +1 -0
  438. package/dist/storage/keystore.d.ts +64 -0
  439. package/dist/storage/keystore.js +194 -0
  440. package/dist/storage/keystore.js.map +1 -0
  441. package/dist/storage/memories.d.ts +51 -0
  442. package/dist/storage/memories.js +67 -0
  443. package/dist/storage/memories.js.map +1 -0
  444. package/dist/storage/memory-events.d.ts +145 -0
  445. package/dist/storage/memory-events.js +287 -0
  446. package/dist/storage/memory-events.js.map +1 -0
  447. package/dist/storage/migrate-encrypt.d.ts +16 -0
  448. package/dist/storage/migrate-encrypt.js +121 -0
  449. package/dist/storage/migrate-encrypt.js.map +1 -0
  450. package/dist/storage/migrate.d.ts +27 -0
  451. package/dist/storage/migrate.js +105 -0
  452. package/dist/storage/migrate.js.map +1 -0
  453. package/dist/storage/redaction-log.d.ts +18 -0
  454. package/dist/storage/redaction-log.js +27 -0
  455. package/dist/storage/redaction-log.js.map +1 -0
  456. package/dist/storage/usefulness.d.ts +115 -0
  457. package/dist/storage/usefulness.js +203 -0
  458. package/dist/storage/usefulness.js.map +1 -0
  459. package/dist/sync/conflict-resolve.d.ts +26 -0
  460. package/dist/sync/conflict-resolve.js +139 -0
  461. package/dist/sync/conflict-resolve.js.map +1 -0
  462. package/dist/sync/puller.d.ts +115 -0
  463. package/dist/sync/puller.js +173 -0
  464. package/dist/sync/puller.js.map +1 -0
  465. package/dist/sync/shipper.d.ts +112 -0
  466. package/dist/sync/shipper.js +189 -0
  467. package/dist/sync/shipper.js.map +1 -0
  468. package/dist/tag-hygiene/backfill.d.ts +50 -0
  469. package/dist/tag-hygiene/backfill.js +117 -0
  470. package/dist/tag-hygiene/backfill.js.map +1 -0
  471. package/dist/tag-hygiene/derive-repo.d.ts +9 -0
  472. package/dist/tag-hygiene/derive-repo.js +19 -0
  473. package/dist/tag-hygiene/derive-repo.js.map +1 -0
  474. package/dist/tag-hygiene/tier2-infer.d.ts +28 -0
  475. package/dist/tag-hygiene/tier2-infer.js +72 -0
  476. package/dist/tag-hygiene/tier2-infer.js.map +1 -0
  477. package/dist/vector/sqlite-vec.d.ts +16 -0
  478. package/dist/vector/sqlite-vec.js +49 -0
  479. package/dist/vector/sqlite-vec.js.map +1 -0
  480. package/migrations/001-init.sql +117 -0
  481. package/migrations/002-wire-v1.sql +16 -0
  482. package/migrations/003-expand-memory-types.sql +81 -0
  483. package/migrations/004-provenance.sql +4 -0
  484. package/migrations/005-security.sql +12 -0
  485. package/migrations/006-atom-v3.sql +28 -0
  486. package/migrations/007-memory-events.sql +30 -0
  487. package/migrations/008-consolidation.sql +31 -0
  488. package/migrations/009-tag-hygiene.sql +13 -0
  489. package/migrations/010-sync-pull.sql +53 -0
  490. package/migrations/011-embed-dim-migration.sql +28 -0
  491. package/migrations/012-entities.sql +36 -0
  492. package/migrations/013-archival.sql +50 -0
  493. package/package.json +50 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"02-normalize.js","sourceRoot":"","sources":["../../../src/distill/stages/02-normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;;GAGG;AACH,MAAM,aAAa,GAA2B;IAC5C,aAAa,EAAE,aAAa;IAC5B,aAAa,EAAE,aAAa;IAC5B,YAAY,EAAE,aAAa;IAC3B,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,gBAAgB;IAC3B,gBAAgB,EAAE,gBAAgB;IAClC,gBAAgB,EAAE,gBAAgB;CACnC,CAAC;AAEF,+DAA+D;AAC/D,MAAM,eAAe,GAAG,mCAAmC,CAAC;AAE5D,0DAA0D;AAC1D,MAAM,gBAAgB,GAAG,mCAAmC,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG,sEAAsE,CAAC;AAEjG,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AAEvB,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,2DAA2D;IAC3D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE;QACjD,sDAAsD;QACtD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/C,OAAO,YAAY,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,0DAA0D;IAC1D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,8CAA8C;IAC9C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAChE,OAAO,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,uCAAuC;IACvC,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,uDAAuD;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE7C,IAAI,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACxC,OAAO,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IACD,gFAAgF;IAChF,8CAA8C;IAC9C,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,0DAA0D;IAC1D,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/D,sCAAsC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;QAClE,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,MAAM,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Stage 3 — Chunk (deterministic)
3
+ *
4
+ * Token-aware split using word-count proxy (~800 tokens ≈ ~3200 chars).
5
+ * Respects turn boundaries — does not split mid role: block.
6
+ *
7
+ * Turn detection: lines starting with "user:", "assistant:", "system:",
8
+ * "human:", "ai:" (case-insensitive) are treated as turn boundaries.
9
+ */
10
+ export interface Chunk {
11
+ index: number;
12
+ text: string;
13
+ }
14
+ /**
15
+ * Split text into chunks respecting turn boundaries.
16
+ *
17
+ * Algorithm:
18
+ * 1. Split into "turns" — sequences of lines starting with a role: prefix.
19
+ * 2. Pack turns into chunks until MAX_CHUNK_CHARS would be exceeded.
20
+ * 3. If a single turn exceeds MAX_CHUNK_CHARS, split it by paragraph then by line.
21
+ */
22
+ export declare function chunk(text: string): Chunk[];
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Stage 3 — Chunk (deterministic)
3
+ *
4
+ * Token-aware split using word-count proxy (~800 tokens ≈ ~3200 chars).
5
+ * Respects turn boundaries — does not split mid role: block.
6
+ *
7
+ * Turn detection: lines starting with "user:", "assistant:", "system:",
8
+ * "human:", "ai:" (case-insensitive) are treated as turn boundaries.
9
+ */
10
+ /** Approximate chars per token (conservative estimate) */
11
+ const CHARS_PER_TOKEN = 4;
12
+ /** Target tokens per chunk */
13
+ const TARGET_TOKENS = 800;
14
+ /** Max chars per chunk before we must split even mid-turn */
15
+ const MAX_CHUNK_CHARS = TARGET_TOKENS * CHARS_PER_TOKEN; // 3200
16
+ /** Turn boundary patterns */
17
+ const TURN_BOUNDARY_RE = /^(user|assistant|system|human|ai)\s*:/i;
18
+ /**
19
+ * Split text into chunks respecting turn boundaries.
20
+ *
21
+ * Algorithm:
22
+ * 1. Split into "turns" — sequences of lines starting with a role: prefix.
23
+ * 2. Pack turns into chunks until MAX_CHUNK_CHARS would be exceeded.
24
+ * 3. If a single turn exceeds MAX_CHUNK_CHARS, split it by paragraph then by line.
25
+ */
26
+ export function chunk(text) {
27
+ const turns = splitIntoTurns(text);
28
+ return packTurns(turns);
29
+ }
30
+ function splitIntoTurns(text) {
31
+ const lines = text.split('\n');
32
+ const turns = [];
33
+ let current = [];
34
+ for (const line of lines) {
35
+ if (TURN_BOUNDARY_RE.test(line) && current.length > 0) {
36
+ turns.push({ text: current.join('\n') });
37
+ current = [line];
38
+ }
39
+ else {
40
+ current.push(line);
41
+ }
42
+ }
43
+ if (current.length > 0) {
44
+ const t = current.join('\n').trim();
45
+ if (t)
46
+ turns.push({ text: t });
47
+ }
48
+ return turns;
49
+ }
50
+ function packTurns(turns) {
51
+ const chunks = [];
52
+ let current = '';
53
+ let idx = 0;
54
+ for (const turn of turns) {
55
+ const turnText = turn.text.trim();
56
+ if (!turnText)
57
+ continue;
58
+ // If this single turn is too large, flush current and split the turn
59
+ if (turnText.length > MAX_CHUNK_CHARS) {
60
+ if (current.trim()) {
61
+ chunks.push({ index: idx++, text: current.trim() });
62
+ current = '';
63
+ }
64
+ // Split the oversized turn by paragraph
65
+ const subChunks = splitLargeTurn(turnText, idx);
66
+ for (const sc of subChunks) {
67
+ chunks.push({ index: idx++, text: sc.text });
68
+ }
69
+ continue;
70
+ }
71
+ // Would adding this turn exceed the limit?
72
+ const candidate = current ? current + '\n\n' + turnText : turnText;
73
+ if (candidate.length > MAX_CHUNK_CHARS && current.trim()) {
74
+ chunks.push({ index: idx++, text: current.trim() });
75
+ current = turnText;
76
+ }
77
+ else {
78
+ current = candidate;
79
+ }
80
+ }
81
+ if (current.trim()) {
82
+ chunks.push({ index: idx, text: current.trim() });
83
+ }
84
+ // Edge case: empty input
85
+ if (chunks.length === 0) {
86
+ return [{ index: 0, text: '' }];
87
+ }
88
+ return chunks;
89
+ }
90
+ /**
91
+ * Split a single turn that exceeds MAX_CHUNK_CHARS into sub-chunks.
92
+ * First tries paragraph boundaries, then line-by-line as fallback.
93
+ */
94
+ function splitLargeTurn(text, startIdx) {
95
+ const paragraphs = text.split(/\n\n+/);
96
+ const chunks = [];
97
+ let current = '';
98
+ let idx = startIdx;
99
+ for (const para of paragraphs) {
100
+ if (!para.trim())
101
+ continue;
102
+ if (para.length > MAX_CHUNK_CHARS) {
103
+ // Split by line
104
+ if (current.trim()) {
105
+ chunks.push({ index: idx++, text: current.trim() });
106
+ current = '';
107
+ }
108
+ const lines = para.split('\n');
109
+ for (const line of lines) {
110
+ if (!line.trim())
111
+ continue;
112
+ const cand = current ? current + '\n' + line : line;
113
+ if (cand.length > MAX_CHUNK_CHARS && current.trim()) {
114
+ chunks.push({ index: idx++, text: current.trim() });
115
+ current = line;
116
+ }
117
+ else {
118
+ current = cand;
119
+ }
120
+ }
121
+ }
122
+ else {
123
+ const cand = current ? current + '\n\n' + para : para;
124
+ if (cand.length > MAX_CHUNK_CHARS && current.trim()) {
125
+ chunks.push({ index: idx++, text: current.trim() });
126
+ current = para;
127
+ }
128
+ else {
129
+ current = cand;
130
+ }
131
+ }
132
+ }
133
+ if (current.trim()) {
134
+ chunks.push({ index: idx, text: current.trim() });
135
+ }
136
+ return chunks;
137
+ }
138
+ //# sourceMappingURL=03-chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"03-chunk.js","sourceRoot":"","sources":["../../../src/distill/stages/03-chunk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Stage 4 — Compact (LLM call per chunk)
3
+ *
4
+ * Removes redundancy, repeated thinking, false starts from each chunk.
5
+ * Preserves decisions, file paths, commands, errors, rationale.
6
+ *
7
+ * Budget: checks cap before each call, records after.
8
+ * Throws BudgetExceeded if over cap (caller moves job to paused).
9
+ */
10
+ import type { LLMProvider } from '../../contracts/index.js';
11
+ import type { Chunk } from './03-chunk.js';
12
+ import { BudgetTracker, BudgetExceeded } from '../../budget/tracker.js';
13
+ export { BudgetExceeded };
14
+ export interface CompactResult {
15
+ index: number;
16
+ text: string;
17
+ usageUsd: number;
18
+ }
19
+ /**
20
+ * Compact a single chunk via LLM.
21
+ * Returns the compressed text and actual USD cost.
22
+ */
23
+ export declare function compactChunk(chk: Chunk, provider: LLMProvider, budget: BudgetTracker, capUsd: number): Promise<CompactResult>;
24
+ /**
25
+ * Compact all chunks in sequence.
26
+ * Stops at first BudgetExceeded — caller catches and pauses job.
27
+ */
28
+ export declare function compact(chunks: Chunk[], provider: LLMProvider, budget: BudgetTracker, capUsd: number): Promise<CompactResult[]>;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Stage 4 — Compact (LLM call per chunk)
3
+ *
4
+ * Removes redundancy, repeated thinking, false starts from each chunk.
5
+ * Preserves decisions, file paths, commands, errors, rationale.
6
+ *
7
+ * Budget: checks cap before each call, records after.
8
+ * Throws BudgetExceeded if over cap (caller moves job to paused).
9
+ */
10
+ import { BudgetTracker, BudgetExceeded } from '../../budget/tracker.js';
11
+ export { BudgetExceeded };
12
+ const COMPACT_SYSTEM = `You are a transcript compressor for AI coding agent sessions.
13
+
14
+ Compress the provided transcript chunk. Remove:
15
+ - Repeated or near-identical lines
16
+ - Thinking-out-loud that reaches no conclusion
17
+ - False starts and self-corrections that don't change the outcome
18
+ - Generic acknowledgment phrases ("Sure!", "Of course!", "I'll help you with that")
19
+
20
+ PRESERVE:
21
+ - All decisions and chosen approaches
22
+ - All file paths and commands
23
+ - All error messages and their resolutions
24
+ - All rationale and architectural reasoning
25
+ - All TODO items and pending work
26
+
27
+ Output plain text only. No markdown formatting. No commentary.`;
28
+ /**
29
+ * Compact a single chunk via LLM.
30
+ * Returns the compressed text and actual USD cost.
31
+ */
32
+ export async function compactChunk(chk, provider, budget, capUsd) {
33
+ if (!chk.text.trim()) {
34
+ return { index: chk.index, text: '', usageUsd: 0 };
35
+ }
36
+ const messages = [
37
+ { role: 'system', content: COMPACT_SYSTEM },
38
+ { role: 'user', content: chk.text },
39
+ ];
40
+ // Estimate cost: prompt = system + user text chars
41
+ const promptChars = COMPACT_SYSTEM.length + chk.text.length;
42
+ // For Ollama providers, usd=0 always — use a negligible estimate to pass budget check
43
+ // For Azure, pricing is handled after the call via usage.usd
44
+ const estimateUsd = BudgetTracker.estimateUsd(promptChars, 0.000002, 0.000002);
45
+ budget.assertCanSpend(estimateUsd, capUsd);
46
+ const result = await provider.chat(messages, {
47
+ temperature: 0.1,
48
+ maxTokens: 2000,
49
+ });
50
+ // Record actual cost (0 for Ollama, real for Azure)
51
+ budget.record(result.usage.usd);
52
+ return {
53
+ index: chk.index,
54
+ text: result.text.trim(),
55
+ usageUsd: result.usage.usd,
56
+ };
57
+ }
58
+ /**
59
+ * Compact all chunks in sequence.
60
+ * Stops at first BudgetExceeded — caller catches and pauses job.
61
+ */
62
+ export async function compact(chunks, provider, budget, capUsd) {
63
+ const results = [];
64
+ for (const chk of chunks) {
65
+ results.push(await compactChunk(chk, provider, budget, capUsd));
66
+ }
67
+ return results;
68
+ }
69
+ //# sourceMappingURL=04-compact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"04-compact.js","sourceRoot":"","sources":["../../../src/distill/stages/04-compact.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;+DAewC,CAAC;AAQhE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAU,EACV,QAAqB,EACrB,MAAqB,EACrB,MAAc;IAEd,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACrB,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,QAAQ,GAAc;QAC1B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE;QAC3C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE;KACpC,CAAC;IAEF,mDAAmD;IACnD,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;IAC5D,sFAAsF;IACtF,6DAA6D;IAC7D,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE/E,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE;QAC3C,WAAW,EAAE,GAAG;QAChB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,oDAAoD;IACpD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEhC,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;QACxB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG;KAC3B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAe,EACf,QAAqB,EACrB,MAAqB,EACrB,MAAc;IAEd,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Stage 5 — Extract (LLM JSON-mode per chunk)
3
+ *
4
+ * Emits typed atoms {type, text, importance, confidence, evidence}.
5
+ * Zod-validates the JSON response. Retries once with a stricter prompt
6
+ * on parse failure. Throws BudgetExceeded if over cap.
7
+ */
8
+ import type { LLMProvider } from '../../contracts/index.js';
9
+ import { type Atom } from '../prompts/extract.js';
10
+ import { BudgetTracker, BudgetExceeded } from '../../budget/tracker.js';
11
+ export { BudgetExceeded };
12
+ export type { Atom };
13
+ export interface ExtractResult {
14
+ chunkIndex: number;
15
+ atoms: Atom[];
16
+ usageUsd: number;
17
+ retried: boolean;
18
+ }
19
+ /**
20
+ * Extract atoms from a single compacted chunk.
21
+ *
22
+ * Parse / Zod validation failure → throws DeterministicError immediately.
23
+ * The worker catches this, poisons the job after a single attempt, and does not
24
+ * issue a second LLM call. This prevents burning budget on a malformed transcript
25
+ * that will never produce valid JSON regardless of how many times we retry.
26
+ */
27
+ export declare function extractChunk(chunkIndex: number, text: string, provider: LLMProvider, budget: BudgetTracker, capUsd: number): Promise<ExtractResult>;
28
+ /**
29
+ * Extract atoms from all compacted chunks.
30
+ * Stops at first BudgetExceeded.
31
+ */
32
+ export declare function extract(chunks: Array<{
33
+ index: number;
34
+ text: string;
35
+ }>, provider: LLMProvider, budget: BudgetTracker, capUsd: number): Promise<ExtractResult[]>;
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Stage 5 — Extract (LLM JSON-mode per chunk)
3
+ *
4
+ * Emits typed atoms {type, text, importance, confidence, evidence}.
5
+ * Zod-validates the JSON response. Retries once with a stricter prompt
6
+ * on parse failure. Throws BudgetExceeded if over cap.
7
+ */
8
+ import { z } from 'zod';
9
+ import { AtomSchema, EXTRACTION_SYSTEM_PROMPT, } from '../prompts/extract.js';
10
+ import { BudgetTracker, BudgetExceeded } from '../../budget/tracker.js';
11
+ import { DeterministicError } from '../../pipeline/errors.js';
12
+ /**
13
+ * Lenient wrapper: accepts any objects in the atoms array so that individual
14
+ * bad atoms (short text, unknown type, etc.) don't reject the whole response.
15
+ * Valid atoms are filtered with AtomSchema after JSON parsing.
16
+ */
17
+ const LenientExtractionSchema = z.object({ atoms: z.array(z.unknown()) });
18
+ export { BudgetExceeded };
19
+ /**
20
+ * Extract atoms from a single compacted chunk.
21
+ *
22
+ * Parse / Zod validation failure → throws DeterministicError immediately.
23
+ * The worker catches this, poisons the job after a single attempt, and does not
24
+ * issue a second LLM call. This prevents burning budget on a malformed transcript
25
+ * that will never produce valid JSON regardless of how many times we retry.
26
+ */
27
+ export async function extractChunk(chunkIndex, text, provider, budget, capUsd) {
28
+ if (!text.trim()) {
29
+ return { chunkIndex, atoms: [], usageUsd: 0, retried: false };
30
+ }
31
+ const promptChars = EXTRACTION_SYSTEM_PROMPT.length + text.length;
32
+ const estimateUsd = BudgetTracker.estimateUsd(promptChars, 0.000002, 0.000002);
33
+ budget.assertCanSpend(estimateUsd, capUsd);
34
+ const result = await callExtract(text, EXTRACTION_SYSTEM_PROMPT, provider);
35
+ budget.record(result.usageUsd);
36
+ const parsed = tryParseAtoms(result.text);
37
+ if (parsed !== null) {
38
+ return { chunkIndex, atoms: parsed, usageUsd: result.usageUsd, retried: false };
39
+ }
40
+ // Parse / schema failure — deterministic. Let the worker decide retry policy.
41
+ throw new DeterministicError(`[extract] chunk ${chunkIndex}: Zod/JSON parse failed — raw: ${result.text.slice(0, 200)}`);
42
+ }
43
+ async function callExtract(text, systemPrompt, provider) {
44
+ const messages = [
45
+ { role: 'system', content: systemPrompt },
46
+ { role: 'user', content: `Extract knowledge atoms from this transcript chunk:\n\n${text}` },
47
+ ];
48
+ const result = await provider.chat(messages, {
49
+ temperature: 0.1,
50
+ json: true,
51
+ maxTokens: 1500,
52
+ });
53
+ return { text: result.text, usageUsd: result.usage.usd };
54
+ }
55
+ /**
56
+ * Try to parse the LLM response into an Atom[].
57
+ * Strips markdown fences if present.
58
+ *
59
+ * Returns an Atom[] (possibly empty) when the JSON is structurally valid and
60
+ * contains an `atoms` array — even if individual atoms are malformed (they
61
+ * are silently dropped via AtomSchema filtering).
62
+ *
63
+ * Returns null only when the raw text is not parseable JSON or is missing the
64
+ * top-level `atoms` key — this is the signal for a DeterministicError.
65
+ */
66
+ function tryParseAtoms(raw) {
67
+ try {
68
+ let text = raw.trim();
69
+ // Strip markdown code fences
70
+ text = text.replace(/^```(?:json)?\n?/i, '').replace(/\n?```\s*$/i, '').trim();
71
+ // Find the outermost JSON object
72
+ const start = text.indexOf('{');
73
+ const end = text.lastIndexOf('}');
74
+ if (start === -1 || end === -1)
75
+ return null;
76
+ const jsonStr = text.slice(start, end + 1);
77
+ const parsed = JSON.parse(jsonStr);
78
+ // Use the lenient schema — only requires `atoms` to be an array
79
+ const wrapper = LenientExtractionSchema.safeParse(parsed);
80
+ if (!wrapper.success)
81
+ return null;
82
+ // Filter atoms individually: drop those that fail strict AtomSchema
83
+ // (short text, unknown type, out-of-range numbers, etc.)
84
+ return wrapper.data.atoms.filter((a) => AtomSchema.safeParse(a).success);
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
90
+ /**
91
+ * Extract atoms from all compacted chunks.
92
+ * Stops at first BudgetExceeded.
93
+ */
94
+ export async function extract(chunks, provider, budget, capUsd) {
95
+ const results = [];
96
+ for (const chk of chunks) {
97
+ results.push(await extractChunk(chk.index, chk.text, provider, budget, capUsd));
98
+ }
99
+ return results;
100
+ }
101
+ //# sourceMappingURL=05-extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"05-extract.js","sourceRoot":"","sources":["../../../src/distill/stages/05-extract.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,UAAU,EACV,wBAAwB,GAEzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,CAAC;AAU1B;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,IAAY,EACZ,QAAqB,EACrB,MAAqB,EACrB,MAAc;IAEd,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,WAAW,GAAG,wBAAwB,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAClE,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE/E,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,wBAAwB,EAAE,QAAQ,CAAC,CAAC;IAC3E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE/B,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAClF,CAAC;IAED,8EAA8E;IAC9E,MAAM,IAAI,kBAAkB,CAC1B,mBAAmB,UAAU,kCAAkC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC3F,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,IAAY,EACZ,YAAoB,EACpB,QAAqB;IAErB,MAAM,QAAQ,GAAc;QAC1B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;QACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,0DAA0D,IAAI,EAAE,EAAE;KAC5F,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE;QAC3C,WAAW,EAAE,GAAG;QAChB,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC;QACH,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAEtB,6BAA6B;QAC7B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAE/E,iCAAiC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5C,gEAAgE;QAChE,MAAM,OAAO,GAAG,uBAAuB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAElC,oEAAoE;QACpE,yDAAyD;QACzD,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAW,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAA8C,EAC9C,QAAqB,EACrB,MAAqB,EACrB,MAAc;IAEd,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Stage 6 — Reduce (deterministic)
3
+ *
4
+ * Merge atoms across chunks by hash(normalized_text).
5
+ * When duplicates exist, keep the highest-importance instance.
6
+ */
7
+ import type { Atom } from '../prompts/extract.js';
8
+ export interface ReducedAtom extends Atom {
9
+ /** Hash of the normalized (lowercased, trimmed, whitespace-collapsed) text */
10
+ contentHash: string;
11
+ }
12
+ /**
13
+ * Merge a flat array of atoms, deduplicating by content hash.
14
+ * On collision, keep the highest-importance instance.
15
+ */
16
+ export declare function reduce(atoms: Atom[]): ReducedAtom[];
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Stage 6 — Reduce (deterministic)
3
+ *
4
+ * Merge atoms across chunks by hash(normalized_text).
5
+ * When duplicates exist, keep the highest-importance instance.
6
+ */
7
+ import { createHash } from 'node:crypto';
8
+ /**
9
+ * Merge a flat array of atoms, deduplicating by content hash.
10
+ * On collision, keep the highest-importance instance.
11
+ */
12
+ export function reduce(atoms) {
13
+ const byHash = new Map();
14
+ for (const atom of atoms) {
15
+ const hash = contentHash(atom.text);
16
+ const existing = byHash.get(hash);
17
+ if (!existing || atom.importance > existing.importance) {
18
+ byHash.set(hash, { ...atom, contentHash: hash });
19
+ }
20
+ }
21
+ return [...byHash.values()];
22
+ }
23
+ function contentHash(text) {
24
+ const normalized = text.trim().toLowerCase().replace(/\s+/g, ' ');
25
+ // Full 64-hex (256-bit) SHA-256 — the previous 16-hex (64-bit) slice had
26
+ // birthday-bound collision risk around 2^32 atoms which is too low for a
27
+ // long-running memory corpus.
28
+ return createHash('sha256').update(normalized, 'utf8').digest('hex');
29
+ }
30
+ //# sourceMappingURL=06-reduce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"06-reduce.js","sourceRoot":"","sources":["../../../src/distill/stages/06-reduce.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzC;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAElC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClE,yEAAyE;IACzE,yEAAyE;IACzE,8BAA8B;IAC9B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Stage 7 — Memory-normalize (deterministic)
3
+ *
4
+ * Apply canonical text rules to each reduced atom:
5
+ * - Trim and collapse whitespace
6
+ * - Apply entity dictionary (case canonicalization)
7
+ * - Compute final SHA-256 hash of the normalized text
8
+ */
9
+ import type { ReducedAtom } from './06-reduce.js';
10
+ export interface NormalizedMemory extends ReducedAtom {
11
+ normalizedText: string;
12
+ finalHash: string;
13
+ }
14
+ /**
15
+ * Normalize a single atom text to canonical form.
16
+ */
17
+ export declare function normalizeText(text: string): string;
18
+ /**
19
+ * Compute a stable hash for a normalized memory text.
20
+ * This is the dedup key used when inserting into the memories table.
21
+ */
22
+ export declare function computeHash(normalizedText: string): string;
23
+ /**
24
+ * Apply memory normalization to all reduced atoms.
25
+ * Returns atoms with `normalizedText` and `finalHash` added.
26
+ */
27
+ export declare function memoryNormalize(atoms: ReducedAtom[]): NormalizedMemory[];
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Stage 7 — Memory-normalize (deterministic)
3
+ *
4
+ * Apply canonical text rules to each reduced atom:
5
+ * - Trim and collapse whitespace
6
+ * - Apply entity dictionary (case canonicalization)
7
+ * - Compute final SHA-256 hash of the normalized text
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+ /**
11
+ * Entity dictionary: patterns → canonical replacement.
12
+ * Applied as case-insensitive whole-word replacements.
13
+ * Extend here as more entities are discovered.
14
+ */
15
+ const ENTITY_DICT = [
16
+ // sqlite-vec MUST precede bare sqlite so hyphenated form is protected first
17
+ [/\bsqlite-vec\b/gi, 'sqlite-vec'],
18
+ [/\bsqlite\b(?!-vec)/gi, 'SQLite'],
19
+ [/\bpostgres(?:ql)?\b/gi, 'PostgreSQL'],
20
+ [/\bmysql\b/gi, 'MySQL'],
21
+ [/\bjavascript\b/gi, 'JavaScript'],
22
+ [/\btypescript\b/gi, 'TypeScript'],
23
+ [/\bnodejs\b|\bnode\.js\b/gi, 'Node.js'],
24
+ [/\bnpm\b/g, 'npm'],
25
+ [/\bbun\b/gi, 'Bun'],
26
+ [/\bfastify\b/gi, 'Fastify'],
27
+ [/\bzod\b/gi, 'Zod'],
28
+ [/\bvitest\b/gi, 'Vitest'],
29
+ [/\bgithub\b/gi, 'GitHub'],
30
+ [/\bwindows\b/gi, 'Windows'],
31
+ [/\bmacos\b|mac os x\b/gi, 'macOS'],
32
+ [/\blinux\b/gi, 'Linux'],
33
+ ];
34
+ /**
35
+ * Normalize a single atom text to canonical form.
36
+ */
37
+ export function normalizeText(text) {
38
+ let t = text.trim();
39
+ // Collapse internal whitespace runs to single space
40
+ t = t.replace(/\s+/g, ' ');
41
+ // Apply entity dictionary
42
+ for (const [pattern, canonical] of ENTITY_DICT) {
43
+ t = t.replace(pattern, canonical);
44
+ }
45
+ return t;
46
+ }
47
+ /**
48
+ * Compute a stable hash for a normalized memory text.
49
+ * This is the dedup key used when inserting into the memories table.
50
+ */
51
+ export function computeHash(normalizedText) {
52
+ return createHash('sha256').update(normalizedText, 'utf8').digest('hex');
53
+ }
54
+ /**
55
+ * Apply memory normalization to all reduced atoms.
56
+ * Returns atoms with `normalizedText` and `finalHash` added.
57
+ */
58
+ export function memoryNormalize(atoms) {
59
+ return atoms.map(atom => {
60
+ const normalizedText = normalizeText(atom.text);
61
+ const finalHash = computeHash(normalizedText);
62
+ return { ...atom, normalizedText, finalHash };
63
+ });
64
+ }
65
+ //# sourceMappingURL=07-memory-normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"07-memory-normalize.js","sourceRoot":"","sources":["../../../src/distill/stages/07-memory-normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzC;;;;GAIG;AACH,MAAM,WAAW,GAAgD;IAC/D,4EAA4E;IAC5E,CAAC,kBAAkB,EAAE,YAAY,CAAC;IAClC,CAAC,sBAAsB,EAAE,QAAQ,CAAC;IAClC,CAAC,uBAAuB,EAAE,YAAY,CAAC;IACvC,CAAC,aAAa,EAAE,OAAO,CAAC;IACxB,CAAC,kBAAkB,EAAE,YAAY,CAAC;IAClC,CAAC,kBAAkB,EAAE,YAAY,CAAC;IAClC,CAAC,2BAA2B,EAAE,SAAS,CAAC;IACxC,CAAC,UAAU,EAAE,KAAK,CAAC;IACnB,CAAC,WAAW,EAAE,KAAK,CAAC;IACpB,CAAC,eAAe,EAAE,SAAS,CAAC;IAC5B,CAAC,WAAW,EAAE,KAAK,CAAC;IACpB,CAAC,cAAc,EAAE,QAAQ,CAAC;IAC1B,CAAC,cAAc,EAAE,QAAQ,CAAC;IAC1B,CAAC,eAAe,EAAE,SAAS,CAAC;IAC5B,CAAC,wBAAwB,EAAE,OAAO,CAAC;IACnC,CAAC,aAAa,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEpB,oDAAoD;IACpD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE3B,0BAA0B;IAC1B,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,WAAW,EAAE,CAAC;QAC/C,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,cAAsB;IAChD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACtB,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;QAC9C,OAAO,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Stage 8 — Embed + Index (provider call + DB writes)
3
+ *
4
+ * For each normalized memory:
5
+ * 1. Insert into memories table via MemoryRepo.insert (hash dedup built in)
6
+ * 2. Embed the normalizedText via EmbedProvider
7
+ * 3. Upsert vec row via SqliteVecStore.upsert
8
+ * 4. Update embedding_provider/model/dim on the memories row
9
+ */
10
+ import type { EmbedProvider } from '../../contracts/index.js';
11
+ import type { NormalizedMemory } from './07-memory-normalize.js';
12
+ import type { DB } from '../../storage/db.js';
13
+ export interface IndexResult {
14
+ memoryId: string;
15
+ created: boolean;
16
+ }
17
+ export interface EmbedIndexContext {
18
+ db: DB;
19
+ embed: EmbedProvider;
20
+ sessionId: string | null;
21
+ repo: string | null;
22
+ project: string | null;
23
+ branch: string | null;
24
+ agent: string | null;
25
+ sourceHash: string | null;
26
+ }
27
+ /**
28
+ * Embed and index all normalized memories.
29
+ * Returns one IndexResult per input atom (some may be deduped by hash).
30
+ */
31
+ export declare function embedAndIndex(memories: NormalizedMemory[], ctx: EmbedIndexContext): Promise<IndexResult[]>;