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
@@ -2,8 +2,9 @@
2
2
  import { policiesAsOf, POLICY } from '../../objects/policies.js';
3
3
  import { HttpError, sendJson } from '../../util/http-util.js';
4
4
  import { buildContextWithAuth } from '../auth.js';
5
- import { parseJsonBody } from '../validation.js';
6
- import { closeRoute, getRoute, listRoute, objectsOf, optionalString, requiredString, saveFor, supersedeRoute } from './object-routes.js';
5
+ import { MAX_SHORT_FIELD_LEN, parseJsonBody } from '../validation.js';
6
+ import { objectsOf, saveFor } from '../../api/objects.js';
7
+ import { closeRoute, getRoute, listRoute, optionalString, requiredString, supersedeRoute, } from './object-routes.js';
7
8
  // The date fields get a type and length check only: the store parses the date, and the cap bounds a junk string before it reaches the Date parser.
8
9
  const MAX_DATE_LEN = 64;
9
10
  const policyRoutes = {
@@ -12,28 +13,20 @@ const policyRoutes = {
12
13
  listField: 'policies',
13
14
  object: POLICY,
14
15
  revise: (body) => {
15
- const policyText = requiredString(body, 'policyText', { max: 4096 });
16
+ const policyText = requiredString(body, 'policyText', { max: MAX_SHORT_FIELD_LEN });
16
17
  const validFrom = optionalString(body, 'validFrom', MAX_DATE_LEN);
17
18
  const validTo = optionalString(body, 'validTo', MAX_DATE_LEN);
18
- const changeSummary = optionalString(body, 'changeSummary', 4096);
19
+ const changeSummary = optionalString(body, 'changeSummary', MAX_SHORT_FIELD_LEN);
19
20
  return (existing, id) => ({ policyName: existing.policyName, policyText, validFrom, validTo, changeSummary, supersedesPolicyId: id });
20
21
  },
21
22
  };
22
- // ── policies (first-class object, bi-temporal-first) ──
23
- //
24
- // 6 routes: POST /v1/policies (new; processName-style body policyName +
25
- // policyText + validFrom? + validTo?), GET /v1/policies (list, status filter),
26
- // GET /v1/policies/asof (date + optional name; the bi-temporal as-of query;
27
- // placed BEFORE the /:id GET so the literal 'asof' is matched first), GET
28
- // /v1/policies/:id, POST /v1/policies/:id/supersede, POST /v1/policies/:id/close.
29
- // Date inputs are normalized + range-validated in the store; an invalid/inverted
30
- // date throws -> 400. DoS caps: policyName/policyText/changeSummary 4096.
23
+ // The as-of route is registered BEFORE /:id so the literal 'asof' is matched first; date errors surface as 400.
31
24
  export async function handleCreatePolicy(rr) {
32
25
  const ctx = await buildContextWithAuth(rr.req, rr.opts);
33
26
  const body = await parseJsonBody(rr.req, ctx);
34
- const policy = await saveFor(rr, POLICY, ctx.tenantId, ctx.actor.subject, {
35
- policyName: requiredString(body, 'policyName', { max: 4096 }),
36
- policyText: requiredString(body, 'policyText', { max: 4096 }),
27
+ const policy = await saveFor(ctx, POLICY, {
28
+ policyName: requiredString(body, 'policyName', { max: MAX_SHORT_FIELD_LEN }),
29
+ policyText: requiredString(body, 'policyText', { max: MAX_SHORT_FIELD_LEN }),
37
30
  validFrom: optionalString(body, 'validFrom', MAX_DATE_LEN),
38
31
  validTo: optionalString(body, 'validTo', MAX_DATE_LEN),
39
32
  });
@@ -52,9 +45,8 @@ export async function handlePoliciesAsOf(rr) {
52
45
  }
53
46
  const name = query.get('name') ?? undefined;
54
47
  const ctx = await buildContextWithAuth(req, opts);
55
- const policies = await policiesAsOf(objectsOf(rr), ctx.tenantId, date, { name });
48
+ const policies = await policiesAsOf(objectsOf(ctx), ctx.tenantId, date, { name });
56
49
  sendJson(res, 200, { policies });
57
- return;
58
50
  }
59
51
  export function handleSupersedePolicy(rr, match) {
60
52
  return supersedeRoute(policyRoutes, rr, match);
@@ -1,19 +1,14 @@
1
1
  // /v1/predictions routes.
2
+ import { closePrediction, listPredictions, predictionBaserate, predictionById, savePrediction } from '../../api/predictions.js';
2
3
  import { loadConfig } from '../../core/config.js';
3
4
  import { predictionMirror, VALID_CLOSURE_STATES } from '../../store/predictions.js';
4
- import { requireGroup } from '../../store/port.js';
5
5
  import { HttpError, MAX_ID_LEN, sendJson } from '../../util/http-util.js';
6
6
  import { buildContextWithAuth } from '../auth.js';
7
7
  import { byCreatedAt, pageOf, parseCursor } from '../cursor.js';
8
- import { isSetMember, parseJsonBody, parseListLimit } from '../validation.js';
8
+ import { isSetMember, MAX_SHORT_FIELD_LEN, parseJsonBody, parseListLimit } from '../validation.js';
9
9
  import { isJsonString, isJsonNumber } from '../../util/json.js';
10
- // ── prediction first-class object ──
11
- //
12
- // 4 routes: POST /v1/predictions (create), GET /v1/predictions (list),
13
- // GET /v1/predictions/:id (show), POST /v1/predictions/:id/close (close).
14
- // All Bearer-authed + tenant-scoped via buildContextWithAuth. closure_state
15
- // validated against VALID_CLOSURE_STATES (3 states). DoS caps on claim
16
- // (4096 chars) + closureNote (2048 chars).
10
+ // Routes: /v1/predictions (create, list, show, close), Bearer-authed and tenant-scoped; closure_state is validated against VALID_CLOSURE_STATES.
11
+ // DoS caps: claim MAX_SHORT_FIELD_LEN chars, closureNote 2048.
17
12
  export async function handleCreatePrediction({ req, res, opts }) {
18
13
  const ctx = await buildContextWithAuth(req, opts);
19
14
  const body = await parseJsonBody(req, ctx);
@@ -21,8 +16,8 @@ export async function handleCreatePrediction({ req, res, opts }) {
21
16
  if (!isJsonString(claim) || claim.length === 0) {
22
17
  throw new HttpError(400, 'claim is required (non-empty string)');
23
18
  }
24
- if (claim.length > 4096) {
25
- throw new HttpError(400, 'claim exceeds 4096-character cap');
19
+ if (claim.length > MAX_SHORT_FIELD_LEN) {
20
+ throw new HttpError(400, `claim exceeds ${MAX_SHORT_FIELD_LEN}-character cap`);
26
21
  }
27
22
  const classTag = body['classTag'];
28
23
  if (!isJsonString(classTag) || classTag.length === 0) {
@@ -54,9 +49,8 @@ export async function handleCreatePrediction({ req, res, opts }) {
54
49
  }
55
50
  const claimed = { classTag, claimText: claim, estimateValue, estimateUnit, targetDate: targetDateValue };
56
51
  const mirror = predictionMirror(ctx.tenantId, claimed, loadConfig(opts.hippoRoot).defaultHalfLifeDays);
57
- const prediction = await requireGroup(opts.store, 'predictions').savePrediction(ctx.tenantId, { ...claimed, mirror }, ctx.actor.subject);
52
+ const prediction = await savePrediction(ctx, { ...claimed, mirror });
58
53
  sendJson(res, 201, { prediction });
59
- return;
60
54
  }
61
55
  /** Which rows a list reads; a status other than all or open needs a class, as no store reads one closed state across classes. */
62
56
  function listFilter(classTag, status) {
@@ -78,15 +72,12 @@ export async function handleListPredictions({ req, res, opts, query }) {
78
72
  const limit = parseListLimit(query.get('limit'));
79
73
  const after = parseCursor(query.get('cursor'), 'string', 'integer');
80
74
  const ctx = await buildContextWithAuth(req, opts);
81
- const predictions = await requireGroup(opts.store, 'predictions').listPredictions(ctx.tenantId, { ...listFilter(classTag, status), limit: limit + 1, after });
75
+ const predictions = await listPredictions(ctx, { ...listFilter(classTag, status), limit: limit + 1, after });
82
76
  const page = pageOf(predictions, limit, byCreatedAt);
83
77
  sendJson(res, 200, { predictions: page.items, next_cursor: page.nextCursor });
84
- return;
85
78
  }
86
- // Reference-class / planning-fallacy detector.
87
- // Order matters: this must match BEFORE /v1/predictions/:id since 'stats'
88
- // is not a number — the :id regex requires \d+ so they don't conflict,
89
- // but routing this first avoids the dispatch order risk.
79
+ // Reference-class / planning-fallacy detector; registered BEFORE /v1/predictions/:id so dispatch order cannot matter ('stats' is not a number, but routing
80
+ // it first is safer).
90
81
  export async function handlePredictionStats({ req, res, opts, query }) {
91
82
  const classTag = query.get('class');
92
83
  if (!classTag || classTag.length === 0) {
@@ -96,19 +87,17 @@ export async function handlePredictionStats({ req, res, opts, query }) {
96
87
  throw new HttpError(400, `class exceeds ${MAX_ID_LEN}-character cap`);
97
88
  }
98
89
  const ctx = await buildContextWithAuth(req, opts);
99
- const baserate = await requireGroup(opts.store, 'predictions').predictionBaserate(ctx.tenantId, classTag, ctx.actor.subject);
90
+ const baserate = await predictionBaserate(ctx, classTag);
100
91
  sendJson(res, 200, { baserate });
101
- return;
102
92
  }
103
93
  export async function handleGetPrediction({ req, res, opts }, predictionByIdMatch) {
104
94
  const id = parseInt(predictionByIdMatch[1], 10);
105
95
  const ctx = await buildContextWithAuth(req, opts);
106
- const prediction = await requireGroup(opts.store, 'predictions').predictionById(ctx.tenantId, id);
96
+ const prediction = await predictionById(ctx, id);
107
97
  if (!prediction) {
108
98
  throw new HttpError(404, `prediction ${id} not found`);
109
99
  }
110
100
  sendJson(res, 200, { prediction });
111
- return;
112
101
  }
113
102
  export async function handleClosePrediction({ req, res, opts }, predictionCloseMatch) {
114
103
  const id = parseInt(predictionCloseMatch[1], 10);
@@ -138,8 +127,7 @@ export async function handleClosePrediction({ req, res, opts }, predictionCloseM
138
127
  closureNote = note;
139
128
  }
140
129
  const close = { closureState: state, actualValue, closureNote };
141
- const prediction = await requireGroup(opts.store, 'predictions').closePrediction(ctx.tenantId, id, close, ctx.actor.subject);
130
+ const prediction = await closePrediction(ctx, id, close);
142
131
  sendJson(res, 200, { prediction });
143
- return;
144
132
  }
145
133
  //# sourceMappingURL=predictions.js.map
@@ -1,21 +1,20 @@
1
1
  // /v1/processes routes.
2
- import { PROCESS } from '../../objects/processes.js';
2
+ import { MAX_PROCESS_STEP_LEN, MAX_PROCESS_STEPS, PROCESS } from '../../objects/processes.js';
3
3
  import { HttpError, sendJson } from '../../util/http-util.js';
4
4
  import { buildContextWithAuth } from '../auth.js';
5
- import { parseJsonBody } from '../validation.js';
5
+ import { MAX_SHORT_FIELD_LEN, parseJsonBody } from '../validation.js';
6
6
  import { isJsonString } from '../../util/json.js';
7
- import { closeRoute, getRoute, listRoute, optionalString, requiredString, saveFor, supersedeRoute } from './object-routes.js';
8
- // HTTP-boundary validation for a process `steps` body (untrusted). Returns the
9
- // step strings (saveProcess re-validates + trims, this is the fail-fast 400
10
- // gate). Caps mirror src/objects/processes.ts MAX_PROCESS_STEPS / MAX_PROCESS_STEP_LEN.
7
+ import { saveFor } from '../../api/objects.js';
8
+ import { closeRoute, getRoute, listRoute, optionalString, requiredString, supersedeRoute } from './object-routes.js';
9
+ // HTTP-boundary validation for an untrusted process `steps` body; saveProcess re-validates and trims, this is the fail-fast 400 gate.
11
10
  function validateProcessStepsBody(raw) {
12
11
  if (raw === undefined || raw === null)
13
12
  return [];
14
13
  if (!Array.isArray(raw)) {
15
14
  throw new HttpError(400, 'steps must be an array of strings');
16
15
  }
17
- if (raw.length > 200) {
18
- throw new HttpError(400, 'steps exceeds 200-step cap');
16
+ if (raw.length > MAX_PROCESS_STEPS) {
17
+ throw new HttpError(400, `steps exceeds ${MAX_PROCESS_STEPS}-step cap`);
19
18
  }
20
19
  for (const item of raw) {
21
20
  if (!isJsonString(item)) {
@@ -24,8 +23,8 @@ function validateProcessStepsBody(raw) {
24
23
  if (item.trim().length === 0) {
25
24
  throw new HttpError(400, 'a step is empty');
26
25
  }
27
- if (item.length > 2000) {
28
- throw new HttpError(400, 'a step exceeds the 2000-character cap');
26
+ if (item.length > MAX_PROCESS_STEP_LEN) {
27
+ throw new HttpError(400, `a step exceeds the ${MAX_PROCESS_STEP_LEN}-character cap`);
29
28
  }
30
29
  }
31
30
  // SAFETY: every item in raw was confirmed to be a string in the loop above.
@@ -41,29 +40,20 @@ const processRoutes = {
41
40
  if (steps.length === 0) {
42
41
  throw new HttpError(400, 'steps is required (at least one step) for a supersession');
43
42
  }
44
- const changeSummary = optionalString(body, 'changeSummary', 4096);
45
- const description = optionalString(body, 'description', 4096);
43
+ const changeSummary = optionalString(body, 'changeSummary', MAX_SHORT_FIELD_LEN);
44
+ const description = optionalString(body, 'description', MAX_SHORT_FIELD_LEN);
46
45
  return (existing, id) => ({ processName: existing.processName, steps, description, changeSummary, supersedesProcessId: id });
47
46
  },
48
47
  };
49
- // ── processes (first-class object) ──
50
- //
51
- // 5 routes: POST /v1/processes (new; body processName + steps[] + description),
52
- // GET /v1/processes (list, status filter), GET /v1/processes/:id (show),
53
- // POST /v1/processes/:id/supersede (active -> superseded by a new version; body
54
- // steps[] + changeSummary + description; reuses the predecessor's name),
55
- // POST /v1/processes/:id/close (active -> closed). Bearer-authed + tenant-scoped
56
- // via buildContextWithAuth. status validated against VALID_PROCESS_STATES. DoS
57
- // caps: processName/description/changeSummary 4096, steps 200x2000
58
- // (validateProcessStepsBody). Mirrors /v1/decisions; the delta lifecycle is the
59
- // decision supersede path.
48
+ // Routes: /v1/processes (create, list, show, supersede, close), mirroring /v1/decisions; supersede creates a new version that reuses the predecessor's name.
49
+ // DoS caps: processName/description/changeSummary MAX_SHORT_FIELD_LEN, steps MAX_PROCESS_STEPS x MAX_PROCESS_STEP_LEN (validateProcessStepsBody).
60
50
  export async function handleCreateProcess(rr) {
61
51
  const ctx = await buildContextWithAuth(rr.req, rr.opts);
62
52
  const body = await parseJsonBody(rr.req, ctx);
63
- const process = await saveFor(rr, PROCESS, ctx.tenantId, ctx.actor.subject, {
64
- processName: requiredString(body, 'processName', { max: 4096 }),
53
+ const process = await saveFor(ctx, PROCESS, {
54
+ processName: requiredString(body, 'processName', { max: MAX_SHORT_FIELD_LEN }),
65
55
  steps: validateProcessStepsBody(body['steps']),
66
- description: optionalString(body, 'description', 4096),
56
+ description: optionalString(body, 'description', MAX_SHORT_FIELD_LEN),
67
57
  });
68
58
  sendJson(rr.res, 201, { process });
69
59
  }
@@ -1,9 +1,10 @@
1
1
  // /v1/project-briefs routes.
2
- import { briefFromReceipts, MAX_REPO_LEN, PROJECT_BRIEF, refreshedBrief } from '../../objects/project-briefs.js';
2
+ import { briefFromReceipts, MAX_CHANGE_SUMMARY_LEN, MAX_REPO_LEN, PROJECT_BRIEF, refreshedBrief, } from '../../objects/project-briefs.js';
3
3
  import { sendJson } from '../../util/http-util.js';
4
4
  import { buildContextWithAuth } from '../auth.js';
5
5
  import { parseJsonBody } from '../validation.js';
6
- import { closeRoute, getRoute, listRoute, objectsOf, optionalString, requiredString, saveFor, supersedeRoute } from './object-routes.js';
6
+ import { objectsOf, saveFor } from '../../api/objects.js';
7
+ import { closeRoute, getRoute, listRoute, optionalString, requiredString, supersedeRoute, } from './object-routes.js';
7
8
  const briefRoutes = {
8
9
  noun: 'project brief',
9
10
  field: 'brief',
@@ -12,24 +13,16 @@ const briefRoutes = {
12
13
  filterParam: 'repo',
13
14
  revise: (body) => {
14
15
  const summary = requiredString(body, 'summary', { max: 8192 });
15
- const changeSummary = optionalString(body, 'changeSummary', 4096);
16
+ const changeSummary = optionalString(body, 'changeSummary', MAX_CHANGE_SUMMARY_LEN);
16
17
  return (existing, id) => ({ repo: existing.repo, summary, changeSummary, supersedesBriefId: id });
17
18
  },
18
19
  };
19
- // ── project_brief routes ──
20
- //
21
- // 6 routes: POST /v1/project-briefs (new; body repo + summary), GET
22
- // /v1/project-briefs (list; status + repo filter; shared parseListLimit), POST
23
- // /v1/project-briefs/refresh (body {repo, dryRun?} -> auto-assemble the brief
24
- // from the repo's receipts; dryRun returns {markdown} without writing; ordered
25
- // before /:id), GET /v1/project-briefs/:id, POST /v1/project-briefs/:id/supersede,
26
- // POST /v1/project-briefs/:id/close. DoS caps: repo 256, summary 8192,
27
- // changeSummary 4096. The store validates + throws; the boundary maps validation
28
- // -> 400, not-found -> 404, not-active -> 409. Mirrors /v1/skills.
20
+ // Routes: /v1/project-briefs (create, list, refresh, show, supersede, close), mirroring /v1/skills; /refresh is ordered before /:id.
21
+ // The store validates and throws; the boundary maps validation -> 400, not-found -> 404, not-active -> 409.
29
22
  export async function handleCreateProjectBrief(rr) {
30
23
  const ctx = await buildContextWithAuth(rr.req, rr.opts);
31
24
  const body = await parseJsonBody(rr.req, ctx);
32
- const brief = await saveFor(rr, PROJECT_BRIEF, ctx.tenantId, ctx.actor.subject, {
25
+ const brief = await saveFor(ctx, PROJECT_BRIEF, {
33
26
  repo: requiredString(body, 'repo', { max: MAX_REPO_LEN }),
34
27
  summary: requiredString(body, 'summary', { max: 8192 }),
35
28
  });
@@ -46,11 +39,11 @@ export async function handleRefreshProjectBrief(rr) {
46
39
  const body = await parseJsonBody(req, ctx);
47
40
  const repo = requiredString(body, 'repo', { max: MAX_REPO_LEN });
48
41
  if (body['dryRun'] === true) {
49
- const { markdown, receiptCount } = await briefFromReceipts(objectsOf(rr), ctx.tenantId, repo);
42
+ const { markdown, receiptCount } = await briefFromReceipts(objectsOf(ctx), ctx.tenantId, repo);
50
43
  sendJson(res, 200, { markdown, receiptCount });
51
44
  return;
52
45
  }
53
- const brief = await refreshedBrief(objectsOf(rr), { hippoRoot: opts.hippoRoot, tenantId: ctx.tenantId, actor: ctx.actor.subject }, repo);
46
+ const brief = await refreshedBrief(objectsOf(ctx), { hippoRoot: opts.hippoRoot, tenantId: ctx.tenantId, actor: ctx.actor.subject }, repo);
54
47
  sendJson(res, 200, { brief });
55
48
  }
56
49
  export function handleSupersedeProjectBrief(rr, match) {
@@ -3,11 +3,10 @@ import { dirname, resolve } from 'node:path';
3
3
  import { assertCallerProject, resolveProjectIdentity } from '../../core/project-identity.js';
4
4
  import { isSharedStore } from '../../core/config.js';
5
5
  import { assembleCost, contextCost, drillCost } from '../../api/context-render.js';
6
- import { storeFor } from '../../store/index.js';
7
- import { biasHintEnabled } from '../../api/recall-history.js';
8
6
  import { assemble, drillDown, getContext, recordTokens, retrieve } from '../../api/index.js';
7
+ import { RECALL_RECORDING } from '../../api/recall-finish.js';
9
8
  import { httpParams, parseContextRequest, parseRecallRequest } from '../../api/recall-request.js';
10
- import { anchorSkippedRows, noteRecall, peekSessionRing, resetSessionRings, sessionRing } from '../../api/recall-record.js';
9
+ import { resetSessionRings } from '../../api/recall-record.js';
11
10
  import { HttpError, sendJson } from '../../util/http-util.js';
12
11
  import { buildContextWithAuth } from '../auth.js';
13
12
  import { MAX_LIST_LIMIT, parseListLimit, validateIdSegment } from '../validation.js';
@@ -15,38 +14,21 @@ import { MAX_LIST_LIMIT, parseListLimit, validateIdSegment } from '../validation
15
14
  export function __resetSessionRecallHistoryHttp() {
16
15
  resetSessionRings('http');
17
16
  }
18
- // HTTP threads the ring through opts.recallHistory, so the hint retrieve() returns is the one the caller sees.
19
- function recallHistoryFor(ctx, sessionId) {
20
- return sessionId && biasHintEnabled('anchoring') ? peekSessionRing('http', ctx.tenantId, sessionId) : undefined;
21
- }
22
17
  // GET /v1/memories?q=...&limit=...&mode=...&scope=...&include_continuity=1
23
18
  export async function handleRecallMemories({ req, res, opts, query }) {
24
19
  const { opts: recallOpts, limit, mode, explain } = parseRecallRequest(httpParams(query));
25
- const { query: q, includeContinuity, sessionId } = recallOpts;
26
20
  const ctx = await buildContextWithAuth(req, opts);
27
- const recallHistory = recallHistoryFor(ctx, sessionId);
28
- // Written first in the recall's own write, so a recall that fails leaves no row.
29
- const leadingAudit = sessionId ? [] : anchorSkippedRows({ tenantId: ctx.tenantId, actor: ctx.actor.subject }, q);
30
- const result = await retrieve(ctx, { ...recallOpts, limit, mode, explain, recallHistory, leadingAudit });
31
- // The ring is created only after recall succeeds, so a 400 cannot LRU-evict a live session.
32
- const ring = sessionRing('http', ctx.tenantId, sessionId);
33
- if (ring)
34
- noteRecall(ring, q, result.results[0]?.id ?? null, result.anchoringHint?.memoryId);
35
- // HTTP counts the rows it returns here; `retrieve` cannot count for every ranker, since MCP shows a different band and counts none.
36
- await storeFor(ctx).bumpRecallStats(result.results.length);
21
+ const result = await retrieve(ctx, { ...recallOpts, limit, mode, explain, recordAs: RECALL_RECORDING.http });
37
22
  // Continuity payloads should never be cached. The caller is asking for
38
23
  // session-state-aware data; intermediaries must not reuse it across users.
39
- if (includeContinuity) {
24
+ if (recallOpts.includeContinuity) {
40
25
  res.setHeader('Cache-Control', 'no-store');
41
26
  }
42
- await recordTokens(ctx, 'http_recall', { items: result.results.length, tokens: result.tokens + (result.continuityTokens ?? 0), sessionId: sessionId ?? null });
43
27
  sendJson(res, 200, result);
44
28
  return;
45
29
  }
46
- // GET /v1/sessions/:id/assemble?budget=N&freshTail=N&summarizeOlder=0|1
47
- // Phase 2 context-engine API. Returns ordered AssembledContextItem[]
48
- // with fresh-tail raws + summary substitutions + bio-aware budget fit.
49
- // Tenant scope from Bearer; default-deny on private rows.
30
+ // GET /v1/sessions/:id/assemble?budget=N&freshTail=N&summarizeOlder=0|1: ordered AssembledContextItem[] (fresh-tail raws, summary substitutions, bio-aware
31
+ // budget fit). Tenant scope from the Bearer; default-deny on private rows.
50
32
  export async function handleAssembleSession({ req, res, opts, query }, assembleMatch) {
51
33
  validateIdSegment(assembleMatch.id, 'session id');
52
34
  const budgetRaw = query.get('budget');
@@ -82,12 +64,8 @@ export async function handleAssembleSession({ req, res, opts, query }, assembleM
82
64
  sendJson(res, 200, result);
83
65
  return;
84
66
  }
85
- // GET /v1/recall/drill/:id?limit=N&budget=N
86
- // Companion to /v1/memories. When recall surfaces a level-2 summary in
87
- // place of overflowed children (RecallResultItem.isSummary === true), the
88
- // caller drills into the summary id to recover the originals. Tenant
89
- // scoped via Bearer; default-deny on private scopes for both summary
90
- // and children.
67
+ // GET /v1/recall/drill/:id?limit=N&budget=N: companion to /v1/memories; the caller drills into a level-2 summary (RecallResultItem.isSummary) to recover the
68
+ // originals. Tenant-scoped via Bearer; default-deny on private scopes for the summary and its children.
91
69
  export async function handleDrillRecall({ req, res, opts, query }, drillMatch) {
92
70
  validateIdSegment(drillMatch.id, 'summary id');
93
71
  const limitRaw = query.get('limit');
@@ -145,11 +123,8 @@ function contextReader(hippoRoot, query) {
145
123
  assertCallerProject({ name, aliases });
146
124
  return { name, legacyName: name, aliases };
147
125
  }
148
- // GET /v1/context — assemble a budget-bounded context bundle. Returns
149
- // ContextResult JSON (entries + tokens + activeSnapshot + sessionHandoff
150
- // + recentEvents). No server-side rendering; clients render. Tenant-scoped
151
- // via the Bearer. Pinned-only + '*' fallback skip the recall audit emit
152
- // (matches cmdContext); real-query hybrid search emits one 'recall' row.
126
+ // GET /v1/context: a budget-bounded ContextResult JSON, rendered by clients, not the server; tenant-scoped via the Bearer.
127
+ // Pinned-only and '*' fallback skip the recall audit emit (as cmdContext does); a real-query hybrid search emits one 'recall' row.
153
128
  export async function handleGetContext({ req, res, opts, query }) {
154
129
  const parsed = parseContextRequest(httpParams(query));
155
130
  const ctx = await buildContextWithAuth(req, opts);
@@ -2,8 +2,9 @@
2
2
  import { MAX_SKILL_NAME_LEN, SKILL, skillsMarkdown } from '../../objects/skills.js';
3
3
  import { sendJson } from '../../util/http-util.js';
4
4
  import { buildContextWithAuth } from '../auth.js';
5
- import { parseJsonBody } from '../validation.js';
6
- import { closeRoute, getRoute, listRoute, objectsOf, optionalString, requiredString, saveFor, supersedeRoute } from './object-routes.js';
5
+ import { MAX_SHORT_FIELD_LEN, parseJsonBody } from '../validation.js';
6
+ import { objectsOf, saveFor } from '../../api/objects.js';
7
+ import { closeRoute, getRoute, listRoute, optionalString, requiredString, supersedeRoute, } from './object-routes.js';
7
8
  const INSTRUCTIONS = { max: 8192, plural: true };
8
9
  const skillRoutes = {
9
10
  noun: 'skill',
@@ -13,26 +14,16 @@ const skillRoutes = {
13
14
  revise: (body) => {
14
15
  const instructions = requiredString(body, 'instructions', INSTRUCTIONS);
15
16
  const trigger = optionalString(body, 'trigger', 1024);
16
- const changeSummary = optionalString(body, 'changeSummary', 4096);
17
+ const changeSummary = optionalString(body, 'changeSummary', MAX_SHORT_FIELD_LEN);
17
18
  return (existing, id) => ({ skillName: existing.skillName, instructions, trigger, changeSummary, supersedesSkillId: id });
18
19
  },
19
20
  };
20
- // ── skills (first-class object, executable/exportable) ──
21
- //
22
- // 6 routes: POST /v1/skills (new; body skillName + instructions + trigger?),
23
- // GET /v1/skills (list, status filter; shared parseListLimit), GET
24
- // /v1/skills/export (renders ACTIVE skills as an AGENTS.md/CLAUDE.md markdown
25
- // block -> {markdown}; literal 'export' is non-numeric so the /:id (\d+) route
26
- // cannot capture it, but it is ordered first regardless), GET /v1/skills/:id,
27
- // POST /v1/skills/:id/supersede, POST /v1/skills/:id/close. DoS caps:
28
- // skillName 256, instructions 8192, trigger 1024, changeSummary 4096. The store
29
- // validates + throws; the boundary maps validation -> 400, not-found -> 404,
30
- // not-active -> 409. Mirrors /v1/processes; "executable" = exportable
31
- // instruction (no code exec).
21
+ // Routes: /v1/skills (create, list, export, show, supersede, close), mirroring /v1/processes; "executable" means exportable instruction (no code exec).
22
+ // GET /v1/skills/export renders ACTIVE skills as a markdown block for AGENTS.md or CLAUDE.md and is ordered before /:id.
32
23
  export async function handleCreateSkill(rr) {
33
24
  const ctx = await buildContextWithAuth(rr.req, rr.opts);
34
25
  const body = await parseJsonBody(rr.req, ctx);
35
- const skill = await saveFor(rr, SKILL, ctx.tenantId, ctx.actor.subject, {
26
+ const skill = await saveFor(ctx, SKILL, {
36
27
  skillName: requiredString(body, 'skillName', { max: MAX_SKILL_NAME_LEN }),
37
28
  instructions: requiredString(body, 'instructions', INSTRUCTIONS),
38
29
  trigger: optionalString(body, 'trigger', 1024),
@@ -47,9 +38,8 @@ export function handleListSkills(rr) {
47
38
  export async function handleExportSkills(rr) {
48
39
  const { req, res, opts } = rr;
49
40
  const ctx = await buildContextWithAuth(req, opts);
50
- const markdown = await skillsMarkdown(objectsOf(rr), ctx.tenantId);
41
+ const markdown = await skillsMarkdown(objectsOf(ctx), ctx.tenantId);
51
42
  sendJson(res, 200, { markdown });
52
- return;
53
43
  }
54
44
  export function handleSupersedeSkill(rr, match) {
55
45
  return supersedeRoute(skillRoutes, rr, match);
@@ -1,70 +1,26 @@
1
1
  export interface ServerInfo {
2
- /**
3
- * Pidfile schema version (L3). Absent on pidfiles written before this
4
- * field existed — detectServer treats a missing `schema` as legacy and
5
- * still accepts the pidfile.
6
- */
2
+ /** Pidfile schema version; absent on pidfiles written before the field existed, which detectServer treats as legacy and still accepts. */
7
3
  schema?: number;
8
4
  pid: number;
9
5
  port: number;
10
6
  url: string;
11
7
  started_at: string;
12
8
  }
13
- /**
14
- * Read .hippo/server.pid and return the embedded ServerInfo if a live hippo
15
- * server is genuinely answering on the recorded url. Returns null on missing,
16
- * malformed, or stale pidfiles, and best-effort unlinks the file in the
17
- * stale/malformed cases.
18
- *
19
- * Liveness is proven in two steps. `process.kill(pid, 0)` rules out dead
20
- * pids. But a pid can be reused by an unrelated process, so a GET /health
21
- * then confirms the process that answers is *this* hippo server: its
22
- * `started_at` must equal the pidfile's. A mismatch, non-200, malformed
23
- * body, or timeout all mean the pidfile is stale.
24
- *
25
- * The /health probe runs only when a pidfile exists and the pid is live, so
26
- * the common no-server path stays a single fast file existence check.
27
- */
9
+ /** Returns the pidfile's ServerInfo if a live hippo server answers on the recorded url, else null (best-effort unlinking of missing/stale/malformed pidfiles).
10
+ * `process.kill(pid, 0)` rules out dead pids; GET /health must then return the pidfile's `started_at` (pids get reused). Probes only if the pid is live. */
28
11
  export declare function detectServer(hippoRoot: string): Promise<ServerInfo | null>;
29
- /**
30
- * Atomically write the pidfile. Writes to a process-scoped temp file then
31
- * renames into place, which is atomic on POSIX and on NTFS via MoveFileEx.
32
- *
33
- * `startedAt` is supplied by the caller (`serve()`) rather than generated
34
- * here, so the pidfile and the server's GET /health response carry the same
35
- * timestamp — detectServer's liveness probe compares the two for equality.
36
- */
12
+ /** Atomically writes the pidfile (process-scoped temp file, then rename; atomic on POSIX and NTFS). `startedAt` comes from the caller (`serve()`) so the
13
+ * pidfile and GET /health carry the same timestamp, which detectServer's liveness probe compares. */
37
14
  export declare function writePidfile(hippoRoot: string, opts: {
38
15
  port: number;
39
16
  url: string;
40
17
  startedAt: string;
41
18
  }): void;
42
- /**
43
- * Best-effort pidfile removal. Silent on ENOENT or any other error so the
44
- * caller can use this in shutdown paths without fear of throwing.
45
- *
46
- * Identity-blind: deletes whatever pidfile is on disk. A shutdown path that
47
- * must not clobber a newer server's pidfile should use removePidfileIfOwned.
48
- */
19
+ /** Best-effort pidfile removal, silent on any error so shutdown paths can call it. Identity-blind: a shutdown that must not clobber a newer server's pidfile
20
+ * uses removePidfileIfOwned. */
49
21
  export declare function removePidfile(hippoRoot: string): void;
50
- /**
51
- * Remove the pidfile only if it still describes the caller's own server.
52
- * Reads and parses the pidfile and unlinks it ONLY when both `pid` and
53
- * `started_at` match `owner`. A pidfile rewritten by a newer server is left
54
- * intact, so a shutting-down older server cannot orphan the newer one by
55
- * deleting its pidfile out from under it.
56
- *
57
- * Best-effort and never throws: a missing, unreadable, malformed, or
58
- * non-object pidfile (including a literal JSON `null`) is "not provably mine"
59
- * and left alone — detectServer unlinks a malformed pidfile on its next
60
- * probe, so it does not leak. Returns true iff a matching pidfile was removed.
61
- *
62
- * Residual TOCTOU: the pidfile could be rewritten between the read and the
63
- * unlink. The window is microseconds and the shape is the same read-check-
64
- * unlink detectServer already uses; this narrows the clobber from an
65
- * unbounded window (any time between writePidfile and stop) to a negligible
66
- * one.
67
- */
22
+ /** Removes the pidfile ONLY when both `pid` and `started_at` match `owner`, so an older shutting-down server cannot orphan a newer one; never throws.
23
+ * Anything unreadable or malformed is "not provably mine" and left alone (detectServer unlinks it). Returns true iff removed. */
68
24
  export declare function removePidfileIfOwned(hippoRoot: string, owner: {
69
25
  pid: number;
70
26
  startedAt: string;