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,12 +1,12 @@
1
1
  // Read path: recall (sync) and retrieve (async, adds the vector arm).
2
2
  import { envRequireSessionScopedFreshTail } from '../util/env.js';
3
3
  import { DEFAULT_SEARCH_CANDIDATE_LIMIT } from '../store/rows.js';
4
- import { loadEntriesByIds, loadFreshRawMemories } from '../store/entry-reads.js';
5
- import { loadRecallSearchEntries, recallScopeFilter } from '../store/search-rows.js';
4
+ import { recallScopeFilter } from '../store/search-rows.js';
6
5
  import { estimateTokens } from '../util/token-text.js';
7
6
  import { formatHandoffEvidenceLine } from '../core/handoff.js';
8
- import { activeGoalsWithPolicies, boostByGoals } from '../store/goals.js';
9
- import { continuityAt, finishRecallAt, storeFor } from '../store/index.js';
7
+ import { boostByGoals } from '../search/goal-boost.js';
8
+ import { storeFor } from '../store/index.js';
9
+ import { sqliteSyncStore } from '../store/sqlite/store.js';
10
10
  import { hybridSearch } from '../search/hybrid.js';
11
11
  import { physicsSearch } from '../search/physics-search.js';
12
12
  import { churnStaleFactor } from '../search/boosts.js';
@@ -15,56 +15,26 @@ import { dropHeldCopies, duplicateKey, storedTextKeys } from '../util/same-text.
15
15
  import { isSharedStore, loadConfig } from '../core/config.js';
16
16
  import { classifyOriginProject, projectNames } from '../core/project-identity.js';
17
17
  import { decidePlanningFallacy, detectPlanningClaim } from '../predictions/planning-fallacy.js';
18
- import { planningFallacyEvidenceAt } from '../store/planning-fallacy-evidence.js';
19
18
  import { detectAnchoring, hashQueryText, biasHintEnabled } from './recall-history.js';
20
19
  import { detectAvailabilityBias } from './availability.js';
21
20
  import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../store/recall-scope.js';
22
21
  import { ownerOrSubject, RecallContractError } from './types.js';
23
22
  import { anchoringRows, availabilityRows, callerOf, recallAuditMetadata, recallAuditRow, strengthenOf } from './recall-record.js';
24
23
  import { retrieveWithCliCore } from './recall-core.js';
24
+ import { recallLead, recordShownRecall } from './recall-finish.js';
25
25
  const DEFAULT_RECALL_LIMIT = 10;
26
- /**
27
- * Shared construction helper for `RecallSuppressionSummary`. Used by
28
- * `api.recall`, `cmdRecall`, and the MCP `hippo_recall` handler so all three
29
- * pipelines produce the same shape without duplicating field-construction
30
- * logic. Pass-through identity today; kept as a helper so future field
31
- * additions land at one site.
32
- */
33
- export function buildSuppressionSummary(counts) {
34
- return {
35
- totalCandidates: counts.totalCandidates,
36
- droppedPreRank: counts.droppedPreRank,
37
- droppedByBudget: counts.droppedByBudget,
38
- summarySubstitutionsAdded: counts.summarySubstitutionsAdded,
39
- freshTailAdded: counts.freshTailAdded,
40
- suppressedByInterference: counts.suppressedByInterference,
41
- };
42
- }
43
- /**
44
- * Domain-level recall on hippo.db only, never `ctx.store`, since it is synchronous: under another store its first open throws
45
- * `SqliteBlockedError`. Loads BM25-ranked candidates from SQLite scoped to
46
- * `ctx.tenantId` and keeps that order whatever `mode` says; `retrieve` is the
47
- * mode-aware, strengthening variant the HTTP route uses.
48
- *
49
- * **api.recall does NOT mutate `index.last_retrieval_ids`** (contract
50
- * lock). The CLI `cmdRecall` (cli.ts) writes `last_retrieval_ids` because the
51
- * CLI is interactive (user is about to run `hippo outcome --good`). SDK callers
52
- * are programmatic: they either pass explicit ids to `api.outcome` or call
53
- * `api.getContext` first for the context-then-outcome workflow (getContext
54
- * DOES write `last_retrieval_ids`). Adding the side-effect here would change
55
- * `api.recall` from a pure read into a read+write, breaking SDK callers who
56
- * batch recall calls in a row. Locked by
57
- * `tests/api-recall-no-side-effects.test.ts`.
58
- */
26
+ /** Reads hippo.db directly, never `ctx.store`, because it is synchronous (another store would throw `SqliteBlockedError`).
27
+ * It never writes `last_retrieval_ids` (contract lock: tests/api-recall-no-side-effects.test.ts). */
59
28
  export function recall(ctx, opts) {
60
29
  // A member key may not unlock a private or quarantined scope by naming it.
61
30
  assertScopeRequestAllowed(ctx.actor, opts.scope);
62
31
  const windowSize = recallWindowSize(opts);
63
32
  const own = personalScopeOf(ctx.actor) ?? undefined;
64
- const all = loadRecallSearchEntries(ctx.hippoRoot, opts.query, windowSize, ctx.tenantId, opts.scope, 'exact', false, recallOrigin(opts), own);
33
+ const store = sqliteSyncStore(ctx.hippoRoot);
34
+ const all = store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, windowSize, own));
65
35
  const plan = planRecall(ctx, opts, all, own);
66
- const { result, writes } = composeRecall(ctx, opts, { windowSize, all, plan, reads: readRecallSync(ctx, opts, plan) });
67
- finishRecallAt(ctx.hippoRoot, { ...writes, audit: [...(opts.leadingAudit ?? []), ...writes.audit] });
36
+ const { result, writes } = composeRecall(ctx, opts, { windowSize, all, plan, reads: readRecallSync(store, ctx, opts, plan) });
37
+ store.finishRecall({ ...writes, audit: [...(opts.leadingAudit ?? []), ...writes.audit] });
68
38
  return result;
69
39
  }
70
40
  function recallOrigin(opts) {
@@ -73,7 +43,8 @@ function recallOrigin(opts) {
73
43
  function inCallerProject(entry, opts) {
74
44
  return !opts.project || classifyOriginProject(entry.origin_project, opts.project) !== 'cross-project';
75
45
  }
76
- /** The one recall entry: ranks with the ranker `opts` names, then writes the recall. Only the CLI core ranker writes last_retrieval_ids (contract lock). */
46
+ /** The one recall entry: ranks with the ranker `opts` names, then writes the recall, and records it in full for a surface that sets `recordAs`.
47
+ * Only the CLI core ranker writes last_retrieval_ids (contract lock). */
77
48
  export async function retrieve(ctx, opts) {
78
49
  assertScopeRequestAllowed(ctx.actor, opts.scope);
79
50
  if (opts.cliCore)
@@ -84,20 +55,48 @@ export async function retrieve(ctx, opts) {
84
55
  if (opts.showRanked)
85
56
  return retrieveFromStore(ctx, opts, windowSize, opts.showRanked, own);
86
57
  const store = storeFor(ctx);
58
+ const how = opts.recordAs;
59
+ if (!how)
60
+ return retrieveBand(ctx, store, opts, windowSize, own);
61
+ const result = await retrieveBand(ctx, store, { ...opts, ...recallLead(ctx, how, opts.query, opts.sessionId) }, windowSize, own);
62
+ await recordShownRecall(ctx, store, how, shownBand(opts, result));
63
+ return result;
64
+ }
65
+ /** What the band ranker hands to the record: the rows it returns, and the continuity block the reply carries beside them. */
66
+ function shownBand(opts, result) {
67
+ return {
68
+ query: opts.query,
69
+ sessionId: opts.sessionId,
70
+ topId: result.results[0]?.id ?? null,
71
+ anchoredOn: result.anchoringHint?.memoryId,
72
+ items: result.results.length,
73
+ tokens: result.tokens + (result.continuityTokens ?? 0),
74
+ ledgerSessionId: opts.sessionId ?? null,
75
+ written: true, // a failed audit write throws out of the band ranker, so this point is never reached without the rows
76
+ };
77
+ }
78
+ /** The default ranker: the SQL BM25 band, reordered by hybrid or physics search when `mode` asks. */
79
+ async function retrieveBand(ctx, store, opts, windowSize, own) {
87
80
  let candidates = await store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, windowSize, own));
88
81
  if (opts.mode === 'hybrid' || opts.mode === 'physics') {
89
82
  const searchOpts = { budget: Infinity, hippoRoot: ctx.hippoRoot, scope: opts.scope ?? null, vectorCandidates: recallVectorSpec(ctx, opts, own), store };
90
- const ranked = opts.mode === 'physics'
91
- ? await physicsSearch(opts.query, candidates, { ...searchOpts, physicsConfig: loadConfig(ctx.hippoRoot).physics })
92
- : await hybridSearch(opts.query, candidates, searchOpts);
83
+ const ranked = await rankPool(ctx, opts, candidates, searchOpts);
93
84
  const rankedIds = new Set(ranked.map((r) => r.entry.id));
94
85
  candidates = [...ranked.map((r) => r.entry), ...candidates.filter((e) => !rankedIds.has(e.id))];
95
86
  }
96
87
  const plan = planRecall(ctx, opts, candidates, own);
97
88
  const { result, writes } = composeRecall(ctx, opts, { windowSize, all: candidates, plan, reads: await readRecall(store, ctx, opts, plan) });
98
- await store.finishRecall({ ...writes, audit: [...(opts.leadingAudit ?? []), ...writes.audit], strengthen: strengthenOf(ctx, result.results.map((r) => r.id)) });
89
+ await store.finishRecall({
90
+ ...writes, audit: [...(opts.leadingAudit ?? []), ...writes.audit], strengthen: strengthenOf(ctx, result.results.map((r) => r.id))
91
+ });
99
92
  return result;
100
93
  }
94
+ /** The ranked pool: physics when `mode` says so, hybrid otherwise; each caller supplies its own search options. */
95
+ function rankPool(ctx, opts, pool, searchOpts) {
96
+ return opts.mode === 'physics'
97
+ ? physicsSearch(opts.query, pool, { ...searchOpts, physicsConfig: loadConfig(ctx.hippoRoot).physics })
98
+ : hybridSearch(opts.query, pool, searchOpts);
99
+ }
101
100
  /** The recall load's arguments: exact scope, current rows only, the caller's project and personal scope. */
102
101
  function recallSearchArgs(ctx, opts, limit, own) {
103
102
  return {
@@ -129,9 +128,7 @@ async function retrieveFromStore(ctx, opts, windowSize, show, own) {
129
128
  const pool = loaded.filter((e) => passesScopeFilterForRecall(e.scope ?? null, opts.scope, own));
130
129
  // No scope option: the scope boost follows HIPPO_SCOPE and the skill env, as MCP recall always ranked.
131
130
  const searchOpts = { budget: Infinity, hippoRoot: ctx.hippoRoot, vectorCandidates: recallVectorSpec(ctx, opts, own), store };
132
- let ranked = opts.mode === 'physics'
133
- ? await physicsSearch(opts.query, pool, { ...searchOpts, physicsConfig: loadConfig(ctx.hippoRoot).physics })
134
- : await hybridSearch(opts.query, pool, searchOpts);
131
+ let ranked = await rankPool(ctx, opts, pool, searchOpts);
135
132
  // One goal read serves both boosts; the ranked list's log rows come first, so its scores win the log's first-write.
136
133
  const goals = opts.sessionId && !opts.goalTag ? await store.activeGoals({ sessionId: opts.sessionId, tenantId: ctx.tenantId }) : null;
137
134
  let rankedLog = [];
@@ -143,7 +140,9 @@ async function retrieveFromStore(ctx, opts, windowSize, show, own) {
143
140
  const window = ranked.slice(0, windowSize).map((r) => r.entry);
144
141
  const bandOpts = { ...opts, suppressRecallTrace: true };
145
142
  const plan = planRecall(ctx, bandOpts, window, own);
146
- const { result, writes } = composeRecall(ctx, bandOpts, { windowSize, all: window, plan, reads: await readRecall(store, ctx, bandOpts, plan, goals), auditBand: false });
143
+ const { result, writes } = composeRecall(ctx, bandOpts, {
144
+ windowSize, all: window, plan, reads: await readRecall(store, ctx, bandOpts, plan, goals), auditBand: false
145
+ });
147
146
  // Rows the vector arm added count as candidates too.
148
147
  const inPool = new Set(pool.map((e) => e.id));
149
148
  const candidates = [...pool, ...ranked.map((r) => r.entry).filter((e) => !inPool.has(e.id))];
@@ -199,16 +198,16 @@ function planRecall(ctx, opts, all, own) {
199
198
  claim: detectPlanningClaim(opts.query),
200
199
  };
201
200
  }
202
- /** The plan's reads on hippo.db directly, for the synchronous recall that cannot await the port. */
203
- function readRecallSync(ctx, opts, plan) {
204
- const { hippoRoot, tenantId } = ctx;
201
+ /** The plan's reads on the synchronous store, for the recall that cannot await the port. */
202
+ function readRecallSync(store, ctx, opts, plan) {
203
+ const { tenantId } = ctx;
205
204
  const freshCount = opts.freshTailCount ?? 0;
206
205
  return {
207
- goals: plan.goalBoost ? activeGoalsWithPolicies(hippoRoot, { sessionId: plan.goalBoost.sessionId, tenantId }) : null,
208
- parents: plan.overflow.size > 0 ? loadEntriesByIds(hippoRoot, [...plan.overflow.keys()], tenantId) : [],
209
- freshRaws: freshCount > 0 ? loadFreshRawMemories(hippoRoot, freshCount, tenantId, opts.freshTailSessionId, recallOrigin(opts)) : [],
210
- continuity: opts.includeContinuity ? continuityAt(hippoRoot, tenantId, CONTINUITY_EVENT_LIMIT, continuityKey(ctx, opts)) : undefined,
211
- planning: plan.claim ? planningFallacyEvidenceAt(hippoRoot, tenantId, plan.claim.classQueryTokens) : null,
206
+ goals: plan.goalBoost ? store.activeGoals({ sessionId: plan.goalBoost.sessionId, tenantId }) : null,
207
+ parents: plan.overflow.size > 0 ? store.entriesByIds([...plan.overflow.keys()], tenantId) : [],
208
+ freshRaws: freshCount > 0 ? store.freshRawEntries(freshCount, tenantId, opts.freshTailSessionId, recallOrigin(opts) ?? null) : [],
209
+ continuity: opts.includeContinuity ? store.continuity(tenantId, CONTINUITY_EVENT_LIMIT, continuityKey(ctx, opts)) : undefined,
210
+ planning: plan.claim ? store.planningFallacyEvidence(tenantId, plan.claim.classQueryTokens) : null,
212
211
  };
213
212
  }
214
213
  /** The plan's reads through the store; `goals` already read by the caller skips that read. */
@@ -246,14 +245,14 @@ function composeRecall(ctx, opts, options) {
246
245
  continuity,
247
246
  continuityTokens: continuity ? continuityTokensOf(continuity) : undefined,
248
247
  windowSize,
249
- suppressionSummary: buildSuppressionSummary({
248
+ suppressionSummary: {
250
249
  totalCandidates: all.length,
251
250
  droppedPreRank: window.droppedPreRank + bands.heldDropped,
252
251
  droppedByBudget: window.droppedByBudget,
253
252
  summarySubstitutionsAdded: bands.summarySubstitutions,
254
253
  freshTailAdded: bands.freshTailAdded,
255
254
  suppressedByInterference,
256
- }),
255
+ },
257
256
  };
258
257
  // The hint and the no-class-match / tiebreak watching variant are mutually exclusive; both go out as optional fields.
259
258
  if (planning?.output.hint)
@@ -0,0 +1,7 @@
1
+ import type { MemoryEntry } from '../core/memory.js';
2
+ import type { Context } from './types.js';
3
+ /** Marks a merged memory a model has rewritten, so a later pass skips it. */
4
+ export declare const REFINED_TAG = "llm-refined";
5
+ /** Store a model's rewrite of a merged memory: the new text replaces the old one, and the row gains the refined tag once. */
6
+ export declare function storeRefinement(ctx: Context, entry: MemoryEntry, refined: string): void;
7
+ //# sourceMappingURL=refine.d.ts.map
@@ -0,0 +1,10 @@
1
+ // The write half of `hippo refine`: the model call stays with the caller, the rewritten row is stored here.
2
+ import { writeEntry } from '../store/entry-writes.js';
3
+ /** Marks a merged memory a model has rewritten, so a later pass skips it. */
4
+ export const REFINED_TAG = 'llm-refined';
5
+ /** Store a model's rewrite of a merged memory: the new text replaces the old one, and the row gains the refined tag once. */
6
+ export function storeRefinement(ctx, entry, refined) {
7
+ const tags = entry.tags.includes(REFINED_TAG) ? entry.tags : [...entry.tags, REFINED_TAG];
8
+ writeEntry(ctx.hippoRoot, { ...entry, content: refined, tags }, { actor: ctx.actor.subject });
9
+ }
10
+ //# sourceMappingURL=refine.js.map
@@ -0,0 +1,57 @@
1
+ import type { ConfidenceLevel, Layer, MemoryEntry, MemoryKind } from '../core/memory.js';
2
+ import type { HippoDbContext } from './types.js';
3
+ /** One write by a caller in this process, every field already parsed and checked by it. */
4
+ export interface LocalRememberInput {
5
+ readonly content: string;
6
+ /** Every tag the row stores; the salience gate reads these. */
7
+ readonly tags: readonly string[];
8
+ /** The tags schema fit is scored on, for a caller that added path and scope tags of its own to `tags`; without it, `tags`. */
9
+ readonly fitTags?: readonly string[];
10
+ readonly kind?: MemoryKind;
11
+ readonly scope?: string;
12
+ readonly owner?: string;
13
+ readonly artifactRef?: string;
14
+ readonly layer?: Layer;
15
+ readonly pinned?: boolean;
16
+ readonly confidence?: ConfidenceLevel;
17
+ readonly source?: string;
18
+ /** Store it whatever the salience gate would say, as `hippo remember --force` asks and `hippo watch` always does. */
19
+ readonly force?: boolean;
20
+ }
21
+ /** The gate's start-weak verdict as the stored row carries it. */
22
+ export interface StartedWeak {
23
+ readonly reason: string;
24
+ readonly strength: number;
25
+ }
26
+ /** `stored` carries the row as the store holds it after the write; `skipped` is the gate dropping the write, with nothing stored or counted. */
27
+ export type LocalRememberOutcome = {
28
+ readonly status: 'stored';
29
+ readonly entry: MemoryEntry;
30
+ readonly startedWeak?: StartedWeak;
31
+ } | {
32
+ readonly status: 'skipped';
33
+ readonly reason: string;
34
+ readonly score: number;
35
+ };
36
+ /** One local write on hippo.db: gate, write, read-back, counter, then the embedding, started and never awaited. A refused value throws as `remember` does. */
37
+ export declare function rememberLocally(ctx: HippoDbContext, input: LocalRememberInput): LocalRememberOutcome;
38
+ /** What a caller asks of fact extraction. The key comes from the caller, which read it from its own environment. */
39
+ export interface FactExtractionRequest {
40
+ /** The caller asked for extraction (`--extract`); the store's config can turn it on without that. */
41
+ readonly requested: boolean;
42
+ readonly apiKey?: string;
43
+ readonly fetcher?: typeof fetch;
44
+ }
45
+ /** `off`: nobody asked. `no_key`: asked, with no key to call the model. `ran`: the facts the model gave and each reason it gave fewer. */
46
+ export type FactExtraction = {
47
+ readonly status: 'off';
48
+ } | {
49
+ readonly status: 'no_key';
50
+ } | {
51
+ readonly status: 'ran';
52
+ readonly facts: number;
53
+ readonly failures: readonly string[];
54
+ };
55
+ /** Extracts facts from a row just stored and stores them beside it. Best-effort: a failure is named in the result, never thrown. */
56
+ export declare function extractRememberedFacts(ctx: HippoDbContext, entry: MemoryEntry, request: FactExtractionRequest): Promise<FactExtraction>;
57
+ //# sourceMappingURL=remember-local.d.ts.map
@@ -0,0 +1,90 @@
1
+ // The local remember pipeline for a caller in this process (`hippo remember`, `hippo watch`): schema fit, the salience gate, the
2
+ // write, the read-back, the `remembered` counter and the embedding kick-off, in that order. Fact extraction is a second step,
3
+ // which the caller runs after it has reported the write. Nothing here prints; the caller reports from what comes back.
4
+ import { loadConfig } from '../core/config.js';
5
+ import { computeSalience } from '../core/salience.js';
6
+ import { loadNewestEntries, schemaFitInStore } from '../store/candidates.js';
7
+ import { embedMemory } from '../store/embeddings/index.js';
8
+ import { loadAllEntries, readEntry } from '../store/entry-reads.js';
9
+ import { updateStats } from '../store/index-and-stats.js';
10
+ import { errorMessage } from '../util/log.js';
11
+ import { remember } from './remember.js';
12
+ const WEAK_HALF_LIFE_FACTOR = 0.5;
13
+ /** The gate's verdict on one write, or null where it does not judge: the store has it off, or the write is pinned or forced. */
14
+ function salienceVerdict(ctx, input) {
15
+ const { salience } = loadConfig(ctx.hippoRoot);
16
+ if (!salience.enabled || input.pinned || input.force)
17
+ return null;
18
+ // computeSalience compares against the last `recentWindow` rows only; below 1 its slice takes every row, so that case still loads them all.
19
+ const window = Math.trunc(salience.recentWindow);
20
+ const recent = Number.isSafeInteger(window) && window >= 1
21
+ ? loadNewestEntries(ctx.hippoRoot, ctx.tenantId, window)
22
+ : loadAllEntries(ctx.hippoRoot, ctx.tenantId);
23
+ return computeSalience(input.content, [...input.tags], recent, {
24
+ recentWindow: salience.recentWindow,
25
+ overlapThreshold: salience.overlapThreshold,
26
+ minContentLength: salience.minContentLength,
27
+ maxRepeatErrors: salience.maxRepeatErrors,
28
+ });
29
+ }
30
+ /** The row `remember` just wrote, as the store holds it: the report, the embedding and the extraction all work on that. */
31
+ function storedEntry(ctx, id) {
32
+ const entry = readEntry(ctx.hippoRoot, id, ctx.tenantId);
33
+ if (!entry)
34
+ throw new Error(`memory ${id} was written but cannot be read back`);
35
+ return entry;
36
+ }
37
+ /** One local write on hippo.db: gate, write, read-back, counter, then the embedding, started and never awaited. A refused value throws as `remember` does. */
38
+ export function rememberLocally(ctx, input) {
39
+ const schemaFit = schemaFitInStore(ctx.hippoRoot, ctx.tenantId, input.content, input.fitTags ?? input.tags);
40
+ const verdict = salienceVerdict(ctx, input);
41
+ if (verdict?.decision === 'skip')
42
+ return { status: 'skipped', reason: verdict.reason, score: verdict.score };
43
+ const startedWeak = verdict?.decision === 'start_weak' ? { reason: verdict.reason, strength: verdict.score } : undefined;
44
+ const { id } = remember(ctx, {
45
+ content: input.content,
46
+ kind: input.kind,
47
+ scope: input.scope,
48
+ owner: input.owner,
49
+ artifactRef: input.artifactRef,
50
+ tags: [...input.tags],
51
+ local: {
52
+ layer: input.layer,
53
+ pinned: input.pinned,
54
+ source: input.source,
55
+ confidence: input.confidence,
56
+ schemaFit,
57
+ weaken: startedWeak && { strength: startedWeak.strength, halfLifeFactor: WEAK_HALF_LIFE_FACTOR },
58
+ },
59
+ });
60
+ const entry = storedEntry(ctx, id);
61
+ updateStats(ctx.hippoRoot, { remembered: 1 });
62
+ // Best-effort and slow (a model load or a network call), so the caller is not held for it.
63
+ void embedMemory(ctx.hippoRoot, entry);
64
+ return startedWeak ? { status: 'stored', entry, startedWeak } : { status: 'stored', entry };
65
+ }
66
+ /** Extracts facts from a row just stored and stores them beside it. Best-effort: a failure is named in the result, never thrown. */
67
+ export async function extractRememberedFacts(ctx, entry, request) {
68
+ const { extraction } = loadConfig(ctx.hippoRoot);
69
+ if (!request.requested && extraction.enabled !== true)
70
+ return { status: 'off' };
71
+ const { apiKey, fetcher } = request;
72
+ if (!apiKey)
73
+ return { status: 'no_key' };
74
+ const failures = [];
75
+ let facts = 0;
76
+ try {
77
+ // Loaded on demand, so a write that extracts nothing does not pay for the module.
78
+ const { extractFacts, storeExtractedFacts } = await import('../learn/extract.js');
79
+ const found = await extractFacts(entry.content, { apiKey, model: extraction.model, fetcher, onError: (msg) => { failures.push(msg); } });
80
+ if (found.length > 0) {
81
+ storeExtractedFacts(ctx.hippoRoot, entry, found);
82
+ facts = found.length;
83
+ }
84
+ }
85
+ catch (cause) {
86
+ failures.push(errorMessage(cause));
87
+ }
88
+ return { status: 'ran', facts, failures };
89
+ }
90
+ //# sourceMappingURL=remember-local.js.map
@@ -1,6 +1,21 @@
1
1
  import type { ConnectorEvent } from '../store/port.js';
2
- import { type MemoryKind } from '../core/memory.js';
2
+ import { type ConfidenceLevel, type Layer, type MemoryKind, type TraceOutcome } from '../core/memory.js';
3
3
  import type { Context, StoreReply } from './types.js';
4
+ /** Row fields the caller's own process decides, as the CLI does from its flags and its salience gate. */
5
+ export interface RememberLocal {
6
+ layer?: Layer;
7
+ pinned?: boolean;
8
+ confidence?: ConfidenceLevel;
9
+ source?: string;
10
+ schemaFit?: number;
11
+ traceOutcome?: TraceOutcome;
12
+ sourceSessionId?: string | null;
13
+ /** A salience gate's start-weak verdict: the row starts at `strength`, and its half-life is multiplied by `halfLifeFactor`, never below one day. */
14
+ weaken?: {
15
+ readonly strength: number;
16
+ readonly halfLifeFactor: number;
17
+ };
18
+ }
4
19
  export interface RememberOpts {
5
20
  content: string;
6
21
  kind?: MemoryKind;
@@ -19,6 +34,8 @@ export interface RememberOpts {
19
34
  };
20
35
  /** Store it in the caller's own personal scope, readable by its owner alone in every project; needs an owner on the actor and no `scope`. */
21
36
  personal?: boolean;
37
+ /** Never set from a request body: a route or tool that copied it would let a client pin a row or pick its layer and source. */
38
+ local?: RememberLocal;
22
39
  }
23
40
  export interface RememberResult {
24
41
  id: string;
@@ -31,7 +31,15 @@ function prepareRemember(ctx, opts) {
31
31
  const requestedScope = rememberScope(ctx, opts);
32
32
  const vetted = vetSecrets(opts.content, opts.tags ?? [], opts.untrusted === true);
33
33
  const detection = opts.untrusted ? detectInstruction(vetted.content) : { flagged: false, reason: null };
34
- const entry = createMemory(vetted.content, {
34
+ const local = opts.local ?? {};
35
+ const created = createMemory(vetted.content, {
36
+ layer: local.layer,
37
+ pinned: local.pinned,
38
+ confidence: local.confidence,
39
+ source: local.source,
40
+ schema_fit: local.schemaFit,
41
+ trace_outcome: local.traceOutcome,
42
+ source_session_id: local.sourceSessionId,
35
43
  kind: opts.kind ?? 'distilled',
36
44
  scope: detection.flagged ? quarantineScopeFor(requestedScope) : requestedScope,
37
45
  owner: opts.owner ?? null,
@@ -40,11 +48,15 @@ function prepareRemember(ctx, opts) {
40
48
  tenantId: ctx.tenantId,
41
49
  baseHalfLifeDays: loadConfig(ctx.hippoRoot).defaultHalfLifeDays,
42
50
  });
51
+ const entry = local.weaken ? weakened(created, local.weaken) : created;
43
52
  // Aliases only widen what a reader matches; a row has one origin. A personal row's '' follows its owner into every project.
44
53
  const origin = opts.personal ? '' : opts.project?.name;
45
54
  const stamped = origin !== undefined ? { ...entry, origin_project: origin } : entry;
46
55
  return { entry: stamped, requestedScope, detection, warnings: vetted.warnings };
47
56
  }
57
+ function weakened(entry, weaken) {
58
+ return { ...entry, strength: weaken.strength, half_life_days: Math.max(1, entry.half_life_days * weaken.halfLifeFactor) };
59
+ }
48
60
  function rememberResult(ctx, prepared, written) {
49
61
  const { entry, detection, warnings } = prepared;
50
62
  const result = { id: entry.id, kind: entry.kind, tenantId: ctx.tenantId };
@@ -1,7 +1,6 @@
1
1
  import { loadAllEntries } from '../store/entry-reads.js';
2
- import { deleteEntry } from '../store/delete-and-batch.js';
3
2
  import { auditMemories } from '../store/audit.js';
4
- import { autoShare } from '../sharing/shared.js';
3
+ import { autoShare } from '../sharing/share.js';
5
4
  import { consolidate } from '../consolidate/sleep.js';
6
5
  import { loadConfig } from '../core/config.js';
7
6
  import { deduplicateStore } from '../consolidate/dedupe.js';
@@ -17,7 +16,6 @@ export interface SleepPhases {
17
16
  auditMemories: typeof auditMemories;
18
17
  autoShare: typeof autoShare;
19
18
  loadAllEntries: typeof loadAllEntries;
20
- deleteEntry: typeof deleteEntry;
21
19
  computeAmbientState: typeof computeAmbientState;
22
20
  loadConfig: typeof loadConfig;
23
21
  loadPendingExtractionTenants: typeof loadPendingExtractionTenants;
@@ -1,9 +1,9 @@
1
1
  // The sleep pipeline behind `sleep`, with its phase dependencies injectable; kept out of the package root.
2
2
  import { loadAllEntries } from '../store/entry-reads.js';
3
- import { deleteEntry, memoriesBackingObjects } from '../store/delete-and-batch.js';
3
+ import { memoriesBackingObjects } from '../store/delete-and-batch.js';
4
4
  import { reportAuditWriteFailure, auditMemories } from '../store/audit.js';
5
5
  import { sqliteSyncStore } from '../store/sqlite/store.js';
6
- import { autoShare } from '../sharing/shared.js';
6
+ import { autoShare } from '../sharing/share.js';
7
7
  import { consolidate } from '../consolidate/sleep.js';
8
8
  import { failedUnitOf } from '../store/delete-and-batch.js';
9
9
  import { loadConfig } from '../core/config.js';
@@ -11,6 +11,7 @@ import { deduplicateStore } from '../consolidate/dedupe.js';
11
11
  import { computeAmbientState } from '../core/ambient.js';
12
12
  import { loadPendingExtractionTenants, markPendingProcessedUpTo } from '../store/graph-queue.js';
13
13
  import { extractGraphChunked } from '../graph/extract.js';
14
+ import { removeAuditErrors } from './audit.js';
14
15
  import { errorMessage } from '../util/log.js';
15
16
  const DEFAULT_SLEEP_PHASES = {
16
17
  consolidate,
@@ -18,7 +19,6 @@ const DEFAULT_SLEEP_PHASES = {
18
19
  auditMemories,
19
20
  autoShare,
20
21
  loadAllEntries,
21
- deleteEntry,
22
22
  computeAmbientState,
23
23
  loadConfig,
24
24
  loadPendingExtractionTenants,
@@ -28,18 +28,15 @@ const DEFAULT_SLEEP_PHASES = {
28
28
  export async function runSleep(ctx, opts, overrides = {}) {
29
29
  const dryRun = Boolean(opts.dryRun);
30
30
  const phases = { ...DEFAULT_SLEEP_PHASES, ...overrides };
31
- // Phase counters for the consolidate audit emit (in finally).
32
- // Accumulated as each phase completes so partial-failure paths still report
33
- // accurate "what got done before the failure" data.
31
+ // Phase counters for the consolidate audit emit (in finally), accumulated per phase so a partial failure still reports what got done.
34
32
  const counts = { consolidation: 0, dedup: 0, auditDeleted: 0, ambient: 0 };
35
33
  let phaseError = null;
36
34
  try {
37
35
  return await runSleepPhases(ctx, opts, phases, counts);
38
36
  }
39
37
  catch (err) {
40
- // SAFETY: phaseError is read via phaseError.message / (phaseError !==
41
- // null) below, both safe even if a non-Error was thrown; this mirrors
42
- // the existing lenient (err as Error) pattern used throughout this catch chain.
38
+ // SAFETY: phaseError is only read via phaseError.message / (phaseError !== null) below, safe even if a non-Error was thrown;
39
+ // this mirrors the lenient (err as Error) pattern used through this catch chain.
43
40
  phaseError = err;
44
41
  throw err;
45
42
  }
@@ -60,14 +57,15 @@ async function runSleepPhases(ctx, opts, phases, counts) {
60
57
  if (dedupResult.removed > 0)
61
58
  result.deduped = dedupSummary(dedupResult);
62
59
  // Phase 3: Quality audit (remove junk, report warnings; a dry run skips rows earlier phases would remove).
63
- counts.auditDeleted = runQualityAudit(ctx, phases, { dryRun, consolidateResult, dedupResult, result });
60
+ const audited = runQualityAudit(ctx, phases, { dryRun, consolidateResult, dedupResult, result });
61
+ counts.auditDeleted = audited.removed;
64
62
  if (dryRun)
65
63
  return result;
66
64
  // Phase 4: Auto-share high-transfer-score memories to global.
67
65
  if (!opts.noShare)
68
66
  shareOnSleep(ctx, phases, result);
69
67
  // Phase 5: Post-sleep ambient state summary.
70
- counts.ambient = summarizeAmbient(ctx, phases, result);
68
+ counts.ambient = summarizeAmbient(ctx, phases, result, audited.remaining);
71
69
  await drainGraphQueue(ctx, phases, snapshot, result);
72
70
  return result;
73
71
  }
@@ -115,28 +113,26 @@ function dedupSummary(dedupResult) {
115
113
  crossDups,
116
114
  };
117
115
  }
116
+ /** `removed` counts audit errors deleted (or that would be under dryRun); `remaining` is what the audit read, less the rows it deleted. */
118
117
  function runQualityAudit(ctx, phases, options) {
119
118
  const { dryRun, consolidateResult, dedupResult, result } = options;
120
119
  const planned = new Set(dryRun ? [...(consolidateResult.removedIds ?? []), ...dedupResult.pairs.map((p) => p.removed)] : []);
121
120
  const allEntries = phases.loadAllEntries(ctx.hippoRoot).filter((e) => !planned.has(e.id));
122
121
  const auditOut = phases.auditMemories(allEntries, memoriesBackingObjects(ctx.hippoRoot));
123
122
  if (auditOut.issues.length === 0)
124
- return 0;
123
+ return { removed: 0, remaining: allEntries };
125
124
  const errors = auditOut.issues.filter((i) => i.severity === 'error');
126
125
  const warnings = auditOut.issues.filter((i) => i.severity === 'warning');
127
- let removed = 0;
128
- for (const issue of errors) {
129
- const reason = `sleep-audit: ${issue.reason}`;
130
- if (dryRun || phases.deleteEntry(ctx.hippoRoot, issue.memoryId, { actor: ctx.actor.subject, reason, automatic: true }))
131
- removed++;
132
- }
126
+ const gone = dryRun ? errors.map((issue) => issue.memoryId) : removeAuditErrors(ctx, 'sleep-audit', errors);
127
+ const removed = gone.length;
128
+ const deleted = new Set(gone);
133
129
  if (removed > 0 || warnings.length > 0) {
134
130
  result.audit = {
135
131
  errorsRemoved: removed,
136
132
  warningCount: warnings.length,
137
133
  };
138
134
  }
139
- return removed;
135
+ return { removed, remaining: allEntries.filter((e) => !deleted.has(e.id)) };
140
136
  }
141
137
  function shareOnSleep(ctx, phases, result) {
142
138
  const sleepConfig = phases.loadConfig(ctx.hippoRoot);
@@ -156,11 +152,11 @@ function shareOnSleep(ctx, phases, result) {
156
152
  }
157
153
  }
158
154
  /** Returns the ambient total the audit row reports: 0 when ambient is off or no current row is left. */
159
- function summarizeAmbient(ctx, phases, result) {
155
+ function summarizeAmbient(ctx, phases, result, loaded) {
160
156
  const postSleepConfig = phases.loadConfig(ctx.hippoRoot);
161
157
  if (!postSleepConfig.ambient.enabled)
162
158
  return 0;
163
- const postSleepEntries = phases.loadAllEntries(ctx.hippoRoot).filter((e) => !e.superseded_by);
159
+ const postSleepEntries = loaded.filter((e) => !e.superseded_by);
164
160
  if (postSleepEntries.length === 0)
165
161
  return 0;
166
162
  result.ambient = phases.computeAmbientState(postSleepEntries);
@@ -4,23 +4,17 @@ import type { Context } from './types.js';
4
4
  export interface SleepOpts {
5
5
  /** Report what a sleep would change without applying it; sharing, the ambient summary and the graph refresh are skipped. */
6
6
  dryRun?: boolean;
7
- /** Skip copying high-scoring memories to the global store under `HIPPO_HOME`. Default false, so every tenant's memories are eligible; multi-tenant callers pass `true`. */
7
+ /** Skip copying high-scoring memories to the global store under `HIPPO_HOME`. Default
8
+ * false, so every tenant's memories are eligible; multi-tenant callers pass `true`. */
8
9
  noShare?: boolean;
9
10
  }
10
11
  export interface SleepResult {
11
12
  active: number;
12
13
  removed: number;
13
- /**
14
- * Faded memories the decay pass moved to the dormant store instead of
15
- * deleting (config `dormant.enabled`). Absent when 0. Per-invocation
16
- * activity counter, same class as `removed`.
17
- */
14
+ /** Faded memories the decay pass moved to the dormant store instead of deleting (config `dormant.enabled`); absent when 0. Per-invocation counter, like
15
+ * `removed`. */
18
16
  dormant?: number;
19
- /**
20
- * Dormant memories deleted for good this sleep because they outlived
21
- * `dormant.retentionDays`. Absent when 0. Same per-invocation class as
22
- * `removed`.
23
- */
17
+ /** Dormant memories deleted for good this sleep for outliving `dormant.retentionDays`; absent when 0. Per-invocation counter, like `removed`. */
24
18
  dormantExpired?: number;
25
19
  mergedEpisodic: number;
26
20
  newSemantic: number;
@@ -36,26 +30,13 @@ export interface SleepResult {
36
30
  warningCount: number;
37
31
  };
38
32
  shared?: number;
39
- /**
40
- * Count of memories the auto-share secret veto withheld this sleep
41
- * — rows that passed every other admission gate (transfer score,
42
- * not-already-global) and were blocked solely by `detectSecret`. Absent
43
- * when 0 or when auto-share did not run.
44
- */
33
+ /** Memories the auto-share secret veto withheld: rows that passed every other gate but `detectSecret`; absent when 0 or auto-share did not run. */
45
34
  secretSkipped?: number;
46
- /**
47
- * Count of auto-share candidates the GLOBAL store's rejection
48
- * tombstone refused this sleep; copy paths must not let one rejected
49
- * candidate abort the batch. Absent when 0 or when auto-share did not run.
50
- */
35
+ /** Auto-share candidates the GLOBAL store's rejection tombstone refused (one must not abort the batch); absent when 0 or auto-share did not run. */
51
36
  rejectedSkipped?: number;
52
37
  ambient?: AmbientState | null;
53
- /**
54
- * Graph re-extraction totals across the tenants rebuilt
55
- * this sleep. Absent when no tenant was dirty, and under dryRun (the graph
56
- * phase runs only on a real sleep). Cross-tenant aggregate, one reason
57
- * /v1/sleep stays loopback-only.
58
- */
38
+ /** Graph re-extraction totals across tenants rebuilt this sleep; absent when none was dirty or under dryRun.
39
+ * Cross-tenant aggregate: one reason /v1/sleep stays loopback-only. */
59
40
  graph?: {
60
41
  tenants: number;
61
42
  entities: number;