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
@@ -4,16 +4,10 @@ import type { HippoIndex, LegacyStats } from './rows.js';
4
4
  export declare function loadIndex(hippoRoot: string): HippoIndex;
5
5
  /** The last recall's ids and its trace alone, for a caller that needs no index entry. */
6
6
  export declare function loadLastRecall(hippoRoot: string): Pick<HippoIndex, 'last_retrieval_ids' | 'last_trace_id'>;
7
- /**
8
- * Persist mutable index metadata. Entry rows themselves are derived from SQLite.
9
- *
10
- * `last_retrieval_ids` and `last_trace_id` commit in one transaction: callers fold a fresh trace id
11
- * into the index and rely on both keys moving together. index.json is left to `rebuildIndex`.
12
- */
7
+ /** Persist mutable index metadata (entry rows are derived from SQLite); `last_retrieval_ids` and `last_trace_id` commit in one transaction, as callers
8
+ * rely on both moving together. index.json is left to `rebuildIndex`. */
13
9
  export declare function saveIndex(hippoRoot: string, index: Pick<HippoIndex, 'last_retrieval_ids' | 'last_trace_id'>): void;
14
- /**
15
- * Rebuild mirrors from SQLite, importing any legacy markdown files not already present.
16
- */
10
+ /** Rebuild mirrors from SQLite, importing any legacy markdown files not already present. */
17
11
  export declare function rebuildIndex(hippoRoot: string): HippoIndex;
18
12
  export declare function updateStats(hippoRoot: string, delta: {
19
13
  remembered?: number;
@@ -32,9 +26,7 @@ export declare function appendConsolidationRun(hippoRoot: string, run: {
32
26
  }): void;
33
27
  /** Rows a tenant created since the last sleep (runs are host-wide), looking back at most 24 hours. */
34
28
  export declare function countCreatedSinceLastSleep(hippoRoot: string, tenantId: string, now?: Date): number;
35
- /**
36
- * Session decay context: provides the data needed for session-based and adaptive decay.
37
- */
29
+ /** Session decay context: the data needed for session-based and adaptive decay. */
38
30
  export interface SessionDecayContext {
39
31
  /** Total number of sleep (consolidation) cycles completed. */
40
32
  sleepCount: number;
@@ -43,13 +35,8 @@ export interface SessionDecayContext {
43
35
  }
44
36
  /** Timestamp of the latest consolidation run, or undefined when there is none. */
45
37
  export declare function lastConsolidationAt(db: DatabaseSyncLike): string | undefined;
46
- /**
47
- * Load the session decay context from the store.
48
- * Uses consolidation_runs timestamps to compute session intervals.
49
- */
38
+ /** Load the session decay context; session intervals come from consolidation_runs timestamps. */
50
39
  export declare function loadSessionDecayContext(hippoRoot: string): SessionDecayContext;
51
- /**
52
- * Increment the sleep counter. Called after each consolidation run.
53
- */
40
+ /** Increment the sleep counter after each consolidation run. */
54
41
  export declare function incrementSleepCount(hippoRoot: string): void;
55
42
  //# sourceMappingURL=index-and-stats.d.ts.map
@@ -1,55 +1,36 @@
1
- import { closeHippoDb, withWriteScope, setMeta, isSqliteBusy, pruneConsolidationRuns, getMeta } from '../db/index.js';
1
+ import { withWriteScope, setMeta, isSqliteBusy, pruneConsolidationRuns, getMeta } from '../db/index.js';
2
2
  import { RejectedValueError } from './rejection.js';
3
3
  import { log } from '../util/log.js';
4
4
  import { audit } from './audit-event.js';
5
5
  import { stampOriginProjectForImport, upsertEntryRow } from './entry-row.js';
6
6
  import { buildIndexFromDb, readLastRecall, syncMirrorFiles, writeIndexMirror, writeStatsMirror, buildStatsFromDb } from './mirrors.js';
7
- import { openStore, loadLegacyEntriesFromMarkdown } from './open.js';
7
+ import { onHandle, openStore, loadLegacyEntriesFromMarkdown } from './open.js';
8
8
  import { DAY_MS } from '../util/time.js';
9
9
  /** Load the derived index from SQLite. Read-only: index.json is only ever written by `rebuildIndex`. */
10
10
  export function loadIndex(hippoRoot) {
11
- const db = openStore(hippoRoot);
12
- try {
11
+ return onHandle(hippoRoot, (db) => {
13
12
  return buildIndexFromDb(db);
14
- }
15
- finally {
16
- closeHippoDb(db);
17
- }
13
+ }, openStore);
18
14
  }
19
15
  /** The last recall's ids and its trace alone, for a caller that needs no index entry. */
20
16
  export function loadLastRecall(hippoRoot) {
21
- const db = openStore(hippoRoot);
22
- try {
17
+ return onHandle(hippoRoot, (db) => {
23
18
  return readLastRecall(db);
24
- }
25
- finally {
26
- closeHippoDb(db);
27
- }
19
+ }, openStore);
28
20
  }
29
- /**
30
- * Persist mutable index metadata. Entry rows themselves are derived from SQLite.
31
- *
32
- * `last_retrieval_ids` and `last_trace_id` commit in one transaction: callers fold a fresh trace id
33
- * into the index and rely on both keys moving together. index.json is left to `rebuildIndex`.
34
- */
21
+ /** Persist mutable index metadata (entry rows are derived from SQLite); `last_retrieval_ids` and `last_trace_id` commit in one transaction, as callers
22
+ * rely on both moving together. index.json is left to `rebuildIndex`. */
35
23
  export function saveIndex(hippoRoot, index) {
36
- const db = openStore(hippoRoot);
37
- try {
24
+ onHandle(hippoRoot, (db) => {
38
25
  withWriteScope(db, 'save_index', () => {
39
26
  setMeta(db, 'last_retrieval_ids', JSON.stringify(index.last_retrieval_ids ?? []));
40
27
  setMeta(db, 'last_trace_id', index.last_trace_id ?? '');
41
28
  });
42
- }
43
- finally {
44
- closeHippoDb(db);
45
- }
29
+ }, openStore);
46
30
  }
47
- /**
48
- * Rebuild mirrors from SQLite, importing any legacy markdown files not already present.
49
- */
31
+ /** Rebuild mirrors from SQLite, importing any legacy markdown files not already present. */
50
32
  export function rebuildIndex(hippoRoot) {
51
- const db = openStore(hippoRoot);
52
- try {
33
+ return onHandle(hippoRoot, (db) => {
53
34
  // SAFETY: rows' shape matches the single `id` column selected above.
54
35
  const existingIds = new Set(db.prepare(`SELECT id FROM memories`).all().map((row) => row.id));
55
36
  const legacyEntries = loadLegacyEntriesFromMarkdown(hippoRoot).filter((entry) => !existingIds.has(entry.id));
@@ -67,7 +48,12 @@ export function rebuildIndex(hippoRoot) {
67
48
  catch (err) {
68
49
  if (err instanceof RejectedValueError) {
69
50
  rejectedCount++;
70
- audit(db, 'reject_refusal', { targetId: err.entryId, metadata: { digest: err.digest, reason: err.reason }, actor: 'cli', tenantId: err.tenantId });
51
+ audit(db, 'reject_refusal', {
52
+ targetId: err.entryId,
53
+ metadata: { digest: err.digest, reason: err.reason },
54
+ actor: 'cli',
55
+ tenantId: err.tenantId
56
+ });
71
57
  continue;
72
58
  }
73
59
  throw err;
@@ -82,25 +68,16 @@ export function rebuildIndex(hippoRoot) {
82
68
  const index = buildIndexFromDb(db);
83
69
  writeIndexMirror(hippoRoot, index);
84
70
  return index;
85
- }
86
- finally {
87
- closeHippoDb(db);
88
- }
71
+ }, openStore);
89
72
  }
90
73
  export function updateStats(hippoRoot, delta) {
91
- const db = openStore(hippoRoot);
92
- try {
74
+ onHandle(hippoRoot, (db) => {
93
75
  updateStatsOn(db, hippoRoot, delta);
94
- }
95
- finally {
96
- closeHippoDb(db);
97
- }
76
+ }, openStore);
98
77
  }
99
78
  /** updateStats on the caller's open store, so a loop of writes opens the store once. */
100
79
  export function updateStatsOn(db, hippoRoot, delta) {
101
- // One atomic statement per counter, and only for counters the caller
102
- // named: the read-modify-write this replaces both lost increments to a
103
- // concurrent writer and stamped stale values over the untouched two.
80
+ // One atomic statement per named counter: a read-modify-write loses concurrent increments and stamps stale values over the untouched two.
104
81
  const increments = [
105
82
  ['total_remembered', delta.remembered ?? 0],
106
83
  ['total_recalled', delta.recalled ?? 0],
@@ -129,37 +106,25 @@ export function updateStatsUnlessBusy(hippoRoot, delta, committed) {
129
106
  }
130
107
  }
131
108
  export function loadStats(hippoRoot) {
132
- const db = openStore(hippoRoot);
133
- try {
109
+ return onHandle(hippoRoot, (db) => {
134
110
  return buildStatsFromDb(db);
135
- }
136
- finally {
137
- closeHippoDb(db);
138
- }
111
+ }, openStore);
139
112
  }
140
113
  export function appendConsolidationRun(hippoRoot, run) {
141
- const db = openStore(hippoRoot);
142
- try {
114
+ onHandle(hippoRoot, (db) => {
143
115
  db.prepare(`INSERT INTO consolidation_runs(timestamp, decayed, merged, removed) VALUES (?, ?, ?, ?)`).run(run.timestamp, run.decayed, run.merged, run.removed);
144
116
  pruneConsolidationRuns(db, 50);
145
117
  writeStatsMirror(hippoRoot, buildStatsFromDb(db));
146
- }
147
- finally {
148
- closeHippoDb(db);
149
- }
118
+ }, openStore);
150
119
  }
151
120
  /** Rows a tenant created since the last sleep (runs are host-wide), looking back at most 24 hours. */
152
121
  export function countCreatedSinceLastSleep(hippoRoot, tenantId, now = new Date()) {
153
- const db = openStore(hippoRoot);
154
- try {
122
+ return onHandle(hippoRoot, (db) => {
155
123
  const dayAgo = new Date(now.getTime() - DAY_MS).toISOString();
156
124
  const row = db.prepare(`SELECT COUNT(*) AS n FROM memories WHERE tenant_id = ?
157
125
  AND created > MAX(?, COALESCE((SELECT MAX(timestamp) FROM consolidation_runs), ''))`).get(tenantId, dayAgo);
158
126
  return row.n;
159
- }
160
- finally {
161
- closeHippoDb(db);
162
- }
127
+ }, openStore);
163
128
  }
164
129
  /** Timestamp of the latest consolidation run, or undefined when there is none. */
165
130
  export function lastConsolidationAt(db) {
@@ -167,13 +132,9 @@ export function lastConsolidationAt(db) {
167
132
  const row = db.prepare(`SELECT timestamp FROM consolidation_runs ORDER BY timestamp DESC, id DESC LIMIT 1`).get();
168
133
  return row?.timestamp;
169
134
  }
170
- /**
171
- * Load the session decay context from the store.
172
- * Uses consolidation_runs timestamps to compute session intervals.
173
- */
135
+ /** Load the session decay context; session intervals come from consolidation_runs timestamps. */
174
136
  export function loadSessionDecayContext(hippoRoot) {
175
- const db = openStore(hippoRoot);
176
- try {
137
+ return onHandle(hippoRoot, (db) => {
177
138
  // Get recent consolidation timestamps (last 20)
178
139
  // SAFETY: rows' shape matches the single `timestamp` column above.
179
140
  const rows = db.prepare(`SELECT timestamp FROM consolidation_runs ORDER BY timestamp DESC, id DESC LIMIT 20`).all();
@@ -190,22 +151,13 @@ export function loadSessionDecayContext(hippoRoot) {
190
151
  const avgMs = totalInterval / (timestamps.length - 1);
191
152
  const avgDays = avgMs / DAY_MS;
192
153
  return { sleepCount, avgSessionIntervalDays: Math.max(0, avgDays) };
193
- }
194
- finally {
195
- closeHippoDb(db);
196
- }
154
+ }, openStore);
197
155
  }
198
- /**
199
- * Increment the sleep counter. Called after each consolidation run.
200
- */
156
+ /** Increment the sleep counter after each consolidation run. */
201
157
  export function incrementSleepCount(hippoRoot) {
202
- const db = openStore(hippoRoot);
203
- try {
158
+ onHandle(hippoRoot, (db) => {
204
159
  const current = Number(getMeta(db, 'sleep_count', '0')) || 0;
205
160
  setMeta(db, 'sleep_count', String(current + 1));
206
- }
207
- finally {
208
- closeHippoDb(db);
209
- }
161
+ }, openStore);
210
162
  }
211
163
  //# sourceMappingURL=index-and-stats.js.map
@@ -1,10 +1,6 @@
1
1
  import { type MemoryEntry } from '../core/memory.js';
2
- /**
3
- * Serialize a MemoryEntry to markdown with YAML frontmatter.
4
- */
2
+ /** Serialize a MemoryEntry to markdown with YAML frontmatter. */
5
3
  export declare function serializeEntry(entry: MemoryEntry): string;
6
- /**
7
- * Deserialize a markdown file to a MemoryEntry.
8
- */
4
+ /** Deserialize a markdown file to a MemoryEntry. */
9
5
  export declare function deserializeEntry(raw: string): MemoryEntry | null;
10
6
  //# sourceMappingURL=markdown.d.ts.map
@@ -1,10 +1,9 @@
1
+ import { DEFAULT_TENANT_ID } from '../util/env.js';
1
2
  import { FALLBACK_HALF_LIFE_DAYS, DEFAULT_SCHEMA_FIT } from '../core/memory.js';
2
3
  import { dumpFrontmatter, parseFrontmatter } from './yaml.js';
3
- /**
4
- * Serialize a MemoryEntry to markdown with YAML frontmatter.
5
- */
6
- export function serializeEntry(entry) {
7
- const frontmatter = {
4
+ /** The fields every mirror file carries; serializeEntry adds the optional ones. */
5
+ function entryFrontmatter(entry) {
6
+ return {
8
7
  id: entry.id,
9
8
  created: entry.created,
10
9
  last_retrieved: entry.last_retrieved,
@@ -30,11 +29,21 @@ export function serializeEntry(entry) {
30
29
  scope: entry.scope ?? null,
31
30
  owner: entry.owner ?? null,
32
31
  artifact_ref: entry.artifact_ref ?? null,
32
+ // A rebuild from these files must keep supersession and the DAG; deserializeEntry reads all five.
33
+ valid_from: entry.valid_from,
34
+ superseded_by: entry.superseded_by,
35
+ extracted_from: entry.extracted_from,
36
+ dag_level: entry.dag_level,
37
+ dag_parent_id: entry.dag_parent_id,
33
38
  };
39
+ }
40
+ /** Serialize a MemoryEntry to markdown with YAML frontmatter. */
41
+ export function serializeEntry(entry) {
42
+ const frontmatter = entryFrontmatter(entry);
34
43
  // Emit tenant_id only when not 'default' to keep diffs clean for the dominant
35
44
  // single-tenant case (mirrors the plan's task 7 guidance).
36
- const tenantId = entry.tenantId ?? 'default';
37
- if (tenantId !== 'default') {
45
+ const tenantId = entry.tenantId ?? DEFAULT_TENANT_ID;
46
+ if (tenantId !== DEFAULT_TENANT_ID) {
38
47
  frontmatter['tenant_id'] = tenantId;
39
48
  }
40
49
  // v39: '' (user-global) and null (unknown, hidden by default) must both round-trip;
@@ -42,25 +51,17 @@ export function serializeEntry(entry) {
42
51
  if (entry.origin_project !== undefined) {
43
52
  frontmatter['origin_project'] = entry.origin_project;
44
53
  }
45
- // Spread into a fresh object literal: dumpFrontmatter's Record<string,
46
- // YamlValue> parameter needs an index signature, which a named interface
47
- // reference (EntryFrontmatterFields) doesn't structurally provide even
48
- // though every property's value type already matches.
54
+ // Spread into a fresh literal: dumpFrontmatter's Record<string, YamlValue> needs an index signature, which the named interface does not structurally provide.
49
55
  const fm = dumpFrontmatter({ ...frontmatter });
50
56
  return `${fm}\n\n${entry.content}\n`;
51
57
  }
52
- /**
53
- * Deserialize a markdown file to a MemoryEntry.
54
- */
58
+ /** Deserialize a markdown file to a MemoryEntry. */
55
59
  export function deserializeEntry(raw) {
56
60
  const { data, content } = parseFrontmatter(raw);
57
61
  if (!data['id'] || !data['layer'])
58
62
  return null;
59
- // SAFETY: every `as X` below narrows a raw YAML frontmatter field to an
60
- // enum/union member of MemoryEntry; frontmatter is only ever written by
61
- // serializeEntry (whose own fields are typed), so out-of-range values here
62
- // would indicate hand-edited files, which this parser is not required to
63
- // reject — matches the pre-existing permissive-parse behavior.
63
+ // SAFETY: each `as X` narrows a raw YAML field to a MemoryEntry union member; frontmatter is only written by serializeEntry,
64
+ // so out-of-range values mean hand-edited files, which this parser may accept (permissive parse).
64
65
  return {
65
66
  id: String(data['id']),
66
67
  created: String(data['created'] ?? new Date().toISOString()),
@@ -97,7 +98,7 @@ export function deserializeEntry(raw) {
97
98
  scope: data['scope'] === null || data['scope'] === undefined ? null : String(data['scope']),
98
99
  owner: data['owner'] === null || data['owner'] === undefined ? null : String(data['owner']),
99
100
  artifact_ref: data['artifact_ref'] === null || data['artifact_ref'] === undefined ? null : String(data['artifact_ref']),
100
- tenantId: data['tenant_id'] === null || data['tenant_id'] === undefined ? 'default' : String(data['tenant_id']),
101
+ tenantId: data['tenant_id'] === null || data['tenant_id'] === undefined ? DEFAULT_TENANT_ID : String(data['tenant_id']),
101
102
  origin_project: !('origin_project' in data) ? undefined : data['origin_project'] === null ? null : String(data['origin_project']),
102
103
  };
103
104
  }
@@ -9,12 +9,8 @@ export declare function removeActiveTaskMirror(hippoRoot: string, tenantId: stri
9
9
  export declare function writeRecentSessionMirror(hippoRoot: string, tenantId: string, events: SessionEvent[]): void;
10
10
  export declare function writeMarkdownMirror(hippoRoot: string, entry: MemoryEntry): void;
11
11
  export declare function removeEntryMirrors(hippoRoot: string, id: string): void;
12
- /**
13
- * Best-effort mirror purge. Retries the unlink once (most failures are transient locks); the reaper only
14
- * scans `raw_archive`, so a non-raw id's second failure logs the leftover path(s) to delete by hand.
15
- *
16
- * Returns true if the mirror ended up purged (first or second attempt).
17
- */
12
+ /** Best-effort mirror purge: retries the unlink once (most failures are transient locks); the reaper only scans `raw_archive`,
13
+ * so a non-raw id's second failure logs the leftover path(s) to delete by hand. Returns true if the mirror ended up purged. */
18
14
  export declare function purgeMirrorBestEffort(hippoRoot: string, id: string, isRaw: boolean, logPrefix: string): boolean;
19
15
  /** Derive the current `HippoIndex` from SQLite. Exported for `rebuildIndex`
20
16
  * (the only index.json writer) and the longmemeval benchmark. */
@@ -1,10 +1,11 @@
1
+ import { DEFAULT_TENANT_ID } from '../util/env.js';
1
2
  import * as fs from 'fs';
2
3
  import * as path from 'path';
3
4
  import { Layer } from '../core/memory.js';
4
5
  import { dumpFrontmatter } from './yaml.js';
5
6
  import { getMeta } from '../db/index.js';
6
7
  import { oncePerStore } from '../db/connect.js';
7
- import { errorMessage, log } from '../util/log.js';
8
+ import { errorFields, errorMessage, log } from '../util/log.js';
8
9
  import { parseJsonArray, INDEX_VERSION, parseLastTraceId, MEMORY_SELECT_COLUMNS, rowToEntry, rowToMemoryConflict, } from './rows.js';
9
10
  import { serializeEntry } from './markdown.js';
10
11
  const SCORE_DECIMALS = 3;
@@ -21,16 +22,14 @@ export function ensureMirrorDirectories(hippoRoot) {
21
22
  }
22
23
  });
23
24
  }
24
- // Tenant-scoped mirror file paths. The single-tenant 'default' deployment
25
- // keeps the original `active-task.md` / `recent-session.md` filenames for
26
- // on-disk back-compat; multi-tenant deployments get a `.<tenantId>` suffix
27
- // so tenant B saving cannot overwrite tenant A's mirror file.
25
+ // Tenant-scoped mirror paths: the 'default' tenant keeps the original `active-task.md` / `recent-session.md` names;
26
+ // other tenants get a `.<tenantId>` suffix so one cannot overwrite another's mirror.
28
27
  function activeTaskMirrorPath(hippoRoot, tenantId) {
29
- const file = tenantId === 'default' ? 'active-task.md' : `active-task.${tenantId}.md`;
28
+ const file = tenantId === DEFAULT_TENANT_ID ? 'active-task.md' : `active-task.${tenantId}.md`;
30
29
  return path.join(hippoRoot, 'buffer', file);
31
30
  }
32
31
  function recentSessionMirrorPath(hippoRoot, tenantId) {
33
- const file = tenantId === 'default' ? 'recent-session.md' : `recent-session.${tenantId}.md`;
32
+ const file = tenantId === DEFAULT_TENANT_ID ? 'recent-session.md' : `recent-session.${tenantId}.md`;
34
33
  return path.join(hippoRoot, 'buffer', file);
35
34
  }
36
35
  export function writeActiveTaskMirror(hippoRoot, tenantId, snapshot) {
@@ -155,22 +154,15 @@ export function removeEntryMirrors(hippoRoot, id) {
155
154
  }
156
155
  }
157
156
  }
158
- /**
159
- * Mirror paths for `id` still on disk, walked like `removeEntryMirrors`, so a failed purge
160
- * with no reaper to retry it can name the stuck file.
161
- */
157
+ /** Mirror paths for `id` still on disk, walked like `removeEntryMirrors`, so a failed purge with no reaper to retry it can name the stuck file. */
162
158
  function getExistingEntryMirrorPaths(hippoRoot, id) {
163
159
  // Layer list kept in lockstep with removeEntryMirrors.
164
160
  return [Layer.Buffer, Layer.Episodic, Layer.Semantic, Layer.Trace]
165
161
  .map((layer) => path.join(layerDir(hippoRoot, layer), `${id}.md`))
166
162
  .filter((file) => fs.existsSync(file));
167
163
  }
168
- /**
169
- * Best-effort mirror purge. Retries the unlink once (most failures are transient locks); the reaper only
170
- * scans `raw_archive`, so a non-raw id's second failure logs the leftover path(s) to delete by hand.
171
- *
172
- * Returns true if the mirror ended up purged (first or second attempt).
173
- */
164
+ /** Best-effort mirror purge: retries the unlink once (most failures are transient locks); the reaper only scans `raw_archive`,
165
+ * so a non-raw id's second failure logs the leftover path(s) to delete by hand. Returns true if the mirror ended up purged. */
174
166
  export function purgeMirrorBestEffort(hippoRoot, id, isRaw, logPrefix) {
175
167
  try {
176
168
  removeEntryMirrors(hippoRoot, id);
@@ -184,13 +176,13 @@ export function purgeMirrorBestEffort(hippoRoot, id, isRaw, logPrefix) {
184
176
  catch (secondErr) {
185
177
  const msg = errorMessage(secondErr);
186
178
  if (isRaw) {
187
- log.error(`${logPrefix}: mirror cleanup failed for ${id} (will retry via reaper on next open): ${msg}`);
179
+ log.error(`${logPrefix}: mirror cleanup failed for ${id} (will retry via reaper on next open): ${msg}`, errorFields(secondErr));
188
180
  }
189
181
  else {
190
182
  const leftover = getExistingEntryMirrorPaths(hippoRoot, id);
191
183
  const pathsNote = leftover.length > 0 ? leftover.join(', ') : `${id}.md (path unresolved)`;
192
184
  log.error(`${logPrefix}: mirror cleanup failed for ${id} - no automatic retry exists for this file, ` +
193
- `delete it manually: ${pathsNote} (${msg})`);
185
+ `delete it manually: ${pathsNote} (${msg})`, errorFields(secondErr));
194
186
  }
195
187
  return false;
196
188
  }
@@ -211,7 +203,7 @@ export function buildIndexFromDb(db) {
211
203
  file: path.join(layer, `${row.id}.md`),
212
204
  layer,
213
205
  strength: Number(row.strength ?? 0),
214
- tags: parseJsonArray(row.tags_json),
206
+ tags: parseJsonArray(row.tags_json, { table: 'memories', id: row.id, column: 'tags_json' }),
215
207
  created: row.created,
216
208
  last_retrieved: row.last_retrieved,
217
209
  pinned: Boolean(row.pinned),
@@ -221,13 +213,12 @@ export function buildIndexFromDb(db) {
221
213
  }
222
214
  /** The last recall's ids and its trace, the two meta keys saveIndex writes together. */
223
215
  export function readLastRecall(db) {
224
- // Read both lockstep keys in ONE statement: two autocommit SELECTs could straddle a concurrent
225
- // saveIndex and hand back a mismatched last_retrieval_ids / last_trace_id pair.
216
+ // Read both lockstep keys in ONE statement: two autocommit SELECTs could straddle a concurrent saveIndex and return a mismatched pair.
226
217
  // SAFETY: lockstepRows' shape matches the key/value columns named above.
227
218
  const lockstepRows = db.prepare(`SELECT key, value FROM meta WHERE key IN ('last_retrieval_ids', 'last_trace_id')`).all();
228
219
  const lockstep = new Map(lockstepRows.map((r) => [r.key, r.value]));
229
220
  return {
230
- last_retrieval_ids: parseJsonArray(lockstep.get('last_retrieval_ids') ?? '[]'),
221
+ last_retrieval_ids: parseJsonArray(lockstep.get('last_retrieval_ids') ?? '[]', { table: 'meta', id: 'last_retrieval_ids', column: 'value' }),
231
222
  last_trace_id: parseLastTraceId(lockstep.get('last_trace_id') ?? ''),
232
223
  };
233
224
  }
@@ -70,12 +70,8 @@ export const HALF_LIFE_BASE_META_KEY = 'default_half_life_base';
70
70
  export const TYPED_HALF_LIFE_META_KEY = 'typed_half_life_on_default';
71
71
  /** The flat half-life the decision, incident and other object writers gave their memories before they took the default. */
72
72
  export const LEGACY_TYPED_HALF_LIFE = 90;
73
- /**
74
- * A store with no memories starts on the current default half-life base, so
75
- * `hippo sleep` never migrates it. A store that already holds memories and
76
- * no recorded base predates the record, and keeps reading as the legacy
77
- * 7-day base until sleep migrates it.
78
- */
73
+ /** A store with no memories starts on the current default half-life base so `hippo sleep` never migrates it; one that holds memories but no recorded base
74
+ * predates the record and keeps the legacy 7-day base until sleep migrates it. */
79
75
  function recordHalfLifeBaseForNewStore(db) {
80
76
  if (getMeta(db, HALF_LIFE_BASE_META_KEY, '') !== '')
81
77
  return;
@@ -170,9 +166,8 @@ function loadLegacyIndexFile(hippoRoot) {
170
166
  return { version: 1, entries: {}, last_retrieval_ids: [], last_trace_id: null };
171
167
  }
172
168
  try {
173
- // SAFETY: index.json is only ever written by writeIndexMirror below,
174
- // which always serializes a HippoIndex; a hand-edited or corrupted file
175
- // that violates the shape falls through to the catch block's fallback.
169
+ // SAFETY: index.json is only written by writeIndexMirror below, which serializes a HippoIndex;
170
+ // a hand-edited file that violates the shape falls through to the catch block's fallback.
176
171
  return JSON.parse(fs.readFileSync(indexPath, 'utf8'));
177
172
  }
178
173
  catch (err) {
@@ -191,10 +186,8 @@ function loadLegacyStatsFile(hippoRoot) {
191
186
  };
192
187
  }
193
188
  try {
194
- // SAFETY: stats.json is only ever written by writeStatsMirror below,
195
- // which always emits exactly these four fields; callers additionally
196
- // guard every read with `?? 0` / `Array.isArray`, tolerating a
197
- // hand-edited or corrupted file even if this optimistic cast is wrong.
189
+ // SAFETY: stats.json is only written by writeStatsMirror below with exactly these four fields; callers also guard every read with `?? 0` / `Array.isArray`,
190
+ // so a hand-edited file is tolerated even if this cast is wrong.
198
191
  return JSON.parse(fs.readFileSync(statsPath, 'utf8'));
199
192
  }
200
193
  catch (err) {
@@ -1,42 +1,14 @@
1
1
  import { type PredictionBaserate } from './predictions.js';
2
2
  export interface ClassResolution {
3
3
  classTag: string | null;
4
- /** True when ≥2 classes tied at the best overlap score AND best ≥ 1.
5
- * Caller emits `recall_autodebias_hint_tiebreak` audit and returns
6
- * null hint (silent — prevents the "show wrong class half the time"
7
- * failure mode the alphabetical-tiebreak alternative would create). */
4
+ /** True when >=2 classes tied at the best overlap score AND best >= 1. Caller emits `recall_autodebias_hint_tiebreak` and returns a null hint
5
+ * (silent: an alphabetical tiebreak would show the wrong class half the time). */
8
6
  tiebreak: boolean;
9
7
  }
10
8
  /** The prediction class a forward claim resolves to, and that class's closed-prediction stats when one resolved. */
11
9
  export interface PlanningFallacyEvidence extends ClassResolution {
12
10
  readonly baserate: PredictionBaserate | null;
13
11
  }
14
- /**
15
- * Resolve a query-token set to a unique best-matching class_tag for the
16
- * tenant. Scores by lower-cased token overlap; requires best score ≥ 1
17
- * AND strictly greater than the 2nd-best score.
18
- *
19
- * Indexed via idx_predictions_tenant_class (db.ts:1015) → O(log n) seek
20
- * plus a small DISTINCT scan over the per-tenant class-tag set.
21
- *
22
- * Scope behaviour (deliberate): class_tag selection is TENANT-GLOBAL,
23
- * NOT scope-filtered against
24
- * the recall's opts.scope. The class_tag is an aggregator label across
25
- * historical predictions in the class, not a per-memory scope-bound
26
- * property. A no-scope recall CAN surface a class_tag from a privately-
27
- * scoped prediction's class in PlanningFallacyHint.classTag — by design,
28
- * because base-rate reasoning needs the full historical sample.
29
- * Implications:
30
- * - The hint payload itself carries no memory content (only the aggregate
31
- * summary string + numeric stats), so memory bodies do not leak.
32
- * - The class_tag NAME is the side-channel. If sensitive labels are a
33
- * concern, callers should either use opaque class names (e.g. hashes
34
- * or numeric tokens) or set HIPPO_AUTODEBIAS=off.
35
- * - tests/api-recall-autodebias.test.ts locks this with an explicit
36
- * test asserting that scope-set predictions surface via no-scope
37
- * recalls (so future "fix" attempts that scope-filter trip CI).
38
- */
39
- export declare function resolveClassFromTokens(hippoRoot: string, tenantId: string, queryTokens: readonly string[]): ClassResolution;
40
12
  /** Resolves a claim's tokens to one class and reads its baserate, writing no audit row. */
41
13
  export declare function planningFallacyEvidenceAt(hippoRoot: string, tenantId: string, classQueryTokens: readonly string[]): PlanningFallacyEvidence;
42
14
  //# sourceMappingURL=planning-fallacy-evidence.d.ts.map
@@ -1,35 +1,11 @@
1
- import { closeHippoDb, openHippoDb } from '../db/index.js';
1
+ import { onHandle } from './open.js';
2
2
  import { computePredictionBaserate } from './predictions.js';
3
- /**
4
- * Resolve a query-token set to a unique best-matching class_tag for the
5
- * tenant. Scores by lower-cased token overlap; requires best score ≥ 1
6
- * AND strictly greater than the 2nd-best score.
7
- *
8
- * Indexed via idx_predictions_tenant_class (db.ts:1015) → O(log n) seek
9
- * plus a small DISTINCT scan over the per-tenant class-tag set.
10
- *
11
- * Scope behaviour (deliberate): class_tag selection is TENANT-GLOBAL,
12
- * NOT scope-filtered against
13
- * the recall's opts.scope. The class_tag is an aggregator label across
14
- * historical predictions in the class, not a per-memory scope-bound
15
- * property. A no-scope recall CAN surface a class_tag from a privately-
16
- * scoped prediction's class in PlanningFallacyHint.classTag — by design,
17
- * because base-rate reasoning needs the full historical sample.
18
- * Implications:
19
- * - The hint payload itself carries no memory content (only the aggregate
20
- * summary string + numeric stats), so memory bodies do not leak.
21
- * - The class_tag NAME is the side-channel. If sensitive labels are a
22
- * concern, callers should either use opaque class names (e.g. hashes
23
- * or numeric tokens) or set HIPPO_AUTODEBIAS=off.
24
- * - tests/api-recall-autodebias.test.ts locks this with an explicit
25
- * test asserting that scope-set predictions surface via no-scope
26
- * recalls (so future "fix" attempts that scope-filter trip CI).
27
- */
28
- export function resolveClassFromTokens(hippoRoot, tenantId, queryTokens) {
3
+ /** Resolve a query-token set to a unique best-matching class_tag for the tenant: lower-cased token overlap, best score >= 1 AND above the 2nd-best.
4
+ * TENANT-GLOBAL by design, not scope-filtered (base rates need the full sample): class_tag NAMES can cross scopes; use opaque names or HIPPO_AUTODEBIAS=off. */
5
+ function resolveClassFromTokens(hippoRoot, tenantId, queryTokens) {
29
6
  if (queryTokens.length === 0)
30
7
  return { classTag: null, tiebreak: false };
31
- const db = openHippoDb(hippoRoot);
32
- try {
8
+ return onHandle(hippoRoot, (db) => {
33
9
  // SAFETY: rows' shape matches the single `class_tag` column named in the SELECT above.
34
10
  const rows = db.prepare(`SELECT DISTINCT class_tag FROM predictions WHERE tenant_id = ?`).all(tenantId);
35
11
  const querySet = new Set(queryTokens);
@@ -51,10 +27,8 @@ export function resolveClassFromTokens(hippoRoot, tenantId, queryTokens) {
51
27
  bestClass = class_tag;
52
28
  }
53
29
  else if (score === bestScore && score > 0) {
54
- // Tie at current best — bump secondBest. Do NOT update bestClass
55
- // (alphabetical tiebreak would pick wrong class on ambiguous query
56
- // like "migration will take 3 days" between migration-effort vs
57
- // migration-risk; silent on tie instead).
30
+ // Tie at current best: bump secondBest, do NOT update bestClass (an alphabetical tiebreak would pick the wrong class on ambiguous queries; stay silent
31
+ // on tie).
58
32
  secondBest = score;
59
33
  }
60
34
  else if (score > secondBest) {
@@ -66,10 +40,7 @@ export function resolveClassFromTokens(hippoRoot, tenantId, queryTokens) {
66
40
  if (bestScore === secondBest)
67
41
  return { classTag: null, tiebreak: true };
68
42
  return { classTag: bestClass, tiebreak: false };
69
- }
70
- finally {
71
- closeHippoDb(db);
72
- }
43
+ });
73
44
  }
74
45
  /** Resolves a claim's tokens to one class and reads its baserate, writing no audit row. */
75
46
  export function planningFallacyEvidenceAt(hippoRoot, tenantId, classQueryTokens) {