@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,132 @@
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
+ import { existsSync, renameSync, copyFileSync } from 'node:fs';
20
+ import { join } from 'node:path';
21
+ import { platform } from 'node:os';
22
+ import { defaultConfigDir, defaultDataDir, legacyConfigDir, legacyDataDir } from './datadir.js';
23
+ /**
24
+ * Migrate legacy Windows config/data dirs to canonical names if needed.
25
+ *
26
+ * Rules for each dir pair (legacy → canonical):
27
+ * - canonical exists → no-op (already migrated or user did fresh init)
28
+ * - only legacy exists → rename legacy to canonical (log migration)
29
+ * - both exist → no-op, emit warning (user must reconcile manually)
30
+ * - neither exists → no-op (fresh install, nothing to migrate)
31
+ *
32
+ * IMPORTANT: never overwrites canonical if it already contains data. This
33
+ * preserves any bearer the user wrote via `astramem-local init` after upgrading.
34
+ */
35
+ export function migrateLegacyDirsIfPresent() {
36
+ const result = {
37
+ configMigrated: false,
38
+ dataMigrated: false,
39
+ warnings: [],
40
+ };
41
+ // Non-Windows: legacy and canonical paths are identical — nothing to do.
42
+ if (platform() !== 'win32') {
43
+ return result;
44
+ }
45
+ const pairs = [
46
+ {
47
+ label: 'config',
48
+ legacy: legacyConfigDir(),
49
+ canonical: defaultConfigDir(),
50
+ migratedKey: 'configMigrated',
51
+ },
52
+ {
53
+ label: 'data',
54
+ legacy: legacyDataDir(),
55
+ canonical: defaultDataDir(),
56
+ migratedKey: 'dataMigrated',
57
+ },
58
+ ];
59
+ for (const { label, legacy, canonical, migratedKey } of pairs) {
60
+ const legacyExists = existsSync(legacy);
61
+ const canonicalExists = existsSync(canonical);
62
+ if (!legacyExists) {
63
+ // Fresh install or already migrated (canonical may or may not exist). No-op.
64
+ continue;
65
+ }
66
+ if (canonicalExists) {
67
+ // Both exist. Reconcile per-file: copy (never move, never overwrite)
68
+ // any file the canonical dir LACKS that the legacy dir has. This
69
+ // rescues the stranded-data case — e.g. a fresh canonical dir created
70
+ // next to a legacy dir that still holds the real memory.sqlite —
71
+ // while never clobbering a valid canonical bearer or database.
72
+ const candidates = label === 'config'
73
+ ? ['secrets.env', 'config.yaml']
74
+ : ['memory.sqlite', 'memory.sqlite-wal', 'memory.sqlite-shm'];
75
+ // Data pair: the DB and its WAL/SHM are one consistency unit — only
76
+ // copy when the canonical dir has NONE of them (a mismatched WAL
77
+ // corrupts the database). Config pair: copy per-file.
78
+ let copyable;
79
+ if (label === 'data') {
80
+ const canonicalHasAny = candidates.some(f => existsSync(join(canonical, f)));
81
+ copyable = canonicalHasAny ? [] : candidates.filter(f => existsSync(join(legacy, f)));
82
+ }
83
+ else {
84
+ copyable = candidates.filter(f => existsSync(join(legacy, f)) && !existsSync(join(canonical, f)));
85
+ }
86
+ let copied = 0;
87
+ for (const f of copyable) {
88
+ try {
89
+ // tmp + rename so a crash mid-copy never leaves a torn file at the
90
+ // canonical path (same pattern as migrate-encrypt.ts).
91
+ const tmp = join(canonical, `${f}.migrating-tmp`);
92
+ copyFileSync(join(legacy, f), tmp);
93
+ renameSync(tmp, join(canonical, f));
94
+ copied++;
95
+ console.log(`[astramem-local] reconciled ${label} file from legacy dir: ${f}`);
96
+ }
97
+ catch (err) {
98
+ result.warnings.push(`Failed to copy legacy ${label} file "${f}": ${err}`);
99
+ }
100
+ }
101
+ if (copied > 0)
102
+ result[migratedKey] = true;
103
+ const bothHaveDb = label === 'data' &&
104
+ existsSync(join(legacy, 'memory.sqlite')) &&
105
+ existsSync(join(canonical, 'memory.sqlite'));
106
+ const warning = bothHaveDb
107
+ ? `Two ${label} dirs BOTH contain memory.sqlite: "${legacy}" and "${canonical}". ` +
108
+ `Using canonical — verify it holds your real data (run 'astramem-local doctor'); ` +
109
+ `the legacy copy was left untouched.`
110
+ : `Two ${label} dirs detected: "${legacy}" and "${canonical}". Using canonical` +
111
+ (copied > 0 ? ` (${copied} missing file(s) copied from legacy).` : '.') +
112
+ ` Legacy dir left untouched; delete manually after verifying.`;
113
+ result.warnings.push(warning);
114
+ console.warn(`[astramem-local] WARN: ${warning}`);
115
+ continue;
116
+ }
117
+ // Only legacy exists → rename to canonical.
118
+ try {
119
+ renameSync(legacy, canonical);
120
+ result[migratedKey] = true;
121
+ console.log(`[astramem-local] migrated legacy ${label} dir: "${legacy}" → "${canonical}"`);
122
+ }
123
+ catch (err) {
124
+ const warning = `Failed to migrate legacy ${label} dir from "${legacy}" to "${canonical}": ${err}. ` +
125
+ `Manual rename required to restore bearer compatibility with the plugin.`;
126
+ result.warnings.push(warning);
127
+ console.warn(`[astramem-local] WARN: ${warning}`);
128
+ }
129
+ }
130
+ return result;
131
+ }
132
+ //# sourceMappingURL=migrate-dirs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-dirs.js","sourceRoot":"","sources":["../../src/config/migrate-dirs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAQhG;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,0BAA0B;IACxC,MAAM,MAAM,GAAoB;QAC9B,cAAc,EAAE,KAAK;QACrB,YAAY,EAAE,KAAK;QACnB,QAAQ,EAAE,EAAE;KACb,CAAC;IAEF,yEAAyE;IACzE,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAKN;QACH;YACE,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,eAAe,EAAE;YACzB,SAAS,EAAE,gBAAgB,EAAE;YAC7B,WAAW,EAAE,gBAAgB;SAC9B;QACD;YACE,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,aAAa,EAAE;YACvB,SAAS,EAAE,cAAc,EAAE;YAC3B,WAAW,EAAE,cAAc;SAC5B;KACF,CAAC;IAEF,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,KAAK,EAAE,CAAC;QAC9D,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAE9C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,6EAA6E;YAC7E,SAAS;QACX,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACpB,qEAAqE;YACrE,iEAAiE;YACjE,sEAAsE;YACtE,iEAAiE;YACjE,+DAA+D;YAC/D,MAAM,UAAU,GACd,KAAK,KAAK,QAAQ;gBAChB,CAAC,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC;gBAChC,CAAC,CAAC,CAAC,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;YAClE,oEAAoE;YACpE,iEAAiE;YACjE,sDAAsD;YACtD,IAAI,QAAkB,CAAC;YACvB,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACrB,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7E,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACxF,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACpG,CAAC;YACD,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,mEAAmE;oBACnE,uDAAuD;oBACvD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBAClD,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBACnC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;oBACpC,MAAM,EAAE,CAAC;oBACT,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,0BAA0B,CAAC,EAAE,CAAC,CAAC;gBACjF,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,KAAK,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;YACD,IAAI,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;YAE3C,MAAM,UAAU,GACd,KAAK,KAAK,MAAM;gBAChB,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;gBACzC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,UAAU;gBACxB,CAAC,CAAC,OAAO,KAAK,sCAAsC,MAAM,UAAU,SAAS,KAAK;oBAChF,kFAAkF;oBAClF,qCAAqC;gBACvC,CAAC,CAAC,OAAO,KAAK,oBAAoB,MAAM,UAAU,SAAS,oBAAoB;oBAC7E,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,uCAAuC,CAAC,CAAC,CAAC,GAAG,CAAC;oBACvE,8DAA8D,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC;YACH,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC9B,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;YAC3B,OAAO,CAAC,GAAG,CACT,oCAAoC,KAAK,UAAU,MAAM,QAAQ,SAAS,GAAG,CAC9E,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GACX,4BAA4B,KAAK,cAAc,MAAM,SAAS,SAAS,MAAM,GAAG,IAAI;gBACpF,yEAAyE,CAAC;YAC5E,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Cross-platform persistence of environment variables for the user's shell.
3
+ *
4
+ * Windows: SetEnvironmentVariable(key, value, "User") via spawned PowerShell.
5
+ * Equivalent to `setx KEY VAL` but doesn't truncate at 1024 chars.
6
+ *
7
+ * Linux/macOS: append/replace an idempotent block to the user's shell rc:
8
+ * - bash → ~/.bashrc
9
+ * - zsh → ~/.zshrc
10
+ * - fish → ~/.config/fish/config.fish
11
+ * Defaults to ~/.profile if shell can't be detected.
12
+ *
13
+ * The block is wrapped in begin/end markers so re-running init does not
14
+ * accumulate duplicate exports.
15
+ */
16
+ export interface PersistResult {
17
+ ok: boolean;
18
+ target: string;
19
+ message: string;
20
+ /** True when the caller likely needs to open a new shell for envs to take effect. */
21
+ requiresNewShell: boolean;
22
+ }
23
+ export declare function persistEnvVars(vars: Record<string, string>): Promise<PersistResult>;
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Cross-platform persistence of environment variables for the user's shell.
3
+ *
4
+ * Windows: SetEnvironmentVariable(key, value, "User") via spawned PowerShell.
5
+ * Equivalent to `setx KEY VAL` but doesn't truncate at 1024 chars.
6
+ *
7
+ * Linux/macOS: append/replace an idempotent block to the user's shell rc:
8
+ * - bash → ~/.bashrc
9
+ * - zsh → ~/.zshrc
10
+ * - fish → ~/.config/fish/config.fish
11
+ * Defaults to ~/.profile if shell can't be detected.
12
+ *
13
+ * The block is wrapped in begin/end markers so re-running init does not
14
+ * accumulate duplicate exports.
15
+ */
16
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
17
+ import { join, dirname } from 'node:path';
18
+ import { homedir, platform } from 'node:os';
19
+ import { execSync } from 'node:child_process';
20
+ import { mkdirSync } from 'node:fs';
21
+ const MARKER_BEGIN = '# >>> astra-memory env >>>';
22
+ const MARKER_END = '# <<< astra-memory env <<<';
23
+ export async function persistEnvVars(vars) {
24
+ if (platform() === 'win32')
25
+ return persistWindows(vars);
26
+ return persistUnix(vars);
27
+ }
28
+ // ─── Windows ─────────────────────────────────────────────────────────────────
29
+ function persistWindows(vars) {
30
+ // Use [Environment]::SetEnvironmentVariable so values longer than 1024 chars
31
+ // are accepted (setx truncates).
32
+ //
33
+ // PowerShell quoting strategy: build the script with SINGLE-quoted string
34
+ // literals so embedded double-quotes do not collide with the outer
35
+ // `powershell -Command "..."` shell quoting. Single-quoted PS strings do
36
+ // not expand $vars or backticks — values pass through literally. Escape
37
+ // embedded single quotes by doubling them (PS rule).
38
+ const ps = Object.entries(vars)
39
+ .map(([k, v]) => {
40
+ const esc = v.replace(/'/g, "''");
41
+ return `[Environment]::SetEnvironmentVariable('${k}', '${esc}', 'User')`;
42
+ })
43
+ .join('; ');
44
+ try {
45
+ execSync(`powershell -NoProfile -Command "${ps}"`, { stdio: 'pipe', timeout: 10_000 });
46
+ return {
47
+ ok: true,
48
+ target: 'Windows User environment',
49
+ message: `Wrote ${Object.keys(vars).length} env var(s) to User scope`,
50
+ requiresNewShell: true,
51
+ };
52
+ }
53
+ catch (err) {
54
+ const msg = err instanceof Error ? err.message : String(err);
55
+ return {
56
+ ok: false,
57
+ target: 'Windows User environment',
58
+ message: `Failed: ${msg.slice(0, 200)}`,
59
+ requiresNewShell: false,
60
+ };
61
+ }
62
+ }
63
+ // ─── Unix (Linux + macOS) ────────────────────────────────────────────────────
64
+ function detectRcPath() {
65
+ const shell = process.env['SHELL'] ?? '';
66
+ const home = homedir();
67
+ if (shell.includes('zsh'))
68
+ return { path: join(home, '.zshrc'), shell: 'zsh' };
69
+ if (shell.includes('fish'))
70
+ return { path: join(home, '.config', 'fish', 'config.fish'), shell: 'fish' };
71
+ if (shell.includes('bash'))
72
+ return { path: join(home, '.bashrc'), shell: 'bash' };
73
+ return { path: join(home, '.profile'), shell: 'sh' };
74
+ }
75
+ function buildExportBlock(vars, shell) {
76
+ const lines = [MARKER_BEGIN];
77
+ for (const [k, v] of Object.entries(vars)) {
78
+ if (shell === 'fish') {
79
+ // single-quoted on fish too — fish doesn't expand inside single quotes
80
+ lines.push(`set -gx ${k} '${v.replace(/'/g, "'\\''")}'`);
81
+ }
82
+ else {
83
+ // POSIX shells — single-quote to avoid expansion of $ etc.
84
+ lines.push(`export ${k}='${v.replace(/'/g, "'\\''")}'`);
85
+ }
86
+ }
87
+ lines.push(MARKER_END);
88
+ return lines.join('\n');
89
+ }
90
+ function persistUnix(vars) {
91
+ const { path, shell } = detectRcPath();
92
+ try {
93
+ mkdirSync(dirname(path), { recursive: true });
94
+ const existing = existsSync(path) ? readFileSync(path, 'utf8') : '';
95
+ const block = buildExportBlock(vars, shell);
96
+ // Replace if the markers exist; otherwise append.
97
+ const re = new RegExp(`${MARKER_BEGIN}[\\s\\S]*?${MARKER_END}`, 'm');
98
+ const next = re.test(existing)
99
+ ? existing.replace(re, block)
100
+ : (existing.endsWith('\n') || existing === '' ? existing : existing + '\n') + '\n' + block + '\n';
101
+ writeFileSync(path, next, 'utf8');
102
+ return {
103
+ ok: true,
104
+ target: path,
105
+ message: `Wrote ${Object.keys(vars).length} env var(s) to ${shell} rc`,
106
+ requiresNewShell: true,
107
+ };
108
+ }
109
+ catch (err) {
110
+ const msg = err instanceof Error ? err.message : String(err);
111
+ return {
112
+ ok: false,
113
+ target: path,
114
+ message: `Failed: ${msg.slice(0, 200)}`,
115
+ requiresNewShell: false,
116
+ };
117
+ }
118
+ }
119
+ //# sourceMappingURL=persist-envs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persist-envs.js","sourceRoot":"","sources":["../../src/config/persist-envs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Config } from './config.js';
2
+ export type ValueSource = 'cli' | 'env' | 'config.yaml' | 'default';
3
+ export interface RuntimeConfig {
4
+ cfg: Config;
5
+ port: number;
6
+ dataDir: string;
7
+ configDir: string;
8
+ /** Where each resolved value came from — surfaced by `reinstall` so users
9
+ * can see WHY the daemon is using a given directory/port. */
10
+ sources: {
11
+ port: ValueSource;
12
+ dataDir: ValueSource;
13
+ };
14
+ }
15
+ export interface RuntimeOverrides {
16
+ port?: number;
17
+ dataDir?: string;
18
+ }
19
+ export declare function resolveRuntimeConfig(overrides?: RuntimeOverrides): RuntimeConfig;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * resolve-runtime.ts — single source of truth for runtime config resolution.
3
+ *
4
+ * Extracted from serve.ts so that serve, doctor, backup, and reinstall all
5
+ * resolve port/dataDir from the SAME inputs with the SAME precedence:
6
+ *
7
+ * port : CLI flag > config.yaml > default
8
+ * dataDir: CLI flag > ASTRA_MEMORY_DATADIR env > config.yaml > default
9
+ *
10
+ * Historically doctor and backup used `defaultConfig()` (never reading
11
+ * config.yaml), so when config.yaml carried a non-default `dataDir` they
12
+ * probed/backed-up a DIFFERENT directory than the daemon was serving from —
13
+ * producing false "file is not a database" doctor failures and backups of
14
+ * the wrong database.
15
+ */
16
+ import { loadConfigFromDisk } from './loader.js';
17
+ import { defaultConfigDir, defaultDataDir } from './datadir.js';
18
+ import { readSyncSettings } from './sync-settings.js';
19
+ import { migrateLegacyDirsIfPresent } from './migrate-dirs.js';
20
+ export function resolveRuntimeConfig(overrides = {}) {
21
+ // Legacy Windows dir rename (AstraMemory → Astramem) must run before any
22
+ // config read so the canonical config.yaml is the one we load. Idempotent.
23
+ migrateLegacyDirsIfPresent();
24
+ const configDir = defaultConfigDir();
25
+ const cfg = loadConfigFromDisk(configDir);
26
+ // `astramem-local pair` persists sync settings to sync.json — merge them
27
+ // over config.yaml so pairing survives restarts.
28
+ const pairedSync = readSyncSettings(configDir);
29
+ if (pairedSync) {
30
+ cfg.sync = { ...cfg.sync, enabled: pairedSync.enabled, url: pairedSync.url, workspaceId: pairedSync.workspaceId };
31
+ }
32
+ // ASTRA_MEMORY_PORT sits between the CLI flag and config.yaml — the
33
+ // systemd unit has always set it (it was a dead env until W1.4).
34
+ const envPort = process.env.ASTRA_MEMORY_PORT ? Number(process.env.ASTRA_MEMORY_PORT) : undefined;
35
+ const port = overrides.port ?? (Number.isInteger(envPort) ? envPort : undefined) ?? cfg.port;
36
+ const portSource = overrides.port !== undefined ? 'cli' : Number.isInteger(envPort) ? 'env' : 'config.yaml';
37
+ let dataDir;
38
+ let dataDirSource;
39
+ if (overrides.dataDir !== undefined) {
40
+ dataDir = overrides.dataDir;
41
+ dataDirSource = 'cli';
42
+ }
43
+ else if (process.env.ASTRA_MEMORY_DATADIR) {
44
+ dataDir = process.env.ASTRA_MEMORY_DATADIR;
45
+ dataDirSource = 'env';
46
+ }
47
+ else {
48
+ dataDir = cfg.dataDir;
49
+ dataDirSource = cfg.dataDir === defaultDataDir() ? 'default' : 'config.yaml';
50
+ }
51
+ return { cfg, port, dataDir, configDir, sources: { port: portSource, dataDir: dataDirSource } };
52
+ }
53
+ //# sourceMappingURL=resolve-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-runtime.js","sourceRoot":"","sources":["../../src/config/resolve-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAoB/D,MAAM,UAAU,oBAAoB,CAAC,YAA8B,EAAE;IACnE,yEAAyE;IACzE,2EAA2E;IAC3E,0BAA0B,EAAE,CAAC;IAE7B,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAE1C,yEAAyE;IACzE,iDAAiD;IACjD,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,UAAU,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;IACpH,CAAC;IAED,oEAAoE;IACpE,iEAAiE;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClG,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,OAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC;IACzG,MAAM,UAAU,GACd,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;IAE3F,IAAI,OAAe,CAAC;IACpB,IAAI,aAA0B,CAAC;IAC/B,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QAC5B,aAAa,GAAG,KAAK,CAAC;IACxB,CAAC;SAAM,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC;QAC5C,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAC3C,aAAa,GAAG,KAAK,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QACtB,aAAa,GAAG,GAAG,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;IAC/E,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC;AAClG,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * writeSecrets — write secrets.env to disk with mode 0600 (Unix).
3
+ *
4
+ * Format is shell-sourceable: KEY=value lines.
5
+ * On Windows, chmod is a no-op (NTFS uses ACLs; warn user instead).
6
+ */
7
+ export interface SecretsPayload {
8
+ /**
9
+ * 64-character hex Bearer token (32 random bytes). Optional as of SEC-10:
10
+ * callers omit this when the bearer was already stored in the OS
11
+ * credential store — secrets.env is a fallback persistence layer, not the
12
+ * bearer's primary home. See storage/keystore.ts storeBearer().
13
+ */
14
+ bearer?: string;
15
+ /** Azure OpenAI API key, if azure provider selected. */
16
+ azureKey?: string;
17
+ /** Azure endpoint URL, if azure provider selected. */
18
+ azureEndpoint?: string;
19
+ /** Azure deployment name, if azure provider selected. */
20
+ azureDeployment?: string;
21
+ }
22
+ /**
23
+ * Write secrets.env to `path`.
24
+ *
25
+ * Sets mode 0600 on Unix. On Windows the file is created with default ACL
26
+ * (current user only) — a warning is printed if stdout is TTY.
27
+ */
28
+ export declare function writeSecrets(payload: SecretsPayload, path: string): void;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * writeSecrets — write secrets.env to disk with mode 0600 (Unix).
3
+ *
4
+ * Format is shell-sourceable: KEY=value lines.
5
+ * On Windows, chmod is a no-op (NTFS uses ACLs; warn user instead).
6
+ */
7
+ import { writeFileSync, chmodSync, mkdirSync } from 'node:fs';
8
+ import { dirname } from 'node:path';
9
+ import { platform } from 'node:os';
10
+ /**
11
+ * Write secrets.env to `path`.
12
+ *
13
+ * Sets mode 0600 on Unix. On Windows the file is created with default ACL
14
+ * (current user only) — a warning is printed if stdout is TTY.
15
+ */
16
+ export function writeSecrets(payload, path) {
17
+ mkdirSync(dirname(path), { recursive: true });
18
+ const lines = [];
19
+ if (payload.bearer)
20
+ lines.push(`MEMORY_BEARER=${payload.bearer}`);
21
+ if (payload.azureKey)
22
+ lines.push(`AZURE_OPENAI_API_KEY=${payload.azureKey}`);
23
+ if (payload.azureEndpoint)
24
+ lines.push(`AZURE_OPENAI_ENDPOINT=${payload.azureEndpoint}`);
25
+ if (payload.azureDeployment)
26
+ lines.push(`AZURE_OPENAI_DEPLOYMENT=${payload.azureDeployment}`);
27
+ lines.push(''); // trailing newline
28
+ writeFileSync(path, lines.join('\n'), { encoding: 'utf8' });
29
+ if (platform() !== 'win32') {
30
+ try {
31
+ chmodSync(path, 0o600);
32
+ }
33
+ catch {
34
+ // Rare on normal FS; ignore — caller should warn.
35
+ }
36
+ }
37
+ }
38
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/config/secrets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAkBnC;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAAuB,EAAE,IAAY;IAChE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,IAAI,OAAO,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7E,IAAI,OAAO,CAAC,aAAa;QAAE,KAAK,CAAC,IAAI,CAAC,yBAAyB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACxF,IAAI,OAAO,CAAC,eAAe;QAAE,KAAK,CAAC,IAAI,CAAC,2BAA2B,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC9F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB;IAEnC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAE5D,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Persisted sync settings — written by `astramem-local pair`, merged into
3
+ * Config.sync at daemon boot (Wave 3e). Kept as a small JSON file beside
4
+ * config.yaml because pairing happens after init and must survive restarts;
5
+ * the device token itself never lands here — it lives in the OS credential
6
+ * store (keystore.ts storeSyncToken) or ASTRA_SYNC_TOKEN.
7
+ */
8
+ export interface SyncSettings {
9
+ enabled: boolean;
10
+ url: string;
11
+ workspaceId: string;
12
+ tenantId?: string;
13
+ }
14
+ export declare function syncSettingsPath(configDir: string): string;
15
+ export declare function readSyncSettings(configDir: string): SyncSettings | null;
16
+ export declare function writeSyncSettings(configDir: string, settings: SyncSettings): void;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Persisted sync settings — written by `astramem-local pair`, merged into
3
+ * Config.sync at daemon boot (Wave 3e). Kept as a small JSON file beside
4
+ * config.yaml because pairing happens after init and must survive restarts;
5
+ * the device token itself never lands here — it lives in the OS credential
6
+ * store (keystore.ts storeSyncToken) or ASTRA_SYNC_TOKEN.
7
+ */
8
+ import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ const FILE = 'sync.json';
11
+ export function syncSettingsPath(configDir) {
12
+ return join(configDir, FILE);
13
+ }
14
+ export function readSyncSettings(configDir) {
15
+ try {
16
+ const raw = JSON.parse(readFileSync(syncSettingsPath(configDir), 'utf8'));
17
+ if (typeof raw.url !== 'string' || typeof raw.workspaceId !== 'string')
18
+ return null;
19
+ return {
20
+ enabled: raw.enabled === true,
21
+ url: raw.url,
22
+ workspaceId: raw.workspaceId,
23
+ ...(typeof raw.tenantId === 'string' ? { tenantId: raw.tenantId } : {}),
24
+ };
25
+ }
26
+ catch {
27
+ return null; // missing or corrupt — daemon falls back to config defaults
28
+ }
29
+ }
30
+ export function writeSyncSettings(configDir, settings) {
31
+ mkdirSync(configDir, { recursive: true });
32
+ writeFileSync(syncSettingsPath(configDir), JSON.stringify(settings, null, 2), 'utf8');
33
+ }
34
+ //# sourceMappingURL=sync-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-settings.js","sourceRoot":"","sources":["../../src/config/sync-settings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,MAAM,IAAI,GAAG,WAAW,CAAC;AAEzB,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAA0B,CAAC;QACnG,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACpF,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI;YAC7B,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,GAAG,CAAC,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,4DAA4D;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,QAAsB;IACzE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,aAAa,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * writeConfig — serialise a Config object to YAML and write it to disk.
3
+ *
4
+ * No external yaml package required. The Config shape is flat enough that
5
+ * a purpose-built emitter is both simpler and faster to load than a full
6
+ * YAML library. Add the `yaml` package when Config grows nested lists.
7
+ */
8
+ import type { Config } from './config.js';
9
+ /**
10
+ * Serialise Config to a YAML string.
11
+ *
12
+ * The emitted YAML is intentionally hand-readable and round-trippable by
13
+ * `js-yaml` / `yaml` if the user installs one later.
14
+ */
15
+ export declare function configToYaml(cfg: Config): string;
16
+ /**
17
+ * Write config.yaml to `path`, creating parent directories as needed.
18
+ */
19
+ export declare function writeConfig(cfg: Config, path: string): void;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * writeConfig — serialise a Config object to YAML and write it to disk.
3
+ *
4
+ * No external yaml package required. The Config shape is flat enough that
5
+ * a purpose-built emitter is both simpler and faster to load than a full
6
+ * YAML library. Add the `yaml` package when Config grows nested lists.
7
+ */
8
+ import { writeFileSync, mkdirSync } from 'node:fs';
9
+ import { dirname } from 'node:path';
10
+ /** Emit a scalar value as a YAML-safe string (no quoting for safe values). */
11
+ function yamlScalar(v) {
12
+ if (typeof v === 'boolean')
13
+ return v ? 'true' : 'false';
14
+ if (typeof v === 'number')
15
+ return String(v);
16
+ if (typeof v === 'string') {
17
+ // Quote strings that contain special YAML chars or are booleans/numbers.
18
+ if (v === '' ||
19
+ /[:#{}\[\],&*?|<>=!%@`]/.test(v) ||
20
+ /^(true|false|null|~)$/i.test(v) ||
21
+ /^\d/.test(v)) {
22
+ return `'${v.replace(/'/g, "''")}'`;
23
+ }
24
+ return v;
25
+ }
26
+ return String(v);
27
+ }
28
+ /** Emit one YAML line with optional indent. */
29
+ function line(indent, key, value) {
30
+ const pad = ' '.repeat(indent);
31
+ if (value === undefined)
32
+ return `${pad}${key}:`;
33
+ return `${pad}${key}: ${yamlScalar(value)}`;
34
+ }
35
+ /**
36
+ * Serialise Config to a YAML string.
37
+ *
38
+ * The emitted YAML is intentionally hand-readable and round-trippable by
39
+ * `js-yaml` / `yaml` if the user installs one later.
40
+ */
41
+ export function configToYaml(cfg) {
42
+ const lines = [
43
+ '# AstraMemory Local — config.yaml',
44
+ '# Generated by `astramem-local init`. Edit manually or re-run init.',
45
+ '',
46
+ line(0, 'port', cfg.port),
47
+ line(0, 'dataDir', cfg.dataDir),
48
+ '',
49
+ // FEAT-406: leave at 127.0.0.1 unless you intend remote /health scraping.
50
+ // Any other value requires Bearer auth on /health + /version too — see
51
+ // docs/security/remote-health-threat-model.md before changing this.
52
+ line(0, 'network'),
53
+ line(1, 'host', cfg.network.host),
54
+ '',
55
+ line(0, 'llm'),
56
+ line(1, 'compaction'),
57
+ line(2, 'provider', cfg.llm.compaction.provider),
58
+ line(2, 'model', cfg.llm.compaction.model),
59
+ line(1, 'extraction'),
60
+ line(2, 'provider', cfg.llm.extraction.provider),
61
+ line(2, 'model', cfg.llm.extraction.model),
62
+ '',
63
+ line(0, 'embedding'),
64
+ line(1, 'provider', cfg.embedding.provider),
65
+ line(1, 'model', cfg.embedding.model),
66
+ line(1, 'dim', cfg.embedding.dim),
67
+ '',
68
+ line(0, 'vector'),
69
+ line(1, 'store', cfg.vector.store),
70
+ '',
71
+ line(0, 'budget'),
72
+ line(1, 'daily_usd', cfg.budget.daily_usd),
73
+ '',
74
+ line(0, 'ollama'),
75
+ line(1, 'baseUrl', cfg.ollama.baseUrl),
76
+ '',
77
+ line(0, 'azure'),
78
+ line(1, 'apiVersion', cfg.azure.apiVersion),
79
+ ...(cfg.azure.endpoint ? [line(1, 'endpoint', cfg.azure.endpoint)] : []),
80
+ ...(cfg.azure.deployment ? [line(1, 'deployment', cfg.azure.deployment)] : []),
81
+ '',
82
+ line(0, 'search'),
83
+ line(1, 'alpha', cfg.search.alpha),
84
+ line(1, 'beta', cfg.search.beta),
85
+ line(1, 'gamma', cfg.search.gamma),
86
+ line(1, 'delta', cfg.search.delta),
87
+ line(1, 'epsilon', cfg.search.epsilon),
88
+ line(1, 'zeta', cfg.search.zeta),
89
+ '',
90
+ line(0, 'recallPack'),
91
+ line(1, 'enabled', cfg.recallPack.enabled),
92
+ line(1, 'budgetTokens', cfg.recallPack.budgetTokens),
93
+ line(1, 'policy'),
94
+ line(2, 'enabled', cfg.recallPack.policy.enabled),
95
+ line(2, 'minScore', cfg.recallPack.policy.minScore),
96
+ line(2, 'minPromptChars', cfg.recallPack.policy.minPromptChars),
97
+ '',
98
+ // sync is deliberately NOT emitted here — `astramem-local pair` owns it
99
+ // via sync.json (single source of truth, merged at serve boot).
100
+ line(0, 'security'),
101
+ line(1, 'redaction'),
102
+ line(2, 'enabled', cfg.security.redaction.enabled),
103
+ line(2, 'entropyThreshold', cfg.security.redaction.entropyThreshold),
104
+ line(1, 'encryption'),
105
+ line(2, 'enabled', cfg.security.encryption.enabled),
106
+ '',
107
+ line(0, 'tagHygiene'),
108
+ line(1, 'tier2Enabled', cfg.tagHygiene.tier2Enabled),
109
+ line(1, 'tier2ConfidenceThreshold', cfg.tagHygiene.tier2ConfidenceThreshold),
110
+ '',
111
+ ];
112
+ return lines.join('\n');
113
+ }
114
+ /**
115
+ * Write config.yaml to `path`, creating parent directories as needed.
116
+ */
117
+ export function writeConfig(cfg, path) {
118
+ mkdirSync(dirname(path), { recursive: true });
119
+ writeFileSync(path, configToYaml(cfg), 'utf8');
120
+ }
121
+ //# sourceMappingURL=writer.js.map