hippo-memory 1.71.0 → 1.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (555) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/copilot.d.ts +1 -3
  7. package/dist/agent-memories/copilot.js +1 -17
  8. package/dist/agent-memories/project-folds.d.ts +10 -0
  9. package/dist/agent-memories/project-folds.js +34 -0
  10. package/dist/agent-memories/sync.js +8 -6
  11. package/dist/api/assemble.js +1 -1
  12. package/dist/api/audit.d.ts +29 -1
  13. package/dist/api/audit.js +44 -5
  14. package/dist/api/auth.d.ts +7 -4
  15. package/dist/api/auth.js +12 -8
  16. package/dist/api/auto-sleep.d.ts +5 -2
  17. package/dist/api/auto-sleep.js +7 -3
  18. package/dist/api/availability.js +2 -3
  19. package/dist/api/cards.d.ts +42 -0
  20. package/dist/api/cards.js +52 -0
  21. package/dist/api/conflicts.d.ts +28 -0
  22. package/dist/api/conflicts.js +61 -0
  23. package/dist/api/context-render.js +4 -3
  24. package/dist/api/context-select.js +9 -11
  25. package/dist/api/context.js +17 -8
  26. package/dist/api/continuity.d.ts +47 -0
  27. package/dist/api/continuity.js +66 -0
  28. package/dist/api/dormant.js +4 -2
  29. package/dist/api/drill-down.js +1 -1
  30. package/dist/api/embeddings.d.ts +17 -0
  31. package/dist/api/embeddings.js +28 -0
  32. package/dist/api/error-reply.d.ts +8 -0
  33. package/dist/api/error-reply.js +21 -0
  34. package/dist/api/forget.d.ts +6 -2
  35. package/dist/api/forget.js +18 -7
  36. package/dist/api/goals.d.ts +1 -1
  37. package/dist/api/goals.js +5 -9
  38. package/dist/api/index.d.ts +4 -2
  39. package/dist/api/index.js +4 -2
  40. package/dist/api/instruction-detect.js +5 -1
  41. package/dist/api/learn.d.ts +4 -0
  42. package/dist/api/learn.js +53 -27
  43. package/dist/api/ledger-db.d.ts +2 -6
  44. package/dist/api/ledger-db.js +4 -36
  45. package/dist/api/memories.d.ts +19 -1
  46. package/dist/api/memories.js +39 -0
  47. package/dist/api/objects.d.ts +1 -1
  48. package/dist/api/outcome.js +1 -1
  49. package/dist/api/pilot-arm.d.ts +1 -11
  50. package/dist/api/pilot-arm.js +5 -45
  51. package/dist/api/predictions.d.ts +3 -1
  52. package/dist/api/predictions.js +6 -0
  53. package/dist/api/projects.d.ts +21 -0
  54. package/dist/api/projects.js +24 -0
  55. package/dist/api/promote.js +1 -1
  56. package/dist/api/prompt-hook.d.ts +15 -2
  57. package/dist/api/prompt-hook.js +44 -4
  58. package/dist/api/recall-cli.d.ts +3 -0
  59. package/dist/api/recall-cli.js +13 -4
  60. package/dist/api/recall-core.js +3 -3
  61. package/dist/api/recall-pipeline.js +6 -7
  62. package/dist/api/recall-request.js +1 -1
  63. package/dist/api/recall.d.ts +0 -3
  64. package/dist/api/recall.js +19 -44
  65. package/dist/api/remember-local.js +1 -1
  66. package/dist/api/remember.d.ts +2 -1
  67. package/dist/api/remember.js +3 -2
  68. package/dist/api/session-end.d.ts +22 -0
  69. package/dist/api/session-end.js +101 -0
  70. package/dist/api/sleep-run.d.ts +1 -1
  71. package/dist/api/sleep-run.js +13 -9
  72. package/dist/api/status.d.ts +24 -0
  73. package/dist/api/status.js +40 -0
  74. package/dist/api/store-init.d.ts +4 -0
  75. package/dist/api/store-init.js +9 -0
  76. package/dist/api/tokens.js +1 -1
  77. package/dist/api/types.d.ts +2 -0
  78. package/dist/api/types.js +6 -1
  79. package/dist/capture/caller-session.d.ts +0 -3
  80. package/dist/capture/caller-session.js +1 -12
  81. package/dist/capture/capture-error.d.ts +2 -2
  82. package/dist/capture/capture-error.js +23 -18
  83. package/dist/capture/codex-patch.js +3 -1
  84. package/dist/capture/command.js +36 -95
  85. package/dist/capture/compact.js +10 -5
  86. package/dist/capture/compaction-items-caller.js +11 -20
  87. package/dist/capture/compaction-record.d.ts +7 -93
  88. package/dist/capture/compaction-record.js +29 -426
  89. package/dist/capture/compaction-spool.d.ts +4 -2
  90. package/dist/capture/compaction-spool.js +20 -6
  91. package/dist/capture/copilot-transcript.d.ts +2 -1
  92. package/dist/capture/copilot-transcript.js +2 -1
  93. package/dist/capture/extract.d.ts +5 -2
  94. package/dist/capture/extract.js +4 -3
  95. package/dist/capture/failure-caller.d.ts +1 -1
  96. package/dist/capture/failure-caller.js +21 -16
  97. package/dist/capture/failure-reading.d.ts +2 -1
  98. package/dist/capture/failure-reading.js +7 -9
  99. package/dist/capture/pre-compact-caller.js +5 -4
  100. package/dist/capture/session-digest.js +4 -3
  101. package/dist/capture/session-end-caller.js +2 -1
  102. package/dist/capture/session-worker.js +3 -4
  103. package/dist/capture/transcript.d.ts +2 -1
  104. package/dist/capture/transcript.js +6 -3
  105. package/dist/capture/working-state.d.ts +4 -2
  106. package/dist/capture/working-state.js +4 -2
  107. package/dist/cli/audit-prune.d.ts +0 -25
  108. package/dist/cli/audit-prune.js +1 -27
  109. package/dist/cli/audit.js +13 -13
  110. package/dist/cli/auth.d.ts +1 -1
  111. package/dist/cli/auth.js +12 -13
  112. package/dist/cli/briefs.d.ts +1 -4
  113. package/dist/cli/briefs.js +37 -292
  114. package/dist/cli/card.js +41 -33
  115. package/dist/cli/client.d.ts +5 -0
  116. package/dist/cli/client.js +24 -8
  117. package/dist/cli/compact-resume-payload.js +1 -1
  118. package/dist/cli/context.d.ts +1 -1
  119. package/dist/cli/context.js +12 -12
  120. package/dist/cli/continuity.d.ts +1 -1
  121. package/dist/cli/continuity.js +36 -39
  122. package/dist/cli/curate.d.ts +1 -1
  123. package/dist/cli/curate.js +23 -27
  124. package/dist/cli/dag.d.ts +1 -1
  125. package/dist/cli/dag.js +23 -8
  126. package/dist/cli/decisions.d.ts +0 -2
  127. package/dist/cli/decisions.js +4 -281
  128. package/dist/cli/eval.d.ts +1 -1
  129. package/dist/cli/eval.js +12 -13
  130. package/dist/cli/explain.d.ts +1 -1
  131. package/dist/cli/explain.js +21 -25
  132. package/dist/cli/flag-values.js +16 -6
  133. package/dist/cli/flags.d.ts +0 -289
  134. package/dist/cli/flags.js +3 -138
  135. package/dist/cli/graph.d.ts +3 -0
  136. package/dist/cli/graph.js +83 -0
  137. package/dist/cli/hook-runtime.d.ts +3 -5
  138. package/dist/cli/hook-runtime.js +7 -34
  139. package/dist/cli/incidents.d.ts +3 -0
  140. package/dist/cli/incidents.js +112 -0
  141. package/dist/cli/init.d.ts +1 -1
  142. package/dist/cli/init.js +28 -19
  143. package/dist/cli/install-steps.d.ts +2 -1
  144. package/dist/cli/install-steps.js +11 -3
  145. package/dist/cli/last-sleep.js +1 -1
  146. package/dist/cli/lenient-id.d.ts +2 -0
  147. package/dist/cli/lenient-id.js +13 -0
  148. package/dist/cli/maintenance.d.ts +3 -3
  149. package/dist/cli/maintenance.js +29 -30
  150. package/dist/cli/notes.d.ts +2 -0
  151. package/dist/cli/notes.js +41 -0
  152. package/dist/cli/open-browser.d.ts +14 -0
  153. package/dist/cli/open-browser.js +26 -0
  154. package/dist/cli/playbooks.d.ts +3 -4
  155. package/dist/cli/playbooks.js +126 -290
  156. package/dist/cli/predictions.d.ts +3 -0
  157. package/dist/cli/predictions.js +175 -0
  158. package/dist/cli/print.js +2 -1
  159. package/dist/cli/projects.js +30 -22
  160. package/dist/cli/quality-repair-once.d.ts +1 -1
  161. package/dist/cli/quality-repair-once.js +6 -5
  162. package/dist/cli/recall.js +13 -7
  163. package/dist/cli/refine-llm.js +17 -17
  164. package/dist/cli/remember.js +12 -12
  165. package/dist/cli/scheduler.js +2 -1
  166. package/dist/cli/serve.js +3 -3
  167. package/dist/cli/session-hooks.d.ts +1 -1
  168. package/dist/cli/session-hooks.js +45 -115
  169. package/dist/cli/setup.d.ts +1 -1
  170. package/dist/cli/setup.js +17 -10
  171. package/dist/cli/shared.d.ts +2 -6
  172. package/dist/cli/shared.js +9 -29
  173. package/dist/cli/sleep-render.js +6 -3
  174. package/dist/cli/sleep.js +6 -37
  175. package/dist/cli/status.d.ts +3 -3
  176. package/dist/cli/status.js +32 -35
  177. package/dist/cli/transfer.d.ts +1 -1
  178. package/dist/cli/transfer.js +33 -31
  179. package/dist/cli/usage.d.ts +0 -79
  180. package/dist/cli/usage.js +1 -695
  181. package/dist/cli/verb-row.d.ts +32 -0
  182. package/dist/cli/verb-row.js +6 -0
  183. package/dist/cli/verbs/health.d.ts +27 -0
  184. package/dist/cli/verbs/health.js +232 -0
  185. package/dist/cli/verbs/memory.d.ts +16 -0
  186. package/dist/cli/verbs/memory.js +244 -0
  187. package/dist/cli/verbs/objects.d.ts +20 -0
  188. package/dist/cli/verbs/objects.js +254 -0
  189. package/dist/cli/verbs/sessions.d.ts +31 -0
  190. package/dist/cli/verbs/sessions.js +312 -0
  191. package/dist/cli/verbs.d.ts +81 -0
  192. package/dist/cli/verbs.js +7 -0
  193. package/dist/cli/versioned-verbs.d.ts +51 -0
  194. package/dist/cli/versioned-verbs.js +79 -0
  195. package/dist/cli.d.ts +1 -272
  196. package/dist/cli.js +23 -313
  197. package/dist/connectors/dlq.d.ts +39 -3
  198. package/dist/connectors/dlq.js +37 -3
  199. package/dist/connectors/github/backfill.js +12 -3
  200. package/dist/connectors/github/dlq.js +31 -73
  201. package/dist/connectors/github/ingest.d.ts +2 -6
  202. package/dist/connectors/github/ingest.js +3 -28
  203. package/dist/connectors/github/webhook.d.ts +2 -1
  204. package/dist/connectors/github/webhook.js +33 -2
  205. package/dist/connectors/ingest.d.ts +10 -0
  206. package/dist/connectors/ingest.js +28 -0
  207. package/dist/connectors/slack/dlq.js +49 -71
  208. package/dist/connectors/slack/ingest.d.ts +2 -6
  209. package/dist/connectors/slack/ingest.js +2 -27
  210. package/dist/connectors/slack/webhook.d.ts +2 -1
  211. package/dist/connectors/slack/webhook.js +2 -1
  212. package/dist/consolidate/conflicts.js +1 -1
  213. package/dist/consolidate/dag.js +15 -9
  214. package/dist/consolidate/dedupe.d.ts +7 -0
  215. package/dist/consolidate/dedupe.js +5 -3
  216. package/dist/consolidate/llm-passes.js +45 -19
  217. package/dist/consolidate/memory-value.js +2 -1
  218. package/dist/consolidate/merge.js +2 -2
  219. package/dist/consolidate/physics-pass.d.ts +6 -1
  220. package/dist/consolidate/physics-pass.js +26 -6
  221. package/dist/consolidate/replay.js +11 -4
  222. package/dist/consolidate/sleep.js +8 -5
  223. package/dist/consolidate/traces.js +3 -3
  224. package/dist/core/ablation.d.ts +10 -0
  225. package/dist/core/ablation.js +12 -0
  226. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  227. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  228. package/dist/core/ambient.d.ts +4 -0
  229. package/dist/core/ambient.js +39 -18
  230. package/dist/core/api-errors.d.ts +16 -0
  231. package/dist/core/api-errors.js +20 -0
  232. package/dist/core/card.js +3 -1
  233. package/dist/core/compaction-timing.d.ts +7 -0
  234. package/dist/core/compaction-timing.js +9 -0
  235. package/dist/core/config.d.ts +1 -1
  236. package/dist/core/config.js +7 -2
  237. package/dist/core/cosine.d.ts +3 -0
  238. package/dist/core/cosine.js +19 -0
  239. package/dist/{store → core}/markdown.d.ts +1 -1
  240. package/dist/{store → core}/markdown.js +2 -2
  241. package/dist/core/memory-audit.d.ts +17 -0
  242. package/dist/core/memory-audit.js +54 -0
  243. package/dist/core/memory.d.ts +10 -4
  244. package/dist/core/memory.js +25 -18
  245. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  246. package/dist/{consolidate → core}/merged-row.js +1 -1
  247. package/dist/core/physics.js +6 -16
  248. package/dist/core/prediction.d.ts +3 -0
  249. package/dist/core/prediction.js +6 -0
  250. package/dist/core/project-identity.d.ts +3 -0
  251. package/dist/core/project-identity.js +10 -1
  252. package/dist/{store → core}/recall-scope.d.ts +1 -10
  253. package/dist/{store → core}/recall-scope.js +2 -19
  254. package/dist/db/busy.d.ts +2 -7
  255. package/dist/db/busy.js +21 -26
  256. package/dist/db/connect.d.ts +0 -1
  257. package/dist/db/connect.js +5 -6
  258. package/dist/db/index.d.ts +3 -3
  259. package/dist/db/index.js +3 -3
  260. package/dist/db/migrations/index.d.ts +1 -1
  261. package/dist/db/migrations/index.js +3 -1
  262. package/dist/db/migrations/v55.d.ts +3 -0
  263. package/dist/db/migrations/v55.js +17 -0
  264. package/dist/db/open.d.ts +0 -2
  265. package/dist/db/open.js +6 -10
  266. package/dist/db/physics-state.js +3 -3
  267. package/dist/db/tables.d.ts +2 -0
  268. package/dist/db/tables.js +6 -2
  269. package/dist/db/vector-store.js +17 -4
  270. package/dist/db/wal-checkpointer.js +2 -1
  271. package/dist/doctor.js +11 -8
  272. package/dist/embeddings/local.d.ts +62 -0
  273. package/dist/embeddings/local.js +146 -0
  274. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  275. package/dist/{store/embeddings → embeddings}/provider.js +18 -15
  276. package/dist/embeddings/transformers.d.ts +26 -0
  277. package/dist/embeddings/transformers.js +89 -0
  278. package/dist/entry/session-text.d.ts +1 -1
  279. package/dist/entry/session-text.js +1 -1
  280. package/dist/eval/eval-suite.js +17 -11
  281. package/dist/eval/eval.js +1 -1
  282. package/dist/eval/judgment.js +11 -4
  283. package/dist/graph/extract.js +3 -3
  284. package/dist/graph/recall.js +1 -1
  285. package/dist/graph/view.js +13 -5
  286. package/dist/graph/write.d.ts +1 -1
  287. package/dist/graph/write.js +9 -9
  288. package/dist/hooks/codex-session.js +3 -2
  289. package/dist/hooks/codex-wrapper.js +2 -1
  290. package/dist/hooks/json-hooks.js +4 -2
  291. package/dist/hooks/opencode.js +8 -5
  292. package/dist/hooks/shared.d.ts +0 -6
  293. package/dist/hooks/shared.js +4 -15
  294. package/dist/importers/core.js +1 -1
  295. package/dist/importers/sources.js +5 -4
  296. package/dist/importers/vault.js +7 -5
  297. package/dist/index.d.ts +3 -2
  298. package/dist/index.js +3 -2
  299. package/dist/learn/autolearn.d.ts +10 -2
  300. package/dist/learn/autolearn.js +32 -12
  301. package/dist/learn/churn-git.js +13 -4
  302. package/dist/learn/extract.d.ts +3 -2
  303. package/dist/learn/extract.js +6 -4
  304. package/dist/learn/forward-claim-detector.js +4 -2
  305. package/dist/learn/invalidation.js +10 -6
  306. package/dist/mcp/admin-tools.d.ts +2 -2
  307. package/dist/mcp/admin-tools.js +27 -48
  308. package/dist/mcp/format.js +3 -2
  309. package/dist/mcp/framing.d.ts +1 -0
  310. package/dist/mcp/framing.js +1 -1
  311. package/dist/mcp/memory-tools.js +3 -1
  312. package/dist/mcp/protocol.d.ts +11 -7
  313. package/dist/mcp/protocol.js +25 -12
  314. package/dist/mcp/recall-tools.js +12 -9
  315. package/dist/mcp/request.js +2 -1
  316. package/dist/mcp/stdio.js +24 -8
  317. package/dist/mcp/tool-args.js +2 -1
  318. package/dist/mcp/tools.js +44 -21
  319. package/dist/objects/customer-notes.d.ts +2 -2
  320. package/dist/objects/decisions.d.ts +2 -2
  321. package/dist/objects/descriptor.d.ts +1 -1
  322. package/dist/objects/incidents.d.ts +2 -2
  323. package/dist/objects/lifecycle.d.ts +1 -1
  324. package/dist/objects/lifecycle.js +2 -1
  325. package/dist/objects/policies.d.ts +2 -2
  326. package/dist/objects/policies.js +2 -1
  327. package/dist/objects/processes.d.ts +2 -2
  328. package/dist/objects/project-briefs.d.ts +2 -2
  329. package/dist/objects/project-briefs.js +2 -3
  330. package/dist/objects/skills.d.ts +2 -2
  331. package/dist/postinstall.js +1 -1
  332. package/dist/rerankers/clef.js +3 -6
  333. package/dist/rerankers/cross-encoder.d.ts +31 -2
  334. package/dist/rerankers/cross-encoder.js +63 -97
  335. package/dist/rerankers/index.js +5 -4
  336. package/dist/rerankers/jev.js +2 -4
  337. package/dist/rerankers/outage-warning.d.ts +3 -1
  338. package/dist/rerankers/outage-warning.js +5 -3
  339. package/dist/search/bm25-search.js +1 -1
  340. package/dist/search/boosts.js +1 -1
  341. package/dist/search/embed-memories.d.ts +9 -0
  342. package/dist/search/embed-memories.js +377 -0
  343. package/dist/search/goal-boost.d.ts +1 -1
  344. package/dist/search/goal-boost.js +6 -3
  345. package/dist/search/hybrid.d.ts +9 -2
  346. package/dist/search/hybrid.js +9 -4
  347. package/dist/search/physics-search.d.ts +6 -3
  348. package/dist/search/physics-search.js +22 -15
  349. package/dist/search/rerank.js +1 -1
  350. package/dist/search/vector.d.ts +8 -6
  351. package/dist/search/vector.js +10 -13
  352. package/dist/server/auth.d.ts +2 -0
  353. package/dist/server/auth.js +17 -7
  354. package/dist/server/boot.js +7 -66
  355. package/dist/server/client-ip.d.ts +0 -2
  356. package/dist/server/client-ip.js +3 -2
  357. package/dist/server/deadline.d.ts +0 -2
  358. package/dist/server/deadline.js +1 -7
  359. package/dist/server/defaults.d.ts +1 -0
  360. package/dist/server/defaults.js +1 -0
  361. package/dist/server/mcp-http.js +16 -11
  362. package/dist/server/request.js +7 -2
  363. package/dist/server/route-checks.d.ts +7 -0
  364. package/dist/server/route-checks.js +42 -0
  365. package/dist/server/route-table.d.ts +9 -8
  366. package/dist/server/route-table.js +127 -132
  367. package/dist/server/routes/admin.d.ts +8 -8
  368. package/dist/server/routes/admin.js +13 -21
  369. package/dist/server/routes/customer-notes.d.ts +6 -6
  370. package/dist/server/routes/customer-notes.js +1 -2
  371. package/dist/server/routes/decisions.d.ts +6 -6
  372. package/dist/server/routes/decisions.js +2 -4
  373. package/dist/server/routes/incidents.d.ts +6 -6
  374. package/dist/server/routes/incidents.js +2 -5
  375. package/dist/server/routes/memories.d.ts +9 -9
  376. package/dist/server/routes/memories.js +15 -38
  377. package/dist/server/routes/object-routes.d.ts +6 -6
  378. package/dist/server/routes/object-routes.js +4 -7
  379. package/dist/server/routes/policies.d.ts +7 -7
  380. package/dist/server/routes/policies.js +2 -4
  381. package/dist/server/routes/predictions.d.ts +6 -6
  382. package/dist/server/routes/predictions.js +9 -13
  383. package/dist/server/routes/processes.d.ts +6 -6
  384. package/dist/server/routes/processes.js +1 -2
  385. package/dist/server/routes/project-briefs.d.ts +7 -7
  386. package/dist/server/routes/project-briefs.js +2 -4
  387. package/dist/server/routes/recall.d.ts +5 -5
  388. package/dist/server/routes/recall.js +6 -10
  389. package/dist/server/routes/skills.d.ts +7 -7
  390. package/dist/server/routes/skills.js +2 -4
  391. package/dist/server/server-detect.d.ts +7 -1
  392. package/dist/server/server-detect.js +36 -11
  393. package/dist/server/sleep-child.js +26 -7
  394. package/dist/server/sleep-offload.d.ts +11 -5
  395. package/dist/server/sleep-offload.js +17 -11
  396. package/dist/server/types.d.ts +22 -10
  397. package/dist/server/validation.d.ts +1 -2
  398. package/dist/server/validation.js +6 -11
  399. package/dist/server.d.ts +5 -4
  400. package/dist/server.js +5 -4
  401. package/dist/sharing/global-store.js +2 -2
  402. package/dist/sharing/global-sync.js +38 -45
  403. package/dist/sharing/project-merge.d.ts +7 -14
  404. package/dist/sharing/project-merge.js +57 -121
  405. package/dist/sharing/search-both.js +1 -1
  406. package/dist/sharing/share.d.ts +2 -0
  407. package/dist/sharing/share.js +37 -34
  408. package/dist/store/ambient.js +5 -6
  409. package/dist/store/audit-event.d.ts +1 -1
  410. package/dist/store/audit.d.ts +0 -16
  411. package/dist/store/audit.js +4 -55
  412. package/dist/store/auth.d.ts +4 -2
  413. package/dist/store/auth.js +7 -3
  414. package/dist/store/candidates.d.ts +3 -2
  415. package/dist/store/candidates.js +42 -23
  416. package/dist/store/capture-write.d.ts +17 -0
  417. package/dist/store/capture-write.js +35 -0
  418. package/dist/store/cards.js +1 -1
  419. package/dist/store/compaction-caller.d.ts +18 -0
  420. package/dist/store/compaction-caller.js +29 -0
  421. package/dist/store/compactions-record.d.ts +115 -0
  422. package/dist/store/compactions-record.js +417 -0
  423. package/dist/store/compactions.js +6 -4
  424. package/dist/store/conflicts.js +7 -4
  425. package/dist/store/connectors/dlq.d.ts +10 -0
  426. package/dist/store/connectors/dlq.js +32 -0
  427. package/dist/store/connectors/github.d.ts +7 -9
  428. package/dist/store/connectors/github.js +30 -53
  429. package/dist/store/connectors/slack.d.ts +2 -11
  430. package/dist/store/connectors/slack.js +18 -47
  431. package/dist/store/dashboard-reads.js +7 -6
  432. package/dist/store/delete-and-batch.d.ts +6 -0
  433. package/dist/store/delete-and-batch.js +36 -3
  434. package/dist/store/delivery-recorder.d.ts +10 -3
  435. package/dist/store/delivery-recorder.js +12 -5
  436. package/dist/store/descendant-page.js +6 -3
  437. package/dist/store/dormant.d.ts +1 -1
  438. package/dist/store/dormant.js +3 -1
  439. package/dist/store/embeddings/index.d.ts +2 -12
  440. package/dist/store/embeddings/index.js +5 -374
  441. package/dist/store/entry-reads.d.ts +13 -4
  442. package/dist/store/entry-reads.js +47 -11
  443. package/dist/store/entry-writes.d.ts +5 -5
  444. package/dist/store/entry-writes.js +32 -12
  445. package/dist/store/failure-log-at.d.ts +8 -0
  446. package/dist/store/failure-log-at.js +16 -0
  447. package/dist/store/failure-log.d.ts +2 -2
  448. package/dist/store/failure-log.js +5 -3
  449. package/dist/{trust → store}/gated-write.d.ts +3 -1
  450. package/dist/{trust → store}/gated-write.js +7 -5
  451. package/dist/store/goals.js +20 -18
  452. package/dist/store/graph-reads.js +4 -2
  453. package/dist/store/graph-writes.d.ts +6 -6
  454. package/dist/store/graph-writes.js +48 -71
  455. package/dist/store/handoffs.d.ts +1 -1
  456. package/dist/store/handoffs.js +6 -6
  457. package/dist/store/index-and-stats.js +2 -2
  458. package/dist/store/key-writes.js +1 -1
  459. package/dist/store/ledger-turn.d.ts +9 -0
  460. package/dist/store/ledger-turn.js +38 -0
  461. package/dist/store/mirrors.js +10 -6
  462. package/dist/store/open.d.ts +0 -4
  463. package/dist/store/open.js +40 -53
  464. package/dist/store/pilot-arm.d.ts +12 -0
  465. package/dist/store/pilot-arm.js +42 -0
  466. package/dist/store/port.d.ts +9 -3
  467. package/dist/store/port.js +8 -0
  468. package/dist/store/predictions.d.ts +1 -2
  469. package/dist/store/predictions.js +3 -6
  470. package/dist/store/project-tags.d.ts +62 -0
  471. package/dist/store/project-tags.js +67 -0
  472. package/dist/store/quarantine.js +2 -1
  473. package/dist/store/recall-trace.d.ts +2 -0
  474. package/dist/store/recall-trace.js +18 -2
  475. package/dist/store/rejected-values.js +2 -1
  476. package/dist/store/rejection-probe.d.ts +4 -0
  477. package/dist/store/rejection-probe.js +19 -0
  478. package/dist/store/rejection.d.ts +0 -17
  479. package/dist/store/rejection.js +1 -21
  480. package/dist/store/rule-sql.d.ts +9 -0
  481. package/dist/store/rule-sql.js +21 -2
  482. package/dist/store/search-rows.js +9 -4
  483. package/dist/store/sessions.js +4 -2
  484. package/dist/store/set-aside.d.ts +14 -0
  485. package/dist/store/set-aside.js +23 -0
  486. package/dist/store/sqlite/busy.d.ts +3 -0
  487. package/dist/store/sqlite/busy.js +8 -0
  488. package/dist/store/sqlite/connector-events-group.js +4 -7
  489. package/dist/store/sqlite/connector-writes-group.js +3 -3
  490. package/dist/store/sqlite/entry-writes-group.js +2 -2
  491. package/dist/store/sqlite/error-codec.js +4 -3
  492. package/dist/store/sqlite/executor.js +10 -4
  493. package/dist/store/sqlite/graph-reads-group.js +1 -1
  494. package/dist/store/sqlite/held-connection.d.ts +9 -0
  495. package/dist/store/sqlite/held-connection.js +41 -0
  496. package/dist/store/sqlite/object-rows.d.ts +1 -1
  497. package/dist/store/sqlite/objects-group.d.ts +1 -1
  498. package/dist/store/sqlite/objects-group.js +1 -1
  499. package/dist/store/sqlite/store.js +14 -12
  500. package/dist/store/summaries.d.ts +3 -3
  501. package/dist/store/summaries.js +5 -4
  502. package/dist/store/token-ledger.d.ts +0 -7
  503. package/dist/store/token-ledger.js +0 -35
  504. package/dist/store/vector-index.js +3 -2
  505. package/dist/support-bundle.js +2 -3
  506. package/dist/trust/reject-flow.js +2 -2
  507. package/dist/util/agent-homes.d.ts +15 -0
  508. package/dist/util/agent-homes.js +34 -0
  509. package/dist/util/anthropic-messages.d.ts +3 -0
  510. package/dist/util/anthropic-messages.js +22 -5
  511. package/dist/util/chunked.d.ts +3 -0
  512. package/dist/util/chunked.js +10 -0
  513. package/dist/util/ellipsize.d.ts +3 -0
  514. package/dist/util/ellipsize.js +5 -0
  515. package/dist/util/env.d.ts +2 -1
  516. package/dist/util/env.js +2 -1
  517. package/dist/util/format.d.ts +3 -0
  518. package/dist/util/format.js +6 -0
  519. package/dist/util/hook-payload.d.ts +8 -0
  520. package/dist/util/hook-payload.js +37 -0
  521. package/dist/util/http-retry.d.ts +6 -0
  522. package/dist/util/http-retry.js +43 -5
  523. package/dist/util/http-util.d.ts +0 -8
  524. package/dist/util/http-util.js +10 -21
  525. package/dist/util/limits.d.ts +7 -0
  526. package/dist/util/limits.js +14 -0
  527. package/dist/util/log.d.ts +4 -0
  528. package/dist/util/log.js +9 -0
  529. package/dist/util/request-scope.d.ts +3 -1
  530. package/dist/util/request-scope.js +11 -6
  531. package/dist/util/secret-detect.js +6 -1
  532. package/dist/util/sqlite-blocked.d.ts +2 -0
  533. package/dist/util/sqlite-blocked.js +5 -0
  534. package/dist/util/stream-tee.d.ts +3 -0
  535. package/dist/util/stream-tee.js +35 -0
  536. package/dist/util/time.d.ts +4 -0
  537. package/dist/util/time.js +4 -0
  538. package/dist/util/version.d.ts +1 -1
  539. package/dist/util/version.js +1 -1
  540. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  541. package/extensions/openclaw-plugin/package.json +1 -1
  542. package/openclaw.plugin.json +1 -1
  543. package/package.json +2 -2
  544. package/dist/store/embeddings/local.d.ts +0 -15
  545. package/dist/store/embeddings/local.js +0 -175
  546. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  547. /package/dist/{cli → api}/correction-latency.js +0 -0
  548. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  549. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  550. /package/dist/{store → core}/object-types.d.ts +0 -0
  551. /package/dist/{store → core}/object-types.js +0 -0
  552. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  553. /package/dist/{capture → util}/compaction-items.js +0 -0
  554. /package/dist/{store → util}/yaml.d.ts +0 -0
  555. /package/dist/{store → util}/yaml.js +0 -0
@@ -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 } from '../api/index.js';
5
+ import { retrieve as apiRetrieve, drillDown as apiDrillDown, assemble as apiAssemble, getContext as apiGetContext, } from '../api/index.js';
6
6
  import { autoDetectContext } from '../api/context-auto.js';
7
7
  import { resolveProjectIdentity } from '../core/project-identity.js';
8
8
  import { isSharedStore } from '../core/config.js';
@@ -10,12 +10,14 @@ import { detectAnchoring, hashQueryText, biasHintEnabled, snapshotRing } from '.
10
10
  import { detectAvailabilityBias } from '../api/availability.js';
11
11
  import { estimateTokens } from '../util/token-text.js';
12
12
  import { assembleCost, assembleText, drillCost, drillText } from '../api/context-render.js';
13
- import { mcpActor } from './protocol.js';
13
+ import { mcpActor, ownsServerCwd } from './protocol.js';
14
14
  import { lastRecalledIds, resolveClientKey } from './session-state.js';
15
15
  import { formatContinuityBlock, formatMemories, memoryCost, memoriesReserve, snapshotPiece, handoffPiece, trailPiece, contextCost, tailSection, planningSection, } from './format.js';
16
16
  import { isJsonString } from '../util/json.js';
17
17
  import { parseContextRequest, parseRecallRequest, toolParams } from '../api/recall-request.js';
18
18
  import { noteRecall, sessionRing, shownRecallRows } from '../api/recall-record.js';
19
+ // Candidate pool the MCP recall ranks before the token budget trims what is shown.
20
+ const MCP_RECALL_LIMIT = 50;
19
21
  function detectBiasHints(list, pool, anchorRing, queryHash) {
20
22
  const anchoring = anchorRing ? detectAnchoring(snapshotRing(anchorRing), queryHash, list[0]?.entry.id ?? null) : null;
21
23
  const availability = biasHintEnabled('availability')
@@ -126,7 +128,7 @@ export async function runRecallTool(call) {
126
128
  // RecallContractError throws reach the MCP caller raw, as mcp-recall-fresh-tail-policy.test.ts pins.
127
129
  await apiRetrieve(apiCtx, {
128
130
  ...recallOpts,
129
- limit: 50,
131
+ limit: MCP_RECALL_LIMIT,
130
132
  mode: config.physics?.enabled !== false ? 'physics' : 'hybrid',
131
133
  // The hint is computed below over the list MCP shows; the window band's copy would emit its audit row twice.
132
134
  suppressAvailabilityHint: true,
@@ -211,10 +213,10 @@ export async function runDrillTool({ args, ctx, hippoRoot, tenantId }) {
211
213
  }
212
214
  return drillText(r);
213
215
  }
214
- // The served store names the project (an HTTP daemon runs from anywhere); the global root names none, so stdio falls back to its launch cwd.
215
- function localProject(hippoRoot) {
216
+ // The served store names the project (an HTTP daemon runs from anywhere); the global root names none, so only an owner of the server cwd falls back to it.
217
+ function localProject(hippoRoot, ownsCwd) {
216
218
  const storeProject = resolveProjectIdentity(path.dirname(path.resolve(hippoRoot)));
217
- return storeProject.name !== '' ? storeProject : resolveProjectIdentity(process.cwd());
219
+ return storeProject.name !== '' || !ownsCwd ? storeProject : resolveProjectIdentity(process.cwd());
218
220
  }
219
221
  export async function runContextTool({ args, ctx, hippoRoot, config, tenantId }) {
220
222
  // Stdio names no project, and the store's folder or the launch cwd is no caller's; HTTP sends X-Hippo-Project.
@@ -226,12 +228,13 @@ export async function runContextTool({ args, ctx, hippoRoot, config, tenantId })
226
228
  return '';
227
229
  if (budget < memoriesReserve(budget))
228
230
  return ''; // not even the heading fits, so nothing prints, as at budget 0
231
+ const ownsCwd = ownsServerCwd(ctx);
229
232
  const result = await apiGetContext({ hippoRoot, tenantId, actor: mcpActor(ctx), store: ctx?.store }, {
230
- // The server's git state is no caller's, so a shared-store caller gets its project's rows without a query.
231
- q: ctx?.project ? undefined : autoDetectContext(),
233
+ // The server's git state is no remote caller's, so a project or remote caller gets rows by strength without a query.
234
+ q: ctx?.project || !ownsCwd ? undefined : autoDetectContext(),
232
235
  budget,
233
236
  exactScope,
234
- currentProject: ctx?.project ?? localProject(hippoRoot),
237
+ currentProject: ctx?.project ?? localProject(hippoRoot, ownsCwd),
235
238
  cost: contextCost,
236
239
  });
237
240
  lastRecalledIds.set(resolveClientKey(ctx), result.entries.map((r) => r.entry.id));
@@ -4,7 +4,8 @@ import { STORE_NOT_PORTED_MESSAGE } from '../util/http-util.js';
4
4
  import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
5
5
  import { loadConfig } from '../core/config.js';
6
6
  import { resolveTenantId } from '../store/tenant.js';
7
- import { rethrowIfSqliteBlocked, runWithRequestStores } from '../db/index.js';
7
+ import { runWithRequestStores } from '../db/index.js';
8
+ import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
8
9
  import { hasGroup, storeFor } from '../store/index.js';
9
10
  import { estimateTokens } from '../util/token-text.js';
10
11
  import { PACKAGE_VERSION } from '../util/version.js';
package/dist/mcp/stdio.js CHANGED
@@ -1,7 +1,8 @@
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
3
  import { errorFields, errorMessage, log } from '../util/log.js';
4
- import { requestDeadlineMs } from '../server/deadline.js';
4
+ import { requestDeadlineMs } from '../util/request-scope.js';
5
+ import { MAX_BODY_BYTES } from '../util/http-util.js';
5
6
  import { parseFrame } from './framing.js';
6
7
  import { mcpErrorResponse } from './protocol.js';
7
8
  import { handleMcpRequest } from './request.js';
@@ -14,7 +15,10 @@ function send(msg) {
14
15
  process.stdout.write(JSON.stringify(msg) + '\n');
15
16
  }
16
17
  // ── Stdio transport ──
17
- let buffer = Buffer.alloc(0);
18
+ let pending = [];
19
+ let pendingBytes = 0;
20
+ // Set when the pending bytes hold a Content-Length header whose body has not fully arrived.
21
+ let needs;
18
22
  // The part of a refused frame still on its way, dropped as it arrives so it is never buffered or read as a new frame.
19
23
  let refused = 0;
20
24
  function withoutRefused(chunk) {
@@ -69,7 +73,8 @@ function callName(req) {
69
73
  const tool = req.params?.name;
70
74
  return isJsonString(tool) ? `${req.method} ${tool.slice(0, 128)}` : req.method;
71
75
  }
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. */
76
+ /** Answers `req` with one timeout error at the deadline a served request has. The returned function stops the timer and says whether that
77
+ * answer went out, so a later reply is dropped. */
73
78
  function watchDeadline(req, owedReply) {
74
79
  const ms = requestDeadlineMs();
75
80
  if (ms === 0)
@@ -122,20 +127,29 @@ function dispatch(body) {
122
127
  track(req.method, handleMcpRequest(req).then((resp) => { if (!timedOut() && resp)
123
128
  send(resp); }).catch((err) => {
124
129
  if (timedOut())
125
- log.debug(`mcp: ${callName(req)} failed after its timeout reply: ${errorMessage(err)}`);
130
+ log.error(`mcp: ${callName(req)} failed after its timeout reply: ${errorMessage(err)}`, errorFields(err));
126
131
  else
127
- send(mcpErrorResponse(req.id, err));
132
+ send(mcpErrorResponse(req.id, err, undefined, callName(req)));
128
133
  }));
129
134
  }
130
135
  /** 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
136
  * (which imports `handleMcpRequest`) does not steal stdin or exit when its parent closes a pipe. */
132
137
  export function startStdioLoop() {
133
- process.stdin.on('data', (chunk) => {
134
- buffer = Buffer.concat([buffer, withoutRefused(chunk)]);
138
+ process.stdin.on('data', (raw) => {
139
+ const chunk = withoutRefused(raw);
140
+ pending.push(chunk);
141
+ pendingBytes += chunk.length;
142
+ // Joining on every chunk would copy the whole pending frame each time; wait until a frame can have ended.
143
+ if (needs === undefined ? !chunk.includes(0x0a) && pendingBytes <= MAX_BODY_BYTES : pendingBytes < needs)
144
+ return;
145
+ let buffer = Buffer.concat(pending, pendingBytes);
146
+ needs = undefined;
135
147
  while (true) {
136
148
  const result = parseFrame(buffer);
137
- if (result.kind === 'incomplete')
149
+ if (result.kind === 'incomplete') {
150
+ needs = result.needs;
138
151
  break;
152
+ }
139
153
  buffer = result.rest;
140
154
  if (result.kind === 'oversize') {
141
155
  refused = result.remainder;
@@ -147,6 +161,8 @@ export function startStdioLoop() {
147
161
  if (result.kind === 'message')
148
162
  runWithRequestId(randomUUID(), () => dispatch(result.body));
149
163
  }
164
+ pending = buffer.length > 0 ? [buffer] : [];
165
+ pendingBytes = buffer.length;
150
166
  });
151
167
  process.stdin.on('end', () => { void exitWhenDrained(); });
152
168
  installCrashHandlers('mcp');
@@ -1,4 +1,5 @@
1
1
  // Hand-written for the JSON Schema subset the hippo tool definitions use, so the MCP server needs no validator dependency.
2
+ import { truncateWithEllipsis } from '../util/ellipsize.js';
2
3
  const ARG_PREVIEW_CHARS = 40;
3
4
  function isArgString(v) {
4
5
  return typeof v === 'string';
@@ -24,7 +25,7 @@ function describeValue(v) {
24
25
  if (Array.isArray(v))
25
26
  return 'array';
26
27
  if (isArgString(v))
27
- return JSON.stringify(v.length > ARG_PREVIEW_CHARS ? `${v.slice(0, ARG_PREVIEW_CHARS)}...` : v);
28
+ return JSON.stringify(truncateWithEllipsis(v, ARG_PREVIEW_CHARS));
28
29
  if (isArgNumber(v) || isArgBoolean(v))
29
30
  return String(v);
30
31
  return 'object';
package/dist/mcp/tools.js CHANGED
@@ -1,18 +1,18 @@
1
1
  // Tool definitions and input schemas served by tools/list.
2
2
  import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
3
3
  import { DEFAULT_ASSEMBLE_BUDGET } from '../api/assemble.js';
4
- import { MAX_ID_LEN } from '../util/http-util.js';
4
+ import { MAX_ID_LEN, MAX_LIST_LIMIT } from '../util/limits.js';
5
5
  import { DEFAULT_SEARCH_CANDIDATE_LIMIT } from '../store/rows.js';
6
6
  import { DEFAULT_CONFIG } from '../core/config.js';
7
7
  // ── Tool definitions ──
8
8
  // HTTP sets no budget cap; 25x the recall default leaves room for large-context clients while bounding one call's work.
9
9
  const MAX_BUDGET_TOKENS = 25 * DEFAULT_RECALL_BUDGET;
10
- // Same ceiling as the HTTP list routes' parseListLimit.
11
- const MAX_LIST_LIMIT = 1000;
12
10
  export const TOOLS = [
13
11
  {
14
12
  name: 'hippo_recall',
15
- description: 'Retrieve relevant memories from the project memory store. Returns memories ranked by relevance, strength, and recency within the token budget. Use at session start or when you need context about a topic. Pass include_continuity=true to also surface the active task snapshot, latest matching session handoff, and recent session events as a "## Continuity" appendix.',
13
+ description: 'Retrieve relevant memories from the project memory store. Returns memories ranked by relevance, strength, and recency within the token budget. Use ' +
14
+ 'at session start or when you need context about a topic. Pass include_continuity=true to also surface the active task snapshot, latest matching ' +
15
+ 'session handoff, and recent session events as a "## Continuity" appendix.',
16
16
  inputSchema: {
17
17
  type: 'object',
18
18
  properties: {
@@ -29,28 +29,37 @@ export const TOOLS = [
29
29
  },
30
30
  scope: {
31
31
  type: 'string',
32
- description: 'Restrict results and continuity to memories/rows matching this scope exactly. When omitted, default-deny applies to ANY <source>:private:* (slack, github, ...) and unknown-legacy rows.',
32
+ description: 'Restrict results and continuity to memories/rows matching this scope exactly. When omitted, default-deny applies to ANY ' +
33
+ '<source>:private:* (slack, github, ...) and unknown-legacy rows.',
33
34
  },
34
35
  fresh_tail_count: {
35
36
  type: 'number',
36
- description: 'When > 0, surface the last N kind=raw rows tagged isFreshTail=true regardless of query match. Useful for "what did I just see" continuity. Capped at 200.',
37
+ description: 'When > 0, surface the last N kind=raw rows tagged isFreshTail=true regardless of query match. Useful for "what did I just see" ' +
38
+ 'continuity. Capped at 200.',
37
39
  },
38
40
  fresh_tail_session_id: {
39
41
  type: 'string',
40
- description: 'Restrict the fresh-tail window to a specific session. Without this, fresh-tail is tenant-wide (legacy v1.5.2 behaviour, pre-v1.6.3 default).',
42
+ description: 'Restrict the fresh-tail window to a specific session. Without this, fresh-tail is tenant-wide (legacy v1.5.2 behaviour, pre-v1.6.3 ' +
43
+ 'default).',
41
44
  },
42
45
  summarize_overflow: {
43
46
  type: 'boolean',
44
- description: 'When true (default), entries that overflow the limit and share a level-2 parent summary cause that summary to be appended in their place. Set false for strict-limit behaviour.',
47
+ description: 'When true (default), entries that overflow the limit and share a level-2 parent summary cause that summary to be appended in their ' +
48
+ 'place. Set false for strict-limit behaviour.',
45
49
  },
46
50
  scorer_window: {
47
51
  type: 'number',
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.`,
52
+ description: `How many of the top-ranked memories the fresh-tail and summarize-overflow appendix is worked out against. ` +
53
+ `The main list ranks the whole tenant store, so scorer_window does not narrow it. ` +
54
+ `Default ${DEFAULT_SEARCH_CANDIDATE_LIMIT}. ` +
55
+ `Rejected as RecallContractError code=invalid_scorer_window if 0/negative/non-finite/non-numeric.`,
49
56
  },
50
57
  session_id: {
51
58
  type: 'string',
52
59
  maxLength: MAX_ID_LEN,
53
- description: `Optional session id (v1.7.4). When set AND (tenant, session) has active goals, applies the dlPFC goal-stack boost to the ranked memories before formatting. Mirrors fresh_tail_session_id shape (${MAX_ID_LEN}-char cap).`,
60
+ description: `Optional session id (v1.7.4). When set AND (tenant, session) has active goals, ` +
61
+ `applies the dlPFC goal-stack boost to the ranked memories before formatting. ` +
62
+ `Mirrors fresh_tail_session_id shape (${MAX_ID_LEN}-char cap).`,
54
63
  },
55
64
  },
56
65
  required: ['query'],
@@ -58,7 +67,9 @@ export const TOOLS = [
58
67
  },
59
68
  {
60
69
  name: 'hippo_assemble',
61
- description: 'Build a chronologically-ordered context window for a session. Returns ordered items: fresh-tail raw rows + level-2 summary substitutions for older rows + budget-fit. Hippo-additive vs lossless-claw: eviction picks lowest-strength non-fresh-tail items first instead of oldest-first. Tenant-scoped; default-deny on private scopes.',
70
+ description: 'Build a chronologically-ordered context window for a session. Returns ordered items: fresh-tail raw rows + level-2 summary substitutions for older ' +
71
+ 'rows + budget-fit. Hippo-additive vs lossless-claw: eviction picks lowest-strength non-fresh-tail items first instead of oldest-first. ' +
72
+ 'Tenant-scoped; default-deny on private scopes.',
62
73
  inputSchema: {
63
74
  type: 'object',
64
75
  properties: {
@@ -82,7 +93,8 @@ export const TOOLS = [
82
93
  },
83
94
  scope: {
84
95
  type: 'string',
85
- description: 'Restrict to memories whose scope matches exactly. When omitted, default-deny applies to ANY <source>:private:* scope and unknown:legacy rows. Pass an explicit scope to assemble a private session with consent.',
96
+ description: 'Restrict to memories whose scope matches exactly. When omitted, default-deny applies to ANY <source>:private:* scope and ' +
97
+ 'unknown:legacy rows. Pass an explicit scope to assemble a private session with consent.',
86
98
  },
87
99
  },
88
100
  required: ['session_id'],
@@ -90,7 +102,8 @@ export const TOOLS = [
90
102
  },
91
103
  {
92
104
  name: 'hippo_drill',
93
- description: 'Walk one step down the DAG from a level-2+ topic summary to its direct children. Companion to hippo_recall: when recall returns an item with isSummary=true and substitutedFor=[ids], pass the summary id here to recover the original detail. Tenant-scoped; default-deny on private scopes.',
105
+ description: 'Walk one step down the DAG from a level-2+ topic summary to its direct children. Companion to hippo_recall: when recall returns an item with ' +
106
+ 'isSummary=true and substitutedFor=[ids], pass the summary id here to recover the original detail. Tenant-scoped; default-deny on private scopes.',
94
107
  inputSchema: {
95
108
  type: 'object',
96
109
  properties: {
@@ -114,7 +127,8 @@ export const TOOLS = [
114
127
  type: 'integer',
115
128
  minimum: 1,
116
129
  maximum: 10,
117
- description: 'v0.30 / E5: walk N levels down (default 1 = direct children only). Higher values include children of children. Token budget remains GLOBAL across levels. Hard cap 10.',
130
+ description: 'v0.30 / E5: walk N levels down (default 1 = direct children only). Higher values include children of children. Token budget remains ' +
131
+ 'GLOBAL across levels. Hard cap 10.',
118
132
  },
119
133
  },
120
134
  required: ['summary_id'],
@@ -122,7 +136,8 @@ export const TOOLS = [
122
136
  },
123
137
  {
124
138
  name: 'hippo_remember',
125
- description: 'Store a new memory. Use when you learn something non-obvious, hit an error, or discover a useful pattern. Memories decay over time unless retrieved. Errors get 2x half-life.',
139
+ description: 'Store a new memory. Use when you learn something non-obvious, hit an error, or discover a useful pattern. Memories decay over time unless retrieved. ' +
140
+ 'Errors get 2x half-life.',
126
141
  inputSchema: {
127
142
  type: 'object',
128
143
  properties: {
@@ -133,14 +148,16 @@ export const TOOLS = [
133
148
  error: { type: 'boolean', description: 'Mark as error memory (doubles half-life)' },
134
149
  pin: { type: 'boolean', description: 'Pin memory (never decays)' },
135
150
  tag: { type: 'string', description: 'Optional tag for categorization' },
136
- personal: { type: 'boolean', description: 'Store it as your own private memory: only you can recall it, in every project. Needs a key you minted or a sign-in.' },
151
+ personal: { type: 'boolean', description: 'Store it as your own private memory: only you can recall it, in every project. Needs a key you minted or ' +
152
+ 'a sign-in.' },
137
153
  },
138
154
  required: ['text'],
139
155
  },
140
156
  },
141
157
  {
142
158
  name: 'hippo_outcome',
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.",
159
+ 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 " +
160
+ "completing work.",
144
161
  inputSchema: {
145
162
  type: 'object',
146
163
  properties: {
@@ -154,7 +171,9 @@ export const TOOLS = [
154
171
  },
155
172
  {
156
173
  name: 'hippo_context',
157
- description: 'Smart context injection: auto-detects current task from git state and returns relevant memories plus the active task snapshot, session handoff and recent session trail (the same bundle as GET /v1/context). Use at the start of any session. Memories and those sections are scope-filtered: a no-scope caller does NOT see ANY <source>:private:* (slack, github, ...) or legacy-quarantine rows.',
174
+ description: 'Smart context injection: auto-detects current task from git state and returns relevant memories plus the active task snapshot, session handoff and ' +
175
+ 'recent session trail (the same bundle as GET /v1/context). Use at the start of any session. Memories and those sections are scope-filtered: a ' +
176
+ 'no-scope caller does NOT see ANY <source>:private:* (slack, github, ...) or legacy-quarantine rows.',
158
177
  inputSchema: {
159
178
  type: 'object',
160
179
  properties: {
@@ -166,7 +185,8 @@ export const TOOLS = [
166
185
  },
167
186
  scope: {
168
187
  type: 'string',
169
- description: 'Restrict memories, snapshot, handoff and trail to this scope exactly. When omitted, default-deny applies to ANY <source>:private:* (slack, github, ...) and unknown-legacy rows.',
188
+ description: 'Restrict memories, snapshot, handoff and trail to this scope exactly. When omitted, default-deny applies to ANY <source>:private:* ' +
189
+ '(slack, github, ...) and unknown-legacy rows.',
170
190
  },
171
191
  },
172
192
  },
@@ -234,13 +254,16 @@ export const TOOLS = [
234
254
  },
235
255
  {
236
256
  name: 'hippo_predict_baserate',
237
- description: 'J3 reference-class / planning-fallacy detector. Get base-rate stats for closed predictions in a class. Call this when you make a forward-looking claim (effort estimate, rollout risk, deadline) to anchor on the past track record rather than the inside view. Returns count + mean estimate + mean actual + mean ratio + median ratio + MAE + a human-readable summary. Tenant-scoped.',
257
+ description: 'J3 reference-class / planning-fallacy detector. Get base-rate stats for closed predictions in a class. Call this when you make a forward-looking ' +
258
+ 'claim (effort estimate, rollout risk, deadline) to anchor on the past track record rather than the inside view. Returns count + mean estimate + ' +
259
+ 'mean actual + mean ratio + median ratio + MAE + a human-readable summary. Tenant-scoped.',
238
260
  inputSchema: {
239
261
  type: 'object',
240
262
  properties: {
241
263
  class_tag: {
242
264
  type: 'string',
243
- description: 'Cohort label, e.g. "migration-effort", "rollout-risk", "deadline-week". Must match the class_tag used when the predictions were created via hippo_predict (or `hippo predict ...`).',
265
+ description: 'Cohort label, e.g. "migration-effort", "rollout-risk", "deadline-week". Must match the class_tag used when the predictions were ' +
266
+ 'created via hippo_predict (or `hippo predict ...`).',
244
267
  },
245
268
  },
246
269
  required: ['class_tag'],
@@ -2,8 +2,8 @@
2
2
  * The `customer_notes` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall. */
3
3
  import type { KeysetPosition } from '../util/keyset.js';
4
4
  import type { SavableDescriptor } from './descriptor.js';
5
- import type { CustomerNote, NoteStatus } from '../store/object-types.js';
6
- export type { CustomerNote, NoteStatus } from '../store/object-types.js';
5
+ import type { CustomerNote, NoteStatus } from '../core/object-types.js';
6
+ export type { CustomerNote, NoteStatus } from '../core/object-types.js';
7
7
  export declare const VALID_NOTE_STATES: ReadonlySet<NoteStatus>;
8
8
  /** Field caps (untrusted at the HTTP/SDK boundary). note is a body, so a larger cap
9
9
  * than the 4096 short-field convention. */
@@ -3,8 +3,8 @@
3
3
  import type { MemoryEntry } from '../core/memory.js';
4
4
  import type { KeysetPosition } from '../util/keyset.js';
5
5
  import type { SavableDescriptor } from './descriptor.js';
6
- import type { Decision, DecisionStatus } from '../store/object-types.js';
7
- export type { Decision, DecisionStatus } from '../store/object-types.js';
6
+ import type { Decision, DecisionStatus } from '../core/object-types.js';
7
+ export type { Decision, DecisionStatus } from '../core/object-types.js';
8
8
  export declare const VALID_DECISION_STATES: ReadonlySet<DecisionStatus>;
9
9
  export interface SaveDecisionOpts {
10
10
  decisionText: string;
@@ -1,5 +1,5 @@
1
1
  import type { KeysetPosition } from '../util/keyset.js';
2
- import type { ObjectByKind, ObjectFields, ObjectKind, SavableKind } from '../store/object-types.js';
2
+ import type { ObjectByKind, ObjectFields, ObjectKind, SavableKind } from '../core/object-types.js';
3
3
  export interface ObjectDescriptor<K extends ObjectKind> {
4
4
  readonly kind: K;
5
5
  /** The nouns error text uses: "brief 3 not found", "only active briefs". */
@@ -3,9 +3,9 @@
3
3
  * linked_memory_ids must all exist in the SAME tenant or save throws before the insert. */
4
4
  import type { KeysetPosition } from '../util/keyset.js';
5
5
  import type { ObjectDescriptor } from './descriptor.js';
6
- import type { Incident, IncidentStatus } from '../store/object-types.js';
6
+ import type { Incident, IncidentStatus } from '../core/object-types.js';
7
7
  import { type Objects } from '../store/port.js';
8
- export type { Incident, IncidentStatus } from '../store/object-types.js';
8
+ export type { Incident, IncidentStatus } from '../core/object-types.js';
9
9
  export declare const VALID_INCIDENT_STATES: ReadonlySet<IncidentStatus>;
10
10
  export interface SaveIncidentOpts {
11
11
  incidentText: string;
@@ -1,5 +1,5 @@
1
1
  import { type MemoryEntry } from '../core/memory.js';
2
- import type { ObjectByKind, ObjectKind, SavableKind } from '../store/object-types.js';
2
+ import type { ObjectByKind, ObjectKind, SavableKind } from '../core/object-types.js';
3
3
  import { type Objects } from '../store/port.js';
4
4
  import type { ObjectDescriptor, ObjectListOpts, SavableDescriptor } from './descriptor.js';
5
5
  /** Newest first. */
@@ -1,6 +1,7 @@
1
1
  // Save, close, load-by-id and list for every typed object: the checks, the mirror memory and the error text, over the `objects` store group.
2
2
  // Each flow is written twice over the same steps: `...At` answers at once on hippo.db for the CLI, and the other awaits a served store's group for the routes.
3
3
  // The tenant, the fields and the list status are checked first, so a bad request fails before a store is asked.
4
+ import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
4
5
  import { BadRequestError, ConflictError, NotFoundError } from '../core/api-errors.js';
5
6
  import { loadConfig } from '../core/config.js';
6
7
  import { createMemory, Layer } from '../core/memory.js';
@@ -13,7 +14,7 @@ function listQuery(d, tenantId, opts) {
13
14
  if (opts.status && !d.states.has(opts.status)) {
14
15
  throw new BadRequestError(`${d.fn.list}: status must be one of ${Array.from(d.states).join('|')}; got ${opts.status}`);
15
16
  }
16
- return { status: opts.status || undefined, filter: opts.filter || undefined, limit: opts.limit ?? 100, after: opts.after };
17
+ return { status: opts.status || undefined, filter: opts.filter || undefined, limit: opts.limit ?? DEFAULT_LIST_LIMIT, after: opts.after };
17
18
  }
18
19
  /** Newest first. */
19
20
  export function listObjectsAt(hippoRoot, d, tenantId, opts) {
@@ -3,9 +3,9 @@
3
3
  * All dates are normalised to ISO-8601 (`toISOString`) at the store boundary so the lexical half-open comparison is sound. */
4
4
  import type { KeysetPosition } from '../util/keyset.js';
5
5
  import type { SavableDescriptor } from './descriptor.js';
6
- import type { Policy, PolicyStatus } from '../store/object-types.js';
6
+ import type { Policy, PolicyStatus } from '../core/object-types.js';
7
7
  import type { Objects } from '../store/port.js';
8
- export type { Policy, PolicyStatus } from '../store/object-types.js';
8
+ export type { Policy, PolicyStatus } from '../core/object-types.js';
9
9
  export declare const VALID_POLICY_STATES: ReadonlySet<PolicyStatus>;
10
10
  export interface SavePolicyOpts {
11
11
  policyName: string;
@@ -1,6 +1,7 @@
1
1
  /** Policy object: a rule in force over a valid-time range [valid_from, valid_to), evolving via supersession; `loadPoliciesAsOf` queries it.
2
2
  * Transaction-time travel (what we believed at past system time T) is deferred. Superseding keeps the predecessor's valid-time range.
3
3
  * All dates are normalised to ISO-8601 (`toISOString`) at the store boundary so the lexical half-open comparison is sound. */
4
+ import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
4
5
  import { BadRequestError } from '../core/api-errors.js';
5
6
  import { assertTenantId } from '../store/tenant.js';
6
7
  import { closeObjectAt, listObjectsAt, objectByIdAt, saveObjectAt } from './lifecycle.js';
@@ -97,6 +98,6 @@ function inForceQuery(tenantId, asOfDate, opts) {
97
98
  const asOf = /^\d{4}-\d{2}-\d{2}$/.test(asOfDate.trim())
98
99
  ? normalizePolicyDate(`${asOfDate.trim()}T23:59:59.999Z`, 'asOfDate')
99
100
  : normalizePolicyDate(asOfDate, 'asOfDate');
100
- return { asOf, name: opts.name, limit: opts.limit ?? 100 };
101
+ return { asOf, name: opts.name, limit: opts.limit ?? DEFAULT_LIST_LIMIT };
101
102
  }
102
103
  //# sourceMappingURL=policies.js.map
@@ -4,8 +4,8 @@
4
4
  import type { KeysetPosition } from '../util/keyset.js';
5
5
  import { type JsonValue } from '../util/json.js';
6
6
  import type { SavableDescriptor } from './descriptor.js';
7
- import type { Process, ProcessStatus } from '../store/object-types.js';
8
- export type { Process, ProcessStatus } from '../store/object-types.js';
7
+ import type { Process, ProcessStatus } from '../core/object-types.js';
8
+ export type { Process, ProcessStatus } from '../core/object-types.js';
9
9
  export declare const VALID_PROCESS_STATES: ReadonlySet<ProcessStatus>;
10
10
  /** DoS / abuse caps on the steps body (untrusted at the HTTP/SDK boundary). */
11
11
  export declare const MAX_PROCESS_STEPS = 200;
@@ -4,9 +4,9 @@
4
4
  import type { KeysetPosition } from '../util/keyset.js';
5
5
  import type { SavableDescriptor } from './descriptor.js';
6
6
  import { type ObjectSaveSite } from './lifecycle.js';
7
- import type { BriefStatus, ProjectBrief } from '../store/object-types.js';
7
+ import type { BriefStatus, ProjectBrief } from '../core/object-types.js';
8
8
  import type { Objects } from '../store/port.js';
9
- export type { BriefStatus, ProjectBrief } from '../store/object-types.js';
9
+ export type { BriefStatus, ProjectBrief } from '../core/object-types.js';
10
10
  export declare const VALID_BRIEF_STATES: ReadonlySet<BriefStatus>;
11
11
  /** Field caps (untrusted at the HTTP/SDK boundary). summary is a body, so a larger
12
12
  * cap than the 4096 short-field convention. */
@@ -1,6 +1,7 @@
1
1
  /** Project_brief object: the living, repo-scoped `summary` of a repository, evolving via supersession.
2
2
  * `refreshBrief` assembles recent `path:<repo>` receipts with a deterministic (no-LLM) assembler; an LLM pipeline is deferred.
3
3
  * The `project_briefs` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall. */
4
+ import { truncateWithEllipsis } from '../util/ellipsize.js';
4
5
  import { BadRequestError } from '../core/api-errors.js';
5
6
  import { assertTenantId } from '../store/tenant.js';
6
7
  import { checkText, requireLine } from './fields.js';
@@ -87,9 +88,7 @@ function newestActive(repo) {
87
88
  function receiptHeadline(content) {
88
89
  const firstLine = (content ?? '').split(/\r?\n/).find((l) => l.trim().length > 0) ?? '';
89
90
  const trimmed = firstLine.trim();
90
- return trimmed.length > MAX_RECEIPT_HEADLINE_LEN
91
- ? `${trimmed.slice(0, MAX_RECEIPT_HEADLINE_LEN)}...`
92
- : trimmed;
91
+ return truncateWithEllipsis(trimmed, MAX_RECEIPT_HEADLINE_LEN);
93
92
  }
94
93
  /** The tag a memory of the repo carries; the store matches it whole, so `path:hip` never matches `path:hippo`. */
95
94
  function receiptTag(normalizedRepo) {
@@ -3,9 +3,9 @@
3
3
  * `trigger` is stored in `trigger_text` because it is a SQLite reserved keyword. */
4
4
  import type { KeysetPosition } from '../util/keyset.js';
5
5
  import type { SavableDescriptor } from './descriptor.js';
6
- import type { Skill, SkillStatus } from '../store/object-types.js';
6
+ import type { Skill, SkillStatus } from '../core/object-types.js';
7
7
  import type { Objects } from '../store/port.js';
8
- export type { Skill, SkillStatus } from '../store/object-types.js';
8
+ export type { Skill, SkillStatus } from '../core/object-types.js';
9
9
  export declare const VALID_SKILL_STATES: ReadonlySet<SkillStatus>;
10
10
  /** Field caps (untrusted at the HTTP/SDK boundary). instructions is a body, so a
11
11
  * larger cap than the 4096 short-field convention. */
@@ -3,7 +3,7 @@ import * as fs from 'node:fs';
3
3
  import * as os from 'node:os';
4
4
  import * as path from 'node:path';
5
5
  import { detectRealCodexPath, isCodexWrapperInstalled, repairCodexWrapperIfInstalled } from './hooks/codex-wrapper.js';
6
- import { claudeConfigDir } from './hooks/shared.js';
6
+ import { claudeConfigDir } from './util/agent-homes.js';
7
7
  import { errorMessage, log } from './util/log.js';
8
8
  function main() {
9
9
  if (envSkipPostinstall())
@@ -3,7 +3,7 @@ import { buildRelevanceRequest, JEV_DEFAULT_TOP_K, rankByScores } from './jev.js
3
3
  import { createOutageWarning } from './outage-warning.js';
4
4
  import { rerankerPost, RERANKER_MAX_REPLY_BYTES } from './remote.js';
5
5
  import { readCappedJson } from '../util/capped-json.js';
6
- import { isJsonObject } from '../util/json.js';
6
+ import { isJsonObject, isJsonString } from '../util/json.js';
7
7
  import { errorMessage } from '../util/log.js';
8
8
  const RAY_ID_MAX_CHARS = 64;
9
9
  const CLEF_MODELS = ['clef-flash', 'clef'];
@@ -23,9 +23,6 @@ function isLoopback(hostname) {
23
23
  function isNumber(v) {
24
24
  return Number.isFinite(v);
25
25
  }
26
- function isString(v) {
27
- return v !== undefined && v !== null && v.constructor === String;
28
- }
29
26
  function isRejection(v) {
30
27
  return v.constructor === String;
31
28
  }
@@ -83,7 +80,7 @@ export function parseClefReply(body, n, model, requireModel) {
83
80
  if (!isJsonObject(reply))
84
81
  return 'reply has no result object';
85
82
  const actual = reply.model;
86
- if (actual !== undefined && (!isString(actual) || actual.trim() !== model))
83
+ if (actual !== undefined && (!isJsonString(actual) || actual.trim() !== model))
87
84
  return 'reply names a different model';
88
85
  if (actual === undefined && requireModel)
89
86
  return 'reply does not name its model';
@@ -105,7 +102,7 @@ export function parseClefReply(body, n, model, requireModel) {
105
102
  const usage = isJsonObject(reply.usage) ? reply.usage : {};
106
103
  return {
107
104
  scores,
108
- actualModel: isString(actual) ? actual.trim() : undefined,
105
+ actualModel: isJsonString(actual) ? actual.trim() : undefined,
109
106
  inputTokens: isNumber(usage.input_tokens) ? usage.input_tokens : undefined,
110
107
  outputTokens: isNumber(usage.output_tokens) ? usage.output_tokens : undefined,
111
108
  };
@@ -1,4 +1,33 @@
1
1
  import type { RerankerFn } from './types.js';
2
- /** Track 2 reranker: MS-MARCO MiniLM cross-encoder, identity fallback if the model will not load. */
3
- export declare const crossEncoderReranker: RerankerFn;
2
+ interface Tokenized {
3
+ readonly input_ids: object;
4
+ readonly attention_mask: object;
5
+ }
6
+ type TokenizerFn = (text: string, opts: {
7
+ text_pair: string;
8
+ padding: boolean;
9
+ truncation: boolean;
10
+ }) => Promise<Tokenized>;
11
+ type SeqClsModel = (inputs: Tokenized) => Promise<{
12
+ logits: {
13
+ data: ArrayLike<number>;
14
+ };
15
+ }>;
16
+ interface FromPretrained<T> {
17
+ from_pretrained: (model: string) => Promise<T>;
18
+ }
19
+ interface TransformersExports {
20
+ AutoTokenizer?: FromPretrained<TokenizerFn>;
21
+ AutoModelForSequenceClassification?: FromPretrained<SeqClsModel>;
22
+ }
23
+ interface TransformersModuleNamespace extends TransformersExports {
24
+ default?: TransformersExports;
25
+ }
26
+ type ImportModule = () => Promise<{
27
+ readonly name: string;
28
+ readonly mod: TransformersModuleNamespace;
29
+ } | null>;
30
+ /** Track 2 reranker: MS-MARCO MiniLM cross-encoder, identity fallback if the model will not load. Each instance owns its model and outage warning. */
31
+ export declare function createCrossEncoderReranker(importModule?: ImportModule): RerankerFn;
32
+ export {};
4
33
  //# sourceMappingURL=cross-encoder.d.ts.map