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,30 +1,25 @@
1
1
  // Store health and admin tool handlers: base rates, status, conflicts, resolve, share and peers.
2
2
  import { evalNow } from '../core/ablation.js';
3
- import { loadStrengthTallies } from '../store/candidates.js';
4
- import { countOpenConflicts, listTouchableConflicts, resolveConflict } from '../store/conflicts.js';
5
- import { shareMemory, listPeers } from '../sharing/shared.js';
6
- import { requireGroup, storeFor } from '../store/index.js';
7
- import { NotFoundError } from '../core/api-errors.js';
8
- import { classifyOriginProject } from '../core/project-identity.js';
9
- import { canTouchScope, passesScopeFilterForRecall, personalScopeOf } from '../store/recall-scope.js';
10
- import { chunked, loadEntriesByIds, readEntry } from '../store/entry-reads.js';
3
+ import { shareMemory, listPeers } from '../sharing/share.js';
4
+ import { ConflictError, NotFoundError } from '../core/api-errors.js';
5
+ import { predictionBaserate } from '../api/predictions.js';
6
+ import { listOpenConflicts, resolveMemoryConflict } from '../api/conflicts.js';
7
+ import { getMemoryStatus, getTouchableMemory } from '../api/memories.js';
11
8
  import { mcpActor } from './protocol.js';
12
9
  import { isJsonString } from '../util/json.js';
13
10
  import { DATE_PREFIX_CHARS } from '../util/token-text.js';
14
11
  const BASERATE_DECIMALS = 3;
15
12
  const NOT_RESOLVED = 'Could not resolve. Check the conflict ID and --keep value.';
16
- /** The scope of memory `id`, null when it has none or does not exist. */
17
- function memoryScope(hippoRoot, id) {
18
- return readEntry(hippoRoot, id)?.scope ?? null;
19
- }
20
13
  export async function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId }) {
21
14
  // Text-only reply, matching the other MCP tools; the group's read writes the audit row, so no surface can skip it.
22
15
  const classTag = String(args.class_tag || '').trim();
23
16
  if (!classTag)
24
17
  return 'No class_tag provided. Usage: pass class_tag matching a class used in past predictions (e.g. "migration-effort").';
25
- const baserate = await requireGroup(storeFor({ hippoRoot, store: ctx?.store }), 'predictions').predictionBaserate(tenantId, classTag, ctx?.actor ?? 'mcp');
18
+ const baserate = await predictionBaserate({ hippoRoot, tenantId, actor: mcpActor(ctx), store: ctx?.store }, classTag);
26
19
  if (baserate.nClosed === 0) {
27
- return `No closed predictions in class "${classTag}" yet. Create one via hippo_predict (or 'hippo predict ...' CLI) and close it with hippo_predict_close once the actual outcome is known. Base rates need closed predictions with numeric actual_value to compute.`;
20
+ return `No closed predictions in class "${classTag}" yet. Create one via hippo_predict (or 'hippo predict ...' CLI) ` +
21
+ `and close it with hippo_predict_close once the actual outcome is known. ` +
22
+ `Base rates need closed predictions with numeric actual_value to compute.`;
28
23
  }
29
24
  const lines = [baserate.summary, ''];
30
25
  lines.push(`n_closed: ${baserate.nClosed}`);
@@ -41,36 +36,21 @@ export async function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId })
41
36
  lines.push(`mae: ${baserate.mae.toFixed(BASERATE_DECIMALS)}`);
42
37
  return lines.join('\n');
43
38
  }
44
- export function runStatusTool({ hippoRoot, config, tenantId }) {
39
+ export function runStatusTool({ ctx, hippoRoot, config, tenantId }) {
45
40
  // honors HIPPO_FAKE_NOW (eval-only; see ablation.ts)
46
- const tallies = loadStrengthTallies(hippoRoot, tenantId, evalNow(), 0.1);
41
+ const tallies = getMemoryStatus({ hippoRoot, tenantId, actor: mcpActor(ctx), store: ctx?.store }, evalNow(), 0.1);
47
42
  const avgStrength = tallies.total > 0 ? (tallies.strengthSum / tallies.total).toFixed(2) : '0';
48
- const conflicts = countOpenConflicts(hippoRoot, tenantId);
49
43
  return [
50
44
  `Memories: ${tallies.total} (${tallies.pinned} pinned, ${tallies.errors} errors)`,
51
45
  `Avg strength: ${avgStrength}`,
52
46
  `At risk (<0.1): ${tallies.atRisk}`,
53
- `Open conflicts: ${conflicts}`,
47
+ `Open conflicts: ${tallies.openConflicts}`,
54
48
  `Half-life default: ${config.defaultHalfLifeDays}d`,
55
49
  ].join('\n');
56
50
  }
57
- /** Pairs whose two rows the caller could recall: its repo or user-global, and no scope it was not asked for. */
58
- function recallablePairs(call, conflicts, project) {
59
- const own = personalScopeOf(mcpActor(call.ctx));
60
- const ids = [...new Set(conflicts.flatMap((c) => [c.memory_a_id, c.memory_b_id]))];
61
- // loadEntriesByIds reads at most one chunk of ids per call.
62
- const rows = new Map(chunked(ids).flatMap((chunk) => loadEntriesByIds(call.hippoRoot, chunk, call.tenantId)).map((row) => [row.id, row]));
63
- const shown = (id) => {
64
- const row = rows.get(id);
65
- return row !== undefined && classifyOriginProject(row.origin_project, project) !== 'cross-project'
66
- && passesScopeFilterForRecall(row.scope ?? null, undefined, own);
67
- };
68
- return conflicts.filter((c) => shown(c.memory_a_id) && shown(c.memory_b_id));
69
- }
70
51
  export function runConflictsTool(call) {
71
52
  const { ctx, hippoRoot, tenantId } = call;
72
- const touchable = listTouchableConflicts(hippoRoot, 'open', tenantId, mcpActor(ctx));
73
- const conflicts = ctx?.project ? recallablePairs(call, touchable, ctx.project) : touchable;
53
+ const conflicts = listOpenConflicts({ hippoRoot, tenantId, actor: mcpActor(ctx), store: ctx?.store }, ctx?.project);
74
54
  if (conflicts.length === 0)
75
55
  return 'No open conflicts.';
76
56
  return conflicts.map((c) => `conflict_${c.id}: ${c.memory_a_id} <-> ${c.memory_b_id} (score=${c.score.toFixed(2)}) — ${c.reason}`).join('\n');
@@ -79,37 +59,34 @@ export function runResolveTool({ args, ctx, hippoRoot, tenantId }) {
79
59
  const conflictId = Number(args.conflict_id);
80
60
  const keepId = String(args.keep || '');
81
61
  const forget = Boolean(args.forget);
82
- // Optional rejectLoser + reason pass straight to resolveConflict, as the CLI's --reject-loser does.
83
62
  const rejectLoser = Boolean(args.rejectLoser);
84
63
  const reason = isJsonString(args.reason) ? args.reason : undefined;
85
64
  if (isNaN(conflictId) || !keepId)
86
65
  return 'Required: conflict_id and keep.';
87
- if (!listTouchableConflicts(hippoRoot, 'open', tenantId, mcpActor(ctx)).some((c) => c.id === conflictId))
88
- return NOT_RESOLVED;
89
- const result = resolveConflict(hippoRoot, conflictId, keepId, forget, tenantId, {
90
- rejectLoserValue: rejectLoser,
91
- reason,
92
- // rejectedBy defaults to 'cli', so name the real actor for the tombstone and audit:
93
- // ctx.actor for HTTP-MCP, 'mcp' for stdio callers, which pass no ctx.
94
- rejectedBy: ctx?.actor ?? 'mcp',
95
- });
96
- if (!result)
97
- return NOT_RESOLVED;
66
+ let loserId;
67
+ try {
68
+ const apiCtx = { hippoRoot, tenantId, actor: mcpActor(ctx), store: ctx?.store };
69
+ ({ loserId } = resolveMemoryConflict(apiCtx, conflictId, { keepId, forget, rejectLoser, reason }));
70
+ }
71
+ catch (err) {
72
+ // A missing, unreachable or settled conflict answers alike, so the reply says nothing of a pair the caller cannot touch.
73
+ if (err instanceof NotFoundError || err instanceof ConflictError)
74
+ return NOT_RESOLVED;
75
+ throw err;
76
+ }
98
77
  const action = rejectLoser ? 'rejected (tombstoned) and removed' : forget ? 'deleted' : 'weakened';
99
- return `Resolved conflict ${conflictId}: kept ${keepId}, ${action} ${result.loserId}`;
78
+ return `Resolved conflict ${conflictId}: kept ${keepId}, ${action} ${loserId}`;
100
79
  }
101
- export function runShareTool({ args, ctx, hippoRoot, tenantId }) {
80
+ export async function runShareTool({ args, ctx, hippoRoot, tenantId }) {
102
81
  const shareId = String(args.id || '');
103
82
  if (!shareId)
104
83
  return 'Required: id (memory ID to share).';
105
84
  const force = Boolean(args.force);
85
+ const actor = mcpActor(ctx);
106
86
  // Checked before shareMemory, whose personal-row refusal would tell another person the id exists.
107
- if (!canTouchScope(mcpActor(ctx), memoryScope(hippoRoot, shareId)))
108
- throw new NotFoundError(`Memory not found: ${shareId}`);
109
- // Pass tenantId so shareMemory's readEntry filters by tenant. Without
110
- // this, a Bearer for tenant A could call hippo_share with tenant B's
111
- // id and copy the row to the global store. The 'Memory not found'
112
- // error matches the cross-tenant deny shape elsewhere in the code.
87
+ await getTouchableMemory({ hippoRoot, tenantId, actor, store: ctx?.store }, shareId);
88
+ // Pass tenantId so shareMemory's readEntry filters by tenant; otherwise a Bearer for tenant A could share tenant B's id to the global store.
89
+ // The 'Memory not found' error matches the cross-tenant deny shape elsewhere.
113
90
  const shared = shareMemory(hippoRoot, shareId, { force, tenantId });
114
91
  if (!shared)
115
92
  return 'Transfer score too low. Use force=true to override.';
@@ -1,4 +1,5 @@
1
1
  // Text the MCP recall and context tools print, and what each printed piece costs the token budget.
2
+ import { truncateWithEllipsis } from '../util/ellipsize.js';
2
3
  import { confidenceLabel } from '../core/memory.js';
3
4
  import { formatHandoffEvidenceLine } from '../core/handoff.js';
4
5
  import { printedTokens } from '../api/context-render.js';
@@ -25,7 +26,7 @@ function handoffLines(h) {
25
26
  }
26
27
  function trailLines(events) {
27
28
  return events.map((e) => {
28
- const preview = e.content.length > MCP_PREVIEW_CHARS ? e.content.slice(0, MCP_PREVIEW_CHARS) + '…' : e.content;
29
+ const preview = truncateWithEllipsis(e.content, MCP_PREVIEW_CHARS, '…');
29
30
  return `- [${e.event_type}] ${preview}`;
30
31
  });
31
32
  }
@@ -111,7 +112,7 @@ export function tailSection(rows) {
111
112
  const lines = ['', '## Fresh tail / substituted summaries'];
112
113
  for (const r of rows) {
113
114
  const tag = r.isSummary ? '[summary]' : '[tail]';
114
- const head = r.content.length > MCP_PREVIEW_CHARS ? r.content.slice(0, MCP_PREVIEW_CHARS) + '…' : r.content;
115
+ const head = truncateWithEllipsis(r.content, MCP_PREVIEW_CHARS, '…');
115
116
  if (r.isSummary && r.substitutedFor && r.substitutedFor.length > 0) {
116
117
  lines.push(`- ${tag} ${r.id} (covers ${r.substitutedFor.length} rows): ${head}`);
117
118
  }
@@ -13,6 +13,7 @@ export type FrameResult = {
13
13
  remainder: FrameRemainder;
14
14
  } | {
15
15
  kind: 'incomplete';
16
+ needs?: number;
16
17
  };
17
18
  export declare function parseFrame(buffer: Buffer): FrameResult;
18
19
  //# sourceMappingURL=framing.d.ts.map
@@ -31,7 +31,7 @@ export function parseFrame(buffer) {
31
31
  return { kind: 'oversize', rest: Buffer.from(trimmed.subarray(Math.min(end, trimmed.length))), remainder: Math.max(0, end - trimmed.length) };
32
32
  }
33
33
  if (trimmed.length < bodyStart + contentLength)
34
- return { kind: 'incomplete' };
34
+ return { kind: 'incomplete', needs: start + bodyStart + contentLength };
35
35
  const body = trimmed.subarray(bodyStart, bodyStart + contentLength).toString('utf-8');
36
36
  return { kind: 'message', body, rest: Buffer.from(trimmed.subarray(bodyStart + contentLength)) };
37
37
  }
@@ -13,11 +13,8 @@ export async function runRememberTool({ args, ctx, hippoRoot, config, tenantId }
13
13
  tags.push('error');
14
14
  if (args.tag)
15
15
  tags.push(String(args.tag));
16
- // Route through api.ts so audit_log captures the caller identity
17
- // uniformly with CLI/REST: the auth-resolved ctx.actor under HTTP-MCP,
18
- // 'mcp' for stdio (no ctx). api.ts.remember writes the memory + audit
19
- // row in one transaction-friendly path; we re-read the entry to surface
20
- // the half-life used in the MCP human-readable response.
16
+ // Route through api/index.ts so audit_log captures the caller identity like CLI/REST: the auth-resolved ctx.actor under HTTP-MCP, 'mcp' for stdio.
17
+ // The entry is re-read to surface the half-life used in the MCP response.
21
18
  const apiCtx = {
22
19
  hippoRoot,
23
20
  tenantId,
@@ -32,7 +29,8 @@ export async function runRememberTool({ args, ctx, hippoRoot, config, tenantId }
32
29
  });
33
30
  const [entry] = await storeFor(apiCtx).entriesByIds([result.id], tenantId);
34
31
  // Auto-sleep runs on hippo.db, so another store skips it.
35
- startAutoSleepIfDue(hippoRoot, tenantId, config.autoSleep, (ctx?.store === undefined || ctx.store.kind === 'sqlite') && ctx?.autoSleep !== false);
32
+ const allowed = (ctx?.store === undefined || ctx.store.kind === 'sqlite') && ctx?.autoSleep !== false;
33
+ startAutoSleepIfDue(hippoRoot, tenantId, config.autoSleep, allowed, ctx?.autoSleepRunner);
36
34
  const halfLife = entry?.half_life_days ?? config.defaultHalfLifeDays;
37
35
  const tagStr = entry?.tags.join(', ') || tags.join(', ') || 'none';
38
36
  const warnings = (result.warnings ?? []).map((w) => `\nWarning: ${w}`).join('');
@@ -44,10 +42,8 @@ export async function runOutcomeTool({ args, ctx, hippoRoot, tenantId }) {
44
42
  const ids = lastRecalledIds.get(clientKey) ?? [];
45
43
  if (ids.length === 0)
46
44
  return 'No recent recalls to apply outcome to.';
47
- // Route through src/api/index.ts so audit_log captures the caller identity
48
- // (auth-resolved ctx.actor under HTTP-MCP, 'mcp' for stdio) and tenant
49
- // scoping is enforced uniformly (same surface as recall/remember).
50
- // outcome() also handles cross-tenant id skip silently.
45
+ // Route through src/api/index.ts so audit_log captures the caller identity (auth-resolved ctx.actor under HTTP-MCP, 'mcp' for stdio) and tenant scoping is
46
+ // uniform; outcome() also skips cross-tenant ids silently.
51
47
  const apiCtx = {
52
48
  hippoRoot,
53
49
  tenantId,
@@ -59,6 +55,7 @@ export async function runOutcomeTool({ args, ctx, hippoRoot, tenantId }) {
59
55
  }
60
56
  export function runLearnTool({ args, ctx, hippoRoot, tenantId }) {
61
57
  const days = Number(args.days) || 7;
58
+ // process.cwd() is the server's repo, not a remote caller's, so api learn refuses all but stdio and a host admin (mcpActor fails closed).
62
59
  const result = apiLearn({ hippoRoot, tenantId, actor: mcpActor(ctx), store: ctx?.store }, { repoPath: process.cwd(), days, profile: MCP_LEARN });
63
60
  if (result.status === 'not-a-repo')
64
61
  return 'No git history found.';
@@ -4,6 +4,7 @@ import { type ResolveProjectIdentityOpts } from '../core/project-identity.js';
4
4
  import { type JsonValue } from '../util/json.js';
5
5
  import type { CallerProject } from '../api/prompt-hook.js';
6
6
  import type { HippoStore } from '../store/index.js';
7
+ import type { AutoSleepRunner } from '../api/auto-sleep.js';
7
8
  /** Same bounded walk as the CLI (ends at home, so HIPPO_HOME wins over ~/.hippo); cwd/opts are the test seam. */
8
9
  export declare function findHippoRoot(cwd?: string, opts?: ResolveProjectIdentityOpts): string | null;
9
10
  interface McpRequest {
@@ -25,51 +26,36 @@ interface McpResponse {
25
26
  };
26
27
  }
27
28
  /** JSON-RPC reply for a request that threw: typed API errors keep their text; anything else is logged and answered generically. */
28
- export declare function mcpErrorResponse<E>(id: McpResponse['id'], err: E, requestId?: string): McpResponse;
29
+ export declare function mcpErrorResponse<E>(id: McpResponse['id'], err: E, requestId?: string, call?: string): McpResponse;
29
30
  export type { McpRequest, McpResponse };
30
- /**
31
- * Optional execution context threaded from a non-stdio transport. When the
32
- * HTTP transport in src/server.ts calls handleMcpRequest, it knows the
33
- * server's bound hippoRoot and the auth-resolved tenantId/actor. Passing
34
- * those through here lets executeTool skip the findHippoRoot() walk and
35
- * the env-based resolveTenantId({}) fallback — both of which would
36
- * otherwise produce the wrong store and the wrong tenant for HTTP callers.
37
- *
38
- * Stdio callers pass nothing; behavior stays unchanged for that path.
39
- */
31
+ /** Optional context from a non-stdio transport (the HTTP server's bound hippoRoot and auth-resolved tenantId/actor), so executeTool skips the
32
+ * findHippoRoot() walk and the env-based resolveTenantId({}) fallback, which would pick the wrong store and tenant for HTTP callers. Stdio passes nothing. */
40
33
  export interface McpContext {
41
34
  hippoRoot: string;
42
35
  tenantId: string;
43
36
  actor: string;
44
- /**
45
- * The caller's role from the HTTP transport's auth. Absent for stdio, which
46
- * is the local operator and runs as admin. Tools must use this rather than
47
- * assuming admin, or a member key over HTTP-MCP would act as admin.
48
- */
49
- role?: 'admin' | 'member';
37
+ /** The caller's authenticated role. Required so no transport can forget it; only stdio, which passes no context, is admin without one. */
38
+ role: 'admin' | 'member';
50
39
  /** Scope grants for the HTTP-MCP caller's key. Absent for stdio (admin, needs none). */
51
40
  scopes?: readonly string[];
52
41
  viaAuthResolver?: true;
53
- /** Set by the HTTP transport for the host's operator; a context without a role is in-process and implies it. */
42
+ /** Set by the HTTP transport for the host's operator; never implied by the role. */
54
43
  hostAdmin?: true;
55
44
  owner?: string;
56
45
  project?: CallerProject;
57
46
  store?: HippoStore;
58
47
  autoSleep?: false;
59
- /**
60
- * Per-client key for state isolation under HTTP-MCP. For stdio: 'stdio-${pid}'
61
- * (one process = one client). For HTTP-SSE / HTTP MCP: hash(bearer + remoteAddr)
62
- * built by src/server.ts when constructing McpContext for the request.
63
- * Optional for backwards compatibility; defaults to `${tenantId}:default`.
64
- */
48
+ /** Set by the HTTP transport so auto-sleep runs off the server's event loop; stdio consolidates in its own process. */
49
+ autoSleepRunner?: AutoSleepRunner;
50
+ /** Per-client key for state isolation under HTTP-MCP: 'stdio-${pid}' for stdio, hash(bearer + remoteAddr) for HTTP (built in src/server/mcp-http.ts);
51
+ * defaults to `${tenantId}:default`. */
65
52
  clientKey?: string;
66
53
  }
67
- /**
68
- * The api-layer actor for a tool call. Stdio (no ctx) is the local operator
69
- * and runs as admin; over HTTP the transport's authenticated role is used, so
70
- * a member key never acts as admin through MCP.
71
- */
54
+ /** The api-layer actor for a tool call. Only stdio passes no context: it is the local operator, host admin. Any context runs as its own role, and an
55
+ * untyped caller that sends none runs as a member, so a missing role fails closed. */
72
56
  export declare function mcpActor(ctx: McpContext | undefined): ApiActor;
57
+ /** Stdio or a host admin: the only callers whose server cwd and git history are their own to read. */
58
+ export declare function ownsServerCwd(ctx: McpContext | undefined): boolean;
73
59
  /** One tool call after the store, config and tenant are resolved; every handler reads the same four. */
74
60
  export interface ToolCall {
75
61
  args: Record<string, JsonValue>;
@@ -1,12 +1,14 @@
1
1
  // MCP wire types, the caller context, and the JSON predicates every tool handler narrows its arguments with.
2
2
  import * as fs from 'fs';
3
3
  import { randomUUID } from 'node:crypto';
4
- import { INTERNAL_ERROR_MESSAGE, mapApiError } from '../util/http-util.js';
4
+ import { mapApiError } from '../api/error-reply.js';
5
+ import { INTERNAL_ERROR_MESSAGE } from '../util/http-util.js';
5
6
  import { errorFields, errorMessage, log } from '../util/log.js';
6
7
  import { currentRequestId } from '../util/request-scope.js';
7
- import { getGlobalRoot } from '../sharing/shared.js';
8
+ import { getGlobalRoot } from '../sharing/global-store.js';
8
9
  import { findHippoStoreDir } from '../core/project-identity.js';
9
- import { isStoreBusy, STORE_BUSY_MESSAGE } from '../db/index.js';
10
+ import { STORE_BUSY_MESSAGE } from '../store/port.js';
11
+ import { isStoreBusy } from '../store/sqlite/busy.js';
10
12
  // ── Find hippo root ──
11
13
  /** Same bounded walk as the CLI (ends at home, so HIPPO_HOME wins over ~/.hippo); cwd/opts are the test seam. */
12
14
  export function findHippoRoot(cwd = process.cwd(), opts) {
@@ -18,32 +20,40 @@ export function findHippoRoot(cwd = process.cwd(), opts) {
18
20
  return fs.existsSync(global) ? global : null;
19
21
  }
20
22
  /** JSON-RPC reply for a request that threw: typed API errors keep their text; anything else is logged and answered generically. */
21
- export function mcpErrorResponse(id, err, requestId = currentRequestId() ?? randomUUID()) {
22
- if (isStoreBusy(err))
23
+ export function mcpErrorResponse(id, err, requestId = currentRequestId() ?? randomUUID(), call) {
24
+ const where = call === undefined ? '' : ` (${call})`;
25
+ if (isStoreBusy(err)) {
26
+ log.warn(`mcp request${where} failed: ${errorMessage(err)}`, { requestId });
23
27
  return { jsonrpc: '2.0', id, error: { code: -32603, message: STORE_BUSY_MESSAGE } };
28
+ }
24
29
  const { status, message } = mapApiError(err);
25
- if (status !== 500)
30
+ if (status !== 500) {
31
+ log.info(`mcp request${where} failed: ${errorMessage(err)}`, { requestId, status });
26
32
  return { jsonrpc: '2.0', id, error: { code: -32603, message } };
27
- log.error(`mcp request failed: ${errorMessage(err)}`, { requestId, ...errorFields(err) });
33
+ }
34
+ log.error(`mcp request${where} failed: ${errorMessage(err)}`, { requestId, ...errorFields(err) });
28
35
  return {
29
36
  jsonrpc: '2.0',
30
37
  id,
31
38
  error: { code: -32603, message: `${INTERNAL_ERROR_MESSAGE} (request id ${requestId})`, data: { requestId } },
32
39
  };
33
40
  }
34
- /**
35
- * The api-layer actor for a tool call. Stdio (no ctx) is the local operator
36
- * and runs as admin; over HTTP the transport's authenticated role is used, so
37
- * a member key never acts as admin through MCP.
38
- */
41
+ /** The api-layer actor for a tool call. Only stdio passes no context: it is the local operator, host admin. Any context runs as its own role, and an
42
+ * untyped caller that sends none runs as a member, so a missing role fails closed. */
39
43
  export function mcpActor(ctx) {
40
- const actor = { subject: ctx?.actor ?? 'mcp', role: ctx?.role ?? 'admin', scopes: ctx?.scopes };
41
- if (ctx?.viaAuthResolver)
44
+ if (ctx === undefined)
45
+ return { subject: 'mcp', role: 'admin', hostAdmin: true };
46
+ const actor = { subject: ctx.actor ?? 'mcp', role: ctx.role === 'admin' ? 'admin' : 'member', scopes: ctx.scopes };
47
+ if (ctx.viaAuthResolver)
42
48
  actor.viaAuthResolver = true;
43
- if (ctx?.role === undefined || ctx.hostAdmin)
49
+ if (ctx.hostAdmin)
44
50
  actor.hostAdmin = true;
45
- if (ctx?.owner !== undefined)
51
+ if (ctx.owner !== undefined)
46
52
  actor.owner = ctx.owner;
47
53
  return actor;
48
54
  }
55
+ /** Stdio or a host admin: the only callers whose server cwd and git history are their own to read. */
56
+ export function ownsServerCwd(ctx) {
57
+ return mcpActor(ctx).hostAdmin === true;
58
+ }
49
59
  //# sourceMappingURL=protocol.js.map
@@ -2,7 +2,7 @@
2
2
  import * as path from 'path';
3
3
  import { fitBudget } from '../search/finalize.js';
4
4
  import { dropHeldCopies, duplicateKey, storedTextKeys } from '../util/same-text.js';
5
- import { retrieve as apiRetrieve, drillDown as apiDrillDown, assemble as apiAssemble, getContext as apiGetContext, buildSuppressionSummary } from '../api/index.js';
5
+ import { retrieve as apiRetrieve, drillDown as apiDrillDown, assemble as apiAssemble, getContext as apiGetContext, } from '../api/index.js';
6
6
  import { autoDetectContext } from '../api/context-auto.js';
7
7
  import { resolveProjectIdentity } from '../core/project-identity.js';
8
8
  import { isSharedStore } from '../core/config.js';
@@ -10,12 +10,14 @@ import { detectAnchoring, hashQueryText, biasHintEnabled, snapshotRing } from '.
10
10
  import { detectAvailabilityBias } from '../api/availability.js';
11
11
  import { estimateTokens } from '../util/token-text.js';
12
12
  import { assembleCost, assembleText, drillCost, drillText } from '../api/context-render.js';
13
- import { mcpActor } from './protocol.js';
13
+ import { mcpActor, ownsServerCwd } from './protocol.js';
14
14
  import { lastRecalledIds, resolveClientKey } from './session-state.js';
15
15
  import { formatContinuityBlock, formatMemories, memoryCost, memoriesReserve, snapshotPiece, handoffPiece, trailPiece, contextCost, tailSection, planningSection, } from './format.js';
16
16
  import { isJsonString } from '../util/json.js';
17
17
  import { parseContextRequest, parseRecallRequest, toolParams } from '../api/recall-request.js';
18
18
  import { noteRecall, sessionRing, shownRecallRows } from '../api/recall-record.js';
19
+ // Candidate pool the MCP recall ranks before the token budget trims what is shown.
20
+ const MCP_RECALL_LIMIT = 50;
19
21
  function detectBiasHints(list, pool, anchorRing, queryHash) {
20
22
  const anchoring = anchorRing ? detectAnchoring(snapshotRing(anchorRing), queryHash, list[0]?.entry.id ?? null) : null;
21
23
  const availability = biasHintEnabled('availability')
@@ -85,14 +87,14 @@ function recallPresenter(budget, options) {
85
87
  const tail = showTail
86
88
  ? dropHeldCopies(tailRows.filter((r) => !shownIds.has(r.id) && !shownKeys.has(duplicateKey(r.content))), (r) => r)
87
89
  : [];
88
- const s = buildSuppressionSummary({
90
+ const s = {
89
91
  totalCandidates: pool.length + droppedByScope,
90
92
  droppedPreRank: droppedByScope + cut.length - list.length, // the bucket CLI and API recall put hidden copies in
91
93
  droppedByBudget: Math.max(0, pool.length - cut.length), // an upper bound: rows that never matched count too
92
94
  summarySubstitutionsAdded: tail.filter((r) => r.isSummary).length,
93
95
  freshTailAdded: tail.filter((r) => r.isFreshTail && !r.isSummary).length,
94
96
  suppressedByInterference: anchoring?.reason === 'memory_dominance' ? 1 : 0,
95
- });
97
+ };
96
98
  // Anchoring is the stronger pull, so it prints first; the Cutoff block sits above the list, where the agent reads it.
97
99
  let text = biasHintSections(anchoring, availability);
98
100
  if (showPlan)
@@ -126,7 +128,7 @@ export async function runRecallTool(call) {
126
128
  // RecallContractError throws reach the MCP caller raw, as mcp-recall-fresh-tail-policy.test.ts pins.
127
129
  await apiRetrieve(apiCtx, {
128
130
  ...recallOpts,
129
- limit: 50,
131
+ limit: MCP_RECALL_LIMIT,
130
132
  mode: config.physics?.enabled !== false ? 'physics' : 'hybrid',
131
133
  // The hint is computed below over the list MCP shows; the window band's copy would emit its audit row twice.
132
134
  suppressAvailabilityHint: true,
@@ -211,10 +213,10 @@ export async function runDrillTool({ args, ctx, hippoRoot, tenantId }) {
211
213
  }
212
214
  return drillText(r);
213
215
  }
214
- // The served store names the project (an HTTP daemon runs from anywhere); the global root names none, so stdio falls back to its launch cwd.
215
- function localProject(hippoRoot) {
216
+ // The served store names the project (an HTTP daemon runs from anywhere); the global root names none, so only an owner of the server cwd falls back to it.
217
+ function localProject(hippoRoot, ownsCwd) {
216
218
  const storeProject = resolveProjectIdentity(path.dirname(path.resolve(hippoRoot)));
217
- return storeProject.name !== '' ? storeProject : resolveProjectIdentity(process.cwd());
219
+ return storeProject.name !== '' || !ownsCwd ? storeProject : resolveProjectIdentity(process.cwd());
218
220
  }
219
221
  export async function runContextTool({ args, ctx, hippoRoot, config, tenantId }) {
220
222
  // Stdio names no project, and the store's folder or the launch cwd is no caller's; HTTP sends X-Hippo-Project.
@@ -226,12 +228,13 @@ export async function runContextTool({ args, ctx, hippoRoot, config, tenantId })
226
228
  return '';
227
229
  if (budget < memoriesReserve(budget))
228
230
  return ''; // not even the heading fits, so nothing prints, as at budget 0
231
+ const ownsCwd = ownsServerCwd(ctx);
229
232
  const result = await apiGetContext({ hippoRoot, tenantId, actor: mcpActor(ctx), store: ctx?.store }, {
230
- // The server's git state is no caller's, so a shared-store caller gets its project's rows without a query.
231
- q: ctx?.project ? undefined : autoDetectContext(),
233
+ // The server's git state is no remote caller's, so a project or remote caller gets rows by strength without a query.
234
+ q: ctx?.project || !ownsCwd ? undefined : autoDetectContext(),
232
235
  budget,
233
236
  exactScope,
234
- currentProject: ctx?.project ?? localProject(hippoRoot),
237
+ currentProject: ctx?.project ?? localProject(hippoRoot, ownsCwd),
235
238
  cost: contextCost,
236
239
  });
237
240
  lastRecalledIds.set(resolveClientKey(ctx), result.entries.map((r) => r.entry.id));
@@ -1,15 +1,7 @@
1
1
  import { type McpContext, type McpRequest, type McpResponse } from './protocol.js';
2
- /**
3
- * Record the memory text a recall or context tool returned. Best-effort: a
4
- * ledger failure never fails the tool call. Other tools are not recorded.
5
- */
2
+ /** Records the memory text a recall or context tool returned; best-effort (a ledger failure never fails the call), other tools are not recorded. */
6
3
  export declare function recordMcpTokens(toolName: string, output: string, ctx?: McpContext): Promise<void>;
7
- /**
8
- * Transport-agnostic MCP dispatcher. Both the stdio loop (below) and the
9
- * HTTP/SSE transport in src/server.ts route every incoming JSON-RPC message
10
- * through this single function. Returns null for notifications (no response
11
- * expected) and a McpResponse otherwise. Errors thrown by `executeTool` are
12
- * the caller's problem — wrap with try/catch on the transport side.
13
- */
4
+ /** Transport-agnostic MCP dispatcher: the stdio loop and the HTTP/SSE transport route every JSON-RPC message through it. Returns null for notifications.
5
+ * Errors thrown by `executeTool` are the caller's problem: wrap with try/catch on the transport side. */
14
6
  export declare function handleMcpRequest(req: McpRequest, ctx?: McpContext): Promise<McpResponse | null>;
15
7
  //# sourceMappingURL=request.d.ts.map
@@ -1,10 +1,11 @@
1
1
  // Transport-agnostic request handling: tool dispatch table, tool execution and the JSON-RPC method switch.
2
2
  import { errorMessage, log } from '../util/log.js';
3
3
  import { STORE_NOT_PORTED_MESSAGE } from '../util/http-util.js';
4
- import { getGlobalRoot, initGlobal } from '../sharing/shared.js';
4
+ import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
5
5
  import { loadConfig } from '../core/config.js';
6
6
  import { resolveTenantId } from '../store/tenant.js';
7
- import { rethrowIfSqliteBlocked, runWithRequestStores } from '../db/index.js';
7
+ import { runWithRequestStores } from '../db/index.js';
8
+ import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
8
9
  import { hasGroup, storeFor } from '../store/index.js';
9
10
  import { estimateTokens } from '../util/token-text.js';
10
11
  import { PACKAGE_VERSION } from '../util/version.js';
@@ -17,12 +18,8 @@ import { runRememberTool, runOutcomeTool, runLearnTool } from './memory-tools.js
17
18
  import { runPredictBaserateTool, runStatusTool, runConflictsTool, runResolveTool, runShareTool, runPeersTool } from './admin-tools.js';
18
19
  import { sharedStoreRefusal } from './shared-gate.js';
19
20
  import { isJsonString, isJsonObject } from '../util/json.js';
20
- /**
21
- * Zero-install first run (`npx -y hippo-memory mcp` with no store anywhere):
22
- * create the global store instead of failing every tool call, and say so on
23
- * stderr (stdout carries the protocol). `hippo init` in a project later adds
24
- * a project store, which then takes precedence.
25
- */
21
+ /** Zero-install first run (`npx -y hippo-memory mcp`, no store anywhere): create the global store instead of failing every tool call, and say so on stderr
22
+ * (stdout carries the protocol). A later `hippo init` project store takes precedence. */
26
23
  function createGlobalStoreOnFirstRun() {
27
24
  initGlobal();
28
25
  const root = getGlobalRoot();
@@ -34,10 +31,7 @@ const MCP_TOKEN_SURFACES = new Map([
34
31
  ['hippo_recall', 'mcp_recall'],
35
32
  ['hippo_context', 'mcp_context'],
36
33
  ]);
37
- /**
38
- * Record the memory text a recall or context tool returned. Best-effort: a
39
- * ledger failure never fails the tool call. Other tools are not recorded.
40
- */
34
+ /** Records the memory text a recall or context tool returned; best-effort (a ledger failure never fails the call), other tools are not recorded. */
41
35
  export async function recordMcpTokens(toolName, output, ctx) {
42
36
  const surface = MCP_TOKEN_SURFACES.get(toolName);
43
37
  if (!surface || !output)
@@ -84,16 +78,12 @@ function runsOn(store, toolName) {
84
78
  return group !== undefined && hasGroup(store, group);
85
79
  }
86
80
  async function executeTool(name, args, ctx) {
87
- // When a transport hands us a context (HTTP path), trust it: the HTTP
88
- // server already resolved hippoRoot from its bound opts and tenantId
89
- // from the Bearer token (or the loopback fallback). The stdio path
90
- // continues to walk from cwd / fall back to the global root, and to
91
- // resolve tenant from HIPPO_TENANT.
81
+ // With a transport context (HTTP), trust it: hippoRoot comes from the server's bound opts and tenantId from the Bearer (or loopback fallback).
82
+ // Stdio walks from cwd / the global root and resolves tenant from HIPPO_TENANT.
92
83
  const hippoRoot = ctx?.hippoRoot ?? findHippoRoot() ?? createGlobalStoreOnFirstRun();
93
84
  const config = loadConfig(hippoRoot);
94
- // Every store read in this server returns to the caller and is
95
- // tenant-isolated. Resolved once per tool call: prefer the transport's
96
- // ctx.tenantId so an HTTP Bearer for tenant B doesn't drop to HIPPO_TENANT.
85
+ // Every store read here is tenant-isolated, resolved once per tool call; prefer the transport's ctx.tenantId so an HTTP Bearer for tenant B
86
+ // does not drop to HIPPO_TENANT.
97
87
  const tenantId = ctx?.tenantId ?? resolveTenantId({});
98
88
  const handler = TOOL_HANDLERS.get(name)?.handler;
99
89
  // handleMcpRequest rejects names missing from TOOLS, so reaching here means TOOLS and this table drifted apart.
@@ -155,13 +145,8 @@ async function callTool(id, params, ctx) {
155
145
  },
156
146
  };
157
147
  }
158
- /**
159
- * Transport-agnostic MCP dispatcher. Both the stdio loop (below) and the
160
- * HTTP/SSE transport in src/server.ts route every incoming JSON-RPC message
161
- * through this single function. Returns null for notifications (no response
162
- * expected) and a McpResponse otherwise. Errors thrown by `executeTool` are
163
- * the caller's problem — wrap with try/catch on the transport side.
164
- */
148
+ /** Transport-agnostic MCP dispatcher: the stdio loop and the HTTP/SSE transport route every JSON-RPC message through it. Returns null for notifications.
149
+ * Errors thrown by `executeTool` are the caller's problem: wrap with try/catch on the transport side. */
165
150
  export async function handleMcpRequest(req, ctx) {
166
151
  const { id, method, params } = req;
167
152
  switch (method) {
@@ -1,13 +1,7 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * Hippo Memory MCP Server
4
- *
5
- * Exposes hippo memory as MCP tools over stdio transport.
6
- * Uses the programmatic API directly (no child process spawning).
7
- *
8
- * Usage: hippo mcp (or npx hippo-memory mcp)
9
- */
10
- export { __resetSessionRecallHistoryMcp } from './session-state.js';
2
+ /** Hippo Memory MCP server: exposes hippo memory as MCP tools over stdio via the programmatic API (no child process). Usage: hippo mcp (or npx hippo-memory
3
+ * mcp). */
4
+ export { _resetSessionRecallHistoryMcpForTests } from './session-state.js';
11
5
  export { findHippoRoot, mcpErrorResponse, type McpRequest, type McpResponse, type McpContext } from './protocol.js';
12
6
  export { handleMcpRequest } from './request.js';
13
7
  export { startStdioLoop } from './stdio.js';
@@ -1,25 +1,14 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * Hippo Memory MCP Server
4
- *
5
- * Exposes hippo memory as MCP tools over stdio transport.
6
- * Uses the programmatic API directly (no child process spawning).
7
- *
8
- * Usage: hippo mcp (or npx hippo-memory mcp)
9
- */
10
- export { __resetSessionRecallHistoryMcp } from './session-state.js';
2
+ /** Hippo Memory MCP server: exposes hippo memory as MCP tools over stdio via the programmatic API (no child process). Usage: hippo mcp (or npx hippo-memory
3
+ * mcp). */
4
+ export { _resetSessionRecallHistoryMcpForTests } from './session-state.js';
11
5
  export { findHippoRoot, mcpErrorResponse } from './protocol.js';
12
6
  export { handleMcpRequest } from './request.js';
13
7
  export { startStdioLoop } from './stdio.js';
14
8
  import { envMcpStdio } from '../util/env.js';
15
9
  import { startStdioLoop } from './stdio.js';
16
- // Auto-start when invoked as the main module (node dist/mcp/server.js or via
17
- // the cli's `import('./mcp/server.js')`). Importing this file from another
18
- // module (e.g. src/server.ts wiring up the HTTP/SSE transport) will NOT
19
- // trigger the stdio loop. The cli imports this file specifically to start
20
- // stdio; that import is also `import.meta.url === main`-equivalent because
21
- // it's executed as the program, so we keep a fallback: if HIPPO_MCP_STDIO=1
22
- // or argv1 ends in /mcp/server.js we start.
10
+ // Auto-start only as the main module (node dist/mcp/server.js or the cli's import('./mcp/server.js')); importing it elsewhere (the HTTP/SSE wiring) must not
11
+ // start stdio. Fallback: HIPPO_MCP_STDIO=1 or argv1 ending in /mcp/server.js also starts it.
23
12
  const isMainModule = (() => {
24
13
  try {
25
14
  const argv1 = process.argv[1] ?? '';
@@ -1,5 +1,5 @@
1
1
  /** Test-only: reset the MCP recall rings. Call from beforeEach. */
2
- export declare function __resetSessionRecallHistoryMcp(): void;
2
+ export declare function _resetSessionRecallHistoryMcpForTests(): void;
3
3
  export declare const lastRecalledIds: Map<string, string[]>;
4
4
  export { autoSleepInFlight } from '../api/auto-sleep.js';
5
5
  export declare function resolveClientKey(ctx: {