hippo-memory 1.68.0 → 1.70.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 (864) hide show
  1. package/README.md +6 -3
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +1 -3
  5. package/dist/agent-memories/claude-code.js +11 -7
  6. package/dist/agent-memories/copilot.d.ts +3 -1
  7. package/dist/agent-memories/copilot.js +5 -4
  8. package/dist/agent-memories/files.js +3 -2
  9. package/dist/agent-memories/gemini.js +6 -5
  10. package/dist/agent-memories/keys.js +3 -2
  11. package/dist/agent-memories/legacy.d.ts +2 -2
  12. package/dist/agent-memories/legacy.js +2 -2
  13. package/dist/agent-memories/report.d.ts +1 -1
  14. package/dist/agent-memories/report.js +1 -1
  15. package/dist/agent-memories/source.d.ts +1 -1
  16. package/dist/agent-memories/source.js +6 -5
  17. package/dist/agent-memories/sync.d.ts +1 -1
  18. package/dist/agent-memories/sync.js +24 -33
  19. package/dist/agent-memories/types.d.ts +1 -1
  20. package/dist/api/assemble.d.ts +2 -2
  21. package/dist/api/assemble.js +42 -32
  22. package/dist/api/audit.d.ts +4 -7
  23. package/dist/api/audit.js +6 -20
  24. package/dist/api/auth.d.ts +5 -18
  25. package/dist/api/auth.js +44 -194
  26. package/dist/api/auto-sleep.d.ts +13 -0
  27. package/dist/api/auto-sleep.js +32 -0
  28. package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
  29. package/dist/{availability.js → api/availability.js} +12 -29
  30. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  31. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  32. package/dist/{context-render.js → api/context-render.js} +7 -6
  33. package/dist/api/context-select.d.ts +14 -4
  34. package/dist/api/context-select.js +50 -60
  35. package/dist/api/context-types.d.ts +5 -5
  36. package/dist/api/context.d.ts +2 -4
  37. package/dist/api/context.js +113 -85
  38. package/dist/api/dormant.d.ts +3 -3
  39. package/dist/api/dormant.js +38 -107
  40. package/dist/api/drill-down.d.ts +2 -2
  41. package/dist/api/drill-down.js +37 -65
  42. package/dist/api/forget.d.ts +4 -13
  43. package/dist/api/forget.js +13 -35
  44. package/dist/api/goals.d.ts +1 -1
  45. package/dist/api/goals.js +2 -2
  46. package/dist/api/index.d.ts +26 -0
  47. package/dist/api/index.js +29 -0
  48. package/dist/api/instruction-detect.js +74 -0
  49. package/dist/api/learn.js +63 -55
  50. package/dist/api/ledger-db.d.ts +20 -0
  51. package/dist/api/ledger-db.js +79 -0
  52. package/dist/api/on-store.d.ts +16 -0
  53. package/dist/api/on-store.js +36 -0
  54. package/dist/api/outcome.d.ts +9 -46
  55. package/dist/api/outcome.js +15 -57
  56. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  57. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  58. package/dist/api/promote.d.ts +7 -18
  59. package/dist/api/promote.js +30 -152
  60. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
  61. package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
  62. package/dist/api/quarantine.d.ts +5 -5
  63. package/dist/api/quarantine.js +30 -106
  64. package/dist/api/recall-core.d.ts +4 -0
  65. package/dist/api/recall-core.js +112 -0
  66. package/dist/{recall-history.js → api/recall-history.js} +30 -25
  67. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
  68. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
  69. package/dist/api/recall-record.d.ts +10 -13
  70. package/dist/api/recall-record.js +10 -30
  71. package/dist/api/recall-request.d.ts +2 -2
  72. package/dist/api/recall-request.js +3 -3
  73. package/dist/api/recall-types.d.ts +41 -16
  74. package/dist/api/recall.d.ts +1 -1
  75. package/dist/api/recall.js +39 -37
  76. package/dist/api/remember.d.ts +12 -13
  77. package/dist/api/remember.js +38 -27
  78. package/dist/api/session-owners.d.ts +4 -0
  79. package/dist/api/session-owners.js +17 -0
  80. package/dist/api/sleep-run.d.ts +7 -7
  81. package/dist/api/sleep-run.js +63 -75
  82. package/dist/api/sleep.d.ts +1 -1
  83. package/dist/api/tokens.d.ts +2 -2
  84. package/dist/api/tokens.js +9 -21
  85. package/dist/api/types.d.ts +2 -2
  86. package/dist/api/types.js +1 -1
  87. package/dist/capture/caller-session.d.ts +2 -2
  88. package/dist/capture/caller-session.js +8 -8
  89. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  90. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  91. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  92. package/dist/capture/command.d.ts +1 -1
  93. package/dist/capture/command.js +54 -41
  94. package/dist/capture/compact-resume-caller.d.ts +1 -1
  95. package/dist/capture/compact-resume-caller.js +7 -7
  96. package/dist/capture/compact.d.ts +4 -1
  97. package/dist/capture/compact.js +59 -22
  98. package/dist/capture/compaction-items-caller.d.ts +1 -1
  99. package/dist/capture/compaction-items-caller.js +7 -5
  100. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  101. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  102. package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
  103. package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
  104. package/dist/capture/copilot-transcript.d.ts +3 -0
  105. package/dist/capture/copilot-transcript.js +9 -2
  106. package/dist/capture/extract.js +2 -2
  107. package/dist/capture/failure-caller.d.ts +2 -2
  108. package/dist/capture/failure-caller.js +6 -6
  109. package/dist/capture/failure-reading.d.ts +2 -5
  110. package/dist/capture/failure-reading.js +11 -12
  111. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  112. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  113. package/dist/capture/pre-compact-caller.d.ts +1 -1
  114. package/dist/capture/pre-compact-caller.js +2 -2
  115. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
  116. package/dist/{session-digest.js → capture/session-digest.js} +17 -23
  117. package/dist/capture/session-end-caller.d.ts +2 -2
  118. package/dist/capture/session-end-caller.js +1 -1
  119. package/dist/capture/session-texts.d.ts +1 -1
  120. package/dist/capture/session-texts.js +5 -5
  121. package/dist/capture/session-worker.d.ts +13 -0
  122. package/dist/capture/session-worker.js +196 -0
  123. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  124. package/dist/capture/transcript.js +68 -74
  125. package/dist/capture/working-state.d.ts +0 -3
  126. package/dist/capture/working-state.js +7 -7
  127. package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
  128. package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
  129. package/dist/cli/audit.d.ts +2 -2
  130. package/dist/cli/audit.js +77 -72
  131. package/dist/cli/auth.d.ts +2 -1
  132. package/dist/cli/auth.js +18 -20
  133. package/dist/cli/briefs.d.ts +4 -3
  134. package/dist/cli/briefs.js +59 -181
  135. package/dist/cli/card.d.ts +2 -1
  136. package/dist/cli/card.js +25 -23
  137. package/dist/{client.d.ts → cli/client.d.ts} +1 -1
  138. package/dist/{client.js → cli/client.js} +1 -1
  139. package/dist/cli/compact-resume-payload.d.ts +8 -0
  140. package/dist/cli/compact-resume-payload.js +39 -0
  141. package/dist/cli/context.d.ts +2 -13
  142. package/dist/cli/context.js +41 -71
  143. package/dist/cli/continuity.d.ts +6 -5
  144. package/dist/cli/continuity.js +109 -99
  145. package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
  146. package/dist/cli/curate.d.ts +9 -9
  147. package/dist/cli/curate.js +177 -149
  148. package/dist/cli/dag.d.ts +4 -4
  149. package/dist/cli/dag.js +46 -34
  150. package/dist/cli/decisions.d.ts +4 -3
  151. package/dist/cli/decisions.js +108 -218
  152. package/dist/cli/eval.d.ts +1 -3
  153. package/dist/cli/eval.js +43 -31
  154. package/dist/cli/explain.d.ts +1 -1
  155. package/dist/cli/explain.js +35 -19
  156. package/dist/cli/flag-values.d.ts +25 -0
  157. package/dist/cli/flag-values.js +103 -0
  158. package/dist/cli/flags.d.ts +303 -0
  159. package/dist/cli/flags.js +169 -0
  160. package/dist/cli/goals.d.ts +2 -1
  161. package/dist/cli/goals.js +39 -34
  162. package/dist/cli/hook-runtime.d.ts +49 -0
  163. package/dist/cli/hook-runtime.js +155 -0
  164. package/dist/cli/init.d.ts +2 -1
  165. package/dist/cli/init.js +151 -118
  166. package/dist/cli/install-steps.d.ts +7 -0
  167. package/dist/cli/install-steps.js +110 -0
  168. package/dist/cli/last-sleep.d.ts +2 -1
  169. package/dist/cli/last-sleep.js +9 -7
  170. package/dist/cli/maintenance.d.ts +5 -4
  171. package/dist/cli/maintenance.js +31 -27
  172. package/dist/cli/object-verbs.d.ts +40 -0
  173. package/dist/cli/object-verbs.js +65 -0
  174. package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
  175. package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
  176. package/dist/cli/playbooks.d.ts +4 -3
  177. package/dist/cli/playbooks.js +77 -280
  178. package/dist/cli/print.d.ts +18 -0
  179. package/dist/cli/print.js +85 -0
  180. package/dist/cli/projects.d.ts +2 -3
  181. package/dist/cli/projects.js +56 -49
  182. package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
  183. package/dist/cli/quality-repair-once.js +4 -4
  184. package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
  185. package/dist/cli/recall.d.ts +2 -4
  186. package/dist/cli/recall.js +101 -150
  187. package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
  188. package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
  189. package/dist/cli/remember.d.ts +1 -3
  190. package/dist/cli/remember.js +124 -103
  191. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
  192. package/dist/{scheduler.js → cli/scheduler.js} +13 -7
  193. package/dist/cli/serve.d.ts +1 -1
  194. package/dist/cli/serve.js +34 -4
  195. package/dist/cli/session-hooks.d.ts +4 -4
  196. package/dist/cli/session-hooks.js +265 -191
  197. package/dist/cli/setup.d.ts +2 -1
  198. package/dist/cli/setup.js +111 -45
  199. package/dist/cli/shared.d.ts +5 -95
  200. package/dist/cli/shared.js +18 -369
  201. package/dist/cli/slack.d.ts +2 -1
  202. package/dist/cli/slack.js +31 -55
  203. package/dist/cli/sleep-render.d.ts +4 -0
  204. package/dist/cli/sleep-render.js +61 -0
  205. package/dist/cli/sleep.d.ts +2 -8
  206. package/dist/cli/sleep.js +20 -76
  207. package/dist/cli/status.d.ts +3 -3
  208. package/dist/cli/status.js +39 -41
  209. package/dist/{stdin.js → cli/stdin.js} +6 -6
  210. package/dist/cli/transfer.d.ts +4 -4
  211. package/dist/cli/transfer.js +68 -42
  212. package/dist/cli/usage.js +8 -3
  213. package/dist/cli.d.ts +289 -5
  214. package/dist/cli.js +184 -117
  215. package/dist/connectors/dlq.d.ts +44 -0
  216. package/dist/connectors/dlq.js +30 -0
  217. package/dist/connectors/github/backfill.d.ts +1 -1
  218. package/dist/connectors/github/backfill.js +29 -66
  219. package/dist/connectors/github/cli-impl.js +59 -74
  220. package/dist/connectors/github/deletion.d.ts +5 -6
  221. package/dist/connectors/github/deletion.js +18 -52
  222. package/dist/connectors/github/dlq.d.ts +7 -61
  223. package/dist/connectors/github/dlq.js +19 -119
  224. package/dist/connectors/github/ingest.d.ts +2 -31
  225. package/dist/connectors/github/ingest.js +20 -82
  226. package/dist/connectors/github/octokit-client.d.ts +1 -1
  227. package/dist/connectors/github/octokit-client.js +2 -1
  228. package/dist/connectors/github/tenant-routing.d.ts +2 -2
  229. package/dist/connectors/github/tenant-routing.js +10 -36
  230. package/dist/connectors/github/transform.d.ts +1 -1
  231. package/dist/connectors/github/types.d.ts +1 -1
  232. package/dist/connectors/github/types.js +15 -18
  233. package/dist/connectors/github/webhook.d.ts +3 -2
  234. package/dist/connectors/github/webhook.js +84 -87
  235. package/dist/connectors/slack/backfill.d.ts +1 -1
  236. package/dist/connectors/slack/backfill.js +5 -29
  237. package/dist/connectors/slack/deletion.d.ts +4 -7
  238. package/dist/connectors/slack/deletion.js +20 -48
  239. package/dist/connectors/slack/dlq.d.ts +7 -49
  240. package/dist/connectors/slack/dlq.js +25 -118
  241. package/dist/connectors/slack/ingest.d.ts +5 -18
  242. package/dist/connectors/slack/ingest.js +27 -90
  243. package/dist/connectors/slack/signature.js +2 -1
  244. package/dist/connectors/slack/tenant-routing.d.ts +4 -1
  245. package/dist/connectors/slack/tenant-routing.js +13 -14
  246. package/dist/connectors/slack/transform.d.ts +1 -1
  247. package/dist/connectors/slack/types.d.ts +1 -1
  248. package/dist/connectors/slack/types.js +3 -12
  249. package/dist/connectors/slack/web-client.js +2 -2
  250. package/dist/connectors/slack/webhook.d.ts +3 -2
  251. package/dist/connectors/slack/webhook.js +75 -82
  252. package/dist/connectors/slack/workspaces.d.ts +4 -17
  253. package/dist/connectors/slack/workspaces.js +4 -34
  254. package/dist/consolidate/conflicts.d.ts +1 -1
  255. package/dist/consolidate/conflicts.js +4 -4
  256. package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
  257. package/dist/{dag.js → consolidate/dag.js} +60 -81
  258. package/dist/consolidate/decay.d.ts +2 -2
  259. package/dist/consolidate/decay.js +28 -22
  260. package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
  261. package/dist/consolidate/flush-units.d.ts +2 -2
  262. package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
  263. package/dist/consolidate/half-life-migration.js +106 -0
  264. package/dist/consolidate/llm-passes.js +8 -8
  265. package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
  266. package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
  267. package/dist/consolidate/merge.js +57 -54
  268. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  269. package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
  270. package/dist/consolidate/physics-pass.js +46 -46
  271. package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
  272. package/dist/{replay.js → consolidate/replay.js} +2 -2
  273. package/dist/consolidate/run.d.ts +7 -13
  274. package/dist/consolidate/run.js +6 -37
  275. package/dist/consolidate/sleep.d.ts +1 -1
  276. package/dist/consolidate/sleep.js +64 -134
  277. package/dist/{trace.js → consolidate/trace.js} +4 -6
  278. package/dist/consolidate/traces.js +34 -29
  279. package/dist/{ablation.js → core/ablation.js} +1 -1
  280. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  281. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  282. package/dist/{ambient.js → core/ambient.js} +12 -10
  283. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
  284. package/dist/core/capture-contract.js +149 -0
  285. package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
  286. package/dist/{compare.js → core/compare.js} +10 -3
  287. package/dist/{config.d.ts → core/config.d.ts} +6 -6
  288. package/dist/{config.js → core/config.js} +99 -72
  289. package/dist/core/handoff.js +87 -0
  290. package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
  291. package/dist/{memory.d.ts → core/memory.d.ts} +19 -5
  292. package/dist/{memory.js → core/memory.js} +117 -82
  293. package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
  294. package/dist/{physics.js → core/physics.js} +2 -1
  295. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
  296. package/dist/{project-identity.js → core/project-identity.js} +5 -17
  297. package/dist/{project-remote.js → core/project-remote.js} +4 -4
  298. package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +5 -0
  299. package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -1
  300. package/dist/{salience.js → core/salience.js} +35 -20
  301. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  302. package/dist/{search/types.js → core/search-types.js} +1 -1
  303. package/dist/core/session-digest-row.d.ts +5 -0
  304. package/dist/core/session-digest-row.js +6 -0
  305. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  306. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
  307. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  308. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  309. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
  310. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
  311. package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
  312. package/dist/db/backup.js +1 -1
  313. package/dist/db/busy.d.ts +18 -1
  314. package/dist/db/busy.js +74 -9
  315. package/dist/db/connect.d.ts +10 -2
  316. package/dist/db/connect.js +43 -10
  317. package/dist/db/index.d.ts +9 -0
  318. package/dist/db/index.js +8 -0
  319. package/dist/db/meta.d.ts +4 -0
  320. package/dist/db/meta.js +11 -1
  321. package/dist/db/migrate.d.ts +8 -1
  322. package/dist/db/migrate.js +25 -30
  323. package/dist/db/migrations/v08.js +1 -1
  324. package/dist/db/migrations/v14.js +39 -35
  325. package/dist/db/migrations/v16.js +29 -26
  326. package/dist/db/migrations/v18.js +6 -5
  327. package/dist/db/migrations/v20.js +4 -2
  328. package/dist/db/migrations/v22.js +39 -36
  329. package/dist/db/migrations/v24.js +27 -22
  330. package/dist/db/migrations/v29.js +37 -32
  331. package/dist/db/migrations/v31.js +36 -31
  332. package/dist/db/migrations/v35.js +1 -1
  333. package/dist/db/migrations/v39.js +1 -1
  334. package/dist/db/migrations/v40.js +15 -14
  335. package/dist/db/migrations/v43.js +7 -6
  336. package/dist/db/migrations/v44.js +1 -1
  337. package/dist/db/migrations/v45.js +1 -1
  338. package/dist/db/migrations/v46.js +1 -1
  339. package/dist/db/migrations/v47.js +1 -1
  340. package/dist/db/migrations/v48.js +1 -1
  341. package/dist/db/migrations/v49.js +1 -1
  342. package/dist/db/migrations/v50.js +8 -7
  343. package/dist/db/migrations/v52.js +1 -1
  344. package/dist/db/open.d.ts +9 -1
  345. package/dist/db/open.js +21 -4
  346. package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
  347. package/dist/{physics-state.js → db/physics-state.js} +9 -16
  348. package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
  349. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
  350. package/dist/db/request-stores.d.ts +15 -2
  351. package/dist/db/request-stores.js +37 -15
  352. package/dist/db/tables.d.ts +2 -0
  353. package/dist/db/tables.js +6 -0
  354. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
  355. package/dist/{vector-store.js → db/vector-store.js} +76 -51
  356. package/dist/db/wal-checkpointer.d.ts +11 -0
  357. package/dist/db/wal-checkpointer.js +92 -0
  358. package/dist/doctor.js +105 -136
  359. package/dist/entry/json-hooks.d.ts +1 -1
  360. package/dist/entry/json-hooks.js +1 -1
  361. package/dist/entry/project-identity.d.ts +1 -1
  362. package/dist/entry/project-identity.js +1 -1
  363. package/dist/entry/session-text.d.ts +3 -3
  364. package/dist/entry/session-text.js +3 -3
  365. package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
  366. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
  367. package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
  368. package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
  369. package/dist/{eval.js → eval/eval.js} +29 -22
  370. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
  371. package/dist/{judgment.js → eval/judgment.js} +4 -9
  372. package/dist/extensions/openclaw-plugin/index.js +1 -2
  373. package/dist/graph/delta.d.ts +3 -2
  374. package/dist/graph/delta.js +9 -23
  375. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
  376. package/dist/{graph-extract.js → graph/extract.js} +37 -52
  377. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
  378. package/dist/{graph-recall.js → graph/recall.js} +55 -36
  379. package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
  380. package/dist/{graph-stream.js → graph/stream.js} +9 -7
  381. package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
  382. package/dist/{graph-view.js → graph/view.js} +127 -167
  383. package/dist/graph/write.d.ts +4 -76
  384. package/dist/graph/write.js +13 -397
  385. package/dist/hooks/codex-session.js +1 -1
  386. package/dist/hooks/codex-wrapper.js +14 -15
  387. package/dist/hooks/copilot.d.ts +48 -13
  388. package/dist/hooks/copilot.js +124 -39
  389. package/dist/{cli → hooks}/hook-blocks.js +1 -1
  390. package/dist/hooks/json-hooks.d.ts +3 -1
  391. package/dist/hooks/json-hooks.js +40 -122
  392. package/dist/hooks/opencode.js +35 -27
  393. package/dist/hooks/shared.d.ts +7 -5
  394. package/dist/hooks/shared.js +19 -8
  395. package/dist/importers/core.d.ts +2 -6
  396. package/dist/importers/core.js +41 -39
  397. package/dist/importers/markdown-parse.d.ts +1 -10
  398. package/dist/importers/markdown-parse.js +2 -19
  399. package/dist/importers/markdown.js +2 -1
  400. package/dist/importers/sources.js +50 -46
  401. package/dist/importers/vault.js +71 -92
  402. package/dist/index.d.ts +22 -22
  403. package/dist/index.js +21 -21
  404. package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
  405. package/dist/{autolearn.js → learn/autolearn.js} +13 -11
  406. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  407. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  408. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  409. package/dist/learn/extract.js +125 -0
  410. package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
  411. package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
  412. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
  413. package/dist/{invalidation.js → learn/invalidation.js} +83 -99
  414. package/dist/mcp/admin-tools.d.ts +1 -1
  415. package/dist/mcp/admin-tools.js +37 -60
  416. package/dist/mcp/format.d.ts +5 -5
  417. package/dist/mcp/format.js +7 -6
  418. package/dist/mcp/framing.d.ts +6 -0
  419. package/dist/mcp/framing.js +11 -3
  420. package/dist/mcp/memory-tools.d.ts +2 -2
  421. package/dist/mcp/memory-tools.js +12 -31
  422. package/dist/mcp/protocol.d.ts +6 -10
  423. package/dist/mcp/protocol.js +8 -14
  424. package/dist/mcp/recall-tools.d.ts +2 -2
  425. package/dist/mcp/recall-tools.js +68 -50
  426. package/dist/mcp/request.js +65 -63
  427. package/dist/mcp/server.js +1 -1
  428. package/dist/mcp/session-state.d.ts +1 -2
  429. package/dist/mcp/session-state.js +2 -2
  430. package/dist/mcp/shared-gate.js +1 -1
  431. package/dist/mcp/stdio.js +69 -31
  432. package/dist/mcp/tool-args.js +2 -1
  433. package/dist/mcp/tools.js +2 -2
  434. package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
  435. package/dist/objects/customer-notes.js +112 -0
  436. package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
  437. package/dist/objects/decisions.js +101 -0
  438. package/dist/objects/descriptor.d.ts +52 -0
  439. package/dist/objects/descriptor.js +4 -0
  440. package/dist/objects/fields.d.ts +15 -0
  441. package/dist/objects/fields.js +21 -0
  442. package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
  443. package/dist/objects/incidents.js +130 -0
  444. package/dist/objects/lifecycle.d.ts +27 -0
  445. package/dist/objects/lifecycle.js +96 -0
  446. package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
  447. package/dist/objects/policies.js +189 -0
  448. package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
  449. package/dist/objects/processes.js +146 -0
  450. package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
  451. package/dist/objects/project-briefs.js +255 -0
  452. package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
  453. package/dist/objects/skills.js +156 -0
  454. package/dist/postinstall.js +4 -2
  455. package/dist/predictions/planning-fallacy.d.ts +4 -76
  456. package/dist/predictions/planning-fallacy.js +4 -129
  457. package/dist/rerankers/clef.d.ts +2 -6
  458. package/dist/rerankers/clef.js +27 -47
  459. package/dist/rerankers/cross-encoder.d.ts +0 -7
  460. package/dist/rerankers/cross-encoder.js +15 -23
  461. package/dist/rerankers/index.js +8 -7
  462. package/dist/rerankers/jev.d.ts +1 -4
  463. package/dist/rerankers/jev.js +30 -49
  464. package/dist/rerankers/llm.d.ts +2 -4
  465. package/dist/rerankers/llm.js +33 -50
  466. package/dist/rerankers/outage-warning.d.ts +7 -0
  467. package/dist/rerankers/outage-warning.js +31 -0
  468. package/dist/rerankers/remote.d.ts +3 -0
  469. package/dist/rerankers/remote.js +23 -0
  470. package/dist/rerankers/types.d.ts +1 -1
  471. package/dist/search/as-of.d.ts +1 -1
  472. package/dist/search/bm25-search.d.ts +2 -2
  473. package/dist/search/bm25-search.js +7 -7
  474. package/dist/search/bm25.d.ts +1 -1
  475. package/dist/search/bm25.js +1 -1
  476. package/dist/search/boosts.d.ts +5 -1
  477. package/dist/search/boosts.js +34 -13
  478. package/dist/search/breakdown.d.ts +2 -2
  479. package/dist/search/breakdown.js +2 -1
  480. package/dist/search/explain.d.ts +1 -1
  481. package/dist/search/explain.js +3 -2
  482. package/dist/search/finalize.d.ts +2 -2
  483. package/dist/search/finalize.js +4 -3
  484. package/dist/search/fusion.d.ts +1 -1
  485. package/dist/search/fusion.js +3 -3
  486. package/dist/search/hybrid-score.d.ts +2 -2
  487. package/dist/search/hybrid-score.js +1 -1
  488. package/dist/search/hybrid.d.ts +4 -4
  489. package/dist/search/hybrid.js +11 -8
  490. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  491. package/dist/{multihop.js → search/multihop.js} +7 -5
  492. package/dist/{path-context.js → search/path-context.js} +3 -1
  493. package/dist/search/physics-search.d.ts +4 -4
  494. package/dist/search/physics-search.js +15 -15
  495. package/dist/search/rerank.d.ts +3 -3
  496. package/dist/search/rerank.js +4 -3
  497. package/dist/search/temporal.d.ts +1 -1
  498. package/dist/search/temporal.js +5 -2
  499. package/dist/search/vector.d.ts +3 -3
  500. package/dist/search/vector.js +17 -11
  501. package/dist/server/auth.d.ts +1 -1
  502. package/dist/server/auth.js +26 -18
  503. package/dist/server/boot.d.ts +24 -0
  504. package/dist/server/boot.js +465 -0
  505. package/dist/server/client-ip.d.ts +5 -1
  506. package/dist/server/client-ip.js +18 -6
  507. package/dist/server/cursor.d.ts +1 -1
  508. package/dist/server/cursor.js +2 -3
  509. package/dist/server/deadline.d.ts +13 -0
  510. package/dist/server/deadline.js +45 -0
  511. package/dist/server/key-check-bounds.d.ts +8 -0
  512. package/dist/server/key-check-bounds.js +46 -0
  513. package/dist/server/lifecycle.js +1 -1
  514. package/dist/server/mcp-http.d.ts +1 -4
  515. package/dist/server/mcp-http.js +34 -24
  516. package/dist/server/ready.d.ts +7 -0
  517. package/dist/server/ready.js +38 -0
  518. package/dist/server/request.d.ts +10 -4
  519. package/dist/server/request.js +63 -12
  520. package/dist/server/route-table.d.ts +15 -0
  521. package/dist/server/route-table.js +209 -0
  522. package/dist/server/routes/admin.js +13 -8
  523. package/dist/server/routes/customer-notes.d.ts +5 -5
  524. package/dist/server/routes/customer-notes.js +32 -97
  525. package/dist/server/routes/decisions.d.ts +5 -5
  526. package/dist/server/routes/decisions.js +42 -105
  527. package/dist/server/routes/incidents.d.ts +5 -5
  528. package/dist/server/routes/incidents.js +42 -95
  529. package/dist/server/routes/memories.js +21 -20
  530. package/dist/server/routes/object-routes.d.ts +40 -0
  531. package/dist/server/routes/object-routes.js +80 -0
  532. package/dist/server/routes/policies.d.ts +6 -6
  533. package/dist/server/routes/policies.js +40 -124
  534. package/dist/server/routes/predictions.js +29 -45
  535. package/dist/server/routes/processes.d.ts +5 -5
  536. package/dist/server/routes/processes.js +38 -118
  537. package/dist/server/routes/project-briefs.d.ts +6 -6
  538. package/dist/server/routes/project-briefs.js +38 -110
  539. package/dist/server/routes/recall.js +14 -12
  540. package/dist/server/routes/skills.d.ts +6 -6
  541. package/dist/server/routes/skills.js +37 -125
  542. package/dist/{server-detect.js → server/server-detect.js} +3 -2
  543. package/dist/server/sleep-child.d.ts +2 -0
  544. package/dist/server/sleep-child.js +19 -0
  545. package/dist/server/sleep-offload.d.ts +20 -0
  546. package/dist/server/sleep-offload.js +70 -0
  547. package/dist/server/tls.d.ts +6 -0
  548. package/dist/server/tls.js +24 -0
  549. package/dist/server/types.d.ts +27 -8
  550. package/dist/server/validation.d.ts +3 -4
  551. package/dist/server/validation.js +6 -11
  552. package/dist/server.d.ts +41 -50
  553. package/dist/server.js +26 -560
  554. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
  555. package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
  556. package/dist/{scope.js → sharing/scope.js} +1 -1
  557. package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
  558. package/dist/{shared.js → sharing/shared.js} +100 -77
  559. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  560. package/dist/{ambient-store.js → store/ambient.js} +10 -10
  561. package/dist/store/audit-event.d.ts +12 -6
  562. package/dist/store/audit-event.js +6 -5
  563. package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
  564. package/dist/{audit.js → store/audit.js} +91 -6
  565. package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
  566. package/dist/{auth.js → store/auth.js} +100 -92
  567. package/dist/store/candidates.d.ts +23 -12
  568. package/dist/store/candidates.js +87 -35
  569. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
  570. package/dist/{card-detail.js → store/card-detail.js} +1 -1
  571. package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
  572. package/dist/{store-cards.js → store/cards.js} +85 -146
  573. package/dist/store/compactions.d.ts +78 -0
  574. package/dist/store/compactions.js +93 -0
  575. package/dist/store/conflicts.d.ts +22 -5
  576. package/dist/store/conflicts.js +160 -109
  577. package/dist/store/connectors/github.d.ts +84 -0
  578. package/dist/store/connectors/github.js +180 -0
  579. package/dist/store/connectors/slack.d.ts +69 -0
  580. package/dist/store/connectors/slack.js +177 -0
  581. package/dist/store/dashboard-reads.d.ts +27 -0
  582. package/dist/store/dashboard-reads.js +92 -0
  583. package/dist/store/delete-and-batch.d.ts +20 -24
  584. package/dist/store/delete-and-batch.js +64 -40
  585. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
  586. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
  587. package/dist/store/descendant-page.d.ts +12 -0
  588. package/dist/store/descendant-page.js +99 -0
  589. package/dist/store/diagnostics.d.ts +47 -0
  590. package/dist/store/diagnostics.js +51 -0
  591. package/dist/store/doctor-reads.d.ts +16 -0
  592. package/dist/store/doctor-reads.js +19 -0
  593. package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
  594. package/dist/{dormant.js → store/dormant.js} +151 -6
  595. package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
  596. package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
  597. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  598. package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
  599. package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
  600. package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
  601. package/dist/store/entry-reads.d.ts +46 -7
  602. package/dist/store/entry-reads.js +120 -21
  603. package/dist/store/entry-row.d.ts +8 -2
  604. package/dist/store/entry-row.js +28 -8
  605. package/dist/store/entry-writes.d.ts +33 -4
  606. package/dist/store/entry-writes.js +108 -26
  607. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  608. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  609. package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
  610. package/dist/{goals.js → store/goals.js} +45 -94
  611. package/dist/store/graph-queue.d.ts +29 -0
  612. package/dist/store/graph-queue.js +101 -0
  613. package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
  614. package/dist/{graph/read.js → store/graph-reads.js} +63 -115
  615. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
  616. package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
  617. package/dist/store/graph-view-rows.d.ts +12 -0
  618. package/dist/store/graph-view-rows.js +67 -0
  619. package/dist/store/graph-writes.d.ts +58 -0
  620. package/dist/store/graph-writes.js +256 -0
  621. package/dist/store/half-life.d.ts +34 -0
  622. package/dist/store/half-life.js +77 -0
  623. package/dist/store/handoffs.d.ts +6 -3
  624. package/dist/store/handoffs.js +70 -31
  625. package/dist/store/index-and-stats.d.ts +8 -1
  626. package/dist/store/index-and-stats.js +51 -48
  627. package/dist/store/index.d.ts +4 -0
  628. package/dist/store/index.js +3 -0
  629. package/dist/store/key-audit.d.ts +2 -2
  630. package/dist/store/key-audit.js +4 -4
  631. package/dist/store/key-writes.d.ts +12 -5
  632. package/dist/store/key-writes.js +30 -4
  633. package/dist/store/ledger-turn.d.ts +17 -0
  634. package/dist/store/ledger-turn.js +27 -0
  635. package/dist/store/markdown.d.ts +1 -1
  636. package/dist/store/markdown.js +4 -3
  637. package/dist/store/mirrors.d.ts +5 -7
  638. package/dist/store/mirrors.js +39 -25
  639. package/dist/store/object-types.d.ts +189 -0
  640. package/dist/store/object-types.js +4 -0
  641. package/dist/store/open.d.ts +8 -4
  642. package/dist/store/open.js +34 -23
  643. package/dist/store/planning-fallacy-evidence.d.ts +42 -0
  644. package/dist/store/planning-fallacy-evidence.js +81 -0
  645. package/dist/store/port.d.ts +646 -0
  646. package/dist/store/port.js +17 -0
  647. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
  648. package/dist/{predictions/store.js → store/predictions.js} +52 -67
  649. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  650. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  651. package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +5 -3
  652. package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
  653. package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
  654. package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
  655. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
  656. package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
  657. package/dist/store/rejected-values.d.ts +55 -0
  658. package/dist/store/rejected-values.js +162 -0
  659. package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
  660. package/dist/{rejection.js → store/rejection.js} +3 -2
  661. package/dist/store/rows.d.ts +2 -3
  662. package/dist/store/rows.js +18 -11
  663. package/dist/store/search-rows.d.ts +15 -4
  664. package/dist/store/search-rows.js +43 -36
  665. package/dist/store/sessions.d.ts +18 -2
  666. package/dist/store/sessions.js +83 -46
  667. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  668. package/dist/store/sqlite/commit-watch.js +29 -0
  669. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  670. package/dist/store/sqlite/connector-events-group.js +50 -0
  671. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  672. package/dist/store/sqlite/connector-writes-group.js +65 -0
  673. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  674. package/dist/store/sqlite/dag-reads-group.js +45 -0
  675. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  676. package/dist/store/sqlite/entry-writes-group.js +170 -0
  677. package/dist/store/sqlite/error-codec.d.ts +17 -0
  678. package/dist/store/sqlite/error-codec.js +59 -0
  679. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  680. package/dist/store/sqlite/executor-counts.js +11 -0
  681. package/dist/store/sqlite/executor.d.ts +28 -0
  682. package/dist/store/sqlite/executor.js +286 -0
  683. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  684. package/dist/store/sqlite/graph-reads-group.js +18 -0
  685. package/dist/store/sqlite/local.d.ts +21 -0
  686. package/dist/store/sqlite/local.js +38 -0
  687. package/dist/store/sqlite/object-rows.d.ts +102 -0
  688. package/dist/store/sqlite/object-rows.js +218 -0
  689. package/dist/store/sqlite/objects-group.d.ts +20 -0
  690. package/dist/store/sqlite/objects-group.js +314 -0
  691. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  692. package/dist/store/sqlite/predictions-group.js +28 -0
  693. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  694. package/dist/store/sqlite/quarantine-group.js +38 -0
  695. package/dist/store/sqlite/store.d.ts +26 -0
  696. package/dist/store/sqlite/store.js +295 -0
  697. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  698. package/dist/store/sqlite/vector-pack.js +46 -0
  699. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  700. package/dist/store/sqlite/vector-reads-group.js +23 -0
  701. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  702. package/dist/store/sqlite/worker-entry.js +8 -0
  703. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  704. package/dist/store/sqlite/worker-jobs.js +116 -0
  705. package/dist/store/sqlite/worker-ops.d.ts +124 -0
  706. package/dist/store/sqlite/worker-ops.js +82 -0
  707. package/dist/store/sqlite/worker-store.d.ts +8 -0
  708. package/dist/store/sqlite/worker-store.js +76 -0
  709. package/dist/store/summaries.d.ts +2 -11
  710. package/dist/store/summaries.js +17 -44
  711. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  712. package/dist/store/tenant-lookup.d.ts +1 -1
  713. package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
  714. package/dist/{tenant.js → store/tenant.js} +1 -1
  715. package/dist/store/token-ledger-rows.d.ts +61 -0
  716. package/dist/store/token-ledger-rows.js +68 -0
  717. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
  718. package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
  719. package/dist/store/tombstone-checks.d.ts +12 -0
  720. package/dist/store/tombstone-checks.js +31 -0
  721. package/dist/store/usage-reports.d.ts +7 -0
  722. package/dist/store/usage-reports.js +26 -0
  723. package/dist/store/vector-writes.d.ts +10 -3
  724. package/dist/store/vector-writes.js +35 -5
  725. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
  726. package/dist/{working-memory.js → store/working-memory.js} +39 -41
  727. package/dist/support-bundle.d.ts +1 -1
  728. package/dist/support-bundle.js +13 -33
  729. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  730. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  731. package/dist/trust/quarantine.d.ts +4 -0
  732. package/dist/trust/quarantine.js +8 -0
  733. package/dist/trust/reject-flow.d.ts +23 -0
  734. package/dist/trust/reject-flow.js +67 -0
  735. package/dist/util/anthropic-messages.d.ts +31 -0
  736. package/dist/util/anthropic-messages.js +46 -0
  737. package/dist/util/atomic-write.d.ts +3 -0
  738. package/dist/util/atomic-write.js +107 -0
  739. package/dist/util/crash-handlers.d.ts +5 -0
  740. package/dist/util/crash-handlers.js +30 -0
  741. package/dist/{env.d.ts → util/env.d.ts} +17 -2
  742. package/dist/{env.js → util/env.js} +22 -2
  743. package/dist/util/home-path.js +67 -0
  744. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
  745. package/dist/{http-retry.js → util/http-retry.js} +38 -7
  746. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  747. package/dist/{http-util.js → util/http-util.js} +31 -11
  748. package/dist/util/json.d.ts +17 -0
  749. package/dist/util/json.js +25 -0
  750. package/dist/{log.d.ts → util/log.d.ts} +5 -2
  751. package/dist/{log.js → util/log.js} +12 -3
  752. package/dist/util/real-path.d.ts +3 -0
  753. package/dist/util/real-path.js +15 -0
  754. package/dist/util/request-scope.d.ts +27 -0
  755. package/dist/util/request-scope.js +47 -0
  756. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  757. package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
  758. package/dist/util/stored-json.d.ts +9 -0
  759. package/dist/util/stored-json.js +8 -0
  760. package/dist/util/time.d.ts +2 -0
  761. package/dist/util/time.js +3 -0
  762. package/dist/util/token-text.d.ts +18 -0
  763. package/dist/util/token-text.js +23 -0
  764. package/dist/{version.d.ts → util/version.d.ts} +1 -1
  765. package/dist/{version.js → util/version.js} +1 -1
  766. package/extensions/openclaw-plugin/index.ts +1 -5
  767. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  768. package/extensions/openclaw-plugin/package.json +1 -1
  769. package/openclaw.plugin.json +1 -1
  770. package/package.json +2 -2
  771. package/dist/api.d.ts +0 -26
  772. package/dist/api.js +0 -29
  773. package/dist/capture-contract.js +0 -49
  774. package/dist/connectors/github/idempotency.d.ts +0 -19
  775. package/dist/connectors/github/idempotency.js +0 -27
  776. package/dist/connectors/slack/idempotency.d.ts +0 -17
  777. package/dist/connectors/slack/idempotency.js +0 -31
  778. package/dist/customer-notes.js +0 -336
  779. package/dist/db.d.ts +0 -9
  780. package/dist/db.js +0 -8
  781. package/dist/decisions.js +0 -326
  782. package/dist/extract.js +0 -133
  783. package/dist/graph/rows.d.ts +0 -45
  784. package/dist/graph/types.js +0 -11
  785. package/dist/half-life-migration.js +0 -182
  786. package/dist/handoff.js +0 -68
  787. package/dist/home-path.js +0 -24
  788. package/dist/incidents.js +0 -349
  789. package/dist/instruction-detect.js +0 -27
  790. package/dist/json.d.ts +0 -7
  791. package/dist/json.js +0 -11
  792. package/dist/ledger-db.d.ts +0 -10
  793. package/dist/ledger-db.js +0 -42
  794. package/dist/policies.js +0 -434
  795. package/dist/processes.js +0 -371
  796. package/dist/project-briefs.js +0 -523
  797. package/dist/reject-flow.d.ts +0 -69
  798. package/dist/reject-flow.js +0 -260
  799. package/dist/session-owners.d.ts +0 -7
  800. package/dist/session-owners.js +0 -54
  801. package/dist/skills.js +0 -367
  802. package/dist/store-port.d.ts +0 -191
  803. package/dist/store-port.js +0 -166
  804. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  805. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  806. /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
  807. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  808. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  809. /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
  810. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  811. /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
  812. /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
  813. /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
  814. /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
  815. /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
  816. /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
  817. /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
  818. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  819. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  820. /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
  821. /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
  822. /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
  823. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  824. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  825. /package/dist/{card.d.ts → core/card.d.ts} +0 -0
  826. /package/dist/{card.js → core/card.js} +0 -0
  827. /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
  828. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  829. /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
  830. /package/dist/{physics-config.js → core/physics-config.js} +0 -0
  831. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  832. /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
  833. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  834. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  835. /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
  836. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  837. /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
  838. /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
  839. /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
  840. /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
  841. /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
  842. /package/dist/{rrf.js → search/rrf.js} +0 -0
  843. /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
  844. /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
  845. /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
  846. /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
  847. /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
  848. /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
  849. /package/dist/{yaml.js → store/yaml.js} +0 -0
  850. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  851. /package/dist/{escape.js → util/escape.js} +0 -0
  852. /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
  853. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  854. /package/dist/{keyset.js → util/keyset.js} +0 -0
  855. /package/dist/{same-text.js → util/same-text.js} +0 -0
  856. /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
  857. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  858. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  859. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  860. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  861. /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
  862. /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
  863. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  864. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -1,182 +0,0 @@
1
- /**
2
- * Moving a store's memories to a new default half-life.
3
- *
4
- * Each memory stores its own `half_life_days`, set at write from the
5
- * default base and a few write-time multipliers (`deriveHalfLife`). Changing
6
- * the default therefore reaches only new memories; without this migration a
7
- * store would mix old-base and new-base memories, a state the decay
8
- * evaluation never tested. The rule, declared before any run:
9
- *
10
- * - only a memory still on the old base is rescaled: its half-life is
11
- * `deriveHalfLife(from, entry)` plus its recall bonus. A memory hippo shortened since
12
- * (invalidated, superseded, a merge source, marked bad) or one with its own
13
- * fixed half-life (decisions, incidents, customer notes) keeps its value;
14
- * - every rescale is written to the audit log with the ids, so it can be
15
- * undone, and the store records the base it is on (`meta`), so the
16
- * migration runs once.
17
- *
18
- * `hippo sleep` runs it before its decay pass, from the base the store is on
19
- * (7 days when never recorded) to the configured `defaultHalfLifeDays`. Once per store it also
20
- * moves memories of live decisions, incidents and other objects off the flat 90 days they used to get.
21
- */
22
- import { deriveHalfLife } from './memory.js';
23
- import { openStore, HALF_LIFE_BASE_META_KEY, TYPED_HALF_LIFE_META_KEY } from './store/open.js';
24
- import { selectAllEntries } from './store/entry-reads.js';
25
- import { openHippoDb, closeHippoDb, getMeta, setMeta } from './db.js';
26
- import { appendAuditEvent } from './audit.js';
27
- import { loadConfig } from './config.js';
28
- /** The base every store used before the base was recorded. */
29
- export const LEGACY_HALF_LIFE_BASE = 7;
30
- /** The flat half-life the decision, incident and other object writers gave their memories before they took the default. */
31
- export const LEGACY_TYPED_HALF_LIFE = 90;
32
- const TYPED_SOURCES = new Set(['decision', 'incident', 'process', 'policy', 'skill', 'project_brief', 'customer_note']);
33
- const OBJECT_TABLES = ['decisions', 'incidents', 'processes', 'policies', 'skills', 'project_briefs', 'customer_notes'];
34
- export { HALF_LIFE_BASE_META_KEY };
35
- /** Recall bonus over `written`, the half-life `entry` got at write, or null when off it; each recall added 2 days. */
36
- export function halfLifeRecallBonus(entry, written) {
37
- if (entry.superseded_by || entry.tags.includes('invalidated') || entry.tags.includes('superseded'))
38
- return null;
39
- const bonus = entry.half_life_days - written;
40
- const k = Math.round(bonus / 2);
41
- return Math.abs(bonus - 2 * k) < 1e-9 && k >= 0 && k <= entry.retrieval_count ? bonus : null;
42
- }
43
- /** The entries to rescale from `from` to `to`, as copies that keep their recall bonus. Pure. */
44
- export function planHalfLifeMigration(entries, from, to) {
45
- if (from === to)
46
- return [];
47
- return entries.flatMap((e) => {
48
- const bonus = halfLifeRecallBonus(e, deriveHalfLife(from, e));
49
- return bonus === null ? [] : [{ ...e, half_life_days: deriveHalfLife(to, e) + bonus }];
50
- });
51
- }
52
- /** Memories of decisions, incidents and other objects still on the flat 90 days, as copies on `to` that keep their recall bonus. Pure. */
53
- export function planTypedHalfLifeMigration(entries, to) {
54
- return entries.flatMap((e) => {
55
- const bonus = TYPED_SOURCES.has(e.source) ? halfLifeRecallBonus(e, LEGACY_TYPED_HALF_LIFE) : null;
56
- const next = bonus === null ? e.half_life_days : deriveHalfLife(to, e) + bonus;
57
- return next === e.half_life_days ? [] : [{ ...e, half_life_days: next }];
58
- });
59
- }
60
- /** The base this store's memories are on. */
61
- export function storeHalfLifeBase(hippoRoot) {
62
- const db = openHippoDb(hippoRoot);
63
- try {
64
- return readBase(db);
65
- }
66
- finally {
67
- closeHippoDb(db);
68
- }
69
- }
70
- function readBase(db) {
71
- const raw = Number(getMeta(db, HALF_LIFE_BASE_META_KEY, String(LEGACY_HALF_LIFE_BASE)));
72
- return Number.isFinite(raw) && raw > 0 ? raw : LEGACY_HALF_LIFE_BASE;
73
- }
74
- /** The base an object writer gives its memory: the flat 90 days until this store's typed migration has run, which then moves them, and the default after. */
75
- export function objectHalfLifeDays(hippoRoot) {
76
- // SHORTCUT: read outside the write's transaction, so a write racing the typed migration keeps 90; read inside writeEntry if that ever matters.
77
- const db = openStore(hippoRoot);
78
- try {
79
- return getMeta(db, TYPED_HALF_LIFE_META_KEY, '') === '' ? LEGACY_TYPED_HALF_LIFE : loadConfig(hippoRoot).defaultHalfLifeDays;
80
- }
81
- finally {
82
- closeHippoDb(db);
83
- }
84
- }
85
- /**
86
- * Move the store's memories from the base they are on, and those of objects from
87
- * the old flat 90 days, to `to`, once. Under `dryRun` nothing is written, the recorded
88
- * base included.
89
- */
90
- export function migrateDefaultHalfLife(hippoRoot, to, opts = {}) {
91
- const dryRun = opts.dryRun ?? false;
92
- const noop = (from) => ({ from, to, rescaled: 0, typed: 0, kept: 0, dryRun, halfLives: new Map() });
93
- const db = openStore(hippoRoot);
94
- try {
95
- // Plan, write, audit and record the base under one write lock, so a concurrent write or sleep cannot interleave.
96
- if (!dryRun)
97
- db.exec('BEGIN IMMEDIATE');
98
- try {
99
- const from = readBase(db);
100
- const typedPending = getMeta(db, TYPED_HALF_LIFE_META_KEY, '') === '';
101
- if (!(Number.isFinite(to) && to > 0) || (from === to && !typedPending)) {
102
- if (!dryRun)
103
- db.exec('COMMIT');
104
- return noop(from);
105
- }
106
- const all = selectAllEntries(db);
107
- const objects = typedPending ? objectMemoryIds(db) : { all: new Set(), retired: new Set() };
108
- const losers = typedPending ? conflictLosers(db) : new Set();
109
- const copies = new Set(all.flatMap((e) => (e.superseded_by ? [e.superseded_by] : [])));
110
- // Provenance before shape: an object's memory came from its writer, a supersede copy from the base (it keeps the source). Shape decides the rest.
111
- const objectWritten = (e) => objects.all.has(e.id) || (!copies.has(e.id) && TYPED_SOURCES.has(e.source) && halfLifeRecallBonus(e, LEGACY_TYPED_HALF_LIFE) !== null);
112
- const typedPlan = typedPending ? planTypedHalfLifeMigration(all.filter((e) => objectWritten(e) && !objects.retired.has(e.id) && !losers.has(e.id)), to) : [];
113
- const basePlan = planHalfLifeMigration(typedPending ? all.filter((e) => !objectWritten(e)) : all, from, to);
114
- const plan = [...basePlan, ...typedPlan];
115
- const halfLives = new Map(plan.map((e) => [e.id, e.half_life_days]));
116
- const result = { from, to, rescaled: basePlan.length, typed: typedPlan.length, kept: all.length - plan.length, dryRun, halfLives };
117
- if (dryRun)
118
- return result;
119
- const old = new Map(all.map((e) => [e.id, e.half_life_days]));
120
- const actor = opts.actor ?? 'system';
121
- writePlan(db, basePlan, old, { from, to, actor });
122
- writePlan(db, typedPlan, old, { from: LEGACY_TYPED_HALF_LIFE, to, actor });
123
- setMeta(db, HALF_LIFE_BASE_META_KEY, String(to));
124
- setMeta(db, TYPED_HALF_LIFE_META_KEY, '1');
125
- db.exec('COMMIT');
126
- return result;
127
- }
128
- catch (err) {
129
- if (!dryRun)
130
- db.exec('ROLLBACK');
131
- throw err;
132
- }
133
- }
134
- finally {
135
- closeHippoDb(db);
136
- }
137
- }
138
- /** Memories behind every object, and those behind a superseded or closed one. Retiring an object leaves its memory untouched, so only its table knows. */
139
- function objectMemoryIds(db) {
140
- const all = new Set();
141
- const retired = new Set();
142
- for (const table of OBJECT_TABLES) {
143
- // SAFETY: SELECT of two TEXT columns, filtered to a non-null memory_id.
144
- const rows = db.prepare(`SELECT memory_id, status FROM ${table} WHERE memory_id IS NOT NULL`).all();
145
- for (const r of rows) {
146
- all.add(r.memory_id);
147
- if (r.status === 'superseded' || r.status === 'closed')
148
- retired.add(r.memory_id);
149
- }
150
- }
151
- return { all, retired };
152
- }
153
- /** Memories that lost a conflict, which resolveConflict halved untagged. A resolved conflict with no audit row (resolved before resolves were audited, or found stale) names no winner, so both sides count. */
154
- function conflictLosers(db) {
155
- // SAFETY: SELECT of two fields every conflict_resolve audit row carries (ConflictResolveMeta in store.ts).
156
- const audited = db.prepare(`SELECT json_extract(metadata_json, '$.conflictId') AS conflictId, json_extract(metadata_json, '$.loserId') AS loserId FROM audit_log WHERE op = 'conflict_resolve'`).all();
157
- const losers = new Set(audited.map((a) => a.loserId));
158
- const named = new Set(audited.map((a) => a.conflictId));
159
- // SAFETY: SELECT of three columns of resolved conflicts.
160
- const resolved = db.prepare(`SELECT id, memory_a_id, memory_b_id FROM memory_conflicts WHERE status = 'resolved'`).all();
161
- for (const c of resolved)
162
- if (!named.has(c.id))
163
- losers.add(c.memory_a_id).add(c.memory_b_id);
164
- return losers;
165
- }
166
- /** Writes `plan`, then one audit event per tenant with each id's old half-life, so the move can be undone. */
167
- function writePlan(db, plan, old, move) {
168
- const update = db.prepare('UPDATE memories SET half_life_days = ? WHERE id = ?');
169
- const byTenant = new Map();
170
- for (const e of plan) {
171
- update.run(e.half_life_days, e.id);
172
- // One record per tenant, filled in place: copying it per row made the write grow with the square of the store.
173
- let record = byTenant.get(e.tenantId);
174
- if (!record)
175
- byTenant.set(e.tenantId, (record = {}));
176
- record[e.id] = old.get(e.id);
177
- }
178
- for (const [tenantId, oldHalfLives] of byTenant) {
179
- appendAuditEvent(db, { tenantId, actor: move.actor, op: 'half_life_migrate', metadata: { from: move.from, to: move.to, ids: Object.keys(oldHalfLives), oldHalfLives } });
180
- }
181
- }
182
- //# sourceMappingURL=half-life-migration.js.map
package/dist/handoff.js DELETED
@@ -1,68 +0,0 @@
1
- /**
2
- * Session handoff types and helpers.
3
- *
4
- * A handoff captures the state of a session so that a successor
5
- * session (or a different agent) can pick up where the previous
6
- * one left off.
7
- */
8
- /** Narrows an unvalidated value (e.g. CLI input or event content) to a HandoffOutcome. */
9
- export function isHandoffOutcome(v) {
10
- return v === 'success' || v === 'failure' || v === 'partial';
11
- }
12
- /** Renders evidence as one line shared by every renderer (CLI, MCP, token accounting). */
13
- export function formatHandoffEvidenceLine(evidence) {
14
- const gitRef = evidence.gitRef ?? 'unknown';
15
- const tree = evidence.dirtyTree === true ? 'dirty' : evidence.dirtyTree === false ? 'clean' : 'unknown';
16
- const tests = evidence.testStatus ?? 'unknown';
17
- return `git ${gitRef}, tree ${tree}, tests ${tests}`;
18
- }
19
- export function rowToSessionHandoff(row) {
20
- let artifacts = [];
21
- try {
22
- const parsed = JSON.parse(row.artifacts_json);
23
- if (Array.isArray(parsed)) {
24
- artifacts = parsed.map((item) => String(item));
25
- }
26
- }
27
- catch {
28
- // A corrupt column degrades to empty instead of hiding the whole handoff.
29
- artifacts = [];
30
- }
31
- let constraints = [];
32
- try {
33
- const parsed = row.constraints_json ? JSON.parse(row.constraints_json) : [];
34
- if (Array.isArray(parsed)) {
35
- constraints = parsed.map((item) => String(item));
36
- }
37
- }
38
- catch {
39
- // Same degrade-to-empty rule as artifacts.
40
- constraints = [];
41
- }
42
- let evidence = null;
43
- try {
44
- // SAFETY: catch below falls back to null on malformed JSON, so a wrong shape never escapes.
45
- evidence = row.evidence_json ? JSON.parse(row.evidence_json) : null;
46
- }
47
- catch {
48
- // Same degrade rule as artifacts: bad evidence reads as none.
49
- evidence = null;
50
- }
51
- return {
52
- version: 1,
53
- sessionId: row.session_id,
54
- repoRoot: row.repo_root ?? undefined,
55
- taskId: row.task_id ?? undefined,
56
- summary: row.summary,
57
- nextAction: row.next_action ?? undefined,
58
- artifacts,
59
- scope: row.scope ?? null,
60
- updatedAt: row.created_at,
61
- constraints,
62
- evidence,
63
- outcome: isHandoffOutcome(row.outcome) ? row.outcome : null,
64
- targetRuntime: row.target_runtime ?? null,
65
- cardId: row.card_id ?? null,
66
- };
67
- }
68
- //# sourceMappingURL=handoff.js.map
package/dist/home-path.js DELETED
@@ -1,24 +0,0 @@
1
- // Home-directory paths name their user, so text bound for a shared store tests or masks them here; no imports keep it light.
2
- // VS Code writes file links URL-encoded, so a separator may be %5C or %2F.
3
- const WIN_SEP = String.raw `(?:[\\/]|%5C|%2F)`;
4
- const WIN_CHAR = String.raw `(?:(?!%5C|%2F)[^\\/:*?"<>|\s])`;
5
- // A Windows name never holds a quote, so JSON stops it; one with spaces runs to a separator, quote, closing mark or line end, leaving the mark, as stopping at its first word leaks the surname.
6
- const WIN_USER = String.raw `(?:${WIN_CHAR}+(?: ${WIN_CHAR}+){0,3}(?=${WIN_SEP}|["'\`)\]>,;]|\.(?=\s|$)|(?<!\.)(?:[^\S ]|$))(?<![\`)\],;'])|${WIN_CHAR}+)`;
7
- /** One pattern per path shape that carries a user name: Windows, Git Bash and WSL mounts, extended-length, UNC home shares, Linux, macOS and 8.3 short names. */
8
- export const USER_SEGMENT = [
9
- new RegExp(String.raw `[A-Za-z](?::|%3A)${WIN_SEP}+(?:Users|Documents and Settings)${WIN_SEP}+${WIN_USER}`, 'i'),
10
- new RegExp(String.raw `(?<![\w.])(?:\/mnt)?\/[A-Za-z]\/Users\/${WIN_USER}`, 'i'),
11
- /\\\\\?\\/,
12
- new RegExp(String.raw `\\\\[^\\/\s]+\\+(?:homes?|users|profiles?)\$?\\+${WIN_USER}`, 'i'),
13
- /(?<![\w.~-])(?:\/var)?\/home\/[^/\s]+/,
14
- /(?<![\w.~-])(?:\/var)?\/root(?![\w.-])/,
15
- /(?<![\w.~-])\/Users\/[^/\s]+/,
16
- /[\\/][A-Z0-9_$]{1,6}~\d{1,6}(?:\.[A-Z0-9]{1,3})?(?![\w~])|\b[A-Z0-9_$]{1,6}~\d{1,6}(?:\.[A-Z0-9]{1,3})?[\\/]/,
17
- ];
18
- // Global copies, so the shared test patterns keep their lastIndex at 0.
19
- const USER_SEGMENT_ALL = USER_SEGMENT.map((re) => new RegExp(re.source, `${re.flags}g`));
20
- /** `text` with each home-directory segment replaced by `[home]`. */
21
- export function maskHomePaths(text) {
22
- return USER_SEGMENT_ALL.reduce((out, re) => out.replace(re, '[home]'), text);
23
- }
24
- //# sourceMappingURL=home-path.js.map
package/dist/incidents.js DELETED
@@ -1,349 +0,0 @@
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/decisions.ts).
19
- *
20
- * Dual-write atomicity: `saveIncident` writes the memory + incidents row inside
21
- * writeEntry's SAVEPOINT 'write_entry' (store.ts) via the afterWrite hook, so a
22
- * failure in any step rolls all of them back. Pattern matches saveDecision.
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
- */
28
- import { BadRequestError, ConflictError, NotFoundError } from './api-errors.js';
29
- import { openHippoDb, closeHippoDb } from './db.js';
30
- import { writeEntry } from './store/entry-writes.js';
31
- import { assertTenantId } from './tenant.js';
32
- import { createMemory, Layer } from './memory.js';
33
- import { appendAuditEvent } from './audit.js';
34
- import { objectHalfLifeDays } from './half-life-migration.js';
35
- import { keysetAfter } from './keyset.js';
36
- export const VALID_INCIDENT_STATES = new Set([
37
- 'open',
38
- 'resolved',
39
- 'closed',
40
- ]);
41
- function parseLinkedMemoryIds(raw) {
42
- try {
43
- // SAFETY: JSON.parse output is arbitrary; narrowed by Array.isArray plus
44
- // the per-element string check below before use as string[].
45
- const parsed = JSON.parse(raw);
46
- if (Array.isArray(parsed)) {
47
- return parsed.filter((x) => typeof x === 'string');
48
- }
49
- return [];
50
- }
51
- catch {
52
- // A malformed list column reads as empty instead of failing the incident read.
53
- return [];
54
- }
55
- }
56
- function rowToIncident(row) {
57
- return {
58
- id: row.id,
59
- memoryId: row.memory_id,
60
- tenantId: row.tenant_id,
61
- incidentText: row.incident_text,
62
- context: row.context,
63
- // SAFETY: status is DB-constrained to VALID_INCIDENT_STATES; this module
64
- // is the only writer and always inserts one of those literal strings.
65
- status: row.status,
66
- resolutionText: row.resolution_text,
67
- resolvedAt: row.resolved_at,
68
- closedAt: row.closed_at,
69
- linkedMemoryIds: parseLinkedMemoryIds(row.linked_memory_ids),
70
- createdAt: row.created_at,
71
- };
72
- }
73
- const INCIDENT_COLS = `
74
- id, memory_id, tenant_id, incident_text, context, status,
75
- resolution_text, resolved_at, closed_at, linked_memory_ids, created_at
76
- `;
77
- // ---------------------------------------------------------------------------
78
- // Public API
79
- // ---------------------------------------------------------------------------
80
- // Validate every linked receipt BEFORE inserting the row. Each must be a
81
- // memory in the SAME tenant; a cross-tenant or nonexistent id rejects the
82
- // whole write rather than recording an unverifiable receipt.
83
- function validateLinkedMemoryIds(db, tenantId, linkInput) {
84
- const validated = [];
85
- for (const linkId of linkInput) {
86
- // SAFETY: row shape matches the single `id` column named in the SELECT above.
87
- const exists = db.prepare(`SELECT id FROM memories WHERE id = ? AND tenant_id = ?`).get(linkId, tenantId);
88
- if (!exists) {
89
- throw new NotFoundError(`saveIncident: linked memory ${linkId} not found for tenant ${tenantId}`);
90
- }
91
- validated.push(linkId);
92
- }
93
- return validated;
94
- }
95
- /** The afterWrite body: link validation, INSERT, reload, open audit, all in one SAVEPOINT. */
96
- function writeIncidentRow(db, memoryId, tenantId, opts, actor, now) {
97
- const validated = validateLinkedMemoryIds(db, tenantId, opts.linkedMemoryIds ?? []);
98
- const result = db.prepare(`
99
- INSERT INTO incidents(
100
- memory_id, tenant_id, incident_text, context,
101
- status, resolution_text, resolved_at, closed_at, linked_memory_ids, created_at
102
- ) VALUES (?, ?, ?, ?, 'open', NULL, NULL, NULL, ?, ?)
103
- `).run(memoryId, tenantId, opts.incidentText, opts.context ?? null, JSON.stringify(validated), now);
104
- const incidentId = Number(result.lastInsertRowid ?? 0);
105
- // SAFETY: row's shape matches the columns named in INCIDENT_COLS above.
106
- const row = db.prepare(`SELECT ${INCIDENT_COLS} FROM incidents WHERE id = ?`)
107
- .get(incidentId);
108
- if (!row)
109
- throw new Error('saveIncident: failed to reload saved incident row');
110
- // GDPR-light metadata: id + flag only, no incident_text.
111
- appendAuditEvent(db, {
112
- tenantId,
113
- actor,
114
- op: 'incident_open',
115
- targetId: String(incidentId),
116
- metadata: {
117
- incident_id: incidentId,
118
- has_context: opts.context !== undefined && opts.context !== null && opts.context !== '',
119
- linked_memory_count: validated.length,
120
- },
121
- });
122
- return row;
123
- }
124
- /**
125
- * Create an incident. Writes the memory mirror + the incidents row atomically
126
- * inside writeEntry's SAVEPOINT 'write_entry'.
127
- *
128
- * The memory mirror: tags ['incident', ...extraTags], source 'incident',
129
- * confidence 'verified', the half-life objectHalfLifeDays picks, content =
130
- * "<text>\n\nContext: <context>" when context is given.
131
- *
132
- * linked_memory_ids are validated BEFORE insert: each must exist in the SAME
133
- * tenant. A cross-tenant or nonexistent id throws and rolls back the whole
134
- * write. The validated ids are stored as JSON.stringify(validated).
135
- */
136
- export function saveIncident(hippoRoot, tenantId, opts, actor = 'cli') {
137
- assertTenantId('saveIncident', tenantId);
138
- if (!opts.incidentText)
139
- throw new BadRequestError('saveIncident: incidentText is required');
140
- const now = new Date().toISOString();
141
- const content = opts.context
142
- ? `${opts.incidentText}\n\nContext: ${opts.context}`
143
- : opts.incidentText;
144
- const tags = ['incident', ...(opts.extraTags ?? [])];
145
- const mem = createMemory(content, {
146
- tags,
147
- layer: Layer.Semantic,
148
- confidence: 'verified',
149
- source: 'incident',
150
- baseHalfLifeDays: objectHalfLifeDays(hippoRoot),
151
- tenantId,
152
- });
153
- // Populated inside afterWrite so the linked-id validation, the INSERT, and the
154
- // memory write all share one SAVEPOINT.
155
- let savedRow;
156
- writeEntry(hippoRoot, mem, {
157
- actor,
158
- afterWrite: (db, memoryId) => {
159
- savedRow = writeIncidentRow(db, memoryId, tenantId, opts, actor, now);
160
- },
161
- });
162
- if (!savedRow) {
163
- // Unreachable unless afterWrite threw first; defensive.
164
- throw new Error('saveIncident: afterWrite did not populate the row');
165
- }
166
- return rowToIncident(savedRow);
167
- }
168
- /**
169
- * Resolve an open incident (open -> resolved). Records resolution_text +
170
- * resolved_at; the incident stays on record. CAS guard: WHERE status='open';
171
- * 0 changes distinguishes not-found from not-open so callers surface the right
172
- * error. Emits incident_resolve.
173
- */
174
- export function resolveIncident(hippoRoot, tenantId, id, resolutionText, actor = 'cli') {
175
- assertTenantId('resolveIncident', tenantId);
176
- if (!resolutionText || !resolutionText.trim()) {
177
- throw new BadRequestError('resolveIncident: resolutionText is required (non-empty)');
178
- }
179
- const now = new Date().toISOString();
180
- const db = openHippoDb(hippoRoot);
181
- try {
182
- db.exec('BEGIN IMMEDIATE');
183
- try {
184
- const updateResult = db.prepare(`
185
- UPDATE incidents
186
- SET status = 'resolved', resolution_text = ?, resolved_at = ?
187
- WHERE id = ? AND tenant_id = ? AND status = 'open'
188
- `).run(resolutionText, now, id, tenantId);
189
- if (updateResult.changes === 0) {
190
- // SAFETY: row shape matches the single `status` column named in the SELECT above.
191
- const existing = db.prepare(`SELECT status FROM incidents WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
192
- if (!existing) {
193
- throw new NotFoundError(`resolveIncident: incident ${id} not found for tenant ${tenantId}`);
194
- }
195
- throw new ConflictError(`resolveIncident: incident ${id} is not open (status='${existing.status}'); only open incidents can be resolved.`);
196
- }
197
- // SAFETY: row's shape matches the columns named in INCIDENT_COLS above.
198
- const row = db.prepare(`SELECT ${INCIDENT_COLS} FROM incidents WHERE id = ? AND tenant_id = ?`)
199
- .get(id, tenantId);
200
- if (!row)
201
- throw new NotFoundError(`resolveIncident: incident ${id} not found after UPDATE`);
202
- appendAuditEvent(db, {
203
- tenantId,
204
- actor,
205
- op: 'incident_resolve',
206
- targetId: String(id),
207
- metadata: { incident_id: id },
208
- });
209
- db.exec('COMMIT');
210
- return rowToIncident(row);
211
- }
212
- catch (e) {
213
- try {
214
- db.exec('ROLLBACK');
215
- }
216
- catch {
217
- // Ignore rollback failures — the throw below is what matters.
218
- }
219
- throw e;
220
- }
221
- }
222
- finally {
223
- closeHippoDb(db);
224
- }
225
- }
226
- /**
227
- * Close (retire) an incident from open or resolved (open|resolved -> closed).
228
- * Updates closed_at only; the memory mirror is not mutated. CAS guard: WHERE
229
- * status IN ('open','resolved'); 0 changes distinguishes not-found from
230
- * wrong-state. Emits incident_close.
231
- */
232
- export function closeIncident(hippoRoot, tenantId, id, actor = 'cli') {
233
- assertTenantId('closeIncident', tenantId);
234
- const now = new Date().toISOString();
235
- const db = openHippoDb(hippoRoot);
236
- try {
237
- db.exec('BEGIN IMMEDIATE');
238
- try {
239
- const updateResult = db.prepare(`
240
- UPDATE incidents
241
- SET status = 'closed', closed_at = ?
242
- WHERE id = ? AND tenant_id = ? AND status IN ('open', 'resolved')
243
- `).run(now, id, tenantId);
244
- if (updateResult.changes === 0) {
245
- // SAFETY: row shape matches the single `status` column named in the SELECT above.
246
- const existing = db.prepare(`SELECT status FROM incidents WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
247
- if (!existing) {
248
- throw new NotFoundError(`closeIncident: incident ${id} not found for tenant ${tenantId}`);
249
- }
250
- throw new ConflictError(`closeIncident: incident ${id} is already closed (status='${existing.status}'); only open or resolved incidents can be closed.`);
251
- }
252
- // SAFETY: row's shape matches the columns named in INCIDENT_COLS above.
253
- const row = db.prepare(`SELECT ${INCIDENT_COLS} FROM incidents WHERE id = ? AND tenant_id = ?`)
254
- .get(id, tenantId);
255
- if (!row)
256
- throw new NotFoundError(`closeIncident: incident ${id} not found after UPDATE`);
257
- appendAuditEvent(db, {
258
- tenantId,
259
- actor,
260
- op: 'incident_close',
261
- targetId: String(id),
262
- metadata: { incident_id: id },
263
- });
264
- db.exec('COMMIT');
265
- return rowToIncident(row);
266
- }
267
- catch (e) {
268
- try {
269
- db.exec('ROLLBACK');
270
- }
271
- catch {
272
- // Ignore rollback failures — the throw below is what matters.
273
- }
274
- throw e;
275
- }
276
- }
277
- finally {
278
- closeHippoDb(db);
279
- }
280
- }
281
- export function loadIncidentById(hippoRoot, tenantId, id) {
282
- assertTenantId('loadIncidentById', tenantId);
283
- const db = openHippoDb(hippoRoot);
284
- try {
285
- // SAFETY: row's shape matches the columns named in INCIDENT_COLS above.
286
- const row = db.prepare(`SELECT ${INCIDENT_COLS} FROM incidents WHERE id = ? AND tenant_id = ?`)
287
- .get(id, tenantId);
288
- return row ? rowToIncident(row) : null;
289
- }
290
- finally {
291
- closeHippoDb(db);
292
- }
293
- }
294
- export function loadIncidents(hippoRoot, tenantId, opts = {}) {
295
- assertTenantId('loadIncidents', tenantId);
296
- const limit = opts.limit ?? 100;
297
- const after = keysetAfter('created_at', 'id', opts.after);
298
- const db = openHippoDb(hippoRoot);
299
- try {
300
- let rows;
301
- if (opts.status) {
302
- if (!VALID_INCIDENT_STATES.has(opts.status)) {
303
- throw new BadRequestError(`loadIncidents: status must be one of ${Array.from(VALID_INCIDENT_STATES).join('|')}; got ${opts.status}`);
304
- }
305
- // SAFETY: rows' shape matches the columns named in INCIDENT_COLS above.
306
- rows = db.prepare(`
307
- SELECT ${INCIDENT_COLS} FROM incidents
308
- WHERE tenant_id = ? AND status = ?${after.sql}
309
- ORDER BY created_at DESC, id DESC
310
- LIMIT ?
311
- `).all(tenantId, opts.status, ...after.params, limit);
312
- }
313
- else {
314
- // SAFETY: rows' shape matches the columns named in INCIDENT_COLS above.
315
- rows = db.prepare(`
316
- SELECT ${INCIDENT_COLS} FROM incidents
317
- WHERE tenant_id = ?${after.sql}
318
- ORDER BY created_at DESC, id DESC
319
- LIMIT ?
320
- `).all(tenantId, ...after.params, limit);
321
- }
322
- return rows.map(rowToIncident);
323
- }
324
- finally {
325
- closeHippoDb(db);
326
- }
327
- }
328
- export function loadOpenIncidents(hippoRoot, tenantId, opts = {}) {
329
- return loadIncidents(hippoRoot, tenantId, { status: 'open', limit: opts.limit });
330
- }
331
- /**
332
- * Resolve a memory id to the table id of the OPEN incident backed by that
333
- * memory, or null when the memory has no open incident row. Extracted so a
334
- * memory-id-based lookup is unit-testable at the store layer (mirror of
335
- * resolveActiveDecisionIdByMemory).
336
- */
337
- export function resolveActiveIncidentIdByMemory(hippoRoot, tenantId, memoryId) {
338
- assertTenantId('resolveActiveIncidentIdByMemory', tenantId);
339
- const db = openHippoDb(hippoRoot);
340
- try {
341
- // SAFETY: row shape matches the single `id` column named in the SELECT above.
342
- const row = db.prepare(`SELECT id FROM incidents WHERE memory_id = ? AND tenant_id = ? AND status = 'open' ORDER BY id DESC LIMIT 1`).get(memoryId, tenantId);
343
- return row ? row.id : null;
344
- }
345
- finally {
346
- closeHippoDb(db);
347
- }
348
- }
349
- //# sourceMappingURL=incidents.js.map
@@ -1,27 +0,0 @@
1
- /** Prompt-injection detection for untrusted memory content. Same shape as secret-detect.ts; leaf module, no store/api/shared imports. */
2
- const INSTRUCTION_PATTERNS = [
3
- { name: 'override-instructions', re: /\b(?:ignore|disregard|forget)\b[^.\n]{0,40}\b(?:previous|prior|above)\b[^.\n]{0,40}\binstructions?\b/i },
4
- { name: 'role-reassignment', re: /\b(?:you are now|act as|pretend to be)\b[^.\n]{0,40}\b(?:an?\s+)?(?:ai|assistant|agent|system)\b/i },
5
- { name: 'chat-role-markup', re: /<\|im_start\|>|<\|system\|>|\[INST\]|<\/?system>|###\s*system\s*:/i },
6
- { name: 'system-prompt-reference', re: /\b(?:(?:override|ignore|bypass|replace|reveal)\b[^.\n]{0,40}\b(?:system prompt|developer message)|(?:system prompt|developer message)\b[^.\n]{0,40}\b(?:override|ignore|bypass|replace|reveal))\b/i },
7
- // "always"/"never" alone (ordinary PR prose) doesn't flag without an agent-facing target nearby too.
8
- { name: 'standing-order', re: /\b(?:from now on|whenever you|always|never)\b[^.\n]{0,50}\b(?:you must|(?:the ai|the assistant|the agent|claude|copilot)\s+(?:must|should|will)\b)/i },
9
- { name: 'concealment', re: /\b(?:do not|never|don't)\b[^.\n]{0,40}\b(?:tell|mention|reveal)\b[^.\n]{0,40}\bthe user\b/i },
10
- { name: 'remote-script-exec', re: /\b(?:curl|wget)\b[^\n|]{0,80}\|\s*(?:sudo\s+)?(?:sh|bash|zsh)\b|\biex\s*\(\s*(?:iwr|invoke-webrequest|new-object\s+net\.webclient)/i },
11
- { name: 'exfiltration', re: /\b(?:send|post|upload|exfiltrate)\b[^.\n]{0,40}\b(?:secrets?|tokens?|api[- ]?keys?|credentials?|env(?:ironment)? variables?)\b/i },
12
- { name: 'unicode-tag-chars', re: /[\u{E0000}-\u{E007F}]/u },
13
- ];
14
- // A stray zero-width char has legitimate uses (ZWJ); only a run of 3+ adjacent ones reads as smuggling.
15
- const ZERO_WIDTH_RUN_RE = /[\u200B-\u200F\u2060-\u2064]{3,}/;
16
- export function detectInstruction(content) {
17
- for (const { name, re } of INSTRUCTION_PATTERNS) {
18
- if (re.test(content)) {
19
- return { flagged: true, reason: `pattern:${name}` };
20
- }
21
- }
22
- if (ZERO_WIDTH_RUN_RE.test(content)) {
23
- return { flagged: true, reason: 'pattern:zero-width-smuggling' };
24
- }
25
- return { flagged: false, reason: null };
26
- }
27
- //# sourceMappingURL=instruction-detect.js.map
package/dist/json.d.ts DELETED
@@ -1,7 +0,0 @@
1
- export type JsonValue = string | number | boolean | null | JsonValue[] | {
2
- [key: string]: JsonValue;
3
- };
4
- export declare function isJsonString(value: JsonValue | undefined): value is string;
5
- /** Windows PowerShell 5.1 saves JSON with a UTF-8 byte order mark that JSON.parse rejects, so one leading mark is dropped. */
6
- export declare function readJsonFile(file: string): JsonValue;
7
- //# sourceMappingURL=json.d.ts.map
package/dist/json.js DELETED
@@ -1,11 +0,0 @@
1
- // Leaf module: the one value space JSON.parse can produce, so boundary guards narrow a shared type.
2
- import * as fs from 'fs';
3
- export function isJsonString(value) {
4
- return typeof value === 'string';
5
- }
6
- /** Windows PowerShell 5.1 saves JSON with a UTF-8 byte order mark that JSON.parse rejects, so one leading mark is dropped. */
7
- export function readJsonFile(file) {
8
- const text = fs.readFileSync(file, 'utf8');
9
- return JSON.parse(text.codePointAt(0) === 0xfeff ? text.slice(1) : text);
10
- }
11
- //# sourceMappingURL=json.js.map