hippo-memory 1.69.0 → 1.70.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 (860) hide show
  1. package/README.md +5 -2
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +1 -3
  5. package/dist/agent-memories/claude-code.js +11 -7
  6. package/dist/agent-memories/copilot.js +3 -2
  7. package/dist/agent-memories/files.js +3 -2
  8. package/dist/agent-memories/gemini.js +6 -5
  9. package/dist/agent-memories/keys.js +3 -2
  10. package/dist/agent-memories/legacy.d.ts +2 -2
  11. package/dist/agent-memories/legacy.js +2 -2
  12. package/dist/agent-memories/report.d.ts +1 -1
  13. package/dist/agent-memories/report.js +1 -1
  14. package/dist/agent-memories/source.d.ts +1 -1
  15. package/dist/agent-memories/source.js +6 -5
  16. package/dist/agent-memories/sync.d.ts +1 -1
  17. package/dist/agent-memories/sync.js +24 -33
  18. package/dist/agent-memories/types.d.ts +1 -1
  19. package/dist/api/assemble.d.ts +2 -2
  20. package/dist/api/assemble.js +42 -32
  21. package/dist/api/audit.d.ts +4 -7
  22. package/dist/api/audit.js +6 -20
  23. package/dist/api/auth.d.ts +5 -18
  24. package/dist/api/auth.js +44 -194
  25. package/dist/api/auto-sleep.d.ts +13 -0
  26. package/dist/api/auto-sleep.js +32 -0
  27. package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
  28. package/dist/{availability.js → api/availability.js} +12 -29
  29. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  30. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  31. package/dist/{context-render.js → api/context-render.js} +7 -6
  32. package/dist/api/context-select.d.ts +5 -5
  33. package/dist/api/context-select.js +37 -45
  34. package/dist/api/context-types.d.ts +5 -5
  35. package/dist/api/context.d.ts +2 -4
  36. package/dist/api/context.js +48 -61
  37. package/dist/api/dormant.d.ts +3 -3
  38. package/dist/api/dormant.js +38 -107
  39. package/dist/api/drill-down.d.ts +2 -2
  40. package/dist/api/drill-down.js +37 -65
  41. package/dist/api/forget.d.ts +2 -11
  42. package/dist/api/forget.js +13 -46
  43. package/dist/api/goals.d.ts +1 -1
  44. package/dist/api/goals.js +2 -2
  45. package/dist/api/index.d.ts +26 -0
  46. package/dist/api/index.js +29 -0
  47. package/dist/api/instruction-detect.js +74 -0
  48. package/dist/api/learn.js +63 -55
  49. package/dist/api/ledger-db.d.ts +20 -0
  50. package/dist/api/ledger-db.js +79 -0
  51. package/dist/api/on-store.d.ts +16 -0
  52. package/dist/api/on-store.js +36 -0
  53. package/dist/api/outcome.d.ts +5 -42
  54. package/dist/api/outcome.js +15 -80
  55. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  56. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  57. package/dist/api/promote.d.ts +4 -15
  58. package/dist/api/promote.js +29 -106
  59. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
  60. package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
  61. package/dist/api/quarantine.d.ts +5 -5
  62. package/dist/api/quarantine.js +30 -106
  63. package/dist/api/recall-core.d.ts +4 -0
  64. package/dist/api/recall-core.js +112 -0
  65. package/dist/{recall-history.js → api/recall-history.js} +30 -25
  66. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
  67. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
  68. package/dist/api/recall-record.d.ts +10 -13
  69. package/dist/api/recall-record.js +10 -30
  70. package/dist/api/recall-request.d.ts +2 -2
  71. package/dist/api/recall-request.js +3 -3
  72. package/dist/api/recall-types.d.ts +41 -16
  73. package/dist/api/recall.d.ts +1 -1
  74. package/dist/api/recall.js +39 -37
  75. package/dist/api/remember.d.ts +10 -12
  76. package/dist/api/remember.js +29 -45
  77. package/dist/api/session-owners.d.ts +4 -0
  78. package/dist/api/session-owners.js +17 -0
  79. package/dist/api/sleep-run.d.ts +7 -7
  80. package/dist/api/sleep-run.js +63 -75
  81. package/dist/api/sleep.d.ts +1 -1
  82. package/dist/api/tokens.d.ts +2 -2
  83. package/dist/api/tokens.js +9 -21
  84. package/dist/api/types.d.ts +2 -2
  85. package/dist/api/types.js +1 -1
  86. package/dist/capture/caller-session.d.ts +2 -2
  87. package/dist/capture/caller-session.js +8 -8
  88. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  89. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  90. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  91. package/dist/capture/command.d.ts +1 -1
  92. package/dist/capture/command.js +54 -41
  93. package/dist/capture/compact-resume-caller.d.ts +1 -1
  94. package/dist/capture/compact-resume-caller.js +7 -7
  95. package/dist/capture/compact.d.ts +4 -1
  96. package/dist/capture/compact.js +40 -22
  97. package/dist/capture/compaction-items-caller.d.ts +1 -1
  98. package/dist/capture/compaction-items-caller.js +7 -5
  99. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  100. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  101. package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
  102. package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
  103. package/dist/capture/copilot-transcript.js +1 -1
  104. package/dist/capture/extract.js +2 -2
  105. package/dist/capture/failure-caller.d.ts +2 -2
  106. package/dist/capture/failure-caller.js +6 -6
  107. package/dist/capture/failure-reading.d.ts +2 -5
  108. package/dist/capture/failure-reading.js +11 -12
  109. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  110. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  111. package/dist/capture/pre-compact-caller.d.ts +1 -1
  112. package/dist/capture/pre-compact-caller.js +2 -2
  113. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
  114. package/dist/{session-digest.js → capture/session-digest.js} +17 -23
  115. package/dist/capture/session-end-caller.d.ts +2 -2
  116. package/dist/capture/session-end-caller.js +1 -1
  117. package/dist/capture/session-texts.d.ts +1 -1
  118. package/dist/capture/session-texts.js +5 -5
  119. package/dist/capture/session-worker.js +6 -4
  120. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  121. package/dist/capture/transcript.js +68 -74
  122. package/dist/capture/working-state.d.ts +0 -3
  123. package/dist/capture/working-state.js +7 -7
  124. package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
  125. package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
  126. package/dist/cli/audit.d.ts +2 -2
  127. package/dist/cli/audit.js +77 -72
  128. package/dist/cli/auth.d.ts +2 -1
  129. package/dist/cli/auth.js +18 -20
  130. package/dist/cli/briefs.d.ts +4 -3
  131. package/dist/cli/briefs.js +59 -181
  132. package/dist/cli/card.d.ts +2 -1
  133. package/dist/cli/card.js +25 -23
  134. package/dist/{client.d.ts → cli/client.d.ts} +1 -1
  135. package/dist/{client.js → cli/client.js} +1 -1
  136. package/dist/cli/compact-resume-payload.d.ts +8 -0
  137. package/dist/cli/compact-resume-payload.js +39 -0
  138. package/dist/cli/context.d.ts +2 -13
  139. package/dist/cli/context.js +41 -71
  140. package/dist/cli/continuity.d.ts +6 -5
  141. package/dist/cli/continuity.js +109 -99
  142. package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
  143. package/dist/cli/curate.d.ts +9 -9
  144. package/dist/cli/curate.js +177 -149
  145. package/dist/cli/dag.d.ts +4 -4
  146. package/dist/cli/dag.js +46 -34
  147. package/dist/cli/decisions.d.ts +4 -3
  148. package/dist/cli/decisions.js +108 -218
  149. package/dist/cli/eval.d.ts +1 -3
  150. package/dist/cli/eval.js +43 -31
  151. package/dist/cli/explain.d.ts +1 -1
  152. package/dist/cli/explain.js +35 -19
  153. package/dist/cli/flag-values.d.ts +25 -0
  154. package/dist/cli/flag-values.js +103 -0
  155. package/dist/cli/flags.d.ts +303 -0
  156. package/dist/cli/flags.js +169 -0
  157. package/dist/cli/goals.d.ts +2 -1
  158. package/dist/cli/goals.js +39 -34
  159. package/dist/cli/hook-runtime.d.ts +49 -0
  160. package/dist/cli/hook-runtime.js +155 -0
  161. package/dist/cli/init.d.ts +2 -1
  162. package/dist/cli/init.js +151 -118
  163. package/dist/cli/install-steps.d.ts +7 -0
  164. package/dist/cli/install-steps.js +110 -0
  165. package/dist/cli/last-sleep.d.ts +2 -1
  166. package/dist/cli/last-sleep.js +9 -7
  167. package/dist/cli/maintenance.d.ts +5 -4
  168. package/dist/cli/maintenance.js +31 -27
  169. package/dist/cli/object-verbs.d.ts +40 -0
  170. package/dist/cli/object-verbs.js +65 -0
  171. package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
  172. package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
  173. package/dist/cli/playbooks.d.ts +4 -3
  174. package/dist/cli/playbooks.js +77 -280
  175. package/dist/cli/print.d.ts +18 -0
  176. package/dist/cli/print.js +85 -0
  177. package/dist/cli/projects.d.ts +2 -3
  178. package/dist/cli/projects.js +56 -49
  179. package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
  180. package/dist/cli/quality-repair-once.js +4 -4
  181. package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
  182. package/dist/cli/recall.d.ts +2 -4
  183. package/dist/cli/recall.js +101 -150
  184. package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
  185. package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
  186. package/dist/cli/remember.d.ts +1 -3
  187. package/dist/cli/remember.js +124 -103
  188. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
  189. package/dist/{scheduler.js → cli/scheduler.js} +13 -7
  190. package/dist/cli/serve.d.ts +1 -1
  191. package/dist/cli/serve.js +34 -4
  192. package/dist/cli/session-hooks.d.ts +4 -4
  193. package/dist/cli/session-hooks.js +190 -184
  194. package/dist/cli/setup.d.ts +2 -1
  195. package/dist/cli/setup.js +41 -21
  196. package/dist/cli/shared.d.ts +5 -95
  197. package/dist/cli/shared.js +18 -369
  198. package/dist/cli/slack.d.ts +2 -1
  199. package/dist/cli/slack.js +31 -55
  200. package/dist/cli/sleep-render.d.ts +4 -0
  201. package/dist/cli/sleep-render.js +61 -0
  202. package/dist/cli/sleep.d.ts +2 -8
  203. package/dist/cli/sleep.js +20 -76
  204. package/dist/cli/status.d.ts +3 -3
  205. package/dist/cli/status.js +39 -41
  206. package/dist/{stdin.js → cli/stdin.js} +6 -6
  207. package/dist/cli/transfer.d.ts +4 -4
  208. package/dist/cli/transfer.js +68 -42
  209. package/dist/cli/usage.js +4 -2
  210. package/dist/cli.d.ts +289 -5
  211. package/dist/cli.js +184 -117
  212. package/dist/connectors/dlq.d.ts +44 -0
  213. package/dist/connectors/dlq.js +30 -0
  214. package/dist/connectors/github/backfill.d.ts +1 -1
  215. package/dist/connectors/github/backfill.js +29 -66
  216. package/dist/connectors/github/cli-impl.js +59 -74
  217. package/dist/connectors/github/deletion.d.ts +5 -6
  218. package/dist/connectors/github/deletion.js +18 -52
  219. package/dist/connectors/github/dlq.d.ts +7 -61
  220. package/dist/connectors/github/dlq.js +19 -119
  221. package/dist/connectors/github/ingest.d.ts +2 -31
  222. package/dist/connectors/github/ingest.js +20 -83
  223. package/dist/connectors/github/octokit-client.d.ts +1 -1
  224. package/dist/connectors/github/octokit-client.js +2 -1
  225. package/dist/connectors/github/tenant-routing.d.ts +2 -2
  226. package/dist/connectors/github/tenant-routing.js +10 -36
  227. package/dist/connectors/github/transform.d.ts +1 -1
  228. package/dist/connectors/github/types.d.ts +1 -1
  229. package/dist/connectors/github/types.js +15 -18
  230. package/dist/connectors/github/webhook.d.ts +3 -2
  231. package/dist/connectors/github/webhook.js +84 -87
  232. package/dist/connectors/slack/backfill.d.ts +1 -1
  233. package/dist/connectors/slack/backfill.js +5 -29
  234. package/dist/connectors/slack/deletion.d.ts +4 -7
  235. package/dist/connectors/slack/deletion.js +20 -49
  236. package/dist/connectors/slack/dlq.d.ts +7 -49
  237. package/dist/connectors/slack/dlq.js +25 -118
  238. package/dist/connectors/slack/ingest.d.ts +5 -18
  239. package/dist/connectors/slack/ingest.js +27 -91
  240. package/dist/connectors/slack/signature.js +2 -1
  241. package/dist/connectors/slack/tenant-routing.d.ts +4 -1
  242. package/dist/connectors/slack/tenant-routing.js +13 -14
  243. package/dist/connectors/slack/transform.d.ts +1 -1
  244. package/dist/connectors/slack/types.d.ts +1 -1
  245. package/dist/connectors/slack/types.js +3 -12
  246. package/dist/connectors/slack/web-client.js +2 -2
  247. package/dist/connectors/slack/webhook.d.ts +3 -2
  248. package/dist/connectors/slack/webhook.js +75 -82
  249. package/dist/connectors/slack/workspaces.d.ts +4 -17
  250. package/dist/connectors/slack/workspaces.js +4 -34
  251. package/dist/consolidate/conflicts.d.ts +1 -1
  252. package/dist/consolidate/conflicts.js +4 -4
  253. package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
  254. package/dist/{dag.js → consolidate/dag.js} +60 -81
  255. package/dist/consolidate/decay.d.ts +2 -2
  256. package/dist/consolidate/decay.js +28 -22
  257. package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
  258. package/dist/consolidate/flush-units.d.ts +2 -2
  259. package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
  260. package/dist/consolidate/half-life-migration.js +106 -0
  261. package/dist/consolidate/llm-passes.js +8 -8
  262. package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
  263. package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
  264. package/dist/consolidate/merge.js +57 -54
  265. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  266. package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
  267. package/dist/consolidate/physics-pass.js +46 -46
  268. package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
  269. package/dist/{replay.js → consolidate/replay.js} +2 -2
  270. package/dist/consolidate/run.d.ts +7 -13
  271. package/dist/consolidate/run.js +6 -37
  272. package/dist/consolidate/sleep.d.ts +1 -1
  273. package/dist/consolidate/sleep.js +64 -134
  274. package/dist/{trace.js → consolidate/trace.js} +4 -6
  275. package/dist/consolidate/traces.js +34 -29
  276. package/dist/{ablation.js → core/ablation.js} +1 -1
  277. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  278. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  279. package/dist/{ambient.js → core/ambient.js} +12 -10
  280. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +13 -2
  281. package/dist/{capture-contract.js → core/capture-contract.js} +64 -0
  282. package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
  283. package/dist/{compare.js → core/compare.js} +10 -3
  284. package/dist/{config.d.ts → core/config.d.ts} +6 -6
  285. package/dist/{config.js → core/config.js} +99 -72
  286. package/dist/core/handoff.js +87 -0
  287. package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
  288. package/dist/{memory.d.ts → core/memory.d.ts} +17 -5
  289. package/dist/{memory.js → core/memory.js} +110 -82
  290. package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
  291. package/dist/{physics.js → core/physics.js} +2 -1
  292. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
  293. package/dist/{project-identity.js → core/project-identity.js} +5 -17
  294. package/dist/{project-remote.js → core/project-remote.js} +4 -4
  295. package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
  296. package/dist/{salience.js → core/salience.js} +35 -20
  297. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  298. package/dist/{search/types.js → core/search-types.js} +1 -1
  299. package/dist/core/session-digest-row.d.ts +5 -0
  300. package/dist/core/session-digest-row.js +6 -0
  301. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  302. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
  303. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  304. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  305. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
  306. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
  307. package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
  308. package/dist/db/backup.js +1 -1
  309. package/dist/db/busy.d.ts +18 -1
  310. package/dist/db/busy.js +74 -9
  311. package/dist/db/connect.d.ts +10 -2
  312. package/dist/db/connect.js +43 -10
  313. package/dist/db/index.d.ts +9 -0
  314. package/dist/db/index.js +8 -0
  315. package/dist/db/meta.d.ts +4 -0
  316. package/dist/db/meta.js +11 -1
  317. package/dist/db/migrate.d.ts +8 -1
  318. package/dist/db/migrate.js +25 -30
  319. package/dist/db/migrations/v08.js +1 -1
  320. package/dist/db/migrations/v14.js +39 -35
  321. package/dist/db/migrations/v16.js +29 -26
  322. package/dist/db/migrations/v18.js +6 -5
  323. package/dist/db/migrations/v20.js +4 -2
  324. package/dist/db/migrations/v22.js +39 -36
  325. package/dist/db/migrations/v24.js +27 -22
  326. package/dist/db/migrations/v29.js +37 -32
  327. package/dist/db/migrations/v31.js +36 -31
  328. package/dist/db/migrations/v35.js +1 -1
  329. package/dist/db/migrations/v39.js +1 -1
  330. package/dist/db/migrations/v40.js +15 -14
  331. package/dist/db/migrations/v43.js +7 -6
  332. package/dist/db/migrations/v44.js +1 -1
  333. package/dist/db/migrations/v45.js +1 -1
  334. package/dist/db/migrations/v46.js +1 -1
  335. package/dist/db/migrations/v47.js +1 -1
  336. package/dist/db/migrations/v48.js +1 -1
  337. package/dist/db/migrations/v49.js +1 -1
  338. package/dist/db/migrations/v50.js +8 -7
  339. package/dist/db/migrations/v52.js +1 -1
  340. package/dist/db/open.d.ts +9 -1
  341. package/dist/db/open.js +21 -4
  342. package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
  343. package/dist/{physics-state.js → db/physics-state.js} +9 -16
  344. package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
  345. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
  346. package/dist/db/request-stores.d.ts +15 -2
  347. package/dist/db/request-stores.js +37 -15
  348. package/dist/db/tables.d.ts +2 -0
  349. package/dist/db/tables.js +6 -0
  350. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
  351. package/dist/{vector-store.js → db/vector-store.js} +76 -51
  352. package/dist/db/wal-checkpointer.d.ts +11 -0
  353. package/dist/db/wal-checkpointer.js +92 -0
  354. package/dist/doctor.js +105 -136
  355. package/dist/entry/json-hooks.d.ts +1 -1
  356. package/dist/entry/json-hooks.js +1 -1
  357. package/dist/entry/project-identity.d.ts +1 -1
  358. package/dist/entry/project-identity.js +1 -1
  359. package/dist/entry/session-text.d.ts +3 -3
  360. package/dist/entry/session-text.js +3 -3
  361. package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
  362. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
  363. package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
  364. package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
  365. package/dist/{eval.js → eval/eval.js} +29 -22
  366. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
  367. package/dist/{judgment.js → eval/judgment.js} +4 -9
  368. package/dist/extensions/openclaw-plugin/index.js +1 -2
  369. package/dist/graph/delta.d.ts +3 -2
  370. package/dist/graph/delta.js +9 -23
  371. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
  372. package/dist/{graph-extract.js → graph/extract.js} +37 -52
  373. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
  374. package/dist/{graph-recall.js → graph/recall.js} +55 -36
  375. package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
  376. package/dist/{graph-stream.js → graph/stream.js} +9 -7
  377. package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
  378. package/dist/{graph-view.js → graph/view.js} +127 -167
  379. package/dist/graph/write.d.ts +4 -76
  380. package/dist/graph/write.js +13 -397
  381. package/dist/hooks/codex-session.js +1 -1
  382. package/dist/hooks/codex-wrapper.js +14 -15
  383. package/dist/hooks/copilot.d.ts +1 -8
  384. package/dist/hooks/copilot.js +14 -15
  385. package/dist/{cli → hooks}/hook-blocks.js +1 -1
  386. package/dist/hooks/json-hooks.d.ts +1 -1
  387. package/dist/hooks/json-hooks.js +31 -122
  388. package/dist/hooks/opencode.js +35 -27
  389. package/dist/hooks/shared.d.ts +0 -4
  390. package/dist/hooks/shared.js +1 -5
  391. package/dist/importers/core.d.ts +2 -6
  392. package/dist/importers/core.js +41 -39
  393. package/dist/importers/markdown-parse.d.ts +1 -10
  394. package/dist/importers/markdown-parse.js +2 -19
  395. package/dist/importers/markdown.js +2 -1
  396. package/dist/importers/sources.js +50 -46
  397. package/dist/importers/vault.js +71 -92
  398. package/dist/index.d.ts +22 -22
  399. package/dist/index.js +21 -21
  400. package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
  401. package/dist/{autolearn.js → learn/autolearn.js} +13 -11
  402. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  403. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  404. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  405. package/dist/learn/extract.js +125 -0
  406. package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
  407. package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
  408. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
  409. package/dist/{invalidation.js → learn/invalidation.js} +83 -99
  410. package/dist/mcp/admin-tools.d.ts +1 -1
  411. package/dist/mcp/admin-tools.js +37 -60
  412. package/dist/mcp/format.d.ts +5 -5
  413. package/dist/mcp/format.js +7 -6
  414. package/dist/mcp/framing.d.ts +6 -0
  415. package/dist/mcp/framing.js +11 -3
  416. package/dist/mcp/memory-tools.js +7 -27
  417. package/dist/mcp/protocol.d.ts +6 -10
  418. package/dist/mcp/protocol.js +8 -14
  419. package/dist/mcp/recall-tools.d.ts +2 -2
  420. package/dist/mcp/recall-tools.js +68 -50
  421. package/dist/mcp/request.js +62 -60
  422. package/dist/mcp/server.js +1 -1
  423. package/dist/mcp/session-state.d.ts +1 -2
  424. package/dist/mcp/session-state.js +2 -2
  425. package/dist/mcp/shared-gate.js +1 -1
  426. package/dist/mcp/stdio.js +69 -31
  427. package/dist/mcp/tool-args.js +2 -1
  428. package/dist/mcp/tools.js +2 -2
  429. package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
  430. package/dist/objects/customer-notes.js +112 -0
  431. package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
  432. package/dist/objects/decisions.js +101 -0
  433. package/dist/objects/descriptor.d.ts +52 -0
  434. package/dist/objects/descriptor.js +4 -0
  435. package/dist/objects/fields.d.ts +15 -0
  436. package/dist/objects/fields.js +21 -0
  437. package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
  438. package/dist/objects/incidents.js +130 -0
  439. package/dist/objects/lifecycle.d.ts +27 -0
  440. package/dist/objects/lifecycle.js +96 -0
  441. package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
  442. package/dist/objects/policies.js +189 -0
  443. package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
  444. package/dist/objects/processes.js +146 -0
  445. package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
  446. package/dist/objects/project-briefs.js +255 -0
  447. package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
  448. package/dist/objects/skills.js +156 -0
  449. package/dist/postinstall.js +4 -2
  450. package/dist/predictions/planning-fallacy.d.ts +4 -76
  451. package/dist/predictions/planning-fallacy.js +4 -129
  452. package/dist/rerankers/clef.d.ts +2 -6
  453. package/dist/rerankers/clef.js +27 -47
  454. package/dist/rerankers/cross-encoder.d.ts +0 -7
  455. package/dist/rerankers/cross-encoder.js +15 -23
  456. package/dist/rerankers/index.js +8 -7
  457. package/dist/rerankers/jev.d.ts +1 -4
  458. package/dist/rerankers/jev.js +30 -49
  459. package/dist/rerankers/llm.d.ts +2 -4
  460. package/dist/rerankers/llm.js +33 -50
  461. package/dist/rerankers/outage-warning.d.ts +7 -0
  462. package/dist/rerankers/outage-warning.js +31 -0
  463. package/dist/rerankers/remote.d.ts +3 -0
  464. package/dist/rerankers/remote.js +23 -0
  465. package/dist/rerankers/types.d.ts +1 -1
  466. package/dist/search/as-of.d.ts +1 -1
  467. package/dist/search/bm25-search.d.ts +2 -2
  468. package/dist/search/bm25-search.js +7 -7
  469. package/dist/search/bm25.d.ts +1 -1
  470. package/dist/search/bm25.js +1 -1
  471. package/dist/search/boosts.d.ts +5 -1
  472. package/dist/search/boosts.js +34 -13
  473. package/dist/search/breakdown.d.ts +2 -2
  474. package/dist/search/breakdown.js +2 -1
  475. package/dist/search/explain.d.ts +1 -1
  476. package/dist/search/explain.js +3 -2
  477. package/dist/search/finalize.d.ts +2 -2
  478. package/dist/search/finalize.js +4 -3
  479. package/dist/search/fusion.d.ts +1 -1
  480. package/dist/search/fusion.js +3 -3
  481. package/dist/search/hybrid-score.d.ts +2 -2
  482. package/dist/search/hybrid-score.js +1 -1
  483. package/dist/search/hybrid.d.ts +4 -4
  484. package/dist/search/hybrid.js +11 -8
  485. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  486. package/dist/{multihop.js → search/multihop.js} +7 -5
  487. package/dist/{path-context.js → search/path-context.js} +3 -1
  488. package/dist/search/physics-search.d.ts +4 -4
  489. package/dist/search/physics-search.js +15 -15
  490. package/dist/search/rerank.d.ts +3 -3
  491. package/dist/search/rerank.js +4 -3
  492. package/dist/search/temporal.d.ts +1 -1
  493. package/dist/search/temporal.js +5 -2
  494. package/dist/search/vector.d.ts +3 -3
  495. package/dist/search/vector.js +17 -11
  496. package/dist/server/auth.d.ts +1 -1
  497. package/dist/server/auth.js +26 -18
  498. package/dist/server/boot.d.ts +24 -0
  499. package/dist/server/boot.js +465 -0
  500. package/dist/server/client-ip.d.ts +5 -1
  501. package/dist/server/client-ip.js +18 -6
  502. package/dist/server/cursor.d.ts +1 -1
  503. package/dist/server/cursor.js +2 -3
  504. package/dist/server/deadline.d.ts +13 -0
  505. package/dist/server/deadline.js +45 -0
  506. package/dist/server/key-check-bounds.d.ts +8 -0
  507. package/dist/server/key-check-bounds.js +46 -0
  508. package/dist/server/lifecycle.js +1 -1
  509. package/dist/server/mcp-http.d.ts +1 -4
  510. package/dist/server/mcp-http.js +34 -24
  511. package/dist/server/ready.d.ts +7 -0
  512. package/dist/server/ready.js +38 -0
  513. package/dist/server/request.d.ts +10 -4
  514. package/dist/server/request.js +63 -12
  515. package/dist/server/route-table.d.ts +15 -0
  516. package/dist/server/route-table.js +209 -0
  517. package/dist/server/routes/admin.js +13 -8
  518. package/dist/server/routes/customer-notes.d.ts +5 -5
  519. package/dist/server/routes/customer-notes.js +32 -97
  520. package/dist/server/routes/decisions.d.ts +5 -5
  521. package/dist/server/routes/decisions.js +42 -105
  522. package/dist/server/routes/incidents.d.ts +5 -5
  523. package/dist/server/routes/incidents.js +42 -95
  524. package/dist/server/routes/memories.js +12 -14
  525. package/dist/server/routes/object-routes.d.ts +40 -0
  526. package/dist/server/routes/object-routes.js +80 -0
  527. package/dist/server/routes/policies.d.ts +6 -6
  528. package/dist/server/routes/policies.js +40 -124
  529. package/dist/server/routes/predictions.js +29 -45
  530. package/dist/server/routes/processes.d.ts +5 -5
  531. package/dist/server/routes/processes.js +38 -118
  532. package/dist/server/routes/project-briefs.d.ts +6 -6
  533. package/dist/server/routes/project-briefs.js +38 -110
  534. package/dist/server/routes/recall.js +14 -12
  535. package/dist/server/routes/skills.d.ts +6 -6
  536. package/dist/server/routes/skills.js +37 -125
  537. package/dist/{server-detect.js → server/server-detect.js} +1 -1
  538. package/dist/server/sleep-child.d.ts +2 -0
  539. package/dist/server/sleep-child.js +19 -0
  540. package/dist/server/sleep-offload.d.ts +20 -0
  541. package/dist/server/sleep-offload.js +70 -0
  542. package/dist/server/tls.d.ts +6 -0
  543. package/dist/server/tls.js +24 -0
  544. package/dist/server/types.d.ts +27 -8
  545. package/dist/server/validation.d.ts +3 -4
  546. package/dist/server/validation.js +6 -11
  547. package/dist/server.d.ts +39 -61
  548. package/dist/server.js +24 -568
  549. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
  550. package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
  551. package/dist/{scope.js → sharing/scope.js} +1 -1
  552. package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
  553. package/dist/{shared.js → sharing/shared.js} +100 -77
  554. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  555. package/dist/{ambient-store.js → store/ambient.js} +10 -10
  556. package/dist/store/audit-event.d.ts +11 -5
  557. package/dist/store/audit-event.js +5 -4
  558. package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
  559. package/dist/{audit.js → store/audit.js} +91 -6
  560. package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
  561. package/dist/{auth.js → store/auth.js} +100 -92
  562. package/dist/store/candidates.d.ts +23 -12
  563. package/dist/store/candidates.js +87 -35
  564. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
  565. package/dist/{card-detail.js → store/card-detail.js} +1 -1
  566. package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
  567. package/dist/{store-cards.js → store/cards.js} +85 -146
  568. package/dist/store/compactions.d.ts +78 -0
  569. package/dist/store/compactions.js +93 -0
  570. package/dist/store/conflicts.d.ts +22 -5
  571. package/dist/store/conflicts.js +160 -109
  572. package/dist/store/connectors/github.d.ts +84 -0
  573. package/dist/store/connectors/github.js +180 -0
  574. package/dist/store/connectors/slack.d.ts +69 -0
  575. package/dist/store/connectors/slack.js +177 -0
  576. package/dist/store/dashboard-reads.d.ts +27 -0
  577. package/dist/store/dashboard-reads.js +92 -0
  578. package/dist/store/delete-and-batch.d.ts +20 -24
  579. package/dist/store/delete-and-batch.js +64 -40
  580. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
  581. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
  582. package/dist/store/descendant-page.d.ts +12 -0
  583. package/dist/store/descendant-page.js +99 -0
  584. package/dist/store/diagnostics.d.ts +47 -0
  585. package/dist/store/diagnostics.js +51 -0
  586. package/dist/store/doctor-reads.d.ts +16 -0
  587. package/dist/store/doctor-reads.js +19 -0
  588. package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
  589. package/dist/{dormant.js → store/dormant.js} +151 -6
  590. package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
  591. package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
  592. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  593. package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
  594. package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
  595. package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
  596. package/dist/store/entry-reads.d.ts +46 -7
  597. package/dist/store/entry-reads.js +120 -21
  598. package/dist/store/entry-row.d.ts +8 -2
  599. package/dist/store/entry-row.js +28 -8
  600. package/dist/store/entry-writes.d.ts +33 -4
  601. package/dist/store/entry-writes.js +108 -26
  602. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  603. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  604. package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
  605. package/dist/{goals.js → store/goals.js} +45 -94
  606. package/dist/store/graph-queue.d.ts +29 -0
  607. package/dist/store/graph-queue.js +101 -0
  608. package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
  609. package/dist/{graph/read.js → store/graph-reads.js} +63 -115
  610. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
  611. package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
  612. package/dist/store/graph-view-rows.d.ts +12 -0
  613. package/dist/store/graph-view-rows.js +67 -0
  614. package/dist/store/graph-writes.d.ts +58 -0
  615. package/dist/store/graph-writes.js +256 -0
  616. package/dist/store/half-life.d.ts +34 -0
  617. package/dist/store/half-life.js +77 -0
  618. package/dist/store/handoffs.d.ts +1 -1
  619. package/dist/store/handoffs.js +39 -30
  620. package/dist/store/index-and-stats.d.ts +8 -1
  621. package/dist/store/index-and-stats.js +51 -48
  622. package/dist/store/index.d.ts +4 -0
  623. package/dist/store/index.js +3 -0
  624. package/dist/store/key-audit.d.ts +2 -2
  625. package/dist/store/key-audit.js +4 -4
  626. package/dist/store/key-writes.d.ts +12 -5
  627. package/dist/store/key-writes.js +30 -4
  628. package/dist/store/ledger-turn.d.ts +17 -0
  629. package/dist/store/ledger-turn.js +27 -0
  630. package/dist/store/markdown.d.ts +1 -1
  631. package/dist/store/markdown.js +4 -3
  632. package/dist/store/mirrors.d.ts +5 -7
  633. package/dist/store/mirrors.js +39 -25
  634. package/dist/store/object-types.d.ts +189 -0
  635. package/dist/store/object-types.js +4 -0
  636. package/dist/store/open.d.ts +6 -4
  637. package/dist/store/open.js +24 -23
  638. package/dist/store/planning-fallacy-evidence.d.ts +42 -0
  639. package/dist/store/planning-fallacy-evidence.js +81 -0
  640. package/dist/store/port.d.ts +646 -0
  641. package/dist/store/port.js +17 -0
  642. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
  643. package/dist/{predictions/store.js → store/predictions.js} +52 -67
  644. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  645. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  646. package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +3 -1
  647. package/dist/{raw-archive.js → store/raw-archive.js} +6 -2
  648. package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +2 -2
  649. package/dist/{recall-scope.js → store/recall-scope.js} +3 -3
  650. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
  651. package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
  652. package/dist/store/rejected-values.d.ts +55 -0
  653. package/dist/store/rejected-values.js +162 -0
  654. package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
  655. package/dist/{rejection.js → store/rejection.js} +3 -2
  656. package/dist/store/rows.d.ts +2 -3
  657. package/dist/store/rows.js +18 -11
  658. package/dist/store/search-rows.d.ts +15 -4
  659. package/dist/store/search-rows.js +41 -28
  660. package/dist/store/sessions.d.ts +13 -2
  661. package/dist/store/sessions.js +79 -45
  662. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  663. package/dist/store/sqlite/commit-watch.js +29 -0
  664. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  665. package/dist/store/sqlite/connector-events-group.js +50 -0
  666. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  667. package/dist/store/sqlite/connector-writes-group.js +65 -0
  668. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  669. package/dist/store/sqlite/dag-reads-group.js +45 -0
  670. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  671. package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
  672. package/dist/store/sqlite/error-codec.d.ts +17 -0
  673. package/dist/store/sqlite/error-codec.js +59 -0
  674. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  675. package/dist/store/sqlite/executor-counts.js +11 -0
  676. package/dist/store/sqlite/executor.d.ts +28 -0
  677. package/dist/store/sqlite/executor.js +286 -0
  678. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  679. package/dist/store/sqlite/graph-reads-group.js +18 -0
  680. package/dist/store/sqlite/local.d.ts +21 -0
  681. package/dist/store/sqlite/local.js +38 -0
  682. package/dist/store/sqlite/object-rows.d.ts +102 -0
  683. package/dist/store/sqlite/object-rows.js +218 -0
  684. package/dist/store/sqlite/objects-group.d.ts +20 -0
  685. package/dist/store/sqlite/objects-group.js +314 -0
  686. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  687. package/dist/store/sqlite/predictions-group.js +28 -0
  688. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  689. package/dist/store/sqlite/quarantine-group.js +38 -0
  690. package/dist/store/sqlite/store.d.ts +26 -0
  691. package/dist/store/sqlite/store.js +295 -0
  692. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  693. package/dist/store/sqlite/vector-pack.js +46 -0
  694. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  695. package/dist/store/sqlite/vector-reads-group.js +23 -0
  696. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  697. package/dist/store/sqlite/worker-entry.js +8 -0
  698. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  699. package/dist/store/sqlite/worker-jobs.js +116 -0
  700. package/dist/store/sqlite/worker-ops.d.ts +124 -0
  701. package/dist/store/sqlite/worker-ops.js +82 -0
  702. package/dist/store/sqlite/worker-store.d.ts +8 -0
  703. package/dist/store/sqlite/worker-store.js +76 -0
  704. package/dist/store/summaries.d.ts +2 -11
  705. package/dist/store/summaries.js +17 -44
  706. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  707. package/dist/store/tenant-lookup.d.ts +1 -1
  708. package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
  709. package/dist/{tenant.js → store/tenant.js} +1 -1
  710. package/dist/store/token-ledger-rows.d.ts +61 -0
  711. package/dist/store/token-ledger-rows.js +68 -0
  712. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
  713. package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
  714. package/dist/store/tombstone-checks.d.ts +12 -0
  715. package/dist/store/tombstone-checks.js +31 -0
  716. package/dist/store/usage-reports.d.ts +7 -0
  717. package/dist/store/usage-reports.js +26 -0
  718. package/dist/store/vector-writes.d.ts +10 -3
  719. package/dist/store/vector-writes.js +35 -5
  720. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
  721. package/dist/{working-memory.js → store/working-memory.js} +39 -41
  722. package/dist/support-bundle.d.ts +1 -1
  723. package/dist/support-bundle.js +13 -33
  724. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  725. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  726. package/dist/trust/quarantine.d.ts +4 -0
  727. package/dist/trust/quarantine.js +8 -0
  728. package/dist/trust/reject-flow.d.ts +23 -0
  729. package/dist/trust/reject-flow.js +67 -0
  730. package/dist/util/anthropic-messages.d.ts +31 -0
  731. package/dist/util/anthropic-messages.js +46 -0
  732. package/dist/util/atomic-write.d.ts +3 -0
  733. package/dist/util/atomic-write.js +107 -0
  734. package/dist/util/crash-handlers.d.ts +5 -0
  735. package/dist/util/crash-handlers.js +30 -0
  736. package/dist/{env.d.ts → util/env.d.ts} +15 -2
  737. package/dist/{env.js → util/env.js} +20 -2
  738. package/dist/util/home-path.js +67 -0
  739. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
  740. package/dist/{http-retry.js → util/http-retry.js} +38 -7
  741. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  742. package/dist/{http-util.js → util/http-util.js} +31 -11
  743. package/dist/util/json.d.ts +17 -0
  744. package/dist/util/json.js +25 -0
  745. package/dist/{log.d.ts → util/log.d.ts} +5 -2
  746. package/dist/{log.js → util/log.js} +12 -3
  747. package/dist/util/real-path.d.ts +3 -0
  748. package/dist/util/real-path.js +15 -0
  749. package/dist/util/request-scope.d.ts +27 -0
  750. package/dist/util/request-scope.js +47 -0
  751. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  752. package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
  753. package/dist/util/stored-json.d.ts +9 -0
  754. package/dist/util/stored-json.js +8 -0
  755. package/dist/util/time.d.ts +2 -0
  756. package/dist/util/time.js +3 -0
  757. package/dist/util/token-text.d.ts +18 -0
  758. package/dist/util/token-text.js +23 -0
  759. package/dist/{version.d.ts → util/version.d.ts} +1 -1
  760. package/dist/{version.js → util/version.js} +1 -1
  761. package/extensions/openclaw-plugin/index.ts +1 -5
  762. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  763. package/extensions/openclaw-plugin/package.json +1 -1
  764. package/openclaw.plugin.json +1 -1
  765. package/package.json +2 -2
  766. package/dist/api.d.ts +0 -26
  767. package/dist/api.js +0 -29
  768. package/dist/connectors/github/idempotency.d.ts +0 -19
  769. package/dist/connectors/github/idempotency.js +0 -27
  770. package/dist/connectors/slack/idempotency.d.ts +0 -17
  771. package/dist/connectors/slack/idempotency.js +0 -31
  772. package/dist/customer-notes.js +0 -336
  773. package/dist/db.d.ts +0 -9
  774. package/dist/db.js +0 -8
  775. package/dist/decisions.js +0 -326
  776. package/dist/extract.js +0 -133
  777. package/dist/graph/rows.d.ts +0 -45
  778. package/dist/graph/types.js +0 -11
  779. package/dist/half-life-migration.js +0 -182
  780. package/dist/handoff.js +0 -68
  781. package/dist/home-path.js +0 -24
  782. package/dist/incidents.js +0 -349
  783. package/dist/instruction-detect.js +0 -27
  784. package/dist/json.d.ts +0 -7
  785. package/dist/json.js +0 -11
  786. package/dist/ledger-db.d.ts +0 -10
  787. package/dist/ledger-db.js +0 -42
  788. package/dist/policies.js +0 -434
  789. package/dist/processes.js +0 -371
  790. package/dist/project-briefs.js +0 -523
  791. package/dist/reject-flow.d.ts +0 -69
  792. package/dist/reject-flow.js +0 -260
  793. package/dist/session-owners.d.ts +0 -7
  794. package/dist/session-owners.js +0 -54
  795. package/dist/skills.js +0 -367
  796. package/dist/store/entry-writes-group.d.ts +0 -9
  797. package/dist/store-port.d.ts +0 -262
  798. package/dist/store-port.js +0 -178
  799. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  800. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  801. /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
  802. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  803. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  804. /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
  805. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  806. /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
  807. /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
  808. /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
  809. /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
  810. /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
  811. /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
  812. /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
  813. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  814. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  815. /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
  816. /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
  817. /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
  818. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  819. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  820. /package/dist/{card.d.ts → core/card.d.ts} +0 -0
  821. /package/dist/{card.js → core/card.js} +0 -0
  822. /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
  823. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  824. /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
  825. /package/dist/{physics-config.js → core/physics-config.js} +0 -0
  826. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  827. /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
  828. /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
  829. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  830. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  831. /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
  832. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  833. /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
  834. /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
  835. /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
  836. /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
  837. /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
  838. /package/dist/{rrf.js → search/rrf.js} +0 -0
  839. /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
  840. /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
  841. /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
  842. /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
  843. /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
  844. /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
  845. /package/dist/{yaml.js → store/yaml.js} +0 -0
  846. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  847. /package/dist/{escape.js → util/escape.js} +0 -0
  848. /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
  849. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  850. /package/dist/{keyset.js → util/keyset.js} +0 -0
  851. /package/dist/{same-text.js → util/same-text.js} +0 -0
  852. /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
  853. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  854. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  855. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  856. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  857. /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
  858. /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
  859. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  860. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -0,0 +1,6 @@
1
+ export const SESSION_DIGEST_TAG = 'session-digest';
2
+ /** Facts extracted from a digest and DAG summaries over one inherit its tag, but they are not the digest itself. */
3
+ export function isSessionDigestRow(entry) {
4
+ return entry.source === SESSION_DIGEST_TAG && entry.tags.includes(SESSION_DIGEST_TAG) && !entry.extracted_from;
5
+ }
6
+ //# sourceMappingURL=session-digest-row.js.map
@@ -1,4 +1,4 @@
1
- import type { MemoryEntry } from './memory.js';
1
+ import type { MemoryEntry } from '../core/memory.js';
2
2
  import { type ActionBody } from './dashboard-params.js';
3
3
  /** What an action hands the router: a status, a JSON body, and whether the store changed. */
4
4
  export interface ActionResult {
@@ -1,9 +1,9 @@
1
1
  // The four dashboard writes, each a thin call into an existing store or api function; the router owns HTTP and the cache.
2
- import * as api from './api.js';
3
- import { NotFoundError } from './api-errors.js';
4
- import { listTouchableConflicts, resolveConflict } from './store/conflicts.js';
5
- import { readEntry } from './store/entry-reads.js';
6
- import { writeEntry } from './store/entry-writes.js';
2
+ import * as api from '../api/index.js';
3
+ import { NotFoundError } from '../core/api-errors.js';
4
+ import { listTouchableConflicts, resolveConflict } from '../store/conflicts.js';
5
+ import { readEntry } from '../store/entry-reads.js';
6
+ import { writeEntry } from '../store/entry-writes.js';
7
7
  import { ParamError, parseMemoryId } from './dashboard-params.js';
8
8
  import { isLiveMemory } from './dashboard-snapshot.js';
9
9
  const ACTOR = 'dashboard';
@@ -1,4 +1,4 @@
1
- import { type MemoryEntry } from './memory.js';
1
+ import { type MemoryEntry } from '../core/memory.js';
2
2
  import { type Snapshot } from './dashboard-snapshot.js';
3
3
  import type { MemoryQuery } from './dashboard-params.js';
4
4
  import type { MemoryDetail, MemoryPage, Overview, ProjectDetail, SearchResult } from './dashboard-types.js';
@@ -10,6 +10,11 @@ export declare function buildProjectDetail(snap: Snapshot, key: string): Project
10
10
  export declare function buildMemoryPage(snap: Snapshot, key: string, query: MemoryQuery): MemoryPage | null;
11
11
  /** Substring search over content and tags across every project; it reads the snapshot and never touches recall. */
12
12
  export declare function buildSearch(snap: Snapshot, text: string): SearchResult;
13
+ export interface MemoryDetailOptions {
14
+ readonly snapshotId: number;
15
+ readonly nowMs: number;
16
+ readonly embedded: boolean;
17
+ }
13
18
  /** Full detail read fresh from the store, never from the snapshot, so the drawer is current inside the coalescing window. */
14
- export declare function buildMemoryDetail(hippoRoot: string, tenantId: string, entry: MemoryEntry, snapshotId: number, nowMs: number, embedded: boolean): MemoryDetail;
19
+ export declare function buildMemoryDetail(hippoRoot: string, tenantId: string, entry: MemoryEntry, options: MemoryDetailOptions): MemoryDetail;
15
20
  //# sourceMappingURL=dashboard-queries.d.ts.map
@@ -1,7 +1,6 @@
1
1
  // Read models over a snapshot: overview, project, memory page, search, and the fresh single-memory detail.
2
- import { calculateStrength } from './memory.js';
3
- import { listMemoryConflicts } from './store/conflicts.js';
4
- import { readEntry } from './store/entry-reads.js';
2
+ import { calculateStrength } from '../core/memory.js';
3
+ import { loadOpenConflictsOf } from '../store/conflicts.js';
5
4
  import { BANDS, DAY_MS, LAYERS, isLiveMemory, memoryFacts, projectIdentity, } from './dashboard-snapshot.js';
6
5
  const SERIES_DAYS = 90;
7
6
  /** The server words each delta for this range; the client re-slices the series for 7d and 90d. */
@@ -297,12 +296,8 @@ export function buildSearch(snap, text) {
297
296
  }
298
297
  function openConflictsOf(hippoRoot, tenantId, entry, nowMs) {
299
298
  const out = [];
300
- for (const c of listMemoryConflicts(hippoRoot, 'open', tenantId)) {
301
- if (c.memory_a_id !== entry.id && c.memory_b_id !== entry.id)
302
- continue;
303
- const otherId = c.memory_a_id === entry.id ? c.memory_b_id : c.memory_a_id;
304
- const other = readEntry(hippoRoot, otherId, tenantId);
305
- if (!other || !isLiveMemory(other))
299
+ for (const { conflict: c, other } of loadOpenConflictsOf(hippoRoot, tenantId, entry.id)) {
300
+ if (!isLiveMemory(other))
306
301
  continue;
307
302
  out.push({
308
303
  id: c.id,
@@ -319,7 +314,8 @@ function openConflictsOf(hippoRoot, tenantId, entry, nowMs) {
319
314
  return out;
320
315
  }
321
316
  /** Full detail read fresh from the store, never from the snapshot, so the drawer is current inside the coalescing window. */
322
- export function buildMemoryDetail(hippoRoot, tenantId, entry, snapshotId, nowMs, embedded) {
317
+ export function buildMemoryDetail(hippoRoot, tenantId, entry, options) {
318
+ const { snapshotId, nowMs, embedded } = options;
323
319
  const f = memoryFacts(entry, nowMs);
324
320
  const project = projectIdentity(entry.origin_project);
325
321
  return {
@@ -1,13 +1,11 @@
1
- import { Layer as MemoryLayer, type MemoryEntry } from './memory.js';
2
- import type { MemoryConflict } from './store/rows.js';
1
+ import { Layer as MemoryLayer, type ConfidenceInputs, type MemoryEntry, type StrengthInputs } from '../core/memory.js';
2
+ import { type DashboardRow, type ExcludedCounts } from '../store/dashboard-reads.js';
3
+ import type { MemoryConflict } from '../store/rows.js';
3
4
  import type { Band, ChipCounts, Layer, Overview, ProjectKind, ProjectSummary, ScatterGrid, ScatterPoints } from './dashboard-types.js';
4
- export declare const DAY_MS = 86400000;
5
+ import { DAY_MS } from '../util/time.js';
6
+ export { DAY_MS };
5
7
  export declare const LAYERS: readonly Layer[];
6
8
  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
9
  /** The one predicate for "shown on the dashboard": not superseded, not archived, not quarantined. */
12
10
  export declare function isLiveMemory(entry: Pick<MemoryEntry, 'superseded_by' | 'kind' | 'scope'>): boolean;
13
11
  /** Wire key, display name and kind of a project. */
@@ -34,7 +32,7 @@ export interface MemoryFacts {
34
32
  wrong: boolean;
35
33
  }
36
34
  /** 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;
35
+ export declare function memoryFacts(entry: StrengthInputs & ConfidenceInputs & Pick<MemoryEntry, 'layer'>, nowMs: number): MemoryFacts;
38
36
  /** One live memory as the snapshot holds it: numbers and short strings only, never the full entry. */
39
37
  export interface Fact {
40
38
  id: string;
@@ -116,7 +114,9 @@ export interface SnapshotInput {
116
114
  id: number;
117
115
  tenantId: string;
118
116
  nowMs: number;
119
- entries: readonly MemoryEntry[];
117
+ entries: readonly DashboardRow[];
118
+ /** Rows counted out before `entries` was read; any entry here that is not live adds to them. */
119
+ excluded?: ExcludedCounts;
120
120
  openConflicts: readonly Pick<MemoryConflict, 'memory_a_id' | 'memory_b_id'>[];
121
121
  embeddedIds: ReadonlySet<string> | null;
122
122
  }
@@ -1,13 +1,11 @@
1
1
  // The dashboard's read model: one in-memory snapshot of a tenant's live memories, grouped by origin project.
2
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;
3
+ import { calculateStrength, facetsOf, netWrong, Layer as MemoryLayer } from '../core/memory.js';
4
+ import { isQuarantineScope } from '../trust/quarantine.js';
5
+ import { listMemoryConflicts } from '../store/conflicts.js';
6
+ import { DashboardConnection, loadDashboardRows } from '../store/dashboard-reads.js';
7
+ import { DAY_MS } from '../util/time.js';
8
+ export { DAY_MS };
11
9
  export const LAYERS = ['buffer', 'episodic', 'semantic', 'trace'];
12
10
  // Wire order of `Band`, and the order the mockup sorts bands in.
13
11
  export const BANDS = ['pinned', 'strong', 'fading', 'atRisk'];
@@ -18,9 +16,9 @@ const BAND_AT_RISK = 3;
18
16
  const CONFIDENCE_ORDER = ['verified', 'observed', 'inferred', 'stale'];
19
17
  const HEAD_CHARS = 240;
20
18
  /** An outside commit rebuilds the snapshot at most this often. */
21
- export const COALESCE_MS = 10_000;
19
+ const COALESCE_MS = 10_000;
22
20
  /** Projected strengths track the clock, so the snapshot is rebuilt at least this often. */
23
- export const TTL_MS = 5 * 60_000;
21
+ const TTL_MS = 5 * 60_000;
24
22
  /** The one predicate for "shown on the dashboard": not superseded, not archived, not quarantined. */
25
23
  export function isLiveMemory(entry) {
26
24
  return !entry.superseded_by && (entry.kind === 'raw' || entry.kind === 'distilled') && !isQuarantineScope(entry.scope);
@@ -52,7 +50,7 @@ export function memoryFacts(entry, nowMs) {
52
50
  const strength = calculateStrength(entry, now);
53
51
  const strength7d = calculateStrength(entry, new Date(nowMs + 7 * DAY_MS));
54
52
  const strength30d = calculateStrength(entry, new Date(nowMs + 30 * DAY_MS));
55
- const facets = confidenceFacets(entry, now);
53
+ const facets = facetsOf(entry, now);
56
54
  const band = entry.pinned ? BAND_PINNED : strength30d < 0.2 ? BAND_AT_RISK : strength >= 0.5 ? BAND_STRONG : BAND_FADING;
57
55
  return {
58
56
  strength,
@@ -144,30 +142,42 @@ function toFact(entry, f, project, embedded, createdMs) {
144
142
  createdMs,
145
143
  };
146
144
  }
145
+ function tallyExcluded(entry, excluded) {
146
+ if (isQuarantineScope(entry.scope))
147
+ excluded.quarantined++;
148
+ else if (entry.superseded_by || entry.kind === 'superseded')
149
+ excluded.superseded++;
150
+ else if (entry.kind === 'archived')
151
+ excluded.archived++;
152
+ }
153
+ function draftIndexFor(identity, projectIndex, drafts) {
154
+ let p = projectIndex.get(identity.key);
155
+ if (p === undefined) {
156
+ p = drafts.length;
157
+ projectIndex.set(identity.key, p);
158
+ drafts.push(newDraft(identity));
159
+ }
160
+ return p;
161
+ }
162
+ function finishProject(d) {
163
+ d.summary.atRisk = d.summary.bands.atRisk;
164
+ d.summary.share = d.summary.live > 0 ? d.summary.atRisk / d.summary.live : 0;
165
+ d.summary.lastRetrievedDays = d.summary.live > 0 ? round1(d.lastDays) : null;
166
+ return { summary: d.summary, members: Int32Array.from(d.members), firstCreatedMs: d.firstCreatedMs };
167
+ }
147
168
  /** Builds the snapshot from already-loaded rows; it touches no store, so tests can feed it directly. */
148
169
  export function buildSnapshot(input) {
149
170
  const { entries, embeddedIds, nowMs } = input;
150
- const excluded = { superseded: 0, archived: 0, quarantined: 0 };
171
+ const excluded = { superseded: 0, archived: 0, quarantined: 0, ...input.excluded };
151
172
  const facts = [];
152
173
  const projectIndex = new Map();
153
174
  const drafts = [];
154
175
  for (const entry of entries) {
155
176
  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++;
177
+ tallyExcluded(entry, excluded);
162
178
  continue;
163
179
  }
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
- }
180
+ const p = draftIndexFor(projectIdentity(entry.origin_project), projectIndex, drafts);
171
181
  const f = memoryFacts(entry, nowMs);
172
182
  const embedded = embeddedIds !== null && embeddedIds.has(entry.id);
173
183
  const parsedCreated = Date.parse(entry.created);
@@ -187,12 +197,7 @@ export function buildSnapshot(input) {
187
197
  facts.push(toFact(entry, f, p, embedded, Number.isFinite(parsedCreated) ? parsedCreated : nowMs));
188
198
  }
189
199
  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
- });
200
+ const projects = drafts.map(finishProject);
196
201
  const embeddedTotal = projects.reduce((sum, p) => sum + p.summary.embedded, 0);
197
202
  return {
198
203
  id: input.id,
@@ -227,82 +232,74 @@ function countOpenConflicts(facts, summaries, conflicts) {
227
232
  }
228
233
  return total;
229
234
  }
235
+ function cacheStillServes(hit, want, wallMs) {
236
+ const age = wallMs - hit.builtAtMs;
237
+ return hit.snapshot.tenantId === want.tenantId
238
+ && (hit.dataVersion !== null || want.dataVersion === null)
239
+ && age < TTL_MS
240
+ && (hit.dataVersion === want.dataVersion || age < COALESCE_MS);
241
+ }
230
242
  // Keeps ids rising between two services created in the same millisecond of one process.
231
243
  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;
244
+ class SnapshotCacheService {
245
+ hippoRoot;
246
+ now;
247
+ cacheClock;
248
+ connection;
249
+ cached = null;
236
250
  // 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);
251
+ lastId = Math.max(Date.now(), highestIssuedId);
252
+ lastEmbeddedIds;
253
+ constructor(hippoRoot, now, cacheClock) {
254
+ this.hippoRoot = hippoRoot;
255
+ this.now = now;
256
+ this.cacheClock = cacheClock;
257
+ this.connection = new DashboardConnection(hippoRoot);
258
+ }
259
+ build(tenantId, dv, nowMs) {
260
+ const rows = dv === null ? null : loadDashboardRows(this.hippoRoot, tenantId);
261
+ const openConflicts = dv === null ? [] : listMemoryConflicts(this.hippoRoot, 'open', tenantId);
262
+ this.lastId += 1;
263
+ highestIssuedId = Math.max(highestIssuedId, this.lastId);
264
+ // After loadDashboardRows, whose writable open has run any pending migration and legacy embeddings.json import.
265
+ this.lastEmbeddedIds = this.connection.embeddedIds();
266
+ return buildSnapshot({ id: this.lastId, tenantId, nowMs, entries: rows?.live ?? [], excluded: rows?.excluded, openConflicts, embeddedIds: this.lastEmbeddedIds });
267
+ }
268
+ get(tenantId, fresh = false) {
269
+ const nowMs = this.now();
270
+ // A frozen eval clock (HIPPO_FAKE_NOW) would never age the cache, so reuse is timed on its own clock.
271
+ const wallMs = this.cacheClock();
272
+ // Read before the build, so a commit that lands during it shows on the next read.
273
+ const dv = this.connection.dataVersion();
274
+ const hit = this.cached;
275
+ if (hit !== null && !fresh) {
276
+ if (cacheStillServes(hit, { tenantId, dataVersion: dv }, wallMs))
277
+ return hit.snapshot;
244
278
  }
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
- };
279
+ const snapshot = this.build(tenantId, dv, nowMs);
280
+ this.cached = { snapshot, dataVersion: dv, builtAtMs: wallMs };
281
+ return snapshot;
282
+ }
283
+ invalidate() {
284
+ this.cached = null;
285
+ }
286
+ currentId() {
287
+ return this.lastId;
288
+ }
289
+ embeddedIds() {
290
+ if (this.lastEmbeddedIds !== undefined)
291
+ return this.lastEmbeddedIds;
292
+ this.connection.dataVersion();
293
+ return this.connection.embeddedIds();
294
+ }
295
+ close() {
296
+ this.connection.close();
297
+ this.cached = null;
298
+ this.lastEmbeddedIds = undefined;
299
+ }
300
+ }
301
+ /** 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. */
302
+ export function createSnapshotService(hippoRoot, now, cacheClock = Date.now) {
303
+ return new SnapshotCacheService(hippoRoot, now, cacheClock);
307
304
  }
308
305
  //# sourceMappingURL=dashboard-snapshot.js.map
@@ -2,18 +2,19 @@
2
2
  import * as http from 'http';
3
3
  import * as path from 'path';
4
4
  import * as fs from 'fs';
5
- import { randomBytes, timingSafeEqual } from 'crypto';
6
- import { evalNow } from './ablation.js';
7
- import { readEntry } from './store/entry-reads.js';
8
- import { listCards } from './store-cards.js';
9
- import { resolveTenantId } from './tenant.js';
10
- import { loadCardDetail } from './card-detail.js';
11
- import { closeAfterReply, isCrossSite, LOOPBACK_HOST_HEADER } from './http-util.js';
12
- import { log } from './log.js';
5
+ import { createHash, randomBytes, randomUUID, timingSafeEqual } from 'crypto';
6
+ import { evalNow } from '../core/ablation.js';
7
+ import { readEntry } from '../store/entry-reads.js';
8
+ import { listCards } from '../store/cards.js';
9
+ import { resolveTenantId } from '../store/tenant.js';
10
+ import { loadCardDetail } from '../store/card-detail.js';
11
+ import { bodyDeadlineMs, BodyTimeoutError, closeAfterReply, isCrossSite, LOOPBACK_HOST_HEADER } from '../util/http-util.js';
12
+ import { errorMessage, log } from '../util/log.js';
13
13
  import { createSnapshotService, isLiveMemory } from './dashboard-snapshot.js';
14
14
  import { buildMemoryDetail, buildMemoryPage, buildOverview, buildProjectDetail, buildSearch, } from './dashboard-queries.js';
15
15
  import { forgetMemory, markWrong, pinMemory, resolveOpenConflict, } from './dashboard-actions.js';
16
16
  import { ParamError, parseActionBody, parseConflictId, parseMemoryId, parseMemoryQuery, parseSearchText, } from './dashboard-params.js';
17
+ import { runWithRequestId } from '../util/request-scope.js';
17
18
  const MIME_TYPES = {
18
19
  '.html': 'text/html; charset=utf-8',
19
20
  '.js': 'application/javascript; charset=utf-8',
@@ -72,6 +73,10 @@ function readActionBody(req) {
72
73
  const chunks = [];
73
74
  let size = 0;
74
75
  let aborted = false;
76
+ const deadlineMs = bodyDeadlineMs();
77
+ const timer = setTimeout(() => reject(new BodyTimeoutError(`request body not received within ${deadlineMs} ms`)), deadlineMs);
78
+ // Unref: a request that already failed another way must not hold the process open for the rest of the deadline.
79
+ timer.unref();
75
80
  req.on('data', (chunk) => {
76
81
  size += chunk.length;
77
82
  if (size <= BODY_MAX_BYTES)
@@ -83,6 +88,7 @@ function readActionBody(req) {
83
88
  });
84
89
  req.on('error', reject);
85
90
  req.on('end', () => {
91
+ clearTimeout(timer);
86
92
  if (size > BODY_MAX_BYTES)
87
93
  return reject(new ParamError(`Body must be at most ${BODY_MAX_BYTES} bytes`));
88
94
  try {
@@ -123,7 +129,7 @@ function handleRead(ctx, segments) {
123
129
  return sendOrNotFound(res, null);
124
130
  const snapshotId = snapshots.get(tenantId, fresh).id;
125
131
  const embedded = snapshots.embeddedIds()?.has(entry.id) ?? false;
126
- return sendOrNotFound(res, buildMemoryDetail(hippoRoot, tenantId, entry, snapshotId, ctx.now(), embedded));
132
+ return sendOrNotFound(res, buildMemoryDetail(hippoRoot, tenantId, entry, { snapshotId, nowMs: ctx.now(), embedded }));
127
133
  }
128
134
  if (head === 'search' && segments.length === 2) {
129
135
  return sendOrNotFound(res, buildSearch(snapshots.get(tenantId, fresh), parseSearchText(url.searchParams)));
@@ -175,7 +181,7 @@ async function handlePost(ctx, segments) {
175
181
  if (result.entry) {
176
182
  // The write is committed, so a rebuild failure must not turn it into a 500: the next read rebuilds.
177
183
  const embedded = snapshots.embeddedIds()?.has(result.entry.id) ?? false;
178
- const detail = buildMemoryDetail(hippoRoot, tenantId, result.entry, snapshots.currentId(), ctx.now(), embedded);
184
+ const detail = buildMemoryDetail(hippoRoot, tenantId, result.entry, { snapshotId: snapshots.currentId(), nowMs: ctx.now(), embedded });
179
185
  jsonResponse(res, detail, result.status);
180
186
  }
181
187
  else {
@@ -183,21 +189,43 @@ async function handlePost(ctx, segments) {
183
189
  }
184
190
  return true;
185
191
  }
192
+ // One style block, not style attributes, so the policy below can name its hash and allow no other inline style.
193
+ const NOT_BUILT_CSS = "body{font-family:Georgia,'Palatino Linotype',serif;max-width:640px;margin:60px auto;padding:24px;line-height:1.6;background:#f4efe6;color:#3a3228}" +
194
+ 'h1{color:#c45c3c}' +
195
+ 'pre{background:#faf7f2;padding:16px;border:1px solid #c4b9a8;border-radius:3px;font-family:Consolas,monospace}';
196
+ // Memory text is written by other tools and people, so every reply tells the browser to load code only from this server and never to frame, sniff or name the page elsewhere.
197
+ const SECURITY_HEADERS = {
198
+ 'Content-Security-Policy': [
199
+ "default-src 'none'",
200
+ "script-src 'self'",
201
+ `style-src 'self' 'sha256-${createHash('sha256').update(NOT_BUILT_CSS).digest('base64')}'`,
202
+ "img-src 'self' data:",
203
+ "font-src 'self'",
204
+ "connect-src 'self'",
205
+ "base-uri 'none'",
206
+ "form-action 'none'",
207
+ "frame-ancestors 'none'",
208
+ ].join('; '),
209
+ 'X-Content-Type-Options': 'nosniff',
210
+ 'Referrer-Policy': 'no-referrer',
211
+ 'X-Frame-Options': 'DENY',
212
+ };
186
213
  function notBuilt(res) {
187
214
  res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });
188
215
  res.end(`<!doctype html>
189
- <html lang="en"><head><title>Hippo Dashboard</title><meta charset="utf-8"></head>
190
- <body style="font-family:Georgia,'Palatino Linotype',serif;max-width:640px;margin:60px auto;padding:24px;line-height:1.6;background:#f4efe6;color:#3a3228">
191
- <h1 style="color:#c45c3c">Hippo Dashboard</h1>
216
+ <html lang="en"><head><title>Hippo Dashboard</title><meta charset="utf-8"><style>${NOT_BUILT_CSS}</style></head>
217
+ <body>
218
+ <h1>Hippo Dashboard</h1>
192
219
  <p>The React UI bundle is not built yet. Run:</p>
193
- <pre style="background:#faf7f2;padding:16px;border:1px solid #c4b9a8;border-radius:3px;font-family:Consolas,monospace">cd ui && npm install && npm run build</pre>
220
+ <pre>cd ui && npm install && npm run build</pre>
194
221
  <p>Then refresh this page. The dashboard server will serve <code>dist-ui/index.html</code> automatically once present.</p>
195
222
  </body></html>`);
196
223
  }
197
224
  function serveSpa(res, distUiDir, pathname) {
198
225
  const safePath = path.normalize(pathname).replace(/^(\.\.[/\\])+/, '');
199
226
  const filePath = path.join(distUiDir, safePath);
200
- if (!filePath.startsWith(distUiDir))
227
+ // The separator matters: a bare prefix also admits a sibling folder whose name starts with this one.
228
+ if (filePath !== distUiDir && !filePath.startsWith(distUiDir + path.sep))
201
229
  return forbidden(res);
202
230
  if (fs.existsSync(filePath) && fs.statSync(filePath).isFile() && serveStaticFile(res, filePath))
203
231
  return;
@@ -221,6 +249,78 @@ function cookieValue(header, name) {
221
249
  }
222
250
  return undefined;
223
251
  }
252
+ /** Where a page load that carried the token goes next, without it; null for an API call or a write, which is answered in place. */
253
+ function tokenFreeLocation(req, url) {
254
+ if ((req.method !== 'GET' && req.method !== 'HEAD') || url.pathname.startsWith('/api/'))
255
+ return null;
256
+ const query = new URLSearchParams(url.searchParams);
257
+ query.delete('token');
258
+ const rest = query.toString();
259
+ // One leading slash only: `//host` would send the browser to another site.
260
+ return `${url.pathname.replace(/^\/+/, '/')}${rest ? `?${rest}` : ''}`;
261
+ }
262
+ /** Moves the browser off the URL that carries the token, so the token stays out of history, bookmarks and copied links; false when the request is answered in place. */
263
+ function leaveTokenUrl(req, res, url) {
264
+ const location = tokenFreeLocation(req, url);
265
+ if (location === null)
266
+ return false;
267
+ if (req.headers['sec-fetch-site'] !== 'cross-site') {
268
+ res.writeHead(303, { Location: location });
269
+ res.end();
270
+ return true;
271
+ }
272
+ // A browser withholds a SameSite=Strict cookie from a redirect another site started; a refresh from this page is same-site.
273
+ const target = location.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
274
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
275
+ res.end(`<!doctype html>\n<html lang="en"><head><meta charset="utf-8"><meta http-equiv="refresh" content="0;url=${target}"><title>Hippo Dashboard</title></head><body></body></html>`);
276
+ return true;
277
+ }
278
+ /** True when the request may proceed; false when this already answered it (redirect off the token URL, or 401). */
279
+ function admitDashboardRequest(req, res, url, access) {
280
+ const { token, port } = access;
281
+ // Cookies ignore the port, so the name carries it: two dashboards on one host keep separate tokens.
282
+ const cookieName = `hippo_dashboard_${req.socket.localPort ?? port}`;
283
+ if (sameToken(url.searchParams.get('token') ?? undefined, token)) {
284
+ res.setHeader('Set-Cookie', `${cookieName}=${token}; HttpOnly; SameSite=Strict; Path=/`);
285
+ if (leaveTokenUrl(req, res, url))
286
+ return false;
287
+ }
288
+ else if (!sameToken(cookieValue(req.headers.cookie, cookieName), token)) {
289
+ res.writeHead(401, { 'Content-Type': 'text/plain' });
290
+ res.end('Unauthorized: open the dashboard with the URL `hippo dashboard` printed; it carries the access token.');
291
+ return false;
292
+ }
293
+ return true;
294
+ }
295
+ function answerDashboardFailure(req, res, err) {
296
+ const clientFault = err instanceof ParamError || err instanceof URIError || err instanceof BodyTimeoutError;
297
+ // A cut-short response is logged even for a client fault; a bare 400 is not.
298
+ if (res.headersSent || !clientFault) {
299
+ log.error('dashboard request failed', { error: errorMessage(err), path: req.url });
300
+ }
301
+ if (res.headersSent) {
302
+ res.end();
303
+ return;
304
+ }
305
+ if (err instanceof BodyDrainExceeded || err instanceof BodyTimeoutError) {
306
+ // No `Connection: close` header: Node then destroys the socket as soon as the reply is written.
307
+ res.writeHead(err instanceof BodyTimeoutError ? 408 : 400, { 'Content-Type': 'application/json; charset=utf-8' });
308
+ res.end(JSON.stringify({ error: err.message }), () => closeAfterReply(req));
309
+ return;
310
+ }
311
+ if (err instanceof ParamError)
312
+ return jsonResponse(res, { error: err.message }, 400);
313
+ if (err instanceof URIError)
314
+ return jsonResponse(res, { error: 'Malformed URL path' }, 400);
315
+ jsonResponse(res, { error: 'Internal error' }, 500);
316
+ }
317
+ function printDashboardBanner(boundPort, token, distUiDir) {
318
+ // The banner is the `hippo dashboard` command's printed result, so it stays on stdout.
319
+ console.log(`Hippo Dashboard running at http://localhost:${boundPort}/?token=${token}`);
320
+ if (distUiDir !== null)
321
+ console.log(`Serving React UI from ${distUiDir}`);
322
+ console.log('Press Ctrl+C to stop.');
323
+ }
224
324
  /** 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. */
225
325
  export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).toString('base64url'), opts) {
226
326
  const distUiDir = path.resolve(import.meta.dirname, '..', 'dist-ui');
@@ -232,16 +332,8 @@ export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).t
232
332
  if (host !== undefined && !LOOPBACK_HOST_HEADER.test(host))
233
333
  return forbidden(res);
234
334
  const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
235
- // Cookies ignore the port, so the name carries it: two dashboards on one host keep separate tokens.
236
- const cookieName = `hippo_dashboard_${req.socket.localPort ?? port}`;
237
- if (sameToken(url.searchParams.get('token') ?? undefined, token)) {
238
- res.setHeader('Set-Cookie', `${cookieName}=${token}; HttpOnly; SameSite=Strict; Path=/`);
239
- }
240
- else if (!sameToken(cookieValue(req.headers.cookie, cookieName), token)) {
241
- res.writeHead(401, { 'Content-Type': 'text/plain' });
242
- res.end('Unauthorized: open the dashboard with the URL `hippo dashboard` printed; it carries the access token.');
335
+ if (!admitDashboardRequest(req, res, url, { token, port }))
243
336
  return;
244
- }
245
337
  if (url.pathname.startsWith('/api/')) {
246
338
  // A malformed % sequence throws URIError here; the caller answers 400.
247
339
  const segments = url.pathname.split('/').filter((s) => s !== '').map((s) => decodeURIComponent(s));
@@ -257,39 +349,18 @@ export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).t
257
349
  return serveSpa(res, distUiDir, url.pathname);
258
350
  notBuilt(res);
259
351
  };
260
- const server = http.createServer((req, res) => {
261
- handleRequest(req, res).catch((err) => {
262
- const clientFault = err instanceof ParamError || err instanceof URIError;
263
- // A cut-short response is logged even for a client fault; a bare 400 is not.
264
- if (res.headersSent || !clientFault) {
265
- log.error('dashboard request failed', { error: err instanceof Error ? err.message : String(err), path: req.url });
266
- }
267
- if (res.headersSent) {
268
- res.end();
269
- return;
270
- }
271
- if (err instanceof BodyDrainExceeded) {
272
- // No `Connection: close` header: Node then destroys the socket as soon as the reply is written.
273
- res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });
274
- res.end(JSON.stringify({ error: err.message }), () => closeAfterReply(req));
275
- return;
276
- }
277
- if (err instanceof ParamError)
278
- return jsonResponse(res, { error: err.message }, 400);
279
- if (err instanceof URIError)
280
- return jsonResponse(res, { error: 'Malformed URL path' }, 400);
281
- jsonResponse(res, { error: 'Internal error' }, 500);
282
- });
283
- });
352
+ const onRequest = (req, res) => {
353
+ for (const [name, value] of Object.entries(SECURITY_HEADERS))
354
+ res.setHeader(name, value);
355
+ handleRequest(req, res).catch((err) => answerDashboardFailure(req, res, err));
356
+ };
357
+ // One id per request, so the lines it logs can be told apart from a concurrent request's.
358
+ const server = http.createServer((req, res) => runWithRequestId(randomUUID(), () => onRequest(req, res)));
284
359
  server.on('close', () => snapshots.close());
285
360
  server.listen(port, '127.0.0.1', () => {
286
361
  // SAFETY: listen() was given a TCP port, so address() is AddressInfo, never a pipe name.
287
362
  const boundPort = server.address().port;
288
- // The banner is the `hippo dashboard` command's printed result, so it stays on stdout.
289
- console.log(`Hippo Dashboard running at http://localhost:${boundPort}/?token=${token}`);
290
- if (hasDistUi)
291
- console.log(`Serving React UI from ${distUiDir}`);
292
- console.log('Press Ctrl+C to stop.');
363
+ printDashboardBanner(boundPort, token, hasDistUi ? distUiDir : null);
293
364
  });
294
365
  return server;
295
366
  }