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
@@ -12,13 +12,18 @@
12
12
  * - Uses fetch directly so no SDK dependency.
13
13
  * - On failure (API error, bad response), the original memory is untouched.
14
14
  */
15
- import { Layer } from './memory.js';
16
- import { writeEntry } from './store/entry-writes.js';
17
- import { loadAllEntries, readEntry } from './store/entry-reads.js';
18
- import { redactSecretsStrict } from './secret-detect.js';
19
- import { fetchWithRetry, llmTimeoutMs } from './http-retry.js';
20
- import { log } from './log.js';
15
+ import { Layer } from '../core/memory.js';
16
+ import { writeEntry } from '../store/entry-writes.js';
17
+ import { loadAllEntries, readEntry } from '../store/entry-reads.js';
18
+ import { redactSecretsStrict } from '../util/secret-detect.js';
19
+ import { sendAnthropicMessage } from '../util/anthropic-messages.js';
20
+ import { log } from '../util/log.js';
21
+ const MAX_REFINE_SOURCES = 8;
22
+ const REFINE_SOURCE_CHARS = 400;
21
23
  const REFINED_TAG = 'llm-refined';
24
+ // Output budget for one refined memory, and the shortest reply kept as a refinement.
25
+ const REFINE_MAX_TOKENS = 800;
26
+ const REFINE_MIN_CHARS = 10;
22
27
  const CONSOLIDATED_MARKERS = [
23
28
  '[Consolidated from',
24
29
  '[Consolidated pattern from',
@@ -29,11 +34,9 @@ const CONSOLIDATED_MARKERS = [
29
34
  * `null` when the API call failed.
30
35
  */
31
36
  export async function refineSemanticMemory(merged, sources, opts) {
32
- const model = opts.model ?? 'claude-sonnet-4-6';
33
- const fetchFn = opts.fetcher ?? fetch;
34
37
  const sourceBlock = sources
35
- .slice(0, 8)
36
- .map((s, i) => `[source ${i + 1}] ${redactSecretsStrict(s.content).slice(0, 400)}`)
38
+ .slice(0, MAX_REFINE_SOURCES)
39
+ .map((s, i) => `[source ${i + 1}] ${redactSecretsStrict(s.content).slice(0, REFINE_SOURCE_CHARS)}`)
37
40
  .join('\n\n');
38
41
  const prompt = `You are refining a semantic memory in an agent's memory store. The rule-based consolidator merged several related episodic memories into one, but the output is clumsy. Produce a single coherent semantic memory that captures the underlying principle.
39
42
 
@@ -49,47 +52,29 @@ ${redactSecretsStrict(merged)}
49
52
 
50
53
  Source memories (up to 8 shown):
51
54
  ${sourceBlock}`;
52
- let res;
53
- try {
54
- res = await fetchWithRetry('https://api.anthropic.com/v1/messages', {
55
- method: 'POST',
56
- headers: {
57
- 'content-type': 'application/json',
58
- 'x-api-key': opts.apiKey,
59
- 'anthropic-version': '2023-06-01',
60
- },
61
- body: JSON.stringify({
62
- model,
63
- max_tokens: 800,
64
- messages: [{ role: 'user', content: prompt }],
65
- }),
66
- }, { timeoutMs: llmTimeoutMs(), fetchFn });
67
- }
68
- catch (err) {
69
- log.warn(`refine: request failed: ${err instanceof Error ? err.message : String(err)}`);
70
- return null;
71
- }
72
- if (!res.ok) {
73
- log.warn(`refine: API answered HTTP ${res.status}`);
74
- return null;
75
- }
76
- let text;
77
- try {
78
- // SAFETY: data is the Anthropic Messages API response body; the
79
- // documented response shape is `{ content: [{ type, text, ... }] }`
80
- // for a text-generating request like this one.
81
- const data = await res.json();
82
- text = data.content?.[0]?.text?.trim() ?? '';
83
- }
84
- catch (err) {
85
- log.warn(`refine: unreadable response: ${err instanceof Error ? err.message : String(err)}`);
55
+ const reply = await sendAnthropicMessage({
56
+ apiKey: opts.apiKey,
57
+ model: opts.model,
58
+ maxTokens: REFINE_MAX_TOKENS,
59
+ prompt,
60
+ fetcher: opts.fetcher,
61
+ });
62
+ if (!reply.ok) {
63
+ log.warn(describeRefineFailure(reply.failure));
86
64
  return null;
87
65
  }
88
- if (text.length < 10) {
66
+ if (reply.text.length < REFINE_MIN_CHARS) {
89
67
  log.warn('refine: response was empty or too short to use');
90
68
  return null;
91
69
  }
92
- return text;
70
+ return reply.text;
71
+ }
72
+ function describeRefineFailure(failure) {
73
+ switch (failure.kind) {
74
+ case 'request': return `refine: request failed: ${failure.message}`;
75
+ case 'http': return `refine: API answered HTTP ${failure.status}`;
76
+ case 'unreadable': return `refine: unreadable response: ${failure.message}`;
77
+ }
93
78
  }
94
79
  function isConsolidated(entry) {
95
80
  if (entry.layer !== Layer.Semantic)
@@ -125,43 +110,46 @@ export async function refineStore(hippoRoot, opts) {
125
110
  if (opts.limit !== undefined && processed >= opts.limit)
126
111
  break;
127
112
  processed++;
128
- // Best-effort: walk parents_json (schema v9) to fetch originals. When
129
- // parents aren't recorded we still refine using just the merged content.
130
- const sources = [];
131
- const parentIds = Array.isArray(entry.parents) ? entry.parents : [];
132
- for (const pid of parentIds) {
133
- // Parent lookup scoped by opts.tenantId when provided.
134
- // Cross-tenant parents return null and are silently skipped — refine
135
- // still produces output from the merged content alone (graceful
136
- // degradation rather than refuse-to-refine).
137
- const p = readEntry(hippoRoot, pid, opts.tenantId);
138
- if (p)
139
- sources.push(p);
140
- }
141
- const refined = await refineSemanticMemory(entry.content, sources, {
142
- apiKey: opts.apiKey,
143
- model: opts.model,
144
- fetcher: opts.fetcher,
145
- });
146
- if (refined === null) {
147
- result.failed++;
148
- result.details.push({ id: entry.id, status: 'failed', reason: 'api error or empty response' });
149
- continue;
150
- }
151
- if (opts.dryRun) {
152
- result.refined++;
153
- result.details.push({ id: entry.id, status: 'refined', reason: 'dry-run (no write)' });
154
- continue;
155
- }
156
- const updated = {
157
- ...entry,
158
- content: refined,
159
- tags: entry.tags.includes(REFINED_TAG) ? entry.tags : [...entry.tags, REFINED_TAG],
160
- };
161
- writeEntry(hippoRoot, updated);
162
- result.refined++;
163
- result.details.push({ id: entry.id, status: 'refined' });
113
+ await refineOneEntry(hippoRoot, entry, opts, result);
164
114
  }
165
115
  return result;
166
116
  }
117
+ async function refineOneEntry(hippoRoot, entry, opts, result) {
118
+ // Best-effort: walk parents_json (schema v9) to fetch originals. When
119
+ // parents aren't recorded we still refine using just the merged content.
120
+ const sources = [];
121
+ const parentIds = Array.isArray(entry.parents) ? entry.parents : [];
122
+ for (const pid of parentIds) {
123
+ // Parent lookup scoped by opts.tenantId when provided.
124
+ // Cross-tenant parents return null and are silently skipped — refine
125
+ // still produces output from the merged content alone (graceful
126
+ // degradation rather than refuse-to-refine).
127
+ const p = readEntry(hippoRoot, pid, opts.tenantId);
128
+ if (p)
129
+ sources.push(p);
130
+ }
131
+ const refined = await refineSemanticMemory(entry.content, sources, {
132
+ apiKey: opts.apiKey,
133
+ model: opts.model,
134
+ fetcher: opts.fetcher,
135
+ });
136
+ if (refined === null) {
137
+ result.failed++;
138
+ result.details.push({ id: entry.id, status: 'failed', reason: 'api error or empty response' });
139
+ return;
140
+ }
141
+ if (opts.dryRun) {
142
+ result.refined++;
143
+ result.details.push({ id: entry.id, status: 'refined', reason: 'dry-run (no write)' });
144
+ return;
145
+ }
146
+ const updated = {
147
+ ...entry,
148
+ content: refined,
149
+ tags: entry.tags.includes(REFINED_TAG) ? entry.tags : [...entry.tags, REFINED_TAG],
150
+ };
151
+ writeEntry(hippoRoot, updated);
152
+ result.refined++;
153
+ result.details.push({ id: entry.id, status: 'refined' });
154
+ }
167
155
  //# sourceMappingURL=refine-llm.js.map
@@ -1,6 +1,4 @@
1
- import { type CommandContext } from './shared.js';
2
- /** @internal Exported so tests/remember-origin-parity.test.ts runs the real direct write; not a stable public API. */
3
- export declare function cmdRemember(hippoRoot: string, text: string, flags: Record<string, string | boolean | string[]>): Promise<void>;
1
+ import { type CommandContext } from './flag-values.js';
4
2
  export declare function handleRemember({ hippoRoot, args, flags }: CommandContext): Promise<void>;
5
3
  export declare function handleSupersede({ hippoRoot, args, flags }: CommandContext): void;
6
4
  export declare function handleTrace({ hippoRoot, args, flags }: CommandContext): void;
@@ -1,28 +1,35 @@
1
1
  // The write verbs: `hippo remember`, `hippo supersede` and `hippo trace`.
2
- import { envAnthropicApiKey } from '../env.js';
3
- import { evalNow } from '../ablation.js';
2
+ import { envAnthropicApiKey } from '../util/env.js';
3
+ import { evalNow } from '../core/ablation.js';
4
4
  import * as fs from 'fs';
5
- import { createMemory, createSuccessor, calculateStrength, calculateRewardFactor, confidenceFacets, confidenceLabel, computeSchemaFit, Layer, } from '../memory.js';
5
+ import { createMemory, createSuccessor, calculateStrength, calculateRewardFactor, confidenceFacets, confidenceLabel, Layer, } from '../core/memory.js';
6
6
  import { isInitialized } from '../store/open.js';
7
7
  import { writeEntry } from '../store/entry-writes.js';
8
8
  import { readEntry, loadAllEntries } from '../store/entry-reads.js';
9
+ import { loadNewestEntries, schemaFitInStore } from '../store/candidates.js';
9
10
  import { updateStats } from '../store/index-and-stats.js';
10
11
  import { listMemoryConflicts } from '../store/conflicts.js';
11
- import { RejectedValueError } from '../rejection.js';
12
- import { renderTraceContent, parseSteps } from '../trace.js';
13
- import { embedMemory } from '../embeddings.js';
14
- import { loadConfig } from '../config.js';
15
- import { extractPathTags } from '../path-context.js';
16
- import { detectScope } from '../scope.js';
17
- import { assertClientScope } from '../recall-scope.js';
18
- import { getGlobalRoot, initGlobal } from '../shared.js';
19
- import { vetSecrets } from '../secret-detect.js';
20
- import * as client from '../client.js';
21
- import { resolveTenantId } from '../tenant.js';
22
- import { computeSalience } from '../salience.js';
23
- import { validateOwner, isStrictOwnerEnv } from '../owner-validation.js';
12
+ import { RejectedValueError } from '../store/rejection.js';
13
+ import { renderTraceContent, parseSteps } from '../consolidate/trace.js';
14
+ import { embedMemory } from '../store/embeddings/index.js';
15
+ import { loadConfig } from '../core/config.js';
16
+ import { extractPathTags } from '../search/path-context.js';
17
+ import { detectScope } from '../sharing/scope.js';
18
+ import { assertClientScope } from '../store/recall-scope.js';
19
+ import { getGlobalRoot, initGlobal } from '../sharing/shared.js';
20
+ import { vetSecrets } from '../util/secret-detect.js';
21
+ import * as client from './client.js';
22
+ import { resolveTenantId } from '../store/tenant.js';
23
+ import { computeSalience } from '../core/salience.js';
24
+ import { validateOwner, isStrictOwnerEnv } from './owner-validation.js';
24
25
  import { printError } from './output.js';
25
- import { emitCliAudit, requireInit, runViaServerIfAvailable, fmt } from './shared.js';
26
+ import { emitCliAudit, requireInit, runViaServerIfAvailable } from './shared.js';
27
+ import { fmt } from './print.js';
28
+ import { boolFlag, flagIsTrue, stringFlag } from './flag-values.js';
29
+ import { DAY_MS } from '../util/time.js';
30
+ import { errorMessage } from '../util/log.js';
31
+ const PARENT_PREVIEW_CHARS = 70;
32
+ const DETAIL_CONTENT_CHARS = 160;
26
33
  // Shared by the direct write and the routed request so both store the same tags.
27
34
  function rememberTags(flags, cwd) {
28
35
  const requested = Array.isArray(flags['tag']) ? [...flags['tag']] : [];
@@ -54,7 +61,7 @@ function rememberConfidence(flags) {
54
61
  return confidence;
55
62
  }
56
63
  function parseKindFlag(flags) {
57
- const kindFlagRaw = typeof flags['kind'] === 'string' ? flags['kind'] : undefined;
64
+ const kindFlagRaw = stringFlag(flags, 'kind');
58
65
  const kindFlag = kindFlagRaw === undefined ? undefined : kindFlagRaw.toLowerCase();
59
66
  // CLI surface intentionally restricted: 'raw' is reserved for ingestion connectors
60
67
  // that route deletions through archiveRawMemory. Existing
@@ -71,7 +78,7 @@ function parseKindFlag(flags) {
71
78
  }
72
79
  function parseRememberEnvelope(flags) {
73
80
  const kind = parseKindFlag(flags);
74
- const ownerRaw = typeof flags['owner'] === 'string' ? flags['owner'] : null;
81
+ const ownerRaw = stringFlag(flags, 'owner') ?? null;
75
82
  const ownerCheck = validateOwner(ownerRaw, { strict: isStrictOwnerEnv() });
76
83
  if (!ownerCheck.ok) {
77
84
  printError(ownerCheck.message);
@@ -80,14 +87,13 @@ function parseRememberEnvelope(flags) {
80
87
  if (ownerCheck.message)
81
88
  printError(ownerCheck.message);
82
89
  const owner = ownerCheck.value ?? null;
83
- const artifactRef = typeof flags['artifact-ref'] === 'string' ? flags['artifact-ref'] : null;
84
- const scope = typeof flags['scope'] === 'string' ? flags['scope'].trim() || null : null;
90
+ const artifactRef = stringFlag(flags, 'artifact-ref') ?? null;
91
+ const scope = stringFlag(flags, 'scope')?.trim() || null;
85
92
  assertClientScope(scope);
86
93
  return { kind, owner, artifactRef, scope };
87
94
  }
88
- /** @internal Exported so tests/remember-origin-parity.test.ts runs the real direct write; not a stable public API. */
89
- export async function cmdRemember(hippoRoot, text, flags) {
90
- const useGlobal = Boolean(flags['global']);
95
+ async function cmdRemember(hippoRoot, text, flags) {
96
+ const useGlobal = boolFlag(flags, 'global');
91
97
  const targetRoot = useGlobal ? getGlobalRoot() : hippoRoot;
92
98
  if (useGlobal) {
93
99
  initGlobal();
@@ -98,8 +104,7 @@ export async function cmdRemember(hippoRoot, text, flags) {
98
104
  const { requested: requestedTags, all: allTags } = rememberTags(flags, process.cwd());
99
105
  const confidence = rememberConfidence(flags);
100
106
  // Schema fit needs the store, which the routed request has no access to, so it stays here.
101
- const existing = loadAllEntries(targetRoot, resolveTenantId({}));
102
- const schemaFit = computeSchemaFit(text, requestedTags, existing);
107
+ const schemaFit = schemaFitInStore(targetRoot, resolveTenantId({}), text, requestedTags);
103
108
  const envelope = parseRememberEnvelope(flags);
104
109
  // Stamp tenant_id from env (HIPPO_TENANT) so recall isolation can filter on this row; unauthenticated CLI gets 'default'.
105
110
  const tenantId = resolveTenantId({});
@@ -107,7 +112,7 @@ export async function cmdRemember(hippoRoot, text, flags) {
107
112
  const entry = createMemory(text, {
108
113
  layer: Layer.Episodic,
109
114
  tags: allTags,
110
- pinned: Boolean(flags['pin']),
115
+ pinned: boolFlag(flags, 'pin'),
111
116
  source: useGlobal ? 'cli-global' : 'cli',
112
117
  confidence,
113
118
  schema_fit: schemaFit,
@@ -118,7 +123,7 @@ export async function cmdRemember(hippoRoot, text, flags) {
118
123
  tenantId,
119
124
  baseHalfLifeDays: rememberConfig.defaultHalfLifeDays,
120
125
  });
121
- if (!passesSalienceGate(entry, text, existing, rememberConfig, flags))
126
+ if (!passesSalienceGate(entry, text, targetRoot, rememberConfig, flags))
122
127
  return;
123
128
  writeEntry(targetRoot, entry);
124
129
  updateStats(targetRoot, { remembered: 1 });
@@ -127,10 +132,15 @@ export async function cmdRemember(hippoRoot, text, flags) {
127
132
  await extractRememberFacts(targetRoot, entry, flags);
128
133
  }
129
134
  /** False when the gate skips the write; a start_weak verdict weakens `entry` in place. */
130
- function passesSalienceGate(entry, text, existing, rememberConfig, flags) {
131
- if (!rememberConfig.salience.enabled || Boolean(flags['pin']) || Boolean(flags['force']))
135
+ function passesSalienceGate(entry, text, targetRoot, rememberConfig, flags) {
136
+ if (!rememberConfig.salience.enabled || boolFlag(flags, 'pin') || boolFlag(flags, 'force'))
132
137
  return true;
133
- const salienceResult = computeSalience(text, entry.tags, existing, {
138
+ // computeSalience compares against the last `recentWindow` rows only; below 1 its slice takes every row, so that case still loads them all.
139
+ const window = Math.trunc(rememberConfig.salience.recentWindow);
140
+ const recent = Number.isSafeInteger(window) && window >= 1
141
+ ? loadNewestEntries(targetRoot, entry.tenantId, window)
142
+ : loadAllEntries(targetRoot, entry.tenantId);
143
+ const salienceResult = computeSalience(text, entry.tags, recent, {
134
144
  recentWindow: rememberConfig.salience.recentWindow,
135
145
  overlapThreshold: rememberConfig.salience.overlapThreshold,
136
146
  minContentLength: rememberConfig.salience.minContentLength,
@@ -164,7 +174,7 @@ async function extractRememberFacts(targetRoot, entry, flags) {
164
174
  const apiKey = envAnthropicApiKey() ?? '';
165
175
  if (shouldExtract && apiKey) {
166
176
  try {
167
- const { extractFacts, storeExtractedFacts } = await import('../extract.js');
177
+ const { extractFacts, storeExtractedFacts } = await import('../learn/extract.js');
168
178
  const facts = await extractFacts(entry.content, {
169
179
  apiKey,
170
180
  model: config.extraction.model,
@@ -177,13 +187,33 @@ async function extractRememberFacts(targetRoot, entry, flags) {
177
187
  }
178
188
  catch (err) {
179
189
  // Extraction is best-effort: report it, never block remember.
180
- printError(` (extraction failed: ${err instanceof Error ? err.message : String(err)})`);
190
+ printError(` (extraction failed: ${errorMessage(err)})`);
181
191
  }
182
192
  }
183
193
  else if (shouldExtract && !apiKey) {
184
194
  printError(' (extraction skipped: ANTHROPIC_API_KEY not set)');
185
195
  }
186
196
  }
197
+ function supersedeTags(flags) {
198
+ const rawTags = flags['tag'];
199
+ return Array.isArray(rawTags)
200
+ ? rawTags.map((t) => String(t))
201
+ : typeof rawTags === 'string'
202
+ ? rawTags.split(',').map((t) => t.trim()).filter(Boolean)
203
+ : undefined;
204
+ }
205
+ function writeSuccessor(hippoRoot, newEntry) {
206
+ try {
207
+ writeEntry(hippoRoot, newEntry);
208
+ }
209
+ catch (err) {
210
+ if (err instanceof RejectedValueError) {
211
+ printError(`Error: ${err.message}`);
212
+ process.exit(1);
213
+ }
214
+ throw err;
215
+ }
216
+ }
187
217
  function cmdSupersede(hippoRoot, oldId, newContent, flags) {
188
218
  requireInit(hippoRoot);
189
219
  const old = readEntry(hippoRoot, oldId, resolveTenantId({}));
@@ -195,14 +225,9 @@ function cmdSupersede(hippoRoot, oldId, newContent, flags) {
195
225
  printError(`Error: memory ${oldId} is already superseded by ${old.superseded_by}. Supersede that one instead.`);
196
226
  process.exit(1);
197
227
  }
198
- const layer = typeof flags['layer'] === 'string' ? flags['layer'] : undefined;
199
- const rawTags = flags['tag'];
200
- const tags = Array.isArray(rawTags)
201
- ? rawTags.map((t) => String(t))
202
- : typeof rawTags === 'string'
203
- ? rawTags.split(',').map((t) => t.trim()).filter(Boolean)
204
- : undefined;
205
- const pinned = flags['pin'] === true || old.pinned;
228
+ const layer = stringFlag(flags, 'layer');
229
+ const tags = supersedeTags(flags);
230
+ const pinned = flagIsTrue(flags, 'pin') || old.pinned;
206
231
  const newEntry = createSuccessor(old, newContent, {
207
232
  tenantId: old.tenantId,
208
233
  baseHalfLifeDays: loadConfig(hippoRoot).defaultHalfLifeDays,
@@ -212,21 +237,29 @@ function cmdSupersede(hippoRoot, oldId, newContent, flags) {
212
237
  });
213
238
  // Write the SUCCESSOR first: a rejection-guard refusal then mutates nothing, and an old-row failure leaves an
214
239
  // orphan successor rather than a dangling pointer. Unlike api.supersede this path is two non-atomic writes.
215
- try {
216
- writeEntry(hippoRoot, newEntry);
217
- }
218
- catch (err) {
219
- if (err instanceof RejectedValueError) {
220
- printError(`Error: ${err.message}`);
221
- process.exit(1);
222
- }
223
- throw err;
224
- }
240
+ writeSuccessor(hippoRoot, newEntry);
225
241
  old.superseded_by = newEntry.id;
226
242
  writeEntry(hippoRoot, old);
227
243
  emitCliAudit(hippoRoot, 'supersede', oldId, { newId: newEntry.id });
228
244
  console.log(`Superseded ${oldId} → ${newEntry.id}`);
229
245
  }
246
+ function parseStepsOrExit(stepsJson) {
247
+ try {
248
+ return parseSteps(stepsJson);
249
+ }
250
+ catch (err) {
251
+ printError(errorMessage(err));
252
+ process.exit(1);
253
+ }
254
+ }
255
+ function traceTags(flags) {
256
+ const rawTags = flags['tag'];
257
+ return Array.isArray(rawTags)
258
+ ? rawTags.map((t) => String(t))
259
+ : rawTags !== undefined
260
+ ? [String(rawTags)]
261
+ : [];
262
+ }
230
263
  function cmdTraceRecord(hippoRoot, flags) {
231
264
  requireInit(hippoRoot);
232
265
  const task = String(flags['task'] ?? '').trim();
@@ -241,21 +274,9 @@ function cmdTraceRecord(hippoRoot, flags) {
241
274
  printError(`Invalid outcome: "${outcome}". Must be one of: ${validOutcomes.join(', ')}.`);
242
275
  process.exit(1);
243
276
  }
244
- let steps;
245
- try {
246
- steps = parseSteps(stepsJson);
247
- }
248
- catch (err) {
249
- printError(String(err instanceof Error ? err.message : err));
250
- process.exit(1);
251
- }
277
+ const steps = parseStepsOrExit(stepsJson);
252
278
  const sessionId = String(flags['session'] ?? '').trim() || null;
253
- const rawTags = flags['tag'];
254
- const tags = Array.isArray(rawTags)
255
- ? rawTags.map((t) => String(t))
256
- : rawTags !== undefined
257
- ? [String(rawTags)]
258
- : [];
279
+ const tags = traceTags(flags);
259
280
  const content = renderTraceContent({
260
281
  task,
261
282
  steps,
@@ -275,7 +296,7 @@ function cmdTraceRecord(hippoRoot, flags) {
275
296
  }
276
297
  function cmdTrace(hippoRoot, id, flags) {
277
298
  requireInit(hippoRoot);
278
- const asJson = Boolean(flags['json']);
299
+ const asJson = boolFlag(flags, 'json');
279
300
  const tenantId = resolveTenantId({});
280
301
  // Look in local store first, then global.
281
302
  let entry = readEntry(hippoRoot, id, tenantId);
@@ -307,13 +328,13 @@ function traceStats(entry) {
307
328
  const rewardFactor = calculateRewardFactor(entry);
308
329
  const effHalfLife = halfLife * rewardFactor;
309
330
  const createdMs = new Date(entry.created).getTime();
310
- const ageDays = (now.getTime() - createdMs) / 86_400_000;
331
+ const ageDays = (now.getTime() - createdMs) / DAY_MS;
311
332
  const lastMs = new Date(entry.last_retrieved).getTime();
312
- const sinceLast = (now.getTime() - lastMs) / 86_400_000;
333
+ const sinceLast = (now.getTime() - lastMs) / DAY_MS;
313
334
  const facets = confidenceFacets(entry, now);
314
335
  const conf = confidenceLabel(entry, now).text;
315
336
  // Projected strength: same decay curve, just push `now` out.
316
- const projectedAt = (days) => calculateStrength(entry, new Date(now.getTime() + days * 86_400_000));
337
+ const projectedAt = (days) => calculateStrength(entry, new Date(now.getTime() + days * DAY_MS));
317
338
  return { strength, halfLife, rewardFactor, effHalfLife, ageDays, sinceLast, facets, conf, projectedAt };
318
339
  }
319
340
  function traceLineage(hippoRoot, globalRoot, entry, id, tenantId) {
@@ -321,7 +342,7 @@ function traceLineage(hippoRoot, globalRoot, entry, id, tenantId) {
321
342
  const parents = Array.isArray(entry.parents) ? entry.parents : [];
322
343
  const parentPreviews = parents.map((pid) => {
323
344
  const p = readEntry(hippoRoot, pid, tenantId) ?? (isInitialized(globalRoot) ? readEntry(globalRoot, pid, tenantId) : null);
324
- return { id: pid, content: p ? p.content.replace(/\s+/g, ' ').slice(0, 70) : '(not found)' };
345
+ return { id: pid, content: p ? p.content.replace(/\s+/g, ' ').slice(0, PARENT_PREVIEW_CHARS) : '(not found)' };
325
346
  });
326
347
  // Open conflicts involving this memory.
327
348
  const allConflicts = [
@@ -365,7 +386,7 @@ function printTraceText(t) {
365
386
  const { parentPreviews, myConflicts } = t;
366
387
  console.log(`Memory: ${entry.id} [${sourceLabel}]`);
367
388
  console.log('='.repeat(50));
368
- console.log(`Content: ${entry.content.replace(/\s+/g, ' ').slice(0, 160)}${entry.content.length > 160 ? '...' : ''}`);
389
+ console.log(`Content: ${entry.content.replace(/\s+/g, ' ').slice(0, DETAIL_CONTENT_CHARS)}${entry.content.length > DETAIL_CONTENT_CHARS ? '...' : ''}`);
369
390
  console.log(`Layer: ${entry.layer.padEnd(10)} Confidence: ${conf.padEnd(14)} Pinned: ${entry.pinned ? 'yes' : 'no'}${entry.starred ? ' Starred: yes' : ''}`);
370
391
  console.log(`Tags: ${entry.tags.join(', ') || '(none)'}`);
371
392
  console.log(`Created: ${entry.created} (${fmt(ageDays, 1)} days ago)`);
@@ -418,40 +439,40 @@ export async function handleRemember({ hippoRoot, args, flags }) {
418
439
  const richFlag = flags['pin'] || flags['global'] || flags['extract'] || flags['force'] ||
419
440
  flags['observed'] || flags['inferred'] || flags['verified'] ||
420
441
  flags['layer'] !== undefined;
421
- if (!richFlag) {
422
- const rememberKindRaw = typeof flags['kind'] === 'string' ? flags['kind'].toLowerCase() : undefined;
423
- const rememberKindAllowed = ['distilled', 'superseded'];
424
- if (rememberKindRaw === undefined || rememberKindAllowed.includes(rememberKindRaw)) {
425
- const tags = rememberTags(flags, process.cwd()).all;
426
- // Validate --owner on the thin-client path too, so validation is the same whether or not a server is up.
427
- const thinOwnerRaw = typeof flags['owner'] === 'string' ? flags['owner'] : undefined;
428
- const thinOwnerCheck = validateOwner(thinOwnerRaw, { strict: isStrictOwnerEnv() });
429
- if (!thinOwnerCheck.ok) {
430
- printError(thinOwnerCheck.message);
431
- process.exit(1);
432
- }
433
- if (thinOwnerCheck.message)
434
- printError(thinOwnerCheck.message);
435
- const remembered = await runViaServerIfAvailable(hippoRoot, async (info, apiKey) => {
436
- const result = await client.remember(info.url, apiKey, {
437
- content: text,
438
- kind: rememberKindRaw,
439
- scope: typeof flags['scope'] === 'string' ? flags['scope'] : undefined,
440
- owner: thinOwnerCheck.value,
441
- artifactRef: typeof flags['artifact-ref'] === 'string' ? flags['artifact-ref'] : undefined,
442
- tags,
443
- });
444
- console.log(`Remembered [${result.id}] (via ${info.url})`);
445
- console.log(` Kind: ${result.kind} | Tenant: ${result.tenantId}`);
446
- for (const w of result.warnings ?? [])
447
- printError(`Warning: ${w}`);
448
- });
449
- if (remembered)
450
- return;
451
- }
452
- }
442
+ if (!richFlag && await rememberViaThinClient(hippoRoot, text, flags))
443
+ return;
453
444
  await cmdRemember(hippoRoot, text, flags);
454
445
  }
446
+ async function rememberViaThinClient(hippoRoot, text, flags) {
447
+ const rememberKindRaw = stringFlag(flags, 'kind')?.toLowerCase();
448
+ const rememberKindAllowed = ['distilled', 'superseded'];
449
+ if (rememberKindRaw !== undefined && !rememberKindAllowed.includes(rememberKindRaw))
450
+ return false;
451
+ const tags = rememberTags(flags, process.cwd()).all;
452
+ // Validate --owner on the thin-client path too, so validation is the same whether or not a server is up.
453
+ const thinOwnerRaw = stringFlag(flags, 'owner');
454
+ const thinOwnerCheck = validateOwner(thinOwnerRaw, { strict: isStrictOwnerEnv() });
455
+ if (!thinOwnerCheck.ok) {
456
+ printError(thinOwnerCheck.message);
457
+ process.exit(1);
458
+ }
459
+ if (thinOwnerCheck.message)
460
+ printError(thinOwnerCheck.message);
461
+ return runViaServerIfAvailable(hippoRoot, async (info, apiKey) => {
462
+ const result = await client.remember(info.url, apiKey, {
463
+ content: text,
464
+ kind: rememberKindRaw,
465
+ scope: stringFlag(flags, 'scope'),
466
+ owner: thinOwnerCheck.value,
467
+ artifactRef: stringFlag(flags, 'artifact-ref'),
468
+ tags,
469
+ });
470
+ console.log(`Remembered [${result.id}] (via ${info.url})`);
471
+ console.log(` Kind: ${result.kind} | Tenant: ${result.tenantId}`);
472
+ for (const w of result.warnings ?? [])
473
+ printError(`Warning: ${w}`);
474
+ });
475
+ }
455
476
  export function handleSupersede({ hippoRoot, args, flags }) {
456
477
  const oldId = args[0];
457
478
  const newContent = args.slice(1).join(' ').trim();
@@ -15,7 +15,7 @@ export interface SchedulerFsDeps {
15
15
  existsSync: typeof fs.existsSync;
16
16
  readFileSync: typeof fs.readFileSync;
17
17
  mkdirSync: typeof fs.mkdirSync;
18
- writeFileSync: typeof fs.writeFileSync;
18
+ writeFile: (file: string, text: string) => void;
19
19
  renameSync: typeof fs.renameSync;
20
20
  }
21
21
  /** Test-only override. Not part of this module's public API surface. */
@@ -28,6 +28,8 @@ export declare function listRegisteredWorkspaces(globalRoot: string): string[];
28
28
  export declare function buildDailyRunnerCommand(projectDir: string, platform?: NodeJS.Platform): string;
29
29
  /** What the Windows task runs. A plain `cmd /c` task opens a visible console every morning. */
30
30
  export declare function buildWindowsTaskRun(cmd: string): string;
31
+ /** `text` for the inside of one double-quoted Windows argument: a backslash run before a quote or the end doubles, so no quote ends the argument early. */
32
+ export declare function quoteInsideWindowsArg(text: string): string;
31
33
  /** Argv for `schtasks`, passed without a shell: through cmd.exe the `&&` in /tr split the command. */
32
34
  export declare function buildSchtasksCreateArgs(taskName: string, cmd: string): string[];
33
35
  export declare function runDailyMaintenance(workspaces: readonly string[], runCommand: (cwd: string, args: string[]) => void): void;
@@ -1,12 +1,14 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
- import { log } from './log.js';
3
+ import { errorMessage, log } from '../util/log.js';
4
+ import { writeFileAtomic } from '../util/atomic-write.js';
4
5
  export const DAILY_TASK_NAME = 'hippo-daily-runner';
5
6
  let fsDeps = {
6
7
  existsSync: fs.existsSync,
7
8
  readFileSync: fs.readFileSync,
8
9
  mkdirSync: fs.mkdirSync,
9
- writeFileSync: fs.writeFileSync,
10
+ // One rename, so a crash mid-save cannot leave a truncated registry that reads as corrupt.
11
+ writeFile: writeFileAtomic,
10
12
  renameSync: fs.renameSync,
11
13
  };
12
14
  /** Test-only override. Not part of this module's public API surface. */
@@ -34,7 +36,7 @@ export function loadWorkspaceRegistry(globalRoot) {
34
36
  text = fsDeps.readFileSync(registryPath, 'utf8');
35
37
  }
36
38
  catch (err) {
37
- log.warn(`workspace registry ${registryPath} could not be read (${err instanceof Error ? err.message : String(err)}); starting with no workspaces`);
39
+ log.warn(`workspace registry ${registryPath} could not be read (${errorMessage(err)}); starting with no workspaces`);
38
40
  return defaultRegistry();
39
41
  }
40
42
  try {
@@ -54,22 +56,22 @@ export function loadWorkspaceRegistry(globalRoot) {
54
56
  }
55
57
  }
56
58
  function setAsideCorruptRegistry(registryPath, err) {
57
- const reason = err instanceof Error ? err.message : String(err);
59
+ const reason = errorMessage(err);
58
60
  const aside = `${registryPath}.corrupt-${new Date().toISOString().replace(/[:.]/g, '-')}`;
59
61
  try {
60
62
  fsDeps.renameSync(registryPath, aside);
61
63
  log.warn(`workspace registry ${registryPath} is corrupt (${reason}); moved it to ${aside} and starting with no workspaces`);
62
64
  }
63
65
  catch (renameErr) {
64
- log.warn(`workspace registry ${registryPath} is corrupt (${reason}) and could not be moved aside (${renameErr instanceof Error ? renameErr.message : String(renameErr)}); starting with no workspaces`);
66
+ log.warn(`workspace registry ${registryPath} is corrupt (${reason}) and could not be moved aside (${errorMessage(renameErr)}); starting with no workspaces`);
65
67
  }
66
68
  }
67
69
  export function saveWorkspaceRegistry(globalRoot, registry) {
68
70
  fsDeps.mkdirSync(globalRoot, { recursive: true, mode: 0o700 });
69
- fsDeps.writeFileSync(workspaceRegistryPath(globalRoot), JSON.stringify({
71
+ fsDeps.writeFile(workspaceRegistryPath(globalRoot), JSON.stringify({
70
72
  version: 1,
71
73
  workspaces: [...new Set(registry.workspaces.map(normalizeWorkspace))].sort(),
72
- }, null, 2) + '\n', 'utf8');
74
+ }, null, 2) + '\n');
73
75
  }
74
76
  export function registerWorkspace(globalRoot, projectDir) {
75
77
  const registry = loadWorkspaceRegistry(globalRoot);
@@ -92,6 +94,10 @@ export function buildDailyRunnerCommand(projectDir, platform = process.platform)
92
94
  export function buildWindowsTaskRun(cmd) {
93
95
  return `conhost.exe --headless cmd /c ${cmd}`;
94
96
  }
97
+ /** `text` for the inside of one double-quoted Windows argument: a backslash run before a quote or the end doubles, so no quote ends the argument early. */
98
+ export function quoteInsideWindowsArg(text) {
99
+ return text.replace(/(\\*)"/g, '$1$1\\"').replace(/\\+$/, '$&$&');
100
+ }
95
101
  /** Argv for `schtasks`, passed without a shell: through cmd.exe the `&&` in /tr split the command. */
96
102
  export function buildSchtasksCreateArgs(taskName, cmd) {
97
103
  return ['/create', '/tn', taskName, '/tr', buildWindowsTaskRun(cmd), '/sc', 'daily', '/st', '06:15', '/f'];
@@ -1,4 +1,4 @@
1
- import { type CommandContext } from './shared.js';
1
+ import { type CommandContext } from './flag-values.js';
2
2
  export declare function handleDashboard({ hippoRoot, flags }: CommandContext): Promise<void>;
3
3
  export declare function handleMcp(): Promise<void>;
4
4
  export declare function handleServe({ hippoRoot, flags }: CommandContext): Promise<void>;