@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,77 @@
1
+ /**
2
+ * token subcommand — `astramem-local token rotate`
3
+ *
4
+ * Generates a fresh 32-byte (64 hex char) random Bearer token, stores it in
5
+ * the OS credential store (SEC-10), and prints the `export MEMORY_BEARER=...`
6
+ * line so the user can paste it. secrets.env is written ONLY as a fallback
7
+ * when the credential store is unavailable (mode 0600 on Unix) — mirrors the
8
+ * db-key degradation pattern in storage/keystore.ts.
9
+ */
10
+ import { randomBytes } from 'node:crypto';
11
+ import { readFileSync, existsSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ import { writeSecrets } from '../config/secrets.js';
14
+ import { defaultConfigDir } from '../config/datadir.js';
15
+ import { storeBearer } from '../storage/keystore.js';
16
+ /** Generate a cryptographically secure 32-byte hex token (64 chars). */
17
+ export function generateToken() {
18
+ return randomBytes(32).toString('hex');
19
+ }
20
+ /**
21
+ * Rotate the Bearer token stored in secrets.env.
22
+ *
23
+ * Reads any existing secrets.env to preserve azure keys, then overwrites
24
+ * with a freshly generated MEMORY_BEARER.
25
+ *
26
+ * @param secretsPath - Absolute path to secrets.env. Defaults to
27
+ * `defaultConfigDir()/secrets.env`.
28
+ * @returns The new Bearer token string (64 hex chars).
29
+ */
30
+ export function rotateToken(secretsPath) {
31
+ const path = secretsPath ?? join(defaultConfigDir(), 'secrets.env');
32
+ const newToken = generateToken();
33
+ // Preserve any existing azure keys from the current secrets.env.
34
+ let azureKey;
35
+ let azureEndpoint;
36
+ let azureDeployment;
37
+ if (existsSync(path)) {
38
+ const content = readFileSync(path, 'utf8');
39
+ for (const rawLine of content.split('\n')) {
40
+ const trimmed = rawLine.trim();
41
+ if (trimmed.startsWith('AZURE_OPENAI_API_KEY=')) {
42
+ azureKey = trimmed.slice('AZURE_OPENAI_API_KEY='.length);
43
+ }
44
+ else if (trimmed.startsWith('AZURE_OPENAI_ENDPOINT=')) {
45
+ azureEndpoint = trimmed.slice('AZURE_OPENAI_ENDPOINT='.length);
46
+ }
47
+ else if (trimmed.startsWith('AZURE_OPENAI_DEPLOYMENT=')) {
48
+ azureDeployment = trimmed.slice('AZURE_OPENAI_DEPLOYMENT='.length);
49
+ }
50
+ }
51
+ }
52
+ // SEC-10: try the OS credential store first; only fall back to writing the
53
+ // bearer into secrets.env when the store is unavailable. Azure keys (if
54
+ // any) are unaffected — they still live in secrets.env regardless.
55
+ const { stored } = storeBearer(newToken);
56
+ writeSecrets({ bearer: stored ? undefined : newToken, azureKey, azureEndpoint, azureDeployment }, path);
57
+ return newToken;
58
+ }
59
+ /** CLI entry for `astramem-local token <subcommand>`. */
60
+ export async function tokenCommand(args) {
61
+ const sub = args[0];
62
+ switch (sub) {
63
+ case 'rotate': {
64
+ const token = rotateToken();
65
+ console.log(`Token rotated. Add to your shell rc:\n`);
66
+ console.log(` export MEMORY_BEARER=${token}`);
67
+ console.log('');
68
+ console.log('The old token is now invalid. Restart the daemon to pick up the new token.');
69
+ break;
70
+ }
71
+ default:
72
+ console.error(`token: unknown subcommand '${sub ?? ''}'`);
73
+ console.error('Usage: astramem-local token rotate');
74
+ process.exit(1);
75
+ }
76
+ }
77
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/cli/token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Poll the daemon's /health endpoint until it returns 200 or timeout.
3
+ */
4
+ export declare function waitForHealth(port: number, timeoutMs: number): Promise<boolean>;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Poll the daemon's /health endpoint until it returns 200 or timeout.
3
+ */
4
+ export async function waitForHealth(port, timeoutMs) {
5
+ const url = `http://127.0.0.1:${port}/health`;
6
+ const deadline = Date.now() + timeoutMs;
7
+ while (Date.now() < deadline) {
8
+ try {
9
+ const ctrl = new AbortController();
10
+ const t = setTimeout(() => ctrl.abort(), 1500);
11
+ const res = await fetch(url, { signal: ctrl.signal });
12
+ clearTimeout(t);
13
+ if (res.ok)
14
+ return true;
15
+ }
16
+ catch {
17
+ // keep polling
18
+ }
19
+ await new Promise(r => setTimeout(r, 250));
20
+ }
21
+ return false;
22
+ }
23
+ //# sourceMappingURL=wait-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait-health.js","sourceRoot":"","sources":["../../src/cli/wait-health.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,SAAiB;IACjE,MAAM,GAAG,GAAG,oBAAoB,IAAI,SAAS,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;YAC/C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACtD,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,IAAI,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,127 @@
1
+ export interface Config {
2
+ port: number;
3
+ dataDir: string;
4
+ /** FEAT-406: HTTP bind + the derived auth boundary for /health + /version.
5
+ * Default host is loopback-only — changing it is a deliberate opt-in, not
6
+ * a two-flag combination that can drift out of sync (see
7
+ * `isLoopbackHost` in server/lib/network.ts, the single predicate that
8
+ * decides both bind exposure and whether /health + /version require a
9
+ * Bearer token). */
10
+ network: {
11
+ host: string;
12
+ };
13
+ llm: {
14
+ compaction: {
15
+ provider: 'ollama' | 'azure-openai';
16
+ model: string;
17
+ };
18
+ extraction: {
19
+ provider: 'ollama' | 'azure-openai';
20
+ model: string;
21
+ };
22
+ };
23
+ embedding: {
24
+ provider: 'ollama' | 'azure-openai';
25
+ model: string;
26
+ /** FEAT-409: parameterized — single source of truth is
27
+ * DEFAULT_EMBED_DIM (src/contracts/embed.ts). Changing this for a
28
+ * fresh DB is a plain config edit; changing it against an existing DB
29
+ * with live data requires `astramem-local reembed-dim`
30
+ * (docs/embed-dim-migration.md). */
31
+ dim: number;
32
+ };
33
+ vector: {
34
+ store: 'sqlite-vec' | 'lancedb';
35
+ };
36
+ budget: {
37
+ daily_usd: number;
38
+ };
39
+ ollama: {
40
+ baseUrl: string;
41
+ };
42
+ azure: {
43
+ endpoint?: string;
44
+ deployment?: string;
45
+ apiVersion: string;
46
+ };
47
+ /** Fusion weights — α bm25, β cosine, γ importance, δ freshness,
48
+ * ε usefulness (ADR-010 v1.x: recall_used/memory_corrected events feed
49
+ * ranking; atoms with no signal score a neutral 0.5, so ε never reshuffles
50
+ * an unsignaled corpus), ζ entity-relevance bonus (FEAT-402 AC-6: DEFAULT
51
+ * 0 = OFF; a candidate entity-linked to an entity mentioned in the query
52
+ * text gets +ζ. At zeta=0 ranking is byte-identical to no-entity ranking —
53
+ * see the AC-6 snapshot test in tests/eval/retrieval-eval.test.ts). */
54
+ search: {
55
+ alpha: number;
56
+ beta: number;
57
+ gamma: number;
58
+ delta: number;
59
+ epsilon: number;
60
+ zeta: number;
61
+ };
62
+ recallPack: {
63
+ enabled: boolean;
64
+ budgetTokens: number;
65
+ /** Injection-policy v1 (ADR-005 when-to-recall, Wave 4d). */
66
+ policy: {
67
+ enabled: boolean;
68
+ /** Minimum selection score a memory needs to be injected. */
69
+ minScore: number;
70
+ /** Prompts shorter than this get no injection (unless they reference memory). */
71
+ minPromptChars: number;
72
+ };
73
+ };
74
+ /** One-way log shipping to the cloud ledger (ADR-003). Off by default;
75
+ * requires url + workspaceId + a device token in the keystore
76
+ * (or ASTRA_SYNC_TOKEN). personal-scoped atoms never ship (ADR-009). */
77
+ sync: {
78
+ enabled: boolean;
79
+ url: string;
80
+ workspaceId: string | null;
81
+ batchSize: number;
82
+ intervalMs: number;
83
+ };
84
+ security: {
85
+ redaction: {
86
+ enabled: boolean;
87
+ /** Shannon-entropy threshold in bits/char for the fallback secret detector. */
88
+ entropyThreshold: number;
89
+ /** Org-specific regex sources applied as detector type 'custom'. */
90
+ customPatterns: string[];
91
+ };
92
+ /** Encryption at rest (SEC-1/2/7/9). Disabling is a deliberate trust
93
+ * trade-off — the daemon logs a prominent WARN at startup (AC-6). */
94
+ encryption: {
95
+ enabled: boolean;
96
+ };
97
+ };
98
+ /** Repo/project tag-hygiene backfill (FEAT-403, W4.3). */
99
+ tagHygiene: {
100
+ /** Tier-2 prompt-assisted inference is opt-in — a data-mutating heuristic
101
+ * pass over legacy rows carries real mis-tag risk (PM pre-mortem), so it
102
+ * never runs silently. Enable via config or the CLI's `--tier2` flag. */
103
+ tier2Enabled: boolean;
104
+ /** Minimum tier-2 confidence required to apply an inferred tag; below
105
+ * this the memory is left untagged rather than risk a mis-tag (AC-4). */
106
+ tier2ConfidenceThreshold: number;
107
+ };
108
+ /** Memory TTL / archival tiers (FEAT-404, W4.4). Both conditions are
109
+ * required to archive an atom: older than ageThresholdDays AND its
110
+ * trailing-7-day usefulness rate at/below usefulnessFloor. Off by default
111
+ * — the PM pre-mortem risk is silently archiving a rarely-used-but-
112
+ * critical memory, so enabling is a deliberate opt-in. Runs on the
113
+ * cleanup job's cadence (src/pipeline/handlers/cleanup.ts). */
114
+ archival: {
115
+ enabled: boolean;
116
+ /** Age is measured from created_at (how old the atom itself is), not
117
+ * valid_from (which supersede() can advance). Default 183 days (~6
118
+ * months), per the FEAT-404 AC-6 proposal. */
119
+ ageThresholdDays: number;
120
+ /** rate_7d <= this floor makes an atom archival-eligible (combined
121
+ * with the age check). Default 0.0 — no explicit recall_used signal
122
+ * in the trailing 7 days. */
123
+ usefulnessFloor: number;
124
+ };
125
+ }
126
+ export declare function defaultConfig(): Config;
127
+ export declare function loadConfig(overrides: Partial<Config> | undefined): Config;
@@ -0,0 +1,38 @@
1
+ import { defaultDataDir } from './datadir.js';
2
+ import { DEFAULT_EMBED_DIM } from '../contracts/embed.js';
3
+ export function defaultConfig() {
4
+ return {
5
+ port: 7777,
6
+ dataDir: defaultDataDir(),
7
+ network: { host: '127.0.0.1' },
8
+ llm: {
9
+ compaction: { provider: 'ollama', model: 'qwen2.5-coder:7b' },
10
+ extraction: { provider: 'ollama', model: 'qwen2.5-coder:7b' }
11
+ },
12
+ embedding: { provider: 'ollama', model: 'mxbai-embed-large', dim: DEFAULT_EMBED_DIM },
13
+ vector: { store: 'sqlite-vec' },
14
+ budget: { daily_usd: 10 },
15
+ ollama: { baseUrl: 'http://127.0.0.1:11434' },
16
+ azure: { apiVersion: '2024-10-21' },
17
+ search: { alpha: 0.4, beta: 0.4, gamma: 0.1, delta: 0.1, epsilon: 0.1, zeta: 0 },
18
+ recallPack: {
19
+ enabled: false,
20
+ budgetTokens: 1500,
21
+ policy: { enabled: true, minScore: 0.15, minPromptChars: 12 },
22
+ },
23
+ sync: { enabled: false, url: '', workspaceId: null, batchSize: 200, intervalMs: 30_000 },
24
+ security: {
25
+ redaction: { enabled: true, entropyThreshold: 4.0, customPatterns: [] },
26
+ encryption: { enabled: true }
27
+ },
28
+ tagHygiene: { tier2Enabled: false, tier2ConfidenceThreshold: 0.7 },
29
+ archival: { enabled: false, ageThresholdDays: 183, usefulnessFloor: 0.0 }
30
+ };
31
+ }
32
+ export function loadConfig(overrides) {
33
+ const base = defaultConfig();
34
+ if (!overrides)
35
+ return base;
36
+ return { ...base, ...overrides };
37
+ }
38
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAuG1D,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,cAAc,EAAE;QACzB,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC9B,GAAG,EAAE;YACH,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE;YAC7D,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE;SAC9D;QACD,SAAS,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,EAAE,GAAG,EAAE,iBAAiB,EAAE;QACrF,MAAM,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE;QAC/B,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACzB,MAAM,EAAE,EAAE,OAAO,EAAE,wBAAwB,EAAE;QAC7C,KAAK,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE;QACnC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE;QAChF,UAAU,EAAE;YACV,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE;SAC9D;QACD,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE;QACxF,QAAQ,EAAE;YACR,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE;YACvE,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;SAC9B;QACD,UAAU,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE;QAClE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAsC;IAC/D,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Returns the canonical data directory for astramemory-local.
3
+ *
4
+ * Windows: %LOCALAPPDATA%\Astramem (matches plugin convention; was AstraMemory in <=0.2.2)
5
+ * macOS : ~/Library/Application Support/astra-memory
6
+ * Linux : $XDG_DATA_HOME/astra-memory (default ~/.local/share/astra-memory)
7
+ */
8
+ export declare function defaultDataDir(): string;
9
+ /**
10
+ * Returns the canonical config directory for astramemory-local.
11
+ *
12
+ * Windows: %APPDATA%\Astramem (matches plugin convention; was AstraMemory in <=0.2.2)
13
+ * macOS : ~/Library/Application Support/astra-memory
14
+ * Linux : $XDG_CONFIG_HOME/astra-memory (default ~/.config/astra-memory)
15
+ */
16
+ export declare function defaultConfigDir(): string;
17
+ /**
18
+ * Returns the LEGACY config directory used by daemon <=0.2.2 on Windows.
19
+ * Non-Windows returns the same value as defaultConfigDir() (no legacy split).
20
+ *
21
+ * Used exclusively by migration and fallback bearer-reader code.
22
+ */
23
+ export declare function legacyConfigDir(): string;
24
+ /**
25
+ * Returns the LEGACY data directory used by daemon <=0.2.2 on Windows.
26
+ * Non-Windows returns the same value as defaultDataDir() (no legacy split).
27
+ *
28
+ * Used exclusively by migration and fallback bearer-reader code.
29
+ */
30
+ export declare function legacyDataDir(): string;
@@ -0,0 +1,65 @@
1
+ import { homedir, platform } from 'node:os';
2
+ import { join } from 'node:path';
3
+ /**
4
+ * Returns the canonical data directory for astramemory-local.
5
+ *
6
+ * Windows: %LOCALAPPDATA%\Astramem (matches plugin convention; was AstraMemory in <=0.2.2)
7
+ * macOS : ~/Library/Application Support/astra-memory
8
+ * Linux : $XDG_DATA_HOME/astra-memory (default ~/.local/share/astra-memory)
9
+ */
10
+ export function defaultDataDir() {
11
+ const home = homedir();
12
+ switch (platform()) {
13
+ case 'win32':
14
+ return join(process.env.LOCALAPPDATA ?? join(home, 'AppData', 'Local'), 'Astramem');
15
+ case 'darwin':
16
+ return join(home, 'Library', 'Application Support', 'astra-memory');
17
+ default:
18
+ return join(process.env.XDG_DATA_HOME ?? join(home, '.local', 'share'), 'astra-memory');
19
+ }
20
+ }
21
+ /**
22
+ * Returns the canonical config directory for astramemory-local.
23
+ *
24
+ * Windows: %APPDATA%\Astramem (matches plugin convention; was AstraMemory in <=0.2.2)
25
+ * macOS : ~/Library/Application Support/astra-memory
26
+ * Linux : $XDG_CONFIG_HOME/astra-memory (default ~/.config/astra-memory)
27
+ */
28
+ export function defaultConfigDir() {
29
+ const home = homedir();
30
+ switch (platform()) {
31
+ case 'win32':
32
+ return join(process.env.APPDATA ?? join(home, 'AppData', 'Roaming'), 'Astramem');
33
+ case 'darwin':
34
+ return join(home, 'Library', 'Application Support', 'astra-memory');
35
+ default:
36
+ return join(process.env.XDG_CONFIG_HOME ?? join(home, '.config'), 'astra-memory');
37
+ }
38
+ }
39
+ /**
40
+ * Returns the LEGACY config directory used by daemon <=0.2.2 on Windows.
41
+ * Non-Windows returns the same value as defaultConfigDir() (no legacy split).
42
+ *
43
+ * Used exclusively by migration and fallback bearer-reader code.
44
+ */
45
+ export function legacyConfigDir() {
46
+ const home = homedir();
47
+ if (platform() === 'win32') {
48
+ return join(process.env.APPDATA ?? join(home, 'AppData', 'Roaming'), 'AstraMemory');
49
+ }
50
+ return defaultConfigDir();
51
+ }
52
+ /**
53
+ * Returns the LEGACY data directory used by daemon <=0.2.2 on Windows.
54
+ * Non-Windows returns the same value as defaultDataDir() (no legacy split).
55
+ *
56
+ * Used exclusively by migration and fallback bearer-reader code.
57
+ */
58
+ export function legacyDataDir() {
59
+ const home = homedir();
60
+ if (platform() === 'win32') {
61
+ return join(process.env.LOCALAPPDATA ?? join(home, 'AppData', 'Local'), 'AstraMemory');
62
+ }
63
+ return defaultDataDir();
64
+ }
65
+ //# sourceMappingURL=datadir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datadir.js","sourceRoot":"","sources":["../../src/config/datadir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,QAAQ,QAAQ,EAAE,EAAE,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;QACtF,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,cAAc,CAAC,CAAC;QACtE;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,QAAQ,QAAQ,EAAE,EAAE,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;QACnF,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,cAAc,CAAC,CAAC;QACtE;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,aAAa,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,gBAAgB,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,cAAc,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * loadConfigFromDisk — read <configDir>/config.yaml (written by `init` /
3
+ * writer.ts) and merge it over defaultConfig(). Until now the file was
4
+ * write-only: init produced it but the daemon booted from defaults, so user
5
+ * edits were silently ignored.
6
+ *
7
+ * The parser handles exactly the subset writer.ts emits — nested maps of
8
+ * scalars (string/number/boolean, single-quoted strings), '#' comments,
9
+ * blank lines. No lists, no multi-line strings, no anchors; if the file
10
+ * grows past that, swap in a real YAML package (see writer.ts header).
11
+ * Unknown keys are ignored; a malformed file logs a warning and falls back
12
+ * to defaults rather than blocking daemon boot.
13
+ */
14
+ import { type Config } from './config.js';
15
+ type PlainObject = Record<string, unknown>;
16
+ /** Parse the writer.ts YAML subset into a nested plain object. */
17
+ export declare function parseConfigYaml(text: string): PlainObject;
18
+ /**
19
+ * defaultConfig() with config.yaml (if present and well-formed) merged over
20
+ * it. Never throws — daemon boot must not be blocked by a bad config file.
21
+ */
22
+ export declare function loadConfigFromDisk(configDir: string): Config;
23
+ export {};
@@ -0,0 +1,102 @@
1
+ /**
2
+ * loadConfigFromDisk — read <configDir>/config.yaml (written by `init` /
3
+ * writer.ts) and merge it over defaultConfig(). Until now the file was
4
+ * write-only: init produced it but the daemon booted from defaults, so user
5
+ * edits were silently ignored.
6
+ *
7
+ * The parser handles exactly the subset writer.ts emits — nested maps of
8
+ * scalars (string/number/boolean, single-quoted strings), '#' comments,
9
+ * blank lines. No lists, no multi-line strings, no anchors; if the file
10
+ * grows past that, swap in a real YAML package (see writer.ts header).
11
+ * Unknown keys are ignored; a malformed file logs a warning and falls back
12
+ * to defaults rather than blocking daemon boot.
13
+ */
14
+ import { readFileSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ import { defaultConfig } from './config.js';
17
+ function parseScalar(raw) {
18
+ const v = raw.trim();
19
+ if (v === '')
20
+ return undefined;
21
+ if (v.startsWith("'") && v.endsWith("'"))
22
+ return v.slice(1, -1).replace(/''/g, "'");
23
+ if (v === 'true')
24
+ return true;
25
+ if (v === 'false')
26
+ return false;
27
+ if (v === 'null' || v === '~')
28
+ return null;
29
+ if (/^-?\d+(\.\d+)?$/.test(v))
30
+ return Number(v);
31
+ return v;
32
+ }
33
+ /** Parse the writer.ts YAML subset into a nested plain object. */
34
+ export function parseConfigYaml(text) {
35
+ const root = {};
36
+ // Stack of (indent level → object) for nesting; root is indent -1.
37
+ const stack = [{ indent: -1, obj: root }];
38
+ for (const rawLine of text.split('\n')) {
39
+ const withoutComment = rawLine.replace(/(^|\s)#.*$/, '');
40
+ if (!withoutComment.trim())
41
+ continue;
42
+ const indent = withoutComment.length - withoutComment.trimStart().length;
43
+ const line = withoutComment.trim();
44
+ const colon = line.indexOf(':');
45
+ if (colon <= 0)
46
+ continue; // not a key line — ignore rather than throw
47
+ const key = line.slice(0, colon).trim();
48
+ const rest = line.slice(colon + 1);
49
+ while (stack.length > 1 && indent <= stack[stack.length - 1].indent) {
50
+ stack.pop();
51
+ }
52
+ const parent = stack[stack.length - 1].obj;
53
+ if (rest.trim() === '') {
54
+ const child = {};
55
+ parent[key] = child;
56
+ stack.push({ indent, obj: child });
57
+ }
58
+ else {
59
+ const value = parseScalar(rest);
60
+ if (value !== undefined)
61
+ parent[key] = value;
62
+ }
63
+ }
64
+ return root;
65
+ }
66
+ /** Deep-merge `overrides` into `base`, only following keys base already has structure for. */
67
+ function deepMerge(base, overrides) {
68
+ const out = { ...base };
69
+ for (const [key, value] of Object.entries(overrides)) {
70
+ const existing = out[key];
71
+ if (value !== null && typeof value === 'object' && !Array.isArray(value) &&
72
+ existing !== null && typeof existing === 'object' && !Array.isArray(existing)) {
73
+ out[key] = deepMerge(existing, value);
74
+ }
75
+ else if (value !== undefined) {
76
+ out[key] = value;
77
+ }
78
+ }
79
+ return out;
80
+ }
81
+ /**
82
+ * defaultConfig() with config.yaml (if present and well-formed) merged over
83
+ * it. Never throws — daemon boot must not be blocked by a bad config file.
84
+ */
85
+ export function loadConfigFromDisk(configDir) {
86
+ const base = defaultConfig();
87
+ let text;
88
+ try {
89
+ text = readFileSync(join(configDir, 'config.yaml'), 'utf8');
90
+ }
91
+ catch {
92
+ return base; // no file — defaults
93
+ }
94
+ try {
95
+ return deepMerge(base, parseConfigYaml(text));
96
+ }
97
+ catch (err) {
98
+ console.warn(`[astramem-local] WARNING: config.yaml could not be parsed (${String(err)}) — using defaults.`);
99
+ return base;
100
+ }
101
+ }
102
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * migrate-dirs.ts
3
+ *
4
+ * One-shot, idempotent migration for daemon installs upgrading from <=0.2.2.
5
+ *
6
+ * Background: daemon <=0.2.2 used `%APPDATA%\AstraMemory` (config) and
7
+ * `%LOCALAPPDATA%\AstraMemory` (data) on Windows. The plugin has always used
8
+ * `%APPDATA%\Astramem`. This divergence caused a bearer mismatch (401 on every
9
+ * ingest) because each product's `init` wizard writes its own `secrets.env`
10
+ * to its own directory.
11
+ *
12
+ * Fix: daemon now uses `Astramem` as the canonical dir name (matching the
13
+ * plugin). This module renames the legacy dirs to canonical on first boot
14
+ * after the upgrade. It is safe to call on every boot.
15
+ *
16
+ * Windows-only. On macOS/Linux the legacy and canonical paths are identical
17
+ * (no migration needed) and this function returns immediately.
18
+ */
19
+ export interface MigrationResult {
20
+ configMigrated: boolean;
21
+ dataMigrated: boolean;
22
+ warnings: string[];
23
+ }
24
+ /**
25
+ * Migrate legacy Windows config/data dirs to canonical names if needed.
26
+ *
27
+ * Rules for each dir pair (legacy → canonical):
28
+ * - canonical exists → no-op (already migrated or user did fresh init)
29
+ * - only legacy exists → rename legacy to canonical (log migration)
30
+ * - both exist → no-op, emit warning (user must reconcile manually)
31
+ * - neither exists → no-op (fresh install, nothing to migrate)
32
+ *
33
+ * IMPORTANT: never overwrites canonical if it already contains data. This
34
+ * preserves any bearer the user wrote via `astramem-local init` after upgrading.
35
+ */
36
+ export declare function migrateLegacyDirsIfPresent(): MigrationResult;