hippo-memory 1.70.0 → 1.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (855) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.d.ts +4 -2
  5. package/dist/agent-memories/claude-code.js +15 -6
  6. package/dist/agent-memories/codex.js +1 -1
  7. package/dist/agent-memories/copilot.d.ts +1 -3
  8. package/dist/agent-memories/copilot.js +1 -17
  9. package/dist/agent-memories/files.js +23 -12
  10. package/dist/agent-memories/markdown.d.ts +1 -3
  11. package/dist/agent-memories/markdown.js +1 -3
  12. package/dist/agent-memories/project-folds.d.ts +10 -0
  13. package/dist/agent-memories/project-folds.js +34 -0
  14. package/dist/agent-memories/report.js +2 -1
  15. package/dist/agent-memories/sync.d.ts +4 -2
  16. package/dist/agent-memories/sync.js +18 -11
  17. package/dist/api/assemble.d.ts +7 -44
  18. package/dist/api/assemble.js +3 -23
  19. package/dist/api/audit.d.ts +33 -1
  20. package/dist/api/audit.js +48 -1
  21. package/dist/api/auth.d.ts +20 -26
  22. package/dist/api/auth.js +43 -29
  23. package/dist/api/auto-sleep.d.ts +5 -2
  24. package/dist/api/auto-sleep.js +9 -5
  25. package/dist/api/availability.d.ts +2 -15
  26. package/dist/api/availability.js +4 -18
  27. package/dist/api/cards.d.ts +42 -0
  28. package/dist/api/cards.js +52 -0
  29. package/dist/api/conflicts.d.ts +28 -0
  30. package/dist/api/conflicts.js +61 -0
  31. package/dist/api/context-render.js +4 -3
  32. package/dist/api/context-select.js +12 -15
  33. package/dist/api/context-types.d.ts +10 -35
  34. package/dist/api/context.d.ts +5 -22
  35. package/dist/api/context.js +38 -46
  36. package/dist/api/continuity.d.ts +47 -0
  37. package/dist/api/continuity.js +66 -0
  38. package/dist/{cli → api}/correction-latency.d.ts +2 -14
  39. package/dist/{cli → api}/correction-latency.js +2 -14
  40. package/dist/api/dormant.d.ts +5 -21
  41. package/dist/api/dormant.js +11 -28
  42. package/dist/api/drill-down.d.ts +7 -46
  43. package/dist/api/drill-down.js +6 -27
  44. package/dist/api/embeddings.d.ts +17 -0
  45. package/dist/api/embeddings.js +28 -0
  46. package/dist/api/error-reply.d.ts +8 -0
  47. package/dist/api/error-reply.js +21 -0
  48. package/dist/api/forget.d.ts +11 -26
  49. package/dist/api/forget.js +23 -35
  50. package/dist/api/goals.d.ts +1 -1
  51. package/dist/api/goals.js +5 -9
  52. package/dist/api/graph.d.ts +8 -0
  53. package/dist/api/graph.js +7 -0
  54. package/dist/api/index.d.ts +6 -2
  55. package/dist/api/index.js +6 -2
  56. package/dist/api/instruction-detect.js +21 -6
  57. package/dist/api/learn.d.ts +4 -0
  58. package/dist/api/learn.js +53 -27
  59. package/dist/api/ledger-db.d.ts +2 -5
  60. package/dist/api/ledger-db.js +5 -35
  61. package/dist/api/memories.d.ts +23 -0
  62. package/dist/api/memories.js +46 -0
  63. package/dist/api/objects.d.ts +9 -0
  64. package/dist/api/objects.js +11 -0
  65. package/dist/api/on-store.js +5 -3
  66. package/dist/api/outcome.js +1 -1
  67. package/dist/api/pilot-arm.d.ts +1 -11
  68. package/dist/api/pilot-arm.js +5 -45
  69. package/dist/api/predictions.d.ts +11 -0
  70. package/dist/api/predictions.js +24 -0
  71. package/dist/api/projects.d.ts +21 -0
  72. package/dist/api/projects.js +24 -0
  73. package/dist/api/promote.d.ts +13 -17
  74. package/dist/api/promote.js +12 -20
  75. package/dist/api/prompt-hook.d.ts +19 -6
  76. package/dist/api/prompt-hook.js +54 -13
  77. package/dist/api/provenance-coverage.d.ts +14 -0
  78. package/dist/{cli → api}/provenance-coverage.js +2 -6
  79. package/dist/api/recall-cli.d.ts +58 -0
  80. package/dist/api/recall-cli.js +103 -0
  81. package/dist/api/recall-core.js +17 -9
  82. package/dist/api/recall-finish.d.ts +53 -0
  83. package/dist/api/recall-finish.js +30 -0
  84. package/dist/api/recall-history.d.ts +17 -84
  85. package/dist/api/recall-history.js +15 -88
  86. package/dist/api/recall-pipeline.d.ts +2 -3
  87. package/dist/api/recall-pipeline.js +21 -15
  88. package/dist/api/recall-request.js +1 -1
  89. package/dist/api/recall-types.d.ts +64 -304
  90. package/dist/api/recall.d.ts +3 -34
  91. package/dist/api/recall.js +63 -89
  92. package/dist/api/refine.d.ts +7 -0
  93. package/dist/api/refine.js +10 -0
  94. package/dist/api/remember-local.d.ts +57 -0
  95. package/dist/api/remember-local.js +90 -0
  96. package/dist/api/remember.d.ts +20 -2
  97. package/dist/api/remember.js +16 -3
  98. package/dist/api/session-end.d.ts +22 -0
  99. package/dist/api/session-end.js +101 -0
  100. package/dist/api/sleep-run.d.ts +2 -4
  101. package/dist/api/sleep-run.js +28 -28
  102. package/dist/api/sleep.d.ts +9 -28
  103. package/dist/api/status.d.ts +24 -0
  104. package/dist/api/status.js +40 -0
  105. package/dist/api/store-init.d.ts +4 -0
  106. package/dist/api/store-init.js +9 -0
  107. package/dist/api/tokens.d.ts +3 -10
  108. package/dist/api/tokens.js +4 -11
  109. package/dist/api/types.d.ts +8 -29
  110. package/dist/api/types.js +10 -23
  111. package/dist/capture/caller-session.d.ts +0 -3
  112. package/dist/capture/caller-session.js +1 -12
  113. package/dist/capture/capture-error.d.ts +2 -2
  114. package/dist/capture/capture-error.js +23 -18
  115. package/dist/capture/codex-patch.js +3 -1
  116. package/dist/capture/command.d.ts +4 -12
  117. package/dist/capture/command.js +39 -114
  118. package/dist/capture/compact.d.ts +4 -15
  119. package/dist/capture/compact.js +26 -30
  120. package/dist/capture/compaction-items-caller.js +11 -20
  121. package/dist/capture/compaction-record.d.ts +7 -93
  122. package/dist/capture/compaction-record.js +34 -399
  123. package/dist/capture/compaction-spool.d.ts +5 -3
  124. package/dist/capture/compaction-spool.js +21 -7
  125. package/dist/capture/copilot-transcript.d.ts +2 -1
  126. package/dist/capture/copilot-transcript.js +2 -1
  127. package/dist/capture/extract.d.ts +5 -2
  128. package/dist/capture/extract.js +4 -3
  129. package/dist/capture/failure-caller.d.ts +1 -1
  130. package/dist/capture/failure-caller.js +21 -16
  131. package/dist/capture/failure-reading.d.ts +2 -1
  132. package/dist/capture/failure-reading.js +7 -9
  133. package/dist/capture/pre-compact-caller.js +5 -4
  134. package/dist/capture/session-digest.d.ts +1 -1
  135. package/dist/capture/session-digest.js +17 -10
  136. package/dist/capture/session-end-caller.js +2 -1
  137. package/dist/capture/session-worker.js +3 -4
  138. package/dist/capture/transcript.d.ts +4 -11
  139. package/dist/capture/transcript.js +10 -21
  140. package/dist/capture/working-state.d.ts +4 -2
  141. package/dist/capture/working-state.js +4 -2
  142. package/dist/cli/api-context.d.ts +3 -0
  143. package/dist/cli/api-context.js +6 -0
  144. package/dist/cli/audit-prune.d.ts +1 -59
  145. package/dist/cli/audit-prune.js +2 -61
  146. package/dist/cli/audit.d.ts +1 -1
  147. package/dist/cli/audit.js +42 -43
  148. package/dist/cli/auth.d.ts +2 -2
  149. package/dist/cli/auth.js +61 -44
  150. package/dist/cli/briefs.d.ts +1 -4
  151. package/dist/cli/briefs.js +42 -301
  152. package/dist/cli/card.d.ts +2 -2
  153. package/dist/cli/card.js +63 -56
  154. package/dist/cli/client.d.ts +12 -27
  155. package/dist/cli/client.js +41 -44
  156. package/dist/cli/compact-resume-payload.js +4 -3
  157. package/dist/cli/context.d.ts +2 -3
  158. package/dist/cli/context.js +22 -18
  159. package/dist/cli/continuity.d.ts +6 -6
  160. package/dist/cli/continuity.js +81 -86
  161. package/dist/cli/curate.d.ts +13 -17
  162. package/dist/cli/curate.js +88 -116
  163. package/dist/cli/dag.d.ts +4 -4
  164. package/dist/cli/dag.js +55 -34
  165. package/dist/cli/decisions.d.ts +2 -4
  166. package/dist/cli/decisions.js +18 -309
  167. package/dist/cli/eval.d.ts +1 -1
  168. package/dist/cli/eval.js +27 -26
  169. package/dist/cli/exit.d.ts +6 -0
  170. package/dist/cli/exit.js +11 -0
  171. package/dist/cli/explain.d.ts +2 -3
  172. package/dist/cli/explain.js +25 -27
  173. package/dist/cli/flag-values.d.ts +6 -1
  174. package/dist/cli/flag-values.js +42 -15
  175. package/dist/cli/flags.d.ts +0 -288
  176. package/dist/cli/flags.js +3 -138
  177. package/dist/cli/github.d.ts +14 -0
  178. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  179. package/dist/cli/goals.d.ts +2 -2
  180. package/dist/cli/goals.js +46 -50
  181. package/dist/cli/graph.d.ts +3 -0
  182. package/dist/cli/graph.js +83 -0
  183. package/dist/cli/hook-runtime.d.ts +12 -32
  184. package/dist/cli/hook-runtime.js +21 -64
  185. package/dist/cli/incidents.d.ts +3 -0
  186. package/dist/cli/incidents.js +112 -0
  187. package/dist/cli/init.d.ts +2 -2
  188. package/dist/cli/init.js +33 -30
  189. package/dist/cli/install-steps.d.ts +2 -1
  190. package/dist/cli/install-steps.js +13 -14
  191. package/dist/cli/last-sleep.d.ts +2 -1
  192. package/dist/cli/last-sleep.js +4 -1
  193. package/dist/cli/lenient-id.d.ts +2 -0
  194. package/dist/cli/lenient-id.js +13 -0
  195. package/dist/cli/maintenance.d.ts +5 -5
  196. package/dist/cli/maintenance.js +37 -43
  197. package/dist/cli/notes.d.ts +2 -0
  198. package/dist/cli/notes.js +41 -0
  199. package/dist/cli/object-verbs.js +4 -3
  200. package/dist/cli/open-browser.d.ts +14 -0
  201. package/dist/cli/open-browser.js +26 -0
  202. package/dist/cli/owner-validation.d.ts +5 -28
  203. package/dist/cli/owner-validation.js +5 -28
  204. package/dist/cli/playbooks.d.ts +3 -4
  205. package/dist/cli/playbooks.js +131 -300
  206. package/dist/cli/predictions.d.ts +3 -0
  207. package/dist/cli/predictions.js +175 -0
  208. package/dist/cli/print.d.ts +2 -5
  209. package/dist/cli/print.js +3 -5
  210. package/dist/cli/projects.d.ts +2 -2
  211. package/dist/cli/projects.js +31 -25
  212. package/dist/cli/quality-repair-once.d.ts +1 -1
  213. package/dist/cli/quality-repair-once.js +7 -6
  214. package/dist/cli/recall.d.ts +2 -4
  215. package/dist/cli/recall.js +67 -137
  216. package/dist/cli/refine-llm.d.ts +5 -31
  217. package/dist/cli/refine-llm.js +23 -50
  218. package/dist/cli/remember.d.ts +3 -3
  219. package/dist/cli/remember.js +134 -192
  220. package/dist/cli/scheduler.d.ts +2 -17
  221. package/dist/cli/scheduler.js +14 -19
  222. package/dist/cli/serve.js +23 -14
  223. package/dist/cli/session-hooks.d.ts +11 -19
  224. package/dist/cli/session-hooks.js +143 -214
  225. package/dist/cli/setup.d.ts +4 -4
  226. package/dist/cli/setup.js +35 -30
  227. package/dist/cli/shared.d.ts +7 -25
  228. package/dist/cli/shared.js +17 -60
  229. package/dist/cli/slack.d.ts +2 -2
  230. package/dist/cli/slack.js +19 -23
  231. package/dist/cli/sleep-render.js +6 -3
  232. package/dist/cli/sleep.d.ts +3 -2
  233. package/dist/cli/sleep.js +17 -49
  234. package/dist/cli/status.d.ts +11 -14
  235. package/dist/cli/status.js +74 -120
  236. package/dist/cli/stdin.d.ts +4 -6
  237. package/dist/cli/stdin.js +2 -3
  238. package/dist/cli/transfer.d.ts +9 -9
  239. package/dist/cli/transfer.js +87 -108
  240. package/dist/cli/usage.d.ts +0 -79
  241. package/dist/cli/usage.js +1 -689
  242. package/dist/cli/verb-row.d.ts +32 -0
  243. package/dist/cli/verb-row.js +6 -0
  244. package/dist/cli/verbs/health.d.ts +27 -0
  245. package/dist/cli/verbs/health.js +232 -0
  246. package/dist/cli/verbs/memory.d.ts +16 -0
  247. package/dist/cli/verbs/memory.js +244 -0
  248. package/dist/cli/verbs/objects.d.ts +20 -0
  249. package/dist/cli/verbs/objects.js +254 -0
  250. package/dist/cli/verbs/sessions.d.ts +31 -0
  251. package/dist/cli/verbs/sessions.js +312 -0
  252. package/dist/cli/verbs.d.ts +81 -0
  253. package/dist/cli/verbs.js +7 -0
  254. package/dist/cli/versioned-verbs.d.ts +51 -0
  255. package/dist/cli/versioned-verbs.js +79 -0
  256. package/dist/cli.d.ts +1 -654
  257. package/dist/cli.js +44 -510
  258. package/dist/connectors/dlq.d.ts +39 -3
  259. package/dist/connectors/dlq.js +37 -3
  260. package/dist/connectors/github/backfill.d.ts +5 -25
  261. package/dist/connectors/github/backfill.js +26 -52
  262. package/dist/connectors/github/deletion.d.ts +4 -18
  263. package/dist/connectors/github/deletion.js +2 -15
  264. package/dist/connectors/github/dlq.d.ts +8 -33
  265. package/dist/connectors/github/dlq.js +34 -93
  266. package/dist/connectors/github/ingest.d.ts +4 -12
  267. package/dist/connectors/github/ingest.js +5 -36
  268. package/dist/connectors/github/octokit-client.d.ts +4 -16
  269. package/dist/connectors/github/octokit-client.js +27 -24
  270. package/dist/connectors/github/ratelimit.d.ts +3 -14
  271. package/dist/connectors/github/ratelimit.js +3 -14
  272. package/dist/connectors/github/scope.d.ts +3 -5
  273. package/dist/connectors/github/scope.js +3 -5
  274. package/dist/connectors/github/signature.d.ts +4 -26
  275. package/dist/connectors/github/signature.js +4 -26
  276. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  277. package/dist/connectors/github/tenant-routing.js +4 -26
  278. package/dist/connectors/github/transform.js +2 -16
  279. package/dist/connectors/github/types.d.ts +3 -15
  280. package/dist/connectors/github/types.js +2 -9
  281. package/dist/connectors/github/webhook.d.ts +3 -16
  282. package/dist/connectors/github/webhook.js +38 -23
  283. package/dist/connectors/ingest.d.ts +10 -0
  284. package/dist/connectors/ingest.js +28 -0
  285. package/dist/connectors/slack/backfill.d.ts +4 -17
  286. package/dist/connectors/slack/backfill.js +4 -13
  287. package/dist/connectors/slack/dlq.d.ts +2 -19
  288. package/dist/connectors/slack/dlq.js +51 -90
  289. package/dist/connectors/slack/ingest.d.ts +4 -9
  290. package/dist/connectors/slack/ingest.js +4 -30
  291. package/dist/connectors/slack/scope.d.ts +2 -8
  292. package/dist/connectors/slack/scope.js +2 -8
  293. package/dist/connectors/slack/signature.d.ts +1 -6
  294. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  295. package/dist/connectors/slack/tenant-routing.js +2 -21
  296. package/dist/connectors/slack/transform.d.ts +2 -18
  297. package/dist/connectors/slack/transform.js +2 -18
  298. package/dist/connectors/slack/types.d.ts +3 -9
  299. package/dist/connectors/slack/types.js +2 -4
  300. package/dist/connectors/slack/web-client.js +33 -27
  301. package/dist/connectors/slack/webhook.d.ts +3 -19
  302. package/dist/connectors/slack/webhook.js +6 -26
  303. package/dist/connectors/slack/workspaces.d.ts +4 -24
  304. package/dist/connectors/slack/workspaces.js +4 -24
  305. package/dist/consolidate/conflicts.js +7 -15
  306. package/dist/consolidate/dag-summary.d.ts +8 -0
  307. package/dist/consolidate/dag-summary.js +41 -0
  308. package/dist/consolidate/dag.d.ts +5 -28
  309. package/dist/consolidate/dag.js +29 -84
  310. package/dist/consolidate/decay.js +7 -19
  311. package/dist/consolidate/dedupe.d.ts +13 -52
  312. package/dist/consolidate/dedupe.js +18 -74
  313. package/dist/consolidate/flush-units.d.ts +3 -4
  314. package/dist/consolidate/flush-units.js +3 -3
  315. package/dist/consolidate/half-life-migration.d.ts +3 -26
  316. package/dist/consolidate/half-life-migration.js +11 -28
  317. package/dist/consolidate/llm-passes.js +49 -40
  318. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  319. package/dist/consolidate/memory-value-weights.js +2 -13
  320. package/dist/consolidate/memory-value.d.ts +11 -84
  321. package/dist/consolidate/memory-value.js +18 -105
  322. package/dist/consolidate/merge.js +12 -33
  323. package/dist/consolidate/physics-pass.d.ts +6 -1
  324. package/dist/consolidate/physics-pass.js +27 -9
  325. package/dist/consolidate/replay.d.ts +6 -38
  326. package/dist/consolidate/replay.js +25 -56
  327. package/dist/consolidate/run.js +1 -1
  328. package/dist/consolidate/sleep.d.ts +1 -8
  329. package/dist/consolidate/sleep.js +13 -22
  330. package/dist/consolidate/trace.d.ts +3 -18
  331. package/dist/consolidate/trace.js +3 -18
  332. package/dist/consolidate/traces.js +9 -25
  333. package/dist/core/ablation.d.ts +14 -91
  334. package/dist/core/ablation.js +16 -91
  335. package/dist/core/active-scope.d.ts +7 -0
  336. package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
  337. package/dist/core/ambient.d.ts +5 -8
  338. package/dist/core/ambient.js +40 -26
  339. package/dist/core/api-errors.d.ts +16 -0
  340. package/dist/core/api-errors.js +20 -0
  341. package/dist/core/capture-contract.d.ts +4 -2
  342. package/dist/core/capture-contract.js +4 -2
  343. package/dist/core/card.d.ts +4 -1
  344. package/dist/core/card.js +11 -1
  345. package/dist/core/compaction-timing.d.ts +7 -0
  346. package/dist/core/compaction-timing.js +9 -0
  347. package/dist/core/compare.d.ts +11 -67
  348. package/dist/core/compare.js +9 -63
  349. package/dist/core/config.d.ts +10 -24
  350. package/dist/core/config.js +20 -16
  351. package/dist/core/cosine.d.ts +3 -0
  352. package/dist/core/cosine.js +19 -0
  353. package/dist/core/handoff.d.ts +1 -7
  354. package/dist/core/handoff.js +1 -7
  355. package/dist/core/markdown.d.ts +6 -0
  356. package/dist/{store → core}/markdown.js +23 -22
  357. package/dist/core/memory-audit.d.ts +17 -0
  358. package/dist/core/memory-audit.js +54 -0
  359. package/dist/core/memory-quality.js +1 -1
  360. package/dist/core/memory.d.ts +51 -168
  361. package/dist/core/memory.js +76 -239
  362. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  363. package/dist/{consolidate → core}/merged-row.js +3 -2
  364. package/dist/core/package-root.d.ts +3 -0
  365. package/dist/core/package-root.js +5 -0
  366. package/dist/core/physics-config.d.ts +1 -4
  367. package/dist/core/physics-config.js +3 -8
  368. package/dist/core/physics.d.ts +15 -61
  369. package/dist/core/physics.js +65 -138
  370. package/dist/core/prediction.d.ts +3 -0
  371. package/dist/core/prediction.js +6 -0
  372. package/dist/core/project-identity.d.ts +20 -58
  373. package/dist/core/project-identity.js +27 -39
  374. package/dist/core/project-remote.js +13 -2
  375. package/dist/core/raw-append-only.d.ts +5 -0
  376. package/dist/core/raw-append-only.js +7 -0
  377. package/dist/core/recall-scope.d.ts +69 -0
  378. package/dist/core/recall-scope.js +138 -0
  379. package/dist/core/salience.d.ts +1 -7
  380. package/dist/core/salience.js +1 -7
  381. package/dist/dashboard/dashboard-actions.js +2 -2
  382. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  383. package/dist/dashboard/dashboard-snapshot.js +11 -2
  384. package/dist/dashboard/dashboard-types.d.ts +2 -1
  385. package/dist/dashboard/dashboard.d.ts +1 -0
  386. package/dist/dashboard/dashboard.js +50 -4
  387. package/dist/db/busy.d.ts +3 -8
  388. package/dist/db/busy.js +37 -33
  389. package/dist/db/connect.js +7 -8
  390. package/dist/db/index.d.ts +3 -3
  391. package/dist/db/index.js +3 -3
  392. package/dist/db/migrate.js +3 -3
  393. package/dist/db/migrations/index.d.ts +1 -1
  394. package/dist/db/migrations/index.js +3 -1
  395. package/dist/db/migrations/types.d.ts +2 -5
  396. package/dist/db/migrations/v14.js +2 -3
  397. package/dist/db/migrations/v15.js +2 -8
  398. package/dist/db/migrations/v16.js +2 -3
  399. package/dist/db/migrations/v17.js +2 -3
  400. package/dist/db/migrations/v19.js +2 -5
  401. package/dist/db/migrations/v20.js +2 -7
  402. package/dist/db/migrations/v22.js +4 -17
  403. package/dist/db/migrations/v23.js +3 -14
  404. package/dist/db/migrations/v24.js +2 -4
  405. package/dist/db/migrations/v25.js +3 -8
  406. package/dist/db/migrations/v26.js +2 -13
  407. package/dist/db/migrations/v27.js +3 -11
  408. package/dist/db/migrations/v28.js +2 -14
  409. package/dist/db/migrations/v29.js +4 -18
  410. package/dist/db/migrations/v30.js +4 -16
  411. package/dist/db/migrations/v31.js +2 -15
  412. package/dist/db/migrations/v32.js +4 -22
  413. package/dist/db/migrations/v33.js +2 -15
  414. package/dist/db/migrations/v34.js +2 -11
  415. package/dist/db/migrations/v35.js +2 -11
  416. package/dist/db/migrations/v36.js +2 -11
  417. package/dist/db/migrations/v37.js +8 -33
  418. package/dist/db/migrations/v38.js +5 -38
  419. package/dist/db/migrations/v39.js +9 -20
  420. package/dist/db/migrations/v40.js +2 -9
  421. package/dist/db/migrations/v41.js +2 -24
  422. package/dist/db/migrations/v43.js +1 -1
  423. package/dist/db/migrations/v44.js +2 -8
  424. package/dist/db/migrations/v45.js +2 -7
  425. package/dist/db/migrations/v47.js +2 -3
  426. package/dist/db/migrations/v51.js +1 -1
  427. package/dist/db/migrations/v55.d.ts +3 -0
  428. package/dist/db/migrations/v55.js +17 -0
  429. package/dist/db/open.d.ts +2 -2
  430. package/dist/db/open.js +21 -9
  431. package/dist/db/physics-state.d.ts +6 -22
  432. package/dist/db/physics-state.js +28 -39
  433. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  434. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  435. package/dist/db/tables.d.ts +2 -0
  436. package/dist/db/tables.js +6 -2
  437. package/dist/db/vector-store.d.ts +2 -0
  438. package/dist/db/vector-store.js +25 -5
  439. package/dist/db/wal-checkpointer.js +2 -1
  440. package/dist/doctor.js +85 -27
  441. package/dist/embeddings/local.d.ts +62 -0
  442. package/dist/embeddings/local.js +146 -0
  443. package/dist/embeddings/provider.d.ts +43 -0
  444. package/dist/{store/embeddings → embeddings}/provider.js +58 -83
  445. package/dist/embeddings/transformers.d.ts +26 -0
  446. package/dist/embeddings/transformers.js +89 -0
  447. package/dist/entry/session-text.d.ts +1 -1
  448. package/dist/entry/session-text.js +3 -2
  449. package/dist/eval/eval-stats.d.ts +15 -53
  450. package/dist/eval/eval-stats.js +12 -42
  451. package/dist/eval/eval-suite.d.ts +2 -13
  452. package/dist/eval/eval-suite.js +91 -45
  453. package/dist/eval/eval.d.ts +6 -24
  454. package/dist/eval/eval.js +8 -35
  455. package/dist/eval/judgment.d.ts +0 -3
  456. package/dist/eval/judgment.js +30 -15
  457. package/dist/extensions/openclaw-plugin/index.js +1 -1
  458. package/dist/graph/extract.d.ts +5 -27
  459. package/dist/graph/extract.js +10 -36
  460. package/dist/graph/recall.d.ts +7 -20
  461. package/dist/graph/recall.js +15 -77
  462. package/dist/graph/stream.d.ts +7 -39
  463. package/dist/graph/stream.js +11 -34
  464. package/dist/graph/view.d.ts +9 -35
  465. package/dist/graph/view.js +24 -44
  466. package/dist/graph/write.d.ts +1 -1
  467. package/dist/graph/write.js +9 -9
  468. package/dist/hooks/codex-session.js +3 -2
  469. package/dist/hooks/codex-wrapper.js +4 -3
  470. package/dist/hooks/copilot.js +2 -1
  471. package/dist/hooks/hook-blocks.d.ts +6 -2
  472. package/dist/hooks/hook-blocks.js +37 -124
  473. package/dist/hooks/json-hooks.d.ts +4 -36
  474. package/dist/hooks/json-hooks.js +22 -59
  475. package/dist/hooks/opencode.d.ts +0 -38
  476. package/dist/hooks/opencode.js +17 -81
  477. package/dist/hooks/shared.d.ts +6 -21
  478. package/dist/hooks/shared.js +31 -33
  479. package/dist/importers/core.d.ts +12 -37
  480. package/dist/importers/core.js +10 -28
  481. package/dist/importers/markdown-parse.d.ts +8 -22
  482. package/dist/importers/markdown-parse.js +8 -25
  483. package/dist/importers/markdown.js +3 -12
  484. package/dist/importers/sources.js +12 -39
  485. package/dist/importers/vault.d.ts +2 -8
  486. package/dist/importers/vault.js +31 -85
  487. package/dist/index.d.ts +8 -3
  488. package/dist/index.js +8 -3
  489. package/dist/learn/autolearn.d.ts +23 -42
  490. package/dist/learn/autolearn.js +45 -52
  491. package/dist/learn/churn-git.js +13 -4
  492. package/dist/learn/extract.d.ts +3 -2
  493. package/dist/learn/extract.js +8 -8
  494. package/dist/learn/forward-claim-detector.d.ts +6 -30
  495. package/dist/learn/forward-claim-detector.js +18 -68
  496. package/dist/learn/invalidation.d.ts +6 -18
  497. package/dist/learn/invalidation.js +18 -31
  498. package/dist/mcp/admin-tools.d.ts +2 -2
  499. package/dist/mcp/admin-tools.js +30 -53
  500. package/dist/mcp/format.js +3 -2
  501. package/dist/mcp/framing.d.ts +1 -0
  502. package/dist/mcp/framing.js +1 -1
  503. package/dist/mcp/memory-tools.js +7 -10
  504. package/dist/mcp/protocol.d.ts +15 -29
  505. package/dist/mcp/protocol.js +26 -16
  506. package/dist/mcp/recall-tools.js +14 -11
  507. package/dist/mcp/request.d.ts +3 -11
  508. package/dist/mcp/request.js +12 -27
  509. package/dist/mcp/server.d.ts +3 -9
  510. package/dist/mcp/server.js +5 -16
  511. package/dist/mcp/session-state.d.ts +1 -1
  512. package/dist/mcp/session-state.js +5 -11
  513. package/dist/mcp/stdio.d.ts +2 -6
  514. package/dist/mcp/stdio.js +68 -16
  515. package/dist/mcp/tool-args.js +2 -1
  516. package/dist/mcp/tools.js +47 -22
  517. package/dist/objects/customer-notes.d.ts +9 -44
  518. package/dist/objects/customer-notes.js +7 -48
  519. package/dist/objects/decisions.d.ts +14 -52
  520. package/dist/objects/decisions.js +15 -53
  521. package/dist/objects/descriptor.d.ts +1 -1
  522. package/dist/objects/incidents.d.ts +9 -40
  523. package/dist/objects/incidents.js +7 -41
  524. package/dist/objects/lifecycle.d.ts +1 -1
  525. package/dist/objects/lifecycle.js +2 -1
  526. package/dist/objects/policies.d.ts +13 -91
  527. package/dist/objects/policies.js +13 -99
  528. package/dist/objects/processes.d.ts +9 -54
  529. package/dist/objects/processes.js +7 -61
  530. package/dist/objects/project-briefs.d.ts +13 -57
  531. package/dist/objects/project-briefs.js +16 -78
  532. package/dist/objects/skills.d.ts +9 -44
  533. package/dist/objects/skills.js +8 -54
  534. package/dist/postinstall.js +7 -20
  535. package/dist/predictions/planning-fallacy.d.ts +11 -34
  536. package/dist/rerankers/clef.js +6 -37
  537. package/dist/rerankers/cross-encoder.d.ts +31 -2
  538. package/dist/rerankers/cross-encoder.js +65 -101
  539. package/dist/rerankers/index.js +5 -4
  540. package/dist/rerankers/jev.js +11 -10
  541. package/dist/rerankers/llm.d.ts +2 -11
  542. package/dist/rerankers/llm.js +14 -14
  543. package/dist/rerankers/outage-warning.d.ts +5 -2
  544. package/dist/rerankers/outage-warning.js +7 -4
  545. package/dist/rerankers/remote.d.ts +1 -0
  546. package/dist/rerankers/remote.js +2 -0
  547. package/dist/rerankers/types.d.ts +2 -14
  548. package/dist/search/bm25-search.js +1 -1
  549. package/dist/search/boosts.d.ts +0 -2
  550. package/dist/search/boosts.js +3 -3
  551. package/dist/search/embed-memories.d.ts +9 -0
  552. package/dist/search/embed-memories.js +377 -0
  553. package/dist/search/goal-boost.d.ts +23 -0
  554. package/dist/search/goal-boost.js +93 -0
  555. package/dist/search/hybrid.d.ts +11 -2
  556. package/dist/search/hybrid.js +9 -4
  557. package/dist/search/multihop.js +2 -3
  558. package/dist/search/path-context.d.ts +5 -18
  559. package/dist/search/path-context.js +5 -18
  560. package/dist/search/physics-search.d.ts +6 -3
  561. package/dist/search/physics-search.js +29 -19
  562. package/dist/search/rerank.js +1 -1
  563. package/dist/search/rrf.d.ts +7 -35
  564. package/dist/search/rrf.js +5 -30
  565. package/dist/search/vector.d.ts +13 -4
  566. package/dist/search/vector.js +40 -13
  567. package/dist/server/auth.d.ts +11 -28
  568. package/dist/server/auth.js +49 -32
  569. package/dist/server/boot.d.ts +2 -21
  570. package/dist/server/boot.js +69 -161
  571. package/dist/server/client-ip.d.ts +3 -21
  572. package/dist/server/client-ip.js +8 -30
  573. package/dist/server/deadline.d.ts +0 -2
  574. package/dist/server/deadline.js +1 -7
  575. package/dist/server/defaults.d.ts +4 -0
  576. package/dist/server/defaults.js +5 -0
  577. package/dist/server/key-check-bounds.d.ts +2 -1
  578. package/dist/server/lifecycle.d.ts +5 -4
  579. package/dist/server/lifecycle.js +19 -4
  580. package/dist/server/mcp-http.js +24 -53
  581. package/dist/server/rate-limit.d.ts +5 -18
  582. package/dist/server/rate-limit.js +4 -13
  583. package/dist/server/request.d.ts +4 -8
  584. package/dist/server/request.js +16 -19
  585. package/dist/server/route-checks.d.ts +7 -0
  586. package/dist/server/route-checks.js +42 -0
  587. package/dist/server/route-table.d.ts +9 -8
  588. package/dist/server/route-table.js +127 -139
  589. package/dist/server/routes/admin.d.ts +8 -8
  590. package/dist/server/routes/admin.js +35 -49
  591. package/dist/server/routes/customer-notes.d.ts +6 -6
  592. package/dist/server/routes/customer-notes.js +8 -14
  593. package/dist/server/routes/decisions.d.ts +6 -6
  594. package/dist/server/routes/decisions.js +12 -21
  595. package/dist/server/routes/incidents.d.ts +6 -6
  596. package/dist/server/routes/incidents.js +14 -25
  597. package/dist/server/routes/memories.d.ts +9 -9
  598. package/dist/server/routes/memories.js +20 -63
  599. package/dist/server/routes/object-routes.d.ts +6 -11
  600. package/dist/server/routes/object-routes.js +11 -22
  601. package/dist/server/routes/policies.d.ts +7 -7
  602. package/dist/server/routes/policies.js +12 -22
  603. package/dist/server/routes/predictions.d.ts +6 -6
  604. package/dist/server/routes/predictions.js +22 -38
  605. package/dist/server/routes/processes.d.ts +6 -6
  606. package/dist/server/routes/processes.js +17 -28
  607. package/dist/server/routes/project-briefs.d.ts +7 -7
  608. package/dist/server/routes/project-briefs.js +11 -20
  609. package/dist/server/routes/recall.d.ts +5 -5
  610. package/dist/server/routes/recall.js +16 -45
  611. package/dist/server/routes/skills.d.ts +7 -7
  612. package/dist/server/routes/skills.js +10 -22
  613. package/dist/server/server-detect.d.ts +15 -53
  614. package/dist/server/server-detect.js +55 -96
  615. package/dist/server/sleep-child.js +26 -7
  616. package/dist/server/sleep-offload.d.ts +11 -5
  617. package/dist/server/sleep-offload.js +21 -12
  618. package/dist/server/types.d.ts +32 -18
  619. package/dist/server/validation.d.ts +3 -2
  620. package/dist/server/validation.js +15 -33
  621. package/dist/server.d.ts +7 -6
  622. package/dist/server.js +8 -6
  623. package/dist/sharing/global-store.d.ts +19 -0
  624. package/dist/sharing/global-store.js +75 -0
  625. package/dist/sharing/global-sync.d.ts +6 -0
  626. package/dist/sharing/global-sync.js +73 -0
  627. package/dist/sharing/project-merge.d.ts +11 -19
  628. package/dist/sharing/project-merge.js +63 -125
  629. package/dist/sharing/search-both.d.ts +60 -0
  630. package/dist/sharing/search-both.js +138 -0
  631. package/dist/sharing/share.d.ts +40 -0
  632. package/dist/sharing/share.js +229 -0
  633. package/dist/store/ambient.js +9 -15
  634. package/dist/store/audit-event.d.ts +5 -13
  635. package/dist/store/audit-event.js +4 -12
  636. package/dist/store/audit.d.ts +2 -21
  637. package/dist/store/audit.js +8 -67
  638. package/dist/store/auth.d.ts +10 -8
  639. package/dist/store/auth.js +17 -12
  640. package/dist/store/candidates.d.ts +23 -5
  641. package/dist/store/candidates.js +119 -71
  642. package/dist/store/capture-write.d.ts +17 -0
  643. package/dist/store/capture-write.js +35 -0
  644. package/dist/store/card-detail.d.ts +2 -1
  645. package/dist/store/card-detail.js +2 -1
  646. package/dist/store/cards.d.ts +14 -9
  647. package/dist/store/cards.js +72 -126
  648. package/dist/store/compaction-caller.d.ts +18 -0
  649. package/dist/store/compaction-caller.js +29 -0
  650. package/dist/store/compactions-record.d.ts +115 -0
  651. package/dist/store/compactions-record.js +417 -0
  652. package/dist/store/compactions.js +6 -4
  653. package/dist/store/conflicts.d.ts +4 -21
  654. package/dist/store/conflicts.js +76 -152
  655. package/dist/store/connectors/dlq.d.ts +10 -0
  656. package/dist/store/connectors/dlq.js +32 -0
  657. package/dist/store/connectors/github.d.ts +14 -16
  658. package/dist/store/connectors/github.js +34 -57
  659. package/dist/store/connectors/slack.d.ts +2 -11
  660. package/dist/store/connectors/slack.js +18 -47
  661. package/dist/store/dashboard-reads.js +11 -14
  662. package/dist/store/delete-and-batch.d.ts +17 -31
  663. package/dist/store/delete-and-batch.js +84 -67
  664. package/dist/store/delivery-recorder.d.ts +15 -4
  665. package/dist/store/delivery-recorder.js +34 -17
  666. package/dist/store/descendant-page.js +6 -3
  667. package/dist/store/diagnostics.js +6 -13
  668. package/dist/store/dormant.d.ts +8 -30
  669. package/dist/store/dormant.js +18 -57
  670. package/dist/store/embeddings/index.d.ts +11 -90
  671. package/dist/store/embeddings/index.js +18 -523
  672. package/dist/store/entry-reads.d.ts +34 -61
  673. package/dist/store/entry-reads.js +111 -136
  674. package/dist/store/entry-row.d.ts +6 -35
  675. package/dist/store/entry-row.js +9 -37
  676. package/dist/store/entry-writes.d.ts +12 -18
  677. package/dist/store/entry-writes.js +46 -44
  678. package/dist/store/failure-log-at.d.ts +8 -0
  679. package/dist/store/failure-log-at.js +16 -0
  680. package/dist/store/failure-log.d.ts +2 -2
  681. package/dist/store/failure-log.js +5 -3
  682. package/dist/{trust → store}/gated-write.d.ts +3 -1
  683. package/dist/{trust → store}/gated-write.js +7 -5
  684. package/dist/store/goals.d.ts +3 -40
  685. package/dist/store/goals.js +41 -178
  686. package/dist/store/graph-queue.d.ts +6 -22
  687. package/dist/store/graph-queue.js +14 -45
  688. package/dist/store/graph-reads.d.ts +11 -35
  689. package/dist/store/graph-reads.js +24 -60
  690. package/dist/store/graph-rows.d.ts +3 -6
  691. package/dist/store/graph-rows.js +6 -9
  692. package/dist/store/graph-view-rows.d.ts +2 -1
  693. package/dist/store/graph-view-rows.js +2 -1
  694. package/dist/store/graph-writes.d.ts +10 -35
  695. package/dist/store/graph-writes.js +59 -106
  696. package/dist/store/half-life.d.ts +2 -1
  697. package/dist/store/half-life.js +14 -16
  698. package/dist/store/handoffs.d.ts +6 -12
  699. package/dist/store/handoffs.js +22 -40
  700. package/dist/store/index-and-stats.d.ts +6 -19
  701. package/dist/store/index-and-stats.js +36 -84
  702. package/dist/store/key-writes.js +1 -1
  703. package/dist/store/ledger-turn.d.ts +9 -0
  704. package/dist/store/ledger-turn.js +38 -0
  705. package/dist/store/mirrors.d.ts +2 -6
  706. package/dist/store/mirrors.js +24 -29
  707. package/dist/store/open.d.ts +0 -4
  708. package/dist/store/open.js +42 -62
  709. package/dist/store/pilot-arm.d.ts +12 -0
  710. package/dist/store/pilot-arm.js +42 -0
  711. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  712. package/dist/store/planning-fallacy-evidence.js +8 -37
  713. package/dist/store/port.d.ts +91 -82
  714. package/dist/store/port.js +8 -0
  715. package/dist/store/predictions.d.ts +12 -53
  716. package/dist/store/predictions.js +41 -125
  717. package/dist/store/project-tags.d.ts +62 -0
  718. package/dist/store/project-tags.js +67 -0
  719. package/dist/{cli → store}/quality-repair.js +15 -31
  720. package/dist/store/quarantine.js +2 -1
  721. package/dist/store/raw-archive.d.ts +4 -16
  722. package/dist/store/raw-archive.js +14 -29
  723. package/dist/store/recall-trace.d.ts +12 -77
  724. package/dist/store/recall-trace.js +37 -97
  725. package/dist/store/rejected-values.js +9 -20
  726. package/dist/store/rejection-probe.d.ts +4 -0
  727. package/dist/store/rejection-probe.js +19 -0
  728. package/dist/store/rejection.d.ts +10 -73
  729. package/dist/store/rejection.js +12 -84
  730. package/dist/store/report-reads.d.ts +6 -0
  731. package/dist/store/report-reads.js +29 -0
  732. package/dist/store/rows.d.ts +9 -19
  733. package/dist/store/rows.js +36 -34
  734. package/dist/store/rule-sql.d.ts +14 -0
  735. package/dist/store/rule-sql.js +56 -0
  736. package/dist/store/search-rows.d.ts +7 -38
  737. package/dist/store/search-rows.js +23 -54
  738. package/dist/store/sessions.d.ts +10 -47
  739. package/dist/store/sessions.js +21 -75
  740. package/dist/store/set-aside.d.ts +14 -0
  741. package/dist/store/set-aside.js +23 -0
  742. package/dist/store/sqlite/busy.d.ts +3 -0
  743. package/dist/store/sqlite/busy.js +8 -0
  744. package/dist/store/sqlite/connector-events-group.js +5 -8
  745. package/dist/store/sqlite/connector-writes-group.js +3 -3
  746. package/dist/store/sqlite/entry-writes-group.js +4 -4
  747. package/dist/store/sqlite/error-codec.js +8 -5
  748. package/dist/store/sqlite/executor.d.ts +2 -1
  749. package/dist/store/sqlite/executor.js +12 -5
  750. package/dist/store/sqlite/graph-reads-group.js +1 -1
  751. package/dist/store/sqlite/held-connection.d.ts +9 -0
  752. package/dist/store/sqlite/held-connection.js +41 -0
  753. package/dist/store/sqlite/local.d.ts +3 -3
  754. package/dist/store/sqlite/local.js +1 -0
  755. package/dist/store/sqlite/object-rows.d.ts +1 -1
  756. package/dist/store/sqlite/object-rows.js +6 -3
  757. package/dist/store/sqlite/objects-group.d.ts +1 -1
  758. package/dist/store/sqlite/objects-group.js +5 -3
  759. package/dist/store/sqlite/quarantine-group.js +2 -2
  760. package/dist/store/sqlite/store.d.ts +1 -4
  761. package/dist/store/sqlite/store.js +16 -15
  762. package/dist/store/sqlite/vector-reads-group.js +2 -2
  763. package/dist/store/sqlite/worker-jobs.js +1 -1
  764. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  765. package/dist/store/sqlite/worker-ops.js +13 -2
  766. package/dist/store/sqlite/worker-store.js +5 -2
  767. package/dist/store/summaries.d.ts +11 -63
  768. package/dist/store/summaries.js +37 -148
  769. package/dist/store/summary-dirty.js +1 -1
  770. package/dist/store/tenant-lookup.d.ts +6 -1
  771. package/dist/store/tenant-lookup.js +7 -0
  772. package/dist/store/tenant.d.ts +2 -16
  773. package/dist/store/tenant.js +4 -19
  774. package/dist/store/token-ledger.d.ts +13 -50
  775. package/dist/store/token-ledger.js +19 -85
  776. package/dist/store/usage-reports.js +5 -13
  777. package/dist/store/vector-index.d.ts +46 -0
  778. package/dist/store/vector-index.js +171 -0
  779. package/dist/store/working-memory.d.ts +6 -25
  780. package/dist/store/working-memory.js +18 -52
  781. package/dist/support-bundle.js +9 -8
  782. package/dist/trust/reject-flow.js +3 -5
  783. package/dist/util/agent-homes.d.ts +15 -0
  784. package/dist/util/agent-homes.js +34 -0
  785. package/dist/util/anthropic-messages.d.ts +3 -0
  786. package/dist/util/anthropic-messages.js +35 -6
  787. package/dist/util/atomic-write.d.ts +2 -1
  788. package/dist/util/atomic-write.js +35 -4
  789. package/dist/util/capped-json.d.ts +6 -0
  790. package/dist/util/capped-json.js +46 -0
  791. package/dist/util/chunked.d.ts +3 -0
  792. package/dist/util/chunked.js +10 -0
  793. package/dist/util/crash-handlers.d.ts +8 -1
  794. package/dist/util/crash-handlers.js +52 -10
  795. package/dist/util/ellipsize.d.ts +3 -0
  796. package/dist/util/ellipsize.js +5 -0
  797. package/dist/util/env.d.ts +14 -6
  798. package/dist/util/env.js +15 -7
  799. package/dist/util/format.d.ts +3 -0
  800. package/dist/util/format.js +6 -0
  801. package/dist/util/home-path.d.ts +2 -1
  802. package/dist/util/home-path.js +4 -2
  803. package/dist/util/hook-payload.d.ts +8 -0
  804. package/dist/util/hook-payload.js +37 -0
  805. package/dist/util/http-retry.d.ts +9 -1
  806. package/dist/util/http-retry.js +67 -8
  807. package/dist/util/http-util.d.ts +0 -8
  808. package/dist/util/http-util.js +10 -21
  809. package/dist/util/limits.d.ts +7 -0
  810. package/dist/util/limits.js +14 -0
  811. package/dist/util/log.d.ts +7 -2
  812. package/dist/util/log.js +34 -9
  813. package/dist/util/request-scope.d.ts +5 -2
  814. package/dist/util/request-scope.js +13 -7
  815. package/dist/util/secret-detect.d.ts +5 -30
  816. package/dist/util/secret-detect.js +19 -40
  817. package/dist/util/sqlite-blocked.d.ts +2 -0
  818. package/dist/util/sqlite-blocked.js +5 -0
  819. package/dist/util/stored-json.d.ts +1 -1
  820. package/dist/util/stored-json.js +1 -1
  821. package/dist/util/stream-tee.d.ts +3 -0
  822. package/dist/util/stream-tee.js +35 -0
  823. package/dist/util/time.d.ts +4 -0
  824. package/dist/util/time.js +4 -0
  825. package/dist/util/token-text.d.ts +1 -4
  826. package/dist/util/token-text.js +1 -4
  827. package/dist/util/transcript-tail.d.ts +2 -0
  828. package/dist/util/transcript-tail.js +24 -23
  829. package/dist/util/version.d.ts +5 -20
  830. package/dist/util/version.js +5 -20
  831. package/dist/{store → util}/yaml.d.ts +1 -5
  832. package/dist/{store → util}/yaml.js +2 -6
  833. package/extensions/openclaw-plugin/index.ts +1 -1
  834. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  835. package/extensions/openclaw-plugin/package.json +1 -1
  836. package/openclaw.plugin.json +1 -1
  837. package/package.json +2 -2
  838. package/dist/cli/provenance-coverage.d.ts +0 -18
  839. package/dist/connectors/github/cli-impl.d.ts +0 -25
  840. package/dist/sharing/scope.d.ts +0 -14
  841. package/dist/sharing/shared.d.ts +0 -187
  842. package/dist/sharing/shared.js +0 -563
  843. package/dist/store/embeddings/local.d.ts +0 -15
  844. package/dist/store/embeddings/local.js +0 -192
  845. package/dist/store/embeddings/provider.d.ts +0 -77
  846. package/dist/store/markdown.d.ts +0 -10
  847. package/dist/store/recall-scope.d.ts +0 -138
  848. package/dist/store/recall-scope.js +0 -216
  849. package/dist/store/vector-writes.d.ts +0 -13
  850. package/dist/store/vector-writes.js +0 -89
  851. /package/dist/{store → core}/object-types.d.ts +0 -0
  852. /package/dist/{store → core}/object-types.js +0 -0
  853. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
  854. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  855. /package/dist/{capture → util}/compaction-items.js +0 -0
@@ -1,12 +1,11 @@
1
- // Read path: recall (sync) and retrieve (async, adds the vector arm).
1
+ // Read path: retrieve, the one recall entry.
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';
10
9
  import { hybridSearch } from '../search/hybrid.js';
11
10
  import { physicsSearch } from '../search/physics-search.js';
12
11
  import { churnStaleFactor } from '../search/boosts.js';
@@ -15,65 +14,22 @@ import { dropHeldCopies, duplicateKey, storedTextKeys } from '../util/same-text.
15
14
  import { isSharedStore, loadConfig } from '../core/config.js';
16
15
  import { classifyOriginProject, projectNames } from '../core/project-identity.js';
17
16
  import { decidePlanningFallacy, detectPlanningClaim } from '../predictions/planning-fallacy.js';
18
- import { planningFallacyEvidenceAt } from '../store/planning-fallacy-evidence.js';
19
17
  import { detectAnchoring, hashQueryText, biasHintEnabled } from './recall-history.js';
20
18
  import { detectAvailabilityBias } from './availability.js';
21
- import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../store/recall-scope.js';
19
+ import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../core/recall-scope.js';
22
20
  import { ownerOrSubject, RecallContractError } from './types.js';
23
21
  import { anchoringRows, availabilityRows, callerOf, recallAuditMetadata, recallAuditRow, strengthenOf } from './recall-record.js';
24
22
  import { retrieveWithCliCore } from './recall-core.js';
23
+ import { recallLead, recordShownRecall } from './recall-finish.js';
25
24
  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
- */
59
- export function recall(ctx, opts) {
60
- // A member key may not unlock a private or quarantined scope by naming it.
61
- assertScopeRequestAllowed(ctx.actor, opts.scope);
62
- const windowSize = recallWindowSize(opts);
63
- const own = personalScopeOf(ctx.actor) ?? undefined;
64
- const all = loadRecallSearchEntries(ctx.hippoRoot, opts.query, windowSize, ctx.tenantId, opts.scope, 'exact', false, recallOrigin(opts), own);
65
- 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] });
68
- return result;
69
- }
70
25
  function recallOrigin(opts) {
71
26
  return opts.project ? projectNames(opts.project) : undefined;
72
27
  }
73
28
  function inCallerProject(entry, opts) {
74
29
  return !opts.project || classifyOriginProject(entry.origin_project, opts.project) !== 'cross-project';
75
30
  }
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). */
31
+ /** 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`.
32
+ * Only the CLI core ranker writes last_retrieval_ids (contract lock). */
77
33
  export async function retrieve(ctx, opts) {
78
34
  assertScopeRequestAllowed(ctx.actor, opts.scope);
79
35
  if (opts.cliCore)
@@ -84,20 +40,48 @@ export async function retrieve(ctx, opts) {
84
40
  if (opts.showRanked)
85
41
  return retrieveFromStore(ctx, opts, windowSize, opts.showRanked, own);
86
42
  const store = storeFor(ctx);
43
+ const how = opts.recordAs;
44
+ if (!how)
45
+ return retrieveBand(ctx, store, opts, windowSize, own);
46
+ const result = await retrieveBand(ctx, store, { ...opts, ...recallLead(ctx, how, opts.query, opts.sessionId) }, windowSize, own);
47
+ await recordShownRecall(ctx, store, how, shownBand(opts, result));
48
+ return result;
49
+ }
50
+ /** What the band ranker hands to the record: the rows it returns, and the continuity block the reply carries beside them. */
51
+ function shownBand(opts, result) {
52
+ return {
53
+ query: opts.query,
54
+ sessionId: opts.sessionId,
55
+ topId: result.results[0]?.id ?? null,
56
+ anchoredOn: result.anchoringHint?.memoryId,
57
+ items: result.results.length,
58
+ tokens: result.tokens + (result.continuityTokens ?? 0),
59
+ ledgerSessionId: opts.sessionId ?? null,
60
+ written: true, // a failed audit write throws out of the band ranker, so this point is never reached without the rows
61
+ };
62
+ }
63
+ /** The default ranker: the SQL BM25 band, reordered by hybrid or physics search when `mode` asks. */
64
+ async function retrieveBand(ctx, store, opts, windowSize, own) {
87
65
  let candidates = await store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, windowSize, own));
88
66
  if (opts.mode === 'hybrid' || opts.mode === 'physics') {
89
67
  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);
68
+ const ranked = await rankPool(ctx, opts, candidates, searchOpts);
93
69
  const rankedIds = new Set(ranked.map((r) => r.entry.id));
94
70
  candidates = [...ranked.map((r) => r.entry), ...candidates.filter((e) => !rankedIds.has(e.id))];
95
71
  }
96
72
  const plan = planRecall(ctx, opts, candidates, own);
97
73
  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)) });
74
+ await store.finishRecall({
75
+ ...writes, audit: [...(opts.leadingAudit ?? []), ...writes.audit], strengthen: strengthenOf(ctx, result.results.map((r) => r.id))
76
+ });
99
77
  return result;
100
78
  }
79
+ /** The ranked pool: physics when `mode` says so, hybrid otherwise; each caller supplies its own search options. */
80
+ function rankPool(ctx, opts, pool, searchOpts) {
81
+ return opts.mode === 'physics'
82
+ ? physicsSearch(opts.query, pool, { ...searchOpts, physicsConfig: loadConfig(ctx.hippoRoot).physics })
83
+ : hybridSearch(opts.query, pool, searchOpts);
84
+ }
101
85
  /** The recall load's arguments: exact scope, current rows only, the caller's project and personal scope. */
102
86
  function recallSearchArgs(ctx, opts, limit, own) {
103
87
  return {
@@ -129,9 +113,7 @@ async function retrieveFromStore(ctx, opts, windowSize, show, own) {
129
113
  const pool = loaded.filter((e) => passesScopeFilterForRecall(e.scope ?? null, opts.scope, own));
130
114
  // No scope option: the scope boost follows HIPPO_SCOPE and the skill env, as MCP recall always ranked.
131
115
  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);
116
+ let ranked = await rankPool(ctx, opts, pool, searchOpts);
135
117
  // One goal read serves both boosts; the ranked list's log rows come first, so its scores win the log's first-write.
136
118
  const goals = opts.sessionId && !opts.goalTag ? await store.activeGoals({ sessionId: opts.sessionId, tenantId: ctx.tenantId }) : null;
137
119
  let rankedLog = [];
@@ -143,7 +125,9 @@ async function retrieveFromStore(ctx, opts, windowSize, show, own) {
143
125
  const window = ranked.slice(0, windowSize).map((r) => r.entry);
144
126
  const bandOpts = { ...opts, suppressRecallTrace: true };
145
127
  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 });
128
+ const { result, writes } = composeRecall(ctx, bandOpts, {
129
+ windowSize, all: window, plan, reads: await readRecall(store, ctx, bandOpts, plan, goals), auditBand: false
130
+ });
147
131
  // Rows the vector arm added count as candidates too.
148
132
  const inPool = new Set(pool.map((e) => e.id));
149
133
  const candidates = [...pool, ...ranked.map((r) => r.entry).filter((e) => !inPool.has(e.id))];
@@ -199,27 +183,17 @@ function planRecall(ctx, opts, all, own) {
199
183
  claim: detectPlanningClaim(opts.query),
200
184
  };
201
185
  }
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;
205
- const freshCount = opts.freshTailCount ?? 0;
206
- 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,
212
- };
213
- }
214
186
  /** The plan's reads through the store; `goals` already read by the caller skips that read. */
215
187
  async function readRecall(store, ctx, opts, plan, goals) {
216
188
  const { tenantId } = ctx;
217
189
  const freshCount = opts.freshTailCount ?? 0;
190
+ const parentIds = plan.overflow.size > 0 ? [...plan.overflow.keys()] : null;
191
+ const continuity = opts.includeContinuity ? { key: continuityKey(ctx, opts) } : null;
218
192
  return {
219
193
  goals: goals !== undefined ? goals : plan.goalBoost ? await store.activeGoals({ sessionId: plan.goalBoost.sessionId, tenantId }) : null,
220
- parents: plan.overflow.size > 0 ? await store.entriesByIds([...plan.overflow.keys()], tenantId) : [],
194
+ parents: parentIds ? await store.entriesByIds(parentIds, tenantId) : [],
221
195
  freshRaws: freshCount > 0 ? await store.freshRawEntries(freshCount, tenantId, opts.freshTailSessionId, recallOrigin(opts) ?? null) : [],
222
- continuity: opts.includeContinuity ? await store.continuity(tenantId, CONTINUITY_EVENT_LIMIT, continuityKey(ctx, opts)) : undefined,
196
+ continuity: continuity ? await store.continuity(tenantId, CONTINUITY_EVENT_LIMIT, continuity.key) : undefined,
223
197
  planning: plan.claim ? await store.planningFallacyEvidence(tenantId, plan.claim.classQueryTokens) : null,
224
198
  };
225
199
  }
@@ -246,14 +220,14 @@ function composeRecall(ctx, opts, options) {
246
220
  continuity,
247
221
  continuityTokens: continuity ? continuityTokensOf(continuity) : undefined,
248
222
  windowSize,
249
- suppressionSummary: buildSuppressionSummary({
223
+ suppressionSummary: {
250
224
  totalCandidates: all.length,
251
225
  droppedPreRank: window.droppedPreRank + bands.heldDropped,
252
226
  droppedByBudget: window.droppedByBudget,
253
227
  summarySubstitutionsAdded: bands.summarySubstitutions,
254
228
  freshTailAdded: bands.freshTailAdded,
255
229
  suppressedByInterference,
256
- }),
230
+ },
257
231
  };
258
232
  // The hint and the no-class-match / tiebreak watching variant are mutually exclusive; both go out as optional fields.
259
233
  if (planning?.output.hint)
@@ -462,19 +436,19 @@ function scopeContinuity(block, opts, own) {
462
436
  function continuityTokensOf(c) {
463
437
  const filteredSnapshot = c.activeSnapshot;
464
438
  const filteredHandoff = c.sessionHandoff;
465
- const tokenize = (s) => s ? estimateTokens(s) : 0;
466
- return tokenize(filteredSnapshot?.task) +
467
- tokenize(filteredSnapshot?.summary) +
468
- tokenize(filteredSnapshot?.next_step) +
469
- tokenize(filteredHandoff?.summary) +
470
- tokenize(filteredHandoff?.nextAction) +
471
- (filteredHandoff?.artifacts ?? []).reduce((acc, a) => acc + tokenize(a), 0) +
472
- (filteredHandoff?.constraints ?? []).reduce((acc, c) => acc + tokenize(c), 0) +
473
- tokenize(filteredHandoff?.evidence ? formatHandoffEvidenceLine(filteredHandoff.evidence) : null) +
474
- tokenize(filteredHandoff?.outcome) +
475
- tokenize(filteredHandoff?.targetRuntime) +
476
- tokenize(filteredHandoff?.cardId) +
477
- c.recentSessionEvents.reduce((acc, e) => acc + tokenize(e.content), 0);
439
+ const tokenCount = (s) => s ? estimateTokens(s) : 0;
440
+ return tokenCount(filteredSnapshot?.task) +
441
+ tokenCount(filteredSnapshot?.summary) +
442
+ tokenCount(filteredSnapshot?.next_step) +
443
+ tokenCount(filteredHandoff?.summary) +
444
+ tokenCount(filteredHandoff?.nextAction) +
445
+ (filteredHandoff?.artifacts ?? []).reduce((acc, a) => acc + tokenCount(a), 0) +
446
+ (filteredHandoff?.constraints ?? []).reduce((acc, c) => acc + tokenCount(c), 0) +
447
+ tokenCount(filteredHandoff?.evidence ? formatHandoffEvidenceLine(filteredHandoff.evidence) : null) +
448
+ tokenCount(filteredHandoff?.outcome) +
449
+ tokenCount(filteredHandoff?.targetRuntime) +
450
+ tokenCount(filteredHandoff?.cardId) +
451
+ c.recentSessionEvents.reduce((acc, e) => acc + tokenCount(e.content), 0);
478
452
  }
479
453
  // A pure read of the caller's recallHistory snapshot against this top-1. HIPPO_ANCHORING=off skips even the detect
480
454
  // call; CLI paths pass no history (cmdRecall computes its own hint), so the hint stays absent there.
@@ -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 '../search/embed-memories.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;
@@ -8,7 +23,8 @@ export interface RememberOpts {
8
23
  owner?: string;
9
24
  artifactRef?: string;
10
25
  tags?: string[];
11
- /** The connector event this write answers. The store logs it in the memory's own transaction; an event logged before stores nothing and answers `duplicate`. */
26
+ /** The connector event this write answers. The store logs it in the memory's own transaction; an event logged before stores nothing and
27
+ * answers `duplicate`. */
12
28
  event?: ConnectorEvent;
13
29
  /** Connector-ingested content an agent doesn't control; gates detectInstruction. CLI/HTTP/MCP never set this. */
14
30
  untrusted?: boolean;
@@ -19,6 +35,8 @@ export interface RememberOpts {
19
35
  };
20
36
  /** 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
37
  personal?: boolean;
38
+ /** 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. */
39
+ local?: RememberLocal;
22
40
  }
23
41
  export interface RememberResult {
24
42
  id: string;
@@ -7,7 +7,7 @@ import { loadConfig } from '../core/config.js';
7
7
  import { vetSecrets } from '../util/secret-detect.js';
8
8
  import { assertCallerProject } from '../core/project-identity.js';
9
9
  import { BadRequestError } from '../core/api-errors.js';
10
- import { assertClientScope, personalScopeOf } from '../store/recall-scope.js';
10
+ import { assertClientScope, personalScopeOf } from '../core/recall-scope.js';
11
11
  import { andThen, notPorted, onStore } from './on-store.js';
12
12
  /** The scope a write lands in: the caller's own personal scope when asked for, else the client's, which may not be a personal one. */
13
13
  function rememberScope(ctx, opts) {
@@ -21,7 +21,8 @@ function rememberScope(ctx, opts) {
21
21
  throw new BadRequestError('send personal or scope, not both');
22
22
  const own = personalScopeOf(ctx.actor);
23
23
  if (own === null) {
24
- throw new BadRequestError('personal memories need a key its owner minted, or a sign-in; owner ids over 239 characters or with control characters cannot hold them');
24
+ throw new BadRequestError('personal memories need a key its owner minted, or a sign-in; owner ids over 239 characters or with control characters cannot ' +
25
+ 'hold them');
25
26
  }
26
27
  return own;
27
28
  }
@@ -31,7 +32,15 @@ function prepareRemember(ctx, opts) {
31
32
  const requestedScope = rememberScope(ctx, opts);
32
33
  const vetted = vetSecrets(opts.content, opts.tags ?? [], opts.untrusted === true);
33
34
  const detection = opts.untrusted ? detectInstruction(vetted.content) : { flagged: false, reason: null };
34
- const entry = createMemory(vetted.content, {
35
+ const local = opts.local ?? {};
36
+ const created = createMemory(vetted.content, {
37
+ layer: local.layer,
38
+ pinned: local.pinned,
39
+ confidence: local.confidence,
40
+ source: local.source,
41
+ schema_fit: local.schemaFit,
42
+ trace_outcome: local.traceOutcome,
43
+ source_session_id: local.sourceSessionId,
35
44
  kind: opts.kind ?? 'distilled',
36
45
  scope: detection.flagged ? quarantineScopeFor(requestedScope) : requestedScope,
37
46
  owner: opts.owner ?? null,
@@ -40,11 +49,15 @@ function prepareRemember(ctx, opts) {
40
49
  tenantId: ctx.tenantId,
41
50
  baseHalfLifeDays: loadConfig(ctx.hippoRoot).defaultHalfLifeDays,
42
51
  });
52
+ const entry = local.weaken ? weakened(created, local.weaken) : created;
43
53
  // Aliases only widen what a reader matches; a row has one origin. A personal row's '' follows its owner into every project.
44
54
  const origin = opts.personal ? '' : opts.project?.name;
45
55
  const stamped = origin !== undefined ? { ...entry, origin_project: origin } : entry;
46
56
  return { entry: stamped, requestedScope, detection, warnings: vetted.warnings };
47
57
  }
58
+ function weakened(entry, weaken) {
59
+ return { ...entry, strength: weaken.strength, half_life_days: Math.max(1, entry.half_life_days * weaken.halfLifeFactor) };
60
+ }
48
61
  function rememberResult(ctx, prepared, written) {
49
62
  const { entry, detection, warnings } = prepared;
50
63
  const result = { id: entry.id, kind: entry.kind, tenantId: ctx.tenantId };
@@ -0,0 +1,22 @@
1
+ import type { HandoffEvidence } from '../core/handoff.js';
2
+ import type { TaskSnapshot } from '../store/rows.js';
3
+ import type { Context } from './types.js';
4
+ /** What closing one ended session needs from the host; the two readers run only when the handoff is written. */
5
+ export interface SessionClose {
6
+ sessionId: string | null;
7
+ /** A reply's end, not the session's: the handoff is updated in place and the snapshot stays for the next compaction. */
8
+ turn: boolean;
9
+ /** The transcript's working state, or null with no readable transcript. */
10
+ workingState: () => Pick<TaskSnapshot, 'task' | 'summary' | 'next_step'> | null;
11
+ evidence: () => HandoffEvidence;
12
+ /** One line to the session-end log. */
13
+ log: (line: string) => void;
14
+ }
15
+ /** Writes the session's handoff, then closes its snapshot unless `turn`; each step logs its own failure and never throws.
16
+ * The handoff goes first, while the snapshot writeSessionEndHandoff reads is still active. */
17
+ export declare function closeEndedSession(ctx: Context, close: SessionClose): void;
18
+ /** Books the ending session's re-reads in each store its ledger rows can land in (`ctx.hippoRoot` and global); returns the log lines. */
19
+ export declare function bookSessionRereads(ctx: Context, transcriptPath: string | undefined, sessionId: string | null): Promise<string[]>;
20
+ /** The block a compaction lost: the fresh task snapshot and its session trail, or null with none or another session's snapshot. */
21
+ export declare function compactResumeBlock(ctx: Context, payloadSessionId: string | null): string | null;
22
+ //# sourceMappingURL=session-end.d.ts.map
@@ -0,0 +1,101 @@
1
+ // The store writes a session's end makes after sleep and capture (handoff, snapshot close, re-read count), and the
2
+ // compact-resume read; the hook verbs keep stdin, spawning and the log file.
3
+ import * as path from 'path';
4
+ import { isInitialized } from '../core/project-identity.js';
5
+ import { closeTaskSnapshotsForSession, listSessionEvents, loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot } from '../store/sessions.js';
6
+ import { writeSessionEndHandoff } from '../store/handoffs.js';
7
+ import { readApiCalls, recordRereads } from '../store/token-ledger.js';
8
+ import { getGlobalRoot } from '../sharing/global-store.js';
9
+ import { truncateCodePointSafe } from '../util/transcript-tail.js';
10
+ import { errorMessage, log } from '../util/log.js';
11
+ import { COMPACT_RESUME_EVENT_CONTENT_CAP, COMPACT_RESUME_MAX_AGE_MS, compactResumeText } from './context-render.js';
12
+ /** Writes the session's handoff, then closes its snapshot unless `turn`; each step logs its own failure and never throws.
13
+ * The handoff goes first, while the snapshot writeSessionEndHandoff reads is still active. */
14
+ export function closeEndedSession(ctx, close) {
15
+ if (close.sessionId)
16
+ writeEndHandoff(ctx, close.sessionId, close);
17
+ if (close.turn) {
18
+ close.log('skip snapshot close: turn mode');
19
+ return;
20
+ }
21
+ closeSnapshot(ctx, close.sessionId, close.log);
22
+ }
23
+ function writeEndHandoff(ctx, sessionId, close) {
24
+ try {
25
+ const ownSnapshot = loadActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId)?.session_id === sessionId;
26
+ // A never-compacted session has no snapshot; read even when it has one, as another session's PreCompact can take the slot before the write.
27
+ const derived = close.workingState();
28
+ if (!ownSnapshot && !derived) {
29
+ close.log('skip: no snapshot or transcript for session');
30
+ return;
31
+ }
32
+ const handoff = writeSessionEndHandoff(ctx.hippoRoot, ctx.tenantId, sessionId, close.evidence(), derived, undefined, { inPlace: close.turn });
33
+ close.log(handoff ? `wrote handoff for session ${sessionId}` : `skip: kept the existing handoff for session ${sessionId}`);
34
+ }
35
+ catch (err) {
36
+ close.log(`handoff write failed: ${errorMessage(err)}`);
37
+ }
38
+ }
39
+ // If session-end never fires (crash, kill -9), the freshness bound in loadFreshActiveTaskSnapshot is the backstop.
40
+ function closeSnapshot(ctx, sessionId, line) {
41
+ try {
42
+ if (sessionId) {
43
+ const closed = closeTaskSnapshotsForSession(ctx.hippoRoot, ctx.tenantId, sessionId);
44
+ line(`closed ${closed} active snapshot(s) for session ${sessionId}`);
45
+ }
46
+ else {
47
+ line('skip: no session_id in SessionEnd payload, active snapshot left untouched');
48
+ }
49
+ }
50
+ catch (err) {
51
+ line(`snapshot close failed: ${errorMessage(err)}`);
52
+ }
53
+ }
54
+ /** Books the ending session's re-reads in each store its ledger rows can land in (`ctx.hippoRoot` and global); returns the log lines. */
55
+ export async function bookSessionRereads(ctx, transcriptPath, sessionId) {
56
+ if (!transcriptPath || !sessionId)
57
+ return [];
58
+ let read;
59
+ try {
60
+ read = await readApiCalls(transcriptPath);
61
+ }
62
+ catch (err) {
63
+ return [`skip re-read count: cannot read the transcript: ${errorMessage(err)}`];
64
+ }
65
+ const roots = new Set([ctx.hippoRoot, getGlobalRoot()].filter((root) => isInitialized(root)).map((root) => path.resolve(root)));
66
+ const lines = [];
67
+ let tokens = 0;
68
+ for (const root of roots) {
69
+ try {
70
+ tokens += recordRereads(root, ctx.tenantId, sessionId, read.calls);
71
+ }
72
+ catch (err) {
73
+ lines.push(`re-read count failed: ${errorMessage(err)}`);
74
+ }
75
+ }
76
+ const skipped = read.malformed > 0 ? `, ${read.malformed} unparsable transcript lines skipped` : '';
77
+ lines.push(`re-read ${tokens} tokens over ${read.calls.length} model calls for session ${sessionId}${skipped}`);
78
+ return lines;
79
+ }
80
+ /** The block a compaction lost: the fresh task snapshot and its session trail, or null with none or another session's snapshot. */
81
+ export function compactResumeBlock(ctx, payloadSessionId) {
82
+ const snapshot = loadFreshActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId, { maxAgeMs: COMPACT_RESUME_MAX_AGE_MS });
83
+ // Concurrent sessions must not cross-restore: only when both ids are present and differ, so a manual run with no payload id still prints.
84
+ if (!snapshot || (payloadSessionId !== null && snapshot.session_id !== null && payloadSessionId !== snapshot.session_id))
85
+ return null;
86
+ // A bad trail row costs the trail, not the snapshot; stderr stays out of the model's context.
87
+ let events = [];
88
+ try {
89
+ if (snapshot.session_id) {
90
+ events = listSessionEvents(ctx.hippoRoot, ctx.tenantId, { session_id: snapshot.session_id }).map((e) => ({
91
+ ...e,
92
+ content: truncateCodePointSafe(e.content, COMPACT_RESUME_EVENT_CONTENT_CAP),
93
+ }));
94
+ }
95
+ }
96
+ catch (err) {
97
+ log.warn(`hippo compact-resume: trail skipped: ${errorMessage(err)}`);
98
+ }
99
+ return compactResumeText(snapshot, events);
100
+ }
101
+ //# sourceMappingURL=session-end.js.map
@@ -1,7 +1,6 @@
1
1
  import { loadAllEntries } from '../store/entry-reads.js';
2
- import { deleteEntry } from '../store/delete-and-batch.js';
3
- import { auditMemories } from '../store/audit.js';
4
- import { autoShare } from '../sharing/shared.js';
2
+ import { auditMemories } from '../core/memory-audit.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;