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
@@ -1,29 +1,9 @@
1
- /**
2
- * Prediction first-class object.
3
- *
4
- * Canonical store for ex-ante claims that can be closed against ex-post
5
- * outcomes. The `predictions` table holds every field (including
6
- * `claim_text`); a memory row mirrors the claim for recall/inspect surfaces
7
- * but is NOT the source of truth — ON DELETE SET NULL on memory_id means
8
- * memory deletion gracefully orphans the prediction without losing data.
9
- *
10
- * Tenant scoping: every helper requires tenantId. The schema's BEFORE INSERT
11
- * + BEFORE UPDATE triggers (`trg_predictions_tenant_match_*`) enforce that
12
- * `predictions.tenant_id` matches the referenced memory's tenant_id when
13
- * `memory_id IS NOT NULL`. Cross-tenant references are unrepresentable at
14
- * the schema level.
15
- *
16
- * Dual-write atomicity: `savePrediction` writes the memory + predictions
17
- * row inside `writeEntry`'s SAVEPOINT 'write_entry' (store/entry-writes.ts). The
18
- * afterWrite hook (store/entry-writes.ts) runs inside the same SAVEPOINT, so
19
- * a failure in either step rolls back both. Pattern matches supersede
20
- * (api.ts:1486) and the Slack/GitHub connectors.
21
- *
22
- * The planning-fallacy detector reads `loadPredictionsByClass` and computes
23
- * per-class base rates from (estimate_value, actual_value) at query time.
24
- */
1
+ /** First-class prediction: an ex-ante claim closed against an outcome. The `predictions` table is the source of truth; the memory row only mirrors the claim.
2
+ * Every helper requires tenantId; `trg_predictions_tenant_match_*` triggers enforce the prediction's tenant matches the referenced memory's.
3
+ * `savePrediction` writes memory and prediction inside `writeEntry`'s SAVEPOINT (via afterWrite), so a failure in either rolls back both. */
25
4
  import { BadRequestError, NotFoundError } from '../core/api-errors.js';
26
- import { openHippoDb, closeHippoDb, withWriteScope } from '../db/index.js';
5
+ import { withWriteScope } from '../db/index.js';
6
+ import { onHandle } from './open.js';
27
7
  import { writeEntryAt } from './sqlite/entry-writes-group.js';
28
8
  import { assertTenantId } from './tenant.js';
29
9
  import { createMemory, Layer } from '../core/memory.js';
@@ -31,6 +11,9 @@ import { appendAuditEvent } from './audit.js';
31
11
  import { loadConfig } from '../core/config.js';
32
12
  import { keysetAfter } from '../util/keyset.js';
33
13
  const DEFAULT_PREDICTION_PAGE_SIZE = 100;
14
+ const SELECT_COLUMNS = `id, memory_id, tenant_id, class_tag, claim_text,
15
+ estimate_value, estimate_unit, target_date,
16
+ actual_value, closure_state, closed_at, closure_note, created_at`;
34
17
  export const VALID_CLOSURE_STATES = new Set([
35
18
  'open',
36
19
  'closed',
@@ -55,20 +38,8 @@ function rowToPrediction(row) {
55
38
  createdAt: row.created_at,
56
39
  };
57
40
  }
58
- // ---------------------------------------------------------------------------
59
- // Public API
60
- // ---------------------------------------------------------------------------
61
- /**
62
- * Create a new prediction. Writes a memory mirror + a predictions table
63
- * row atomically inside `writeEntry`'s SAVEPOINT 'write_entry'. On any
64
- * failure (audit write, predictions INSERT, trigger ABORT), the SAVEPOINT
65
- * rolls back — neither the memory row nor the predictions row lands.
66
- *
67
- * The memory is tagged `['prediction', classTag]` with `source='prediction'`
68
- * and `kind='distilled'`. It surfaces in `hippo recall` so the agent can
69
- * see open predictions naturally; the predictions table is the canonical
70
- * structured store used by the planning-fallacy detector.
71
- */
41
+ /** Create a prediction: memory mirror and predictions row land atomically inside `writeEntry`'s SAVEPOINT; any failure rolls back both.
42
+ * The memory (tags `['prediction', classTag]`, kind 'distilled') surfaces in `hippo recall`; the predictions table feeds the planning-fallacy detector. */
72
43
  export function savePrediction(hippoRoot, tenantId, opts, actor = 'cli') {
73
44
  assertTenantId('savePrediction', tenantId);
74
45
  if (!opts.classTag)
@@ -91,7 +62,8 @@ export function predictionMirror(tenantId, claim, baseHalfLifeDays) {
91
62
  tenantId,
92
63
  });
93
64
  }
94
- /** The store port's save on hippo.db: the mirror goes in as the port's writeEntry has it, tenant check included, and its predictions row shares that write scope, so neither lands alone. */
65
+ /** The store port's save on hippo.db: the mirror goes in as the port's writeEntry has it, tenant
66
+ * check included, and its predictions row shares that write scope, so neither lands alone. */
95
67
  export function writePrediction(hippoRoot, tenantId, save, actor) {
96
68
  assertTenantId('savePrediction', tenantId);
97
69
  const now = new Date().toISOString();
@@ -120,9 +92,7 @@ function insertPredictionRow(db, memoryId, tenantId, opts, stamp) {
120
92
  const predictionId = Number(result.lastInsertRowid ?? 0);
121
93
  // SAFETY: row's shape matches the columns named in the SELECT above.
122
94
  const row = db.prepare(`
123
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
124
- estimate_value, estimate_unit, target_date,
125
- actual_value, closure_state, closed_at, closure_note, created_at
95
+ SELECT ${SELECT_COLUMNS}
126
96
  FROM predictions WHERE id = ?
127
97
  `).get(predictionId);
128
98
  if (!row) {
@@ -147,25 +117,18 @@ function auditPredictionCreate(db, who, opts) {
147
117
  },
148
118
  });
149
119
  }
150
- /**
151
- * Close an existing open prediction. Updates the predictions row only;
152
- * the memory mirror is NOT mutated in v1 (predictions table is canonical).
153
- * Accuracy is computed from (estimateValue, actualValue) at query time.
154
- */
120
+ /** Close an open prediction. Updates the predictions row only; the memory mirror is not mutated (the predictions table is the source of truth).
121
+ * Accuracy is computed from (estimateValue, actualValue) at query time. */
155
122
  export function closePrediction(hippoRoot, tenantId, id, opts, actor = 'cli') {
156
123
  assertTenantId('closePrediction', tenantId);
157
124
  if (!VALID_CLOSURE_STATES.has(opts.closureState)) {
158
125
  throw new BadRequestError(`closePrediction: closureState must be one of ${Array.from(VALID_CLOSURE_STATES).join('|')}; got ${opts.closureState}`);
159
126
  }
160
127
  const now = new Date().toISOString();
161
- const db = openHippoDb(hippoRoot);
162
- try {
128
+ return onHandle(hippoRoot, (db) => {
163
129
  const row = withWriteScope(db, 'close_prediction', () => closeOpenPredictionRow(db, tenantId, id, opts, { now, actor }));
164
130
  return rowToPrediction(row);
165
- }
166
- finally {
167
- closeHippoDb(db);
168
- }
131
+ });
169
132
  }
170
133
  /** Closes the row, reloads it and audits the close; the caller owns the transaction. */
171
134
  function closeOpenPredictionRow(db, tenantId, id, opts, stamp) {
@@ -181,9 +144,7 @@ function closeOpenPredictionRow(db, tenantId, id, opts, stamp) {
181
144
  throwCloseMiss(db, tenantId, id);
182
145
  // SAFETY: row's shape matches the columns named in the SELECT above.
183
146
  const row = db.prepare(`
184
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
185
- estimate_value, estimate_unit, target_date,
186
- actual_value, closure_state, closed_at, closure_note, created_at
147
+ SELECT ${SELECT_COLUMNS}
187
148
  FROM predictions WHERE id = ? AND tenant_id = ?
188
149
  `).get(id, tenantId);
189
150
  if (!row) {
@@ -203,10 +164,8 @@ function closeOpenPredictionRow(db, tenantId, id, opts, stamp) {
203
164
  return row;
204
165
  }
205
166
  function throwCloseMiss(db, tenantId, id) {
206
- // Distinguish "not found" from "already closed" so callers (CLI, HTTP)
207
- // can surface the right error to the user.
208
- // SAFETY: row shape matches the single `closure_state` column named
209
- // in the SELECT above.
167
+ // Distinguish 'not found' from 'already closed' so callers (CLI, HTTP) surface the right error.
168
+ // SAFETY: row shape matches the single `closure_state` column named in the SELECT above.
210
169
  const existing = db.prepare(`
211
170
  SELECT closure_state FROM predictions WHERE id = ? AND tenant_id = ?
212
171
  `).get(id, tenantId);
@@ -218,27 +177,20 @@ function throwCloseMiss(db, tenantId, id) {
218
177
  }
219
178
  export function loadPredictionById(hippoRoot, tenantId, id) {
220
179
  assertTenantId('loadPredictionById', tenantId);
221
- const db = openHippoDb(hippoRoot);
222
- try {
180
+ return onHandle(hippoRoot, (db) => {
223
181
  // SAFETY: row's shape matches the columns named in the SELECT above.
224
182
  const row = db.prepare(`
225
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
226
- estimate_value, estimate_unit, target_date,
227
- actual_value, closure_state, closed_at, closure_note, created_at
183
+ SELECT ${SELECT_COLUMNS}
228
184
  FROM predictions WHERE id = ? AND tenant_id = ?
229
185
  `).get(id, tenantId);
230
186
  return row ? rowToPrediction(row) : null;
231
- }
232
- finally {
233
- closeHippoDb(db);
234
- }
187
+ });
235
188
  }
236
189
  export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {}) {
237
190
  assertTenantId('loadPredictionsByClass', tenantId);
238
191
  const limit = opts.limit ?? DEFAULT_PREDICTION_PAGE_SIZE;
239
192
  const after = keysetAfter('created_at', 'id', opts.after);
240
- const db = openHippoDb(hippoRoot);
241
- try {
193
+ return onHandle(hippoRoot, (db) => {
242
194
  let rows;
243
195
  if (opts.closureState) {
244
196
  if (!VALID_CLOSURE_STATES.has(opts.closureState)) {
@@ -246,9 +198,7 @@ export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {})
246
198
  }
247
199
  // SAFETY: rows' shape matches the columns named in the SELECT above.
248
200
  rows = db.prepare(`
249
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
250
- estimate_value, estimate_unit, target_date,
251
- actual_value, closure_state, closed_at, closure_note, created_at
201
+ SELECT ${SELECT_COLUMNS}
252
202
  FROM predictions
253
203
  WHERE tenant_id = ? AND class_tag = ? AND closure_state = ?${after.sql}
254
204
  ORDER BY created_at DESC, id DESC
@@ -258,9 +208,7 @@ export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {})
258
208
  else {
259
209
  // SAFETY: rows' shape matches the columns named in the SELECT above.
260
210
  rows = db.prepare(`
261
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
262
- estimate_value, estimate_unit, target_date,
263
- actual_value, closure_state, closed_at, closure_note, created_at
211
+ SELECT ${SELECT_COLUMNS}
264
212
  FROM predictions
265
213
  WHERE tenant_id = ? AND class_tag = ?${after.sql}
266
214
  ORDER BY created_at DESC, id DESC
@@ -268,43 +216,26 @@ export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {})
268
216
  `).all(tenantId, classTag, ...after.params, limit);
269
217
  }
270
218
  return rows.map(rowToPrediction);
271
- }
272
- finally {
273
- closeHippoDb(db);
274
- }
219
+ });
275
220
  }
276
221
  /** Every prediction in the tenant, open and closed, across all classes: the `status=all` list without a class. */
277
222
  export function loadAllPredictions(hippoRoot, tenantId, opts = {}) {
278
223
  assertTenantId('loadAllPredictions', tenantId);
279
224
  const after = keysetAfter('created_at', 'id', opts.after);
280
- const db = openHippoDb(hippoRoot);
281
- try {
225
+ return onHandle(hippoRoot, (db) => {
282
226
  // SAFETY: rows' shape matches the columns named in the SELECT.
283
227
  const rows = db.prepare(`
284
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
285
- estimate_value, estimate_unit, target_date,
286
- actual_value, closure_state, closed_at, closure_note, created_at
228
+ SELECT ${SELECT_COLUMNS}
287
229
  FROM predictions
288
230
  WHERE tenant_id = ?${after.sql}
289
231
  ORDER BY created_at DESC, id DESC
290
232
  LIMIT ?
291
233
  `).all(tenantId, ...after.params, opts.limit ?? DEFAULT_PREDICTION_PAGE_SIZE);
292
234
  return rows.map(rowToPrediction);
293
- }
294
- finally {
295
- closeHippoDb(db);
296
- }
235
+ });
297
236
  }
298
- /**
299
- * Compute base-rate stats for closed predictions in a class for the
300
- * planning-fallacy detector: Lovallo-Kahneman (2003) inside-vs-outside view.
301
- *
302
- * Filter: closure_state='closed' AND estimate_value IS NOT NULL AND
303
- * actual_value IS NOT NULL. Excludes closed-unknown (no actual to
304
- * compare against) and open (not yet resolved).
305
- *
306
- * Audit-emit is built in here, not at the 3 call sites, so callers cannot drift.
307
- */
237
+ /** Base-rate stats for closed predictions in a class (Lovallo-Kahneman inside-vs-outside view): closure_state='closed' with estimate and actual non-null;
238
+ * closed-unknown and open are excluded. Audit-emit is built in here, not at the 3 call sites, so callers cannot drift. */
308
239
  export function computePredictionBaserate(hippoRoot, tenantId, classTag, actor = 'cli',
309
240
  /** False skips the predict_baserate audit so that channel only records deliberate
310
241
  * baserate calls, not every recall the planning-fallacy orchestrator inspects. */
@@ -312,8 +243,7 @@ emitAudit = true) {
312
243
  assertTenantId('computePredictionBaserate', tenantId);
313
244
  if (!classTag)
314
245
  throw new BadRequestError('computePredictionBaserate: classTag is required');
315
- const db = openHippoDb(hippoRoot);
316
- try {
246
+ return onHandle(hippoRoot, (db) => {
317
247
  // Ordered by id because the float sums differ with row order, and another store must reach the same figures.
318
248
  // SAFETY: rows' shape matches the two columns named in the SELECT above.
319
249
  const rows = db.prepare(`
@@ -331,10 +261,7 @@ emitAudit = true) {
331
261
  if (emitAudit)
332
262
  auditBaserateRead(db, tenantId, actor, classTag, baserate.nClosed);
333
263
  return baserate;
334
- }
335
- finally {
336
- closeHippoDb(db);
337
- }
264
+ });
338
265
  }
339
266
  function auditBaserateRead(db, tenantId, actor, classTag, nClosed) {
340
267
  appendAuditEvent(db, {
@@ -386,15 +313,12 @@ export function loadOpenPredictions(hippoRoot, tenantId, opts = {}) {
386
313
  assertTenantId('loadOpenPredictions', tenantId);
387
314
  const limit = opts.limit ?? DEFAULT_PREDICTION_PAGE_SIZE;
388
315
  const after = keysetAfter('created_at', 'id', opts.after);
389
- const db = openHippoDb(hippoRoot);
390
- try {
316
+ return onHandle(hippoRoot, (db) => {
391
317
  let rows;
392
318
  if (opts.classTag) {
393
319
  // SAFETY: rows' shape matches the columns named in the SELECT above.
394
320
  rows = db.prepare(`
395
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
396
- estimate_value, estimate_unit, target_date,
397
- actual_value, closure_state, closed_at, closure_note, created_at
321
+ SELECT ${SELECT_COLUMNS}
398
322
  FROM predictions
399
323
  WHERE tenant_id = ? AND class_tag = ? AND closure_state = 'open'${after.sql}
400
324
  ORDER BY created_at DESC, id DESC
@@ -404,9 +328,7 @@ export function loadOpenPredictions(hippoRoot, tenantId, opts = {}) {
404
328
  else {
405
329
  // SAFETY: rows' shape matches the columns named in the SELECT above.
406
330
  rows = db.prepare(`
407
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
408
- estimate_value, estimate_unit, target_date,
409
- actual_value, closure_state, closed_at, closure_note, created_at
331
+ SELECT ${SELECT_COLUMNS}
410
332
  FROM predictions
411
333
  WHERE tenant_id = ? AND closure_state = 'open'${after.sql}
412
334
  ORDER BY created_at DESC, id DESC
@@ -414,9 +336,6 @@ export function loadOpenPredictions(hippoRoot, tenantId, opts = {}) {
414
336
  `).all(tenantId, ...after.params, limit);
415
337
  }
416
338
  return rows.map(rowToPrediction);
417
- }
418
- finally {
419
- closeHippoDb(db);
420
- }
339
+ });
421
340
  }
422
341
  //# sourceMappingURL=predictions.js.map
@@ -1,22 +1,19 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { appendAuditEvent } from '../store/audit.js';
1
+ import { appendAuditEvent } from './audit.js';
4
2
  import { withBackup } from '../db/backup.js';
5
3
  import { withTrialScope, withWriteScope } from '../db/busy.js';
6
- import { assertSqliteAllowed } from '../db/open.js';
7
- import { DatabaseSync } from '../db/sqlite.js';
4
+ import { withUnmigratedDb } from '../db/open.js';
8
5
  import { getMeta, pragmaUserVersion, setMeta } from '../db/meta.js';
9
6
  import { tableColumns } from '../db/tables.js';
10
7
  import { assertBinaryCompatible } from '../db/migrate.js';
11
- import { insertDormantRow, listDormantSnapshots } from '../store/dormant.js';
8
+ import { insertDormantRow, listDormantSnapshots } from './dormant.js';
12
9
  import { calculateStrength, canAutoDelete } from '../core/memory.js';
13
10
  import { assessAutomaticMemory, BUNDLE_HEADER, isAutomaticEntry, isCertainReason } from '../core/memory-quality.js';
14
11
  import { heldTexts } from '../util/same-text.js';
15
- import { deleteEntryCore, MEMORY_BACKED_TABLES, memoriesBackingObjectsOn } from '../store/delete-and-batch.js';
16
- import { selectAllEntries, selectPreviewRows } from '../store/entry-reads.js';
17
- import { ftsRowExists } from '../store/entry-row.js';
18
- import { MEMORY_SELECT_COLUMNS, parseJsonArray } from '../store/rows.js';
19
- import { purgeMirrorBestEffort } from '../store/mirrors.js';
12
+ import { deleteEntryCore, MEMORY_BACKED_TABLES, memoriesBackingObjectsOn } from './delete-and-batch.js';
13
+ import { selectAllEntries, selectPreviewRows } from './entry-reads.js';
14
+ import { ftsRowExists } from './entry-row.js';
15
+ import { MEMORY_SELECT_COLUMNS, parseJsonArray } from './rows.js';
16
+ import { purgeMirrorBestEffort } from './mirrors.js';
20
17
  const REQUIRED_COLUMNS = {
21
18
  memories: MEMORY_SELECT_COLUMNS.split(',').map((s) => s.trim()),
22
19
  meta: ['key', 'value'],
@@ -108,7 +105,8 @@ function unsupportedPreview(db, tenantId) {
108
105
  return { total: 0, issues: [] };
109
106
  const rows = selectPreviewRows(db, columns, tenantId);
110
107
  const issues = rows.flatMap((row) => {
111
- const provenance = { ...row, source: row.source ?? '', confidence: row.confidence ?? 'observed', dag_level: row.dag_level ?? 0, tags: parseJsonArray(row.tags_json) };
108
+ const tags = parseJsonArray(row.tags_json, { table: 'memories', id: row.id, column: 'tags_json' });
109
+ const provenance = { ...row, source: row.source ?? '', confidence: row.confidence ?? 'observed', dag_level: row.dag_level ?? 0, tags };
112
110
  if (!isAutomaticEntry(provenance))
113
111
  return [];
114
112
  const { reason } = assessAutomaticMemory(row.content);
@@ -168,34 +166,20 @@ function repairOn(db, root, opts) {
168
166
  const result = withBackup(db, root, 'before-quality-repair', (backup) => applyPlan(db, root, opts.tenantId, backup, opts.doneKey));
169
167
  const warnings = [...result.warnings];
170
168
  for (const id of result.appliedIds) {
171
- if (!purgeMirrorBestEffort(root, id, false, 'quality repair'))
172
- warnings.push(`Mirror cleanup failed for ${id}; remove its stale mirror before rebuilding the index.`);
169
+ if (purgeMirrorBestEffort(root, id, false, 'quality repair'))
170
+ continue;
171
+ warnings.push(`Mirror cleanup failed for ${id}; remove its stale mirror before rebuilding the index.`);
173
172
  }
174
173
  return { ...result, warnings };
175
174
  }
176
- function openForRepair(root, readOnly, fn) {
177
- // Opens without openHippoDb to skip migrations, so it takes the same refusal itself.
178
- assertSqliteAllowed(root);
179
- const file = path.join(root, 'hippo.db');
180
- if (!fs.existsSync(file))
181
- throw new Error(`No existing Hippo database at ${file}`);
182
- const db = new DatabaseSync(file, { readOnly });
183
- try {
184
- db.exec('PRAGMA busy_timeout = 5000');
185
- return fn(db);
186
- }
187
- finally {
188
- db.close();
189
- }
190
- }
191
175
  /** Preview by default; apply backs the database up, then moves certain defects to dormant storage, without running migrations. */
192
176
  export function repairAutomaticMemories(root, opts) {
193
- return openForRepair(root, !opts.apply, (db) => repairOn(db, root, opts));
177
+ return withUnmigratedDb(root, !opts.apply, (db) => repairOn(db, root, opts));
194
178
  }
195
179
  const AUTO_REPAIR_META_KEY = 'quality_repair_auto';
196
180
  /** Applies the repair once per store, so stores that predate the quality gate are cleaned on upgrade with no command; null once done. */
197
181
  export function repairQualityOnce(root, tenantId) {
198
- return openForRepair(root, false, (db) => {
182
+ return withUnmigratedDb(root, false, (db) => {
199
183
  if (getMeta(db, AUTO_REPAIR_META_KEY) === '1')
200
184
  return null;
201
185
  // The apply commits the flag with the moves, so a lock taken between them cannot hide what moved.
@@ -2,25 +2,13 @@ import type { DatabaseSyncLike } from '../db/index.js';
2
2
  export interface ArchiveOpts {
3
3
  reason: string;
4
4
  who: string;
5
- /**
6
- * Optional hook invoked inside the same SAVEPOINT as the archive INSERT/DELETE,
7
- * after the audit row is appended and before RELEASE. Used by the Slack
8
- * deletion connector to mark the deletion event seen atomically — a crash
9
- * mid-archive must not leave the deletion event untracked. Throwing rolls
10
- * back the entire archive (including the audit row).
11
- */
5
+ /** Hook run inside the archive SAVEPOINT after the audit row and before RELEASE (the Slack deletion connector marks the event seen atomically);
6
+ * throwing rolls back the whole archive, audit row included. */
12
7
  afterArchive?: (db: DatabaseSyncLike, archivedMemoryId: string) => void;
13
8
  }
14
9
  /** Stamps the archived copy of `memoryId` as having its markdown mirror cleaned at `at`. */
15
10
  export declare function markMirrorCleaned(db: DatabaseSyncLike, memoryId: string, at: string): void;
16
- /**
17
- * The only legitimate path to remove a `kind='raw'` row from `memories`.
18
- *
19
- * Snapshots the full row into `raw_archive`, flips `kind` to `'archived'` so the
20
- * append-only trigger lets the delete through, then deletes the row. All in one
21
- * write scope, which nests inside an outer transaction (e.g. batchWriteAndDelete).
22
- *
23
- * Throws if the row does not exist or is not `kind='raw'`. Returns the archived_at it wrote.
24
- */
11
+ /** The only way to remove a `kind='raw'` row: snapshots it into `raw_archive`, flips `kind` to 'archived' so the append-only trigger allows the delete,
12
+ * all in one write scope that nests in an outer transaction. Throws if the row is missing or not raw; returns the archived_at. */
25
13
  export declare function archiveRawMemory(db: DatabaseSyncLike, id: string, opts: ArchiveOpts): string;
26
14
  //# sourceMappingURL=raw-archive.d.ts.map
@@ -1,3 +1,4 @@
1
+ import { DEFAULT_TENANT_ID } from '../util/env.js';
1
2
  import { BadRequestError, NotFoundError } from '../core/api-errors.js';
2
3
  import { isFtsAvailable, withWriteScope } from '../db/index.js';
3
4
  import { appendAuditEvent, reportAuditWriteFailure } from './audit.js';
@@ -7,9 +8,8 @@ export function markMirrorCleaned(db, memoryId, at) {
7
8
  db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(at, memoryId);
8
9
  }
9
10
  function loadRawRow(db, id) {
10
- // SAFETY: SELECT * FROM memories returns every column of the memories table; only
11
- // kind, tenant_id, and dag_parent_id are read below, all guaranteed present (possibly
12
- // null) by the memories schema.
11
+ // SAFETY: SELECT * returns every memories column; only kind, tenant_id and dag_parent_id are read below, all guaranteed present (possibly null) by the
12
+ // schema.
13
13
  const row = db.prepare(`SELECT * FROM memories WHERE id = ?`).get(id);
14
14
  if (!row)
15
15
  throw new NotFoundError(`memory not found: ${id}`);
@@ -19,15 +19,13 @@ function loadRawRow(db, id) {
19
19
  return row;
20
20
  }
21
21
  function moveRowToArchive(db, id, row, opts) {
22
- // GDPR: raw_archive stores ONLY metadata, not the original
23
- // memory content. The audit_log row appended below carries op='archive_raw'
24
- // for the compliance audit trail. True right-to-be-forgotten — the original
25
- // content is unrecoverable from raw_archive after this point.
22
+ // GDPR: raw_archive stores ONLY metadata, never the original content; the archive_raw audit row is the compliance trail,
23
+ // so the content is unrecoverable from here on.
26
24
  const archivedAt = new Date().toISOString();
27
25
  const redactedPayload = JSON.stringify({
28
26
  redacted: true,
29
27
  archived_at: archivedAt,
30
- tenant_id: row.tenant_id ?? 'default',
28
+ tenant_id: row.tenant_id ?? DEFAULT_TENANT_ID,
31
29
  kind: row.kind,
32
30
  reason: opts.reason,
33
31
  });
@@ -40,15 +38,12 @@ function moveRowToArchive(db, id, row, opts) {
40
38
  db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(id);
41
39
  return archivedAt;
42
40
  }
43
- // Emit the archive_raw audit event inside the SAVEPOINT so the audit row is
44
- // committed atomically with the row deletion. Use the row's own tenant_id
45
- // (fetched above as part of SELECT *), not the env. Archives must be
46
- // attributed to the tenant that owns the row, not whatever HIPPO_TENANT
47
- // happens to be set to in the calling shell.
41
+ // Emit the archive_raw audit inside the SAVEPOINT so it commits atomically with the row deletion, attributed to the row's own tenant_id,
42
+ // not whatever HIPPO_TENANT the calling shell has set.
48
43
  function auditArchive(db, id, row, opts) {
49
44
  try {
50
45
  appendAuditEvent(db, {
51
- tenantId: String(row.tenant_id ?? 'default'),
46
+ tenantId: String(row.tenant_id ?? DEFAULT_TENANT_ID),
52
47
  actor: opts.who || 'cli',
53
48
  op: 'archive_raw',
54
49
  targetId: id,
@@ -60,15 +55,8 @@ function auditArchive(db, id, row, opts) {
60
55
  reportAuditWriteFailure('archive_raw', String(error), id);
61
56
  }
62
57
  }
63
- /**
64
- * The only legitimate path to remove a `kind='raw'` row from `memories`.
65
- *
66
- * Snapshots the full row into `raw_archive`, flips `kind` to `'archived'` so the
67
- * append-only trigger lets the delete through, then deletes the row. All in one
68
- * write scope, which nests inside an outer transaction (e.g. batchWriteAndDelete).
69
- *
70
- * Throws if the row does not exist or is not `kind='raw'`. Returns the archived_at it wrote.
71
- */
58
+ /** The only way to remove a `kind='raw'` row: snapshots it into `raw_archive`, flips `kind` to 'archived' so the append-only trigger allows the delete,
59
+ * all in one write scope that nests in an outer transaction. Throws if the row is missing or not raw; returns the archived_at. */
72
60
  export function archiveRawMemory(db, id, opts) {
73
61
  const row = loadRawRow(db, id);
74
62
  // A SAVEPOINT when already inside a transaction (e.g. batchWriteAndDelete), so a throw here
@@ -79,13 +67,10 @@ export function archiveRawMemory(db, id, opts) {
79
67
  // Archiving a child under a level-2 summary marks the parent dirty, inside the
80
68
  // SAVEPOINT so the dirty-mark commits atomically with the archive.
81
69
  if (row.dag_parent_id) {
82
- markSummaryDirtyInTx(db, String(row.dag_parent_id), String(row.tenant_id ?? 'default'), opts.who || 'cli');
70
+ markSummaryDirtyInTx(db, String(row.dag_parent_id), String(row.tenant_id ?? DEFAULT_TENANT_ID), opts.who || 'cli');
83
71
  }
84
- // afterArchive hook: connector-level idempotency markers
85
- // (e.g. slack_event_log) must commit atomically with the archive itself.
86
- // Throwing here rolls back the entire SAVEPOINT — both the archive and any
87
- // hook side effects. The hook runs INSIDE the SAVEPOINT so its writes
88
- // share the archive's transactional fate.
72
+ // afterArchive hook: connector idempotency markers (e.g. slack_event_log) must commit atomically with the archive, so it runs INSIDE the SAVEPOINT;
73
+ // throwing rolls back both.
89
74
  if (opts.afterArchive) {
90
75
  opts.afterArchive(db, id);
91
76
  }
@@ -1,48 +1,14 @@
1
- /**
2
- * Recall-side scope predicates, in a leaf module so shared.ts (which api.ts
3
- * imports) can apply the same default-deny rule to searchBothHybrid's internal
4
- * candidate loads without an import cycle. api.ts imports
5
- * these for its own call sites AND re-exports them for back-compat
6
- * (`api.isPrivateScope`, test imports of `passesScopeFilterForRecall`).
7
- */
1
+ /** Recall-side scope predicates, in a leaf module so search-both.ts can apply the same default-deny rule to searchBothHybrid's candidate loads without an
2
+ * import cycle. src/api/index.ts imports these and re-exports them for back-compat (`api.isPrivateScope`, tests importing `passesScopeFilterForRecall`). */
8
3
  import { ForbiddenError } from '../core/api-errors.js';
9
- /**
10
- * Literal scopes excluded from recall by default-deny when the
11
- * caller passes no `scope`. The SQL clause in `loadSearchRows` and the JS
12
- * helper `passesScopeFilterForRecall` (src/api/index.ts) both read from this
13
- * constant. Adding a deny scope is a one-place change.
14
- *
15
- * Regex-based denies (e.g. `<source>:private:*`) stay in
16
- * `passesScopeFilterForRecall` as a separate JS step — they don't translate
17
- * cleanly to SQL.
18
- *
19
- * Invariant: never empty. An empty array would silently allow quarantine
20
- * scopes through both paths (SQL clause omitted, JS check vacuous). The
21
- * module-load assertion below pins this loudly.
22
- */
4
+ /** Literal scopes excluded from recall by default-deny when the caller passes no `scope`; read by the SQL clause in `loadSearchRows` and by
5
+ * `passesScopeFilterForRecall`. Invariant: never empty, or quarantine scopes would pass both paths silently (the module-load assertion below pins this). */
23
6
  export declare const RECALL_DEFAULT_DENY_SCOPES: readonly ["unknown:legacy"];
24
- /**
25
- * @internal Runtime guard against a future maintainer blanking a
26
- * load-bearing literal array. Extracted from the inline guard so the throw
27
- * path is directly testable. `as const` arrays widen via `readonly T[]` at
28
- * the call site so the empty case is reachable at runtime.
29
- */
7
+ /** @internal Runtime guard against blanking a load-bearing literal array; `as const` arrays widen via `readonly T[]` at the call site, so the empty case
8
+ * is reachable and testable. */
30
9
  export declare function assertNonEmpty<T>(arr: readonly T[], name: string): void;
31
- /**
32
- * Source-agnostic private-scope detector. A scope string is treated
33
- * as private when it has the shape `<lowercase-source>:private:<rest>`.
34
- *
35
- * Examples that match:
36
- * slack:private:Cabc, github:private:owner/repo, jira:private:PROJ-1
37
- * Examples that DO NOT match:
38
- * slack:public:Cgeneral, acme:public:my-private-channel, null, '',
39
- * 'unknown:legacy', 'private' (alone), 'private:foo' (no source prefix).
40
- *
41
- * Used by api.recall, mcp/server.ts (hippo_recall + hippo_context),
42
- * cli.ts (cmdRecall + cmdExplain + continuity), shared.ts (searchBothHybrid
43
- * recall mode). Keep these in sync — the export is the single source of
44
- * truth so connector work cannot drift.
45
- */
10
+ /** Source-agnostic private-scope detector: private means `<lowercase-source>:private:<rest>` (`slack:private:Cabc`; not `slack:public:x`, null, '',
11
+ * 'private:foo'). The single source of truth for api.recall, the MCP server, the CLI and search-both.ts, so connector work cannot drift. */
46
12
  export declare const PRIVATE_SCOPE_RE: RegExp;
47
13
  /** True when `scope` matches the `<source>:private:*` shape. */
48
14
  export declare function isPrivateScope(scope: string | null | undefined): boolean;
@@ -62,15 +28,8 @@ export declare function canTouchScope(actor: {
62
28
  }, scope: string | null): boolean;
63
29
  /** canTouchScope for a caller known by its own personal scope, as a store method receives it. */
64
30
  export declare function ownScopeTouches(ownScope: string | null, scope: string | null): boolean;
65
- /**
66
- * Recall-side scope filter — the canonical JS half of the recall default-deny
67
- * rule (the SQL half lives in `loadSearchRows` via `loadRecallSearchEntries`).
68
- *
69
- * - When `requested` is set and non-empty: exact match required.
70
- * - When `requested` is undefined/empty: default-deny on any
71
- * `<source>:private:*` scope and on the `RECALL_DEFAULT_DENY_SCOPES`
72
- * quarantine buckets. `null` and public scopes pass, and so does `ownScope`, the caller's own personal scope.
73
- */
31
+ /** JS half of the recall default-deny rule (SQL half: `loadSearchRows`). A non-empty `requested` needs an exact match;
32
+ * otherwise `<source>:private:*` and `RECALL_DEFAULT_DENY_SCOPES` buckets are denied, while null, public scopes and the caller's `ownScope` pass. */
74
33
  export declare function passesScopeFilterForRecall(scope: string | null, requested: string | undefined, ownScope?: string | null): boolean;
75
34
  export interface SqlFragment {
76
35
  sql: string;
@@ -78,39 +37,19 @@ export interface SqlFragment {
78
37
  }
79
38
  /** SQL twin of the no-request arm of passesScopeFilterForRecall; `ownScope` is bound and compared with `=`, so `%` or `_` in an owner match nothing extra. */
80
39
  export declare function scopeAdmitSql(col: '' | 'm.', ownScope?: string | null): SqlFragment;
81
- /** SQL twin of canTouchScope, which is also canReadScope for an admin: every row but another person's personal one. LIKE folds ASCII case as isPersonalScope's /i does. */
40
+ /** SQL twin of canTouchScope, which is also canReadScope for an admin: every row but
41
+ * another person's personal one. LIKE folds ASCII case as isPersonalScope's /i does. */
82
42
  export declare function touchableScopeSql(col: '' | 'm.', ownScope?: string | null): SqlFragment;
83
- /**
84
- * The CLI `--scope` variant of the recall filter (JS half of the
85
- * SQL 'default-deny-or-exact' mode in loadSearchRows).
86
- *
87
- * The CLI flag predates the envelope column as a TAG-boost ranking hint
88
- * (`scope:<v>` tags, HIPPO_SCOPE, detectScope()), so an explicit `--scope X`
89
- * UNLOCKS envelope scope X in addition to the default-admitted set — it does
90
- * NOT narrow the result to X (that would return zero rows for every
91
- * tag-scoped workflow, whose envelope scope is NULL). api.recall keeps the
92
- * narrowing 'exact' semantics via `passesScopeFilterForRecall`.
93
- *
94
- * Note the unlock applies to whatever scope was explicitly named — including
95
- * a private scope or a quarantine bucket (`--scope unknown:legacy`). That is
96
- * deliberate owner access, identical in reach to api.recall's exact-match
97
- * for the same input; only NON-requested private/quarantine scopes stay
98
- * denied. A named personal scope never unlocks: the CLI has no caller identity to check it against.
99
- */
43
+ /** CLI `--scope` variant: an explicit `--scope X` UNLOCKS scope X on top of the default-admitted set rather than narrowing to X (api.recall keeps 'exact').
44
+ * Includes private/quarantine scopes (owner access); a named personal scope never unlocks: the CLI has no caller identity. */
100
45
  export declare function passesCliRecallScopeFilter(scope: string | null, requested: string | undefined): boolean;
101
- /**
102
- * Thrown when a caller requests a scope its role may not read. The HTTP layer
103
- * maps it to 403.
104
- */
46
+ /** Thrown when a caller requests a scope its role may not read; the HTTP layer maps it to 403. */
105
47
  export declare class ScopeForbiddenError extends ForbiddenError {
106
48
  readonly scope: string;
107
49
  constructor(scope: string);
108
50
  }
109
- /**
110
- * True for scopes that default-deny hides: `<source>:private:*` and the
111
- * quarantine buckets. Naming one explicitly is what unlocks it, so naming one
112
- * is the act that needs authorization.
113
- */
51
+ /** True for scopes default-deny hides (`<source>:private:*` and the quarantine buckets); naming one explicitly unlocks it, so naming one needs
52
+ * authorization. */
114
53
  export declare function isRestrictedScope(scope: string | null | undefined): boolean;
115
54
  /** The identity a scope check runs against: a role, any scope grants, and the person who owns the key. */
116
55
  export interface ScopeActor {
@@ -118,7 +57,8 @@ export interface ScopeActor {
118
57
  scopes?: readonly string[];
119
58
  owner?: string;
120
59
  }
121
- /** Personal rows answer to their owner alone: role, key grants and resolver scopes never open one. Else admin reads all; a member needs an exact grant on a restricted scope. */
60
+ /** Personal rows answer to their owner alone: role, key grants and resolver scopes never
61
+ * open one. Else admin reads all; a member needs an exact grant on a restricted scope. */
122
62
  export declare function canReadScope(actor: ScopeActor, scope: string): boolean;
123
63
  /** Authorize an explicitly requested scope before any read honours it (member scope grants). */
124
64
  export declare function assertScopeRequestAllowed(actor: ScopeActor, requested: string | undefined): void;