hippo-memory 1.71.0 → 2.0.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 (625) hide show
  1. package/README.md +7 -5
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +11 -26
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/copilot.d.ts +1 -3
  7. package/dist/agent-memories/copilot.js +1 -17
  8. package/dist/agent-memories/project-folds.d.ts +10 -0
  9. package/dist/agent-memories/project-folds.js +34 -0
  10. package/dist/agent-memories/sync.js +8 -6
  11. package/dist/api/assemble.js +3 -2
  12. package/dist/api/audit.d.ts +30 -2
  13. package/dist/api/audit.js +48 -7
  14. package/dist/api/auth.d.ts +11 -9
  15. package/dist/api/auth.js +39 -40
  16. package/dist/api/auto-sleep.d.ts +5 -2
  17. package/dist/api/auto-sleep.js +7 -3
  18. package/dist/api/availability.js +2 -3
  19. package/dist/api/cards.d.ts +42 -0
  20. package/dist/api/cards.js +52 -0
  21. package/dist/api/conflicts.d.ts +28 -0
  22. package/dist/api/conflicts.js +61 -0
  23. package/dist/api/context-auto.js +4 -2
  24. package/dist/api/context-render.js +4 -3
  25. package/dist/api/context-select.js +15 -29
  26. package/dist/api/context.js +29 -18
  27. package/dist/api/continuity.d.ts +47 -0
  28. package/dist/api/continuity.js +66 -0
  29. package/dist/api/dormant.js +4 -2
  30. package/dist/api/drill-down.js +3 -2
  31. package/dist/api/embeddings.d.ts +17 -0
  32. package/dist/api/embeddings.js +28 -0
  33. package/dist/api/error-reply.d.ts +8 -0
  34. package/dist/api/error-reply.js +21 -0
  35. package/dist/api/forget.d.ts +7 -3
  36. package/dist/api/forget.js +24 -14
  37. package/dist/api/goals.d.ts +1 -1
  38. package/dist/api/goals.js +5 -9
  39. package/dist/api/graph.js +2 -1
  40. package/dist/api/index.d.ts +4 -2
  41. package/dist/api/index.js +4 -2
  42. package/dist/api/instruction-detect.js +5 -1
  43. package/dist/api/learn.d.ts +5 -1
  44. package/dist/api/learn.js +71 -44
  45. package/dist/api/ledger-db.d.ts +2 -6
  46. package/dist/api/ledger-db.js +4 -36
  47. package/dist/api/memories.d.ts +21 -1
  48. package/dist/api/memories.js +51 -1
  49. package/dist/api/objects.d.ts +1 -1
  50. package/dist/api/objects.js +2 -1
  51. package/dist/api/outcome.d.ts +5 -5
  52. package/dist/api/outcome.js +17 -16
  53. package/dist/api/pilot-arm.d.ts +1 -11
  54. package/dist/api/pilot-arm.js +5 -45
  55. package/dist/api/predictions.d.ts +3 -1
  56. package/dist/api/predictions.js +8 -1
  57. package/dist/api/projects.d.ts +21 -0
  58. package/dist/api/projects.js +24 -0
  59. package/dist/api/promote.d.ts +3 -3
  60. package/dist/api/promote.js +26 -28
  61. package/dist/api/prompt-hook.d.ts +17 -2
  62. package/dist/api/prompt-hook.js +45 -4
  63. package/dist/api/quarantine.js +2 -1
  64. package/dist/api/recall-cli.d.ts +3 -0
  65. package/dist/api/recall-cli.js +13 -4
  66. package/dist/api/recall-core.js +10 -5
  67. package/dist/api/recall-pipeline.js +23 -24
  68. package/dist/api/recall-request.js +1 -1
  69. package/dist/api/recall-types.d.ts +3 -1
  70. package/dist/api/recall.d.ts +0 -3
  71. package/dist/api/recall.js +51 -73
  72. package/dist/api/remember-local.d.ts +5 -2
  73. package/dist/api/remember-local.js +15 -7
  74. package/dist/api/remember.d.ts +7 -3
  75. package/dist/api/remember.js +19 -16
  76. package/dist/api/session-end.d.ts +46 -0
  77. package/dist/api/session-end.js +131 -0
  78. package/dist/api/sleep-run.d.ts +1 -1
  79. package/dist/api/sleep-run.js +16 -11
  80. package/dist/api/sleep.js +4 -3
  81. package/dist/api/status.d.ts +24 -0
  82. package/dist/api/status.js +40 -0
  83. package/dist/api/store-init.d.ts +4 -0
  84. package/dist/api/store-init.js +9 -0
  85. package/dist/api/tokens.js +2 -2
  86. package/dist/api/types.d.ts +3 -7
  87. package/dist/api/types.js +6 -1
  88. package/dist/capture/caller-session.d.ts +0 -3
  89. package/dist/capture/caller-session.js +1 -12
  90. package/dist/capture/capture-error.d.ts +2 -2
  91. package/dist/capture/capture-error.js +23 -18
  92. package/dist/capture/codex-patch.js +3 -1
  93. package/dist/capture/command.js +36 -95
  94. package/dist/capture/compact.js +10 -5
  95. package/dist/capture/compaction-items-caller.js +11 -20
  96. package/dist/capture/compaction-record.d.ts +7 -93
  97. package/dist/capture/compaction-record.js +29 -426
  98. package/dist/capture/compaction-spool.d.ts +7 -7
  99. package/dist/capture/compaction-spool.js +60 -51
  100. package/dist/capture/copilot-transcript.d.ts +2 -1
  101. package/dist/capture/copilot-transcript.js +2 -1
  102. package/dist/capture/extract.d.ts +5 -2
  103. package/dist/capture/extract.js +4 -3
  104. package/dist/capture/failure-caller.d.ts +1 -1
  105. package/dist/capture/failure-caller.js +21 -16
  106. package/dist/capture/failure-reading.d.ts +2 -1
  107. package/dist/capture/failure-reading.js +7 -9
  108. package/dist/capture/pre-compact-caller.js +5 -4
  109. package/dist/capture/session-digest.js +4 -3
  110. package/dist/capture/session-end-caller.js +3 -2
  111. package/dist/capture/session-worker.js +22 -10
  112. package/dist/capture/transcript.d.ts +2 -1
  113. package/dist/capture/transcript.js +6 -3
  114. package/dist/capture/working-state.d.ts +4 -2
  115. package/dist/capture/working-state.js +4 -2
  116. package/dist/cli/audit-prune.d.ts +0 -25
  117. package/dist/cli/audit-prune.js +1 -27
  118. package/dist/cli/audit.js +20 -20
  119. package/dist/cli/auth.d.ts +1 -1
  120. package/dist/cli/auth.js +16 -17
  121. package/dist/cli/briefs.d.ts +1 -4
  122. package/dist/cli/briefs.js +37 -292
  123. package/dist/cli/card.js +41 -33
  124. package/dist/cli/client.d.ts +6 -2
  125. package/dist/cli/client.js +37 -21
  126. package/dist/cli/compact-resume-payload.js +1 -1
  127. package/dist/cli/context.d.ts +1 -1
  128. package/dist/cli/context.js +13 -13
  129. package/dist/cli/continuity.d.ts +1 -1
  130. package/dist/cli/continuity.js +36 -39
  131. package/dist/cli/curate.d.ts +2 -2
  132. package/dist/cli/curate.js +32 -36
  133. package/dist/cli/dag.d.ts +1 -1
  134. package/dist/cli/dag.js +23 -8
  135. package/dist/cli/decisions.d.ts +0 -2
  136. package/dist/cli/decisions.js +7 -285
  137. package/dist/cli/eval.d.ts +1 -1
  138. package/dist/cli/eval.js +12 -13
  139. package/dist/cli/explain.d.ts +1 -1
  140. package/dist/cli/explain.js +21 -25
  141. package/dist/cli/flag-values.js +16 -6
  142. package/dist/cli/flags.d.ts +0 -289
  143. package/dist/cli/flags.js +3 -138
  144. package/dist/cli/graph.d.ts +3 -0
  145. package/dist/cli/graph.js +83 -0
  146. package/dist/cli/hook-runtime.d.ts +6 -6
  147. package/dist/cli/hook-runtime.js +9 -36
  148. package/dist/cli/incidents.d.ts +3 -0
  149. package/dist/cli/incidents.js +112 -0
  150. package/dist/cli/init.d.ts +1 -1
  151. package/dist/cli/init.js +28 -19
  152. package/dist/cli/install-steps.d.ts +2 -1
  153. package/dist/cli/install-steps.js +11 -3
  154. package/dist/cli/last-sleep.js +1 -1
  155. package/dist/cli/maintenance.d.ts +3 -3
  156. package/dist/cli/maintenance.js +29 -30
  157. package/dist/cli/notes.d.ts +2 -0
  158. package/dist/cli/notes.js +41 -0
  159. package/dist/cli/object-verbs.d.ts +2 -2
  160. package/dist/cli/object-verbs.js +4 -4
  161. package/dist/cli/open-browser.d.ts +14 -0
  162. package/dist/cli/open-browser.js +26 -0
  163. package/dist/cli/playbooks.d.ts +3 -4
  164. package/dist/cli/playbooks.js +126 -290
  165. package/dist/cli/predictions.d.ts +3 -0
  166. package/dist/cli/predictions.js +174 -0
  167. package/dist/cli/print.js +2 -1
  168. package/dist/cli/projects.js +30 -22
  169. package/dist/cli/quality-repair-once.d.ts +1 -1
  170. package/dist/cli/quality-repair-once.js +6 -5
  171. package/dist/cli/recall.js +13 -7
  172. package/dist/cli/refine-llm.js +18 -17
  173. package/dist/cli/remember.js +17 -17
  174. package/dist/cli/scheduler.js +2 -1
  175. package/dist/cli/serve.js +11 -6
  176. package/dist/cli/session-hooks.d.ts +1 -5
  177. package/dist/cli/session-hooks.js +89 -168
  178. package/dist/cli/setup.d.ts +1 -1
  179. package/dist/cli/setup.js +17 -10
  180. package/dist/cli/shared.d.ts +2 -6
  181. package/dist/cli/shared.js +9 -29
  182. package/dist/cli/sleep-render.js +6 -3
  183. package/dist/cli/sleep.js +6 -37
  184. package/dist/cli/status.d.ts +3 -3
  185. package/dist/cli/status.js +32 -35
  186. package/dist/cli/transfer.d.ts +3 -3
  187. package/dist/cli/transfer.js +64 -43
  188. package/dist/cli/usage.d.ts +1 -80
  189. package/dist/cli/usage.js +2 -696
  190. package/dist/cli/verb-row.d.ts +34 -0
  191. package/dist/cli/verb-row.js +6 -0
  192. package/dist/cli/verbs/health.d.ts +27 -0
  193. package/dist/cli/verbs/health.js +234 -0
  194. package/dist/cli/verbs/memory.d.ts +16 -0
  195. package/dist/cli/verbs/memory.js +236 -0
  196. package/dist/cli/verbs/objects.d.ts +20 -0
  197. package/dist/cli/verbs/objects.js +257 -0
  198. package/dist/cli/verbs/sessions.d.ts +31 -0
  199. package/dist/cli/verbs/sessions.js +314 -0
  200. package/dist/cli/verbs.d.ts +81 -0
  201. package/dist/cli/verbs.js +7 -0
  202. package/dist/cli/versioned-verbs.d.ts +51 -0
  203. package/dist/cli/versioned-verbs.js +79 -0
  204. package/dist/cli.d.ts +1 -272
  205. package/dist/cli.js +24 -315
  206. package/dist/connectors/dlq.d.ts +39 -3
  207. package/dist/connectors/dlq.js +39 -4
  208. package/dist/connectors/github/backfill.js +12 -3
  209. package/dist/connectors/github/deletion.js +2 -1
  210. package/dist/connectors/github/dlq.js +31 -73
  211. package/dist/connectors/github/ingest.d.ts +2 -6
  212. package/dist/connectors/github/ingest.js +5 -29
  213. package/dist/connectors/github/tenant-routing.js +2 -1
  214. package/dist/connectors/github/webhook.d.ts +2 -1
  215. package/dist/connectors/github/webhook.js +35 -2
  216. package/dist/connectors/ingest.d.ts +10 -0
  217. package/dist/connectors/ingest.js +29 -0
  218. package/dist/connectors/slack/deletion.js +2 -1
  219. package/dist/connectors/slack/dlq.js +49 -71
  220. package/dist/connectors/slack/ingest.d.ts +2 -6
  221. package/dist/connectors/slack/ingest.js +4 -28
  222. package/dist/connectors/slack/tenant-routing.js +2 -1
  223. package/dist/connectors/slack/webhook.d.ts +2 -1
  224. package/dist/connectors/slack/webhook.js +2 -1
  225. package/dist/consolidate/conflicts.js +2 -2
  226. package/dist/consolidate/dag.js +29 -18
  227. package/dist/consolidate/dedupe.d.ts +7 -0
  228. package/dist/consolidate/dedupe.js +6 -4
  229. package/dist/consolidate/llm-passes.js +45 -19
  230. package/dist/consolidate/memory-value.js +3 -2
  231. package/dist/consolidate/merge.js +8 -8
  232. package/dist/consolidate/physics-pass.d.ts +6 -1
  233. package/dist/consolidate/physics-pass.js +26 -6
  234. package/dist/consolidate/replay.js +11 -4
  235. package/dist/consolidate/sleep.js +9 -6
  236. package/dist/consolidate/traces.js +5 -5
  237. package/dist/core/ablation.d.ts +10 -0
  238. package/dist/core/ablation.js +12 -0
  239. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  240. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  241. package/dist/core/ambient.d.ts +4 -0
  242. package/dist/core/ambient.js +39 -18
  243. package/dist/core/api-errors.d.ts +16 -0
  244. package/dist/core/api-errors.js +20 -0
  245. package/dist/core/card.js +3 -1
  246. package/dist/core/compaction-timing.d.ts +7 -0
  247. package/dist/core/compaction-timing.js +9 -0
  248. package/dist/core/config.d.ts +1 -1
  249. package/dist/core/config.js +22 -18
  250. package/dist/core/cosine.d.ts +3 -0
  251. package/dist/core/cosine.js +19 -0
  252. package/dist/{store → core}/markdown.d.ts +1 -1
  253. package/dist/{store → core}/markdown.js +4 -4
  254. package/dist/core/memory-audit.d.ts +17 -0
  255. package/dist/core/memory-audit.js +54 -0
  256. package/dist/core/memory.d.ts +14 -8
  257. package/dist/core/memory.js +35 -23
  258. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  259. package/dist/{consolidate → core}/merged-row.js +1 -1
  260. package/dist/core/physics.d.ts +3 -1
  261. package/dist/core/physics.js +23 -18
  262. package/dist/core/prediction.d.ts +3 -0
  263. package/dist/core/prediction.js +6 -0
  264. package/dist/core/project-identity.d.ts +3 -0
  265. package/dist/core/project-identity.js +12 -2
  266. package/dist/{store → core}/recall-scope.d.ts +1 -10
  267. package/dist/{store → core}/recall-scope.js +2 -19
  268. package/dist/core/search-types.d.ts +1 -1
  269. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  270. package/dist/dashboard/dashboard-actions.js +5 -5
  271. package/dist/dashboard/dashboard-queries.js +2 -7
  272. package/dist/dashboard/dashboard-snapshot.js +1 -3
  273. package/dist/dashboard/dashboard.js +16 -5
  274. package/dist/db/busy.d.ts +2 -7
  275. package/dist/db/busy.js +21 -26
  276. package/dist/db/connect.d.ts +2 -2
  277. package/dist/db/connect.js +7 -7
  278. package/dist/db/index.d.ts +3 -3
  279. package/dist/db/index.js +3 -3
  280. package/dist/db/migrate.js +14 -7
  281. package/dist/db/migrations/index.d.ts +1 -1
  282. package/dist/db/migrations/index.js +3 -1
  283. package/dist/db/migrations/v11.js +1 -0
  284. package/dist/db/migrations/v14.js +1 -0
  285. package/dist/db/migrations/v55.d.ts +3 -0
  286. package/dist/db/migrations/v55.js +17 -0
  287. package/dist/db/open.d.ts +0 -2
  288. package/dist/db/open.js +6 -10
  289. package/dist/db/physics-state.d.ts +0 -4
  290. package/dist/db/physics-state.js +7 -33
  291. package/dist/db/request-stores.d.ts +1 -0
  292. package/dist/db/request-stores.js +2 -1
  293. package/dist/db/tables.d.ts +2 -0
  294. package/dist/db/tables.js +6 -2
  295. package/dist/db/vector-store.js +19 -5
  296. package/dist/db/wal-checkpointer.js +2 -1
  297. package/dist/doctor.d.ts +3 -0
  298. package/dist/doctor.js +18 -15
  299. package/dist/embeddings/local.d.ts +62 -0
  300. package/dist/embeddings/local.js +146 -0
  301. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  302. package/dist/{store/embeddings → embeddings}/provider.js +19 -25
  303. package/dist/embeddings/transformers.d.ts +26 -0
  304. package/dist/embeddings/transformers.js +89 -0
  305. package/dist/entry/session-text.d.ts +1 -1
  306. package/dist/entry/session-text.js +1 -1
  307. package/dist/entry/store-kit.d.ts +37 -0
  308. package/dist/entry/store-kit.js +25 -0
  309. package/dist/entry/testing.d.ts +6 -0
  310. package/dist/entry/testing.js +7 -0
  311. package/dist/eval/eval-suite.js +17 -11
  312. package/dist/eval/eval.js +1 -1
  313. package/dist/eval/judgment.js +12 -5
  314. package/dist/graph/extract.js +3 -3
  315. package/dist/graph/recall.js +1 -1
  316. package/dist/graph/view.js +13 -5
  317. package/dist/graph/write.d.ts +1 -1
  318. package/dist/graph/write.js +9 -9
  319. package/dist/hooks/codex-session.js +3 -2
  320. package/dist/hooks/codex-wrapper.js +2 -1
  321. package/dist/hooks/json-hooks.js +10 -4
  322. package/dist/hooks/opencode.js +8 -5
  323. package/dist/hooks/shared.d.ts +0 -6
  324. package/dist/hooks/shared.js +4 -15
  325. package/dist/importers/core.js +4 -4
  326. package/dist/importers/sources.js +5 -4
  327. package/dist/importers/vault.d.ts +1 -1
  328. package/dist/importers/vault.js +25 -23
  329. package/dist/index.d.ts +5 -4
  330. package/dist/index.js +4 -3
  331. package/dist/learn/autolearn.d.ts +15 -3
  332. package/dist/learn/autolearn.js +38 -16
  333. package/dist/learn/churn-git.js +13 -4
  334. package/dist/learn/extract.d.ts +3 -2
  335. package/dist/learn/extract.js +7 -5
  336. package/dist/learn/forward-claim-detector.js +4 -2
  337. package/dist/learn/invalidation.d.ts +2 -1
  338. package/dist/learn/invalidation.js +18 -9
  339. package/dist/mcp/admin-tools.d.ts +2 -2
  340. package/dist/mcp/admin-tools.js +27 -48
  341. package/dist/mcp/format.js +3 -2
  342. package/dist/mcp/framing.d.ts +1 -0
  343. package/dist/mcp/framing.js +1 -1
  344. package/dist/mcp/memory-tools.d.ts +1 -1
  345. package/dist/mcp/memory-tools.js +8 -9
  346. package/dist/mcp/protocol.d.ts +11 -7
  347. package/dist/mcp/protocol.js +25 -12
  348. package/dist/mcp/recall-tools.js +12 -9
  349. package/dist/mcp/request.js +22 -20
  350. package/dist/mcp/stdio.js +37 -16
  351. package/dist/mcp/tool-args.js +2 -1
  352. package/dist/mcp/tools.js +44 -21
  353. package/dist/objects/customer-notes.d.ts +2 -2
  354. package/dist/objects/decisions.d.ts +2 -2
  355. package/dist/objects/descriptor.d.ts +1 -1
  356. package/dist/objects/incidents.d.ts +2 -2
  357. package/dist/objects/lifecycle.d.ts +1 -1
  358. package/dist/objects/lifecycle.js +2 -1
  359. package/dist/objects/policies.d.ts +2 -2
  360. package/dist/objects/policies.js +2 -1
  361. package/dist/objects/processes.d.ts +2 -2
  362. package/dist/objects/project-briefs.d.ts +2 -2
  363. package/dist/objects/project-briefs.js +2 -3
  364. package/dist/objects/skills.d.ts +2 -2
  365. package/dist/postinstall.js +1 -1
  366. package/dist/rerankers/clef.js +3 -6
  367. package/dist/rerankers/cross-encoder.d.ts +31 -2
  368. package/dist/rerankers/cross-encoder.js +71 -98
  369. package/dist/rerankers/index.js +5 -4
  370. package/dist/rerankers/jev.js +2 -4
  371. package/dist/rerankers/outage-warning.d.ts +3 -1
  372. package/dist/rerankers/outage-warning.js +5 -3
  373. package/dist/search/bm25-search.js +1 -1
  374. package/dist/search/boosts.js +1 -1
  375. package/dist/search/embed-memories.d.ts +12 -0
  376. package/dist/search/embed-memories.js +389 -0
  377. package/dist/search/engine.d.ts +8 -0
  378. package/dist/search/engine.js +10 -0
  379. package/dist/search/goal-boost.d.ts +1 -1
  380. package/dist/search/goal-boost.js +6 -3
  381. package/dist/search/hybrid.d.ts +9 -2
  382. package/dist/search/hybrid.js +9 -4
  383. package/dist/search/physics-search.d.ts +6 -3
  384. package/dist/search/physics-search.js +22 -15
  385. package/dist/search/rerank.js +1 -1
  386. package/dist/search/vector.d.ts +8 -6
  387. package/dist/search/vector.js +14 -17
  388. package/dist/server/auth.d.ts +3 -1
  389. package/dist/server/auth.js +24 -15
  390. package/dist/server/boot.d.ts +2 -1
  391. package/dist/server/boot.js +34 -84
  392. package/dist/server/client-ip.d.ts +9 -6
  393. package/dist/server/client-ip.js +36 -17
  394. package/dist/server/deadline.d.ts +0 -2
  395. package/dist/server/deadline.js +1 -7
  396. package/dist/server/defaults.d.ts +1 -0
  397. package/dist/server/defaults.js +1 -0
  398. package/dist/server/mcp-http.js +16 -11
  399. package/dist/server/request.js +7 -2
  400. package/dist/server/route-checks.d.ts +7 -0
  401. package/dist/server/route-checks.js +42 -0
  402. package/dist/server/route-table.d.ts +9 -8
  403. package/dist/server/route-table.js +127 -133
  404. package/dist/server/routes/admin.d.ts +8 -8
  405. package/dist/server/routes/admin.js +13 -21
  406. package/dist/server/routes/customer-notes.d.ts +6 -6
  407. package/dist/server/routes/customer-notes.js +1 -2
  408. package/dist/server/routes/decisions.d.ts +6 -6
  409. package/dist/server/routes/decisions.js +2 -4
  410. package/dist/server/routes/incidents.d.ts +6 -6
  411. package/dist/server/routes/incidents.js +2 -5
  412. package/dist/server/routes/memories.d.ts +9 -9
  413. package/dist/server/routes/memories.js +19 -40
  414. package/dist/server/routes/object-routes.d.ts +6 -6
  415. package/dist/server/routes/object-routes.js +4 -7
  416. package/dist/server/routes/policies.d.ts +7 -7
  417. package/dist/server/routes/policies.js +2 -4
  418. package/dist/server/routes/predictions.d.ts +6 -6
  419. package/dist/server/routes/predictions.js +9 -13
  420. package/dist/server/routes/processes.d.ts +6 -6
  421. package/dist/server/routes/processes.js +1 -2
  422. package/dist/server/routes/project-briefs.d.ts +7 -7
  423. package/dist/server/routes/project-briefs.js +2 -4
  424. package/dist/server/routes/recall.d.ts +5 -5
  425. package/dist/server/routes/recall.js +6 -10
  426. package/dist/server/routes/skills.d.ts +7 -7
  427. package/dist/server/routes/skills.js +2 -4
  428. package/dist/server/server-detect.d.ts +7 -1
  429. package/dist/server/server-detect.js +36 -11
  430. package/dist/server/sleep-child.js +26 -7
  431. package/dist/server/sleep-offload.d.ts +11 -5
  432. package/dist/server/sleep-offload.js +17 -11
  433. package/dist/server/tls.d.ts +7 -2
  434. package/dist/server/tls.js +17 -5
  435. package/dist/server/types.d.ts +29 -12
  436. package/dist/server/validation.d.ts +1 -2
  437. package/dist/server/validation.js +6 -11
  438. package/dist/server.d.ts +4 -40
  439. package/dist/server.js +3 -29
  440. package/dist/sharing/global-store.d.ts +4 -5
  441. package/dist/sharing/global-store.js +8 -13
  442. package/dist/sharing/global-sync.js +38 -45
  443. package/dist/sharing/project-merge.d.ts +7 -14
  444. package/dist/sharing/project-merge.js +57 -121
  445. package/dist/sharing/search-both.js +10 -3
  446. package/dist/sharing/share.d.ts +2 -0
  447. package/dist/sharing/share.js +39 -38
  448. package/dist/store/ambient.js +7 -7
  449. package/dist/store/audit-event.d.ts +1 -1
  450. package/dist/store/audit.d.ts +0 -16
  451. package/dist/store/audit.js +4 -55
  452. package/dist/store/auth.d.ts +4 -2
  453. package/dist/store/auth.js +7 -3
  454. package/dist/store/candidates.d.ts +3 -2
  455. package/dist/store/candidates.js +59 -30
  456. package/dist/store/capture-write.d.ts +17 -0
  457. package/dist/store/capture-write.js +35 -0
  458. package/dist/store/cards.js +6 -5
  459. package/dist/store/compaction-caller.d.ts +18 -0
  460. package/dist/store/compaction-caller.js +29 -0
  461. package/dist/store/compactions-record.d.ts +115 -0
  462. package/dist/store/compactions-record.js +418 -0
  463. package/dist/store/compactions.js +6 -4
  464. package/dist/store/conflicts.d.ts +7 -1
  465. package/dist/store/conflicts.js +13 -9
  466. package/dist/store/connectors/dlq.d.ts +10 -0
  467. package/dist/store/connectors/dlq.js +33 -0
  468. package/dist/store/connectors/event-log.d.ts +13 -0
  469. package/dist/store/connectors/event-log.js +24 -0
  470. package/dist/store/connectors/github.d.ts +7 -9
  471. package/dist/store/connectors/github.js +35 -60
  472. package/dist/store/connectors/slack.d.ts +2 -11
  473. package/dist/store/connectors/slack.js +24 -57
  474. package/dist/store/dashboard-reads.js +8 -6
  475. package/dist/store/delete-and-batch.d.ts +6 -0
  476. package/dist/store/delete-and-batch.js +40 -6
  477. package/dist/store/delivery-recorder.d.ts +12 -5
  478. package/dist/store/delivery-recorder.js +13 -11
  479. package/dist/store/descendant-page.js +8 -4
  480. package/dist/store/dormant.d.ts +1 -1
  481. package/dist/store/dormant.js +10 -4
  482. package/dist/store/embeddings/index.d.ts +2 -12
  483. package/dist/store/embeddings/index.js +5 -374
  484. package/dist/store/entry-reads.d.ts +35 -4
  485. package/dist/store/entry-reads.js +86 -19
  486. package/dist/store/entry-row.js +9 -2
  487. package/dist/store/entry-writes.d.ts +15 -12
  488. package/dist/store/entry-writes.js +54 -22
  489. package/dist/store/failure-log-at.d.ts +8 -0
  490. package/dist/store/failure-log-at.js +16 -0
  491. package/dist/store/failure-log.d.ts +2 -2
  492. package/dist/store/failure-log.js +5 -3
  493. package/dist/{trust → store}/gated-write.d.ts +3 -1
  494. package/dist/{trust → store}/gated-write.js +7 -5
  495. package/dist/store/goals.js +22 -19
  496. package/dist/store/graph-reads.js +9 -6
  497. package/dist/store/graph-view-rows.js +2 -1
  498. package/dist/store/graph-writes.d.ts +6 -6
  499. package/dist/store/graph-writes.js +48 -71
  500. package/dist/store/half-life.js +2 -2
  501. package/dist/store/handoffs.d.ts +10 -4
  502. package/dist/store/handoffs.js +10 -9
  503. package/dist/store/index-and-stats.js +2 -2
  504. package/dist/store/index.d.ts +2 -2
  505. package/dist/store/index.js +1 -1
  506. package/dist/store/key-writes.js +1 -1
  507. package/dist/store/ledger-turn.d.ts +9 -0
  508. package/dist/store/ledger-turn.js +38 -0
  509. package/dist/store/mirrors.js +19 -10
  510. package/dist/store/open.d.ts +2 -5
  511. package/dist/store/open.js +42 -54
  512. package/dist/store/pilot-arm.d.ts +12 -0
  513. package/dist/store/pilot-arm.js +42 -0
  514. package/dist/store/port.d.ts +68 -6
  515. package/dist/store/port.js +8 -0
  516. package/dist/store/predictions.d.ts +1 -2
  517. package/dist/store/predictions.js +3 -6
  518. package/dist/store/project-tags.d.ts +62 -0
  519. package/dist/store/project-tags.js +67 -0
  520. package/dist/store/quality-repair.js +1 -1
  521. package/dist/store/quarantine.js +2 -1
  522. package/dist/store/recall-trace.d.ts +2 -0
  523. package/dist/store/recall-trace.js +20 -3
  524. package/dist/store/rejected-values.js +16 -10
  525. package/dist/store/rejection-probe.d.ts +4 -0
  526. package/dist/store/rejection-probe.js +19 -0
  527. package/dist/store/rejection.d.ts +0 -17
  528. package/dist/store/rejection.js +1 -21
  529. package/dist/store/rows.js +2 -2
  530. package/dist/store/rule-sql.d.ts +11 -0
  531. package/dist/store/rule-sql.js +31 -6
  532. package/dist/store/search-rows.d.ts +5 -5
  533. package/dist/store/search-rows.js +18 -16
  534. package/dist/store/sessions.js +4 -2
  535. package/dist/store/set-aside.d.ts +14 -0
  536. package/dist/store/set-aside.js +23 -0
  537. package/dist/store/sqlite/busy.d.ts +3 -0
  538. package/dist/store/sqlite/busy.js +8 -0
  539. package/dist/store/sqlite/connector-events-group.js +4 -7
  540. package/dist/store/sqlite/connector-writes-group.js +6 -4
  541. package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
  542. package/dist/store/sqlite/entry-writes-group.js +3 -3
  543. package/dist/store/sqlite/error-codec.js +4 -3
  544. package/dist/store/sqlite/executor.js +10 -4
  545. package/dist/store/sqlite/graph-reads-group.js +1 -1
  546. package/dist/store/sqlite/held-connection.d.ts +11 -0
  547. package/dist/store/sqlite/held-connection.js +41 -0
  548. package/dist/store/sqlite/last-recall-group.d.ts +13 -0
  549. package/dist/store/sqlite/last-recall-group.js +57 -0
  550. package/dist/store/sqlite/local.d.ts +0 -17
  551. package/dist/store/sqlite/local.js +0 -31
  552. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  553. package/dist/store/sqlite/maintenance-groups.js +60 -0
  554. package/dist/store/sqlite/object-rows.d.ts +1 -1
  555. package/dist/store/sqlite/objects-group.d.ts +1 -1
  556. package/dist/store/sqlite/objects-group.js +15 -7
  557. package/dist/store/sqlite/store.d.ts +1 -8
  558. package/dist/store/sqlite/store.js +13 -22
  559. package/dist/store/summaries.d.ts +10 -3
  560. package/dist/store/summaries.js +54 -11
  561. package/dist/store/token-ledger-rows.js +3 -2
  562. package/dist/store/token-ledger.d.ts +0 -7
  563. package/dist/store/token-ledger.js +0 -35
  564. package/dist/store/vector-index.js +8 -4
  565. package/dist/support-bundle.js +2 -3
  566. package/dist/trust/reject-flow.js +2 -2
  567. package/dist/util/agent-homes.d.ts +15 -0
  568. package/dist/util/agent-homes.js +34 -0
  569. package/dist/util/anthropic-messages.d.ts +6 -1
  570. package/dist/util/anthropic-messages.js +26 -7
  571. package/dist/util/atomic-write.d.ts +5 -2
  572. package/dist/util/atomic-write.js +12 -8
  573. package/dist/util/chunked.d.ts +3 -0
  574. package/dist/util/chunked.js +10 -0
  575. package/dist/util/ellipsize.d.ts +3 -0
  576. package/dist/util/ellipsize.js +5 -0
  577. package/dist/util/env.d.ts +12 -2
  578. package/dist/util/env.js +12 -2
  579. package/dist/util/format.d.ts +5 -0
  580. package/dist/util/format.js +10 -0
  581. package/dist/util/hook-payload.d.ts +8 -0
  582. package/dist/util/hook-payload.js +37 -0
  583. package/dist/util/http-retry.d.ts +6 -0
  584. package/dist/util/http-retry.js +43 -5
  585. package/dist/util/http-util.d.ts +0 -8
  586. package/dist/util/http-util.js +10 -21
  587. package/dist/util/limits.d.ts +7 -0
  588. package/dist/util/limits.js +14 -0
  589. package/dist/util/log.d.ts +4 -0
  590. package/dist/util/log.js +9 -0
  591. package/dist/util/request-scope.d.ts +9 -3
  592. package/dist/util/request-scope.js +18 -9
  593. package/dist/util/secret-detect.js +6 -1
  594. package/dist/util/spawn-argv.d.ts +9 -0
  595. package/dist/util/spawn-argv.js +57 -0
  596. package/dist/util/sql.d.ts +3 -0
  597. package/dist/util/sql.js +6 -0
  598. package/dist/util/sqlite-blocked.d.ts +2 -0
  599. package/dist/util/sqlite-blocked.js +5 -0
  600. package/dist/util/stream-tee.d.ts +3 -0
  601. package/dist/util/stream-tee.js +35 -0
  602. package/dist/util/time.d.ts +4 -0
  603. package/dist/util/time.js +4 -0
  604. package/dist/util/vector-codec.d.ts +4 -0
  605. package/dist/util/vector-codec.js +15 -0
  606. package/dist/util/version.d.ts +1 -1
  607. package/dist/util/version.js +1 -1
  608. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  609. package/extensions/openclaw-plugin/package.json +1 -1
  610. package/openclaw.plugin.json +1 -1
  611. package/package.json +4 -2
  612. package/dist/api/on-store.d.ts +0 -16
  613. package/dist/api/on-store.js +0 -38
  614. package/dist/store/embeddings/local.d.ts +0 -15
  615. package/dist/store/embeddings/local.js +0 -175
  616. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  617. /package/dist/{cli → api}/correction-latency.js +0 -0
  618. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  619. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  620. /package/dist/{store → core}/object-types.d.ts +0 -0
  621. /package/dist/{store → core}/object-types.js +0 -0
  622. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  623. /package/dist/{capture → util}/compaction-items.js +0 -0
  624. /package/dist/{store → util}/yaml.d.ts +0 -0
  625. /package/dist/{store → util}/yaml.js +0 -0
@@ -2,7 +2,10 @@
2
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
3
  * docs/ARCHITECTURE.md#srccoreablationts. */
4
4
  import { envAblateDecay, envAblateOutcome, envAblateOutcomeFast, envAblateOutcomeSlow, envAblateRecallBoost, envAblateRecency, envEvalRecencyDays, envFakeNowMs, } from '../util/env.js';
5
+ /** Production scoring: nothing ablated. Core falls back to this, so it never reads the environment. */
6
+ export const NO_STRENGTH_ABLATION = Object.freeze({ decay: false, recallBoost: false, outcomeSlow: false });
5
7
  let _cache;
8
+ let _strengthCache;
6
9
  function readFlags() {
7
10
  if (_cache !== undefined)
8
11
  return _cache;
@@ -18,6 +21,14 @@ function readFlags() {
18
21
  };
19
22
  return _cache;
20
23
  }
24
+ /** The frozen strength switches for this process; entry-layer callers pass them as `DecayOptions.ablation`. */
25
+ export function strengthAblation() {
26
+ if (_strengthCache === undefined) {
27
+ const f = readFlags();
28
+ _strengthCache = Object.freeze({ decay: f.decay, recallBoost: f.recallBoost, outcomeSlow: f.outcomeSlow });
29
+ }
30
+ return _strengthCache;
31
+ }
21
32
  export function isDecayAblated() {
22
33
  return readFlags().decay;
23
34
  }
@@ -45,5 +56,6 @@ export function evalNow() {
45
56
  /** Test-only. See module JSDoc: call in BOTH beforeEach AND afterEach. */
46
57
  export function _resetAblationCacheForTests() {
47
58
  _cache = undefined;
59
+ _strengthCache = undefined;
48
60
  }
49
61
  //# sourceMappingURL=ablation.js.map
@@ -4,4 +4,4 @@ export declare function detectScope(): string | null;
4
4
  /** Compute scope match between a memory's scope tags and the active scope.
5
5
  * Returns: 1 if matching scope, -1 if mismatching scope, 0 if neutral (no scope on either side). */
6
6
  export declare function scopeMatch(memoryTags: string[], activeScope: string | null): -1 | 0 | 1;
7
- //# sourceMappingURL=scope.d.ts.map
7
+ //# sourceMappingURL=active-scope.d.ts.map
@@ -26,4 +26,4 @@ export function scopeMatch(memoryTags, activeScope) {
26
26
  return 1; // match
27
27
  return -1; // mismatch
28
28
  }
29
- //# sourceMappingURL=scope.js.map
29
+ //# sourceMappingURL=active-scope.js.map
@@ -13,6 +13,10 @@ export interface AmbientState {
13
13
  dagDepth: number;
14
14
  totalMemories: number;
15
15
  }
16
+ /** A memory is fresh when created within this window. */
17
+ export declare const AMBIENT_FRESH_WINDOW_MS: number;
18
+ /** A memory counts as high schema fit strictly above this. */
19
+ export declare const HIGH_SCHEMA_FIT_ABOVE = 0.7;
16
20
  /** Row counts and sums an AmbientState is derived from; two stores' tallies add with addAmbientTallies. */
17
21
  export interface AmbientTallies {
18
22
  total: number;
@@ -1,9 +1,29 @@
1
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. */
2
- import { evalNow } from './ablation.js';
2
+ import { evalNow, strengthAblation } from './ablation.js';
3
3
  import { Layer } from './memory.js';
4
4
  import { calculateStrength } from './memory.js';
5
5
  import { DAY_MS } from '../util/time.js';
6
6
  const STATE_DECIMALS = 3;
7
+ // Cut points renderAmbientSummary uses to turn the state vector into words.
8
+ const SUMMARY_THRESHOLD = {
9
+ freshHigh: 0.5,
10
+ freshLow: 0.1,
11
+ skewHigh: 0.3,
12
+ skewLow: -0.3,
13
+ consolidatedHigh: 0.4,
14
+ consolidatedLow: 0.1,
15
+ extractionHigh: 0.5,
16
+ conflictShown: 0.1,
17
+ dagDepthShown: 2,
18
+ strengthLow: 0.3,
19
+ strengthHigh: 0.7,
20
+ entropyHigh: 0.8,
21
+ entropyLow: 0.3,
22
+ };
23
+ /** A memory is fresh when created within this window. */
24
+ export const AMBIENT_FRESH_WINDOW_MS = 7 * DAY_MS;
25
+ /** A memory counts as high schema fit strictly above this. */
26
+ export const HIGH_SCHEMA_FIT_ABOVE = 0.7;
7
27
  /** The tallies of two disjoint row sets taken together. */
8
28
  export function addAmbientTallies(a, b) {
9
29
  const tagCounts = new Map(a.tagCounts);
@@ -31,7 +51,7 @@ export function isErrorTagged(tags) {
31
51
  /** Tallies over loaded entries; superseded rows count toward the total only, as they always have here. */
32
52
  export function tallyAmbientEntries(entries, now) {
33
53
  const currentTime = now ?? evalNow(); // honors HIPPO_FAKE_NOW (eval-only)
34
- const sevenDaysAgo = currentTime.getTime() - 7 * DAY_MS;
54
+ const freshAfter = currentTime.getTime() - AMBIENT_FRESH_WINDOW_MS;
35
55
  const t = {
36
56
  total: entries.length, strengthSum: 0, fresh: 0, negative: 0, highSchemaFit: 0, errors: 0,
37
57
  semantic: 0, episodic: 0, conflicts: 0, extracted: 0, maxDagLevel: 0, tagCounts: new Map(),
@@ -41,14 +61,14 @@ export function tallyAmbientEntries(entries, now) {
41
61
  continue;
42
62
  for (const tag of entry.tags)
43
63
  t.tagCounts.set(tag, (t.tagCounts.get(tag) ?? 0) + 1);
44
- t.strengthSum += calculateStrength(entry, currentTime);
45
- if (new Date(entry.created).getTime() > sevenDaysAgo)
64
+ t.strengthSum += calculateStrength(entry, currentTime, { ablation: strengthAblation() });
65
+ if (new Date(entry.created).getTime() > freshAfter)
46
66
  t.fresh++;
47
67
  if (entry.emotional_valence === 'negative' || entry.emotional_valence === 'critical')
48
68
  t.negative++;
49
69
  if (isErrorTagged(entry.tags))
50
70
  t.errors++;
51
- if (entry.schema_fit > 0.7)
71
+ if (entry.schema_fit > HIGH_SCHEMA_FIT_ABOVE)
52
72
  t.highSchemaFit++;
53
73
  if (entry.layer === Layer.Semantic)
54
74
  t.semantic++;
@@ -116,33 +136,34 @@ function shannonEntropy(counts, total) {
116
136
  export function renderAmbientSummary(state) {
117
137
  if (state.totalMemories === 0)
118
138
  return 'Memory state: empty store, no memories yet.';
139
+ const T = SUMMARY_THRESHOLD;
119
140
  const parts = [];
120
141
  parts.push(`${state.totalMemories} memories`);
121
- if (state.recencyFreshness > 0.5)
142
+ if (state.recencyFreshness > T.freshHigh)
122
143
  parts.push('mostly fresh (<7d)');
123
- else if (state.recencyFreshness < 0.1)
144
+ else if (state.recencyFreshness < T.freshLow)
124
145
  parts.push('mostly aged');
125
- if (state.emotionalSkew > 0.3)
146
+ if (state.emotionalSkew > T.skewHigh)
126
147
  parts.push('error-focused');
127
- else if (state.emotionalSkew < -0.3)
148
+ else if (state.emotionalSkew < T.skewLow)
128
149
  parts.push('steady operation');
129
- if (state.consolidationRatio > 0.4)
150
+ if (state.consolidationRatio > T.consolidatedHigh)
130
151
  parts.push('well-consolidated');
131
- else if (state.consolidationRatio < 0.1)
152
+ else if (state.consolidationRatio < T.consolidatedLow)
132
153
  parts.push('mostly episodic');
133
- if (state.extractionCoverage > 0.5)
154
+ if (state.extractionCoverage > T.extractionHigh)
134
155
  parts.push('high extraction coverage');
135
- if (state.conflictIntensity > 0.1)
156
+ if (state.conflictIntensity > T.conflictShown)
136
157
  parts.push(`${(state.conflictIntensity * 100).toFixed(0)}% conflict rate`);
137
- if (state.dagDepth >= 2)
158
+ if (state.dagDepth >= T.dagDepthShown)
138
159
  parts.push(`DAG depth ${state.dagDepth}`);
139
- if (state.avgStrength < 0.3)
160
+ if (state.avgStrength < T.strengthLow)
140
161
  parts.push('low avg strength (aging corpus)');
141
- else if (state.avgStrength > 0.7)
162
+ else if (state.avgStrength > T.strengthHigh)
142
163
  parts.push('high avg strength');
143
- if (state.tagEntropy > 0.8)
164
+ if (state.tagEntropy > T.entropyHigh)
144
165
  parts.push('diverse topics');
145
- else if (state.tagEntropy < 0.3)
166
+ else if (state.tagEntropy < T.entropyLow)
146
167
  parts.push('narrow focus');
147
168
  return `Memory state: ${parts.join(', ')}.`;
148
169
  }
@@ -24,4 +24,20 @@ export declare class ConflictError extends ApiError {
24
24
  readonly status = 409;
25
25
  constructor(message: string);
26
26
  }
27
+ /** Thrown by the write-path guard (checkRejectionGuard, via upsertEntryRow) when a write would introduce a tombstoned value; carries what the
28
+ * transaction-owner catch blocks (writeEntry, api.supersede) need to write the post-rollback `reject_refusal` audit row via `auditRejectionRefusal`. */
29
+ export declare class RejectedValueError extends BadRequestError {
30
+ readonly digest: string;
31
+ readonly tenantId: string;
32
+ readonly entryId: string;
33
+ readonly reason: string | null;
34
+ readonly rejectedAt: string;
35
+ constructor(opts: {
36
+ digest: string;
37
+ tenantId: string;
38
+ entryId: string;
39
+ reason: string | null;
40
+ rejectedAt: string;
41
+ });
42
+ }
27
43
  //# sourceMappingURL=api-errors.d.ts.map
@@ -1,4 +1,5 @@
1
1
  /** Errors whose HTTP status is part of the API contract; the server maps by class, so message text can change freely. */
2
+ import { DIGEST_DISPLAY_CHARS } from '../util/token-text.js';
2
3
  /** Base class: an error the caller caused, carrying the status the HTTP layer answers with. */
3
4
  export class ApiError extends Error {
4
5
  }
@@ -34,4 +35,23 @@ export class ConflictError extends ApiError {
34
35
  this.name = 'ConflictError';
35
36
  }
36
37
  }
38
+ /** Thrown by the write-path guard (checkRejectionGuard, via upsertEntryRow) when a write would introduce a tombstoned value; carries what the
39
+ * transaction-owner catch blocks (writeEntry, api.supersede) need to write the post-rollback `reject_refusal` audit row via `auditRejectionRefusal`. */
40
+ export class RejectedValueError extends BadRequestError {
41
+ digest;
42
+ tenantId;
43
+ entryId;
44
+ reason;
45
+ rejectedAt;
46
+ constructor(opts) {
47
+ super(`Memory value refused: matches a rejected value (digest ${opts.digest.slice(0, DIGEST_DISPLAY_CHARS)}..., ` +
48
+ `reason: ${opts.reason ?? 'none given'}). Run "hippo unreject" to allow it again.`);
49
+ this.name = 'RejectedValueError';
50
+ this.digest = opts.digest;
51
+ this.tenantId = opts.tenantId;
52
+ this.entryId = opts.entryId;
53
+ this.reason = opts.reason;
54
+ this.rejectedAt = opts.rejectedAt;
55
+ }
56
+ }
37
57
  //# sourceMappingURL=api-errors.js.map
package/dist/core/card.js CHANGED
@@ -1,3 +1,5 @@
1
+ // Work-queue card types: a claimable unit of work, N candidates claim one row, first wins.
2
+ import { HOUR_MS } from '../util/time.js';
1
3
  const CARD_STATUSES = ['backlog', 'ready', 'running', 'blocked', 'review', 'done', 'shelved'];
2
4
  /** Narrows a raw string, such as a CLI flag value, to a CardStatus. */
3
5
  export function isCardStatus(v) {
@@ -15,7 +17,7 @@ export const CARD_TRANSITIONS = {
15
17
  };
16
18
  // SHORTCUT: one fixed lease for every claim; add a per-claim lease when the W3 dispatcher heartbeats on a timer.
17
19
  /** How long a claim or a heartbeat keeps a running card's lease before reclaimExpiredCards may return it to ready. */
18
- export const CARD_LEASE_MS = 4 * 60 * 60 * 1000;
20
+ export const CARD_LEASE_MS = 4 * HOUR_MS;
19
21
  /** Throws on any move CARD_TRANSITIONS does not allow, before a status write touches the row. */
20
22
  export function assertCardTransition(from, to) {
21
23
  for (const status of from) {
@@ -0,0 +1,7 @@
1
+ /** PostCompact has 10 s in all (PreCompact 30 s), so a locked store must be given up on early. */
2
+ export declare const COMPACTION_DB_WAIT_MS = 2000;
3
+ /** Long enough that a live hook has finished with its own record. */
4
+ export declare const REPLAY_AFTER_MS: number;
5
+ /** Claude Code deletes transcripts after 30 days, so an older gap can never be filled. */
6
+ export declare const TRANSCRIPT_FILL_WINDOW_MS: number;
7
+ //# sourceMappingURL=compaction-timing.d.ts.map
@@ -0,0 +1,9 @@
1
+ // Waits and windows shared by the compaction record's SQL (src/store) and the hooks and CLI that schedule it.
2
+ import { DAY_MS, MINUTE_MS } from '../util/time.js';
3
+ /** PostCompact has 10 s in all (PreCompact 30 s), so a locked store must be given up on early. */
4
+ export const COMPACTION_DB_WAIT_MS = 2000;
5
+ /** Long enough that a live hook has finished with its own record. */
6
+ export const REPLAY_AFTER_MS = 10 * MINUTE_MS;
7
+ /** Claude Code deletes transcripts after 30 days, so an older gap can never be filled. */
8
+ export const TRANSCRIPT_FILL_WINDOW_MS = 30 * DAY_MS;
9
+ //# sourceMappingURL=compaction-timing.js.map
@@ -20,7 +20,7 @@ export interface HippoConfig {
20
20
  model: string;
21
21
  hybridWeight: number;
22
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. */
23
+ * API key in env (OPENAI_API_KEY / VOYAGE_API_KEY / COHERE_API_KEY). See src/embeddings/provider.ts. */
24
24
  provider?: 'local' | 'openai' | 'voyage' | 'cohere';
25
25
  /** Optional API base-URL override (self-host / proxy). HTTPS only (localhost
26
26
  * may use http). Ignored by the local provider. */
@@ -6,7 +6,7 @@ import * as path from 'path';
6
6
  import { DEFAULT_PHYSICS_CONFIG, mergePhysicsConfig } from './physics-config.js';
7
7
  import { DEFAULT_HALF_LIFE_DAYS } from './memory.js';
8
8
  import { DEFAULT_LOCAL_BUMP, DEFAULT_RECALL_BUDGET } from './search-types.js';
9
- import { errorMessage, log } from '../util/log.js';
9
+ import { errorCode, errorMessage, log } from '../util/log.js';
10
10
  import { isJsonObject } from '../util/json.js';
11
11
  export const DEFAULT_CONFIG = {
12
12
  defaultHalfLifeDays: DEFAULT_HALF_LIFE_DAYS,
@@ -243,21 +243,32 @@ function fileStamp(file) {
243
243
  return stat === undefined ? null : `${stat.mtimeMs}:${stat.size}`;
244
244
  }
245
245
  catch (err) {
246
- log.debug(`config: ${file} could not be reached, read as missing: ${errorMessage(err)}`);
246
+ const code = errorCode(err);
247
+ const message = `config: ${file} could not be reached, read as missing: ${errorMessage(err)}`;
248
+ if (code === 'EACCES' || code === 'EPERM')
249
+ log.warnThenDebug(`config-unreachable:${file}:${code}`, message, { path: file, code });
250
+ else
251
+ log.debug(message);
247
252
  return null;
248
253
  }
249
254
  }
250
- function parseConfigFile(configPath) {
255
+ /** A config.json that exists must load: running on defaults would silently drop the user's settings, such as `sharedStore`. */
256
+ function readConfigFile(configPath) {
257
+ let raw;
251
258
  try {
252
- const raw = JSON.parse(fs.readFileSync(configPath, 'utf8'));
253
- return configOverDefaults(raw);
259
+ raw = JSON.parse(fs.readFileSync(configPath, 'utf8'));
254
260
  }
255
261
  catch (err) {
256
- if (fs.existsSync(configPath)) {
257
- log.warn(`failed to parse ${configPath}: ${errorMessage(err)}`);
258
- }
259
- return { ...DEFAULT_CONFIG };
262
+ throw new Error(`${configPath} could not be loaded: ${errorMessage(err)}. Fix the file or delete it to use the defaults.`, { cause: err });
260
263
  }
264
+ if (!isJsonObject(raw)) {
265
+ throw new Error(`${configPath} must hold a JSON object. Fix the file or delete it to use the defaults.`);
266
+ }
267
+ // SAFETY: an object is all the shape check proves; configOverDefaults validates each key it reads.
268
+ return raw;
269
+ }
270
+ function parseConfigFile(configPath) {
271
+ return configOverDefaults(readConfigFile(configPath));
261
272
  }
262
273
  function configOverDefaults(raw) {
263
274
  const basis = raw.decayBasis;
@@ -329,15 +340,8 @@ export function isSharedStore(hippoRoot) {
329
340
  const stamp = fileStamp(configPath);
330
341
  if (stamp === null || notSharedStamps.get(configPath) === stamp)
331
342
  return false;
332
- let raw;
333
- try {
334
- raw = JSON.parse(fs.readFileSync(configPath, 'utf8'));
335
- }
336
- catch (err) {
337
- log.warn(`failed to read ${configPath}: ${errorMessage(err)} - sharedStore read as false.`);
338
- return false;
339
- }
340
- if (raw?.sharedStore !== true) {
343
+ const raw = readConfigFile(configPath);
344
+ if (raw.sharedStore !== true) {
341
345
  if (notSharedStamps.size >= PARSED_CONFIGS_MAX)
342
346
  notSharedStamps.clear();
343
347
  notSharedStamps.set(configPath, stamp);
@@ -0,0 +1,3 @@
1
+ /** Cosine over any indexable vectors (a Float32 view scores as its number[] copy); 0 for empty, mismatched or zero-norm input. */
2
+ export declare function cosineOf(a: ArrayLike<number>, b: ArrayLike<number>): number;
3
+ //# sourceMappingURL=cosine.d.ts.map
@@ -0,0 +1,19 @@
1
+ /** Cosine over any indexable vectors (a Float32 view scores as its number[] copy); 0 for empty, mismatched or zero-norm input. */
2
+ export function cosineOf(a, b) {
3
+ if (a.length === 0 || b.length === 0 || a.length !== b.length)
4
+ return 0;
5
+ let dot = 0;
6
+ let normA = 0;
7
+ let normB = 0;
8
+ for (let i = 0; i < a.length; i++) {
9
+ dot += a[i] * b[i];
10
+ normA += a[i] * a[i];
11
+ normB += b[i] * b[i];
12
+ }
13
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
14
+ if (denom < 1e-10)
15
+ return 0;
16
+ // Clamp to [-1, 1] to handle floating point drift
17
+ return Math.min(1, Math.max(-1, dot / denom));
18
+ }
19
+ //# sourceMappingURL=cosine.js.map
@@ -1,4 +1,4 @@
1
- import { type MemoryEntry } from '../core/memory.js';
1
+ import { type MemoryEntry } from './memory.js';
2
2
  /** Serialize a MemoryEntry to markdown with YAML frontmatter. */
3
3
  export declare function serializeEntry(entry: MemoryEntry): string;
4
4
  /** Deserialize a markdown file to a MemoryEntry. */
@@ -1,6 +1,6 @@
1
1
  import { DEFAULT_TENANT_ID } from '../util/env.js';
2
- import { FALLBACK_HALF_LIFE_DAYS, DEFAULT_SCHEMA_FIT } from '../core/memory.js';
3
- import { dumpFrontmatter, parseFrontmatter } from './yaml.js';
2
+ import { FALLBACK_HALF_LIFE_DAYS, DEFAULT_SCHEMA_FIT } from './memory.js';
3
+ import { dumpFrontmatter, parseFrontmatter } from '../util/yaml.js';
4
4
  /** The fields every mirror file carries; serializeEntry adds the optional ones. */
5
5
  function entryFrontmatter(entry) {
6
6
  return {
@@ -42,7 +42,7 @@ export function serializeEntry(entry) {
42
42
  const frontmatter = entryFrontmatter(entry);
43
43
  // Emit tenant_id only when not 'default' to keep diffs clean for the dominant
44
44
  // single-tenant case (mirrors the plan's task 7 guidance).
45
- const tenantId = entry.tenantId ?? DEFAULT_TENANT_ID;
45
+ const tenantId = entry.tenant_id ?? DEFAULT_TENANT_ID;
46
46
  if (tenantId !== DEFAULT_TENANT_ID) {
47
47
  frontmatter['tenant_id'] = tenantId;
48
48
  }
@@ -98,7 +98,7 @@ export function deserializeEntry(raw) {
98
98
  scope: data['scope'] === null || data['scope'] === undefined ? null : String(data['scope']),
99
99
  owner: data['owner'] === null || data['owner'] === undefined ? null : String(data['owner']),
100
100
  artifact_ref: data['artifact_ref'] === null || data['artifact_ref'] === undefined ? null : String(data['artifact_ref']),
101
- tenantId: data['tenant_id'] === null || data['tenant_id'] === undefined ? DEFAULT_TENANT_ID : String(data['tenant_id']),
101
+ tenant_id: data['tenant_id'] === null || data['tenant_id'] === undefined ? DEFAULT_TENANT_ID : String(data['tenant_id']),
102
102
  origin_project: !('origin_project' in data) ? undefined : data['origin_project'] === null ? null : String(data['origin_project']),
103
103
  };
104
104
  }
@@ -0,0 +1,17 @@
1
+ import { type MemoryEntry } from './memory.js';
2
+ export type AuditSeverity = 'warning' | 'error';
3
+ export interface AuditIssue {
4
+ memoryId: string;
5
+ content: string;
6
+ severity: AuditSeverity;
7
+ reason: string;
8
+ }
9
+ export interface AuditResult {
10
+ total: number;
11
+ issues: AuditIssue[];
12
+ clean: number;
13
+ }
14
+ export declare function auditMemory(entry: MemoryEntry, backsObject?: boolean): AuditIssue | null;
15
+ /** `backing`: ids of memories that back an object (store.memoriesBackingObjects). */
16
+ export declare function auditMemories(entries: MemoryEntry[], backing: ReadonlySet<string>): AuditResult;
17
+ //# sourceMappingURL=memory-audit.d.ts.map
@@ -0,0 +1,54 @@
1
+ // The memory-quality audit rules: pure functions of a row, so any store can be audited by them.
2
+ import { canAutoDelete } from './memory.js';
3
+ import { automaticDefect, hasNoSpecificity, isFragment, isReleaseCommitNoise, substantiveWordCount, } from './memory-quality.js';
4
+ export function auditMemory(entry, backsObject = false) {
5
+ const issue = classifyMemory(entry);
6
+ // Error means "auto-remove"; a pinned, raw, kept-for-good or object-backing row is never auto-removed, so it can only warn.
7
+ if (issue?.severity === 'error' && (!canAutoDelete(entry) || backsObject)) {
8
+ const why = entry.pinned ? 'pinned' : entry.kind === 'raw' ? 'raw' : backsObject ? 'backs an object' : 'keep rule';
9
+ return { ...issue, severity: 'warning', reason: `${issue.reason} (${why}, kept)` };
10
+ }
11
+ return issue;
12
+ }
13
+ function classifyMemory(entry) {
14
+ const content = entry.content.trim();
15
+ if (content.length < 3) {
16
+ return { memoryId: entry.id, content, severity: 'error', reason: 'too short (< 3 chars)' };
17
+ }
18
+ if (content.length < 10) {
19
+ return { memoryId: entry.id, content, severity: 'error', reason: 'too short (< 10 chars)' };
20
+ }
21
+ if (isReleaseCommitNoise(content)) {
22
+ return { memoryId: entry.id, content, severity: 'error', reason: 'release/commit noise, not a useful memory' };
23
+ }
24
+ if (isFragment(content)) {
25
+ return { memoryId: entry.id, content, severity: 'warning', reason: 'sentence fragment — lacks context' };
26
+ }
27
+ const substantive = substantiveWordCount(content);
28
+ if (substantive < 2) {
29
+ return { memoryId: entry.id, content, severity: 'warning', reason: `only ${substantive} substantive word(s) — too vague` };
30
+ }
31
+ if (content.length < 40 && hasNoSpecificity(content)) {
32
+ return { memoryId: entry.id, content, severity: 'warning', reason: 'no specific details (names, paths, numbers, code)' };
33
+ }
34
+ const reason = automaticDefect(entry);
35
+ if (reason !== null) {
36
+ return { memoryId: entry.id, content, severity: 'warning', reason: `automatic memory defect: ${reason}` };
37
+ }
38
+ return null;
39
+ }
40
+ /** `backing`: ids of memories that back an object (store.memoriesBackingObjects). */
41
+ export function auditMemories(entries, backing) {
42
+ const issues = [];
43
+ for (const entry of entries) {
44
+ const issue = auditMemory(entry, backing.has(entry.id));
45
+ if (issue)
46
+ issues.push(issue);
47
+ }
48
+ return {
49
+ total: entries.length,
50
+ issues,
51
+ clean: entries.length - issues.length,
52
+ };
53
+ }
54
+ //# sourceMappingURL=memory-audit.js.map
@@ -1,4 +1,5 @@
1
1
  /** Core data model for Hippo memory entries, based on the strength formula from PLAN.md. */
2
+ import { type StrengthAblation } from './ablation.js';
2
3
  export declare const DEFAULT_SCHEMA_FIT = 0.5;
3
4
  export declare const FALLBACK_HALF_LIFE_DAYS = 7;
4
5
  export declare enum Layer {
@@ -10,7 +11,8 @@ export declare enum Layer {
10
11
  export type EmotionalValence = 'neutral' | 'positive' | 'negative' | 'critical';
11
12
  export type ConfidenceLevel = 'verified' | 'observed' | 'inferred' | 'stale';
12
13
  export type TraceOutcome = 'success' | 'failure' | 'partial' | null;
13
- export type MemoryKind = 'raw' | 'distilled' | 'superseded' | 'archived';
14
+ export declare const MEMORY_KINDS: readonly ["raw", "distilled", "superseded", "archived"];
15
+ export type MemoryKind = (typeof MEMORY_KINDS)[number];
14
16
  export interface MemoryEntry {
15
17
  id: string;
16
18
  created: string;
@@ -42,8 +44,8 @@ export interface MemoryEntry {
42
44
  descendant_count?: number;
43
45
  earliest_at?: string | null;
44
46
  latest_at?: string | null;
45
- /** 1 when a child was invalidated, superseded, forgotten or archived since the last rebuild; sleep clears it. Always 0 below level 2. */
46
- summary_dirty?: 0 | 1;
47
+ /** True when a child was invalidated, superseded, forgotten or archived since the last rebuild; sleep clears it. Always false below level 2. */
48
+ summary_dirty?: boolean;
47
49
  /** ISO 8601 time of the last successful rebuild, or null if never rebuilt. */
48
50
  last_rebuilt_at?: string | null;
49
51
  /** Count of successful rebuilds: 0 at the first buildDag write, bumped by each rebuild. */
@@ -54,7 +56,7 @@ export interface MemoryEntry {
54
56
  scope: string | null;
55
57
  owner: string | null;
56
58
  artifact_ref: string | null;
57
- tenantId: string;
59
+ tenant_id: string;
58
60
  /** Owning project, lowercased; '' = user-global (injectable everywhere), null = none known (legacy or unnamed write), denied by ambient context.
59
61
  * Stamped at write time by stampOriginProject (src/store/entry-row.ts); undefined only before the first write. */
60
62
  origin_project?: string | null;
@@ -75,14 +77,14 @@ export declare function _resetLossAversionRatioCacheForTests(): void;
75
77
  /** Scales only the `negative` multiplier; `critical` stays unscaled so the knob moves just the losses-vs-gains claim. */
76
78
  export declare function applyLossAversionRatio(valence: EmotionalValence, baseMultiplier: number): number;
77
79
  /** 1 + REWARD_SLOPE * (pos - neg) / (pos + neg + 1), in (0.5, 1.5), 1.0 with no outcomes; it scales the effective half-life. */
78
- export declare function calculateRewardFactor(entry: Pick<MemoryEntry, 'outcome_positive' | 'outcome_negative'>): number;
80
+ export declare function calculateRewardFactor(entry: Pick<MemoryEntry, 'outcome_positive' | 'outcome_negative'>, ablation?: StrengthAblation): number;
79
81
  /** Bad marks alone never push a memory under sleep's 0.05 retire line; supersede is the hard correction. */
80
82
  export declare const MAX_WRONG_HALVINGS = 3;
81
83
  export declare const DECAY_BASE = 0.5;
82
84
  export declare const REWARD_SLOPE = 0.5;
83
85
  export declare const RETRIEVAL_BOOST_SLOPE = 0.1;
84
86
  /** Bad outcome marks past good ones, floored at zero; each halves strength and stops recall strengthening, so a correction outranks pinning. */
85
- export declare function netWrong(entry: Pick<MemoryEntry, 'outcome_positive' | 'outcome_negative'>): number;
87
+ export declare function netWrong(entry: Pick<MemoryEntry, 'outcome_positive' | 'outcome_negative'>, ablation?: StrengthAblation): number;
86
88
  /** What calculateStrength reads, so a caller can score a row without loading its text. */
87
89
  export type StrengthInputs = Pick<MemoryEntry, 'pinned' | 'created' | 'last_retrieved' | 'half_life_days' | 'retrieval_count' | 'emotional_valence' | 'outcome_positive' | 'outcome_negative'>;
88
90
  /** Decay basis: clock = wall time, session = per sleep cycle (intermittent agents), adaptive = half-life scaled by session frequency. */
@@ -92,6 +94,8 @@ export interface DecayOptions {
92
94
  avgSessionIntervalDays?: number;
93
95
  /** Total sleep cycles completed. Used by consolidation tracking. */
94
96
  sleepCount?: number;
97
+ /** EVAL-ONLY switches resolved once at the entry layer (`strengthAblation()`); absent means production scoring. */
98
+ ablation?: StrengthAblation;
95
99
  }
96
100
  /** Strength at `now` = decay * retrieval boost * emotional multiplier, clamped to [0, 1]; the basis modes are on DecayOptions.
97
101
  * Pinned memories skip time decay, but being marked wrong still fades them (netWrong). */
@@ -110,7 +114,7 @@ export interface ConfidenceFacets {
110
114
  tier: ConfidenceLevel;
111
115
  agedOut: boolean;
112
116
  }
113
- export declare function confidenceFacets(entry: MemoryEntry, now?: Date): ConfidenceFacets;
117
+ export declare function confidenceFacets(entry: ConfidenceInputs, now?: Date): ConfidenceFacets;
114
118
  export declare function facetsOf(entry: ConfidenceInputs, now: Date): ConfidenceFacets;
115
119
  export declare function confidenceLabel(entry: MemoryEntry, now?: Date): {
116
120
  text: string;
@@ -167,6 +171,8 @@ export declare function createSuccessor(old: MemoryEntry, content: string, opts:
167
171
  /** How well new content fits existing knowledge, 0..1: above 0.7 consolidates faster, below 0.3 is novel and decays faster if unused.
168
172
  * Tags shared with existing memories count by rarity (a rare shared tag fits more), plus content-token overlap. */
169
173
  export declare function computeSchemaFit(content: string, tags: string[], existingEntries: MemoryEntry[]): number;
174
+ /** What schema fit reads from `entries`, built once for a caller that scores many contents against the same rows. */
175
+ export declare function schemaFitSourceOf(entries: readonly MemoryEntry[]): SchemaFitSource;
170
176
  /** What schema fit reads from a set of memories, so a store can answer without loading its rows. */
171
177
  export interface SchemaFitSource {
172
178
  readonly rows: number;
@@ -179,5 +185,5 @@ export interface SchemaFitSource {
179
185
  export declare function schemaFitFrom(content: string, tags: readonly string[], source: SchemaFitSource): number;
180
186
  /** Returns copies with the retrieval count, clock and half-life updated; the caller persists them.
181
187
  * Under HIPPO_ABLATE_RECALL_BOOST (eval-only) the entries come back unchanged, not empty, since callers derive last_retrieval_ids from them. */
182
- export declare function markRetrieved(entries: MemoryEntry[], now?: Date): MemoryEntry[];
188
+ export declare function markRetrieved(entries: MemoryEntry[], now?: Date, options?: Pick<DecayOptions, 'ablation'>): MemoryEntry[];
183
189
  //# sourceMappingURL=memory.d.ts.map