hippo-memory 1.70.0 → 1.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (855) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.d.ts +4 -2
  5. package/dist/agent-memories/claude-code.js +15 -6
  6. package/dist/agent-memories/codex.js +1 -1
  7. package/dist/agent-memories/copilot.d.ts +1 -3
  8. package/dist/agent-memories/copilot.js +1 -17
  9. package/dist/agent-memories/files.js +23 -12
  10. package/dist/agent-memories/markdown.d.ts +1 -3
  11. package/dist/agent-memories/markdown.js +1 -3
  12. package/dist/agent-memories/project-folds.d.ts +10 -0
  13. package/dist/agent-memories/project-folds.js +34 -0
  14. package/dist/agent-memories/report.js +2 -1
  15. package/dist/agent-memories/sync.d.ts +4 -2
  16. package/dist/agent-memories/sync.js +18 -11
  17. package/dist/api/assemble.d.ts +7 -44
  18. package/dist/api/assemble.js +3 -23
  19. package/dist/api/audit.d.ts +33 -1
  20. package/dist/api/audit.js +48 -1
  21. package/dist/api/auth.d.ts +20 -26
  22. package/dist/api/auth.js +43 -29
  23. package/dist/api/auto-sleep.d.ts +5 -2
  24. package/dist/api/auto-sleep.js +9 -5
  25. package/dist/api/availability.d.ts +2 -15
  26. package/dist/api/availability.js +4 -18
  27. package/dist/api/cards.d.ts +42 -0
  28. package/dist/api/cards.js +52 -0
  29. package/dist/api/conflicts.d.ts +28 -0
  30. package/dist/api/conflicts.js +61 -0
  31. package/dist/api/context-render.js +4 -3
  32. package/dist/api/context-select.js +12 -15
  33. package/dist/api/context-types.d.ts +10 -35
  34. package/dist/api/context.d.ts +5 -22
  35. package/dist/api/context.js +38 -46
  36. package/dist/api/continuity.d.ts +47 -0
  37. package/dist/api/continuity.js +66 -0
  38. package/dist/{cli → api}/correction-latency.d.ts +2 -14
  39. package/dist/{cli → api}/correction-latency.js +2 -14
  40. package/dist/api/dormant.d.ts +5 -21
  41. package/dist/api/dormant.js +11 -28
  42. package/dist/api/drill-down.d.ts +7 -46
  43. package/dist/api/drill-down.js +6 -27
  44. package/dist/api/embeddings.d.ts +17 -0
  45. package/dist/api/embeddings.js +28 -0
  46. package/dist/api/error-reply.d.ts +8 -0
  47. package/dist/api/error-reply.js +21 -0
  48. package/dist/api/forget.d.ts +11 -26
  49. package/dist/api/forget.js +23 -35
  50. package/dist/api/goals.d.ts +1 -1
  51. package/dist/api/goals.js +5 -9
  52. package/dist/api/graph.d.ts +8 -0
  53. package/dist/api/graph.js +7 -0
  54. package/dist/api/index.d.ts +6 -2
  55. package/dist/api/index.js +6 -2
  56. package/dist/api/instruction-detect.js +21 -6
  57. package/dist/api/learn.d.ts +4 -0
  58. package/dist/api/learn.js +53 -27
  59. package/dist/api/ledger-db.d.ts +2 -5
  60. package/dist/api/ledger-db.js +5 -35
  61. package/dist/api/memories.d.ts +23 -0
  62. package/dist/api/memories.js +46 -0
  63. package/dist/api/objects.d.ts +9 -0
  64. package/dist/api/objects.js +11 -0
  65. package/dist/api/on-store.js +5 -3
  66. package/dist/api/outcome.js +1 -1
  67. package/dist/api/pilot-arm.d.ts +1 -11
  68. package/dist/api/pilot-arm.js +5 -45
  69. package/dist/api/predictions.d.ts +11 -0
  70. package/dist/api/predictions.js +24 -0
  71. package/dist/api/projects.d.ts +21 -0
  72. package/dist/api/projects.js +24 -0
  73. package/dist/api/promote.d.ts +13 -17
  74. package/dist/api/promote.js +12 -20
  75. package/dist/api/prompt-hook.d.ts +19 -6
  76. package/dist/api/prompt-hook.js +54 -13
  77. package/dist/api/provenance-coverage.d.ts +14 -0
  78. package/dist/{cli → api}/provenance-coverage.js +2 -6
  79. package/dist/api/recall-cli.d.ts +58 -0
  80. package/dist/api/recall-cli.js +103 -0
  81. package/dist/api/recall-core.js +17 -9
  82. package/dist/api/recall-finish.d.ts +53 -0
  83. package/dist/api/recall-finish.js +30 -0
  84. package/dist/api/recall-history.d.ts +17 -84
  85. package/dist/api/recall-history.js +15 -88
  86. package/dist/api/recall-pipeline.d.ts +2 -3
  87. package/dist/api/recall-pipeline.js +21 -15
  88. package/dist/api/recall-request.js +1 -1
  89. package/dist/api/recall-types.d.ts +64 -304
  90. package/dist/api/recall.d.ts +3 -34
  91. package/dist/api/recall.js +63 -89
  92. package/dist/api/refine.d.ts +7 -0
  93. package/dist/api/refine.js +10 -0
  94. package/dist/api/remember-local.d.ts +57 -0
  95. package/dist/api/remember-local.js +90 -0
  96. package/dist/api/remember.d.ts +20 -2
  97. package/dist/api/remember.js +16 -3
  98. package/dist/api/session-end.d.ts +22 -0
  99. package/dist/api/session-end.js +101 -0
  100. package/dist/api/sleep-run.d.ts +2 -4
  101. package/dist/api/sleep-run.js +28 -28
  102. package/dist/api/sleep.d.ts +9 -28
  103. package/dist/api/status.d.ts +24 -0
  104. package/dist/api/status.js +40 -0
  105. package/dist/api/store-init.d.ts +4 -0
  106. package/dist/api/store-init.js +9 -0
  107. package/dist/api/tokens.d.ts +3 -10
  108. package/dist/api/tokens.js +4 -11
  109. package/dist/api/types.d.ts +8 -29
  110. package/dist/api/types.js +10 -23
  111. package/dist/capture/caller-session.d.ts +0 -3
  112. package/dist/capture/caller-session.js +1 -12
  113. package/dist/capture/capture-error.d.ts +2 -2
  114. package/dist/capture/capture-error.js +23 -18
  115. package/dist/capture/codex-patch.js +3 -1
  116. package/dist/capture/command.d.ts +4 -12
  117. package/dist/capture/command.js +39 -114
  118. package/dist/capture/compact.d.ts +4 -15
  119. package/dist/capture/compact.js +26 -30
  120. package/dist/capture/compaction-items-caller.js +11 -20
  121. package/dist/capture/compaction-record.d.ts +7 -93
  122. package/dist/capture/compaction-record.js +34 -399
  123. package/dist/capture/compaction-spool.d.ts +5 -3
  124. package/dist/capture/compaction-spool.js +21 -7
  125. package/dist/capture/copilot-transcript.d.ts +2 -1
  126. package/dist/capture/copilot-transcript.js +2 -1
  127. package/dist/capture/extract.d.ts +5 -2
  128. package/dist/capture/extract.js +4 -3
  129. package/dist/capture/failure-caller.d.ts +1 -1
  130. package/dist/capture/failure-caller.js +21 -16
  131. package/dist/capture/failure-reading.d.ts +2 -1
  132. package/dist/capture/failure-reading.js +7 -9
  133. package/dist/capture/pre-compact-caller.js +5 -4
  134. package/dist/capture/session-digest.d.ts +1 -1
  135. package/dist/capture/session-digest.js +17 -10
  136. package/dist/capture/session-end-caller.js +2 -1
  137. package/dist/capture/session-worker.js +3 -4
  138. package/dist/capture/transcript.d.ts +4 -11
  139. package/dist/capture/transcript.js +10 -21
  140. package/dist/capture/working-state.d.ts +4 -2
  141. package/dist/capture/working-state.js +4 -2
  142. package/dist/cli/api-context.d.ts +3 -0
  143. package/dist/cli/api-context.js +6 -0
  144. package/dist/cli/audit-prune.d.ts +1 -59
  145. package/dist/cli/audit-prune.js +2 -61
  146. package/dist/cli/audit.d.ts +1 -1
  147. package/dist/cli/audit.js +42 -43
  148. package/dist/cli/auth.d.ts +2 -2
  149. package/dist/cli/auth.js +61 -44
  150. package/dist/cli/briefs.d.ts +1 -4
  151. package/dist/cli/briefs.js +42 -301
  152. package/dist/cli/card.d.ts +2 -2
  153. package/dist/cli/card.js +63 -56
  154. package/dist/cli/client.d.ts +12 -27
  155. package/dist/cli/client.js +41 -44
  156. package/dist/cli/compact-resume-payload.js +4 -3
  157. package/dist/cli/context.d.ts +2 -3
  158. package/dist/cli/context.js +22 -18
  159. package/dist/cli/continuity.d.ts +6 -6
  160. package/dist/cli/continuity.js +81 -86
  161. package/dist/cli/curate.d.ts +13 -17
  162. package/dist/cli/curate.js +88 -116
  163. package/dist/cli/dag.d.ts +4 -4
  164. package/dist/cli/dag.js +55 -34
  165. package/dist/cli/decisions.d.ts +2 -4
  166. package/dist/cli/decisions.js +18 -309
  167. package/dist/cli/eval.d.ts +1 -1
  168. package/dist/cli/eval.js +27 -26
  169. package/dist/cli/exit.d.ts +6 -0
  170. package/dist/cli/exit.js +11 -0
  171. package/dist/cli/explain.d.ts +2 -3
  172. package/dist/cli/explain.js +25 -27
  173. package/dist/cli/flag-values.d.ts +6 -1
  174. package/dist/cli/flag-values.js +42 -15
  175. package/dist/cli/flags.d.ts +0 -288
  176. package/dist/cli/flags.js +3 -138
  177. package/dist/cli/github.d.ts +14 -0
  178. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  179. package/dist/cli/goals.d.ts +2 -2
  180. package/dist/cli/goals.js +46 -50
  181. package/dist/cli/graph.d.ts +3 -0
  182. package/dist/cli/graph.js +83 -0
  183. package/dist/cli/hook-runtime.d.ts +12 -32
  184. package/dist/cli/hook-runtime.js +21 -64
  185. package/dist/cli/incidents.d.ts +3 -0
  186. package/dist/cli/incidents.js +112 -0
  187. package/dist/cli/init.d.ts +2 -2
  188. package/dist/cli/init.js +33 -30
  189. package/dist/cli/install-steps.d.ts +2 -1
  190. package/dist/cli/install-steps.js +13 -14
  191. package/dist/cli/last-sleep.d.ts +2 -1
  192. package/dist/cli/last-sleep.js +4 -1
  193. package/dist/cli/lenient-id.d.ts +2 -0
  194. package/dist/cli/lenient-id.js +13 -0
  195. package/dist/cli/maintenance.d.ts +5 -5
  196. package/dist/cli/maintenance.js +37 -43
  197. package/dist/cli/notes.d.ts +2 -0
  198. package/dist/cli/notes.js +41 -0
  199. package/dist/cli/object-verbs.js +4 -3
  200. package/dist/cli/open-browser.d.ts +14 -0
  201. package/dist/cli/open-browser.js +26 -0
  202. package/dist/cli/owner-validation.d.ts +5 -28
  203. package/dist/cli/owner-validation.js +5 -28
  204. package/dist/cli/playbooks.d.ts +3 -4
  205. package/dist/cli/playbooks.js +131 -300
  206. package/dist/cli/predictions.d.ts +3 -0
  207. package/dist/cli/predictions.js +175 -0
  208. package/dist/cli/print.d.ts +2 -5
  209. package/dist/cli/print.js +3 -5
  210. package/dist/cli/projects.d.ts +2 -2
  211. package/dist/cli/projects.js +31 -25
  212. package/dist/cli/quality-repair-once.d.ts +1 -1
  213. package/dist/cli/quality-repair-once.js +7 -6
  214. package/dist/cli/recall.d.ts +2 -4
  215. package/dist/cli/recall.js +67 -137
  216. package/dist/cli/refine-llm.d.ts +5 -31
  217. package/dist/cli/refine-llm.js +23 -50
  218. package/dist/cli/remember.d.ts +3 -3
  219. package/dist/cli/remember.js +134 -192
  220. package/dist/cli/scheduler.d.ts +2 -17
  221. package/dist/cli/scheduler.js +14 -19
  222. package/dist/cli/serve.js +23 -14
  223. package/dist/cli/session-hooks.d.ts +11 -19
  224. package/dist/cli/session-hooks.js +143 -214
  225. package/dist/cli/setup.d.ts +4 -4
  226. package/dist/cli/setup.js +35 -30
  227. package/dist/cli/shared.d.ts +7 -25
  228. package/dist/cli/shared.js +17 -60
  229. package/dist/cli/slack.d.ts +2 -2
  230. package/dist/cli/slack.js +19 -23
  231. package/dist/cli/sleep-render.js +6 -3
  232. package/dist/cli/sleep.d.ts +3 -2
  233. package/dist/cli/sleep.js +17 -49
  234. package/dist/cli/status.d.ts +11 -14
  235. package/dist/cli/status.js +74 -120
  236. package/dist/cli/stdin.d.ts +4 -6
  237. package/dist/cli/stdin.js +2 -3
  238. package/dist/cli/transfer.d.ts +9 -9
  239. package/dist/cli/transfer.js +87 -108
  240. package/dist/cli/usage.d.ts +0 -79
  241. package/dist/cli/usage.js +1 -689
  242. package/dist/cli/verb-row.d.ts +32 -0
  243. package/dist/cli/verb-row.js +6 -0
  244. package/dist/cli/verbs/health.d.ts +27 -0
  245. package/dist/cli/verbs/health.js +232 -0
  246. package/dist/cli/verbs/memory.d.ts +16 -0
  247. package/dist/cli/verbs/memory.js +244 -0
  248. package/dist/cli/verbs/objects.d.ts +20 -0
  249. package/dist/cli/verbs/objects.js +254 -0
  250. package/dist/cli/verbs/sessions.d.ts +31 -0
  251. package/dist/cli/verbs/sessions.js +312 -0
  252. package/dist/cli/verbs.d.ts +81 -0
  253. package/dist/cli/verbs.js +7 -0
  254. package/dist/cli/versioned-verbs.d.ts +51 -0
  255. package/dist/cli/versioned-verbs.js +79 -0
  256. package/dist/cli.d.ts +1 -654
  257. package/dist/cli.js +44 -510
  258. package/dist/connectors/dlq.d.ts +39 -3
  259. package/dist/connectors/dlq.js +37 -3
  260. package/dist/connectors/github/backfill.d.ts +5 -25
  261. package/dist/connectors/github/backfill.js +26 -52
  262. package/dist/connectors/github/deletion.d.ts +4 -18
  263. package/dist/connectors/github/deletion.js +2 -15
  264. package/dist/connectors/github/dlq.d.ts +8 -33
  265. package/dist/connectors/github/dlq.js +34 -93
  266. package/dist/connectors/github/ingest.d.ts +4 -12
  267. package/dist/connectors/github/ingest.js +5 -36
  268. package/dist/connectors/github/octokit-client.d.ts +4 -16
  269. package/dist/connectors/github/octokit-client.js +27 -24
  270. package/dist/connectors/github/ratelimit.d.ts +3 -14
  271. package/dist/connectors/github/ratelimit.js +3 -14
  272. package/dist/connectors/github/scope.d.ts +3 -5
  273. package/dist/connectors/github/scope.js +3 -5
  274. package/dist/connectors/github/signature.d.ts +4 -26
  275. package/dist/connectors/github/signature.js +4 -26
  276. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  277. package/dist/connectors/github/tenant-routing.js +4 -26
  278. package/dist/connectors/github/transform.js +2 -16
  279. package/dist/connectors/github/types.d.ts +3 -15
  280. package/dist/connectors/github/types.js +2 -9
  281. package/dist/connectors/github/webhook.d.ts +3 -16
  282. package/dist/connectors/github/webhook.js +38 -23
  283. package/dist/connectors/ingest.d.ts +10 -0
  284. package/dist/connectors/ingest.js +28 -0
  285. package/dist/connectors/slack/backfill.d.ts +4 -17
  286. package/dist/connectors/slack/backfill.js +4 -13
  287. package/dist/connectors/slack/dlq.d.ts +2 -19
  288. package/dist/connectors/slack/dlq.js +51 -90
  289. package/dist/connectors/slack/ingest.d.ts +4 -9
  290. package/dist/connectors/slack/ingest.js +4 -30
  291. package/dist/connectors/slack/scope.d.ts +2 -8
  292. package/dist/connectors/slack/scope.js +2 -8
  293. package/dist/connectors/slack/signature.d.ts +1 -6
  294. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  295. package/dist/connectors/slack/tenant-routing.js +2 -21
  296. package/dist/connectors/slack/transform.d.ts +2 -18
  297. package/dist/connectors/slack/transform.js +2 -18
  298. package/dist/connectors/slack/types.d.ts +3 -9
  299. package/dist/connectors/slack/types.js +2 -4
  300. package/dist/connectors/slack/web-client.js +33 -27
  301. package/dist/connectors/slack/webhook.d.ts +3 -19
  302. package/dist/connectors/slack/webhook.js +6 -26
  303. package/dist/connectors/slack/workspaces.d.ts +4 -24
  304. package/dist/connectors/slack/workspaces.js +4 -24
  305. package/dist/consolidate/conflicts.js +7 -15
  306. package/dist/consolidate/dag-summary.d.ts +8 -0
  307. package/dist/consolidate/dag-summary.js +41 -0
  308. package/dist/consolidate/dag.d.ts +5 -28
  309. package/dist/consolidate/dag.js +29 -84
  310. package/dist/consolidate/decay.js +7 -19
  311. package/dist/consolidate/dedupe.d.ts +13 -52
  312. package/dist/consolidate/dedupe.js +18 -74
  313. package/dist/consolidate/flush-units.d.ts +3 -4
  314. package/dist/consolidate/flush-units.js +3 -3
  315. package/dist/consolidate/half-life-migration.d.ts +3 -26
  316. package/dist/consolidate/half-life-migration.js +11 -28
  317. package/dist/consolidate/llm-passes.js +49 -40
  318. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  319. package/dist/consolidate/memory-value-weights.js +2 -13
  320. package/dist/consolidate/memory-value.d.ts +11 -84
  321. package/dist/consolidate/memory-value.js +18 -105
  322. package/dist/consolidate/merge.js +12 -33
  323. package/dist/consolidate/physics-pass.d.ts +6 -1
  324. package/dist/consolidate/physics-pass.js +27 -9
  325. package/dist/consolidate/replay.d.ts +6 -38
  326. package/dist/consolidate/replay.js +25 -56
  327. package/dist/consolidate/run.js +1 -1
  328. package/dist/consolidate/sleep.d.ts +1 -8
  329. package/dist/consolidate/sleep.js +13 -22
  330. package/dist/consolidate/trace.d.ts +3 -18
  331. package/dist/consolidate/trace.js +3 -18
  332. package/dist/consolidate/traces.js +9 -25
  333. package/dist/core/ablation.d.ts +14 -91
  334. package/dist/core/ablation.js +16 -91
  335. package/dist/core/active-scope.d.ts +7 -0
  336. package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
  337. package/dist/core/ambient.d.ts +5 -8
  338. package/dist/core/ambient.js +40 -26
  339. package/dist/core/api-errors.d.ts +16 -0
  340. package/dist/core/api-errors.js +20 -0
  341. package/dist/core/capture-contract.d.ts +4 -2
  342. package/dist/core/capture-contract.js +4 -2
  343. package/dist/core/card.d.ts +4 -1
  344. package/dist/core/card.js +11 -1
  345. package/dist/core/compaction-timing.d.ts +7 -0
  346. package/dist/core/compaction-timing.js +9 -0
  347. package/dist/core/compare.d.ts +11 -67
  348. package/dist/core/compare.js +9 -63
  349. package/dist/core/config.d.ts +10 -24
  350. package/dist/core/config.js +20 -16
  351. package/dist/core/cosine.d.ts +3 -0
  352. package/dist/core/cosine.js +19 -0
  353. package/dist/core/handoff.d.ts +1 -7
  354. package/dist/core/handoff.js +1 -7
  355. package/dist/core/markdown.d.ts +6 -0
  356. package/dist/{store → core}/markdown.js +23 -22
  357. package/dist/core/memory-audit.d.ts +17 -0
  358. package/dist/core/memory-audit.js +54 -0
  359. package/dist/core/memory-quality.js +1 -1
  360. package/dist/core/memory.d.ts +51 -168
  361. package/dist/core/memory.js +76 -239
  362. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  363. package/dist/{consolidate → core}/merged-row.js +3 -2
  364. package/dist/core/package-root.d.ts +3 -0
  365. package/dist/core/package-root.js +5 -0
  366. package/dist/core/physics-config.d.ts +1 -4
  367. package/dist/core/physics-config.js +3 -8
  368. package/dist/core/physics.d.ts +15 -61
  369. package/dist/core/physics.js +65 -138
  370. package/dist/core/prediction.d.ts +3 -0
  371. package/dist/core/prediction.js +6 -0
  372. package/dist/core/project-identity.d.ts +20 -58
  373. package/dist/core/project-identity.js +27 -39
  374. package/dist/core/project-remote.js +13 -2
  375. package/dist/core/raw-append-only.d.ts +5 -0
  376. package/dist/core/raw-append-only.js +7 -0
  377. package/dist/core/recall-scope.d.ts +69 -0
  378. package/dist/core/recall-scope.js +138 -0
  379. package/dist/core/salience.d.ts +1 -7
  380. package/dist/core/salience.js +1 -7
  381. package/dist/dashboard/dashboard-actions.js +2 -2
  382. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  383. package/dist/dashboard/dashboard-snapshot.js +11 -2
  384. package/dist/dashboard/dashboard-types.d.ts +2 -1
  385. package/dist/dashboard/dashboard.d.ts +1 -0
  386. package/dist/dashboard/dashboard.js +50 -4
  387. package/dist/db/busy.d.ts +3 -8
  388. package/dist/db/busy.js +37 -33
  389. package/dist/db/connect.js +7 -8
  390. package/dist/db/index.d.ts +3 -3
  391. package/dist/db/index.js +3 -3
  392. package/dist/db/migrate.js +3 -3
  393. package/dist/db/migrations/index.d.ts +1 -1
  394. package/dist/db/migrations/index.js +3 -1
  395. package/dist/db/migrations/types.d.ts +2 -5
  396. package/dist/db/migrations/v14.js +2 -3
  397. package/dist/db/migrations/v15.js +2 -8
  398. package/dist/db/migrations/v16.js +2 -3
  399. package/dist/db/migrations/v17.js +2 -3
  400. package/dist/db/migrations/v19.js +2 -5
  401. package/dist/db/migrations/v20.js +2 -7
  402. package/dist/db/migrations/v22.js +4 -17
  403. package/dist/db/migrations/v23.js +3 -14
  404. package/dist/db/migrations/v24.js +2 -4
  405. package/dist/db/migrations/v25.js +3 -8
  406. package/dist/db/migrations/v26.js +2 -13
  407. package/dist/db/migrations/v27.js +3 -11
  408. package/dist/db/migrations/v28.js +2 -14
  409. package/dist/db/migrations/v29.js +4 -18
  410. package/dist/db/migrations/v30.js +4 -16
  411. package/dist/db/migrations/v31.js +2 -15
  412. package/dist/db/migrations/v32.js +4 -22
  413. package/dist/db/migrations/v33.js +2 -15
  414. package/dist/db/migrations/v34.js +2 -11
  415. package/dist/db/migrations/v35.js +2 -11
  416. package/dist/db/migrations/v36.js +2 -11
  417. package/dist/db/migrations/v37.js +8 -33
  418. package/dist/db/migrations/v38.js +5 -38
  419. package/dist/db/migrations/v39.js +9 -20
  420. package/dist/db/migrations/v40.js +2 -9
  421. package/dist/db/migrations/v41.js +2 -24
  422. package/dist/db/migrations/v43.js +1 -1
  423. package/dist/db/migrations/v44.js +2 -8
  424. package/dist/db/migrations/v45.js +2 -7
  425. package/dist/db/migrations/v47.js +2 -3
  426. package/dist/db/migrations/v51.js +1 -1
  427. package/dist/db/migrations/v55.d.ts +3 -0
  428. package/dist/db/migrations/v55.js +17 -0
  429. package/dist/db/open.d.ts +2 -2
  430. package/dist/db/open.js +21 -9
  431. package/dist/db/physics-state.d.ts +6 -22
  432. package/dist/db/physics-state.js +28 -39
  433. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  434. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  435. package/dist/db/tables.d.ts +2 -0
  436. package/dist/db/tables.js +6 -2
  437. package/dist/db/vector-store.d.ts +2 -0
  438. package/dist/db/vector-store.js +25 -5
  439. package/dist/db/wal-checkpointer.js +2 -1
  440. package/dist/doctor.js +85 -27
  441. package/dist/embeddings/local.d.ts +62 -0
  442. package/dist/embeddings/local.js +146 -0
  443. package/dist/embeddings/provider.d.ts +43 -0
  444. package/dist/{store/embeddings → embeddings}/provider.js +58 -83
  445. package/dist/embeddings/transformers.d.ts +26 -0
  446. package/dist/embeddings/transformers.js +89 -0
  447. package/dist/entry/session-text.d.ts +1 -1
  448. package/dist/entry/session-text.js +3 -2
  449. package/dist/eval/eval-stats.d.ts +15 -53
  450. package/dist/eval/eval-stats.js +12 -42
  451. package/dist/eval/eval-suite.d.ts +2 -13
  452. package/dist/eval/eval-suite.js +91 -45
  453. package/dist/eval/eval.d.ts +6 -24
  454. package/dist/eval/eval.js +8 -35
  455. package/dist/eval/judgment.d.ts +0 -3
  456. package/dist/eval/judgment.js +30 -15
  457. package/dist/extensions/openclaw-plugin/index.js +1 -1
  458. package/dist/graph/extract.d.ts +5 -27
  459. package/dist/graph/extract.js +10 -36
  460. package/dist/graph/recall.d.ts +7 -20
  461. package/dist/graph/recall.js +15 -77
  462. package/dist/graph/stream.d.ts +7 -39
  463. package/dist/graph/stream.js +11 -34
  464. package/dist/graph/view.d.ts +9 -35
  465. package/dist/graph/view.js +24 -44
  466. package/dist/graph/write.d.ts +1 -1
  467. package/dist/graph/write.js +9 -9
  468. package/dist/hooks/codex-session.js +3 -2
  469. package/dist/hooks/codex-wrapper.js +4 -3
  470. package/dist/hooks/copilot.js +2 -1
  471. package/dist/hooks/hook-blocks.d.ts +6 -2
  472. package/dist/hooks/hook-blocks.js +37 -124
  473. package/dist/hooks/json-hooks.d.ts +4 -36
  474. package/dist/hooks/json-hooks.js +22 -59
  475. package/dist/hooks/opencode.d.ts +0 -38
  476. package/dist/hooks/opencode.js +17 -81
  477. package/dist/hooks/shared.d.ts +6 -21
  478. package/dist/hooks/shared.js +31 -33
  479. package/dist/importers/core.d.ts +12 -37
  480. package/dist/importers/core.js +10 -28
  481. package/dist/importers/markdown-parse.d.ts +8 -22
  482. package/dist/importers/markdown-parse.js +8 -25
  483. package/dist/importers/markdown.js +3 -12
  484. package/dist/importers/sources.js +12 -39
  485. package/dist/importers/vault.d.ts +2 -8
  486. package/dist/importers/vault.js +31 -85
  487. package/dist/index.d.ts +8 -3
  488. package/dist/index.js +8 -3
  489. package/dist/learn/autolearn.d.ts +23 -42
  490. package/dist/learn/autolearn.js +45 -52
  491. package/dist/learn/churn-git.js +13 -4
  492. package/dist/learn/extract.d.ts +3 -2
  493. package/dist/learn/extract.js +8 -8
  494. package/dist/learn/forward-claim-detector.d.ts +6 -30
  495. package/dist/learn/forward-claim-detector.js +18 -68
  496. package/dist/learn/invalidation.d.ts +6 -18
  497. package/dist/learn/invalidation.js +18 -31
  498. package/dist/mcp/admin-tools.d.ts +2 -2
  499. package/dist/mcp/admin-tools.js +30 -53
  500. package/dist/mcp/format.js +3 -2
  501. package/dist/mcp/framing.d.ts +1 -0
  502. package/dist/mcp/framing.js +1 -1
  503. package/dist/mcp/memory-tools.js +7 -10
  504. package/dist/mcp/protocol.d.ts +15 -29
  505. package/dist/mcp/protocol.js +26 -16
  506. package/dist/mcp/recall-tools.js +14 -11
  507. package/dist/mcp/request.d.ts +3 -11
  508. package/dist/mcp/request.js +12 -27
  509. package/dist/mcp/server.d.ts +3 -9
  510. package/dist/mcp/server.js +5 -16
  511. package/dist/mcp/session-state.d.ts +1 -1
  512. package/dist/mcp/session-state.js +5 -11
  513. package/dist/mcp/stdio.d.ts +2 -6
  514. package/dist/mcp/stdio.js +68 -16
  515. package/dist/mcp/tool-args.js +2 -1
  516. package/dist/mcp/tools.js +47 -22
  517. package/dist/objects/customer-notes.d.ts +9 -44
  518. package/dist/objects/customer-notes.js +7 -48
  519. package/dist/objects/decisions.d.ts +14 -52
  520. package/dist/objects/decisions.js +15 -53
  521. package/dist/objects/descriptor.d.ts +1 -1
  522. package/dist/objects/incidents.d.ts +9 -40
  523. package/dist/objects/incidents.js +7 -41
  524. package/dist/objects/lifecycle.d.ts +1 -1
  525. package/dist/objects/lifecycle.js +2 -1
  526. package/dist/objects/policies.d.ts +13 -91
  527. package/dist/objects/policies.js +13 -99
  528. package/dist/objects/processes.d.ts +9 -54
  529. package/dist/objects/processes.js +7 -61
  530. package/dist/objects/project-briefs.d.ts +13 -57
  531. package/dist/objects/project-briefs.js +16 -78
  532. package/dist/objects/skills.d.ts +9 -44
  533. package/dist/objects/skills.js +8 -54
  534. package/dist/postinstall.js +7 -20
  535. package/dist/predictions/planning-fallacy.d.ts +11 -34
  536. package/dist/rerankers/clef.js +6 -37
  537. package/dist/rerankers/cross-encoder.d.ts +31 -2
  538. package/dist/rerankers/cross-encoder.js +65 -101
  539. package/dist/rerankers/index.js +5 -4
  540. package/dist/rerankers/jev.js +11 -10
  541. package/dist/rerankers/llm.d.ts +2 -11
  542. package/dist/rerankers/llm.js +14 -14
  543. package/dist/rerankers/outage-warning.d.ts +5 -2
  544. package/dist/rerankers/outage-warning.js +7 -4
  545. package/dist/rerankers/remote.d.ts +1 -0
  546. package/dist/rerankers/remote.js +2 -0
  547. package/dist/rerankers/types.d.ts +2 -14
  548. package/dist/search/bm25-search.js +1 -1
  549. package/dist/search/boosts.d.ts +0 -2
  550. package/dist/search/boosts.js +3 -3
  551. package/dist/search/embed-memories.d.ts +9 -0
  552. package/dist/search/embed-memories.js +377 -0
  553. package/dist/search/goal-boost.d.ts +23 -0
  554. package/dist/search/goal-boost.js +93 -0
  555. package/dist/search/hybrid.d.ts +11 -2
  556. package/dist/search/hybrid.js +9 -4
  557. package/dist/search/multihop.js +2 -3
  558. package/dist/search/path-context.d.ts +5 -18
  559. package/dist/search/path-context.js +5 -18
  560. package/dist/search/physics-search.d.ts +6 -3
  561. package/dist/search/physics-search.js +29 -19
  562. package/dist/search/rerank.js +1 -1
  563. package/dist/search/rrf.d.ts +7 -35
  564. package/dist/search/rrf.js +5 -30
  565. package/dist/search/vector.d.ts +13 -4
  566. package/dist/search/vector.js +40 -13
  567. package/dist/server/auth.d.ts +11 -28
  568. package/dist/server/auth.js +49 -32
  569. package/dist/server/boot.d.ts +2 -21
  570. package/dist/server/boot.js +69 -161
  571. package/dist/server/client-ip.d.ts +3 -21
  572. package/dist/server/client-ip.js +8 -30
  573. package/dist/server/deadline.d.ts +0 -2
  574. package/dist/server/deadline.js +1 -7
  575. package/dist/server/defaults.d.ts +4 -0
  576. package/dist/server/defaults.js +5 -0
  577. package/dist/server/key-check-bounds.d.ts +2 -1
  578. package/dist/server/lifecycle.d.ts +5 -4
  579. package/dist/server/lifecycle.js +19 -4
  580. package/dist/server/mcp-http.js +24 -53
  581. package/dist/server/rate-limit.d.ts +5 -18
  582. package/dist/server/rate-limit.js +4 -13
  583. package/dist/server/request.d.ts +4 -8
  584. package/dist/server/request.js +16 -19
  585. package/dist/server/route-checks.d.ts +7 -0
  586. package/dist/server/route-checks.js +42 -0
  587. package/dist/server/route-table.d.ts +9 -8
  588. package/dist/server/route-table.js +127 -139
  589. package/dist/server/routes/admin.d.ts +8 -8
  590. package/dist/server/routes/admin.js +35 -49
  591. package/dist/server/routes/customer-notes.d.ts +6 -6
  592. package/dist/server/routes/customer-notes.js +8 -14
  593. package/dist/server/routes/decisions.d.ts +6 -6
  594. package/dist/server/routes/decisions.js +12 -21
  595. package/dist/server/routes/incidents.d.ts +6 -6
  596. package/dist/server/routes/incidents.js +14 -25
  597. package/dist/server/routes/memories.d.ts +9 -9
  598. package/dist/server/routes/memories.js +20 -63
  599. package/dist/server/routes/object-routes.d.ts +6 -11
  600. package/dist/server/routes/object-routes.js +11 -22
  601. package/dist/server/routes/policies.d.ts +7 -7
  602. package/dist/server/routes/policies.js +12 -22
  603. package/dist/server/routes/predictions.d.ts +6 -6
  604. package/dist/server/routes/predictions.js +22 -38
  605. package/dist/server/routes/processes.d.ts +6 -6
  606. package/dist/server/routes/processes.js +17 -28
  607. package/dist/server/routes/project-briefs.d.ts +7 -7
  608. package/dist/server/routes/project-briefs.js +11 -20
  609. package/dist/server/routes/recall.d.ts +5 -5
  610. package/dist/server/routes/recall.js +16 -45
  611. package/dist/server/routes/skills.d.ts +7 -7
  612. package/dist/server/routes/skills.js +10 -22
  613. package/dist/server/server-detect.d.ts +15 -53
  614. package/dist/server/server-detect.js +55 -96
  615. package/dist/server/sleep-child.js +26 -7
  616. package/dist/server/sleep-offload.d.ts +11 -5
  617. package/dist/server/sleep-offload.js +21 -12
  618. package/dist/server/types.d.ts +32 -18
  619. package/dist/server/validation.d.ts +3 -2
  620. package/dist/server/validation.js +15 -33
  621. package/dist/server.d.ts +7 -6
  622. package/dist/server.js +8 -6
  623. package/dist/sharing/global-store.d.ts +19 -0
  624. package/dist/sharing/global-store.js +75 -0
  625. package/dist/sharing/global-sync.d.ts +6 -0
  626. package/dist/sharing/global-sync.js +73 -0
  627. package/dist/sharing/project-merge.d.ts +11 -19
  628. package/dist/sharing/project-merge.js +63 -125
  629. package/dist/sharing/search-both.d.ts +60 -0
  630. package/dist/sharing/search-both.js +138 -0
  631. package/dist/sharing/share.d.ts +40 -0
  632. package/dist/sharing/share.js +229 -0
  633. package/dist/store/ambient.js +9 -15
  634. package/dist/store/audit-event.d.ts +5 -13
  635. package/dist/store/audit-event.js +4 -12
  636. package/dist/store/audit.d.ts +2 -21
  637. package/dist/store/audit.js +8 -67
  638. package/dist/store/auth.d.ts +10 -8
  639. package/dist/store/auth.js +17 -12
  640. package/dist/store/candidates.d.ts +23 -5
  641. package/dist/store/candidates.js +119 -71
  642. package/dist/store/capture-write.d.ts +17 -0
  643. package/dist/store/capture-write.js +35 -0
  644. package/dist/store/card-detail.d.ts +2 -1
  645. package/dist/store/card-detail.js +2 -1
  646. package/dist/store/cards.d.ts +14 -9
  647. package/dist/store/cards.js +72 -126
  648. package/dist/store/compaction-caller.d.ts +18 -0
  649. package/dist/store/compaction-caller.js +29 -0
  650. package/dist/store/compactions-record.d.ts +115 -0
  651. package/dist/store/compactions-record.js +417 -0
  652. package/dist/store/compactions.js +6 -4
  653. package/dist/store/conflicts.d.ts +4 -21
  654. package/dist/store/conflicts.js +76 -152
  655. package/dist/store/connectors/dlq.d.ts +10 -0
  656. package/dist/store/connectors/dlq.js +32 -0
  657. package/dist/store/connectors/github.d.ts +14 -16
  658. package/dist/store/connectors/github.js +34 -57
  659. package/dist/store/connectors/slack.d.ts +2 -11
  660. package/dist/store/connectors/slack.js +18 -47
  661. package/dist/store/dashboard-reads.js +11 -14
  662. package/dist/store/delete-and-batch.d.ts +17 -31
  663. package/dist/store/delete-and-batch.js +84 -67
  664. package/dist/store/delivery-recorder.d.ts +15 -4
  665. package/dist/store/delivery-recorder.js +34 -17
  666. package/dist/store/descendant-page.js +6 -3
  667. package/dist/store/diagnostics.js +6 -13
  668. package/dist/store/dormant.d.ts +8 -30
  669. package/dist/store/dormant.js +18 -57
  670. package/dist/store/embeddings/index.d.ts +11 -90
  671. package/dist/store/embeddings/index.js +18 -523
  672. package/dist/store/entry-reads.d.ts +34 -61
  673. package/dist/store/entry-reads.js +111 -136
  674. package/dist/store/entry-row.d.ts +6 -35
  675. package/dist/store/entry-row.js +9 -37
  676. package/dist/store/entry-writes.d.ts +12 -18
  677. package/dist/store/entry-writes.js +46 -44
  678. package/dist/store/failure-log-at.d.ts +8 -0
  679. package/dist/store/failure-log-at.js +16 -0
  680. package/dist/store/failure-log.d.ts +2 -2
  681. package/dist/store/failure-log.js +5 -3
  682. package/dist/{trust → store}/gated-write.d.ts +3 -1
  683. package/dist/{trust → store}/gated-write.js +7 -5
  684. package/dist/store/goals.d.ts +3 -40
  685. package/dist/store/goals.js +41 -178
  686. package/dist/store/graph-queue.d.ts +6 -22
  687. package/dist/store/graph-queue.js +14 -45
  688. package/dist/store/graph-reads.d.ts +11 -35
  689. package/dist/store/graph-reads.js +24 -60
  690. package/dist/store/graph-rows.d.ts +3 -6
  691. package/dist/store/graph-rows.js +6 -9
  692. package/dist/store/graph-view-rows.d.ts +2 -1
  693. package/dist/store/graph-view-rows.js +2 -1
  694. package/dist/store/graph-writes.d.ts +10 -35
  695. package/dist/store/graph-writes.js +59 -106
  696. package/dist/store/half-life.d.ts +2 -1
  697. package/dist/store/half-life.js +14 -16
  698. package/dist/store/handoffs.d.ts +6 -12
  699. package/dist/store/handoffs.js +22 -40
  700. package/dist/store/index-and-stats.d.ts +6 -19
  701. package/dist/store/index-and-stats.js +36 -84
  702. package/dist/store/key-writes.js +1 -1
  703. package/dist/store/ledger-turn.d.ts +9 -0
  704. package/dist/store/ledger-turn.js +38 -0
  705. package/dist/store/mirrors.d.ts +2 -6
  706. package/dist/store/mirrors.js +24 -29
  707. package/dist/store/open.d.ts +0 -4
  708. package/dist/store/open.js +42 -62
  709. package/dist/store/pilot-arm.d.ts +12 -0
  710. package/dist/store/pilot-arm.js +42 -0
  711. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  712. package/dist/store/planning-fallacy-evidence.js +8 -37
  713. package/dist/store/port.d.ts +91 -82
  714. package/dist/store/port.js +8 -0
  715. package/dist/store/predictions.d.ts +12 -53
  716. package/dist/store/predictions.js +41 -125
  717. package/dist/store/project-tags.d.ts +62 -0
  718. package/dist/store/project-tags.js +67 -0
  719. package/dist/{cli → store}/quality-repair.js +15 -31
  720. package/dist/store/quarantine.js +2 -1
  721. package/dist/store/raw-archive.d.ts +4 -16
  722. package/dist/store/raw-archive.js +14 -29
  723. package/dist/store/recall-trace.d.ts +12 -77
  724. package/dist/store/recall-trace.js +37 -97
  725. package/dist/store/rejected-values.js +9 -20
  726. package/dist/store/rejection-probe.d.ts +4 -0
  727. package/dist/store/rejection-probe.js +19 -0
  728. package/dist/store/rejection.d.ts +10 -73
  729. package/dist/store/rejection.js +12 -84
  730. package/dist/store/report-reads.d.ts +6 -0
  731. package/dist/store/report-reads.js +29 -0
  732. package/dist/store/rows.d.ts +9 -19
  733. package/dist/store/rows.js +36 -34
  734. package/dist/store/rule-sql.d.ts +14 -0
  735. package/dist/store/rule-sql.js +56 -0
  736. package/dist/store/search-rows.d.ts +7 -38
  737. package/dist/store/search-rows.js +23 -54
  738. package/dist/store/sessions.d.ts +10 -47
  739. package/dist/store/sessions.js +21 -75
  740. package/dist/store/set-aside.d.ts +14 -0
  741. package/dist/store/set-aside.js +23 -0
  742. package/dist/store/sqlite/busy.d.ts +3 -0
  743. package/dist/store/sqlite/busy.js +8 -0
  744. package/dist/store/sqlite/connector-events-group.js +5 -8
  745. package/dist/store/sqlite/connector-writes-group.js +3 -3
  746. package/dist/store/sqlite/entry-writes-group.js +4 -4
  747. package/dist/store/sqlite/error-codec.js +8 -5
  748. package/dist/store/sqlite/executor.d.ts +2 -1
  749. package/dist/store/sqlite/executor.js +12 -5
  750. package/dist/store/sqlite/graph-reads-group.js +1 -1
  751. package/dist/store/sqlite/held-connection.d.ts +9 -0
  752. package/dist/store/sqlite/held-connection.js +41 -0
  753. package/dist/store/sqlite/local.d.ts +3 -3
  754. package/dist/store/sqlite/local.js +1 -0
  755. package/dist/store/sqlite/object-rows.d.ts +1 -1
  756. package/dist/store/sqlite/object-rows.js +6 -3
  757. package/dist/store/sqlite/objects-group.d.ts +1 -1
  758. package/dist/store/sqlite/objects-group.js +5 -3
  759. package/dist/store/sqlite/quarantine-group.js +2 -2
  760. package/dist/store/sqlite/store.d.ts +1 -4
  761. package/dist/store/sqlite/store.js +16 -15
  762. package/dist/store/sqlite/vector-reads-group.js +2 -2
  763. package/dist/store/sqlite/worker-jobs.js +1 -1
  764. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  765. package/dist/store/sqlite/worker-ops.js +13 -2
  766. package/dist/store/sqlite/worker-store.js +5 -2
  767. package/dist/store/summaries.d.ts +11 -63
  768. package/dist/store/summaries.js +37 -148
  769. package/dist/store/summary-dirty.js +1 -1
  770. package/dist/store/tenant-lookup.d.ts +6 -1
  771. package/dist/store/tenant-lookup.js +7 -0
  772. package/dist/store/tenant.d.ts +2 -16
  773. package/dist/store/tenant.js +4 -19
  774. package/dist/store/token-ledger.d.ts +13 -50
  775. package/dist/store/token-ledger.js +19 -85
  776. package/dist/store/usage-reports.js +5 -13
  777. package/dist/store/vector-index.d.ts +46 -0
  778. package/dist/store/vector-index.js +171 -0
  779. package/dist/store/working-memory.d.ts +6 -25
  780. package/dist/store/working-memory.js +18 -52
  781. package/dist/support-bundle.js +9 -8
  782. package/dist/trust/reject-flow.js +3 -5
  783. package/dist/util/agent-homes.d.ts +15 -0
  784. package/dist/util/agent-homes.js +34 -0
  785. package/dist/util/anthropic-messages.d.ts +3 -0
  786. package/dist/util/anthropic-messages.js +35 -6
  787. package/dist/util/atomic-write.d.ts +2 -1
  788. package/dist/util/atomic-write.js +35 -4
  789. package/dist/util/capped-json.d.ts +6 -0
  790. package/dist/util/capped-json.js +46 -0
  791. package/dist/util/chunked.d.ts +3 -0
  792. package/dist/util/chunked.js +10 -0
  793. package/dist/util/crash-handlers.d.ts +8 -1
  794. package/dist/util/crash-handlers.js +52 -10
  795. package/dist/util/ellipsize.d.ts +3 -0
  796. package/dist/util/ellipsize.js +5 -0
  797. package/dist/util/env.d.ts +14 -6
  798. package/dist/util/env.js +15 -7
  799. package/dist/util/format.d.ts +3 -0
  800. package/dist/util/format.js +6 -0
  801. package/dist/util/home-path.d.ts +2 -1
  802. package/dist/util/home-path.js +4 -2
  803. package/dist/util/hook-payload.d.ts +8 -0
  804. package/dist/util/hook-payload.js +37 -0
  805. package/dist/util/http-retry.d.ts +9 -1
  806. package/dist/util/http-retry.js +67 -8
  807. package/dist/util/http-util.d.ts +0 -8
  808. package/dist/util/http-util.js +10 -21
  809. package/dist/util/limits.d.ts +7 -0
  810. package/dist/util/limits.js +14 -0
  811. package/dist/util/log.d.ts +7 -2
  812. package/dist/util/log.js +34 -9
  813. package/dist/util/request-scope.d.ts +5 -2
  814. package/dist/util/request-scope.js +13 -7
  815. package/dist/util/secret-detect.d.ts +5 -30
  816. package/dist/util/secret-detect.js +19 -40
  817. package/dist/util/sqlite-blocked.d.ts +2 -0
  818. package/dist/util/sqlite-blocked.js +5 -0
  819. package/dist/util/stored-json.d.ts +1 -1
  820. package/dist/util/stored-json.js +1 -1
  821. package/dist/util/stream-tee.d.ts +3 -0
  822. package/dist/util/stream-tee.js +35 -0
  823. package/dist/util/time.d.ts +4 -0
  824. package/dist/util/time.js +4 -0
  825. package/dist/util/token-text.d.ts +1 -4
  826. package/dist/util/token-text.js +1 -4
  827. package/dist/util/transcript-tail.d.ts +2 -0
  828. package/dist/util/transcript-tail.js +24 -23
  829. package/dist/util/version.d.ts +5 -20
  830. package/dist/util/version.js +5 -20
  831. package/dist/{store → util}/yaml.d.ts +1 -5
  832. package/dist/{store → util}/yaml.js +2 -6
  833. package/extensions/openclaw-plugin/index.ts +1 -1
  834. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  835. package/extensions/openclaw-plugin/package.json +1 -1
  836. package/openclaw.plugin.json +1 -1
  837. package/package.json +2 -2
  838. package/dist/cli/provenance-coverage.d.ts +0 -18
  839. package/dist/connectors/github/cli-impl.d.ts +0 -25
  840. package/dist/sharing/scope.d.ts +0 -14
  841. package/dist/sharing/shared.d.ts +0 -187
  842. package/dist/sharing/shared.js +0 -563
  843. package/dist/store/embeddings/local.d.ts +0 -15
  844. package/dist/store/embeddings/local.js +0 -192
  845. package/dist/store/embeddings/provider.d.ts +0 -77
  846. package/dist/store/markdown.d.ts +0 -10
  847. package/dist/store/recall-scope.d.ts +0 -138
  848. package/dist/store/recall-scope.js +0 -216
  849. package/dist/store/vector-writes.d.ts +0 -13
  850. package/dist/store/vector-writes.js +0 -89
  851. /package/dist/{store → core}/object-types.d.ts +0 -0
  852. /package/dist/{store → core}/object-types.js +0 -0
  853. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
  854. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  855. /package/dist/{capture → util}/compaction-items.js +0 -0
@@ -2,14 +2,26 @@
2
2
  * Regex picks WHAT is a candidate; it cannot say what is worth keeping, so
3
3
  * every captured memory currently lands on a flat schema_fit of 0.5. */
4
4
  import { fetchWithRetry } from '../util/http-retry.js';
5
- import { errorMessage, log } from '../util/log.js';
5
+ import { errorFields, errorMessage, log } from '../util/log.js';
6
+ import { readCappedJson } from '../util/capped-json.js';
7
+ import { isJsonNumber, isJsonObject, isJsonString } from '../util/json.js';
6
8
  const ENDPOINT = 'https://api.typesafe.ai/v1/systemone';
7
9
  const DEFAULT_MODEL = 'jev-1.13.0';
8
10
  const MAX_CONCURRENCY = 8;
11
+ // An honest reply is three short answers, a few hundred bytes; 1 MiB leaves room for a verbose envelope.
12
+ const JUDGE_MAX_REPLY_BYTES = 1024 * 1024;
13
+ /** One named answer of a Jev reply `{ answers: { <name>: Answer } }`; an empty object when the reply has none of that shape. */
14
+ function answerNamed(reply, name) {
15
+ const answers = isJsonObject(reply) ? reply.answers : undefined;
16
+ const answer = isJsonObject(answers) ? answers[name] : undefined;
17
+ return isJsonObject(answer) ? answer : {};
18
+ }
9
19
  const QUESTIONS = {
10
20
  durable: {
11
21
  type: 'noul',
12
- instructions: 'This text was extracted from an AI coding agent transcript as a candidate memory. It is worth storing long-term only if it would still be useful to a future agent working on this codebase weeks from now: a durable preference, a convention, a decision with a reason, or a gotcha that will recur. Transient chatter, one-off status, restatements of code already in the repo, and anything only true inside this one session are not worth storing.',
22
+ instructions: 'This text was extracted from an AI coding agent transcript as a candidate memory. It is worth storing long-term only if it would still be useful to ' +
23
+ 'a future agent working on this codebase weeks from now: a durable preference, a convention, a decision with a reason, or a gotcha that will recur. ' +
24
+ 'Transient chatter, one-off status, restatements of code already in the repo, and anything only true inside this one session are not worth storing.',
13
25
  },
14
26
  kind: {
15
27
  type: 'choice',
@@ -36,7 +48,7 @@ const QUESTIONS = {
36
48
  const KINDS = ['error', 'decision', 'convention', 'preference', 'trivia'];
37
49
  const VALENCES = ['critical', 'negative', 'positive', 'neutral'];
38
50
  function oneOf(value, allowed) {
39
- return allowed.find((option) => option === value) ?? null;
51
+ return isJsonString(value) ? allowed.find((option) => option === value) ?? null : null;
40
52
  }
41
53
  /** `verified` is unreachable: that tier means a human or a test confirmed it. */
42
54
  function toConfidenceTier(kindConfidence) {
@@ -63,14 +75,19 @@ async function post(content, opts) {
63
75
  }, { timeoutMs: JUDGE_TIMEOUT_MS, fetchFn: opts.fetcher });
64
76
  }
65
77
  catch (err) {
66
- log.debug(`judge: request failed: ${errorMessage(err)}`);
78
+ log.warn(`judge: request failed: ${errorMessage(err)}`, errorFields(err));
67
79
  return null;
68
80
  }
69
- return res.ok ? res : null;
81
+ if (res.ok)
82
+ return res;
83
+ // The body is the server's reply, never the request, so it cannot hold the key.
84
+ const snippet = (await res.text().catch(() => '')).slice(0, 200);
85
+ log.warn('judge: non-2xx reply', { status: res.status, body: snippet });
86
+ return null;
70
87
  }
71
88
  /** `null` on any failure, so a Jev outage degrades capture to today's
72
89
  * behaviour instead of blocking the write. */
73
- export async function judge(content, opts) {
90
+ async function judge(content, opts) {
74
91
  const trimmed = content.trim();
75
92
  if (trimmed.length < 3)
76
93
  return null;
@@ -79,21 +96,19 @@ export async function judge(content, opts) {
79
96
  return null;
80
97
  let data;
81
98
  try {
82
- // SAFETY: the documented Jev response is `{ answers: { <name>: Answer } }`
83
- // keyed by the question names posted above; every field read below is
84
- // optional-chained and range-checked before use, so a lie here returns null.
85
- data = await res.json();
99
+ data = await readCappedJson(res, JUDGE_MAX_REPLY_BYTES);
86
100
  }
87
101
  catch (err) {
88
102
  log.debug(`judge: unreadable response: ${errorMessage(err)}`);
89
103
  return null;
90
104
  }
91
- const durable = data.answers?.durable?.noul;
92
- const kind = oneOf(data.answers?.kind?.choice, KINDS);
93
- const valence = oneOf(data.answers?.valence?.choice, VALENCES);
94
- if (durable === undefined || durable < 0 || durable > 1 || !kind || !valence)
105
+ const durable = answerNamed(data, 'durable').noul;
106
+ const kindAnswer = answerNamed(data, 'kind');
107
+ const kind = oneOf(kindAnswer.choice, KINDS);
108
+ const valence = oneOf(answerNamed(data, 'valence').choice, VALENCES);
109
+ if (!isJsonNumber(durable) || durable < 0 || durable > 1 || !kind || !valence)
95
110
  return null;
96
- const kindConfidence = data.answers?.kind?.confidence ?? 0;
111
+ const kindConfidence = isJsonNumber(kindAnswer.confidence) ? kindAnswer.confidence : 0;
97
112
  return { durable, kind, valence, confidence: toConfidenceTier(kindConfidence), kindConfidence };
98
113
  }
99
114
  /** Judge many candidates under a bounded concurrency pool, order preserved. */
@@ -280,7 +280,7 @@ export default function register(api) {
280
280
  // --- Tool: hippo_outcome ---
281
281
  api.registerTool((ctx) => ({
282
282
  name: 'hippo_outcome',
283
- description: 'Report whether recalled memories were useful. Strengthens good memories (+5 days half-life) and weakens bad ones (-3 days). Call after completing work.',
283
+ description: "Report whether recalled memories were useful. Good outcomes slow a memory's decay and bad ones speed it up, in proportion to its record. Call after completing work.",
284
284
  parameters: {
285
285
  type: 'object',
286
286
  properties: {
@@ -1,34 +1,12 @@
1
- /**
2
- * Deterministic entity extraction.
3
- *
4
- * Populates the graph from the already-structured consolidated first-class object tables -
5
- * NO NLP, no precision gate for entities + supersedes. The graph is a pure derived
6
- * function of the current object state, so `extractGraph` is an idempotent REBUILD: derive
7
- * entities + `supersedes` relations from decisions /
8
- * policies / customer_notes / project_briefs (the four object types whose kind maps to the
9
- * `entity_type` enum), then write only their difference from the stored rows. All writes go
10
- * through the src/store/graph-writes.ts consolidated-source guard; this module issues no raw SQL.
11
- *
12
- * Pass 3 adds the
13
- * first CROSS-OBJECT relations: a deterministic NAME-MATCH heuristic that emits a
14
- * `references` edge when one consolidated object's text contains another entity's name.
15
- * It is conservative (word-boundary, length-bounded, ambiguity-guarded, per-source
16
- * capped); its precision is measured + reported, not assumed.
17
- *
18
- * Deferred (follow-ups): NLP prose-extraction (semantic depends-on / blocked-by / owns);
19
- * skill/incident/process entities (not in the entity_type enum - needs a migration); the
20
- * `hippo sleep` enqueue-hook.
21
- */
1
+ /** Deterministic entity extraction: the graph is a pure function of the consolidated object tables (decisions, policies, customer_notes, project_briefs).
2
+ * Writes go through the src/store/graph-writes.ts consolidated-source guard. Pass 3 adds `references` edges by a conservative name-match heuristic. */
22
3
  import { type EntityType } from '../store/graph-rows.js';
23
4
  import { type DesiredGraph } from './delta.js';
24
5
  import { type WriteBudget } from '../util/write-budget.js';
25
- /** Per-type load cap (the loaders default to 100). A type whose active or superseded
26
- * set exceeds this is truncated; `ExtractResult.truncated` records it so the
27
- * incompleteness is observable rather than silent. */
6
+ /** Per-type load cap (the loaders default to 100); a type over it is truncated and `ExtractResult.truncated` records that. */
28
7
  export declare const MAX_EXTRACT_PER_TYPE = 10000;
29
- /** A target entity name must be in [MIN, MAX] chars to be matched: MIN skips short /
30
- * generic words; MAX skips prose (a decision's prose name is never a target, only a
31
- * source). */
8
+ /** A target entity name must be in [MIN, MAX] chars to be matched: MIN skips short, generic words; MAX skips prose
9
+ * (a decision's prose name is never a target, only a source). */
32
10
  export declare const MIN_REF_NAME_LEN = 4;
33
11
  export declare const MAX_REF_NAME_LEN = 80;
34
12
  /** Per-source cap so one object cannot explode the graph with references edges. */
@@ -1,24 +1,5 @@
1
- /**
2
- * Deterministic entity extraction.
3
- *
4
- * Populates the graph from the already-structured consolidated first-class object tables -
5
- * NO NLP, no precision gate for entities + supersedes. The graph is a pure derived
6
- * function of the current object state, so `extractGraph` is an idempotent REBUILD: derive
7
- * entities + `supersedes` relations from decisions /
8
- * policies / customer_notes / project_briefs (the four object types whose kind maps to the
9
- * `entity_type` enum), then write only their difference from the stored rows. All writes go
10
- * through the src/store/graph-writes.ts consolidated-source guard; this module issues no raw SQL.
11
- *
12
- * Pass 3 adds the
13
- * first CROSS-OBJECT relations: a deterministic NAME-MATCH heuristic that emits a
14
- * `references` edge when one consolidated object's text contains another entity's name.
15
- * It is conservative (word-boundary, length-bounded, ambiguity-guarded, per-source
16
- * capped); its precision is measured + reported, not assumed.
17
- *
18
- * Deferred (follow-ups): NLP prose-extraction (semantic depends-on / blocked-by / owns);
19
- * skill/incident/process entities (not in the entity_type enum - needs a migration); the
20
- * `hippo sleep` enqueue-hook.
21
- */
1
+ /** Deterministic entity extraction: the graph is a pure function of the consolidated object tables (decisions, policies, customer_notes, project_briefs).
2
+ * Writes go through the src/store/graph-writes.ts consolidated-source guard. Pass 3 adds `references` edges by a conservative name-match heuristic. */
22
3
  import { applyGraphOps } from './write.js';
23
4
  import { runGraphRebuildTransaction } from '../store/graph-writes.js';
24
5
  import { MAX_ENTITY_NAME_LEN } from '../store/graph-rows.js';
@@ -31,14 +12,10 @@ import { loadCustomerNotes } from '../objects/customer-notes.js';
31
12
  import { loadProjectBriefs } from '../objects/project-briefs.js';
32
13
  import { assertTenantId } from '../store/tenant.js';
33
14
  import { escapeRegex } from '../util/escape.js';
34
- /** Per-type load cap (the loaders default to 100). A type whose active or superseded
35
- * set exceeds this is truncated; `ExtractResult.truncated` records it so the
36
- * incompleteness is observable rather than silent. */
15
+ /** Per-type load cap (the loaders default to 100); a type over it is truncated and `ExtractResult.truncated` records that. */
37
16
  export const MAX_EXTRACT_PER_TYPE = 10000;
38
- // --- Pass 3 (cross-object references) tunables ------------------------------------
39
- /** A target entity name must be in [MIN, MAX] chars to be matched: MIN skips short /
40
- * generic words; MAX skips prose (a decision's prose name is never a target, only a
41
- * source). */
17
+ /** A target entity name must be in [MIN, MAX] chars to be matched: MIN skips short, generic words; MAX skips prose
18
+ * (a decision's prose name is never a target, only a source). */
42
19
  export const MIN_REF_NAME_LEN = 4;
43
20
  export const MAX_REF_NAME_LEN = 80;
44
21
  /** Per-source cap so one object cannot explode the graph with references edges. */
@@ -72,11 +49,8 @@ function sourceObjectOf(entityType, e2Id) {
72
49
  function pairKey(a, b) {
73
50
  return a < b ? `${a}:${b}` : `${b}:${a}`;
74
51
  }
75
- /**
76
- * Close over one loader's row type so the table below holds uniform functions without erasing it.
77
- * Loads ACTIVE + SUPERSEDED rows (excluding `closed` = retired) in one call per status, so
78
- * MAX_EXTRACT_PER_TYPE is a per-status budget; `hitCap` is set when either load is full.
79
- */
52
+ /** Close over one loader's row type so the table below holds uniform functions. Loads ACTIVE and SUPERSEDED rows (not `closed`),
53
+ * one call per status, so MAX_EXTRACT_PER_TYPE is a per-status budget; `hitCap` is set when either load is full. */
80
54
  function source(entityType, load, nameOf, textOf) {
81
55
  return (hippoRoot, tenantId) => {
82
56
  const rows = [];
@@ -127,7 +101,7 @@ function deriveEntities(loaded) {
127
101
  pass.byType[entityType] = 0;
128
102
  for (const row of rows) {
129
103
  pass.allRows.push(row);
130
- // Names are uncapped at source; trimming on both sides of the cap gives the exact name insertEntity stores.
104
+ // Names are uncapped at source; trimming on both sides of the cap gives the exact name insertEntityRow stores.
131
105
  const name = (row.name ?? '').trim().slice(0, MAX_ENTITY_NAME_LEN).trim();
132
106
  const key = keyOf(row.entityType, row.e2Id);
133
107
  // A row seen twice was superseded between the two status loads; its first sighting stands.
@@ -246,7 +220,7 @@ export function extractGraph(hippoRoot, tenantId) {
246
220
  // Loaded first: opening a second connection under the rebuild's BEGIN IMMEDIATE dead-locks ('database is locked').
247
221
  const derived = deriveGraph(loadGraphSources(hippoRoot, tenantId));
248
222
  // Diffed and applied under one lock, so two concurrent rebuilds serialize instead of both inserting a missing row.
249
- const skipped = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb, hippoRoot, tenantId, graphDelta(txDb, tenantId, derived), { from: 0, holdMs: Infinity }).skipped);
223
+ const skipped = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb, tenantId, graphDelta(txDb, tenantId, derived), { from: 0, holdMs: Infinity }).skipped);
250
224
  return resultOf(derived, skipped);
251
225
  }
252
226
  /** extractGraph for sleep: diffs outside the lock, then applies in transactions of about `budget.holdMs` with a pause
@@ -263,7 +237,7 @@ export async function extractGraphChunked(hippoRoot, tenantId, budget = WRITE_BU
263
237
  await budget.pause(committedAt);
264
238
  const from = next;
265
239
  // Sleep's wait, not a server request's 250 ms: each chunk is a fresh BEGIN IMMEDIATE a hook's write could otherwise fail.
266
- const chunk = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb, hippoRoot, tenantId, ops, { from, holdMs: budget.holdMs, clock: budget.clock }), { busyWaitMs: SLEEP_DB_WAIT_MS });
240
+ const chunk = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb, tenantId, ops, { from, holdMs: budget.holdMs, clock: budget.clock }), { busyWaitMs: SLEEP_DB_WAIT_MS });
267
241
  committedAt = budget.clock();
268
242
  next = chunk.next;
269
243
  skipped += chunk.skipped;
@@ -17,9 +17,8 @@ export interface GraphExpandOpts {
17
17
  tenantId: string;
18
18
  /** Mirror the recall handler's hard filters when re-loading graph-reached rows. */
19
19
  includeSuperseded?: boolean;
20
- /** ISO date; bi-temporal as-of filter applied to graph-reached rows (full rule, matching
21
- * cmdRecall: a row is visible if valid_from <= asOf AND, when superseded, its successor
22
- * was not yet valid at asOf). */
20
+ /** ISO date; bi-temporal as-of filter applied to graph-reached rows, matching cmdRecall:
21
+ * visible if valid_from <= asOf and, when superseded, its successor was not yet valid at asOf. */
23
22
  asOf?: string;
24
23
  /** Token budget for the augmented set (defaults to DEFAULT_RECALL_BUDGET, matching recall). */
25
24
  budget?: number;
@@ -28,28 +27,16 @@ export interface GraphExpandOpts {
28
27
  /** The recall --min-results floor: this many top base rows are kept regardless of
29
28
  * budget, so graph expansion never violates the floor. Defaults to 1. */
30
29
  minResults?: number;
31
- /** Recall-side envelope scope rule applied to graph-REACHED memories (the injected
32
- * rows), mirroring shared.ts SearchBothOptions.recallScope. Omitted = default-deny
33
- * (private + quarantine scopes excluded, NULL passes) — the fail-closed default for
34
- * bare/SDK callers. { requested, additive: true } = CLI --scope unlock semantics
35
- * (passesCliRecallScopeFilter); additive false/absent with requested set = api
36
- * exact-narrowing semantics (passesScopeFilterForRecall). Base results are the
37
- * caller's responsibility (they passed through the caller's own scope filter). */
30
+ /** Recall-side scope rule applied to graph-REACHED memories only (base results already passed the caller), mirroring HybridSearchOptions.recallScope.
31
+ * Omitted = default-deny (private and quarantine excluded, NULL passes), the fail-closed default for SDK callers.
32
+ * { requested, additive: true } is CLI --scope unlock (passesCliRecallScopeFilter); otherwise exact narrowing (passesScopeFilterForRecall). */
38
33
  recallScope?: {
39
34
  requested?: string;
40
35
  additive?: boolean;
41
36
  ownScope?: string;
42
37
  };
43
38
  }
44
- /**
45
- * Augment `baseResults` with memories reached by walking the graph `hops` edges out from
46
- * the seed results' entities (across the local AND global stores). Each graph hit is
47
- * inserted directly after the base result it descends from, scored just below that seed;
48
- * the base list's own order is preserved. Token-budget-bounded; deduped against the base
49
- * set and across stores.
50
- *
51
- * No-op (returns `baseResults` unchanged) when `hops <= 0`, there are no base results, the
52
- * graph is empty, no seed maps to an entity, or nothing new survives the filters/budget.
53
- */
39
+ /** Augment `baseResults` with memories reached by walking `hops` graph edges from the seeds across local AND global stores, each placed after its seed.
40
+ * Returns `baseResults` unchanged when `hops <= 0`, there are no base results, or nothing new survives the filters and the token budget. */
54
41
  export declare function graphExpandRecall(baseResults: SearchResult[], opts: GraphExpandOpts): SearchResult[];
55
42
  //# sourceMappingURL=recall.d.ts.map
@@ -1,46 +1,12 @@
1
- /**
2
- * Multi-hop graph recall.
3
- *
4
- * READ-ONLY consumer of the graph substrate (entities/relations built by graph-extract,
5
- * guarded by the graph-on-consolidated triggers). Given the lexical recall seeds, walk the relations graph up to N
6
- * hops and surface the memories of reached entities that the lexical search did not
7
- * already return.
8
- *
9
- * Relation-type-AGNOSTIC: it walks whatever edges exist. Today the graph holds only
10
- * `supersedes` edges (so a 1-hop walk surfaces a supersession-linked predecessor/
11
- * successor a lexical search may miss); the moment extraction emits cross-object edges
12
- * (owns/depends-on/blocked-by/references) the SAME traversal lights up cross-entity
13
- * multi-hop with zero rework here.
14
- *
15
- * Design points:
16
- * 1. Graph-reached memories are loaded DIRECTLY by id (tenant-scoped PK fetch), NOT
17
- * intersected with the recall handler's candidate set — that set is lexically
18
- * prefiltered (loadSearchRows filters by query tokens), so intersecting would exclude
19
- * exactly the lexically-orthogonal neighbours graph recall exists to surface. We
20
- * re-apply the recall HARD filters to the directly-loaded rows: the FULL bi-temporal
21
- * as-of rule (valid_from <= asOf AND, for a superseded row, successor.valid_from >
22
- * asOf — same as cmdRecall) and the default superseded-drop. SCOPE is intentionally
23
- * NOT re-applied: the CLI caller (cmdRecall) does not hard-filter scope either (it
24
- * only soft-boosts it). Rows are tenant-scoped + archived-excluded (loadEntriesByIds).
25
- * 2. A graph hit inherits its origin seed's relevance (minus a per-hop discount) and is
26
- * placed adjacent to that seed; budget selection is by score so a high-value hit wins
27
- * a token slot over a noise distractor. Dead-last appending made the feature do
28
- * nothing at realistic budgets.
29
- * 3. BOTH the local and global stores are expanded — a global seed's entities/relations
30
- * live under the global root, so graph recall must traverse each seed in the store its
31
- * graph lives in.
32
- * 4. By-id loads are chunked at 500 (loadEntriesByIds caps at 500/call), so a high-fanout
33
- * traversal (--hops 3 --max-neighbors 200 -> up to 600 ids) loses none.
34
- *
35
- * No graph writes (only SELECTs via graph.ts read helpers + store reads), so the
36
- * check-graph-writes lint permits this module living outside graph.ts.
37
- */
1
+ /** Multi-hop graph recall: a READ-ONLY walk of the relations graph from the lexical seeds, surfacing reached entities' memories the lexical search missed.
2
+ * Reached rows load by id (not intersected with the lexically prefiltered candidates), then the recall hard filters are re-applied.
3
+ * Hits inherit their seed's score minus a per-hop discount; both stores are expanded; no writes, so check-graph-writes permits it outside graph.ts. */
38
4
  import { loadEntriesByIds } from '../store/entry-reads.js';
39
5
  import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
40
6
  import { estimateTokens } from '../util/token-text.js';
41
7
  import { compareEntryIdentity, compareScoresDesc } from '../core/compare.js';
42
8
  import { loadEntitiesByMemoryId, loadEntitiesByIds, loadNeighborRelations } from '../store/graph-reads.js';
43
- import { passesCliRecallScopeFilter, passesScopeFilterForRecall } from '../store/recall-scope.js';
9
+ import { passesCliRecallScopeFilter, passesScopeFilterForRecall } from '../core/recall-scope.js';
44
10
  /** Hard cap on `--hops` (a higher value just walks more of a finite graph; this bounds
45
11
  * worst-case work and keeps the flag honest). */
46
12
  export const MAX_HOPS = 3;
@@ -63,14 +29,10 @@ function loadByIdsChunked(root, tenantId, ids) {
63
29
  }
64
30
  /** BFS, both directions, up to `hops`: each reached entity's via, and the base memory it descends from. */
65
31
  function walkRelations(root, tenantId, seedEntities, hops, maxNeighbors) {
66
- // `visited` prevents re-expansion (cycle-safe).
67
- // `originMemByEntityId` propagates the base-result memory id each reached node descends
68
- // from (for adjacency placement + score inheritance).
32
+ // `visited` makes expansion cycle-safe; `originMemByEntityId` carries each node's base-result memory id for adjacency placement and score inheritance.
69
33
  const visitedEntityIds = new Set(seedEntities.map((e) => e.id));
70
34
  const reached = new Map();
71
- // A seed/reached entity whose mirror was forgotten/pruned has a null memoryId; the map
72
- // tolerates null so traversal still propagates origin, and the null is dropped before
73
- // any memory load below (a mirror-less node has no memory to surface).
35
+ // A seed/reached entity whose mirror was forgotten or pruned has a null memoryId; traversal still propagates origin and the null is dropped before any load.
74
36
  const originMemByEntityId = new Map();
75
37
  for (const se of seedEntities)
76
38
  originMemByEntityId.set(se.id, se.memoryId);
@@ -117,11 +79,8 @@ function walkRelations(root, tenantId, seedEntities, hops, maxNeighbors) {
117
79
  /** The recall hard filters (as-of, superseded, scope) re-applied to a directly loaded graph-reached row. */
118
80
  function passesRecallFilters(mem, via, successorValidFrom, opts) {
119
81
  const { includeSuperseded, asOfDate, recallScope } = opts;
120
- // A node reached as the `to` endpoint of a `supersedes` edge IS the superseded
121
- // (older) version — the graph is the authoritative signal (the memory mirror's
122
- // `superseded_by` is NOT set by `hippo decide`, only the decisions table is). By
123
- // default recall shows current truth, so drop it unless --include-superseded; the
124
- // `from` endpoint (the newer successor) is always kept.
82
+ // The `to` endpoint of a `supersedes` edge IS the superseded version; the graph is authoritative because `hippo decide` does not set `superseded_by`.
83
+ // Drop it unless --include-superseded; the newer `from` endpoint is always kept.
125
84
  const isSupersededEndpoint = via.relType === 'supersedes' && via.direction === 'to';
126
85
  if (asOfDate) {
127
86
  if (new Date(mem.valid_from) > asOfDate)
@@ -187,10 +146,8 @@ function buildGraphHit(mem, via, originScore) {
187
146
  graphVia: via,
188
147
  };
189
148
  }
190
- // Reached entities -> source memory ids -> load DIRECTLY by id (chunked), not lexical.
191
- // A mirror-less reached entity (memoryId === null) has no memory to load: drop its null
192
- // id BEFORE it reaches loadByIdsChunked / the Set<string> (it cannot be recall-surfaced;
193
- // it stays in entities/relations for graph extract / visualization).
149
+ // Reached entities -> source memory ids -> load by id (chunked). A mirror-less entity (memoryId === null) has no memory to surface,
150
+ // so drop its null id before it reaches loadByIdsChunked.
194
151
  function loadReachedMemories(root, tenantId, reachedEntities, seenMemoryIds) {
195
152
  const needLoad = [...new Set(reachedEntities
196
153
  .map((e) => e.memoryId)
@@ -205,16 +162,8 @@ function loadSuccessorValidFrom(root, tenantId, loadedById, asOfDate) {
205
162
  const succIds = [...new Set([...loadedById.values()].map((m) => m.superseded_by).filter((id) => !!id))];
206
163
  return new Map(loadByIdsChunked(root, tenantId, succIds).map((m) => [m.id, m.valid_from]));
207
164
  }
208
- /**
209
- * Augment `baseResults` with memories reached by walking the graph `hops` edges out from
210
- * the seed results' entities (across the local AND global stores). Each graph hit is
211
- * inserted directly after the base result it descends from, scored just below that seed;
212
- * the base list's own order is preserved. Token-budget-bounded; deduped against the base
213
- * set and across stores.
214
- *
215
- * No-op (returns `baseResults` unchanged) when `hops <= 0`, there are no base results, the
216
- * graph is empty, no seed maps to an entity, or nothing new survives the filters/budget.
217
- */
165
+ /** Augment `baseResults` with memories reached by walking `hops` graph edges from the seeds across local AND global stores, each placed after its seed.
166
+ * Returns `baseResults` unchanged when `hops <= 0`, there are no base results, or nothing new survives the filters and the token budget. */
218
167
  export function graphExpandRecall(baseResults, opts) {
219
168
  const { hops, hippoRoot, globalRoot, tenantId } = opts;
220
169
  if (hops <= 0 || baseResults.length === 0)
@@ -242,9 +191,7 @@ export function graphExpandRecall(baseResults, opts) {
242
191
  return mergeKeptHits(baseResults, hitsByOrigin, keep);
243
192
  }
244
193
  function sortHitsWithinOrigin(hitsByOrigin) {
245
- // Closer hops first within each origin group, then by inherited score.
246
- // Hops asc and score desc are both true primary keys (unchanged);
247
- // compareEntryIdentity is only the TAIL for a same-hop, same-score tie.
194
+ // Closer hops first within each origin group, then by inherited score; compareEntryIdentity only breaks same-hop, same-score ties.
248
195
  for (const hits of hitsByOrigin.values()) {
249
196
  hits.sort((a, b) => {
250
197
  const byHops = a.graphVia.hops - b.graphVia.hops;
@@ -258,17 +205,8 @@ function sortHitsWithinOrigin(hitsByOrigin) {
258
205
  function selectWithinBudget(baseResults, allHits, opts) {
259
206
  const budget = opts.budget ?? DEFAULT_RECALL_BUDGET;
260
207
  const minResults = opts.minResults ?? 1;
261
- // Budget SELECTION by score (not by position): a high-value graph hit (it inherits its
262
- // origin seed's relevance) must be able to win a token slot over a low-score lexical
263
- // distractor — otherwise a tight --budget keeps the noise and drops the memory --hops
264
- // surfaced. The greedy pack uses `continue` (not `break`), so a hit's origin seed is
265
- // NOT guaranteed kept just because the hit is; the DISPLAY loop guards that (a hit is
266
- // emitted ONLY under a kept seed, never orphaned). At least one result is always kept.
267
- // (NOTE: at a tight budget a new graph hit can displace a weakly-scored base result;
268
- // aggregate recall stays >= baseline, the displaced item is the lowest-value one.)
269
- // Protect the top --min-results base rows from eviction (graph expansion must not
270
- // violate the recall min-results floor). They are kept regardless of budget;
271
- // baseResults is score-ordered, so slice(0, N) is the top N.
208
+ // Budget selection is by score, not position, so a high-value graph hit can beat a low-score lexical distractor; the greedy pack uses `continue`,
209
+ // so the DISPLAY loop emits a hit only under a kept seed. The top --min-results base rows are never evicted; at least one result is kept.
272
210
  const protectedCount = Math.min(Math.max(minResults, 1), baseResults.length);
273
211
  const keep = new Set(baseResults.slice(0, protectedCount));
274
212
  const price = opts.cost ?? ((r) => r.tokens);
@@ -1,30 +1,8 @@
1
- /**
2
- * Graph-retrieval ranked-list stream for RRF fusion.
3
- *
4
- * READ-ONLY consumer of the entity/relation graph. Produces a ranked list of
5
- * `entries[]` indices ordered by graph
6
- * proximity to the strong lexical seeds, for use as a 3rd fusion input to `rrfFuse`
7
- * beside BM25 + dense (src/search.ts hybridSearch, scoring:'rrf').
8
- *
9
- * DISTINCT from graph-recall.ts: that INJECTS out-of-pool neighbours post-hoc; this
10
- * RE-RANKS within the already-filtered candidate pool. It only assigns ranks to
11
- * entries that are (a) graph-reached from a seed AND (b) present in `entries[]`. Seeds
12
- * themselves are never scored (they already rank via BM25/dense; scoring them would
13
- * double-count and dilute the orthogonal graph signal).
14
- *
15
- * Reuses the BFS traversal shape from graph-recall.ts (loadEntitiesByMemoryId
16
- * seeds -> loadNeighborRelations BFS both directions, per-hop fanout cap, visited set
17
- * -> loadEntitiesByIds to resolve reached -> memoryId). Expands across the local AND
18
- * global stores. Pure reads (SELECTs only via graph.ts helpers), so the
19
- * check-graph-writes lint permits this module living outside graph.ts.
20
- *
21
- * The graph stream's score scale (1/lexRank seed strength x decay^hops) only sets the
22
- * WITHIN-graph-stream ORDERING; RRF then re-ranks the list by 1/(k + graphRank), so the
23
- * absolute magnitude is washed out by fusion. Do not tune the scale expecting a
24
- * fused-score effect — only the induced order matters.
25
- */
1
+ /** Graph-retrieval ranked-list stream for RRF fusion: READ-ONLY, ranks `entries[]` indices by graph proximity to the strong lexical seeds.
2
+ * Unlike graph recall it only re-ranks in-pool, graph-reached, non-seed entries; scoring seeds would double-count BM25/dense.
3
+ * The score scale only sets the order inside this stream (RRF re-ranks by 1/(k + graphRank)), so do not tune it for a fused-score effect. */
26
4
  import type { MemoryEntry } from '../core/memory.js';
27
- /** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph-recall). */
5
+ /** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph recall). */
28
6
  export declare const DEFAULT_GRAPH_HOPS = 2;
29
7
  /** Default per-hop multiplicative decay applied to the seed strength. */
30
8
  export declare const DEFAULT_GRAPH_DECAY = 0.5;
@@ -52,19 +30,9 @@ export interface GraphStreamOpts {
52
30
  /** Per-hop fanout cap. Default DEFAULT_MAX_NEIGHBORS. */
53
31
  maxNeighbors?: number;
54
32
  }
55
- /**
56
- * Pick the top `seedCount` candidates by best lexical rank (lowest position across the
57
- * BM25 and dense ranked lists), with strength = 1/(bestRank + 1). Pure; exported for
58
- * direct unit testing. A candidate present in either ranked list is eligible.
59
- */
33
+ /** Pick the top `seedCount` candidates by best lexical rank (lowest position across BM25 and dense), strength = 1/(bestRank + 1). Pure. */
60
34
  export declare function selectGraphSeeds(bm25Ranked: ReadonlyArray<number>, cosineRanked: ReadonlyArray<number>, seedCount: number): GraphSeed[];
61
- /**
62
- * Produce the graph-retrieval ranked list: `entries[]` indices ordered by graph
63
- * proximity (desc) to the lexical `seeds`. Only graph-reached, in-pool, non-seed
64
- * indices appear; the rest are absent (-> rrfFuse absentRank). Pure reads.
65
- *
66
- * Returns `[]` when there are no seeds/entries, the graph is empty, no seed maps to an
67
- * entity, or nothing reached is in-pool — the caller then skips the 3rd fusion list.
68
- */
35
+ /** Produce the graph-retrieval ranked list: `entries[]` indices by graph proximity (desc) to the lexical `seeds`; absent indices fall to rrfFuse absentRank.
36
+ * Returns `[]` when there are no seeds/entries, the graph is empty, or nothing reached is in-pool, so the caller skips the 3rd fusion list. */
69
37
  export declare function graphRankStream(entries: ReadonlyArray<MemoryEntry>, seeds: ReadonlyArray<GraphSeed>, opts: GraphStreamOpts): number[];
70
38
  //# sourceMappingURL=stream.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { loadEntitiesByMemoryId, loadEntitiesByIds, loadNeighborRelations } from '../store/graph-reads.js';
2
2
  import { MAX_HOPS, DEFAULT_MAX_NEIGHBORS } from './recall.js';
3
- /** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph-recall). */
3
+ /** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph recall). */
4
4
  export const DEFAULT_GRAPH_HOPS = 2;
5
5
  /** Default per-hop multiplicative decay applied to the seed strength. */
6
6
  export const DEFAULT_GRAPH_DECAY = 0.5;
@@ -9,11 +9,7 @@ export const DEFAULT_GRAPH_SEED_COUNT = 10;
9
9
  /** Recommended RRF weight for the graph stream — a CLI-only convenience default. The
10
10
  * library `graphStream.weight` option stays REQUIRED (opt-in is explicit). */
11
11
  export const DEFAULT_GRAPH_STREAM_WEIGHT = 0.5;
12
- /**
13
- * Pick the top `seedCount` candidates by best lexical rank (lowest position across the
14
- * BM25 and dense ranked lists), with strength = 1/(bestRank + 1). Pure; exported for
15
- * direct unit testing. A candidate present in either ranked list is eligible.
16
- */
12
+ /** Pick the top `seedCount` candidates by best lexical rank (lowest position across BM25 and dense), strength = 1/(bestRank + 1). Pure. */
17
13
  export function selectGraphSeeds(bm25Ranked, cosineRanked, seedCount) {
18
14
  if (seedCount <= 0)
19
15
  return [];
@@ -33,11 +29,8 @@ export function selectGraphSeeds(bm25Ranked, cosineRanked, seedCount) {
33
29
  .slice(0, seedCount)
34
30
  .map(([index, best]) => ({ index, strength: 1 / (best + 1) }));
35
31
  }
36
- // Pass 1: accumulate the STRONGEST reaching-seed strength per new neighbour across ALL
37
- // relations at this depth BEFORE committing any to `visited`. Marking a node
38
- // visited mid-loop would lock it to whichever relation SQLite returned first, so a later
39
- // edge from a STRONGER lexical seed would be dropped and the neighbour mis-scored. A node
40
- // already in `visited` was committed at an earlier (shorter) depth and keeps that score.
32
+ // Pass 1: take the STRONGEST reaching-seed strength per new neighbour across ALL relations at this depth before committing any to `visited`;
33
+ // marking mid-loop would lock a node to whichever relation SQLite returned first and drop a stronger seed's later edge.
41
34
  function bestStrengthAtDepth(rels, frontierSet, visited, frontierStrength, originStrength) {
42
35
  const bestStrengthThisDepth = new Map();
43
36
  for (const rel of rels) {
@@ -98,13 +91,8 @@ function reachedEntityScores(root, tenantId, seedIds, originStrength, options) {
98
91
  }
99
92
  return reachedScore;
100
93
  }
101
- /**
102
- * Accumulate per-entryIndex graph-proximity scores from ONE store's graph into
103
- * `graphScore`. Pure reads. `seeds` are the lexical seeds (index + strength); only the
104
- * seeds whose entities live in THIS store are expanded. The origin seed strength is
105
- * carried UNCHANGED along each BFS path; the per-hop decay is applied as decay^depth so
106
- * a neighbour's score = originSeedStrength x decay^(graph distance).
107
- */
94
+ /** Accumulate per-entryIndex graph-proximity scores from ONE store's graph into `graphScore`; only seeds whose entities live in THIS store are expanded.
95
+ * A neighbour's score = originSeedStrength x decay^(graph distance); the seed strength is carried unchanged along each BFS path. */
108
96
  function accumulateForRoot(root, seeds, entries, options) {
109
97
  const { memIdToIndex, graphScore, hops, decay, maxNeighbors, tenantId } = options;
110
98
  if (seeds.length === 0)
@@ -119,9 +107,7 @@ function accumulateForRoot(root, seeds, entries, options) {
119
107
  const seedEntities = loadEntitiesByMemoryId(root, tenantId, [...strengthByMemId.keys()]);
120
108
  if (seedEntities.length === 0)
121
109
  return;
122
- // entityId -> origin seed strength (carried unchanged along the path). A seed entity is
123
- // loaded by memory id, so its memoryId is non-null here; the guard keeps the widened
124
- // (string | null) type honest (a null-memory entity is not a lexical seed).
110
+ // entityId -> origin seed strength. Seeds load by memory id so memoryId is non-null here; the guard keeps the widened (string | null) type honest.
125
111
  const originStrength = new Map();
126
112
  for (const e of seedEntities) {
127
113
  if (e.memoryId === null)
@@ -146,14 +132,8 @@ function accumulateForRoot(root, seeds, entries, options) {
146
132
  graphScore.set(idx, Math.max(graphScore.get(idx) ?? 0, score));
147
133
  }
148
134
  }
149
- /**
150
- * Produce the graph-retrieval ranked list: `entries[]` indices ordered by graph
151
- * proximity (desc) to the lexical `seeds`. Only graph-reached, in-pool, non-seed
152
- * indices appear; the rest are absent (-> rrfFuse absentRank). Pure reads.
153
- *
154
- * Returns `[]` when there are no seeds/entries, the graph is empty, no seed maps to an
155
- * entity, or nothing reached is in-pool — the caller then skips the 3rd fusion list.
156
- */
135
+ /** Produce the graph-retrieval ranked list: `entries[]` indices by graph proximity (desc) to the lexical `seeds`; absent indices fall to rrfFuse absentRank.
136
+ * Returns `[]` when there are no seeds/entries, the graph is empty, or nothing reached is in-pool, so the caller skips the 3rd fusion list. */
157
137
  export function graphRankStream(entries, seeds, opts) {
158
138
  if (seeds.length === 0 || entries.length === 0)
159
139
  return [];
@@ -170,11 +150,8 @@ export function graphRankStream(entries, seeds, opts) {
170
150
  for (const root of roots) {
171
151
  accumulateForRoot(root, seeds, entries, { memIdToIndex, graphScore, hops, decay, maxNeighbors, tenantId: opts.tenantId });
172
152
  }
173
- // Seed-exclusion guard: graphScore is keyed by entryIndex
174
- // GLOBALLY across roots, but each root's BFS visited-set is per-root, so a memory that
175
- // is a seed in one store could be reached as a neighbour in the other store and pick up
176
- // a score via max(). Drop every seed index so the "seeds are never scored by the graph
177
- // stream" invariant holds across roots, not just within a single store's traversal.
153
+ // Seed-exclusion guard: graphScore is keyed by entryIndex across roots but each root's visited-set is per-root, so a seed in one store
154
+ // could score as a neighbour in the other; drop every seed index so "seeds are never graph-scored" holds across roots.
178
155
  for (const s of seeds)
179
156
  graphScore.delete(s.index);
180
157
  if (graphScore.size === 0)