hippo-memory 1.70.0 → 1.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-memories/claude-code.d.ts +4 -2
  3. package/dist/agent-memories/claude-code.js +14 -5
  4. package/dist/agent-memories/files.js +23 -12
  5. package/dist/agent-memories/markdown.d.ts +1 -3
  6. package/dist/agent-memories/markdown.js +1 -3
  7. package/dist/agent-memories/report.js +2 -1
  8. package/dist/agent-memories/sync.d.ts +4 -2
  9. package/dist/agent-memories/sync.js +10 -5
  10. package/dist/api/assemble.d.ts +7 -44
  11. package/dist/api/assemble.js +2 -22
  12. package/dist/api/audit.d.ts +5 -1
  13. package/dist/api/audit.js +9 -1
  14. package/dist/api/auth.d.ts +13 -22
  15. package/dist/api/auth.js +34 -24
  16. package/dist/api/auto-sleep.js +2 -2
  17. package/dist/api/availability.d.ts +2 -15
  18. package/dist/api/availability.js +2 -15
  19. package/dist/api/context-select.js +3 -4
  20. package/dist/api/context-types.d.ts +10 -35
  21. package/dist/api/context.d.ts +5 -22
  22. package/dist/api/context.js +21 -38
  23. package/dist/api/dormant.d.ts +5 -21
  24. package/dist/api/dormant.js +7 -26
  25. package/dist/api/drill-down.d.ts +7 -46
  26. package/dist/api/drill-down.js +5 -26
  27. package/dist/api/forget.d.ts +5 -24
  28. package/dist/api/forget.js +5 -28
  29. package/dist/api/graph.d.ts +8 -0
  30. package/dist/api/graph.js +7 -0
  31. package/dist/api/index.d.ts +2 -0
  32. package/dist/api/index.js +2 -0
  33. package/dist/api/instruction-detect.js +16 -5
  34. package/dist/api/ledger-db.d.ts +2 -1
  35. package/dist/api/ledger-db.js +5 -3
  36. package/dist/api/memories.d.ts +5 -0
  37. package/dist/api/memories.js +7 -0
  38. package/dist/api/objects.d.ts +9 -0
  39. package/dist/api/objects.js +11 -0
  40. package/dist/api/on-store.js +5 -3
  41. package/dist/api/predictions.d.ts +9 -0
  42. package/dist/api/predictions.js +18 -0
  43. package/dist/api/promote.d.ts +13 -17
  44. package/dist/api/promote.js +11 -19
  45. package/dist/api/prompt-hook.d.ts +4 -4
  46. package/dist/api/prompt-hook.js +10 -9
  47. package/dist/api/recall-cli.d.ts +55 -0
  48. package/dist/api/recall-cli.js +94 -0
  49. package/dist/api/recall-core.js +14 -6
  50. package/dist/api/recall-finish.d.ts +53 -0
  51. package/dist/api/recall-finish.js +30 -0
  52. package/dist/api/recall-history.d.ts +17 -84
  53. package/dist/api/recall-history.js +15 -88
  54. package/dist/api/recall-pipeline.d.ts +2 -3
  55. package/dist/api/recall-pipeline.js +16 -9
  56. package/dist/api/recall-types.d.ts +64 -304
  57. package/dist/api/recall.d.ts +5 -33
  58. package/dist/api/recall.js +59 -60
  59. package/dist/api/refine.d.ts +7 -0
  60. package/dist/api/refine.js +10 -0
  61. package/dist/api/remember-local.d.ts +57 -0
  62. package/dist/api/remember-local.js +90 -0
  63. package/dist/api/remember.d.ts +18 -1
  64. package/dist/api/remember.js +13 -1
  65. package/dist/api/sleep-run.d.ts +1 -3
  66. package/dist/api/sleep-run.js +17 -21
  67. package/dist/api/sleep.d.ts +9 -28
  68. package/dist/api/tokens.d.ts +3 -10
  69. package/dist/api/tokens.js +3 -10
  70. package/dist/api/types.d.ts +6 -29
  71. package/dist/api/types.js +4 -22
  72. package/dist/capture/command.d.ts +4 -12
  73. package/dist/capture/command.js +6 -22
  74. package/dist/capture/compact.d.ts +4 -15
  75. package/dist/capture/compact.js +16 -25
  76. package/dist/capture/compaction-record.js +101 -69
  77. package/dist/capture/compaction-spool.d.ts +1 -1
  78. package/dist/capture/compaction-spool.js +1 -1
  79. package/dist/capture/session-digest.d.ts +1 -1
  80. package/dist/capture/session-digest.js +13 -7
  81. package/dist/capture/transcript.d.ts +2 -10
  82. package/dist/capture/transcript.js +4 -18
  83. package/dist/cli/api-context.d.ts +3 -0
  84. package/dist/cli/api-context.js +6 -0
  85. package/dist/cli/audit-prune.d.ts +6 -39
  86. package/dist/cli/audit-prune.js +6 -39
  87. package/dist/cli/audit.d.ts +1 -1
  88. package/dist/cli/audit.js +33 -34
  89. package/dist/cli/auth.d.ts +2 -2
  90. package/dist/cli/auth.js +57 -39
  91. package/dist/cli/briefs.d.ts +4 -4
  92. package/dist/cli/briefs.js +18 -22
  93. package/dist/cli/card.d.ts +2 -2
  94. package/dist/cli/card.js +31 -32
  95. package/dist/cli/client.d.ts +7 -27
  96. package/dist/cli/client.js +24 -43
  97. package/dist/cli/compact-resume-payload.js +3 -2
  98. package/dist/cli/context.d.ts +1 -2
  99. package/dist/cli/context.js +12 -8
  100. package/dist/cli/continuity.d.ts +6 -6
  101. package/dist/cli/continuity.js +62 -64
  102. package/dist/cli/correction-latency.d.ts +2 -14
  103. package/dist/cli/correction-latency.js +2 -14
  104. package/dist/cli/curate.d.ts +13 -17
  105. package/dist/cli/curate.js +68 -92
  106. package/dist/cli/dag.d.ts +4 -4
  107. package/dist/cli/dag.js +33 -27
  108. package/dist/cli/decisions.d.ts +4 -4
  109. package/dist/cli/decisions.js +33 -47
  110. package/dist/cli/eval.js +15 -13
  111. package/dist/cli/exit.d.ts +6 -0
  112. package/dist/cli/exit.js +11 -0
  113. package/dist/cli/explain.d.ts +1 -2
  114. package/dist/cli/explain.js +6 -4
  115. package/dist/cli/flag-values.d.ts +6 -1
  116. package/dist/cli/flag-values.js +27 -10
  117. package/dist/cli/flags.d.ts +1 -0
  118. package/dist/cli/flags.js +1 -1
  119. package/dist/cli/github.d.ts +14 -0
  120. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  121. package/dist/cli/goals.d.ts +2 -2
  122. package/dist/cli/goals.js +46 -50
  123. package/dist/cli/hook-runtime.d.ts +9 -27
  124. package/dist/cli/hook-runtime.js +15 -31
  125. package/dist/cli/init.d.ts +2 -2
  126. package/dist/cli/init.js +6 -12
  127. package/dist/cli/install-steps.js +3 -12
  128. package/dist/cli/last-sleep.d.ts +2 -1
  129. package/dist/cli/last-sleep.js +3 -0
  130. package/dist/cli/maintenance.d.ts +4 -4
  131. package/dist/cli/maintenance.js +14 -19
  132. package/dist/cli/object-verbs.js +4 -3
  133. package/dist/cli/owner-validation.d.ts +5 -28
  134. package/dist/cli/owner-validation.js +5 -28
  135. package/dist/cli/playbooks.d.ts +4 -4
  136. package/dist/cli/playbooks.js +23 -28
  137. package/dist/cli/print.d.ts +2 -5
  138. package/dist/cli/print.js +1 -4
  139. package/dist/cli/projects.d.ts +2 -2
  140. package/dist/cli/projects.js +1 -3
  141. package/dist/cli/provenance-coverage.d.ts +2 -6
  142. package/dist/cli/provenance-coverage.js +2 -6
  143. package/dist/cli/quality-repair-once.js +2 -2
  144. package/dist/cli/recall.d.ts +2 -4
  145. package/dist/cli/recall.js +55 -131
  146. package/dist/cli/refine-llm.d.ts +5 -31
  147. package/dist/cli/refine-llm.js +9 -36
  148. package/dist/cli/remember.d.ts +3 -3
  149. package/dist/cli/remember.js +122 -180
  150. package/dist/cli/scheduler.d.ts +2 -17
  151. package/dist/cli/scheduler.js +12 -18
  152. package/dist/cli/serve.js +21 -12
  153. package/dist/cli/session-hooks.d.ts +10 -18
  154. package/dist/cli/session-hooks.js +112 -113
  155. package/dist/cli/setup.d.ts +4 -4
  156. package/dist/cli/setup.js +19 -21
  157. package/dist/cli/shared.d.ts +9 -23
  158. package/dist/cli/shared.js +9 -32
  159. package/dist/cli/slack.d.ts +2 -2
  160. package/dist/cli/slack.js +19 -23
  161. package/dist/cli/sleep.d.ts +3 -2
  162. package/dist/cli/sleep.js +15 -16
  163. package/dist/cli/status.d.ts +9 -12
  164. package/dist/cli/status.js +55 -98
  165. package/dist/cli/stdin.d.ts +4 -6
  166. package/dist/cli/stdin.js +2 -3
  167. package/dist/cli/transfer.d.ts +9 -9
  168. package/dist/cli/transfer.js +66 -89
  169. package/dist/cli/usage.js +11 -5
  170. package/dist/cli.d.ts +66 -448
  171. package/dist/cli.js +87 -263
  172. package/dist/connectors/github/backfill.d.ts +5 -25
  173. package/dist/connectors/github/backfill.js +14 -49
  174. package/dist/connectors/github/deletion.d.ts +4 -18
  175. package/dist/connectors/github/deletion.js +2 -15
  176. package/dist/connectors/github/dlq.d.ts +8 -33
  177. package/dist/connectors/github/dlq.js +12 -29
  178. package/dist/connectors/github/ingest.d.ts +2 -6
  179. package/dist/connectors/github/ingest.js +4 -10
  180. package/dist/connectors/github/octokit-client.d.ts +4 -16
  181. package/dist/connectors/github/octokit-client.js +27 -24
  182. package/dist/connectors/github/ratelimit.d.ts +3 -14
  183. package/dist/connectors/github/ratelimit.js +3 -14
  184. package/dist/connectors/github/scope.d.ts +3 -5
  185. package/dist/connectors/github/scope.js +3 -5
  186. package/dist/connectors/github/signature.d.ts +4 -26
  187. package/dist/connectors/github/signature.js +4 -26
  188. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  189. package/dist/connectors/github/tenant-routing.js +4 -26
  190. package/dist/connectors/github/transform.js +2 -16
  191. package/dist/connectors/github/types.d.ts +3 -15
  192. package/dist/connectors/github/types.js +2 -9
  193. package/dist/connectors/github/webhook.d.ts +2 -16
  194. package/dist/connectors/github/webhook.js +6 -22
  195. package/dist/connectors/slack/backfill.d.ts +4 -17
  196. package/dist/connectors/slack/backfill.js +4 -13
  197. package/dist/connectors/slack/dlq.d.ts +2 -19
  198. package/dist/connectors/slack/dlq.js +2 -19
  199. package/dist/connectors/slack/ingest.d.ts +2 -3
  200. package/dist/connectors/slack/ingest.js +2 -3
  201. package/dist/connectors/slack/scope.d.ts +2 -8
  202. package/dist/connectors/slack/scope.js +2 -8
  203. package/dist/connectors/slack/signature.d.ts +1 -6
  204. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  205. package/dist/connectors/slack/tenant-routing.js +2 -21
  206. package/dist/connectors/slack/transform.d.ts +2 -18
  207. package/dist/connectors/slack/transform.js +2 -18
  208. package/dist/connectors/slack/types.d.ts +3 -9
  209. package/dist/connectors/slack/types.js +2 -4
  210. package/dist/connectors/slack/web-client.js +33 -27
  211. package/dist/connectors/slack/webhook.d.ts +2 -19
  212. package/dist/connectors/slack/webhook.js +5 -26
  213. package/dist/connectors/slack/workspaces.d.ts +4 -24
  214. package/dist/connectors/slack/workspaces.js +4 -24
  215. package/dist/consolidate/conflicts.js +6 -14
  216. package/dist/consolidate/dag-summary.d.ts +8 -0
  217. package/dist/consolidate/dag-summary.js +41 -0
  218. package/dist/consolidate/dag.d.ts +5 -28
  219. package/dist/consolidate/dag.js +14 -75
  220. package/dist/consolidate/decay.js +7 -19
  221. package/dist/consolidate/dedupe.d.ts +6 -52
  222. package/dist/consolidate/dedupe.js +13 -71
  223. package/dist/consolidate/flush-units.d.ts +3 -4
  224. package/dist/consolidate/flush-units.js +3 -3
  225. package/dist/consolidate/half-life-migration.d.ts +3 -26
  226. package/dist/consolidate/half-life-migration.js +11 -28
  227. package/dist/consolidate/llm-passes.js +4 -21
  228. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  229. package/dist/consolidate/memory-value-weights.js +2 -13
  230. package/dist/consolidate/memory-value.d.ts +11 -84
  231. package/dist/consolidate/memory-value.js +16 -104
  232. package/dist/consolidate/merge.js +10 -31
  233. package/dist/consolidate/merged-row.js +2 -1
  234. package/dist/consolidate/physics-pass.js +1 -3
  235. package/dist/consolidate/replay.d.ts +6 -38
  236. package/dist/consolidate/replay.js +14 -52
  237. package/dist/consolidate/run.js +1 -1
  238. package/dist/consolidate/sleep.d.ts +1 -8
  239. package/dist/consolidate/sleep.js +5 -17
  240. package/dist/consolidate/trace.d.ts +3 -18
  241. package/dist/consolidate/trace.js +3 -18
  242. package/dist/consolidate/traces.js +6 -22
  243. package/dist/core/ablation.d.ts +4 -91
  244. package/dist/core/ablation.js +4 -91
  245. package/dist/core/ambient.d.ts +1 -8
  246. package/dist/core/ambient.js +1 -8
  247. package/dist/core/capture-contract.d.ts +4 -2
  248. package/dist/core/capture-contract.js +4 -2
  249. package/dist/core/card.d.ts +4 -1
  250. package/dist/core/card.js +8 -0
  251. package/dist/core/compare.d.ts +11 -67
  252. package/dist/core/compare.js +9 -63
  253. package/dist/core/config.d.ts +10 -24
  254. package/dist/core/config.js +13 -14
  255. package/dist/core/handoff.d.ts +1 -7
  256. package/dist/core/handoff.js +1 -7
  257. package/dist/core/memory-quality.js +1 -1
  258. package/dist/core/memory.d.ts +41 -164
  259. package/dist/core/memory.js +51 -221
  260. package/dist/core/package-root.d.ts +3 -0
  261. package/dist/core/package-root.js +5 -0
  262. package/dist/core/physics-config.d.ts +1 -4
  263. package/dist/core/physics-config.js +3 -8
  264. package/dist/core/physics.d.ts +15 -61
  265. package/dist/core/physics.js +59 -122
  266. package/dist/core/project-identity.d.ts +17 -58
  267. package/dist/core/project-identity.js +17 -38
  268. package/dist/core/project-remote.js +13 -2
  269. package/dist/core/raw-append-only.d.ts +5 -0
  270. package/dist/core/raw-append-only.js +7 -0
  271. package/dist/core/salience.d.ts +1 -7
  272. package/dist/core/salience.js +1 -7
  273. package/dist/dashboard/dashboard-actions.js +2 -2
  274. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  275. package/dist/dashboard/dashboard-snapshot.js +11 -2
  276. package/dist/dashboard/dashboard-types.d.ts +2 -1
  277. package/dist/dashboard/dashboard.d.ts +1 -0
  278. package/dist/dashboard/dashboard.js +50 -4
  279. package/dist/db/busy.d.ts +1 -1
  280. package/dist/db/busy.js +17 -8
  281. package/dist/db/connect.d.ts +1 -0
  282. package/dist/db/connect.js +3 -3
  283. package/dist/db/migrate.js +3 -3
  284. package/dist/db/migrations/types.d.ts +2 -5
  285. package/dist/db/migrations/v14.js +2 -3
  286. package/dist/db/migrations/v15.js +2 -8
  287. package/dist/db/migrations/v16.js +2 -3
  288. package/dist/db/migrations/v17.js +2 -3
  289. package/dist/db/migrations/v19.js +2 -5
  290. package/dist/db/migrations/v20.js +2 -7
  291. package/dist/db/migrations/v22.js +4 -17
  292. package/dist/db/migrations/v23.js +3 -14
  293. package/dist/db/migrations/v24.js +2 -4
  294. package/dist/db/migrations/v25.js +3 -8
  295. package/dist/db/migrations/v26.js +2 -13
  296. package/dist/db/migrations/v27.js +3 -11
  297. package/dist/db/migrations/v28.js +2 -14
  298. package/dist/db/migrations/v29.js +4 -18
  299. package/dist/db/migrations/v30.js +4 -16
  300. package/dist/db/migrations/v31.js +2 -15
  301. package/dist/db/migrations/v32.js +4 -22
  302. package/dist/db/migrations/v33.js +2 -15
  303. package/dist/db/migrations/v34.js +2 -11
  304. package/dist/db/migrations/v35.js +2 -11
  305. package/dist/db/migrations/v36.js +2 -11
  306. package/dist/db/migrations/v37.js +8 -33
  307. package/dist/db/migrations/v38.js +5 -38
  308. package/dist/db/migrations/v39.js +9 -20
  309. package/dist/db/migrations/v40.js +2 -9
  310. package/dist/db/migrations/v41.js +2 -24
  311. package/dist/db/migrations/v43.js +1 -1
  312. package/dist/db/migrations/v44.js +2 -8
  313. package/dist/db/migrations/v45.js +2 -7
  314. package/dist/db/migrations/v47.js +2 -3
  315. package/dist/db/migrations/v51.js +1 -1
  316. package/dist/db/open.d.ts +2 -0
  317. package/dist/db/open.js +17 -1
  318. package/dist/db/physics-state.d.ts +6 -22
  319. package/dist/db/physics-state.js +25 -36
  320. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  321. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  322. package/dist/db/vector-store.d.ts +2 -0
  323. package/dist/db/vector-store.js +8 -1
  324. package/dist/doctor.js +74 -19
  325. package/dist/entry/session-text.js +2 -1
  326. package/dist/eval/eval-stats.d.ts +15 -53
  327. package/dist/eval/eval-stats.js +12 -42
  328. package/dist/eval/eval-suite.d.ts +2 -13
  329. package/dist/eval/eval-suite.js +74 -34
  330. package/dist/eval/eval.d.ts +6 -24
  331. package/dist/eval/eval.js +7 -34
  332. package/dist/eval/judgment.d.ts +0 -3
  333. package/dist/eval/judgment.js +19 -11
  334. package/dist/extensions/openclaw-plugin/index.js +1 -1
  335. package/dist/graph/extract.d.ts +5 -27
  336. package/dist/graph/extract.js +7 -33
  337. package/dist/graph/recall.d.ts +7 -20
  338. package/dist/graph/recall.js +14 -76
  339. package/dist/graph/stream.d.ts +7 -39
  340. package/dist/graph/stream.js +11 -34
  341. package/dist/graph/view.d.ts +9 -35
  342. package/dist/graph/view.js +11 -39
  343. package/dist/hooks/codex-wrapper.js +2 -2
  344. package/dist/hooks/copilot.js +2 -1
  345. package/dist/hooks/hook-blocks.d.ts +6 -2
  346. package/dist/hooks/hook-blocks.js +37 -124
  347. package/dist/hooks/json-hooks.d.ts +4 -36
  348. package/dist/hooks/json-hooks.js +18 -57
  349. package/dist/hooks/opencode.d.ts +0 -38
  350. package/dist/hooks/opencode.js +9 -76
  351. package/dist/hooks/shared.d.ts +8 -17
  352. package/dist/hooks/shared.js +29 -20
  353. package/dist/importers/core.d.ts +12 -37
  354. package/dist/importers/core.js +9 -27
  355. package/dist/importers/markdown-parse.d.ts +8 -22
  356. package/dist/importers/markdown-parse.js +8 -25
  357. package/dist/importers/markdown.js +3 -12
  358. package/dist/importers/sources.js +7 -35
  359. package/dist/importers/vault.d.ts +2 -8
  360. package/dist/importers/vault.js +25 -81
  361. package/dist/index.d.ts +6 -2
  362. package/dist/index.js +6 -2
  363. package/dist/learn/autolearn.d.ts +14 -41
  364. package/dist/learn/autolearn.js +14 -41
  365. package/dist/learn/extract.js +2 -4
  366. package/dist/learn/forward-claim-detector.d.ts +6 -30
  367. package/dist/learn/forward-claim-detector.js +14 -66
  368. package/dist/learn/invalidation.d.ts +6 -18
  369. package/dist/learn/invalidation.js +9 -26
  370. package/dist/mcp/admin-tools.js +3 -5
  371. package/dist/mcp/memory-tools.js +4 -9
  372. package/dist/mcp/protocol.d.ts +8 -26
  373. package/dist/mcp/protocol.js +3 -6
  374. package/dist/mcp/recall-tools.js +3 -3
  375. package/dist/mcp/request.d.ts +3 -11
  376. package/dist/mcp/request.js +10 -26
  377. package/dist/mcp/server.d.ts +3 -9
  378. package/dist/mcp/server.js +5 -16
  379. package/dist/mcp/session-state.d.ts +1 -1
  380. package/dist/mcp/session-state.js +5 -11
  381. package/dist/mcp/stdio.d.ts +2 -6
  382. package/dist/mcp/stdio.js +48 -12
  383. package/dist/mcp/tools.js +5 -3
  384. package/dist/objects/customer-notes.d.ts +7 -42
  385. package/dist/objects/customer-notes.js +7 -48
  386. package/dist/objects/decisions.d.ts +12 -50
  387. package/dist/objects/decisions.js +15 -53
  388. package/dist/objects/incidents.d.ts +7 -38
  389. package/dist/objects/incidents.js +7 -41
  390. package/dist/objects/policies.d.ts +11 -89
  391. package/dist/objects/policies.js +11 -98
  392. package/dist/objects/processes.d.ts +7 -52
  393. package/dist/objects/processes.js +7 -61
  394. package/dist/objects/project-briefs.d.ts +11 -55
  395. package/dist/objects/project-briefs.js +14 -75
  396. package/dist/objects/skills.d.ts +7 -42
  397. package/dist/objects/skills.js +8 -54
  398. package/dist/postinstall.js +6 -19
  399. package/dist/predictions/planning-fallacy.d.ts +11 -34
  400. package/dist/rerankers/clef.js +3 -31
  401. package/dist/rerankers/cross-encoder.js +4 -6
  402. package/dist/rerankers/jev.js +9 -6
  403. package/dist/rerankers/llm.d.ts +2 -11
  404. package/dist/rerankers/llm.js +14 -14
  405. package/dist/rerankers/outage-warning.d.ts +2 -1
  406. package/dist/rerankers/outage-warning.js +2 -1
  407. package/dist/rerankers/remote.d.ts +1 -0
  408. package/dist/rerankers/remote.js +2 -0
  409. package/dist/rerankers/types.d.ts +2 -14
  410. package/dist/search/boosts.d.ts +0 -2
  411. package/dist/search/boosts.js +2 -2
  412. package/dist/search/goal-boost.d.ts +23 -0
  413. package/dist/search/goal-boost.js +90 -0
  414. package/dist/search/hybrid.d.ts +2 -0
  415. package/dist/search/multihop.js +2 -3
  416. package/dist/search/path-context.d.ts +5 -18
  417. package/dist/search/path-context.js +5 -18
  418. package/dist/search/physics-search.js +11 -8
  419. package/dist/search/rrf.d.ts +7 -35
  420. package/dist/search/rrf.js +5 -30
  421. package/dist/search/vector.d.ts +7 -0
  422. package/dist/search/vector.js +35 -5
  423. package/dist/server/auth.d.ts +9 -28
  424. package/dist/server/auth.js +32 -25
  425. package/dist/server/boot.d.ts +2 -21
  426. package/dist/server/boot.js +63 -96
  427. package/dist/server/client-ip.d.ts +3 -19
  428. package/dist/server/client-ip.js +5 -28
  429. package/dist/server/defaults.d.ts +3 -0
  430. package/dist/server/defaults.js +4 -0
  431. package/dist/server/key-check-bounds.d.ts +2 -1
  432. package/dist/server/lifecycle.d.ts +5 -4
  433. package/dist/server/lifecycle.js +19 -4
  434. package/dist/server/mcp-http.js +10 -44
  435. package/dist/server/rate-limit.d.ts +5 -18
  436. package/dist/server/rate-limit.js +4 -13
  437. package/dist/server/request.d.ts +4 -8
  438. package/dist/server/request.js +9 -17
  439. package/dist/server/route-table.js +42 -49
  440. package/dist/server/routes/admin.js +22 -28
  441. package/dist/server/routes/customer-notes.js +7 -12
  442. package/dist/server/routes/decisions.js +10 -17
  443. package/dist/server/routes/incidents.js +12 -20
  444. package/dist/server/routes/memories.js +12 -32
  445. package/dist/server/routes/object-routes.d.ts +0 -5
  446. package/dist/server/routes/object-routes.js +7 -15
  447. package/dist/server/routes/policies.js +10 -18
  448. package/dist/server/routes/predictions.js +13 -25
  449. package/dist/server/routes/processes.js +16 -26
  450. package/dist/server/routes/project-briefs.js +9 -16
  451. package/dist/server/routes/recall.js +10 -35
  452. package/dist/server/routes/skills.js +8 -18
  453. package/dist/server/server-detect.d.ts +9 -53
  454. package/dist/server/server-detect.js +24 -90
  455. package/dist/server/sleep-offload.js +4 -1
  456. package/dist/server/types.d.ts +12 -10
  457. package/dist/server/validation.d.ts +3 -1
  458. package/dist/server/validation.js +10 -23
  459. package/dist/server.d.ts +2 -2
  460. package/dist/server.js +3 -2
  461. package/dist/sharing/global-store.d.ts +19 -0
  462. package/dist/sharing/global-store.js +75 -0
  463. package/dist/sharing/global-sync.d.ts +6 -0
  464. package/dist/sharing/global-sync.js +80 -0
  465. package/dist/sharing/project-merge.d.ts +4 -5
  466. package/dist/sharing/project-merge.js +9 -7
  467. package/dist/sharing/scope.d.ts +4 -11
  468. package/dist/sharing/scope.js +4 -11
  469. package/dist/sharing/search-both.d.ts +60 -0
  470. package/dist/sharing/search-both.js +138 -0
  471. package/dist/sharing/share.d.ts +38 -0
  472. package/dist/sharing/share.js +226 -0
  473. package/dist/store/ambient.js +4 -9
  474. package/dist/store/audit-event.d.ts +4 -12
  475. package/dist/store/audit-event.js +4 -12
  476. package/dist/store/audit.d.ts +2 -5
  477. package/dist/store/audit.js +4 -12
  478. package/dist/store/auth.d.ts +6 -6
  479. package/dist/store/auth.js +10 -9
  480. package/dist/store/candidates.d.ts +20 -3
  481. package/dist/store/candidates.js +77 -48
  482. package/dist/store/card-detail.d.ts +2 -1
  483. package/dist/store/card-detail.js +2 -1
  484. package/dist/store/cards.d.ts +14 -9
  485. package/dist/store/cards.js +72 -126
  486. package/dist/store/conflicts.d.ts +4 -21
  487. package/dist/store/conflicts.js +71 -150
  488. package/dist/store/connectors/github.d.ts +10 -10
  489. package/dist/store/connectors/github.js +10 -10
  490. package/dist/store/dashboard-reads.js +4 -8
  491. package/dist/store/delete-and-batch.d.ts +11 -31
  492. package/dist/store/delete-and-batch.js +48 -64
  493. package/dist/store/delivery-recorder.d.ts +8 -4
  494. package/dist/store/delivery-recorder.js +25 -15
  495. package/dist/store/diagnostics.js +6 -13
  496. package/dist/store/dormant.d.ts +7 -29
  497. package/dist/store/dormant.js +15 -56
  498. package/dist/store/embeddings/index.d.ts +11 -80
  499. package/dist/store/embeddings/index.js +71 -207
  500. package/dist/store/embeddings/local.js +15 -32
  501. package/dist/store/embeddings/provider.d.ts +16 -53
  502. package/dist/store/embeddings/provider.js +41 -69
  503. package/dist/store/entry-reads.d.ts +21 -57
  504. package/dist/store/entry-reads.js +65 -126
  505. package/dist/store/entry-row.d.ts +6 -35
  506. package/dist/store/entry-row.js +9 -37
  507. package/dist/store/entry-writes.d.ts +10 -16
  508. package/dist/store/entry-writes.js +17 -35
  509. package/dist/store/goals.d.ts +3 -40
  510. package/dist/store/goals.js +21 -160
  511. package/dist/store/graph-queue.d.ts +6 -22
  512. package/dist/store/graph-queue.js +14 -45
  513. package/dist/store/graph-reads.d.ts +11 -35
  514. package/dist/store/graph-reads.js +20 -58
  515. package/dist/store/graph-rows.d.ts +3 -6
  516. package/dist/store/graph-rows.js +6 -9
  517. package/dist/store/graph-view-rows.d.ts +2 -1
  518. package/dist/store/graph-view-rows.js +2 -1
  519. package/dist/store/graph-writes.d.ts +6 -31
  520. package/dist/store/graph-writes.js +13 -37
  521. package/dist/store/half-life.d.ts +2 -1
  522. package/dist/store/half-life.js +14 -16
  523. package/dist/store/handoffs.d.ts +5 -11
  524. package/dist/store/handoffs.js +16 -34
  525. package/dist/store/index-and-stats.d.ts +6 -19
  526. package/dist/store/index-and-stats.js +34 -82
  527. package/dist/store/markdown.d.ts +2 -6
  528. package/dist/store/markdown.js +21 -20
  529. package/dist/store/mirrors.d.ts +2 -6
  530. package/dist/store/mirrors.js +14 -23
  531. package/dist/store/open.js +6 -13
  532. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  533. package/dist/store/planning-fallacy-evidence.js +8 -37
  534. package/dist/store/port.d.ts +82 -79
  535. package/dist/store/predictions.d.ts +11 -51
  536. package/dist/store/predictions.js +38 -119
  537. package/dist/{cli → store}/quality-repair.js +15 -31
  538. package/dist/store/raw-archive.d.ts +4 -16
  539. package/dist/store/raw-archive.js +14 -29
  540. package/dist/store/recall-scope.d.ts +19 -79
  541. package/dist/store/recall-scope.js +21 -82
  542. package/dist/store/recall-trace.d.ts +10 -77
  543. package/dist/store/recall-trace.js +19 -95
  544. package/dist/store/rejected-values.js +7 -19
  545. package/dist/store/rejection.d.ts +12 -58
  546. package/dist/store/rejection.js +13 -65
  547. package/dist/store/report-reads.d.ts +6 -0
  548. package/dist/store/report-reads.js +29 -0
  549. package/dist/store/rows.d.ts +9 -19
  550. package/dist/store/rows.js +36 -34
  551. package/dist/store/rule-sql.d.ts +5 -0
  552. package/dist/store/rule-sql.js +37 -0
  553. package/dist/store/search-rows.d.ts +7 -38
  554. package/dist/store/search-rows.js +14 -50
  555. package/dist/store/sessions.d.ts +10 -47
  556. package/dist/store/sessions.js +17 -73
  557. package/dist/store/sqlite/connector-events-group.js +2 -2
  558. package/dist/store/sqlite/entry-writes-group.js +2 -2
  559. package/dist/store/sqlite/error-codec.js +4 -2
  560. package/dist/store/sqlite/executor.d.ts +2 -1
  561. package/dist/store/sqlite/executor.js +2 -1
  562. package/dist/store/sqlite/local.d.ts +3 -3
  563. package/dist/store/sqlite/local.js +1 -0
  564. package/dist/store/sqlite/object-rows.js +6 -3
  565. package/dist/store/sqlite/objects-group.js +4 -2
  566. package/dist/store/sqlite/quarantine-group.js +2 -2
  567. package/dist/store/sqlite/store.d.ts +1 -4
  568. package/dist/store/sqlite/store.js +2 -3
  569. package/dist/store/sqlite/vector-reads-group.js +2 -2
  570. package/dist/store/sqlite/worker-jobs.js +1 -1
  571. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  572. package/dist/store/sqlite/worker-ops.js +13 -2
  573. package/dist/store/sqlite/worker-store.js +5 -2
  574. package/dist/store/summaries.d.ts +10 -62
  575. package/dist/store/summaries.js +34 -146
  576. package/dist/store/summary-dirty.js +1 -1
  577. package/dist/store/tenant-lookup.d.ts +6 -1
  578. package/dist/store/tenant-lookup.js +7 -0
  579. package/dist/store/tenant.d.ts +2 -16
  580. package/dist/store/tenant.js +4 -19
  581. package/dist/store/token-ledger.d.ts +13 -43
  582. package/dist/store/token-ledger.js +19 -50
  583. package/dist/store/usage-reports.js +5 -13
  584. package/dist/store/vector-index.d.ts +46 -0
  585. package/dist/store/vector-index.js +170 -0
  586. package/dist/store/working-memory.d.ts +6 -25
  587. package/dist/store/working-memory.js +18 -52
  588. package/dist/store/yaml.d.ts +1 -5
  589. package/dist/store/yaml.js +2 -6
  590. package/dist/support-bundle.js +7 -5
  591. package/dist/trust/reject-flow.js +1 -3
  592. package/dist/util/anthropic-messages.js +14 -2
  593. package/dist/util/atomic-write.d.ts +2 -1
  594. package/dist/util/atomic-write.js +35 -4
  595. package/dist/util/capped-json.d.ts +6 -0
  596. package/dist/util/capped-json.js +46 -0
  597. package/dist/util/crash-handlers.d.ts +8 -1
  598. package/dist/util/crash-handlers.js +52 -10
  599. package/dist/util/env.d.ts +13 -6
  600. package/dist/util/env.js +14 -7
  601. package/dist/util/home-path.d.ts +2 -1
  602. package/dist/util/home-path.js +4 -2
  603. package/dist/util/http-retry.d.ts +3 -1
  604. package/dist/util/http-retry.js +26 -5
  605. package/dist/util/log.d.ts +3 -2
  606. package/dist/util/log.js +25 -9
  607. package/dist/util/request-scope.d.ts +2 -1
  608. package/dist/util/request-scope.js +2 -1
  609. package/dist/util/secret-detect.d.ts +5 -30
  610. package/dist/util/secret-detect.js +13 -39
  611. package/dist/util/stored-json.d.ts +1 -1
  612. package/dist/util/stored-json.js +1 -1
  613. package/dist/util/token-text.d.ts +1 -4
  614. package/dist/util/token-text.js +1 -4
  615. package/dist/util/transcript-tail.d.ts +2 -0
  616. package/dist/util/transcript-tail.js +24 -23
  617. package/dist/util/version.d.ts +5 -20
  618. package/dist/util/version.js +5 -20
  619. package/extensions/openclaw-plugin/index.ts +1 -1
  620. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  621. package/extensions/openclaw-plugin/package.json +1 -1
  622. package/openclaw.plugin.json +1 -1
  623. package/package.json +1 -1
  624. package/dist/connectors/github/cli-impl.d.ts +0 -25
  625. package/dist/sharing/shared.d.ts +0 -187
  626. package/dist/sharing/shared.js +0 -563
  627. package/dist/store/vector-writes.d.ts +0 -13
  628. package/dist/store/vector-writes.js +0 -89
  629. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
@@ -1,40 +1,6 @@
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';
@@ -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)
@@ -1,12 +1,5 @@
1
- /**
2
- * Graph observability and visualization, READ-ONLY over the entity/relation
3
- * graph.
4
- *
5
- * This module only READS the graph (through the store's graph reads) and renders
6
- * view-models; it issues no INSERT/UPDATE/DELETE, so `scripts/check-graph-writes.mjs`
7
- * stays green. Used by the CLI (`hippo graph show` / `hippo graph view`) and the
8
- * HTTP `GET /v1/graph` route, which all build the same `GraphModel`.
9
- */
1
+ /** Graph observability and visualization, READ-ONLY over the entity/relation graph (no writes, so `scripts/check-graph-writes.mjs` stays green).
2
+ * Shared by `hippo graph show|view` and the HTTP `GET /v1/graph` route, which all build the same `GraphModel`. */
10
3
  import type { GraphRows } from '../store/port.js';
11
4
  import type { EntityType, RelationType } from '../store/graph-rows.js';
12
5
  export interface GraphNode {
@@ -28,12 +21,8 @@ export interface GraphModel {
28
21
  }
29
22
  /** Default bound for the CLI viewer / show so an unbounded set is never laid out. */
30
23
  export declare const DEFAULT_VIEW_LIMIT = 500;
31
- /**
32
- * Build the view-model from the graph (reads only). With `opts.entity`, returns a
33
- * focus subgraph: every entity whose name === entity, plus their 1-hop neighbours,
34
- * plus the edges among that union. Dangling edges (an endpoint outside the node
35
- * set) are always dropped.
36
- */
24
+ /** Build the view-model (reads only); with `opts.entity`, a focus subgraph of the entities named so plus their 1-hop neighbours.
25
+ * Dangling edges (an endpoint outside the node set) are always dropped. */
37
26
  export declare function buildGraphModel(hippoRoot: string, tenantId: string, opts?: {
38
27
  entity?: string;
39
28
  limit?: number;
@@ -41,12 +30,8 @@ export declare function buildGraphModel(hippoRoot: string, tenantId: string, opt
41
30
  }): GraphModel;
42
31
  /** The reply model of the rows a store read: an edge with an endpoint outside the node set is dropped. */
43
32
  export declare function graphModelOf({ entities, relations, truncated }: GraphRows): GraphModel;
44
- /**
45
- * Deterministic Fruchterman-Reingold-style force layout. Seeded circular init +
46
- * fixed iterations, NO `Math.random`, so the same model always yields the same
47
- * positions (testable, stable output). Non-finite coordinates from a degenerate
48
- * step are clamped to the viewport centre; all positions are clamped in-bounds.
49
- */
33
+ /** Deterministic Fruchterman-Reingold-style force layout: seeded circular init, fixed iterations, no `Math.random`, so one model gives the same positions.
34
+ * Non-finite coordinates are clamped to the viewport centre and all positions to the bounds. */
50
35
  export declare function layoutGraph(model: GraphModel, opts?: {
51
36
  width?: number;
52
37
  height?: number;
@@ -57,20 +42,9 @@ export declare function layoutGraph(model: GraphModel, opts?: {
57
42
  }>;
58
43
  /** HTML-escape for SVG text / title / markup content (XSS guard). */
59
44
  export declare function escapeHtml(s: string): string;
60
- /**
61
- * Render the model as a SELF-CONTAINED, dependency-free, offline interactive HTML
62
- * node-link diagram. Positions are computed server-side (deterministic). User
63
- * strings are escaped per sink: SVG `<text>`/`<title>` via `escapeHtml`; the model
64
- * is inlined in a `<script type="application/json">` block with `<`/`>`/`&`
65
- * unicode-escaped so a `</script>` inside an entity name cannot break out (the
66
- * client `JSON.parse`s it back and never `innerHTML`s a user string).
67
- */
45
+ /** Render the model as a self-contained, offline interactive HTML node-link diagram with server-side deterministic positions.
46
+ * The model is inlined as `<script type="application/json">` with `<`, `>`, `&` unicode-escaped so a `</script>` in an entity name cannot break out. */
68
47
  export declare function renderGraphHtml(model: GraphModel): string;
69
- /**
70
- * Render the model as a JSON Canvas (jsoncanvas.org) document — `nodes[]` of
71
- * type `text` positioned by the same deterministic layout, `edges[]` linking
72
- * them by id. Opens natively in Obsidian. Pure JSON; entity names live in the
73
- * `text` field (Obsidian renders/sanitizes them).
74
- */
48
+ /** Render the model as a JSON Canvas (jsoncanvas.org) document: `text` nodes at the same deterministic layout positions, `edges[]` linking them by id. */
75
49
  export declare function renderGraphCanvas(model: GraphModel): string;
76
50
  //# sourceMappingURL=view.d.ts.map
@@ -1,24 +1,13 @@
1
- /**
2
- * Graph observability and visualization, READ-ONLY over the entity/relation
3
- * graph.
4
- *
5
- * This module only READS the graph (through the store's graph reads) and renders
6
- * view-models; it issues no INSERT/UPDATE/DELETE, so `scripts/check-graph-writes.mjs`
7
- * stays green. Used by the CLI (`hippo graph show` / `hippo graph view`) and the
8
- * HTTP `GET /v1/graph` route, which all build the same `GraphModel`.
9
- */
1
+ /** Graph observability and visualization, READ-ONLY over the entity/relation graph (no writes, so `scripts/check-graph-writes.mjs` stays green).
2
+ * Shared by `hippo graph show|view` and the HTTP `GET /v1/graph` route, which all build the same `GraphModel`. */
10
3
  import { withGraphReadSnapshot } from '../store/graph-reads.js';
11
4
  import { graphViewRows } from '../store/graph-view-rows.js';
12
5
  const DEFAULT_LAYOUT_ITERATIONS = 300;
13
6
  const NODE_LABEL_MAX_CHARS = 22;
14
7
  /** Default bound for the CLI viewer / show so an unbounded set is never laid out. */
15
8
  export const DEFAULT_VIEW_LIMIT = 500;
16
- /**
17
- * Build the view-model from the graph (reads only). With `opts.entity`, returns a
18
- * focus subgraph: every entity whose name === entity, plus their 1-hop neighbours,
19
- * plus the edges among that union. Dangling edges (an endpoint outside the node
20
- * set) are always dropped.
21
- */
9
+ /** Build the view-model (reads only); with `opts.entity`, a focus subgraph of the entities named so plus their 1-hop neighbours.
10
+ * Dangling edges (an endpoint outside the node set) are always dropped. */
22
11
  export function buildGraphModel(hippoRoot, tenantId, opts = {}) {
23
12
  const limit = opts.limit ?? DEFAULT_VIEW_LIMIT;
24
13
  // One read snapshot, so a concurrent graph rebuild cannot make the model mix old entity ids with new relation ids.
@@ -105,12 +94,8 @@ function applyDisplacement(nodes, pos, disp, temp, width, height) {
105
94
  p.y = Math.max(20, Math.min(height - 20, ny));
106
95
  });
107
96
  }
108
- /**
109
- * Deterministic Fruchterman-Reingold-style force layout. Seeded circular init +
110
- * fixed iterations, NO `Math.random`, so the same model always yields the same
111
- * positions (testable, stable output). Non-finite coordinates from a degenerate
112
- * step are clamped to the viewport centre; all positions are clamped in-bounds.
113
- */
97
+ /** Deterministic Fruchterman-Reingold-style force layout: seeded circular init, fixed iterations, no `Math.random`, so one model gives the same positions.
98
+ * Non-finite coordinates are clamped to the viewport centre and all positions to the bounds. */
114
99
  export function layoutGraph(model, opts = {}) {
115
100
  const width = opts.width ?? LAYOUT_W;
116
101
  const height = opts.height ?? LAYOUT_H;
@@ -150,10 +135,8 @@ const NODE_COLORS = {
150
135
  person: '#3b82f6',
151
136
  system: '#64748b',
152
137
  };
153
- // Client script: pan (drag bg), zoom (wheel), click-to-highlight a node's edges +
154
- // neighbours. Reads the inlined model via JSON.parse (never innerHTML), so user
155
- // strings never reach an HTML sink here. No template literals / `${}` so it nests
156
- // safely inside this module's own template strings.
138
+ // Client script: pan, zoom, click-to-highlight. It reads the inlined model via JSON.parse (never innerHTML)
139
+ // and uses no template literals or `${}`, so it nests in this module's template strings.
157
140
  const CLIENT_JS = [
158
141
  "(function(){",
159
142
  " var svg=document.getElementById('g');",
@@ -231,14 +214,8 @@ function renderLegend(model) {
231
214
  .map((t) => `<span style="color:${nodeColor(t)}">●</span> ${escapeHtml(t)}`)
232
215
  .join(' ');
233
216
  }
234
- /**
235
- * Render the model as a SELF-CONTAINED, dependency-free, offline interactive HTML
236
- * node-link diagram. Positions are computed server-side (deterministic). User
237
- * strings are escaped per sink: SVG `<text>`/`<title>` via `escapeHtml`; the model
238
- * is inlined in a `<script type="application/json">` block with `<`/`>`/`&`
239
- * unicode-escaped so a `</script>` inside an entity name cannot break out (the
240
- * client `JSON.parse`s it back and never `innerHTML`s a user string).
241
- */
217
+ /** Render the model as a self-contained, offline interactive HTML node-link diagram with server-side deterministic positions.
218
+ * The model is inlined as `<script type="application/json">` with `<`, `>`, `&` unicode-escaped so a `</script>` in an entity name cannot break out. */
242
219
  export function renderGraphHtml(model) {
243
220
  const pos = layoutGraph(model);
244
221
  const edgeSvg = renderEdgeSvg(model, pos);
@@ -262,12 +239,7 @@ export function renderGraphHtml(model) {
262
239
  '</body></html>',
263
240
  ].join('\n');
264
241
  }
265
- /**
266
- * Render the model as a JSON Canvas (jsoncanvas.org) document — `nodes[]` of
267
- * type `text` positioned by the same deterministic layout, `edges[]` linking
268
- * them by id. Opens natively in Obsidian. Pure JSON; entity names live in the
269
- * `text` field (Obsidian renders/sanitizes them).
270
- */
242
+ /** Render the model as a JSON Canvas (jsoncanvas.org) document: `text` nodes at the same deterministic layout positions, `edges[]` linking them by id. */
271
243
  export function renderGraphCanvas(model) {
272
244
  const pos = layoutGraph(model, { width: 2400, height: 1600 });
273
245
  const nodes = model.nodes.map((node) => {
@@ -1,7 +1,7 @@
1
1
  import { envPath } from '../util/env.js';
2
2
  import * as fs from 'fs';
3
3
  import * as path from 'path';
4
- import { fileURLToPath } from 'url';
4
+ import { PACKAGE_ROOT } from '../core/package-root.js';
5
5
  import { errorMessage, log } from '../util/log.js';
6
6
  import { HIPPO_CODEX_WRAPPER_MARKER, homeDir, codexHomeDir, ensureDir } from './shared.js';
7
7
  import { isJsonString } from '../util/json.js';
@@ -68,7 +68,7 @@ function isCodexWrapperMetadataValid(metadata) {
68
68
  isHippoCodexWrapperFile(metadata.commandPath));
69
69
  }
70
70
  function resolveHippoCliPath() {
71
- return fileURLToPath(new URL('../bin/hippo.js', import.meta.url));
71
+ return path.join(PACKAGE_ROOT, 'bin', 'hippo.js');
72
72
  }
73
73
  function quoteForShell(value) {
74
74
  return `"${value.replace(/(["\\$`])/g, '\\$1')}"`;
@@ -77,7 +77,8 @@ function hippoCommand() {
77
77
  export const COPILOT_CLI_MCP = { key: 'mcpServers', server: () => ({ type: 'local', command: hippoCommand(), args: ['mcp'], env: {}, tools: ['*'] }) };
78
78
  /** VS Code's mcp.json keeps stdio servers under "servers"; it has no "mcpServers" key. */
79
79
  export const VSCODE_MCP = { key: 'servers', server: () => ({ type: 'stdio', command: hippoCommand(), args: ['mcp'] }) };
80
- /** Only a server hippo wrote counts as hippo's: another command, other args, or any key or value setup does not write (an env you added) makes it the user's. */
80
+ /** Only a server hippo wrote counts as hippo's: another command, other args, or
81
+ * any key or value setup does not write (an env you added) makes it the user's. */
81
82
  function isHipposServer(entry, host) {
82
83
  if (!isJsonObjectLiteral(entry) || !('command' in entry) || !('args' in entry))
83
84
  return false;
@@ -2,11 +2,15 @@ export declare const HOOK_MARKERS: {
2
2
  start: string;
3
3
  end: string;
4
4
  };
5
- export declare const HOOKS: Record<string, {
5
+ export interface HookSpec {
6
6
  file: string;
7
7
  content: string;
8
8
  description: string;
9
- }>;
9
+ }
10
+ export interface HookTable {
11
+ [agent: string]: HookSpec;
12
+ }
13
+ export declare const HOOKS: HookTable;
10
14
  /** The first hippo block in `text` and the agent whose current or shipped text it is; `owner` is undefined for an edited block. */
11
15
  export declare function hippoBlock(text: string): {
12
16
  start: number;