@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,365 @@
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 { PKG_VERSION, WIRE_VERSIONS_SUPPORTED, SCHEMA_VERSION } from '../lib/wire-meta.js';
14
+ // ---------------------------------------------------------------------------
15
+ // Helpers (carried over from the pre-Mission-Control renderer)
16
+ // ---------------------------------------------------------------------------
17
+ function esc(s) {
18
+ return s
19
+ .replace(/&/g, '&amp;')
20
+ .replace(/</g, '&lt;')
21
+ .replace(/>/g, '&gt;')
22
+ .replace(/"/g, '&quot;');
23
+ }
24
+ function fmtTime(epochMs) {
25
+ try {
26
+ // Local-first: the daemon runs on the operator's own machine, so the OS
27
+ // locale/timezone IS the client's — render local time, not UTC.
28
+ return new Date(epochMs).toLocaleTimeString(undefined, { hour12: false });
29
+ }
30
+ catch {
31
+ return '??:??:??';
32
+ }
33
+ }
34
+ function truncate(s, max) {
35
+ if (s.length <= max)
36
+ return s;
37
+ return s.slice(0, max) + '…';
38
+ }
39
+ function fmtAgeMs(ms) {
40
+ if (ms < 0)
41
+ return '0s';
42
+ if (ms < 60_000)
43
+ return `${Math.floor(ms / 1000)}s`;
44
+ if (ms < 3_600_000)
45
+ return `${Math.floor(ms / 60_000)}m`;
46
+ return `${Math.floor(ms / 3_600_000)}h`;
47
+ }
48
+ function fmtBytes(bytes) {
49
+ const gb = bytes / (1024 * 1024 * 1024);
50
+ if (gb >= 1)
51
+ return `${gb.toFixed(1)}GB`;
52
+ const mb = bytes / (1024 * 1024);
53
+ return `${mb.toFixed(0)}MB`;
54
+ }
55
+ function budgetColor(spend, cap) {
56
+ if (cap <= 0)
57
+ return '#888';
58
+ const pct = spend / cap;
59
+ if (pct >= 0.8)
60
+ return '#e74c3c';
61
+ if (pct >= 0.5)
62
+ return '#f39c12';
63
+ return '#2ecc71';
64
+ }
65
+ function fmtRate(rate) {
66
+ return rate === null ? 'n/a' : `${(rate * 100).toFixed(1)}%`;
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Inline CSS
70
+ // ---------------------------------------------------------------------------
71
+ const CSS = `
72
+ *{box-sizing:border-box;margin:0;padding:0}
73
+ body{background:#1a1a1a;color:#e0e0e0;font-family:monospace;font-size:13px;line-height:1.5;padding:16px}
74
+ h1{font-size:18px;color:#fff;display:inline-block}
75
+ .meta{color:#888;font-size:12px}
76
+ .meta span{color:#ccc}
77
+ nav{display:flex;align-items:center;gap:16px;margin:10px 0 16px;padding-bottom:8px;border-bottom:1px solid #333;font-size:12px}
78
+ nav a{color:#888;text-decoration:none}
79
+ nav a:hover{color:#3a7bd5}
80
+ nav .active{color:#fff;font-weight:bold}
81
+ nav .asof{margin-left:auto;color:#666}
82
+ section{margin-bottom:20px}
83
+ .banner{padding:8px 12px;border-radius:4px;font-size:13px;display:flex;gap:18px;flex-wrap:wrap;align-items:center}
84
+ .banner.ok{background:#132a1c;border:1px solid #1f5c34}
85
+ .banner.degraded{background:#2a1414;border:1px solid #5c1f1f}
86
+ .banner .dot{font-size:16px}
87
+ .pipeline-title,.strip h3{font-size:11px;color:#888;text-transform:uppercase;letter-spacing:.05em;margin-bottom:6px}
88
+ .pipeline{display:flex;justify-content:space-between;gap:4px;padding:10px 4px;background:#1e1e1e;border-radius:4px;overflow-x:auto}
89
+ .stage{flex:1;min-width:90px;text-align:center;padding:0 4px}
90
+ .stage .name{color:#aaa;font-size:11px;text-transform:uppercase}
91
+ .stage .val{font-size:14px;margin-top:4px;font-variant-numeric:tabular-nums}
92
+ .arrow{color:#555;align-self:center;padding:0 2px}
93
+ .strips{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:12px}
94
+ .strips2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
95
+ .strip{background:#1e1e1e;border-radius:4px;padding:10px 12px}
96
+ .strip .big{font-size:18px}
97
+ table{width:100%;border-collapse:collapse;font-size:12px}
98
+ th{background:#222;color:#aaa;text-align:left;padding:5px 8px;font-weight:normal;text-transform:uppercase;letter-spacing:.04em}
99
+ td{padding:4px 8px;border-bottom:1px solid #252525;font-variant-numeric:tabular-nums}
100
+ tr:nth-child(odd) td{background:#1e1e1e}
101
+ .badge{display:inline-block;padding:1px 6px;border-radius:3px;font-size:11px}
102
+ .num{text-align:right;font-variant-numeric:tabular-nums}
103
+ .trunc{max-width:360px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
104
+ .ok{color:#2ecc71}
105
+ .warn{color:#f39c12}
106
+ .err{color:#e74c3c}
107
+ .muted{color:#666}
108
+ `.trim();
109
+ /** AC-1/AC-2: OK only when embed.ok===true AND worker.alive===true; any other
110
+ * combination (including embed.ok===false or worker.alive===false) is
111
+ * DEGRADED, naming the failing subsystem(s). Unlike healthState.status()
112
+ * (which only tracks embed), the banner also treats a dead worker as
113
+ * degraded per AC-2. `null` health (no HealthState wired) reports UNKNOWN
114
+ * rather than claiming OK — the page still renders fully either way. */
115
+ function bannerStatus(health) {
116
+ if (health === null)
117
+ return { label: 'UNKNOWN', failing: [] };
118
+ const failing = [];
119
+ if (health.embed.ok !== true)
120
+ failing.push('embed');
121
+ if (!health.worker.alive)
122
+ failing.push('worker');
123
+ return { label: failing.length > 0 ? 'DEGRADED' : 'OK', failing };
124
+ }
125
+ function renderBanner(health) {
126
+ const { label, failing } = bannerStatus(health);
127
+ const cls = label === 'OK' ? 'ok' : label === 'DEGRADED' ? 'degraded' : '';
128
+ const dotColor = label === 'OK' ? '#2ecc71' : label === 'DEGRADED' ? '#e74c3c' : '#888';
129
+ if (health === null) {
130
+ return `<div class="banner ${cls}">
131
+ <span class="dot" style="color:${dotColor}">●</span>
132
+ <span><strong>DAEMON UNKNOWN</strong></span>
133
+ <span class="muted">no health state wired</span>
134
+ </div>`;
135
+ }
136
+ const embedOk = health.embed.ok;
137
+ const embedLabel = embedOk === true
138
+ ? '<span class="ok">embed:ok</span>'
139
+ : embedOk === false
140
+ ? `<span class="err">embed:FAIL${health.embed.lastError ? ` (${esc(truncate(health.embed.lastError, 40))})` : ''}</span>`
141
+ : '<span class="muted">embed:starting</span>';
142
+ const workerLabel = health.worker.alive
143
+ ? `<span class="ok">worker:alive${health.worker.lastTickAgoMs !== null ? ` (${fmtAgeMs(health.worker.lastTickAgoMs)} ago)` : ''}</span>`
144
+ : '<span class="err">worker:DEAD</span>';
145
+ const diskLabel = health.diskFreeBytes !== null
146
+ ? `<span class="muted">disk:${fmtBytes(health.diskFreeBytes)} free</span>`
147
+ : '<span class="muted">disk:n/a</span>';
148
+ const failingNote = failing.length > 0
149
+ ? ` <span class="err">(failing: ${failing.map(esc).join(', ')})</span>`
150
+ : '';
151
+ return `<div class="banner ${cls}">
152
+ <span class="dot" style="color:${dotColor}">●</span>
153
+ <span><strong>DAEMON ${label}</strong>${failingNote}</span>
154
+ ${embedLabel}
155
+ ${workerLabel}
156
+ ${diskLabel}
157
+ </div>`;
158
+ }
159
+ // ---------------------------------------------------------------------------
160
+ // Pipeline row
161
+ // ---------------------------------------------------------------------------
162
+ function stageCounts(byKind, kind) {
163
+ let pending = 0;
164
+ let running = 0;
165
+ for (const row of byKind) {
166
+ if (row.kind !== kind)
167
+ continue;
168
+ if (row.state === 'pending')
169
+ pending = row.count;
170
+ if (row.state === 'running')
171
+ running = row.count;
172
+ }
173
+ return { pending, running };
174
+ }
175
+ function renderPipeline(data) {
176
+ const ingested24h = data.hourlyThroughput.reduce((sum, r) => sum + r.count, 0);
177
+ const distill = stageCounts(data.jobStatesByKind, 'distill');
178
+ const consolidate = stageCounts(data.jobStatesByKind, 'consolidate');
179
+ const reembed = stageCounts(data.jobStatesByKind, 'reembed');
180
+ const stages = [
181
+ { name: 'ingest', val: `${ingested24h}<span class="muted"> /24h</span>` },
182
+ { name: 'distill', val: `${distill.pending}p / ${distill.running}r` },
183
+ { name: 'entity-link', val: `${data.entityLinkage.entityCount} ent / ${data.entityLinkage.unlinkedMemoryCount} unlinked` },
184
+ { name: 'embed', val: `${reembed.pending}p / ${reembed.running}r` },
185
+ { name: 'consolidate', val: `${consolidate.pending}p / ${consolidate.running}r` },
186
+ { name: 'index', val: '<span class="ok">ok</span>' },
187
+ ];
188
+ const cells = stages.map((s, i) => {
189
+ const arrow = i > 0 ? '<span class="arrow">&rarr;</span>' : '';
190
+ return `${arrow}<div class="stage"><div class="name">${esc(s.name)}</div><div class="val">${s.val}</div></div>`;
191
+ }).join('');
192
+ return `<div class="pipeline-title">Pipeline</div>
193
+ <div class="pipeline">${cells}</div>`;
194
+ }
195
+ // ---------------------------------------------------------------------------
196
+ // Jobs / Consolidation / Providers strip
197
+ // ---------------------------------------------------------------------------
198
+ function jobStateTotal(states, state) {
199
+ return states.find(s => s.state === state)?.count ?? 0;
200
+ }
201
+ function renderJobsStrip(data) {
202
+ const pending = jobStateTotal(data.jobStates, 'pending');
203
+ const running = jobStateTotal(data.jobStates, 'running');
204
+ const failed = jobStateTotal(data.jobStates, 'failed');
205
+ const poison = jobStateTotal(data.jobStates, 'poison');
206
+ const poisonCls = poison > 0 ? 'err' : 'muted';
207
+ return `<div class="strip">
208
+ <h3>Jobs</h3>
209
+ <div>pending <strong>${pending}</strong> &nbsp; running <strong>${running}</strong></div>
210
+ <div>failed <strong>${failed}</strong> &nbsp; poison <strong class="${poisonCls}">${poison}</strong>${poison > 0 ? ' &#9888;' : ''}</div>
211
+ <div class="muted"><a href="/dashboard/jobs" style="color:#3a7bd5">view jobs &rarr;</a></div>
212
+ </div>`;
213
+ }
214
+ function renderConsolidationStrip(data) {
215
+ const { count, oldest } = data.consolidation;
216
+ const body = count === 0
217
+ ? '<div class="muted">0 pending proposals</div>'
218
+ : `<div>&#9679; <strong>${count}</strong> pending proposal${count === 1 ? '' : 's'}</div>
219
+ <div class="muted">oldest: ${oldest !== null ? fmtAgeMs(Date.now() - oldest) : '—'}</div>`;
220
+ return `<div class="strip">
221
+ <h3>Consolidation</h3>
222
+ ${body}
223
+ <div class="muted"><a href="/dashboard/consolidation" style="color:#3a7bd5">resolve &rarr;</a></div>
224
+ </div>`;
225
+ }
226
+ function renderProvidersStrip(data) {
227
+ if (data.providers.length === 0) {
228
+ return `<div class="strip">
229
+ <h3>Providers / Storage</h3>
230
+ <div class="muted">no providers registered</div>
231
+ </div>`;
232
+ }
233
+ const rows = data.providers.map(p => {
234
+ const ok = p.last_health_ok ? '<span class="ok">OK</span>' : '<span class="err">FAIL</span>';
235
+ const dim = p.dim ?? '—';
236
+ return `<div>${esc(p.provider)}/${esc(p.model)} <span class="muted">${dim}-dim</span> &middot; ${ok}</div>`;
237
+ }).join('');
238
+ return `<div class="strip">
239
+ <h3>Providers / Storage</h3>
240
+ ${rows}
241
+ </div>`;
242
+ }
243
+ // ---------------------------------------------------------------------------
244
+ // Budget + usefulness tiles (collapsed per AC-5)
245
+ // ---------------------------------------------------------------------------
246
+ function renderBudgetTile(data, dailyCap) {
247
+ const todayUsd = data.todaySpend?.usd_total ?? 0;
248
+ const color = budgetColor(todayUsd, dailyCap);
249
+ return `<div class="strip">
250
+ <h3>Budget</h3>
251
+ <div class="big" style="color:${color}">$${todayUsd.toFixed(2)} <span class="muted" style="font-size:12px">/ cap $${dailyCap.toFixed(2)}</span></div>
252
+ </div>`;
253
+ }
254
+ function renderUsefulnessTile(usefulness) {
255
+ return `<div class="strip">
256
+ <h3>Usefulness (7d)</h3>
257
+ <div class="big">${fmtRate(usefulness.rate)}</div>
258
+ <div class="muted">of ${usefulness.served} served recalls marked used (${usefulness.used})</div>
259
+ </div>`;
260
+ }
261
+ /** AC-5: replaces the old full 25-row "recent captures" table with a merged
262
+ * feed of failures (from recentFailedJobs) and a handful of new memories
263
+ * (from recentMemories), newest first. Individual consolidation proposals
264
+ * aren't in this feed — queryDashboard only exposes the aggregate
265
+ * ConsolidationSummary (count/oldest), which the Consolidation strip above
266
+ * already surfaces; per-row proposal entries belong to the dedicated
267
+ * /dashboard/consolidation page. */
268
+ function renderActivityFeed(data) {
269
+ const rows = [];
270
+ for (const job of data.recentFailedJobs) {
271
+ const stateCls = job.state === 'poison' ? 'err' : 'warn';
272
+ const err = job.last_error ? esc(truncate(job.last_error, 60)) : '<span class="muted">(no error text)</span>';
273
+ rows.push({
274
+ ts: job.updated_at,
275
+ html: `<tr>
276
+ <td class="muted" style="width:90px">${esc(fmtTime(job.updated_at))}</td>
277
+ <td><span class="badge ${stateCls}">${esc(job.state)}</span></td>
278
+ <td>${esc(job.kind)}</td>
279
+ <td class="trunc">${err}</td>
280
+ </tr>`,
281
+ });
282
+ }
283
+ for (const mem of data.recentMemories.slice(0, 8)) {
284
+ rows.push({
285
+ ts: mem.created_at,
286
+ html: `<tr>
287
+ <td class="muted" style="width:90px">${esc(fmtTime(mem.created_at))}</td>
288
+ <td><span class="badge" style="background:#2a2a2a;color:#aaa">memory</span></td>
289
+ <td>${esc(mem.type)}</td>
290
+ <td class="trunc">${esc(truncate(mem.text, 70))}</td>
291
+ </tr>`,
292
+ });
293
+ }
294
+ if (rows.length === 0) {
295
+ return '<p class="muted">No recent activity.</p>';
296
+ }
297
+ rows.sort((a, b) => b.ts - a.ts);
298
+ const trs = rows.slice(0, 15).map(r => r.html).join('');
299
+ return `<table>
300
+ <thead><tr><th>Time</th><th>Kind</th><th>Detail</th><th>Info</th></tr></thead>
301
+ <tbody>${trs}</tbody>
302
+ </table>`;
303
+ }
304
+ // ---------------------------------------------------------------------------
305
+ // Main export
306
+ // ---------------------------------------------------------------------------
307
+ export function renderDashboard(data, config) {
308
+ const now = new Date().toLocaleString(undefined, { hour12: false });
309
+ const dailyCap = config.budget.daily_usd;
310
+ const { label } = bannerStatus(data.health);
311
+ const statusColor = label === 'OK' ? '#2ecc71' : label === 'DEGRADED' ? '#e74c3c' : '#888';
312
+ return `<!DOCTYPE html>
313
+ <html lang="en">
314
+ <head>
315
+ <meta charset="utf-8">
316
+ <meta name="viewport" content="width=device-width,initial-scale=1">
317
+ <meta http-equiv="refresh" content="5">
318
+ <title>AstraMemory Dashboard</title>
319
+ <style>${CSS}</style>
320
+ </head>
321
+ <body>
322
+ <h1>AstraMemory Local</h1>
323
+ <span class="meta">
324
+ v${esc(PKG_VERSION)} &middot;
325
+ schema ${SCHEMA_VERSION} &middot;
326
+ wire: ${esc(WIRE_VERSIONS_SUPPORTED.join(', '))} &middot;
327
+ <span style="color:${statusColor}">${label}</span> &#9679;
328
+ </span>
329
+
330
+ <nav>
331
+ <span class="active">Mission Control</span>
332
+ <a href="/dashboard/jobs">Jobs</a>
333
+ <a href="/dashboard/consolidation">Consolidation</a>
334
+ <a href="/dashboard/search">Search</a>
335
+ <a href="/dashboard/api">API</a>
336
+ <span class="asof">as of ${esc(now)}</span>
337
+ </nav>
338
+
339
+ <section>
340
+ ${renderBanner(data.health)}
341
+ </section>
342
+
343
+ <section>
344
+ ${renderPipeline(data)}
345
+ </section>
346
+
347
+ <section class="strips">
348
+ ${renderJobsStrip(data)}
349
+ ${renderConsolidationStrip(data)}
350
+ ${renderProvidersStrip(data)}
351
+ </section>
352
+
353
+ <section class="strips2">
354
+ ${renderBudgetTile(data, dailyCap)}
355
+ ${renderUsefulnessTile(data.usefulness)}
356
+ </section>
357
+
358
+ <section>
359
+ <h2 style="font-size:14px;color:#aaa;margin-bottom:8px;text-transform:uppercase;letter-spacing:.05em">Recent activity / errors</h2>
360
+ ${renderActivityFeed(data)}
361
+ </section>
362
+ </body>
363
+ </html>`;
364
+ }
365
+ //# sourceMappingURL=dashboard-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-html.js","sourceRoot":"","sources":["../../../src/server/routes/dashboard-html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * GET /dashboard/jobs — kind × state matrix + failed/poison detail
3
+ * (FEAT-410 wave 2, SLICE-410-5).
4
+ *
5
+ * Backed by queryJobStatesByKind + queryRecentFailedJobs (queries/dashboard.ts,
6
+ * SLICE-410-1's contract). The route registration in app.ts and the auth
7
+ * wrapper below are unchanged from the SLICE-410-1 stub.
8
+ *
9
+ * Auth mirrors src/server/routes/dashboard.ts (Bearer header or the
10
+ * HttpOnly `astramem_dash` cookie bootstrapped there) but the check is
11
+ * duplicated locally by design — see dashboard-consolidation-html.ts for
12
+ * the same rationale. CSS/esc/age-formatting helpers are likewise
13
+ * duplicated locally rather than imported from dashboard-html.ts (out of
14
+ * scope for this slice).
15
+ */
16
+ import type { FastifyInstance } from 'fastify';
17
+ import type { DB } from '../../storage/db.js';
18
+ export declare function dashboardJobsRoute(db: DB, token: string): (app: FastifyInstance) => Promise<void>;
@@ -0,0 +1,186 @@
1
+ /**
2
+ * GET /dashboard/jobs — kind × state matrix + failed/poison detail
3
+ * (FEAT-410 wave 2, SLICE-410-5).
4
+ *
5
+ * Backed by queryJobStatesByKind + queryRecentFailedJobs (queries/dashboard.ts,
6
+ * SLICE-410-1's contract). The route registration in app.ts and the auth
7
+ * wrapper below are unchanged from the SLICE-410-1 stub.
8
+ *
9
+ * Auth mirrors src/server/routes/dashboard.ts (Bearer header or the
10
+ * HttpOnly `astramem_dash` cookie bootstrapped there) but the check is
11
+ * duplicated locally by design — see dashboard-consolidation-html.ts for
12
+ * the same rationale. CSS/esc/age-formatting helpers are likewise
13
+ * duplicated locally rather than imported from dashboard-html.ts (out of
14
+ * scope for this slice).
15
+ */
16
+ import { queryJobStatesByKind, queryRecentFailedJobs, } from '../queries/dashboard.js';
17
+ const COOKIE_NAME = 'astramem_dash';
18
+ function readCookie(req, name) {
19
+ const header = req.headers.cookie;
20
+ if (!header)
21
+ return undefined;
22
+ for (const part of header.split(';')) {
23
+ const eq = part.indexOf('=');
24
+ if (eq === -1)
25
+ continue;
26
+ if (part.slice(0, eq).trim() === name)
27
+ return part.slice(eq + 1).trim();
28
+ }
29
+ return undefined;
30
+ }
31
+ function esc(s) {
32
+ return s
33
+ .replace(/&/g, '&amp;')
34
+ .replace(/</g, '&lt;')
35
+ .replace(/>/g, '&gt;')
36
+ .replace(/"/g, '&quot;');
37
+ }
38
+ /** Mirrors dashboard-html.ts's mockup format ("2h 4m", "40m", "12s"). */
39
+ function fmtAgeMs(msIn) {
40
+ const ms = Math.max(0, msIn);
41
+ if (ms < 60_000)
42
+ return `${Math.floor(ms / 1000)}s`;
43
+ if (ms < 3_600_000)
44
+ return `${Math.floor(ms / 60_000)}m`;
45
+ const h = Math.floor(ms / 3_600_000);
46
+ const m = Math.floor((ms % 3_600_000) / 60_000);
47
+ return m > 0 ? `${h}h ${m}m` : `${h}h`;
48
+ }
49
+ const CSS = `
50
+ *{box-sizing:border-box;margin:0;padding:0}
51
+ body{background:#1a1a1a;color:#e0e0e0;font-family:monospace;font-size:13px;line-height:1.5;padding:16px}
52
+ h1{font-size:18px;color:#fff;margin-bottom:4px}
53
+ h2{font-size:14px;color:#aaa;margin:20px 0 8px;border-bottom:1px solid #333;padding-bottom:4px;text-transform:uppercase;letter-spacing:.05em}
54
+ section{margin-bottom:24px}
55
+ table{width:100%;border-collapse:collapse;font-size:12px}
56
+ th{background:#222;color:#aaa;text-align:left;padding:5px 8px;font-weight:normal;text-transform:uppercase;letter-spacing:.04em}
57
+ td{padding:4px 8px;border-bottom:1px solid #252525;font-variant-numeric:tabular-nums}
58
+ tr:nth-child(odd) td{background:#1e1e1e}
59
+ tr:hover td{background:#242424}
60
+ .num{text-align:right;font-variant-numeric:tabular-nums}
61
+ .err{color:#e74c3c}
62
+ .warn{color:#f39c12}
63
+ .muted{color:#666}
64
+ .err-text{white-space:pre-wrap;word-break:break-word}
65
+ `.trim();
66
+ const STATE_COLUMNS = ['pending', 'running', 'completed', 'failed', 'poison'];
67
+ /** AC-1: kind x state matrix. Only the 5 states in STATE_COLUMNS are shown;
68
+ * other states (e.g. "paused") are intentionally out of scope for this view. */
69
+ function buildMatrix(rows) {
70
+ const byKind = new Map();
71
+ for (const row of rows) {
72
+ if (!byKind.has(row.kind)) {
73
+ byKind.set(row.kind, { pending: 0, running: 0, completed: 0, failed: 0, poison: 0 });
74
+ }
75
+ const counts = byKind.get(row.kind);
76
+ if (STATE_COLUMNS.includes(row.state)) {
77
+ counts[row.state] = row.count;
78
+ }
79
+ }
80
+ return [...byKind.entries()]
81
+ .sort(([a], [b]) => a.localeCompare(b))
82
+ .map(([kind, counts]) => ({ kind, counts }));
83
+ }
84
+ function renderMatrix(rows) {
85
+ const matrix = buildMatrix(rows);
86
+ if (matrix.length === 0) {
87
+ return '<p class="muted">No jobs recorded yet.</p>';
88
+ }
89
+ const trs = matrix.map(m => {
90
+ const cells = STATE_COLUMNS.map(state => {
91
+ const n = m.counts[state];
92
+ const cls = (state === 'failed' || state === 'poison') && n > 0 ? ' class="num err"' : ' class="num"';
93
+ return `<td${cls}>${n}</td>`;
94
+ }).join('');
95
+ return `<tr><td>${esc(m.kind)}</td>${cells}</tr>`;
96
+ }).join('');
97
+ return `<table>
98
+ <thead><tr>
99
+ <th>Kind</th><th class="num">Pending</th><th class="num">Running</th>
100
+ <th class="num">Completed (24h)</th><th class="num">Failed</th><th class="num">Poison</th>
101
+ </tr></thead>
102
+ <tbody>${trs}</tbody>
103
+ </table>`;
104
+ }
105
+ /** AC-2: RecentFailedJob (queries/dashboard.ts) does not carry `attempts` —
106
+ * a small ad-hoc lookup against the jobs table fills it in locally rather
107
+ * than widening the SLICE-410-1 query contract (out of scope for this slice). */
108
+ function queryAttemptsForIds(db, ids) {
109
+ if (ids.length === 0)
110
+ return new Map();
111
+ const placeholders = ids.map(() => '?').join(',');
112
+ const rows = db.prepare(`SELECT id, attempts FROM jobs WHERE id IN (${placeholders})`).all(...ids);
113
+ return new Map(rows.map(r => [r.id, r.attempts]));
114
+ }
115
+ /** AC-3: explicit empty state. AC-6: age from updated_at only. */
116
+ function renderDetail(jobs, attemptsById, now) {
117
+ if (jobs.length === 0) {
118
+ return '<p class="muted">No failed or poison jobs</p>';
119
+ }
120
+ const trs = jobs.map(j => {
121
+ const attempts = attemptsById.get(j.id) ?? '<span class="muted">—</span>';
122
+ const errText = j.last_error !== null ? esc(j.last_error) : '<span class="muted">—</span>';
123
+ const age = fmtAgeMs(now - j.updated_at);
124
+ const stateCls = j.state === 'poison' || j.state === 'failed' ? ' class="err"' : '';
125
+ return `<tr>
126
+ <td>${esc(j.id)}</td>
127
+ <td>${esc(j.kind)}</td>
128
+ <td${stateCls}>${esc(j.state)}</td>
129
+ <td class="num">${attempts}</td>
130
+ <td class="err-text">${errText}</td>
131
+ <td class="muted">${esc(age)}</td>
132
+ </tr>`;
133
+ }).join('');
134
+ return `<table>
135
+ <thead><tr>
136
+ <th>ID</th><th>Kind</th><th>State</th><th class="num">Attempts</th><th>Last error</th><th>Age</th>
137
+ </tr></thead>
138
+ <tbody>${trs}</tbody>
139
+ </table>`;
140
+ }
141
+ function renderPage(jobStatesByKind, failedJobs, attemptsById, now) {
142
+ return `<!DOCTYPE html>
143
+ <html lang="en">
144
+ <head>
145
+ <meta charset="utf-8">
146
+ <meta name="viewport" content="width=device-width,initial-scale=1">
147
+ <title>AstraMemory Dashboard — Jobs</title>
148
+ <style>${CSS}</style>
149
+ </head>
150
+ <body>
151
+ <h1>AstraMemory Local — Jobs</h1>
152
+ <section>
153
+ <h2>Kind &times; state</h2>
154
+ ${renderMatrix(jobStatesByKind)}
155
+ </section>
156
+ <section>
157
+ <h2>Failed / poison detail</h2>
158
+ ${renderDetail(failedJobs, attemptsById, now)}
159
+ </section>
160
+ </body>
161
+ </html>`;
162
+ }
163
+ export function dashboardJobsRoute(db, token) {
164
+ return async (app) => {
165
+ app.get('/dashboard/jobs', async (req, reply) => {
166
+ const authHeader = req.headers.authorization;
167
+ const bearerOk = authHeader === `Bearer ${token}`;
168
+ const cookieOk = readCookie(req, COOKIE_NAME) === token;
169
+ if (!bearerOk && !cookieOk) {
170
+ return reply
171
+ .code(401)
172
+ .header('content-type', 'text/plain; charset=utf-8')
173
+ .send('401 Unauthorized');
174
+ }
175
+ const jobStatesByKind = queryJobStatesByKind(db);
176
+ const failedJobs = queryRecentFailedJobs(db);
177
+ const attemptsById = queryAttemptsForIds(db, failedJobs.map(j => j.id));
178
+ return reply
179
+ .code(200)
180
+ .header('content-type', 'text/html; charset=utf-8')
181
+ .header('cache-control', 'no-store')
182
+ .send(renderPage(jobStatesByKind, failedJobs, attemptsById, Date.now()));
183
+ });
184
+ };
185
+ }
186
+ //# sourceMappingURL=dashboard-jobs-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-jobs-html.js","sourceRoot":"","sources":["../../../src/server/routes/dashboard-jobs-html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * GET /dashboard/search — search debug page (FEAT-410 wave 2, SLICE-410-6).
3
+ *
4
+ * Plain GET `<form>` (query in the URL) rendering the per-candidate fusion
5
+ * score table from SLICE-410-3's `debug: true` search() path, plus the
6
+ * current fuse.ts weights (src/config/config.ts `search` defaults). Zero JS.
7
+ *
8
+ * Auth mirrors src/server/routes/dashboard.ts (Bearer header or the
9
+ * HttpOnly `astramem_dash` cookie bootstrapped there) but the check is
10
+ * duplicated locally by design — see dashboard-consolidation-html.ts for
11
+ * the same rationale. HTML escaping is likewise duplicated locally rather
12
+ * than importing dashboard-html.ts's `esc()` (SLICE-410-6 scope: this file
13
+ * + its tests only).
14
+ */
15
+ import type { FastifyInstance } from 'fastify';
16
+ import type { DB } from '../../storage/db.js';
17
+ import type { EmbedProvider } from '../../contracts/index.js';
18
+ export declare function dashboardSearchRoute(db: DB, embed: EmbedProvider, token: string): (app: FastifyInstance) => Promise<void>;