hippo-memory 1.69.0 → 1.70.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 (860) hide show
  1. package/README.md +5 -2
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +1 -3
  5. package/dist/agent-memories/claude-code.js +11 -7
  6. package/dist/agent-memories/copilot.js +3 -2
  7. package/dist/agent-memories/files.js +3 -2
  8. package/dist/agent-memories/gemini.js +6 -5
  9. package/dist/agent-memories/keys.js +3 -2
  10. package/dist/agent-memories/legacy.d.ts +2 -2
  11. package/dist/agent-memories/legacy.js +2 -2
  12. package/dist/agent-memories/report.d.ts +1 -1
  13. package/dist/agent-memories/report.js +1 -1
  14. package/dist/agent-memories/source.d.ts +1 -1
  15. package/dist/agent-memories/source.js +6 -5
  16. package/dist/agent-memories/sync.d.ts +1 -1
  17. package/dist/agent-memories/sync.js +24 -33
  18. package/dist/agent-memories/types.d.ts +1 -1
  19. package/dist/api/assemble.d.ts +2 -2
  20. package/dist/api/assemble.js +42 -32
  21. package/dist/api/audit.d.ts +4 -7
  22. package/dist/api/audit.js +6 -20
  23. package/dist/api/auth.d.ts +5 -18
  24. package/dist/api/auth.js +44 -194
  25. package/dist/api/auto-sleep.d.ts +13 -0
  26. package/dist/api/auto-sleep.js +32 -0
  27. package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
  28. package/dist/{availability.js → api/availability.js} +12 -29
  29. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  30. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  31. package/dist/{context-render.js → api/context-render.js} +7 -6
  32. package/dist/api/context-select.d.ts +5 -5
  33. package/dist/api/context-select.js +37 -45
  34. package/dist/api/context-types.d.ts +5 -5
  35. package/dist/api/context.d.ts +2 -4
  36. package/dist/api/context.js +48 -61
  37. package/dist/api/dormant.d.ts +3 -3
  38. package/dist/api/dormant.js +38 -107
  39. package/dist/api/drill-down.d.ts +2 -2
  40. package/dist/api/drill-down.js +37 -65
  41. package/dist/api/forget.d.ts +2 -11
  42. package/dist/api/forget.js +13 -46
  43. package/dist/api/goals.d.ts +1 -1
  44. package/dist/api/goals.js +2 -2
  45. package/dist/api/index.d.ts +26 -0
  46. package/dist/api/index.js +29 -0
  47. package/dist/api/instruction-detect.js +74 -0
  48. package/dist/api/learn.js +63 -55
  49. package/dist/api/ledger-db.d.ts +20 -0
  50. package/dist/api/ledger-db.js +79 -0
  51. package/dist/api/on-store.d.ts +16 -0
  52. package/dist/api/on-store.js +36 -0
  53. package/dist/api/outcome.d.ts +5 -42
  54. package/dist/api/outcome.js +15 -80
  55. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  56. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  57. package/dist/api/promote.d.ts +4 -15
  58. package/dist/api/promote.js +29 -106
  59. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
  60. package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
  61. package/dist/api/quarantine.d.ts +5 -5
  62. package/dist/api/quarantine.js +30 -106
  63. package/dist/api/recall-core.d.ts +4 -0
  64. package/dist/api/recall-core.js +112 -0
  65. package/dist/{recall-history.js → api/recall-history.js} +30 -25
  66. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
  67. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
  68. package/dist/api/recall-record.d.ts +10 -13
  69. package/dist/api/recall-record.js +10 -30
  70. package/dist/api/recall-request.d.ts +2 -2
  71. package/dist/api/recall-request.js +3 -3
  72. package/dist/api/recall-types.d.ts +41 -16
  73. package/dist/api/recall.d.ts +1 -1
  74. package/dist/api/recall.js +39 -37
  75. package/dist/api/remember.d.ts +10 -12
  76. package/dist/api/remember.js +29 -45
  77. package/dist/api/session-owners.d.ts +4 -0
  78. package/dist/api/session-owners.js +17 -0
  79. package/dist/api/sleep-run.d.ts +7 -7
  80. package/dist/api/sleep-run.js +63 -75
  81. package/dist/api/sleep.d.ts +1 -1
  82. package/dist/api/tokens.d.ts +2 -2
  83. package/dist/api/tokens.js +9 -21
  84. package/dist/api/types.d.ts +2 -2
  85. package/dist/api/types.js +1 -1
  86. package/dist/capture/caller-session.d.ts +2 -2
  87. package/dist/capture/caller-session.js +8 -8
  88. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  89. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  90. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  91. package/dist/capture/command.d.ts +1 -1
  92. package/dist/capture/command.js +54 -41
  93. package/dist/capture/compact-resume-caller.d.ts +1 -1
  94. package/dist/capture/compact-resume-caller.js +7 -7
  95. package/dist/capture/compact.d.ts +4 -1
  96. package/dist/capture/compact.js +40 -22
  97. package/dist/capture/compaction-items-caller.d.ts +1 -1
  98. package/dist/capture/compaction-items-caller.js +7 -5
  99. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  100. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  101. package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
  102. package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
  103. package/dist/capture/copilot-transcript.js +1 -1
  104. package/dist/capture/extract.js +2 -2
  105. package/dist/capture/failure-caller.d.ts +2 -2
  106. package/dist/capture/failure-caller.js +6 -6
  107. package/dist/capture/failure-reading.d.ts +2 -5
  108. package/dist/capture/failure-reading.js +11 -12
  109. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  110. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  111. package/dist/capture/pre-compact-caller.d.ts +1 -1
  112. package/dist/capture/pre-compact-caller.js +2 -2
  113. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
  114. package/dist/{session-digest.js → capture/session-digest.js} +17 -23
  115. package/dist/capture/session-end-caller.d.ts +2 -2
  116. package/dist/capture/session-end-caller.js +1 -1
  117. package/dist/capture/session-texts.d.ts +1 -1
  118. package/dist/capture/session-texts.js +5 -5
  119. package/dist/capture/session-worker.js +6 -4
  120. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  121. package/dist/capture/transcript.js +68 -74
  122. package/dist/capture/working-state.d.ts +0 -3
  123. package/dist/capture/working-state.js +7 -7
  124. package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
  125. package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
  126. package/dist/cli/audit.d.ts +2 -2
  127. package/dist/cli/audit.js +77 -72
  128. package/dist/cli/auth.d.ts +2 -1
  129. package/dist/cli/auth.js +18 -20
  130. package/dist/cli/briefs.d.ts +4 -3
  131. package/dist/cli/briefs.js +59 -181
  132. package/dist/cli/card.d.ts +2 -1
  133. package/dist/cli/card.js +25 -23
  134. package/dist/{client.d.ts → cli/client.d.ts} +1 -1
  135. package/dist/{client.js → cli/client.js} +1 -1
  136. package/dist/cli/compact-resume-payload.d.ts +8 -0
  137. package/dist/cli/compact-resume-payload.js +39 -0
  138. package/dist/cli/context.d.ts +2 -13
  139. package/dist/cli/context.js +41 -71
  140. package/dist/cli/continuity.d.ts +6 -5
  141. package/dist/cli/continuity.js +109 -99
  142. package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
  143. package/dist/cli/curate.d.ts +9 -9
  144. package/dist/cli/curate.js +177 -149
  145. package/dist/cli/dag.d.ts +4 -4
  146. package/dist/cli/dag.js +46 -34
  147. package/dist/cli/decisions.d.ts +4 -3
  148. package/dist/cli/decisions.js +108 -218
  149. package/dist/cli/eval.d.ts +1 -3
  150. package/dist/cli/eval.js +43 -31
  151. package/dist/cli/explain.d.ts +1 -1
  152. package/dist/cli/explain.js +35 -19
  153. package/dist/cli/flag-values.d.ts +25 -0
  154. package/dist/cli/flag-values.js +103 -0
  155. package/dist/cli/flags.d.ts +303 -0
  156. package/dist/cli/flags.js +169 -0
  157. package/dist/cli/goals.d.ts +2 -1
  158. package/dist/cli/goals.js +39 -34
  159. package/dist/cli/hook-runtime.d.ts +49 -0
  160. package/dist/cli/hook-runtime.js +155 -0
  161. package/dist/cli/init.d.ts +2 -1
  162. package/dist/cli/init.js +151 -118
  163. package/dist/cli/install-steps.d.ts +7 -0
  164. package/dist/cli/install-steps.js +110 -0
  165. package/dist/cli/last-sleep.d.ts +2 -1
  166. package/dist/cli/last-sleep.js +9 -7
  167. package/dist/cli/maintenance.d.ts +5 -4
  168. package/dist/cli/maintenance.js +31 -27
  169. package/dist/cli/object-verbs.d.ts +40 -0
  170. package/dist/cli/object-verbs.js +65 -0
  171. package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
  172. package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
  173. package/dist/cli/playbooks.d.ts +4 -3
  174. package/dist/cli/playbooks.js +77 -280
  175. package/dist/cli/print.d.ts +18 -0
  176. package/dist/cli/print.js +85 -0
  177. package/dist/cli/projects.d.ts +2 -3
  178. package/dist/cli/projects.js +56 -49
  179. package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
  180. package/dist/cli/quality-repair-once.js +4 -4
  181. package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
  182. package/dist/cli/recall.d.ts +2 -4
  183. package/dist/cli/recall.js +101 -150
  184. package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
  185. package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
  186. package/dist/cli/remember.d.ts +1 -3
  187. package/dist/cli/remember.js +124 -103
  188. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
  189. package/dist/{scheduler.js → cli/scheduler.js} +13 -7
  190. package/dist/cli/serve.d.ts +1 -1
  191. package/dist/cli/serve.js +34 -4
  192. package/dist/cli/session-hooks.d.ts +4 -4
  193. package/dist/cli/session-hooks.js +190 -184
  194. package/dist/cli/setup.d.ts +2 -1
  195. package/dist/cli/setup.js +41 -21
  196. package/dist/cli/shared.d.ts +5 -95
  197. package/dist/cli/shared.js +18 -369
  198. package/dist/cli/slack.d.ts +2 -1
  199. package/dist/cli/slack.js +31 -55
  200. package/dist/cli/sleep-render.d.ts +4 -0
  201. package/dist/cli/sleep-render.js +61 -0
  202. package/dist/cli/sleep.d.ts +2 -8
  203. package/dist/cli/sleep.js +20 -76
  204. package/dist/cli/status.d.ts +3 -3
  205. package/dist/cli/status.js +39 -41
  206. package/dist/{stdin.js → cli/stdin.js} +6 -6
  207. package/dist/cli/transfer.d.ts +4 -4
  208. package/dist/cli/transfer.js +68 -42
  209. package/dist/cli/usage.js +4 -2
  210. package/dist/cli.d.ts +289 -5
  211. package/dist/cli.js +184 -117
  212. package/dist/connectors/dlq.d.ts +44 -0
  213. package/dist/connectors/dlq.js +30 -0
  214. package/dist/connectors/github/backfill.d.ts +1 -1
  215. package/dist/connectors/github/backfill.js +29 -66
  216. package/dist/connectors/github/cli-impl.js +59 -74
  217. package/dist/connectors/github/deletion.d.ts +5 -6
  218. package/dist/connectors/github/deletion.js +18 -52
  219. package/dist/connectors/github/dlq.d.ts +7 -61
  220. package/dist/connectors/github/dlq.js +19 -119
  221. package/dist/connectors/github/ingest.d.ts +2 -31
  222. package/dist/connectors/github/ingest.js +20 -83
  223. package/dist/connectors/github/octokit-client.d.ts +1 -1
  224. package/dist/connectors/github/octokit-client.js +2 -1
  225. package/dist/connectors/github/tenant-routing.d.ts +2 -2
  226. package/dist/connectors/github/tenant-routing.js +10 -36
  227. package/dist/connectors/github/transform.d.ts +1 -1
  228. package/dist/connectors/github/types.d.ts +1 -1
  229. package/dist/connectors/github/types.js +15 -18
  230. package/dist/connectors/github/webhook.d.ts +3 -2
  231. package/dist/connectors/github/webhook.js +84 -87
  232. package/dist/connectors/slack/backfill.d.ts +1 -1
  233. package/dist/connectors/slack/backfill.js +5 -29
  234. package/dist/connectors/slack/deletion.d.ts +4 -7
  235. package/dist/connectors/slack/deletion.js +20 -49
  236. package/dist/connectors/slack/dlq.d.ts +7 -49
  237. package/dist/connectors/slack/dlq.js +25 -118
  238. package/dist/connectors/slack/ingest.d.ts +5 -18
  239. package/dist/connectors/slack/ingest.js +27 -91
  240. package/dist/connectors/slack/signature.js +2 -1
  241. package/dist/connectors/slack/tenant-routing.d.ts +4 -1
  242. package/dist/connectors/slack/tenant-routing.js +13 -14
  243. package/dist/connectors/slack/transform.d.ts +1 -1
  244. package/dist/connectors/slack/types.d.ts +1 -1
  245. package/dist/connectors/slack/types.js +3 -12
  246. package/dist/connectors/slack/web-client.js +2 -2
  247. package/dist/connectors/slack/webhook.d.ts +3 -2
  248. package/dist/connectors/slack/webhook.js +75 -82
  249. package/dist/connectors/slack/workspaces.d.ts +4 -17
  250. package/dist/connectors/slack/workspaces.js +4 -34
  251. package/dist/consolidate/conflicts.d.ts +1 -1
  252. package/dist/consolidate/conflicts.js +4 -4
  253. package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
  254. package/dist/{dag.js → consolidate/dag.js} +60 -81
  255. package/dist/consolidate/decay.d.ts +2 -2
  256. package/dist/consolidate/decay.js +28 -22
  257. package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
  258. package/dist/consolidate/flush-units.d.ts +2 -2
  259. package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
  260. package/dist/consolidate/half-life-migration.js +106 -0
  261. package/dist/consolidate/llm-passes.js +8 -8
  262. package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
  263. package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
  264. package/dist/consolidate/merge.js +57 -54
  265. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  266. package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
  267. package/dist/consolidate/physics-pass.js +46 -46
  268. package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
  269. package/dist/{replay.js → consolidate/replay.js} +2 -2
  270. package/dist/consolidate/run.d.ts +7 -13
  271. package/dist/consolidate/run.js +6 -37
  272. package/dist/consolidate/sleep.d.ts +1 -1
  273. package/dist/consolidate/sleep.js +64 -134
  274. package/dist/{trace.js → consolidate/trace.js} +4 -6
  275. package/dist/consolidate/traces.js +34 -29
  276. package/dist/{ablation.js → core/ablation.js} +1 -1
  277. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  278. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  279. package/dist/{ambient.js → core/ambient.js} +12 -10
  280. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +13 -2
  281. package/dist/{capture-contract.js → core/capture-contract.js} +64 -0
  282. package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
  283. package/dist/{compare.js → core/compare.js} +10 -3
  284. package/dist/{config.d.ts → core/config.d.ts} +6 -6
  285. package/dist/{config.js → core/config.js} +99 -72
  286. package/dist/core/handoff.js +87 -0
  287. package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
  288. package/dist/{memory.d.ts → core/memory.d.ts} +17 -5
  289. package/dist/{memory.js → core/memory.js} +110 -82
  290. package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
  291. package/dist/{physics.js → core/physics.js} +2 -1
  292. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
  293. package/dist/{project-identity.js → core/project-identity.js} +5 -17
  294. package/dist/{project-remote.js → core/project-remote.js} +4 -4
  295. package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
  296. package/dist/{salience.js → core/salience.js} +35 -20
  297. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  298. package/dist/{search/types.js → core/search-types.js} +1 -1
  299. package/dist/core/session-digest-row.d.ts +5 -0
  300. package/dist/core/session-digest-row.js +6 -0
  301. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  302. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
  303. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  304. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  305. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
  306. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
  307. package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
  308. package/dist/db/backup.js +1 -1
  309. package/dist/db/busy.d.ts +18 -1
  310. package/dist/db/busy.js +74 -9
  311. package/dist/db/connect.d.ts +10 -2
  312. package/dist/db/connect.js +43 -10
  313. package/dist/db/index.d.ts +9 -0
  314. package/dist/db/index.js +8 -0
  315. package/dist/db/meta.d.ts +4 -0
  316. package/dist/db/meta.js +11 -1
  317. package/dist/db/migrate.d.ts +8 -1
  318. package/dist/db/migrate.js +25 -30
  319. package/dist/db/migrations/v08.js +1 -1
  320. package/dist/db/migrations/v14.js +39 -35
  321. package/dist/db/migrations/v16.js +29 -26
  322. package/dist/db/migrations/v18.js +6 -5
  323. package/dist/db/migrations/v20.js +4 -2
  324. package/dist/db/migrations/v22.js +39 -36
  325. package/dist/db/migrations/v24.js +27 -22
  326. package/dist/db/migrations/v29.js +37 -32
  327. package/dist/db/migrations/v31.js +36 -31
  328. package/dist/db/migrations/v35.js +1 -1
  329. package/dist/db/migrations/v39.js +1 -1
  330. package/dist/db/migrations/v40.js +15 -14
  331. package/dist/db/migrations/v43.js +7 -6
  332. package/dist/db/migrations/v44.js +1 -1
  333. package/dist/db/migrations/v45.js +1 -1
  334. package/dist/db/migrations/v46.js +1 -1
  335. package/dist/db/migrations/v47.js +1 -1
  336. package/dist/db/migrations/v48.js +1 -1
  337. package/dist/db/migrations/v49.js +1 -1
  338. package/dist/db/migrations/v50.js +8 -7
  339. package/dist/db/migrations/v52.js +1 -1
  340. package/dist/db/open.d.ts +9 -1
  341. package/dist/db/open.js +21 -4
  342. package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
  343. package/dist/{physics-state.js → db/physics-state.js} +9 -16
  344. package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
  345. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
  346. package/dist/db/request-stores.d.ts +15 -2
  347. package/dist/db/request-stores.js +37 -15
  348. package/dist/db/tables.d.ts +2 -0
  349. package/dist/db/tables.js +6 -0
  350. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
  351. package/dist/{vector-store.js → db/vector-store.js} +76 -51
  352. package/dist/db/wal-checkpointer.d.ts +11 -0
  353. package/dist/db/wal-checkpointer.js +92 -0
  354. package/dist/doctor.js +105 -136
  355. package/dist/entry/json-hooks.d.ts +1 -1
  356. package/dist/entry/json-hooks.js +1 -1
  357. package/dist/entry/project-identity.d.ts +1 -1
  358. package/dist/entry/project-identity.js +1 -1
  359. package/dist/entry/session-text.d.ts +3 -3
  360. package/dist/entry/session-text.js +3 -3
  361. package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
  362. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
  363. package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
  364. package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
  365. package/dist/{eval.js → eval/eval.js} +29 -22
  366. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
  367. package/dist/{judgment.js → eval/judgment.js} +4 -9
  368. package/dist/extensions/openclaw-plugin/index.js +1 -2
  369. package/dist/graph/delta.d.ts +3 -2
  370. package/dist/graph/delta.js +9 -23
  371. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
  372. package/dist/{graph-extract.js → graph/extract.js} +37 -52
  373. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
  374. package/dist/{graph-recall.js → graph/recall.js} +55 -36
  375. package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
  376. package/dist/{graph-stream.js → graph/stream.js} +9 -7
  377. package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
  378. package/dist/{graph-view.js → graph/view.js} +127 -167
  379. package/dist/graph/write.d.ts +4 -76
  380. package/dist/graph/write.js +13 -397
  381. package/dist/hooks/codex-session.js +1 -1
  382. package/dist/hooks/codex-wrapper.js +14 -15
  383. package/dist/hooks/copilot.d.ts +1 -8
  384. package/dist/hooks/copilot.js +14 -15
  385. package/dist/{cli → hooks}/hook-blocks.js +1 -1
  386. package/dist/hooks/json-hooks.d.ts +1 -1
  387. package/dist/hooks/json-hooks.js +31 -122
  388. package/dist/hooks/opencode.js +35 -27
  389. package/dist/hooks/shared.d.ts +0 -4
  390. package/dist/hooks/shared.js +1 -5
  391. package/dist/importers/core.d.ts +2 -6
  392. package/dist/importers/core.js +41 -39
  393. package/dist/importers/markdown-parse.d.ts +1 -10
  394. package/dist/importers/markdown-parse.js +2 -19
  395. package/dist/importers/markdown.js +2 -1
  396. package/dist/importers/sources.js +50 -46
  397. package/dist/importers/vault.js +71 -92
  398. package/dist/index.d.ts +22 -22
  399. package/dist/index.js +21 -21
  400. package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
  401. package/dist/{autolearn.js → learn/autolearn.js} +13 -11
  402. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  403. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  404. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  405. package/dist/learn/extract.js +125 -0
  406. package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
  407. package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
  408. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
  409. package/dist/{invalidation.js → learn/invalidation.js} +83 -99
  410. package/dist/mcp/admin-tools.d.ts +1 -1
  411. package/dist/mcp/admin-tools.js +37 -60
  412. package/dist/mcp/format.d.ts +5 -5
  413. package/dist/mcp/format.js +7 -6
  414. package/dist/mcp/framing.d.ts +6 -0
  415. package/dist/mcp/framing.js +11 -3
  416. package/dist/mcp/memory-tools.js +7 -27
  417. package/dist/mcp/protocol.d.ts +6 -10
  418. package/dist/mcp/protocol.js +8 -14
  419. package/dist/mcp/recall-tools.d.ts +2 -2
  420. package/dist/mcp/recall-tools.js +68 -50
  421. package/dist/mcp/request.js +62 -60
  422. package/dist/mcp/server.js +1 -1
  423. package/dist/mcp/session-state.d.ts +1 -2
  424. package/dist/mcp/session-state.js +2 -2
  425. package/dist/mcp/shared-gate.js +1 -1
  426. package/dist/mcp/stdio.js +69 -31
  427. package/dist/mcp/tool-args.js +2 -1
  428. package/dist/mcp/tools.js +2 -2
  429. package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
  430. package/dist/objects/customer-notes.js +112 -0
  431. package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
  432. package/dist/objects/decisions.js +101 -0
  433. package/dist/objects/descriptor.d.ts +52 -0
  434. package/dist/objects/descriptor.js +4 -0
  435. package/dist/objects/fields.d.ts +15 -0
  436. package/dist/objects/fields.js +21 -0
  437. package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
  438. package/dist/objects/incidents.js +130 -0
  439. package/dist/objects/lifecycle.d.ts +27 -0
  440. package/dist/objects/lifecycle.js +96 -0
  441. package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
  442. package/dist/objects/policies.js +189 -0
  443. package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
  444. package/dist/objects/processes.js +146 -0
  445. package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
  446. package/dist/objects/project-briefs.js +255 -0
  447. package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
  448. package/dist/objects/skills.js +156 -0
  449. package/dist/postinstall.js +4 -2
  450. package/dist/predictions/planning-fallacy.d.ts +4 -76
  451. package/dist/predictions/planning-fallacy.js +4 -129
  452. package/dist/rerankers/clef.d.ts +2 -6
  453. package/dist/rerankers/clef.js +27 -47
  454. package/dist/rerankers/cross-encoder.d.ts +0 -7
  455. package/dist/rerankers/cross-encoder.js +15 -23
  456. package/dist/rerankers/index.js +8 -7
  457. package/dist/rerankers/jev.d.ts +1 -4
  458. package/dist/rerankers/jev.js +30 -49
  459. package/dist/rerankers/llm.d.ts +2 -4
  460. package/dist/rerankers/llm.js +33 -50
  461. package/dist/rerankers/outage-warning.d.ts +7 -0
  462. package/dist/rerankers/outage-warning.js +31 -0
  463. package/dist/rerankers/remote.d.ts +3 -0
  464. package/dist/rerankers/remote.js +23 -0
  465. package/dist/rerankers/types.d.ts +1 -1
  466. package/dist/search/as-of.d.ts +1 -1
  467. package/dist/search/bm25-search.d.ts +2 -2
  468. package/dist/search/bm25-search.js +7 -7
  469. package/dist/search/bm25.d.ts +1 -1
  470. package/dist/search/bm25.js +1 -1
  471. package/dist/search/boosts.d.ts +5 -1
  472. package/dist/search/boosts.js +34 -13
  473. package/dist/search/breakdown.d.ts +2 -2
  474. package/dist/search/breakdown.js +2 -1
  475. package/dist/search/explain.d.ts +1 -1
  476. package/dist/search/explain.js +3 -2
  477. package/dist/search/finalize.d.ts +2 -2
  478. package/dist/search/finalize.js +4 -3
  479. package/dist/search/fusion.d.ts +1 -1
  480. package/dist/search/fusion.js +3 -3
  481. package/dist/search/hybrid-score.d.ts +2 -2
  482. package/dist/search/hybrid-score.js +1 -1
  483. package/dist/search/hybrid.d.ts +4 -4
  484. package/dist/search/hybrid.js +11 -8
  485. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  486. package/dist/{multihop.js → search/multihop.js} +7 -5
  487. package/dist/{path-context.js → search/path-context.js} +3 -1
  488. package/dist/search/physics-search.d.ts +4 -4
  489. package/dist/search/physics-search.js +15 -15
  490. package/dist/search/rerank.d.ts +3 -3
  491. package/dist/search/rerank.js +4 -3
  492. package/dist/search/temporal.d.ts +1 -1
  493. package/dist/search/temporal.js +5 -2
  494. package/dist/search/vector.d.ts +3 -3
  495. package/dist/search/vector.js +17 -11
  496. package/dist/server/auth.d.ts +1 -1
  497. package/dist/server/auth.js +26 -18
  498. package/dist/server/boot.d.ts +24 -0
  499. package/dist/server/boot.js +465 -0
  500. package/dist/server/client-ip.d.ts +5 -1
  501. package/dist/server/client-ip.js +18 -6
  502. package/dist/server/cursor.d.ts +1 -1
  503. package/dist/server/cursor.js +2 -3
  504. package/dist/server/deadline.d.ts +13 -0
  505. package/dist/server/deadline.js +45 -0
  506. package/dist/server/key-check-bounds.d.ts +8 -0
  507. package/dist/server/key-check-bounds.js +46 -0
  508. package/dist/server/lifecycle.js +1 -1
  509. package/dist/server/mcp-http.d.ts +1 -4
  510. package/dist/server/mcp-http.js +34 -24
  511. package/dist/server/ready.d.ts +7 -0
  512. package/dist/server/ready.js +38 -0
  513. package/dist/server/request.d.ts +10 -4
  514. package/dist/server/request.js +63 -12
  515. package/dist/server/route-table.d.ts +15 -0
  516. package/dist/server/route-table.js +209 -0
  517. package/dist/server/routes/admin.js +13 -8
  518. package/dist/server/routes/customer-notes.d.ts +5 -5
  519. package/dist/server/routes/customer-notes.js +32 -97
  520. package/dist/server/routes/decisions.d.ts +5 -5
  521. package/dist/server/routes/decisions.js +42 -105
  522. package/dist/server/routes/incidents.d.ts +5 -5
  523. package/dist/server/routes/incidents.js +42 -95
  524. package/dist/server/routes/memories.js +12 -14
  525. package/dist/server/routes/object-routes.d.ts +40 -0
  526. package/dist/server/routes/object-routes.js +80 -0
  527. package/dist/server/routes/policies.d.ts +6 -6
  528. package/dist/server/routes/policies.js +40 -124
  529. package/dist/server/routes/predictions.js +29 -45
  530. package/dist/server/routes/processes.d.ts +5 -5
  531. package/dist/server/routes/processes.js +38 -118
  532. package/dist/server/routes/project-briefs.d.ts +6 -6
  533. package/dist/server/routes/project-briefs.js +38 -110
  534. package/dist/server/routes/recall.js +14 -12
  535. package/dist/server/routes/skills.d.ts +6 -6
  536. package/dist/server/routes/skills.js +37 -125
  537. package/dist/{server-detect.js → server/server-detect.js} +1 -1
  538. package/dist/server/sleep-child.d.ts +2 -0
  539. package/dist/server/sleep-child.js +19 -0
  540. package/dist/server/sleep-offload.d.ts +20 -0
  541. package/dist/server/sleep-offload.js +70 -0
  542. package/dist/server/tls.d.ts +6 -0
  543. package/dist/server/tls.js +24 -0
  544. package/dist/server/types.d.ts +27 -8
  545. package/dist/server/validation.d.ts +3 -4
  546. package/dist/server/validation.js +6 -11
  547. package/dist/server.d.ts +39 -61
  548. package/dist/server.js +24 -568
  549. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
  550. package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
  551. package/dist/{scope.js → sharing/scope.js} +1 -1
  552. package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
  553. package/dist/{shared.js → sharing/shared.js} +100 -77
  554. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  555. package/dist/{ambient-store.js → store/ambient.js} +10 -10
  556. package/dist/store/audit-event.d.ts +11 -5
  557. package/dist/store/audit-event.js +5 -4
  558. package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
  559. package/dist/{audit.js → store/audit.js} +91 -6
  560. package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
  561. package/dist/{auth.js → store/auth.js} +100 -92
  562. package/dist/store/candidates.d.ts +23 -12
  563. package/dist/store/candidates.js +87 -35
  564. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
  565. package/dist/{card-detail.js → store/card-detail.js} +1 -1
  566. package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
  567. package/dist/{store-cards.js → store/cards.js} +85 -146
  568. package/dist/store/compactions.d.ts +78 -0
  569. package/dist/store/compactions.js +93 -0
  570. package/dist/store/conflicts.d.ts +22 -5
  571. package/dist/store/conflicts.js +160 -109
  572. package/dist/store/connectors/github.d.ts +84 -0
  573. package/dist/store/connectors/github.js +180 -0
  574. package/dist/store/connectors/slack.d.ts +69 -0
  575. package/dist/store/connectors/slack.js +177 -0
  576. package/dist/store/dashboard-reads.d.ts +27 -0
  577. package/dist/store/dashboard-reads.js +92 -0
  578. package/dist/store/delete-and-batch.d.ts +20 -24
  579. package/dist/store/delete-and-batch.js +64 -40
  580. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
  581. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
  582. package/dist/store/descendant-page.d.ts +12 -0
  583. package/dist/store/descendant-page.js +99 -0
  584. package/dist/store/diagnostics.d.ts +47 -0
  585. package/dist/store/diagnostics.js +51 -0
  586. package/dist/store/doctor-reads.d.ts +16 -0
  587. package/dist/store/doctor-reads.js +19 -0
  588. package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
  589. package/dist/{dormant.js → store/dormant.js} +151 -6
  590. package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
  591. package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
  592. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  593. package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
  594. package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
  595. package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
  596. package/dist/store/entry-reads.d.ts +46 -7
  597. package/dist/store/entry-reads.js +120 -21
  598. package/dist/store/entry-row.d.ts +8 -2
  599. package/dist/store/entry-row.js +28 -8
  600. package/dist/store/entry-writes.d.ts +33 -4
  601. package/dist/store/entry-writes.js +108 -26
  602. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  603. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  604. package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
  605. package/dist/{goals.js → store/goals.js} +45 -94
  606. package/dist/store/graph-queue.d.ts +29 -0
  607. package/dist/store/graph-queue.js +101 -0
  608. package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
  609. package/dist/{graph/read.js → store/graph-reads.js} +63 -115
  610. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
  611. package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
  612. package/dist/store/graph-view-rows.d.ts +12 -0
  613. package/dist/store/graph-view-rows.js +67 -0
  614. package/dist/store/graph-writes.d.ts +58 -0
  615. package/dist/store/graph-writes.js +256 -0
  616. package/dist/store/half-life.d.ts +34 -0
  617. package/dist/store/half-life.js +77 -0
  618. package/dist/store/handoffs.d.ts +1 -1
  619. package/dist/store/handoffs.js +39 -30
  620. package/dist/store/index-and-stats.d.ts +8 -1
  621. package/dist/store/index-and-stats.js +51 -48
  622. package/dist/store/index.d.ts +4 -0
  623. package/dist/store/index.js +3 -0
  624. package/dist/store/key-audit.d.ts +2 -2
  625. package/dist/store/key-audit.js +4 -4
  626. package/dist/store/key-writes.d.ts +12 -5
  627. package/dist/store/key-writes.js +30 -4
  628. package/dist/store/ledger-turn.d.ts +17 -0
  629. package/dist/store/ledger-turn.js +27 -0
  630. package/dist/store/markdown.d.ts +1 -1
  631. package/dist/store/markdown.js +4 -3
  632. package/dist/store/mirrors.d.ts +5 -7
  633. package/dist/store/mirrors.js +39 -25
  634. package/dist/store/object-types.d.ts +189 -0
  635. package/dist/store/object-types.js +4 -0
  636. package/dist/store/open.d.ts +6 -4
  637. package/dist/store/open.js +24 -23
  638. package/dist/store/planning-fallacy-evidence.d.ts +42 -0
  639. package/dist/store/planning-fallacy-evidence.js +81 -0
  640. package/dist/store/port.d.ts +646 -0
  641. package/dist/store/port.js +17 -0
  642. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
  643. package/dist/{predictions/store.js → store/predictions.js} +52 -67
  644. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  645. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  646. package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +3 -1
  647. package/dist/{raw-archive.js → store/raw-archive.js} +6 -2
  648. package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +2 -2
  649. package/dist/{recall-scope.js → store/recall-scope.js} +3 -3
  650. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
  651. package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
  652. package/dist/store/rejected-values.d.ts +55 -0
  653. package/dist/store/rejected-values.js +162 -0
  654. package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
  655. package/dist/{rejection.js → store/rejection.js} +3 -2
  656. package/dist/store/rows.d.ts +2 -3
  657. package/dist/store/rows.js +18 -11
  658. package/dist/store/search-rows.d.ts +15 -4
  659. package/dist/store/search-rows.js +41 -28
  660. package/dist/store/sessions.d.ts +13 -2
  661. package/dist/store/sessions.js +79 -45
  662. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  663. package/dist/store/sqlite/commit-watch.js +29 -0
  664. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  665. package/dist/store/sqlite/connector-events-group.js +50 -0
  666. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  667. package/dist/store/sqlite/connector-writes-group.js +65 -0
  668. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  669. package/dist/store/sqlite/dag-reads-group.js +45 -0
  670. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  671. package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
  672. package/dist/store/sqlite/error-codec.d.ts +17 -0
  673. package/dist/store/sqlite/error-codec.js +59 -0
  674. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  675. package/dist/store/sqlite/executor-counts.js +11 -0
  676. package/dist/store/sqlite/executor.d.ts +28 -0
  677. package/dist/store/sqlite/executor.js +286 -0
  678. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  679. package/dist/store/sqlite/graph-reads-group.js +18 -0
  680. package/dist/store/sqlite/local.d.ts +21 -0
  681. package/dist/store/sqlite/local.js +38 -0
  682. package/dist/store/sqlite/object-rows.d.ts +102 -0
  683. package/dist/store/sqlite/object-rows.js +218 -0
  684. package/dist/store/sqlite/objects-group.d.ts +20 -0
  685. package/dist/store/sqlite/objects-group.js +314 -0
  686. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  687. package/dist/store/sqlite/predictions-group.js +28 -0
  688. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  689. package/dist/store/sqlite/quarantine-group.js +38 -0
  690. package/dist/store/sqlite/store.d.ts +26 -0
  691. package/dist/store/sqlite/store.js +295 -0
  692. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  693. package/dist/store/sqlite/vector-pack.js +46 -0
  694. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  695. package/dist/store/sqlite/vector-reads-group.js +23 -0
  696. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  697. package/dist/store/sqlite/worker-entry.js +8 -0
  698. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  699. package/dist/store/sqlite/worker-jobs.js +116 -0
  700. package/dist/store/sqlite/worker-ops.d.ts +124 -0
  701. package/dist/store/sqlite/worker-ops.js +82 -0
  702. package/dist/store/sqlite/worker-store.d.ts +8 -0
  703. package/dist/store/sqlite/worker-store.js +76 -0
  704. package/dist/store/summaries.d.ts +2 -11
  705. package/dist/store/summaries.js +17 -44
  706. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  707. package/dist/store/tenant-lookup.d.ts +1 -1
  708. package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
  709. package/dist/{tenant.js → store/tenant.js} +1 -1
  710. package/dist/store/token-ledger-rows.d.ts +61 -0
  711. package/dist/store/token-ledger-rows.js +68 -0
  712. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
  713. package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
  714. package/dist/store/tombstone-checks.d.ts +12 -0
  715. package/dist/store/tombstone-checks.js +31 -0
  716. package/dist/store/usage-reports.d.ts +7 -0
  717. package/dist/store/usage-reports.js +26 -0
  718. package/dist/store/vector-writes.d.ts +10 -3
  719. package/dist/store/vector-writes.js +35 -5
  720. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
  721. package/dist/{working-memory.js → store/working-memory.js} +39 -41
  722. package/dist/support-bundle.d.ts +1 -1
  723. package/dist/support-bundle.js +13 -33
  724. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  725. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  726. package/dist/trust/quarantine.d.ts +4 -0
  727. package/dist/trust/quarantine.js +8 -0
  728. package/dist/trust/reject-flow.d.ts +23 -0
  729. package/dist/trust/reject-flow.js +67 -0
  730. package/dist/util/anthropic-messages.d.ts +31 -0
  731. package/dist/util/anthropic-messages.js +46 -0
  732. package/dist/util/atomic-write.d.ts +3 -0
  733. package/dist/util/atomic-write.js +107 -0
  734. package/dist/util/crash-handlers.d.ts +5 -0
  735. package/dist/util/crash-handlers.js +30 -0
  736. package/dist/{env.d.ts → util/env.d.ts} +15 -2
  737. package/dist/{env.js → util/env.js} +20 -2
  738. package/dist/util/home-path.js +67 -0
  739. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
  740. package/dist/{http-retry.js → util/http-retry.js} +38 -7
  741. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  742. package/dist/{http-util.js → util/http-util.js} +31 -11
  743. package/dist/util/json.d.ts +17 -0
  744. package/dist/util/json.js +25 -0
  745. package/dist/{log.d.ts → util/log.d.ts} +5 -2
  746. package/dist/{log.js → util/log.js} +12 -3
  747. package/dist/util/real-path.d.ts +3 -0
  748. package/dist/util/real-path.js +15 -0
  749. package/dist/util/request-scope.d.ts +27 -0
  750. package/dist/util/request-scope.js +47 -0
  751. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  752. package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
  753. package/dist/util/stored-json.d.ts +9 -0
  754. package/dist/util/stored-json.js +8 -0
  755. package/dist/util/time.d.ts +2 -0
  756. package/dist/util/time.js +3 -0
  757. package/dist/util/token-text.d.ts +18 -0
  758. package/dist/util/token-text.js +23 -0
  759. package/dist/{version.d.ts → util/version.d.ts} +1 -1
  760. package/dist/{version.js → util/version.js} +1 -1
  761. package/extensions/openclaw-plugin/index.ts +1 -5
  762. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  763. package/extensions/openclaw-plugin/package.json +1 -1
  764. package/openclaw.plugin.json +1 -1
  765. package/package.json +2 -2
  766. package/dist/api.d.ts +0 -26
  767. package/dist/api.js +0 -29
  768. package/dist/connectors/github/idempotency.d.ts +0 -19
  769. package/dist/connectors/github/idempotency.js +0 -27
  770. package/dist/connectors/slack/idempotency.d.ts +0 -17
  771. package/dist/connectors/slack/idempotency.js +0 -31
  772. package/dist/customer-notes.js +0 -336
  773. package/dist/db.d.ts +0 -9
  774. package/dist/db.js +0 -8
  775. package/dist/decisions.js +0 -326
  776. package/dist/extract.js +0 -133
  777. package/dist/graph/rows.d.ts +0 -45
  778. package/dist/graph/types.js +0 -11
  779. package/dist/half-life-migration.js +0 -182
  780. package/dist/handoff.js +0 -68
  781. package/dist/home-path.js +0 -24
  782. package/dist/incidents.js +0 -349
  783. package/dist/instruction-detect.js +0 -27
  784. package/dist/json.d.ts +0 -7
  785. package/dist/json.js +0 -11
  786. package/dist/ledger-db.d.ts +0 -10
  787. package/dist/ledger-db.js +0 -42
  788. package/dist/policies.js +0 -434
  789. package/dist/processes.js +0 -371
  790. package/dist/project-briefs.js +0 -523
  791. package/dist/reject-flow.d.ts +0 -69
  792. package/dist/reject-flow.js +0 -260
  793. package/dist/session-owners.d.ts +0 -7
  794. package/dist/session-owners.js +0 -54
  795. package/dist/skills.js +0 -367
  796. package/dist/store/entry-writes-group.d.ts +0 -9
  797. package/dist/store-port.d.ts +0 -262
  798. package/dist/store-port.js +0 -178
  799. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  800. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  801. /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
  802. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  803. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  804. /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
  805. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  806. /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
  807. /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
  808. /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
  809. /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
  810. /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
  811. /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
  812. /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
  813. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  814. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  815. /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
  816. /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
  817. /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
  818. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  819. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  820. /package/dist/{card.d.ts → core/card.d.ts} +0 -0
  821. /package/dist/{card.js → core/card.js} +0 -0
  822. /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
  823. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  824. /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
  825. /package/dist/{physics-config.js → core/physics-config.js} +0 -0
  826. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  827. /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
  828. /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
  829. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  830. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  831. /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
  832. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  833. /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
  834. /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
  835. /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
  836. /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
  837. /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
  838. /package/dist/{rrf.js → search/rrf.js} +0 -0
  839. /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
  840. /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
  841. /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
  842. /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
  843. /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
  844. /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
  845. /package/dist/{yaml.js → store/yaml.js} +0 -0
  846. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  847. /package/dist/{escape.js → util/escape.js} +0 -0
  848. /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
  849. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  850. /package/dist/{keyset.js → util/keyset.js} +0 -0
  851. /package/dist/{same-text.js → util/same-text.js} +0 -0
  852. /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
  853. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  854. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  855. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  856. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  857. /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
  858. /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
  859. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  860. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -1,8 +1,9 @@
1
1
  // Text the MCP recall and context tools print, and what each printed piece costs the token budget.
2
- import { confidenceLabel } from '../memory.js';
3
- import { formatHandoffEvidenceLine } from '../handoff.js';
4
- import { printedTokens } from '../context-render.js';
5
- import { estimateTokens } from '../token-ledger.js';
2
+ import { confidenceLabel } from '../core/memory.js';
3
+ import { formatHandoffEvidenceLine } from '../core/handoff.js';
4
+ import { printedTokens } from '../api/context-render.js';
5
+ import { estimateTokens } from '../util/token-text.js';
6
+ const MCP_PREVIEW_CHARS = 200;
6
7
  // ── Format helpers ──
7
8
  function handoffLines(h) {
8
9
  const lines = [`- Summary: ${h.summary}`];
@@ -24,7 +25,7 @@ function handoffLines(h) {
24
25
  }
25
26
  function trailLines(events) {
26
27
  return events.map((e) => {
27
- const preview = e.content.length > 200 ? e.content.slice(0, 200) + '…' : e.content;
28
+ const preview = e.content.length > MCP_PREVIEW_CHARS ? e.content.slice(0, MCP_PREVIEW_CHARS) + '…' : e.content;
28
29
  return `- [${e.event_type}] ${preview}`;
29
30
  });
30
31
  }
@@ -110,7 +111,7 @@ export function tailSection(rows) {
110
111
  const lines = ['', '## Fresh tail / substituted summaries'];
111
112
  for (const r of rows) {
112
113
  const tag = r.isSummary ? '[summary]' : '[tail]';
113
- const head = r.content.length > 200 ? r.content.slice(0, 200) + '…' : r.content;
114
+ const head = r.content.length > MCP_PREVIEW_CHARS ? r.content.slice(0, MCP_PREVIEW_CHARS) + '…' : r.content;
114
115
  if (r.isSummary && r.substitutedFor && r.substitutedFor.length > 0) {
115
116
  lines.push(`- ${tag} ${r.id} (covers ${r.substitutedFor.length} rows): ${head}`);
116
117
  }
@@ -1,3 +1,5 @@
1
+ /** What of a refused frame has not arrived yet: a byte count when its header declared one, else the rest of its line. */
2
+ export type FrameRemainder = number | 'line';
1
3
  export type FrameResult = {
2
4
  kind: 'message';
3
5
  body: string;
@@ -5,6 +7,10 @@ export type FrameResult = {
5
7
  } | {
6
8
  kind: 'skip';
7
9
  rest: Buffer;
10
+ } | {
11
+ kind: 'oversize';
12
+ rest: Buffer;
13
+ remainder: FrameRemainder;
8
14
  } | {
9
15
  kind: 'incomplete';
10
16
  };
@@ -1,7 +1,9 @@
1
1
  // MCP stdio transport framing: newline-delimited JSON-RPC, no embedded newlines
2
2
  // (https://modelcontextprotocol.io/specification/.../basic/transports#stdio). Legacy LSP-style
3
3
  // `Content-Length` framing is also accepted so a printf-and-pipe smoke test still works.
4
+ import { MAX_BODY_BYTES } from '../util/http-util.js';
4
5
  const HEADER_DELIM = Buffer.from('\r\n\r\n');
6
+ const EMPTY = Buffer.alloc(0);
5
7
  export function parseFrame(buffer) {
6
8
  // Strip leading whitespace/newlines between messages.
7
9
  let start = 0;
@@ -17,13 +19,17 @@ export function parseFrame(buffer) {
17
19
  if (trimmed[0] === 0x43 /* 'C' */ || trimmed[0] === 0x63 /* 'c' */) {
18
20
  const headerEnd = trimmed.indexOf(HEADER_DELIM);
19
21
  if (headerEnd === -1)
20
- return { kind: 'incomplete' };
22
+ return trimmed.length > MAX_BODY_BYTES ? { kind: 'oversize', rest: EMPTY, remainder: 'line' } : { kind: 'incomplete' };
21
23
  const header = trimmed.subarray(0, headerEnd).toString('utf-8');
22
24
  const match = header.match(/Content-Length:\s*(\d+)/i);
23
25
  if (!match)
24
26
  return { kind: 'skip', rest: Buffer.from(trimmed.subarray(headerEnd + 4)) };
25
27
  const contentLength = parseInt(match[1], 10);
26
28
  const bodyStart = headerEnd + 4;
29
+ if (contentLength > MAX_BODY_BYTES) {
30
+ const end = bodyStart + contentLength;
31
+ return { kind: 'oversize', rest: Buffer.from(trimmed.subarray(Math.min(end, trimmed.length))), remainder: Math.max(0, end - trimmed.length) };
32
+ }
27
33
  if (trimmed.length < bodyStart + contentLength)
28
34
  return { kind: 'incomplete' };
29
35
  const body = trimmed.subarray(bodyStart, bodyStart + contentLength).toString('utf-8');
@@ -32,9 +38,11 @@ export function parseFrame(buffer) {
32
38
  // Newline-delimited JSON (MCP spec).
33
39
  const newlineIdx = trimmed.indexOf(0x0a);
34
40
  if (newlineIdx === -1)
35
- return { kind: 'incomplete' };
36
- const line = trimmed.subarray(0, newlineIdx).toString('utf-8').trimEnd();
41
+ return trimmed.length > MAX_BODY_BYTES ? { kind: 'oversize', rest: EMPTY, remainder: 'line' } : { kind: 'incomplete' };
37
42
  const rest = Buffer.from(trimmed.subarray(newlineIdx + 1));
43
+ if (newlineIdx > MAX_BODY_BYTES)
44
+ return { kind: 'oversize', rest, remainder: 0 };
45
+ const line = trimmed.subarray(0, newlineIdx).toString('utf-8').trimEnd();
38
46
  if (!line)
39
47
  return { kind: 'skip', rest };
40
48
  return { kind: 'message', body: line, rest };
@@ -1,13 +1,9 @@
1
1
  // Write-side tool handlers: hippo_remember, hippo_outcome and hippo_learn.
2
- import { log } from '../log.js';
3
- import { storeFor } from '../store-port.js';
4
- import { countCreatedSinceLastSleep } from '../store/index-and-stats.js';
5
- import { consolidate } from '../consolidate/sleep.js';
6
- import { outsideRequestStores, runWithRequestStores, scopedBusyWait } from '../db.js';
7
- import { resolveTenantId } from '../tenant.js';
8
- import { remember as apiRemember, outcome as apiOutcome, learn as apiLearn, MCP_LEARN } from '../api.js';
2
+ import { storeFor } from '../store/index.js';
3
+ import { startAutoSleepIfDue } from '../api/auto-sleep.js';
4
+ import { remember as apiRemember, outcome as apiOutcome, learn as apiLearn, MCP_LEARN } from '../api/index.js';
9
5
  import { mcpActor } from './protocol.js';
10
- import { lastRecalledIds, autoSleepInFlight, resolveClientKey } from './session-state.js';
6
+ import { lastRecalledIds, resolveClientKey } from './session-state.js';
11
7
  export async function runRememberTool({ args, ctx, hippoRoot, config, tenantId }) {
12
8
  const text = String(args.text || '');
13
9
  if (!text)
@@ -35,24 +31,8 @@ export async function runRememberTool({ args, ctx, hippoRoot, config, tenantId }
35
31
  project: ctx?.project,
36
32
  });
37
33
  const [entry] = await storeFor(apiCtx).entriesByIds([result.id], tenantId);
38
- // Auto-sleep: one run per store at a time, triggered by what arrived since the last one.
39
- // Consolidation is host-wide, so only the host tenant's writes may start it. It runs on hippo.db, so another store skips it.
40
- if ((ctx?.store === undefined || ctx.store.kind === 'sqlite') &&
41
- ctx?.autoSleep !== false &&
42
- config.autoSleep.enabled &&
43
- tenantId === resolveTenantId({}) &&
44
- !autoSleepInFlight.has(hippoRoot) &&
45
- countCreatedSinceLastSleep(hippoRoot, tenantId) >= config.autoSleep.threshold) {
46
- autoSleepInFlight.add(hippoRoot);
47
- // Fire-and-forget (never block the response); an unhandled rejection would kill the server, so log it.
48
- // Its own scope: the call's closes a handle the sleep still holds across its pauses, but the caller's lock wait carries over.
49
- const busyWaitMs = scopedBusyWait();
50
- outsideRequestStores(() => runWithRequestStores(() => consolidate(hippoRoot), { busyWaitMs }))
51
- .catch((err) => {
52
- log.error(`auto-sleep consolidate failed (tenant ${tenantId}): ${err instanceof Error ? err.message : String(err)}`);
53
- })
54
- .finally(() => autoSleepInFlight.delete(hippoRoot));
55
- }
34
+ // 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);
56
36
  const halfLife = entry?.half_life_days ?? config.defaultHalfLifeDays;
57
37
  const tagStr = entry?.tags.join(', ') || tags.join(', ') || 'none';
58
38
  const warnings = (result.warnings ?? []).map((w) => `\nWarning: ${w}`).join('');
@@ -64,7 +44,7 @@ export async function runOutcomeTool({ args, ctx, hippoRoot, tenantId }) {
64
44
  const ids = lastRecalledIds.get(clientKey) ?? [];
65
45
  if (ids.length === 0)
66
46
  return 'No recent recalls to apply outcome to.';
67
- // Route through src/api.ts so audit_log captures the caller identity
47
+ // Route through src/api/index.ts so audit_log captures the caller identity
68
48
  // (auth-resolved ctx.actor under HTTP-MCP, 'mcp' for stdio) and tenant
69
49
  // scoping is enforced uniformly (same surface as recall/remember).
70
50
  // outcome() also handles cross-tenant id skip silently.
@@ -1,9 +1,9 @@
1
- import { loadConfig } from '../config.js';
2
- import type { Actor as ApiActor } from '../api.js';
3
- import { type ResolveProjectIdentityOpts } from '../project-identity.js';
4
- import type { JsonValue } from '../json.js';
5
- import type { CallerProject } from '../prompt-hook.js';
6
- import type { HippoStore } from '../store-port.js';
1
+ import { loadConfig } from '../core/config.js';
2
+ import type { Actor as ApiActor } from '../api/index.js';
3
+ import { type ResolveProjectIdentityOpts } from '../core/project-identity.js';
4
+ import { type JsonValue } from '../util/json.js';
5
+ import type { CallerProject } from '../api/prompt-hook.js';
6
+ import type { HippoStore } from '../store/index.js';
7
7
  /** Same bounded walk as the CLI (ends at home, so HIPPO_HOME wins over ~/.hippo); cwd/opts are the test seam. */
8
8
  export declare function findHippoRoot(cwd?: string, opts?: ResolveProjectIdentityOpts): string | null;
9
9
  interface McpRequest {
@@ -70,10 +70,6 @@ export interface McpContext {
70
70
  * a member key never acts as admin through MCP.
71
71
  */
72
72
  export declare function mcpActor(ctx: McpContext | undefined): ApiActor;
73
- export declare function isJsonBoolean(v: JsonValue | undefined): v is boolean;
74
- export declare function isJsonObjectRecord(v: JsonValue | undefined): v is {
75
- [key: string]: JsonValue;
76
- };
77
73
  /** One tool call after the store, config and tenant are resolved; every handler reads the same four. */
78
74
  export interface ToolCall {
79
75
  args: Record<string, JsonValue>;
@@ -1,11 +1,12 @@
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 '../http-util.js';
5
- import { log } from '../log.js';
6
- import { getGlobalRoot } from '../shared.js';
7
- import { findHippoStoreDir } from '../project-identity.js';
8
- import { isStoreBusy, STORE_BUSY_MESSAGE } from '../db.js';
4
+ import { INTERNAL_ERROR_MESSAGE, mapApiError } from '../util/http-util.js';
5
+ import { errorFields, errorMessage, log } from '../util/log.js';
6
+ import { currentRequestId } from '../util/request-scope.js';
7
+ import { getGlobalRoot } from '../sharing/shared.js';
8
+ import { findHippoStoreDir } from '../core/project-identity.js';
9
+ import { isStoreBusy, STORE_BUSY_MESSAGE } from '../db/index.js';
9
10
  // ── Find hippo root ──
10
11
  /** Same bounded walk as the CLI (ends at home, so HIPPO_HOME wins over ~/.hippo); cwd/opts are the test seam. */
11
12
  export function findHippoRoot(cwd = process.cwd(), opts) {
@@ -17,13 +18,13 @@ export function findHippoRoot(cwd = process.cwd(), opts) {
17
18
  return fs.existsSync(global) ? global : null;
18
19
  }
19
20
  /** JSON-RPC reply for a request that threw: typed API errors keep their text; anything else is logged and answered generically. */
20
- export function mcpErrorResponse(id, err, requestId = randomUUID()) {
21
+ export function mcpErrorResponse(id, err, requestId = currentRequestId() ?? randomUUID()) {
21
22
  if (isStoreBusy(err))
22
23
  return { jsonrpc: '2.0', id, error: { code: -32603, message: STORE_BUSY_MESSAGE } };
23
24
  const { status, message } = mapApiError(err);
24
25
  if (status !== 500)
25
26
  return { jsonrpc: '2.0', id, error: { code: -32603, message } };
26
- log.error(`mcp request failed: ${err instanceof Error ? err.message : String(err)}`, { requestId });
27
+ log.error(`mcp request failed: ${errorMessage(err)}`, { requestId, ...errorFields(err) });
27
28
  return {
28
29
  jsonrpc: '2.0',
29
30
  id,
@@ -45,11 +46,4 @@ export function mcpActor(ctx) {
45
46
  actor.owner = ctx.owner;
46
47
  return actor;
47
48
  }
48
- // ── JSON-ish domain type for untrusted MCP tool-call arguments ──
49
- export function isJsonBoolean(v) {
50
- return typeof v === 'boolean';
51
- }
52
- export function isJsonObjectRecord(v) {
53
- return v !== undefined && v !== null && typeof v === 'object' && !Array.isArray(v);
54
- }
55
49
  //# sourceMappingURL=protocol.js.map
@@ -1,6 +1,6 @@
1
1
  import { type ToolCall } from './protocol.js';
2
2
  export declare function runRecallTool(call: ToolCall): Promise<string>;
3
- export declare function runAssembleTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
4
- export declare function runDrillTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
3
+ export declare function runAssembleTool({ args, ctx, hippoRoot, tenantId }: ToolCall): Promise<string>;
4
+ export declare function runDrillTool({ args, ctx, hippoRoot, tenantId }: ToolCall): Promise<string>;
5
5
  export declare function runContextTool({ args, ctx, hippoRoot, config, tenantId }: ToolCall): Promise<string>;
6
6
  //# sourceMappingURL=recall-tools.d.ts.map
@@ -1,23 +1,65 @@
1
1
  // Read-side tool handlers: hippo_recall, hippo_assemble, hippo_drill and hippo_context.
2
2
  import * as path from 'path';
3
3
  import { fitBudget } from '../search/finalize.js';
4
- import { dropHeldCopies, duplicateKey, storedTextKeys } from '../same-text.js';
5
- import { retrieve as apiRetrieve, drillDown as apiDrillDown, assemble as apiAssemble, getContext as apiGetContext, buildSuppressionSummary } from '../api.js';
6
- import { autoDetectContext } from '../context-auto.js';
7
- import { resolveProjectIdentity } from '../project-identity.js';
8
- import { isSharedStore } from '../config.js';
9
- import { detectAnchoring, hashQueryText, biasHintEnabled, snapshotRing } from '../recall-history.js';
10
- import { detectAvailabilityBias } from '../availability.js';
11
- import { estimateTokens } from '../token-ledger.js';
12
- import { assembleCost, assembleText, drillCost, drillText } from '../context-render.js';
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';
6
+ import { autoDetectContext } from '../api/context-auto.js';
7
+ import { resolveProjectIdentity } from '../core/project-identity.js';
8
+ import { isSharedStore } from '../core/config.js';
9
+ import { detectAnchoring, hashQueryText, biasHintEnabled, snapshotRing } from '../api/recall-history.js';
10
+ import { detectAvailabilityBias } from '../api/availability.js';
11
+ import { estimateTokens } from '../util/token-text.js';
12
+ import { assembleCost, assembleText, drillCost, drillText } from '../api/context-render.js';
13
13
  import { mcpActor } 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
- import { isJsonString } from '../json.js';
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
- /** Builds the showRanked callback that renders the list MCP shows, parks the render in `out` and hands back its hint rows. */
20
- function recallPresenter(budget, includeContinuity, anchorRing, queryHash, out, hintRows) {
19
+ function detectBiasHints(list, pool, anchorRing, queryHash) {
20
+ const anchoring = anchorRing ? detectAnchoring(snapshotRing(anchorRing), queryHash, list[0]?.entry.id ?? null) : null;
21
+ const availability = biasHintEnabled('availability')
22
+ ? detectAvailabilityBias({
23
+ topK: list.map((r) => ({ id: r.entry.id, created: r.entry.created })),
24
+ pool: pool.map((e) => ({ id: e.id, created: e.created })),
25
+ })
26
+ : null;
27
+ return { anchoring, availability };
28
+ }
29
+ function biasHintSections(anchoring, availability) {
30
+ let text = anchoring ? `## Anchoring hint\n${anchoring.summary}\n[anchored_on: ${anchoring.memoryId}]\n\n---\n\n` : '';
31
+ if (availability)
32
+ text += `## Availability bias\n${availability.summary}\n\n---\n\n`;
33
+ return text;
34
+ }
35
+ function cutoffSection(s, shown) {
36
+ const cutoffClauses = [];
37
+ if (s.droppedByBudget > 0)
38
+ cutoffClauses.push(`${s.droppedByBudget} dropped to fit limit`);
39
+ if (s.droppedPreRank > 0)
40
+ cutoffClauses.push(`${s.droppedPreRank} filtered pre-rank`);
41
+ if (s.summarySubstitutionsAdded > 0)
42
+ cutoffClauses.push(`${s.summarySubstitutionsAdded} summary substitutions added`);
43
+ if (s.freshTailAdded > 0)
44
+ cutoffClauses.push(`${s.freshTailAdded} fresh-tail added`);
45
+ if (s.suppressedByInterference > 0)
46
+ cutoffClauses.push(`${s.suppressedByInterference} suppressed by interference`);
47
+ if (cutoffClauses.length === 0)
48
+ return '';
49
+ return `## Cutoff\nShowing ${shown} of ${s.totalCandidates} candidates; ${cutoffClauses.join('; ')}.\n\n---\n\n`;
50
+ }
51
+ function renderWithinBudget(ranked, limits, render) {
52
+ let results = fitBudget(ranked, Math.max(0, limits.room), 1, memoryCost);
53
+ let rendered = render(results);
54
+ // The hints, Cutoff block and heading vary with the list, so the lowest-ranked entry goes until the whole response fits.
55
+ while (results.length > 1 && estimateTokens(rendered.text) > limits.budget) {
56
+ results = results.slice(0, -1);
57
+ rendered = render(results);
58
+ }
59
+ return rendered;
60
+ }
61
+ function recallPresenter(budget, options) {
62
+ const { includeContinuity, anchorRing, queryHash, out, hintRows } = options;
21
63
  return ({ ranked, pool, droppedByScope }, apiResult) => {
22
64
  // Sections are paid in print order, ahead of the memories and after the heading; one that does not fit is dropped whole.
23
65
  let left = budget - memoriesReserve(budget);
@@ -37,13 +79,7 @@ function recallPresenter(budget, includeContinuity, anchorRing, queryHash, out,
37
79
  // The hints and Cutoff block describe the list MCP shows, not the window band in apiResult.
38
80
  const render = (cut) => {
39
81
  const list = dropHeldCopies(cut, (r) => r.entry); // after every cut, so a merged row cut here never hides its sources
40
- const anchoring = anchorRing ? detectAnchoring(snapshotRing(anchorRing), queryHash, list[0]?.entry.id ?? null) : null;
41
- const availability = biasHintEnabled('availability')
42
- ? detectAvailabilityBias({
43
- topK: list.map((r) => ({ id: r.entry.id, created: r.entry.created })),
44
- pool: pool.map((e) => ({ id: e.id, created: e.created })),
45
- })
46
- : null;
82
+ const { anchoring, availability } = detectBiasHints(list, pool, anchorRing, queryHash);
47
83
  const shownIds = new Set(list.map((r) => r.entry.id));
48
84
  const shownKeys = storedTextKeys(list.map((r) => r.entry));
49
85
  const tail = showTail
@@ -58,36 +94,15 @@ function recallPresenter(budget, includeContinuity, anchorRing, queryHash, out,
58
94
  suppressedByInterference: anchoring?.reason === 'memory_dominance' ? 1 : 0,
59
95
  });
60
96
  // Anchoring is the stronger pull, so it prints first; the Cutoff block sits above the list, where the agent reads it.
61
- let text = anchoring ? `## Anchoring hint\n${anchoring.summary}\n[anchored_on: ${anchoring.memoryId}]\n\n---\n\n` : '';
62
- if (availability)
63
- text += `## Availability bias\n${availability.summary}\n\n---\n\n`;
97
+ let text = biasHintSections(anchoring, availability);
64
98
  if (showPlan)
65
99
  text += planPiece;
66
- const cutoffClauses = [];
67
- if (s.droppedByBudget > 0)
68
- cutoffClauses.push(`${s.droppedByBudget} dropped to fit limit`);
69
- if (s.droppedPreRank > 0)
70
- cutoffClauses.push(`${s.droppedPreRank} filtered pre-rank`);
71
- if (s.summarySubstitutionsAdded > 0)
72
- cutoffClauses.push(`${s.summarySubstitutionsAdded} summary substitutions added`);
73
- if (s.freshTailAdded > 0)
74
- cutoffClauses.push(`${s.freshTailAdded} fresh-tail added`);
75
- if (s.suppressedByInterference > 0)
76
- cutoffClauses.push(`${s.suppressedByInterference} suppressed by interference`);
77
- if (cutoffClauses.length > 0) {
78
- text += `## Cutoff\nShowing ${list.length} of ${s.totalCandidates} candidates; ${cutoffClauses.join('; ')}.\n\n---\n\n`;
79
- }
100
+ text += cutoffSection(s, list.length);
80
101
  // The window band's fresh-tail and summary rows follow the ranked list, or the MCP fields go unanswered.
81
102
  text += formatMemories(list) + tailSection(tail) + (showContinuity ? continuityPiece : '');
82
103
  return { anchoring, availability, text, list };
83
104
  };
84
- let results = fitBudget(ranked, Math.max(0, left), 1, memoryCost);
85
- let rendered = render(results);
86
- // The hints, Cutoff block and heading vary with the list, so the lowest-ranked entry goes until the whole response fits.
87
- while (results.length > 1 && estimateTokens(rendered.text) > budget) {
88
- results = results.slice(0, -1);
89
- rendered = render(results);
90
- }
105
+ const rendered = renderWithinBudget(ranked, { room: left, budget }, render);
91
106
  out.rendered = rendered;
92
107
  return { ids: rendered.list.map((r) => r.entry.id), audit: hintRows(rendered) };
93
108
  };
@@ -117,9 +132,12 @@ export async function runRecallTool(call) {
117
132
  suppressAvailabilityHint: true,
118
133
  keepHeldCopies: true,
119
134
  project: ctx?.project,
120
- showRanked: recallPresenter(budget, includeContinuity, anchorRing, queryHash, out, ({ list, anchoring, availability }) => shownRecallRows(who, {
121
- query, ring: anchorRing, topId: list[0]?.entry.id ?? null, anchoring, availability,
122
- })),
135
+ showRanked: recallPresenter(budget, {
136
+ includeContinuity, anchorRing, queryHash, out,
137
+ hintRows: ({ list, anchoring, availability }) => shownRecallRows(who, {
138
+ query, ring: anchorRing, topId: list[0]?.entry.id ?? null, anchoring, availability,
139
+ }),
140
+ }),
123
141
  });
124
142
  const { rendered } = out;
125
143
  if (!rendered)
@@ -130,7 +148,7 @@ export async function runRecallTool(call) {
130
148
  noteRecall(anchorRing, query, rendered.list[0]?.entry.id ?? null, rendered.anchoring?.memoryId);
131
149
  return rendered.text;
132
150
  }
133
- export function runAssembleTool({ args, ctx, hippoRoot, tenantId }) {
151
+ export async function runAssembleTool({ args, ctx, hippoRoot, tenantId }) {
134
152
  const sessionId = String(args.session_id || '');
135
153
  if (!sessionId)
136
154
  return 'No session_id provided.';
@@ -153,7 +171,7 @@ export function runAssembleTool({ args, ctx, hippoRoot, tenantId }) {
153
171
  assembleExtra.freshTailCount = freshTailCount;
154
172
  if (explicitScope !== undefined)
155
173
  assembleExtra.scope = explicitScope;
156
- const r = apiAssemble(apiCtx, sessionId, {
174
+ const r = await apiAssemble(apiCtx, sessionId, {
157
175
  summarizeOlder,
158
176
  project: ctx?.project,
159
177
  ...assembleExtra,
@@ -161,7 +179,7 @@ export function runAssembleTool({ args, ctx, hippoRoot, tenantId }) {
161
179
  });
162
180
  return assembleText(r);
163
181
  }
164
- export function runDrillTool({ args, ctx, hippoRoot, tenantId }) {
182
+ export async function runDrillTool({ args, ctx, hippoRoot, tenantId }) {
165
183
  const summaryId = String(args.summary_id || '');
166
184
  if (!summaryId)
167
185
  return 'No summary_id provided.';
@@ -182,7 +200,7 @@ export function runDrillTool({ args, ctx, hippoRoot, tenantId }) {
182
200
  drillExtra.budget = budget;
183
201
  if (depth !== undefined)
184
202
  drillExtra.depth = depth;
185
- const r = apiDrillDown(apiCtx, summaryId, { ...drillExtra, project: ctx?.project, cost: drillCost });
203
+ const r = await apiDrillDown(apiCtx, summaryId, { ...drillExtra, project: ctx?.project, cost: drillCost });
186
204
  if ('failure' in r) {
187
205
  // Only not_drillable is caller-actionable. not_found merges cross-tenant, scope-blocked and
188
206
  // missing, because telling scope_blocked apart would leak private-row existence.
@@ -1,22 +1,22 @@
1
1
  // Transport-agnostic request handling: tool dispatch table, tool execution and the JSON-RPC method switch.
2
- import { log } from '../log.js';
3
- import { STORE_NOT_PORTED_MESSAGE } from '../http-util.js';
4
- import { getGlobalRoot, initGlobal } from '../shared.js';
5
- import { loadConfig } from '../config.js';
6
- import { resolveTenantId } from '../tenant.js';
7
- import { rethrowIfSqliteBlocked, runWithRequestStores } from '../db.js';
8
- import { hasGroup, storeFor } from '../store-port.js';
9
- import { estimateTokens } from '../token-ledger.js';
10
- import { PACKAGE_VERSION } from '../version.js';
2
+ import { errorMessage, log } from '../util/log.js';
3
+ import { STORE_NOT_PORTED_MESSAGE } from '../util/http-util.js';
4
+ import { getGlobalRoot, initGlobal } from '../sharing/shared.js';
5
+ import { loadConfig } from '../core/config.js';
6
+ import { resolveTenantId } from '../store/tenant.js';
7
+ import { rethrowIfSqliteBlocked, runWithRequestStores } from '../db/index.js';
8
+ import { hasGroup, storeFor } from '../store/index.js';
9
+ import { estimateTokens } from '../util/token-text.js';
10
+ import { PACKAGE_VERSION } from '../util/version.js';
11
11
  import { validateToolArgs } from './tool-args.js';
12
12
  import { RecallRequestError } from '../api/recall-request.js';
13
- import { findHippoRoot, isJsonObjectRecord } from './protocol.js';
13
+ import { findHippoRoot } from './protocol.js';
14
14
  import { TOOLS, TOOLS_BY_NAME, ARGS_CHECKED_BY_API } from './tools.js';
15
15
  import { runRecallTool, runAssembleTool, runDrillTool, runContextTool } from './recall-tools.js';
16
16
  import { runRememberTool, runOutcomeTool, runLearnTool } from './memory-tools.js';
17
17
  import { runPredictBaserateTool, runStatusTool, runConflictsTool, runResolveTool, runShareTool, runPeersTool } from './admin-tools.js';
18
18
  import { sharedStoreRefusal } from './shared-gate.js';
19
- import { isJsonString } from '../json.js';
19
+ import { isJsonString, isJsonObject } from '../util/json.js';
20
20
  /**
21
21
  * Zero-install first run (`npx -y hippo-memory mcp` with no store anywhere):
22
22
  * create the global store instead of failing every tool call, and say so on
@@ -56,14 +56,14 @@ export async function recordMcpTokens(toolName, output, ctx) {
56
56
  }
57
57
  catch (err) {
58
58
  rethrowIfSqliteBlocked(err);
59
- log.warnThenDebug('mcp-token-ledger', `token ledger write failed; the tool reply is unaffected: ${err instanceof Error ? err.message : String(err)}`);
59
+ log.warnThenDebug('mcp-token-ledger', `token ledger write failed; the tool reply is unaffected: ${errorMessage(err)}`);
60
60
  }
61
61
  }
62
62
  const TOOL_HANDLERS = new Map([
63
63
  ['hippo_recall', { handler: runRecallTool, storeReady: 'base' }],
64
- ['hippo_assemble', { handler: runAssembleTool }],
65
- ['hippo_drill', { handler: runDrillTool }],
66
- ['hippo_predict_baserate', { handler: runPredictBaserateTool }],
64
+ ['hippo_assemble', { handler: runAssembleTool, storeReady: 'dagReads' }],
65
+ ['hippo_drill', { handler: runDrillTool, storeReady: 'dagReads' }],
66
+ ['hippo_predict_baserate', { handler: runPredictBaserateTool, storeReady: 'predictions' }],
67
67
  ['hippo_remember', { handler: runRememberTool, storeReady: 'entryWrites' }],
68
68
  ['hippo_outcome', { handler: runOutcomeTool, storeReady: 'entryWrites' }],
69
69
  ['hippo_context', { handler: runContextTool, storeReady: 'contextReads' }],
@@ -110,6 +110,51 @@ function invalidArgs(id, toolName, problems) {
110
110
  result: { content: [{ type: 'text', text: `Invalid arguments for ${toolName}: ${problems.join('; ')}` }], isError: true },
111
111
  };
112
112
  }
113
+ async function callTool(id, params, ctx) {
114
+ const nameValue = params?.name;
115
+ const toolName = isJsonString(nameValue) ? nameValue : '';
116
+ const tool = TOOLS_BY_NAME.get(toolName);
117
+ if (!tool) {
118
+ return { jsonrpc: '2.0', id, error: { code: -32602, message: `Unknown tool: ${toolName.slice(0, 128)}` } };
119
+ }
120
+ // The same refusal a ported tool gives when it reaches hippo.db, so a client handles one shape.
121
+ const other = otherStore(ctx);
122
+ if (other && !runsOn(other, toolName)) {
123
+ return { jsonrpc: '2.0', id, error: { code: -32603, message: STORE_NOT_PORTED_MESSAGE } };
124
+ }
125
+ const refusal = sharedStoreRefusal(toolName, ctx);
126
+ if (refusal !== undefined)
127
+ return { jsonrpc: '2.0', id, result: { content: [{ type: 'text', text: refusal }], isError: true } };
128
+ const argumentsValue = params?.arguments;
129
+ if (argumentsValue !== undefined && argumentsValue !== null && !isJsonObject(argumentsValue)) {
130
+ return { jsonrpc: '2.0', id, error: { code: -32602, message: `${toolName}: arguments must be an object` } };
131
+ }
132
+ const toolArgs = isJsonObject(argumentsValue) ? argumentsValue : {};
133
+ const problems = validateToolArgs(tool.inputSchema, toolArgs, ARGS_CHECKED_BY_API.get(toolName));
134
+ if (problems.length > 0)
135
+ return invalidArgs(id, toolName, problems);
136
+ let output;
137
+ try {
138
+ // One handle per store for the tool and its ledger row; stdio interleaves calls, so each gets its own scope.
139
+ output = await runWithRequestStores(async () => {
140
+ const text = await executeTool(toolName, toolArgs, ctx);
141
+ await recordMcpTokens(toolName, text, ctx);
142
+ return text;
143
+ });
144
+ }
145
+ catch (err) {
146
+ if (!(err instanceof RecallRequestError))
147
+ throw err;
148
+ return invalidArgs(id, toolName, [err.message]);
149
+ }
150
+ return {
151
+ jsonrpc: '2.0',
152
+ id,
153
+ result: {
154
+ content: [{ type: 'text', text: output || 'Done.' }],
155
+ },
156
+ };
157
+ }
113
158
  /**
114
159
  * Transport-agnostic MCP dispatcher. Both the stdio loop (below) and the
115
160
  * HTTP/SSE transport in src/server.ts route every incoming JSON-RPC message
@@ -136,51 +181,8 @@ export async function handleMcpRequest(req, ctx) {
136
181
  const other = otherStore(ctx);
137
182
  return { jsonrpc: '2.0', id, result: { tools: other ? TOOLS.filter((t) => runsOn(other, t.name)) : TOOLS } };
138
183
  }
139
- case 'tools/call': {
140
- const nameValue = params?.name;
141
- const toolName = isJsonString(nameValue) ? nameValue : '';
142
- const tool = TOOLS_BY_NAME.get(toolName);
143
- if (!tool) {
144
- return { jsonrpc: '2.0', id, error: { code: -32602, message: `Unknown tool: ${toolName.slice(0, 128)}` } };
145
- }
146
- // The same refusal a ported tool gives when it reaches hippo.db, so a client handles one shape.
147
- const other = otherStore(ctx);
148
- if (other && !runsOn(other, toolName)) {
149
- return { jsonrpc: '2.0', id, error: { code: -32603, message: STORE_NOT_PORTED_MESSAGE } };
150
- }
151
- const refusal = sharedStoreRefusal(toolName, ctx);
152
- if (refusal !== undefined)
153
- return { jsonrpc: '2.0', id, result: { content: [{ type: 'text', text: refusal }], isError: true } };
154
- const argumentsValue = params?.arguments;
155
- if (argumentsValue !== undefined && argumentsValue !== null && !isJsonObjectRecord(argumentsValue)) {
156
- return { jsonrpc: '2.0', id, error: { code: -32602, message: `${toolName}: arguments must be an object` } };
157
- }
158
- const toolArgs = isJsonObjectRecord(argumentsValue) ? argumentsValue : {};
159
- const problems = validateToolArgs(tool.inputSchema, toolArgs, ARGS_CHECKED_BY_API.get(toolName));
160
- if (problems.length > 0)
161
- return invalidArgs(id, toolName, problems);
162
- let output;
163
- try {
164
- // One handle per store for the tool and its ledger row; stdio interleaves calls, so each gets its own scope.
165
- output = await runWithRequestStores(async () => {
166
- const text = await executeTool(toolName, toolArgs, ctx);
167
- await recordMcpTokens(toolName, text, ctx);
168
- return text;
169
- });
170
- }
171
- catch (err) {
172
- if (!(err instanceof RecallRequestError))
173
- throw err;
174
- return invalidArgs(id, toolName, [err.message]);
175
- }
176
- return {
177
- jsonrpc: '2.0',
178
- id,
179
- result: {
180
- content: [{ type: 'text', text: output || 'Done.' }],
181
- },
182
- };
183
- }
184
+ case 'tools/call':
185
+ return callTool(id, params, ctx);
184
186
  default:
185
187
  // Notifications (no id) must not receive a response
186
188
  if (method.startsWith('notifications/'))
@@ -11,7 +11,7 @@ export { __resetSessionRecallHistoryMcp } from './session-state.js';
11
11
  export { findHippoRoot, mcpErrorResponse } from './protocol.js';
12
12
  export { handleMcpRequest } from './request.js';
13
13
  export { startStdioLoop } from './stdio.js';
14
- import { envMcpStdio } from '../env.js';
14
+ import { envMcpStdio } from '../util/env.js';
15
15
  import { startStdioLoop } from './stdio.js';
16
16
  // Auto-start when invoked as the main module (node dist/mcp/server.js or via
17
17
  // the cli's `import('./mcp/server.js')`). Importing this file from another
@@ -1,8 +1,7 @@
1
1
  /** Test-only: reset the MCP recall rings. Call from beforeEach. */
2
2
  export declare function __resetSessionRecallHistoryMcp(): void;
3
- export declare const MAX_RECALL_CLIENTS = 4096;
4
3
  export declare const lastRecalledIds: Map<string, string[]>;
5
- export declare const autoSleepInFlight: Set<string>;
4
+ export { autoSleepInFlight } from '../api/auto-sleep.js';
6
5
  export declare function resolveClientKey(ctx: {
7
6
  clientKey?: string;
8
7
  tenantId: string;
@@ -13,7 +13,7 @@ export function __resetSessionRecallHistoryMcp() {
13
13
  // back to `'stdio-${pid}'` (one process = one client) or
14
14
  // `${tenantId}:default` if a McpContext is constructed in tests without a
15
15
  // pid-bound transport.
16
- export const MAX_RECALL_CLIENTS = 4096;
16
+ const MAX_RECALL_CLIENTS = 4096;
17
17
  // The caller names the project half of each key, so a set past the cap drops the client that recalled longest ago.
18
18
  class RecentRecalls extends Map {
19
19
  set(key, ids) {
@@ -26,7 +26,7 @@ class RecentRecalls extends Map {
26
26
  }
27
27
  }
28
28
  export const lastRecalledIds = new RecentRecalls();
29
- export const autoSleepInFlight = new Set();
29
+ export { autoSleepInFlight } from '../api/auto-sleep.js';
30
30
  export function resolveClientKey(ctx) {
31
31
  const base = ctx?.clientKey ? ctx.clientKey : `stdio-${process.pid}:${ctx?.tenantId || 'default'}`;
32
32
  return ctx?.project ? `${base}:${ctx.project.name}` : base;
@@ -1,5 +1,5 @@
1
1
  // Which MCP tools run on a shared store, and which need the caller's project first.
2
- import { isSharedStore } from '../config.js';
2
+ import { isSharedStore } from '../core/config.js';
3
3
  // A shared store holds many repos' rows, so a memory tool needs the caller's project and four tools never run.
4
4
  const OFF_ON_SHARED = new Map([
5
5
  ['hippo_learn', "reads the server's git history"],