hippo-memory 1.70.0 → 1.72.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 (855) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.d.ts +4 -2
  5. package/dist/agent-memories/claude-code.js +15 -6
  6. package/dist/agent-memories/codex.js +1 -1
  7. package/dist/agent-memories/copilot.d.ts +1 -3
  8. package/dist/agent-memories/copilot.js +1 -17
  9. package/dist/agent-memories/files.js +23 -12
  10. package/dist/agent-memories/markdown.d.ts +1 -3
  11. package/dist/agent-memories/markdown.js +1 -3
  12. package/dist/agent-memories/project-folds.d.ts +10 -0
  13. package/dist/agent-memories/project-folds.js +34 -0
  14. package/dist/agent-memories/report.js +2 -1
  15. package/dist/agent-memories/sync.d.ts +4 -2
  16. package/dist/agent-memories/sync.js +18 -11
  17. package/dist/api/assemble.d.ts +7 -44
  18. package/dist/api/assemble.js +3 -23
  19. package/dist/api/audit.d.ts +33 -1
  20. package/dist/api/audit.js +48 -1
  21. package/dist/api/auth.d.ts +20 -26
  22. package/dist/api/auth.js +43 -29
  23. package/dist/api/auto-sleep.d.ts +5 -2
  24. package/dist/api/auto-sleep.js +9 -5
  25. package/dist/api/availability.d.ts +2 -15
  26. package/dist/api/availability.js +4 -18
  27. package/dist/api/cards.d.ts +42 -0
  28. package/dist/api/cards.js +52 -0
  29. package/dist/api/conflicts.d.ts +28 -0
  30. package/dist/api/conflicts.js +61 -0
  31. package/dist/api/context-render.js +4 -3
  32. package/dist/api/context-select.js +12 -15
  33. package/dist/api/context-types.d.ts +10 -35
  34. package/dist/api/context.d.ts +5 -22
  35. package/dist/api/context.js +38 -46
  36. package/dist/api/continuity.d.ts +47 -0
  37. package/dist/api/continuity.js +66 -0
  38. package/dist/{cli → api}/correction-latency.d.ts +2 -14
  39. package/dist/{cli → api}/correction-latency.js +2 -14
  40. package/dist/api/dormant.d.ts +5 -21
  41. package/dist/api/dormant.js +11 -28
  42. package/dist/api/drill-down.d.ts +7 -46
  43. package/dist/api/drill-down.js +6 -27
  44. package/dist/api/embeddings.d.ts +17 -0
  45. package/dist/api/embeddings.js +28 -0
  46. package/dist/api/error-reply.d.ts +8 -0
  47. package/dist/api/error-reply.js +21 -0
  48. package/dist/api/forget.d.ts +11 -26
  49. package/dist/api/forget.js +23 -35
  50. package/dist/api/goals.d.ts +1 -1
  51. package/dist/api/goals.js +5 -9
  52. package/dist/api/graph.d.ts +8 -0
  53. package/dist/api/graph.js +7 -0
  54. package/dist/api/index.d.ts +6 -2
  55. package/dist/api/index.js +6 -2
  56. package/dist/api/instruction-detect.js +21 -6
  57. package/dist/api/learn.d.ts +4 -0
  58. package/dist/api/learn.js +53 -27
  59. package/dist/api/ledger-db.d.ts +2 -5
  60. package/dist/api/ledger-db.js +5 -35
  61. package/dist/api/memories.d.ts +23 -0
  62. package/dist/api/memories.js +46 -0
  63. package/dist/api/objects.d.ts +9 -0
  64. package/dist/api/objects.js +11 -0
  65. package/dist/api/on-store.js +5 -3
  66. package/dist/api/outcome.js +1 -1
  67. package/dist/api/pilot-arm.d.ts +1 -11
  68. package/dist/api/pilot-arm.js +5 -45
  69. package/dist/api/predictions.d.ts +11 -0
  70. package/dist/api/predictions.js +24 -0
  71. package/dist/api/projects.d.ts +21 -0
  72. package/dist/api/projects.js +24 -0
  73. package/dist/api/promote.d.ts +13 -17
  74. package/dist/api/promote.js +12 -20
  75. package/dist/api/prompt-hook.d.ts +19 -6
  76. package/dist/api/prompt-hook.js +54 -13
  77. package/dist/api/provenance-coverage.d.ts +14 -0
  78. package/dist/{cli → api}/provenance-coverage.js +2 -6
  79. package/dist/api/recall-cli.d.ts +58 -0
  80. package/dist/api/recall-cli.js +103 -0
  81. package/dist/api/recall-core.js +17 -9
  82. package/dist/api/recall-finish.d.ts +53 -0
  83. package/dist/api/recall-finish.js +30 -0
  84. package/dist/api/recall-history.d.ts +17 -84
  85. package/dist/api/recall-history.js +15 -88
  86. package/dist/api/recall-pipeline.d.ts +2 -3
  87. package/dist/api/recall-pipeline.js +21 -15
  88. package/dist/api/recall-request.js +1 -1
  89. package/dist/api/recall-types.d.ts +64 -304
  90. package/dist/api/recall.d.ts +3 -34
  91. package/dist/api/recall.js +63 -89
  92. package/dist/api/refine.d.ts +7 -0
  93. package/dist/api/refine.js +10 -0
  94. package/dist/api/remember-local.d.ts +57 -0
  95. package/dist/api/remember-local.js +90 -0
  96. package/dist/api/remember.d.ts +20 -2
  97. package/dist/api/remember.js +16 -3
  98. package/dist/api/session-end.d.ts +22 -0
  99. package/dist/api/session-end.js +101 -0
  100. package/dist/api/sleep-run.d.ts +2 -4
  101. package/dist/api/sleep-run.js +28 -28
  102. package/dist/api/sleep.d.ts +9 -28
  103. package/dist/api/status.d.ts +24 -0
  104. package/dist/api/status.js +40 -0
  105. package/dist/api/store-init.d.ts +4 -0
  106. package/dist/api/store-init.js +9 -0
  107. package/dist/api/tokens.d.ts +3 -10
  108. package/dist/api/tokens.js +4 -11
  109. package/dist/api/types.d.ts +8 -29
  110. package/dist/api/types.js +10 -23
  111. package/dist/capture/caller-session.d.ts +0 -3
  112. package/dist/capture/caller-session.js +1 -12
  113. package/dist/capture/capture-error.d.ts +2 -2
  114. package/dist/capture/capture-error.js +23 -18
  115. package/dist/capture/codex-patch.js +3 -1
  116. package/dist/capture/command.d.ts +4 -12
  117. package/dist/capture/command.js +39 -114
  118. package/dist/capture/compact.d.ts +4 -15
  119. package/dist/capture/compact.js +26 -30
  120. package/dist/capture/compaction-items-caller.js +11 -20
  121. package/dist/capture/compaction-record.d.ts +7 -93
  122. package/dist/capture/compaction-record.js +34 -399
  123. package/dist/capture/compaction-spool.d.ts +5 -3
  124. package/dist/capture/compaction-spool.js +21 -7
  125. package/dist/capture/copilot-transcript.d.ts +2 -1
  126. package/dist/capture/copilot-transcript.js +2 -1
  127. package/dist/capture/extract.d.ts +5 -2
  128. package/dist/capture/extract.js +4 -3
  129. package/dist/capture/failure-caller.d.ts +1 -1
  130. package/dist/capture/failure-caller.js +21 -16
  131. package/dist/capture/failure-reading.d.ts +2 -1
  132. package/dist/capture/failure-reading.js +7 -9
  133. package/dist/capture/pre-compact-caller.js +5 -4
  134. package/dist/capture/session-digest.d.ts +1 -1
  135. package/dist/capture/session-digest.js +17 -10
  136. package/dist/capture/session-end-caller.js +2 -1
  137. package/dist/capture/session-worker.js +3 -4
  138. package/dist/capture/transcript.d.ts +4 -11
  139. package/dist/capture/transcript.js +10 -21
  140. package/dist/capture/working-state.d.ts +4 -2
  141. package/dist/capture/working-state.js +4 -2
  142. package/dist/cli/api-context.d.ts +3 -0
  143. package/dist/cli/api-context.js +6 -0
  144. package/dist/cli/audit-prune.d.ts +1 -59
  145. package/dist/cli/audit-prune.js +2 -61
  146. package/dist/cli/audit.d.ts +1 -1
  147. package/dist/cli/audit.js +42 -43
  148. package/dist/cli/auth.d.ts +2 -2
  149. package/dist/cli/auth.js +61 -44
  150. package/dist/cli/briefs.d.ts +1 -4
  151. package/dist/cli/briefs.js +42 -301
  152. package/dist/cli/card.d.ts +2 -2
  153. package/dist/cli/card.js +63 -56
  154. package/dist/cli/client.d.ts +12 -27
  155. package/dist/cli/client.js +41 -44
  156. package/dist/cli/compact-resume-payload.js +4 -3
  157. package/dist/cli/context.d.ts +2 -3
  158. package/dist/cli/context.js +22 -18
  159. package/dist/cli/continuity.d.ts +6 -6
  160. package/dist/cli/continuity.js +81 -86
  161. package/dist/cli/curate.d.ts +13 -17
  162. package/dist/cli/curate.js +88 -116
  163. package/dist/cli/dag.d.ts +4 -4
  164. package/dist/cli/dag.js +55 -34
  165. package/dist/cli/decisions.d.ts +2 -4
  166. package/dist/cli/decisions.js +18 -309
  167. package/dist/cli/eval.d.ts +1 -1
  168. package/dist/cli/eval.js +27 -26
  169. package/dist/cli/exit.d.ts +6 -0
  170. package/dist/cli/exit.js +11 -0
  171. package/dist/cli/explain.d.ts +2 -3
  172. package/dist/cli/explain.js +25 -27
  173. package/dist/cli/flag-values.d.ts +6 -1
  174. package/dist/cli/flag-values.js +42 -15
  175. package/dist/cli/flags.d.ts +0 -288
  176. package/dist/cli/flags.js +3 -138
  177. package/dist/cli/github.d.ts +14 -0
  178. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  179. package/dist/cli/goals.d.ts +2 -2
  180. package/dist/cli/goals.js +46 -50
  181. package/dist/cli/graph.d.ts +3 -0
  182. package/dist/cli/graph.js +83 -0
  183. package/dist/cli/hook-runtime.d.ts +12 -32
  184. package/dist/cli/hook-runtime.js +21 -64
  185. package/dist/cli/incidents.d.ts +3 -0
  186. package/dist/cli/incidents.js +112 -0
  187. package/dist/cli/init.d.ts +2 -2
  188. package/dist/cli/init.js +33 -30
  189. package/dist/cli/install-steps.d.ts +2 -1
  190. package/dist/cli/install-steps.js +13 -14
  191. package/dist/cli/last-sleep.d.ts +2 -1
  192. package/dist/cli/last-sleep.js +4 -1
  193. package/dist/cli/lenient-id.d.ts +2 -0
  194. package/dist/cli/lenient-id.js +13 -0
  195. package/dist/cli/maintenance.d.ts +5 -5
  196. package/dist/cli/maintenance.js +37 -43
  197. package/dist/cli/notes.d.ts +2 -0
  198. package/dist/cli/notes.js +41 -0
  199. package/dist/cli/object-verbs.js +4 -3
  200. package/dist/cli/open-browser.d.ts +14 -0
  201. package/dist/cli/open-browser.js +26 -0
  202. package/dist/cli/owner-validation.d.ts +5 -28
  203. package/dist/cli/owner-validation.js +5 -28
  204. package/dist/cli/playbooks.d.ts +3 -4
  205. package/dist/cli/playbooks.js +131 -300
  206. package/dist/cli/predictions.d.ts +3 -0
  207. package/dist/cli/predictions.js +175 -0
  208. package/dist/cli/print.d.ts +2 -5
  209. package/dist/cli/print.js +3 -5
  210. package/dist/cli/projects.d.ts +2 -2
  211. package/dist/cli/projects.js +31 -25
  212. package/dist/cli/quality-repair-once.d.ts +1 -1
  213. package/dist/cli/quality-repair-once.js +7 -6
  214. package/dist/cli/recall.d.ts +2 -4
  215. package/dist/cli/recall.js +67 -137
  216. package/dist/cli/refine-llm.d.ts +5 -31
  217. package/dist/cli/refine-llm.js +23 -50
  218. package/dist/cli/remember.d.ts +3 -3
  219. package/dist/cli/remember.js +134 -192
  220. package/dist/cli/scheduler.d.ts +2 -17
  221. package/dist/cli/scheduler.js +14 -19
  222. package/dist/cli/serve.js +23 -14
  223. package/dist/cli/session-hooks.d.ts +11 -19
  224. package/dist/cli/session-hooks.js +143 -214
  225. package/dist/cli/setup.d.ts +4 -4
  226. package/dist/cli/setup.js +35 -30
  227. package/dist/cli/shared.d.ts +7 -25
  228. package/dist/cli/shared.js +17 -60
  229. package/dist/cli/slack.d.ts +2 -2
  230. package/dist/cli/slack.js +19 -23
  231. package/dist/cli/sleep-render.js +6 -3
  232. package/dist/cli/sleep.d.ts +3 -2
  233. package/dist/cli/sleep.js +17 -49
  234. package/dist/cli/status.d.ts +11 -14
  235. package/dist/cli/status.js +74 -120
  236. package/dist/cli/stdin.d.ts +4 -6
  237. package/dist/cli/stdin.js +2 -3
  238. package/dist/cli/transfer.d.ts +9 -9
  239. package/dist/cli/transfer.js +87 -108
  240. package/dist/cli/usage.d.ts +0 -79
  241. package/dist/cli/usage.js +1 -689
  242. package/dist/cli/verb-row.d.ts +32 -0
  243. package/dist/cli/verb-row.js +6 -0
  244. package/dist/cli/verbs/health.d.ts +27 -0
  245. package/dist/cli/verbs/health.js +232 -0
  246. package/dist/cli/verbs/memory.d.ts +16 -0
  247. package/dist/cli/verbs/memory.js +244 -0
  248. package/dist/cli/verbs/objects.d.ts +20 -0
  249. package/dist/cli/verbs/objects.js +254 -0
  250. package/dist/cli/verbs/sessions.d.ts +31 -0
  251. package/dist/cli/verbs/sessions.js +312 -0
  252. package/dist/cli/verbs.d.ts +81 -0
  253. package/dist/cli/verbs.js +7 -0
  254. package/dist/cli/versioned-verbs.d.ts +51 -0
  255. package/dist/cli/versioned-verbs.js +79 -0
  256. package/dist/cli.d.ts +1 -654
  257. package/dist/cli.js +44 -510
  258. package/dist/connectors/dlq.d.ts +39 -3
  259. package/dist/connectors/dlq.js +37 -3
  260. package/dist/connectors/github/backfill.d.ts +5 -25
  261. package/dist/connectors/github/backfill.js +26 -52
  262. package/dist/connectors/github/deletion.d.ts +4 -18
  263. package/dist/connectors/github/deletion.js +2 -15
  264. package/dist/connectors/github/dlq.d.ts +8 -33
  265. package/dist/connectors/github/dlq.js +34 -93
  266. package/dist/connectors/github/ingest.d.ts +4 -12
  267. package/dist/connectors/github/ingest.js +5 -36
  268. package/dist/connectors/github/octokit-client.d.ts +4 -16
  269. package/dist/connectors/github/octokit-client.js +27 -24
  270. package/dist/connectors/github/ratelimit.d.ts +3 -14
  271. package/dist/connectors/github/ratelimit.js +3 -14
  272. package/dist/connectors/github/scope.d.ts +3 -5
  273. package/dist/connectors/github/scope.js +3 -5
  274. package/dist/connectors/github/signature.d.ts +4 -26
  275. package/dist/connectors/github/signature.js +4 -26
  276. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  277. package/dist/connectors/github/tenant-routing.js +4 -26
  278. package/dist/connectors/github/transform.js +2 -16
  279. package/dist/connectors/github/types.d.ts +3 -15
  280. package/dist/connectors/github/types.js +2 -9
  281. package/dist/connectors/github/webhook.d.ts +3 -16
  282. package/dist/connectors/github/webhook.js +38 -23
  283. package/dist/connectors/ingest.d.ts +10 -0
  284. package/dist/connectors/ingest.js +28 -0
  285. package/dist/connectors/slack/backfill.d.ts +4 -17
  286. package/dist/connectors/slack/backfill.js +4 -13
  287. package/dist/connectors/slack/dlq.d.ts +2 -19
  288. package/dist/connectors/slack/dlq.js +51 -90
  289. package/dist/connectors/slack/ingest.d.ts +4 -9
  290. package/dist/connectors/slack/ingest.js +4 -30
  291. package/dist/connectors/slack/scope.d.ts +2 -8
  292. package/dist/connectors/slack/scope.js +2 -8
  293. package/dist/connectors/slack/signature.d.ts +1 -6
  294. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  295. package/dist/connectors/slack/tenant-routing.js +2 -21
  296. package/dist/connectors/slack/transform.d.ts +2 -18
  297. package/dist/connectors/slack/transform.js +2 -18
  298. package/dist/connectors/slack/types.d.ts +3 -9
  299. package/dist/connectors/slack/types.js +2 -4
  300. package/dist/connectors/slack/web-client.js +33 -27
  301. package/dist/connectors/slack/webhook.d.ts +3 -19
  302. package/dist/connectors/slack/webhook.js +6 -26
  303. package/dist/connectors/slack/workspaces.d.ts +4 -24
  304. package/dist/connectors/slack/workspaces.js +4 -24
  305. package/dist/consolidate/conflicts.js +7 -15
  306. package/dist/consolidate/dag-summary.d.ts +8 -0
  307. package/dist/consolidate/dag-summary.js +41 -0
  308. package/dist/consolidate/dag.d.ts +5 -28
  309. package/dist/consolidate/dag.js +29 -84
  310. package/dist/consolidate/decay.js +7 -19
  311. package/dist/consolidate/dedupe.d.ts +13 -52
  312. package/dist/consolidate/dedupe.js +18 -74
  313. package/dist/consolidate/flush-units.d.ts +3 -4
  314. package/dist/consolidate/flush-units.js +3 -3
  315. package/dist/consolidate/half-life-migration.d.ts +3 -26
  316. package/dist/consolidate/half-life-migration.js +11 -28
  317. package/dist/consolidate/llm-passes.js +49 -40
  318. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  319. package/dist/consolidate/memory-value-weights.js +2 -13
  320. package/dist/consolidate/memory-value.d.ts +11 -84
  321. package/dist/consolidate/memory-value.js +18 -105
  322. package/dist/consolidate/merge.js +12 -33
  323. package/dist/consolidate/physics-pass.d.ts +6 -1
  324. package/dist/consolidate/physics-pass.js +27 -9
  325. package/dist/consolidate/replay.d.ts +6 -38
  326. package/dist/consolidate/replay.js +25 -56
  327. package/dist/consolidate/run.js +1 -1
  328. package/dist/consolidate/sleep.d.ts +1 -8
  329. package/dist/consolidate/sleep.js +13 -22
  330. package/dist/consolidate/trace.d.ts +3 -18
  331. package/dist/consolidate/trace.js +3 -18
  332. package/dist/consolidate/traces.js +9 -25
  333. package/dist/core/ablation.d.ts +14 -91
  334. package/dist/core/ablation.js +16 -91
  335. package/dist/core/active-scope.d.ts +7 -0
  336. package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
  337. package/dist/core/ambient.d.ts +5 -8
  338. package/dist/core/ambient.js +40 -26
  339. package/dist/core/api-errors.d.ts +16 -0
  340. package/dist/core/api-errors.js +20 -0
  341. package/dist/core/capture-contract.d.ts +4 -2
  342. package/dist/core/capture-contract.js +4 -2
  343. package/dist/core/card.d.ts +4 -1
  344. package/dist/core/card.js +11 -1
  345. package/dist/core/compaction-timing.d.ts +7 -0
  346. package/dist/core/compaction-timing.js +9 -0
  347. package/dist/core/compare.d.ts +11 -67
  348. package/dist/core/compare.js +9 -63
  349. package/dist/core/config.d.ts +10 -24
  350. package/dist/core/config.js +20 -16
  351. package/dist/core/cosine.d.ts +3 -0
  352. package/dist/core/cosine.js +19 -0
  353. package/dist/core/handoff.d.ts +1 -7
  354. package/dist/core/handoff.js +1 -7
  355. package/dist/core/markdown.d.ts +6 -0
  356. package/dist/{store → core}/markdown.js +23 -22
  357. package/dist/core/memory-audit.d.ts +17 -0
  358. package/dist/core/memory-audit.js +54 -0
  359. package/dist/core/memory-quality.js +1 -1
  360. package/dist/core/memory.d.ts +51 -168
  361. package/dist/core/memory.js +76 -239
  362. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  363. package/dist/{consolidate → core}/merged-row.js +3 -2
  364. package/dist/core/package-root.d.ts +3 -0
  365. package/dist/core/package-root.js +5 -0
  366. package/dist/core/physics-config.d.ts +1 -4
  367. package/dist/core/physics-config.js +3 -8
  368. package/dist/core/physics.d.ts +15 -61
  369. package/dist/core/physics.js +65 -138
  370. package/dist/core/prediction.d.ts +3 -0
  371. package/dist/core/prediction.js +6 -0
  372. package/dist/core/project-identity.d.ts +20 -58
  373. package/dist/core/project-identity.js +27 -39
  374. package/dist/core/project-remote.js +13 -2
  375. package/dist/core/raw-append-only.d.ts +5 -0
  376. package/dist/core/raw-append-only.js +7 -0
  377. package/dist/core/recall-scope.d.ts +69 -0
  378. package/dist/core/recall-scope.js +138 -0
  379. package/dist/core/salience.d.ts +1 -7
  380. package/dist/core/salience.js +1 -7
  381. package/dist/dashboard/dashboard-actions.js +2 -2
  382. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  383. package/dist/dashboard/dashboard-snapshot.js +11 -2
  384. package/dist/dashboard/dashboard-types.d.ts +2 -1
  385. package/dist/dashboard/dashboard.d.ts +1 -0
  386. package/dist/dashboard/dashboard.js +50 -4
  387. package/dist/db/busy.d.ts +3 -8
  388. package/dist/db/busy.js +37 -33
  389. package/dist/db/connect.js +7 -8
  390. package/dist/db/index.d.ts +3 -3
  391. package/dist/db/index.js +3 -3
  392. package/dist/db/migrate.js +3 -3
  393. package/dist/db/migrations/index.d.ts +1 -1
  394. package/dist/db/migrations/index.js +3 -1
  395. package/dist/db/migrations/types.d.ts +2 -5
  396. package/dist/db/migrations/v14.js +2 -3
  397. package/dist/db/migrations/v15.js +2 -8
  398. package/dist/db/migrations/v16.js +2 -3
  399. package/dist/db/migrations/v17.js +2 -3
  400. package/dist/db/migrations/v19.js +2 -5
  401. package/dist/db/migrations/v20.js +2 -7
  402. package/dist/db/migrations/v22.js +4 -17
  403. package/dist/db/migrations/v23.js +3 -14
  404. package/dist/db/migrations/v24.js +2 -4
  405. package/dist/db/migrations/v25.js +3 -8
  406. package/dist/db/migrations/v26.js +2 -13
  407. package/dist/db/migrations/v27.js +3 -11
  408. package/dist/db/migrations/v28.js +2 -14
  409. package/dist/db/migrations/v29.js +4 -18
  410. package/dist/db/migrations/v30.js +4 -16
  411. package/dist/db/migrations/v31.js +2 -15
  412. package/dist/db/migrations/v32.js +4 -22
  413. package/dist/db/migrations/v33.js +2 -15
  414. package/dist/db/migrations/v34.js +2 -11
  415. package/dist/db/migrations/v35.js +2 -11
  416. package/dist/db/migrations/v36.js +2 -11
  417. package/dist/db/migrations/v37.js +8 -33
  418. package/dist/db/migrations/v38.js +5 -38
  419. package/dist/db/migrations/v39.js +9 -20
  420. package/dist/db/migrations/v40.js +2 -9
  421. package/dist/db/migrations/v41.js +2 -24
  422. package/dist/db/migrations/v43.js +1 -1
  423. package/dist/db/migrations/v44.js +2 -8
  424. package/dist/db/migrations/v45.js +2 -7
  425. package/dist/db/migrations/v47.js +2 -3
  426. package/dist/db/migrations/v51.js +1 -1
  427. package/dist/db/migrations/v55.d.ts +3 -0
  428. package/dist/db/migrations/v55.js +17 -0
  429. package/dist/db/open.d.ts +2 -2
  430. package/dist/db/open.js +21 -9
  431. package/dist/db/physics-state.d.ts +6 -22
  432. package/dist/db/physics-state.js +28 -39
  433. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  434. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  435. package/dist/db/tables.d.ts +2 -0
  436. package/dist/db/tables.js +6 -2
  437. package/dist/db/vector-store.d.ts +2 -0
  438. package/dist/db/vector-store.js +25 -5
  439. package/dist/db/wal-checkpointer.js +2 -1
  440. package/dist/doctor.js +85 -27
  441. package/dist/embeddings/local.d.ts +62 -0
  442. package/dist/embeddings/local.js +146 -0
  443. package/dist/embeddings/provider.d.ts +43 -0
  444. package/dist/{store/embeddings → embeddings}/provider.js +58 -83
  445. package/dist/embeddings/transformers.d.ts +26 -0
  446. package/dist/embeddings/transformers.js +89 -0
  447. package/dist/entry/session-text.d.ts +1 -1
  448. package/dist/entry/session-text.js +3 -2
  449. package/dist/eval/eval-stats.d.ts +15 -53
  450. package/dist/eval/eval-stats.js +12 -42
  451. package/dist/eval/eval-suite.d.ts +2 -13
  452. package/dist/eval/eval-suite.js +91 -45
  453. package/dist/eval/eval.d.ts +6 -24
  454. package/dist/eval/eval.js +8 -35
  455. package/dist/eval/judgment.d.ts +0 -3
  456. package/dist/eval/judgment.js +30 -15
  457. package/dist/extensions/openclaw-plugin/index.js +1 -1
  458. package/dist/graph/extract.d.ts +5 -27
  459. package/dist/graph/extract.js +10 -36
  460. package/dist/graph/recall.d.ts +7 -20
  461. package/dist/graph/recall.js +15 -77
  462. package/dist/graph/stream.d.ts +7 -39
  463. package/dist/graph/stream.js +11 -34
  464. package/dist/graph/view.d.ts +9 -35
  465. package/dist/graph/view.js +24 -44
  466. package/dist/graph/write.d.ts +1 -1
  467. package/dist/graph/write.js +9 -9
  468. package/dist/hooks/codex-session.js +3 -2
  469. package/dist/hooks/codex-wrapper.js +4 -3
  470. package/dist/hooks/copilot.js +2 -1
  471. package/dist/hooks/hook-blocks.d.ts +6 -2
  472. package/dist/hooks/hook-blocks.js +37 -124
  473. package/dist/hooks/json-hooks.d.ts +4 -36
  474. package/dist/hooks/json-hooks.js +22 -59
  475. package/dist/hooks/opencode.d.ts +0 -38
  476. package/dist/hooks/opencode.js +17 -81
  477. package/dist/hooks/shared.d.ts +6 -21
  478. package/dist/hooks/shared.js +31 -33
  479. package/dist/importers/core.d.ts +12 -37
  480. package/dist/importers/core.js +10 -28
  481. package/dist/importers/markdown-parse.d.ts +8 -22
  482. package/dist/importers/markdown-parse.js +8 -25
  483. package/dist/importers/markdown.js +3 -12
  484. package/dist/importers/sources.js +12 -39
  485. package/dist/importers/vault.d.ts +2 -8
  486. package/dist/importers/vault.js +31 -85
  487. package/dist/index.d.ts +8 -3
  488. package/dist/index.js +8 -3
  489. package/dist/learn/autolearn.d.ts +23 -42
  490. package/dist/learn/autolearn.js +45 -52
  491. package/dist/learn/churn-git.js +13 -4
  492. package/dist/learn/extract.d.ts +3 -2
  493. package/dist/learn/extract.js +8 -8
  494. package/dist/learn/forward-claim-detector.d.ts +6 -30
  495. package/dist/learn/forward-claim-detector.js +18 -68
  496. package/dist/learn/invalidation.d.ts +6 -18
  497. package/dist/learn/invalidation.js +18 -31
  498. package/dist/mcp/admin-tools.d.ts +2 -2
  499. package/dist/mcp/admin-tools.js +30 -53
  500. package/dist/mcp/format.js +3 -2
  501. package/dist/mcp/framing.d.ts +1 -0
  502. package/dist/mcp/framing.js +1 -1
  503. package/dist/mcp/memory-tools.js +7 -10
  504. package/dist/mcp/protocol.d.ts +15 -29
  505. package/dist/mcp/protocol.js +26 -16
  506. package/dist/mcp/recall-tools.js +14 -11
  507. package/dist/mcp/request.d.ts +3 -11
  508. package/dist/mcp/request.js +12 -27
  509. package/dist/mcp/server.d.ts +3 -9
  510. package/dist/mcp/server.js +5 -16
  511. package/dist/mcp/session-state.d.ts +1 -1
  512. package/dist/mcp/session-state.js +5 -11
  513. package/dist/mcp/stdio.d.ts +2 -6
  514. package/dist/mcp/stdio.js +68 -16
  515. package/dist/mcp/tool-args.js +2 -1
  516. package/dist/mcp/tools.js +47 -22
  517. package/dist/objects/customer-notes.d.ts +9 -44
  518. package/dist/objects/customer-notes.js +7 -48
  519. package/dist/objects/decisions.d.ts +14 -52
  520. package/dist/objects/decisions.js +15 -53
  521. package/dist/objects/descriptor.d.ts +1 -1
  522. package/dist/objects/incidents.d.ts +9 -40
  523. package/dist/objects/incidents.js +7 -41
  524. package/dist/objects/lifecycle.d.ts +1 -1
  525. package/dist/objects/lifecycle.js +2 -1
  526. package/dist/objects/policies.d.ts +13 -91
  527. package/dist/objects/policies.js +13 -99
  528. package/dist/objects/processes.d.ts +9 -54
  529. package/dist/objects/processes.js +7 -61
  530. package/dist/objects/project-briefs.d.ts +13 -57
  531. package/dist/objects/project-briefs.js +16 -78
  532. package/dist/objects/skills.d.ts +9 -44
  533. package/dist/objects/skills.js +8 -54
  534. package/dist/postinstall.js +7 -20
  535. package/dist/predictions/planning-fallacy.d.ts +11 -34
  536. package/dist/rerankers/clef.js +6 -37
  537. package/dist/rerankers/cross-encoder.d.ts +31 -2
  538. package/dist/rerankers/cross-encoder.js +65 -101
  539. package/dist/rerankers/index.js +5 -4
  540. package/dist/rerankers/jev.js +11 -10
  541. package/dist/rerankers/llm.d.ts +2 -11
  542. package/dist/rerankers/llm.js +14 -14
  543. package/dist/rerankers/outage-warning.d.ts +5 -2
  544. package/dist/rerankers/outage-warning.js +7 -4
  545. package/dist/rerankers/remote.d.ts +1 -0
  546. package/dist/rerankers/remote.js +2 -0
  547. package/dist/rerankers/types.d.ts +2 -14
  548. package/dist/search/bm25-search.js +1 -1
  549. package/dist/search/boosts.d.ts +0 -2
  550. package/dist/search/boosts.js +3 -3
  551. package/dist/search/embed-memories.d.ts +9 -0
  552. package/dist/search/embed-memories.js +377 -0
  553. package/dist/search/goal-boost.d.ts +23 -0
  554. package/dist/search/goal-boost.js +93 -0
  555. package/dist/search/hybrid.d.ts +11 -2
  556. package/dist/search/hybrid.js +9 -4
  557. package/dist/search/multihop.js +2 -3
  558. package/dist/search/path-context.d.ts +5 -18
  559. package/dist/search/path-context.js +5 -18
  560. package/dist/search/physics-search.d.ts +6 -3
  561. package/dist/search/physics-search.js +29 -19
  562. package/dist/search/rerank.js +1 -1
  563. package/dist/search/rrf.d.ts +7 -35
  564. package/dist/search/rrf.js +5 -30
  565. package/dist/search/vector.d.ts +13 -4
  566. package/dist/search/vector.js +40 -13
  567. package/dist/server/auth.d.ts +11 -28
  568. package/dist/server/auth.js +49 -32
  569. package/dist/server/boot.d.ts +2 -21
  570. package/dist/server/boot.js +69 -161
  571. package/dist/server/client-ip.d.ts +3 -21
  572. package/dist/server/client-ip.js +8 -30
  573. package/dist/server/deadline.d.ts +0 -2
  574. package/dist/server/deadline.js +1 -7
  575. package/dist/server/defaults.d.ts +4 -0
  576. package/dist/server/defaults.js +5 -0
  577. package/dist/server/key-check-bounds.d.ts +2 -1
  578. package/dist/server/lifecycle.d.ts +5 -4
  579. package/dist/server/lifecycle.js +19 -4
  580. package/dist/server/mcp-http.js +24 -53
  581. package/dist/server/rate-limit.d.ts +5 -18
  582. package/dist/server/rate-limit.js +4 -13
  583. package/dist/server/request.d.ts +4 -8
  584. package/dist/server/request.js +16 -19
  585. package/dist/server/route-checks.d.ts +7 -0
  586. package/dist/server/route-checks.js +42 -0
  587. package/dist/server/route-table.d.ts +9 -8
  588. package/dist/server/route-table.js +127 -139
  589. package/dist/server/routes/admin.d.ts +8 -8
  590. package/dist/server/routes/admin.js +35 -49
  591. package/dist/server/routes/customer-notes.d.ts +6 -6
  592. package/dist/server/routes/customer-notes.js +8 -14
  593. package/dist/server/routes/decisions.d.ts +6 -6
  594. package/dist/server/routes/decisions.js +12 -21
  595. package/dist/server/routes/incidents.d.ts +6 -6
  596. package/dist/server/routes/incidents.js +14 -25
  597. package/dist/server/routes/memories.d.ts +9 -9
  598. package/dist/server/routes/memories.js +20 -63
  599. package/dist/server/routes/object-routes.d.ts +6 -11
  600. package/dist/server/routes/object-routes.js +11 -22
  601. package/dist/server/routes/policies.d.ts +7 -7
  602. package/dist/server/routes/policies.js +12 -22
  603. package/dist/server/routes/predictions.d.ts +6 -6
  604. package/dist/server/routes/predictions.js +22 -38
  605. package/dist/server/routes/processes.d.ts +6 -6
  606. package/dist/server/routes/processes.js +17 -28
  607. package/dist/server/routes/project-briefs.d.ts +7 -7
  608. package/dist/server/routes/project-briefs.js +11 -20
  609. package/dist/server/routes/recall.d.ts +5 -5
  610. package/dist/server/routes/recall.js +16 -45
  611. package/dist/server/routes/skills.d.ts +7 -7
  612. package/dist/server/routes/skills.js +10 -22
  613. package/dist/server/server-detect.d.ts +15 -53
  614. package/dist/server/server-detect.js +55 -96
  615. package/dist/server/sleep-child.js +26 -7
  616. package/dist/server/sleep-offload.d.ts +11 -5
  617. package/dist/server/sleep-offload.js +21 -12
  618. package/dist/server/types.d.ts +32 -18
  619. package/dist/server/validation.d.ts +3 -2
  620. package/dist/server/validation.js +15 -33
  621. package/dist/server.d.ts +7 -6
  622. package/dist/server.js +8 -6
  623. package/dist/sharing/global-store.d.ts +19 -0
  624. package/dist/sharing/global-store.js +75 -0
  625. package/dist/sharing/global-sync.d.ts +6 -0
  626. package/dist/sharing/global-sync.js +73 -0
  627. package/dist/sharing/project-merge.d.ts +11 -19
  628. package/dist/sharing/project-merge.js +63 -125
  629. package/dist/sharing/search-both.d.ts +60 -0
  630. package/dist/sharing/search-both.js +138 -0
  631. package/dist/sharing/share.d.ts +40 -0
  632. package/dist/sharing/share.js +229 -0
  633. package/dist/store/ambient.js +9 -15
  634. package/dist/store/audit-event.d.ts +5 -13
  635. package/dist/store/audit-event.js +4 -12
  636. package/dist/store/audit.d.ts +2 -21
  637. package/dist/store/audit.js +8 -67
  638. package/dist/store/auth.d.ts +10 -8
  639. package/dist/store/auth.js +17 -12
  640. package/dist/store/candidates.d.ts +23 -5
  641. package/dist/store/candidates.js +119 -71
  642. package/dist/store/capture-write.d.ts +17 -0
  643. package/dist/store/capture-write.js +35 -0
  644. package/dist/store/card-detail.d.ts +2 -1
  645. package/dist/store/card-detail.js +2 -1
  646. package/dist/store/cards.d.ts +14 -9
  647. package/dist/store/cards.js +72 -126
  648. package/dist/store/compaction-caller.d.ts +18 -0
  649. package/dist/store/compaction-caller.js +29 -0
  650. package/dist/store/compactions-record.d.ts +115 -0
  651. package/dist/store/compactions-record.js +417 -0
  652. package/dist/store/compactions.js +6 -4
  653. package/dist/store/conflicts.d.ts +4 -21
  654. package/dist/store/conflicts.js +76 -152
  655. package/dist/store/connectors/dlq.d.ts +10 -0
  656. package/dist/store/connectors/dlq.js +32 -0
  657. package/dist/store/connectors/github.d.ts +14 -16
  658. package/dist/store/connectors/github.js +34 -57
  659. package/dist/store/connectors/slack.d.ts +2 -11
  660. package/dist/store/connectors/slack.js +18 -47
  661. package/dist/store/dashboard-reads.js +11 -14
  662. package/dist/store/delete-and-batch.d.ts +17 -31
  663. package/dist/store/delete-and-batch.js +84 -67
  664. package/dist/store/delivery-recorder.d.ts +15 -4
  665. package/dist/store/delivery-recorder.js +34 -17
  666. package/dist/store/descendant-page.js +6 -3
  667. package/dist/store/diagnostics.js +6 -13
  668. package/dist/store/dormant.d.ts +8 -30
  669. package/dist/store/dormant.js +18 -57
  670. package/dist/store/embeddings/index.d.ts +11 -90
  671. package/dist/store/embeddings/index.js +18 -523
  672. package/dist/store/entry-reads.d.ts +34 -61
  673. package/dist/store/entry-reads.js +111 -136
  674. package/dist/store/entry-row.d.ts +6 -35
  675. package/dist/store/entry-row.js +9 -37
  676. package/dist/store/entry-writes.d.ts +12 -18
  677. package/dist/store/entry-writes.js +46 -44
  678. package/dist/store/failure-log-at.d.ts +8 -0
  679. package/dist/store/failure-log-at.js +16 -0
  680. package/dist/store/failure-log.d.ts +2 -2
  681. package/dist/store/failure-log.js +5 -3
  682. package/dist/{trust → store}/gated-write.d.ts +3 -1
  683. package/dist/{trust → store}/gated-write.js +7 -5
  684. package/dist/store/goals.d.ts +3 -40
  685. package/dist/store/goals.js +41 -178
  686. package/dist/store/graph-queue.d.ts +6 -22
  687. package/dist/store/graph-queue.js +14 -45
  688. package/dist/store/graph-reads.d.ts +11 -35
  689. package/dist/store/graph-reads.js +24 -60
  690. package/dist/store/graph-rows.d.ts +3 -6
  691. package/dist/store/graph-rows.js +6 -9
  692. package/dist/store/graph-view-rows.d.ts +2 -1
  693. package/dist/store/graph-view-rows.js +2 -1
  694. package/dist/store/graph-writes.d.ts +10 -35
  695. package/dist/store/graph-writes.js +59 -106
  696. package/dist/store/half-life.d.ts +2 -1
  697. package/dist/store/half-life.js +14 -16
  698. package/dist/store/handoffs.d.ts +6 -12
  699. package/dist/store/handoffs.js +22 -40
  700. package/dist/store/index-and-stats.d.ts +6 -19
  701. package/dist/store/index-and-stats.js +36 -84
  702. package/dist/store/key-writes.js +1 -1
  703. package/dist/store/ledger-turn.d.ts +9 -0
  704. package/dist/store/ledger-turn.js +38 -0
  705. package/dist/store/mirrors.d.ts +2 -6
  706. package/dist/store/mirrors.js +24 -29
  707. package/dist/store/open.d.ts +0 -4
  708. package/dist/store/open.js +42 -62
  709. package/dist/store/pilot-arm.d.ts +12 -0
  710. package/dist/store/pilot-arm.js +42 -0
  711. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  712. package/dist/store/planning-fallacy-evidence.js +8 -37
  713. package/dist/store/port.d.ts +91 -82
  714. package/dist/store/port.js +8 -0
  715. package/dist/store/predictions.d.ts +12 -53
  716. package/dist/store/predictions.js +41 -125
  717. package/dist/store/project-tags.d.ts +62 -0
  718. package/dist/store/project-tags.js +67 -0
  719. package/dist/{cli → store}/quality-repair.js +15 -31
  720. package/dist/store/quarantine.js +2 -1
  721. package/dist/store/raw-archive.d.ts +4 -16
  722. package/dist/store/raw-archive.js +14 -29
  723. package/dist/store/recall-trace.d.ts +12 -77
  724. package/dist/store/recall-trace.js +37 -97
  725. package/dist/store/rejected-values.js +9 -20
  726. package/dist/store/rejection-probe.d.ts +4 -0
  727. package/dist/store/rejection-probe.js +19 -0
  728. package/dist/store/rejection.d.ts +10 -73
  729. package/dist/store/rejection.js +12 -84
  730. package/dist/store/report-reads.d.ts +6 -0
  731. package/dist/store/report-reads.js +29 -0
  732. package/dist/store/rows.d.ts +9 -19
  733. package/dist/store/rows.js +36 -34
  734. package/dist/store/rule-sql.d.ts +14 -0
  735. package/dist/store/rule-sql.js +56 -0
  736. package/dist/store/search-rows.d.ts +7 -38
  737. package/dist/store/search-rows.js +23 -54
  738. package/dist/store/sessions.d.ts +10 -47
  739. package/dist/store/sessions.js +21 -75
  740. package/dist/store/set-aside.d.ts +14 -0
  741. package/dist/store/set-aside.js +23 -0
  742. package/dist/store/sqlite/busy.d.ts +3 -0
  743. package/dist/store/sqlite/busy.js +8 -0
  744. package/dist/store/sqlite/connector-events-group.js +5 -8
  745. package/dist/store/sqlite/connector-writes-group.js +3 -3
  746. package/dist/store/sqlite/entry-writes-group.js +4 -4
  747. package/dist/store/sqlite/error-codec.js +8 -5
  748. package/dist/store/sqlite/executor.d.ts +2 -1
  749. package/dist/store/sqlite/executor.js +12 -5
  750. package/dist/store/sqlite/graph-reads-group.js +1 -1
  751. package/dist/store/sqlite/held-connection.d.ts +9 -0
  752. package/dist/store/sqlite/held-connection.js +41 -0
  753. package/dist/store/sqlite/local.d.ts +3 -3
  754. package/dist/store/sqlite/local.js +1 -0
  755. package/dist/store/sqlite/object-rows.d.ts +1 -1
  756. package/dist/store/sqlite/object-rows.js +6 -3
  757. package/dist/store/sqlite/objects-group.d.ts +1 -1
  758. package/dist/store/sqlite/objects-group.js +5 -3
  759. package/dist/store/sqlite/quarantine-group.js +2 -2
  760. package/dist/store/sqlite/store.d.ts +1 -4
  761. package/dist/store/sqlite/store.js +16 -15
  762. package/dist/store/sqlite/vector-reads-group.js +2 -2
  763. package/dist/store/sqlite/worker-jobs.js +1 -1
  764. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  765. package/dist/store/sqlite/worker-ops.js +13 -2
  766. package/dist/store/sqlite/worker-store.js +5 -2
  767. package/dist/store/summaries.d.ts +11 -63
  768. package/dist/store/summaries.js +37 -148
  769. package/dist/store/summary-dirty.js +1 -1
  770. package/dist/store/tenant-lookup.d.ts +6 -1
  771. package/dist/store/tenant-lookup.js +7 -0
  772. package/dist/store/tenant.d.ts +2 -16
  773. package/dist/store/tenant.js +4 -19
  774. package/dist/store/token-ledger.d.ts +13 -50
  775. package/dist/store/token-ledger.js +19 -85
  776. package/dist/store/usage-reports.js +5 -13
  777. package/dist/store/vector-index.d.ts +46 -0
  778. package/dist/store/vector-index.js +171 -0
  779. package/dist/store/working-memory.d.ts +6 -25
  780. package/dist/store/working-memory.js +18 -52
  781. package/dist/support-bundle.js +9 -8
  782. package/dist/trust/reject-flow.js +3 -5
  783. package/dist/util/agent-homes.d.ts +15 -0
  784. package/dist/util/agent-homes.js +34 -0
  785. package/dist/util/anthropic-messages.d.ts +3 -0
  786. package/dist/util/anthropic-messages.js +35 -6
  787. package/dist/util/atomic-write.d.ts +2 -1
  788. package/dist/util/atomic-write.js +35 -4
  789. package/dist/util/capped-json.d.ts +6 -0
  790. package/dist/util/capped-json.js +46 -0
  791. package/dist/util/chunked.d.ts +3 -0
  792. package/dist/util/chunked.js +10 -0
  793. package/dist/util/crash-handlers.d.ts +8 -1
  794. package/dist/util/crash-handlers.js +52 -10
  795. package/dist/util/ellipsize.d.ts +3 -0
  796. package/dist/util/ellipsize.js +5 -0
  797. package/dist/util/env.d.ts +14 -6
  798. package/dist/util/env.js +15 -7
  799. package/dist/util/format.d.ts +3 -0
  800. package/dist/util/format.js +6 -0
  801. package/dist/util/home-path.d.ts +2 -1
  802. package/dist/util/home-path.js +4 -2
  803. package/dist/util/hook-payload.d.ts +8 -0
  804. package/dist/util/hook-payload.js +37 -0
  805. package/dist/util/http-retry.d.ts +9 -1
  806. package/dist/util/http-retry.js +67 -8
  807. package/dist/util/http-util.d.ts +0 -8
  808. package/dist/util/http-util.js +10 -21
  809. package/dist/util/limits.d.ts +7 -0
  810. package/dist/util/limits.js +14 -0
  811. package/dist/util/log.d.ts +7 -2
  812. package/dist/util/log.js +34 -9
  813. package/dist/util/request-scope.d.ts +5 -2
  814. package/dist/util/request-scope.js +13 -7
  815. package/dist/util/secret-detect.d.ts +5 -30
  816. package/dist/util/secret-detect.js +19 -40
  817. package/dist/util/sqlite-blocked.d.ts +2 -0
  818. package/dist/util/sqlite-blocked.js +5 -0
  819. package/dist/util/stored-json.d.ts +1 -1
  820. package/dist/util/stored-json.js +1 -1
  821. package/dist/util/stream-tee.d.ts +3 -0
  822. package/dist/util/stream-tee.js +35 -0
  823. package/dist/util/time.d.ts +4 -0
  824. package/dist/util/time.js +4 -0
  825. package/dist/util/token-text.d.ts +1 -4
  826. package/dist/util/token-text.js +1 -4
  827. package/dist/util/transcript-tail.d.ts +2 -0
  828. package/dist/util/transcript-tail.js +24 -23
  829. package/dist/util/version.d.ts +5 -20
  830. package/dist/util/version.js +5 -20
  831. package/dist/{store → util}/yaml.d.ts +1 -5
  832. package/dist/{store → util}/yaml.js +2 -6
  833. package/extensions/openclaw-plugin/index.ts +1 -1
  834. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  835. package/extensions/openclaw-plugin/package.json +1 -1
  836. package/openclaw.plugin.json +1 -1
  837. package/package.json +2 -2
  838. package/dist/cli/provenance-coverage.d.ts +0 -18
  839. package/dist/connectors/github/cli-impl.d.ts +0 -25
  840. package/dist/sharing/scope.d.ts +0 -14
  841. package/dist/sharing/shared.d.ts +0 -187
  842. package/dist/sharing/shared.js +0 -563
  843. package/dist/store/embeddings/local.d.ts +0 -15
  844. package/dist/store/embeddings/local.js +0 -192
  845. package/dist/store/embeddings/provider.d.ts +0 -77
  846. package/dist/store/markdown.d.ts +0 -10
  847. package/dist/store/recall-scope.d.ts +0 -138
  848. package/dist/store/recall-scope.js +0 -216
  849. package/dist/store/vector-writes.d.ts +0 -13
  850. package/dist/store/vector-writes.js +0 -89
  851. /package/dist/{store → core}/object-types.d.ts +0 -0
  852. /package/dist/{store → core}/object-types.js +0 -0
  853. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
  854. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  855. /package/dist/{capture → util}/compaction-items.js +0 -0
@@ -4,7 +4,7 @@ import * as os from 'os';
4
4
  import * as path from 'path';
5
5
  import { BadRequestError } from './api-errors.js';
6
6
  import { isSharedStore, loadConfig } from './config.js';
7
- import { MAX_ID_LEN } from '../util/http-util.js';
7
+ import { MAX_ID_LEN } from '../util/limits.js';
8
8
  import { errorMessage, log } from '../util/log.js';
9
9
  import { originRemoteId, projectFileId } from './project-remote.js';
10
10
  import { realpathOrResolve } from '../util/real-path.js';
@@ -23,7 +23,8 @@ function remoteRuleOn() {
23
23
  remoteSwitch = { globalRoot, on: loadConfig(globalRoot).projectIdentity.remote };
24
24
  return remoteSwitch.on;
25
25
  }
26
- /** The id a root names itself by plus every rung that resolves; only the root's own `.git` is read, so a store nested in another checkout keeps its folder name. */
26
+ /** The id a root names itself by plus every rung that resolves; only the root's own
27
+ * `.git` is read, so a store nested in another checkout keeps its folder name. */
27
28
  function namesAt(root, legacyName) {
28
29
  const fileId = projectFileId(root);
29
30
  const remoteId = originRemoteId(root);
@@ -48,9 +49,8 @@ function isUnder(child, parent) {
48
49
  }
49
50
  return false;
50
51
  }
51
- /** A `.hippo` marker must be a DIRECTORY (a store) - a stray file named
52
- * `.hippo` must not turn its parent into a project. `.git` stays existsSync
53
- * because worktrees legitimately use a `.git` FILE. */
52
+ /** A `.hippo` marker must be a DIRECTORY (a store), so a stray file named `.hippo` cannot make its parent a project;
53
+ * `.git` stays existsSync because worktrees use a `.git` FILE. */
54
54
  function isDirectoryAt(p) {
55
55
  try {
56
56
  return fs.statSync(p).isDirectory();
@@ -60,10 +60,7 @@ function isDirectoryAt(p) {
60
60
  return false;
61
61
  }
62
62
  }
63
- /**
64
- * Resolve the project identity for a working directory.
65
- * Defaults to process.cwd(). Results are cached per resolved input path.
66
- */
63
+ /** Resolves the project identity for a working directory (default process.cwd()); results are cached per resolved input path. */
67
64
  export function resolveProjectIdentity(cwd, opts) {
68
65
  const startInput = path.resolve(cwd ?? process.cwd());
69
66
  const cacheable = !opts?.homeDir && !opts?.stopDir;
@@ -96,7 +93,8 @@ export function resolveProjectIdentity(cwd, opts) {
96
93
  identityCache.set(startInput, identity);
97
94
  return identity;
98
95
  }
99
- /** The repo name a linked worktree shares with its main checkout (`repo.git` or `repo/.bare` for a bare repo), so one repo is one project; null for any other checkout. */
96
+ /** The repo name a linked worktree shares with its main checkout (`repo.git` or
97
+ * `repo/.bare` for a bare repo), so one repo is one project; null for any other checkout. */
100
98
  function linkedWorktreeRepoName(gitRoot, home) {
101
99
  const marker = path.join(gitRoot, '.git');
102
100
  if (!fs.existsSync(marker) || isDirectoryAt(marker))
@@ -156,6 +154,15 @@ export function findHippoStoreDir(cwd, opts) {
156
154
  const { hippoRoot } = walkProjectMarkers(start, home, stops);
157
155
  return hippoRoot === null ? null : path.join(hippoRoot, '.hippo');
158
156
  }
157
+ /** Nearest ancestor store like git; the strict join is the fallback so `hippo init` still creates `<cwd>/.hippo`. */
158
+ export function getHippoRoot(cwd = process.cwd(), opts) {
159
+ return findHippoStoreDir(cwd, opts) ?? path.join(realpathOrResolve(cwd), '.hippo');
160
+ }
161
+ export function isInitialized(hippoRoot) {
162
+ // autoInstallHooks / setupDailySchedule can create a bare .hippo with no hippo.db; counting
163
+ // that as initialized makes `hippo init` skip initStore, so only hippo.db counts.
164
+ return fs.existsSync(path.join(hippoRoot, 'hippo.db'));
165
+ }
159
166
  function isBareName(project) {
160
167
  return typeof project === 'string';
161
168
  }
@@ -172,7 +179,8 @@ export function projectNames(project) {
172
179
  // Each project name is matched against every candidate row, so the caller's list stays short.
173
180
  export const MAX_PROJECT_ALIASES = 10;
174
181
  export const MCP_PROJECT_SCOPED_HEADER = 'X-Hippo-Project-Scoped';
175
- /** Refuses a caller's project that is blank (it would stamp user-global), past the caps, or unlike the resolver's ids: rows match verbatim, so a rewrite would split a project. Inner spaces pass, since a checkout with no remote is named by its folder. */
182
+ /** Refuses a caller's project that is blank (it would stamp user-global), past the caps, or unlike the resolver's ids: rows match
183
+ * verbatim, so a rewrite would split a project. Inner spaces pass, since a checkout with no remote is named by its folder. */
176
184
  export function assertCallerProject(project) {
177
185
  const { name, aliases = [] } = project;
178
186
  if (name.trim() === '')
@@ -190,14 +198,8 @@ export function assertCallerProject(project) {
190
198
  export function originInSql(names, column = 'origin_project') {
191
199
  return names.length === 0 ? '0' : `${column} IN (${names.map(() => '?').join(', ')})`;
192
200
  }
193
- /**
194
- * v39 memory scope isolation: classify a memory's origin_project against the
195
- * active project. An empty current id means the session is not in a project
196
- * (home dir or markerless cwd) - everything is in scope there, matching
197
- * pre-isolation behavior. NULL/undefined origin means no known project (a legacy
198
- * row, or a shared-store write that named none) and is treated as cross-project
199
- * (deny by default) - the safe direction for a security partition.
200
- */
201
+ /** Classifies a memory's origin_project against the active project. An empty current id (home or markerless cwd) puts everything in scope;
202
+ * NULL/undefined origin (legacy row, or a shared-store write naming none) counts as cross-project: deny by default for a security partition. */
201
203
  export function classifyOriginProject(origin, current) {
202
204
  if (projectId(current) === '')
203
205
  return 'project';
@@ -207,12 +209,8 @@ export function classifyOriginProject(origin, current) {
207
209
  return 'user-global';
208
210
  return projectNames(current).includes(origin) ? 'project' : 'cross-project';
209
211
  }
210
- /**
211
- * The global Hippo store directory, resolved the same way shared.ts does:
212
- * $HIPPO_HOME > $XDG_DATA_HOME/hippo > ~/.hippo. Lives here (leaf module) so
213
- * db.ts migrations can use it without importing shared.ts (store.ts cycle);
214
- * shared.getGlobalRoot delegates to this.
215
- */
212
+ /** The global Hippo store directory ($HIPPO_HOME > $XDG_DATA_HOME/hippo > ~/.hippo); getGlobalRoot (sharing/global-store.ts) returns it.
213
+ * Leaf module so store migrations can use it without importing sharing/ (store cycle). */
216
214
  export function resolveGlobalRootDir() {
217
215
  const hippoHome = envHippoHome();
218
216
  if (hippoHome)
@@ -222,23 +220,13 @@ export function resolveGlobalRootDir() {
222
220
  return path.join(xdgData, 'hippo');
223
221
  return path.join(os.homedir(), '.hippo');
224
222
  }
225
- /**
226
- * True when `p` IS the global store root. Used by the v39 migration so a
227
- * global store whose parent chain happens to contain `.git`/`.hippo`
228
- * (git-managed HIPPO_HOME, dotfiles setups) still backfills as user-global
229
- * ('') instead of being stamped with the surrounding repo's name - which
230
- * would hide the user's entire global corpus from every project.
231
- */
223
+ /** True when `p` IS the global store root, so a global store whose parent chain contains `.git`/`.hippo` (git-managed HIPPO_HOME) still backfills as
224
+ * user-global ('') instead of being stamped with the surrounding repo's name, which would hide the global corpus from every project. */
232
225
  export function isGlobalStoreRoot(p) {
233
226
  return samePath(realpathOrResolve(path.resolve(p)), realpathOrResolve(resolveGlobalRootDir()));
234
227
  }
235
- /**
236
- * Parse a memory's origin from its provenance `source` string, mirroring the
237
- * v39 migration's evidence rules: `shared:<project>:<ts>` and
238
- * `promoted:<localRoot>` identify the owning project; the user home dir's
239
- * basename maps to '' (user-global). Returns null when the source carries no
240
- * origin evidence. Pure string logic - recorded paths may no longer exist.
241
- */
228
+ /** Parses a memory's origin from its provenance `source`: `shared:<project>:<ts>` and `promoted:<localRoot>` name the owning project; the home dir basename
229
+ * maps to '' (user-global). Returns null without origin evidence. Pure string logic, since recorded paths may no longer exist. */
242
230
  export function originFromSource(source, homeName) {
243
231
  if (!source)
244
232
  return null;
@@ -7,9 +7,10 @@ import { errorMessage, log } from '../util/log.js';
7
7
  export function gitConfigPath(gitRoot) {
8
8
  const marker = path.join(gitRoot, '.git');
9
9
  try {
10
- if (fs.statSync(marker).isDirectory())
10
+ const pointer = gitFilePointer(marker);
11
+ if (pointer === null)
11
12
  return path.join(marker, 'config');
12
- const gitDir = /^gitdir:\s*(.+)$/m.exec(fs.readFileSync(marker, 'utf8'))?.[1]?.trim();
13
+ const gitDir = /^gitdir:\s*(.+)$/m.exec(pointer)?.[1]?.trim();
13
14
  if (!gitDir)
14
15
  return null;
15
16
  const linkDir = path.resolve(gitRoot, gitDir);
@@ -23,6 +24,16 @@ export function gitConfigPath(gitRoot) {
23
24
  return null;
24
25
  }
25
26
  }
27
+ /** The text of a `.git` file, or null when `.git` is a folder; one descriptor answers both, so the path cannot change in between. */
28
+ function gitFilePointer(marker) {
29
+ const fd = fs.openSync(marker, 'r');
30
+ try {
31
+ return fs.fstatSync(fd).isDirectory() ? null : fs.readFileSync(fd, 'utf8');
32
+ }
33
+ finally {
34
+ fs.closeSync(fd);
35
+ }
36
+ }
26
37
  /** One config value with git's quoting: `"` toggles quoting, backslash escapes, and an unquoted `#` or `;` starts a comment. */
27
38
  function configValue(raw) {
28
39
  let out = '';
@@ -0,0 +1,5 @@
1
+ /** The refusal a delete of a raw row gets; a plain Error subclass, so it joins no HTTP status family. */
2
+ export declare class RawAppendOnlyError extends Error {
3
+ constructor(cause: Error);
4
+ }
5
+ //# sourceMappingURL=raw-append-only.d.ts.map
@@ -0,0 +1,7 @@
1
+ /** The refusal a delete of a raw row gets; a plain Error subclass, so it joins no HTTP status family. */
2
+ export class RawAppendOnlyError extends Error {
3
+ constructor(cause) {
4
+ super('raw is append-only', { cause });
5
+ }
6
+ }
7
+ //# sourceMappingURL=raw-append-only.js.map
@@ -0,0 +1,69 @@
1
+ /** Recall-side scope predicates, in a leaf module so search-both.ts can apply the same default-deny rule to searchBothHybrid's candidate loads without an
2
+ * import cycle. src/api/index.ts imports these and re-exports them for back-compat (`api.isPrivateScope`, tests importing `passesScopeFilterForRecall`). */
3
+ import { ForbiddenError } from './api-errors.js';
4
+ /** Literal scopes excluded from recall by default-deny when the caller passes no `scope`; read by the SQL clause in `loadSearchRows` and by
5
+ * `passesScopeFilterForRecall`. Invariant: never empty, or quarantine scopes would pass both paths silently (the module-load assertion below pins this). */
6
+ export declare const RECALL_DEFAULT_DENY_SCOPES: readonly ["unknown:legacy"];
7
+ /** @internal Runtime guard against blanking a load-bearing literal array; `as const` arrays widen via `readonly T[]` at the call site, so the empty case
8
+ * is reachable and testable. */
9
+ export declare function assertNonEmpty<T>(arr: readonly T[], name: string): void;
10
+ /** Source-agnostic private-scope detector: private means `<lowercase-source>:private:<rest>` (`slack:private:Cabc`; not `slack:public:x`, null, '',
11
+ * 'private:foo'). The single source of truth for api.recall, the MCP server, the CLI and search-both.ts, so connector work cannot drift. */
12
+ export declare const PRIVATE_SCOPE_RE: RegExp;
13
+ /** True when `scope` matches the `<source>:private:*` shape. */
14
+ export declare function isPrivateScope(scope: string | null | undefined): boolean;
15
+ export declare const PERSONAL_SCOPE_PREFIX = "personal:private:";
16
+ export declare const PERSONAL_OWNER_MAX: number;
17
+ /** True for a `personal:private:<owner>` scope, any case, so a case variant is never mistaken for a team scope. */
18
+ export declare function isPersonalScope(scope: string | null | undefined): boolean;
19
+ /** The caller's own personal scope, or null when it has no owner that can hold one. */
20
+ export declare function personalScopeOf(actor: {
21
+ owner?: string;
22
+ } | undefined): string | null;
23
+ /** Refuses a client-sent `personal:` scope: only the server stamps one, from the caller's owner. */
24
+ export declare function assertClientScope(scope: string | null | undefined): void;
25
+ /** True when `actor` may change or delete a row in `scope`: any non-personal scope, or its own personal one. */
26
+ export declare function canTouchScope(actor: {
27
+ owner?: string;
28
+ }, scope: string | null): boolean;
29
+ /** canTouchScope for a caller known by its own personal scope, as a store method receives it. */
30
+ export declare function ownScopeTouches(ownScope: string | null, scope: string | null): boolean;
31
+ /** JS half of the recall default-deny rule (SQL half: `loadSearchRows`). A non-empty `requested` needs an exact match;
32
+ * otherwise `<source>:private:*` and `RECALL_DEFAULT_DENY_SCOPES` buckets are denied, while null, public scopes and the caller's `ownScope` pass. */
33
+ export declare function passesScopeFilterForRecall(scope: string | null, requested: string | undefined, ownScope?: string | null): boolean;
34
+ /** CLI `--scope` variant: an explicit `--scope X` UNLOCKS scope X on top of the default-admitted set rather than narrowing to X (api.recall keeps 'exact').
35
+ * Includes private/quarantine scopes (owner access); a named personal scope never unlocks: the CLI has no caller identity. */
36
+ export declare function passesCliRecallScopeFilter(scope: string | null, requested: string | undefined): boolean;
37
+ /** Thrown when a caller requests a scope its role may not read; the HTTP layer maps it to 403. */
38
+ export declare class ScopeForbiddenError extends ForbiddenError {
39
+ readonly scope: string;
40
+ constructor(scope: string);
41
+ }
42
+ /** True for scopes default-deny hides (`<source>:private:*` and the quarantine buckets); naming one explicitly unlocks it, so naming one needs
43
+ * authorization. */
44
+ export declare function isRestrictedScope(scope: string | null | undefined): boolean;
45
+ /** The identity a scope check runs against: a role, any scope grants, and the person who owns the key. */
46
+ export interface ScopeActor {
47
+ role: 'admin' | 'member';
48
+ scopes?: readonly string[];
49
+ owner?: string;
50
+ }
51
+ /** Personal rows answer to their owner alone: role, key grants and resolver scopes never
52
+ * open one. Else admin reads all; a member needs an exact grant on a restricted scope. */
53
+ export declare function canReadScope(actor: ScopeActor, scope: string): boolean;
54
+ /** Authorize an explicitly requested scope before any read honours it (member scope grants). */
55
+ export declare function assertScopeRequestAllowed(actor: ScopeActor, requested: string | undefined): void;
56
+ /** Scope a derived row keeps from one source: the restricted scope itself, else null. */
57
+ export declare function derivationScope(scope: string | null | undefined): string | null;
58
+ /** The one derivation scope shared by every source, or `{ ok: false }` when
59
+ * two disagree, so the caller skips the derived row instead of under-scoping it. */
60
+ export declare function commonDerivationScope(scopes: readonly (string | null | undefined)[]): {
61
+ ok: true;
62
+ scope: string | null;
63
+ } | {
64
+ ok: false;
65
+ };
66
+ /** Map-partition key for consolidate/dag/dedup producers: tenant + derivation scope + origin project,
67
+ * so a derived row never blends two restricted scopes, a mixed pair, or two projects. */
68
+ export declare function derivationPartitionKey(tenantId: string, scope: string | null | undefined, origin: string | null | undefined): string;
69
+ //# sourceMappingURL=recall-scope.d.ts.map
@@ -0,0 +1,138 @@
1
+ /** Recall-side scope predicates, in a leaf module so search-both.ts can apply the same default-deny rule to searchBothHybrid's candidate loads without an
2
+ * import cycle. src/api/index.ts imports these and re-exports them for back-compat (`api.isPrivateScope`, tests importing `passesScopeFilterForRecall`). */
3
+ import { BadRequestError, ForbiddenError } from './api-errors.js';
4
+ import { MAX_ID_LEN } from '../util/limits.js';
5
+ /** Literal scopes excluded from recall by default-deny when the caller passes no `scope`; read by the SQL clause in `loadSearchRows` and by
6
+ * `passesScopeFilterForRecall`. Invariant: never empty, or quarantine scopes would pass both paths silently (the module-load assertion below pins this). */
7
+ export const RECALL_DEFAULT_DENY_SCOPES = ['unknown:legacy'];
8
+ /** @internal Runtime guard against blanking a load-bearing literal array; `as const` arrays widen via `readonly T[]` at the call site, so the empty case
9
+ * is reachable and testable. */
10
+ export function assertNonEmpty(arr, name) {
11
+ if (arr.length === 0) {
12
+ throw new Error(`${name} cannot be empty — would silently allow quarantine scopes`);
13
+ }
14
+ }
15
+ assertNonEmpty(RECALL_DEFAULT_DENY_SCOPES, 'RECALL_DEFAULT_DENY_SCOPES');
16
+ /** Source-agnostic private-scope detector: private means `<lowercase-source>:private:<rest>` (`slack:private:Cabc`; not `slack:public:x`, null, '',
17
+ * 'private:foo'). The single source of truth for api.recall, the MCP server, the CLI and search-both.ts, so connector work cannot drift. */
18
+ export const PRIVATE_SCOPE_RE = /^[a-z][a-z0-9_-]*:private:/;
19
+ function isScopeString(value) {
20
+ return typeof value === 'string';
21
+ }
22
+ /** True when `scope` matches the `<source>:private:*` shape. */
23
+ export function isPrivateScope(scope) {
24
+ if (!isScopeString(scope))
25
+ return false;
26
+ return PRIVATE_SCOPE_RE.test(scope);
27
+ }
28
+ export const PERSONAL_SCOPE_PREFIX = 'personal:private:';
29
+ // The scope must fit the 256-character scope caps, so the owner gets what the prefix leaves.
30
+ export const PERSONAL_OWNER_MAX = MAX_ID_LEN - PERSONAL_SCOPE_PREFIX.length;
31
+ /** True for a `personal:private:<owner>` scope, any case, so a case variant is never mistaken for a team scope. */
32
+ export function isPersonalScope(scope) {
33
+ if (!isScopeString(scope))
34
+ return false;
35
+ return /^personal:private:/i.test(scope);
36
+ }
37
+ /** The caller's own personal scope, or null when it has no owner that can hold one. */
38
+ export function personalScopeOf(actor) {
39
+ const owner = actor?.owner;
40
+ if (!owner || owner.length > PERSONAL_OWNER_MAX || /\p{Cc}/u.test(owner))
41
+ return null;
42
+ return `${PERSONAL_SCOPE_PREFIX}${owner}`;
43
+ }
44
+ /** Refuses a client-sent `personal:` scope: only the server stamps one, from the caller's owner. */
45
+ export function assertClientScope(scope) {
46
+ if (isScopeString(scope) && /^personal:/i.test(scope)) {
47
+ throw new BadRequestError(`scope ${scope} is reserved: the server sets personal scopes itself`);
48
+ }
49
+ }
50
+ /** True when `actor` may change or delete a row in `scope`: any non-personal scope, or its own personal one. */
51
+ export function canTouchScope(actor, scope) {
52
+ return ownScopeTouches(personalScopeOf(actor), scope);
53
+ }
54
+ /** canTouchScope for a caller known by its own personal scope, as a store method receives it. */
55
+ export function ownScopeTouches(ownScope, scope) {
56
+ return !isPersonalScope(scope) || scope === ownScope;
57
+ }
58
+ /** JS half of the recall default-deny rule (SQL half: `loadSearchRows`). A non-empty `requested` needs an exact match;
59
+ * otherwise `<source>:private:*` and `RECALL_DEFAULT_DENY_SCOPES` buckets are denied, while null, public scopes and the caller's `ownScope` pass. */
60
+ export function passesScopeFilterForRecall(scope, requested, ownScope) {
61
+ if (requested !== undefined && requested !== '') {
62
+ return scope === requested;
63
+ }
64
+ return !isRestrictedScope(scope) || (ownScope != null && scope === ownScope);
65
+ }
66
+ /** CLI `--scope` variant: an explicit `--scope X` UNLOCKS scope X on top of the default-admitted set rather than narrowing to X (api.recall keeps 'exact').
67
+ * Includes private/quarantine scopes (owner access); a named personal scope never unlocks: the CLI has no caller identity. */
68
+ export function passesCliRecallScopeFilter(scope, requested) {
69
+ if (requested !== undefined && requested !== '' && !isPersonalScope(requested) && scope === requested) {
70
+ return true;
71
+ }
72
+ return passesScopeFilterForRecall(scope, undefined);
73
+ }
74
+ /** Thrown when a caller requests a scope its role may not read; the HTTP layer maps it to 403. */
75
+ export class ScopeForbiddenError extends ForbiddenError {
76
+ scope;
77
+ constructor(scope) {
78
+ super(`scope ${scope} requires admin role`);
79
+ this.name = 'ScopeForbiddenError';
80
+ this.scope = scope;
81
+ }
82
+ }
83
+ /** True for scopes default-deny hides (`<source>:private:*` and the quarantine buckets); naming one explicitly unlocks it, so naming one needs
84
+ * authorization. */
85
+ export function isRestrictedScope(scope) {
86
+ if (!isScopeString(scope))
87
+ return false;
88
+ // SAFETY: RECALL_DEFAULT_DENY_SCOPES is a readonly tuple of string literals; widening the array lets .includes() take any scope.
89
+ // `:private:` anywhere, any case, matches the SQL default-deny in src/store/search-rows.ts so JS never admits what SQL hides.
90
+ return isPrivateScope(scope) || /:private:/i.test(scope) || RECALL_DEFAULT_DENY_SCOPES.includes(scope);
91
+ }
92
+ /** Personal rows answer to their owner alone: role, key grants and resolver scopes never
93
+ * open one. Else admin reads all; a member needs an exact grant on a restricted scope. */
94
+ export function canReadScope(actor, scope) {
95
+ if (isPersonalScope(scope))
96
+ return scope === personalScopeOf(actor);
97
+ if (actor.role === 'admin')
98
+ return true;
99
+ if (!isRestrictedScope(scope))
100
+ return true;
101
+ return (actor.scopes ?? []).includes(scope);
102
+ }
103
+ /** Authorize an explicitly requested scope before any read honours it (member scope grants). */
104
+ export function assertScopeRequestAllowed(actor, requested) {
105
+ if (requested === undefined || requested === '')
106
+ return;
107
+ if (canReadScope(actor, requested))
108
+ return;
109
+ throw new ScopeForbiddenError(requested);
110
+ }
111
+ /** Scope a derived row keeps from one source: the restricted scope itself, else null. */
112
+ export function derivationScope(scope) {
113
+ return isRestrictedScope(scope) ? (scope ?? null) : null;
114
+ }
115
+ /** The one derivation scope shared by every source, or `{ ok: false }` when
116
+ * two disagree, so the caller skips the derived row instead of under-scoping it. */
117
+ export function commonDerivationScope(scopes) {
118
+ let common = null;
119
+ let seen = false;
120
+ for (const raw of scopes) {
121
+ const scope = derivationScope(raw);
122
+ if (!seen) {
123
+ common = scope;
124
+ seen = true;
125
+ }
126
+ else if (scope !== common) {
127
+ return { ok: false };
128
+ }
129
+ }
130
+ return { ok: true, scope: common };
131
+ }
132
+ /** Map-partition key for consolidate/dag/dedup producers: tenant + derivation scope + origin project,
133
+ * so a derived row never blends two restricted scopes, a mixed pair, or two projects. */
134
+ export function derivationPartitionKey(tenantId, scope, origin) {
135
+ const project = origin === undefined ? '\u0002' : origin ?? '\u0001'; // unstamped, unknown and named never share a bucket
136
+ return `${tenantId}\u0000${derivationScope(scope) ?? ''}\u0000${project}`;
137
+ }
138
+ //# sourceMappingURL=recall-scope.js.map
@@ -1,10 +1,4 @@
1
- /**
2
- * Salience gate — decides at memory creation time whether content is worth
3
- * storing at full strength, should start weakened, or should be skipped.
4
- *
5
- * Inspired by the biological salience network (anterior insula + dACC):
6
- * not everything that enters working memory deserves long-term storage.
7
- */
1
+ /** Salience gate: decides at memory creation whether content is stored at full strength, starts weakened, or is skipped. */
8
2
  import type { MemoryEntry } from './memory.js';
9
3
  export type SalienceDecision = 'store' | 'skip' | 'start_weak';
10
4
  export interface SalienceResult {
@@ -1,10 +1,4 @@
1
- /**
2
- * Salience gate — decides at memory creation time whether content is worth
3
- * storing at full strength, should start weakened, or should be skipped.
4
- *
5
- * Inspired by the biological salience network (anterior insula + dACC):
6
- * not everything that enters working memory deserves long-term storage.
7
- */
1
+ /** Salience gate: decides at memory creation whether content is stored at full strength, starts weakened, or is skipped. */
8
2
  import { textOverlap } from '../util/tokenize.js';
9
3
  import { duplicateKey, heldTextKeys } from '../util/same-text.js';
10
4
  // Each store or skip reason carries a score; a novel memory adds bonuses for structure and length.
@@ -1,6 +1,7 @@
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
2
  import * as api from '../api/index.js';
3
3
  import { NotFoundError } from '../core/api-errors.js';
4
+ import { RawAppendOnlyError } from '../core/raw-append-only.js';
4
5
  import { listTouchableConflicts, resolveConflict } from '../store/conflicts.js';
5
6
  import { readEntry } from '../store/entry-reads.js';
6
7
  import { writeEntry } from '../store/entry-writes.js';
@@ -52,8 +53,7 @@ export function forgetMemory(hippoRoot, tenantId, rawId) {
52
53
  catch (err) {
53
54
  if (err instanceof NotFoundError)
54
55
  return notFound();
55
- // Same match as cmdForget: the append-only trigger names itself in the message.
56
- if (err instanceof Error && /append-only/i.test(err.message)) {
56
+ if (err instanceof RawAppendOnlyError) {
57
57
  const error = `Cannot forget ${id}: it is a raw, append-only memory. Archive it instead: hippo forget ${id} --archive --reason "<why>"`;
58
58
  return { status: 409, body: { error }, changed: false };
59
59
  }
@@ -133,6 +133,7 @@ export interface SnapshotService {
133
133
  embeddedIds(): ReadonlySet<string> | null;
134
134
  close(): void;
135
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. */
136
+ /** Holds one read-only connection for its commit signal (`PRAGMA data_version`) and the
137
+ * snapshot cache; `now` dates the strength projections, `cacheClock` ages the cache. */
137
138
  export declare function createSnapshotService(hippoRoot: string, now: () => number, cacheClock?: () => number): SnapshotService;
138
139
  //# sourceMappingURL=dashboard-snapshot.d.ts.map
@@ -263,7 +263,15 @@ class SnapshotCacheService {
263
263
  highestIssuedId = Math.max(highestIssuedId, this.lastId);
264
264
  // After loadDashboardRows, whose writable open has run any pending migration and legacy embeddings.json import.
265
265
  this.lastEmbeddedIds = this.connection.embeddedIds();
266
- return buildSnapshot({ id: this.lastId, tenantId, nowMs, entries: rows?.live ?? [], excluded: rows?.excluded, openConflicts, embeddedIds: this.lastEmbeddedIds });
266
+ return buildSnapshot({
267
+ id: this.lastId,
268
+ tenantId,
269
+ nowMs,
270
+ entries: rows?.live ?? [],
271
+ excluded: rows?.excluded,
272
+ openConflicts,
273
+ embeddedIds: this.lastEmbeddedIds
274
+ });
267
275
  }
268
276
  get(tenantId, fresh = false) {
269
277
  const nowMs = this.now();
@@ -298,7 +306,8 @@ class SnapshotCacheService {
298
306
  this.lastEmbeddedIds = undefined;
299
307
  }
300
308
  }
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. */
309
+ /** Holds one read-only connection for its commit signal (`PRAGMA data_version`) and the
310
+ * snapshot cache; `now` dates the strength projections, `cacheClock` ages the cache. */
302
311
  export function createSnapshotService(hippoRoot, now, cacheClock = Date.now) {
303
312
  return new SnapshotCacheService(hippoRoot, now, cacheClock);
304
313
  }
@@ -17,7 +17,8 @@ export interface ProjectSummary {
17
17
  bands: Record<Band, number>;
18
18
  layers: Record<Layer, number>;
19
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. */
20
+ /** One KPI card; `series` is 91 daily cumulative points, oldest first (point 0 is the base at the window start,
21
+ * point 90 is now) so `last - first` over any range plus one points is exact; null when hippo recorded no history. */
21
22
  export interface Kpi {
22
23
  id: 'total' | 'projects' | 'atRiskShare' | 'openConflicts' | 'embeddingCoverage';
23
24
  label: string;
@@ -4,5 +4,6 @@ import * as http from 'http';
4
4
  export declare function serveDashboard(hippoRoot: string, port?: number, token?: string, opts?: {
5
5
  now?: () => number;
6
6
  cacheClock?: () => number;
7
+ handleSignals?: boolean;
7
8
  }): http.Server;
8
9
  //# sourceMappingURL=dashboard.d.ts.map
@@ -9,12 +9,16 @@ import { listCards } from '../store/cards.js';
9
9
  import { resolveTenantId } from '../store/tenant.js';
10
10
  import { loadCardDetail } from '../store/card-detail.js';
11
11
  import { bodyDeadlineMs, BodyTimeoutError, closeAfterReply, isCrossSite, LOOPBACK_HOST_HEADER } from '../util/http-util.js';
12
- import { errorMessage, log } from '../util/log.js';
12
+ import { errorFields, 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
17
  import { runWithRequestId } from '../util/request-scope.js';
18
+ import { installSignalHandlers } from '../util/crash-handlers.js';
19
+ import { DEFAULT_SHUTDOWN_DRAIN_MS, drainAndClose, setKeepAliveTimeouts, shutdownBoundMs } from '../server/lifecycle.js';
20
+ import { printError } from '../cli/output.js';
21
+ import { PACKAGE_ROOT } from '../core/package-root.js';
18
22
  const MIME_TYPES = {
19
23
  '.html': 'text/html; charset=utf-8',
20
24
  '.js': 'application/javascript; charset=utf-8',
@@ -296,7 +300,7 @@ function answerDashboardFailure(req, res, err) {
296
300
  const clientFault = err instanceof ParamError || err instanceof URIError || err instanceof BodyTimeoutError;
297
301
  // A cut-short response is logged even for a client fault; a bare 400 is not.
298
302
  if (res.headersSent || !clientFault) {
299
- log.error('dashboard request failed', { error: errorMessage(err), path: req.url });
303
+ log.error('dashboard request failed', { ...errorFields(err), error: errorMessage(err), path: req.url });
300
304
  }
301
305
  if (res.headersSent) {
302
306
  res.end();
@@ -321,9 +325,51 @@ function printDashboardBanner(boundPort, token, distUiDir) {
321
325
  console.log(`Serving React UI from ${distUiDir}`);
322
326
  console.log('Press Ctrl+C to stop.');
323
327
  }
328
+ /** A port that will not open is the user's to fix, so it gets one plain line and a failure exit code, not an uncaught error's stack. */
329
+ function reportListenFailure(port, err) {
330
+ const inUse = 'code' in err && err.code === 'EADDRINUSE';
331
+ printError(inUse
332
+ ? `hippo dashboard: port ${port} is already in use. Stop the program that holds it, or choose another port with --port <number>.`
333
+ : `hippo dashboard: could not listen on port ${port}: ${err.message}. Choose another port with --port <number>.`);
334
+ process.exitCode = 1;
335
+ }
336
+ /** Ctrl+C or a stop signal: stop listening, give open requests the API server's drain, and leave within its shutdown bound. */
337
+ function stopOnSignal(server) {
338
+ const inflight = new Set();
339
+ server.on('request', (_req, res) => {
340
+ inflight.add(res);
341
+ res.once('close', () => inflight.delete(res));
342
+ });
343
+ installSignalHandlers('dashboard', {
344
+ run: () => drainAndClose(server, inflight, DEFAULT_SHUTDOWN_DRAIN_MS),
345
+ boundMs: shutdownBoundMs(DEFAULT_SHUTDOWN_DRAIN_MS),
346
+ });
347
+ }
348
+ /** Gives the listener the API server's socket deadlines and one close of the store's connection; with `handleSignals`, a signal stops it too. */
349
+ function superviseListener(server, snapshots, port, handleSignals) {
350
+ setKeepAliveTimeouts(server);
351
+ let storeClosed = false;
352
+ const closeStore = () => {
353
+ if (storeClosed)
354
+ return;
355
+ storeClosed = true;
356
+ snapshots.close();
357
+ };
358
+ server.on('close', closeStore);
359
+ server.on('error', (err) => {
360
+ // Once it listens, an 'error' is a failed accept: logged, as the API server does, and the dashboard keeps serving.
361
+ if (server.listening)
362
+ return log.error(`dashboard: listener error: ${err.message}`, errorFields(err));
363
+ reportListenFailure(port, err);
364
+ // A failed listen emits no 'close', so the store closes here.
365
+ closeStore();
366
+ });
367
+ if (handleSignals)
368
+ stopOnSignal(server);
369
+ }
324
370
  /** 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. */
325
371
  export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).toString('base64url'), opts) {
326
- const distUiDir = path.resolve(import.meta.dirname, '..', 'dist-ui');
372
+ const distUiDir = path.join(PACKAGE_ROOT, 'dist-ui');
327
373
  const hasDistUi = fs.existsSync(path.join(distUiDir, 'index.html'));
328
374
  const now = opts?.now ?? (() => evalNow().getTime());
329
375
  const snapshots = createSnapshotService(hippoRoot, now, opts?.cacheClock);
@@ -356,7 +402,7 @@ export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).t
356
402
  };
357
403
  // One id per request, so the lines it logs can be told apart from a concurrent request's.
358
404
  const server = http.createServer((req, res) => runWithRequestId(randomUUID(), () => onRequest(req, res)));
359
- server.on('close', () => snapshots.close());
405
+ superviseListener(server, snapshots, port, opts?.handleSignals === true);
360
406
  server.listen(port, '127.0.0.1', () => {
361
407
  // SAFETY: listen() was given a TCP port, so address() is AddressInfo, never a pipe name.
362
408
  const boundPort = server.address().port;
package/dist/db/busy.d.ts CHANGED
@@ -1,12 +1,7 @@
1
1
  import type { DatabaseSyncLike } from './sqlite.js';
2
- export declare function isSqliteBusy(error: unknown): boolean;
3
- export declare const STORE_BUSY_MESSAGE = "store busy (another hippo process holds the write lock); retry shortly";
4
- /** A store behind the port throws this when its lock wait runs out, so the server answers 503 as it does for a busy hippo.db. */
5
- export declare class StoreBusyError extends Error {
6
- constructor(message?: string, options?: ErrorOptions);
7
- }
8
- /** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
9
- export declare function isStoreBusy<E>(error: E): boolean;
2
+ export declare function isSqliteBusy(cause: unknown): boolean;
3
+ /** The lock wait of an open that names none: its busy_timeout and every explicit wait below. */
4
+ export declare const DEFAULT_BUSY_WAIT_MS = 5000;
10
5
  export declare function execWithBusyRetry(db: DatabaseSyncLike, sql: string, timeoutMs?: number): void;
11
6
  /** Waits for the lock past busy_timeout when given; ignored inside a caller's transaction, which already holds it. */
12
7
  export interface WriteScopeOptions {