hippo-memory 1.60.0 → 1.62.0

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 (593) hide show
  1. package/README.md +29 -54
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.d.ts +1 -1
  4. package/dist/agent-memories/apply.js +4 -1
  5. package/dist/agent-memories/claude-code.d.ts +3 -1
  6. package/dist/agent-memories/claude-code.js +54 -10
  7. package/dist/agent-memories/codex.js +1 -1
  8. package/dist/agent-memories/gemini.js +1 -1
  9. package/dist/agent-memories/legacy.js +1 -1
  10. package/dist/agent-memories/source.js +1 -1
  11. package/dist/agent-memories/sync.d.ts +3 -3
  12. package/dist/agent-memories/sync.js +22 -9
  13. package/dist/agent-memories/types.d.ts +0 -2
  14. package/dist/ambient-store.d.ts +14 -0
  15. package/dist/ambient-store.js +90 -0
  16. package/dist/ambient.d.ts +23 -0
  17. package/dist/ambient.js +72 -50
  18. package/dist/api/assemble.d.ts +93 -0
  19. package/dist/api/assemble.js +153 -0
  20. package/dist/api/audit.d.ts +17 -0
  21. package/dist/api/audit.js +23 -0
  22. package/dist/api/auth.d.ts +79 -0
  23. package/dist/api/auth.js +178 -0
  24. package/dist/api/context-select.d.ts +49 -0
  25. package/dist/api/context-select.js +344 -0
  26. package/dist/api/context-types.d.ts +105 -0
  27. package/dist/api/context-types.js +3 -0
  28. package/dist/api/context.d.ts +31 -0
  29. package/dist/api/context.js +378 -0
  30. package/dist/api/dormant.d.ts +30 -0
  31. package/dist/api/dormant.js +140 -0
  32. package/dist/api/drill-down.d.ts +84 -0
  33. package/dist/api/drill-down.js +126 -0
  34. package/dist/api/forget.d.ts +57 -0
  35. package/dist/api/forget.js +87 -0
  36. package/dist/api/goals.d.ts +18 -0
  37. package/dist/api/goals.js +33 -0
  38. package/dist/api/learn.d.ts +31 -0
  39. package/dist/api/learn.js +88 -0
  40. package/dist/api/outcome.d.ts +61 -0
  41. package/dist/api/outcome.js +66 -0
  42. package/dist/api/promote.d.ts +54 -0
  43. package/dist/api/promote.js +192 -0
  44. package/dist/api/quarantine.d.ts +24 -0
  45. package/dist/api/quarantine.js +121 -0
  46. package/dist/api/recall-types.d.ts +390 -0
  47. package/dist/api/recall-types.js +3 -0
  48. package/dist/api/recall.d.ts +36 -0
  49. package/dist/api/recall.js +499 -0
  50. package/dist/api/remember.d.ts +35 -0
  51. package/dist/api/remember.js +43 -0
  52. package/dist/api/sleep.d.ts +136 -0
  53. package/dist/api/sleep.js +256 -0
  54. package/dist/api/tokens.d.ts +26 -0
  55. package/dist/api/tokens.js +60 -0
  56. package/dist/api/types.d.ts +56 -0
  57. package/dist/api/types.js +38 -0
  58. package/dist/api.d.ts +20 -1262
  59. package/dist/api.js +25 -2727
  60. package/dist/audit.d.ts +3 -0
  61. package/dist/audit.js +6 -3
  62. package/dist/auth.d.ts +45 -4
  63. package/dist/auth.js +125 -48
  64. package/dist/autolearn.js +2 -2
  65. package/dist/capture/command.d.ts +33 -0
  66. package/dist/capture/command.js +264 -0
  67. package/dist/capture/compact.d.ts +44 -0
  68. package/dist/capture/compact.js +354 -0
  69. package/dist/capture/extract.d.ts +21 -0
  70. package/dist/capture/extract.js +464 -0
  71. package/dist/capture/transcript.d.ts +40 -0
  72. package/dist/capture/transcript.js +193 -0
  73. package/dist/capture-error.js +2 -1
  74. package/dist/churn-git.js +4 -2
  75. package/dist/cli/audit.d.ts +3 -0
  76. package/dist/cli/audit.js +159 -0
  77. package/dist/cli/auth.d.ts +2 -0
  78. package/dist/cli/auth.js +171 -0
  79. package/dist/cli/briefs.d.ts +4 -0
  80. package/dist/cli/briefs.js +453 -0
  81. package/dist/cli/card.d.ts +3 -0
  82. package/dist/cli/card.js +333 -0
  83. package/dist/cli/context.d.ts +15 -0
  84. package/dist/cli/context.js +376 -0
  85. package/dist/cli/continuity.d.ts +6 -0
  86. package/dist/cli/continuity.js +457 -0
  87. package/dist/cli/curate.d.ts +19 -0
  88. package/dist/cli/curate.js +556 -0
  89. package/dist/cli/dag.d.ts +5 -0
  90. package/dist/cli/dag.js +177 -0
  91. package/dist/cli/decisions.d.ts +4 -0
  92. package/dist/cli/decisions.js +528 -0
  93. package/dist/cli/eval.d.ts +5 -0
  94. package/dist/cli/eval.js +213 -0
  95. package/dist/cli/explain.d.ts +4 -0
  96. package/dist/cli/explain.js +156 -0
  97. package/dist/cli/goals.d.ts +2 -0
  98. package/dist/cli/goals.js +196 -0
  99. package/dist/cli/hook-blocks.d.ts +18 -0
  100. package/dist/cli/hook-blocks.js +233 -0
  101. package/dist/cli/init.d.ts +2 -0
  102. package/dist/cli/init.js +305 -0
  103. package/dist/cli/maintenance.d.ts +4 -0
  104. package/dist/cli/maintenance.js +190 -0
  105. package/dist/cli/playbooks.d.ts +4 -0
  106. package/dist/cli/playbooks.js +573 -0
  107. package/dist/cli/projects.js +9 -6
  108. package/dist/cli/recall.d.ts +7 -0
  109. package/dist/cli/recall.js +582 -0
  110. package/dist/cli/remember.d.ts +5 -0
  111. package/dist/cli/remember.js +485 -0
  112. package/dist/cli/serve.d.ts +5 -0
  113. package/dist/cli/serve.js +40 -0
  114. package/dist/cli/session-hooks.d.ts +29 -0
  115. package/dist/cli/session-hooks.js +647 -0
  116. package/dist/cli/setup.d.ts +4 -0
  117. package/dist/cli/setup.js +397 -0
  118. package/dist/cli/shared.d.ts +15 -19
  119. package/dist/cli/shared.js +50 -341
  120. package/dist/cli/slack.d.ts +2 -0
  121. package/dist/cli/slack.js +171 -0
  122. package/dist/cli/status.d.ts +18 -0
  123. package/dist/cli/status.js +409 -0
  124. package/dist/cli/transfer.d.ts +10 -0
  125. package/dist/cli/transfer.js +424 -0
  126. package/dist/cli/usage.d.ts +85 -0
  127. package/dist/cli/usage.js +741 -0
  128. package/dist/cli.d.ts +71 -120
  129. package/dist/cli.js +170 -8469
  130. package/dist/client.js +15 -8
  131. package/dist/compaction-record.d.ts +0 -2
  132. package/dist/compaction-record.js +7 -5
  133. package/dist/connectors/github/backfill.js +94 -87
  134. package/dist/connectors/github/cli-impl.js +4 -3
  135. package/dist/connectors/github/dlq.js +67 -54
  136. package/dist/connectors/github/ingest.js +34 -35
  137. package/dist/connectors/github/tenant-routing.js +3 -2
  138. package/dist/connectors/github/webhook.js +135 -216
  139. package/dist/connectors/slack/dlq.js +49 -61
  140. package/dist/connectors/slack/ingest.js +55 -48
  141. package/dist/connectors/slack/tenant-routing.js +4 -3
  142. package/dist/connectors/slack/webhook.js +72 -74
  143. package/dist/consolidate/conflicts.d.ts +10 -0
  144. package/dist/consolidate/conflicts.js +178 -0
  145. package/dist/consolidate/decay.d.ts +12 -0
  146. package/dist/consolidate/decay.js +145 -0
  147. package/dist/consolidate/llm-passes.d.ts +3 -0
  148. package/dist/consolidate/llm-passes.js +141 -0
  149. package/dist/consolidate/merge.d.ts +7 -0
  150. package/dist/consolidate/merge.js +251 -0
  151. package/dist/consolidate/physics-pass.d.ts +3 -0
  152. package/dist/consolidate/physics-pass.js +60 -0
  153. package/dist/consolidate/run.d.ts +69 -0
  154. package/dist/consolidate/run.js +76 -0
  155. package/dist/consolidate/sleep.d.ts +18 -0
  156. package/dist/consolidate/sleep.js +209 -0
  157. package/dist/consolidate/traces.d.ts +4 -0
  158. package/dist/consolidate/traces.js +178 -0
  159. package/dist/context-auto.js +7 -11
  160. package/dist/context-render.d.ts +1 -1
  161. package/dist/context-render.js +1 -1
  162. package/dist/customer-notes.d.ts +3 -0
  163. package/dist/customer-notes.js +83 -72
  164. package/dist/dag.js +225 -188
  165. package/dist/dashboard-actions.d.ts +20 -0
  166. package/dist/dashboard-actions.js +88 -0
  167. package/dist/dashboard-params.d.ts +45 -0
  168. package/dist/dashboard-params.js +127 -0
  169. package/dist/dashboard-queries.d.ts +15 -0
  170. package/dist/dashboard-queries.js +355 -0
  171. package/dist/dashboard-snapshot.d.ts +138 -0
  172. package/dist/dashboard-snapshot.js +308 -0
  173. package/dist/dashboard-types.d.ts +163 -0
  174. package/dist/dashboard-types.js +3 -0
  175. package/dist/dashboard.d.ts +6 -7
  176. package/dist/dashboard.js +228 -202
  177. package/dist/db/busy.d.ts +5 -0
  178. package/dist/db/busy.js +24 -0
  179. package/dist/db/continuity.d.ts +5 -0
  180. package/dist/db/continuity.js +145 -0
  181. package/dist/db/meta.d.ts +8 -0
  182. package/dist/db/meta.js +35 -0
  183. package/dist/db/migrate.d.ts +9 -0
  184. package/dist/db/migrate.js +138 -0
  185. package/dist/db/migrations/index.d.ts +5 -0
  186. package/dist/db/migrations/index.js +109 -0
  187. package/dist/db/migrations/types.d.ts +14 -0
  188. package/dist/db/migrations/types.js +2 -0
  189. package/dist/db/migrations/v01.d.ts +3 -0
  190. package/dist/db/migrations/v01.js +38 -0
  191. package/dist/db/migrations/v02.d.ts +3 -0
  192. package/dist/db/migrations/v02.js +21 -0
  193. package/dist/db/migrations/v03.d.ts +3 -0
  194. package/dist/db/migrations/v03.js +22 -0
  195. package/dist/db/migrations/v04.d.ts +3 -0
  196. package/dist/db/migrations/v04.js +28 -0
  197. package/dist/db/migrations/v05.d.ts +3 -0
  198. package/dist/db/migrations/v05.js +21 -0
  199. package/dist/db/migrations/v06.d.ts +3 -0
  200. package/dist/db/migrations/v06.js +25 -0
  201. package/dist/db/migrations/v07.d.ts +3 -0
  202. package/dist/db/migrations/v07.js +13 -0
  203. package/dist/db/migrations/v08.d.ts +3 -0
  204. package/dist/db/migrations/v08.js +8 -0
  205. package/dist/db/migrations/v09.d.ts +3 -0
  206. package/dist/db/migrations/v09.js +13 -0
  207. package/dist/db/migrations/v10.d.ts +3 -0
  208. package/dist/db/migrations/v10.js +17 -0
  209. package/dist/db/migrations/v11.d.ts +3 -0
  210. package/dist/db/migrations/v11.js +15 -0
  211. package/dist/db/migrations/v12.d.ts +3 -0
  212. package/dist/db/migrations/v12.js +11 -0
  213. package/dist/db/migrations/v13.d.ts +3 -0
  214. package/dist/db/migrations/v13.js +15 -0
  215. package/dist/db/migrations/v14.d.ts +3 -0
  216. package/dist/db/migrations/v14.js +66 -0
  217. package/dist/db/migrations/v15.d.ts +3 -0
  218. package/dist/db/migrations/v15.js +42 -0
  219. package/dist/db/migrations/v16.d.ts +3 -0
  220. package/dist/db/migrations/v16.js +61 -0
  221. package/dist/db/migrations/v17.d.ts +3 -0
  222. package/dist/db/migrations/v17.js +46 -0
  223. package/dist/db/migrations/v18.d.ts +3 -0
  224. package/dist/db/migrations/v18.js +60 -0
  225. package/dist/db/migrations/v19.d.ts +3 -0
  226. package/dist/db/migrations/v19.js +28 -0
  227. package/dist/db/migrations/v20.d.ts +3 -0
  228. package/dist/db/migrations/v20.js +42 -0
  229. package/dist/db/migrations/v21.d.ts +3 -0
  230. package/dist/db/migrations/v21.js +16 -0
  231. package/dist/db/migrations/v22.d.ts +3 -0
  232. package/dist/db/migrations/v22.js +82 -0
  233. package/dist/db/migrations/v23.d.ts +3 -0
  234. package/dist/db/migrations/v23.js +48 -0
  235. package/dist/db/migrations/v24.d.ts +3 -0
  236. package/dist/db/migrations/v24.js +72 -0
  237. package/dist/db/migrations/v25.d.ts +3 -0
  238. package/dist/db/migrations/v25.js +46 -0
  239. package/dist/db/migrations/v26.d.ts +3 -0
  240. package/dist/db/migrations/v26.js +23 -0
  241. package/dist/db/migrations/v27.d.ts +3 -0
  242. package/dist/db/migrations/v27.js +57 -0
  243. package/dist/db/migrations/v28.d.ts +3 -0
  244. package/dist/db/migrations/v28.js +38 -0
  245. package/dist/db/migrations/v29.d.ts +3 -0
  246. package/dist/db/migrations/v29.js +78 -0
  247. package/dist/db/migrations/v30.d.ts +3 -0
  248. package/dist/db/migrations/v30.js +92 -0
  249. package/dist/db/migrations/v31.d.ts +3 -0
  250. package/dist/db/migrations/v31.js +74 -0
  251. package/dist/db/migrations/v32.d.ts +3 -0
  252. package/dist/db/migrations/v32.js +102 -0
  253. package/dist/db/migrations/v33.d.ts +3 -0
  254. package/dist/db/migrations/v33.js +104 -0
  255. package/dist/db/migrations/v34.d.ts +3 -0
  256. package/dist/db/migrations/v34.js +93 -0
  257. package/dist/db/migrations/v35.d.ts +3 -0
  258. package/dist/db/migrations/v35.js +98 -0
  259. package/dist/db/migrations/v36.d.ts +3 -0
  260. package/dist/db/migrations/v36.js +98 -0
  261. package/dist/db/migrations/v37.d.ts +3 -0
  262. package/dist/db/migrations/v37.js +219 -0
  263. package/dist/db/migrations/v38.d.ts +3 -0
  264. package/dist/db/migrations/v38.js +277 -0
  265. package/dist/db/migrations/v39.d.ts +3 -0
  266. package/dist/db/migrations/v39.js +59 -0
  267. package/dist/db/migrations/v40.d.ts +3 -0
  268. package/dist/db/migrations/v40.js +74 -0
  269. package/dist/db/migrations/v41.d.ts +3 -0
  270. package/dist/db/migrations/v41.js +43 -0
  271. package/dist/db/migrations/v42.d.ts +3 -0
  272. package/dist/db/migrations/v42.js +41 -0
  273. package/dist/db/migrations/v43.d.ts +3 -0
  274. package/dist/db/migrations/v43.js +67 -0
  275. package/dist/db/migrations/v44.d.ts +3 -0
  276. package/dist/db/migrations/v44.js +28 -0
  277. package/dist/db/migrations/v45.d.ts +3 -0
  278. package/dist/db/migrations/v45.js +30 -0
  279. package/dist/db/migrations/v46.d.ts +3 -0
  280. package/dist/db/migrations/v46.js +25 -0
  281. package/dist/db/migrations/v47.d.ts +3 -0
  282. package/dist/db/migrations/v47.js +17 -0
  283. package/dist/db/migrations/v48.d.ts +3 -0
  284. package/dist/db/migrations/v48.js +10 -0
  285. package/dist/db/migrations/v49.d.ts +3 -0
  286. package/dist/db/migrations/v49.js +31 -0
  287. package/dist/db/migrations/v50.d.ts +3 -0
  288. package/dist/db/migrations/v50.js +67 -0
  289. package/dist/db/migrations/v51.d.ts +3 -0
  290. package/dist/db/migrations/v51.js +14 -0
  291. package/dist/db/migrations/v52.d.ts +3 -0
  292. package/dist/db/migrations/v52.js +7 -0
  293. package/dist/db/open.d.ts +23 -0
  294. package/dist/db/open.js +146 -0
  295. package/dist/db/sqlite.d.ts +21 -0
  296. package/dist/db/sqlite.js +8 -0
  297. package/dist/db/tables.d.ts +7 -0
  298. package/dist/db/tables.js +38 -0
  299. package/dist/db.d.ts +6 -46
  300. package/dist/db.js +5 -3049
  301. package/dist/decisions.d.ts +4 -1
  302. package/dist/decisions.js +102 -83
  303. package/dist/dedupe.js +3 -2
  304. package/dist/delivery-recorder.js +4 -1
  305. package/dist/doctor.js +14 -10
  306. package/dist/embedding-provider.d.ts +1 -1
  307. package/dist/embedding-provider.js +4 -3
  308. package/dist/embeddings.d.ts +9 -52
  309. package/dist/embeddings.js +43 -297
  310. package/dist/env.d.ts +75 -0
  311. package/dist/env.js +119 -0
  312. package/dist/eval-suite.js +1 -1
  313. package/dist/eval.js +2 -2
  314. package/dist/extract.js +1 -1
  315. package/dist/gated-write.js +3 -1
  316. package/dist/goals.d.ts +3 -1
  317. package/dist/goals.js +117 -86
  318. package/dist/graph/read.d.ts +73 -0
  319. package/dist/graph/read.js +325 -0
  320. package/dist/graph/rows.d.ts +45 -0
  321. package/dist/graph/rows.js +51 -0
  322. package/dist/graph/types.d.ts +83 -0
  323. package/dist/graph/types.js +11 -0
  324. package/dist/graph/write.d.ts +93 -0
  325. package/dist/{graph.js → graph/write.js} +6 -384
  326. package/dist/graph-extract.js +2 -1
  327. package/dist/graph-recall.d.ts +1 -1
  328. package/dist/graph-recall.js +2 -2
  329. package/dist/graph-stream.js +1 -1
  330. package/dist/graph-view.d.ts +1 -1
  331. package/dist/graph-view.js +1 -1
  332. package/dist/half-life-migration.d.ts +1 -1
  333. package/dist/half-life-migration.js +2 -1
  334. package/dist/hooks/codex-session.d.ts +8 -0
  335. package/dist/hooks/codex-session.js +76 -0
  336. package/dist/hooks/codex-wrapper.d.ts +55 -0
  337. package/dist/hooks/codex-wrapper.js +288 -0
  338. package/dist/hooks/json-hooks.d.ts +63 -0
  339. package/dist/hooks/json-hooks.js +356 -0
  340. package/dist/hooks/opencode.d.ts +50 -0
  341. package/dist/hooks/opencode.js +202 -0
  342. package/dist/hooks/shared.d.ts +54 -0
  343. package/dist/hooks/shared.js +77 -0
  344. package/dist/http-retry.d.ts +2 -0
  345. package/dist/http-retry.js +4 -3
  346. package/dist/http-util.d.ts +3 -0
  347. package/dist/http-util.js +10 -0
  348. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  349. package/dist/importers/core.js +141 -0
  350. package/dist/importers/markdown-parse.d.ts +41 -0
  351. package/dist/importers/markdown-parse.js +132 -0
  352. package/dist/importers/markdown.d.ts +3 -0
  353. package/dist/importers/markdown.js +92 -0
  354. package/dist/importers/sources.d.ts +7 -0
  355. package/dist/importers/sources.js +229 -0
  356. package/dist/importers/vault.d.ts +11 -0
  357. package/dist/importers/vault.js +352 -0
  358. package/dist/incidents.d.ts +3 -0
  359. package/dist/incidents.js +52 -43
  360. package/dist/index.d.ts +25 -6
  361. package/dist/index.js +23 -6
  362. package/dist/invalidation.js +2 -1
  363. package/dist/judgment.js +2 -1
  364. package/dist/keyset.d.ts +13 -0
  365. package/dist/keyset.js +8 -0
  366. package/dist/local-embedding.d.ts +13 -0
  367. package/dist/local-embedding.js +165 -0
  368. package/dist/log.d.ts +7 -0
  369. package/dist/log.js +19 -1
  370. package/dist/mcp/admin-tools.d.ts +8 -0
  371. package/dist/mcp/admin-tools.js +116 -0
  372. package/dist/mcp/format.d.ts +27 -0
  373. package/dist/mcp/format.js +135 -0
  374. package/dist/mcp/memory-tools.d.ts +5 -0
  375. package/dist/mcp/memory-tools.js +83 -0
  376. package/dist/mcp/protocol.d.ts +83 -0
  377. package/dist/mcp/protocol.js +55 -0
  378. package/dist/mcp/recall-tools.d.ts +6 -0
  379. package/dist/mcp/recall-tools.js +320 -0
  380. package/dist/mcp/request.d.ts +10 -0
  381. package/dist/mcp/request.js +163 -0
  382. package/dist/mcp/server.d.ts +4 -75
  383. package/dist/mcp/server.js +7 -1190
  384. package/dist/mcp/session-state.d.ts +11 -0
  385. package/dist/mcp/session-state.js +28 -0
  386. package/dist/mcp/stdio.d.ts +8 -0
  387. package/dist/mcp/stdio.js +79 -0
  388. package/dist/mcp/tools.d.ts +11 -0
  389. package/dist/mcp/tools.js +247 -0
  390. package/dist/memory.d.ts +3 -0
  391. package/dist/memory.js +27 -1
  392. package/dist/multihop.d.ts +1 -1
  393. package/dist/multihop.js +2 -1
  394. package/dist/owner-validation.js +2 -1
  395. package/dist/physics-state.js +10 -7
  396. package/dist/policies.d.ts +3 -0
  397. package/dist/policies.js +93 -74
  398. package/dist/postinstall.js +3 -2
  399. package/dist/predictions/planning-fallacy.d.ts +100 -0
  400. package/dist/predictions/planning-fallacy.js +190 -0
  401. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  402. package/dist/predictions/store.js +434 -0
  403. package/dist/processes.d.ts +3 -0
  404. package/dist/processes.js +94 -76
  405. package/dist/project-briefs.d.ts +3 -0
  406. package/dist/project-briefs.js +142 -113
  407. package/dist/project-identity.js +3 -2
  408. package/dist/project-merge.d.ts +12 -4
  409. package/dist/project-merge.js +132 -45
  410. package/dist/quarantine.d.ts +2 -1
  411. package/dist/quarantine.js +8 -5
  412. package/dist/raw-archive.js +1 -1
  413. package/dist/recall-history.js +3 -2
  414. package/dist/recall-pipeline.d.ts +2 -2
  415. package/dist/recall-pipeline.js +16 -8
  416. package/dist/recall-scope.js +1 -1
  417. package/dist/recall-trace.d.ts +1 -1
  418. package/dist/refine-llm.js +2 -1
  419. package/dist/reject-flow.js +6 -1
  420. package/dist/rerankers/clef.js +6 -5
  421. package/dist/rerankers/jev.d.ts +1 -1
  422. package/dist/rerankers/jev.js +4 -4
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +58 -38
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/scheduler.d.ts +1 -0
  428. package/dist/scheduler.js +26 -4
  429. package/dist/scope.js +4 -3
  430. package/dist/search/as-of.d.ts +10 -0
  431. package/dist/search/as-of.js +22 -0
  432. package/dist/search/bm25-search.d.ts +14 -0
  433. package/dist/search/bm25-search.js +43 -0
  434. package/dist/search/bm25.d.ts +15 -0
  435. package/dist/search/bm25.js +54 -0
  436. package/dist/search/boosts.d.ts +54 -0
  437. package/dist/search/boosts.js +94 -0
  438. package/dist/search/breakdown.d.ts +7 -0
  439. package/dist/search/breakdown.js +20 -0
  440. package/dist/search/explain.d.ts +25 -0
  441. package/dist/search/explain.js +31 -0
  442. package/dist/search/finalize.d.ts +8 -0
  443. package/dist/search/finalize.js +52 -0
  444. package/dist/search/fusion.d.ts +27 -0
  445. package/dist/search/fusion.js +42 -0
  446. package/dist/search/hybrid-score.d.ts +20 -0
  447. package/dist/search/hybrid-score.js +73 -0
  448. package/dist/search/hybrid.d.ts +46 -0
  449. package/dist/search/hybrid.js +64 -0
  450. package/dist/search/physics-search.d.ts +29 -0
  451. package/dist/search/physics-search.js +162 -0
  452. package/dist/search/rerank.d.ts +10 -0
  453. package/dist/search/rerank.js +72 -0
  454. package/dist/search/temporal.d.ts +15 -0
  455. package/dist/search/temporal.js +45 -0
  456. package/dist/search/types.d.ts +91 -0
  457. package/dist/search/types.js +2 -0
  458. package/dist/search/vector.d.ts +30 -0
  459. package/dist/search/vector.js +71 -0
  460. package/dist/secret-detect.d.ts +2 -0
  461. package/dist/secret-detect.js +2 -1
  462. package/dist/server/auth.d.ts +52 -0
  463. package/dist/server/auth.js +221 -0
  464. package/dist/server/client-ip.d.ts +25 -0
  465. package/dist/server/client-ip.js +92 -0
  466. package/dist/server/cursor.d.ts +23 -0
  467. package/dist/server/cursor.js +58 -0
  468. package/dist/server/lifecycle.d.ts +7 -0
  469. package/dist/server/lifecycle.js +29 -0
  470. package/dist/server/mcp-http.d.ts +5 -0
  471. package/dist/server/mcp-http.js +199 -0
  472. package/dist/server/request.d.ts +33 -0
  473. package/dist/server/request.js +103 -0
  474. package/dist/server/routes/admin.d.ts +9 -0
  475. package/dist/server/routes/admin.js +158 -0
  476. package/dist/server/routes/customer-notes.d.ts +7 -0
  477. package/dist/server/routes/customer-notes.js +112 -0
  478. package/dist/server/routes/decisions.d.ts +7 -0
  479. package/dist/server/routes/decisions.js +133 -0
  480. package/dist/server/routes/incidents.d.ts +7 -0
  481. package/dist/server/routes/incidents.js +126 -0
  482. package/dist/server/routes/memories.d.ts +10 -0
  483. package/dist/server/routes/memories.js +179 -0
  484. package/dist/server/routes/policies.d.ts +8 -0
  485. package/dist/server/routes/policies.js +151 -0
  486. package/dist/server/routes/predictions.d.ts +7 -0
  487. package/dist/server/routes/predictions.js +164 -0
  488. package/dist/server/routes/processes.d.ts +7 -0
  489. package/dist/server/routes/processes.js +161 -0
  490. package/dist/server/routes/project-briefs.d.ts +8 -0
  491. package/dist/server/routes/project-briefs.js +136 -0
  492. package/dist/server/routes/recall.d.ts +8 -0
  493. package/dist/server/routes/recall.js +340 -0
  494. package/dist/server/routes/skills.d.ts +8 -0
  495. package/dist/server/routes/skills.js +150 -0
  496. package/dist/server/types.d.ts +56 -0
  497. package/dist/server/types.js +2 -0
  498. package/dist/server/validation.d.ts +14 -0
  499. package/dist/server/validation.js +91 -0
  500. package/dist/server.d.ts +7 -61
  501. package/dist/server.js +69 -2362
  502. package/dist/session-digest.d.ts +1 -1
  503. package/dist/session-digest.js +9 -2
  504. package/dist/shared.d.ts +12 -1
  505. package/dist/shared.js +33 -27
  506. package/dist/skills.d.ts +3 -0
  507. package/dist/skills.js +88 -70
  508. package/dist/stdin.js +2 -2
  509. package/dist/store/audit-event.d.ts +19 -0
  510. package/dist/store/audit-event.js +33 -0
  511. package/dist/store/candidates.d.ts +42 -0
  512. package/dist/store/candidates.js +152 -0
  513. package/dist/store/conflicts.d.ts +44 -0
  514. package/dist/store/conflicts.js +444 -0
  515. package/dist/store/delete-and-batch.d.ts +63 -0
  516. package/dist/store/delete-and-batch.js +310 -0
  517. package/dist/store/entry-reads.d.ts +92 -0
  518. package/dist/store/entry-reads.js +255 -0
  519. package/dist/store/entry-row.d.ts +67 -0
  520. package/dist/store/entry-row.js +208 -0
  521. package/dist/store/entry-writes.d.ts +46 -0
  522. package/dist/store/entry-writes.js +148 -0
  523. package/dist/store/handoffs.d.ts +26 -0
  524. package/dist/store/handoffs.js +184 -0
  525. package/dist/store/index-and-stats.d.ts +52 -0
  526. package/dist/store/index-and-stats.js +214 -0
  527. package/dist/store/markdown.d.ts +10 -0
  528. package/dist/store/markdown.js +108 -0
  529. package/dist/store/mirrors.d.ts +49 -0
  530. package/dist/store/mirrors.js +312 -0
  531. package/dist/store/open.d.ts +15 -0
  532. package/dist/store/open.js +223 -0
  533. package/dist/store/rows.d.ts +178 -0
  534. package/dist/store/rows.js +158 -0
  535. package/dist/store/search-rows.d.ts +86 -0
  536. package/dist/store/search-rows.js +260 -0
  537. package/dist/store/sessions.d.ts +83 -0
  538. package/dist/store/sessions.js +272 -0
  539. package/dist/store/summaries.d.ts +94 -0
  540. package/dist/store/summaries.js +377 -0
  541. package/dist/store/tenant-lookup.d.ts +12 -0
  542. package/dist/store/tenant-lookup.js +16 -0
  543. package/dist/store-cards.js +2 -1
  544. package/dist/summary-dirty.d.ts +4 -0
  545. package/dist/summary-dirty.js +32 -0
  546. package/dist/support-bundle.js +4 -3
  547. package/dist/tenant.js +2 -2
  548. package/dist/tokenize.d.ts +2 -0
  549. package/dist/tokenize.js +16 -0
  550. package/dist/transcript-tail.d.ts +7 -0
  551. package/dist/transcript-tail.js +48 -0
  552. package/dist/vector-store.d.ts +27 -0
  553. package/dist/vector-store.js +210 -0
  554. package/dist/version.d.ts +2 -2
  555. package/dist/version.js +2 -2
  556. package/dist/working-memory.js +1 -1
  557. package/dist/yaml.js +36 -11
  558. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  559. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  560. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  561. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  566. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  570. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  571. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  572. package/dist-ui/index.html +3 -25
  573. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  574. package/extensions/openclaw-plugin/package.json +1 -1
  575. package/openclaw.plugin.json +1 -1
  576. package/package.json +1 -1
  577. package/dist/capture.d.ts +0 -155
  578. package/dist/capture.js +0 -1295
  579. package/dist/consolidate.d.ts +0 -58
  580. package/dist/consolidate.js +0 -1124
  581. package/dist/graph.d.ts +0 -245
  582. package/dist/hooks.d.ts +0 -208
  583. package/dist/hooks.js +0 -1076
  584. package/dist/importers.js +0 -900
  585. package/dist/predictions.js +0 -620
  586. package/dist/search.d.ts +0 -320
  587. package/dist/search.js +0 -970
  588. package/dist/store.d.ts +0 -776
  589. package/dist/store.js +0 -3473
  590. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  591. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  592. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  593. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -0,0 +1,138 @@
1
+ import { Layer as MemoryLayer, type MemoryEntry } from './memory.js';
2
+ import type { MemoryConflict } from './store/rows.js';
3
+ import type { Band, ChipCounts, Layer, Overview, ProjectKind, ProjectSummary, ScatterGrid, ScatterPoints } from './dashboard-types.js';
4
+ export declare const DAY_MS = 86400000;
5
+ export declare const LAYERS: readonly Layer[];
6
+ export declare const BANDS: readonly Band[];
7
+ /** An outside commit rebuilds the snapshot at most this often. */
8
+ export declare const COALESCE_MS = 10000;
9
+ /** Projected strengths track the clock, so the snapshot is rebuilt at least this often. */
10
+ export declare const TTL_MS: number;
11
+ /** The one predicate for "shown on the dashboard": not superseded, not archived, not quarantined. */
12
+ export declare function isLiveMemory(entry: Pick<MemoryEntry, 'superseded_by' | 'kind' | 'scope'>): boolean;
13
+ /** Wire key, display name and kind of a project. */
14
+ export interface ProjectIdentity {
15
+ key: string;
16
+ name: string;
17
+ kind: ProjectKind;
18
+ }
19
+ /** Wire key, display name and kind for an `origin_project` value. */
20
+ export declare function projectIdentity(origin: string | null | undefined): ProjectIdentity;
21
+ /** Index of a layer in the wire order `LAYERS`. */
22
+ export declare function layerIndex(layer: MemoryLayer): number;
23
+ /** Per-memory numbers shared by the snapshot build and the single-memory detail route. */
24
+ export interface MemoryFacts {
25
+ strength: number;
26
+ strength7d: number;
27
+ strength30d: number;
28
+ band: number;
29
+ layer: number;
30
+ ageDays: number;
31
+ lastRetrievedDays: number;
32
+ confidence: string;
33
+ agedOut: boolean;
34
+ wrong: boolean;
35
+ }
36
+ /** Strength now and at +7d and +30d, band, age and the confidence split for one entry at `nowMs`. */
37
+ export declare function memoryFacts(entry: MemoryEntry, nowMs: number): MemoryFacts;
38
+ /** One live memory as the snapshot holds it: numbers and short strings only, never the full entry. */
39
+ export interface Fact {
40
+ id: string;
41
+ head: string;
42
+ truncated: boolean;
43
+ lower: string;
44
+ tagsLower: string;
45
+ layer: number;
46
+ band: number;
47
+ strength: number;
48
+ strength7d: number;
49
+ strength30d: number;
50
+ retrievals: number;
51
+ lastRetrievedDays: number;
52
+ ageDays: number;
53
+ confidence: string;
54
+ confidenceRank: number;
55
+ scope: string | null;
56
+ pinned: boolean;
57
+ wrong: boolean;
58
+ inConflict: boolean;
59
+ embedded: boolean;
60
+ project: number;
61
+ createdMs: number;
62
+ }
63
+ export interface ProjectAgg {
64
+ summary: ProjectSummary;
65
+ /** Indices into `Snapshot.facts`, in snapshot order. */
66
+ members: Int32Array;
67
+ firstCreatedMs: number;
68
+ }
69
+ export type Chip = 'all' | 'risk' | 'pinned' | 'conflict';
70
+ /** A filtered memory set over one project: indices in sort order, chip counts, decay buckets, and per-chip lists built on demand. */
71
+ export interface FilteredSet {
72
+ idx: Int32Array;
73
+ counts: ChipCounts;
74
+ decay: {
75
+ now: [number, number, number];
76
+ in7d: [number, number, number];
77
+ in30d: [number, number, number];
78
+ pinned: number;
79
+ };
80
+ byChip: Map<Chip, Int32Array>;
81
+ }
82
+ /** Small least-recently-used map; the oldest entry leaves when it is full. */
83
+ export declare class Lru<V> {
84
+ private readonly capacity;
85
+ private readonly entries;
86
+ constructor(capacity: number);
87
+ get(key: string): V | undefined;
88
+ set(key: string, value: V): void;
89
+ }
90
+ /** Per-snapshot memo of query results; it dies with the snapshot, so no key needs a snapshot id. */
91
+ export interface SnapshotMemo {
92
+ sorted: Lru<Int32Array>;
93
+ filtered: Lru<FilteredSet>;
94
+ scatter: Map<string, ScatterPoints | ScatterGrid>;
95
+ overview: Overview | null;
96
+ }
97
+ export interface Snapshot {
98
+ id: number;
99
+ tenantId: string;
100
+ nowMs: number;
101
+ facts: Fact[];
102
+ projects: ProjectAgg[];
103
+ byKey: Map<string, ProjectAgg>;
104
+ excluded: {
105
+ superseded: number;
106
+ archived: number;
107
+ quarantined: number;
108
+ };
109
+ /** Embedded share of live memories, or null when the store has no vector table yet. */
110
+ embeddingCoverage: number | null;
111
+ /** Open conflicts with both members live, each counted once. */
112
+ openConflicts: number;
113
+ memo: SnapshotMemo;
114
+ }
115
+ export interface SnapshotInput {
116
+ id: number;
117
+ tenantId: string;
118
+ nowMs: number;
119
+ entries: readonly MemoryEntry[];
120
+ openConflicts: readonly Pick<MemoryConflict, 'memory_a_id' | 'memory_b_id'>[];
121
+ embeddedIds: ReadonlySet<string> | null;
122
+ }
123
+ /** Builds the snapshot from already-loaded rows; it touches no store, so tests can feed it directly. */
124
+ export declare function buildSnapshot(input: SnapshotInput): Snapshot;
125
+ export interface SnapshotService {
126
+ /** The cached snapshot, or a new build when the cache key changed, the coalescing window allows it, or `fresh` is set. */
127
+ get(tenantId: string, fresh?: boolean): Snapshot;
128
+ /** Drops the cache after a dashboard write commits, so the next read rebuilds. */
129
+ invalidate(): void;
130
+ /** Id of the most recent build, which is what a client holding the last response still has. */
131
+ currentId(): number;
132
+ /** Ids with a vector as of the last build (a direct read before any build), so a detail read never rescans the vector table. */
133
+ embeddedIds(): ReadonlySet<string> | null;
134
+ close(): void;
135
+ }
136
+ /** Holds one read-only connection for its commit signal (`PRAGMA data_version`) and the snapshot cache; `now` dates the strength projections, `cacheClock` ages the cache. */
137
+ export declare function createSnapshotService(hippoRoot: string, now: () => number, cacheClock?: () => number): SnapshotService;
138
+ //# sourceMappingURL=dashboard-snapshot.d.ts.map
@@ -0,0 +1,308 @@
1
+ // The dashboard's read model: one in-memory snapshot of a tenant's live memories, grouped by origin project.
2
+ // Pure build functions plus one cache; the queries over it live in dashboard-queries.ts.
3
+ import * as fs from 'fs';
4
+ import { calculateStrength, confidenceFacets, netWrong, Layer as MemoryLayer } from './memory.js';
5
+ import { isQuarantineScope } from './quarantine.js';
6
+ import { listMemoryConflicts } from './store/conflicts.js';
7
+ import { loadAllEntries } from './store/entry-reads.js';
8
+ import { closeHippoDb, getHippoDbPath, openHippoDbReadOnly } from './db.js';
9
+ import { storedVectorIds } from './vector-store.js';
10
+ export const DAY_MS = 86_400_000;
11
+ export const LAYERS = ['buffer', 'episodic', 'semantic', 'trace'];
12
+ // Wire order of `Band`, and the order the mockup sorts bands in.
13
+ export const BANDS = ['pinned', 'strong', 'fading', 'atRisk'];
14
+ const BAND_PINNED = 0;
15
+ const BAND_STRONG = 1;
16
+ const BAND_FADING = 2;
17
+ const BAND_AT_RISK = 3;
18
+ const CONFIDENCE_ORDER = ['verified', 'observed', 'inferred', 'stale'];
19
+ const HEAD_CHARS = 240;
20
+ /** An outside commit rebuilds the snapshot at most this often. */
21
+ export const COALESCE_MS = 10_000;
22
+ /** Projected strengths track the clock, so the snapshot is rebuilt at least this often. */
23
+ export const TTL_MS = 5 * 60_000;
24
+ /** The one predicate for "shown on the dashboard": not superseded, not archived, not quarantined. */
25
+ export function isLiveMemory(entry) {
26
+ return !entry.superseded_by && (entry.kind === 'raw' || entry.kind === 'distilled') && !isQuarantineScope(entry.scope);
27
+ }
28
+ /** Wire key, display name and kind for an `origin_project` value. */
29
+ export function projectIdentity(origin) {
30
+ if (origin === '')
31
+ return { key: 'global', name: 'Global', kind: 'global' };
32
+ if (origin === null || origin === undefined)
33
+ return { key: 'unassigned', name: 'Unassigned', kind: 'unassigned' };
34
+ return { key: `p:${origin}`, name: origin, kind: 'project' };
35
+ }
36
+ /** Index of a layer in the wire order `LAYERS`. */
37
+ export function layerIndex(layer) {
38
+ switch (layer) {
39
+ case MemoryLayer.Buffer: return 0;
40
+ case MemoryLayer.Episodic: return 1;
41
+ case MemoryLayer.Semantic: return 2;
42
+ case MemoryLayer.Trace: return 3;
43
+ }
44
+ }
45
+ function daysBetween(thenIso, nowMs) {
46
+ const days = (nowMs - Date.parse(thenIso)) / DAY_MS;
47
+ return Number.isFinite(days) ? Math.max(0, days) : 0;
48
+ }
49
+ /** Strength now and at +7d and +30d, band, age and the confidence split for one entry at `nowMs`. */
50
+ export function memoryFacts(entry, nowMs) {
51
+ const now = new Date(nowMs);
52
+ const strength = calculateStrength(entry, now);
53
+ const strength7d = calculateStrength(entry, new Date(nowMs + 7 * DAY_MS));
54
+ const strength30d = calculateStrength(entry, new Date(nowMs + 30 * DAY_MS));
55
+ const facets = confidenceFacets(entry, now);
56
+ const band = entry.pinned ? BAND_PINNED : strength30d < 0.2 ? BAND_AT_RISK : strength >= 0.5 ? BAND_STRONG : BAND_FADING;
57
+ return {
58
+ strength,
59
+ strength7d,
60
+ strength30d,
61
+ band,
62
+ layer: layerIndex(entry.layer),
63
+ ageDays: daysBetween(entry.created, nowMs),
64
+ lastRetrievedDays: daysBetween(entry.last_retrieved, nowMs),
65
+ confidence: facets.tier,
66
+ agedOut: facets.agedOut,
67
+ wrong: netWrong(entry) > 0,
68
+ };
69
+ }
70
+ /** Small least-recently-used map; the oldest entry leaves when it is full. */
71
+ export class Lru {
72
+ capacity;
73
+ entries = new Map();
74
+ constructor(capacity) {
75
+ this.capacity = capacity;
76
+ }
77
+ get(key) {
78
+ const value = this.entries.get(key);
79
+ if (value !== undefined) {
80
+ this.entries.delete(key);
81
+ this.entries.set(key, value);
82
+ }
83
+ return value;
84
+ }
85
+ set(key, value) {
86
+ this.entries.delete(key);
87
+ this.entries.set(key, value);
88
+ if (this.entries.size > this.capacity) {
89
+ const oldest = this.entries.keys().next();
90
+ if (!oldest.done)
91
+ this.entries.delete(oldest.value);
92
+ }
93
+ }
94
+ }
95
+ function cutHead(content) {
96
+ if (content.length <= HEAD_CHARS)
97
+ return { head: content, truncated: false };
98
+ let end = HEAD_CHARS;
99
+ const last = content.charCodeAt(end - 1);
100
+ if (last >= 0xd800 && last <= 0xdbff)
101
+ end -= 1;
102
+ return { head: content.slice(0, end), truncated: true };
103
+ }
104
+ function round1(value) {
105
+ return Math.round(value * 10) / 10;
106
+ }
107
+ function newDraft(identity) {
108
+ return {
109
+ summary: {
110
+ ...identity, live: 0, atRisk: 0, share: 0, pinned: 0, embedded: 0, openConflicts: 0, lastRetrievedDays: null,
111
+ bands: { pinned: 0, strong: 0, fading: 0, atRisk: 0 },
112
+ layers: { buffer: 0, episodic: 0, semantic: 0, trace: 0 },
113
+ },
114
+ members: [],
115
+ firstCreatedMs: Number.POSITIVE_INFINITY,
116
+ lastDays: Number.POSITIVE_INFINITY,
117
+ };
118
+ }
119
+ function toFact(entry, f, project, embedded, createdMs) {
120
+ const { head, truncated } = cutHead(entry.content);
121
+ const tier = CONFIDENCE_ORDER.indexOf(f.confidence);
122
+ return {
123
+ id: entry.id,
124
+ head,
125
+ truncated,
126
+ lower: entry.content.toLowerCase(),
127
+ tagsLower: entry.tags.length > 0 ? entry.tags.join('\n').toLowerCase() : '',
128
+ layer: f.layer,
129
+ band: f.band,
130
+ strength: f.strength,
131
+ strength7d: f.strength7d,
132
+ strength30d: f.strength30d,
133
+ retrievals: entry.retrieval_count,
134
+ lastRetrievedDays: f.lastRetrievedDays,
135
+ ageDays: f.ageDays,
136
+ confidence: f.confidence,
137
+ confidenceRank: tier === -1 ? CONFIDENCE_ORDER.length : tier,
138
+ scope: entry.scope,
139
+ pinned: entry.pinned,
140
+ wrong: f.wrong,
141
+ inConflict: false,
142
+ embedded,
143
+ project,
144
+ createdMs,
145
+ };
146
+ }
147
+ /** Builds the snapshot from already-loaded rows; it touches no store, so tests can feed it directly. */
148
+ export function buildSnapshot(input) {
149
+ const { entries, embeddedIds, nowMs } = input;
150
+ const excluded = { superseded: 0, archived: 0, quarantined: 0 };
151
+ const facts = [];
152
+ const projectIndex = new Map();
153
+ const drafts = [];
154
+ for (const entry of entries) {
155
+ if (!isLiveMemory(entry)) {
156
+ if (isQuarantineScope(entry.scope))
157
+ excluded.quarantined++;
158
+ else if (entry.superseded_by || entry.kind === 'superseded')
159
+ excluded.superseded++;
160
+ else if (entry.kind === 'archived')
161
+ excluded.archived++;
162
+ continue;
163
+ }
164
+ const identity = projectIdentity(entry.origin_project);
165
+ let p = projectIndex.get(identity.key);
166
+ if (p === undefined) {
167
+ p = drafts.length;
168
+ projectIndex.set(identity.key, p);
169
+ drafts.push(newDraft(identity));
170
+ }
171
+ const f = memoryFacts(entry, nowMs);
172
+ const embedded = embeddedIds !== null && embeddedIds.has(entry.id);
173
+ const parsedCreated = Date.parse(entry.created);
174
+ const draft = drafts[p];
175
+ draft.members.push(facts.length);
176
+ draft.summary.live++;
177
+ draft.summary.bands[BANDS[f.band]]++;
178
+ draft.summary.layers[LAYERS[f.layer]]++;
179
+ if (entry.pinned)
180
+ draft.summary.pinned++;
181
+ if (embedded)
182
+ draft.summary.embedded++;
183
+ if (Number.isFinite(parsedCreated) && parsedCreated < draft.firstCreatedMs)
184
+ draft.firstCreatedMs = parsedCreated;
185
+ if (f.lastRetrievedDays < draft.lastDays)
186
+ draft.lastDays = f.lastRetrievedDays;
187
+ facts.push(toFact(entry, f, p, embedded, Number.isFinite(parsedCreated) ? parsedCreated : nowMs));
188
+ }
189
+ const openConflicts = countOpenConflicts(facts, drafts.map((d) => d.summary), input.openConflicts);
190
+ const projects = drafts.map((d) => {
191
+ d.summary.atRisk = d.summary.bands.atRisk;
192
+ d.summary.share = d.summary.live > 0 ? d.summary.atRisk / d.summary.live : 0;
193
+ d.summary.lastRetrievedDays = d.summary.live > 0 ? round1(d.lastDays) : null;
194
+ return { summary: d.summary, members: Int32Array.from(d.members), firstCreatedMs: d.firstCreatedMs };
195
+ });
196
+ const embeddedTotal = projects.reduce((sum, p) => sum + p.summary.embedded, 0);
197
+ return {
198
+ id: input.id,
199
+ tenantId: input.tenantId,
200
+ nowMs,
201
+ facts,
202
+ projects,
203
+ byKey: new Map(projects.map((p) => [p.summary.key, p])),
204
+ excluded,
205
+ embeddingCoverage: embeddedIds === null ? null : facts.length > 0 ? embeddedTotal / facts.length : 0,
206
+ openConflicts,
207
+ memo: { sorted: new Lru(8), filtered: new Lru(8), scatter: new Map(), overview: null },
208
+ };
209
+ }
210
+ // A conflict counts once in each project it touches, and once in the total.
211
+ function countOpenConflicts(facts, summaries, conflicts) {
212
+ if (conflicts.length === 0)
213
+ return 0;
214
+ const byId = new Map();
215
+ facts.forEach((f, i) => byId.set(f.id, i));
216
+ let total = 0;
217
+ for (const c of conflicts) {
218
+ const a = byId.get(c.memory_a_id);
219
+ const b = byId.get(c.memory_b_id);
220
+ if (a === undefined || b === undefined)
221
+ continue;
222
+ total++;
223
+ facts[a].inConflict = true;
224
+ facts[b].inConflict = true;
225
+ for (const p of new Set([facts[a].project, facts[b].project]))
226
+ summaries[p].openConflicts++;
227
+ }
228
+ return total;
229
+ }
230
+ // Keeps ids rising between two services created in the same millisecond of one process.
231
+ let highestIssuedId = 0;
232
+ /** Holds one read-only connection for its commit signal (`PRAGMA data_version`) and the snapshot cache; `now` dates the strength projections, `cacheClock` ages the cache. */
233
+ export function createSnapshotService(hippoRoot, now, cacheClock = Date.now) {
234
+ let db = null;
235
+ let cached = null;
236
+ // Wall clock, not `now`, so ids keep rising across server restarts and a client holding an old tab never sees a lower one.
237
+ let lastId = Math.max(Date.now(), highestIssuedId);
238
+ let lastEmbeddedIds;
239
+ const dataVersion = () => {
240
+ if (db === null) {
241
+ if (!fs.existsSync(getHippoDbPath(hippoRoot)))
242
+ return null;
243
+ db = openHippoDbReadOnly(hippoRoot);
244
+ }
245
+ // SAFETY: PRAGMA data_version returns one row with that single integer column.
246
+ const row = db.prepare('PRAGMA data_version').get();
247
+ return row.data_version;
248
+ };
249
+ // No database means no vectors; a store not yet on schema v52 has no table to count, so coverage is unknown.
250
+ const readEmbeddedIds = () => {
251
+ if (db === null)
252
+ return new Set();
253
+ // SAFETY: sqlite_master rows carry a text name; the query only tests presence.
254
+ const table = db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'memory_vectors'").get();
255
+ return table === undefined ? null : storedVectorIds(db);
256
+ };
257
+ const build = (tenantId, dv, nowMs) => {
258
+ const entries = dv === null ? [] : loadAllEntries(hippoRoot, tenantId);
259
+ const openConflicts = dv === null ? [] : listMemoryConflicts(hippoRoot, 'open', tenantId);
260
+ lastId += 1;
261
+ highestIssuedId = Math.max(highestIssuedId, lastId);
262
+ // After loadAllEntries, whose writable open has run any pending migration and legacy embeddings.json import.
263
+ lastEmbeddedIds = readEmbeddedIds();
264
+ return buildSnapshot({ id: lastId, tenantId, nowMs, entries, openConflicts, embeddedIds: lastEmbeddedIds });
265
+ };
266
+ return {
267
+ get(tenantId, fresh = false) {
268
+ const nowMs = now();
269
+ // A frozen eval clock (HIPPO_FAKE_NOW) would never age the cache, so reuse is timed on its own clock.
270
+ const wallMs = cacheClock();
271
+ // Read before the build, so a commit that lands during it shows on the next read.
272
+ const dv = dataVersion();
273
+ const hit = cached;
274
+ if (hit !== null && !fresh) {
275
+ const age = wallMs - hit.builtAtMs;
276
+ const reusable = hit.snapshot.tenantId === tenantId
277
+ && (hit.dataVersion !== null || dv === null)
278
+ && age < TTL_MS
279
+ && (hit.dataVersion === dv || age < COALESCE_MS);
280
+ if (reusable)
281
+ return hit.snapshot;
282
+ }
283
+ const snapshot = build(tenantId, dv, nowMs);
284
+ cached = { snapshot, dataVersion: dv, builtAtMs: wallMs };
285
+ return snapshot;
286
+ },
287
+ invalidate() {
288
+ cached = null;
289
+ },
290
+ currentId() {
291
+ return lastId;
292
+ },
293
+ embeddedIds() {
294
+ if (lastEmbeddedIds !== undefined)
295
+ return lastEmbeddedIds;
296
+ dataVersion();
297
+ return readEmbeddedIds();
298
+ },
299
+ close() {
300
+ if (db !== null)
301
+ closeHippoDb(db);
302
+ db = null;
303
+ cached = null;
304
+ lastEmbeddedIds = undefined;
305
+ },
306
+ };
307
+ }
308
+ //# sourceMappingURL=dashboard-snapshot.js.map
@@ -0,0 +1,163 @@
1
+ /** Wire types of the dashboard's Health view; `ui/src/types.ts` mirrors them field for field. */
2
+ export type Layer = 'buffer' | 'episodic' | 'semantic' | 'trace';
3
+ export type Band = 'pinned' | 'strong' | 'fading' | 'atRisk';
4
+ export type ProjectKind = 'project' | 'global' | 'unassigned';
5
+ /** One origin project's aggregates; `key` is `p:<name>`, `global` or `unassigned`. */
6
+ export interface ProjectSummary {
7
+ key: string;
8
+ name: string;
9
+ kind: ProjectKind;
10
+ live: number;
11
+ atRisk: number;
12
+ share: number;
13
+ pinned: number;
14
+ embedded: number;
15
+ openConflicts: number;
16
+ lastRetrievedDays: number | null;
17
+ bands: Record<Band, number>;
18
+ layers: Record<Layer, number>;
19
+ }
20
+ /** One KPI card; `series` is 91 daily cumulative points, oldest first (point 0 is the base at the window start, point 90 is now) so `last - first` over any range plus one points is exact; null when hippo recorded no history. */
21
+ export interface Kpi {
22
+ id: 'total' | 'projects' | 'atRiskShare' | 'openConflicts' | 'embeddingCoverage';
23
+ label: string;
24
+ value: number;
25
+ delta: string;
26
+ series: number[] | null;
27
+ }
28
+ export interface Overview {
29
+ /** Bumped on each rebuild and seeded from the wall clock, so ids keep rising across server restarts. */
30
+ snapshotId: number;
31
+ generatedAt: string;
32
+ total: number;
33
+ excluded: {
34
+ superseded: number;
35
+ archived: number;
36
+ quarantined: number;
37
+ };
38
+ embeddingCoverage: number | null;
39
+ kpis: Kpi[];
40
+ projects: ProjectSummary[];
41
+ mostAtRisk: string[];
42
+ mostConflicts: string[];
43
+ }
44
+ export interface ScatterPoints {
45
+ mode: 'points';
46
+ maxAgeDays: number;
47
+ points: [number, number, number, number][];
48
+ ids: string[];
49
+ }
50
+ export interface ScatterGrid {
51
+ mode: 'grid';
52
+ maxAgeDays: number;
53
+ cols: 64;
54
+ rows: 32;
55
+ cells: [number[], number[], number[], number[]];
56
+ }
57
+ export interface ProjectDetail {
58
+ snapshotId: number;
59
+ summary: ProjectSummary;
60
+ scatter: ScatterPoints | ScatterGrid;
61
+ }
62
+ export interface DecayOutlook {
63
+ now: [number, number, number];
64
+ in7d: [number, number, number];
65
+ in30d: [number, number, number];
66
+ pinned: number;
67
+ }
68
+ export interface MemoryRow {
69
+ id: string;
70
+ content: string;
71
+ truncated: boolean;
72
+ layer: Layer;
73
+ band: Band;
74
+ strength: number;
75
+ retrievals: number;
76
+ lastRetrievedDays: number;
77
+ ageDays: number;
78
+ confidence: string;
79
+ scope: string | null;
80
+ pinned: boolean;
81
+ wrong: boolean;
82
+ inConflict: boolean;
83
+ }
84
+ /** Memory counts for each chip over the filtered set. */
85
+ export interface ChipCounts {
86
+ all: number;
87
+ risk: number;
88
+ pinned: number;
89
+ conflict: number;
90
+ }
91
+ export interface MemoryPage {
92
+ snapshotId: number;
93
+ total: number;
94
+ offset: number;
95
+ limit: number;
96
+ counts: ChipCounts;
97
+ decay: DecayOutlook;
98
+ rows: MemoryRow[];
99
+ }
100
+ export interface MemoryConflictDetail {
101
+ id: number;
102
+ reason: string;
103
+ score: number;
104
+ other: {
105
+ id: string;
106
+ content: string;
107
+ strength: number;
108
+ retrievals: number;
109
+ };
110
+ }
111
+ export interface MemoryDetail {
112
+ snapshotId: number;
113
+ id: string;
114
+ content: string;
115
+ layer: Layer;
116
+ band: Band;
117
+ tags: string[];
118
+ strength: number;
119
+ strength7d: number;
120
+ strength30d: number;
121
+ halfLifeDays: number;
122
+ retrievals: number;
123
+ lastRetrieved: string;
124
+ created: string;
125
+ ageDays: number;
126
+ schemaFit: number;
127
+ valence: string;
128
+ confidence: string;
129
+ agedOut: boolean;
130
+ pinned: boolean;
131
+ wrong: boolean;
132
+ projectKey: string;
133
+ projectName: string;
134
+ scope: string | null;
135
+ tenant: string;
136
+ kind: string;
137
+ embedded: boolean;
138
+ conflicts: MemoryConflictDetail[];
139
+ }
140
+ export interface SearchResult {
141
+ snapshotId: number;
142
+ q: string;
143
+ total: number;
144
+ hits: Record<string, number>;
145
+ nameMatches: {
146
+ key: string;
147
+ name: string;
148
+ live: number;
149
+ }[];
150
+ }
151
+ /** Body of `POST /api/conflicts/:id/resolve` on success. */
152
+ export interface ResolveResult {
153
+ ok: true;
154
+ conflictId: number;
155
+ keptId: string;
156
+ weakenedId: string;
157
+ }
158
+ /** Body of `POST /api/memory/:id/forget` on success. */
159
+ export interface ForgetResult {
160
+ ok: true;
161
+ id: string;
162
+ }
163
+ //# sourceMappingURL=dashboard-types.d.ts.map
@@ -0,0 +1,3 @@
1
+ /** Wire types of the dashboard's Health view; `ui/src/types.ts` mirrors them field for field. */
2
+ export {};
3
+ //# sourceMappingURL=dashboard-types.js.map
@@ -1,9 +1,8 @@
1
- /**
2
- * Hippo Dashboard — local web UI for memory health visualization.
3
- * Serves a single-page app with memory stats, decay curves, and conflict status.
4
- *
5
- * Usage: hippo dashboard [--port 3333]
6
- */
1
+ /** Hippo dashboard server: the React bundle plus the JSON API behind the Health view and the Board (`hippo dashboard --port`). */
7
2
  import * as http from 'http';
8
- export declare function serveDashboard(hippoRoot: string, port?: number): http.Server;
3
+ /** Serves the dashboard on 127.0.0.1 behind a per-start `token` (tests pass one), since loopback alone lets any local process read every memory; `opts` sets the projection and cache clocks. */
4
+ export declare function serveDashboard(hippoRoot: string, port?: number, token?: string, opts?: {
5
+ now?: () => number;
6
+ cacheClock?: () => number;
7
+ }): http.Server;
9
8
  //# sourceMappingURL=dashboard.d.ts.map