hippo-memory 1.70.0 → 1.71.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 (629) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-memories/claude-code.d.ts +4 -2
  3. package/dist/agent-memories/claude-code.js +14 -5
  4. package/dist/agent-memories/files.js +23 -12
  5. package/dist/agent-memories/markdown.d.ts +1 -3
  6. package/dist/agent-memories/markdown.js +1 -3
  7. package/dist/agent-memories/report.js +2 -1
  8. package/dist/agent-memories/sync.d.ts +4 -2
  9. package/dist/agent-memories/sync.js +10 -5
  10. package/dist/api/assemble.d.ts +7 -44
  11. package/dist/api/assemble.js +2 -22
  12. package/dist/api/audit.d.ts +5 -1
  13. package/dist/api/audit.js +9 -1
  14. package/dist/api/auth.d.ts +13 -22
  15. package/dist/api/auth.js +34 -24
  16. package/dist/api/auto-sleep.js +2 -2
  17. package/dist/api/availability.d.ts +2 -15
  18. package/dist/api/availability.js +2 -15
  19. package/dist/api/context-select.js +3 -4
  20. package/dist/api/context-types.d.ts +10 -35
  21. package/dist/api/context.d.ts +5 -22
  22. package/dist/api/context.js +21 -38
  23. package/dist/api/dormant.d.ts +5 -21
  24. package/dist/api/dormant.js +7 -26
  25. package/dist/api/drill-down.d.ts +7 -46
  26. package/dist/api/drill-down.js +5 -26
  27. package/dist/api/forget.d.ts +5 -24
  28. package/dist/api/forget.js +5 -28
  29. package/dist/api/graph.d.ts +8 -0
  30. package/dist/api/graph.js +7 -0
  31. package/dist/api/index.d.ts +2 -0
  32. package/dist/api/index.js +2 -0
  33. package/dist/api/instruction-detect.js +16 -5
  34. package/dist/api/ledger-db.d.ts +2 -1
  35. package/dist/api/ledger-db.js +5 -3
  36. package/dist/api/memories.d.ts +5 -0
  37. package/dist/api/memories.js +7 -0
  38. package/dist/api/objects.d.ts +9 -0
  39. package/dist/api/objects.js +11 -0
  40. package/dist/api/on-store.js +5 -3
  41. package/dist/api/predictions.d.ts +9 -0
  42. package/dist/api/predictions.js +18 -0
  43. package/dist/api/promote.d.ts +13 -17
  44. package/dist/api/promote.js +11 -19
  45. package/dist/api/prompt-hook.d.ts +4 -4
  46. package/dist/api/prompt-hook.js +10 -9
  47. package/dist/api/recall-cli.d.ts +55 -0
  48. package/dist/api/recall-cli.js +94 -0
  49. package/dist/api/recall-core.js +14 -6
  50. package/dist/api/recall-finish.d.ts +53 -0
  51. package/dist/api/recall-finish.js +30 -0
  52. package/dist/api/recall-history.d.ts +17 -84
  53. package/dist/api/recall-history.js +15 -88
  54. package/dist/api/recall-pipeline.d.ts +2 -3
  55. package/dist/api/recall-pipeline.js +16 -9
  56. package/dist/api/recall-types.d.ts +64 -304
  57. package/dist/api/recall.d.ts +5 -33
  58. package/dist/api/recall.js +59 -60
  59. package/dist/api/refine.d.ts +7 -0
  60. package/dist/api/refine.js +10 -0
  61. package/dist/api/remember-local.d.ts +57 -0
  62. package/dist/api/remember-local.js +90 -0
  63. package/dist/api/remember.d.ts +18 -1
  64. package/dist/api/remember.js +13 -1
  65. package/dist/api/sleep-run.d.ts +1 -3
  66. package/dist/api/sleep-run.js +17 -21
  67. package/dist/api/sleep.d.ts +9 -28
  68. package/dist/api/tokens.d.ts +3 -10
  69. package/dist/api/tokens.js +3 -10
  70. package/dist/api/types.d.ts +6 -29
  71. package/dist/api/types.js +4 -22
  72. package/dist/capture/command.d.ts +4 -12
  73. package/dist/capture/command.js +6 -22
  74. package/dist/capture/compact.d.ts +4 -15
  75. package/dist/capture/compact.js +16 -25
  76. package/dist/capture/compaction-record.js +101 -69
  77. package/dist/capture/compaction-spool.d.ts +1 -1
  78. package/dist/capture/compaction-spool.js +1 -1
  79. package/dist/capture/session-digest.d.ts +1 -1
  80. package/dist/capture/session-digest.js +13 -7
  81. package/dist/capture/transcript.d.ts +2 -10
  82. package/dist/capture/transcript.js +4 -18
  83. package/dist/cli/api-context.d.ts +3 -0
  84. package/dist/cli/api-context.js +6 -0
  85. package/dist/cli/audit-prune.d.ts +6 -39
  86. package/dist/cli/audit-prune.js +6 -39
  87. package/dist/cli/audit.d.ts +1 -1
  88. package/dist/cli/audit.js +33 -34
  89. package/dist/cli/auth.d.ts +2 -2
  90. package/dist/cli/auth.js +57 -39
  91. package/dist/cli/briefs.d.ts +4 -4
  92. package/dist/cli/briefs.js +18 -22
  93. package/dist/cli/card.d.ts +2 -2
  94. package/dist/cli/card.js +31 -32
  95. package/dist/cli/client.d.ts +7 -27
  96. package/dist/cli/client.js +24 -43
  97. package/dist/cli/compact-resume-payload.js +3 -2
  98. package/dist/cli/context.d.ts +1 -2
  99. package/dist/cli/context.js +12 -8
  100. package/dist/cli/continuity.d.ts +6 -6
  101. package/dist/cli/continuity.js +62 -64
  102. package/dist/cli/correction-latency.d.ts +2 -14
  103. package/dist/cli/correction-latency.js +2 -14
  104. package/dist/cli/curate.d.ts +13 -17
  105. package/dist/cli/curate.js +68 -92
  106. package/dist/cli/dag.d.ts +4 -4
  107. package/dist/cli/dag.js +33 -27
  108. package/dist/cli/decisions.d.ts +4 -4
  109. package/dist/cli/decisions.js +33 -47
  110. package/dist/cli/eval.js +15 -13
  111. package/dist/cli/exit.d.ts +6 -0
  112. package/dist/cli/exit.js +11 -0
  113. package/dist/cli/explain.d.ts +1 -2
  114. package/dist/cli/explain.js +6 -4
  115. package/dist/cli/flag-values.d.ts +6 -1
  116. package/dist/cli/flag-values.js +27 -10
  117. package/dist/cli/flags.d.ts +1 -0
  118. package/dist/cli/flags.js +1 -1
  119. package/dist/cli/github.d.ts +14 -0
  120. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  121. package/dist/cli/goals.d.ts +2 -2
  122. package/dist/cli/goals.js +46 -50
  123. package/dist/cli/hook-runtime.d.ts +9 -27
  124. package/dist/cli/hook-runtime.js +15 -31
  125. package/dist/cli/init.d.ts +2 -2
  126. package/dist/cli/init.js +6 -12
  127. package/dist/cli/install-steps.js +3 -12
  128. package/dist/cli/last-sleep.d.ts +2 -1
  129. package/dist/cli/last-sleep.js +3 -0
  130. package/dist/cli/maintenance.d.ts +4 -4
  131. package/dist/cli/maintenance.js +14 -19
  132. package/dist/cli/object-verbs.js +4 -3
  133. package/dist/cli/owner-validation.d.ts +5 -28
  134. package/dist/cli/owner-validation.js +5 -28
  135. package/dist/cli/playbooks.d.ts +4 -4
  136. package/dist/cli/playbooks.js +23 -28
  137. package/dist/cli/print.d.ts +2 -5
  138. package/dist/cli/print.js +1 -4
  139. package/dist/cli/projects.d.ts +2 -2
  140. package/dist/cli/projects.js +1 -3
  141. package/dist/cli/provenance-coverage.d.ts +2 -6
  142. package/dist/cli/provenance-coverage.js +2 -6
  143. package/dist/cli/quality-repair-once.js +2 -2
  144. package/dist/cli/recall.d.ts +2 -4
  145. package/dist/cli/recall.js +55 -131
  146. package/dist/cli/refine-llm.d.ts +5 -31
  147. package/dist/cli/refine-llm.js +9 -36
  148. package/dist/cli/remember.d.ts +3 -3
  149. package/dist/cli/remember.js +122 -180
  150. package/dist/cli/scheduler.d.ts +2 -17
  151. package/dist/cli/scheduler.js +12 -18
  152. package/dist/cli/serve.js +21 -12
  153. package/dist/cli/session-hooks.d.ts +10 -18
  154. package/dist/cli/session-hooks.js +112 -113
  155. package/dist/cli/setup.d.ts +4 -4
  156. package/dist/cli/setup.js +19 -21
  157. package/dist/cli/shared.d.ts +9 -23
  158. package/dist/cli/shared.js +9 -32
  159. package/dist/cli/slack.d.ts +2 -2
  160. package/dist/cli/slack.js +19 -23
  161. package/dist/cli/sleep.d.ts +3 -2
  162. package/dist/cli/sleep.js +15 -16
  163. package/dist/cli/status.d.ts +9 -12
  164. package/dist/cli/status.js +55 -98
  165. package/dist/cli/stdin.d.ts +4 -6
  166. package/dist/cli/stdin.js +2 -3
  167. package/dist/cli/transfer.d.ts +9 -9
  168. package/dist/cli/transfer.js +66 -89
  169. package/dist/cli/usage.js +11 -5
  170. package/dist/cli.d.ts +66 -448
  171. package/dist/cli.js +87 -263
  172. package/dist/connectors/github/backfill.d.ts +5 -25
  173. package/dist/connectors/github/backfill.js +14 -49
  174. package/dist/connectors/github/deletion.d.ts +4 -18
  175. package/dist/connectors/github/deletion.js +2 -15
  176. package/dist/connectors/github/dlq.d.ts +8 -33
  177. package/dist/connectors/github/dlq.js +12 -29
  178. package/dist/connectors/github/ingest.d.ts +2 -6
  179. package/dist/connectors/github/ingest.js +4 -10
  180. package/dist/connectors/github/octokit-client.d.ts +4 -16
  181. package/dist/connectors/github/octokit-client.js +27 -24
  182. package/dist/connectors/github/ratelimit.d.ts +3 -14
  183. package/dist/connectors/github/ratelimit.js +3 -14
  184. package/dist/connectors/github/scope.d.ts +3 -5
  185. package/dist/connectors/github/scope.js +3 -5
  186. package/dist/connectors/github/signature.d.ts +4 -26
  187. package/dist/connectors/github/signature.js +4 -26
  188. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  189. package/dist/connectors/github/tenant-routing.js +4 -26
  190. package/dist/connectors/github/transform.js +2 -16
  191. package/dist/connectors/github/types.d.ts +3 -15
  192. package/dist/connectors/github/types.js +2 -9
  193. package/dist/connectors/github/webhook.d.ts +2 -16
  194. package/dist/connectors/github/webhook.js +6 -22
  195. package/dist/connectors/slack/backfill.d.ts +4 -17
  196. package/dist/connectors/slack/backfill.js +4 -13
  197. package/dist/connectors/slack/dlq.d.ts +2 -19
  198. package/dist/connectors/slack/dlq.js +2 -19
  199. package/dist/connectors/slack/ingest.d.ts +2 -3
  200. package/dist/connectors/slack/ingest.js +2 -3
  201. package/dist/connectors/slack/scope.d.ts +2 -8
  202. package/dist/connectors/slack/scope.js +2 -8
  203. package/dist/connectors/slack/signature.d.ts +1 -6
  204. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  205. package/dist/connectors/slack/tenant-routing.js +2 -21
  206. package/dist/connectors/slack/transform.d.ts +2 -18
  207. package/dist/connectors/slack/transform.js +2 -18
  208. package/dist/connectors/slack/types.d.ts +3 -9
  209. package/dist/connectors/slack/types.js +2 -4
  210. package/dist/connectors/slack/web-client.js +33 -27
  211. package/dist/connectors/slack/webhook.d.ts +2 -19
  212. package/dist/connectors/slack/webhook.js +5 -26
  213. package/dist/connectors/slack/workspaces.d.ts +4 -24
  214. package/dist/connectors/slack/workspaces.js +4 -24
  215. package/dist/consolidate/conflicts.js +6 -14
  216. package/dist/consolidate/dag-summary.d.ts +8 -0
  217. package/dist/consolidate/dag-summary.js +41 -0
  218. package/dist/consolidate/dag.d.ts +5 -28
  219. package/dist/consolidate/dag.js +14 -75
  220. package/dist/consolidate/decay.js +7 -19
  221. package/dist/consolidate/dedupe.d.ts +6 -52
  222. package/dist/consolidate/dedupe.js +13 -71
  223. package/dist/consolidate/flush-units.d.ts +3 -4
  224. package/dist/consolidate/flush-units.js +3 -3
  225. package/dist/consolidate/half-life-migration.d.ts +3 -26
  226. package/dist/consolidate/half-life-migration.js +11 -28
  227. package/dist/consolidate/llm-passes.js +4 -21
  228. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  229. package/dist/consolidate/memory-value-weights.js +2 -13
  230. package/dist/consolidate/memory-value.d.ts +11 -84
  231. package/dist/consolidate/memory-value.js +16 -104
  232. package/dist/consolidate/merge.js +10 -31
  233. package/dist/consolidate/merged-row.js +2 -1
  234. package/dist/consolidate/physics-pass.js +1 -3
  235. package/dist/consolidate/replay.d.ts +6 -38
  236. package/dist/consolidate/replay.js +14 -52
  237. package/dist/consolidate/run.js +1 -1
  238. package/dist/consolidate/sleep.d.ts +1 -8
  239. package/dist/consolidate/sleep.js +5 -17
  240. package/dist/consolidate/trace.d.ts +3 -18
  241. package/dist/consolidate/trace.js +3 -18
  242. package/dist/consolidate/traces.js +6 -22
  243. package/dist/core/ablation.d.ts +4 -91
  244. package/dist/core/ablation.js +4 -91
  245. package/dist/core/ambient.d.ts +1 -8
  246. package/dist/core/ambient.js +1 -8
  247. package/dist/core/capture-contract.d.ts +4 -2
  248. package/dist/core/capture-contract.js +4 -2
  249. package/dist/core/card.d.ts +4 -1
  250. package/dist/core/card.js +8 -0
  251. package/dist/core/compare.d.ts +11 -67
  252. package/dist/core/compare.js +9 -63
  253. package/dist/core/config.d.ts +10 -24
  254. package/dist/core/config.js +13 -14
  255. package/dist/core/handoff.d.ts +1 -7
  256. package/dist/core/handoff.js +1 -7
  257. package/dist/core/memory-quality.js +1 -1
  258. package/dist/core/memory.d.ts +41 -164
  259. package/dist/core/memory.js +51 -221
  260. package/dist/core/package-root.d.ts +3 -0
  261. package/dist/core/package-root.js +5 -0
  262. package/dist/core/physics-config.d.ts +1 -4
  263. package/dist/core/physics-config.js +3 -8
  264. package/dist/core/physics.d.ts +15 -61
  265. package/dist/core/physics.js +59 -122
  266. package/dist/core/project-identity.d.ts +17 -58
  267. package/dist/core/project-identity.js +17 -38
  268. package/dist/core/project-remote.js +13 -2
  269. package/dist/core/raw-append-only.d.ts +5 -0
  270. package/dist/core/raw-append-only.js +7 -0
  271. package/dist/core/salience.d.ts +1 -7
  272. package/dist/core/salience.js +1 -7
  273. package/dist/dashboard/dashboard-actions.js +2 -2
  274. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  275. package/dist/dashboard/dashboard-snapshot.js +11 -2
  276. package/dist/dashboard/dashboard-types.d.ts +2 -1
  277. package/dist/dashboard/dashboard.d.ts +1 -0
  278. package/dist/dashboard/dashboard.js +50 -4
  279. package/dist/db/busy.d.ts +1 -1
  280. package/dist/db/busy.js +17 -8
  281. package/dist/db/connect.d.ts +1 -0
  282. package/dist/db/connect.js +3 -3
  283. package/dist/db/migrate.js +3 -3
  284. package/dist/db/migrations/types.d.ts +2 -5
  285. package/dist/db/migrations/v14.js +2 -3
  286. package/dist/db/migrations/v15.js +2 -8
  287. package/dist/db/migrations/v16.js +2 -3
  288. package/dist/db/migrations/v17.js +2 -3
  289. package/dist/db/migrations/v19.js +2 -5
  290. package/dist/db/migrations/v20.js +2 -7
  291. package/dist/db/migrations/v22.js +4 -17
  292. package/dist/db/migrations/v23.js +3 -14
  293. package/dist/db/migrations/v24.js +2 -4
  294. package/dist/db/migrations/v25.js +3 -8
  295. package/dist/db/migrations/v26.js +2 -13
  296. package/dist/db/migrations/v27.js +3 -11
  297. package/dist/db/migrations/v28.js +2 -14
  298. package/dist/db/migrations/v29.js +4 -18
  299. package/dist/db/migrations/v30.js +4 -16
  300. package/dist/db/migrations/v31.js +2 -15
  301. package/dist/db/migrations/v32.js +4 -22
  302. package/dist/db/migrations/v33.js +2 -15
  303. package/dist/db/migrations/v34.js +2 -11
  304. package/dist/db/migrations/v35.js +2 -11
  305. package/dist/db/migrations/v36.js +2 -11
  306. package/dist/db/migrations/v37.js +8 -33
  307. package/dist/db/migrations/v38.js +5 -38
  308. package/dist/db/migrations/v39.js +9 -20
  309. package/dist/db/migrations/v40.js +2 -9
  310. package/dist/db/migrations/v41.js +2 -24
  311. package/dist/db/migrations/v43.js +1 -1
  312. package/dist/db/migrations/v44.js +2 -8
  313. package/dist/db/migrations/v45.js +2 -7
  314. package/dist/db/migrations/v47.js +2 -3
  315. package/dist/db/migrations/v51.js +1 -1
  316. package/dist/db/open.d.ts +2 -0
  317. package/dist/db/open.js +17 -1
  318. package/dist/db/physics-state.d.ts +6 -22
  319. package/dist/db/physics-state.js +25 -36
  320. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  321. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  322. package/dist/db/vector-store.d.ts +2 -0
  323. package/dist/db/vector-store.js +8 -1
  324. package/dist/doctor.js +74 -19
  325. package/dist/entry/session-text.js +2 -1
  326. package/dist/eval/eval-stats.d.ts +15 -53
  327. package/dist/eval/eval-stats.js +12 -42
  328. package/dist/eval/eval-suite.d.ts +2 -13
  329. package/dist/eval/eval-suite.js +74 -34
  330. package/dist/eval/eval.d.ts +6 -24
  331. package/dist/eval/eval.js +7 -34
  332. package/dist/eval/judgment.d.ts +0 -3
  333. package/dist/eval/judgment.js +19 -11
  334. package/dist/extensions/openclaw-plugin/index.js +1 -1
  335. package/dist/graph/extract.d.ts +5 -27
  336. package/dist/graph/extract.js +7 -33
  337. package/dist/graph/recall.d.ts +7 -20
  338. package/dist/graph/recall.js +14 -76
  339. package/dist/graph/stream.d.ts +7 -39
  340. package/dist/graph/stream.js +11 -34
  341. package/dist/graph/view.d.ts +9 -35
  342. package/dist/graph/view.js +11 -39
  343. package/dist/hooks/codex-wrapper.js +2 -2
  344. package/dist/hooks/copilot.js +2 -1
  345. package/dist/hooks/hook-blocks.d.ts +6 -2
  346. package/dist/hooks/hook-blocks.js +37 -124
  347. package/dist/hooks/json-hooks.d.ts +4 -36
  348. package/dist/hooks/json-hooks.js +18 -57
  349. package/dist/hooks/opencode.d.ts +0 -38
  350. package/dist/hooks/opencode.js +9 -76
  351. package/dist/hooks/shared.d.ts +8 -17
  352. package/dist/hooks/shared.js +29 -20
  353. package/dist/importers/core.d.ts +12 -37
  354. package/dist/importers/core.js +9 -27
  355. package/dist/importers/markdown-parse.d.ts +8 -22
  356. package/dist/importers/markdown-parse.js +8 -25
  357. package/dist/importers/markdown.js +3 -12
  358. package/dist/importers/sources.js +7 -35
  359. package/dist/importers/vault.d.ts +2 -8
  360. package/dist/importers/vault.js +25 -81
  361. package/dist/index.d.ts +6 -2
  362. package/dist/index.js +6 -2
  363. package/dist/learn/autolearn.d.ts +14 -41
  364. package/dist/learn/autolearn.js +14 -41
  365. package/dist/learn/extract.js +2 -4
  366. package/dist/learn/forward-claim-detector.d.ts +6 -30
  367. package/dist/learn/forward-claim-detector.js +14 -66
  368. package/dist/learn/invalidation.d.ts +6 -18
  369. package/dist/learn/invalidation.js +9 -26
  370. package/dist/mcp/admin-tools.js +3 -5
  371. package/dist/mcp/memory-tools.js +4 -9
  372. package/dist/mcp/protocol.d.ts +8 -26
  373. package/dist/mcp/protocol.js +3 -6
  374. package/dist/mcp/recall-tools.js +3 -3
  375. package/dist/mcp/request.d.ts +3 -11
  376. package/dist/mcp/request.js +10 -26
  377. package/dist/mcp/server.d.ts +3 -9
  378. package/dist/mcp/server.js +5 -16
  379. package/dist/mcp/session-state.d.ts +1 -1
  380. package/dist/mcp/session-state.js +5 -11
  381. package/dist/mcp/stdio.d.ts +2 -6
  382. package/dist/mcp/stdio.js +48 -12
  383. package/dist/mcp/tools.js +5 -3
  384. package/dist/objects/customer-notes.d.ts +7 -42
  385. package/dist/objects/customer-notes.js +7 -48
  386. package/dist/objects/decisions.d.ts +12 -50
  387. package/dist/objects/decisions.js +15 -53
  388. package/dist/objects/incidents.d.ts +7 -38
  389. package/dist/objects/incidents.js +7 -41
  390. package/dist/objects/policies.d.ts +11 -89
  391. package/dist/objects/policies.js +11 -98
  392. package/dist/objects/processes.d.ts +7 -52
  393. package/dist/objects/processes.js +7 -61
  394. package/dist/objects/project-briefs.d.ts +11 -55
  395. package/dist/objects/project-briefs.js +14 -75
  396. package/dist/objects/skills.d.ts +7 -42
  397. package/dist/objects/skills.js +8 -54
  398. package/dist/postinstall.js +6 -19
  399. package/dist/predictions/planning-fallacy.d.ts +11 -34
  400. package/dist/rerankers/clef.js +3 -31
  401. package/dist/rerankers/cross-encoder.js +4 -6
  402. package/dist/rerankers/jev.js +9 -6
  403. package/dist/rerankers/llm.d.ts +2 -11
  404. package/dist/rerankers/llm.js +14 -14
  405. package/dist/rerankers/outage-warning.d.ts +2 -1
  406. package/dist/rerankers/outage-warning.js +2 -1
  407. package/dist/rerankers/remote.d.ts +1 -0
  408. package/dist/rerankers/remote.js +2 -0
  409. package/dist/rerankers/types.d.ts +2 -14
  410. package/dist/search/boosts.d.ts +0 -2
  411. package/dist/search/boosts.js +2 -2
  412. package/dist/search/goal-boost.d.ts +23 -0
  413. package/dist/search/goal-boost.js +90 -0
  414. package/dist/search/hybrid.d.ts +2 -0
  415. package/dist/search/multihop.js +2 -3
  416. package/dist/search/path-context.d.ts +5 -18
  417. package/dist/search/path-context.js +5 -18
  418. package/dist/search/physics-search.js +11 -8
  419. package/dist/search/rrf.d.ts +7 -35
  420. package/dist/search/rrf.js +5 -30
  421. package/dist/search/vector.d.ts +7 -0
  422. package/dist/search/vector.js +35 -5
  423. package/dist/server/auth.d.ts +9 -28
  424. package/dist/server/auth.js +32 -25
  425. package/dist/server/boot.d.ts +2 -21
  426. package/dist/server/boot.js +63 -96
  427. package/dist/server/client-ip.d.ts +3 -19
  428. package/dist/server/client-ip.js +5 -28
  429. package/dist/server/defaults.d.ts +3 -0
  430. package/dist/server/defaults.js +4 -0
  431. package/dist/server/key-check-bounds.d.ts +2 -1
  432. package/dist/server/lifecycle.d.ts +5 -4
  433. package/dist/server/lifecycle.js +19 -4
  434. package/dist/server/mcp-http.js +10 -44
  435. package/dist/server/rate-limit.d.ts +5 -18
  436. package/dist/server/rate-limit.js +4 -13
  437. package/dist/server/request.d.ts +4 -8
  438. package/dist/server/request.js +9 -17
  439. package/dist/server/route-table.js +42 -49
  440. package/dist/server/routes/admin.js +22 -28
  441. package/dist/server/routes/customer-notes.js +7 -12
  442. package/dist/server/routes/decisions.js +10 -17
  443. package/dist/server/routes/incidents.js +12 -20
  444. package/dist/server/routes/memories.js +12 -32
  445. package/dist/server/routes/object-routes.d.ts +0 -5
  446. package/dist/server/routes/object-routes.js +7 -15
  447. package/dist/server/routes/policies.js +10 -18
  448. package/dist/server/routes/predictions.js +13 -25
  449. package/dist/server/routes/processes.js +16 -26
  450. package/dist/server/routes/project-briefs.js +9 -16
  451. package/dist/server/routes/recall.js +10 -35
  452. package/dist/server/routes/skills.js +8 -18
  453. package/dist/server/server-detect.d.ts +9 -53
  454. package/dist/server/server-detect.js +24 -90
  455. package/dist/server/sleep-offload.js +4 -1
  456. package/dist/server/types.d.ts +12 -10
  457. package/dist/server/validation.d.ts +3 -1
  458. package/dist/server/validation.js +10 -23
  459. package/dist/server.d.ts +2 -2
  460. package/dist/server.js +3 -2
  461. package/dist/sharing/global-store.d.ts +19 -0
  462. package/dist/sharing/global-store.js +75 -0
  463. package/dist/sharing/global-sync.d.ts +6 -0
  464. package/dist/sharing/global-sync.js +80 -0
  465. package/dist/sharing/project-merge.d.ts +4 -5
  466. package/dist/sharing/project-merge.js +9 -7
  467. package/dist/sharing/scope.d.ts +4 -11
  468. package/dist/sharing/scope.js +4 -11
  469. package/dist/sharing/search-both.d.ts +60 -0
  470. package/dist/sharing/search-both.js +138 -0
  471. package/dist/sharing/share.d.ts +38 -0
  472. package/dist/sharing/share.js +226 -0
  473. package/dist/store/ambient.js +4 -9
  474. package/dist/store/audit-event.d.ts +4 -12
  475. package/dist/store/audit-event.js +4 -12
  476. package/dist/store/audit.d.ts +2 -5
  477. package/dist/store/audit.js +4 -12
  478. package/dist/store/auth.d.ts +6 -6
  479. package/dist/store/auth.js +10 -9
  480. package/dist/store/candidates.d.ts +20 -3
  481. package/dist/store/candidates.js +77 -48
  482. package/dist/store/card-detail.d.ts +2 -1
  483. package/dist/store/card-detail.js +2 -1
  484. package/dist/store/cards.d.ts +14 -9
  485. package/dist/store/cards.js +72 -126
  486. package/dist/store/conflicts.d.ts +4 -21
  487. package/dist/store/conflicts.js +71 -150
  488. package/dist/store/connectors/github.d.ts +10 -10
  489. package/dist/store/connectors/github.js +10 -10
  490. package/dist/store/dashboard-reads.js +4 -8
  491. package/dist/store/delete-and-batch.d.ts +11 -31
  492. package/dist/store/delete-and-batch.js +48 -64
  493. package/dist/store/delivery-recorder.d.ts +8 -4
  494. package/dist/store/delivery-recorder.js +25 -15
  495. package/dist/store/diagnostics.js +6 -13
  496. package/dist/store/dormant.d.ts +7 -29
  497. package/dist/store/dormant.js +15 -56
  498. package/dist/store/embeddings/index.d.ts +11 -80
  499. package/dist/store/embeddings/index.js +71 -207
  500. package/dist/store/embeddings/local.js +15 -32
  501. package/dist/store/embeddings/provider.d.ts +16 -53
  502. package/dist/store/embeddings/provider.js +41 -69
  503. package/dist/store/entry-reads.d.ts +21 -57
  504. package/dist/store/entry-reads.js +65 -126
  505. package/dist/store/entry-row.d.ts +6 -35
  506. package/dist/store/entry-row.js +9 -37
  507. package/dist/store/entry-writes.d.ts +10 -16
  508. package/dist/store/entry-writes.js +17 -35
  509. package/dist/store/goals.d.ts +3 -40
  510. package/dist/store/goals.js +21 -160
  511. package/dist/store/graph-queue.d.ts +6 -22
  512. package/dist/store/graph-queue.js +14 -45
  513. package/dist/store/graph-reads.d.ts +11 -35
  514. package/dist/store/graph-reads.js +20 -58
  515. package/dist/store/graph-rows.d.ts +3 -6
  516. package/dist/store/graph-rows.js +6 -9
  517. package/dist/store/graph-view-rows.d.ts +2 -1
  518. package/dist/store/graph-view-rows.js +2 -1
  519. package/dist/store/graph-writes.d.ts +6 -31
  520. package/dist/store/graph-writes.js +13 -37
  521. package/dist/store/half-life.d.ts +2 -1
  522. package/dist/store/half-life.js +14 -16
  523. package/dist/store/handoffs.d.ts +5 -11
  524. package/dist/store/handoffs.js +16 -34
  525. package/dist/store/index-and-stats.d.ts +6 -19
  526. package/dist/store/index-and-stats.js +34 -82
  527. package/dist/store/markdown.d.ts +2 -6
  528. package/dist/store/markdown.js +21 -20
  529. package/dist/store/mirrors.d.ts +2 -6
  530. package/dist/store/mirrors.js +14 -23
  531. package/dist/store/open.js +6 -13
  532. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  533. package/dist/store/planning-fallacy-evidence.js +8 -37
  534. package/dist/store/port.d.ts +82 -79
  535. package/dist/store/predictions.d.ts +11 -51
  536. package/dist/store/predictions.js +38 -119
  537. package/dist/{cli → store}/quality-repair.js +15 -31
  538. package/dist/store/raw-archive.d.ts +4 -16
  539. package/dist/store/raw-archive.js +14 -29
  540. package/dist/store/recall-scope.d.ts +19 -79
  541. package/dist/store/recall-scope.js +21 -82
  542. package/dist/store/recall-trace.d.ts +10 -77
  543. package/dist/store/recall-trace.js +19 -95
  544. package/dist/store/rejected-values.js +7 -19
  545. package/dist/store/rejection.d.ts +12 -58
  546. package/dist/store/rejection.js +13 -65
  547. package/dist/store/report-reads.d.ts +6 -0
  548. package/dist/store/report-reads.js +29 -0
  549. package/dist/store/rows.d.ts +9 -19
  550. package/dist/store/rows.js +36 -34
  551. package/dist/store/rule-sql.d.ts +5 -0
  552. package/dist/store/rule-sql.js +37 -0
  553. package/dist/store/search-rows.d.ts +7 -38
  554. package/dist/store/search-rows.js +14 -50
  555. package/dist/store/sessions.d.ts +10 -47
  556. package/dist/store/sessions.js +17 -73
  557. package/dist/store/sqlite/connector-events-group.js +2 -2
  558. package/dist/store/sqlite/entry-writes-group.js +2 -2
  559. package/dist/store/sqlite/error-codec.js +4 -2
  560. package/dist/store/sqlite/executor.d.ts +2 -1
  561. package/dist/store/sqlite/executor.js +2 -1
  562. package/dist/store/sqlite/local.d.ts +3 -3
  563. package/dist/store/sqlite/local.js +1 -0
  564. package/dist/store/sqlite/object-rows.js +6 -3
  565. package/dist/store/sqlite/objects-group.js +4 -2
  566. package/dist/store/sqlite/quarantine-group.js +2 -2
  567. package/dist/store/sqlite/store.d.ts +1 -4
  568. package/dist/store/sqlite/store.js +2 -3
  569. package/dist/store/sqlite/vector-reads-group.js +2 -2
  570. package/dist/store/sqlite/worker-jobs.js +1 -1
  571. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  572. package/dist/store/sqlite/worker-ops.js +13 -2
  573. package/dist/store/sqlite/worker-store.js +5 -2
  574. package/dist/store/summaries.d.ts +10 -62
  575. package/dist/store/summaries.js +34 -146
  576. package/dist/store/summary-dirty.js +1 -1
  577. package/dist/store/tenant-lookup.d.ts +6 -1
  578. package/dist/store/tenant-lookup.js +7 -0
  579. package/dist/store/tenant.d.ts +2 -16
  580. package/dist/store/tenant.js +4 -19
  581. package/dist/store/token-ledger.d.ts +13 -43
  582. package/dist/store/token-ledger.js +19 -50
  583. package/dist/store/usage-reports.js +5 -13
  584. package/dist/store/vector-index.d.ts +46 -0
  585. package/dist/store/vector-index.js +170 -0
  586. package/dist/store/working-memory.d.ts +6 -25
  587. package/dist/store/working-memory.js +18 -52
  588. package/dist/store/yaml.d.ts +1 -5
  589. package/dist/store/yaml.js +2 -6
  590. package/dist/support-bundle.js +7 -5
  591. package/dist/trust/reject-flow.js +1 -3
  592. package/dist/util/anthropic-messages.js +14 -2
  593. package/dist/util/atomic-write.d.ts +2 -1
  594. package/dist/util/atomic-write.js +35 -4
  595. package/dist/util/capped-json.d.ts +6 -0
  596. package/dist/util/capped-json.js +46 -0
  597. package/dist/util/crash-handlers.d.ts +8 -1
  598. package/dist/util/crash-handlers.js +52 -10
  599. package/dist/util/env.d.ts +13 -6
  600. package/dist/util/env.js +14 -7
  601. package/dist/util/home-path.d.ts +2 -1
  602. package/dist/util/home-path.js +4 -2
  603. package/dist/util/http-retry.d.ts +3 -1
  604. package/dist/util/http-retry.js +26 -5
  605. package/dist/util/log.d.ts +3 -2
  606. package/dist/util/log.js +25 -9
  607. package/dist/util/request-scope.d.ts +2 -1
  608. package/dist/util/request-scope.js +2 -1
  609. package/dist/util/secret-detect.d.ts +5 -30
  610. package/dist/util/secret-detect.js +13 -39
  611. package/dist/util/stored-json.d.ts +1 -1
  612. package/dist/util/stored-json.js +1 -1
  613. package/dist/util/token-text.d.ts +1 -4
  614. package/dist/util/token-text.js +1 -4
  615. package/dist/util/transcript-tail.d.ts +2 -0
  616. package/dist/util/transcript-tail.js +24 -23
  617. package/dist/util/version.d.ts +5 -20
  618. package/dist/util/version.js +5 -20
  619. package/extensions/openclaw-plugin/index.ts +1 -1
  620. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  621. package/extensions/openclaw-plugin/package.json +1 -1
  622. package/openclaw.plugin.json +1 -1
  623. package/package.json +1 -1
  624. package/dist/connectors/github/cli-impl.d.ts +0 -25
  625. package/dist/sharing/shared.d.ts +0 -187
  626. package/dist/sharing/shared.js +0 -563
  627. package/dist/store/vector-writes.d.ts +0 -13
  628. package/dist/store/vector-writes.js +0 -89
  629. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
@@ -1,3 +1,4 @@
1
+ import type { JsonObject } from './working-memory.js';
1
2
  import { type TaskSnapshot, type SessionEvent } from './rows.js';
2
3
  /** A shared-store caller's task state bucket: its owner and every name its project's rows carry. */
3
4
  export interface ContinuityKey {
@@ -26,36 +27,11 @@ type SnapshotInput = {
26
27
  };
27
28
  export declare function saveActiveTaskSnapshot(hippoRoot: string, tenantId: string, snapshot: SnapshotInput, key?: ContinuityKey): TaskSnapshot;
28
29
  export declare function loadActiveTaskSnapshot(hippoRoot: string, tenantId: string, key?: ContinuityKey): TaskSnapshot | null;
29
- /**
30
- * Default freshness bound for AMBIENT active-task-snapshot reads: 72h, chosen over 48h so
31
- * a Friday-evening orphan still offers continuity on Monday morning.
32
- * Exported so callers can override via `loadFreshActiveTaskSnapshot`'s
33
- * `opts.maxAgeMs`; deliberately no env knob (Simplicity First).
34
- */
30
+ /** Default freshness bound for AMBIENT active-task-snapshot reads: 72h rather than 48h so a Friday-evening orphan still offers continuity on Monday;
31
+ * override via `loadFreshActiveTaskSnapshot`'s `opts.maxAgeMs`; deliberately no env knob. */
35
32
  export declare const SNAPSHOT_AMBIENT_MAX_AGE_MS: number;
36
- /**
37
- * Bounded read for AMBIENT active-task-snapshot surfaces (UserPromptSubmit
38
- * hook context, MCP recall block), so snapshots expire. A
39
- * snapshot written by `hippo pre-compact` has no death path tied to the
40
- * session that owns it, so an orphaned row would otherwise inject into
41
- * every prompt of every later session forever. Wraps `loadActiveTaskSnapshot`
42
- * (unchanged, still the source of truth for explicit continuity surfaces),
43
- * then applies, in order:
44
- *
45
- * 1. Owner match — ONLY when both `opts.sessionId` and the snapshot's
46
- * `session_id` are non-null, non-empty strings and strictly equal
47
- * (`===`). Owner reads are unbounded: the session that owns the snapshot
48
- * can always see its own working state, regardless of age.
49
- * 2. Age check — everything else, including absent-vs-absent ids. A
50
- * null/undefined/empty id on EITHER side never counts as an owner match;
51
- * it falls through here instead. (`runPreCompact` can legitimately save a
52
- * snapshot with `session_id = null`; a null-equals-null "match" would
53
- * reopen indefinite ambient injection for exactly those rows.) Returns
54
- * the snapshot only when `age(updated_at) <= maxAgeMs` (default
55
- * `SNAPSHOT_AMBIENT_MAX_AGE_MS`); otherwise null.
56
- *
57
- * No SQL change — age derives from the existing `updated_at` column.
58
- */
33
+ /** Bounded read for AMBIENT snapshot surfaces so orphaned snapshots expire. The owner (both session ids non-empty and `===`) always sees its own state;
34
+ * all others, null ids included (null === null is no match), get it only if age(updated_at) <= maxAgeMs (default `SNAPSHOT_AMBIENT_MAX_AGE_MS`), else null. */
59
35
  export declare function loadFreshActiveTaskSnapshot(hippoRoot: string, tenantId: string, opts?: {
60
36
  maxAgeMs?: number;
61
37
  sessionId?: string | null;
@@ -66,15 +42,8 @@ export declare function freshActiveSnapshot(snapshot: TaskSnapshot | null, opts?
66
42
  sessionId?: string | null;
67
43
  }): TaskSnapshot | null;
68
44
  export declare function clearActiveTaskSnapshot(hippoRoot: string, tenantId: string, clearedStatus?: string): boolean;
69
- /**
70
- * Close the `active` task snapshot(s) owned by `sessionId`, for the
71
- * session-end death path.
72
- * Only one `active` row exists per tenant (per owner and project when keyed) in practice (supersession happens
73
- * at save), but the WHERE clause scopes on `session_id` too — not just
74
- * `status='active' AND tenant_id=?` — so an ending session can never close a
75
- * different, newer session's active snapshot. Returns the number of rows
76
- * closed (0 when no active row is owned by `sessionId`).
77
- */
45
+ /** Close the `active` task snapshot(s) owned by `sessionId` at session end; the WHERE scopes on `session_id` too so an ending session can never close a
46
+ * newer session's snapshot. Returns the number of rows closed. */
78
47
  export declare function closeTaskSnapshotsForSession(hippoRoot: string, tenantId: string, sessionId: string, status?: string, key?: ContinuityKey): number;
79
48
  interface SessionEventInput {
80
49
  session_id: string;
@@ -83,7 +52,7 @@ interface SessionEventInput {
83
52
  task?: string | null;
84
53
  source?: string;
85
54
  scope?: string | null;
86
- metadata?: Record<string, unknown>;
55
+ metadata?: JsonObject;
87
56
  }
88
57
  export declare function appendSessionEvent(hippoRoot: string, tenantId: string, event: SessionEventInput): SessionEvent;
89
58
  export declare function listSessionEvents(hippoRoot: string, tenantId: string, options?: {
@@ -91,17 +60,11 @@ export declare function listSessionEvents(hippoRoot: string, tenantId: string, o
91
60
  task?: string;
92
61
  limit?: number;
93
62
  }): SessionEvent[];
94
- /**
95
- * Return session_ids with a `session_complete` event newer than `sinceMs`.
96
- * Used by the sleep auto-promotion pass to bound scanning to a fixed window.
97
- */
63
+ /** Session_ids with a `session_complete` event newer than `sinceMs`; bounds the sleep auto-promotion scan to a fixed window. */
98
64
  export declare function findPromotableSessions(hippoRoot: string, tenantId: string, sinceMs: number): Array<{
99
65
  session_id: string;
100
66
  }>;
101
- /**
102
- * Idempotency guard — true if a trace-layer memory with this source_session_id
103
- * already exists.
104
- */
67
+ /** Idempotency guard: true if a trace-layer memory with this source_session_id already exists. */
105
68
  export declare function traceExistsForSession(hippoRoot: string, tenantId: string, session_id: string): boolean;
106
69
  /** One caller's claim on a session id. */
107
70
  export interface SessionOwnerBinding {
@@ -73,8 +73,7 @@ export function saveActiveTaskSnapshot(hippoRoot, tenantId, snapshot, key) {
73
73
  export function loadActiveTaskSnapshot(hippoRoot, tenantId, key) {
74
74
  assertTenantId('loadActiveTaskSnapshot', tenantId);
75
75
  const owned = key ? continuityWhere(key) : null;
76
- const db = openStore(hippoRoot);
77
- try {
76
+ return onHandle(hippoRoot, (db) => {
78
77
  // SAFETY: row's shape matches the ten columns named in the SELECT above.
79
78
  const row = db.prepare(`
80
79
  SELECT id, task, summary, next_step, status, source, session_id, scope, created_at, updated_at
@@ -92,47 +91,17 @@ export function loadActiveTaskSnapshot(hippoRoot, tenantId, key) {
92
91
  if (!key)
93
92
  writeActiveTaskMirror(hippoRoot, tenantId, loaded);
94
93
  return loaded;
95
- }
96
- finally {
97
- closeHippoDb(db);
98
- }
94
+ }, openStore);
99
95
  }
100
- /**
101
- * Default freshness bound for AMBIENT active-task-snapshot reads: 72h, chosen over 48h so
102
- * a Friday-evening orphan still offers continuity on Monday morning.
103
- * Exported so callers can override via `loadFreshActiveTaskSnapshot`'s
104
- * `opts.maxAgeMs`; deliberately no env knob (Simplicity First).
105
- */
96
+ /** Default freshness bound for AMBIENT active-task-snapshot reads: 72h rather than 48h so a Friday-evening orphan still offers continuity on Monday;
97
+ * override via `loadFreshActiveTaskSnapshot`'s `opts.maxAgeMs`; deliberately no env knob. */
106
98
  export const SNAPSHOT_AMBIENT_MAX_AGE_MS = 72 * 60 * 60 * 1000;
107
- /** A usable session id: non-null, non-empty string. Named predicate (not an
108
- * inline `typeof` check) so the owner-match rule in
109
- * `loadFreshActiveTaskSnapshot` states its contract once. */
99
+ /** A usable session id: non-null, non-empty string; named so the owner-match rule in `loadFreshActiveTaskSnapshot` states its contract once. */
110
100
  function isNonEmptySessionId(value) {
111
101
  return typeof value === 'string' && value.length > 0;
112
102
  }
113
- /**
114
- * Bounded read for AMBIENT active-task-snapshot surfaces (UserPromptSubmit
115
- * hook context, MCP recall block), so snapshots expire. A
116
- * snapshot written by `hippo pre-compact` has no death path tied to the
117
- * session that owns it, so an orphaned row would otherwise inject into
118
- * every prompt of every later session forever. Wraps `loadActiveTaskSnapshot`
119
- * (unchanged, still the source of truth for explicit continuity surfaces),
120
- * then applies, in order:
121
- *
122
- * 1. Owner match — ONLY when both `opts.sessionId` and the snapshot's
123
- * `session_id` are non-null, non-empty strings and strictly equal
124
- * (`===`). Owner reads are unbounded: the session that owns the snapshot
125
- * can always see its own working state, regardless of age.
126
- * 2. Age check — everything else, including absent-vs-absent ids. A
127
- * null/undefined/empty id on EITHER side never counts as an owner match;
128
- * it falls through here instead. (`runPreCompact` can legitimately save a
129
- * snapshot with `session_id = null`; a null-equals-null "match" would
130
- * reopen indefinite ambient injection for exactly those rows.) Returns
131
- * the snapshot only when `age(updated_at) <= maxAgeMs` (default
132
- * `SNAPSHOT_AMBIENT_MAX_AGE_MS`); otherwise null.
133
- *
134
- * No SQL change — age derives from the existing `updated_at` column.
135
- */
103
+ /** Bounded read for AMBIENT snapshot surfaces so orphaned snapshots expire. The owner (both session ids non-empty and `===`) always sees its own state;
104
+ * all others, null ids included (null === null is no match), get it only if age(updated_at) <= maxAgeMs (default `SNAPSHOT_AMBIENT_MAX_AGE_MS`), else null. */
136
105
  export function loadFreshActiveTaskSnapshot(hippoRoot, tenantId, opts = {}, key) {
137
106
  return freshActiveSnapshot(loadActiveTaskSnapshot(hippoRoot, tenantId, key), opts);
138
107
  }
@@ -170,15 +139,8 @@ export function clearActiveTaskSnapshot(hippoRoot, tenantId, clearedStatus = 'cl
170
139
  closeHippoDb(db);
171
140
  }
172
141
  }
173
- /**
174
- * Close the `active` task snapshot(s) owned by `sessionId`, for the
175
- * session-end death path.
176
- * Only one `active` row exists per tenant (per owner and project when keyed) in practice (supersession happens
177
- * at save), but the WHERE clause scopes on `session_id` too — not just
178
- * `status='active' AND tenant_id=?` — so an ending session can never close a
179
- * different, newer session's active snapshot. Returns the number of rows
180
- * closed (0 when no active row is owned by `sessionId`).
181
- */
142
+ /** Close the `active` task snapshot(s) owned by `sessionId` at session end; the WHERE scopes on `session_id` too so an ending session can never close a
143
+ * newer session's snapshot. Returns the number of rows closed. */
182
144
  export function closeTaskSnapshotsForSession(hippoRoot, tenantId, sessionId, status = 'session-ended', key) {
183
145
  assertTenantId('closeTaskSnapshotsForSession', tenantId);
184
146
  if (key)
@@ -242,8 +204,7 @@ export function appendSessionEvent(hippoRoot, tenantId, event) {
242
204
  }
243
205
  export function listSessionEvents(hippoRoot, tenantId, options = {}) {
244
206
  assertTenantId('listSessionEvents', tenantId);
245
- const db = openStore(hippoRoot);
246
- try {
207
+ return onHandle(hippoRoot, (db) => {
247
208
  const clauses = ['tenant_id = ?'];
248
209
  const params = [tenantId];
249
210
  if (options.session_id) {
@@ -267,19 +228,12 @@ export function listSessionEvents(hippoRoot, tenantId, options = {}) {
267
228
  LIMIT ?
268
229
  `).all(...params);
269
230
  return rows.map(rowToSessionEvent).reverse();
270
- }
271
- finally {
272
- closeHippoDb(db);
273
- }
231
+ }, openStore);
274
232
  }
275
- /**
276
- * Return session_ids with a `session_complete` event newer than `sinceMs`.
277
- * Used by the sleep auto-promotion pass to bound scanning to a fixed window.
278
- */
233
+ /** Session_ids with a `session_complete` event newer than `sinceMs`; bounds the sleep auto-promotion scan to a fixed window. */
279
234
  export function findPromotableSessions(hippoRoot, tenantId, sinceMs) {
280
235
  assertTenantId('findPromotableSessions', tenantId);
281
- const db = openStore(hippoRoot);
282
- try {
236
+ return onHandle(hippoRoot, (db) => {
283
237
  // SAFETY: rows' shape matches the single `session_id` column selected
284
238
  // above.
285
239
  const rows = db.prepare(`
@@ -287,29 +241,19 @@ export function findPromotableSessions(hippoRoot, tenantId, sinceMs) {
287
241
  WHERE event_type = 'session_complete' AND created_at >= ? AND tenant_id = ?
288
242
  `).all(new Date(sinceMs).toISOString(), tenantId);
289
243
  return rows;
290
- }
291
- finally {
292
- closeHippoDb(db);
293
- }
244
+ }, openStore);
294
245
  }
295
- /**
296
- * Idempotency guard — true if a trace-layer memory with this source_session_id
297
- * already exists.
298
- */
246
+ /** Idempotency guard: true if a trace-layer memory with this source_session_id already exists. */
299
247
  export function traceExistsForSession(hippoRoot, tenantId, session_id) {
300
248
  assertTenantId('traceExistsForSession', tenantId);
301
- const db = openStore(hippoRoot);
302
- try {
249
+ return onHandle(hippoRoot, (db) => {
303
250
  const row = db.prepare(`
304
251
  SELECT 1 FROM memories
305
252
  WHERE source_session_id = ? AND layer = 'trace' AND tenant_id = ?
306
253
  LIMIT 1
307
254
  `).get(session_id, tenantId);
308
255
  return !!row;
309
- }
310
- finally {
311
- closeHippoDb(db);
312
- }
256
+ }, openStore);
313
257
  }
314
258
  /** The owner a session id is bound to, or null. */
315
259
  function selectSessionOwnerAt(db, tenantId, sessionId) {
@@ -1,5 +1,5 @@
1
1
  // hippo.db's half of the ConnectorEvents store group: each call on a handle of its own.
2
- import { archiveDeletedArtifact, eventSeenAt, githubRouting, insertDlq, logEvent, seenEvent } from '../connectors/github.js';
2
+ import { archiveDeletedArtifact, eventSeenAt, githubRouting, insertGitHubDlq, logEvent, seenEvent } from '../connectors/github.js';
3
3
  import { insertSlackDlq, markSlackEventSeen, rawMemoryIdForArtifactAt, slackEventRecord, slackEventSeenAt, slackTeamRoute } from '../connectors/slack.js';
4
4
  import { onHandle } from '../open.js';
5
5
  function eventRecord(hippoRoot, event) {
@@ -32,7 +32,7 @@ export function sqliteConnectorEvents(hippoRoot) {
32
32
  archiveDeletedArtifact: (archive) => archiveArtifact(hippoRoot, archive),
33
33
  slackTeamRoute: (teamId) => slackTeamRoute(hippoRoot, teamId),
34
34
  githubRouting: (query) => githubRouting(hippoRoot, query),
35
- parkDeadLetter: (letter) => (letter.connector === 'slack' ? insertSlackDlq(hippoRoot, letter) : insertDlq(hippoRoot, letter)),
35
+ parkDeadLetter: (letter) => (letter.connector === 'slack' ? insertSlackDlq(hippoRoot, letter) : insertGitHubDlq(hippoRoot, letter)),
36
36
  };
37
37
  }
38
38
  /** The group as a served store answers it: each call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
@@ -2,7 +2,7 @@
2
2
  import { ConflictError, NotFoundError } from '../../core/api-errors.js';
3
3
  import { appendAuditEvent } from '../audit.js';
4
4
  import { isSqliteBusy, withWriteScope } from '../../db/index.js';
5
- import { errorMessage, log } from '../../util/log.js';
5
+ import { errorFields, errorMessage, log } from '../../util/log.js';
6
6
  import { entryAfterOutcome } from '../../core/memory.js';
7
7
  import { archiveRawMemory } from '../raw-archive.js';
8
8
  import { ownScopeTouches } from '../recall-scope.js';
@@ -155,7 +155,7 @@ function cleanArchivedMirrors(db, hippoRoot, id) {
155
155
  removeEntryMirrors(hippoRoot, id);
156
156
  }
157
157
  catch (mirrorErr) {
158
- log.error(`archiveRaw: mirror cleanup failed for ${id} (will retry via reaper on next openHippoDb): ${errorMessage(mirrorErr)}`);
158
+ log.error(`archiveRaw: mirror cleanup failed for ${id} (will retry via reaper on next openHippoDb): ${errorMessage(mirrorErr)}`, errorFields(mirrorErr));
159
159
  return;
160
160
  }
161
161
  try {
@@ -1,5 +1,7 @@
1
- // A thrown error crosses the worker boundary as plain data and arrives as an instance of its class: the server's mappers test `instanceof`, `errcode` and fields.
1
+ // A thrown error crosses the worker boundary as plain data and arrives as an instance
2
+ // of its class: the server's mappers test `instanceof`, `errcode` and fields.
2
3
  import { BadRequestError, ConflictError, ForbiddenError, NotFoundError } from '../../core/api-errors.js';
4
+ import { RawAppendOnlyError } from '../../core/raw-append-only.js';
3
5
  import { IncompatibleBinaryError, StoreBusyError } from '../../db/index.js';
4
6
  import { BodyTimeoutError, BodyTooLargeError, HttpError } from '../../util/http-util.js';
5
7
  import { errorMessage, log } from '../../util/log.js';
@@ -10,7 +12,7 @@ import { OtherStoreFolderError, SqliteBlockedError, StoreNotPortedError } from '
10
12
  const CLASSES = [
11
13
  Error, TypeError, RangeError, SyntaxError, ReferenceError, EvalError, URIError,
12
14
  HttpError, BodyTooLargeError, BodyTimeoutError,
13
- BadRequestError, ForbiddenError, NotFoundError, ConflictError, RejectedValueError, ScopeForbiddenError,
15
+ BadRequestError, ForbiddenError, NotFoundError, ConflictError, RejectedValueError, ScopeForbiddenError, RawAppendOnlyError,
14
16
  SqliteBlockedError, StoreNotPortedError, OtherStoreFolderError,
15
17
  StoreBusyError, IncompatibleBinaryError,
16
18
  ];
@@ -23,6 +23,7 @@ export interface SqliteExecutor {
23
23
  /** Stops the writer thread as a crash would: its running and queued calls reject, and the next write starts a fresh thread. */
24
24
  terminateWriter(): void;
25
25
  }
26
- /** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first call starts the writer for the store's setup; a reader starts at its own first call. */
26
+ /** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first
27
+ * call starts the writer for the store's setup; a reader starts at its own first call. */
27
28
  export declare function createSqliteExecutor(hippoRoot: string, opts?: ExecutorOptions): SqliteExecutor;
28
29
  //# sourceMappingURL=executor.d.ts.map
@@ -279,7 +279,8 @@ class WorkerPool {
279
279
  finish(pending, () => pending.fail(new StoreBusyError(WORKER_GONE, { cause })));
280
280
  }
281
281
  }
282
- /** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first call starts the writer for the store's setup; a reader starts at its own first call. */
282
+ /** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first
283
+ * call starts the writer for the store's setup; a reader starts at its own first call. */
283
284
  export function createSqliteExecutor(hippoRoot, opts = {}) {
284
285
  return new WorkerPool(hippoRoot, opts);
285
286
  }
@@ -8,9 +8,9 @@ export interface SqliteLocal {
8
8
  applyOutcome(outcome: OutcomeWrite, traceId: number): string[];
9
9
  /** applyOutcome on the ids of the last recall, which hippo.db's meta table holds with that recall's trace; answers the ids applied. */
10
10
  applyOutcomeToLastRecall(target: EntryTarget, good: boolean): string[];
11
- /** finishRecall, then the ids this root lacks strengthened under `globalRoot`, then the ids and their trace saved as the last recall.
12
- * A store of another kind keeps no last recall, so its stand-in is its own finishRecall, hence the Promise. */
13
- finishLastRecall(writes: LastRecallWrites, globalRoot: string | undefined): void | Promise<void>;
11
+ /** finishRecall, then the ids this root lacks strengthened under `globalRoot`, then the ids and their trace saved as the last recall;
12
+ * answers the trace id. A store of another kind keeps no last recall, so its stand-in is its own finishRecall, answering null. */
13
+ finishLastRecall(writes: LastRecallWrites, globalRoot: string | undefined): number | null | Promise<number | null>;
14
14
  }
15
15
  export declare function sqliteLocal(hippoRoot: string): SqliteLocal;
16
16
  /** What a served store answers for each write that needs hippo.db's own handle: a refusal. */
@@ -22,6 +22,7 @@ export function sqliteLocal(hippoRoot) {
22
22
  strengthenRetrieved(globalRoot, ids.filter((id) => !strengthened.has(id)), opts);
23
23
  // One write for both keys, so an outcome never pairs these ids with an older trace; a lost trace saves null.
24
24
  saveIndex(hippoRoot, { last_retrieval_ids: [...ids], last_trace_id: traceId === null ? null : String(traceId) });
25
+ return traceId;
25
26
  },
26
27
  };
27
28
  }
@@ -52,21 +52,24 @@ function rowToIncident(row) {
52
52
  createdAt: row.created_at,
53
53
  };
54
54
  }
55
- /** A malformed stored steps value reads back as no steps. */
56
- function parseSteps(raw) {
55
+ /** A malformed stored steps value warns and reads back as no steps. */
56
+ function parseSteps(raw, id) {
57
+ const site = { table: 'processes', id, column: 'steps' };
57
58
  try {
58
59
  const parsed = JSON.parse(raw);
59
60
  if (Array.isArray(parsed) && parsed.every(isJsonString)) {
60
61
  return parsed;
61
62
  }
63
+ warnDamagedColumn(site, 'wrong shape');
62
64
  return [];
63
65
  }
64
66
  catch {
65
67
  // Unreadable steps read back as none instead of failing the process read.
68
+ warnDamagedColumn(site, 'not valid JSON');
66
69
  return [];
67
70
  }
68
71
  }
69
- const rowToProcess = (row) => ({ ...head(row), processName: row.process_name, description: row.description, steps: parseSteps(row.steps), ...versionedTail(row) });
72
+ const rowToProcess = (row) => ({ ...head(row), processName: row.process_name, description: row.description, steps: parseSteps(row.steps, row.id), ...versionedTail(row) });
70
73
  const rowToPolicy = (row) => ({ ...head(row), policyName: row.policy_name, policyText: row.policy_text, validFrom: row.valid_from, validTo: row.valid_to, ...versionedTail(row) });
71
74
  const rowToSkill = (row) => ({ ...head(row), skillName: row.skill_name, instructions: row.instructions, trigger: row.trigger_text, ...versionedTail(row) });
72
75
  const rowToProjectBrief = (row) => ({ ...head(row), repo: row.repo, summary: row.summary, ...versionedTail(row) });
@@ -100,7 +100,8 @@ function closeAt(hippoRoot, tenantId, kind, id, close) {
100
100
  const closed = closeRow(db, tenantId, kind, id, close);
101
101
  if (isObjectRefusal(closed) || !graphType)
102
102
  return closed;
103
- // Each graph write takes its own write lock, so both wait for the commit. The rows go at once because the rebuild queue is keyed by a mirror memory that may be gone.
103
+ // Each graph write takes its own write lock, so both wait for the commit. The rows
104
+ // go at once because the rebuild queue is keyed by a mirror memory that may be gone.
104
105
  removeGraphEntitiesForObject(hippoRoot, tenantId, graphType, closed.id);
105
106
  markGraphDirty(hippoRoot, tenantId, closed.memoryId);
106
107
  return closed;
@@ -177,7 +178,8 @@ function writeObjectRow(db, tenantId, kind, memoryId, save) {
177
178
  function refusalOf(written) {
178
179
  return 'refused' in written;
179
180
  }
180
- /** Until the typed migration has run, a mirror goes in on the flat half-life that migration moves; the flag is read under the save's write lock, so the two cannot interleave. */
181
+ /** Until the typed migration has run, a mirror goes in on the flat half-life that migration
182
+ * moves; the flag is read under the save's write lock, so the two cannot interleave. */
181
183
  function onStoreHalfLife(db, mirror) {
182
184
  if (getMeta(db, TYPED_HALF_LIFE_META_KEY, '') !== '')
183
185
  return mirror;
@@ -1,5 +1,5 @@
1
1
  // hippo.db's half of the Quarantine store group: each method is one call on its own handle.
2
- import { errorMessage, log } from '../../util/log.js';
2
+ import { errorFields, errorMessage, log } from '../../util/log.js';
3
3
  import { readEntry } from '../entry-reads.js';
4
4
  import { writeEntryMirrors } from '../entry-writes.js';
5
5
  import { onHandle } from '../open.js';
@@ -12,7 +12,7 @@ function rewriteMirror(hippoRoot, tenantId, id) {
12
12
  writeEntryMirrors(hippoRoot, restored);
13
13
  }
14
14
  catch (err) {
15
- log.error(`quarantine: mirror rewrite failed for ${id}: ${errorMessage(err)}`);
15
+ log.error(`quarantine: mirror rewrite failed for ${id}: ${errorMessage(err)}`, errorFields(err));
16
16
  }
17
17
  }
18
18
  export function sqliteQuarantine(hippoRoot) {
@@ -1,5 +1,4 @@
1
- import type { ContinuityBlock, HippoStore, RecallWrites, StoreGroups, Sync } from '../port.js';
2
- import { type ContinuityKey } from '../sessions.js';
1
+ import type { HippoStore, RecallWrites, StoreGroups, Sync } from '../port.js';
3
2
  /** The store a request runs on: the served one, else hippo.db under its root, as the CLI and SDK callers have it. */
4
3
  export declare function storeFor(ctx: {
5
4
  readonly hippoRoot: string;
@@ -13,8 +12,6 @@ export type SqliteSyncStore = Sync<Omit<HippoStore, AsyncOnly>>;
13
12
  export declare function sqliteSyncStore(hippoRoot: string): SqliteSyncStore & Sync<Omit<StoreGroups, AsyncOnly>>;
14
13
  /** `sqliteSyncStore` as a served store: each method runs at once and answers through a Promise, so a throw rejects as another store's would. */
15
14
  export declare function sqliteStore(hippoRoot: string): HippoStore & StoreGroups;
16
- /** sqliteStore's continuity read, for the synchronous recall that cannot await the port. */
17
- export declare function continuityAt(hippoRoot: string, tenantId: string, eventLimit: number, key: ContinuityKey | null): ContinuityBlock;
18
15
  /** What a finished recall wrote after its audit rows: the trace's id, null when none was asked or its write failed, and the ids strengthened. */
19
16
  interface RecallFinish {
20
17
  readonly traceId: number | null;
@@ -4,7 +4,6 @@ import { listApiKeyRows, readApiKeyRecord } from '../auth.js';
4
4
  import { existsSync } from 'node:fs';
5
5
  import { appendAuditEvent, listAuditEventsAfter, queryAuditEvents } from '../audit.js';
6
6
  import { getHippoDbPath, withWriteScope } from '../../db/index.js';
7
- import { loadStoredVectorViews } from '../embeddings/index.js';
8
7
  import { activeGoalsWithPolicies, localGoalRecallRows, writeGoalRecallLog } from '../goals.js';
9
8
  import { planningFallacyEvidenceAt } from '../planning-fallacy-evidence.js';
10
9
  import { writeRecallTrace } from '../recall-trace.js';
@@ -28,7 +27,7 @@ import { createKeyAt, createSelfKeyAt } from '../key-writes.js';
28
27
  import { onHandle } from '../open.js';
29
28
  import { loadRecallSearchEntries } from '../search-rows.js';
30
29
  import { listSessionEvents, loadActiveTaskSnapshot } from '../sessions.js';
31
- import { entriesWithoutVectorAt, writeVectorsAt } from '../vector-writes.js';
30
+ import { entriesWithoutVectorAt, loadStoredVectorViews, writeVectorsAt } from '../vector-index.js';
32
31
  /** The store a request runs on: the served one, else hippo.db under its root, as the CLI and SDK callers have it. */
33
32
  export function storeFor(ctx) {
34
33
  return ctx.store ?? sqliteStore(ctx.hippoRoot);
@@ -266,7 +265,7 @@ function sqliteKeyAudit(hippoRoot) {
266
265
  };
267
266
  }
268
267
  /** sqliteStore's continuity read, for the synchronous recall that cannot await the port. */
269
- export function continuityAt(hippoRoot, tenantId, eventLimit, key) {
268
+ function continuityAt(hippoRoot, tenantId, eventLimit, key) {
270
269
  const activeSnapshot = loadActiveTaskSnapshot(hippoRoot, tenantId, key ?? undefined);
271
270
  const sessionId = activeSnapshot?.session_id ?? undefined;
272
271
  return {
@@ -1,12 +1,12 @@
1
1
  // hippo.db's vector reads. Async only: the nearest-row scan yields between chunks, so a store worker awaits these where it runs every other method to its end.
2
2
  import { loadPhysicsState } from '../../db/physics-state.js';
3
- import { embeddingIndexStateAt, loadStoredVectors } from '../embeddings/index.js';
4
3
  import { onHandle } from '../open.js';
5
4
  import { loadVectorCandidateEntries } from '../search-rows.js';
5
+ import { loadStoredVectors, storedIndexState } from '../vector-index.js';
6
6
  export function sqliteVectorReads(hippoRoot) {
7
7
  return {
8
8
  async embeddingIndexState() {
9
- return embeddingIndexStateAt(hippoRoot);
9
+ return storedIndexState(hippoRoot);
10
10
  },
11
11
  async storedVectors(ids) {
12
12
  return loadStoredVectors(hippoRoot, ids);
@@ -1,6 +1,6 @@
1
1
  import { auditWriteFailureCount } from '../audit.js';
2
2
  import { RequestStores } from '../../db/index.js';
3
- import { loadStoredVectorViews } from '../embeddings/index.js';
3
+ import { loadStoredVectorViews } from '../vector-index.js';
4
4
  import { requestScopes } from '../../util/request-scope.js';
5
5
  import { initStore } from '../open.js';
6
6
  import { watchCommits } from './commit-watch.js';
@@ -7,8 +7,8 @@ export type OpPlace = OpMode | 'server';
7
7
  export type OpPlaces<G> = {
8
8
  readonly [M in keyof G]: OpPlace;
9
9
  };
10
- /** The store methods that answer from a worker, the base ones under `base`. Tagged by effect, not by name: predictionBaserate appends an audit row and
11
- * bumpRecallStats rewrites stats.json, so both are writes. A read that opens through `openStore` is a read: the writer runs that open's setup before any reader serves. */
10
+ /** Store methods answered by a worker, base ones under `base`. Tagged by effect, not name: predictionBaserate (audit row) and bumpRecallStats
11
+ * (stats.json) are writes. A read that opens through `openStore` is a read: the writer runs that open's setup before any reader serves. */
12
12
  export declare const WORKER_OPS: {
13
13
  readonly base: {
14
14
  readonly findApiKey: "read";
@@ -82,6 +82,17 @@ export declare const WORKER_OPS: {
82
82
  readonly graphReads: {
83
83
  readonly graphRows: "read";
84
84
  };
85
+ readonly objects: {
86
+ readonly listObjects: "read";
87
+ readonly objectById: "read";
88
+ readonly closeObject: "write";
89
+ readonly saveObject: "write";
90
+ readonly openIncident: "write";
91
+ readonly resolveIncident: "write";
92
+ readonly policiesInForce: "read";
93
+ readonly activeSkillsByName: "read";
94
+ readonly briefReceipts: "read";
95
+ };
85
96
  readonly readiness: {
86
97
  readonly ping: "read";
87
98
  };
@@ -1,5 +1,5 @@
1
- /** The store methods that answer from a worker, the base ones under `base`. Tagged by effect, not by name: predictionBaserate appends an audit row and
2
- * bumpRecallStats rewrites stats.json, so both are writes. A read that opens through `openStore` is a read: the writer runs that open's setup before any reader serves. */
1
+ /** Store methods answered by a worker, base ones under `base`. Tagged by effect, not name: predictionBaserate (audit row) and bumpRecallStats
2
+ * (stats.json) are writes. A read that opens through `openStore` is a read: the writer runs that open's setup before any reader serves. */
3
3
  export const WORKER_OPS = {
4
4
  base: {
5
5
  findApiKey: 'read',
@@ -73,6 +73,17 @@ export const WORKER_OPS = {
73
73
  graphReads: {
74
74
  graphRows: 'read',
75
75
  },
76
+ objects: {
77
+ listObjects: 'read',
78
+ objectById: 'read',
79
+ closeObject: 'write',
80
+ saveObject: 'write',
81
+ openIncident: 'write',
82
+ resolveIncident: 'write',
83
+ policiesInForce: 'read',
84
+ activeSkillsByName: 'read',
85
+ briefReceipts: 'read',
86
+ },
76
87
  readiness: {
77
88
  ping: 'read',
78
89
  },
@@ -35,7 +35,9 @@ function vectorGroups(executor, inProcess) {
35
35
  storedVectors: async (ids) => (ids.length === 0 ? new Map() : vectorCopiesOf(await pack('vectors.storedVectors', ids, vectors.storedVectors))),
36
36
  },
37
37
  vectorViews: {
38
- storedVectorViews: async (ids) => (ids.length === 0 ? new Map() : vectorViewsOf(await pack('vectorViews.storedVectorViews', ids, vectorViews.storedVectorViews))),
38
+ storedVectorViews: async (ids) => (ids.length === 0
39
+ ? new Map()
40
+ : vectorViewsOf(await pack('vectorViews.storedVectorViews', ids, vectorViews.storedVectorViews))),
39
41
  },
40
42
  };
41
43
  }
@@ -52,7 +54,7 @@ function probing(hippoRoot, served) {
52
54
  * `executor` defaults to threads of the store's own, with the server's lock wait. */
53
55
  export function workerSqliteStore(hippoRoot, executor = createSqliteExecutor(hippoRoot)) {
54
56
  const inProcess = sqliteStore(hippoRoot);
55
- const { keyAudit, keyWrites, vectorWrites, entryWrites, contextReads, predictions, dagReads, auditLog, quarantine, graphReads } = WORKER_OPS;
57
+ const { keyAudit, keyWrites, vectorWrites, entryWrites, contextReads, predictions, dagReads, auditLog, quarantine, graphReads, objects } = WORKER_OPS;
56
58
  const store = {
57
59
  ...inProcess,
58
60
  ...onWorkers(executor, 'base', WORKER_OPS.base, inProcess),
@@ -67,6 +69,7 @@ export function workerSqliteStore(hippoRoot, executor = createSqliteExecutor(hip
67
69
  auditLog: onWorkers(executor, 'auditLog', auditLog, inProcess.auditLog),
68
70
  quarantine: onWorkers(executor, 'quarantine', quarantine, inProcess.quarantine),
69
71
  graphReads: onWorkers(executor, 'graphReads', graphReads, inProcess.graphReads),
72
+ objects: onWorkers(executor, 'objects', objects, inProcess.objects),
70
73
  readiness: probing(hippoRoot, onWorkers(executor, 'readiness', WORKER_OPS.readiness, inProcess.readiness)),
71
74
  close: () => executor.close(),
72
75
  };