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
@@ -0,0 +1,87 @@
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
+ import { isJsonString } from '../util/json.js';
9
+ import { warnDamagedColumn } from '../util/stored-json.js';
10
+ /** Narrows an unvalidated value (e.g. CLI input or event content) to a HandoffOutcome. */
11
+ export function isHandoffOutcome(v) {
12
+ return v === 'success' || v === 'failure' || v === 'partial';
13
+ }
14
+ /** Renders evidence as one line shared by every renderer (CLI, MCP, token accounting). */
15
+ export function formatHandoffEvidenceLine(evidence) {
16
+ const gitRef = evidence.gitRef ?? 'unknown';
17
+ const tree = evidence.dirtyTree === true ? 'dirty' : evidence.dirtyTree === false ? 'clean' : 'unknown';
18
+ const tests = evidence.testStatus ?? 'unknown';
19
+ return `git ${gitRef}, tree ${tree}, tests ${tests}`;
20
+ }
21
+ const TEST_STATUSES = new Set(['pass', 'fail', 'unknown']);
22
+ const absent = (v) => v === undefined || v === null;
23
+ function isHandoffEvidence(v) {
24
+ if (!(v instanceof Object) || Array.isArray(v))
25
+ return false;
26
+ const { gitRef, dirtyTree, testStatus, derivedFrom } = v;
27
+ return (absent(gitRef) || isJsonString(gitRef))
28
+ && (absent(dirtyTree) || dirtyTree === true || dirtyTree === false)
29
+ && (absent(testStatus) || TEST_STATUSES.has(testStatus))
30
+ && (derivedFrom === undefined || derivedFrom === 'transcript');
31
+ }
32
+ /** A stored list column as strings; a damaged one logs and reads as empty instead of hiding the whole handoff. */
33
+ function storedList(row, column) {
34
+ const raw = row[column];
35
+ if (!raw)
36
+ return [];
37
+ try {
38
+ const parsed = JSON.parse(raw);
39
+ return Array.isArray(parsed) ? parsed.map((item) => String(item)) : [];
40
+ }
41
+ catch {
42
+ warnDamagedColumn({ table: 'session_handoffs', id: row.id, column }, 'not valid JSON');
43
+ return [];
44
+ }
45
+ }
46
+ /** Stored evidence, or null (after a log line) when the column is damaged or holds another shape. */
47
+ function storedEvidence(row) {
48
+ if (!row.evidence_json)
49
+ return null;
50
+ const site = { table: 'session_handoffs', id: row.id, column: 'evidence_json' };
51
+ let parsed;
52
+ try {
53
+ parsed = JSON.parse(row.evidence_json);
54
+ }
55
+ catch {
56
+ warnDamagedColumn(site, 'not valid JSON');
57
+ return null;
58
+ }
59
+ if (parsed === null)
60
+ return null;
61
+ if (isHandoffEvidence(parsed))
62
+ return parsed;
63
+ warnDamagedColumn(site, 'wrong shape');
64
+ return null;
65
+ }
66
+ export function rowToSessionHandoff(row) {
67
+ const artifacts = storedList(row, 'artifacts_json');
68
+ const constraints = storedList(row, 'constraints_json');
69
+ const evidence = storedEvidence(row);
70
+ return {
71
+ version: 1,
72
+ sessionId: row.session_id,
73
+ repoRoot: row.repo_root ?? undefined,
74
+ taskId: row.task_id ?? undefined,
75
+ summary: row.summary,
76
+ nextAction: row.next_action ?? undefined,
77
+ artifacts,
78
+ scope: row.scope ?? null,
79
+ updatedAt: row.created_at,
80
+ constraints,
81
+ evidence,
82
+ outcome: isHandoffOutcome(row.outcome) ? row.outcome : null,
83
+ targetRuntime: row.target_runtime ?? null,
84
+ cardId: row.card_id ?? null,
85
+ };
86
+ }
87
+ //# sourceMappingURL=handoff.js.map
@@ -1,5 +1,5 @@
1
1
  import { COMPACTION_MEMORY_TAG, COMPACTION_SOURCE_PREFIX } from './memory.js';
2
- import { heldTexts } from './same-text.js';
2
+ import { heldTexts } from '../util/same-text.js';
3
3
  export const STOP_WORDS = new Set([
4
4
  'the', 'a', 'an', 'is', 'was', 'are', 'were', 'be', 'been', 'being',
5
5
  'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'it',
@@ -2,6 +2,8 @@
2
2
  * Core data model for Hippo memory entries.
3
3
  * Based on the strength formula from PLAN.md.
4
4
  */
5
+ export declare const DEFAULT_SCHEMA_FIT = 0.5;
6
+ export declare const FALLBACK_HALF_LIFE_DAYS = 7;
5
7
  export declare enum Layer {
6
8
  Buffer = "buffer",
7
9
  Episodic = "episodic",
@@ -122,7 +124,7 @@ export declare const CHURN_STALE_TAG = "churn-stale";
122
124
  * the env var for this test.
123
125
  * - afterEach: clear the cache so the next test (which may not set the env
124
126
  * var) reads the clean default instead of this test's value.
125
- * See `tests/emotional-multipliers-j5.test.ts` for the canonical pattern.
127
+ * See `tests/emotional-multipliers.test.ts` for the pattern.
126
128
  */
127
129
  export declare function _resetLossAversionRatioCacheForTests(): void;
128
130
  /**
@@ -172,9 +174,6 @@ export declare function calculateStrength(entry: StrengthInputs, now?: Date, opt
172
174
  /** calculateStrength's clock-basis formula as SQL over `memories` columns, flags and multipliers baked in; keep in step.
173
175
  * An unparseable date scores NULL here and 0 in JS, so sums agree. */
174
176
  export declare function strengthSql(now: Date): string;
175
- /**
176
- * Derive half-life based on signals, as per PLAN.md table.
177
- */
178
177
  export declare function deriveHalfLife(base: number, entry: Partial<MemoryEntry>): number;
179
178
  /**
180
179
  * Apply outcome feedback to a memory entry.
@@ -190,15 +189,20 @@ export declare function deriveHalfLife(base: number, entry: Partial<MemoryEntry>
190
189
  * cumulative reward signal, inspired by R-STDP in spiking networks.
191
190
  */
192
191
  export declare function applyOutcome(entry: MemoryEntry, good: boolean): MemoryEntry;
192
+ /** applyOutcome as a served outcome applies it: a good outcome reconfirms the entry, so its churn-stale tag goes. */
193
+ export declare function entryAfterOutcome(entry: MemoryEntry, good: boolean): MemoryEntry;
193
194
  /**
194
195
  * Generate a random memory ID using crypto.randomUUID().
195
196
  */
196
197
  export declare function generateId(prefix?: string): string;
198
+ /** What the confidence facets read, so a caller can derive them from a row it loaded only in part. */
199
+ export type ConfidenceInputs = Pick<MemoryEntry, 'pinned' | 'confidence' | 'last_retrieved'>;
197
200
  export interface ConfidenceFacets {
198
201
  tier: ConfidenceLevel;
199
202
  agedOut: boolean;
200
203
  }
201
204
  export declare function confidenceFacets(entry: MemoryEntry, now?: Date): ConfidenceFacets;
205
+ export declare function facetsOf(entry: ConfidenceInputs, now: Date): ConfidenceFacets;
202
206
  export declare function confidenceLabel(entry: MemoryEntry, now?: Date): {
203
207
  text: string;
204
208
  warn: boolean;
@@ -213,7 +217,7 @@ export declare function resolveConfidence(entry: MemoryEntry, now?: Date): Confi
213
217
  * Base half-life for a new memory, in days, before `deriveHalfLife`'s
214
218
  * write-time multipliers. 365 because 7 days lost the current fact far more
215
219
  * often, and 730 days or no decay did no better. `hippo sleep` moves memories still
216
- * on an older base (src/half-life-migration.ts).
220
+ * on an older base (src/consolidate/half-life-migration.ts).
217
221
  */
218
222
  export declare const DEFAULT_HALF_LIFE_DAYS = 365;
219
223
  export declare const COMPACTION_MEMORY_TAG = "compaction-memory";
@@ -270,6 +274,16 @@ export declare function createSuccessor(old: MemoryEntry, content: string, opts:
270
274
  * Rare shared tags signal stronger schema fit than common ones.
271
275
  */
272
276
  export declare function computeSchemaFit(content: string, tags: string[], existingEntries: MemoryEntry[]): number;
277
+ /** What schema fit reads from a set of memories, so a store can answer without loading its rows. */
278
+ export interface SchemaFitSource {
279
+ readonly rows: number;
280
+ /** How many times each tag appears across the set. */
281
+ readonly tagCounts: ReadonlyMap<string, number>;
282
+ /** Each memory's text; the walk stops once more matches cannot move the score. */
283
+ readonly contents: Iterable<string>;
284
+ }
285
+ /** computeSchemaFit against `source`, for a caller that holds counts and texts but no rows. */
286
+ export declare function schemaFitFrom(content: string, tags: readonly string[], source: SchemaFitSource): number;
273
287
  /**
274
288
  * Update retrieval metadata on entries that were returned by a search.
275
289
  * Returns the mutated copies (caller must persist to disk).
@@ -2,11 +2,15 @@
2
2
  * Core data model for Hippo memory entries.
3
3
  * Based on the strength formula from PLAN.md.
4
4
  */
5
- import { envLossAversionRatio } from './env.js';
5
+ import { envLossAversionRatio } from '../util/env.js';
6
6
  import { BadRequestError } from './api-errors.js';
7
7
  import { randomUUID } from 'crypto';
8
8
  import { isDecayAblated, isOutcomeSlowAblated, isRecallBoostAblated, evalNow, } from './ablation.js';
9
- import { AGENT_MEMORY_TOOLS, toolSourcePrefix } from './agent-memories/tools.js';
9
+ import { AGENT_MEMORY_TOOLS, toolSourcePrefix } from './agent-memory-tools.js';
10
+ import { DAY_MS } from '../util/time.js';
11
+ import { ID_SUFFIX_CHARS } from '../util/token-text.js';
12
+ export const DEFAULT_SCHEMA_FIT = 0.5;
13
+ export const FALLBACK_HALF_LIFE_DAYS = 7;
10
14
  export var Layer;
11
15
  (function (Layer) {
12
16
  Layer["Buffer"] = "buffer";
@@ -92,7 +96,7 @@ function getLossAversionRatio() {
92
96
  * the env var for this test.
93
97
  * - afterEach: clear the cache so the next test (which may not set the env
94
98
  * var) reads the clean default instead of this test's value.
95
- * See `tests/emotional-multipliers-j5.test.ts` for the canonical pattern.
99
+ * See `tests/emotional-multipliers.test.ts` for the pattern.
96
100
  */
97
101
  export function _resetLossAversionRatioCacheForTests() {
98
102
  _lossAversionRatioCache = undefined;
@@ -127,10 +131,16 @@ export function calculateRewardFactor(entry) {
127
131
  if (pos === 0 && neg === 0)
128
132
  return 1.0;
129
133
  const ratio = (pos - neg) / (pos + neg + 1);
130
- return 1 + 0.5 * ratio;
134
+ return 1 + REWARD_SLOPE * ratio;
131
135
  }
132
136
  /** Bad marks alone never push a memory under sleep's 0.05 retire line; supersede is the hard correction. */
133
137
  const MAX_WRONG_HALVINGS = 3;
138
+ // Shared by calculateStrength and strengthSql so the two cannot drift.
139
+ const DECAY_BASE = 0.5;
140
+ const REWARD_SLOPE = 0.5;
141
+ const RETRIEVAL_BOOST_SLOPE = 0.1;
142
+ const SQL_DEFAULT_HALF_LIFE_DAYS = 7;
143
+ const UNIX_EPOCH_JULIAN_DAY = 2440587.5;
134
144
  /**
135
145
  * Net wrongness: bad outcome marks past good ones, never below zero.
136
146
  * Strength halves per unit (capped at 3) and recall stops strengthening
@@ -157,58 +167,62 @@ export function calculateStrength(entry,
157
167
  // simulated-time protocols; see ablation.ts). Explicit `now` always wins.
158
168
  now = evalNow(), options = {}) {
159
169
  // Being marked wrong outranks every shield: pinning, error tags, heavy recall.
160
- const wrongPenalty = Math.pow(0.5, Math.min(netWrong(entry), MAX_WRONG_HALVINGS));
170
+ const wrongPenalty = Math.pow(DECAY_BASE, Math.min(netWrong(entry), MAX_WRONG_HALVINGS));
161
171
  if (entry.pinned)
162
172
  return wrongPenalty;
163
173
  // EVAL-ONLY ablation (see ablation.ts): anchor decay at CREATION, so clock resets persisted by PRIOR
164
174
  // unflagged runs cannot leak strengthening into an ablated arm. Prior-run half_life increments are
165
175
  // NOT reconstructed - see the ablation.ts caveat (fresh stores per arm).
166
176
  const lastRetrieved = new Date(isRecallBoostAblated() ? entry.created : entry.last_retrieved);
167
- const daysSince = (now.getTime() - lastRetrieved.getTime()) / (1000 * 60 * 60 * 24);
177
+ const daysSince = (now.getTime() - lastRetrieved.getTime()) / DAY_MS;
168
178
  // Reward-proportional half-life modulation
169
179
  const rewardFactor = calculateRewardFactor(entry);
170
- let effectiveHalfLife = entry.half_life_days * rewardFactor;
180
+ const effectiveHalfLife = entry.half_life_days * rewardFactor;
171
181
  // Guard: zero half-life causes 0/0 = NaN in the exponent
172
182
  if (effectiveHalfLife <= 0)
173
183
  return 0.0;
184
+ const decayExponent = decayExponentFor(options, daysSince, effectiveHalfLife);
185
+ // EVAL-ONLY ablation (see ablation.ts): decay term := 1. NOTE the [0,1]
186
+ // clamp below then caps retrievalBoost at baseline - see ablation.ts
187
+ // formula note.
188
+ const decay = isDecayAblated() ? 1.0 : Math.pow(DECAY_BASE, decayExponent);
189
+ const retrievalBoost = retrievalBoostFor(entry);
190
+ // Emotional multiplier. HIPPO_LOSS_AVERSION_RATIO scales the negative one ONLY; the lazy
191
+ // module cache makes this one lookup + one multiply, not a per-call process.env read.
192
+ const baseMultiplier = EMOTIONAL_MULTIPLIERS[entry.emotional_valence] ?? 1.0;
193
+ const emotionalMultiplier = applyLossAversionRatio(entry.emotional_valence, baseMultiplier);
194
+ const raw = decay * retrievalBoost * emotionalMultiplier;
195
+ // Clamp to [0, 1] with NaN guard
196
+ const clamped = Math.min(1.0, Math.max(0.0, raw));
197
+ return Number.isFinite(clamped) ? clamped * wrongPenalty : 0.0;
198
+ }
199
+ function decayExponentFor(options, daysSince, halfLifeDays) {
200
+ let effectiveHalfLife = halfLifeDays;
174
201
  const basis = options.decayBasis ?? 'clock';
175
- let decayExponent;
176
202
  if (basis === 'session') {
177
203
  // Decay by session count: each sleep cycle = 1 "day" in the decay formula.
178
204
  // Estimate sessions since last retrieval from wall-clock time and avg interval.
179
205
  const avgInterval = options.avgSessionIntervalDays ?? 1;
180
206
  const sessionsSince = avgInterval > 0 ? Math.max(0, daysSince / avgInterval) : daysSince;
181
- decayExponent = sessionsSince / effectiveHalfLife;
207
+ return sessionsSince / effectiveHalfLife;
182
208
  }
183
- else if (basis === 'adaptive') {
209
+ if (basis === 'adaptive') {
184
210
  // Scale half-life by session frequency: infrequent agents get longer half-lives
185
211
  const avgInterval = options.avgSessionIntervalDays ?? 0;
186
212
  if (avgInterval > 1) {
187
213
  effectiveHalfLife *= avgInterval;
188
214
  }
189
- decayExponent = daysSince / effectiveHalfLife;
190
- }
191
- else {
192
- // clock: classic wall-clock decay
193
- decayExponent = daysSince / effectiveHalfLife;
215
+ return daysSince / effectiveHalfLife;
194
216
  }
195
- // EVAL-ONLY ablation (see ablation.ts): decay term := 1. NOTE the [0,1]
196
- // clamp below then caps retrievalBoost at baseline - see ablation.ts
197
- // formula note.
198
- const decay = isDecayAblated() ? 1.0 : Math.pow(0.5, decayExponent);
199
- // Retrieval boost: 1 + 0.1 * log2(retrieval_count + 1). EVAL-ONLY ablation (see ablation.ts) neutralizes
200
- // the READ side too, so counts written before the flag cannot leak strengthening into an ablated arm.
201
- const retrievalBoost = isRecallBoostAblated() || netWrong(entry) > 0
217
+ // clock: classic wall-clock decay
218
+ return daysSince / effectiveHalfLife;
219
+ }
220
+ // Retrieval boost: 1 + 0.1 * log2(retrieval_count + 1). EVAL-ONLY ablation (see ablation.ts) neutralizes
221
+ // the READ side too, so counts written before the flag cannot leak strengthening into an ablated arm.
222
+ function retrievalBoostFor(entry) {
223
+ return isRecallBoostAblated() || netWrong(entry) > 0
202
224
  ? 1.0
203
- : 1 + 0.1 * Math.log2(entry.retrieval_count + 1);
204
- // Emotional multiplier. HIPPO_LOSS_AVERSION_RATIO scales the negative one ONLY; the lazy
205
- // module cache makes this one lookup + one multiply, not a per-call process.env read.
206
- const baseMultiplier = EMOTIONAL_MULTIPLIERS[entry.emotional_valence] ?? 1.0;
207
- const emotionalMultiplier = applyLossAversionRatio(entry.emotional_valence, baseMultiplier);
208
- const raw = decay * retrievalBoost * emotionalMultiplier;
209
- // Clamp to [0, 1] with NaN guard
210
- const clamped = Math.min(1.0, Math.max(0.0, raw));
211
- return Number.isFinite(clamped) ? clamped * wrongPenalty : 0.0;
225
+ : 1 + RETRIEVAL_BOOST_SLOPE * Math.log2(entry.retrieval_count + 1);
212
226
  }
213
227
  /** calculateStrength's clock-basis formula as SQL over `memories` columns, flags and multipliers baked in; keep in step.
214
228
  * An unparseable date scores NULL here and 0 in JS, so sums agree. */
@@ -219,25 +233,34 @@ export function strengthSql(now) {
219
233
  const wrong = isOutcomeSlowAblated() || isDecayAblated() ? '0' : `MAX(0, ${neg} - ${pos})`;
220
234
  const reward = isOutcomeSlowAblated()
221
235
  ? '1.0'
222
- : `(CASE WHEN ${pos} = 0 AND ${neg} = 0 THEN 1.0 ELSE 1.0 + 0.5 * (${pos} - ${neg}) / (${pos} + ${neg} + 1.0) END)`;
223
- const halfLife = `(COALESCE(half_life_days, 7) * ${reward})`;
236
+ : `(CASE WHEN ${pos} = 0 AND ${neg} = 0 THEN 1.0 ELSE 1.0 + ${REWARD_SLOPE} * (${pos} - ${neg}) / (${pos} + ${neg} + 1.0) END)`;
237
+ const halfLife = `(COALESCE(half_life_days, ${SQL_DEFAULT_HALF_LIFE_DAYS}) * ${reward})`;
224
238
  const anchor = isRecallBoostAblated() ? 'created' : 'last_retrieved';
225
- const nowJulian = num(now.getTime() / 86400000 + 2440587.5);
226
- const decay = isDecayAblated() ? '1.0' : `pow(0.5, (${nowJulian} - julianday(${anchor})) / ${halfLife})`;
239
+ const nowJulian = num(now.getTime() / DAY_MS + UNIX_EPOCH_JULIAN_DAY);
240
+ const decay = isDecayAblated() ? '1.0' : `pow(${DECAY_BASE}, (${nowJulian} - julianday(${anchor})) / ${halfLife})`;
227
241
  const boost = isRecallBoostAblated()
228
242
  ? '1.0'
229
- : `(CASE WHEN ${wrong} > 0 THEN 1.0 ELSE 1.0 + 0.1 * log2(COALESCE(retrieval_count, 0) + 1) END)`;
243
+ : `(CASE WHEN ${wrong} > 0 THEN 1.0 ELSE 1.0 + ${RETRIEVAL_BOOST_SLOPE} * log2(COALESCE(retrieval_count, 0) + 1) END)`;
230
244
  const valences = /* SAFETY: a Record keyed by EmotionalValence */ Object.keys(EMOTIONAL_MULTIPLIERS);
231
245
  const emotion = `(CASE COALESCE(emotional_valence, 'neutral') ${valences
232
246
  .map((v) => `WHEN '${v}' THEN ${num(applyLossAversionRatio(v, EMOTIONAL_MULTIPLIERS[v]))}`)
233
247
  .join(' ')} ELSE 1.0 END)`;
234
- const penalty = `pow(0.5, MIN(${wrong}, ${MAX_WRONG_HALVINGS}))`;
248
+ const penalty = `pow(${DECAY_BASE}, MIN(${wrong}, ${MAX_WRONG_HALVINGS}))`;
235
249
  return `(CASE WHEN pinned THEN ${penalty} WHEN ${halfLife} <= 0 THEN 0.0
236
250
  ELSE MIN(1.0, MAX(0.0, ${decay} * ${boost} * ${emotion})) * ${penalty} END)`;
237
251
  }
238
252
  /**
239
253
  * Derive half-life based on signals, as per PLAN.md table.
240
254
  */
255
+ const HIGH_SCHEMA_FIT = 0.7;
256
+ const HIGH_FIT_HALF_LIFE_FACTOR = 1.5;
257
+ const LOW_SCHEMA_FIT = 0.3;
258
+ const LOW_FIT_HALF_LIFE_FACTOR = 0.5;
259
+ // Schema fit blends tag coverage and content similarity; a content match needs this share of shared tokens.
260
+ const TAG_FIT_WEIGHT = 0.6;
261
+ const CONTENT_FIT_WEIGHT = 0.4;
262
+ const CONTENT_TOKEN_SHARE_MIN = 0.2;
263
+ const CONTENT_ENOUGH_FRACTION = 0.1;
241
264
  export function deriveHalfLife(base, entry) {
242
265
  let hl = base;
243
266
  // Error-tagged: 2x half-life
@@ -245,12 +268,12 @@ export function deriveHalfLife(base, entry) {
245
268
  hl *= 2;
246
269
  }
247
270
  // High schema fit: consolidates faster (1.5x)
248
- if (entry.schema_fit !== undefined && entry.schema_fit > 0.7) {
249
- hl *= 1.5;
271
+ if (entry.schema_fit !== undefined && entry.schema_fit > HIGH_SCHEMA_FIT) {
272
+ hl *= HIGH_FIT_HALF_LIFE_FACTOR;
250
273
  }
251
274
  // Low schema fit: decay faster (0.5x)
252
- if (entry.schema_fit !== undefined && entry.schema_fit < 0.3) {
253
- hl *= 0.5;
275
+ if (entry.schema_fit !== undefined && entry.schema_fit < LOW_SCHEMA_FIT) {
276
+ hl *= LOW_FIT_HALF_LIFE_FACTOR;
254
277
  }
255
278
  return hl;
256
279
  }
@@ -277,21 +300,29 @@ export function applyOutcome(entry, good) {
277
300
  updated.strength = calculateStrength(updated);
278
301
  return updated;
279
302
  }
303
+ /** applyOutcome as a served outcome applies it: a good outcome reconfirms the entry, so its churn-stale tag goes. */
304
+ export function entryAfterOutcome(entry, good) {
305
+ const updated = applyOutcome(entry, good);
306
+ if (!good || !updated.tags.includes(CHURN_STALE_TAG))
307
+ return updated;
308
+ return { ...updated, tags: updated.tags.filter((t) => t !== CHURN_STALE_TAG) };
309
+ }
280
310
  /**
281
311
  * Generate a random memory ID using crypto.randomUUID().
282
312
  */
283
313
  export function generateId(prefix = 'mem') {
284
- return `${prefix}_${randomUUID().replace(/-/g, '').slice(0, 12)}`;
314
+ return `${prefix}_${randomUUID().replace(/-/g, '').slice(0, ID_SUFFIX_CHARS)}`;
285
315
  }
286
- // Pinned and verified are exempt from ageing by policy, so this reads "aged out
287
- // for trust purposes", not "old". The 30-day threshold lives here and nowhere else.
288
316
  function isAgedOut(entry, now) {
289
317
  if (entry.pinned || entry.confidence === 'verified')
290
318
  return false;
291
319
  const lastRetrieved = new Date(entry.last_retrieved);
292
- return (now.getTime() - lastRetrieved.getTime()) / (1000 * 60 * 60 * 24) > 30;
320
+ return (now.getTime() - lastRetrieved.getTime()) / DAY_MS > 30;
293
321
  }
294
322
  export function confidenceFacets(entry, now = evalNow()) {
323
+ return facetsOf(entry, now);
324
+ }
325
+ export function facetsOf(entry, now) {
295
326
  return { tier: entry.confidence, agedOut: isAgedOut(entry, now) };
296
327
  }
297
328
  // `warn` covers exactly the rows the old collapsed-value rule did: an aged-out row
@@ -315,7 +346,7 @@ export function resolveConfidence(entry, now = evalNow()) {
315
346
  * Base half-life for a new memory, in days, before `deriveHalfLife`'s
316
347
  * write-time multipliers. 365 because 7 days lost the current fact far more
317
348
  * often, and 730 days or no decay did no better. `hippo sleep` moves memories still
318
- * on an older base (src/half-life-migration.ts).
349
+ * on an older base (src/consolidate/half-life-migration.ts).
319
350
  */
320
351
  export const DEFAULT_HALF_LIFE_DAYS = 365;
321
352
  export const COMPACTION_MEMORY_TAG = 'compaction-memory';
@@ -333,21 +364,13 @@ export function canAutoDelete(entry) {
333
364
  return !entry.pinned && entry.kind !== 'raw' && !isKeptForGood(entry);
334
365
  }
335
366
  export function createMemory(content, options = {}) {
336
- const trimmed = content.trim();
337
- if (trimmed.length < 3) {
338
- throw new BadRequestError(`Memory content too short (${trimmed.length} chars, minimum 3): "${trimmed}"`);
339
- }
340
- const validOutcomes = ['success', 'failure', 'partial', null];
341
- if (options.trace_outcome !== undefined && !validOutcomes.includes(options.trace_outcome)) {
342
- throw new BadRequestError(`Invalid trace_outcome: ${options.trace_outcome}. Must be 'success', 'failure', 'partial', or null.`);
343
- }
367
+ assertValidMemoryInput(content, options);
344
368
  const now = evalNow().toISOString(); // honors HIPPO_FAKE_NOW (eval-only)
345
369
  const layer = options.layer ?? Layer.Episodic;
346
370
  const tags = options.tags ?? [];
347
371
  const emotional_valence = options.emotional_valence ?? inferValence(tags);
348
- const schema_fit = options.schema_fit ?? 0.5;
349
- const partial = { tags, schema_fit };
350
- const half_life_days = deriveHalfLife(options.baseHalfLifeDays ?? DEFAULT_HALF_LIFE_DAYS, partial);
372
+ const schema_fit = options.schema_fit ?? DEFAULT_SCHEMA_FIT;
373
+ const half_life_days = deriveHalfLife(options.baseHalfLifeDays ?? DEFAULT_HALF_LIFE_DAYS, { tags, schema_fit });
351
374
  const entry = {
352
375
  id: generateId(layer === Layer.Semantic ? 'sem' : 'mem'),
353
376
  created: now,
@@ -386,6 +409,16 @@ export function createMemory(content, options = {}) {
386
409
  entry.strength = calculateStrength(entry);
387
410
  return entry;
388
411
  }
412
+ function assertValidMemoryInput(content, options) {
413
+ const trimmed = content.trim();
414
+ if (trimmed.length < 3) {
415
+ throw new BadRequestError(`Memory content too short (${trimmed.length} chars, minimum 3): "${trimmed}"`);
416
+ }
417
+ const validOutcomes = ['success', 'failure', 'partial', null];
418
+ if (options.trace_outcome !== undefined && !validOutcomes.includes(options.trace_outcome)) {
419
+ throw new BadRequestError(`Invalid trace_outcome: ${options.trace_outcome}. Must be 'success', 'failure', 'partial', or null.`);
420
+ }
421
+ }
389
422
  /** The row that replaces `old`: a supersede never changes where a memory belongs, so source, scope, session and a stamped origin carry over. */
390
423
  export function createSuccessor(old, content, opts) {
391
424
  const next = createMemory(content, {
@@ -416,53 +449,55 @@ export function createSuccessor(old, content, opts) {
416
449
  * Rare shared tags signal stronger schema fit than common ones.
417
450
  */
418
451
  export function computeSchemaFit(content, tags, existingEntries) {
419
- if (existingEntries.length === 0)
420
- return 0.5; // no schema yet, neutral
421
- // Build tag frequency map across all existing entries
422
- const tagFreq = new Map();
452
+ const tagCounts = new Map();
423
453
  for (const entry of existingEntries) {
424
454
  for (const tag of entry.tags) {
425
- tagFreq.set(tag, (tagFreq.get(tag) ?? 0) + 1);
455
+ tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
426
456
  }
427
457
  }
458
+ return schemaFitFrom(content, tags, { rows: existingEntries.length, tagCounts, contents: existingEntries.map((e) => e.content) });
459
+ }
460
+ function significantTokens(text) {
461
+ return new Set(text.toLowerCase().replace(/[^\w\s]/g, ' ').split(/\s+/).filter((t) => t.length > 3));
462
+ }
463
+ /** computeSchemaFit against `source`, for a caller that holds counts and texts but no rows. */
464
+ export function schemaFitFrom(content, tags, source) {
465
+ const N = source.rows;
466
+ if (N === 0)
467
+ return 0.5; // no schema yet, neutral
468
+ const tagFreq = source.tagCounts;
428
469
  if (tags.length === 0 && tagFreq.size === 0)
429
470
  return 0.5;
430
- // Tag overlap: IDF-weighted Jaccard
431
- // Shared rare tags matter more than shared common tags
471
+ // Tag overlap, weighted so a shared rare tag counts for more than a shared common one.
432
472
  let weightedOverlap = 0;
433
473
  let totalWeight = 0;
434
- const N = existingEntries.length;
474
+ const maxIdf = Math.log(N + 1) + 1;
435
475
  for (const tag of tags) {
436
476
  const freq = tagFreq.get(tag) ?? 0;
437
- // IDF-weighted: rare shared tags score higher
438
- const maxIdf = Math.log(N + 1) + 1;
439
- if (freq > 0) {
440
- const idf = Math.log(N / freq) + 1;
441
- weightedOverlap += idf;
442
- }
477
+ if (freq > 0)
478
+ weightedOverlap += Math.log(N / freq) + 1;
443
479
  totalWeight += maxIdf;
444
480
  }
445
- // Scale so that matching half the tags at average IDF gives ~0.5
481
+ // Scaled so that matching half the tags at average weight gives about 0.5.
446
482
  const tagScore = totalWeight > 0 ? Math.min(1, (weightedOverlap / totalWeight) * 2) : 0;
447
- // Content overlap: check how many existing entries share significant tokens
448
- const newTokens = new Set(content.toLowerCase().replace(/[^\w\s]/g, ' ').split(/\s+/).filter((t) => t.length > 3));
483
+ const newTokens = significantTokens(content);
449
484
  if (newTokens.size === 0)
450
485
  return Math.min(1, Math.max(0, tagScore));
486
+ // The content score is capped at 1, which this many matching memories reach.
487
+ const enough = Math.max(5, N * CONTENT_ENOUGH_FRACTION);
451
488
  let contentMatches = 0;
452
- for (const entry of existingEntries) {
453
- const entryTokens = new Set(entry.content.toLowerCase().replace(/[^\w\s]/g, ' ').split(/\s+/).filter((t) => t.length > 3));
489
+ for (const text of source.contents) {
490
+ const entryTokens = significantTokens(text);
454
491
  let shared = 0;
455
492
  for (const token of newTokens) {
456
493
  if (entryTokens.has(token))
457
494
  shared++;
458
495
  }
459
- const overlap = shared / Math.max(newTokens.size, 1);
460
- if (overlap > 0.2)
461
- contentMatches++;
496
+ if (shared / newTokens.size > CONTENT_TOKEN_SHARE_MIN && ++contentMatches >= enough)
497
+ break;
462
498
  }
463
- const contentScore = Math.min(1, contentMatches / Math.max(5, N * 0.1));
464
- // Blend: 60% tag overlap, 40% content overlap
465
- const fit = 0.6 * tagScore + 0.4 * contentScore;
499
+ const contentScore = Math.min(1, contentMatches / enough);
500
+ const fit = TAG_FIT_WEIGHT * tagScore + CONTENT_FIT_WEIGHT * contentScore;
466
501
  return Math.min(1, Math.max(0, fit));
467
502
  }
468
503
  function inferValence(tags) {
@@ -9,7 +9,7 @@
9
9
  * conflict repulsion, and drag (consolidation). Nearby high-scoring memories
10
10
  * amplify each other via constructive interference.
11
11
  */
12
- import type { EmotionalValence } from './memory.js';
12
+ import { type EmotionalValence } from './memory.js';
13
13
  import type { PhysicsConfig } from './physics-config.js';
14
14
  export interface PhysicsParticle {
15
15
  memoryId: string;
@@ -10,6 +10,7 @@
10
10
  * amplify each other via constructive interference.
11
11
  */
12
12
  import { isRecallBoostAblated } from './ablation.js';
13
+ import { FALLBACK_HALF_LIFE_DAYS } from './memory.js';
13
14
  import { comparePhysicsResultsBy } from './compare.js';
14
15
  // ---------------------------------------------------------------------------
15
16
  // Vector math (hot path — kept inline for performance)
@@ -183,7 +184,7 @@ function computeNetForce(i, particles, ctx) {
183
184
  }
184
185
  }
185
186
  // Drag
186
- const fd = dragForce(pi, ctx.config.drag, ctx.halfLives.get(pi.memoryId) ?? 7);
187
+ const fd = dragForce(pi, ctx.config.drag, ctx.halfLives.get(pi.memoryId) ?? FALLBACK_HALF_LIFE_DAYS);
187
188
  net = vecAdd(net, fd);
188
189
  return net;
189
190
  }
@@ -41,11 +41,6 @@ export interface ResolveProjectIdentityOpts {
41
41
  }
42
42
  /** Clear the per-process identity cache and the remote switch it read (test seam). */
43
43
  export declare function clearProjectIdentityCache(): void;
44
- /**
45
- * Canonicalize a path via realpath, falling back to path.resolve when the
46
- * path does not exist or realpath fails (mirrors importers.ts).
47
- */
48
- export declare function realpathOrResolve(p: string): string;
49
44
  /**
50
45
  * Resolve the project identity for a working directory.
51
46
  * Defaults to process.cwd(). Results are cached per resolved input path.
@@ -1,12 +1,13 @@
1
- import { envHippoHome, envXdgDataHome } from './env.js';
1
+ import { envHippoHome, envXdgDataHome } from '../util/env.js';
2
2
  import * as fs from 'fs';
3
3
  import * as os from 'os';
4
4
  import * as path from 'path';
5
5
  import { BadRequestError } from './api-errors.js';
6
6
  import { isSharedStore, loadConfig } from './config.js';
7
- import { MAX_ID_LEN } from './http-util.js';
8
- import { log } from './log.js';
7
+ import { MAX_ID_LEN } from '../util/http-util.js';
8
+ import { errorMessage, log } from '../util/log.js';
9
9
  import { originRemoteId, projectFileId } from './project-remote.js';
10
+ import { realpathOrResolve } from '../util/real-path.js';
10
11
  const MAX_WALK_DEPTH = 64;
11
12
  const identityCache = new Map();
12
13
  let remoteSwitch = null;
@@ -30,19 +31,6 @@ function namesAt(root, legacyName) {
30
31
  const aliases = [...new Set([fileId, remoteId, legacyName])].filter((n) => n !== null && n !== name);
31
32
  return aliases.length > 0 ? { name, aliases } : { name };
32
33
  }
33
- /**
34
- * Canonicalize a path via realpath, falling back to path.resolve when the
35
- * path does not exist or realpath fails (mirrors importers.ts).
36
- */
37
- export function realpathOrResolve(p) {
38
- try {
39
- return fs.realpathSync.native(p);
40
- }
41
- catch (err) {
42
- log.debug(`project identity: realpath fell back to resolve for ${p}: ${err instanceof Error ? err.message : String(err)}`);
43
- return path.resolve(p);
44
- }
45
- }
46
34
  /** Compare two canonical paths, case-insensitively on Windows. */
47
35
  function samePath(a, b) {
48
36
  if (process.platform === 'win32')
@@ -68,7 +56,7 @@ function isDirectoryAt(p) {
68
56
  return fs.statSync(p).isDirectory();
69
57
  }
70
58
  catch (err) {
71
- log.debug(`project identity: no marker at ${p}: ${err instanceof Error ? err.message : String(err)}`);
59
+ log.debug(`project identity: no marker at ${p}: ${errorMessage(err)}`);
72
60
  return false;
73
61
  }
74
62
  }
@@ -2,7 +2,7 @@
2
2
  import * as fs from 'fs';
3
3
  import * as path from 'path';
4
4
  import { isObjectLike, isStringValue } from './capture-contract.js';
5
- import { log } from './log.js';
5
+ import { errorMessage, log } from '../util/log.js';
6
6
  /** The config file git reads for a checkout: `.git/config`, a linked worktree's `<commondir>/config`, a submodule's `<gitdir>/config`. */
7
7
  export function gitConfigPath(gitRoot) {
8
8
  const marker = path.join(gitRoot, '.git');
@@ -19,7 +19,7 @@ export function gitConfigPath(gitRoot) {
19
19
  return path.join(path.resolve(linkDir, fs.readFileSync(commondir, 'utf8').trim()), 'config');
20
20
  }
21
21
  catch (err) {
22
- log.debug(`project remote: no git config for ${gitRoot}: ${err instanceof Error ? err.message : String(err)}`);
22
+ log.debug(`project remote: no git config for ${gitRoot}: ${errorMessage(err)}`);
23
23
  return null;
24
24
  }
25
25
  }
@@ -111,7 +111,7 @@ export function originRemoteId(gitRoot) {
111
111
  return url === null ? null : normaliseRemote(url);
112
112
  }
113
113
  catch (err) {
114
- log.debug(`project remote: ${file} not read: ${err instanceof Error ? err.message : String(err)}`);
114
+ log.debug(`project remote: ${file} not read: ${errorMessage(err)}`);
115
115
  return null;
116
116
  }
117
117
  }
@@ -131,7 +131,7 @@ export function projectFileId(root) {
131
131
  log.warn(`${file}: "id" must be a non-empty string with no colon, slash or spaces; using the remote or folder name instead`);
132
132
  }
133
133
  catch (err) {
134
- log.warn(`${file} not read: ${err instanceof Error ? err.message : String(err)}; using the remote or folder name instead`);
134
+ log.warn(`${file} not read: ${errorMessage(err)}; using the remote or folder name instead`);
135
135
  }
136
136
  return null;
137
137
  }