@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,175 @@
1
+ /**
2
+ * Mock providers for CI / integration testing.
3
+ *
4
+ * Used when ASTRA_MEMORY_MOCK_PROVIDERS=1 is set (or injected directly in tests).
5
+ *
6
+ * - MockLLMProvider: compaction returns the input text unchanged;
7
+ * extraction checks a small deterministic keyword table (see below) and
8
+ * returns one atom per matched keyword, or an empty atoms list if none match.
9
+ * - MockEmbedProvider: deterministic vector (dim defaults to
10
+ * DEFAULT_EMBED_DIM = 1024, configurable) seeded from text hash. No
11
+ * network, no Ollama required.
12
+ *
13
+ * These mocks satisfy the LLMProvider / EmbedProvider contracts and make
14
+ * the full 8-stage distillation pipeline runnable in CI.
15
+ *
16
+ * TEST-ONLY deterministic extraction vocabulary (SLICE-SMOKE-1 orchestrator
17
+ * decision, 2026-07-04: extending this file additively was approved as a
18
+ * relaxation of "no product-code changes" for test-double code specifically
19
+ * — see the smoke-suite run brief. Exclusively consumed by
20
+ * tests/smoke/_fixtures/session-canonical.json; fixture and this table must
21
+ * stay in lockstep, and this file is never reachable outside
22
+ * ASTRA_MEMORY_MOCK_PROVIDERS=1 (CI/test only — real serving never sets it).
23
+ * Each row is an independent case-insensitive substring match against the
24
+ * full extraction input; matching keywords each append one fixed atom (no
25
+ * parsing, no branching beyond the match itself):
26
+ *
27
+ * trigger keyword -> atom type -> entity emitted
28
+ * ---------------------------------------------------------------------
29
+ * "sqlite-vec" / "sqlite_vec" -> decision -> none (ORIGINAL, unchanged
30
+ * byte-for-byte since before
31
+ * SLICE-SMOKE-1)
32
+ * "priya nair" -> fact -> person: "Priya Nair"
33
+ * "astramemory-local" -> fact -> repo: "astramemory-local"
34
+ * "typescript" -> fact -> tech: "TypeScript"
35
+ * "todo:" -> todo -> none
36
+ * "prefers markdown summaries" -> note -> none (closest valid
37
+ * MemoryType — the schema
38
+ * has no 'preference' type)
39
+ */
40
+ import { createHash } from 'node:crypto';
41
+ import { DEFAULT_EMBED_DIM } from '../contracts/embed.js';
42
+ // ── Mock LLM ─────────────────────────────────────────────────────────────────
43
+ class MockLLMProvider {
44
+ name = 'ollama';
45
+ model = 'mock-llm';
46
+ async chat(messages, opts) {
47
+ const userContent = messages.find(m => m.role === 'user')?.content ?? '';
48
+ // Detect extraction calls (json mode or system prompt contains "atoms")
49
+ const systemContent = messages.find(m => m.role === 'system')?.content ?? '';
50
+ const isExtraction = opts?.json === true || systemContent.includes('atoms');
51
+ if (isExtraction) {
52
+ // Return a valid ExtractionSchema JSON that the Zod validator will accept.
53
+ // See the file-header keyword table — each check below is independent
54
+ // and additive; the sqlite-vec case is byte-identical to the original.
55
+ const lower = userContent.toLowerCase();
56
+ const atoms = [];
57
+ // ORIGINAL — unchanged since before SLICE-SMOKE-1.
58
+ if (lower.includes('sqlite-vec') || lower.includes('sqlite_vec')) {
59
+ atoms.push({
60
+ type: 'decision',
61
+ text: 'use sqlite-vec for v1 vector storage',
62
+ importance: 0.9,
63
+ confidence: 0.9,
64
+ evidence: 'OK let\'s go with sqlite-vec',
65
+ });
66
+ }
67
+ if (lower.includes('priya nair')) {
68
+ atoms.push({
69
+ type: 'fact',
70
+ text: 'Priya Nair is the designated reviewer for this work',
71
+ importance: 0.5,
72
+ confidence: 0.8,
73
+ entities: [{ name: 'Priya Nair', kind: 'person' }],
74
+ });
75
+ }
76
+ if (lower.includes('astramemory-local')) {
77
+ atoms.push({
78
+ type: 'fact',
79
+ text: 'This work belongs to the astramemory-local repo',
80
+ importance: 0.5,
81
+ confidence: 0.8,
82
+ entities: [{ name: 'astramemory-local', kind: 'repo' }],
83
+ });
84
+ }
85
+ if (lower.includes('typescript')) {
86
+ atoms.push({
87
+ type: 'fact',
88
+ text: 'This project is written in TypeScript',
89
+ importance: 0.5,
90
+ confidence: 0.8,
91
+ entities: [{ name: 'TypeScript', kind: 'tech' }],
92
+ });
93
+ }
94
+ if (lower.includes('todo:')) {
95
+ atoms.push({
96
+ type: 'todo',
97
+ text: 'Write a migration guide before shipping',
98
+ importance: 0.6,
99
+ confidence: 0.8,
100
+ });
101
+ }
102
+ if (lower.includes('prefers markdown summaries')) {
103
+ atoms.push({
104
+ type: 'note',
105
+ text: 'Prefers markdown-formatted memory summaries',
106
+ importance: 0.4,
107
+ confidence: 0.7,
108
+ });
109
+ }
110
+ return {
111
+ text: JSON.stringify({ atoms }),
112
+ usage: { in: 10, out: 10, usd: 0 }
113
+ };
114
+ }
115
+ // Compaction: return user content unchanged (preserves all decisions for extraction)
116
+ return {
117
+ text: userContent,
118
+ usage: { in: 10, out: 10, usd: 0 }
119
+ };
120
+ }
121
+ async health() {
122
+ return { ok: true, model: this.model, latency_ms: 0 };
123
+ }
124
+ }
125
+ // ── Mock Embed ────────────────────────────────────────────────────────────────
126
+ class MockEmbedProvider {
127
+ name = 'ollama';
128
+ model = 'mock-embed';
129
+ dim;
130
+ constructor(dim = DEFAULT_EMBED_DIM) {
131
+ this.dim = dim;
132
+ }
133
+ async embed(texts) {
134
+ return texts.map(t => makeDeterministicVec(t, this.dim));
135
+ }
136
+ async health() {
137
+ return { ok: true, model: this.model, dim: this.dim };
138
+ }
139
+ }
140
+ /**
141
+ * Deterministic vector seeded by text content hash, dim defaults to
142
+ * DEFAULT_EMBED_DIM (1024) — pass `dim` for a non-default schema (FEAT-409
143
+ * AC-2). Matches the approach used in search.ts makeFakeVec but uses
144
+ * SHA-256 for better distribution across similar texts.
145
+ */
146
+ function makeDeterministicVec(text, dim = DEFAULT_EMBED_DIM) {
147
+ const hash = createHash('sha256').update(text, 'utf8').digest();
148
+ const v = new Float32Array(dim);
149
+ // Seed each float from hash bytes cycling
150
+ for (let i = 0; i < dim; i++) {
151
+ const b0 = hash[i % 32] ?? 0;
152
+ const b1 = hash[(i + 1) % 32] ?? 0;
153
+ // Normalize to [-1, 1]
154
+ v[i] = ((b0 * 256 + b1) / 32767.5) - 1.0;
155
+ }
156
+ return v;
157
+ }
158
+ /**
159
+ * Returns a ProviderSet backed entirely by mock providers.
160
+ * Safe to call multiple times — each call returns fresh instances.
161
+ * `dim` defaults to DEFAULT_EMBED_DIM (1024); pass e.g. cfg.embedding.dim
162
+ * to exercise a non-default dim under ASTRA_MEMORY_MOCK_PROVIDERS=1
163
+ * (FEAT-409 AC-2).
164
+ */
165
+ export function makeMockProviders(dim = DEFAULT_EMBED_DIM) {
166
+ const llm = new MockLLMProvider();
167
+ return {
168
+ llm: {
169
+ compaction: llm,
170
+ extraction: llm,
171
+ },
172
+ embed: new MockEmbedProvider(dim),
173
+ };
174
+ }
175
+ //# sourceMappingURL=mock-providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-providers.js","sourceRoot":"","sources":["../../src/pipeline/mock-providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { JobKind } from '../contracts/index.js';
2
+ import type { JobHandler } from './handler.js';
3
+ /**
4
+ * Registry of job handlers keyed by JobKind.
5
+ * register() is idempotent — re-registering the same kind overwrites.
6
+ */
7
+ export declare class HandlerRegistry {
8
+ private readonly map;
9
+ /** Register a handler for its declared kind. */
10
+ register(handler: JobHandler): void;
11
+ /** Look up a handler by kind. Returns undefined if none registered. */
12
+ get(kind: JobKind): JobHandler | undefined;
13
+ /** All registered kinds (for diagnostics). */
14
+ registeredKinds(): JobKind[];
15
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Registry of job handlers keyed by JobKind.
3
+ * register() is idempotent — re-registering the same kind overwrites.
4
+ */
5
+ export class HandlerRegistry {
6
+ map = new Map();
7
+ /** Register a handler for its declared kind. */
8
+ register(handler) {
9
+ this.map.set(handler.kind, handler);
10
+ }
11
+ /** Look up a handler by kind. Returns undefined if none registered. */
12
+ get(kind) {
13
+ return this.map.get(kind);
14
+ }
15
+ /** All registered kinds (for diagnostics). */
16
+ registeredKinds() {
17
+ return [...this.map.keys()];
18
+ }
19
+ }
20
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/pipeline/registry.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,eAAe;IACT,GAAG,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEtD,gDAAgD;IAChD,QAAQ,CAAC,OAAmB;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,uEAAuE;IACvE,GAAG,CAAC,IAAa;QACf,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,8CAA8C;IAC9C,eAAe;QACb,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,41 @@
1
+ import type { DB } from '../storage/db.js';
2
+ import type { Config } from '../config/config.js';
3
+ import type { HandlerCtx } from './handler.js';
4
+ import type { HandlerRegistry } from './registry.js';
5
+ export interface WorkerOpts {
6
+ pollMs: number;
7
+ registry: HandlerRegistry;
8
+ db: DB;
9
+ config: Config;
10
+ /** Optional pre-built HandlerCtx (or ExtendedHandlerCtx) to pass to handlers.
11
+ * When omitted, a minimal {db, config} context is constructed. */
12
+ ctx?: HandlerCtx;
13
+ /** Optional liveness sink — the worker stamps lastTickAt each tick so
14
+ * /health can report worker.alive. */
15
+ healthState?: {
16
+ worker: {
17
+ lastTickAt: number | null;
18
+ };
19
+ };
20
+ }
21
+ export interface WorkerHandle {
22
+ /**
23
+ * Stop the worker. Resolves AFTER the currently in-flight tick completes
24
+ * (if any). Callers MUST await this before closing the DB — otherwise
25
+ * better-sqlite3 may throw SQLITE_MISUSE if a handler is still writing.
26
+ */
27
+ stop(): Promise<void>;
28
+ }
29
+ /**
30
+ * Start the worker poll loop in-process.
31
+ *
32
+ * Each tick:
33
+ * 1. Claim the oldest pending job (atomic state transition pending→running).
34
+ * 2. Dispatch to the registered handler.
35
+ * 3. On success → complete.
36
+ * 4. On throw → fail + attempts++. If attempts >= MAX_ATTEMPTS → poison.
37
+ * 5. Repeat immediately if a job was found; otherwise sleep pollMs.
38
+ *
39
+ * Returns a handle with stop() that terminates the loop after the current tick.
40
+ */
41
+ export declare function startWorker(opts: WorkerOpts): WorkerHandle;
@@ -0,0 +1,167 @@
1
+ import { JobRepo } from './job-repo.js';
2
+ import { DistillBudgetPausedError } from './handlers/distill.js';
3
+ import { classifyError } from './failure-classifier.js';
4
+ import { logger, childLogger } from '../log/logger.js';
5
+ const MAX_ATTEMPTS = 3;
6
+ /**
7
+ * Start the worker poll loop in-process.
8
+ *
9
+ * Each tick:
10
+ * 1. Claim the oldest pending job (atomic state transition pending→running).
11
+ * 2. Dispatch to the registered handler.
12
+ * 3. On success → complete.
13
+ * 4. On throw → fail + attempts++. If attempts >= MAX_ATTEMPTS → poison.
14
+ * 5. Repeat immediately if a job was found; otherwise sleep pollMs.
15
+ *
16
+ * Returns a handle with stop() that terminates the loop after the current tick.
17
+ */
18
+ export function startWorker(opts) {
19
+ const { pollMs, registry, db, config } = opts;
20
+ const repo = new JobRepo(db);
21
+ const ctx = opts.ctx ?? { db, config };
22
+ let stopped = false;
23
+ let timer = null;
24
+ let inFlight = null;
25
+ async function tick() {
26
+ if (stopped)
27
+ return;
28
+ if (opts.healthState)
29
+ opts.healthState.worker.lastTickAt = Date.now();
30
+ const job = repo.claimPending();
31
+ if (!job) {
32
+ // Nothing to do — schedule next poll
33
+ if (!stopped) {
34
+ timer = setTimeout(() => { launchTick(); }, pollMs);
35
+ }
36
+ return;
37
+ }
38
+ // Build a per-job child logger; binds job_id + job_kind + attempt on every log line
39
+ const jobLog = childLogger({ job_id: job.id, job_kind: job.kind, attempt: job.attempts + 1 });
40
+ jobLog.info('job claimed');
41
+ const handler = registry.get(job.kind);
42
+ if (!handler) {
43
+ // No handler registered — treat as a permanent failure
44
+ const errMsg = `No handler registered for job kind '${job.kind}'`;
45
+ repo.fail(job.id, errMsg);
46
+ const updated = repo.get(job.id);
47
+ if (updated) {
48
+ if (updated.attempts >= MAX_ATTEMPTS) {
49
+ repo.markPoison(job.id);
50
+ jobLog.warn({ error_message: errMsg, error_kind: 'NoHandler' }, 'job poisoned — no handler');
51
+ }
52
+ else {
53
+ repo.requeueForRetry(job.id);
54
+ jobLog.warn({ error_message: errMsg, error_kind: 'NoHandler' }, 'job requeued — no handler');
55
+ }
56
+ }
57
+ scheduleNext();
58
+ return;
59
+ }
60
+ let payload;
61
+ try {
62
+ payload = JSON.parse(job.payload_json);
63
+ }
64
+ catch (e) {
65
+ const errMsg = `Failed to parse payload_json: ${String(e)}`;
66
+ repo.fail(job.id, errMsg);
67
+ const updated = repo.get(job.id);
68
+ if (updated) {
69
+ if (updated.attempts >= MAX_ATTEMPTS) {
70
+ repo.markPoison(job.id);
71
+ jobLog.warn({ error_message: errMsg, error_kind: 'PayloadParseError' }, 'job poisoned — bad payload');
72
+ }
73
+ else {
74
+ repo.requeueForRetry(job.id);
75
+ jobLog.warn({ error_message: errMsg, error_kind: 'PayloadParseError' }, 'job requeued — bad payload');
76
+ }
77
+ }
78
+ scheduleNext();
79
+ return;
80
+ }
81
+ try {
82
+ await handler.handle(payload, ctx);
83
+ repo.complete(job.id);
84
+ jobLog.info('job completed');
85
+ }
86
+ catch (err) {
87
+ // Budget exceeded → pause the job (not a failure, not retried).
88
+ // Do NOT call fail() — that would increment attempts and eventually
89
+ // poison the job after repeated daily cap hits, preventing recovery
90
+ // when the user runs `astra-memory budget --reset`.
91
+ if (DistillBudgetPausedError.is(err)) {
92
+ const errMsg = err instanceof Error ? err.message : String(err);
93
+ repo.setLastError(job.id, errMsg);
94
+ repo.pause(job.id);
95
+ jobLog.warn({ error_message: errMsg, error_kind: 'BudgetPaused' }, 'job paused — budget exceeded');
96
+ scheduleNext();
97
+ return;
98
+ }
99
+ const kind = classifyError(err);
100
+ const errMsg = err instanceof Error ? err.message : String(err);
101
+ if (kind === 'deterministic') {
102
+ // Schema / parse failures will not self-heal with another LLM call.
103
+ // Poison immediately to avoid burning budget on retries.
104
+ repo.fail(job.id, errMsg);
105
+ repo.markPoison(job.id);
106
+ jobLog.warn({ error_message: errMsg.slice(0, 200), error_kind: 'DeterministicFailure' }, 'job poisoned — deterministic failure');
107
+ }
108
+ else {
109
+ // Transient failure — retry with exponential backoff up to MAX_ATTEMPTS.
110
+ repo.fail(job.id, errMsg);
111
+ const updated = repo.get(job.id);
112
+ if (updated && updated.attempts >= MAX_ATTEMPTS) {
113
+ repo.markPoison(job.id);
114
+ jobLog.warn({ error_message: errMsg.slice(0, 200), error_kind: 'TransientFailure', attempts: updated.attempts }, 'job poisoned — retries exhausted');
115
+ }
116
+ else {
117
+ // Exponential backoff: 1s, 2s, 4s, … capped at 60s
118
+ const attemptsSoFar = updated?.attempts ?? 1;
119
+ const delay = Math.min(1000 * Math.pow(2, attemptsSoFar - 1), 60_000);
120
+ jobLog.info({ error_message: errMsg.slice(0, 200), delay_ms: delay }, 'job requeued for retry');
121
+ setTimeout(() => { repo.requeueForRetry(job.id); }, delay);
122
+ }
123
+ }
124
+ }
125
+ scheduleNext();
126
+ }
127
+ function scheduleNext() {
128
+ if (!stopped) {
129
+ timer = setTimeout(() => { launchTick(); }, 0);
130
+ }
131
+ }
132
+ function onUncaught(err) {
133
+ // Worker must not crash the process — log and keep polling
134
+ const errMsg = err instanceof Error ? err.message : String(err);
135
+ logger.error({ error_message: errMsg.slice(0, 200), error_kind: err instanceof Error ? err.name : 'Unknown' }, '[worker] uncaught error in tick');
136
+ if (!stopped) {
137
+ timer = setTimeout(() => { launchTick(); }, pollMs);
138
+ }
139
+ }
140
+ /**
141
+ * Wraps tick() so the resulting promise is tracked in `inFlight`.
142
+ * stop() awaits this promise to ensure no handler is mid-DB-write when
143
+ * the caller subsequently closes the database.
144
+ */
145
+ function launchTick() {
146
+ inFlight = tick().catch(onUncaught).finally(() => { inFlight = null; });
147
+ }
148
+ // Kick off the first tick
149
+ timer = setTimeout(() => { launchTick(); }, 0);
150
+ return {
151
+ async stop() {
152
+ stopped = true;
153
+ if (timer !== null) {
154
+ clearTimeout(timer);
155
+ timer = null;
156
+ }
157
+ // Drain any in-flight tick before returning — handler may be mid-write.
158
+ if (inFlight) {
159
+ try {
160
+ await inFlight;
161
+ }
162
+ catch { /* already logged via onUncaught */ }
163
+ }
164
+ }
165
+ };
166
+ }
167
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/pipeline/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { EmbedHealth, EmbedProvider } from '../../contracts/embed.js';
2
+ export interface AzureOpenAIEmbedConfig {
3
+ endpoint: string;
4
+ deployment: string;
5
+ apiKey: string;
6
+ apiVersion?: string;
7
+ model?: string;
8
+ /** FEAT-409: expected/requested output dim — defaults to
9
+ * DEFAULT_EMBED_DIM (1024). Set from config.embedding.dim by
10
+ * providers/index.ts. Sent as the Azure `dimensions` request param. */
11
+ dim?: number;
12
+ }
13
+ export declare class AzureOpenAIEmbedProvider implements EmbedProvider {
14
+ readonly name: "azure-openai";
15
+ readonly model: string;
16
+ readonly dim: number;
17
+ private readonly endpoint;
18
+ private readonly deployment;
19
+ private readonly apiKey;
20
+ private readonly apiVersion;
21
+ constructor(config: AzureOpenAIEmbedConfig);
22
+ private get embedUrl();
23
+ embed(texts: string[]): Promise<Float32Array[]>;
24
+ health(): Promise<EmbedHealth>;
25
+ }
@@ -0,0 +1,138 @@
1
+ import { DEFAULT_EMBED_DIM } from '../../contracts/embed.js';
2
+ import { TransientError, DeterministicError } from '../../pipeline/errors.js';
3
+ const EMBED_TIMEOUT_MS = 15_000;
4
+ const HEALTH_TIMEOUT_MS = 15_000;
5
+ const DEFAULT_MODEL = 'text-embedding-3-small';
6
+ async function fetchWithRetry(url, init, timeoutMs) {
7
+ let lastError;
8
+ for (let i = 0; i < 2; i++) {
9
+ try {
10
+ const res = await fetch(url, { ...init, signal: AbortSignal.timeout(timeoutMs) });
11
+ if (res.status >= 400 && res.status < 500)
12
+ return res;
13
+ if (res.status >= 500 && i === 0) {
14
+ lastError = new Error(`HTTP ${res.status} from Azure embed`);
15
+ continue;
16
+ }
17
+ return res;
18
+ }
19
+ catch (err) {
20
+ if (i === 0) {
21
+ lastError = err;
22
+ continue;
23
+ }
24
+ throw err;
25
+ }
26
+ }
27
+ throw lastError;
28
+ }
29
+ export class AzureOpenAIEmbedProvider {
30
+ name = 'azure-openai';
31
+ model;
32
+ dim;
33
+ endpoint;
34
+ deployment;
35
+ apiKey;
36
+ apiVersion;
37
+ constructor(config) {
38
+ this.endpoint = config.endpoint.replace(/\/$/, '');
39
+ this.deployment = config.deployment;
40
+ this.apiKey = config.apiKey;
41
+ this.apiVersion = config.apiVersion ?? '2024-10-21';
42
+ this.model = config.model ?? DEFAULT_MODEL;
43
+ this.dim = config.dim ?? DEFAULT_EMBED_DIM;
44
+ }
45
+ get embedUrl() {
46
+ return `${this.endpoint}/openai/deployments/${this.deployment}/embeddings?api-version=${this.apiVersion}`;
47
+ }
48
+ async embed(texts) {
49
+ const body = {
50
+ input: texts,
51
+ dimensions: this.dim,
52
+ };
53
+ const res = await fetchWithRetry(this.embedUrl, {
54
+ method: 'POST',
55
+ headers: {
56
+ 'content-type': 'application/json',
57
+ 'api-key': this.apiKey,
58
+ },
59
+ body: JSON.stringify(body),
60
+ }, EMBED_TIMEOUT_MS);
61
+ if (!res.ok) {
62
+ const raw = await res.text().catch(() => '');
63
+ let detail = raw;
64
+ try {
65
+ const parsed = JSON.parse(raw);
66
+ detail = parsed.error?.message ?? raw;
67
+ }
68
+ catch {
69
+ // leave as raw text
70
+ }
71
+ const snippet = detail.slice(0, 200);
72
+ if (res.status >= 500) {
73
+ throw new TransientError(`Azure OpenAI embed failed: HTTP ${res.status} — ${snippet}`);
74
+ }
75
+ if (res.status === 429) {
76
+ throw new TransientError(`Azure OpenAI embed rate-limited (429): ${snippet}`);
77
+ }
78
+ throw new DeterministicError(`Azure OpenAI embed failed: HTTP ${res.status} — ${snippet}`);
79
+ }
80
+ const data = (await res.json());
81
+ if (!data.data || data.data.length === 0) {
82
+ throw new Error(`Azure embed response missing 'data' array`);
83
+ }
84
+ // Sort by index to preserve input order
85
+ const sorted = [...data.data].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
86
+ const results = [];
87
+ for (const item of sorted) {
88
+ const embedding = item.embedding;
89
+ if (!embedding) {
90
+ throw new Error(`Azure embed response item missing 'embedding' field`);
91
+ }
92
+ if (embedding.length !== this.dim) {
93
+ throw new Error(`Azure embed dimension mismatch: expected ${this.dim}, got ${embedding.length}. ` +
94
+ `Model: ${this.model}. Check that 'dimensions: ${this.dim}' is supported.`);
95
+ }
96
+ results.push(new Float32Array(embedding));
97
+ }
98
+ if (results.length !== texts.length) {
99
+ throw new Error(`Azure embed count mismatch: sent ${texts.length} texts, got ${results.length} embeddings`);
100
+ }
101
+ return results;
102
+ }
103
+ async health() {
104
+ // Ping with a 1-item embed request
105
+ const body = {
106
+ input: ['ping'],
107
+ dimensions: this.dim,
108
+ };
109
+ try {
110
+ const t0 = Date.now();
111
+ const res = await fetch(this.embedUrl, {
112
+ method: 'POST',
113
+ headers: {
114
+ 'content-type': 'application/json',
115
+ 'api-key': this.apiKey,
116
+ },
117
+ body: JSON.stringify(body),
118
+ signal: AbortSignal.timeout(HEALTH_TIMEOUT_MS),
119
+ });
120
+ void (Date.now() - t0); // latency not part of EmbedHealth interface
121
+ return {
122
+ ok: res.ok,
123
+ model: this.model,
124
+ dim: this.dim,
125
+ ...(res.ok ? {} : { error: `HTTP ${res.status}` }),
126
+ };
127
+ }
128
+ catch (err) {
129
+ return {
130
+ ok: false,
131
+ model: this.model,
132
+ dim: this.dim,
133
+ error: err instanceof Error ? err.message : String(err),
134
+ };
135
+ }
136
+ }
137
+ }
138
+ //# sourceMappingURL=azure-openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-openai.js","sourceRoot":"","sources":["../../../src/providers/embed/azure-openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { EmbedHealth, EmbedProvider } from '../../contracts/embed.js';
2
+ export interface OllamaEmbedConfig {
3
+ baseUrl?: string;
4
+ model?: string;
5
+ /** FEAT-409: expected output dim — defaults to DEFAULT_EMBED_DIM (1024).
6
+ * Set from config.embedding.dim by providers/index.ts. */
7
+ dim?: number;
8
+ }
9
+ export declare class OllamaEmbedProvider implements EmbedProvider {
10
+ readonly name: "ollama";
11
+ readonly model: string;
12
+ readonly dim: number;
13
+ private readonly baseUrl;
14
+ constructor(config?: OllamaEmbedConfig);
15
+ embed(texts: string[]): Promise<Float32Array[]>;
16
+ health(): Promise<EmbedHealth>;
17
+ }