@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,67 @@
1
+ /**
2
+ * Consolidation routes (Wave 4b, ADR-004 stage 9):
3
+ * POST /consolidation/run -> 200 ConsolidateSummary
4
+ * GET /consolidation/proposals?status= -> { proposals: [...] }
5
+ * POST /consolidation/proposals/:id/accept -> 200 proposal | 404 | 409
6
+ * POST /consolidation/proposals/:id/reject -> 200 proposal | 404 | 409
7
+ *
8
+ * /run executes the deterministic pass inline (no LLM in v1 — cheap enough
9
+ * to run synchronously); the `consolidate` job kind wraps the same call for
10
+ * scheduled runs.
11
+ */
12
+ import { z } from 'zod';
13
+ import { runConsolidation } from '../../consolidate/consolidate.js';
14
+ import { ProposalRepo, ProposalNotFoundError, ProposalAlreadyResolvedError, } from '../../consolidate/proposals.js';
15
+ import { MemoryConflictError, MemoryNotFoundError } from '../../storage/memory-events.js';
16
+ const RunBodySchema = z.object({
17
+ merge_threshold: z.number().min(0).max(1).optional(),
18
+ propose_threshold: z.number().min(0).max(1).optional(),
19
+ }).refine(b => b.merge_threshold === undefined || b.propose_threshold === undefined
20
+ || b.propose_threshold <= b.merge_threshold, { message: 'propose_threshold must be <= merge_threshold' });
21
+ const ListQuerySchema = z.object({
22
+ status: z.enum(['pending', 'accepted', 'rejected']).optional(),
23
+ });
24
+ export function consolidationRoutes(db) {
25
+ return async (app) => {
26
+ const proposals = new ProposalRepo(db);
27
+ app.post('/consolidation/run', async (req, reply) => {
28
+ const parsed = RunBodySchema.safeParse(req.body ?? {});
29
+ if (!parsed.success) {
30
+ return reply.code(400).send({ error: 'invalid', details: parsed.error.flatten() });
31
+ }
32
+ return runConsolidation(db, {
33
+ mergeThreshold: parsed.data.merge_threshold,
34
+ proposeThreshold: parsed.data.propose_threshold,
35
+ });
36
+ });
37
+ app.get('/consolidation/proposals', async (req, reply) => {
38
+ const parsed = ListQuerySchema.safeParse(req.query ?? {});
39
+ if (!parsed.success) {
40
+ return reply.code(400).send({ error: 'invalid', details: parsed.error.flatten() });
41
+ }
42
+ return { proposals: proposals.list(parsed.data.status) };
43
+ });
44
+ const resolveHandler = (action) => async (req, reply) => {
45
+ const { id } = req.params;
46
+ try {
47
+ return action === 'accept' ? proposals.accept(id) : proposals.reject(id);
48
+ }
49
+ catch (err) {
50
+ if (err instanceof ProposalNotFoundError)
51
+ return reply.code(404).send({ error: 'not found', id });
52
+ if (err instanceof ProposalAlreadyResolvedError)
53
+ return reply.code(409).send({ error: err.message, id });
54
+ // Accept can hit lifecycle conflicts if an atom was merged/erased
55
+ // since the proposal was written — surface, don't 500.
56
+ if (err instanceof MemoryNotFoundError)
57
+ return reply.code(409).send({ error: err.message, id });
58
+ if (err instanceof MemoryConflictError)
59
+ return reply.code(409).send({ error: err.message, id });
60
+ throw err;
61
+ }
62
+ };
63
+ app.post('/consolidation/proposals/:id/accept', resolveHandler('accept'));
64
+ app.post('/consolidation/proposals/:id/reject', resolveHandler('reject'));
65
+ };
66
+ }
67
+ //# sourceMappingURL=consolidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consolidation.js","sourceRoot":"","sources":["../../../src/server/routes/consolidation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * GET /dashboard/api — API reference page (FEAT-410 follow-up).
3
+ *
4
+ * Swagger-lite, deliberately: a hand-maintained route table with method,
5
+ * path, auth, and a one-line description. GET endpoints are plain links
6
+ * (the dashboard cookie authenticates them, so clicking IS the test);
7
+ * mutating endpoints show a copy-pasteable curl with a $MEMORY_BEARER
8
+ * placeholder. No OpenAPI spec, no JS, no external assets — a full
9
+ * Swagger UI would be overengineering for a single-operator local daemon.
10
+ *
11
+ * Auth + esc() duplicated locally by design (see
12
+ * dashboard-consolidation-html.ts for the rationale).
13
+ */
14
+ import type { FastifyInstance } from 'fastify';
15
+ export declare function dashboardApiRoute(token: string): (app: FastifyInstance) => Promise<void>;
@@ -0,0 +1,144 @@
1
+ /**
2
+ * GET /dashboard/api — API reference page (FEAT-410 follow-up).
3
+ *
4
+ * Swagger-lite, deliberately: a hand-maintained route table with method,
5
+ * path, auth, and a one-line description. GET endpoints are plain links
6
+ * (the dashboard cookie authenticates them, so clicking IS the test);
7
+ * mutating endpoints show a copy-pasteable curl with a $MEMORY_BEARER
8
+ * placeholder. No OpenAPI spec, no JS, no external assets — a full
9
+ * Swagger UI would be overengineering for a single-operator local daemon.
10
+ *
11
+ * Auth + esc() duplicated locally by design (see
12
+ * dashboard-consolidation-html.ts for the rationale).
13
+ */
14
+ const COOKIE_NAME = 'astramem_dash';
15
+ function readCookie(req, name) {
16
+ const header = req.headers.cookie;
17
+ if (!header)
18
+ return undefined;
19
+ for (const part of header.split(';')) {
20
+ const eq = part.indexOf('=');
21
+ if (eq === -1)
22
+ continue;
23
+ if (part.slice(0, eq).trim() === name)
24
+ return part.slice(eq + 1).trim();
25
+ }
26
+ return undefined;
27
+ }
28
+ function esc(s) {
29
+ return s
30
+ .replace(/&/g, '&amp;')
31
+ .replace(/</g, '&lt;')
32
+ .replace(/>/g, '&gt;')
33
+ .replace(/"/g, '&quot;');
34
+ }
35
+ // Hand-maintained — matches src/server/app.ts registrations. Update when
36
+ // routes change (cheap; the alternative is runtime route introspection,
37
+ // which buys little for a table this size).
38
+ const ENDPOINTS = [
39
+ { method: 'GET', path: '/health', auth: false, desc: 'Daemon health: status (starting|ok|degraded), subsystem detail' },
40
+ { method: 'GET', path: '/version', auth: false, desc: 'Daemon version + wire versions + schema version' },
41
+ { method: 'GET', path: '/search', auth: true, desc: 'Hybrid search (FTS+vector fusion). Filters: entity, type, repo, project, agent, since, as_of. project/agent accept a comma list (OR)', example: '?query=sqlite&project=runner-plugin&agent=crew:reviewer' },
42
+ { method: 'GET', path: '/memory/:id', auth: true, desc: 'Fetch one memory by id' },
43
+ { method: 'GET', path: '/memory/:id/history', auth: true, desc: 'Bitemporal version history of a memory' },
44
+ { method: 'GET', path: '/memory/:id/why', auth: true, desc: 'Provenance: why this memory exists (source transcript, extraction)' },
45
+ { method: 'GET', path: '/entities', auth: true, desc: 'List entities' },
46
+ { method: 'GET', path: '/entities/:id/memories', auth: true, desc: 'Memories linked to an entity' },
47
+ { method: 'GET', path: '/sessions/:id/digest', auth: true, desc: 'Session digest' },
48
+ { method: 'GET', path: '/consolidation/proposals', auth: true, desc: 'List consolidation proposals (?status=pending|accepted|rejected)', example: '?status=pending' },
49
+ { method: 'POST', path: '/ingest/transcript', auth: true, desc: 'Ingest a transcript (canonical v1.0 or legacy v0.0 envelope); idempotent via Idempotency-Key header', example: '{"event":"transcript","session_id":"s1","turns":[{"role":"user","text":"hello"}],"wire_version":"v1.0"}' },
50
+ { method: 'POST', path: '/remember', auth: true, desc: 'Store a memory directly. metadata.project / metadata.agent persist on the atom (recallable via filters)', example: '{"text":"Port 7777 is the default","type":"fact","metadata":{"project":"runner-plugin","agent":"crew:reviewer"}}' },
51
+ { method: 'POST', path: '/recall', auth: true, desc: 'Recall memories for a query context. Optional filters: {type[],repo,project,agent,since,as_of,entity}. project/agent are string or string[] (OR). Omit filters = unscoped', example: '{"query":"default port","filters":{"project":"runner-plugin","agent":"crew:reviewer"}}' },
52
+ { method: 'POST', path: '/recall/pack', auth: true, desc: 'Recall as a packed context block', example: '{"query":"default port"}' },
53
+ { method: 'POST', path: '/memory/:id/used', auth: true, desc: 'Mark memory used (usefulness signal feeds ranking epsilon)' },
54
+ { method: 'POST', path: '/memory/:id/promote', auth: true, desc: 'Promote memory importance' },
55
+ { method: 'POST', path: '/memory/:id/invalidate', auth: true, desc: 'Invalidate (soft-close validity interval)' },
56
+ { method: 'POST', path: '/memory/:id/supersede', auth: true, desc: 'Supersede with a corrected memory', example: '{"text":"corrected fact"}' },
57
+ { method: 'DELETE', path: '/memory/:id', auth: true, desc: 'Erase a memory' },
58
+ { method: 'POST', path: '/consolidation/run', auth: true, desc: 'Run consolidation pass now (optional merge_threshold, propose_threshold)', example: '{}' },
59
+ { method: 'POST', path: '/consolidation/proposals/:id/accept', auth: true, desc: 'Accept a merge proposal' },
60
+ { method: 'POST', path: '/consolidation/proposals/:id/reject', auth: true, desc: 'Reject a merge proposal' },
61
+ { method: 'POST', path: '/mcp', auth: true, desc: 'MCP endpoint (JSON-RPC)' },
62
+ { method: 'POST', path: '/memory-tool', auth: true, desc: 'Anthropic memory-tool wire endpoint' },
63
+ ];
64
+ function curlFor(e) {
65
+ const body = e.method === 'POST' && e.example ? ` -H "content-type: application/json" -d '${e.example}'` : '';
66
+ const method = e.method === 'GET' ? '' : ` -X ${e.method}`;
67
+ const auth = e.auth ? ' -H "Authorization: Bearer $MEMORY_BEARER"' : '';
68
+ return `curl${method}${auth}${body} http://127.0.0.1:7777${e.path}`;
69
+ }
70
+ function renderRow(e) {
71
+ const isTryableGet = e.method === 'GET' && !e.path.includes(':');
72
+ const pathCell = isTryableGet
73
+ ? `<a href="${esc(e.path + (e.example ?? ''))}">${esc(e.path)}</a>`
74
+ : esc(e.path);
75
+ return `
76
+ <tr>
77
+ <td><span class="m ${e.method.toLowerCase()}">${e.method}</span></td>
78
+ <td>${pathCell}</td>
79
+ <td>${e.auth ? 'Bearer' : 'public'}</td>
80
+ <td>${esc(e.desc)}</td>
81
+ </tr>
82
+ <tr class="curl"><td></td><td colspan="3"><code>${esc(curlFor(e))}</code></td></tr>`;
83
+ }
84
+ const CSS = `
85
+ *{box-sizing:border-box;margin:0;padding:0}
86
+ body{background:#1a1a1a;color:#e0e0e0;font-family:monospace;font-size:13px;line-height:1.5;padding:16px}
87
+ h1{font-size:18px;color:#fff;margin-bottom:12px}
88
+ nav{display:flex;gap:16px;margin:8px 0 16px;padding-bottom:8px;border-bottom:1px solid #333;font-size:12px}
89
+ nav a{color:#888;text-decoration:none}
90
+ nav a:hover{color:#3a7bd5}
91
+ nav .active{color:#fff;font-weight:bold}
92
+ table{border-collapse:collapse;width:100%}
93
+ th,td{border-bottom:1px solid #2a2a2a;padding:4px 8px;text-align:left;vertical-align:top}
94
+ th{color:#aaa;text-transform:uppercase;font-size:11px;letter-spacing:.05em}
95
+ td a{color:#3a7bd5;text-decoration:none}
96
+ .m{font-weight:bold}
97
+ .m.get{color:#2ecc71}
98
+ .m.post{color:#e6a23c}
99
+ .m.delete{color:#e74c3c}
100
+ .curl td{border-bottom:1px solid #333;padding-top:0}
101
+ .curl code{color:#777;font-size:11px;word-break:break-all}
102
+ .note{color:#888;margin-bottom:12px}
103
+ `;
104
+ function renderPage() {
105
+ return `<!DOCTYPE html>
106
+ <html lang="en">
107
+ <head>
108
+ <meta charset="utf-8">
109
+ <meta name="viewport" content="width=device-width,initial-scale=1">
110
+ <title>AstraMemory Dashboard — API</title>
111
+ <style>${CSS}</style>
112
+ </head>
113
+ <body>
114
+ <h1>API reference</h1>
115
+ <nav><a href="/dashboard">Mission Control</a> <a href="/dashboard/jobs">Jobs</a> <a href="/dashboard/consolidation">Consolidation</a> <a href="/dashboard/search">Search</a> <span class="active">API</span></nav>
116
+ <p class="note">GET rows without path params are clickable — your dashboard cookie authenticates them, so clicking is the test. For everything else copy the curl ($MEMORY_BEARER is in %APPDATA%\\Astramem\\secrets.env).</p>
117
+ <table>
118
+ <thead><tr><th>method</th><th>path</th><th>auth</th><th>description</th></tr></thead>
119
+ <tbody>${ENDPOINTS.map(renderRow).join('')}</tbody>
120
+ </table>
121
+ </body>
122
+ </html>`;
123
+ }
124
+ export function dashboardApiRoute(token) {
125
+ return async (app) => {
126
+ app.get('/dashboard/api', async (req, reply) => {
127
+ const authHeader = req.headers.authorization;
128
+ const bearerOk = authHeader === `Bearer ${token}`;
129
+ const cookieOk = readCookie(req, COOKIE_NAME) === token;
130
+ if (!bearerOk && !cookieOk) {
131
+ return reply
132
+ .code(401)
133
+ .header('content-type', 'text/plain; charset=utf-8')
134
+ .send('401 Unauthorized');
135
+ }
136
+ return reply
137
+ .code(200)
138
+ .header('content-type', 'text/html; charset=utf-8')
139
+ .header('cache-control', 'no-store')
140
+ .send(renderPage());
141
+ });
142
+ };
143
+ }
144
+ //# sourceMappingURL=dashboard-api-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-api-html.js","sourceRoot":"","sources":["../../../src/server/routes/dashboard-api-html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * GET /dashboard/consolidation — pending consolidation proposal list with
3
+ * accept/reject (FEAT-410 wave 2, SLICE-410-2; replaces SLICE-410-1's stub
4
+ * render internals).
5
+ *
6
+ * Each row is a plain `<form method="post">` targeting the EXISTING
7
+ * `/consolidation/proposals/:id/accept|reject` endpoints
8
+ * (src/server/routes/consolidation.ts) verbatim — no new mutation surface,
9
+ * zero JS. Because those endpoints respond with JSON rather than a redirect
10
+ * back to this page, resolving a proposal navigates away from the
11
+ * dashboard; the operator returns to `/dashboard/consolidation` (nav link or
12
+ * back button) to see the list reflect the new status. This zero-JS,
13
+ * full-reload UX is the explicit design tradeoff recorded in
14
+ * `.claude/artifacts/crew/runs/2026-07-04-dashboard-redesign-design.md` §7.
15
+ *
16
+ * Auth mirrors src/server/routes/dashboard.ts (Bearer header or the
17
+ * HttpOnly `astramem_dash` cookie bootstrapped there) but the check is
18
+ * duplicated locally by design — each dashboard page module stays
19
+ * independently reviewable, and wave-2 slices are forbidden from touching
20
+ * app.ts, so the auth wrapper here must be self-contained.
21
+ */
22
+ import type { FastifyInstance } from 'fastify';
23
+ import type { DB } from '../../storage/db.js';
24
+ /** `db` backs the real proposal + memory lookups (SLICE-410-1's stub
25
+ * accepted but ignored it, keeping this factory's signature stable). */
26
+ export declare function dashboardConsolidationRoute(db: DB, token: string): (app: FastifyInstance) => Promise<void>;
@@ -0,0 +1,202 @@
1
+ /**
2
+ * GET /dashboard/consolidation — pending consolidation proposal list with
3
+ * accept/reject (FEAT-410 wave 2, SLICE-410-2; replaces SLICE-410-1's stub
4
+ * render internals).
5
+ *
6
+ * Each row is a plain `<form method="post">` targeting the EXISTING
7
+ * `/consolidation/proposals/:id/accept|reject` endpoints
8
+ * (src/server/routes/consolidation.ts) verbatim — no new mutation surface,
9
+ * zero JS. Because those endpoints respond with JSON rather than a redirect
10
+ * back to this page, resolving a proposal navigates away from the
11
+ * dashboard; the operator returns to `/dashboard/consolidation` (nav link or
12
+ * back button) to see the list reflect the new status. This zero-JS,
13
+ * full-reload UX is the explicit design tradeoff recorded in
14
+ * `.claude/artifacts/crew/runs/2026-07-04-dashboard-redesign-design.md` §7.
15
+ *
16
+ * Auth mirrors src/server/routes/dashboard.ts (Bearer header or the
17
+ * HttpOnly `astramem_dash` cookie bootstrapped there) but the check is
18
+ * duplicated locally by design — each dashboard page module stays
19
+ * independently reviewable, and wave-2 slices are forbidden from touching
20
+ * app.ts, so the auth wrapper here must be self-contained.
21
+ */
22
+ import { ProposalRepo } from '../../consolidate/proposals.js';
23
+ import { MemoryRepo } from '../../storage/memories.js';
24
+ const COOKIE_NAME = 'astramem_dash';
25
+ const RESOLVED_LIMIT = 100;
26
+ function readCookie(req, name) {
27
+ const header = req.headers.cookie;
28
+ if (!header)
29
+ return undefined;
30
+ for (const part of header.split(';')) {
31
+ const eq = part.indexOf('=');
32
+ if (eq === -1)
33
+ continue;
34
+ if (part.slice(0, eq).trim() === name)
35
+ return part.slice(eq + 1).trim();
36
+ }
37
+ return undefined;
38
+ }
39
+ // Locally duplicated rather than imported from dashboard-html.ts — that
40
+ // module is module-private by design (see file header + slice scope).
41
+ function esc(s) {
42
+ return s
43
+ .replace(/&/g, '&amp;')
44
+ .replace(/</g, '&lt;')
45
+ .replace(/>/g, '&gt;')
46
+ .replace(/"/g, '&quot;');
47
+ }
48
+ function truncate(s, max) {
49
+ if (s.length <= max)
50
+ return s;
51
+ return s.slice(0, max) + '…';
52
+ }
53
+ function fmtAge(ms) {
54
+ const clamped = Math.max(0, ms);
55
+ if (clamped < 60_000)
56
+ return `${Math.floor(clamped / 1000)}s`;
57
+ if (clamped < 3_600_000)
58
+ return `${Math.floor(clamped / 60_000)}m`;
59
+ return `${Math.floor(clamped / 3_600_000)}h`;
60
+ }
61
+ const CSS = `
62
+ *{box-sizing:border-box;margin:0;padding:0}
63
+ body{background:#1a1a1a;color:#e0e0e0;font-family:monospace;font-size:13px;line-height:1.5;padding:16px}
64
+ h1{font-size:18px;color:#fff;margin-bottom:12px}
65
+ table{width:100%;border-collapse:collapse;font-size:12px}
66
+ th{background:#222;color:#aaa;text-align:left;padding:5px 8px;font-weight:normal;text-transform:uppercase;letter-spacing:.04em}
67
+ td{padding:5px 8px;border-bottom:1px solid #252525;vertical-align:top}
68
+ tr:nth-child(odd) td{background:#1e1e1e}
69
+ .num{text-align:right;font-variant-numeric:tabular-nums}
70
+ .trunc{max-width:260px;overflow-wrap:break-word}
71
+ .muted{color:#666}
72
+ button{font-family:monospace;font-size:12px;padding:2px 8px;margin-right:4px;background:#2a2a2a;color:#e0e0e0;border:1px solid #444;border-radius:3px;cursor:pointer}
73
+ button:hover{background:#333}
74
+ nav{display:flex;gap:16px;margin:8px 0 16px;padding-bottom:8px;border-bottom:1px solid #333;font-size:12px}
75
+ nav a{color:#888;text-decoration:none}
76
+ nav a:hover{color:#3a7bd5}
77
+ nav .active{color:#fff;font-weight:bold}
78
+ .tabs{margin:0 0 10px;display:flex;gap:14px}
79
+ .tabs a{color:#3a7bd5;text-decoration:none}
80
+ .tabs .active{color:#fff;font-weight:bold}
81
+ .note{color:#666;font-size:11px;margin-bottom:10px}
82
+ `.trim();
83
+ /** `db` backs the real proposal + memory lookups (SLICE-410-1's stub
84
+ * accepted but ignored it, keeping this factory's signature stable). */
85
+ export function dashboardConsolidationRoute(db, token) {
86
+ return async (app) => {
87
+ app.get('/dashboard/consolidation', async (req, reply) => {
88
+ const authHeader = req.headers.authorization;
89
+ const bearerOk = authHeader === `Bearer ${token}`;
90
+ const cookieOk = readCookie(req, COOKIE_NAME) === token;
91
+ if (!bearerOk && !cookieOk) {
92
+ return reply
93
+ .code(401)
94
+ .header('content-type', 'text/plain; charset=utf-8')
95
+ .send('401 Unauthorized');
96
+ }
97
+ const proposals = new ProposalRepo(db);
98
+ const memories = new MemoryRepo(db);
99
+ const q = req.query;
100
+ const status = q.status === 'accepted' || q.status === 'rejected' ? q.status : 'pending';
101
+ const counts = {
102
+ pending: proposals.list('pending').length,
103
+ accepted: proposals.list('accepted').length,
104
+ rejected: proposals.list('rejected').length,
105
+ };
106
+ // Resolved lists show newest-first (most recent auto-sweep results on
107
+ // top) and are capped — the operator cares about "what just happened",
108
+ // not the full history.
109
+ let rows = proposals.list(status);
110
+ if (status !== 'pending') {
111
+ rows = rows
112
+ .slice()
113
+ .sort((a, b) => (b.resolved_at ?? 0) - (a.resolved_at ?? 0))
114
+ .slice(0, RESOLVED_LIMIT);
115
+ }
116
+ return reply
117
+ .code(200)
118
+ .header('content-type', 'text/html; charset=utf-8')
119
+ .header('cache-control', 'no-store')
120
+ .send(renderPage(status, counts, rows, memories));
121
+ });
122
+ };
123
+ }
124
+ function renderExcerpt(memoryId, memories) {
125
+ const mem = memories.get(memoryId);
126
+ if (!mem)
127
+ return '<span class="muted">(memory not found)</span>';
128
+ return esc(truncate(mem.text, 140));
129
+ }
130
+ function renderRow(p, memories) {
131
+ const id = esc(p.id);
132
+ const kind = esc(p.kind);
133
+ const sim = p.similarity.toFixed(2);
134
+ const age = esc(fmtAge(Date.now() - p.created_at));
135
+ let lastCell;
136
+ if (p.status === 'pending') {
137
+ const acceptAction = `/consolidation/proposals/${encodeURIComponent(p.id)}/accept`;
138
+ const rejectAction = `/consolidation/proposals/${encodeURIComponent(p.id)}/reject`;
139
+ lastCell = `
140
+ <form method="post" action="${esc(acceptAction)}" style="display:inline">
141
+ <button type="submit">accept</button>
142
+ </form>
143
+ <form method="post" action="${esc(rejectAction)}" style="display:inline">
144
+ <button type="submit">reject</button>
145
+ </form>`;
146
+ }
147
+ else {
148
+ const resolvedAge = p.resolved_at !== null ? fmtAge(Date.now() - p.resolved_at) : '?';
149
+ lastCell = `<span class="muted">${esc(p.status)} ${esc(resolvedAge)} ago</span>`;
150
+ }
151
+ return `<tr>
152
+ <td>${id}</td>
153
+ <td>${kind}</td>
154
+ <td class="num">${sim}</td>
155
+ <td class="trunc">${renderExcerpt(p.winner_id, memories)}</td>
156
+ <td class="trunc">${renderExcerpt(p.loser_id, memories)}</td>
157
+ <td class="muted">${age}</td>
158
+ <td>${lastCell}</td>
159
+ </tr>`;
160
+ }
161
+ function renderTabs(status, counts) {
162
+ const tab = (s) => {
163
+ const label = `${s} (${counts[s]})`;
164
+ if (s === status)
165
+ return `<span class="active">${esc(label)}</span>`;
166
+ return `<a href="/dashboard/consolidation?status=${s}">${esc(label)}</a>`;
167
+ };
168
+ return `<div class="tabs">${tab('pending')} ${tab('accepted')} ${tab('rejected')}</div>`;
169
+ }
170
+ function renderBody(status, rows, memories) {
171
+ if (rows.length === 0) {
172
+ return `<p class="muted">No ${esc(status)} proposals.</p>`;
173
+ }
174
+ const lastHeader = status === 'pending' ? 'Actions' : 'Resolved';
175
+ const capNote = rows.length === RESOLVED_LIMIT && status !== 'pending'
176
+ ? `<p class="muted">showing ${RESOLVED_LIMIT} most recently resolved</p>` : '';
177
+ return `${capNote}<table>
178
+ <thead><tr>
179
+ <th>ID</th><th>Kind</th><th class="num">Sim</th><th>Winner</th><th>Loser</th><th>Age</th><th>${lastHeader}</th>
180
+ </tr></thead>
181
+ <tbody>${rows.map(p => renderRow(p, memories)).join('')}</tbody>
182
+ </table>`;
183
+ }
184
+ function renderPage(status, counts, rows, memories) {
185
+ return `<!DOCTYPE html>
186
+ <html lang="en">
187
+ <head>
188
+ <meta charset="utf-8">
189
+ <meta name="viewport" content="width=device-width,initial-scale=1">
190
+ <title>AstraMemory Dashboard — Consolidation</title>
191
+ <style>${CSS}</style>
192
+ </head>
193
+ <body>
194
+ <h1>Consolidation — ${esc(status)}: ${counts[status]}</h1>
195
+ <nav><a href="/dashboard">Mission Control</a> <a href="/dashboard/jobs">Jobs</a> <span class="active">Consolidation</span> <a href="/dashboard/search">Search</a> <a href="/dashboard/api">API</a></nav>
196
+ ${renderTabs(status, counts)}
197
+ <p class="note">accepted = merged (auto containment-sweep or manual). Direct auto-merges at &ge;0.95 similarity or exact-containment never create proposals — they land straight in memory history.</p>
198
+ ${renderBody(status, rows, memories)}
199
+ </body>
200
+ </html>`;
201
+ }
202
+ //# sourceMappingURL=dashboard-consolidation-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-consolidation-html.js","sourceRoot":"","sources":["../../../src/server/routes/dashboard-consolidation-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,EAAE,YAAY,EAA8B,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,MAAM,WAAW,GAAG,eAAe,CAAC;AACpC,MAAM,cAAc,GAAG,GAAG,CAAC;AAI3B,SAAS,UAAU,CAAC,GAAmB,EAAE,IAAY;IACnD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;IAClC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,SAAS;QACxB,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,wEAAwE;AACxE,sEAAsE;AACtE,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,GAAW;IACtC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;AAC/B,CAAC;AAED,SAAS,MAAM,CAAC,EAAU;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,OAAO,GAAG,MAAM;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC;IAC9D,IAAI,OAAO,GAAG,SAAS;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC;IACnE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBX,CAAC,IAAI,EAAE,CAAC;AAET;yEACyE;AACzE,MAAM,UAAU,2BAA2B,CAAC,EAAM,EAAE,KAAa;IAC/D,OAAO,KAAK,EAAE,GAAoB,EAAE,EAAE;QACpC,GAAG,CAAC,GAAG,CAAC,0BAA0B,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;YACvD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;YAC7C,MAAM,QAAQ,GAAG,UAAU,KAAK,UAAU,KAAK,EAAE,CAAC;YAClD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,KAAK,CAAC;YAExD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC3B,OAAO,KAAK;qBACT,IAAI,CAAC,GAAG,CAAC;qBACT,MAAM,CAAC,cAAc,EAAE,2BAA2B,CAAC;qBACnD,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC9B,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;YAEpC,MAAM,CAAC,GAAG,GAAG,CAAC,KAA2C,CAAC;YAC1D,MAAM,MAAM,GACV,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAE5E,MAAM,MAAM,GAAmC;gBAC7C,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM;gBACzC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM;gBAC3C,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM;aAC5C,CAAC;YACF,sEAAsE;YACtE,uEAAuE;YACvE,wBAAwB;YACxB,IAAI,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,IAAI,GAAG,IAAI;qBACR,KAAK,EAAE;qBACP,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;qBAC3D,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YAC9B,CAAC;YAED,OAAO,KAAK;iBACT,IAAI,CAAC,GAAG,CAAC;iBACT,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC;iBAClD,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC;iBACnC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,QAAoB;IAC3D,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG;QAAE,OAAO,+CAA+C,CAAC;IACjE,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,SAAS,CAAC,CAAwB,EAAE,QAAoB;IAC/D,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAEnD,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,4BAA4B,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACnF,MAAM,YAAY,GAAG,4BAA4B,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACnF,QAAQ,GAAG;oCACqB,GAAG,CAAC,YAAY,CAAC;;;oCAGjB,GAAG,CAAC,YAAY,CAAC;;cAEvC,CAAC;IACb,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACtF,QAAQ,GAAG,uBAAuB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC;IACnF,CAAC;IAED,OAAO;UACC,EAAE;UACF,IAAI;sBACQ,GAAG;wBACD,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC;wBACpC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC;wBACnC,GAAG;UACjB,QAAQ;QACV,CAAC;AACT,CAAC;AAED,SAAS,UAAU,CAAC,MAAsB,EAAE,MAAsC;IAChF,MAAM,GAAG,GAAG,CAAC,CAAiB,EAAU,EAAE;QACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QACpC,IAAI,CAAC,KAAK,MAAM;YAAE,OAAO,wBAAwB,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;QACrE,OAAO,4CAA4C,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;IAC5E,CAAC,CAAC;IACF,OAAO,qBAAqB,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;AAC3F,CAAC;AAED,SAAS,UAAU,CAAC,MAAsB,EAAE,IAA6B,EAAE,QAAoB;IAC7F,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,uBAAuB,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC;IAC7D,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,cAAc,IAAI,MAAM,KAAK,SAAS;QACpE,CAAC,CAAC,4BAA4B,cAAc,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,OAAO,GAAG,OAAO;;mGAEgF,UAAU;;WAElG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;SAChD,CAAC;AACV,CAAC;AAED,SAAS,UAAU,CACjB,MAAsB,EACtB,MAAsC,EACtC,IAA6B,EAC7B,QAAoB;IAEpB,OAAO;;;;;;SAMA,GAAG;;;sBAGU,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC;;EAElD,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;;EAE1B,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;;QAE5B,CAAC;AACT,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * dashboard-html.ts — server-side HTML renderer for /dashboard.
3
+ *
4
+ * FEAT-410 SLICE-410-4: Mission Control rewrite (design doc §4). Renders
5
+ * against the ACTUAL DashboardData/DashboardHealth shapes exported by
6
+ * queries/dashboard.ts (SLICE-410-1) — not the design-doc mockup's literal
7
+ * field names.
8
+ *
9
+ * Zero runtime dependencies: pure string concatenation.
10
+ * No JS in output. <meta refresh> drives auto-poll.
11
+ * Target: < 20 KB gzipped.
12
+ */
13
+ import type { DashboardData } from '../queries/dashboard.js';
14
+ import type { Config } from '../../config/config.js';
15
+ export declare function renderDashboard(data: DashboardData, config: Config): string;