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
@@ -0,0 +1,30 @@
1
+ import { biasHintEnabled } from './recall-history.js';
2
+ import { anchorSkippedRows, callerOf, noteRecall, peekSessionRing, sessionRing } from './recall-record.js';
3
+ import { recordTokens } from './tokens.js';
4
+ /** The surfaces `retrieve` records in full. MCP is pending: src/mcp still feeds its own ring and books its own ledger row, and counts no stats. */
5
+ export const RECALL_RECORDING = {
6
+ http: { ring: 'http', ledger: 'http_recall', stats: 'every' },
7
+ cli: { ring: 'cli', ledger: 'recall', stats: 'shown' },
8
+ };
9
+ /** For a surface whose hint `retrieve` judges: the session's history, or the row saying the recall named no session. */
10
+ export function recallLead(ctx, how, query, sessionId) {
11
+ return {
12
+ // Peeked, never created: a recall that then fails must not LRU-evict a live session.
13
+ recallHistory: sessionId && biasHintEnabled('anchoring') ? peekSessionRing(how.ring, ctx.tenantId, sessionId) : undefined,
14
+ // Written first in the recall's own write, so a recall that fails leaves no row.
15
+ leadingAudit: sessionId ? [] : anchorSkippedRows(callerOf(ctx), query),
16
+ };
17
+ }
18
+ /** Runs after the recall's own write, in this order: the ring, then the counter, then the ledger. */
19
+ export async function recordShownRecall(ctx, store, how, shown) {
20
+ // A surface that only peeked has its ring created here, after the write, so a recall that fails cannot LRU-evict a live session.
21
+ const ring = sessionRing(how.ring, ctx.tenantId, shown.sessionId);
22
+ if (ring)
23
+ noteRecall(ring, shown.query, shown.topId, shown.anchoredOn);
24
+ // A recall with no audit row counts nothing, as it strengthens and traces nothing.
25
+ if (shown.written && (how.stats === 'every' || shown.items > 0))
26
+ await store.bumpRecallStats(shown.items);
27
+ // The ledger books text that was sent, so its row does not wait on the audit write.
28
+ await recordTokens(ctx, how.ledger, { items: shown.items, tokens: shown.tokens, sessionId: shown.ledgerSessionId });
29
+ }
30
+ //# sourceMappingURL=recall-finish.js.map
@@ -1,22 +1,6 @@
1
- /**
2
- * Anchoring detector (recall-recurrence), pure module.
3
- *
4
- * Implements two detection rules:
5
- * query_repeat: same queryHash within recentRepeatWindow returned
6
- * same topMemoryId (caller is re-asking the same question).
7
- * memory_dominance: same topMemoryId across >= minDominance distinct
8
- * queryHashes (memory acts as a fixed-point anchor regardless of what
9
- * the agent asks).
10
- *
11
- * Each pipeline (api.recall via
12
- * HTTP, cmdRecall, MCP hippo_recall) owns its OWN ring buffer Map keyed
13
- * by (tenant, session). No cross-pipeline sharing (the typical multi-
14
- * process deployment makes IPC ring-sharing impractical; per-pipeline
15
- * is correct because each pipeline has its own top-1 ranking anyway).
16
- *
17
- * AnchoringHint + PlanningFallacyHint are independent
18
- * signals; both can fire on the same recall.
19
- */
1
+ /** Anchoring detector (recall-recurrence), pure module: `query_repeat` (a queryHash re-asked within the window returns the same topMemoryId) and
2
+ * `memory_dominance` (the same topMemoryId across >= minDominance distinct queryHashes). Each pipeline keeps its OWN ring Map keyed by (tenant, session),
3
+ * because its top-1 ranking differs. AnchoringHint and PlanningFallacyHint are independent signals. */
20
4
  export type AnchoringReason = 'query_repeat' | 'memory_dominance';
21
5
  export interface AnchoringHint {
22
6
  reason: AnchoringReason;
@@ -37,10 +21,8 @@ export interface RecallHistoryEntry {
37
21
  topMemoryId: string | null;
38
22
  /** ISO-8601 timestamp; advisory, not used by the detection rules. */
39
23
  ts: string;
40
- /** Memory id of the AnchoringHint that fired on this recall, if any.
41
- * Used by the cooldown logic to prevent re-emitting the same hint on
42
- * consecutive recalls within the dominance window. Caller-written
43
- * AFTER detectAnchoring returns; reads next time detectAnchoring runs. */
24
+ /** Memory id of the AnchoringHint that fired on this recall, if any; the caller writes it after detectAnchoring returns, and the cooldown reads it next
25
+ * time. */
44
26
  anchoredOn?: string;
45
27
  }
46
28
  export type RecallHistorySnapshot = readonly RecallHistoryEntry[];
@@ -51,81 +33,32 @@ export interface DetectAnchoringOpts {
51
33
  /** query_repeat window: how many recent history entries to scan for query repeat.
52
34
  * Default 5. */
53
35
  recentRepeatWindow?: number;
54
- /** Cooldown: if the immediately-prior fire (per `anchoredOn`) was for
55
- * the same topMemoryId within this many history entries, suppress.
56
- * Default 3. */
36
+ /** Cooldown: suppress when the prior fire (per `anchoredOn`) was for the same topMemoryId within this many history entries. Default 3. */
57
37
  cooldown?: number;
58
38
  }
59
- /**
60
- * Normalize + hash a query text into a 32-bit integer.
61
- * Lowercase → strip non-alphanumeric → split → drop empty + short tokens →
62
- * sort tokens → join → FNV-1a 32-bit.
63
- *
64
- * Token sort + dedup means semantically-equivalent queries with reordered
65
- * words collide intentionally ("semantically-distinct" is approximated by
66
- * textual normalization, not embeddings).
67
- *
68
- * Deterministic across processes; stable across Node + V8 versions.
69
- */
39
+ /** Normalizes a query (lowercase, strip non-alphanumerics, drop short tokens, sort, dedup, join) and hashes it with 32-bit FNV-1a.
40
+ * Reordered words collide intentionally; deterministic across processes and V8 versions. */
70
41
  export declare function hashQueryText(query: string): number;
71
- /**
72
- * Detect anchoring patterns in the recall history against the current
73
- * recall's (queryHash, topMemoryId).
74
- *
75
- * Rule precedence: memory_dominance wins on tie. When both rules fire on the
76
- * same recall, return only memory_dominance, the stronger signal (a memory
77
- * dominating multiple DIFFERENT queries is a fixed-point anchor; query_repeat
78
- * alone is just a literal re-ask).
79
- *
80
- * Cooldown: if the immediately-prior recall fired a hint on the SAME
81
- * topMemoryId within `cooldown=3` history entries, suppress. Prevents
82
- * spam when the agent repeatedly recalls within the dominance window.
83
- * Cooldown is per-memory, not per-rule: if memory_dominance fired on M
84
- * (cooldown engaged for M), and the next recall has top=N + repeated query,
85
- * query_repeat fires on N (different memory, not in cooldown).
86
- *
87
- * @returns AnchoringHint when a pattern fires; null otherwise.
88
- */
42
+ /** Detects anchoring against the current (queryHash, topMemoryId); memory_dominance wins when both rules fire, since it spans DIFFERENT queries.
43
+ * Cooldown is per memory: a hint on the SAME topMemoryId within `cooldown=3` history entries is suppressed. Returns an AnchoringHint or null. */
89
44
  export declare function detectAnchoring(history: RecallHistorySnapshot, currentQueryHash: number, currentTopMemoryId: string | null, opts?: DetectAnchoringOpts): AnchoringHint | null;
90
- /**
91
- * Bounded FIFO ring of RecallHistoryEntry. Newest entries pushed via
92
- * append; oldest evicted when the ring is full. The class is intentionally
93
- * a thin wrapper around an array so snapshotRing returns a readonly view
94
- * without copying on the hot path.
95
- */
45
+ /** Bounded FIFO ring of RecallHistoryEntry (oldest evicted when full); a thin array wrapper so snapshotRing returns a readonly view without copying. */
96
46
  export declare class RingBuffer {
97
47
  private entries;
98
48
  append(entry: RecallHistoryEntry): void;
99
49
  snapshot(): RecallHistorySnapshot;
100
50
  size(): number;
101
51
  }
102
- /**
103
- * Build the (tenant, session) key for a per-session ring Map. Uses a NUL
104
- * (`\x00`) byte as delimiter because tenant ids and session ids are
105
- * validated elsewhere to reject NUL chars — guarantees collision-free
106
- * concatenation regardless of what `:` or other delimiters might appear
107
- * inside either field (notably API-key-derived subjects can contain `:`).
108
- */
52
+ /** Builds the (tenant, session) key with a NUL delimiter: tenant and session ids are validated elsewhere to reject NUL,
53
+ * so concatenation cannot collide even though API-key-derived subjects can contain `:`. */
109
54
  export declare function buildSessionKey(tenantId: string, sessionId: string): string;
110
- /**
111
- * Get-or-create a RingBuffer for a session key. Caps total tracked keys
112
- * at `maxSessions` (default 1000) with LRU eviction — when the cap is
113
- * hit, deletes the oldest-inserted key before inserting the new one.
114
- * Map iteration order preserves insertion order per ECMA-262 spec, so
115
- * "oldest" = first key returned by Map.prototype.keys().
116
- */
55
+ /** Get-or-create a RingBuffer per session key, capped at `maxSessions` (default 1000); at the cap the oldest-inserted key (first from Map.keys()) is
56
+ * evicted. */
117
57
  export declare function getOrCreateRing(map: Map<string, RingBuffer>, key: string, maxSessions?: number): RingBuffer;
118
- /**
119
- * Append a recall to a ring. The `anchoredOn` argument carries the
120
- * memoryId of the AnchoringHint that fired on THIS recall (or undefined
121
- * if no hint). detectAnchoring reads it next time for cooldown gating.
122
- */
58
+ /** Appends a recall to a ring; `anchoredOn` is the memoryId of the hint that fired on THIS recall (or undefined), read by detectAnchoring for cooldown. */
123
59
  export declare function appendRecall(ring: RingBuffer, queryHash: number, topMemoryId: string | null, anchoredOn?: string): void;
124
60
  /** Snapshot a ring as a readonly RecallHistorySnapshot. */
125
61
  export declare function snapshotRing(ring: RingBuffer): RecallHistorySnapshot;
126
- /**
127
- * Whether a recall bias hint is enabled. Reads the env at call time, so
128
- * `HIPPO_ANCHORING=off` or `HIPPO_AVAILABILITY=off` disables only that kind.
129
- */
62
+ /** Whether a recall bias hint is enabled; reads env at call time, so `HIPPO_ANCHORING=off` or `HIPPO_AVAILABILITY=off` disables only that kind. */
130
63
  export declare function biasHintEnabled(kind: 'anchoring' | 'availability'): boolean;
131
64
  //# sourceMappingURL=recall-history.d.ts.map
@@ -1,46 +1,17 @@
1
- /**
2
- * Anchoring detector (recall-recurrence), pure module.
3
- *
4
- * Implements two detection rules:
5
- * query_repeat: same queryHash within recentRepeatWindow returned
6
- * same topMemoryId (caller is re-asking the same question).
7
- * memory_dominance: same topMemoryId across >= minDominance distinct
8
- * queryHashes (memory acts as a fixed-point anchor regardless of what
9
- * the agent asks).
10
- *
11
- * Each pipeline (api.recall via
12
- * HTTP, cmdRecall, MCP hippo_recall) owns its OWN ring buffer Map keyed
13
- * by (tenant, session). No cross-pipeline sharing (the typical multi-
14
- * process deployment makes IPC ring-sharing impractical; per-pipeline
15
- * is correct because each pipeline has its own top-1 ranking anyway).
16
- *
17
- * AnchoringHint + PlanningFallacyHint are independent
18
- * signals; both can fire on the same recall.
19
- */
1
+ /** Anchoring detector (recall-recurrence), pure module: `query_repeat` (a queryHash re-asked within the window returns the same topMemoryId) and
2
+ * `memory_dominance` (the same topMemoryId across >= minDominance distinct queryHashes). Each pipeline keeps its OWN ring Map keyed by (tenant, session),
3
+ * because its top-1 ranking differs. AnchoringHint and PlanningFallacyHint are independent signals. */
20
4
  import { envAnchoringOff, envAvailabilityOff } from '../util/env.js';
21
5
  const DEFAULT_MIN_DOMINANCE = 3;
22
6
  const DEFAULT_RECENT_REPEAT_WINDOW = 5;
23
7
  const DEFAULT_COOLDOWN = 3;
24
- // ---------------------------------------------------------------------------
25
- // Query text normalization + hashing
26
- // ---------------------------------------------------------------------------
27
- /**
28
- * Normalize + hash a query text into a 32-bit integer.
29
- * Lowercase → strip non-alphanumeric → split → drop empty + short tokens →
30
- * sort tokens → join → FNV-1a 32-bit.
31
- *
32
- * Token sort + dedup means semantically-equivalent queries with reordered
33
- * words collide intentionally ("semantically-distinct" is approximated by
34
- * textual normalization, not embeddings).
35
- *
36
- * Deterministic across processes; stable across Node + V8 versions.
37
- */
8
+ /** Normalizes a query (lowercase, strip non-alphanumerics, drop short tokens, sort, dedup, join) and hashes it with 32-bit FNV-1a.
9
+ * Reordered words collide intentionally; deterministic across processes and V8 versions. */
38
10
  export function hashQueryText(query) {
39
11
  if (!query)
40
12
  return 0;
41
13
  // Tokens are deduped before join so `foo foo bar` and `foo bar` count as one query for memory_dominance.
42
- // Unicode classes (\p{L} letter, \p{N} number, \p{M} combining mark; needs /u) keep
43
- // non-Latin queries from collapsing to an empty token set and colliding at hash 0.
14
+ // Unicode classes (\p{L}, \p{N}, \p{M}; need /u) keep non-Latin queries from collapsing to an empty token set and colliding at hash 0.
44
15
  const normalized = query
45
16
  .toLowerCase()
46
17
  .replace(/[^\p{L}\p{N}\p{M}\s]/gu, ' ')
@@ -66,27 +37,8 @@ function fnv1a32(text) {
66
37
  // Coerce to unsigned 32-bit for stable comparison.
67
38
  return hash >>> 0;
68
39
  }
69
- // ---------------------------------------------------------------------------
70
- // Anchoring detection
71
- // ---------------------------------------------------------------------------
72
- /**
73
- * Detect anchoring patterns in the recall history against the current
74
- * recall's (queryHash, topMemoryId).
75
- *
76
- * Rule precedence: memory_dominance wins on tie. When both rules fire on the
77
- * same recall, return only memory_dominance, the stronger signal (a memory
78
- * dominating multiple DIFFERENT queries is a fixed-point anchor; query_repeat
79
- * alone is just a literal re-ask).
80
- *
81
- * Cooldown: if the immediately-prior recall fired a hint on the SAME
82
- * topMemoryId within `cooldown=3` history entries, suppress. Prevents
83
- * spam when the agent repeatedly recalls within the dominance window.
84
- * Cooldown is per-memory, not per-rule: if memory_dominance fired on M
85
- * (cooldown engaged for M), and the next recall has top=N + repeated query,
86
- * query_repeat fires on N (different memory, not in cooldown).
87
- *
88
- * @returns AnchoringHint when a pattern fires; null otherwise.
89
- */
40
+ /** Detects anchoring against the current (queryHash, topMemoryId); memory_dominance wins when both rules fire, since it spans DIFFERENT queries.
41
+ * Cooldown is per memory: a hint on the SAME topMemoryId within `cooldown=3` history entries is suppressed. Returns an AnchoringHint or null. */
90
42
  export function detectAnchoring(history, currentQueryHash, currentTopMemoryId, opts = {}) {
91
43
  if (currentTopMemoryId === null)
92
44
  return null;
@@ -141,17 +93,9 @@ function isRecentRepeat(history, recentRepeatWindow, currentQueryHash, currentTo
141
93
  .slice(-recentRepeatWindow)
142
94
  .some((entry) => entry.queryHash === currentQueryHash && entry.topMemoryId === currentTopMemoryId);
143
95
  }
144
- // ---------------------------------------------------------------------------
145
- // RingBuffer + caller-side state helpers
146
- // ---------------------------------------------------------------------------
147
96
  const MAX_HISTORY = 10;
148
97
  const DEFAULT_MAX_SESSIONS = 1000;
149
- /**
150
- * Bounded FIFO ring of RecallHistoryEntry. Newest entries pushed via
151
- * append; oldest evicted when the ring is full. The class is intentionally
152
- * a thin wrapper around an array so snapshotRing returns a readonly view
153
- * without copying on the hot path.
154
- */
98
+ /** Bounded FIFO ring of RecallHistoryEntry (oldest evicted when full); a thin array wrapper so snapshotRing returns a readonly view without copying. */
155
99
  export class RingBuffer {
156
100
  entries = [];
157
101
  append(entry) {
@@ -167,23 +111,13 @@ export class RingBuffer {
167
111
  return this.entries.length;
168
112
  }
169
113
  }
170
- /**
171
- * Build the (tenant, session) key for a per-session ring Map. Uses a NUL
172
- * (`\x00`) byte as delimiter because tenant ids and session ids are
173
- * validated elsewhere to reject NUL chars — guarantees collision-free
174
- * concatenation regardless of what `:` or other delimiters might appear
175
- * inside either field (notably API-key-derived subjects can contain `:`).
176
- */
114
+ /** Builds the (tenant, session) key with a NUL delimiter: tenant and session ids are validated elsewhere to reject NUL,
115
+ * so concatenation cannot collide even though API-key-derived subjects can contain `:`. */
177
116
  export function buildSessionKey(tenantId, sessionId) {
178
117
  return `${tenantId}\x00${sessionId}`;
179
118
  }
180
- /**
181
- * Get-or-create a RingBuffer for a session key. Caps total tracked keys
182
- * at `maxSessions` (default 1000) with LRU eviction — when the cap is
183
- * hit, deletes the oldest-inserted key before inserting the new one.
184
- * Map iteration order preserves insertion order per ECMA-262 spec, so
185
- * "oldest" = first key returned by Map.prototype.keys().
186
- */
119
+ /** Get-or-create a RingBuffer per session key, capped at `maxSessions` (default 1000); at the cap the oldest-inserted key (first from Map.keys()) is
120
+ * evicted. */
187
121
  export function getOrCreateRing(map, key, maxSessions = DEFAULT_MAX_SESSIONS) {
188
122
  const existing = map.get(key);
189
123
  if (existing) {
@@ -201,11 +135,7 @@ export function getOrCreateRing(map, key, maxSessions = DEFAULT_MAX_SESSIONS) {
201
135
  map.set(key, ring);
202
136
  return ring;
203
137
  }
204
- /**
205
- * Append a recall to a ring. The `anchoredOn` argument carries the
206
- * memoryId of the AnchoringHint that fired on THIS recall (or undefined
207
- * if no hint). detectAnchoring reads it next time for cooldown gating.
208
- */
138
+ /** Appends a recall to a ring; `anchoredOn` is the memoryId of the hint that fired on THIS recall (or undefined), read by detectAnchoring for cooldown. */
209
139
  export function appendRecall(ring, queryHash, topMemoryId, anchoredOn) {
210
140
  const entry = {
211
141
  queryHash,
@@ -220,10 +150,7 @@ export function appendRecall(ring, queryHash, topMemoryId, anchoredOn) {
220
150
  export function snapshotRing(ring) {
221
151
  return ring.snapshot();
222
152
  }
223
- /**
224
- * Whether a recall bias hint is enabled. Reads the env at call time, so
225
- * `HIPPO_ANCHORING=off` or `HIPPO_AVAILABILITY=off` disables only that kind.
226
- */
153
+ /** Whether a recall bias hint is enabled; reads env at call time, so `HIPPO_ANCHORING=off` or `HIPPO_AVAILABILITY=off` disables only that kind. */
227
154
  export function biasHintEnabled(kind) {
228
155
  return kind === 'anchoring'
229
156
  ? !envAnchoringOff()
@@ -94,8 +94,7 @@ export interface RankRecallResult {
94
94
  /** True when ranking stopped at `haltBefore`. */
95
95
  halted: boolean;
96
96
  }
97
- /** Ranks memories for a query as `hippo recall` does, through the `limit` slice. Reads stores, embeddings and
98
- * physics state; writes nothing and prints nothing (notes go to `ctx.note`). The caller supplies the cost
99
- * function and reranker in `opts`, and persists the returned goal-log rows. */
97
+ /** Ranks memories for a query as `hippo recall` does, through the `limit` slice. Reads stores, embeddings and physics state; writes and prints nothing
98
+ * (notes go to `ctx.note`). The caller supplies the cost function and reranker in `opts` and persists the returned goal-log rows. */
100
99
  export declare function rankRecall(ctx: RankRecallCtx, opts: RankRecallOpts): Promise<RankRecallResult>;
101
100
  //# sourceMappingURL=recall-pipeline.d.ts.map
@@ -4,7 +4,8 @@ import { evalNow } from '../core/ablation.js';
4
4
  import { oneCopyPerMemory } from './context-select.js';
5
5
  import { compareEntryIdentity, compareScoresDesc } from '../core/compare.js';
6
6
  import { isEmbeddingAvailable } from '../store/embeddings/local.js';
7
- import { activeGoalsWithPolicies, boostByGoals } from '../store/goals.js';
7
+ import { activeGoalsWithPolicies } from '../store/goals.js';
8
+ import { boostByGoals } from '../search/goal-boost.js';
8
9
  import { graphExpandRecall } from '../graph/recall.js';
9
10
  import { DEFAULT_GRAPH_STREAM_WEIGHT } from '../graph/stream.js';
10
11
  import { Layer } from '../core/memory.js';
@@ -14,12 +15,12 @@ import { currentEntries } from '../search/as-of.js';
14
15
  import { STRENGTH_RANK_FLOOR, STRENGTH_RANK_SPAN } from '../search/boosts.js';
15
16
  import { hybridSearch } from '../search/hybrid.js';
16
17
  import { physicsSearch } from '../search/physics-search.js';
17
- import { searchBothHybrid } from '../sharing/shared.js';
18
+ import { searchBothHybrid } from '../sharing/search-both.js';
18
19
  import { loadRecallSearchEntries, recallScopeFilter } from '../store/search-rows.js';
20
+ import { isJsonNumber } from '../util/json.js';
19
21
  import { textOverlap, tokenize as tokenizeQuery } from '../util/tokenize.js';
20
- /** Ranks memories for a query as `hippo recall` does, through the `limit` slice. Reads stores, embeddings and
21
- * physics state; writes nothing and prints nothing (notes go to `ctx.note`). The caller supplies the cost
22
- * function and reranker in `opts`, and persists the returned goal-log rows. */
22
+ /** Ranks memories for a query as `hippo recall` does, through the `limit` slice. Reads stores, embeddings and physics state; writes and prints nothing
23
+ * (notes go to `ctx.note`). The caller supplies the cost function and reranker in `opts` and persists the returned goal-log rows. */
23
24
  export async function rankRecall(ctx, opts) {
24
25
  const pool = loadRecallPool(ctx, opts);
25
26
  const state = { results: [], droppedPreRank: pool.dropped, graphAdded: 0, goalRecallLog: [] };
@@ -111,7 +112,9 @@ async function searchPool(ctx, opts, pool) {
111
112
  if (search.usePhysics && !globalRoot) {
112
113
  // Explain leaves minResults and includeSuperseded out to hold its output steady; asOf must reach physics or later rows leak.
113
114
  const temporal = explain ? { asOf } : { minResults, includeSuperseded, asOf };
114
- return physicsSearch(query, pool.local, { budget, cost, hippoRoot: ctx.hippoRoot, physicsConfig: search.physicsConfig, scope, explain, vectorCandidates, ...temporal });
115
+ return physicsSearch(query, pool.local, {
116
+ budget, cost, hippoRoot: ctx.hippoRoot, physicsConfig: search.physicsConfig, scope, explain, vectorCandidates, ...temporal
117
+ });
115
118
  }
116
119
  if (globalRoot) {
117
120
  // searchBothHybrid reloads candidates itself, so the scope rule is passed in rather than inherited from the pool.
@@ -121,7 +124,9 @@ async function searchPool(ctx, opts, pool) {
121
124
  recallScope: opts.explicitScope ? { requested: opts.explicitScope, additive: true } : {},
122
125
  });
123
126
  }
124
- return hybridSearch(query, pool.local, { budget, cost, hippoRoot: ctx.hippoRoot, explain, mmr, mmrLambda, minResults, scope, includeSuperseded, asOf, vectorCandidates });
127
+ return hybridSearch(query, pool.local, {
128
+ budget, cost, hippoRoot: ctx.hippoRoot, explain, mmr, mmrLambda, minResults, scope, includeSuperseded, asOf, vectorCandidates
129
+ });
125
130
  }
126
131
  /** Adds memories reached by walking the entity graph out from the lexical seeds. */
127
132
  function expandGraph(ctx, opts, graph, state) {
@@ -187,7 +192,7 @@ function applyPfcRerankers(opts, state) {
187
192
  if (opts.rerankUtility) {
188
193
  // utility = score * (0.5 + 0.5 * strength) * (1 - min(0.3, tokens / 10000)); long evidence-rich rows pay for length.
189
194
  state.results = byScore(state.results.map((r) => {
190
- const strength = typeof r.entry.strength === 'number' ? r.entry.strength : 1.0;
195
+ const strength = isJsonNumber(r.entry.strength) ? r.entry.strength : 1.0;
191
196
  const utilityMult = (STRENGTH_RANK_FLOOR + STRENGTH_RANK_SPAN * strength) * (1 - Math.min(UTILITY_LENGTH_PENALTY_CAP, (r.tokens || 0) / UTILITY_LENGTH_TOKENS));
192
197
  const utility = r.score * utilityMult;
193
198
  return traced(opts, r, { ...r, score: utility }, { stage: 'utility', multiplier: utilityMult, scoreBefore: r.score, scoreAfter: utility });
@@ -263,7 +268,9 @@ function applyGoalBoosts(ctx, opts, state) {
263
268
  if (!r.entry.tags?.includes(goalTag))
264
269
  return r;
265
270
  const boosted = { ...r, score: r.score * GOAL_TAG_BOOST };
266
- return traced(opts, r, boosted, { stage: 'goal', multiplier: GOAL_TAG_BOOST, scoreBefore: r.score, scoreAfter: r.score * GOAL_TAG_BOOST, note: `--goal ${goalTag}` });
271
+ return traced(opts, r, boosted, {
272
+ stage: 'goal', multiplier: GOAL_TAG_BOOST, scoreBefore: r.score, scoreAfter: r.score * GOAL_TAG_BOOST, note: `--goal ${goalTag}`
273
+ });
267
274
  }));
268
275
  return;
269
276
  }