@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,37 @@
1
+ /**
2
+ * open-runtime-db.ts — one way for CLI one-shots to open the production DB.
3
+ *
4
+ * queue/budget/rebuild predated encryption-at-rest and opened the DB with
5
+ * `defaultConfig()` + no key: against an encrypted database they died with
6
+ * "SqliteError: file is not a database", and against a non-default
7
+ * config.yaml dataDir they opened the wrong file entirely — the same two
8
+ * bug classes fixed for doctor/backup in the Wave-0/1 hardening.
9
+ */
10
+ import { join } from 'node:path';
11
+ import { existsSync } from 'node:fs';
12
+ import { resolveRuntimeConfig } from '../config/resolve-runtime.js';
13
+ import { defaultConfigDir } from '../config/datadir.js';
14
+ import { getOrCreateKey } from '../storage/keystore.js';
15
+ import { openDb } from '../storage/db.js';
16
+ import { migrate } from '../storage/migrate.js';
17
+ import { isPlaintextSqlite } from '../storage/migrate-encrypt.js';
18
+ /** Resolve config the same way serve does, open key-aware, run migrations.
19
+ *
20
+ * Key is applied only when the file on disk is actually encrypted: a
21
+ * plaintext DB (fresh test dir, encryption recently toggled on but serve's
22
+ * auto-migration not yet run) must be opened WITHOUT a key — PRAGMA key on
23
+ * a plaintext file makes every read fail with "file is not a database".
24
+ * serve owns the plaintext→encrypted migration; one-shot commands do not. */
25
+ export function openRuntimeDb() {
26
+ const { cfg, dataDir } = resolveRuntimeConfig();
27
+ const dbPath = dataDir === ':memory:' ? ':memory:' : join(dataDir, 'memory.sqlite');
28
+ const wantKey = dbPath !== ':memory:' &&
29
+ cfg.security.encryption.enabled &&
30
+ existsSync(dbPath) &&
31
+ !isPlaintextSqlite(dbPath);
32
+ const key = wantKey ? getOrCreateKey(defaultConfigDir()).key : undefined;
33
+ const db = openDb(dbPath, key ? { key } : {});
34
+ migrate(db, cfg.embedding.dim);
35
+ return { db, cfg, dataDir };
36
+ }
37
+ //# sourceMappingURL=open-runtime-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-runtime-db.js","sourceRoot":"","sources":["../../src/cli/open-runtime-db.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAW,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AASlE;;;;;;6EAM6E;AAC7E,MAAM,UAAU,aAAa;IAC3B,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACpF,MAAM,OAAO,GACX,MAAM,KAAK,UAAU;QACrB,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO;QAC/B,UAAU,CAAC,MAAM,CAAC;QAClB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `astramem-local pair <code> --url <cloud-url>` — Wave 3e device pairing.
3
+ *
4
+ * Redeems a FEAT-278 claim code against the cloud (possession of code =
5
+ * credential; POST /claims/{code}/redeem, no auth) and wires up sync:
6
+ * 1. the returned ApiKey goes into the OS credential store as the sync
7
+ * device token (never written to disk in plaintext),
8
+ * 2. url/workspaceId land in <configDir>/sync.json with enabled=true,
9
+ * merged into Config.sync at the next daemon start.
10
+ *
11
+ * Claim codes come from the AstraMemory dashboard (POST /me/claims).
12
+ */
13
+ export interface RedeemResponse {
14
+ apiUrl: string;
15
+ tenantId: string;
16
+ workspaceId: string;
17
+ apiKey: string;
18
+ }
19
+ export type RedeemResult = {
20
+ ok: true;
21
+ data: RedeemResponse;
22
+ } | {
23
+ ok: false;
24
+ status: number;
25
+ message: string;
26
+ };
27
+ /** POST /claims/{code}/redeem. Exposed for tests via injectable fetch. */
28
+ export declare function redeemClaim(cloudUrl: string, code: string, fetchImpl?: typeof fetch): Promise<RedeemResult>;
29
+ export declare function pairCommand(args: string[]): Promise<void>;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * `astramem-local pair <code> --url <cloud-url>` — Wave 3e device pairing.
3
+ *
4
+ * Redeems a FEAT-278 claim code against the cloud (possession of code =
5
+ * credential; POST /claims/{code}/redeem, no auth) and wires up sync:
6
+ * 1. the returned ApiKey goes into the OS credential store as the sync
7
+ * device token (never written to disk in plaintext),
8
+ * 2. url/workspaceId land in <configDir>/sync.json with enabled=true,
9
+ * merged into Config.sync at the next daemon start.
10
+ *
11
+ * Claim codes come from the AstraMemory dashboard (POST /me/claims).
12
+ */
13
+ import { defaultConfigDir } from '../config/datadir.js';
14
+ import { writeSyncSettings } from '../config/sync-settings.js';
15
+ import { storeSyncToken } from '../storage/keystore.js';
16
+ /** POST /claims/{code}/redeem. Exposed for tests via injectable fetch. */
17
+ export async function redeemClaim(cloudUrl, code, fetchImpl = fetch) {
18
+ const res = await fetchImpl(`${cloudUrl.replace(/\/$/, '')}/claims/${encodeURIComponent(code)}/redeem`, {
19
+ method: 'POST',
20
+ headers: { 'content-type': 'application/json' },
21
+ });
22
+ if (res.status === 410) {
23
+ return { ok: false, status: 410, message: 'claim code expired, already redeemed, or unknown — issue a fresh code from the dashboard' };
24
+ }
25
+ if (res.status === 429) {
26
+ const retryAfter = res.headers.get('retry-after') ?? '60';
27
+ return { ok: false, status: 429, message: `rate limited — retry in ${retryAfter}s` };
28
+ }
29
+ if (!res.ok) {
30
+ return { ok: false, status: res.status, message: `cloud returned HTTP ${res.status}` };
31
+ }
32
+ const body = await res.json();
33
+ if (!body.apiKey || !body.workspaceId || !body.apiUrl) {
34
+ return { ok: false, status: res.status, message: 'redeem succeeded but response was missing apiKey/workspaceId/apiUrl' };
35
+ }
36
+ return { ok: true, data: body };
37
+ }
38
+ function parseArg(args, flag) {
39
+ const i = args.indexOf(flag);
40
+ return i >= 0 ? args[i + 1] : undefined;
41
+ }
42
+ export async function pairCommand(args) {
43
+ const code = args.find(a => !a.startsWith('-'));
44
+ const cloudUrl = parseArg(args, '--url') ?? process.env.ASTRA_SYNC_URL;
45
+ if (!code || !cloudUrl) {
46
+ console.error('usage: astramem-local pair <claim-code> --url <cloud-url> (or set ASTRA_SYNC_URL)');
47
+ process.exit(1);
48
+ }
49
+ const result = await redeemClaim(cloudUrl, code);
50
+ if (!result.ok) {
51
+ console.error(`pair failed (HTTP ${result.status}): ${result.message}`);
52
+ process.exit(1);
53
+ }
54
+ const { apiUrl, tenantId, workspaceId, apiKey } = result.data;
55
+ const stored = storeSyncToken(apiKey);
56
+ const configDir = defaultConfigDir();
57
+ writeSyncSettings(configDir, { enabled: true, url: apiUrl, workspaceId, tenantId });
58
+ console.log('✓ paired with AstraMemory cloud');
59
+ console.log(` workspace : ${workspaceId}`);
60
+ console.log(` api url : ${apiUrl}`);
61
+ console.log(` token : ${stored.stored ? 'stored in OS credential store' : 'NOT stored — set ASTRA_SYNC_TOKEN yourself'}`);
62
+ console.log('\nRestart the daemon to start the sync shipper (team/org-scoped memories only — personal never syncs).');
63
+ }
64
+ //# sourceMappingURL=pair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/cli/pair.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `astramem-local providers [--json]`
3
+ *
4
+ * Shows the configured LLM (compaction/extraction) + embedding providers and
5
+ * runs the same live health probes `astramem-local doctor` uses
6
+ * (doctor/probes/llm-chat-probe.ts, doctor/probes/embed-probe.ts) — a real
7
+ * 1-token chat call and a real embed call with dim assertion, not just
8
+ * surface-level config echo.
9
+ */
10
+ export declare function providersCommand(args: string[]): Promise<void>;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * `astramem-local providers [--json]`
3
+ *
4
+ * Shows the configured LLM (compaction/extraction) + embedding providers and
5
+ * runs the same live health probes `astramem-local doctor` uses
6
+ * (doctor/probes/llm-chat-probe.ts, doctor/probes/embed-probe.ts) — a real
7
+ * 1-token chat call and a real embed call with dim assertion, not just
8
+ * surface-level config echo.
9
+ */
10
+ import { defaultConfig } from '../config/config.js';
11
+ import { runChecks, formatTable } from '../doctor/runner.js';
12
+ import { llmChatProbe } from '../doctor/probes/llm-chat-probe.js';
13
+ import { embedProbe } from '../doctor/probes/embed-probe.js';
14
+ export async function providersCommand(args) {
15
+ const jsonMode = args.includes('--json');
16
+ const cfg = defaultConfig();
17
+ const useMock = process.env.ASTRA_MEMORY_MOCK_PROVIDERS === '1';
18
+ const configured = {
19
+ mode: useMock ? 'mock' : 'live',
20
+ llm_compaction: `${cfg.llm.compaction.provider}/${cfg.llm.compaction.model}`,
21
+ llm_extraction: `${cfg.llm.extraction.provider}/${cfg.llm.extraction.model}`,
22
+ embedding: `${cfg.embedding.provider}/${cfg.embedding.model}`,
23
+ };
24
+ let providers;
25
+ let buildError;
26
+ if (useMock) {
27
+ const { makeMockProviders } = await import('../pipeline/mock-providers.js');
28
+ providers = makeMockProviders();
29
+ }
30
+ else {
31
+ try {
32
+ const { getProviders } = await import('../providers/index.js');
33
+ providers = getProviders(cfg);
34
+ }
35
+ catch (err) {
36
+ buildError = err instanceof Error ? err.message : String(err);
37
+ }
38
+ }
39
+ const checks = [];
40
+ if (providers) {
41
+ const p = providers;
42
+ checks.push({
43
+ name: `LLM chat probe (compaction: ${p.llm.compaction.name}/${p.llm.compaction.model})`,
44
+ run: () => llmChatProbe(p.llm.compaction),
45
+ });
46
+ const sameProvider = p.llm.compaction.name === p.llm.extraction.name && p.llm.compaction.model === p.llm.extraction.model;
47
+ if (!sameProvider) {
48
+ checks.push({
49
+ name: `LLM chat probe (extraction: ${p.llm.extraction.name}/${p.llm.extraction.model})`,
50
+ run: () => llmChatProbe(p.llm.extraction),
51
+ });
52
+ }
53
+ checks.push({
54
+ name: `Embed probe (${p.embed.name}/${p.embed.model})`,
55
+ run: () => embedProbe(p.embed),
56
+ });
57
+ }
58
+ else {
59
+ checks.push({
60
+ name: 'Provider construction',
61
+ run: async () => ({
62
+ ok: false,
63
+ message: buildError ?? 'unknown provider construction error',
64
+ fix: 'Check config.llm / config.embedding and required env vars (e.g. AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT)',
65
+ }),
66
+ });
67
+ }
68
+ const results = await runChecks(checks);
69
+ if (jsonMode) {
70
+ console.log(JSON.stringify({
71
+ configured,
72
+ checks: results,
73
+ summary: {
74
+ ok: results.filter(r => r.ok).length,
75
+ fail: results.filter(r => !r.ok).length,
76
+ },
77
+ }, null, 2));
78
+ }
79
+ else {
80
+ console.log('');
81
+ console.log(' AstraMemory Providers');
82
+ console.log(' ──────────────────────────────');
83
+ console.log(` Mode : ${configured.mode}`);
84
+ console.log(` LLM compaction : ${configured.llm_compaction}`);
85
+ console.log(` LLM extraction : ${configured.llm_extraction}`);
86
+ console.log(` Embedding : ${configured.embedding}`);
87
+ console.log('');
88
+ console.log(formatTable(results));
89
+ const failCount = results.filter(r => !r.ok).length;
90
+ const okCount = results.filter(r => r.ok).length;
91
+ console.log(`\n ${okCount} passed, ${failCount} failed\n`);
92
+ }
93
+ const hasFailures = results.some(r => !r.ok);
94
+ if (hasFailures)
95
+ process.exit(1);
96
+ }
97
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/cli/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface PurgeResult {
2
+ purged: number;
3
+ dumpPath: string | null;
4
+ }
5
+ export declare function queuePurgeCommand(args: string[]): Promise<void>;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * `astramem-local queue purge --poison [--json] [--dump-dir PATH]`
3
+ *
4
+ * Manual poison-job purge (FEAT-405) ahead of the 30-day auto-purge
5
+ * (src/pipeline/handlers/cleanup.ts). Writes a forensics dump (job payload +
6
+ * failure reason per job) BEFORE deleting anything, so an operator who
7
+ * cleared stuck poison jobs on demand can still inspect what was removed.
8
+ *
9
+ * Exit codes:
10
+ * 0 = success (including the zero-poison-jobs no-op)
11
+ * 1 = failure (dump dir could not be created/written)
12
+ */
13
+ import { join } from 'node:path';
14
+ import { mkdirSync, writeFileSync } from 'node:fs';
15
+ import { openRuntimeDb } from './open-runtime-db.js';
16
+ import { JobRepo } from '../pipeline/job-repo.js';
17
+ function parseArg(args, flag) {
18
+ const i = args.indexOf(flag);
19
+ return i >= 0 ? args[i + 1] : undefined;
20
+ }
21
+ function safeParsePayload(payloadJson) {
22
+ try {
23
+ return JSON.parse(payloadJson);
24
+ }
25
+ catch {
26
+ return payloadJson;
27
+ }
28
+ }
29
+ export async function queuePurgeCommand(args) {
30
+ const jsonMode = args.includes('--json');
31
+ if (!args.includes('--poison')) {
32
+ console.error('queue purge: only --poison is supported (usage: `queue purge --poison`)');
33
+ process.exit(1);
34
+ return;
35
+ }
36
+ const { db, dataDir } = openRuntimeDb();
37
+ const repo = new JobRepo(db);
38
+ // Read poison jobs BEFORE any deletion — the forensics dump must reflect
39
+ // exactly what gets purged.
40
+ const poisonJobs = repo.listPoison();
41
+ if (poisonJobs.length === 0) {
42
+ db.close();
43
+ const result = { purged: 0, dumpPath: null };
44
+ if (jsonMode) {
45
+ console.log(JSON.stringify(result));
46
+ }
47
+ else {
48
+ console.log('queue purge: no poison jobs found — nothing to do.');
49
+ }
50
+ return;
51
+ }
52
+ const dumpDir = parseArg(args, '--dump-dir') ?? join(dataDir, 'forensics');
53
+ let dumpPath;
54
+ try {
55
+ // Create the dump dir if missing rather than silently dropping the
56
+ // forensics dump (AC-5). mkdirSync throws loud on a real failure (e.g.
57
+ // a file occupying the path, or a permissions error).
58
+ mkdirSync(dumpDir, { recursive: true });
59
+ const stamp = new Date().toISOString().replace(/[:.]/g, '-');
60
+ dumpPath = join(dumpDir, `poison-purge-${stamp}.json`);
61
+ const dump = poisonJobs.map(j => ({
62
+ id: j.id,
63
+ kind: j.kind,
64
+ payload: safeParsePayload(j.payload_json),
65
+ failure_reason: j.last_error,
66
+ attempts: j.attempts,
67
+ created_at: j.created_at,
68
+ updated_at: j.updated_at,
69
+ }));
70
+ writeFileSync(dumpPath, JSON.stringify({ purged_at: Date.now(), count: dump.length, jobs: dump }, null, 2), 'utf-8');
71
+ }
72
+ catch (err) {
73
+ db.close();
74
+ console.error(`queue purge: failed to write forensics dump to ${dumpDir}: ${String(err)}`);
75
+ process.exit(1);
76
+ return;
77
+ }
78
+ // Delete exactly the ids captured above (not a blanket state='poison'
79
+ // delete) so a job that gets poisoned concurrently, after the dump was
80
+ // written, is never swept up without ever appearing in a forensics dump.
81
+ const purged = repo.purgePoisonByIds(poisonJobs.map(j => j.id));
82
+ db.close();
83
+ const result = { purged, dumpPath };
84
+ if (jsonMode) {
85
+ console.log(JSON.stringify(result));
86
+ }
87
+ else {
88
+ console.log(`queue purge: removed ${purged} poison job(s).`);
89
+ console.log(` Forensics dump: ${dumpPath}`);
90
+ }
91
+ }
92
+ //# sourceMappingURL=queue-purge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-purge.js","sourceRoot":"","sources":["../../src/cli/queue-purge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `astramem-local queue [--json] [--limit N]`
3
+ * `astramem-local queue purge --poison [--json] [--dump-dir PATH]`
4
+ *
5
+ * Shows job-table state counts (pending/running/completed/failed/poison/paused)
6
+ * plus the most recent failures (state IN ('failed','poison')) with their
7
+ * last_error, so an operator can see what's stuck without opening the DB.
8
+ *
9
+ * The `purge --poison` subcommand (FEAT-405) removes poison-marked jobs on
10
+ * demand, ahead of the 30-day auto-purge — see ./queue-purge.ts.
11
+ */
12
+ import type { JobState } from '../contracts/index.js';
13
+ interface StateCount {
14
+ state: JobState;
15
+ n: number;
16
+ }
17
+ interface RecentFailure {
18
+ id: string;
19
+ kind: string;
20
+ attempts: number;
21
+ last_error: string | null;
22
+ updated_at: number;
23
+ }
24
+ export interface QueueSummary {
25
+ counts: StateCount[];
26
+ recentFailures: RecentFailure[];
27
+ }
28
+ export declare function queueCommand(args: string[]): Promise<void>;
29
+ export {};
@@ -0,0 +1,73 @@
1
+ /**
2
+ * `astramem-local queue [--json] [--limit N]`
3
+ * `astramem-local queue purge --poison [--json] [--dump-dir PATH]`
4
+ *
5
+ * Shows job-table state counts (pending/running/completed/failed/poison/paused)
6
+ * plus the most recent failures (state IN ('failed','poison')) with their
7
+ * last_error, so an operator can see what's stuck without opening the DB.
8
+ *
9
+ * The `purge --poison` subcommand (FEAT-405) removes poison-marked jobs on
10
+ * demand, ahead of the 30-day auto-purge — see ./queue-purge.ts.
11
+ */
12
+ import { openRuntimeDb } from './open-runtime-db.js';
13
+ import { queuePurgeCommand } from './queue-purge.js';
14
+ function parseArg(args, flag) {
15
+ const i = args.indexOf(flag);
16
+ return i >= 0 ? args[i + 1] : undefined;
17
+ }
18
+ export async function queueCommand(args) {
19
+ if (args[0] === 'purge') {
20
+ await queuePurgeCommand(args.slice(1));
21
+ return;
22
+ }
23
+ const jsonMode = args.includes('--json');
24
+ const limitArg = parseArg(args, '--limit');
25
+ const limit = limitArg ? Math.max(1, Number(limitArg)) : 10;
26
+ // Key-aware + config.yaml-aware open (same resolution as serve/doctor).
27
+ const { db } = openRuntimeDb();
28
+ const counts = db
29
+ .prepare('SELECT state, COUNT(*) AS n FROM jobs GROUP BY state ORDER BY state')
30
+ .all();
31
+ const recentFailures = db
32
+ .prepare(`
33
+ SELECT id, kind, attempts, last_error, updated_at
34
+ FROM jobs
35
+ WHERE state IN ('failed', 'poison')
36
+ ORDER BY updated_at DESC
37
+ LIMIT ?
38
+ `)
39
+ .all(limit);
40
+ db.close();
41
+ const summary = { counts, recentFailures };
42
+ if (jsonMode) {
43
+ console.log(JSON.stringify(summary, null, 2));
44
+ return;
45
+ }
46
+ console.log('');
47
+ console.log(' AstraMemory Job Queue');
48
+ console.log(' ──────────────────────────────');
49
+ if (counts.length === 0) {
50
+ console.log(' (no jobs yet)');
51
+ }
52
+ else {
53
+ const total = counts.reduce((sum, c) => sum + c.n, 0);
54
+ for (const c of counts) {
55
+ console.log(` ${c.state.padEnd(10)} ${c.n}`);
56
+ }
57
+ console.log(` ${'total'.padEnd(10)} ${total}`);
58
+ }
59
+ console.log('');
60
+ if (recentFailures.length === 0) {
61
+ console.log(' No recent failures.');
62
+ }
63
+ else {
64
+ console.log(` Recent failures (last ${recentFailures.length}):`);
65
+ for (const f of recentFailures) {
66
+ const when = new Date(f.updated_at).toISOString();
67
+ const err = (f.last_error ?? '(no error recorded)').slice(0, 160);
68
+ console.log(` [${when}] ${f.kind} ${f.id} (attempts=${f.attempts}): ${err}`);
69
+ }
70
+ }
71
+ console.log('');
72
+ }
73
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/cli/queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `astramem-local rebuild [--repo REPO] [--project PROJECT] [--limit N] [--dry-run] [--json]`
3
+ *
4
+ * Re-embed/reindex flow: enumerates existing memories and enqueues one
5
+ * `reembed` job per memory via the same JobRepo used by ingest — the
6
+ * daemon's worker (500ms poll, src/pipeline/worker.ts) recomputes each
7
+ * embedding with the configured provider and upserts the vector row
8
+ * (src/pipeline/handlers/reembed.ts). Requires a running daemon.
9
+ */
10
+ export interface RebuildResult {
11
+ candidateCount: number;
12
+ queuedIds: string[];
13
+ dryRun: boolean;
14
+ }
15
+ export declare function rebuildCommand(args: string[]): Promise<void>;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * `astramem-local rebuild [--repo REPO] [--project PROJECT] [--limit N] [--dry-run] [--json]`
3
+ *
4
+ * Re-embed/reindex flow: enumerates existing memories and enqueues one
5
+ * `reembed` job per memory via the same JobRepo used by ingest — the
6
+ * daemon's worker (500ms poll, src/pipeline/worker.ts) recomputes each
7
+ * embedding with the configured provider and upserts the vector row
8
+ * (src/pipeline/handlers/reembed.ts). Requires a running daemon.
9
+ */
10
+ import { openRuntimeDb } from './open-runtime-db.js';
11
+ import { JobRepo } from '../pipeline/job-repo.js';
12
+ function parseArg(args, flag) {
13
+ const i = args.indexOf(flag);
14
+ return i >= 0 ? args[i + 1] : undefined;
15
+ }
16
+ export async function rebuildCommand(args) {
17
+ const jsonMode = args.includes('--json');
18
+ const dryRun = args.includes('--dry-run');
19
+ const repo = parseArg(args, '--repo');
20
+ const project = parseArg(args, '--project');
21
+ const limitArg = parseArg(args, '--limit');
22
+ const limit = limitArg ? Math.max(1, Number(limitArg)) : undefined;
23
+ // Key-aware + config.yaml-aware open (same resolution as serve/doctor).
24
+ const { db } = openRuntimeDb();
25
+ const conditions = [];
26
+ const params = [];
27
+ if (repo) {
28
+ conditions.push('repo = ?');
29
+ params.push(repo);
30
+ }
31
+ if (project) {
32
+ conditions.push('project = ?');
33
+ params.push(project);
34
+ }
35
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
36
+ const limitClause = limit !== undefined ? ` LIMIT ${limit}` : '';
37
+ const candidates = db
38
+ .prepare(`SELECT id FROM memories ${where} ORDER BY created_at ASC${limitClause}`)
39
+ .all(...params);
40
+ const queuedIds = [];
41
+ if (!dryRun && candidates.length > 0) {
42
+ const repoDao = new JobRepo(db);
43
+ const tx = db.transaction(() => {
44
+ for (const c of candidates) {
45
+ repoDao.enqueue('reembed', { kind: 'reembed', memory_id: c.id });
46
+ queuedIds.push(c.id);
47
+ }
48
+ });
49
+ tx();
50
+ }
51
+ db.close();
52
+ const result = { candidateCount: candidates.length, queuedIds, dryRun };
53
+ if (jsonMode) {
54
+ console.log(JSON.stringify(result, null, 2));
55
+ return;
56
+ }
57
+ console.log('');
58
+ console.log(' AstraMemory Rebuild');
59
+ console.log(' ──────────────────────────────');
60
+ console.log(` Candidates matched: ${result.candidateCount}`);
61
+ if (dryRun) {
62
+ console.log(' --dry-run: no jobs were queued.');
63
+ }
64
+ else {
65
+ console.log(` Reembed jobs queued: ${queuedIds.length}`);
66
+ console.log(' The running daemon will recompute embeddings with the configured provider.');
67
+ }
68
+ console.log('');
69
+ }
70
+ //# sourceMappingURL=rebuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../../src/cli/rebuild.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type DB } from '../storage/db.js';
2
+ import type { EmbedProvider } from '../contracts/embed.js';
3
+ export interface ReembedDimResult {
4
+ targetDim: number;
5
+ totalCandidates: number;
6
+ alreadyDone: number;
7
+ reembedded: number;
8
+ failed: Array<{
9
+ memoryId: string;
10
+ error: string;
11
+ }>;
12
+ schemaRecreated: boolean;
13
+ }
14
+ /**
15
+ * Testable core: no process.exit, no config.yaml writes, no provider
16
+ * resolution — the caller supplies `embed` (already verified to produce
17
+ * `targetDim`-shaped vectors). Safe to call repeatedly against the same DB
18
+ * for the same targetDim (resumable — see module doc).
19
+ */
20
+ export declare function runReembedDim(db: DB, targetDim: number, embed: EmbedProvider, batchSize?: number): Promise<ReembedDimResult>;
21
+ export declare function reembedDimCommand(args: string[]): Promise<void>;