hippo-memory 1.70.0 → 1.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-memories/claude-code.d.ts +4 -2
  3. package/dist/agent-memories/claude-code.js +14 -5
  4. package/dist/agent-memories/files.js +23 -12
  5. package/dist/agent-memories/markdown.d.ts +1 -3
  6. package/dist/agent-memories/markdown.js +1 -3
  7. package/dist/agent-memories/report.js +2 -1
  8. package/dist/agent-memories/sync.d.ts +4 -2
  9. package/dist/agent-memories/sync.js +10 -5
  10. package/dist/api/assemble.d.ts +7 -44
  11. package/dist/api/assemble.js +2 -22
  12. package/dist/api/audit.d.ts +5 -1
  13. package/dist/api/audit.js +9 -1
  14. package/dist/api/auth.d.ts +13 -22
  15. package/dist/api/auth.js +34 -24
  16. package/dist/api/auto-sleep.js +2 -2
  17. package/dist/api/availability.d.ts +2 -15
  18. package/dist/api/availability.js +2 -15
  19. package/dist/api/context-select.js +3 -4
  20. package/dist/api/context-types.d.ts +10 -35
  21. package/dist/api/context.d.ts +5 -22
  22. package/dist/api/context.js +21 -38
  23. package/dist/api/dormant.d.ts +5 -21
  24. package/dist/api/dormant.js +7 -26
  25. package/dist/api/drill-down.d.ts +7 -46
  26. package/dist/api/drill-down.js +5 -26
  27. package/dist/api/forget.d.ts +5 -24
  28. package/dist/api/forget.js +5 -28
  29. package/dist/api/graph.d.ts +8 -0
  30. package/dist/api/graph.js +7 -0
  31. package/dist/api/index.d.ts +2 -0
  32. package/dist/api/index.js +2 -0
  33. package/dist/api/instruction-detect.js +16 -5
  34. package/dist/api/ledger-db.d.ts +2 -1
  35. package/dist/api/ledger-db.js +5 -3
  36. package/dist/api/memories.d.ts +5 -0
  37. package/dist/api/memories.js +7 -0
  38. package/dist/api/objects.d.ts +9 -0
  39. package/dist/api/objects.js +11 -0
  40. package/dist/api/on-store.js +5 -3
  41. package/dist/api/predictions.d.ts +9 -0
  42. package/dist/api/predictions.js +18 -0
  43. package/dist/api/promote.d.ts +13 -17
  44. package/dist/api/promote.js +11 -19
  45. package/dist/api/prompt-hook.d.ts +4 -4
  46. package/dist/api/prompt-hook.js +10 -9
  47. package/dist/api/recall-cli.d.ts +55 -0
  48. package/dist/api/recall-cli.js +94 -0
  49. package/dist/api/recall-core.js +14 -6
  50. package/dist/api/recall-finish.d.ts +53 -0
  51. package/dist/api/recall-finish.js +30 -0
  52. package/dist/api/recall-history.d.ts +17 -84
  53. package/dist/api/recall-history.js +15 -88
  54. package/dist/api/recall-pipeline.d.ts +2 -3
  55. package/dist/api/recall-pipeline.js +16 -9
  56. package/dist/api/recall-types.d.ts +64 -304
  57. package/dist/api/recall.d.ts +5 -33
  58. package/dist/api/recall.js +59 -60
  59. package/dist/api/refine.d.ts +7 -0
  60. package/dist/api/refine.js +10 -0
  61. package/dist/api/remember-local.d.ts +57 -0
  62. package/dist/api/remember-local.js +90 -0
  63. package/dist/api/remember.d.ts +18 -1
  64. package/dist/api/remember.js +13 -1
  65. package/dist/api/sleep-run.d.ts +1 -3
  66. package/dist/api/sleep-run.js +17 -21
  67. package/dist/api/sleep.d.ts +9 -28
  68. package/dist/api/tokens.d.ts +3 -10
  69. package/dist/api/tokens.js +3 -10
  70. package/dist/api/types.d.ts +6 -29
  71. package/dist/api/types.js +4 -22
  72. package/dist/capture/command.d.ts +4 -12
  73. package/dist/capture/command.js +6 -22
  74. package/dist/capture/compact.d.ts +4 -15
  75. package/dist/capture/compact.js +16 -25
  76. package/dist/capture/compaction-record.js +101 -69
  77. package/dist/capture/compaction-spool.d.ts +1 -1
  78. package/dist/capture/compaction-spool.js +1 -1
  79. package/dist/capture/session-digest.d.ts +1 -1
  80. package/dist/capture/session-digest.js +13 -7
  81. package/dist/capture/transcript.d.ts +2 -10
  82. package/dist/capture/transcript.js +4 -18
  83. package/dist/cli/api-context.d.ts +3 -0
  84. package/dist/cli/api-context.js +6 -0
  85. package/dist/cli/audit-prune.d.ts +6 -39
  86. package/dist/cli/audit-prune.js +6 -39
  87. package/dist/cli/audit.d.ts +1 -1
  88. package/dist/cli/audit.js +33 -34
  89. package/dist/cli/auth.d.ts +2 -2
  90. package/dist/cli/auth.js +57 -39
  91. package/dist/cli/briefs.d.ts +4 -4
  92. package/dist/cli/briefs.js +18 -22
  93. package/dist/cli/card.d.ts +2 -2
  94. package/dist/cli/card.js +31 -32
  95. package/dist/cli/client.d.ts +7 -27
  96. package/dist/cli/client.js +24 -43
  97. package/dist/cli/compact-resume-payload.js +3 -2
  98. package/dist/cli/context.d.ts +1 -2
  99. package/dist/cli/context.js +12 -8
  100. package/dist/cli/continuity.d.ts +6 -6
  101. package/dist/cli/continuity.js +62 -64
  102. package/dist/cli/correction-latency.d.ts +2 -14
  103. package/dist/cli/correction-latency.js +2 -14
  104. package/dist/cli/curate.d.ts +13 -17
  105. package/dist/cli/curate.js +68 -92
  106. package/dist/cli/dag.d.ts +4 -4
  107. package/dist/cli/dag.js +33 -27
  108. package/dist/cli/decisions.d.ts +4 -4
  109. package/dist/cli/decisions.js +33 -47
  110. package/dist/cli/eval.js +15 -13
  111. package/dist/cli/exit.d.ts +6 -0
  112. package/dist/cli/exit.js +11 -0
  113. package/dist/cli/explain.d.ts +1 -2
  114. package/dist/cli/explain.js +6 -4
  115. package/dist/cli/flag-values.d.ts +6 -1
  116. package/dist/cli/flag-values.js +27 -10
  117. package/dist/cli/flags.d.ts +1 -0
  118. package/dist/cli/flags.js +1 -1
  119. package/dist/cli/github.d.ts +14 -0
  120. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  121. package/dist/cli/goals.d.ts +2 -2
  122. package/dist/cli/goals.js +46 -50
  123. package/dist/cli/hook-runtime.d.ts +9 -27
  124. package/dist/cli/hook-runtime.js +15 -31
  125. package/dist/cli/init.d.ts +2 -2
  126. package/dist/cli/init.js +6 -12
  127. package/dist/cli/install-steps.js +3 -12
  128. package/dist/cli/last-sleep.d.ts +2 -1
  129. package/dist/cli/last-sleep.js +3 -0
  130. package/dist/cli/maintenance.d.ts +4 -4
  131. package/dist/cli/maintenance.js +14 -19
  132. package/dist/cli/object-verbs.js +4 -3
  133. package/dist/cli/owner-validation.d.ts +5 -28
  134. package/dist/cli/owner-validation.js +5 -28
  135. package/dist/cli/playbooks.d.ts +4 -4
  136. package/dist/cli/playbooks.js +23 -28
  137. package/dist/cli/print.d.ts +2 -5
  138. package/dist/cli/print.js +1 -4
  139. package/dist/cli/projects.d.ts +2 -2
  140. package/dist/cli/projects.js +1 -3
  141. package/dist/cli/provenance-coverage.d.ts +2 -6
  142. package/dist/cli/provenance-coverage.js +2 -6
  143. package/dist/cli/quality-repair-once.js +2 -2
  144. package/dist/cli/recall.d.ts +2 -4
  145. package/dist/cli/recall.js +55 -131
  146. package/dist/cli/refine-llm.d.ts +5 -31
  147. package/dist/cli/refine-llm.js +9 -36
  148. package/dist/cli/remember.d.ts +3 -3
  149. package/dist/cli/remember.js +122 -180
  150. package/dist/cli/scheduler.d.ts +2 -17
  151. package/dist/cli/scheduler.js +12 -18
  152. package/dist/cli/serve.js +21 -12
  153. package/dist/cli/session-hooks.d.ts +10 -18
  154. package/dist/cli/session-hooks.js +112 -113
  155. package/dist/cli/setup.d.ts +4 -4
  156. package/dist/cli/setup.js +19 -21
  157. package/dist/cli/shared.d.ts +9 -23
  158. package/dist/cli/shared.js +9 -32
  159. package/dist/cli/slack.d.ts +2 -2
  160. package/dist/cli/slack.js +19 -23
  161. package/dist/cli/sleep.d.ts +3 -2
  162. package/dist/cli/sleep.js +15 -16
  163. package/dist/cli/status.d.ts +9 -12
  164. package/dist/cli/status.js +55 -98
  165. package/dist/cli/stdin.d.ts +4 -6
  166. package/dist/cli/stdin.js +2 -3
  167. package/dist/cli/transfer.d.ts +9 -9
  168. package/dist/cli/transfer.js +66 -89
  169. package/dist/cli/usage.js +11 -5
  170. package/dist/cli.d.ts +66 -448
  171. package/dist/cli.js +87 -263
  172. package/dist/connectors/github/backfill.d.ts +5 -25
  173. package/dist/connectors/github/backfill.js +14 -49
  174. package/dist/connectors/github/deletion.d.ts +4 -18
  175. package/dist/connectors/github/deletion.js +2 -15
  176. package/dist/connectors/github/dlq.d.ts +8 -33
  177. package/dist/connectors/github/dlq.js +12 -29
  178. package/dist/connectors/github/ingest.d.ts +2 -6
  179. package/dist/connectors/github/ingest.js +4 -10
  180. package/dist/connectors/github/octokit-client.d.ts +4 -16
  181. package/dist/connectors/github/octokit-client.js +27 -24
  182. package/dist/connectors/github/ratelimit.d.ts +3 -14
  183. package/dist/connectors/github/ratelimit.js +3 -14
  184. package/dist/connectors/github/scope.d.ts +3 -5
  185. package/dist/connectors/github/scope.js +3 -5
  186. package/dist/connectors/github/signature.d.ts +4 -26
  187. package/dist/connectors/github/signature.js +4 -26
  188. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  189. package/dist/connectors/github/tenant-routing.js +4 -26
  190. package/dist/connectors/github/transform.js +2 -16
  191. package/dist/connectors/github/types.d.ts +3 -15
  192. package/dist/connectors/github/types.js +2 -9
  193. package/dist/connectors/github/webhook.d.ts +2 -16
  194. package/dist/connectors/github/webhook.js +6 -22
  195. package/dist/connectors/slack/backfill.d.ts +4 -17
  196. package/dist/connectors/slack/backfill.js +4 -13
  197. package/dist/connectors/slack/dlq.d.ts +2 -19
  198. package/dist/connectors/slack/dlq.js +2 -19
  199. package/dist/connectors/slack/ingest.d.ts +2 -3
  200. package/dist/connectors/slack/ingest.js +2 -3
  201. package/dist/connectors/slack/scope.d.ts +2 -8
  202. package/dist/connectors/slack/scope.js +2 -8
  203. package/dist/connectors/slack/signature.d.ts +1 -6
  204. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  205. package/dist/connectors/slack/tenant-routing.js +2 -21
  206. package/dist/connectors/slack/transform.d.ts +2 -18
  207. package/dist/connectors/slack/transform.js +2 -18
  208. package/dist/connectors/slack/types.d.ts +3 -9
  209. package/dist/connectors/slack/types.js +2 -4
  210. package/dist/connectors/slack/web-client.js +33 -27
  211. package/dist/connectors/slack/webhook.d.ts +2 -19
  212. package/dist/connectors/slack/webhook.js +5 -26
  213. package/dist/connectors/slack/workspaces.d.ts +4 -24
  214. package/dist/connectors/slack/workspaces.js +4 -24
  215. package/dist/consolidate/conflicts.js +6 -14
  216. package/dist/consolidate/dag-summary.d.ts +8 -0
  217. package/dist/consolidate/dag-summary.js +41 -0
  218. package/dist/consolidate/dag.d.ts +5 -28
  219. package/dist/consolidate/dag.js +14 -75
  220. package/dist/consolidate/decay.js +7 -19
  221. package/dist/consolidate/dedupe.d.ts +6 -52
  222. package/dist/consolidate/dedupe.js +13 -71
  223. package/dist/consolidate/flush-units.d.ts +3 -4
  224. package/dist/consolidate/flush-units.js +3 -3
  225. package/dist/consolidate/half-life-migration.d.ts +3 -26
  226. package/dist/consolidate/half-life-migration.js +11 -28
  227. package/dist/consolidate/llm-passes.js +4 -21
  228. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  229. package/dist/consolidate/memory-value-weights.js +2 -13
  230. package/dist/consolidate/memory-value.d.ts +11 -84
  231. package/dist/consolidate/memory-value.js +16 -104
  232. package/dist/consolidate/merge.js +10 -31
  233. package/dist/consolidate/merged-row.js +2 -1
  234. package/dist/consolidate/physics-pass.js +1 -3
  235. package/dist/consolidate/replay.d.ts +6 -38
  236. package/dist/consolidate/replay.js +14 -52
  237. package/dist/consolidate/run.js +1 -1
  238. package/dist/consolidate/sleep.d.ts +1 -8
  239. package/dist/consolidate/sleep.js +5 -17
  240. package/dist/consolidate/trace.d.ts +3 -18
  241. package/dist/consolidate/trace.js +3 -18
  242. package/dist/consolidate/traces.js +6 -22
  243. package/dist/core/ablation.d.ts +4 -91
  244. package/dist/core/ablation.js +4 -91
  245. package/dist/core/ambient.d.ts +1 -8
  246. package/dist/core/ambient.js +1 -8
  247. package/dist/core/capture-contract.d.ts +4 -2
  248. package/dist/core/capture-contract.js +4 -2
  249. package/dist/core/card.d.ts +4 -1
  250. package/dist/core/card.js +8 -0
  251. package/dist/core/compare.d.ts +11 -67
  252. package/dist/core/compare.js +9 -63
  253. package/dist/core/config.d.ts +10 -24
  254. package/dist/core/config.js +13 -14
  255. package/dist/core/handoff.d.ts +1 -7
  256. package/dist/core/handoff.js +1 -7
  257. package/dist/core/memory-quality.js +1 -1
  258. package/dist/core/memory.d.ts +41 -164
  259. package/dist/core/memory.js +51 -221
  260. package/dist/core/package-root.d.ts +3 -0
  261. package/dist/core/package-root.js +5 -0
  262. package/dist/core/physics-config.d.ts +1 -4
  263. package/dist/core/physics-config.js +3 -8
  264. package/dist/core/physics.d.ts +15 -61
  265. package/dist/core/physics.js +59 -122
  266. package/dist/core/project-identity.d.ts +17 -58
  267. package/dist/core/project-identity.js +17 -38
  268. package/dist/core/project-remote.js +13 -2
  269. package/dist/core/raw-append-only.d.ts +5 -0
  270. package/dist/core/raw-append-only.js +7 -0
  271. package/dist/core/salience.d.ts +1 -7
  272. package/dist/core/salience.js +1 -7
  273. package/dist/dashboard/dashboard-actions.js +2 -2
  274. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  275. package/dist/dashboard/dashboard-snapshot.js +11 -2
  276. package/dist/dashboard/dashboard-types.d.ts +2 -1
  277. package/dist/dashboard/dashboard.d.ts +1 -0
  278. package/dist/dashboard/dashboard.js +50 -4
  279. package/dist/db/busy.d.ts +1 -1
  280. package/dist/db/busy.js +17 -8
  281. package/dist/db/connect.d.ts +1 -0
  282. package/dist/db/connect.js +3 -3
  283. package/dist/db/migrate.js +3 -3
  284. package/dist/db/migrations/types.d.ts +2 -5
  285. package/dist/db/migrations/v14.js +2 -3
  286. package/dist/db/migrations/v15.js +2 -8
  287. package/dist/db/migrations/v16.js +2 -3
  288. package/dist/db/migrations/v17.js +2 -3
  289. package/dist/db/migrations/v19.js +2 -5
  290. package/dist/db/migrations/v20.js +2 -7
  291. package/dist/db/migrations/v22.js +4 -17
  292. package/dist/db/migrations/v23.js +3 -14
  293. package/dist/db/migrations/v24.js +2 -4
  294. package/dist/db/migrations/v25.js +3 -8
  295. package/dist/db/migrations/v26.js +2 -13
  296. package/dist/db/migrations/v27.js +3 -11
  297. package/dist/db/migrations/v28.js +2 -14
  298. package/dist/db/migrations/v29.js +4 -18
  299. package/dist/db/migrations/v30.js +4 -16
  300. package/dist/db/migrations/v31.js +2 -15
  301. package/dist/db/migrations/v32.js +4 -22
  302. package/dist/db/migrations/v33.js +2 -15
  303. package/dist/db/migrations/v34.js +2 -11
  304. package/dist/db/migrations/v35.js +2 -11
  305. package/dist/db/migrations/v36.js +2 -11
  306. package/dist/db/migrations/v37.js +8 -33
  307. package/dist/db/migrations/v38.js +5 -38
  308. package/dist/db/migrations/v39.js +9 -20
  309. package/dist/db/migrations/v40.js +2 -9
  310. package/dist/db/migrations/v41.js +2 -24
  311. package/dist/db/migrations/v43.js +1 -1
  312. package/dist/db/migrations/v44.js +2 -8
  313. package/dist/db/migrations/v45.js +2 -7
  314. package/dist/db/migrations/v47.js +2 -3
  315. package/dist/db/migrations/v51.js +1 -1
  316. package/dist/db/open.d.ts +2 -0
  317. package/dist/db/open.js +17 -1
  318. package/dist/db/physics-state.d.ts +6 -22
  319. package/dist/db/physics-state.js +25 -36
  320. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  321. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  322. package/dist/db/vector-store.d.ts +2 -0
  323. package/dist/db/vector-store.js +8 -1
  324. package/dist/doctor.js +74 -19
  325. package/dist/entry/session-text.js +2 -1
  326. package/dist/eval/eval-stats.d.ts +15 -53
  327. package/dist/eval/eval-stats.js +12 -42
  328. package/dist/eval/eval-suite.d.ts +2 -13
  329. package/dist/eval/eval-suite.js +74 -34
  330. package/dist/eval/eval.d.ts +6 -24
  331. package/dist/eval/eval.js +7 -34
  332. package/dist/eval/judgment.d.ts +0 -3
  333. package/dist/eval/judgment.js +19 -11
  334. package/dist/extensions/openclaw-plugin/index.js +1 -1
  335. package/dist/graph/extract.d.ts +5 -27
  336. package/dist/graph/extract.js +7 -33
  337. package/dist/graph/recall.d.ts +7 -20
  338. package/dist/graph/recall.js +14 -76
  339. package/dist/graph/stream.d.ts +7 -39
  340. package/dist/graph/stream.js +11 -34
  341. package/dist/graph/view.d.ts +9 -35
  342. package/dist/graph/view.js +11 -39
  343. package/dist/hooks/codex-wrapper.js +2 -2
  344. package/dist/hooks/copilot.js +2 -1
  345. package/dist/hooks/hook-blocks.d.ts +6 -2
  346. package/dist/hooks/hook-blocks.js +37 -124
  347. package/dist/hooks/json-hooks.d.ts +4 -36
  348. package/dist/hooks/json-hooks.js +18 -57
  349. package/dist/hooks/opencode.d.ts +0 -38
  350. package/dist/hooks/opencode.js +9 -76
  351. package/dist/hooks/shared.d.ts +8 -17
  352. package/dist/hooks/shared.js +29 -20
  353. package/dist/importers/core.d.ts +12 -37
  354. package/dist/importers/core.js +9 -27
  355. package/dist/importers/markdown-parse.d.ts +8 -22
  356. package/dist/importers/markdown-parse.js +8 -25
  357. package/dist/importers/markdown.js +3 -12
  358. package/dist/importers/sources.js +7 -35
  359. package/dist/importers/vault.d.ts +2 -8
  360. package/dist/importers/vault.js +25 -81
  361. package/dist/index.d.ts +6 -2
  362. package/dist/index.js +6 -2
  363. package/dist/learn/autolearn.d.ts +14 -41
  364. package/dist/learn/autolearn.js +14 -41
  365. package/dist/learn/extract.js +2 -4
  366. package/dist/learn/forward-claim-detector.d.ts +6 -30
  367. package/dist/learn/forward-claim-detector.js +14 -66
  368. package/dist/learn/invalidation.d.ts +6 -18
  369. package/dist/learn/invalidation.js +9 -26
  370. package/dist/mcp/admin-tools.js +3 -5
  371. package/dist/mcp/memory-tools.js +4 -9
  372. package/dist/mcp/protocol.d.ts +8 -26
  373. package/dist/mcp/protocol.js +3 -6
  374. package/dist/mcp/recall-tools.js +3 -3
  375. package/dist/mcp/request.d.ts +3 -11
  376. package/dist/mcp/request.js +10 -26
  377. package/dist/mcp/server.d.ts +3 -9
  378. package/dist/mcp/server.js +5 -16
  379. package/dist/mcp/session-state.d.ts +1 -1
  380. package/dist/mcp/session-state.js +5 -11
  381. package/dist/mcp/stdio.d.ts +2 -6
  382. package/dist/mcp/stdio.js +48 -12
  383. package/dist/mcp/tools.js +5 -3
  384. package/dist/objects/customer-notes.d.ts +7 -42
  385. package/dist/objects/customer-notes.js +7 -48
  386. package/dist/objects/decisions.d.ts +12 -50
  387. package/dist/objects/decisions.js +15 -53
  388. package/dist/objects/incidents.d.ts +7 -38
  389. package/dist/objects/incidents.js +7 -41
  390. package/dist/objects/policies.d.ts +11 -89
  391. package/dist/objects/policies.js +11 -98
  392. package/dist/objects/processes.d.ts +7 -52
  393. package/dist/objects/processes.js +7 -61
  394. package/dist/objects/project-briefs.d.ts +11 -55
  395. package/dist/objects/project-briefs.js +14 -75
  396. package/dist/objects/skills.d.ts +7 -42
  397. package/dist/objects/skills.js +8 -54
  398. package/dist/postinstall.js +6 -19
  399. package/dist/predictions/planning-fallacy.d.ts +11 -34
  400. package/dist/rerankers/clef.js +3 -31
  401. package/dist/rerankers/cross-encoder.js +4 -6
  402. package/dist/rerankers/jev.js +9 -6
  403. package/dist/rerankers/llm.d.ts +2 -11
  404. package/dist/rerankers/llm.js +14 -14
  405. package/dist/rerankers/outage-warning.d.ts +2 -1
  406. package/dist/rerankers/outage-warning.js +2 -1
  407. package/dist/rerankers/remote.d.ts +1 -0
  408. package/dist/rerankers/remote.js +2 -0
  409. package/dist/rerankers/types.d.ts +2 -14
  410. package/dist/search/boosts.d.ts +0 -2
  411. package/dist/search/boosts.js +2 -2
  412. package/dist/search/goal-boost.d.ts +23 -0
  413. package/dist/search/goal-boost.js +90 -0
  414. package/dist/search/hybrid.d.ts +2 -0
  415. package/dist/search/multihop.js +2 -3
  416. package/dist/search/path-context.d.ts +5 -18
  417. package/dist/search/path-context.js +5 -18
  418. package/dist/search/physics-search.js +11 -8
  419. package/dist/search/rrf.d.ts +7 -35
  420. package/dist/search/rrf.js +5 -30
  421. package/dist/search/vector.d.ts +7 -0
  422. package/dist/search/vector.js +35 -5
  423. package/dist/server/auth.d.ts +9 -28
  424. package/dist/server/auth.js +32 -25
  425. package/dist/server/boot.d.ts +2 -21
  426. package/dist/server/boot.js +63 -96
  427. package/dist/server/client-ip.d.ts +3 -19
  428. package/dist/server/client-ip.js +5 -28
  429. package/dist/server/defaults.d.ts +3 -0
  430. package/dist/server/defaults.js +4 -0
  431. package/dist/server/key-check-bounds.d.ts +2 -1
  432. package/dist/server/lifecycle.d.ts +5 -4
  433. package/dist/server/lifecycle.js +19 -4
  434. package/dist/server/mcp-http.js +10 -44
  435. package/dist/server/rate-limit.d.ts +5 -18
  436. package/dist/server/rate-limit.js +4 -13
  437. package/dist/server/request.d.ts +4 -8
  438. package/dist/server/request.js +9 -17
  439. package/dist/server/route-table.js +42 -49
  440. package/dist/server/routes/admin.js +22 -28
  441. package/dist/server/routes/customer-notes.js +7 -12
  442. package/dist/server/routes/decisions.js +10 -17
  443. package/dist/server/routes/incidents.js +12 -20
  444. package/dist/server/routes/memories.js +12 -32
  445. package/dist/server/routes/object-routes.d.ts +0 -5
  446. package/dist/server/routes/object-routes.js +7 -15
  447. package/dist/server/routes/policies.js +10 -18
  448. package/dist/server/routes/predictions.js +13 -25
  449. package/dist/server/routes/processes.js +16 -26
  450. package/dist/server/routes/project-briefs.js +9 -16
  451. package/dist/server/routes/recall.js +10 -35
  452. package/dist/server/routes/skills.js +8 -18
  453. package/dist/server/server-detect.d.ts +9 -53
  454. package/dist/server/server-detect.js +24 -90
  455. package/dist/server/sleep-offload.js +4 -1
  456. package/dist/server/types.d.ts +12 -10
  457. package/dist/server/validation.d.ts +3 -1
  458. package/dist/server/validation.js +10 -23
  459. package/dist/server.d.ts +2 -2
  460. package/dist/server.js +3 -2
  461. package/dist/sharing/global-store.d.ts +19 -0
  462. package/dist/sharing/global-store.js +75 -0
  463. package/dist/sharing/global-sync.d.ts +6 -0
  464. package/dist/sharing/global-sync.js +80 -0
  465. package/dist/sharing/project-merge.d.ts +4 -5
  466. package/dist/sharing/project-merge.js +9 -7
  467. package/dist/sharing/scope.d.ts +4 -11
  468. package/dist/sharing/scope.js +4 -11
  469. package/dist/sharing/search-both.d.ts +60 -0
  470. package/dist/sharing/search-both.js +138 -0
  471. package/dist/sharing/share.d.ts +38 -0
  472. package/dist/sharing/share.js +226 -0
  473. package/dist/store/ambient.js +4 -9
  474. package/dist/store/audit-event.d.ts +4 -12
  475. package/dist/store/audit-event.js +4 -12
  476. package/dist/store/audit.d.ts +2 -5
  477. package/dist/store/audit.js +4 -12
  478. package/dist/store/auth.d.ts +6 -6
  479. package/dist/store/auth.js +10 -9
  480. package/dist/store/candidates.d.ts +20 -3
  481. package/dist/store/candidates.js +77 -48
  482. package/dist/store/card-detail.d.ts +2 -1
  483. package/dist/store/card-detail.js +2 -1
  484. package/dist/store/cards.d.ts +14 -9
  485. package/dist/store/cards.js +72 -126
  486. package/dist/store/conflicts.d.ts +4 -21
  487. package/dist/store/conflicts.js +71 -150
  488. package/dist/store/connectors/github.d.ts +10 -10
  489. package/dist/store/connectors/github.js +10 -10
  490. package/dist/store/dashboard-reads.js +4 -8
  491. package/dist/store/delete-and-batch.d.ts +11 -31
  492. package/dist/store/delete-and-batch.js +48 -64
  493. package/dist/store/delivery-recorder.d.ts +8 -4
  494. package/dist/store/delivery-recorder.js +25 -15
  495. package/dist/store/diagnostics.js +6 -13
  496. package/dist/store/dormant.d.ts +7 -29
  497. package/dist/store/dormant.js +15 -56
  498. package/dist/store/embeddings/index.d.ts +11 -80
  499. package/dist/store/embeddings/index.js +71 -207
  500. package/dist/store/embeddings/local.js +15 -32
  501. package/dist/store/embeddings/provider.d.ts +16 -53
  502. package/dist/store/embeddings/provider.js +41 -69
  503. package/dist/store/entry-reads.d.ts +21 -57
  504. package/dist/store/entry-reads.js +65 -126
  505. package/dist/store/entry-row.d.ts +6 -35
  506. package/dist/store/entry-row.js +9 -37
  507. package/dist/store/entry-writes.d.ts +10 -16
  508. package/dist/store/entry-writes.js +17 -35
  509. package/dist/store/goals.d.ts +3 -40
  510. package/dist/store/goals.js +21 -160
  511. package/dist/store/graph-queue.d.ts +6 -22
  512. package/dist/store/graph-queue.js +14 -45
  513. package/dist/store/graph-reads.d.ts +11 -35
  514. package/dist/store/graph-reads.js +20 -58
  515. package/dist/store/graph-rows.d.ts +3 -6
  516. package/dist/store/graph-rows.js +6 -9
  517. package/dist/store/graph-view-rows.d.ts +2 -1
  518. package/dist/store/graph-view-rows.js +2 -1
  519. package/dist/store/graph-writes.d.ts +6 -31
  520. package/dist/store/graph-writes.js +13 -37
  521. package/dist/store/half-life.d.ts +2 -1
  522. package/dist/store/half-life.js +14 -16
  523. package/dist/store/handoffs.d.ts +5 -11
  524. package/dist/store/handoffs.js +16 -34
  525. package/dist/store/index-and-stats.d.ts +6 -19
  526. package/dist/store/index-and-stats.js +34 -82
  527. package/dist/store/markdown.d.ts +2 -6
  528. package/dist/store/markdown.js +21 -20
  529. package/dist/store/mirrors.d.ts +2 -6
  530. package/dist/store/mirrors.js +14 -23
  531. package/dist/store/open.js +6 -13
  532. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  533. package/dist/store/planning-fallacy-evidence.js +8 -37
  534. package/dist/store/port.d.ts +82 -79
  535. package/dist/store/predictions.d.ts +11 -51
  536. package/dist/store/predictions.js +38 -119
  537. package/dist/{cli → store}/quality-repair.js +15 -31
  538. package/dist/store/raw-archive.d.ts +4 -16
  539. package/dist/store/raw-archive.js +14 -29
  540. package/dist/store/recall-scope.d.ts +19 -79
  541. package/dist/store/recall-scope.js +21 -82
  542. package/dist/store/recall-trace.d.ts +10 -77
  543. package/dist/store/recall-trace.js +19 -95
  544. package/dist/store/rejected-values.js +7 -19
  545. package/dist/store/rejection.d.ts +12 -58
  546. package/dist/store/rejection.js +13 -65
  547. package/dist/store/report-reads.d.ts +6 -0
  548. package/dist/store/report-reads.js +29 -0
  549. package/dist/store/rows.d.ts +9 -19
  550. package/dist/store/rows.js +36 -34
  551. package/dist/store/rule-sql.d.ts +5 -0
  552. package/dist/store/rule-sql.js +37 -0
  553. package/dist/store/search-rows.d.ts +7 -38
  554. package/dist/store/search-rows.js +14 -50
  555. package/dist/store/sessions.d.ts +10 -47
  556. package/dist/store/sessions.js +17 -73
  557. package/dist/store/sqlite/connector-events-group.js +2 -2
  558. package/dist/store/sqlite/entry-writes-group.js +2 -2
  559. package/dist/store/sqlite/error-codec.js +4 -2
  560. package/dist/store/sqlite/executor.d.ts +2 -1
  561. package/dist/store/sqlite/executor.js +2 -1
  562. package/dist/store/sqlite/local.d.ts +3 -3
  563. package/dist/store/sqlite/local.js +1 -0
  564. package/dist/store/sqlite/object-rows.js +6 -3
  565. package/dist/store/sqlite/objects-group.js +4 -2
  566. package/dist/store/sqlite/quarantine-group.js +2 -2
  567. package/dist/store/sqlite/store.d.ts +1 -4
  568. package/dist/store/sqlite/store.js +2 -3
  569. package/dist/store/sqlite/vector-reads-group.js +2 -2
  570. package/dist/store/sqlite/worker-jobs.js +1 -1
  571. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  572. package/dist/store/sqlite/worker-ops.js +13 -2
  573. package/dist/store/sqlite/worker-store.js +5 -2
  574. package/dist/store/summaries.d.ts +10 -62
  575. package/dist/store/summaries.js +34 -146
  576. package/dist/store/summary-dirty.js +1 -1
  577. package/dist/store/tenant-lookup.d.ts +6 -1
  578. package/dist/store/tenant-lookup.js +7 -0
  579. package/dist/store/tenant.d.ts +2 -16
  580. package/dist/store/tenant.js +4 -19
  581. package/dist/store/token-ledger.d.ts +13 -43
  582. package/dist/store/token-ledger.js +19 -50
  583. package/dist/store/usage-reports.js +5 -13
  584. package/dist/store/vector-index.d.ts +46 -0
  585. package/dist/store/vector-index.js +170 -0
  586. package/dist/store/working-memory.d.ts +6 -25
  587. package/dist/store/working-memory.js +18 -52
  588. package/dist/store/yaml.d.ts +1 -5
  589. package/dist/store/yaml.js +2 -6
  590. package/dist/support-bundle.js +7 -5
  591. package/dist/trust/reject-flow.js +1 -3
  592. package/dist/util/anthropic-messages.js +14 -2
  593. package/dist/util/atomic-write.d.ts +2 -1
  594. package/dist/util/atomic-write.js +35 -4
  595. package/dist/util/capped-json.d.ts +6 -0
  596. package/dist/util/capped-json.js +46 -0
  597. package/dist/util/crash-handlers.d.ts +8 -1
  598. package/dist/util/crash-handlers.js +52 -10
  599. package/dist/util/env.d.ts +13 -6
  600. package/dist/util/env.js +14 -7
  601. package/dist/util/home-path.d.ts +2 -1
  602. package/dist/util/home-path.js +4 -2
  603. package/dist/util/http-retry.d.ts +3 -1
  604. package/dist/util/http-retry.js +26 -5
  605. package/dist/util/log.d.ts +3 -2
  606. package/dist/util/log.js +25 -9
  607. package/dist/util/request-scope.d.ts +2 -1
  608. package/dist/util/request-scope.js +2 -1
  609. package/dist/util/secret-detect.d.ts +5 -30
  610. package/dist/util/secret-detect.js +13 -39
  611. package/dist/util/stored-json.d.ts +1 -1
  612. package/dist/util/stored-json.js +1 -1
  613. package/dist/util/token-text.d.ts +1 -4
  614. package/dist/util/token-text.js +1 -4
  615. package/dist/util/transcript-tail.d.ts +2 -0
  616. package/dist/util/transcript-tail.js +24 -23
  617. package/dist/util/version.d.ts +5 -20
  618. package/dist/util/version.js +5 -20
  619. package/extensions/openclaw-plugin/index.ts +1 -1
  620. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  621. package/extensions/openclaw-plugin/package.json +1 -1
  622. package/openclaw.plugin.json +1 -1
  623. package/package.json +1 -1
  624. package/dist/connectors/github/cli-impl.d.ts +0 -25
  625. package/dist/sharing/shared.d.ts +0 -187
  626. package/dist/sharing/shared.js +0 -563
  627. package/dist/store/vector-writes.d.ts +0 -13
  628. package/dist/store/vector-writes.js +0 -89
  629. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
@@ -20,24 +20,11 @@ export interface InvalidationOptions {
20
20
  /** Consider ONLY this memory id (no content/tag matching). */
21
21
  onlyId?: string;
22
22
  }
23
- /**
24
- * Extract what was replaced/removed from a commit message.
25
- * Returns null if the commit isn't a breaking/migration change.
26
- */
23
+ /** Extract what was replaced/removed from a commit message.
24
+ * Returns null if the commit isn't a breaking/migration change. */
27
25
  export declare function extractInvalidationTarget(message: string): InvalidationTarget | null;
28
- /**
29
- * Find memories that reference the invalidated pattern and weaken them.
30
- * - Halves half_life_days
31
- * - Sets confidence to 'stale'
32
- * - Adds 'invalidated' tag
33
- * - Skips pinned memories (reported in skippedPinned)
34
- *
35
- * Tag matching is EXACT (2026-06-09 incident): the FULL pattern must equal a
36
- * tag. Token-level matching applies to content only, so a pattern that merely
37
- * CONTAINS a common tag word ("hippo") can no longer mass-weaken every memory
38
- * carrying that tag. Both callers (the CLI `invalidate` command and the
39
- * auto-learn-from-git path) inherit this contract.
40
- */
26
+ /** Find memories that reference the invalidated pattern and weaken them (halve half_life_days, confidence 'stale', add 'invalidated' tag; pinned are skipped).
27
+ * Tag matching is EXACT: the FULL pattern must equal a tag, so a pattern merely containing a common tag word cannot mass-weaken every memory with that tag. */
41
28
  export declare function invalidateMatching(hippoRoot: string, target: InvalidationTarget, tenantId?: string, options?: InvalidationOptions): InvalidationResult;
42
29
  /** invalidateMatching for a batch: matches against `live`, the caller's list of the tenant's rows, and keeps it current.
43
30
  * Each match is read again before it is weakened, so a row another writer changed since the list was read is never written back stale. */
@@ -73,6 +60,7 @@ export interface ChurnStaleResult {
73
60
  preview: ChurnStalePreviewRow[];
74
61
  error?: string;
75
62
  }
76
- /** Flags memories whose named file/symbol/script changed or disappeared since storage (or last confirmation); only adds/removes CHURN_STALE_TAG, never confidence/half-life/strength. */
63
+ /** Flags memories whose named file/symbol/script changed or disappeared since storage (or last
64
+ * confirmation); only adds/removes CHURN_STALE_TAG, never confidence/half-life/strength. */
77
65
  export declare function detectChurnStale(hippoRoot: string, repoRoot: string, opts: DetectChurnStaleOptions): ChurnStaleResult;
78
66
  //# sourceMappingURL=invalidation.d.ts.map
@@ -4,10 +4,8 @@ import { chunked, loadAllEntries, loadEntriesByIds } from '../store/entry-reads.
4
4
  import { CHURN_STALE_TAG } from '../core/memory.js';
5
5
  import { GitReadError, gitLsFilesAtHead, fetchChurnWindowLog, gitGrepPresence, resolveCommitBefore, packageScriptsAt, } from './churn-git.js';
6
6
  const HEADLINE_CHARS = 60;
7
- /**
8
- * Extract what was replaced/removed from a commit message.
9
- * Returns null if the commit isn't a breaking/migration change.
10
- */
7
+ /** Extract what was replaced/removed from a commit message.
8
+ * Returns null if the commit isn't a breaking/migration change. */
11
9
  export function extractInvalidationTarget(message) {
12
10
  // Strip conventional commit prefix (e.g., "feat(scope): ")
13
11
  const body = message.replace(/^[a-z]+(\([^)]*\))?:\s*/i, '').trim();
@@ -44,25 +42,11 @@ export function extractInvalidationTarget(message) {
44
42
  }
45
43
  return null;
46
44
  }
47
- /**
48
- * Find memories that reference the invalidated pattern and weaken them.
49
- * - Halves half_life_days
50
- * - Sets confidence to 'stale'
51
- * - Adds 'invalidated' tag
52
- * - Skips pinned memories (reported in skippedPinned)
53
- *
54
- * Tag matching is EXACT (2026-06-09 incident): the FULL pattern must equal a
55
- * tag. Token-level matching applies to content only, so a pattern that merely
56
- * CONTAINS a common tag word ("hippo") can no longer mass-weaken every memory
57
- * carrying that tag. Both callers (the CLI `invalidate` command and the
58
- * auto-learn-from-git path) inherit this contract.
59
- */
45
+ /** Find memories that reference the invalidated pattern and weaken them (halve half_life_days, confidence 'stale', add 'invalidated' tag; pinned are skipped).
46
+ * Tag matching is EXACT: the FULL pattern must equal a tag, so a pattern merely containing a common tag word cannot mass-weaken every memory with that tag. */
60
47
  export function invalidateMatching(hippoRoot, target, tenantId, options) {
61
- // L9: tenantId opt-in. When provided, only this tenant's memories are
62
- // considered for weakening. When undefined, behaves as it did pre-1.12.1
63
- // (host-wide invalidation across all tenants in the store).
64
- // options.onlyId resolves by FILTERING this tenant-scoped list — never a
65
- // direct id lookup — so an id from another tenant is invisible here.
48
+ // tenantId opt-in: when set, only that tenant's memories are weakened; undefined is host-wide.
49
+ // options.onlyId filters this tenant-scoped list rather than looking up an id directly, so another tenant's id is invisible here.
66
50
  const { result, weakened } = weakenMatches(loadAllEntries(hippoRoot, tenantId), target, options);
67
51
  writeEntriesSeparately(hippoRoot, weakened);
68
52
  return result;
@@ -381,7 +365,8 @@ function recordChurnEvidence(git, candidates, anchorOf, result) {
381
365
  }
382
366
  return toTag;
383
367
  }
384
- /** Flags memories whose named file/symbol/script changed or disappeared since storage (or last confirmation); only adds/removes CHURN_STALE_TAG, never confidence/half-life/strength. */
368
+ /** Flags memories whose named file/symbol/script changed or disappeared since storage (or last
369
+ * confirmation); only adds/removes CHURN_STALE_TAG, never confidence/half-life/strength. */
385
370
  export function detectChurnStale(hippoRoot, repoRoot, opts) {
386
371
  const dryRun = opts.dryRun === true;
387
372
  if (!opts.projectName)
@@ -408,9 +393,7 @@ export function detectChurnStale(hippoRoot, repoRoot, opts) {
408
393
  const result = { checked: 0, marked: 0, alreadyMarked: 0, skippedPinned, dryRun, preview: [] };
409
394
  try {
410
395
  const git = loadChurnGitView(repoRoot, opts.legacyName ?? opts.projectName, candidates, anchorOf, needs);
411
- // Collected here, written only after every candidate's evidence is
412
- // computed: a GitReadError thrown mid-loop must never leave an earlier
413
- // candidate tagged while a later one aborts the run untagged.
396
+ // Collected here and written only after every candidate's evidence is computed, so a GitReadError mid-loop cannot leave an earlier candidate tagged.
414
397
  const toTag = recordChurnEvidence(git, candidates, anchorOf, result);
415
398
  if (!dryRun && toTag.length > 0)
416
399
  tagChurnStale(hippoRoot, opts.tenantId, toTag, confirmedAt);
@@ -2,7 +2,7 @@
2
2
  import { evalNow } from '../core/ablation.js';
3
3
  import { loadStrengthTallies } from '../store/candidates.js';
4
4
  import { countOpenConflicts, listTouchableConflicts, resolveConflict } from '../store/conflicts.js';
5
- import { shareMemory, listPeers } from '../sharing/shared.js';
5
+ import { shareMemory, listPeers } from '../sharing/share.js';
6
6
  import { requireGroup, storeFor } from '../store/index.js';
7
7
  import { NotFoundError } from '../core/api-errors.js';
8
8
  import { classifyOriginProject } from '../core/project-identity.js';
@@ -106,10 +106,8 @@ export function runShareTool({ args, ctx, hippoRoot, tenantId }) {
106
106
  // Checked before shareMemory, whose personal-row refusal would tell another person the id exists.
107
107
  if (!canTouchScope(mcpActor(ctx), memoryScope(hippoRoot, shareId)))
108
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.
109
+ // 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.
110
+ // The 'Memory not found' error matches the cross-tenant deny shape elsewhere.
113
111
  const shared = shareMemory(hippoRoot, shareId, { force, tenantId });
114
112
  if (!shared)
115
113
  return 'Transfer score too low. Use force=true to override.';
@@ -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,
@@ -44,10 +41,8 @@ export async function runOutcomeTool({ args, ctx, hippoRoot, tenantId }) {
44
41
  const ids = lastRecalledIds.get(clientKey) ?? [];
45
42
  if (ids.length === 0)
46
43
  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.
44
+ // 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
45
+ // uniform; outcome() also skips cross-tenant ids silently.
51
46
  const apiCtx = {
52
47
  hippoRoot,
53
48
  tenantId,
@@ -27,25 +27,14 @@ interface McpResponse {
27
27
  /** JSON-RPC reply for a request that threw: typed API errors keep their text; anything else is logged and answered generically. */
28
28
  export declare function mcpErrorResponse<E>(id: McpResponse['id'], err: E, requestId?: string): McpResponse;
29
29
  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
- */
30
+ /** Optional context from a non-stdio transport (the HTTP server's bound hippoRoot and auth-resolved tenantId/actor), so executeTool skips the
31
+ * findHippoRoot() walk and the env-based resolveTenantId({}) fallback, which would pick the wrong store and tenant for HTTP callers. Stdio passes nothing. */
40
32
  export interface McpContext {
41
33
  hippoRoot: string;
42
34
  tenantId: string;
43
35
  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
- */
36
+ /** The caller's role from the HTTP transport's auth; absent for stdio (the local operator, admin). Tools must use this, or a member key over HTTP-MCP
37
+ * would act as admin. */
49
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[];
@@ -56,19 +45,12 @@ export interface McpContext {
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
+ /** 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);
49
+ * defaults to `${tenantId}:default`. */
65
50
  clientKey?: string;
66
51
  }
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
- */
52
+ /** The api-layer actor for a tool call: stdio (no ctx) is the local operator and runs as admin; over HTTP the authenticated role is used, so a member key
53
+ * never acts as admin. */
72
54
  export declare function mcpActor(ctx: McpContext | undefined): ApiActor;
73
55
  /** One tool call after the store, config and tenant are resolved; every handler reads the same four. */
74
56
  export interface ToolCall {
@@ -4,7 +4,7 @@ import { randomUUID } from 'node:crypto';
4
4
  import { INTERNAL_ERROR_MESSAGE, mapApiError } from '../util/http-util.js';
5
5
  import { errorFields, errorMessage, log } from '../util/log.js';
6
6
  import { currentRequestId } from '../util/request-scope.js';
7
- import { getGlobalRoot } from '../sharing/shared.js';
7
+ import { getGlobalRoot } from '../sharing/global-store.js';
8
8
  import { findHippoStoreDir } from '../core/project-identity.js';
9
9
  import { isStoreBusy, STORE_BUSY_MESSAGE } from '../db/index.js';
10
10
  // ── Find hippo root ──
@@ -31,11 +31,8 @@ export function mcpErrorResponse(id, err, requestId = currentRequestId() ?? rand
31
31
  error: { code: -32603, message: `${INTERNAL_ERROR_MESSAGE} (request id ${requestId})`, data: { requestId } },
32
32
  };
33
33
  }
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
- */
34
+ /** The api-layer actor for a tool call: stdio (no ctx) is the local operator and runs as admin; over HTTP the authenticated role is used, so a member key
35
+ * never acts as admin. */
39
36
  export function mcpActor(ctx) {
40
37
  const actor = { subject: ctx?.actor ?? 'mcp', role: ctx?.role ?? 'admin', scopes: ctx?.scopes };
41
38
  if (ctx?.viaAuthResolver)
@@ -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';
@@ -85,14 +85,14 @@ function recallPresenter(budget, options) {
85
85
  const tail = showTail
86
86
  ? dropHeldCopies(tailRows.filter((r) => !shownIds.has(r.id) && !shownKeys.has(duplicateKey(r.content))), (r) => r)
87
87
  : [];
88
- const s = buildSuppressionSummary({
88
+ const s = {
89
89
  totalCandidates: pool.length + droppedByScope,
90
90
  droppedPreRank: droppedByScope + cut.length - list.length, // the bucket CLI and API recall put hidden copies in
91
91
  droppedByBudget: Math.max(0, pool.length - cut.length), // an upper bound: rows that never matched count too
92
92
  summarySubstitutionsAdded: tail.filter((r) => r.isSummary).length,
93
93
  freshTailAdded: tail.filter((r) => r.isFreshTail && !r.isSummary).length,
94
94
  suppressedByInterference: anchoring?.reason === 'memory_dominance' ? 1 : 0,
95
- });
95
+ };
96
96
  // Anchoring is the stronger pull, so it prints first; the Cutoff block sits above the list, where the agent reads it.
97
97
  let text = biasHintSections(anchoring, availability);
98
98
  if (showPlan)
@@ -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,7 +1,7 @@
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
7
  import { rethrowIfSqliteBlocked, runWithRequestStores } from '../db/index.js';
@@ -17,12 +17,8 @@ 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
19
  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
- */
20
+ /** 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
21
+ * (stdout carries the protocol). A later `hippo init` project store takes precedence. */
26
22
  function createGlobalStoreOnFirstRun() {
27
23
  initGlobal();
28
24
  const root = getGlobalRoot();
@@ -34,10 +30,7 @@ const MCP_TOKEN_SURFACES = new Map([
34
30
  ['hippo_recall', 'mcp_recall'],
35
31
  ['hippo_context', 'mcp_context'],
36
32
  ]);
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
- */
33
+ /** 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
34
  export async function recordMcpTokens(toolName, output, ctx) {
42
35
  const surface = MCP_TOKEN_SURFACES.get(toolName);
43
36
  if (!surface || !output)
@@ -84,16 +77,12 @@ function runsOn(store, toolName) {
84
77
  return group !== undefined && hasGroup(store, group);
85
78
  }
86
79
  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.
80
+ // With a transport context (HTTP), trust it: hippoRoot comes from the server's bound opts and tenantId from the Bearer (or loopback fallback).
81
+ // Stdio walks from cwd / the global root and resolves tenant from HIPPO_TENANT.
92
82
  const hippoRoot = ctx?.hippoRoot ?? findHippoRoot() ?? createGlobalStoreOnFirstRun();
93
83
  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.
84
+ // 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
85
+ // does not drop to HIPPO_TENANT.
97
86
  const tenantId = ctx?.tenantId ?? resolveTenantId({});
98
87
  const handler = TOOL_HANDLERS.get(name)?.handler;
99
88
  // handleMcpRequest rejects names missing from TOOLS, so reaching here means TOOLS and this table drifted apart.
@@ -155,13 +144,8 @@ async function callTool(id, params, ctx) {
155
144
  },
156
145
  };
157
146
  }
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
- */
147
+ /** Transport-agnostic MCP dispatcher: the stdio loop and the HTTP/SSE transport route every JSON-RPC message through it. Returns null for notifications.
148
+ * Errors thrown by `executeTool` are the caller's problem: wrap with try/catch on the transport side. */
165
149
  export async function handleMcpRequest(req, ctx) {
166
150
  const { id, method, params } = req;
167
151
  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: {
@@ -1,18 +1,12 @@
1
1
  // Per-process state the MCP tools share across calls: recall rings, last recalled ids, auto-sleep runs.
2
+ import { DEFAULT_TENANT_ID } from '../util/env.js';
2
3
  import { resetSessionRings } from '../api/recall-record.js';
3
4
  /** Test-only: reset the MCP recall rings. Call from beforeEach. */
4
- export function __resetSessionRecallHistoryMcp() {
5
+ export function _resetSessionRecallHistoryMcpForTests() {
5
6
  resetSessionRings('mcp');
6
7
  }
7
- // ── Track last recalled IDs for outcome feedback ──
8
- //
9
- // Keyed per-client so two HTTP-MCP clients hitting the same tenant cannot
10
- // poison each other's outcome feedback. The key is `ctx.clientKey` when the
11
- // transport supplies one (HTTP-MCP via src/server.ts builds
12
- // hash(bearer+remoteAddr)); stdio and any caller without a clientKey falls
13
- // back to `'stdio-${pid}'` (one process = one client) or
14
- // `${tenantId}:default` if a McpContext is constructed in tests without a
15
- // pid-bound transport.
8
+ // Last recalled IDs per client for outcome feedback, so two HTTP-MCP clients on one tenant cannot poison each other: key is `ctx.clientKey` (hash of
9
+ // bearer+remoteAddr over HTTP), else 'stdio-${pid}', else `${tenantId}:default` for a McpContext built in tests.
16
10
  const MAX_RECALL_CLIENTS = 4096;
17
11
  // The caller names the project half of each key, so a set past the cap drops the client that recalled longest ago.
18
12
  class RecentRecalls extends Map {
@@ -28,7 +22,7 @@ class RecentRecalls extends Map {
28
22
  export const lastRecalledIds = new RecentRecalls();
29
23
  export { autoSleepInFlight } from '../api/auto-sleep.js';
30
24
  export function resolveClientKey(ctx) {
31
- const base = ctx?.clientKey ? ctx.clientKey : `stdio-${process.pid}:${ctx?.tenantId || 'default'}`;
25
+ const base = ctx?.clientKey ? ctx.clientKey : `stdio-${process.pid}:${ctx?.tenantId || DEFAULT_TENANT_ID}`;
32
26
  return ctx?.project ? `${base}:${ctx.project.name}` : base;
33
27
  }
34
28
  //# sourceMappingURL=session-state.js.map
@@ -1,8 +1,4 @@
1
- /**
2
- * Wire stdin/stdout to the dispatcher. Idempotent — only the entrypoint
3
- * (cli.ts `hippo mcp`, or running this file directly) should call this.
4
- * src/server.ts imports `handleMcpRequest` without invoking this, so the
5
- * HTTP daemon does not steal stdin or exit when its parent closes a pipe.
6
- */
1
+ /** Wires stdin/stdout to the dispatcher; idempotent. Only the entrypoint (cli.ts `hippo mcp`, or this file run directly) should call it, so the HTTP daemon
2
+ * (which imports `handleMcpRequest`) does not steal stdin or exit when its parent closes a pipe. */
7
3
  export declare function startStdioLoop(): void;
8
4
  //# sourceMappingURL=stdio.d.ts.map
package/dist/mcp/stdio.js CHANGED
@@ -1,12 +1,13 @@
1
1
  // Stdio transport: newline-delimited JSON-RPC frames in on stdin, replies out on stdout.
2
2
  import { exitAfterFlush, installCrashHandlers } from '../util/crash-handlers.js';
3
- import { errorMessage, log } from '../util/log.js';
3
+ import { errorFields, errorMessage, log } from '../util/log.js';
4
+ import { requestDeadlineMs } from '../server/deadline.js';
4
5
  import { parseFrame } from './framing.js';
5
6
  import { mcpErrorResponse } from './protocol.js';
6
7
  import { handleMcpRequest } from './request.js';
7
8
  import { isJsonNumber, isJsonString, isJsonObject } from '../util/json.js';
8
9
  import { randomUUID } from 'node:crypto';
9
- import { runWithRequestId } from '../util/request-scope.js';
10
+ import { currentRequestId, runWithRequestId } from '../util/request-scope.js';
10
11
  // MCP stdio transport spec: messages are newline-delimited JSON-RPC, no embedded newlines.
11
12
  // https://modelcontextprotocol.io/specification/.../basic/transports#stdio
12
13
  function send(msg) {
@@ -61,6 +62,39 @@ async function exitWhenDrained() {
61
62
  }
62
63
  exitAfterFlush(0);
63
64
  }
65
+ // The code the MCP SDKs give a request that timed out.
66
+ const REQUEST_TIMEOUT_CODE = -32001;
67
+ /** The method, with the tool's name for a tool call, so a timeout names what ran. */
68
+ function callName(req) {
69
+ const tool = req.params?.name;
70
+ return isJsonString(tool) ? `${req.method} ${tool.slice(0, 128)}` : req.method;
71
+ }
72
+ /** Answers `req` with one timeout error at the deadline a served request has. The returned function stops the timer and says whether that answer went out, so a later reply is dropped. */
73
+ function watchDeadline(req, owedReply) {
74
+ const ms = requestDeadlineMs();
75
+ if (ms === 0)
76
+ return () => false;
77
+ let expired = false;
78
+ const timer = setTimeout(() => {
79
+ expired = true;
80
+ const name = callName(req);
81
+ log.warn(`mcp: ${name} did not answer within ${ms} ms; it keeps running and its reply will be dropped`, { method: req.method });
82
+ if (!owedReply)
83
+ return;
84
+ const requestId = currentRequestId();
85
+ const message = `Request timed out: ${name} did not finish within ${ms} ms; a write it started may or may not be saved`;
86
+ const error = { code: REQUEST_TIMEOUT_CODE, message };
87
+ if (requestId !== undefined)
88
+ error.data = { requestId };
89
+ send({ jsonrpc: '2.0', id: req.id, error });
90
+ }, ms);
91
+ // Stdin and the call keep the process alive; this timer alone must not.
92
+ timer.unref();
93
+ return () => {
94
+ clearTimeout(timer);
95
+ return expired;
96
+ };
97
+ }
64
98
  function dispatch(body) {
65
99
  let parsed;
66
100
  try {
@@ -77,22 +111,24 @@ function dispatch(body) {
77
111
  }
78
112
  const req = parsed;
79
113
  if (req.method.startsWith('notifications/')) {
114
+ const stopWatching = watchDeadline(req, false);
80
115
  track(req.method, handleMcpRequest(req).then(() => { }).catch((err) => {
81
- log.error(`mcp notification ${req.method} failed: ${errorMessage(err)}`);
82
- }));
116
+ log.error(`mcp notification ${req.method} failed: ${errorMessage(err)}`, errorFields(err));
117
+ }).finally(stopWatching));
83
118
  return;
84
119
  }
85
- track(req.method, handleMcpRequest(req).then((resp) => { if (resp)
120
+ // A frame with no id is a notification under any method name, and JSON-RPC forbids answering one.
121
+ const timedOut = watchDeadline(req, isJsonString(req.id) || isJsonNumber(req.id));
122
+ track(req.method, handleMcpRequest(req).then((resp) => { if (!timedOut() && resp)
86
123
  send(resp); }).catch((err) => {
87
- send(mcpErrorResponse(req.id, err));
124
+ if (timedOut())
125
+ log.debug(`mcp: ${callName(req)} failed after its timeout reply: ${errorMessage(err)}`);
126
+ else
127
+ send(mcpErrorResponse(req.id, err));
88
128
  }));
89
129
  }
90
- /**
91
- * Wire stdin/stdout to the dispatcher. Idempotent — only the entrypoint
92
- * (cli.ts `hippo mcp`, or running this file directly) should call this.
93
- * src/server.ts imports `handleMcpRequest` without invoking this, so the
94
- * HTTP daemon does not steal stdin or exit when its parent closes a pipe.
95
- */
130
+ /** Wires stdin/stdout to the dispatcher; idempotent. Only the entrypoint (cli.ts `hippo mcp`, or this file run directly) should call it, so the HTTP daemon
131
+ * (which imports `handleMcpRequest`) does not steal stdin or exit when its parent closes a pipe. */
96
132
  export function startStdioLoop() {
97
133
  process.stdin.on('data', (chunk) => {
98
134
  buffer = Buffer.concat([buffer, withoutRefused(chunk)]);
package/dist/mcp/tools.js CHANGED
@@ -2,6 +2,8 @@
2
2
  import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
3
3
  import { DEFAULT_ASSEMBLE_BUDGET } from '../api/assemble.js';
4
4
  import { MAX_ID_LEN } from '../util/http-util.js';
5
+ import { DEFAULT_SEARCH_CANDIDATE_LIMIT } from '../store/rows.js';
6
+ import { DEFAULT_CONFIG } from '../core/config.js';
5
7
  // ── Tool definitions ──
6
8
  // HTTP sets no budget cap; 25x the recall default leaves room for large-context clients while bounding one call's work.
7
9
  const MAX_BUDGET_TOKENS = 25 * DEFAULT_RECALL_BUDGET;
@@ -43,7 +45,7 @@ export const TOOLS = [
43
45
  },
44
46
  scorer_window: {
45
47
  type: 'number',
46
- description: 'How many of the top-ranked memories the fresh-tail and summarize-overflow appendix is worked out against. The main list ranks the whole tenant store, so scorer_window does not narrow it. Default 200. Rejected as RecallContractError code=invalid_scorer_window if 0/negative/non-finite/non-numeric.',
48
+ description: `How many of the top-ranked memories the fresh-tail and summarize-overflow appendix is worked out against. The main list ranks the whole tenant store, so scorer_window does not narrow it. Default ${DEFAULT_SEARCH_CANDIDATE_LIMIT}. Rejected as RecallContractError code=invalid_scorer_window if 0/negative/non-finite/non-numeric.`,
47
49
  },
48
50
  session_id: {
49
51
  type: 'string',
@@ -138,7 +140,7 @@ export const TOOLS = [
138
140
  },
139
141
  {
140
142
  name: 'hippo_outcome',
141
- description: 'Report whether recalled memories were useful. Strengthens good memories (+5 days half-life) and weakens bad ones (-3 days). Call after completing work.',
143
+ description: "Report whether recalled memories were useful. Good outcomes slow a memory's decay and bad ones speed it up, in proportion to its record. Call after completing work.",
142
144
  inputSchema: {
143
145
  type: 'object',
144
146
  properties: {
@@ -160,7 +162,7 @@ export const TOOLS = [
160
162
  type: 'number',
161
163
  minimum: 0,
162
164
  maximum: MAX_BUDGET_TOKENS,
163
- description: `Max tokens (default: config.defaultContextBudget, 3000; max ${MAX_BUDGET_TOKENS})`,
165
+ description: `Max tokens (default: config.defaultContextBudget, ${DEFAULT_CONFIG.defaultContextBudget}; max ${MAX_BUDGET_TOKENS})`,
164
166
  },
165
167
  scope: {
166
168
  type: 'string',