hippo-memory 1.71.0 → 2.0.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 (625) hide show
  1. package/README.md +7 -5
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +11 -26
  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 +3 -2
  12. package/dist/api/audit.d.ts +30 -2
  13. package/dist/api/audit.js +48 -7
  14. package/dist/api/auth.d.ts +11 -9
  15. package/dist/api/auth.js +39 -40
  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-auto.js +4 -2
  24. package/dist/api/context-render.js +4 -3
  25. package/dist/api/context-select.js +15 -29
  26. package/dist/api/context.js +29 -18
  27. package/dist/api/continuity.d.ts +47 -0
  28. package/dist/api/continuity.js +66 -0
  29. package/dist/api/dormant.js +4 -2
  30. package/dist/api/drill-down.js +3 -2
  31. package/dist/api/embeddings.d.ts +17 -0
  32. package/dist/api/embeddings.js +28 -0
  33. package/dist/api/error-reply.d.ts +8 -0
  34. package/dist/api/error-reply.js +21 -0
  35. package/dist/api/forget.d.ts +7 -3
  36. package/dist/api/forget.js +24 -14
  37. package/dist/api/goals.d.ts +1 -1
  38. package/dist/api/goals.js +5 -9
  39. package/dist/api/graph.js +2 -1
  40. package/dist/api/index.d.ts +4 -2
  41. package/dist/api/index.js +4 -2
  42. package/dist/api/instruction-detect.js +5 -1
  43. package/dist/api/learn.d.ts +5 -1
  44. package/dist/api/learn.js +71 -44
  45. package/dist/api/ledger-db.d.ts +2 -6
  46. package/dist/api/ledger-db.js +4 -36
  47. package/dist/api/memories.d.ts +21 -1
  48. package/dist/api/memories.js +51 -1
  49. package/dist/api/objects.d.ts +1 -1
  50. package/dist/api/objects.js +2 -1
  51. package/dist/api/outcome.d.ts +5 -5
  52. package/dist/api/outcome.js +17 -16
  53. package/dist/api/pilot-arm.d.ts +1 -11
  54. package/dist/api/pilot-arm.js +5 -45
  55. package/dist/api/predictions.d.ts +3 -1
  56. package/dist/api/predictions.js +8 -1
  57. package/dist/api/projects.d.ts +21 -0
  58. package/dist/api/projects.js +24 -0
  59. package/dist/api/promote.d.ts +3 -3
  60. package/dist/api/promote.js +26 -28
  61. package/dist/api/prompt-hook.d.ts +17 -2
  62. package/dist/api/prompt-hook.js +45 -4
  63. package/dist/api/quarantine.js +2 -1
  64. package/dist/api/recall-cli.d.ts +3 -0
  65. package/dist/api/recall-cli.js +13 -4
  66. package/dist/api/recall-core.js +10 -5
  67. package/dist/api/recall-pipeline.js +23 -24
  68. package/dist/api/recall-request.js +1 -1
  69. package/dist/api/recall-types.d.ts +3 -1
  70. package/dist/api/recall.d.ts +0 -3
  71. package/dist/api/recall.js +51 -73
  72. package/dist/api/remember-local.d.ts +5 -2
  73. package/dist/api/remember-local.js +15 -7
  74. package/dist/api/remember.d.ts +7 -3
  75. package/dist/api/remember.js +19 -16
  76. package/dist/api/session-end.d.ts +46 -0
  77. package/dist/api/session-end.js +131 -0
  78. package/dist/api/sleep-run.d.ts +1 -1
  79. package/dist/api/sleep-run.js +16 -11
  80. package/dist/api/sleep.js +4 -3
  81. package/dist/api/status.d.ts +24 -0
  82. package/dist/api/status.js +40 -0
  83. package/dist/api/store-init.d.ts +4 -0
  84. package/dist/api/store-init.js +9 -0
  85. package/dist/api/tokens.js +2 -2
  86. package/dist/api/types.d.ts +3 -7
  87. package/dist/api/types.js +6 -1
  88. package/dist/capture/caller-session.d.ts +0 -3
  89. package/dist/capture/caller-session.js +1 -12
  90. package/dist/capture/capture-error.d.ts +2 -2
  91. package/dist/capture/capture-error.js +23 -18
  92. package/dist/capture/codex-patch.js +3 -1
  93. package/dist/capture/command.js +36 -95
  94. package/dist/capture/compact.js +10 -5
  95. package/dist/capture/compaction-items-caller.js +11 -20
  96. package/dist/capture/compaction-record.d.ts +7 -93
  97. package/dist/capture/compaction-record.js +29 -426
  98. package/dist/capture/compaction-spool.d.ts +7 -7
  99. package/dist/capture/compaction-spool.js +60 -51
  100. package/dist/capture/copilot-transcript.d.ts +2 -1
  101. package/dist/capture/copilot-transcript.js +2 -1
  102. package/dist/capture/extract.d.ts +5 -2
  103. package/dist/capture/extract.js +4 -3
  104. package/dist/capture/failure-caller.d.ts +1 -1
  105. package/dist/capture/failure-caller.js +21 -16
  106. package/dist/capture/failure-reading.d.ts +2 -1
  107. package/dist/capture/failure-reading.js +7 -9
  108. package/dist/capture/pre-compact-caller.js +5 -4
  109. package/dist/capture/session-digest.js +4 -3
  110. package/dist/capture/session-end-caller.js +3 -2
  111. package/dist/capture/session-worker.js +22 -10
  112. package/dist/capture/transcript.d.ts +2 -1
  113. package/dist/capture/transcript.js +6 -3
  114. package/dist/capture/working-state.d.ts +4 -2
  115. package/dist/capture/working-state.js +4 -2
  116. package/dist/cli/audit-prune.d.ts +0 -25
  117. package/dist/cli/audit-prune.js +1 -27
  118. package/dist/cli/audit.js +20 -20
  119. package/dist/cli/auth.d.ts +1 -1
  120. package/dist/cli/auth.js +16 -17
  121. package/dist/cli/briefs.d.ts +1 -4
  122. package/dist/cli/briefs.js +37 -292
  123. package/dist/cli/card.js +41 -33
  124. package/dist/cli/client.d.ts +6 -2
  125. package/dist/cli/client.js +37 -21
  126. package/dist/cli/compact-resume-payload.js +1 -1
  127. package/dist/cli/context.d.ts +1 -1
  128. package/dist/cli/context.js +13 -13
  129. package/dist/cli/continuity.d.ts +1 -1
  130. package/dist/cli/continuity.js +36 -39
  131. package/dist/cli/curate.d.ts +2 -2
  132. package/dist/cli/curate.js +32 -36
  133. package/dist/cli/dag.d.ts +1 -1
  134. package/dist/cli/dag.js +23 -8
  135. package/dist/cli/decisions.d.ts +0 -2
  136. package/dist/cli/decisions.js +7 -285
  137. package/dist/cli/eval.d.ts +1 -1
  138. package/dist/cli/eval.js +12 -13
  139. package/dist/cli/explain.d.ts +1 -1
  140. package/dist/cli/explain.js +21 -25
  141. package/dist/cli/flag-values.js +16 -6
  142. package/dist/cli/flags.d.ts +0 -289
  143. package/dist/cli/flags.js +3 -138
  144. package/dist/cli/graph.d.ts +3 -0
  145. package/dist/cli/graph.js +83 -0
  146. package/dist/cli/hook-runtime.d.ts +6 -6
  147. package/dist/cli/hook-runtime.js +9 -36
  148. package/dist/cli/incidents.d.ts +3 -0
  149. package/dist/cli/incidents.js +112 -0
  150. package/dist/cli/init.d.ts +1 -1
  151. package/dist/cli/init.js +28 -19
  152. package/dist/cli/install-steps.d.ts +2 -1
  153. package/dist/cli/install-steps.js +11 -3
  154. package/dist/cli/last-sleep.js +1 -1
  155. package/dist/cli/maintenance.d.ts +3 -3
  156. package/dist/cli/maintenance.js +29 -30
  157. package/dist/cli/notes.d.ts +2 -0
  158. package/dist/cli/notes.js +41 -0
  159. package/dist/cli/object-verbs.d.ts +2 -2
  160. package/dist/cli/object-verbs.js +4 -4
  161. package/dist/cli/open-browser.d.ts +14 -0
  162. package/dist/cli/open-browser.js +26 -0
  163. package/dist/cli/playbooks.d.ts +3 -4
  164. package/dist/cli/playbooks.js +126 -290
  165. package/dist/cli/predictions.d.ts +3 -0
  166. package/dist/cli/predictions.js +174 -0
  167. package/dist/cli/print.js +2 -1
  168. package/dist/cli/projects.js +30 -22
  169. package/dist/cli/quality-repair-once.d.ts +1 -1
  170. package/dist/cli/quality-repair-once.js +6 -5
  171. package/dist/cli/recall.js +13 -7
  172. package/dist/cli/refine-llm.js +18 -17
  173. package/dist/cli/remember.js +17 -17
  174. package/dist/cli/scheduler.js +2 -1
  175. package/dist/cli/serve.js +11 -6
  176. package/dist/cli/session-hooks.d.ts +1 -5
  177. package/dist/cli/session-hooks.js +89 -168
  178. package/dist/cli/setup.d.ts +1 -1
  179. package/dist/cli/setup.js +17 -10
  180. package/dist/cli/shared.d.ts +2 -6
  181. package/dist/cli/shared.js +9 -29
  182. package/dist/cli/sleep-render.js +6 -3
  183. package/dist/cli/sleep.js +6 -37
  184. package/dist/cli/status.d.ts +3 -3
  185. package/dist/cli/status.js +32 -35
  186. package/dist/cli/transfer.d.ts +3 -3
  187. package/dist/cli/transfer.js +64 -43
  188. package/dist/cli/usage.d.ts +1 -80
  189. package/dist/cli/usage.js +2 -696
  190. package/dist/cli/verb-row.d.ts +34 -0
  191. package/dist/cli/verb-row.js +6 -0
  192. package/dist/cli/verbs/health.d.ts +27 -0
  193. package/dist/cli/verbs/health.js +234 -0
  194. package/dist/cli/verbs/memory.d.ts +16 -0
  195. package/dist/cli/verbs/memory.js +236 -0
  196. package/dist/cli/verbs/objects.d.ts +20 -0
  197. package/dist/cli/verbs/objects.js +257 -0
  198. package/dist/cli/verbs/sessions.d.ts +31 -0
  199. package/dist/cli/verbs/sessions.js +314 -0
  200. package/dist/cli/verbs.d.ts +81 -0
  201. package/dist/cli/verbs.js +7 -0
  202. package/dist/cli/versioned-verbs.d.ts +51 -0
  203. package/dist/cli/versioned-verbs.js +79 -0
  204. package/dist/cli.d.ts +1 -272
  205. package/dist/cli.js +24 -315
  206. package/dist/connectors/dlq.d.ts +39 -3
  207. package/dist/connectors/dlq.js +39 -4
  208. package/dist/connectors/github/backfill.js +12 -3
  209. package/dist/connectors/github/deletion.js +2 -1
  210. package/dist/connectors/github/dlq.js +31 -73
  211. package/dist/connectors/github/ingest.d.ts +2 -6
  212. package/dist/connectors/github/ingest.js +5 -29
  213. package/dist/connectors/github/tenant-routing.js +2 -1
  214. package/dist/connectors/github/webhook.d.ts +2 -1
  215. package/dist/connectors/github/webhook.js +35 -2
  216. package/dist/connectors/ingest.d.ts +10 -0
  217. package/dist/connectors/ingest.js +29 -0
  218. package/dist/connectors/slack/deletion.js +2 -1
  219. package/dist/connectors/slack/dlq.js +49 -71
  220. package/dist/connectors/slack/ingest.d.ts +2 -6
  221. package/dist/connectors/slack/ingest.js +4 -28
  222. package/dist/connectors/slack/tenant-routing.js +2 -1
  223. package/dist/connectors/slack/webhook.d.ts +2 -1
  224. package/dist/connectors/slack/webhook.js +2 -1
  225. package/dist/consolidate/conflicts.js +2 -2
  226. package/dist/consolidate/dag.js +29 -18
  227. package/dist/consolidate/dedupe.d.ts +7 -0
  228. package/dist/consolidate/dedupe.js +6 -4
  229. package/dist/consolidate/llm-passes.js +45 -19
  230. package/dist/consolidate/memory-value.js +3 -2
  231. package/dist/consolidate/merge.js +8 -8
  232. package/dist/consolidate/physics-pass.d.ts +6 -1
  233. package/dist/consolidate/physics-pass.js +26 -6
  234. package/dist/consolidate/replay.js +11 -4
  235. package/dist/consolidate/sleep.js +9 -6
  236. package/dist/consolidate/traces.js +5 -5
  237. package/dist/core/ablation.d.ts +10 -0
  238. package/dist/core/ablation.js +12 -0
  239. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  240. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  241. package/dist/core/ambient.d.ts +4 -0
  242. package/dist/core/ambient.js +39 -18
  243. package/dist/core/api-errors.d.ts +16 -0
  244. package/dist/core/api-errors.js +20 -0
  245. package/dist/core/card.js +3 -1
  246. package/dist/core/compaction-timing.d.ts +7 -0
  247. package/dist/core/compaction-timing.js +9 -0
  248. package/dist/core/config.d.ts +1 -1
  249. package/dist/core/config.js +22 -18
  250. package/dist/core/cosine.d.ts +3 -0
  251. package/dist/core/cosine.js +19 -0
  252. package/dist/{store → core}/markdown.d.ts +1 -1
  253. package/dist/{store → core}/markdown.js +4 -4
  254. package/dist/core/memory-audit.d.ts +17 -0
  255. package/dist/core/memory-audit.js +54 -0
  256. package/dist/core/memory.d.ts +14 -8
  257. package/dist/core/memory.js +35 -23
  258. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  259. package/dist/{consolidate → core}/merged-row.js +1 -1
  260. package/dist/core/physics.d.ts +3 -1
  261. package/dist/core/physics.js +23 -18
  262. package/dist/core/prediction.d.ts +3 -0
  263. package/dist/core/prediction.js +6 -0
  264. package/dist/core/project-identity.d.ts +3 -0
  265. package/dist/core/project-identity.js +12 -2
  266. package/dist/{store → core}/recall-scope.d.ts +1 -10
  267. package/dist/{store → core}/recall-scope.js +2 -19
  268. package/dist/core/search-types.d.ts +1 -1
  269. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  270. package/dist/dashboard/dashboard-actions.js +5 -5
  271. package/dist/dashboard/dashboard-queries.js +2 -7
  272. package/dist/dashboard/dashboard-snapshot.js +1 -3
  273. package/dist/dashboard/dashboard.js +16 -5
  274. package/dist/db/busy.d.ts +2 -7
  275. package/dist/db/busy.js +21 -26
  276. package/dist/db/connect.d.ts +2 -2
  277. package/dist/db/connect.js +7 -7
  278. package/dist/db/index.d.ts +3 -3
  279. package/dist/db/index.js +3 -3
  280. package/dist/db/migrate.js +14 -7
  281. package/dist/db/migrations/index.d.ts +1 -1
  282. package/dist/db/migrations/index.js +3 -1
  283. package/dist/db/migrations/v11.js +1 -0
  284. package/dist/db/migrations/v14.js +1 -0
  285. package/dist/db/migrations/v55.d.ts +3 -0
  286. package/dist/db/migrations/v55.js +17 -0
  287. package/dist/db/open.d.ts +0 -2
  288. package/dist/db/open.js +6 -10
  289. package/dist/db/physics-state.d.ts +0 -4
  290. package/dist/db/physics-state.js +7 -33
  291. package/dist/db/request-stores.d.ts +1 -0
  292. package/dist/db/request-stores.js +2 -1
  293. package/dist/db/tables.d.ts +2 -0
  294. package/dist/db/tables.js +6 -2
  295. package/dist/db/vector-store.js +19 -5
  296. package/dist/db/wal-checkpointer.js +2 -1
  297. package/dist/doctor.d.ts +3 -0
  298. package/dist/doctor.js +18 -15
  299. package/dist/embeddings/local.d.ts +62 -0
  300. package/dist/embeddings/local.js +146 -0
  301. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  302. package/dist/{store/embeddings → embeddings}/provider.js +19 -25
  303. package/dist/embeddings/transformers.d.ts +26 -0
  304. package/dist/embeddings/transformers.js +89 -0
  305. package/dist/entry/session-text.d.ts +1 -1
  306. package/dist/entry/session-text.js +1 -1
  307. package/dist/entry/store-kit.d.ts +37 -0
  308. package/dist/entry/store-kit.js +25 -0
  309. package/dist/entry/testing.d.ts +6 -0
  310. package/dist/entry/testing.js +7 -0
  311. package/dist/eval/eval-suite.js +17 -11
  312. package/dist/eval/eval.js +1 -1
  313. package/dist/eval/judgment.js +12 -5
  314. package/dist/graph/extract.js +3 -3
  315. package/dist/graph/recall.js +1 -1
  316. package/dist/graph/view.js +13 -5
  317. package/dist/graph/write.d.ts +1 -1
  318. package/dist/graph/write.js +9 -9
  319. package/dist/hooks/codex-session.js +3 -2
  320. package/dist/hooks/codex-wrapper.js +2 -1
  321. package/dist/hooks/json-hooks.js +10 -4
  322. package/dist/hooks/opencode.js +8 -5
  323. package/dist/hooks/shared.d.ts +0 -6
  324. package/dist/hooks/shared.js +4 -15
  325. package/dist/importers/core.js +4 -4
  326. package/dist/importers/sources.js +5 -4
  327. package/dist/importers/vault.d.ts +1 -1
  328. package/dist/importers/vault.js +25 -23
  329. package/dist/index.d.ts +5 -4
  330. package/dist/index.js +4 -3
  331. package/dist/learn/autolearn.d.ts +15 -3
  332. package/dist/learn/autolearn.js +38 -16
  333. package/dist/learn/churn-git.js +13 -4
  334. package/dist/learn/extract.d.ts +3 -2
  335. package/dist/learn/extract.js +7 -5
  336. package/dist/learn/forward-claim-detector.js +4 -2
  337. package/dist/learn/invalidation.d.ts +2 -1
  338. package/dist/learn/invalidation.js +18 -9
  339. package/dist/mcp/admin-tools.d.ts +2 -2
  340. package/dist/mcp/admin-tools.js +27 -48
  341. package/dist/mcp/format.js +3 -2
  342. package/dist/mcp/framing.d.ts +1 -0
  343. package/dist/mcp/framing.js +1 -1
  344. package/dist/mcp/memory-tools.d.ts +1 -1
  345. package/dist/mcp/memory-tools.js +8 -9
  346. package/dist/mcp/protocol.d.ts +11 -7
  347. package/dist/mcp/protocol.js +25 -12
  348. package/dist/mcp/recall-tools.js +12 -9
  349. package/dist/mcp/request.js +22 -20
  350. package/dist/mcp/stdio.js +37 -16
  351. package/dist/mcp/tool-args.js +2 -1
  352. package/dist/mcp/tools.js +44 -21
  353. package/dist/objects/customer-notes.d.ts +2 -2
  354. package/dist/objects/decisions.d.ts +2 -2
  355. package/dist/objects/descriptor.d.ts +1 -1
  356. package/dist/objects/incidents.d.ts +2 -2
  357. package/dist/objects/lifecycle.d.ts +1 -1
  358. package/dist/objects/lifecycle.js +2 -1
  359. package/dist/objects/policies.d.ts +2 -2
  360. package/dist/objects/policies.js +2 -1
  361. package/dist/objects/processes.d.ts +2 -2
  362. package/dist/objects/project-briefs.d.ts +2 -2
  363. package/dist/objects/project-briefs.js +2 -3
  364. package/dist/objects/skills.d.ts +2 -2
  365. package/dist/postinstall.js +1 -1
  366. package/dist/rerankers/clef.js +3 -6
  367. package/dist/rerankers/cross-encoder.d.ts +31 -2
  368. package/dist/rerankers/cross-encoder.js +71 -98
  369. package/dist/rerankers/index.js +5 -4
  370. package/dist/rerankers/jev.js +2 -4
  371. package/dist/rerankers/outage-warning.d.ts +3 -1
  372. package/dist/rerankers/outage-warning.js +5 -3
  373. package/dist/search/bm25-search.js +1 -1
  374. package/dist/search/boosts.js +1 -1
  375. package/dist/search/embed-memories.d.ts +12 -0
  376. package/dist/search/embed-memories.js +389 -0
  377. package/dist/search/engine.d.ts +8 -0
  378. package/dist/search/engine.js +10 -0
  379. package/dist/search/goal-boost.d.ts +1 -1
  380. package/dist/search/goal-boost.js +6 -3
  381. package/dist/search/hybrid.d.ts +9 -2
  382. package/dist/search/hybrid.js +9 -4
  383. package/dist/search/physics-search.d.ts +6 -3
  384. package/dist/search/physics-search.js +22 -15
  385. package/dist/search/rerank.js +1 -1
  386. package/dist/search/vector.d.ts +8 -6
  387. package/dist/search/vector.js +14 -17
  388. package/dist/server/auth.d.ts +3 -1
  389. package/dist/server/auth.js +24 -15
  390. package/dist/server/boot.d.ts +2 -1
  391. package/dist/server/boot.js +34 -84
  392. package/dist/server/client-ip.d.ts +9 -6
  393. package/dist/server/client-ip.js +36 -17
  394. package/dist/server/deadline.d.ts +0 -2
  395. package/dist/server/deadline.js +1 -7
  396. package/dist/server/defaults.d.ts +1 -0
  397. package/dist/server/defaults.js +1 -0
  398. package/dist/server/mcp-http.js +16 -11
  399. package/dist/server/request.js +7 -2
  400. package/dist/server/route-checks.d.ts +7 -0
  401. package/dist/server/route-checks.js +42 -0
  402. package/dist/server/route-table.d.ts +9 -8
  403. package/dist/server/route-table.js +127 -133
  404. package/dist/server/routes/admin.d.ts +8 -8
  405. package/dist/server/routes/admin.js +13 -21
  406. package/dist/server/routes/customer-notes.d.ts +6 -6
  407. package/dist/server/routes/customer-notes.js +1 -2
  408. package/dist/server/routes/decisions.d.ts +6 -6
  409. package/dist/server/routes/decisions.js +2 -4
  410. package/dist/server/routes/incidents.d.ts +6 -6
  411. package/dist/server/routes/incidents.js +2 -5
  412. package/dist/server/routes/memories.d.ts +9 -9
  413. package/dist/server/routes/memories.js +19 -40
  414. package/dist/server/routes/object-routes.d.ts +6 -6
  415. package/dist/server/routes/object-routes.js +4 -7
  416. package/dist/server/routes/policies.d.ts +7 -7
  417. package/dist/server/routes/policies.js +2 -4
  418. package/dist/server/routes/predictions.d.ts +6 -6
  419. package/dist/server/routes/predictions.js +9 -13
  420. package/dist/server/routes/processes.d.ts +6 -6
  421. package/dist/server/routes/processes.js +1 -2
  422. package/dist/server/routes/project-briefs.d.ts +7 -7
  423. package/dist/server/routes/project-briefs.js +2 -4
  424. package/dist/server/routes/recall.d.ts +5 -5
  425. package/dist/server/routes/recall.js +6 -10
  426. package/dist/server/routes/skills.d.ts +7 -7
  427. package/dist/server/routes/skills.js +2 -4
  428. package/dist/server/server-detect.d.ts +7 -1
  429. package/dist/server/server-detect.js +36 -11
  430. package/dist/server/sleep-child.js +26 -7
  431. package/dist/server/sleep-offload.d.ts +11 -5
  432. package/dist/server/sleep-offload.js +17 -11
  433. package/dist/server/tls.d.ts +7 -2
  434. package/dist/server/tls.js +17 -5
  435. package/dist/server/types.d.ts +29 -12
  436. package/dist/server/validation.d.ts +1 -2
  437. package/dist/server/validation.js +6 -11
  438. package/dist/server.d.ts +4 -40
  439. package/dist/server.js +3 -29
  440. package/dist/sharing/global-store.d.ts +4 -5
  441. package/dist/sharing/global-store.js +8 -13
  442. package/dist/sharing/global-sync.js +38 -45
  443. package/dist/sharing/project-merge.d.ts +7 -14
  444. package/dist/sharing/project-merge.js +57 -121
  445. package/dist/sharing/search-both.js +10 -3
  446. package/dist/sharing/share.d.ts +2 -0
  447. package/dist/sharing/share.js +39 -38
  448. package/dist/store/ambient.js +7 -7
  449. package/dist/store/audit-event.d.ts +1 -1
  450. package/dist/store/audit.d.ts +0 -16
  451. package/dist/store/audit.js +4 -55
  452. package/dist/store/auth.d.ts +4 -2
  453. package/dist/store/auth.js +7 -3
  454. package/dist/store/candidates.d.ts +3 -2
  455. package/dist/store/candidates.js +59 -30
  456. package/dist/store/capture-write.d.ts +17 -0
  457. package/dist/store/capture-write.js +35 -0
  458. package/dist/store/cards.js +6 -5
  459. package/dist/store/compaction-caller.d.ts +18 -0
  460. package/dist/store/compaction-caller.js +29 -0
  461. package/dist/store/compactions-record.d.ts +115 -0
  462. package/dist/store/compactions-record.js +418 -0
  463. package/dist/store/compactions.js +6 -4
  464. package/dist/store/conflicts.d.ts +7 -1
  465. package/dist/store/conflicts.js +13 -9
  466. package/dist/store/connectors/dlq.d.ts +10 -0
  467. package/dist/store/connectors/dlq.js +33 -0
  468. package/dist/store/connectors/event-log.d.ts +13 -0
  469. package/dist/store/connectors/event-log.js +24 -0
  470. package/dist/store/connectors/github.d.ts +7 -9
  471. package/dist/store/connectors/github.js +35 -60
  472. package/dist/store/connectors/slack.d.ts +2 -11
  473. package/dist/store/connectors/slack.js +24 -57
  474. package/dist/store/dashboard-reads.js +8 -6
  475. package/dist/store/delete-and-batch.d.ts +6 -0
  476. package/dist/store/delete-and-batch.js +40 -6
  477. package/dist/store/delivery-recorder.d.ts +12 -5
  478. package/dist/store/delivery-recorder.js +13 -11
  479. package/dist/store/descendant-page.js +8 -4
  480. package/dist/store/dormant.d.ts +1 -1
  481. package/dist/store/dormant.js +10 -4
  482. package/dist/store/embeddings/index.d.ts +2 -12
  483. package/dist/store/embeddings/index.js +5 -374
  484. package/dist/store/entry-reads.d.ts +35 -4
  485. package/dist/store/entry-reads.js +86 -19
  486. package/dist/store/entry-row.js +9 -2
  487. package/dist/store/entry-writes.d.ts +15 -12
  488. package/dist/store/entry-writes.js +54 -22
  489. package/dist/store/failure-log-at.d.ts +8 -0
  490. package/dist/store/failure-log-at.js +16 -0
  491. package/dist/store/failure-log.d.ts +2 -2
  492. package/dist/store/failure-log.js +5 -3
  493. package/dist/{trust → store}/gated-write.d.ts +3 -1
  494. package/dist/{trust → store}/gated-write.js +7 -5
  495. package/dist/store/goals.js +22 -19
  496. package/dist/store/graph-reads.js +9 -6
  497. package/dist/store/graph-view-rows.js +2 -1
  498. package/dist/store/graph-writes.d.ts +6 -6
  499. package/dist/store/graph-writes.js +48 -71
  500. package/dist/store/half-life.js +2 -2
  501. package/dist/store/handoffs.d.ts +10 -4
  502. package/dist/store/handoffs.js +10 -9
  503. package/dist/store/index-and-stats.js +2 -2
  504. package/dist/store/index.d.ts +2 -2
  505. package/dist/store/index.js +1 -1
  506. package/dist/store/key-writes.js +1 -1
  507. package/dist/store/ledger-turn.d.ts +9 -0
  508. package/dist/store/ledger-turn.js +38 -0
  509. package/dist/store/mirrors.js +19 -10
  510. package/dist/store/open.d.ts +2 -5
  511. package/dist/store/open.js +42 -54
  512. package/dist/store/pilot-arm.d.ts +12 -0
  513. package/dist/store/pilot-arm.js +42 -0
  514. package/dist/store/port.d.ts +68 -6
  515. package/dist/store/port.js +8 -0
  516. package/dist/store/predictions.d.ts +1 -2
  517. package/dist/store/predictions.js +3 -6
  518. package/dist/store/project-tags.d.ts +62 -0
  519. package/dist/store/project-tags.js +67 -0
  520. package/dist/store/quality-repair.js +1 -1
  521. package/dist/store/quarantine.js +2 -1
  522. package/dist/store/recall-trace.d.ts +2 -0
  523. package/dist/store/recall-trace.js +20 -3
  524. package/dist/store/rejected-values.js +16 -10
  525. package/dist/store/rejection-probe.d.ts +4 -0
  526. package/dist/store/rejection-probe.js +19 -0
  527. package/dist/store/rejection.d.ts +0 -17
  528. package/dist/store/rejection.js +1 -21
  529. package/dist/store/rows.js +2 -2
  530. package/dist/store/rule-sql.d.ts +11 -0
  531. package/dist/store/rule-sql.js +31 -6
  532. package/dist/store/search-rows.d.ts +5 -5
  533. package/dist/store/search-rows.js +18 -16
  534. package/dist/store/sessions.js +4 -2
  535. package/dist/store/set-aside.d.ts +14 -0
  536. package/dist/store/set-aside.js +23 -0
  537. package/dist/store/sqlite/busy.d.ts +3 -0
  538. package/dist/store/sqlite/busy.js +8 -0
  539. package/dist/store/sqlite/connector-events-group.js +4 -7
  540. package/dist/store/sqlite/connector-writes-group.js +6 -4
  541. package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
  542. package/dist/store/sqlite/entry-writes-group.js +3 -3
  543. package/dist/store/sqlite/error-codec.js +4 -3
  544. package/dist/store/sqlite/executor.js +10 -4
  545. package/dist/store/sqlite/graph-reads-group.js +1 -1
  546. package/dist/store/sqlite/held-connection.d.ts +11 -0
  547. package/dist/store/sqlite/held-connection.js +41 -0
  548. package/dist/store/sqlite/last-recall-group.d.ts +13 -0
  549. package/dist/store/sqlite/last-recall-group.js +57 -0
  550. package/dist/store/sqlite/local.d.ts +0 -17
  551. package/dist/store/sqlite/local.js +0 -31
  552. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  553. package/dist/store/sqlite/maintenance-groups.js +60 -0
  554. package/dist/store/sqlite/object-rows.d.ts +1 -1
  555. package/dist/store/sqlite/objects-group.d.ts +1 -1
  556. package/dist/store/sqlite/objects-group.js +15 -7
  557. package/dist/store/sqlite/store.d.ts +1 -8
  558. package/dist/store/sqlite/store.js +13 -22
  559. package/dist/store/summaries.d.ts +10 -3
  560. package/dist/store/summaries.js +54 -11
  561. package/dist/store/token-ledger-rows.js +3 -2
  562. package/dist/store/token-ledger.d.ts +0 -7
  563. package/dist/store/token-ledger.js +0 -35
  564. package/dist/store/vector-index.js +8 -4
  565. package/dist/support-bundle.js +2 -3
  566. package/dist/trust/reject-flow.js +2 -2
  567. package/dist/util/agent-homes.d.ts +15 -0
  568. package/dist/util/agent-homes.js +34 -0
  569. package/dist/util/anthropic-messages.d.ts +6 -1
  570. package/dist/util/anthropic-messages.js +26 -7
  571. package/dist/util/atomic-write.d.ts +5 -2
  572. package/dist/util/atomic-write.js +12 -8
  573. package/dist/util/chunked.d.ts +3 -0
  574. package/dist/util/chunked.js +10 -0
  575. package/dist/util/ellipsize.d.ts +3 -0
  576. package/dist/util/ellipsize.js +5 -0
  577. package/dist/util/env.d.ts +12 -2
  578. package/dist/util/env.js +12 -2
  579. package/dist/util/format.d.ts +5 -0
  580. package/dist/util/format.js +10 -0
  581. package/dist/util/hook-payload.d.ts +8 -0
  582. package/dist/util/hook-payload.js +37 -0
  583. package/dist/util/http-retry.d.ts +6 -0
  584. package/dist/util/http-retry.js +43 -5
  585. package/dist/util/http-util.d.ts +0 -8
  586. package/dist/util/http-util.js +10 -21
  587. package/dist/util/limits.d.ts +7 -0
  588. package/dist/util/limits.js +14 -0
  589. package/dist/util/log.d.ts +4 -0
  590. package/dist/util/log.js +9 -0
  591. package/dist/util/request-scope.d.ts +9 -3
  592. package/dist/util/request-scope.js +18 -9
  593. package/dist/util/secret-detect.js +6 -1
  594. package/dist/util/spawn-argv.d.ts +9 -0
  595. package/dist/util/spawn-argv.js +57 -0
  596. package/dist/util/sql.d.ts +3 -0
  597. package/dist/util/sql.js +6 -0
  598. package/dist/util/sqlite-blocked.d.ts +2 -0
  599. package/dist/util/sqlite-blocked.js +5 -0
  600. package/dist/util/stream-tee.d.ts +3 -0
  601. package/dist/util/stream-tee.js +35 -0
  602. package/dist/util/time.d.ts +4 -0
  603. package/dist/util/time.js +4 -0
  604. package/dist/util/vector-codec.d.ts +4 -0
  605. package/dist/util/vector-codec.js +15 -0
  606. package/dist/util/version.d.ts +1 -1
  607. package/dist/util/version.js +1 -1
  608. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  609. package/extensions/openclaw-plugin/package.json +1 -1
  610. package/openclaw.plugin.json +1 -1
  611. package/package.json +4 -2
  612. package/dist/api/on-store.d.ts +0 -16
  613. package/dist/api/on-store.js +0 -38
  614. package/dist/store/embeddings/local.d.ts +0 -15
  615. package/dist/store/embeddings/local.js +0 -175
  616. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  617. /package/dist/{cli → api}/correction-latency.js +0 -0
  618. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  619. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  620. /package/dist/{store → core}/object-types.d.ts +0 -0
  621. /package/dist/{store → core}/object-types.js +0 -0
  622. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  623. /package/dist/{capture → util}/compaction-items.js +0 -0
  624. /package/dist/{store → util}/yaml.d.ts +0 -0
  625. /package/dist/{store → util}/yaml.js +0 -0
@@ -1,10 +1,10 @@
1
- import type { RouteRequest } from '../types.js';
2
- export declare function handleCreateMemory({ req, res, opts }: RouteRequest): Promise<void>;
3
- export declare function handleGetGraph({ req, res, opts, query }: RouteRequest): Promise<void>;
4
- export declare function handleArchiveMemory({ req, res, opts }: RouteRequest, archiveMatch: Record<string, string>): Promise<void>;
5
- export declare function handleSupersedeMemory({ req, res, opts }: RouteRequest, supersedeMatch: Record<string, string>): Promise<void>;
6
- export declare function handlePromoteMemory({ req, res, opts }: RouteRequest, promoteMatch: Record<string, string>): Promise<void>;
7
- export declare function handleForgetMemory({ req, res, opts }: RouteRequest, idMatch: Record<string, string>): Promise<void>;
8
- export declare function handleApplyOutcome({ req, res, opts }: RouteRequest): Promise<void>;
9
- export declare function handleSleep({ req, res, opts }: RouteRequest): Promise<void>;
1
+ import type { AuthedRouteRequest } from '../types.js';
2
+ export declare function handleCreateMemory({ req, res, ctx }: AuthedRouteRequest): Promise<void>;
3
+ export declare function handleGetGraph({ res, ctx, query }: AuthedRouteRequest): Promise<void>;
4
+ export declare function handleArchiveMemory({ req, res, ctx }: AuthedRouteRequest, archiveMatch: Record<string, string>): Promise<void>;
5
+ export declare function handleSupersedeMemory({ req, res, ctx }: AuthedRouteRequest, supersedeMatch: Record<string, string>): Promise<void>;
6
+ export declare function handlePromoteMemory({ res, ctx }: AuthedRouteRequest, promoteMatch: Record<string, string>): Promise<void>;
7
+ export declare function handleForgetMemory({ res, ctx }: AuthedRouteRequest, idMatch: Record<string, string>): Promise<void>;
8
+ export declare function handleApplyOutcome({ req, res, ctx }: AuthedRouteRequest): Promise<void>;
9
+ export declare function handleSleep({ req, res, ctx }: AuthedRouteRequest): Promise<void>;
10
10
  //# sourceMappingURL=memories.d.ts.map
@@ -1,22 +1,17 @@
1
1
  // Memory write routes: create, graph, archive, supersede, promote, forget, outcome, sleep.
2
2
  import { graphRows } from '../../api/graph.js';
3
3
  import { archiveRaw, forget, outcome, outcomeForLastRecall, promote, remember, supersede } from '../../api/index.js';
4
+ import { MEMORY_KINDS } from '../../core/memory.js';
4
5
  import { graphModelOf } from '../../graph/view.js';
5
6
  import { MAX_ENTITY_NAME_LEN } from '../../store/graph-rows.js';
7
+ import { hasGroup } from '../../store/index.js';
6
8
  import { HttpError, sendJson } from '../../util/http-util.js';
7
- import { assertCrossTenantAdmin, buildContextWithAuth, isLoopback } from '../auth.js';
8
9
  import { sleepInChild } from '../sleep-offload.js';
9
10
  import { getCallerProject, getString, getStringArray, isSetMember, parseJsonBody, parseListLimit, validateIdSegment } from '../validation.js';
10
11
  import { isJsonString, isJsonBoolean } from '../../util/json.js';
11
- const VALID_KINDS = new Set([
12
- 'raw',
13
- 'distilled',
14
- 'superseded',
15
- 'archived',
16
- ]);
12
+ const VALID_KINDS = new Set(MEMORY_KINDS);
17
13
  // POST /v1/memories
18
- export async function handleCreateMemory({ req, res, opts }) {
19
- const ctx = await buildContextWithAuth(req, opts);
14
+ export async function handleCreateMemory({ req, res, ctx }) {
20
15
  const body = await parseJsonBody(req, ctx);
21
16
  const content = getString(body, 'content');
22
17
  if (!content) {
@@ -44,7 +39,7 @@ export async function handleCreateMemory({ req, res, opts }) {
44
39
  return;
45
40
  }
46
41
  // GET /v1/graph?entity=NAME&limit=N — read-only entity/relation graph (tenant-scoped)
47
- export async function handleGetGraph({ req, res, opts, query }) {
42
+ export async function handleGetGraph({ res, ctx, query }) {
48
43
  const entityRaw = query.get('entity');
49
44
  // Cap at the graph entity-name cap (512), not the id-shaped 256, so a valid
50
45
  // long decision/policy name remains focusable over HTTP.
@@ -52,15 +47,13 @@ export async function handleGetGraph({ req, res, opts, query }) {
52
47
  throw new HttpError(400, `entity exceeds the ${MAX_ENTITY_NAME_LEN}-character cap`);
53
48
  }
54
49
  const limit = parseListLimit(query.get('limit'));
55
- const ctx = await buildContextWithAuth(req, opts);
56
50
  const rows = await graphRows(ctx, { entity: entityRaw ?? undefined, limit });
57
51
  sendJson(res, 200, graphModelOf(rows));
58
52
  return;
59
53
  }
60
54
  // /v1/memories/:id/* and DELETE /v1/memories/:id
61
- export async function handleArchiveMemory({ req, res, opts }, archiveMatch) {
55
+ export async function handleArchiveMemory({ req, res, ctx }, archiveMatch) {
62
56
  validateIdSegment(archiveMatch.id, 'memory id');
63
- const ctx = await buildContextWithAuth(req, opts);
64
57
  const body = await parseJsonBody(req, ctx);
65
58
  const reason = getString(body, 'reason');
66
59
  if (!reason) {
@@ -70,9 +63,8 @@ export async function handleArchiveMemory({ req, res, opts }, archiveMatch) {
70
63
  sendJson(res, 200, result);
71
64
  return;
72
65
  }
73
- export async function handleSupersedeMemory({ req, res, opts }, supersedeMatch) {
66
+ export async function handleSupersedeMemory({ req, res, ctx }, supersedeMatch) {
74
67
  validateIdSegment(supersedeMatch.id, 'memory id');
75
- const ctx = await buildContextWithAuth(req, opts);
76
68
  const body = await parseJsonBody(req, ctx);
77
69
  const content = getString(body, 'content');
78
70
  if (!content) {
@@ -82,24 +74,21 @@ export async function handleSupersedeMemory({ req, res, opts }, supersedeMatch)
82
74
  sendJson(res, 200, result);
83
75
  return;
84
76
  }
85
- export async function handlePromoteMemory({ req, res, opts }, promoteMatch) {
77
+ export async function handlePromoteMemory({ res, ctx }, promoteMatch) {
86
78
  validateIdSegment(promoteMatch.id, 'memory id');
87
- const ctx = await buildContextWithAuth(req, opts);
88
79
  const result = promote(ctx, promoteMatch.id);
89
80
  sendJson(res, 200, result);
90
81
  return;
91
82
  }
92
- export async function handleForgetMemory({ req, res, opts }, idMatch) {
83
+ export async function handleForgetMemory({ res, ctx }, idMatch) {
93
84
  validateIdSegment(idMatch.id, 'memory id');
94
- const ctx = await buildContextWithAuth(req, opts);
95
85
  const result = await forget(ctx, idMatch.id);
96
86
  sendJson(res, 200, result);
97
87
  return;
98
88
  }
99
89
  // POST /v1/outcome: applies a positive/negative outcome to memory ids; without ids it falls back to the last-recall path (api.outcomeForLastRecall)
100
90
  // and returns {applied, ids}, so callers can tell "no recent recall" from "all ids skipped". Each applied id writes one audit_log row (op='outcome').
101
- export async function handleApplyOutcome({ req, res, opts }) {
102
- const ctx = await buildContextWithAuth(req, opts);
91
+ export async function handleApplyOutcome({ req, res, ctx }) {
103
92
  const body = await parseJsonBody(req, ctx);
104
93
  const good = body['good'];
105
94
  if (!isJsonBoolean(good)) {
@@ -115,8 +104,8 @@ export async function handleApplyOutcome({ req, res, opts }) {
115
104
  if (!idsRaw.every(isNonEmptyId)) {
116
105
  throw new HttpError(400, 'ids must be an array of non-empty strings');
117
106
  }
118
- // DoS cap on ids.length (each id costs ~3 DB ops): N=1000 keeps per-request work sub-second on SQLite.
119
- // Checked BEFORE buildContextWithAuth so attack traffic does not pay the api-key lookup.
107
+ // DoS cap on ids.length (each id costs ~3 DB ops): N=1000 keeps per-request work sub-second on SQLite. Auth runs first, so only a caller with a key
108
+ // reaches it.
120
109
  if (idsRaw.length > 1000) {
121
110
  throw new HttpError(400, 'ids exceeds 1000-id cap');
122
111
  }
@@ -127,28 +116,19 @@ export async function handleApplyOutcome({ req, res, opts }) {
127
116
  sendJson(res, 200, { applied });
128
117
  }
129
118
  else {
130
- // The last recall's ids live in hippo.db alone, so a client of another store must send the ids its recall returned.
131
- if (ctx.store !== undefined && ctx.store.kind !== 'sqlite')
119
+ // A store without the group keeps no last recall, so its client must send the ids its recall returned.
120
+ if (ctx.store !== undefined && !hasGroup(ctx.store, 'lastRecall')) {
132
121
  throw new HttpError(501, 'this store keeps no last recall: send the ids your recall returned');
122
+ }
133
123
  const result = await outcomeForLastRecall(ctx, good);
134
124
  sendJson(res, 200, result);
135
125
  }
136
126
  return;
137
127
  }
138
128
  // POST /v1/sleep: host-wide consolidation (consolidate, dedup, audit, share, ambient); api.sleep spans the WHOLE hippoRoot, cross-tenant by design, so the
139
- // loopback-only guard is the trust boundary; non-loopback serving must also zero cross-tenant counters. Body {dry_run?, no_share?}; returns SleepResult JSON.
140
- export async function handleSleep({ req, res, opts }) {
141
- // Defensive per-request loopback guard using isLoopback(), so future mapped/IPv6/NAT64 forms flow through without drift;
142
- // serve()'s boot-time host check is the primary trust boundary.
143
- if (!isLoopback(req.socket.remoteAddress)) {
144
- throw new HttpError(403, '/v1/sleep is loopback-only (host-wide consolidation; see CHANGELOG v1.11.4)');
145
- }
146
- // Admin-role gate, forward-defensive: loopback fallback is admin by default and Bearer callers carry an explicit role from the api_keys row;
147
- // when non-loopback serving lands, this gate is the real auth boundary on host-wide sleep.
148
- const sleepCtx = await buildContextWithAuth(req, opts);
149
- // Sleep consolidates every tenant under hippoRoot, so it is a cross-tenant action.
150
- assertCrossTenantAdmin(sleepCtx, '/v1/sleep');
151
- const body = await parseJsonBody(req, sleepCtx);
129
+ // row's host-admin-local gate is the trust boundary. Body {dry_run?, no_share?}; returns SleepResult JSON.
130
+ export async function handleSleep({ req, res, ctx }) {
131
+ const body = await parseJsonBody(req, ctx);
152
132
  const dryRunRaw = body['dry_run'];
153
133
  if (dryRunRaw !== undefined && !isJsonBoolean(dryRunRaw)) {
154
134
  throw new HttpError(400, 'dry_run must be a boolean');
@@ -157,8 +137,7 @@ export async function handleSleep({ req, res, opts }) {
157
137
  if (noShareRaw !== undefined && !isJsonBoolean(noShareRaw)) {
158
138
  throw new HttpError(400, 'no_share must be a boolean');
159
139
  }
160
- // sleepCtx already built above for the admin-role gate; reuse.
161
- const result = await sleepInChild(sleepCtx, {
140
+ const result = await sleepInChild(ctx, {
162
141
  dryRun: dryRunRaw === true,
163
142
  noShare: noShareRaw === true,
164
143
  });
@@ -1,7 +1,7 @@
1
1
  import { type JsonValue } from '../../util/json.js';
2
2
  import type { ObjectDescriptor, SavableDescriptor } from '../../objects/descriptor.js';
3
- import type { ObjectByKind, ObjectKind, SavableKind } from '../../store/object-types.js';
4
- import type { RouteRequest } from '../types.js';
3
+ import type { ObjectByKind, ObjectKind, SavableKind } from '../../core/object-types.js';
4
+ import type { AuthedRouteRequest } from '../types.js';
5
5
  export interface ObjectRouteConfig<K extends ObjectKind> {
6
6
  /** Names the object in the 404 text, e.g. "customer note". */
7
7
  readonly noun: string;
@@ -28,8 +28,8 @@ export interface RequiredStringRule {
28
28
  }
29
29
  export declare function requiredString(body: Record<string, JsonValue>, key: string, rule: RequiredStringRule): string;
30
30
  export declare function optionalString(body: Record<string, JsonValue>, key: string, max: number): string | undefined;
31
- export declare function listRoute<K extends ObjectKind>(cfg: ObjectRouteConfig<K>, rr: RouteRequest): Promise<void>;
32
- export declare function getRoute<K extends ObjectKind>(cfg: ObjectRouteConfig<K>, rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
33
- export declare function closeRoute<K extends ObjectKind>(cfg: ObjectRouteConfig<K>, rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
34
- export declare function supersedeRoute<K extends SavableKind, W>(cfg: VersionedRouteConfig<K, W>, rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
31
+ export declare function listRoute<K extends ObjectKind>(cfg: ObjectRouteConfig<K>, rr: AuthedRouteRequest): Promise<void>;
32
+ export declare function getRoute<K extends ObjectKind>(cfg: ObjectRouteConfig<K>, rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
33
+ export declare function closeRoute<K extends ObjectKind>(cfg: ObjectRouteConfig<K>, rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
34
+ export declare function supersedeRoute<K extends SavableKind, W>(cfg: VersionedRouteConfig<K, W>, rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
35
35
  //# sourceMappingURL=object-routes.d.ts.map
@@ -3,7 +3,6 @@ import { HttpError, sendJson } from '../../util/http-util.js';
3
3
  import { isJsonString } from '../../util/json.js';
4
4
  import { objectsOf, saveFor } from '../../api/objects.js';
5
5
  import { closeObject, listObjects, objectById } from '../../objects/lifecycle.js';
6
- import { buildContextWithAuth } from '../auth.js';
7
6
  import { byCreatedAt, pageOf, parseCursor } from '../cursor.js';
8
7
  import { isSetMember, parseJsonBody, parseListLimit } from '../validation.js';
9
8
  export function requiredString(body, key, rule) {
@@ -32,14 +31,12 @@ async function found(cfg, objects, tenantId, id) {
32
31
  throw new HttpError(404, `${cfg.noun} ${id} not found`);
33
32
  return row;
34
33
  }
35
- // Limit and cursor are checked before auth and status after it, so a keyless caller gets 400 for the first two and 401 for a bad status.
36
34
  export async function listRoute(cfg, rr) {
37
- const { req, res, opts, query } = rr;
35
+ const { res, query, ctx } = rr;
38
36
  const status = query.get('status') ?? 'all';
39
37
  const filter = cfg.filterParam === undefined ? null : query.get(cfg.filterParam);
40
38
  const limit = parseListLimit(query.get('limit'));
41
39
  const after = parseCursor(query.get('cursor'), 'string', 'integer');
42
- const ctx = await buildContextWithAuth(req, opts);
43
40
  const listOpts = { limit: limit + 1, after, filter: filter?.trim() || undefined };
44
41
  if (status !== 'all') {
45
42
  const states = cfg.object.states;
@@ -53,17 +50,17 @@ export async function listRoute(cfg, rr) {
53
50
  }
54
51
  export async function getRoute(cfg, rr, match) {
55
52
  const id = parseInt(match[1], 10);
56
- const ctx = await buildContextWithAuth(rr.req, rr.opts);
53
+ const { ctx } = rr;
57
54
  sendJson(rr.res, 200, { [cfg.field]: await found(cfg, objectsOf(ctx), ctx.tenantId, id) });
58
55
  }
59
56
  export async function closeRoute(cfg, rr, match) {
60
57
  const id = parseInt(match[1], 10);
61
- const ctx = await buildContextWithAuth(rr.req, rr.opts);
58
+ const { ctx } = rr;
62
59
  sendJson(rr.res, 200, { [cfg.field]: await closeObject(objectsOf(ctx), cfg.object, ctx.tenantId, id, ctx.actor.subject) });
63
60
  }
64
61
  export async function supersedeRoute(cfg, rr, match) {
65
62
  const id = parseInt(match[1], 10);
66
- const ctx = await buildContextWithAuth(rr.req, rr.opts);
63
+ const { ctx } = rr;
67
64
  const successor = cfg.revise(await parseJsonBody(rr.req, ctx));
68
65
  const existing = await found(cfg, objectsOf(ctx), ctx.tenantId, id);
69
66
  const saved = await saveFor(ctx, cfg.object, successor(existing, id));
@@ -1,8 +1,8 @@
1
- import type { RouteRequest } from '../types.js';
2
- export declare function handleCreatePolicy(rr: RouteRequest): Promise<void>;
3
- export declare function handleListPolicies(rr: RouteRequest): Promise<void>;
4
- export declare function handlePoliciesAsOf(rr: RouteRequest): Promise<void>;
5
- export declare function handleSupersedePolicy(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
6
- export declare function handleClosePolicy(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
7
- export declare function handleGetPolicy(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
1
+ import type { AuthedRouteRequest } from '../types.js';
2
+ export declare function handleCreatePolicy(rr: AuthedRouteRequest): Promise<void>;
3
+ export declare function handleListPolicies(rr: AuthedRouteRequest): Promise<void>;
4
+ export declare function handlePoliciesAsOf(rr: AuthedRouteRequest): Promise<void>;
5
+ export declare function handleSupersedePolicy(rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
6
+ export declare function handleClosePolicy(rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
7
+ export declare function handleGetPolicy(rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
8
8
  //# sourceMappingURL=policies.d.ts.map
@@ -1,7 +1,6 @@
1
1
  // /v1/policies routes.
2
2
  import { policiesAsOf, POLICY } from '../../objects/policies.js';
3
3
  import { HttpError, sendJson } from '../../util/http-util.js';
4
- import { buildContextWithAuth } from '../auth.js';
5
4
  import { MAX_SHORT_FIELD_LEN, parseJsonBody } from '../validation.js';
6
5
  import { objectsOf, saveFor } from '../../api/objects.js';
7
6
  import { closeRoute, getRoute, listRoute, optionalString, requiredString, supersedeRoute, } from './object-routes.js';
@@ -22,7 +21,7 @@ const policyRoutes = {
22
21
  };
23
22
  // The as-of route is registered BEFORE /:id so the literal 'asof' is matched first; date errors surface as 400.
24
23
  export async function handleCreatePolicy(rr) {
25
- const ctx = await buildContextWithAuth(rr.req, rr.opts);
24
+ const { ctx } = rr;
26
25
  const body = await parseJsonBody(rr.req, ctx);
27
26
  const policy = await saveFor(ctx, POLICY, {
28
27
  policyName: requiredString(body, 'policyName', { max: MAX_SHORT_FIELD_LEN }),
@@ -38,13 +37,12 @@ export function handleListPolicies(rr) {
38
37
  // The as-of query: must precede the /:id GET (literal 'asof' is non-numeric so
39
38
  // the /(\d+)/ route would not match it, but order it first for clarity).
40
39
  export async function handlePoliciesAsOf(rr) {
41
- const { req, res, opts, query } = rr;
40
+ const { res, query, ctx } = rr;
42
41
  const date = query.get('date');
43
42
  if (date === null || date.length === 0) {
44
43
  throw new HttpError(400, 'date is required (ISO-8601 valid-time)');
45
44
  }
46
45
  const name = query.get('name') ?? undefined;
47
- const ctx = await buildContextWithAuth(req, opts);
48
46
  const policies = await policiesAsOf(objectsOf(ctx), ctx.tenantId, date, { name });
49
47
  sendJson(res, 200, { policies });
50
48
  }
@@ -1,7 +1,7 @@
1
- import type { RouteRequest } from '../types.js';
2
- export declare function handleCreatePrediction({ req, res, opts }: RouteRequest): Promise<void>;
3
- export declare function handleListPredictions({ req, res, opts, query }: RouteRequest): Promise<void>;
4
- export declare function handlePredictionStats({ req, res, opts, query }: RouteRequest): Promise<void>;
5
- export declare function handleGetPrediction({ req, res, opts }: RouteRequest, predictionByIdMatch: RegExpMatchArray): Promise<void>;
6
- export declare function handleClosePrediction({ req, res, opts }: RouteRequest, predictionCloseMatch: RegExpMatchArray): Promise<void>;
1
+ import type { AuthedRouteRequest } from '../types.js';
2
+ export declare function handleCreatePrediction({ req, res, ctx, opts }: AuthedRouteRequest): Promise<void>;
3
+ export declare function handleListPredictions({ res, ctx, query }: AuthedRouteRequest): Promise<void>;
4
+ export declare function handlePredictionStats({ res, ctx, query }: AuthedRouteRequest): Promise<void>;
5
+ export declare function handleGetPrediction({ res, ctx }: AuthedRouteRequest, predictionByIdMatch: RegExpMatchArray): Promise<void>;
6
+ export declare function handleClosePrediction({ req, res, ctx }: AuthedRouteRequest, predictionCloseMatch: RegExpMatchArray): Promise<void>;
7
7
  //# sourceMappingURL=predictions.d.ts.map
@@ -1,16 +1,16 @@
1
1
  // /v1/predictions routes.
2
2
  import { closePrediction, listPredictions, predictionBaserate, predictionById, savePrediction } from '../../api/predictions.js';
3
3
  import { loadConfig } from '../../core/config.js';
4
- import { predictionMirror, VALID_CLOSURE_STATES } from '../../store/predictions.js';
5
- import { HttpError, MAX_ID_LEN, sendJson } from '../../util/http-util.js';
6
- import { buildContextWithAuth } from '../auth.js';
4
+ import { predictionMirror } from '../../store/predictions.js';
5
+ import { VALID_CLOSURE_STATES } from '../../core/prediction.js';
6
+ import { HttpError, sendJson } from '../../util/http-util.js';
7
+ import { MAX_ID_LEN } from '../../util/limits.js';
7
8
  import { byCreatedAt, pageOf, parseCursor } from '../cursor.js';
8
9
  import { isSetMember, MAX_SHORT_FIELD_LEN, parseJsonBody, parseListLimit } from '../validation.js';
9
10
  import { isJsonString, isJsonNumber } from '../../util/json.js';
10
11
  // Routes: /v1/predictions (create, list, show, close), Bearer-authed and tenant-scoped; closure_state is validated against VALID_CLOSURE_STATES.
11
12
  // DoS caps: claim MAX_SHORT_FIELD_LEN chars, closureNote 2048.
12
- export async function handleCreatePrediction({ req, res, opts }) {
13
- const ctx = await buildContextWithAuth(req, opts);
13
+ export async function handleCreatePrediction({ req, res, ctx, opts }) {
14
14
  const body = await parseJsonBody(req, ctx);
15
15
  const claim = body['claim'];
16
16
  if (!isJsonString(claim) || claim.length === 0) {
@@ -66,19 +66,18 @@ function listFilter(classTag, status) {
66
66
  }
67
67
  return { classTag, closureState: status };
68
68
  }
69
- export async function handleListPredictions({ req, res, opts, query }) {
69
+ export async function handleListPredictions({ res, ctx, query }) {
70
70
  const classTag = query.get('class') || undefined;
71
71
  const status = query.get('status') ?? 'all';
72
72
  const limit = parseListLimit(query.get('limit'));
73
73
  const after = parseCursor(query.get('cursor'), 'string', 'integer');
74
- const ctx = await buildContextWithAuth(req, opts);
75
74
  const predictions = await listPredictions(ctx, { ...listFilter(classTag, status), limit: limit + 1, after });
76
75
  const page = pageOf(predictions, limit, byCreatedAt);
77
76
  sendJson(res, 200, { predictions: page.items, next_cursor: page.nextCursor });
78
77
  }
79
78
  // Reference-class / planning-fallacy detector; registered BEFORE /v1/predictions/:id so dispatch order cannot matter ('stats' is not a number, but routing
80
79
  // it first is safer).
81
- export async function handlePredictionStats({ req, res, opts, query }) {
80
+ export async function handlePredictionStats({ res, ctx, query }) {
82
81
  const classTag = query.get('class');
83
82
  if (!classTag || classTag.length === 0) {
84
83
  throw new HttpError(400, 'class param is required');
@@ -86,22 +85,19 @@ export async function handlePredictionStats({ req, res, opts, query }) {
86
85
  if (classTag.length > MAX_ID_LEN) {
87
86
  throw new HttpError(400, `class exceeds ${MAX_ID_LEN}-character cap`);
88
87
  }
89
- const ctx = await buildContextWithAuth(req, opts);
90
88
  const baserate = await predictionBaserate(ctx, classTag);
91
89
  sendJson(res, 200, { baserate });
92
90
  }
93
- export async function handleGetPrediction({ req, res, opts }, predictionByIdMatch) {
91
+ export async function handleGetPrediction({ res, ctx }, predictionByIdMatch) {
94
92
  const id = parseInt(predictionByIdMatch[1], 10);
95
- const ctx = await buildContextWithAuth(req, opts);
96
93
  const prediction = await predictionById(ctx, id);
97
94
  if (!prediction) {
98
95
  throw new HttpError(404, `prediction ${id} not found`);
99
96
  }
100
97
  sendJson(res, 200, { prediction });
101
98
  }
102
- export async function handleClosePrediction({ req, res, opts }, predictionCloseMatch) {
99
+ export async function handleClosePrediction({ req, res, ctx }, predictionCloseMatch) {
103
100
  const id = parseInt(predictionCloseMatch[1], 10);
104
- const ctx = await buildContextWithAuth(req, opts);
105
101
  const body = await parseJsonBody(req, ctx);
106
102
  const state = body['state'];
107
103
  if (!isJsonString(state) || !isSetMember(VALID_CLOSURE_STATES, state) || state === 'open') {
@@ -1,7 +1,7 @@
1
- import type { RouteRequest } from '../types.js';
2
- export declare function handleCreateProcess(rr: RouteRequest): Promise<void>;
3
- export declare function handleListProcesses(rr: RouteRequest): Promise<void>;
4
- export declare function handleSupersedeProcess(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
5
- export declare function handleCloseProcess(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
6
- export declare function handleGetProcess(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
1
+ import type { AuthedRouteRequest } from '../types.js';
2
+ export declare function handleCreateProcess(rr: AuthedRouteRequest): Promise<void>;
3
+ export declare function handleListProcesses(rr: AuthedRouteRequest): Promise<void>;
4
+ export declare function handleSupersedeProcess(rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
5
+ export declare function handleCloseProcess(rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
6
+ export declare function handleGetProcess(rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
7
7
  //# sourceMappingURL=processes.d.ts.map
@@ -1,7 +1,6 @@
1
1
  // /v1/processes routes.
2
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
- import { buildContextWithAuth } from '../auth.js';
5
4
  import { MAX_SHORT_FIELD_LEN, parseJsonBody } from '../validation.js';
6
5
  import { isJsonString } from '../../util/json.js';
7
6
  import { saveFor } from '../../api/objects.js';
@@ -48,7 +47,7 @@ const processRoutes = {
48
47
  // Routes: /v1/processes (create, list, show, supersede, close), mirroring /v1/decisions; supersede creates a new version that reuses the predecessor's name.
49
48
  // DoS caps: processName/description/changeSummary MAX_SHORT_FIELD_LEN, steps MAX_PROCESS_STEPS x MAX_PROCESS_STEP_LEN (validateProcessStepsBody).
50
49
  export async function handleCreateProcess(rr) {
51
- const ctx = await buildContextWithAuth(rr.req, rr.opts);
50
+ const { ctx } = rr;
52
51
  const body = await parseJsonBody(rr.req, ctx);
53
52
  const process = await saveFor(ctx, PROCESS, {
54
53
  processName: requiredString(body, 'processName', { max: MAX_SHORT_FIELD_LEN }),
@@ -1,8 +1,8 @@
1
- import type { RouteRequest } from '../types.js';
2
- export declare function handleCreateProjectBrief(rr: RouteRequest): Promise<void>;
3
- export declare function handleListProjectBriefs(rr: RouteRequest): Promise<void>;
4
- export declare function handleRefreshProjectBrief(rr: RouteRequest): Promise<void>;
5
- export declare function handleSupersedeProjectBrief(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
6
- export declare function handleCloseProjectBrief(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
7
- export declare function handleGetProjectBrief(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
1
+ import type { AuthedRouteRequest } from '../types.js';
2
+ export declare function handleCreateProjectBrief(rr: AuthedRouteRequest): Promise<void>;
3
+ export declare function handleListProjectBriefs(rr: AuthedRouteRequest): Promise<void>;
4
+ export declare function handleRefreshProjectBrief(rr: AuthedRouteRequest): Promise<void>;
5
+ export declare function handleSupersedeProjectBrief(rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
6
+ export declare function handleCloseProjectBrief(rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
7
+ export declare function handleGetProjectBrief(rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
8
8
  //# sourceMappingURL=project-briefs.d.ts.map
@@ -1,7 +1,6 @@
1
1
  // /v1/project-briefs routes.
2
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
- import { buildContextWithAuth } from '../auth.js';
5
4
  import { parseJsonBody } from '../validation.js';
6
5
  import { objectsOf, saveFor } from '../../api/objects.js';
7
6
  import { closeRoute, getRoute, listRoute, optionalString, requiredString, supersedeRoute, } from './object-routes.js';
@@ -20,7 +19,7 @@ const briefRoutes = {
20
19
  // Routes: /v1/project-briefs (create, list, refresh, show, supersede, close), mirroring /v1/skills; /refresh is ordered before /:id.
21
20
  // The store validates and throws; the boundary maps validation -> 400, not-found -> 404, not-active -> 409.
22
21
  export async function handleCreateProjectBrief(rr) {
23
- const ctx = await buildContextWithAuth(rr.req, rr.opts);
22
+ const { ctx } = rr;
24
23
  const body = await parseJsonBody(rr.req, ctx);
25
24
  const brief = await saveFor(ctx, PROJECT_BRIEF, {
26
25
  repo: requiredString(body, 'repo', { max: MAX_REPO_LEN }),
@@ -34,8 +33,7 @@ export function handleListProjectBriefs(rr) {
34
33
  // The refresh op: must precede the /:id routes (literal 'refresh' is non-numeric
35
34
  // so the /(\d+)/ routes would not match it, but order it first).
36
35
  export async function handleRefreshProjectBrief(rr) {
37
- const { req, res, opts } = rr;
38
- const ctx = await buildContextWithAuth(req, opts);
36
+ const { req, res, opts, ctx } = rr;
39
37
  const body = await parseJsonBody(req, ctx);
40
38
  const repo = requiredString(body, 'repo', { max: MAX_REPO_LEN });
41
39
  if (body['dryRun'] === true) {
@@ -1,8 +1,8 @@
1
- import type { RouteRequest } from '../types.js';
1
+ import type { AuthedRouteRequest } from '../types.js';
2
2
  /** Test-only: reset the HTTP recall rings. Call from beforeEach. */
3
3
  export declare function __resetSessionRecallHistoryHttp(): void;
4
- export declare function handleRecallMemories({ req, res, opts, query }: RouteRequest): Promise<void>;
5
- export declare function handleAssembleSession({ req, res, opts, query }: RouteRequest, assembleMatch: Record<string, string>): Promise<void>;
6
- export declare function handleDrillRecall({ req, res, opts, query }: RouteRequest, drillMatch: Record<string, string>): Promise<void>;
7
- export declare function handleGetContext({ req, res, opts, query }: RouteRequest): Promise<void>;
4
+ export declare function handleRecallMemories({ res, ctx, query }: AuthedRouteRequest): Promise<void>;
5
+ export declare function handleAssembleSession({ res, ctx, query }: AuthedRouteRequest, assembleMatch: Record<string, string>): Promise<void>;
6
+ export declare function handleDrillRecall({ res, ctx, query }: AuthedRouteRequest, drillMatch: Record<string, string>): Promise<void>;
7
+ export declare function handleGetContext({ res, ctx, opts, query }: AuthedRouteRequest): Promise<void>;
8
8
  //# sourceMappingURL=recall.d.ts.map
@@ -8,16 +8,15 @@ import { RECALL_RECORDING } from '../../api/recall-finish.js';
8
8
  import { httpParams, parseContextRequest, parseRecallRequest } from '../../api/recall-request.js';
9
9
  import { resetSessionRings } from '../../api/recall-record.js';
10
10
  import { HttpError, sendJson } from '../../util/http-util.js';
11
- import { buildContextWithAuth } from '../auth.js';
12
- import { MAX_LIST_LIMIT, parseListLimit, validateIdSegment } from '../validation.js';
11
+ import { MAX_LIST_LIMIT } from '../../util/limits.js';
12
+ import { parseListLimit, validateIdSegment } from '../validation.js';
13
13
  /** Test-only: reset the HTTP recall rings. Call from beforeEach. */
14
14
  export function __resetSessionRecallHistoryHttp() {
15
15
  resetSessionRings('http');
16
16
  }
17
17
  // GET /v1/memories?q=...&limit=...&mode=...&scope=...&include_continuity=1
18
- export async function handleRecallMemories({ req, res, opts, query }) {
18
+ export async function handleRecallMemories({ res, ctx, query }) {
19
19
  const { opts: recallOpts, limit, mode, explain } = parseRecallRequest(httpParams(query));
20
- const ctx = await buildContextWithAuth(req, opts);
21
20
  const result = await retrieve(ctx, { ...recallOpts, limit, mode, explain, recordAs: RECALL_RECORDING.http });
22
21
  // Continuity payloads should never be cached. The caller is asking for
23
22
  // session-state-aware data; intermediaries must not reuse it across users.
@@ -29,7 +28,7 @@ export async function handleRecallMemories({ req, res, opts, query }) {
29
28
  }
30
29
  // GET /v1/sessions/:id/assemble?budget=N&freshTail=N&summarizeOlder=0|1: ordered AssembledContextItem[] (fresh-tail raws, summary substitutions, bio-aware
31
30
  // budget fit). Tenant scope from the Bearer; default-deny on private rows.
32
- export async function handleAssembleSession({ req, res, opts, query }, assembleMatch) {
31
+ export async function handleAssembleSession({ res, ctx, query }, assembleMatch) {
33
32
  validateIdSegment(assembleMatch.id, 'session id');
34
33
  const budgetRaw = query.get('budget');
35
34
  const budget = budgetRaw === null ? undefined : Number(budgetRaw);
@@ -49,7 +48,6 @@ export async function handleAssembleSession({ req, res, opts, query }, assembleM
49
48
  : (sumOlderRaw === '1' || sumOlderRaw === 'true');
50
49
  const scopeQ = query.get('scope');
51
50
  const scope = scopeQ !== null && scopeQ.length > 0 ? scopeQ : undefined;
52
- const ctx = await buildContextWithAuth(req, opts);
53
51
  const assembleExtra = {};
54
52
  if (budget !== undefined)
55
53
  assembleExtra.budget = budget;
@@ -66,7 +64,7 @@ export async function handleAssembleSession({ req, res, opts, query }, assembleM
66
64
  }
67
65
  // 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
66
  // originals. Tenant-scoped via Bearer; default-deny on private scopes for the summary and its children.
69
- export async function handleDrillRecall({ req, res, opts, query }, drillMatch) {
67
+ export async function handleDrillRecall({ res, ctx, query }, drillMatch) {
70
68
  validateIdSegment(drillMatch.id, 'summary id');
71
69
  const limitRaw = query.get('limit');
72
70
  const limit = limitRaw === null ? undefined : Number(limitRaw);
@@ -92,7 +90,6 @@ export async function handleDrillRecall({ req, res, opts, query }, drillMatch) {
92
90
  }
93
91
  depth = parsed;
94
92
  }
95
- const ctx = await buildContextWithAuth(req, opts);
96
93
  const drillExtra = {};
97
94
  if (limit !== undefined)
98
95
  drillExtra.limit = limit;
@@ -125,9 +122,8 @@ function contextReader(hippoRoot, query) {
125
122
  }
126
123
  // GET /v1/context: a budget-bounded ContextResult JSON, rendered by clients, not the server; tenant-scoped via the Bearer.
127
124
  // Pinned-only and '*' fallback skip the recall audit emit (as cmdContext does); a real-query hybrid search emits one 'recall' row.
128
- export async function handleGetContext({ req, res, opts, query }) {
125
+ export async function handleGetContext({ res, ctx, opts, query }) {
129
126
  const parsed = parseContextRequest(httpParams(query));
130
- const ctx = await buildContextWithAuth(req, opts);
131
127
  const result = await getContext(ctx, {
132
128
  ...parsed,
133
129
  currentProject: contextReader(opts.hippoRoot, query),
@@ -1,8 +1,8 @@
1
- import type { RouteRequest } from '../types.js';
2
- export declare function handleCreateSkill(rr: RouteRequest): Promise<void>;
3
- export declare function handleListSkills(rr: RouteRequest): Promise<void>;
4
- export declare function handleExportSkills(rr: RouteRequest): Promise<void>;
5
- export declare function handleSupersedeSkill(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
6
- export declare function handleCloseSkill(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
7
- export declare function handleGetSkill(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
1
+ import type { AuthedRouteRequest } from '../types.js';
2
+ export declare function handleCreateSkill(rr: AuthedRouteRequest): Promise<void>;
3
+ export declare function handleListSkills(rr: AuthedRouteRequest): Promise<void>;
4
+ export declare function handleExportSkills(rr: AuthedRouteRequest): Promise<void>;
5
+ export declare function handleSupersedeSkill(rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
6
+ export declare function handleCloseSkill(rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
7
+ export declare function handleGetSkill(rr: AuthedRouteRequest, match: RegExpMatchArray): Promise<void>;
8
8
  //# sourceMappingURL=skills.d.ts.map
@@ -1,7 +1,6 @@
1
1
  // /v1/skills routes.
2
2
  import { MAX_SKILL_NAME_LEN, SKILL, skillsMarkdown } from '../../objects/skills.js';
3
3
  import { sendJson } from '../../util/http-util.js';
4
- import { buildContextWithAuth } from '../auth.js';
5
4
  import { MAX_SHORT_FIELD_LEN, parseJsonBody } from '../validation.js';
6
5
  import { objectsOf, saveFor } from '../../api/objects.js';
7
6
  import { closeRoute, getRoute, listRoute, optionalString, requiredString, supersedeRoute, } from './object-routes.js';
@@ -21,7 +20,7 @@ const skillRoutes = {
21
20
  // Routes: /v1/skills (create, list, export, show, supersede, close), mirroring /v1/processes; "executable" means exportable instruction (no code exec).
22
21
  // GET /v1/skills/export renders ACTIVE skills as a markdown block for AGENTS.md or CLAUDE.md and is ordered before /:id.
23
22
  export async function handleCreateSkill(rr) {
24
- const ctx = await buildContextWithAuth(rr.req, rr.opts);
23
+ const { ctx } = rr;
25
24
  const body = await parseJsonBody(rr.req, ctx);
26
25
  const skill = await saveFor(ctx, SKILL, {
27
26
  skillName: requiredString(body, 'skillName', { max: MAX_SKILL_NAME_LEN }),
@@ -36,8 +35,7 @@ export function handleListSkills(rr) {
36
35
  // The export renderer: must precede the /:id GET (literal 'export' is
37
36
  // non-numeric so the /(\d+)/ route would not match it, but order it first).
38
37
  export async function handleExportSkills(rr) {
39
- const { req, res, opts } = rr;
40
- const ctx = await buildContextWithAuth(req, opts);
38
+ const { res, ctx } = rr;
41
39
  const markdown = await skillsMarkdown(objectsOf(ctx), ctx.tenantId);
42
40
  sendJson(res, 200, { markdown });
43
41
  }
@@ -6,8 +6,14 @@ export interface ServerInfo {
6
6
  url: string;
7
7
  started_at: string;
8
8
  }
9
+ /** The pidfile names a live process on loopback that did not answer /health in time: most likely a busy server, so a caller must neither
10
+ * bypass it with a second writer nor start another server beside it. */
11
+ export declare class ServerUnresponsiveError extends Error {
12
+ constructor(info: ServerInfo, probeMs: number, options?: ErrorOptions);
13
+ }
9
14
  /** 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. */
15
+ * `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.
16
+ * Throws ServerUnresponsiveError when that probe times out. */
11
17
  export declare function detectServer(hippoRoot: string): Promise<ServerInfo | null>;
12
18
  /** Atomically writes the pidfile (process-scoped temp file, then rename; atomic on POSIX and NTFS). `startedAt` comes from the caller (`serve()`) so the
13
19
  * pidfile and GET /health carry the same timestamp, which detectServer's liveness probe compares. */