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,24 +1,10 @@
1
- /**
2
- * Self-contained feature evaluation suite for hippo.
3
- *
4
- * Creates a synthetic memory corpus with known ground truth, runs searches
5
- * per feature category, and reports per-feature metrics with regression
6
- * detection against a saved baseline.
7
- *
8
- * Design goals:
9
- * - Zero API calls (no LLM judge, no embeddings)
10
- * - Deterministic (fixed timestamps, content, IDs)
11
- * - Fast (<60s for full suite)
12
- * - Per-feature breakdown so you see exactly what a change helped/hurt
13
- */
1
+ /** Self-contained feature eval suite: a synthetic corpus with known ground truth, per-feature metrics and regression detection against a saved baseline.
2
+ * Zero API calls (no LLM judge, no embeddings), deterministic (fixed timestamps, content, IDs) and fast. */
14
3
  import { createMemory, Layer } from '../core/memory.js';
15
4
  import { search } from '../search/bm25-search.js';
16
5
  import { multihopSearch } from '../search/multihop.js';
17
6
  import { mrr, recallAtK, ndcgAtK } from './eval.js';
18
7
  import { DAY_MS } from '../util/time.js';
19
- // ---------------------------------------------------------------------------
20
- // Synthetic corpus — deterministic, no API calls
21
- // ---------------------------------------------------------------------------
22
8
  const BASE_DATE = new Date('2026-01-15T10:00:00Z');
23
9
  function dateOffset(days) {
24
10
  const d = new Date(BASE_DATE.getTime() + days * DAY_MS);
@@ -40,8 +26,28 @@ function mem(id, content, opts = {}) {
40
26
  }
41
27
  /** Direct recall: basic keyword matching. */
42
28
  function addDirectRecall(entries, cases) {
43
- entries.push(mem('dr-1', 'The PostgreSQL database migration failed because the users table had a NOT NULL constraint on the email column', { created: dateOffset(1), tags: ['topic:database'] }), mem('dr-2', 'React component rendering performance improved by 40% after memoizing the expensive computation in useMemo', { created: dateOffset(2), tags: ['topic:frontend'] }), mem('dr-3', 'The API rate limiter should use a sliding window algorithm instead of fixed window to prevent burst traffic', { created: dateOffset(3), tags: ['topic:api'] }), mem('dr-4', 'Docker container memory limits need to be set to 512MB for the worker service to prevent OOM kills', { created: dateOffset(4), tags: ['topic:devops'] }), mem('dr-5', 'The JWT token expiration was set to 24 hours but should be reduced to 1 hour for security compliance', { created: dateOffset(5), tags: ['topic:security'] }), mem('dr-6', 'Webpack bundle size grew to 2.3MB because lodash was imported as a whole instead of cherry-picking', { created: dateOffset(6), tags: ['topic:frontend'] }), mem('dr-7', 'The Redis cache TTL for user sessions should match the JWT expiration to prevent stale sessions', { created: dateOffset(7), tags: ['topic:caching'] }), mem('dr-8', 'GraphQL resolver for nested comments has N+1 query problem solved by DataLoader batching', { created: dateOffset(8), tags: ['topic:api'] }));
44
- cases.push({ id: 'dr-q1', category: 'direct-recall', query: 'PostgreSQL migration NOT NULL constraint', expectedIds: ['dr-1'], description: 'exact keyword match on DB migration' }, { id: 'dr-q2', category: 'direct-recall', query: 'React useMemo performance memoizing', expectedIds: ['dr-2'], description: 'React performance optimization' }, { id: 'dr-q3', category: 'direct-recall', query: 'sliding window rate limiter API', expectedIds: ['dr-3'], description: 'API rate limiting approach' }, { id: 'dr-q4', category: 'direct-recall', query: 'Docker OOM memory limits worker', expectedIds: ['dr-4'], description: 'Docker memory config' }, { id: 'dr-q5', category: 'direct-recall', query: 'JWT token expiration security', expectedIds: ['dr-5'], description: 'JWT security setting' }, { id: 'dr-q6', category: 'direct-recall', query: 'webpack bundle size lodash', expectedIds: ['dr-6'], description: 'bundle size issue' }, { id: 'dr-q7', category: 'direct-recall', query: 'Redis cache TTL session expiration', expectedIds: ['dr-7'], description: 'cache TTL config' }, { id: 'dr-q8', category: 'direct-recall', query: 'GraphQL N+1 DataLoader batching', expectedIds: ['dr-8'], description: 'GraphQL N+1 fix' });
29
+ entries.push(mem('dr-1', 'The PostgreSQL database migration failed because the users table had a NOT NULL constraint on the email column', {
30
+ created: dateOffset(1), tags: ['topic:database']
31
+ }), mem('dr-2', 'React component rendering performance improved by 40% after memoizing the expensive computation in useMemo', {
32
+ created: dateOffset(2), tags: ['topic:frontend']
33
+ }), mem('dr-3', 'The API rate limiter should use a sliding window algorithm instead of fixed window to prevent burst traffic', {
34
+ created: dateOffset(3), tags: ['topic:api']
35
+ }), mem('dr-4', 'Docker container memory limits need to be set to 512MB for the worker service to prevent OOM kills', {
36
+ created: dateOffset(4), tags: ['topic:devops']
37
+ }), mem('dr-5', 'The JWT token expiration was set to 24 hours but should be reduced to 1 hour for security compliance', {
38
+ created: dateOffset(5), tags: ['topic:security']
39
+ }), mem('dr-6', 'Webpack bundle size grew to 2.3MB because lodash was imported as a whole instead of cherry-picking', {
40
+ created: dateOffset(6), tags: ['topic:frontend']
41
+ }), mem('dr-7', 'The Redis cache TTL for user sessions should match the JWT expiration to prevent stale sessions', {
42
+ created: dateOffset(7), tags: ['topic:caching']
43
+ }), mem('dr-8', 'GraphQL resolver for nested comments has N+1 query problem solved by DataLoader batching', { created: dateOffset(8), tags: ['topic:api'] }));
44
+ cases.push({
45
+ id: 'dr-q1', category: 'direct-recall', query: 'PostgreSQL migration NOT NULL constraint', expectedIds: ['dr-1'],
46
+ description: 'exact keyword match on DB migration'
47
+ }, {
48
+ id: 'dr-q2', category: 'direct-recall', query: 'React useMemo performance memoizing', expectedIds: ['dr-2'],
49
+ description: 'React performance optimization'
50
+ }, { id: 'dr-q3', category: 'direct-recall', query: 'sliding window rate limiter API', expectedIds: ['dr-3'], description: 'API rate limiting approach' }, { id: 'dr-q4', category: 'direct-recall', query: 'Docker OOM memory limits worker', expectedIds: ['dr-4'], description: 'Docker memory config' }, { id: 'dr-q5', category: 'direct-recall', query: 'JWT token expiration security', expectedIds: ['dr-5'], description: 'JWT security setting' }, { id: 'dr-q6', category: 'direct-recall', query: 'webpack bundle size lodash', expectedIds: ['dr-6'], description: 'bundle size issue' }, { id: 'dr-q7', category: 'direct-recall', query: 'Redis cache TTL session expiration', expectedIds: ['dr-7'], description: 'cache TTL config' }, { id: 'dr-q8', category: 'direct-recall', query: 'GraphQL N+1 DataLoader batching', expectedIds: ['dr-8'], description: 'GraphQL N+1 fix' });
45
51
  }
46
52
  /** Extraction preference: extracted facts should rank above raw source. */
47
53
  function addExtractionPreference(entries, cases) {
@@ -61,7 +67,16 @@ function addExtractionPreference(entries, cases) {
61
67
  created: dateOffset(12), layer: Layer.Semantic, tags: ['speaker:Carol', 'topic:auth', 'extracted'],
62
68
  extracted_from: 'ep-src-3',
63
69
  }));
64
- cases.push({ id: 'ep-q1', category: 'extraction-preference', query: 'Kubernetes upgrade staging environment', expectedIds: ['ep-ext-1'], description: 'extracted fact about K8s upgrade should rank above raw utterance' }, { id: 'ep-q2', category: 'extraction-preference', query: 'Datadog Grafana alerting migration', expectedIds: ['ep-ext-2'], description: 'extracted fact about monitoring switch' }, { id: 'ep-q3', category: 'extraction-preference', query: 'OAuth2 PKCE login page redesign', expectedIds: ['ep-ext-3'], description: 'extracted fact about auth work' });
70
+ cases.push({
71
+ id: 'ep-q1', category: 'extraction-preference', query: 'Kubernetes upgrade staging environment', expectedIds: ['ep-ext-1'],
72
+ description: 'extracted fact about K8s upgrade should rank above raw utterance'
73
+ }, {
74
+ id: 'ep-q2', category: 'extraction-preference', query: 'Datadog Grafana alerting migration', expectedIds: ['ep-ext-2'],
75
+ description: 'extracted fact about monitoring switch'
76
+ }, {
77
+ id: 'ep-q3', category: 'extraction-preference', query: 'OAuth2 PKCE login page redesign', expectedIds: ['ep-ext-3'],
78
+ description: 'extracted fact about auth work'
79
+ });
65
80
  }
66
81
  /** Dag drill-down: summary nodes should surface children. */
67
82
  function addDagDrilldown(entries, cases) {
@@ -82,12 +97,30 @@ function addDagDrilldown(entries, cases) {
82
97
  for (const child of [entries.find(e => e.id === 'dag-child-1'), entries.find(e => e.id === 'dag-child-2'), entries.find(e => e.id === 'dag-child-3')]) {
83
98
  child.dag_parent_id = 'dag-summary-1';
84
99
  }
85
- cases.push({ id: 'dag-q1', category: 'dag-drilldown', query: 'API performance problems latency', expectedIds: ['dag-child-1', 'dag-child-2', 'dag-child-3', 'dag-summary-1'], description: 'summary should drill down to all children' }, { id: 'dag-q2', category: 'dag-drilldown', query: 'endpoint response time degradation', expectedIds: ['dag-child-1', 'dag-child-2', 'dag-summary-1'], description: 'query matching summary should surface relevant children' });
100
+ cases.push({
101
+ id: 'dag-q1', category: 'dag-drilldown', query: 'API performance problems latency',
102
+ expectedIds: ['dag-child-1', 'dag-child-2', 'dag-child-3', 'dag-summary-1'], description: 'summary should drill down to all children'
103
+ }, {
104
+ id: 'dag-q2', category: 'dag-drilldown', query: 'endpoint response time degradation',
105
+ expectedIds: ['dag-child-1', 'dag-child-2', 'dag-summary-1'], description: 'query matching summary should surface relevant children'
106
+ });
86
107
  }
87
108
  /** Temporal: recency/oldest cues should affect ranking. */
88
109
  function addTemporal(entries, cases) {
89
110
  entries.push(mem('tmp-1', 'The team decided to use TypeScript for the new service', { created: dateOffset(-30), tags: ['topic:architecture'] }), mem('tmp-2', 'The team evaluated Rust as an alternative language for the service', { created: dateOffset(-20), tags: ['topic:architecture'] }), mem('tmp-3', 'The team added Go as a candidate language for the service rewrite', { created: dateOffset(-10), tags: ['topic:architecture'] }), mem('tmp-4', 'The team finalized the language choice as Go for the service rewrite', { created: dateOffset(-1), tags: ['topic:architecture'] }));
90
- cases.push({ id: 'tmp-q1', category: 'temporal', query: 'what did the team recently decide about the service language', expectedIds: ['tmp-4'], description: 'recent cue should boost newest entry' }, { id: 'tmp-q2', category: 'temporal', query: 'what was the first language choice for the service', expectedIds: ['tmp-1'], description: 'oldest cue should boost earliest entry' }, { id: 'tmp-q3', category: 'temporal', query: 'latest update on the service rewrite language', expectedIds: ['tmp-4'], description: 'latest should boost most recent' }, { id: 'tmp-q4', category: 'temporal', query: 'original architecture decision for the service', expectedIds: ['tmp-1'], description: 'original should boost earliest' });
111
+ cases.push({
112
+ id: 'tmp-q1', category: 'temporal', query: 'what did the team recently decide about the service language', expectedIds: ['tmp-4'],
113
+ description: 'recent cue should boost newest entry'
114
+ }, {
115
+ id: 'tmp-q2', category: 'temporal', query: 'what was the first language choice for the service', expectedIds: ['tmp-1'],
116
+ description: 'oldest cue should boost earliest entry'
117
+ }, {
118
+ id: 'tmp-q3', category: 'temporal', query: 'latest update on the service rewrite language', expectedIds: ['tmp-4'],
119
+ description: 'latest should boost most recent'
120
+ }, {
121
+ id: 'tmp-q4', category: 'temporal', query: 'original architecture decision for the service', expectedIds: ['tmp-1'],
122
+ description: 'original should boost earliest'
123
+ });
91
124
  }
92
125
  /** Noise resistance: relevant memories found despite noise. */
93
126
  function addNoiseResistance(entries, cases) {
@@ -117,7 +150,18 @@ function addNoiseResistance(entries, cases) {
117
150
  }), mem('nr-2', 'The S3 bucket policy was misconfigured allowing public read access to customer data uploads', {
118
151
  created: dateOffset(21), tags: ['topic:security', 'topic:s3'],
119
152
  }));
120
- cases.push({ id: 'nr-q1', category: 'noise-resistance', query: 'database connection pool exhausted max connections', expectedIds: ['nr-1'], description: 'find DB issue despite 30 noise entries' }, { id: 'nr-q2', category: 'noise-resistance', query: 'S3 bucket public access security misconfiguration', expectedIds: ['nr-2'], description: 'find S3 issue despite noise' }, { id: 'nr-q3', category: 'noise-resistance', query: 'PostgreSQL migration constraint', expectedIds: ['dr-1'], description: 'find earlier DB entry despite noise' }, { id: 'nr-q4', category: 'noise-resistance', query: 'JWT token security expiration', expectedIds: ['dr-5'], description: 'find security entry despite noise' });
153
+ cases.push({
154
+ id: 'nr-q1', category: 'noise-resistance', query: 'database connection pool exhausted max connections', expectedIds: ['nr-1'],
155
+ description: 'find DB issue despite 30 noise entries'
156
+ }, {
157
+ id: 'nr-q2', category: 'noise-resistance', query: 'S3 bucket public access security misconfiguration', expectedIds: ['nr-2'],
158
+ description: 'find S3 issue despite noise'
159
+ }, {
160
+ id: 'nr-q3', category: 'noise-resistance', query: 'PostgreSQL migration constraint', expectedIds: ['dr-1'],
161
+ description: 'find earlier DB entry despite noise'
162
+ }, {
163
+ id: 'nr-q4', category: 'noise-resistance', query: 'JWT token security expiration', expectedIds: ['dr-5'], description: 'find security entry despite noise'
164
+ });
121
165
  }
122
166
  /** Multi-hop: entity chaining across sessions. */
123
167
  function addMultiHop(entries, cases) {
@@ -130,7 +174,13 @@ function addMultiHop(entries, cases) {
130
174
  }), mem('mh-4', 'speaker:Carol reported that the billing dashboard shows incorrect revenue numbers because it reads from the payments_raw table instead of payments_reconciled.', {
131
175
  created: dateOffset(28), tags: ['speaker:Carol', 'topic:billing'],
132
176
  }));
133
- cases.push({ id: 'mh-q1', category: 'multi-hop', query: 'Who fixed the Stripe webhook bug and what was the root cause?', expectedIds: ['mh-1', 'mh-2', 'mh-3'], description: 'chain Alice -> Stripe -> Bob -> fix' }, { id: 'mh-q2', category: 'multi-hop', query: 'What are all the payment-related issues the team discussed?', expectedIds: ['mh-1', 'mh-2', 'mh-3', 'mh-4'], description: 'find all payment topics across speakers' });
177
+ cases.push({
178
+ id: 'mh-q1', category: 'multi-hop', query: 'Who fixed the Stripe webhook bug and what was the root cause?',
179
+ expectedIds: ['mh-1', 'mh-2', 'mh-3'], description: 'chain Alice -> Stripe -> Bob -> fix'
180
+ }, {
181
+ id: 'mh-q2', category: 'multi-hop', query: 'What are all the payment-related issues the team discussed?',
182
+ expectedIds: ['mh-1', 'mh-2', 'mh-3', 'mh-4'], description: 'find all payment topics across speakers'
183
+ });
134
184
  }
135
185
  export function buildSyntheticCorpus() {
136
186
  const entries = [];
@@ -197,9 +247,6 @@ export async function runFeatureEval(version) {
197
247
  durationMs: Date.now() - start,
198
248
  };
199
249
  }
200
- // ---------------------------------------------------------------------------
201
- // Regression detection
202
- // ---------------------------------------------------------------------------
203
250
  const REGRESSION_THRESHOLD = 0.05;
204
251
  export function detectRegressions(baseline, current) {
205
252
  const regressions = [];
@@ -227,11 +274,7 @@ export function detectRegressions(baseline, current) {
227
274
  };
228
275
  }
229
276
  export function resultToBaseline(result) {
230
- // SAFETY: every FeatureCategory key is populated by the loop immediately
231
- // below (one iteration per entry in result.features), before this object
232
- // is read anywhere; result.features is built from every category in
233
- // buildSyntheticCorpus's cases (runFeatureEval derives `categories` the
234
- // same way), so no FeatureCategory key is left unset.
277
+ // SAFETY: the loop below sets every FeatureCategory key from result.features, which holds every category in buildSyntheticCorpus's cases.
235
278
  const features = {};
236
279
  for (const f of result.features) {
237
280
  features[f.category] = { mrr: f.mrr, recallAt5: f.recallAt5, ndcgAt5: f.ndcgAt5 };
@@ -243,9 +286,6 @@ export function resultToBaseline(result) {
243
286
  overall: result.overall,
244
287
  };
245
288
  }
246
- // ---------------------------------------------------------------------------
247
- // Formatters
248
- // ---------------------------------------------------------------------------
249
289
  function pct(n) {
250
290
  return (n * 100).toFixed(1) + '%';
251
291
  }
@@ -1,13 +1,5 @@
1
- /**
2
- * Recall eval harness.
3
- *
4
- * Given a corpus of (query, expected_memory_ids) cases, run recall against
5
- * the store and report ranking-quality metrics: MRR, Recall@K, NDCG@K.
6
- *
7
- * The goal is to make recall quality measurable so MMR lambda, embedding
8
- * weights, and future scoring tweaks can be tuned against evidence instead
9
- * of intuition.
10
- */
1
+ /** Recall eval harness: runs recall over (query, expected_memory_ids) cases and reports MRR, Recall@K and NDCG@K.
2
+ * It exists so MMR lambda, embedding weights and scoring tweaks are tuned against evidence instead of intuition. */
11
3
  import type { MemoryEntry } from '../core/memory.js';
12
4
  export interface EvalCase {
13
5
  /** Free-form ID for humans to reference the case. */
@@ -58,10 +50,8 @@ export interface RunEvalOptions {
58
50
  export declare function mrr(returned: string[], expected: string[]): number;
59
51
  /** Recall@K — fraction of expected items found in the top-K. */
60
52
  export declare function recallAtK(returned: string[], expected: string[], k: number): number;
61
- /**
62
- * Normalized Discounted Cumulative Gain at K with binary relevance.
63
- * gain_i = 1 if returned[i] ∈ expected else 0. discount = log2(i + 2).
64
- */
53
+ /** Normalized Discounted Cumulative Gain at K with binary relevance.
54
+ * gain_i = 1 if returned[i] ∈ expected else 0. discount = log2(i + 2). */
65
55
  export declare function ndcgAtK(returned: string[], expected: string[], k: number): number;
66
56
  export declare function runEval(cases: EvalCase[], entries: MemoryEntry[], options?: RunEvalOptions): Promise<EvalSummary>;
67
57
  export interface EvalDelta {
@@ -88,16 +78,8 @@ export interface EvalComparison {
88
78
  onlyInBaseline: string[];
89
79
  onlyInCurrent: string[];
90
80
  }
91
- /**
92
- * Compute pairwise deltas between a baseline and a current eval summary.
93
- * Cases are matched by EvalCase.id; any mismatch is surfaced in the onlyIn
94
- * arrays so the caller knows the corpora diverged.
95
- */
81
+ /** Compute pairwise deltas between a baseline and a current eval summary, matching cases by EvalCase.id; mismatches land in the onlyIn arrays. */
96
82
  export declare function compareSummaries(baseline: EvalSummary, current: EvalSummary): EvalComparison;
97
- /**
98
- * For each memory, take its first 8 content words as a trivial query and
99
- * expect that memory back. Useful as a smoke test: if recall can't find a
100
- * memory by its own opening words, something is broken.
101
- */
83
+ /** For each memory, use its first 8 content words as a trivial query and expect that memory back: a smoke test for recall. */
102
84
  export declare function bootstrapCorpus(entries: MemoryEntry[], maxCases?: number): EvalCase[];
103
85
  //# sourceMappingURL=eval.d.ts.map
package/dist/eval/eval.js CHANGED
@@ -1,22 +1,11 @@
1
- /**
2
- * Recall eval harness.
3
- *
4
- * Given a corpus of (query, expected_memory_ids) cases, run recall against
5
- * the store and report ranking-quality metrics: MRR, Recall@K, NDCG@K.
6
- *
7
- * The goal is to make recall quality measurable so MMR lambda, embedding
8
- * weights, and future scoring tweaks can be tuned against evidence instead
9
- * of intuition.
10
- */
1
+ /** Recall eval harness: runs recall over (query, expected_memory_ids) cases and reports MRR, Recall@K and NDCG@K.
2
+ * It exists so MMR lambda, embedding weights and scoring tweaks are tuned against evidence instead of intuition. */
11
3
  import { hybridSearch } from '../search/hybrid.js';
12
- import { searchBothHybrid } from '../sharing/shared.js';
4
+ import { searchBothHybrid } from '../sharing/search-both.js';
13
5
  import { isInitialized } from '../store/open.js';
14
6
  // Generous so metrics are not truncated.
15
7
  const DEFAULT_EVAL_BUDGET = 100_000;
16
8
  const QUERY_WORDS = 8;
17
- // ---------------------------------------------------------------------------
18
- // Metrics — pure functions. K is inclusive of position K.
19
- // ---------------------------------------------------------------------------
20
9
  /** Mean Reciprocal Rank for a single ranking given expected ids. */
21
10
  export function mrr(returned, expected) {
22
11
  if (expected.length === 0)
@@ -41,10 +30,8 @@ export function recallAtK(returned, expected, k) {
41
30
  }
42
31
  return hits / expected.length;
43
32
  }
44
- /**
45
- * Normalized Discounted Cumulative Gain at K with binary relevance.
46
- * gain_i = 1 if returned[i] ∈ expected else 0. discount = log2(i + 2).
47
- */
33
+ /** Normalized Discounted Cumulative Gain at K with binary relevance.
34
+ * gain_i = 1 if returned[i] ∈ expected else 0. discount = log2(i + 2). */
48
35
  export function ndcgAtK(returned, expected, k) {
49
36
  if (expected.length === 0)
50
37
  return 0;
@@ -63,9 +50,6 @@ export function ndcgAtK(returned, expected, k) {
63
50
  }
64
51
  return idcg === 0 ? 0 : dcg / idcg;
65
52
  }
66
- // ---------------------------------------------------------------------------
67
- // Runner
68
- // ---------------------------------------------------------------------------
69
53
  export async function runEval(cases, entries, options = {}) {
70
54
  const start = Date.now();
71
55
  const results = [];
@@ -117,11 +101,7 @@ function rankForCase(query, entries, options, useBothStores) {
117
101
  mmrLambda: options.mmrLambda,
118
102
  });
119
103
  }
120
- /**
121
- * Compute pairwise deltas between a baseline and a current eval summary.
122
- * Cases are matched by EvalCase.id; any mismatch is surfaced in the onlyIn
123
- * arrays so the caller knows the corpora diverged.
124
- */
104
+ /** Compute pairwise deltas between a baseline and a current eval summary, matching cases by EvalCase.id; mismatches land in the onlyIn arrays. */
125
105
  export function compareSummaries(baseline, current) {
126
106
  const aggregate = {
127
107
  mrr: current.meanMrr - baseline.meanMrr,
@@ -165,14 +145,7 @@ export function compareSummaries(baseline, current) {
165
145
  onlyInCurrent: [...curById.keys()].filter((id) => !baseById.has(id)),
166
146
  };
167
147
  }
168
- // ---------------------------------------------------------------------------
169
- // Bootstrap — generate a synthetic corpus from current memories
170
- // ---------------------------------------------------------------------------
171
- /**
172
- * For each memory, take its first 8 content words as a trivial query and
173
- * expect that memory back. Useful as a smoke test: if recall can't find a
174
- * memory by its own opening words, something is broken.
175
- */
148
+ /** For each memory, use its first 8 content words as a trivial query and expect that memory back: a smoke test for recall. */
176
149
  export function bootstrapCorpus(entries, maxCases = 50) {
177
150
  const cases = [];
178
151
  for (const e of entries) {
@@ -20,9 +20,6 @@ export interface JudgeOptions {
20
20
  /** Bounded parallelism for `judgeAll`. */
21
21
  concurrency?: number;
22
22
  }
23
- /** `null` on any failure, so a Jev outage degrades capture to today's
24
- * behaviour instead of blocking the write. */
25
- export declare function judge(content: string, opts: JudgeOptions): Promise<Judgment | null>;
26
23
  /** Judge many candidates under a bounded concurrency pool, order preserved. */
27
24
  export declare function judgeAll(contents: readonly string[], opts: JudgeOptions): Promise<(Judgment | null)[]>;
28
25
  //# sourceMappingURL=judgment.d.ts.map
@@ -3,9 +3,19 @@
3
3
  * every captured memory currently lands on a flat schema_fit of 0.5. */
4
4
  import { fetchWithRetry } from '../util/http-retry.js';
5
5
  import { errorMessage, log } from '../util/log.js';
6
+ import { readCappedJson } from '../util/capped-json.js';
7
+ import { isJsonNumber, isJsonObject, isJsonString } from '../util/json.js';
6
8
  const ENDPOINT = 'https://api.typesafe.ai/v1/systemone';
7
9
  const DEFAULT_MODEL = 'jev-1.13.0';
8
10
  const MAX_CONCURRENCY = 8;
11
+ // An honest reply is three short answers, a few hundred bytes; 1 MiB leaves room for a verbose envelope.
12
+ const JUDGE_MAX_REPLY_BYTES = 1024 * 1024;
13
+ /** One named answer of a Jev reply `{ answers: { <name>: Answer } }`; an empty object when the reply has none of that shape. */
14
+ function answerNamed(reply, name) {
15
+ const answers = isJsonObject(reply) ? reply.answers : undefined;
16
+ const answer = isJsonObject(answers) ? answers[name] : undefined;
17
+ return isJsonObject(answer) ? answer : {};
18
+ }
9
19
  const QUESTIONS = {
10
20
  durable: {
11
21
  type: 'noul',
@@ -36,7 +46,7 @@ const QUESTIONS = {
36
46
  const KINDS = ['error', 'decision', 'convention', 'preference', 'trivia'];
37
47
  const VALENCES = ['critical', 'negative', 'positive', 'neutral'];
38
48
  function oneOf(value, allowed) {
39
- return allowed.find((option) => option === value) ?? null;
49
+ return isJsonString(value) ? allowed.find((option) => option === value) ?? null : null;
40
50
  }
41
51
  /** `verified` is unreachable: that tier means a human or a test confirmed it. */
42
52
  function toConfidenceTier(kindConfidence) {
@@ -70,7 +80,7 @@ async function post(content, opts) {
70
80
  }
71
81
  /** `null` on any failure, so a Jev outage degrades capture to today's
72
82
  * behaviour instead of blocking the write. */
73
- export async function judge(content, opts) {
83
+ async function judge(content, opts) {
74
84
  const trimmed = content.trim();
75
85
  if (trimmed.length < 3)
76
86
  return null;
@@ -79,21 +89,19 @@ export async function judge(content, opts) {
79
89
  return null;
80
90
  let data;
81
91
  try {
82
- // SAFETY: the documented Jev response is `{ answers: { <name>: Answer } }`
83
- // keyed by the question names posted above; every field read below is
84
- // optional-chained and range-checked before use, so a lie here returns null.
85
- data = await res.json();
92
+ data = await readCappedJson(res, JUDGE_MAX_REPLY_BYTES);
86
93
  }
87
94
  catch (err) {
88
95
  log.debug(`judge: unreadable response: ${errorMessage(err)}`);
89
96
  return null;
90
97
  }
91
- const durable = data.answers?.durable?.noul;
92
- const kind = oneOf(data.answers?.kind?.choice, KINDS);
93
- const valence = oneOf(data.answers?.valence?.choice, VALENCES);
94
- if (durable === undefined || durable < 0 || durable > 1 || !kind || !valence)
98
+ const durable = answerNamed(data, 'durable').noul;
99
+ const kindAnswer = answerNamed(data, 'kind');
100
+ const kind = oneOf(kindAnswer.choice, KINDS);
101
+ const valence = oneOf(answerNamed(data, 'valence').choice, VALENCES);
102
+ if (!isJsonNumber(durable) || durable < 0 || durable > 1 || !kind || !valence)
95
103
  return null;
96
- const kindConfidence = data.answers?.kind?.confidence ?? 0;
104
+ const kindConfidence = isJsonNumber(kindAnswer.confidence) ? kindAnswer.confidence : 0;
97
105
  return { durable, kind, valence, confidence: toConfidenceTier(kindConfidence), kindConfidence };
98
106
  }
99
107
  /** Judge many candidates under a bounded concurrency pool, order preserved. */
@@ -280,7 +280,7 @@ export default function register(api) {
280
280
  // --- Tool: hippo_outcome ---
281
281
  api.registerTool((ctx) => ({
282
282
  name: 'hippo_outcome',
283
- description: 'Report whether recalled memories were useful. Strengthens good memories (+5 days half-life) and weakens bad ones (-3 days). Call after completing work.',
283
+ description: "Report whether recalled memories were useful. Good outcomes slow a memory's decay and bad ones speed it up, in proportion to its record. Call after completing work.",
284
284
  parameters: {
285
285
  type: 'object',
286
286
  properties: {
@@ -1,34 +1,12 @@
1
- /**
2
- * Deterministic entity extraction.
3
- *
4
- * Populates the graph from the already-structured consolidated first-class object tables -
5
- * NO NLP, no precision gate for entities + supersedes. The graph is a pure derived
6
- * function of the current object state, so `extractGraph` is an idempotent REBUILD: derive
7
- * entities + `supersedes` relations from decisions /
8
- * policies / customer_notes / project_briefs (the four object types whose kind maps to the
9
- * `entity_type` enum), then write only their difference from the stored rows. All writes go
10
- * through the src/store/graph-writes.ts consolidated-source guard; this module issues no raw SQL.
11
- *
12
- * Pass 3 adds the
13
- * first CROSS-OBJECT relations: a deterministic NAME-MATCH heuristic that emits a
14
- * `references` edge when one consolidated object's text contains another entity's name.
15
- * It is conservative (word-boundary, length-bounded, ambiguity-guarded, per-source
16
- * capped); its precision is measured + reported, not assumed.
17
- *
18
- * Deferred (follow-ups): NLP prose-extraction (semantic depends-on / blocked-by / owns);
19
- * skill/incident/process entities (not in the entity_type enum - needs a migration); the
20
- * `hippo sleep` enqueue-hook.
21
- */
1
+ /** Deterministic entity extraction: the graph is a pure function of the consolidated object tables (decisions, policies, customer_notes, project_briefs).
2
+ * Writes go through the src/store/graph-writes.ts consolidated-source guard. Pass 3 adds `references` edges by a conservative name-match heuristic. */
22
3
  import { type EntityType } from '../store/graph-rows.js';
23
4
  import { type DesiredGraph } from './delta.js';
24
5
  import { type WriteBudget } from '../util/write-budget.js';
25
- /** Per-type load cap (the loaders default to 100). A type whose active or superseded
26
- * set exceeds this is truncated; `ExtractResult.truncated` records it so the
27
- * incompleteness is observable rather than silent. */
6
+ /** Per-type load cap (the loaders default to 100); a type over it is truncated and `ExtractResult.truncated` records that. */
28
7
  export declare const MAX_EXTRACT_PER_TYPE = 10000;
29
- /** A target entity name must be in [MIN, MAX] chars to be matched: MIN skips short /
30
- * generic words; MAX skips prose (a decision's prose name is never a target, only a
31
- * source). */
8
+ /** A target entity name must be in [MIN, MAX] chars to be matched: MIN skips short, generic words; MAX skips prose
9
+ * (a decision's prose name is never a target, only a source). */
32
10
  export declare const MIN_REF_NAME_LEN = 4;
33
11
  export declare const MAX_REF_NAME_LEN = 80;
34
12
  /** Per-source cap so one object cannot explode the graph with references edges. */
@@ -1,24 +1,5 @@
1
- /**
2
- * Deterministic entity extraction.
3
- *
4
- * Populates the graph from the already-structured consolidated first-class object tables -
5
- * NO NLP, no precision gate for entities + supersedes. The graph is a pure derived
6
- * function of the current object state, so `extractGraph` is an idempotent REBUILD: derive
7
- * entities + `supersedes` relations from decisions /
8
- * policies / customer_notes / project_briefs (the four object types whose kind maps to the
9
- * `entity_type` enum), then write only their difference from the stored rows. All writes go
10
- * through the src/store/graph-writes.ts consolidated-source guard; this module issues no raw SQL.
11
- *
12
- * Pass 3 adds the
13
- * first CROSS-OBJECT relations: a deterministic NAME-MATCH heuristic that emits a
14
- * `references` edge when one consolidated object's text contains another entity's name.
15
- * It is conservative (word-boundary, length-bounded, ambiguity-guarded, per-source
16
- * capped); its precision is measured + reported, not assumed.
17
- *
18
- * Deferred (follow-ups): NLP prose-extraction (semantic depends-on / blocked-by / owns);
19
- * skill/incident/process entities (not in the entity_type enum - needs a migration); the
20
- * `hippo sleep` enqueue-hook.
21
- */
1
+ /** Deterministic entity extraction: the graph is a pure function of the consolidated object tables (decisions, policies, customer_notes, project_briefs).
2
+ * Writes go through the src/store/graph-writes.ts consolidated-source guard. Pass 3 adds `references` edges by a conservative name-match heuristic. */
22
3
  import { applyGraphOps } from './write.js';
23
4
  import { runGraphRebuildTransaction } from '../store/graph-writes.js';
24
5
  import { MAX_ENTITY_NAME_LEN } from '../store/graph-rows.js';
@@ -31,14 +12,10 @@ import { loadCustomerNotes } from '../objects/customer-notes.js';
31
12
  import { loadProjectBriefs } from '../objects/project-briefs.js';
32
13
  import { assertTenantId } from '../store/tenant.js';
33
14
  import { escapeRegex } from '../util/escape.js';
34
- /** Per-type load cap (the loaders default to 100). A type whose active or superseded
35
- * set exceeds this is truncated; `ExtractResult.truncated` records it so the
36
- * incompleteness is observable rather than silent. */
15
+ /** Per-type load cap (the loaders default to 100); a type over it is truncated and `ExtractResult.truncated` records that. */
37
16
  export const MAX_EXTRACT_PER_TYPE = 10000;
38
- // --- Pass 3 (cross-object references) tunables ------------------------------------
39
- /** A target entity name must be in [MIN, MAX] chars to be matched: MIN skips short /
40
- * generic words; MAX skips prose (a decision's prose name is never a target, only a
41
- * source). */
17
+ /** A target entity name must be in [MIN, MAX] chars to be matched: MIN skips short, generic words; MAX skips prose
18
+ * (a decision's prose name is never a target, only a source). */
42
19
  export const MIN_REF_NAME_LEN = 4;
43
20
  export const MAX_REF_NAME_LEN = 80;
44
21
  /** Per-source cap so one object cannot explode the graph with references edges. */
@@ -72,11 +49,8 @@ function sourceObjectOf(entityType, e2Id) {
72
49
  function pairKey(a, b) {
73
50
  return a < b ? `${a}:${b}` : `${b}:${a}`;
74
51
  }
75
- /**
76
- * Close over one loader's row type so the table below holds uniform functions without erasing it.
77
- * Loads ACTIVE + SUPERSEDED rows (excluding `closed` = retired) in one call per status, so
78
- * MAX_EXTRACT_PER_TYPE is a per-status budget; `hitCap` is set when either load is full.
79
- */
52
+ /** Close over one loader's row type so the table below holds uniform functions. Loads ACTIVE and SUPERSEDED rows (not `closed`),
53
+ * one call per status, so MAX_EXTRACT_PER_TYPE is a per-status budget; `hitCap` is set when either load is full. */
80
54
  function source(entityType, load, nameOf, textOf) {
81
55
  return (hippoRoot, tenantId) => {
82
56
  const rows = [];
@@ -17,9 +17,8 @@ export interface GraphExpandOpts {
17
17
  tenantId: string;
18
18
  /** Mirror the recall handler's hard filters when re-loading graph-reached rows. */
19
19
  includeSuperseded?: boolean;
20
- /** ISO date; bi-temporal as-of filter applied to graph-reached rows (full rule, matching
21
- * cmdRecall: a row is visible if valid_from <= asOf AND, when superseded, its successor
22
- * was not yet valid at asOf). */
20
+ /** ISO date; bi-temporal as-of filter applied to graph-reached rows, matching cmdRecall:
21
+ * visible if valid_from <= asOf and, when superseded, its successor was not yet valid at asOf. */
23
22
  asOf?: string;
24
23
  /** Token budget for the augmented set (defaults to DEFAULT_RECALL_BUDGET, matching recall). */
25
24
  budget?: number;
@@ -28,28 +27,16 @@ export interface GraphExpandOpts {
28
27
  /** The recall --min-results floor: this many top base rows are kept regardless of
29
28
  * budget, so graph expansion never violates the floor. Defaults to 1. */
30
29
  minResults?: number;
31
- /** Recall-side envelope scope rule applied to graph-REACHED memories (the injected
32
- * rows), mirroring shared.ts SearchBothOptions.recallScope. Omitted = default-deny
33
- * (private + quarantine scopes excluded, NULL passes) — the fail-closed default for
34
- * bare/SDK callers. { requested, additive: true } = CLI --scope unlock semantics
35
- * (passesCliRecallScopeFilter); additive false/absent with requested set = api
36
- * exact-narrowing semantics (passesScopeFilterForRecall). Base results are the
37
- * caller's responsibility (they passed through the caller's own scope filter). */
30
+ /** Recall-side scope rule applied to graph-REACHED memories only (base results already passed the caller), mirroring HybridSearchOptions.recallScope.
31
+ * Omitted = default-deny (private and quarantine excluded, NULL passes), the fail-closed default for SDK callers.
32
+ * { requested, additive: true } is CLI --scope unlock (passesCliRecallScopeFilter); otherwise exact narrowing (passesScopeFilterForRecall). */
38
33
  recallScope?: {
39
34
  requested?: string;
40
35
  additive?: boolean;
41
36
  ownScope?: string;
42
37
  };
43
38
  }
44
- /**
45
- * Augment `baseResults` with memories reached by walking the graph `hops` edges out from
46
- * the seed results' entities (across the local AND global stores). Each graph hit is
47
- * inserted directly after the base result it descends from, scored just below that seed;
48
- * the base list's own order is preserved. Token-budget-bounded; deduped against the base
49
- * set and across stores.
50
- *
51
- * No-op (returns `baseResults` unchanged) when `hops <= 0`, there are no base results, the
52
- * graph is empty, no seed maps to an entity, or nothing new survives the filters/budget.
53
- */
39
+ /** Augment `baseResults` with memories reached by walking `hops` graph edges from the seeds across local AND global stores, each placed after its seed.
40
+ * Returns `baseResults` unchanged when `hops <= 0`, there are no base results, or nothing new survives the filters and the token budget. */
54
41
  export declare function graphExpandRecall(baseResults: SearchResult[], opts: GraphExpandOpts): SearchResult[];
55
42
  //# sourceMappingURL=recall.d.ts.map