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,23 +1,5 @@
1
- /**
2
- * customer_note first-class object.
3
- *
4
- * A `customer_note` is a discrete note recorded against an account/customer entity:
5
- * a `note` body scoped to a `customer`, evolving via the supersede delta lifecycle.
6
- * Entity-scoping is a free-form `customer` column (the `entities` table is unbuilt,
7
- * so an FK is deferred). Unlike project_brief's one-summary-per-repo,
8
- * a customer accrues MANY discrete notes over time, each with its own supersede chain
9
- * (correct a note -> a new version preserving history; close retires it).
10
- *
11
- * Reuses the project_brief/skill supersede machinery verbatim (superseded_by self-FK
12
- * + CAS + INSERT-preflight + server-derived version + change_summary + supersede
13
- * tenant-match trigger). It has NO assembler/renderer (the simplest first-class object): the
14
- * contribution is purely the entity-scoping dimension.
15
- *
16
- * The `customer_notes` table is the source of truth (survives memory decay); the
17
- * memory mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
18
- *
19
- * Lifecycle: active -> superseded (a corrected version) or active -> closed (retired).
20
- */
1
+ /** customer_note object: many discrete notes per free-form `customer` column (no entities FK yet), each with its own supersede chain.
2
+ * The `customer_notes` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall. */
21
3
  import type { KeysetPosition } from '../util/keyset.js';
22
4
  import type { SavableDescriptor } from './descriptor.js';
23
5
  import type { CustomerNote, NoteStatus } from '../store/object-types.js';
@@ -47,32 +29,15 @@ export interface ListCustomerNotesOpts {
47
29
  after?: KeysetPosition;
48
30
  }
49
31
  export declare const CUSTOMER_NOTE: SavableDescriptor<'customer_note', SaveCustomerNoteOpts>;
50
- /**
51
- * Create a customer_note (or a new version that supersedes an existing one). Writes
52
- * the memory mirror + the customer_notes row in the `objects` store group's one transaction.
53
- * When supersedesNoteId is given, the referenced ACTIVE row is preflighted (status +
54
- * version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same transaction;
55
- * the new version = predecessor.version + 1 (server-derived).
56
- *
57
- * The memory mirror carries a `customer:<lc>` tag (in addition to ['customer_note']
58
- * + caller extraTags) so scope-aware recall treats the note as entity-local. There is
59
- * no self-recursion path (customer_note has no receipt-query/refresh).
60
- */
32
+ /** Create a customer_note, or a new version superseding an existing one, in the `objects` store group's one transaction.
33
+ * The mirror carries a `customer:<lc>` tag so scope-aware recall treats the note as entity-local. */
61
34
  export declare function saveCustomerNote(hippoRoot: string, tenantId: string, opts: SaveCustomerNoteOpts, actor?: string): CustomerNote;
62
- /**
63
- * Close (retire) an active note. CAS guard WHERE status='active'; 0 changes
64
- * distinguishes not-found from not-active. A superseded row is terminal.
65
- */
35
+ /** Close (retire) an active note; CAS on status='active', 0 changes means not-found or not-active. */
66
36
  export declare function closeCustomerNote(hippoRoot: string, tenantId: string, id: number, actor?: string): CustomerNote;
67
37
  export declare function loadCustomerNoteById(hippoRoot: string, tenantId: string, id: number): CustomerNote | null;
68
38
  export declare function loadCustomerNotes(hippoRoot: string, tenantId: string, opts?: ListCustomerNotesOpts): CustomerNote[];
69
- /**
70
- * All ACTIVE notes for a customer, newest first. Returns a LIST (a customer accrues
71
- * MANY notes) - this deliberately DIVERGES from project_brief's
72
- * loadActiveBriefForRepo, which returns a single brief-or-null because a repo has one
73
- * evolving summary. A future caller cloning the project_brief shape by analogy must
74
- * not assume a single-return here; the plural name signals the list contract.
75
- */
39
+ /** All ACTIVE notes for a customer, newest first. Returns a LIST, unlike project_brief's single-or-null
40
+ * loadActiveBriefForRepo: a customer accrues many notes. */
76
41
  export declare function loadActiveNotesForCustomer(hippoRoot: string, tenantId: string, customer: string, opts?: {
77
42
  limit?: number;
78
43
  }): CustomerNote[];
@@ -1,28 +1,7 @@
1
- /**
2
- * customer_note first-class object.
3
- *
4
- * A `customer_note` is a discrete note recorded against an account/customer entity:
5
- * a `note` body scoped to a `customer`, evolving via the supersede delta lifecycle.
6
- * Entity-scoping is a free-form `customer` column (the `entities` table is unbuilt,
7
- * so an FK is deferred). Unlike project_brief's one-summary-per-repo,
8
- * a customer accrues MANY discrete notes over time, each with its own supersede chain
9
- * (correct a note -> a new version preserving history; close retires it).
10
- *
11
- * Reuses the project_brief/skill supersede machinery verbatim (superseded_by self-FK
12
- * + CAS + INSERT-preflight + server-derived version + change_summary + supersede
13
- * tenant-match trigger). It has NO assembler/renderer (the simplest first-class object): the
14
- * contribution is purely the entity-scoping dimension.
15
- *
16
- * The `customer_notes` table is the source of truth (survives memory decay); the
17
- * memory mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
18
- *
19
- * Lifecycle: active -> superseded (a corrected version) or active -> closed (retired).
20
- */
1
+ /** customer_note object: many discrete notes per free-form `customer` column (no entities FK yet), each with its own supersede chain.
2
+ * The `customer_notes` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall. */
21
3
  import { checkText, requireLine } from './fields.js';
22
4
  import { closeObjectAt, listObjectsAt, objectByIdAt, saveObjectAt } from './lifecycle.js';
23
- // ---------------------------------------------------------------------------
24
- // Domain types
25
- // ---------------------------------------------------------------------------
26
5
  export const VALID_NOTE_STATES = new Set([
27
6
  'active',
28
7
  'superseded',
@@ -69,27 +48,12 @@ export const CUSTOMER_NOTE = {
69
48
  };
70
49
  },
71
50
  };
72
- // ---------------------------------------------------------------------------
73
- // Public API
74
- // ---------------------------------------------------------------------------
75
- /**
76
- * Create a customer_note (or a new version that supersedes an existing one). Writes
77
- * the memory mirror + the customer_notes row in the `objects` store group's one transaction.
78
- * When supersedesNoteId is given, the referenced ACTIVE row is preflighted (status +
79
- * version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same transaction;
80
- * the new version = predecessor.version + 1 (server-derived).
81
- *
82
- * The memory mirror carries a `customer:<lc>` tag (in addition to ['customer_note']
83
- * + caller extraTags) so scope-aware recall treats the note as entity-local. There is
84
- * no self-recursion path (customer_note has no receipt-query/refresh).
85
- */
51
+ /** Create a customer_note, or a new version superseding an existing one, in the `objects` store group's one transaction.
52
+ * The mirror carries a `customer:<lc>` tag so scope-aware recall treats the note as entity-local. */
86
53
  export function saveCustomerNote(hippoRoot, tenantId, opts, actor = 'cli') {
87
54
  return saveObjectAt(CUSTOMER_NOTE, { hippoRoot, tenantId, actor }, opts);
88
55
  }
89
- /**
90
- * Close (retire) an active note. CAS guard WHERE status='active'; 0 changes
91
- * distinguishes not-found from not-active. A superseded row is terminal.
92
- */
56
+ /** Close (retire) an active note; CAS on status='active', 0 changes means not-found or not-active. */
93
57
  export function closeCustomerNote(hippoRoot, tenantId, id, actor = 'cli') {
94
58
  return closeObjectAt(hippoRoot, CUSTOMER_NOTE, tenantId, id, actor);
95
59
  }
@@ -99,13 +63,8 @@ export function loadCustomerNoteById(hippoRoot, tenantId, id) {
99
63
  export function loadCustomerNotes(hippoRoot, tenantId, opts = {}) {
100
64
  return listObjectsAt(hippoRoot, CUSTOMER_NOTE, tenantId, { status: opts.status, filter: opts.customer, limit: opts.limit, after: opts.after });
101
65
  }
102
- /**
103
- * All ACTIVE notes for a customer, newest first. Returns a LIST (a customer accrues
104
- * MANY notes) - this deliberately DIVERGES from project_brief's
105
- * loadActiveBriefForRepo, which returns a single brief-or-null because a repo has one
106
- * evolving summary. A future caller cloning the project_brief shape by analogy must
107
- * not assume a single-return here; the plural name signals the list contract.
108
- */
66
+ /** All ACTIVE notes for a customer, newest first. Returns a LIST, unlike project_brief's single-or-null
67
+ * loadActiveBriefForRepo: a customer accrues many notes. */
109
68
  export function loadActiveNotesForCustomer(hippoRoot, tenantId, customer, opts = {}) {
110
69
  return loadCustomerNotes(hippoRoot, tenantId, { customer, status: 'active', limit: opts.limit });
111
70
  }
@@ -1,27 +1,6 @@
1
- /**
2
- * Decision first-class object.
3
- *
4
- * `hippo decide` used to write only a tagged memory (tags ['decision'], source
5
- * 'decision') with a 90-day half-life, so an in-force decision decayed out of
6
- * recall even though it was never reversed. The `decisions` table is now the
7
- * source of truth: a decision stays `active` regardless of memory decay, and
8
- * `hippo decide list --status active` is authoritative. A memory row still
9
- * mirrors the decision for recall surfaces but is NOT canonical — memory_id is
10
- * NULLABLE with ON DELETE SET NULL so forget/consolidate/archive gracefully
11
- * orphans the decision row.
12
- *
13
- * Lifecycle: active -> superseded (a newer decision replaces it; superseded_by
14
- * points to the successor) or active -> closed (retired with no successor).
15
- *
16
- * Tenant scoping: every helper requires tenantId. BEFORE INSERT/UPDATE triggers
17
- * enforce decisions.tenant_id == the referenced memory's tenant_id, and a
18
- * superseded_by same-tenant trigger makes cross-tenant supersession
19
- * unrepresentable. Mirrors the predictions pattern (src/predictions.ts).
20
- *
21
- * Dual-write atomicity: `saveDecision` hands the memory and the decision to the
22
- * `objects` store group, which commits them (and, when superseding, the old
23
- * row's UPDATE) together, so a failure in any step rolls all of them back.
24
- */
1
+ /** Decision object: the `decisions` table is the source of truth, so an in-force decision stays `active` despite memory decay.
2
+ * The memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall only; saveDecision commits both in one `objects` transaction. */
3
+ import type { MemoryEntry } from '../core/memory.js';
25
4
  import type { KeysetPosition } from '../util/keyset.js';
26
5
  import type { SavableDescriptor } from './descriptor.js';
27
6
  import type { Decision, DecisionStatus } from '../store/object-types.js';
@@ -30,9 +9,8 @@ export declare const VALID_DECISION_STATES: ReadonlySet<DecisionStatus>;
30
9
  export interface SaveDecisionOpts {
31
10
  decisionText: string;
32
11
  context?: string;
33
- /** Table id of an ACTIVE decision this one supersedes. The CLI resolves it
34
- * from a `--supersedes <memory-id>` via resolveActiveDecisionIdByMemory;
35
- * HTTP/SDK pass the table id directly. */
12
+ /** Table id of an ACTIVE decision this one supersedes; the CLI resolves a `--supersedes <memory-id>`
13
+ * via resolveActiveDecisionIdByMemory, HTTP/SDK pass the table id. */
36
14
  supersedesDecisionId?: number;
37
15
  /** Extra memory tags merged after ['decision'] (the CLI passes path-context
38
16
  * tags; HTTP/SDK pass none). */
@@ -45,35 +23,19 @@ export interface ListDecisionsOpts {
45
23
  after?: KeysetPosition;
46
24
  }
47
25
  export declare const DECISION: SavableDescriptor<'decision', SaveDecisionOpts>;
48
- /**
49
- * Create a decision. The memory mirror and the decisions row are written in
50
- * one transaction by the `objects` store group. When supersedesDecisionId is
51
- * given, the referenced ACTIVE row is UPDATEd -> superseded in the SAME
52
- * transaction (CAS: WHERE status='active'; zero rows changed means a duplicate
53
- * supersede aborts the whole write rather than orphaning a successor).
54
- *
55
- * The memory mirror preserves the legacy `hippo decide` shape: tags
56
- * ['decision', ...extraTags], source 'decision', confidence 'verified',
57
- * the configured default half-life, content = "<text>\n\nContext: <context>"
58
- * when context is given (so existing recall output is unchanged).
59
- */
26
+ /** Create a decision; the memory mirror and the row commit in one transaction.
27
+ * Superseding CASes the old row (WHERE status='active'), so a duplicate supersede aborts the whole write. */
60
28
  export declare function saveDecision(hippoRoot: string, tenantId: string, opts: SaveDecisionOpts, actor?: string): Decision;
61
- /**
62
- * Close (retire) an active decision with no successor. Updates the decisions
63
- * row only; the memory mirror is not mutated.
64
- */
29
+ /** Weaken the memory a new decision replaces, once the save has committed: half-life halved to a day at least, marked stale, tagged `superseded`. */
30
+ export declare function weakenSupersededMemory(hippoRoot: string, entry: MemoryEntry, actor?: string): void;
31
+ /** Close (retire) an active decision with no successor; the memory mirror is not mutated. */
65
32
  export declare function closeDecision(hippoRoot: string, tenantId: string, id: number, actor?: string): Decision;
66
33
  export declare function loadDecisionById(hippoRoot: string, tenantId: string, id: number): Decision | null;
67
34
  export declare function loadDecisions(hippoRoot: string, tenantId: string, opts?: ListDecisionsOpts): Decision[];
68
35
  export declare function loadActiveDecisions(hippoRoot: string, tenantId: string, opts?: {
69
36
  limit?: number;
70
37
  }): Decision[];
71
- /**
72
- * Resolve a `--supersedes <memory-id>` (the legacy CLI contract) to the table id
73
- * of the ACTIVE decision backed by that memory, or null when the memory has no
74
- * active decision row (a legacy pre-episode decision-tagged memory). Extracted
75
- * so the CLI's backward-compat path is unit-testable at the store layer without
76
- * exporting cmdDecide.
77
- */
38
+ /** Resolve a `--supersedes <memory-id>` to the table id of the ACTIVE decision backed by that memory, or null.
39
+ * Exported so the CLI's backward-compat path is testable at the store layer. */
78
40
  export declare function resolveActiveDecisionIdByMemory(hippoRoot: string, tenantId: string, memoryId: string): number | null;
79
41
  //# sourceMappingURL=decisions.d.ts.map
@@ -1,34 +1,11 @@
1
- /**
2
- * Decision first-class object.
3
- *
4
- * `hippo decide` used to write only a tagged memory (tags ['decision'], source
5
- * 'decision') with a 90-day half-life, so an in-force decision decayed out of
6
- * recall even though it was never reversed. The `decisions` table is now the
7
- * source of truth: a decision stays `active` regardless of memory decay, and
8
- * `hippo decide list --status active` is authoritative. A memory row still
9
- * mirrors the decision for recall surfaces but is NOT canonical — memory_id is
10
- * NULLABLE with ON DELETE SET NULL so forget/consolidate/archive gracefully
11
- * orphans the decision row.
12
- *
13
- * Lifecycle: active -> superseded (a newer decision replaces it; superseded_by
14
- * points to the successor) or active -> closed (retired with no successor).
15
- *
16
- * Tenant scoping: every helper requires tenantId. BEFORE INSERT/UPDATE triggers
17
- * enforce decisions.tenant_id == the referenced memory's tenant_id, and a
18
- * superseded_by same-tenant trigger makes cross-tenant supersession
19
- * unrepresentable. Mirrors the predictions pattern (src/predictions.ts).
20
- *
21
- * Dual-write atomicity: `saveDecision` hands the memory and the decision to the
22
- * `objects` store group, which commits them (and, when superseding, the old
23
- * row's UPDATE) together, so a failure in any step rolls all of them back.
24
- */
1
+ /** Decision object: the `decisions` table is the source of truth, so an in-force decision stays `active` despite memory decay.
2
+ * The memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall only; saveDecision commits both in one `objects` transaction. */
25
3
  import { BadRequestError } from '../core/api-errors.js';
4
+ import { writeEntry } from '../store/entry-writes.js';
26
5
  import { assertTenantId } from '../store/tenant.js';
27
6
  import { closeObjectAt, listObjectsAt, objectByIdAt, saveObjectAt } from './lifecycle.js';
28
7
  import { objectIdByMemory } from '../store/sqlite/objects-group.js';
29
- // ---------------------------------------------------------------------------
30
- // Domain types
31
- // ---------------------------------------------------------------------------
8
+ const SUPERSEDED_TAG = 'superseded';
32
9
  export const VALID_DECISION_STATES = new Set([
33
10
  'active',
34
11
  'superseded',
@@ -53,28 +30,18 @@ export const DECISION = {
53
30
  };
54
31
  },
55
32
  };
56
- // ---------------------------------------------------------------------------
57
- // Public API
58
- // ---------------------------------------------------------------------------
59
- /**
60
- * Create a decision. The memory mirror and the decisions row are written in
61
- * one transaction by the `objects` store group. When supersedesDecisionId is
62
- * given, the referenced ACTIVE row is UPDATEd -> superseded in the SAME
63
- * transaction (CAS: WHERE status='active'; zero rows changed means a duplicate
64
- * supersede aborts the whole write rather than orphaning a successor).
65
- *
66
- * The memory mirror preserves the legacy `hippo decide` shape: tags
67
- * ['decision', ...extraTags], source 'decision', confidence 'verified',
68
- * the configured default half-life, content = "<text>\n\nContext: <context>"
69
- * when context is given (so existing recall output is unchanged).
70
- */
33
+ /** Create a decision; the memory mirror and the row commit in one transaction.
34
+ * Superseding CASes the old row (WHERE status='active'), so a duplicate supersede aborts the whole write. */
71
35
  export function saveDecision(hippoRoot, tenantId, opts, actor = 'cli') {
72
36
  return saveObjectAt(DECISION, { hippoRoot, tenantId, actor }, opts);
73
37
  }
74
- /**
75
- * Close (retire) an active decision with no successor. Updates the decisions
76
- * row only; the memory mirror is not mutated.
77
- */
38
+ /** Weaken the memory a new decision replaces, once the save has committed: half-life halved to a day at least, marked stale, tagged `superseded`. */
39
+ export function weakenSupersededMemory(hippoRoot, entry, actor = 'cli') {
40
+ const tags = entry.tags.includes(SUPERSEDED_TAG) ? entry.tags : [...entry.tags, SUPERSEDED_TAG];
41
+ const halved = Math.max(1, Math.floor(entry.half_life_days / 2));
42
+ writeEntry(hippoRoot, { ...entry, half_life_days: halved, confidence: 'stale', tags }, { actor });
43
+ }
44
+ /** Close (retire) an active decision with no successor; the memory mirror is not mutated. */
78
45
  export function closeDecision(hippoRoot, tenantId, id, actor = 'cli') {
79
46
  return closeObjectAt(hippoRoot, DECISION, tenantId, id, actor);
80
47
  }
@@ -87,13 +54,8 @@ export function loadDecisions(hippoRoot, tenantId, opts = {}) {
87
54
  export function loadActiveDecisions(hippoRoot, tenantId, opts = {}) {
88
55
  return loadDecisions(hippoRoot, tenantId, { status: 'active', limit: opts.limit });
89
56
  }
90
- /**
91
- * Resolve a `--supersedes <memory-id>` (the legacy CLI contract) to the table id
92
- * of the ACTIVE decision backed by that memory, or null when the memory has no
93
- * active decision row (a legacy pre-episode decision-tagged memory). Extracted
94
- * so the CLI's backward-compat path is unit-testable at the store layer without
95
- * exporting cmdDecide.
96
- */
57
+ /** Resolve a `--supersedes <memory-id>` to the table id of the ACTIVE decision backed by that memory, or null.
58
+ * Exported so the CLI's backward-compat path is testable at the store layer. */
97
59
  export function resolveActiveDecisionIdByMemory(hippoRoot, tenantId, memoryId) {
98
60
  assertTenantId('resolveActiveDecisionIdByMemory', tenantId);
99
61
  return objectIdByMemory(hippoRoot, tenantId, 'decision', 'active', memoryId);
@@ -1,30 +1,6 @@
1
- /**
2
- * Incident first-class object.
3
- *
4
- * An incident is a postmortem capsule: a recorded operational event with a
5
- * lifecycle and optional linked receipts (the memories that are its evidence).
6
- * The `incidents` table is the source of truth: an incident stays `open`
7
- * regardless of memory decay. A memory row still mirrors the incident for
8
- * recall surfaces but is NOT canonical — memory_id is NULLABLE with ON DELETE
9
- * SET NULL so forget/consolidate/archive gracefully orphans the incident row.
10
- *
11
- * Lifecycle: open -> resolved (a resolution was recorded; the incident stays on
12
- * record with resolution_text + resolved_at) or open|resolved -> closed
13
- * (retired with closed_at). This is NOT decision's supersede: there is no
14
- * superseded_by self-FK, no supersede CAS, and no supersede trigger.
15
- *
16
- * Tenant scoping: every helper requires tenantId. BEFORE INSERT/UPDATE triggers
17
- * enforce incidents.tenant_id == the referenced memory's tenant_id. Mirrors the
18
- * v30 decisions pattern (src/objects/decisions.ts).
19
- *
20
- * Dual-write atomicity: `saveIncident` writes the memory + incidents row in the
21
- * `objects` store group's one transaction, so a failure in any step rolls all of
22
- * them back.
23
- *
24
- * linked_memory_ids ("linked receipts"): a JSON-encoded array of memory ids on
25
- * the row, default `[]`. On save, every id must exist in the SAME tenant; a
26
- * cross-tenant or nonexistent id is rejected (throw) before the insert.
27
- */
1
+ /** Incident object: a postmortem capsule with lifecycle open -> resolved -> closed (no supersede chain) and optional linked receipts.
2
+ * The `incidents` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall.
3
+ * linked_memory_ids must all exist in the SAME tenant or save throws before the insert. */
28
4
  import type { KeysetPosition } from '../util/keyset.js';
29
5
  import type { ObjectDescriptor } from './descriptor.js';
30
6
  import type { Incident, IncidentStatus } from '../store/object-types.js';
@@ -48,7 +24,8 @@ export interface ListIncidentsOpts {
48
24
  after?: KeysetPosition;
49
25
  }
50
26
  export declare const INCIDENT: ObjectDescriptor<'incident'>;
51
- /** Opens an incident with its mirror memory (content "<text>\n\nContext: <context>" when context is given) in one write; a linked memory outside the tenant refuses the whole write. */
27
+ /** Opens an incident with its mirror memory (content "<text>\n\nContext: <context>" when
28
+ * context is given) in one write; a linked memory outside the tenant refuses the whole write. */
52
29
  export declare function saveIncident(hippoRoot: string, tenantId: string, opts: SaveIncidentOpts, actor?: string): Incident;
53
30
  /** `saveIncident` over a served store's group. */
54
31
  export declare function openIncident(objects: Objects, hippoRoot: string, tenantId: string, opts: SaveIncidentOpts, actor: string): Promise<Incident>;
@@ -56,21 +33,13 @@ export declare function openIncident(objects: Objects, hippoRoot: string, tenant
56
33
  export declare function resolveIncident(hippoRoot: string, tenantId: string, id: number, resolutionText: string, actor?: string): Incident;
57
34
  /** `resolveIncident` over a served store's group. */
58
35
  export declare function resolveOpenIncident(objects: Objects, tenantId: string, id: number, resolutionText: string, actor: string): Promise<Incident>;
59
- /**
60
- * Close (retire) an incident from open or resolved (open|resolved -> closed).
61
- * Updates closed_at only; the memory mirror is not mutated.
62
- */
36
+ /** Close (retire) an incident from open or resolved; sets closed_at only, the memory mirror is not mutated. */
63
37
  export declare function closeIncident(hippoRoot: string, tenantId: string, id: number, actor?: string): Incident;
64
38
  export declare function loadIncidentById(hippoRoot: string, tenantId: string, id: number): Incident | null;
65
39
  export declare function loadIncidents(hippoRoot: string, tenantId: string, opts?: ListIncidentsOpts): Incident[];
66
40
  export declare function loadOpenIncidents(hippoRoot: string, tenantId: string, opts?: {
67
41
  limit?: number;
68
42
  }): Incident[];
69
- /**
70
- * Resolve a memory id to the table id of the OPEN incident backed by that
71
- * memory, or null when the memory has no open incident row. Extracted so a
72
- * memory-id-based lookup is unit-testable at the store layer (mirror of
73
- * resolveActiveDecisionIdByMemory).
74
- */
43
+ /** Resolve a memory id to the table id of the OPEN incident backed by it, or null; exported for store-layer tests. */
75
44
  export declare function resolveActiveIncidentIdByMemory(hippoRoot: string, tenantId: string, memoryId: string): number | null;
76
45
  //# sourceMappingURL=incidents.d.ts.map
@@ -1,38 +1,11 @@
1
- /**
2
- * Incident first-class object.
3
- *
4
- * An incident is a postmortem capsule: a recorded operational event with a
5
- * lifecycle and optional linked receipts (the memories that are its evidence).
6
- * The `incidents` table is the source of truth: an incident stays `open`
7
- * regardless of memory decay. A memory row still mirrors the incident for
8
- * recall surfaces but is NOT canonical — memory_id is NULLABLE with ON DELETE
9
- * SET NULL so forget/consolidate/archive gracefully orphans the incident row.
10
- *
11
- * Lifecycle: open -> resolved (a resolution was recorded; the incident stays on
12
- * record with resolution_text + resolved_at) or open|resolved -> closed
13
- * (retired with closed_at). This is NOT decision's supersede: there is no
14
- * superseded_by self-FK, no supersede CAS, and no supersede trigger.
15
- *
16
- * Tenant scoping: every helper requires tenantId. BEFORE INSERT/UPDATE triggers
17
- * enforce incidents.tenant_id == the referenced memory's tenant_id. Mirrors the
18
- * v30 decisions pattern (src/objects/decisions.ts).
19
- *
20
- * Dual-write atomicity: `saveIncident` writes the memory + incidents row in the
21
- * `objects` store group's one transaction, so a failure in any step rolls all of
22
- * them back.
23
- *
24
- * linked_memory_ids ("linked receipts"): a JSON-encoded array of memory ids on
25
- * the row, default `[]`. On save, every id must exist in the SAME tenant; a
26
- * cross-tenant or nonexistent id is rejected (throw) before the insert.
27
- */
1
+ /** Incident object: a postmortem capsule with lifecycle open -> resolved -> closed (no supersede chain) and optional linked receipts.
2
+ * The `incidents` table is the source of truth; the memory mirror (memory_id NULLABLE, ON DELETE SET NULL) is for recall.
3
+ * linked_memory_ids must all exist in the SAME tenant or save throws before the insert. */
28
4
  import { BadRequestError, ConflictError, NotFoundError } from '../core/api-errors.js';
29
5
  import { assertTenantId } from '../store/tenant.js';
30
6
  import { closeObjectAt, listObjectsAt, objectByIdAt, objectMirror } from './lifecycle.js';
31
7
  import { isObjectRefusal } from '../store/port.js';
32
8
  import { objectIdByMemory, sqliteObjects } from '../store/sqlite/objects-group.js';
33
- // ---------------------------------------------------------------------------
34
- // Domain types
35
- // ---------------------------------------------------------------------------
36
9
  export const VALID_INCIDENT_STATES = new Set([
37
10
  'open',
38
11
  'resolved',
@@ -69,7 +42,8 @@ function opened(tenantId, written) {
69
42
  throw new NotFoundError(`saveIncident: linked memory ${written.memoryId} not found for tenant ${tenantId}`);
70
43
  throw new Error('saveIncident: failed to reload saved incident row');
71
44
  }
72
- /** Opens an incident with its mirror memory (content "<text>\n\nContext: <context>" when context is given) in one write; a linked memory outside the tenant refuses the whole write. */
45
+ /** Opens an incident with its mirror memory (content "<text>\n\nContext: <context>" when
46
+ * context is given) in one write; a linked memory outside the tenant refuses the whole write. */
73
47
  export function saveIncident(hippoRoot, tenantId, opts, actor = 'cli') {
74
48
  return opened(tenantId, sqliteObjects(hippoRoot).openIncident(tenantId, incidentOpen(hippoRoot, tenantId, opts, actor)));
75
49
  }
@@ -101,10 +75,7 @@ export function resolveIncident(hippoRoot, tenantId, id, resolutionText, actor =
101
75
  export async function resolveOpenIncident(objects, tenantId, id, resolutionText, actor) {
102
76
  return resolved(tenantId, id, await objects.resolveIncident(tenantId, id, resolving(tenantId, resolutionText, actor)));
103
77
  }
104
- /**
105
- * Close (retire) an incident from open or resolved (open|resolved -> closed).
106
- * Updates closed_at only; the memory mirror is not mutated.
107
- */
78
+ /** Close (retire) an incident from open or resolved; sets closed_at only, the memory mirror is not mutated. */
108
79
  export function closeIncident(hippoRoot, tenantId, id, actor = 'cli') {
109
80
  return closeObjectAt(hippoRoot, INCIDENT, tenantId, id, actor);
110
81
  }
@@ -117,12 +88,7 @@ export function loadIncidents(hippoRoot, tenantId, opts = {}) {
117
88
  export function loadOpenIncidents(hippoRoot, tenantId, opts = {}) {
118
89
  return loadIncidents(hippoRoot, tenantId, { status: 'open', limit: opts.limit });
119
90
  }
120
- /**
121
- * Resolve a memory id to the table id of the OPEN incident backed by that
122
- * memory, or null when the memory has no open incident row. Extracted so a
123
- * memory-id-based lookup is unit-testable at the store layer (mirror of
124
- * resolveActiveDecisionIdByMemory).
125
- */
91
+ /** Resolve a memory id to the table id of the OPEN incident backed by it, or null; exported for store-layer tests. */
126
92
  export function resolveActiveIncidentIdByMemory(hippoRoot, tenantId, memoryId) {
127
93
  assertTenantId('resolveActiveIncidentIdByMemory', tenantId);
128
94
  return objectIdByMemory(hippoRoot, tenantId, 'incident', 'open', memoryId);
@@ -1,41 +1,6 @@
1
- /**
2
- * Policy first-class object.
3
- *
4
- * The "bi-temporal-first" object type: a named rule/statement that is in force
5
- * over an EFFECTIVE-TIME range and evolves via supersession. Two time axes:
6
- *
7
- * - Valid time (effective time): when the policy is in force in the real world,
8
- * as first-class columns `valid_from` (required; defaults to creation time)
9
- * and `valid_to` (nullable = open-ended). This is the queryable axis: see
10
- * `loadPoliciesAsOf` (the active policies in force at a given valid-time).
11
- * - Transaction time (system time): when the row was recorded / retired, via
12
- * `created_at` + the supersede chain's `superseded_at`. Present, but
13
- * time-travel ("what did we BELIEVE was in force at past system time T") is
14
- * deferred to a future version.
15
- *
16
- * The delta lifecycle reuses the process/decision supersede machinery verbatim
17
- * (superseded_by self-FK + CAS + INSERT-preflight + server-derived version +
18
- * change_summary + supersede tenant-match trigger). It DROPS process's `steps`
19
- * (a policy has `policy_text`) and ADDS `valid_from`/`valid_to`.
20
- *
21
- * The `policies` table is the source of truth (survives memory decay); the
22
- * memory mirror is for recall only. memory_id is NULLABLE with ON DELETE SET
23
- * NULL so forget/consolidate/archive gracefully orphans the policy row.
24
- *
25
- * Lifecycle: active -> superseded (a newer version replaces it) or active ->
26
- * closed (retired with no successor). Superseding leaves the predecessor's
27
- * valid-time range intact (it WAS effective then); only the status flips.
28
- *
29
- * Date handling: every date input (savePolicy's valid_from/valid_to,
30
- * loadPoliciesAsOf's asOfDate) is normalized to canonical ISO-8601 datetime
31
- * (`toISOString`) at the store boundary BEFORE any persist or compare, so the
32
- * fixed-width values sort lexically and the half-open [valid_from, valid_to)
33
- * comparison is correct (a date-only asOf vs a datetime valid_from would
34
- * otherwise make a same-day policy invisible).
35
- *
36
- * Dual-write atomicity: `savePolicy` writes the memory + policies row (and, on
37
- * supersede, the predecessor's UPDATE) in the `objects` store group's one transaction.
38
- */
1
+ /** Policy object: a rule in force over a valid-time range [valid_from, valid_to), evolving via supersession; `loadPoliciesAsOf` queries it.
2
+ * Transaction-time travel (what we believed at past system time T) is deferred. Superseding keeps the predecessor's valid-time range.
3
+ * All dates are normalised to ISO-8601 (`toISOString`) at the store boundary so the lexical half-open comparison is sound. */
39
4
  import type { KeysetPosition } from '../util/keyset.js';
40
5
  import type { SavableDescriptor } from './descriptor.js';
41
6
  import type { Policy, PolicyStatus } from '../store/object-types.js';
@@ -62,70 +27,27 @@ export interface ListPoliciesOpts {
62
27
  /** Resume after this row: the position the previous page ended on. */
63
28
  after?: KeysetPosition;
64
29
  }
65
- /**
66
- * Parse + canonicalize a date input to ISO-8601 datetime (`toISOString`). Throws
67
- * on an unparseable value. Whatever `new Date()` accepts is re-emitted in the
68
- * single fixed-width canonical form, so date-only and datetime inputs collapse to
69
- * comparable values and lexical ordering is sound. (Overflow inputs like
70
- * '2026-02-30' roll forward per JS Date semantics rather than throwing; the
71
- * stored value is still canonical.)
72
- */
30
+ /** Parse a date input to a fixed-width ISO-8601 datetime so lexical ordering is sound; throws on an unparseable value.
31
+ * Overflow inputs like '2026-02-30' roll forward per JS Date semantics. */
73
32
  export declare function normalizePolicyDate(input: string, label?: string): string;
74
- /**
75
- * Normalize valid_from (defaulting to `nowIso` when undefined) + valid_to (null
76
- * when undefined), then enforce valid_to > valid_from. Returns the canonical pair.
77
- */
33
+ /** Normalise valid_from (default `nowIso`) and valid_to (default null), then enforce valid_to > valid_from. */
78
34
  export declare function validatePolicyDates(validFromRaw: string | undefined, validToRaw: string | undefined, nowIso: string): {
79
35
  validFrom: string;
80
36
  validTo: string | null;
81
37
  };
82
38
  export declare const POLICY: SavableDescriptor<'policy', SavePolicyOpts>;
83
- /**
84
- * Create a policy (or a new version that supersedes an existing one). Writes the
85
- * memory mirror + the policies row in the `objects` store group's one transaction.
86
- * valid_from defaults to now; valid_to must be > valid_from (validatePolicyDates).
87
- * When supersedesPolicyId is given, the referenced ACTIVE row is preflighted
88
- * (status + version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same
89
- * transaction; the new version = predecessor.version + 1 (server-derived).
90
- */
39
+ /** Create a policy, or a new version superseding an existing one, in the `objects` store group's one transaction.
40
+ * valid_from defaults to now; valid_to must be > valid_from (validatePolicyDates). */
91
41
  export declare function savePolicy(hippoRoot: string, tenantId: string, opts: SavePolicyOpts, actor?: string): Policy;
92
- /**
93
- * Close (retire) an active policy with no successor. CAS guard WHERE
94
- * status='active'; 0 changes distinguishes not-found from not-active. A
95
- * superseded row is terminal and cannot be closed.
96
- */
42
+ /** Close (retire) an active policy with no successor; CAS on status='active', a superseded row is terminal. */
97
43
  export declare function closePolicy(hippoRoot: string, tenantId: string, id: number, actor?: string): Policy;
98
44
  export declare function loadPolicyById(hippoRoot: string, tenantId: string, id: number): Policy | null;
99
45
  export declare function loadPolicies(hippoRoot: string, tenantId: string, opts?: ListPoliciesOpts): Policy[];
100
46
  export declare function loadActivePolicies(hippoRoot: string, tenantId: string, opts?: {
101
47
  limit?: number;
102
48
  }): Policy[];
103
- /**
104
- * The bi-temporal as-of query: the policies in force at `asOfDate` (a valid-time)
105
- * per current knowledge. Half-open interval [valid_from, valid_to): a row covers
106
- * T when valid_from <= asOf AND (valid_to IS NULL OR asOf < valid_to). asOfDate is
107
- * normalized to canonical datetime first so the lexical comparison is sound.
108
- *
109
- * A row is returned when it covers T AND it is the live answer for T:
110
- * - `active` rows that cover T, OR
111
- * - `superseded` rows that cover T BUT whose successor was not yet effective at T
112
- * (successor.valid_from > asOf) - i.e. an earlier version that was genuinely in
113
- * force then. This is the core valid-time correctness: a Jan-Jun policy
114
- * superseded in May is still the answer for `asof March`. Filtering on
115
- * status='active' alone would conflate transaction-time with valid-time; the
116
- * successor-aware filter mirrors the existing recall-history.ts asOf pattern.
117
- *
118
- * `closed` rows are EXCLUDED: closing is a deliberate transaction-time retirement,
119
- * and resurrecting closed policies for a historical valid-time is full
120
- * transaction-time-travel (deferred). Returns an ARRAY (overlapping same-name
121
- * ranges are allowed in v1). Optionally filtered to one policy_name.
122
- *
123
- * Date-only `asOfDate` (YYYY-MM-DD, no time component) resolves to the END
124
- * of that UTC day (23:59:59.999Z), so "as of [day D]" includes a policy that
125
- * became effective at any instant during D - this is the read-side fix for the
126
- * common create-then-asof-today workflow, keeping the stored valid_from honest.
127
- * A full datetime asOf is used as the precise instant.
128
- */
49
+ /** The policies in force at `asOfDate` (valid-time, half-open [valid_from, valid_to)); superseded rows still answer while the successor is not yet effective.
50
+ * `closed` rows are excluded; a date-only asOfDate means the END of that UTC day (23:59:59.999Z), so a policy created today shows up in "as of today". */
129
51
  export declare function loadPoliciesAsOf(hippoRoot: string, tenantId: string, asOfDate: string, opts?: {
130
52
  name?: string;
131
53
  limit?: number;