@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,150 @@
1
+ import { exec } from 'node:child_process';
2
+ import { mkdirSync, writeFileSync, existsSync, unlinkSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ const SERVICE_NAME = 'astra-memoryd';
6
+ const UNIT_FILENAME = `${SERVICE_NAME}.service`;
7
+ const BACKUP_SERVICE_FILENAME = `${SERVICE_NAME}-backup.service`;
8
+ const BACKUP_TIMER_FILENAME = `${SERVICE_NAME}-backup.timer`;
9
+ function unitDir() {
10
+ return join(homedir(), '.config', 'systemd', 'user');
11
+ }
12
+ function unitPath() {
13
+ return join(unitDir(), UNIT_FILENAME);
14
+ }
15
+ function backupServicePath() {
16
+ return join(unitDir(), BACKUP_SERVICE_FILENAME);
17
+ }
18
+ function backupTimerPath() {
19
+ return join(unitDir(), BACKUP_TIMER_FILENAME);
20
+ }
21
+ function buildUnit(execStart, port) {
22
+ return [
23
+ '[Unit]',
24
+ 'Description=AstraMemory local memory daemon',
25
+ 'After=network.target',
26
+ '',
27
+ '[Service]',
28
+ 'Type=simple',
29
+ `ExecStart=${execStart} --port ${port}`,
30
+ 'Restart=on-failure',
31
+ 'RestartSec=5',
32
+ `Environment=ASTRA_MEMORY_PORT=${port}`,
33
+ '',
34
+ '[Install]',
35
+ 'WantedBy=default.target',
36
+ '',
37
+ ].join('\n');
38
+ }
39
+ function buildBackupService(execCmd, keep) {
40
+ return [
41
+ '[Unit]',
42
+ 'Description=AstraMemory nightly backup',
43
+ '',
44
+ '[Service]',
45
+ 'Type=oneshot',
46
+ `ExecStart=${execCmd} backup --keep ${keep}`,
47
+ '',
48
+ ].join('\n');
49
+ }
50
+ function buildBackupTimer() {
51
+ return [
52
+ '[Unit]',
53
+ 'Description=AstraMemory nightly backup timer',
54
+ '',
55
+ '[Timer]',
56
+ 'OnCalendar=03:00',
57
+ 'Persistent=true',
58
+ '',
59
+ '[Install]',
60
+ 'WantedBy=timers.target',
61
+ '',
62
+ ].join('\n');
63
+ }
64
+ function runCmd(cmd) {
65
+ return new Promise((resolve, reject) => {
66
+ exec(cmd, { timeout: 10_000 }, (err, stdout, stderr) => {
67
+ if (err)
68
+ reject(new Error(`Command failed: ${cmd}\n${stderr || err.message}`));
69
+ else
70
+ resolve(stdout.trim());
71
+ });
72
+ });
73
+ }
74
+ export class SystemdAdapter {
75
+ platform = 'linux';
76
+ async install(execPath, port) {
77
+ mkdirSync(unitDir(), { recursive: true });
78
+ writeFileSync(unitPath(), buildUnit(execPath, port), 'utf8');
79
+ await runCmd(`systemctl --user daemon-reload`);
80
+ await runCmd(`systemctl --user enable ${SERVICE_NAME}`);
81
+ return { kind: 'task' };
82
+ }
83
+ async uninstall() {
84
+ if (existsSync(unitPath())) {
85
+ try {
86
+ await runCmd(`systemctl --user stop ${SERVICE_NAME}`);
87
+ }
88
+ catch { /* ignore if not running */ }
89
+ try {
90
+ await runCmd(`systemctl --user disable ${SERVICE_NAME}`);
91
+ }
92
+ catch { /* ignore */ }
93
+ unlinkSync(unitPath());
94
+ try {
95
+ await runCmd(`systemctl --user daemon-reload`);
96
+ }
97
+ catch { /* ignore */ }
98
+ }
99
+ }
100
+ async start() {
101
+ await runCmd(`systemctl --user start ${SERVICE_NAME}`);
102
+ }
103
+ async stop() {
104
+ await runCmd(`systemctl --user stop ${SERVICE_NAME}`);
105
+ }
106
+ async status() {
107
+ const installed = existsSync(unitPath());
108
+ if (!installed)
109
+ return { installed: false, running: false };
110
+ try {
111
+ const out = await runCmd(`systemctl --user is-active ${SERVICE_NAME}`);
112
+ const running = out === 'active';
113
+ return { installed, running, detail: out };
114
+ }
115
+ catch {
116
+ return { installed, running: false, detail: 'inactive' };
117
+ }
118
+ }
119
+ async installBackupTimer(execPath, keep) {
120
+ mkdirSync(unitDir(), { recursive: true });
121
+ const execCmd = execPath; // already formatted as `"node" "index.js"`
122
+ writeFileSync(backupServicePath(), buildBackupService(execCmd, keep), 'utf8');
123
+ writeFileSync(backupTimerPath(), buildBackupTimer(), 'utf8');
124
+ await runCmd(`systemctl --user daemon-reload`);
125
+ await runCmd(`systemctl --user enable --now ${SERVICE_NAME}-backup.timer`);
126
+ }
127
+ async uninstallBackupTimer() {
128
+ const timerPath = backupTimerPath();
129
+ const svcPath = backupServicePath();
130
+ if (existsSync(timerPath)) {
131
+ try {
132
+ await runCmd(`systemctl --user stop ${SERVICE_NAME}-backup.timer`);
133
+ }
134
+ catch { /* ignore */ }
135
+ try {
136
+ await runCmd(`systemctl --user disable ${SERVICE_NAME}-backup.timer`);
137
+ }
138
+ catch { /* ignore */ }
139
+ unlinkSync(timerPath);
140
+ }
141
+ if (existsSync(svcPath)) {
142
+ unlinkSync(svcPath);
143
+ }
144
+ try {
145
+ await runCmd(`systemctl --user daemon-reload`);
146
+ }
147
+ catch { /* ignore */ }
148
+ }
149
+ }
150
+ //# sourceMappingURL=systemd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd.js","sourceRoot":"","sources":["../../src/service/systemd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * task-xml.ts — Task Scheduler XML for the daemon task (D1).
3
+ *
4
+ * Why XML instead of `schtasks /create /sc onlogon ...`:
5
+ * - CLI-created tasks carry a DEFAULT ExecutionTimeLimit of 72 hours —
6
+ * Task Scheduler silently kills the daemon after 3 days. Only XML can
7
+ * express PT0S (no limit).
8
+ * - Only XML can express a logon trigger WITH a repetition interval —
9
+ * the PT5M repetition is our no-admin watchdog: a healthy daemon makes
10
+ * the re-run exit in <100ms (single-instance lock), a dead daemon gets
11
+ * restarted within 5 minutes.
12
+ * - MultipleInstancesPolicy=IgnoreNew prevents pile-ups if a run is slow.
13
+ * - StartWhenAvailable=true catches up a missed logon trigger.
14
+ */
15
+ export interface TaskXmlOpts {
16
+ /** Full command to execute (the stable shim .cmd path). */
17
+ command: string;
18
+ /** Optional arguments string. */
19
+ args?: string;
20
+ /** Working directory for the task. */
21
+ workingDir?: string;
22
+ /** User id for the principal — DOMAIN\user or plain username. */
23
+ userId: string;
24
+ description?: string;
25
+ }
26
+ /**
27
+ * Daily-trigger variant (backup timer): CalendarTrigger at `startTime`
28
+ * every day. Same Settings block reasons as the daemon task — most
29
+ * importantly registered via XML so it installs without elevation on the
30
+ * same boxes where the CLI form gets "Access is denied".
31
+ */
32
+ export declare function buildDailyTaskXml(opts: TaskXmlOpts & {
33
+ startTime?: string;
34
+ description?: string;
35
+ }): string;
36
+ export declare function buildTaskXml(opts: TaskXmlOpts): string;
@@ -0,0 +1,91 @@
1
+ /**
2
+ * task-xml.ts — Task Scheduler XML for the daemon task (D1).
3
+ *
4
+ * Why XML instead of `schtasks /create /sc onlogon ...`:
5
+ * - CLI-created tasks carry a DEFAULT ExecutionTimeLimit of 72 hours —
6
+ * Task Scheduler silently kills the daemon after 3 days. Only XML can
7
+ * express PT0S (no limit).
8
+ * - Only XML can express a logon trigger WITH a repetition interval —
9
+ * the PT5M repetition is our no-admin watchdog: a healthy daemon makes
10
+ * the re-run exit in <100ms (single-instance lock), a dead daemon gets
11
+ * restarted within 5 minutes.
12
+ * - MultipleInstancesPolicy=IgnoreNew prevents pile-ups if a run is slow.
13
+ * - StartWhenAvailable=true catches up a missed logon trigger.
14
+ */
15
+ function xmlEscape(s) {
16
+ return s
17
+ .replace(/&/g, '&amp;')
18
+ .replace(/</g, '&lt;')
19
+ .replace(/>/g, '&gt;')
20
+ .replace(/"/g, '&quot;')
21
+ .replace(/'/g, '&apos;');
22
+ }
23
+ /**
24
+ * Daily-trigger variant (backup timer): CalendarTrigger at `startTime`
25
+ * every day. Same Settings block reasons as the daemon task — most
26
+ * importantly registered via XML so it installs without elevation on the
27
+ * same boxes where the CLI form gets "Access is denied".
28
+ */
29
+ export function buildDailyTaskXml(opts) {
30
+ const startTime = opts.startTime ?? '03:00:00';
31
+ const base = buildTaskXml(opts);
32
+ // Swap the logon trigger for a daily calendar trigger; keep everything else.
33
+ const trigger = ` <CalendarTrigger>
34
+ <StartBoundary>2026-01-01T${startTime}</StartBoundary>
35
+ <Enabled>true</Enabled>
36
+ <ScheduleByDay>
37
+ <DaysInterval>1</DaysInterval>
38
+ </ScheduleByDay>
39
+ </CalendarTrigger>`;
40
+ return base.replace(/ <LogonTrigger>[\s\S]*?<\/LogonTrigger>/, trigger);
41
+ }
42
+ export function buildTaskXml(opts) {
43
+ const description = opts.description ?? 'AstraMemory local memory daemon (astramem-local). Managed by astramem-local service install / reinstall.';
44
+ return `<?xml version="1.0" encoding="UTF-16"?>
45
+ <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
46
+ <RegistrationInfo>
47
+ <Description>${xmlEscape(description)}</Description>
48
+ </RegistrationInfo>
49
+ <Triggers>
50
+ <LogonTrigger>
51
+ <Enabled>true</Enabled>
52
+ <UserId>${xmlEscape(opts.userId)}</UserId>
53
+ <Repetition>
54
+ <Interval>PT5M</Interval>
55
+ <StopAtDurationEnd>false</StopAtDurationEnd>
56
+ </Repetition>
57
+ </LogonTrigger>
58
+ </Triggers>
59
+ <Principals>
60
+ <Principal id="Author">
61
+ <UserId>${xmlEscape(opts.userId)}</UserId>
62
+ <LogonType>InteractiveToken</LogonType>
63
+ <RunLevel>LeastPrivilege</RunLevel>
64
+ </Principal>
65
+ </Principals>
66
+ <Settings>
67
+ <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
68
+ <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
69
+ <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
70
+ <AllowHardTerminate>true</AllowHardTerminate>
71
+ <StartWhenAvailable>true</StartWhenAvailable>
72
+ <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
73
+ <AllowStartOnDemand>true</AllowStartOnDemand>
74
+ <Enabled>true</Enabled>
75
+ <Hidden>false</Hidden>
76
+ <RunOnlyIfIdle>false</RunOnlyIfIdle>
77
+ <WakeToRun>false</WakeToRun>
78
+ <ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
79
+ <Priority>7</Priority>
80
+ </Settings>
81
+ <Actions Context="Author">
82
+ <Exec>
83
+ <Command>${xmlEscape(opts.command)}</Command>${opts.args ? `
84
+ <Arguments>${xmlEscape(opts.args)}</Arguments>` : ''}${opts.workingDir ? `
85
+ <WorkingDirectory>${xmlEscape(opts.workingDir)}</WorkingDirectory>` : ''}
86
+ </Exec>
87
+ </Actions>
88
+ </Task>
89
+ `;
90
+ }
91
+ //# sourceMappingURL=task-xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-xml.js","sourceRoot":"","sources":["../../src/service/task-xml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAcH,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAgE;IAChG,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC;IAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,6EAA6E;IAC7E,MAAM,OAAO,GAAG;kCACgB,SAAS;;;;;uBAKpB,CAAC;IACtB,OAAO,IAAI,CAAC,OAAO,CAAC,4CAA4C,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAiB;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,0GAA0G,CAAC;IACnJ,OAAO;;;mBAGU,SAAS,CAAC,WAAW,CAAC;;;;;gBAKzB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;;;;;;;;;gBAStB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;iBAsBrB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;mBAC9C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;0BACrD,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE;;;;CAI7E,CAAC;AACF,CAAC"}
@@ -0,0 +1,47 @@
1
+ export interface ServiceStatus {
2
+ installed: boolean;
3
+ running: boolean;
4
+ pid?: number;
5
+ detail?: string;
6
+ }
7
+ /**
8
+ * Discriminated union returned by ServiceAdapter.install().
9
+ *
10
+ * - `task` — a scheduled task (schtasks) / systemd unit / launchd plist was
11
+ * created. `service start/stop/status` will work normally.
12
+ * - `startup` — OS-level task creation failed; a Startup-folder shortcut was
13
+ * installed as fallback. `service start/stop` will NOT work.
14
+ * `path` is the absolute path to the shortcut file.
15
+ */
16
+ export type InstallResult = {
17
+ kind: 'task';
18
+ } | {
19
+ kind: 'startup';
20
+ path: string;
21
+ };
22
+ export interface ServiceAdapter {
23
+ readonly platform: 'linux' | 'darwin' | 'win32';
24
+ /** Write unit file / plist / task. Does NOT start or enable. */
25
+ install(execPath: string, port: number): Promise<InstallResult>;
26
+ /** Remove unit file / plist / task. */
27
+ uninstall(): Promise<void>;
28
+ /** Start the service via the OS init system. */
29
+ start(): Promise<void>;
30
+ /** Stop the service via the OS init system. */
31
+ stop(): Promise<void>;
32
+ /** Query current status. */
33
+ status(): Promise<ServiceStatus>;
34
+ /**
35
+ * Install a nightly backup timer (optional — invoked by
36
+ * `service install --with-backup-timer`).
37
+ *
38
+ * @param execPath Same exec path used for the main service.
39
+ * @param keep Number of backups to retain (forwarded to --keep).
40
+ */
41
+ installBackupTimer(execPath: string, keep: number): Promise<void>;
42
+ /**
43
+ * Remove the nightly backup timer installed by installBackupTimer().
44
+ * No-op if the timer was never installed.
45
+ */
46
+ uninstallBackupTimer(): Promise<void>;
47
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/service/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Memory TTL / archival tiers policy pass (FEAT-404, W4.4).
3
+ *
4
+ * Runs on the cleanup job's cadence (src/pipeline/handlers/cleanup.ts).
5
+ * Both conditions are required to archive an atom (AC-2/AC-3):
6
+ * - older than config.archival.ageThresholdDays (measured from created_at)
7
+ * - trailing-7-day usefulness rate at/below config.archival.usefulnessFloor
8
+ *
9
+ * Non-destructive (AC-5): every archived row survives — MemoryEventRepo.archive
10
+ * sets valid_to + archived/archived_at in the same transaction supersede()/
11
+ * invalidate() already established, restorable via MemoryEventRepo.restore().
12
+ * Off by default (AC-1): config.archival.enabled === false is a hard no-op.
13
+ */
14
+ import type { DB } from './db.js';
15
+ import type { Config } from '../config/config.js';
16
+ export interface ArchivalRunResult {
17
+ /** Number of memories archived by this pass. */
18
+ archived: number;
19
+ /** Number of memories that met the age threshold and were evaluated
20
+ * against the usefulness floor (archived + age-eligible-but-protected). */
21
+ candidates: number;
22
+ }
23
+ /**
24
+ * Select every currently-valid, not-yet-archived memory older than the age
25
+ * threshold, evaluate each against the usefulness floor, and archive the
26
+ * ones that clear both bars. Returns { archived: 0, candidates: 0 }
27
+ * immediately when the policy is disabled (AC-1).
28
+ */
29
+ export declare function runArchivalPass(db: DB, config: Config, now?: number): ArchivalRunResult;
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Memory TTL / archival tiers policy pass (FEAT-404, W4.4).
3
+ *
4
+ * Runs on the cleanup job's cadence (src/pipeline/handlers/cleanup.ts).
5
+ * Both conditions are required to archive an atom (AC-2/AC-3):
6
+ * - older than config.archival.ageThresholdDays (measured from created_at)
7
+ * - trailing-7-day usefulness rate at/below config.archival.usefulnessFloor
8
+ *
9
+ * Non-destructive (AC-5): every archived row survives — MemoryEventRepo.archive
10
+ * sets valid_to + archived/archived_at in the same transaction supersede()/
11
+ * invalidate() already established, restorable via MemoryEventRepo.restore().
12
+ * Off by default (AC-1): config.archival.enabled === false is a hard no-op.
13
+ */
14
+ import { MemoryEventRepo } from './memory-events.js';
15
+ import { perAtomUsefulnessRate7d } from './usefulness.js';
16
+ const DAY_MS = 24 * 60 * 60 * 1000;
17
+ const SEVEN_DAYS_MS = 7 * DAY_MS;
18
+ /**
19
+ * Select every currently-valid, not-yet-archived memory older than the age
20
+ * threshold, evaluate each against the usefulness floor, and archive the
21
+ * ones that clear both bars. Returns { archived: 0, candidates: 0 }
22
+ * immediately when the policy is disabled (AC-1).
23
+ */
24
+ export function runArchivalPass(db, config, now = Date.now()) {
25
+ if (!config.archival.enabled)
26
+ return { archived: 0, candidates: 0 };
27
+ const ageCutoffMs = now - config.archival.ageThresholdDays * DAY_MS;
28
+ const candidateRows = db.prepare(`
29
+ SELECT id FROM memories
30
+ WHERE valid_to IS NULL AND archived = 0 AND created_at < ?
31
+ `).all(ageCutoffMs);
32
+ if (candidateRows.length === 0)
33
+ return { archived: 0, candidates: 0 };
34
+ const candidateIds = candidateRows.map(r => r.id);
35
+ const rates = perAtomUsefulnessRate7d(db, candidateIds, now - SEVEN_DAYS_MS);
36
+ const events = new MemoryEventRepo(db);
37
+ let archived = 0;
38
+ for (const id of candidateIds) {
39
+ const rate = rates.get(id) ?? 0;
40
+ if (rate <= config.archival.usefulnessFloor) {
41
+ events.archive(id, 'ttl-policy');
42
+ archived++;
43
+ }
44
+ }
45
+ return { archived, candidates: candidateIds.length };
46
+ }
47
+ //# sourceMappingURL=archival.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archival.js","sourceRoot":"","sources":["../../src/storage/archival.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACnC,MAAM,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC;AAUjC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,EAAM,EAAE,MAAc,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IAC9E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IAEpE,MAAM,WAAW,GAAG,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,gBAAgB,GAAG,MAAM,CAAC;IACpE,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGhC,CAAC,CAAC,GAAG,CAAC,WAAW,CAA0B,CAAC;IAE7C,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IAEtE,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,uBAAuB,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,GAAG,aAAa,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC;IAEvC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;YACjC,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,34 @@
1
+ export type BearerSource = 'cli' | 'env' | 'credential-store' | 'secrets-env' | 'default';
2
+ export interface ResolvedBearer {
3
+ token: string;
4
+ source: BearerSource;
5
+ }
6
+ export interface ResolveBearerOpts {
7
+ /** Value of the CLI `--token` flag, if provided. */
8
+ cliToken?: string;
9
+ /** Value of `ASTRA_MEMORY_TOKEN`, if set. */
10
+ envToken?: string;
11
+ /**
12
+ * Config dirs to probe for secrets.env, in priority order. Defaults to
13
+ * [defaultConfigDir(), legacyConfigDir()]. Injectable so tests can isolate
14
+ * the filesystem probe without env-var games — on darwin the real dirs
15
+ * ignore XDG_CONFIG_HOME entirely, so env stubbing does NOT isolate there.
16
+ */
17
+ secretsDirs?: string[];
18
+ }
19
+ /**
20
+ * Read MEMORY_BEARER from secrets.env — canonical config dir first, then the
21
+ * legacy dir (%APPDATA%\AstraMemory on Windows). Read-only; never mutates
22
+ * either file. Mirrors the pre-SEC-10 `readBearerFromSecrets` in serve.ts.
23
+ */
24
+ export declare function readBearerFromSecretsFile(secretsDirs?: string[]): string | null;
25
+ /**
26
+ * Resolve the daemon's bearer token per the precedence documented above.
27
+ *
28
+ * Side effect: when the token is found only in secrets.env, it is
29
+ * opportunistically written into the OS credential store (best-effort —
30
+ * failure is silently tolerated since storeBearer already owns its own
31
+ * WARN-on-fallback logging). This is a one-way promotion; secrets.env is
32
+ * never rewritten or deleted here.
33
+ */
34
+ export declare function resolveBearerToken(opts?: ResolveBearerOpts): ResolvedBearer;
@@ -0,0 +1,75 @@
1
+ /**
2
+ * bearer-keystore.ts — bearer token resolution + one-way credential-store
3
+ * migration (SEC-10, Wave 1 task 1d).
4
+ *
5
+ * Resolution order (used by serve.ts):
6
+ * 1. CLI `--token` flag
7
+ * 2. `ASTRA_MEMORY_TOKEN` env var
8
+ * 3. OS credential store (service 'astramem-local', account 'bearer' —
9
+ * see storage/keystore.ts)
10
+ * 4. secrets.env — canonical config dir, then legacy dir (kept as a
11
+ * read-only fallback; existing files are never deleted)
12
+ * 5. 'devtok' default (dev/test convenience, matches pre-SEC-10 behavior)
13
+ *
14
+ * When the bearer is found only in secrets.env (step 4), it is
15
+ * opportunistically promoted into the credential store — a one-way
16
+ * migration, best-effort, and the secrets.env file itself is left
17
+ * untouched (no destructive rewrite of a file that might also carry Azure
18
+ * keys).
19
+ */
20
+ import { join } from 'node:path';
21
+ import { existsSync, readFileSync } from 'node:fs';
22
+ import { defaultConfigDir, legacyConfigDir } from '../config/datadir.js';
23
+ import { storeBearer, readBearer } from './keystore.js';
24
+ const DEFAULT_TOKEN = 'devtok';
25
+ /**
26
+ * Read MEMORY_BEARER from secrets.env — canonical config dir first, then the
27
+ * legacy dir (%APPDATA%\AstraMemory on Windows). Read-only; never mutates
28
+ * either file. Mirrors the pre-SEC-10 `readBearerFromSecrets` in serve.ts.
29
+ */
30
+ export function readBearerFromSecretsFile(secretsDirs) {
31
+ const dirs = (secretsDirs ?? [defaultConfigDir(), legacyConfigDir()]).filter((d, i, arr) => arr.indexOf(d) === i);
32
+ for (const dir of dirs) {
33
+ try {
34
+ const path = join(dir, 'secrets.env');
35
+ if (!existsSync(path))
36
+ continue;
37
+ const text = readFileSync(path, 'utf8');
38
+ const match = text.split('\n').find(l => l.startsWith('MEMORY_BEARER='));
39
+ if (!match)
40
+ continue;
41
+ const bearer = match.slice('MEMORY_BEARER='.length).trim();
42
+ if (bearer)
43
+ return bearer;
44
+ }
45
+ catch {
46
+ // continue to next candidate
47
+ }
48
+ }
49
+ return null;
50
+ }
51
+ /**
52
+ * Resolve the daemon's bearer token per the precedence documented above.
53
+ *
54
+ * Side effect: when the token is found only in secrets.env, it is
55
+ * opportunistically written into the OS credential store (best-effort —
56
+ * failure is silently tolerated since storeBearer already owns its own
57
+ * WARN-on-fallback logging). This is a one-way promotion; secrets.env is
58
+ * never rewritten or deleted here.
59
+ */
60
+ export function resolveBearerToken(opts = {}) {
61
+ if (opts.cliToken)
62
+ return { token: opts.cliToken, source: 'cli' };
63
+ if (opts.envToken)
64
+ return { token: opts.envToken, source: 'env' };
65
+ const stored = readBearer();
66
+ if (stored)
67
+ return { token: stored, source: 'credential-store' };
68
+ const fileToken = readBearerFromSecretsFile(opts.secretsDirs);
69
+ if (fileToken) {
70
+ storeBearer(fileToken); // opportunistic one-way promotion; best-effort
71
+ return { token: fileToken, source: 'secrets-env' };
72
+ }
73
+ return { token: DEFAULT_TOKEN, source: 'default' };
74
+ }
75
+ //# sourceMappingURL=bearer-keystore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bearer-keystore.js","sourceRoot":"","sources":["../../src/storage/bearer-keystore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAuBxD,MAAM,aAAa,GAAG,QAAQ,CAAC;AAE/B;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAAsB;IAC9D,MAAM,IAAI,GAAG,CAAC,WAAW,IAAI,CAAC,gBAAgB,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,MAAM,CAC1E,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CACpC,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,SAAS;YAChC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3D,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA0B,EAAE;IAC7D,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAClE,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAElE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAEjE,MAAM,SAAS,GAAG,yBAAyB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9D,IAAI,SAAS,EAAE,CAAC;QACd,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,+CAA+C;QACvE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACrD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACrD,CAAC"}
@@ -0,0 +1,37 @@
1
+ import Database from 'better-sqlite3-multiple-ciphers';
2
+ export type DB = Database.Database;
3
+ export interface OpenDbOpts {
4
+ /**
5
+ * Encryption key (SEC-1/2). Applied via `PRAGMA key` immediately after
6
+ * open, before any other pragma and before the sqlite-vec extension load.
7
+ * Ignored for `:memory:` databases — SQLCipher rejects `PRAGMA key` on
8
+ * in-memory/temporary databases (confirmed by the 1a spike), so in-memory
9
+ * opens are always plaintext regardless of whether a key is supplied.
10
+ */
11
+ key?: string;
12
+ }
13
+ /**
14
+ * Thrown by `openDb` when the file on disk cannot be trusted as an intact
15
+ * datadir (FEAT-420 AC-3), and NO encryption key was in play. Distinct from
16
+ * a raw `SqliteError` so callers and operators get an actionable message
17
+ * instead of a low-level driver string.
18
+ */
19
+ export declare class CorruptDatadirError extends Error {
20
+ constructor(path: string, reason: string);
21
+ }
22
+ /**
23
+ * Thrown by `openDb` when a key WAS supplied but the file could not be read
24
+ * with it (FEAT-420 AC-3 review fix). SQLCipher cannot distinguish
25
+ * "wrong/missing key" from "corrupted file" at the driver level — both
26
+ * surface as the exact same `SqliteError: file is not a database`
27
+ * (SQLITE_NOTADB), which is also the documented stale-v0.3.4-global-install
28
+ * symptom (CLAUDE.md "Do NOT use bare astramem-local"). Reusing
29
+ * CorruptDatadirError's corruption-and-delete advice here would actively
30
+ * steer an operator with a recoverable key/config problem toward destroying
31
+ * a healthy encrypted database — so this is a distinct class with distinct,
32
+ * non-destructive advice and NO deletion suggestion.
33
+ */
34
+ export declare class EncryptionKeyError extends Error {
35
+ constructor(path: string, reason: string);
36
+ }
37
+ export declare function openDb(path: string, opts?: OpenDbOpts): DB;