hippo-memory 1.70.0 → 1.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-memories/claude-code.d.ts +4 -2
  3. package/dist/agent-memories/claude-code.js +14 -5
  4. package/dist/agent-memories/files.js +23 -12
  5. package/dist/agent-memories/markdown.d.ts +1 -3
  6. package/dist/agent-memories/markdown.js +1 -3
  7. package/dist/agent-memories/report.js +2 -1
  8. package/dist/agent-memories/sync.d.ts +4 -2
  9. package/dist/agent-memories/sync.js +10 -5
  10. package/dist/api/assemble.d.ts +7 -44
  11. package/dist/api/assemble.js +2 -22
  12. package/dist/api/audit.d.ts +5 -1
  13. package/dist/api/audit.js +9 -1
  14. package/dist/api/auth.d.ts +13 -22
  15. package/dist/api/auth.js +34 -24
  16. package/dist/api/auto-sleep.js +2 -2
  17. package/dist/api/availability.d.ts +2 -15
  18. package/dist/api/availability.js +2 -15
  19. package/dist/api/context-select.js +3 -4
  20. package/dist/api/context-types.d.ts +10 -35
  21. package/dist/api/context.d.ts +5 -22
  22. package/dist/api/context.js +21 -38
  23. package/dist/api/dormant.d.ts +5 -21
  24. package/dist/api/dormant.js +7 -26
  25. package/dist/api/drill-down.d.ts +7 -46
  26. package/dist/api/drill-down.js +5 -26
  27. package/dist/api/forget.d.ts +5 -24
  28. package/dist/api/forget.js +5 -28
  29. package/dist/api/graph.d.ts +8 -0
  30. package/dist/api/graph.js +7 -0
  31. package/dist/api/index.d.ts +2 -0
  32. package/dist/api/index.js +2 -0
  33. package/dist/api/instruction-detect.js +16 -5
  34. package/dist/api/ledger-db.d.ts +2 -1
  35. package/dist/api/ledger-db.js +5 -3
  36. package/dist/api/memories.d.ts +5 -0
  37. package/dist/api/memories.js +7 -0
  38. package/dist/api/objects.d.ts +9 -0
  39. package/dist/api/objects.js +11 -0
  40. package/dist/api/on-store.js +5 -3
  41. package/dist/api/predictions.d.ts +9 -0
  42. package/dist/api/predictions.js +18 -0
  43. package/dist/api/promote.d.ts +13 -17
  44. package/dist/api/promote.js +11 -19
  45. package/dist/api/prompt-hook.d.ts +4 -4
  46. package/dist/api/prompt-hook.js +10 -9
  47. package/dist/api/recall-cli.d.ts +55 -0
  48. package/dist/api/recall-cli.js +94 -0
  49. package/dist/api/recall-core.js +14 -6
  50. package/dist/api/recall-finish.d.ts +53 -0
  51. package/dist/api/recall-finish.js +30 -0
  52. package/dist/api/recall-history.d.ts +17 -84
  53. package/dist/api/recall-history.js +15 -88
  54. package/dist/api/recall-pipeline.d.ts +2 -3
  55. package/dist/api/recall-pipeline.js +16 -9
  56. package/dist/api/recall-types.d.ts +64 -304
  57. package/dist/api/recall.d.ts +5 -33
  58. package/dist/api/recall.js +59 -60
  59. package/dist/api/refine.d.ts +7 -0
  60. package/dist/api/refine.js +10 -0
  61. package/dist/api/remember-local.d.ts +57 -0
  62. package/dist/api/remember-local.js +90 -0
  63. package/dist/api/remember.d.ts +18 -1
  64. package/dist/api/remember.js +13 -1
  65. package/dist/api/sleep-run.d.ts +1 -3
  66. package/dist/api/sleep-run.js +17 -21
  67. package/dist/api/sleep.d.ts +9 -28
  68. package/dist/api/tokens.d.ts +3 -10
  69. package/dist/api/tokens.js +3 -10
  70. package/dist/api/types.d.ts +6 -29
  71. package/dist/api/types.js +4 -22
  72. package/dist/capture/command.d.ts +4 -12
  73. package/dist/capture/command.js +6 -22
  74. package/dist/capture/compact.d.ts +4 -15
  75. package/dist/capture/compact.js +16 -25
  76. package/dist/capture/compaction-record.js +101 -69
  77. package/dist/capture/compaction-spool.d.ts +1 -1
  78. package/dist/capture/compaction-spool.js +1 -1
  79. package/dist/capture/session-digest.d.ts +1 -1
  80. package/dist/capture/session-digest.js +13 -7
  81. package/dist/capture/transcript.d.ts +2 -10
  82. package/dist/capture/transcript.js +4 -18
  83. package/dist/cli/api-context.d.ts +3 -0
  84. package/dist/cli/api-context.js +6 -0
  85. package/dist/cli/audit-prune.d.ts +6 -39
  86. package/dist/cli/audit-prune.js +6 -39
  87. package/dist/cli/audit.d.ts +1 -1
  88. package/dist/cli/audit.js +33 -34
  89. package/dist/cli/auth.d.ts +2 -2
  90. package/dist/cli/auth.js +57 -39
  91. package/dist/cli/briefs.d.ts +4 -4
  92. package/dist/cli/briefs.js +18 -22
  93. package/dist/cli/card.d.ts +2 -2
  94. package/dist/cli/card.js +31 -32
  95. package/dist/cli/client.d.ts +7 -27
  96. package/dist/cli/client.js +24 -43
  97. package/dist/cli/compact-resume-payload.js +3 -2
  98. package/dist/cli/context.d.ts +1 -2
  99. package/dist/cli/context.js +12 -8
  100. package/dist/cli/continuity.d.ts +6 -6
  101. package/dist/cli/continuity.js +62 -64
  102. package/dist/cli/correction-latency.d.ts +2 -14
  103. package/dist/cli/correction-latency.js +2 -14
  104. package/dist/cli/curate.d.ts +13 -17
  105. package/dist/cli/curate.js +68 -92
  106. package/dist/cli/dag.d.ts +4 -4
  107. package/dist/cli/dag.js +33 -27
  108. package/dist/cli/decisions.d.ts +4 -4
  109. package/dist/cli/decisions.js +33 -47
  110. package/dist/cli/eval.js +15 -13
  111. package/dist/cli/exit.d.ts +6 -0
  112. package/dist/cli/exit.js +11 -0
  113. package/dist/cli/explain.d.ts +1 -2
  114. package/dist/cli/explain.js +6 -4
  115. package/dist/cli/flag-values.d.ts +6 -1
  116. package/dist/cli/flag-values.js +27 -10
  117. package/dist/cli/flags.d.ts +1 -0
  118. package/dist/cli/flags.js +1 -1
  119. package/dist/cli/github.d.ts +14 -0
  120. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  121. package/dist/cli/goals.d.ts +2 -2
  122. package/dist/cli/goals.js +46 -50
  123. package/dist/cli/hook-runtime.d.ts +9 -27
  124. package/dist/cli/hook-runtime.js +15 -31
  125. package/dist/cli/init.d.ts +2 -2
  126. package/dist/cli/init.js +6 -12
  127. package/dist/cli/install-steps.js +3 -12
  128. package/dist/cli/last-sleep.d.ts +2 -1
  129. package/dist/cli/last-sleep.js +3 -0
  130. package/dist/cli/maintenance.d.ts +4 -4
  131. package/dist/cli/maintenance.js +14 -19
  132. package/dist/cli/object-verbs.js +4 -3
  133. package/dist/cli/owner-validation.d.ts +5 -28
  134. package/dist/cli/owner-validation.js +5 -28
  135. package/dist/cli/playbooks.d.ts +4 -4
  136. package/dist/cli/playbooks.js +23 -28
  137. package/dist/cli/print.d.ts +2 -5
  138. package/dist/cli/print.js +1 -4
  139. package/dist/cli/projects.d.ts +2 -2
  140. package/dist/cli/projects.js +1 -3
  141. package/dist/cli/provenance-coverage.d.ts +2 -6
  142. package/dist/cli/provenance-coverage.js +2 -6
  143. package/dist/cli/quality-repair-once.js +2 -2
  144. package/dist/cli/recall.d.ts +2 -4
  145. package/dist/cli/recall.js +55 -131
  146. package/dist/cli/refine-llm.d.ts +5 -31
  147. package/dist/cli/refine-llm.js +9 -36
  148. package/dist/cli/remember.d.ts +3 -3
  149. package/dist/cli/remember.js +122 -180
  150. package/dist/cli/scheduler.d.ts +2 -17
  151. package/dist/cli/scheduler.js +12 -18
  152. package/dist/cli/serve.js +21 -12
  153. package/dist/cli/session-hooks.d.ts +10 -18
  154. package/dist/cli/session-hooks.js +112 -113
  155. package/dist/cli/setup.d.ts +4 -4
  156. package/dist/cli/setup.js +19 -21
  157. package/dist/cli/shared.d.ts +9 -23
  158. package/dist/cli/shared.js +9 -32
  159. package/dist/cli/slack.d.ts +2 -2
  160. package/dist/cli/slack.js +19 -23
  161. package/dist/cli/sleep.d.ts +3 -2
  162. package/dist/cli/sleep.js +15 -16
  163. package/dist/cli/status.d.ts +9 -12
  164. package/dist/cli/status.js +55 -98
  165. package/dist/cli/stdin.d.ts +4 -6
  166. package/dist/cli/stdin.js +2 -3
  167. package/dist/cli/transfer.d.ts +9 -9
  168. package/dist/cli/transfer.js +66 -89
  169. package/dist/cli/usage.js +11 -5
  170. package/dist/cli.d.ts +66 -448
  171. package/dist/cli.js +87 -263
  172. package/dist/connectors/github/backfill.d.ts +5 -25
  173. package/dist/connectors/github/backfill.js +14 -49
  174. package/dist/connectors/github/deletion.d.ts +4 -18
  175. package/dist/connectors/github/deletion.js +2 -15
  176. package/dist/connectors/github/dlq.d.ts +8 -33
  177. package/dist/connectors/github/dlq.js +12 -29
  178. package/dist/connectors/github/ingest.d.ts +2 -6
  179. package/dist/connectors/github/ingest.js +4 -10
  180. package/dist/connectors/github/octokit-client.d.ts +4 -16
  181. package/dist/connectors/github/octokit-client.js +27 -24
  182. package/dist/connectors/github/ratelimit.d.ts +3 -14
  183. package/dist/connectors/github/ratelimit.js +3 -14
  184. package/dist/connectors/github/scope.d.ts +3 -5
  185. package/dist/connectors/github/scope.js +3 -5
  186. package/dist/connectors/github/signature.d.ts +4 -26
  187. package/dist/connectors/github/signature.js +4 -26
  188. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  189. package/dist/connectors/github/tenant-routing.js +4 -26
  190. package/dist/connectors/github/transform.js +2 -16
  191. package/dist/connectors/github/types.d.ts +3 -15
  192. package/dist/connectors/github/types.js +2 -9
  193. package/dist/connectors/github/webhook.d.ts +2 -16
  194. package/dist/connectors/github/webhook.js +6 -22
  195. package/dist/connectors/slack/backfill.d.ts +4 -17
  196. package/dist/connectors/slack/backfill.js +4 -13
  197. package/dist/connectors/slack/dlq.d.ts +2 -19
  198. package/dist/connectors/slack/dlq.js +2 -19
  199. package/dist/connectors/slack/ingest.d.ts +2 -3
  200. package/dist/connectors/slack/ingest.js +2 -3
  201. package/dist/connectors/slack/scope.d.ts +2 -8
  202. package/dist/connectors/slack/scope.js +2 -8
  203. package/dist/connectors/slack/signature.d.ts +1 -6
  204. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  205. package/dist/connectors/slack/tenant-routing.js +2 -21
  206. package/dist/connectors/slack/transform.d.ts +2 -18
  207. package/dist/connectors/slack/transform.js +2 -18
  208. package/dist/connectors/slack/types.d.ts +3 -9
  209. package/dist/connectors/slack/types.js +2 -4
  210. package/dist/connectors/slack/web-client.js +33 -27
  211. package/dist/connectors/slack/webhook.d.ts +2 -19
  212. package/dist/connectors/slack/webhook.js +5 -26
  213. package/dist/connectors/slack/workspaces.d.ts +4 -24
  214. package/dist/connectors/slack/workspaces.js +4 -24
  215. package/dist/consolidate/conflicts.js +6 -14
  216. package/dist/consolidate/dag-summary.d.ts +8 -0
  217. package/dist/consolidate/dag-summary.js +41 -0
  218. package/dist/consolidate/dag.d.ts +5 -28
  219. package/dist/consolidate/dag.js +14 -75
  220. package/dist/consolidate/decay.js +7 -19
  221. package/dist/consolidate/dedupe.d.ts +6 -52
  222. package/dist/consolidate/dedupe.js +13 -71
  223. package/dist/consolidate/flush-units.d.ts +3 -4
  224. package/dist/consolidate/flush-units.js +3 -3
  225. package/dist/consolidate/half-life-migration.d.ts +3 -26
  226. package/dist/consolidate/half-life-migration.js +11 -28
  227. package/dist/consolidate/llm-passes.js +4 -21
  228. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  229. package/dist/consolidate/memory-value-weights.js +2 -13
  230. package/dist/consolidate/memory-value.d.ts +11 -84
  231. package/dist/consolidate/memory-value.js +16 -104
  232. package/dist/consolidate/merge.js +10 -31
  233. package/dist/consolidate/merged-row.js +2 -1
  234. package/dist/consolidate/physics-pass.js +1 -3
  235. package/dist/consolidate/replay.d.ts +6 -38
  236. package/dist/consolidate/replay.js +14 -52
  237. package/dist/consolidate/run.js +1 -1
  238. package/dist/consolidate/sleep.d.ts +1 -8
  239. package/dist/consolidate/sleep.js +5 -17
  240. package/dist/consolidate/trace.d.ts +3 -18
  241. package/dist/consolidate/trace.js +3 -18
  242. package/dist/consolidate/traces.js +6 -22
  243. package/dist/core/ablation.d.ts +4 -91
  244. package/dist/core/ablation.js +4 -91
  245. package/dist/core/ambient.d.ts +1 -8
  246. package/dist/core/ambient.js +1 -8
  247. package/dist/core/capture-contract.d.ts +4 -2
  248. package/dist/core/capture-contract.js +4 -2
  249. package/dist/core/card.d.ts +4 -1
  250. package/dist/core/card.js +8 -0
  251. package/dist/core/compare.d.ts +11 -67
  252. package/dist/core/compare.js +9 -63
  253. package/dist/core/config.d.ts +10 -24
  254. package/dist/core/config.js +13 -14
  255. package/dist/core/handoff.d.ts +1 -7
  256. package/dist/core/handoff.js +1 -7
  257. package/dist/core/memory-quality.js +1 -1
  258. package/dist/core/memory.d.ts +41 -164
  259. package/dist/core/memory.js +51 -221
  260. package/dist/core/package-root.d.ts +3 -0
  261. package/dist/core/package-root.js +5 -0
  262. package/dist/core/physics-config.d.ts +1 -4
  263. package/dist/core/physics-config.js +3 -8
  264. package/dist/core/physics.d.ts +15 -61
  265. package/dist/core/physics.js +59 -122
  266. package/dist/core/project-identity.d.ts +17 -58
  267. package/dist/core/project-identity.js +17 -38
  268. package/dist/core/project-remote.js +13 -2
  269. package/dist/core/raw-append-only.d.ts +5 -0
  270. package/dist/core/raw-append-only.js +7 -0
  271. package/dist/core/salience.d.ts +1 -7
  272. package/dist/core/salience.js +1 -7
  273. package/dist/dashboard/dashboard-actions.js +2 -2
  274. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  275. package/dist/dashboard/dashboard-snapshot.js +11 -2
  276. package/dist/dashboard/dashboard-types.d.ts +2 -1
  277. package/dist/dashboard/dashboard.d.ts +1 -0
  278. package/dist/dashboard/dashboard.js +50 -4
  279. package/dist/db/busy.d.ts +1 -1
  280. package/dist/db/busy.js +17 -8
  281. package/dist/db/connect.d.ts +1 -0
  282. package/dist/db/connect.js +3 -3
  283. package/dist/db/migrate.js +3 -3
  284. package/dist/db/migrations/types.d.ts +2 -5
  285. package/dist/db/migrations/v14.js +2 -3
  286. package/dist/db/migrations/v15.js +2 -8
  287. package/dist/db/migrations/v16.js +2 -3
  288. package/dist/db/migrations/v17.js +2 -3
  289. package/dist/db/migrations/v19.js +2 -5
  290. package/dist/db/migrations/v20.js +2 -7
  291. package/dist/db/migrations/v22.js +4 -17
  292. package/dist/db/migrations/v23.js +3 -14
  293. package/dist/db/migrations/v24.js +2 -4
  294. package/dist/db/migrations/v25.js +3 -8
  295. package/dist/db/migrations/v26.js +2 -13
  296. package/dist/db/migrations/v27.js +3 -11
  297. package/dist/db/migrations/v28.js +2 -14
  298. package/dist/db/migrations/v29.js +4 -18
  299. package/dist/db/migrations/v30.js +4 -16
  300. package/dist/db/migrations/v31.js +2 -15
  301. package/dist/db/migrations/v32.js +4 -22
  302. package/dist/db/migrations/v33.js +2 -15
  303. package/dist/db/migrations/v34.js +2 -11
  304. package/dist/db/migrations/v35.js +2 -11
  305. package/dist/db/migrations/v36.js +2 -11
  306. package/dist/db/migrations/v37.js +8 -33
  307. package/dist/db/migrations/v38.js +5 -38
  308. package/dist/db/migrations/v39.js +9 -20
  309. package/dist/db/migrations/v40.js +2 -9
  310. package/dist/db/migrations/v41.js +2 -24
  311. package/dist/db/migrations/v43.js +1 -1
  312. package/dist/db/migrations/v44.js +2 -8
  313. package/dist/db/migrations/v45.js +2 -7
  314. package/dist/db/migrations/v47.js +2 -3
  315. package/dist/db/migrations/v51.js +1 -1
  316. package/dist/db/open.d.ts +2 -0
  317. package/dist/db/open.js +17 -1
  318. package/dist/db/physics-state.d.ts +6 -22
  319. package/dist/db/physics-state.js +25 -36
  320. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  321. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  322. package/dist/db/vector-store.d.ts +2 -0
  323. package/dist/db/vector-store.js +8 -1
  324. package/dist/doctor.js +74 -19
  325. package/dist/entry/session-text.js +2 -1
  326. package/dist/eval/eval-stats.d.ts +15 -53
  327. package/dist/eval/eval-stats.js +12 -42
  328. package/dist/eval/eval-suite.d.ts +2 -13
  329. package/dist/eval/eval-suite.js +74 -34
  330. package/dist/eval/eval.d.ts +6 -24
  331. package/dist/eval/eval.js +7 -34
  332. package/dist/eval/judgment.d.ts +0 -3
  333. package/dist/eval/judgment.js +19 -11
  334. package/dist/extensions/openclaw-plugin/index.js +1 -1
  335. package/dist/graph/extract.d.ts +5 -27
  336. package/dist/graph/extract.js +7 -33
  337. package/dist/graph/recall.d.ts +7 -20
  338. package/dist/graph/recall.js +14 -76
  339. package/dist/graph/stream.d.ts +7 -39
  340. package/dist/graph/stream.js +11 -34
  341. package/dist/graph/view.d.ts +9 -35
  342. package/dist/graph/view.js +11 -39
  343. package/dist/hooks/codex-wrapper.js +2 -2
  344. package/dist/hooks/copilot.js +2 -1
  345. package/dist/hooks/hook-blocks.d.ts +6 -2
  346. package/dist/hooks/hook-blocks.js +37 -124
  347. package/dist/hooks/json-hooks.d.ts +4 -36
  348. package/dist/hooks/json-hooks.js +18 -57
  349. package/dist/hooks/opencode.d.ts +0 -38
  350. package/dist/hooks/opencode.js +9 -76
  351. package/dist/hooks/shared.d.ts +8 -17
  352. package/dist/hooks/shared.js +29 -20
  353. package/dist/importers/core.d.ts +12 -37
  354. package/dist/importers/core.js +9 -27
  355. package/dist/importers/markdown-parse.d.ts +8 -22
  356. package/dist/importers/markdown-parse.js +8 -25
  357. package/dist/importers/markdown.js +3 -12
  358. package/dist/importers/sources.js +7 -35
  359. package/dist/importers/vault.d.ts +2 -8
  360. package/dist/importers/vault.js +25 -81
  361. package/dist/index.d.ts +6 -2
  362. package/dist/index.js +6 -2
  363. package/dist/learn/autolearn.d.ts +14 -41
  364. package/dist/learn/autolearn.js +14 -41
  365. package/dist/learn/extract.js +2 -4
  366. package/dist/learn/forward-claim-detector.d.ts +6 -30
  367. package/dist/learn/forward-claim-detector.js +14 -66
  368. package/dist/learn/invalidation.d.ts +6 -18
  369. package/dist/learn/invalidation.js +9 -26
  370. package/dist/mcp/admin-tools.js +3 -5
  371. package/dist/mcp/memory-tools.js +4 -9
  372. package/dist/mcp/protocol.d.ts +8 -26
  373. package/dist/mcp/protocol.js +3 -6
  374. package/dist/mcp/recall-tools.js +3 -3
  375. package/dist/mcp/request.d.ts +3 -11
  376. package/dist/mcp/request.js +10 -26
  377. package/dist/mcp/server.d.ts +3 -9
  378. package/dist/mcp/server.js +5 -16
  379. package/dist/mcp/session-state.d.ts +1 -1
  380. package/dist/mcp/session-state.js +5 -11
  381. package/dist/mcp/stdio.d.ts +2 -6
  382. package/dist/mcp/stdio.js +48 -12
  383. package/dist/mcp/tools.js +5 -3
  384. package/dist/objects/customer-notes.d.ts +7 -42
  385. package/dist/objects/customer-notes.js +7 -48
  386. package/dist/objects/decisions.d.ts +12 -50
  387. package/dist/objects/decisions.js +15 -53
  388. package/dist/objects/incidents.d.ts +7 -38
  389. package/dist/objects/incidents.js +7 -41
  390. package/dist/objects/policies.d.ts +11 -89
  391. package/dist/objects/policies.js +11 -98
  392. package/dist/objects/processes.d.ts +7 -52
  393. package/dist/objects/processes.js +7 -61
  394. package/dist/objects/project-briefs.d.ts +11 -55
  395. package/dist/objects/project-briefs.js +14 -75
  396. package/dist/objects/skills.d.ts +7 -42
  397. package/dist/objects/skills.js +8 -54
  398. package/dist/postinstall.js +6 -19
  399. package/dist/predictions/planning-fallacy.d.ts +11 -34
  400. package/dist/rerankers/clef.js +3 -31
  401. package/dist/rerankers/cross-encoder.js +4 -6
  402. package/dist/rerankers/jev.js +9 -6
  403. package/dist/rerankers/llm.d.ts +2 -11
  404. package/dist/rerankers/llm.js +14 -14
  405. package/dist/rerankers/outage-warning.d.ts +2 -1
  406. package/dist/rerankers/outage-warning.js +2 -1
  407. package/dist/rerankers/remote.d.ts +1 -0
  408. package/dist/rerankers/remote.js +2 -0
  409. package/dist/rerankers/types.d.ts +2 -14
  410. package/dist/search/boosts.d.ts +0 -2
  411. package/dist/search/boosts.js +2 -2
  412. package/dist/search/goal-boost.d.ts +23 -0
  413. package/dist/search/goal-boost.js +90 -0
  414. package/dist/search/hybrid.d.ts +2 -0
  415. package/dist/search/multihop.js +2 -3
  416. package/dist/search/path-context.d.ts +5 -18
  417. package/dist/search/path-context.js +5 -18
  418. package/dist/search/physics-search.js +11 -8
  419. package/dist/search/rrf.d.ts +7 -35
  420. package/dist/search/rrf.js +5 -30
  421. package/dist/search/vector.d.ts +7 -0
  422. package/dist/search/vector.js +35 -5
  423. package/dist/server/auth.d.ts +9 -28
  424. package/dist/server/auth.js +32 -25
  425. package/dist/server/boot.d.ts +2 -21
  426. package/dist/server/boot.js +63 -96
  427. package/dist/server/client-ip.d.ts +3 -19
  428. package/dist/server/client-ip.js +5 -28
  429. package/dist/server/defaults.d.ts +3 -0
  430. package/dist/server/defaults.js +4 -0
  431. package/dist/server/key-check-bounds.d.ts +2 -1
  432. package/dist/server/lifecycle.d.ts +5 -4
  433. package/dist/server/lifecycle.js +19 -4
  434. package/dist/server/mcp-http.js +10 -44
  435. package/dist/server/rate-limit.d.ts +5 -18
  436. package/dist/server/rate-limit.js +4 -13
  437. package/dist/server/request.d.ts +4 -8
  438. package/dist/server/request.js +9 -17
  439. package/dist/server/route-table.js +42 -49
  440. package/dist/server/routes/admin.js +22 -28
  441. package/dist/server/routes/customer-notes.js +7 -12
  442. package/dist/server/routes/decisions.js +10 -17
  443. package/dist/server/routes/incidents.js +12 -20
  444. package/dist/server/routes/memories.js +12 -32
  445. package/dist/server/routes/object-routes.d.ts +0 -5
  446. package/dist/server/routes/object-routes.js +7 -15
  447. package/dist/server/routes/policies.js +10 -18
  448. package/dist/server/routes/predictions.js +13 -25
  449. package/dist/server/routes/processes.js +16 -26
  450. package/dist/server/routes/project-briefs.js +9 -16
  451. package/dist/server/routes/recall.js +10 -35
  452. package/dist/server/routes/skills.js +8 -18
  453. package/dist/server/server-detect.d.ts +9 -53
  454. package/dist/server/server-detect.js +24 -90
  455. package/dist/server/sleep-offload.js +4 -1
  456. package/dist/server/types.d.ts +12 -10
  457. package/dist/server/validation.d.ts +3 -1
  458. package/dist/server/validation.js +10 -23
  459. package/dist/server.d.ts +2 -2
  460. package/dist/server.js +3 -2
  461. package/dist/sharing/global-store.d.ts +19 -0
  462. package/dist/sharing/global-store.js +75 -0
  463. package/dist/sharing/global-sync.d.ts +6 -0
  464. package/dist/sharing/global-sync.js +80 -0
  465. package/dist/sharing/project-merge.d.ts +4 -5
  466. package/dist/sharing/project-merge.js +9 -7
  467. package/dist/sharing/scope.d.ts +4 -11
  468. package/dist/sharing/scope.js +4 -11
  469. package/dist/sharing/search-both.d.ts +60 -0
  470. package/dist/sharing/search-both.js +138 -0
  471. package/dist/sharing/share.d.ts +38 -0
  472. package/dist/sharing/share.js +226 -0
  473. package/dist/store/ambient.js +4 -9
  474. package/dist/store/audit-event.d.ts +4 -12
  475. package/dist/store/audit-event.js +4 -12
  476. package/dist/store/audit.d.ts +2 -5
  477. package/dist/store/audit.js +4 -12
  478. package/dist/store/auth.d.ts +6 -6
  479. package/dist/store/auth.js +10 -9
  480. package/dist/store/candidates.d.ts +20 -3
  481. package/dist/store/candidates.js +77 -48
  482. package/dist/store/card-detail.d.ts +2 -1
  483. package/dist/store/card-detail.js +2 -1
  484. package/dist/store/cards.d.ts +14 -9
  485. package/dist/store/cards.js +72 -126
  486. package/dist/store/conflicts.d.ts +4 -21
  487. package/dist/store/conflicts.js +71 -150
  488. package/dist/store/connectors/github.d.ts +10 -10
  489. package/dist/store/connectors/github.js +10 -10
  490. package/dist/store/dashboard-reads.js +4 -8
  491. package/dist/store/delete-and-batch.d.ts +11 -31
  492. package/dist/store/delete-and-batch.js +48 -64
  493. package/dist/store/delivery-recorder.d.ts +8 -4
  494. package/dist/store/delivery-recorder.js +25 -15
  495. package/dist/store/diagnostics.js +6 -13
  496. package/dist/store/dormant.d.ts +7 -29
  497. package/dist/store/dormant.js +15 -56
  498. package/dist/store/embeddings/index.d.ts +11 -80
  499. package/dist/store/embeddings/index.js +71 -207
  500. package/dist/store/embeddings/local.js +15 -32
  501. package/dist/store/embeddings/provider.d.ts +16 -53
  502. package/dist/store/embeddings/provider.js +41 -69
  503. package/dist/store/entry-reads.d.ts +21 -57
  504. package/dist/store/entry-reads.js +65 -126
  505. package/dist/store/entry-row.d.ts +6 -35
  506. package/dist/store/entry-row.js +9 -37
  507. package/dist/store/entry-writes.d.ts +10 -16
  508. package/dist/store/entry-writes.js +17 -35
  509. package/dist/store/goals.d.ts +3 -40
  510. package/dist/store/goals.js +21 -160
  511. package/dist/store/graph-queue.d.ts +6 -22
  512. package/dist/store/graph-queue.js +14 -45
  513. package/dist/store/graph-reads.d.ts +11 -35
  514. package/dist/store/graph-reads.js +20 -58
  515. package/dist/store/graph-rows.d.ts +3 -6
  516. package/dist/store/graph-rows.js +6 -9
  517. package/dist/store/graph-view-rows.d.ts +2 -1
  518. package/dist/store/graph-view-rows.js +2 -1
  519. package/dist/store/graph-writes.d.ts +6 -31
  520. package/dist/store/graph-writes.js +13 -37
  521. package/dist/store/half-life.d.ts +2 -1
  522. package/dist/store/half-life.js +14 -16
  523. package/dist/store/handoffs.d.ts +5 -11
  524. package/dist/store/handoffs.js +16 -34
  525. package/dist/store/index-and-stats.d.ts +6 -19
  526. package/dist/store/index-and-stats.js +34 -82
  527. package/dist/store/markdown.d.ts +2 -6
  528. package/dist/store/markdown.js +21 -20
  529. package/dist/store/mirrors.d.ts +2 -6
  530. package/dist/store/mirrors.js +14 -23
  531. package/dist/store/open.js +6 -13
  532. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  533. package/dist/store/planning-fallacy-evidence.js +8 -37
  534. package/dist/store/port.d.ts +82 -79
  535. package/dist/store/predictions.d.ts +11 -51
  536. package/dist/store/predictions.js +38 -119
  537. package/dist/{cli → store}/quality-repair.js +15 -31
  538. package/dist/store/raw-archive.d.ts +4 -16
  539. package/dist/store/raw-archive.js +14 -29
  540. package/dist/store/recall-scope.d.ts +19 -79
  541. package/dist/store/recall-scope.js +21 -82
  542. package/dist/store/recall-trace.d.ts +10 -77
  543. package/dist/store/recall-trace.js +19 -95
  544. package/dist/store/rejected-values.js +7 -19
  545. package/dist/store/rejection.d.ts +12 -58
  546. package/dist/store/rejection.js +13 -65
  547. package/dist/store/report-reads.d.ts +6 -0
  548. package/dist/store/report-reads.js +29 -0
  549. package/dist/store/rows.d.ts +9 -19
  550. package/dist/store/rows.js +36 -34
  551. package/dist/store/rule-sql.d.ts +5 -0
  552. package/dist/store/rule-sql.js +37 -0
  553. package/dist/store/search-rows.d.ts +7 -38
  554. package/dist/store/search-rows.js +14 -50
  555. package/dist/store/sessions.d.ts +10 -47
  556. package/dist/store/sessions.js +17 -73
  557. package/dist/store/sqlite/connector-events-group.js +2 -2
  558. package/dist/store/sqlite/entry-writes-group.js +2 -2
  559. package/dist/store/sqlite/error-codec.js +4 -2
  560. package/dist/store/sqlite/executor.d.ts +2 -1
  561. package/dist/store/sqlite/executor.js +2 -1
  562. package/dist/store/sqlite/local.d.ts +3 -3
  563. package/dist/store/sqlite/local.js +1 -0
  564. package/dist/store/sqlite/object-rows.js +6 -3
  565. package/dist/store/sqlite/objects-group.js +4 -2
  566. package/dist/store/sqlite/quarantine-group.js +2 -2
  567. package/dist/store/sqlite/store.d.ts +1 -4
  568. package/dist/store/sqlite/store.js +2 -3
  569. package/dist/store/sqlite/vector-reads-group.js +2 -2
  570. package/dist/store/sqlite/worker-jobs.js +1 -1
  571. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  572. package/dist/store/sqlite/worker-ops.js +13 -2
  573. package/dist/store/sqlite/worker-store.js +5 -2
  574. package/dist/store/summaries.d.ts +10 -62
  575. package/dist/store/summaries.js +34 -146
  576. package/dist/store/summary-dirty.js +1 -1
  577. package/dist/store/tenant-lookup.d.ts +6 -1
  578. package/dist/store/tenant-lookup.js +7 -0
  579. package/dist/store/tenant.d.ts +2 -16
  580. package/dist/store/tenant.js +4 -19
  581. package/dist/store/token-ledger.d.ts +13 -43
  582. package/dist/store/token-ledger.js +19 -50
  583. package/dist/store/usage-reports.js +5 -13
  584. package/dist/store/vector-index.d.ts +46 -0
  585. package/dist/store/vector-index.js +170 -0
  586. package/dist/store/working-memory.d.ts +6 -25
  587. package/dist/store/working-memory.js +18 -52
  588. package/dist/store/yaml.d.ts +1 -5
  589. package/dist/store/yaml.js +2 -6
  590. package/dist/support-bundle.js +7 -5
  591. package/dist/trust/reject-flow.js +1 -3
  592. package/dist/util/anthropic-messages.js +14 -2
  593. package/dist/util/atomic-write.d.ts +2 -1
  594. package/dist/util/atomic-write.js +35 -4
  595. package/dist/util/capped-json.d.ts +6 -0
  596. package/dist/util/capped-json.js +46 -0
  597. package/dist/util/crash-handlers.d.ts +8 -1
  598. package/dist/util/crash-handlers.js +52 -10
  599. package/dist/util/env.d.ts +13 -6
  600. package/dist/util/env.js +14 -7
  601. package/dist/util/home-path.d.ts +2 -1
  602. package/dist/util/home-path.js +4 -2
  603. package/dist/util/http-retry.d.ts +3 -1
  604. package/dist/util/http-retry.js +26 -5
  605. package/dist/util/log.d.ts +3 -2
  606. package/dist/util/log.js +25 -9
  607. package/dist/util/request-scope.d.ts +2 -1
  608. package/dist/util/request-scope.js +2 -1
  609. package/dist/util/secret-detect.d.ts +5 -30
  610. package/dist/util/secret-detect.js +13 -39
  611. package/dist/util/stored-json.d.ts +1 -1
  612. package/dist/util/stored-json.js +1 -1
  613. package/dist/util/token-text.d.ts +1 -4
  614. package/dist/util/token-text.js +1 -4
  615. package/dist/util/transcript-tail.d.ts +2 -0
  616. package/dist/util/transcript-tail.js +24 -23
  617. package/dist/util/version.d.ts +5 -20
  618. package/dist/util/version.js +5 -20
  619. package/extensions/openclaw-plugin/index.ts +1 -1
  620. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  621. package/extensions/openclaw-plugin/package.json +1 -1
  622. package/openclaw.plugin.json +1 -1
  623. package/package.json +1 -1
  624. package/dist/connectors/github/cli-impl.d.ts +0 -25
  625. package/dist/sharing/shared.d.ts +0 -187
  626. package/dist/sharing/shared.js +0 -563
  627. package/dist/store/vector-writes.d.ts +0 -13
  628. package/dist/store/vector-writes.js +0 -89
  629. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
@@ -1,89 +1,6 @@
1
- /**
2
- * EVAL-ONLY lifecycle ablation switches.
3
- *
4
- * These env flags exist for controlled experiments on hippo's memory-lifecycle
5
- * mechanisms (the "lifecycle, ablated" paper protocol): each switch neutralizes
6
- * exactly ONE mechanism so its causal contribution can be measured in isolation.
7
- *
8
- * They are NOT a production configuration surface:
9
- * - no config-file equivalents, deliberately (config implies support);
10
- * - undocumented in user-facing help;
11
- * - semantics may change with the experiment design.
12
- * Production behavior with all flags unset is byte-identical to before this
13
- * module existed.
14
- *
15
- * Flags (set to '1' or 'true'):
16
- * HIPPO_ABLATE_DECAY time-decay term := 1 in calculateStrength.
17
- * HIPPO_ABLATE_RECALL_BOOST full recall-strengthening ablation:
18
- * - markRetrieved returns entries UNMUTATED (no
19
- * clock reset / count / half-life increment);
20
- * ids stay available so `hippo outcome`
21
- * attribution keeps working in this arm;
22
- * - persisting callers (CLI recall, api context,
23
- * MCP recall/context, consolidation replay)
24
- * skip their writeEntry loops (identical-row
25
- * writes still refresh updated_at / mirrors /
26
- * DAG dirty flags);
27
- * - the retrieval-count READ boost := 1;
28
- * - decay anchors at `created` instead of
29
- * `last_retrieved` (prior-run clock resets
30
- * cannot leak in);
31
- * - physics: computeMass ignores the count, and
32
- * physicsSearch recomputes loaded masses LIVE
33
- * under ablated strength rules (persisted
34
- * masses embed recall history in their frozen
35
- * strength component);
36
- * - replay rehearsal is silenced entirely (it IS
37
- * strengthening; use config replay.count=0 to
38
- * separate replay in unflagged arms).
39
- * CAVEAT: half_life increments persisted by
40
- * prior unflagged runs are NOT reconstructed
41
- * (consolidation legitimately writes half_life
42
- * too) - ablation arms run on FRESH stores, as
43
- * the experiment protocol mandates.
44
- * HIPPO_ABLATE_OUTCOME both outcome channels := neutral
45
- * (= _SLOW + _FAST together). The slow side also
46
- * silences replay's outcome reward bias
47
- * (replayPriority). NOT gated: the opt-in
48
- * `recall --value-aware` rerank (an explicit CLI
49
- * flag that also reads outcome counts) - ablated
50
- * arms must not pass it.
51
- * HIPPO_ABLATE_OUTCOME_SLOW rewardFactor := 1 (no half-life modulation).
52
- * HIPPO_ABLATE_OUTCOME_FAST hybridSearch outcomeBoost := 1.
53
- * HIPPO_ABLATE_RECENCY search recency factor := 1 (the creation-age
54
- * multiplier 0.8 + 0.2*exp(-age/30d)); decay,
55
- * strengthening and outcomes stay live.
56
- * HIPPO_EVAL_RECENCY_DAYS a positive number replaces the 30-day scale of
57
- * that recency factor (tuning grids only). Unset,
58
- * zero, negative or junk values keep 30.
59
- * HIPPO_FAKE_NOW timestamp injected as the default `now` for
60
- * strength computation and retrieval stamping
61
- * (simulated-time protocols). MUST be the exact
62
- * Date.toISOString() form
63
- * (YYYY-MM-DDTHH:mm:ss.sssZ); validated by
64
- * round-trip, so junk, locale dates, non-UTC
65
- * offsets, and rolled-over dates (2026-02-31)
66
- * all fall back to the real clock.
67
- *
68
- * Formula notes (load-bearing for the experiments) - ablating decay has TWO
69
- * intrinsic co-effects, because the unified formula routes other mechanisms
70
- * THROUGH the decay term. Both are real properties of the architecture, not
71
- * implementation accidents; experiment analysis must attribute accordingly
72
- * (the decay-off arm is "decay + its dependents off", see prereg amendment A1):
73
- * 1. Read-side strengthening flattens: raw = retrievalBoost * emotionalMult
74
- * >= 1, and the [0,1] clamp caps it at 1.0 - the recall boost can only
75
- * offset decay, never exceed baseline. (Write-side still runs.)
76
- * 2. Outcome-slow goes inert: rewardFactor only acts by scaling the
77
- * effective half-life INSIDE the decay exponent; with decay := 1 there
78
- * is no exponent for it to modulate. Outcome-slow is decay-rate
79
- * modulation BY DESIGN, so "no decay" necessarily means "no slow
80
- * channel" (the fast channel in hybridSearch is unaffected).
81
- *
82
- * Env caching follows the house pattern (see getLossAversionRatio in
83
- * memory.ts): read once per process, with a test-only reset helper. Tests
84
- * that mutate these env vars MUST call _resetAblationCacheForTests() in BOTH
85
- * beforeEach AND afterEach.
86
- */
1
+ /** EVAL-ONLY ablation switches (HIPPO_ABLATE_*, HIPPO_EVAL_RECENCY_DAYS, HIPPO_FAKE_NOW): each cuts ONE mechanism (outcome also replayPriority bias).
2
+ * Not a production surface. Env is read once per process; tests that mutate these vars MUST call _resetAblationCacheForTests() in beforeEach AND afterEach. See
3
+ * docs/ARCHITECTURE.md#srccoreablationts. */
87
4
  export declare function isDecayAblated(): boolean;
88
5
  export declare function isRecallBoostAblated(): boolean;
89
6
  export declare function isOutcomeSlowAblated(): boolean;
@@ -91,11 +8,7 @@ export declare function isOutcomeFastAblated(): boolean;
91
8
  export declare function isRecencyAblated(): boolean;
92
9
  /** HIPPO_EVAL_RECENCY_DAYS when it is a positive number, else null (callers keep their default). */
93
10
  export declare function evalRecencyScaleDays(): number | null;
94
- /**
95
- * The default `now` for lifecycle computations: HIPPO_FAKE_NOW when set and
96
- * parseable, else the real clock. Callers that already take an explicit `now`
97
- * parameter are unaffected (explicit always wins).
98
- */
11
+ /** The default `now` for lifecycle computations: HIPPO_FAKE_NOW when set and parseable, else the real clock; an explicit `now` parameter always wins. */
99
12
  export declare function evalNow(): Date;
100
13
  /** Test-only. See module JSDoc: call in BOTH beforeEach AND afterEach. */
101
14
  export declare function _resetAblationCacheForTests(): void;
@@ -1,89 +1,6 @@
1
- /**
2
- * EVAL-ONLY lifecycle ablation switches.
3
- *
4
- * These env flags exist for controlled experiments on hippo's memory-lifecycle
5
- * mechanisms (the "lifecycle, ablated" paper protocol): each switch neutralizes
6
- * exactly ONE mechanism so its causal contribution can be measured in isolation.
7
- *
8
- * They are NOT a production configuration surface:
9
- * - no config-file equivalents, deliberately (config implies support);
10
- * - undocumented in user-facing help;
11
- * - semantics may change with the experiment design.
12
- * Production behavior with all flags unset is byte-identical to before this
13
- * module existed.
14
- *
15
- * Flags (set to '1' or 'true'):
16
- * HIPPO_ABLATE_DECAY time-decay term := 1 in calculateStrength.
17
- * HIPPO_ABLATE_RECALL_BOOST full recall-strengthening ablation:
18
- * - markRetrieved returns entries UNMUTATED (no
19
- * clock reset / count / half-life increment);
20
- * ids stay available so `hippo outcome`
21
- * attribution keeps working in this arm;
22
- * - persisting callers (CLI recall, api context,
23
- * MCP recall/context, consolidation replay)
24
- * skip their writeEntry loops (identical-row
25
- * writes still refresh updated_at / mirrors /
26
- * DAG dirty flags);
27
- * - the retrieval-count READ boost := 1;
28
- * - decay anchors at `created` instead of
29
- * `last_retrieved` (prior-run clock resets
30
- * cannot leak in);
31
- * - physics: computeMass ignores the count, and
32
- * physicsSearch recomputes loaded masses LIVE
33
- * under ablated strength rules (persisted
34
- * masses embed recall history in their frozen
35
- * strength component);
36
- * - replay rehearsal is silenced entirely (it IS
37
- * strengthening; use config replay.count=0 to
38
- * separate replay in unflagged arms).
39
- * CAVEAT: half_life increments persisted by
40
- * prior unflagged runs are NOT reconstructed
41
- * (consolidation legitimately writes half_life
42
- * too) - ablation arms run on FRESH stores, as
43
- * the experiment protocol mandates.
44
- * HIPPO_ABLATE_OUTCOME both outcome channels := neutral
45
- * (= _SLOW + _FAST together). The slow side also
46
- * silences replay's outcome reward bias
47
- * (replayPriority). NOT gated: the opt-in
48
- * `recall --value-aware` rerank (an explicit CLI
49
- * flag that also reads outcome counts) - ablated
50
- * arms must not pass it.
51
- * HIPPO_ABLATE_OUTCOME_SLOW rewardFactor := 1 (no half-life modulation).
52
- * HIPPO_ABLATE_OUTCOME_FAST hybridSearch outcomeBoost := 1.
53
- * HIPPO_ABLATE_RECENCY search recency factor := 1 (the creation-age
54
- * multiplier 0.8 + 0.2*exp(-age/30d)); decay,
55
- * strengthening and outcomes stay live.
56
- * HIPPO_EVAL_RECENCY_DAYS a positive number replaces the 30-day scale of
57
- * that recency factor (tuning grids only). Unset,
58
- * zero, negative or junk values keep 30.
59
- * HIPPO_FAKE_NOW timestamp injected as the default `now` for
60
- * strength computation and retrieval stamping
61
- * (simulated-time protocols). MUST be the exact
62
- * Date.toISOString() form
63
- * (YYYY-MM-DDTHH:mm:ss.sssZ); validated by
64
- * round-trip, so junk, locale dates, non-UTC
65
- * offsets, and rolled-over dates (2026-02-31)
66
- * all fall back to the real clock.
67
- *
68
- * Formula notes (load-bearing for the experiments) - ablating decay has TWO
69
- * intrinsic co-effects, because the unified formula routes other mechanisms
70
- * THROUGH the decay term. Both are real properties of the architecture, not
71
- * implementation accidents; experiment analysis must attribute accordingly
72
- * (the decay-off arm is "decay + its dependents off", see prereg amendment A1):
73
- * 1. Read-side strengthening flattens: raw = retrievalBoost * emotionalMult
74
- * >= 1, and the [0,1] clamp caps it at 1.0 - the recall boost can only
75
- * offset decay, never exceed baseline. (Write-side still runs.)
76
- * 2. Outcome-slow goes inert: rewardFactor only acts by scaling the
77
- * effective half-life INSIDE the decay exponent; with decay := 1 there
78
- * is no exponent for it to modulate. Outcome-slow is decay-rate
79
- * modulation BY DESIGN, so "no decay" necessarily means "no slow
80
- * channel" (the fast channel in hybridSearch is unaffected).
81
- *
82
- * Env caching follows the house pattern (see getLossAversionRatio in
83
- * memory.ts): read once per process, with a test-only reset helper. Tests
84
- * that mutate these env vars MUST call _resetAblationCacheForTests() in BOTH
85
- * beforeEach AND afterEach.
86
- */
1
+ /** EVAL-ONLY ablation switches (HIPPO_ABLATE_*, HIPPO_EVAL_RECENCY_DAYS, HIPPO_FAKE_NOW): each cuts ONE mechanism (outcome also replayPriority bias).
2
+ * Not a production surface. Env is read once per process; tests that mutate these vars MUST call _resetAblationCacheForTests() in beforeEach AND afterEach. See
3
+ * docs/ARCHITECTURE.md#srccoreablationts. */
87
4
  import { envAblateDecay, envAblateOutcome, envAblateOutcomeFast, envAblateOutcomeSlow, envAblateRecallBoost, envAblateRecency, envEvalRecencyDays, envFakeNowMs, } from '../util/env.js';
88
5
  let _cache;
89
6
  function readFlags() {
@@ -120,11 +37,7 @@ export function isRecencyAblated() {
120
37
  export function evalRecencyScaleDays() {
121
38
  return readFlags().recencyDays;
122
39
  }
123
- /**
124
- * The default `now` for lifecycle computations: HIPPO_FAKE_NOW when set and
125
- * parseable, else the real clock. Callers that already take an explicit `now`
126
- * parameter are unaffected (explicit always wins).
127
- */
40
+ /** The default `now` for lifecycle computations: HIPPO_FAKE_NOW when set and parseable, else the real clock; an explicit `now` parameter always wins. */
128
41
  export function evalNow() {
129
42
  const ms = readFlags().fakeNowMs;
130
43
  return ms === null ? new Date() : new Date(ms);
@@ -1,11 +1,4 @@
1
- /**
2
- * Ambient state vector — a compact representation of the agent's memory
3
- * landscape, computed in O(N) from the current corpus.
4
- *
5
- * Inspired by the biological ambient neural state: a continuous background
6
- * representation that tells the agent "where it is" in knowledge-space
7
- * without retrieving specific memories.
8
- */
1
+ /** Ambient state vector: a compact O(N) summary of the corpus telling the agent "where it is" in knowledge-space without retrieving specific memories. */
9
2
  import type { MemoryEntry } from './memory.js';
10
3
  export interface AmbientState {
11
4
  tagEntropy: number;
@@ -1,11 +1,4 @@
1
- /**
2
- * Ambient state vector — a compact representation of the agent's memory
3
- * landscape, computed in O(N) from the current corpus.
4
- *
5
- * Inspired by the biological ambient neural state: a continuous background
6
- * representation that tells the agent "where it is" in knowledge-space
7
- * without retrieving specific memories.
8
- */
1
+ /** Ambient state vector: a compact O(N) summary of the corpus telling the agent "where it is" in knowledge-space without retrieving specific memories. */
9
2
  import { evalNow } from './ablation.js';
10
3
  import { Layer } from './memory.js';
11
4
  import { calculateStrength } from './memory.js';
@@ -51,12 +51,14 @@ export declare function isStringValue<T>(value: T): value is T & string;
51
51
  export declare function isObjectLike<T>(value: T): value is T & object;
52
52
  /** The hook runtimes a `--runtime` flag names; absent means Claude Code. */
53
53
  export type HookRuntime = 'claude-code' | 'copilot';
54
- /** Reads a Claude Code PreCompact payload, or a Copilot one after stdin.ts mapped it to the same snake_case keys; only an empty stdin counts as a manual run. */
54
+ /** Reads a Claude Code PreCompact payload, or a Copilot one after stdin.ts mapped
55
+ * it to the same snake_case keys; only an empty stdin counts as a manual run. */
55
56
  export declare function readClaudeCodePreCompact(stdinText: string | undefined, timedOut: boolean, runtime?: HookRuntime): CaptureReceipt;
56
57
  /** Reads VS Code's per-reply Stop payload. Pass the raw stdin: stdin.ts would give a Copilot CLI agentStop the same snake_case keys. */
57
58
  export declare function readVscodeStop(stdinText: string | undefined, timedOut: boolean): CaptureReceipt;
58
59
  /** Reads a Claude Code PostCompact payload; it must name a session, but needs no transcript_path. */
59
60
  export declare function readClaudeCodePostCompact(stdinText: string | undefined, timedOut: boolean): CaptureReceipt<PostCompactInput>;
60
- /** Reads a Claude Code SessionEnd payload, or a Copilot one after stdin.ts mapped it to the same snake_case keys; only an empty stdin counts as a manual run. */
61
+ /** Reads a Claude Code SessionEnd payload, or a Copilot one after stdin.ts mapped
62
+ * it to the same snake_case keys; only an empty stdin counts as a manual run. */
61
63
  export declare function readSessionEnd(stdinText: string | undefined, timedOut: boolean, runtime?: HookRuntime): CaptureReceipt;
62
64
  //# sourceMappingURL=capture-contract.d.ts.map
@@ -8,7 +8,8 @@ export function isStringValue(value) {
8
8
  export function isObjectLike(value) {
9
9
  return value !== null && value instanceof Object;
10
10
  }
11
- /** Reads a Claude Code PreCompact payload, or a Copilot one after stdin.ts mapped it to the same snake_case keys; only an empty stdin counts as a manual run. */
11
+ /** Reads a Claude Code PreCompact payload, or a Copilot one after stdin.ts mapped
12
+ * it to the same snake_case keys; only an empty stdin counts as a manual run. */
12
13
  export function readClaudeCodePreCompact(stdinText, timedOut, runtime = 'claude-code') {
13
14
  const empty = !stdinText || stdinText.trim() === '';
14
15
  if (timedOut && empty) {
@@ -112,7 +113,8 @@ export function readClaudeCodePostCompact(stdinText, timedOut) {
112
113
  },
113
114
  };
114
115
  }
115
- /** Reads a Claude Code SessionEnd payload, or a Copilot one after stdin.ts mapped it to the same snake_case keys; only an empty stdin counts as a manual run. */
116
+ /** Reads a Claude Code SessionEnd payload, or a Copilot one after stdin.ts mapped
117
+ * it to the same snake_case keys; only an empty stdin counts as a manual run. */
116
118
  export function readSessionEnd(stdinText, timedOut, runtime = 'claude-code') {
117
119
  const empty = !stdinText || stdinText.trim() === '';
118
120
  if (timedOut && empty) {
@@ -2,7 +2,8 @@
2
2
  export type CardStatus = 'backlog' | 'ready' | 'running' | 'blocked' | 'review' | 'done' | 'shelved';
3
3
  /** Narrows a raw string, such as a CLI flag value, to a CardStatus. */
4
4
  export declare function isCardStatus(v: string): v is CardStatus;
5
- /** A card row; leaseUntil and heartbeatAt are null unless the card is running, and a card claimed under 1.40.0 runs with both null until a heartbeat sets them. */
5
+ /** A card row; leaseUntil and heartbeatAt are null unless the card is running, and
6
+ * a card claimed under 1.40.0 runs with both null until a heartbeat sets them. */
6
7
  export interface Card {
7
8
  id: string;
8
9
  title: string;
@@ -44,4 +45,6 @@ export type CardTransitions = {
44
45
  export declare const CARD_TRANSITIONS: CardTransitions;
45
46
  /** How long a claim or a heartbeat keeps a running card's lease before reclaimExpiredCards may return it to ready. */
46
47
  export declare const CARD_LEASE_MS: number;
48
+ /** Throws on any move CARD_TRANSITIONS does not allow, before a status write touches the row. */
49
+ export declare function assertCardTransition(from: readonly CardStatus[], to: CardStatus): void;
47
50
  //# sourceMappingURL=card.d.ts.map
package/dist/core/card.js CHANGED
@@ -16,4 +16,12 @@ export const CARD_TRANSITIONS = {
16
16
  // SHORTCUT: one fixed lease for every claim; add a per-claim lease when the W3 dispatcher heartbeats on a timer.
17
17
  /** How long a claim or a heartbeat keeps a running card's lease before reclaimExpiredCards may return it to ready. */
18
18
  export const CARD_LEASE_MS = 4 * 60 * 60 * 1000;
19
+ /** Throws on any move CARD_TRANSITIONS does not allow, before a status write touches the row. */
20
+ export function assertCardTransition(from, to) {
21
+ for (const status of from) {
22
+ if (!CARD_TRANSITIONS[status].includes(to)) {
23
+ throw new Error(`illegal card transition: ${status} -> ${to}`);
24
+ }
25
+ }
26
+ }
19
27
  //# sourceMappingURL=card.js.map
@@ -1,21 +1,8 @@
1
- /**
2
- * Deterministic tie-break comparators for recall ranking.
3
- *
4
- * A true LEAF module: imports NOTHING from any sort-site module (search.ts,
5
- * physics.ts, api.ts, cli.ts, shared.ts, goals.ts, graph-recall.ts,
6
- * multihop.ts, rerankers/*). Every comparator here takes a structural param
7
- * type instead of an imported one, on purpose — a type-only import back to
8
- * search.ts would still create the search.ts <-> physics.ts ESM import
9
- * cycle this module exists to avoid.
10
- *
11
- * Mirrors the deliberate-determinism comment style already established in
12
- * graph-stream.ts:88, :165-168, :233-236 — a sort with a documented,
13
- * reproducible tiebreak instead of leaving ties to array/scan order.
14
- */
15
- /** Minimal shape needed to break a tie deterministically across fresh
16
- * ingests of the same content into different stores. The metadata keys are
17
- * optional so existing `{ content, id }` callers (tests, benchmarks) still fit;
18
- * a full MemoryEntry satisfies it structurally and gets the metadata order. */
1
+ /** Deterministic tie-break comparators for recall ranking. A true LEAF module: it imports from no sort-site module (search, physics, api, cli, goals,
2
+ * graph-recall, multihop, rerankers), taking structural param types instead, because even a type-only import back would recreate the search <-> physics ESM
3
+ * cycle this module exists to avoid. */
4
+ /** Minimal shape for a deterministic tie-break across fresh ingests into different stores;
5
+ * the metadata keys are optional so `{ content, id }` callers still fit. */
19
6
  export interface EntryIdentity {
20
7
  content: string;
21
8
  id: string;
@@ -23,30 +10,8 @@ export interface EntryIdentity {
23
10
  tags?: readonly string[];
24
11
  source?: string;
25
12
  }
26
- /**
27
- * content asc -> layer rank asc -> distinct tag count desc -> sorted tags asc
28
- * -> source asc -> id asc (all string compares are UTF-16 code-unit order).
29
- *
30
- * `content` is the cross-ingest-stable key: identical text ingested into two
31
- * independently-created stores (different directory name, different insert
32
- * order of everything else on disk) sorts identically. The metadata keys make
33
- * byte-identical twins order by what they carry instead of by `id`
34
- * (`crypto.randomUUID()`), which is per-instance random and would make the
35
- * dedupe survivor arbitrary. `id` stays the terminal key so the order is
36
- * total within one store.
37
- *
38
- * Layer rank puts semantic first: semantic rows are consolidation output, so
39
- * keeping that copy preserves the promotion instead of demoting the memory.
40
- * Unknown or missing layers rank last and then compare as raw strings.
41
- * Tags prefer the copy with more distinct labels (fewer labels are lost on
42
- * dedupe); source is an arbitrary but stable key.
43
- *
44
- * Plain `<`/`>`, NOT `localeCompare`: `localeCompare` is locale- and
45
- * ICU-version-dependent (a determinism leak in its own right) and needlessly
46
- * slow for a tiebreak that only needs a total order. The metadata keys are
47
- * only computed on a content tie, which is rare, so the per-compare Set/sort
48
- * cost never lands on the hot path.
49
- */
13
+ /** Order: content, layer rank (semantic first, keeping the promotion), tag count desc, sorted tags, source, id; plain `<`/`>`, never `localeCompare`.
14
+ * `content` is the cross-ingest-stable key; `id` is random per instance, so it is only the terminal key. Metadata keys are computed only on a content tie. */
50
15
  export declare function compareEntryIdentity(a: EntryIdentity, b: EntryIdentity): number;
51
16
  /** Minimal shape for score-primary sort sites (SearchResult and friends
52
17
  * that carry `{ score, entry: { content, id } }`). */
@@ -54,34 +19,13 @@ export interface ScoredEntryLike {
54
19
  score: number;
55
20
  entry: EntryIdentity;
56
21
  }
57
- /**
58
- * score descending -> `compareEntryIdentity`. The shared ordering rule for
59
- * every score-primary recall sort site (search.ts, shared.ts, goals.ts,
60
- * api.ts, cli.ts, graph-recall.ts, multihop.ts, rerankers/cross-encoder.ts).
61
- * Sites delegate wholesale to this (via a thin arrow where the element
62
- * shape's score field is named something other than `score`, e.g.
63
- * `rerankScore`) rather than reimplementing `b.score - a.score` locally, so
64
- * the tiebreak can't silently drift between call sites.
65
- */
22
+ /** score descending, then `compareEntryIdentity`: the shared ordering for every score-primary recall sort site, which delegate here (via an arrow when the
23
+ * score field is not named `score`) so the tiebreak cannot drift between call sites. */
66
24
  export declare function compareScoredResults(a: ScoredEntryLike, b: ScoredEntryLike): number;
67
25
  /** Larger first, NaN after every number, 0 for equal scores. Not a subtraction: two infinities, or any NaN, subtract to NaN, which a sort reads as a tie. */
68
26
  export declare function compareScoresDesc(a: number, b: number): number;
69
- /**
70
- * Build a score-desc -> tie-key comparator for the physics layer.
71
- *
72
- * `ScoredPhysicsResult` (physics.ts) carries `{ memoryId, baseScore,
73
- * clusterAmplification, finalScore }` -- NO `entry`/`content` in scope at
74
- * that layer, so `compareEntryIdentity` cannot apply directly. With only the
75
- * default memoryId key this is PER-INSTANCE-ONLY determinism; callers that need
76
- * CROSS-INGEST stability supply `tieKeyOf` mapping the result to its memory
77
- * CONTENT, because the baseScore tie order selects the cluster_top_k
78
- * amplification set, which MUTATES scores before the content-aware merge sort.
79
- *
80
- * A factory (not a fixed-field comparator) because physics.ts re-sorts the
81
- * same result array by two different score fields in sequence (`baseScore`
82
- * for top-K selection, then `finalScore` after cluster amplification) — one
83
- * shared tiebreak rule, parameterised by which field is primary this pass.
84
- */
27
+ /** Score-desc then tie-key comparator for the physics layer (no `entry`/`content` in scope): the default memoryId key is per-instance determinism only.
28
+ * Cross-ingest stability needs `tieKeyOf` (content), since the baseScore tie order picks the cluster_top_k set. A factory, as two fields sort in turn. */
85
29
  export declare function comparePhysicsResultsBy<T extends {
86
30
  memoryId: string;
87
31
  }>(scoreOf: (r: T) => number, tieKeyOf?: (r: T) => string): (a: T, b: T) => number;
@@ -1,41 +1,8 @@
1
- /**
2
- * Deterministic tie-break comparators for recall ranking.
3
- *
4
- * A true LEAF module: imports NOTHING from any sort-site module (search.ts,
5
- * physics.ts, api.ts, cli.ts, shared.ts, goals.ts, graph-recall.ts,
6
- * multihop.ts, rerankers/*). Every comparator here takes a structural param
7
- * type instead of an imported one, on purpose — a type-only import back to
8
- * search.ts would still create the search.ts <-> physics.ts ESM import
9
- * cycle this module exists to avoid.
10
- *
11
- * Mirrors the deliberate-determinism comment style already established in
12
- * graph-stream.ts:88, :165-168, :233-236 — a sort with a documented,
13
- * reproducible tiebreak instead of leaving ties to array/scan order.
14
- */
15
- /**
16
- * content asc -> layer rank asc -> distinct tag count desc -> sorted tags asc
17
- * -> source asc -> id asc (all string compares are UTF-16 code-unit order).
18
- *
19
- * `content` is the cross-ingest-stable key: identical text ingested into two
20
- * independently-created stores (different directory name, different insert
21
- * order of everything else on disk) sorts identically. The metadata keys make
22
- * byte-identical twins order by what they carry instead of by `id`
23
- * (`crypto.randomUUID()`), which is per-instance random and would make the
24
- * dedupe survivor arbitrary. `id` stays the terminal key so the order is
25
- * total within one store.
26
- *
27
- * Layer rank puts semantic first: semantic rows are consolidation output, so
28
- * keeping that copy preserves the promotion instead of demoting the memory.
29
- * Unknown or missing layers rank last and then compare as raw strings.
30
- * Tags prefer the copy with more distinct labels (fewer labels are lost on
31
- * dedupe); source is an arbitrary but stable key.
32
- *
33
- * Plain `<`/`>`, NOT `localeCompare`: `localeCompare` is locale- and
34
- * ICU-version-dependent (a determinism leak in its own right) and needlessly
35
- * slow for a tiebreak that only needs a total order. The metadata keys are
36
- * only computed on a content tie, which is rare, so the per-compare Set/sort
37
- * cost never lands on the hot path.
38
- */
1
+ /** Deterministic tie-break comparators for recall ranking. A true LEAF module: it imports from no sort-site module (search, physics, api, cli, goals,
2
+ * graph-recall, multihop, rerankers), taking structural param types instead, because even a type-only import back would recreate the search <-> physics ESM
3
+ * cycle this module exists to avoid. */
4
+ /** Order: content, layer rank (semantic first, keeping the promotion), tag count desc, sorted tags, source, id; plain `<`/`>`, never `localeCompare`.
5
+ * `content` is the cross-ingest-stable key; `id` is random per instance, so it is only the terminal key. Metadata keys are computed only on a content tie. */
39
6
  export function compareEntryIdentity(a, b) {
40
7
  return (compareStrings(a.content, b.content) ||
41
8
  layerRank(a.layer) - layerRank(b.layer) ||
@@ -69,15 +36,8 @@ function compareTags(a, b) {
69
36
  }
70
37
  return 0;
71
38
  }
72
- /**
73
- * score descending -> `compareEntryIdentity`. The shared ordering rule for
74
- * every score-primary recall sort site (search.ts, shared.ts, goals.ts,
75
- * api.ts, cli.ts, graph-recall.ts, multihop.ts, rerankers/cross-encoder.ts).
76
- * Sites delegate wholesale to this (via a thin arrow where the element
77
- * shape's score field is named something other than `score`, e.g.
78
- * `rerankScore`) rather than reimplementing `b.score - a.score` locally, so
79
- * the tiebreak can't silently drift between call sites.
80
- */
39
+ /** score descending, then `compareEntryIdentity`: the shared ordering for every score-primary recall sort site, which delegate here (via an arrow when the
40
+ * score field is not named `score`) so the tiebreak cannot drift between call sites. */
81
41
  export function compareScoredResults(a, b) {
82
42
  return compareScoresDesc(a.score, b.score) || compareEntryIdentity(a.entry, b.entry);
83
43
  }
@@ -89,22 +49,8 @@ export function compareScoresDesc(a, b) {
89
49
  return 1;
90
50
  return Number(Number.isNaN(a)) - Number(Number.isNaN(b));
91
51
  }
92
- /**
93
- * Build a score-desc -> tie-key comparator for the physics layer.
94
- *
95
- * `ScoredPhysicsResult` (physics.ts) carries `{ memoryId, baseScore,
96
- * clusterAmplification, finalScore }` -- NO `entry`/`content` in scope at
97
- * that layer, so `compareEntryIdentity` cannot apply directly. With only the
98
- * default memoryId key this is PER-INSTANCE-ONLY determinism; callers that need
99
- * CROSS-INGEST stability supply `tieKeyOf` mapping the result to its memory
100
- * CONTENT, because the baseScore tie order selects the cluster_top_k
101
- * amplification set, which MUTATES scores before the content-aware merge sort.
102
- *
103
- * A factory (not a fixed-field comparator) because physics.ts re-sorts the
104
- * same result array by two different score fields in sequence (`baseScore`
105
- * for top-K selection, then `finalScore` after cluster amplification) — one
106
- * shared tiebreak rule, parameterised by which field is primary this pass.
107
- */
52
+ /** Score-desc then tie-key comparator for the physics layer (no `entry`/`content` in scope): the default memoryId key is per-instance determinism only.
53
+ * Cross-ingest stability needs `tieKeyOf` (content), since the baseScore tie order picks the cluster_top_k set. A factory, as two fields sort in turn. */
108
54
  export function comparePhysicsResultsBy(scoreOf, tieKeyOf) {
109
55
  return (a, b) => {
110
56
  const d = compareScoresDesc(scoreOf(a), scoreOf(b));
@@ -19,10 +19,8 @@ export interface HippoConfig {
19
19
  enabled: boolean | 'auto';
20
20
  model: string;
21
21
  hybridWeight: number;
22
- /** Embedding backend. 'local' (default) = zero-dependency transformers.js.
23
- * 'openai' | 'voyage' | 'cohere' = opt-in API embedder; needs the provider's
24
- * API key in env (OPENAI_API_KEY / VOYAGE_API_KEY / COHERE_API_KEY).
25
- * See src/store/embeddings/provider.ts. */
22
+ /** Embedding backend: 'local' (default) = zero-dependency transformers.js; 'openai' | 'voyage' | 'cohere' = opt-in API embedder needing the provider's
23
+ * API key in env (OPENAI_API_KEY / VOYAGE_API_KEY / COHERE_API_KEY). See src/store/embeddings/provider.ts. */
26
24
  provider?: 'local' | 'openai' | 'voyage' | 'cohere';
27
25
  /** Optional API base-URL override (self-host / proxy). HTTPS only (localhost
28
26
  * may use http). Ignored by the local provider. */
@@ -57,18 +55,15 @@ export interface HippoConfig {
57
55
  autoTraceCapture: boolean;
58
56
  /** Only promote sessions whose session_complete event is within N days. */
59
57
  autoTraceWindowDays: number;
60
- /** Mid-session pinned-rule re-injection via the Claude Code UserPromptSubmit
61
- * hook. When enabled, pinned memories are re-injected each turn within the
62
- * given token budget. */
58
+ /** Mid-session pinned-rule re-injection through the UserPromptSubmit hook: pinned memories are re-injected each turn within the token budget. */
63
59
  pinnedInject: {
64
60
  enabled: boolean;
65
61
  budget: number;
66
62
  /** Skip a block identical to the one already injected this session
67
63
  * Default true. Needs a session id from the hook payload. */
68
64
  skipUnchanged: boolean;
69
- /** Resend an unchanged block after this many consecutive skips, so long
70
- * sessions still see pinned rules near the latest turn. Default 10; 0
71
- * never resends an unchanged block. */
65
+ /** Resend an unchanged block after this many consecutive skips, so long sessions still see pinned rules near the latest turn (default 10; 0 never
66
+ * resends). */
72
67
  refreshTurns: number;
73
68
  /** Gate the hook's backfill on the prompt's own content instead of the five
74
69
  * newest memories. Default true: the same overlap for fewer tokens. */
@@ -84,13 +79,8 @@ export interface HippoConfig {
84
79
  /** FTS candidate pool size per store before gating. Default 100. */
85
80
  promptRecallCandidates: number;
86
81
  };
87
- /** Memory scope isolation: when true (default), ambient context
88
- * (`hippo context`, the UserPromptSubmit hook, /v1/context, MCP
89
- * hippo_context) excludes memories owned by OTHER projects; explicit
90
- * recall is unaffected. Set false to disable the ORIGIN PARTITION only -
91
- * the secret veto is unconditional for ambient surfaces and no config or
92
- * flag re-includes secret-flagged rows (explicit recall still returns
93
- * them). */
82
+ /** Memory scope isolation (default true): ambient context (`hippo context`, the hook, /v1/context, MCP hippo_context) excludes OTHER projects' memories;
83
+ * explicit recall is unaffected. False disables the ORIGIN PARTITION only: the secret veto is unconditional, and no flag re-includes secret-flagged rows. */
94
84
  contextProjectIsolation: boolean;
95
85
  extraction: {
96
86
  enabled: boolean | 'auto';
@@ -114,13 +104,8 @@ export interface HippoConfig {
114
104
  memoryValue: {
115
105
  enabled: boolean;
116
106
  };
117
- /** Dormant memories (src/store/dormant.ts): when enabled (the default), the
118
- * sleep decay pass moves a memory that faded below the threshold into the
119
- * dormant store instead of deleting it. A dormant memory leaves recall and
120
- * context like a deleted one, but `hippo dormant restore <id>` brings it
121
- * back and `hippo dormant forget <id>` deletes it for good. A faded memory
122
- * the secret detector flags is always deleted, never kept dormant.
123
- * `{"enabled": false}` restores the old delete-on-fade behaviour. */
107
+ /** Dormant memories (src/store/dormant.ts), on by default: the sleep decay pass moves a memory that faded below the threshold there instead of deleting it
108
+ * (`hippo dormant restore|forget <id>`); a faded memory the secret detector flags is always deleted. `{"enabled": false}` restores delete-on-fade. */
124
109
  dormant: {
125
110
  enabled: boolean;
126
111
  /** Days a dormant memory is kept before sleep deletes it for good.
@@ -155,6 +140,7 @@ export interface HippoConfig {
155
140
  * and a context read must name the caller's project. Default false. Read it through isSharedStore. */
156
141
  sharedStore: boolean;
157
142
  }
143
+ export declare const DEFAULT_CONFIG: HippoConfig;
158
144
  export declare function loadConfig(hippoRoot: string): HippoConfig;
159
145
  /** True when the store's config.json sets `"sharedStore": true`. Once true, a root stays true for this process,
160
146
  * so a broken edit while a server runs cannot turn it off. Reads only this key, so loadConfig's warnings stay loadConfig's. */
@@ -8,7 +8,7 @@ import { DEFAULT_HALF_LIFE_DAYS } from './memory.js';
8
8
  import { DEFAULT_LOCAL_BUMP, DEFAULT_RECALL_BUDGET } from './search-types.js';
9
9
  import { errorMessage, log } from '../util/log.js';
10
10
  import { isJsonObject } from '../util/json.js';
11
- const DEFAULT_CONFIG = {
11
+ export const DEFAULT_CONFIG = {
12
12
  defaultHalfLifeDays: DEFAULT_HALF_LIFE_DAYS,
13
13
  defaultBudget: DEFAULT_RECALL_BUDGET,
14
14
  defaultContextBudget: 3000,
@@ -158,8 +158,7 @@ function memoryValueOverride(raw) {
158
158
  return memoryValueRaw !== undefined && isJsonObject(memoryValueRaw) ? memoryValueRaw : {};
159
159
  }
160
160
  function dormantSettings(raw) {
161
- // Same rule as memoryValue above: a malformed value never silently
162
- // changes what sleep does. Anything but a real object / boolean / number
161
+ // Same rule as memoryValue above: a malformed value never silently changes what sleep does; anything but a real object / boolean / number
163
162
  // warns and falls back to the default, which keeps faded memories.
164
163
  const dormantRaw = raw.dormant;
165
164
  if (dormantRaw !== undefined && !isJsonObject(dormantRaw)) {
@@ -274,22 +273,22 @@ function configOverDefaults(raw) {
274
273
  decayBasis: validBasis ? basis : DEFAULT_CONFIG.decayBasis,
275
274
  autoLearnOnSleep: raw.autoLearnOnSleep ?? DEFAULT_CONFIG.autoLearnOnSleep,
276
275
  autoShareOnSleep: raw.autoShareOnSleep ?? DEFAULT_CONFIG.autoShareOnSleep,
277
- autoSleep: { ...DEFAULT_CONFIG.autoSleep, ...(raw.autoSleep ?? {}) },
278
- embeddings: { ...DEFAULT_CONFIG.embeddings, ...(raw.embeddings ?? {}) },
279
- global: { ...DEFAULT_CONFIG.global, ...(raw.global ?? {}) },
276
+ autoSleep: { ...DEFAULT_CONFIG.autoSleep, ...raw.autoSleep },
277
+ embeddings: { ...DEFAULT_CONFIG.embeddings, ...raw.embeddings },
278
+ global: { ...DEFAULT_CONFIG.global, ...raw.global },
280
279
  gitLearnPatterns: raw.gitLearnPatterns ?? DEFAULT_CONFIG.gitLearnPatterns,
281
280
  physics: mergePhysicsConfig(raw.physics),
282
- mmr: { ...DEFAULT_CONFIG.mmr, ...(raw.mmr ?? {}) },
283
- search: { ...DEFAULT_CONFIG.search, ...(raw.search ?? {}) },
284
- replay: { ...DEFAULT_CONFIG.replay, ...(raw.replay ?? {}) },
281
+ mmr: { ...DEFAULT_CONFIG.mmr, ...raw.mmr },
282
+ search: { ...DEFAULT_CONFIG.search, ...raw.search },
283
+ replay: { ...DEFAULT_CONFIG.replay, ...raw.replay },
285
284
  autoTraceCapture: raw.autoTraceCapture ?? DEFAULT_CONFIG.autoTraceCapture,
286
285
  autoTraceWindowDays: raw.autoTraceWindowDays ?? DEFAULT_CONFIG.autoTraceWindowDays,
287
- pinnedInject: { ...DEFAULT_CONFIG.pinnedInject, ...(raw.pinnedInject ?? {}) },
286
+ pinnedInject: { ...DEFAULT_CONFIG.pinnedInject, ...raw.pinnedInject },
288
287
  contextProjectIsolation: raw.contextProjectIsolation ?? DEFAULT_CONFIG.contextProjectIsolation,
289
- extraction: { ...DEFAULT_CONFIG.extraction, ...(raw.extraction ?? {}) },
290
- multihop: { ...DEFAULT_CONFIG.multihop, ...(raw.multihop ?? {}) },
291
- salience: { ...DEFAULT_CONFIG.salience, ...(raw.salience ?? {}) },
292
- ambient: { ...DEFAULT_CONFIG.ambient, ...(raw.ambient ?? {}) },
288
+ extraction: { ...DEFAULT_CONFIG.extraction, ...raw.extraction },
289
+ multihop: { ...DEFAULT_CONFIG.multihop, ...raw.multihop },
290
+ salience: { ...DEFAULT_CONFIG.salience, ...raw.salience },
291
+ ambient: { ...DEFAULT_CONFIG.ambient, ...raw.ambient },
293
292
  memoryValue: {
294
293
  ...DEFAULT_CONFIG.memoryValue,
295
294
  ...memoryValue,