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,12 +1,10 @@
1
- /**
2
- * Core data model for Hippo memory entries.
3
- * Based on the strength formula from PLAN.md.
4
- */
5
- import { envLossAversionRatio } from '../util/env.js';
1
+ /** Core data model for Hippo memory entries, based on the strength formula from PLAN.md. */
2
+ import { DEFAULT_TENANT_ID, envLossAversionRatio } from '../util/env.js';
6
3
  import { BadRequestError } from './api-errors.js';
7
4
  import { randomUUID } from 'crypto';
8
5
  import { isDecayAblated, isOutcomeSlowAblated, isRecallBoostAblated, evalNow, } from './ablation.js';
9
6
  import { AGENT_MEMORY_TOOLS, toolSourcePrefix } from './agent-memory-tools.js';
7
+ import { isJsonString } from '../util/json.js';
10
8
  import { DAY_MS } from '../util/time.js';
11
9
  import { ID_SUFFIX_CHARS } from '../util/token-text.js';
12
10
  export const DEFAULT_SCHEMA_FIT = 0.5;
@@ -20,56 +18,17 @@ export var Layer;
20
18
  })(Layer || (Layer = {}));
21
19
  /** Tag on a memory whose named file/symbol/script changed after it was stored. */
22
20
  export const CHURN_STALE_TAG = 'churn-stale';
23
- // Emotional multipliers from PLAN.md. Losses weigh ~2x equivalent gains (Lovallo-Kahneman TFAS empirics),
24
- // so negative is 2.0. `negative` is further scaled per-process by HIPPO_LOSS_AVERSION_RATIO
25
- // (env var, default 1.0; see getLossAversionRatio + applyLossAversionRatio).
26
- const EMOTIONAL_MULTIPLIERS = {
21
+ // Losses weigh ~2x gains (Lovallo-Kahneman), so negative is 2.0; HIPPO_LOSS_AVERSION_RATIO scales it per process.
22
+ export const EMOTIONAL_MULTIPLIERS = {
27
23
  neutral: 1.0,
28
24
  positive: 1.0,
29
25
  negative: 2.0, // error-tagged
30
26
  critical: 2.0,
31
27
  };
32
- /**
33
- * Module-level lazy-cached read of HIPPO_LOSS_AVERSION_RATIO.
34
- *
35
- * `calculateStrength` is called per-entry inside hot recall loops
36
- * (api.ts/consolidate.ts/search.ts), so a per-call `process.env` lookup
37
- * would multiply N entries by M recalls of lookup cost. Lazy module-cache
38
- * reads the env ONCE on first call and memoizes for the process lifetime.
39
- * Test isolation via `_resetLossAversionRatioCacheForTests()` below.
40
- */
41
- /**
42
- * Minimum acceptable ratio. Below this, the negative multiplier
43
- * (2.0 * ratio) becomes small enough that calculateStrength * decay can fall
44
- * below `DECAY_THRESHOLD = 0.05` in `src/consolidate.ts:146`, which would
45
- * permanently delete non-pinned error-tagged memories on the next sleep
46
- * cycle. 0.5 is chosen as the floor because (a) it recovers the pre-calibration
47
- * effective multiplier (2.0 * 0.5 = 1.0 + the negative premium, i.e. 1.5x
48
- * the pre-calibration default), and (b) below this the user is asking for LESS
49
- * loss aversion than has ever shipped — that's outside the supported
50
- * tuning range.
51
- */
28
+ // A lower ratio can drop an error-tagged memory under sleep's DECAY_THRESHOLD (src/consolidate/decay.ts),
29
+ // so values below it fall back to 1.0.
52
30
  const LOSS_AVERSION_RATIO_MIN = 0.5;
53
- /**
54
- * Validation policy:
55
- * - Valid: finite numbers >= 0.5.
56
- * - Invalid (silent fallback to 1.0): empty string, non-numeric,
57
- * numbers below 0.5 (including 0 and negatives), NaN, +/-Infinity.
58
- * Silent because opt-in env vars should not crash production recall
59
- * on a typo.
60
- *
61
- * Why the 0.5 floor and not 0:
62
- * - Rejecting only `0` leaves the same silent data-loss surface for any ratio
63
- * below ~0.025 (and worse for aged memories, where even ratio=0.25
64
- * can produce strength < DECAY_THRESHOLD = 0.05 in consolidate.ts).
65
- * Floor at the pre-calibration equivalent (0.5) so the env var's tuning
66
- * range never crosses into the deletion regime.
67
- * - Users wanting LESS loss aversion than the pre-calibration 1.5 multiplier
68
- * should reconsider the design intent (the calibration was
69
- * toward MORE loss aversion, not less). If a future use case
70
- * genuinely needs ratio < 0.5, the right path is a separate
71
- * `HIPPO_NEGATIVE_MULTIPLIER` env override.
72
- */
31
+ // Read once: calculateStrength runs per entry inside hot loops (src/api, src/consolidate, src/search).
73
32
  let _lossAversionRatioCache;
74
33
  function getLossAversionRatio() {
75
34
  if (_lossAversionRatioCache !== undefined)
@@ -80,8 +39,6 @@ function getLossAversionRatio() {
80
39
  return 1.0;
81
40
  }
82
41
  const parsed = Number(raw);
83
- // Finite + >= 0.5 floor. Anything below 0.5 silently falls back to 1.0
84
- // to avoid the consolidation-deletion vector (see JSDoc above).
85
42
  if (!Number.isFinite(parsed) || parsed < LOSS_AVERSION_RATIO_MIN) {
86
43
  _lossAversionRatioCache = 1.0;
87
44
  return 1.0;
@@ -89,39 +46,17 @@ function getLossAversionRatio() {
89
46
  _lossAversionRatioCache = parsed;
90
47
  return parsed;
91
48
  }
92
- /**
93
- * Test-only helper. Tests that mutate `process.env.HIPPO_LOSS_AVERSION_RATIO`
94
- * MUST call this in BOTH `beforeEach` AND `afterEach`:
95
- * - beforeEach: clear any stale cache from a previous test before setting
96
- * the env var for this test.
97
- * - afterEach: clear the cache so the next test (which may not set the env
98
- * var) reads the clean default instead of this test's value.
99
- * See `tests/emotional-multipliers.test.ts` for the pattern.
100
- */
49
+ /** Test-only: a test that sets HIPPO_LOSS_AVERSION_RATIO calls this in beforeEach and afterEach (tests/emotional-multipliers.test.ts). */
101
50
  export function _resetLossAversionRatioCacheForTests() {
102
51
  _lossAversionRatioCache = undefined;
103
52
  }
104
- /**
105
- * Apply the loss-aversion ratio scalar to the `negative` multiplier ONLY.
106
- * Other valences (positive, critical, neutral) pass through unchanged.
107
- * `critical` is deliberately NOT scaled, so the calibration only touches the
108
- * specific empirical claim (TFAS 2x losses-vs-gains).
109
- */
110
- function applyLossAversionRatio(valence, baseMultiplier) {
53
+ /** Scales only the `negative` multiplier; `critical` stays unscaled so the knob moves just the losses-vs-gains claim. */
54
+ export function applyLossAversionRatio(valence, baseMultiplier) {
111
55
  if (valence !== 'negative')
112
56
  return baseMultiplier;
113
57
  return baseMultiplier * getLossAversionRatio();
114
58
  }
115
- /**
116
- * Compute the reward factor from cumulative outcome counts.
117
- *
118
- * reward_ratio = (positive - negative) / (positive + negative + 1)
119
- * reward_factor = 1 + 0.5 * reward_ratio
120
- *
121
- * Range: (0.5, 1.5). Neutral (no outcomes) returns 1.0.
122
- * Modulates effective half-life: memories with consistent positive outcomes
123
- * decay slower; consistent negative outcomes decay faster.
124
- */
59
+ /** 1 + REWARD_SLOPE * (pos - neg) / (pos + neg + 1), in (0.5, 1.5), 1.0 with no outcomes; it scales the effective half-life. */
125
60
  export function calculateRewardFactor(entry) {
126
61
  // EVAL-ONLY ablation (see ablation.ts): the slow outcome channel.
127
62
  if (isOutcomeSlowAblated())
@@ -134,65 +69,41 @@ export function calculateRewardFactor(entry) {
134
69
  return 1 + REWARD_SLOPE * ratio;
135
70
  }
136
71
  /** Bad marks alone never push a memory under sleep's 0.05 retire line; supersede is the hard correction. */
137
- const MAX_WRONG_HALVINGS = 3;
138
- // Shared by calculateStrength and strengthSql so the two cannot drift.
139
- const DECAY_BASE = 0.5;
140
- const REWARD_SLOPE = 0.5;
141
- const RETRIEVAL_BOOST_SLOPE = 0.1;
142
- const SQL_DEFAULT_HALF_LIFE_DAYS = 7;
143
- const UNIX_EPOCH_JULIAN_DAY = 2440587.5;
144
- /**
145
- * Net wrongness: bad outcome marks past good ones, never below zero.
146
- * Strength halves per unit (capped at 3) and recall stops strengthening
147
- * the memory, so a correction outranks pinning, error tags and heavy recall.
148
- */
72
+ export const MAX_WRONG_HALVINGS = 3;
73
+ // Shared by calculateStrength and strengthSql (src/store/rule-sql.ts) so the two cannot drift.
74
+ export const DECAY_BASE = 0.5;
75
+ export const REWARD_SLOPE = 0.5;
76
+ export const RETRIEVAL_BOOST_SLOPE = 0.1;
77
+ /** Bad outcome marks past good ones, floored at zero; each halves strength and stops recall strengthening, so a correction outranks pinning. */
149
78
  export function netWrong(entry) {
150
79
  if (isOutcomeSlowAblated() || isDecayAblated())
151
80
  return 0;
152
81
  return Math.max(0, (entry.outcome_negative ?? 0) - (entry.outcome_positive ?? 0));
153
82
  }
154
- /**
155
- * Calculate current strength at a given time.
156
- * strength(t) = base_strength * decay * retrieval_boost * emotional_multiplier
157
- *
158
- * Decay basis modes:
159
- * - clock: classic wall-clock decay (daysSince / halfLife)
160
- * - session: decay by sleep cycles instead of days (sessionsSince / halfLife)
161
- * - adaptive: wall-clock decay with half-life scaled by session frequency
162
- *
163
- * Pinned memories skip time decay; being marked wrong still fades them (netWrong).
164
- */
83
+ /** Strength at `now` = decay * retrieval boost * emotional multiplier, clamped to [0, 1]; the basis modes are on DecayOptions.
84
+ * Pinned memories skip time decay, but being marked wrong still fades them (netWrong). */
165
85
  export function calculateStrength(entry,
166
- // evalNow(): the real clock unless HIPPO_FAKE_NOW is set (eval-only,
167
- // simulated-time protocols; see ablation.ts). Explicit `now` always wins.
86
+ // evalNow() is the real clock unless HIPPO_FAKE_NOW is set (eval-only); an explicit `now` wins.
168
87
  now = evalNow(), options = {}) {
169
88
  // Being marked wrong outranks every shield: pinning, error tags, heavy recall.
170
89
  const wrongPenalty = Math.pow(DECAY_BASE, Math.min(netWrong(entry), MAX_WRONG_HALVINGS));
171
90
  if (entry.pinned)
172
91
  return wrongPenalty;
173
- // EVAL-ONLY ablation (see ablation.ts): anchor decay at CREATION, so clock resets persisted by PRIOR
174
- // unflagged runs cannot leak strengthening into an ablated arm. Prior-run half_life increments are
175
- // NOT reconstructed - see the ablation.ts caveat (fresh stores per arm).
92
+ // EVAL-ONLY ablation (see ablation.ts): anchor decay at creation so clock resets from earlier unflagged runs cannot leak in.
176
93
  const lastRetrieved = new Date(isRecallBoostAblated() ? entry.created : entry.last_retrieved);
177
94
  const daysSince = (now.getTime() - lastRetrieved.getTime()) / DAY_MS;
178
- // Reward-proportional half-life modulation
179
95
  const rewardFactor = calculateRewardFactor(entry);
180
96
  const effectiveHalfLife = entry.half_life_days * rewardFactor;
181
97
  // Guard: zero half-life causes 0/0 = NaN in the exponent
182
98
  if (effectiveHalfLife <= 0)
183
99
  return 0.0;
184
100
  const decayExponent = decayExponentFor(options, daysSince, effectiveHalfLife);
185
- // EVAL-ONLY ablation (see ablation.ts): decay term := 1. NOTE the [0,1]
186
- // clamp below then caps retrievalBoost at baseline - see ablation.ts
187
- // formula note.
101
+ // EVAL-ONLY ablation (see ablation.ts): decay := 1, so the [0,1] clamp below caps the boost at baseline.
188
102
  const decay = isDecayAblated() ? 1.0 : Math.pow(DECAY_BASE, decayExponent);
189
103
  const retrievalBoost = retrievalBoostFor(entry);
190
- // Emotional multiplier. HIPPO_LOSS_AVERSION_RATIO scales the negative one ONLY; the lazy
191
- // module cache makes this one lookup + one multiply, not a per-call process.env read.
192
104
  const baseMultiplier = EMOTIONAL_MULTIPLIERS[entry.emotional_valence] ?? 1.0;
193
105
  const emotionalMultiplier = applyLossAversionRatio(entry.emotional_valence, baseMultiplier);
194
106
  const raw = decay * retrievalBoost * emotionalMultiplier;
195
- // Clamp to [0, 1] with NaN guard
196
107
  const clamped = Math.min(1.0, Math.max(0.0, raw));
197
108
  return Number.isFinite(clamped) ? clamped * wrongPenalty : 0.0;
198
109
  }
@@ -200,8 +111,7 @@ function decayExponentFor(options, daysSince, halfLifeDays) {
200
111
  let effectiveHalfLife = halfLifeDays;
201
112
  const basis = options.decayBasis ?? 'clock';
202
113
  if (basis === 'session') {
203
- // Decay by session count: each sleep cycle = 1 "day" in the decay formula.
204
- // Estimate sessions since last retrieval from wall-clock time and avg interval.
114
+ // Each sleep cycle counts as one "day"; sessions since last retrieval are estimated from wall time and the average interval.
205
115
  const avgInterval = options.avgSessionIntervalDays ?? 1;
206
116
  const sessionsSince = avgInterval > 0 ? Math.max(0, daysSince / avgInterval) : daysSince;
207
117
  return sessionsSince / effectiveHalfLife;
@@ -214,44 +124,14 @@ function decayExponentFor(options, daysSince, halfLifeDays) {
214
124
  }
215
125
  return daysSince / effectiveHalfLife;
216
126
  }
217
- // clock: classic wall-clock decay
218
127
  return daysSince / effectiveHalfLife;
219
128
  }
220
- // Retrieval boost: 1 + 0.1 * log2(retrieval_count + 1). EVAL-ONLY ablation (see ablation.ts) neutralizes
221
- // the READ side too, so counts written before the flag cannot leak strengthening into an ablated arm.
129
+ // EVAL-ONLY ablation (see ablation.ts) neutralizes the read side too, so counts written before the flag cannot leak in.
222
130
  function retrievalBoostFor(entry) {
223
131
  return isRecallBoostAblated() || netWrong(entry) > 0
224
132
  ? 1.0
225
133
  : 1 + RETRIEVAL_BOOST_SLOPE * Math.log2(entry.retrieval_count + 1);
226
134
  }
227
- /** calculateStrength's clock-basis formula as SQL over `memories` columns, flags and multipliers baked in; keep in step.
228
- * An unparseable date scores NULL here and 0 in JS, so sums agree. */
229
- export function strengthSql(now) {
230
- const num = (n) => (Number.isInteger(n) ? n.toFixed(1) : String(n));
231
- const pos = 'COALESCE(outcome_positive, 0)';
232
- const neg = 'COALESCE(outcome_negative, 0)';
233
- const wrong = isOutcomeSlowAblated() || isDecayAblated() ? '0' : `MAX(0, ${neg} - ${pos})`;
234
- const reward = isOutcomeSlowAblated()
235
- ? '1.0'
236
- : `(CASE WHEN ${pos} = 0 AND ${neg} = 0 THEN 1.0 ELSE 1.0 + ${REWARD_SLOPE} * (${pos} - ${neg}) / (${pos} + ${neg} + 1.0) END)`;
237
- const halfLife = `(COALESCE(half_life_days, ${SQL_DEFAULT_HALF_LIFE_DAYS}) * ${reward})`;
238
- const anchor = isRecallBoostAblated() ? 'created' : 'last_retrieved';
239
- const nowJulian = num(now.getTime() / DAY_MS + UNIX_EPOCH_JULIAN_DAY);
240
- const decay = isDecayAblated() ? '1.0' : `pow(${DECAY_BASE}, (${nowJulian} - julianday(${anchor})) / ${halfLife})`;
241
- const boost = isRecallBoostAblated()
242
- ? '1.0'
243
- : `(CASE WHEN ${wrong} > 0 THEN 1.0 ELSE 1.0 + ${RETRIEVAL_BOOST_SLOPE} * log2(COALESCE(retrieval_count, 0) + 1) END)`;
244
- const valences = /* SAFETY: a Record keyed by EmotionalValence */ Object.keys(EMOTIONAL_MULTIPLIERS);
245
- const emotion = `(CASE COALESCE(emotional_valence, 'neutral') ${valences
246
- .map((v) => `WHEN '${v}' THEN ${num(applyLossAversionRatio(v, EMOTIONAL_MULTIPLIERS[v]))}`)
247
- .join(' ')} ELSE 1.0 END)`;
248
- const penalty = `pow(${DECAY_BASE}, MIN(${wrong}, ${MAX_WRONG_HALVINGS}))`;
249
- return `(CASE WHEN pinned THEN ${penalty} WHEN ${halfLife} <= 0 THEN 0.0
250
- ELSE MIN(1.0, MAX(0.0, ${decay} * ${boost} * ${emotion})) * ${penalty} END)`;
251
- }
252
- /**
253
- * Derive half-life based on signals, as per PLAN.md table.
254
- */
255
135
  const HIGH_SCHEMA_FIT = 0.7;
256
136
  const HIGH_FIT_HALF_LIFE_FACTOR = 1.5;
257
137
  const LOW_SCHEMA_FIT = 0.3;
@@ -261,35 +141,25 @@ const TAG_FIT_WEIGHT = 0.6;
261
141
  const CONTENT_FIT_WEIGHT = 0.4;
262
142
  const CONTENT_TOKEN_SHARE_MIN = 0.2;
263
143
  const CONTENT_ENOUGH_FRACTION = 0.1;
144
+ // An error is worth remembering longer than a neutral note (PLAN.md half-life table).
145
+ const ERROR_TAG_HALF_LIFE_FACTOR = 2;
146
+ // Each retrieval lengthens the half-life by this many days (PLAN.md).
147
+ const RETRIEVAL_HALF_LIFE_GAIN_DAYS = 2;
148
+ /** The base half-life scaled by the PLAN.md signals: an error tag, and high or low schema fit. */
264
149
  export function deriveHalfLife(base, entry) {
265
150
  let hl = base;
266
- // Error-tagged: 2x half-life
267
151
  if (entry.tags?.includes('error')) {
268
- hl *= 2;
152
+ hl *= ERROR_TAG_HALF_LIFE_FACTOR;
269
153
  }
270
- // High schema fit: consolidates faster (1.5x)
271
154
  if (entry.schema_fit !== undefined && entry.schema_fit > HIGH_SCHEMA_FIT) {
272
155
  hl *= HIGH_FIT_HALF_LIFE_FACTOR;
273
156
  }
274
- // Low schema fit: decay faster (0.5x)
275
157
  if (entry.schema_fit !== undefined && entry.schema_fit < LOW_SCHEMA_FIT) {
276
158
  hl *= LOW_FIT_HALF_LIFE_FACTOR;
277
159
  }
278
160
  return hl;
279
161
  }
280
- /**
281
- * Apply outcome feedback to a memory entry.
282
- *
283
- * Increments outcome_positive or outcome_negative counters.
284
- * The reward factor in calculateStrength() uses these counts to
285
- * continuously modulate the effective half-life:
286
- * reward_ratio = (pos - neg) / (pos + neg + 1)
287
- * reward_factor = 1 + 0.5 * reward_ratio // range (0.5, 1.5)
288
- * effective_hl = half_life_days * reward_factor
289
- *
290
- * No fixed half-life delta. Decay rate adjusts proportionally to
291
- * cumulative reward signal, inspired by R-STDP in spiking networks.
292
- */
162
+ /** Counts the outcome; calculateStrength turns the counts into a reward factor on the half-life, so there is no fixed delta here. */
293
163
  export function applyOutcome(entry, good) {
294
164
  const updated = {
295
165
  ...entry,
@@ -307,17 +177,17 @@ export function entryAfterOutcome(entry, good) {
307
177
  return updated;
308
178
  return { ...updated, tags: updated.tags.filter((t) => t !== CHURN_STALE_TAG) };
309
179
  }
310
- /**
311
- * Generate a random memory ID using crypto.randomUUID().
312
- */
180
+ /** A new id: `prefix_` plus the first ID_SUFFIX_CHARS hex characters of a random UUID. */
313
181
  export function generateId(prefix = 'mem') {
314
182
  return `${prefix}_${randomUUID().replace(/-/g, '').slice(0, ID_SUFFIX_CHARS)}`;
315
183
  }
184
+ // Days without a retrieval before trust lapses; pinned and verified rows are exempt by policy.
185
+ const AGED_OUT_AFTER_DAYS = 30;
316
186
  function isAgedOut(entry, now) {
317
187
  if (entry.pinned || entry.confidence === 'verified')
318
188
  return false;
319
189
  const lastRetrieved = new Date(entry.last_retrieved);
320
- return (now.getTime() - lastRetrieved.getTime()) / DAY_MS > 30;
190
+ return (now.getTime() - lastRetrieved.getTime()) / DAY_MS > AGED_OUT_AFTER_DAYS;
321
191
  }
322
192
  export function confidenceFacets(entry, now = evalNow()) {
323
193
  return facetsOf(entry, now);
@@ -325,8 +195,7 @@ export function confidenceFacets(entry, now = evalNow()) {
325
195
  export function facetsOf(entry, now) {
326
196
  return { tier: entry.confidence, agedOut: isAgedOut(entry, now) };
327
197
  }
328
- // `warn` covers exactly the rows the old collapsed-value rule did: an aged-out row
329
- // used to read 'stale', so warning on it separately keeps the same set.
198
+ // An aged-out row warns on its own, since its stored tier alone would hide it.
330
199
  export function confidenceLabel(entry, now = evalNow()) {
331
200
  const { tier, agedOut } = confidenceFacets(entry, now);
332
201
  return {
@@ -334,29 +203,16 @@ export function confidenceLabel(entry, now = evalNow()) {
334
203
  warn: agedOut || tier === 'stale' || tier === 'inferred',
335
204
  };
336
205
  }
337
- /**
338
- * Resolve the effective confidence for a memory entry.
339
- * If the entry has not been retrieved in 30+ days and is not 'verified',
340
- * returns 'stale'. Otherwise returns the stored confidence value.
341
- */
206
+ /** The stored confidence, or 'stale' once the entry is aged out (not retrieved for AGED_OUT_AFTER_DAYS; pinned and verified exempt). */
342
207
  export function resolveConfidence(entry, now = evalNow()) {
343
208
  return isAgedOut(entry, now) ? 'stale' : entry.confidence;
344
209
  }
345
- /**
346
- * Base half-life for a new memory, in days, before `deriveHalfLife`'s
347
- * write-time multipliers. 365 because 7 days lost the current fact far more
348
- * often, and 730 days or no decay did no better. `hippo sleep` moves memories still
349
- * on an older base (src/consolidate/half-life-migration.ts).
350
- */
210
+ /** Base half-life in days before deriveHalfLife's multipliers: 365 because 7 lost the current fact far more often and 730 did no better.
211
+ * `hippo sleep` moves memories still on an older base (src/consolidate/half-life-migration.ts). */
351
212
  export const DEFAULT_HALF_LIFE_DAYS = 365;
352
213
  export const COMPACTION_MEMORY_TAG = 'compaction-memory';
353
214
  export const COMPACTION_SOURCE_PREFIX = 'compaction:';
354
215
  export const KEEP_PAIRS = AGENT_MEMORY_TOOLS.map((t) => ({ tag: t.tag, sourcePrefix: toolSourcePrefix(t.id) }));
355
- const sqlText = (s) => `'${s.replace(/'/g, "''")}'`;
356
- // json_each matches the tag as a whole element; substr, not LIKE, keeps the prefix case-sensitive like startsWith.
357
- const keepPairSql = (p) => `(COALESCE(superseded_by, '') = '' AND EXISTS (SELECT 1 FROM json_each(CASE WHEN json_valid(tags_json) THEN tags_json ELSE '[]' END) WHERE value = ${sqlText(p.tag)}) AND substr(source, 1, ${p.sourcePrefix.length}) = ${sqlText(p.sourcePrefix)})`;
358
- // Pinned and kept rows stay (a superseded row is not kept: its successor carries the tag and source); raw rows leave only through archiveRawMemory. The SQL twin guards the DELETE itself.
359
- export const AUTO_DELETABLE_SQL = `pinned = 0 AND kind != 'raw'${KEEP_PAIRS.map((p) => ` AND NOT ${keepPairSql(p)}`).join('')}`;
360
216
  export function isKeptForGood(entry) {
361
217
  return !entry.superseded_by && KEEP_PAIRS.some((p) => entry.tags.includes(p.tag) && entry.source.startsWith(p.sourcePrefix));
362
218
  }
@@ -403,9 +259,8 @@ export function createMemory(content, options = {}) {
403
259
  scope: options.scope ?? null,
404
260
  owner: options.owner ?? null,
405
261
  artifact_ref: options.artifact_ref ?? null,
406
- tenantId: options.tenantId ?? 'default',
262
+ tenantId: options.tenantId ?? DEFAULT_TENANT_ID,
407
263
  };
408
- // Recalculate strength with the emotional multiplier applied
409
264
  entry.strength = calculateStrength(entry);
410
265
  return entry;
411
266
  }
@@ -433,21 +288,13 @@ export function createSuccessor(old, content, opts) {
433
288
  baseHalfLifeDays: opts.baseHalfLifeDays,
434
289
  });
435
290
  // A legacy null origin has nothing to carry, so the store stamps it from its own location.
436
- if (typeof old.origin_project === 'string') {
291
+ if (isJsonString(old.origin_project)) {
437
292
  next.origin_project = old.origin_project;
438
293
  }
439
294
  return next;
440
295
  }
441
- /**
442
- * Compute how well new content fits existing knowledge patterns.
443
- * Returns 0..1 where:
444
- * >0.7 = high fit (consistent with existing knowledge, consolidates faster)
445
- * 0.3-0.7 = moderate fit
446
- * <0.3 = novel (doesn't match existing patterns, decays faster if unused)
447
- *
448
- * Uses tag overlap (always available) weighted by how common each tag is.
449
- * Rare shared tags signal stronger schema fit than common ones.
450
- */
296
+ /** How well new content fits existing knowledge, 0..1: above 0.7 consolidates faster, below 0.3 is novel and decays faster if unused.
297
+ * Tags shared with existing memories count by rarity (a rare shared tag fits more), plus content-token overlap. */
451
298
  export function computeSchemaFit(content, tags, existingEntries) {
452
299
  const tagCounts = new Map();
453
300
  for (const entry of existingEntries) {
@@ -464,10 +311,10 @@ function significantTokens(text) {
464
311
  export function schemaFitFrom(content, tags, source) {
465
312
  const N = source.rows;
466
313
  if (N === 0)
467
- return 0.5; // no schema yet, neutral
314
+ return DEFAULT_SCHEMA_FIT;
468
315
  const tagFreq = source.tagCounts;
469
316
  if (tags.length === 0 && tagFreq.size === 0)
470
- return 0.5;
317
+ return DEFAULT_SCHEMA_FIT;
471
318
  // Tag overlap, weighted so a shared rare tag counts for more than a shared common one.
472
319
  let weightedOverlap = 0;
473
320
  let totalWeight = 0;
@@ -509,26 +356,8 @@ function inferValence(tags) {
509
356
  return 'positive';
510
357
  return 'neutral';
511
358
  }
512
- /**
513
- * Update retrieval metadata on entries that were returned by a search.
514
- * Returns the mutated copies (caller must persist to disk).
515
- *
516
- * EVAL-ONLY ablation (see ablation.ts): with HIPPO_ABLATE_RECALL_BOOST set,
517
- * this returns the entries UNMUTATED - neutralizing all three strengthening
518
- * sub-effects (clock reset, retrieval_count, half-life increment) at the
519
- * single shared write site. The entries (not an empty array) must be
520
- * returned because callers derive `last_retrieval_ids` from the return
521
- * value, and a later `hippo outcome --good/--bad` targets those ids - an
522
- * empty return would silently co-ablate the outcome channel in the
523
- * strengthen-off arm. PERSISTENCE is gated separately at
524
- * each persisting caller (CLI recall, api context, MCP recall/context,
525
- * consolidation replay): writeEntry on identical rows still refreshes
526
- * updated_at, rewrites mirrors, and marks DAG parents dirty,
527
- * so those write loops skip under the flag.
528
- * The default `now` honors HIPPO_FAKE_NOW (simulated-time protocols).
529
- */
530
- // Confidence is deliberately absent below: it is an epistemic tier, not a
531
- // recency signal, and a stored 'stale' is always a deliberate mark.
359
+ /** Returns copies with the retrieval count, clock and half-life updated; the caller persists them.
360
+ * Under HIPPO_ABLATE_RECALL_BOOST (eval-only) the entries come back unchanged, not empty, since callers derive last_retrieval_ids from them. */
532
361
  export function markRetrieved(entries, now = evalNow()) {
533
362
  if (isRecallBoostAblated())
534
363
  return entries;
@@ -536,12 +365,13 @@ export function markRetrieved(entries, now = evalNow()) {
536
365
  if (e.superseded_by)
537
366
  return e;
538
367
  const wrong = netWrong(e) > 0;
368
+ // Confidence stays untouched: it is an epistemic tier, not a recency signal.
539
369
  const updated = {
540
370
  ...e,
541
371
  retrieval_count: e.retrieval_count + 1,
372
+ // A wrong memory keeps both, since last_retrieved is the decay anchor.
542
373
  last_retrieved: wrong ? e.last_retrieved : now.toISOString(),
543
- // +2 days half-life per retrieval (PLAN.md); a wrong memory keeps both, since last_retrieved is the decay anchor
544
- half_life_days: wrong ? e.half_life_days : e.half_life_days + 2,
374
+ half_life_days: wrong ? e.half_life_days : e.half_life_days + RETRIEVAL_HALF_LIFE_GAIN_DAYS,
545
375
  };
546
376
  updated.strength = calculateStrength(updated, now);
547
377
  return updated;
@@ -0,0 +1,3 @@
1
+ /** The package folder: it holds package.json, bin/ and dist-ui/. The same two steps up from src/core and from dist/core. */
2
+ export declare const PACKAGE_ROOT: string;
3
+ //# sourceMappingURL=package-root.d.ts.map
@@ -0,0 +1,5 @@
1
+ import * as path from 'path';
2
+ import { fileURLToPath } from 'url';
3
+ /** The package folder: it holds package.json, bin/ and dist-ui/. The same two steps up from src/core and from dist/core. */
4
+ export const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
5
+ //# sourceMappingURL=package-root.js.map
@@ -1,7 +1,4 @@
1
- /**
2
- * Physics engine configuration for Hippo memory-as-physics.
3
- * All constants are tunable; defaults calibrated for ~500 memory corpus.
4
- */
1
+ /** Physics engine configuration for Hippo memory-as-physics. All constants are tunable; defaults calibrated for ~500 memory corpus. */
5
2
  export interface PhysicsConfig {
6
3
  /** Use physics scoring when embeddings available. 'auto' = yes if embeddings exist. */
7
4
  enabled: boolean | 'auto';
@@ -1,12 +1,7 @@
1
- /**
2
- * Physics engine configuration for Hippo memory-as-physics.
3
- * All constants are tunable; defaults calibrated for ~500 memory corpus.
4
- */
1
+ /** Physics engine configuration for Hippo memory-as-physics. All constants are tunable; defaults calibrated for ~500 memory corpus. */
5
2
  export const DEFAULT_PHYSICS_CONFIG = {
6
- // Off by default: the paired ablation (benchmarks/physics-ablation/) found
7
- // physics worse than classic hybrid on every metric, CI excluding zero
8
- // (MRR 0.68 vs 0.84, R@5 74% vs 84%). Opt in with physics.enabled 'auto'
9
- // or true.
3
+ // Off by default: the paired ablation (benchmarks/physics-ablation/) found physics worse than classic hybrid on every metric, CI excluding zero
4
+ // (MRR 0.68 vs 0.84, R@5 74% vs 84%). Opt in with physics.enabled 'auto' or true.
10
5
  enabled: false,
11
6
  G_query: 2.0,
12
7
  G_memory: 0.01,
@@ -1,14 +1,6 @@
1
- /**
2
- * Memory-as-Physics engine for Hippo.
3
- *
4
- * Pure math module: forces, Velocity Verlet integration, physics-based scoring,
5
- * and cluster amplification. No I/O — all state is passed in and returned.
6
- *
7
- * Memories are particles on the unit hypersphere in embedding space (384-dim).
8
- * Forces act on them: query gravity (retrieval), inter-memory attraction,
9
- * conflict repulsion, and drag (consolidation). Nearby high-scoring memories
10
- * amplify each other via constructive interference.
11
- */
1
+ /** Memory-as-Physics engine: pure math (forces, Velocity Verlet integration, physics-based scoring, cluster amplification), no I/O.
2
+ * Memories are particles on the unit hypersphere in embedding space (384-dim); query gravity, attraction, conflict repulsion and drag act on them,
3
+ * and nearby high-scoring memories amplify each other. */
12
4
  import { type EmotionalValence } from './memory.js';
13
5
  import type { PhysicsConfig } from './physics-config.js';
14
6
  export interface PhysicsParticle {
@@ -51,42 +43,16 @@ export declare function vecClampMagnitude(v: number[], maxMag: number): number[]
51
43
  export declare function computeMass(strength: number, retrievalCount: number): number;
52
44
  export declare function computeCharge(valence: EmotionalValence): number;
53
45
  export declare function computeTemperature(ageDays: number, temperatureDecay: number): number;
54
- /**
55
- * Query gravity (retrieval-time, virtual — does not update position).
56
- * Returns scalar force magnitude for ranking.
57
- *
58
- * F_query(i) = G_Q * mass(i) * max(0, cosine(pos_i, query))^2
59
- */
46
+ /** Query gravity (retrieval-time, virtual: does not move the particle): scalar ranking magnitude F = G_Q * mass * max(0, cosine(pos, query))^2. */
60
47
  export declare function queryGravityMagnitude(particle: PhysicsParticle, queryEmbedding: number[], G_query: number): number;
61
- /**
62
- * Momentum bonus: how aligned is the particle's velocity with the query direction?
63
- * Returns a value in [0, 1].
64
- */
48
+ /** Momentum bonus in [0, 1]: how aligned the particle's velocity is with the query direction. */
65
49
  export declare function velocityAlignmentBonus(particle: PhysicsParticle, queryEmbedding: number[]): number;
66
- /**
67
- * Inter-memory attraction force vector (consolidation-time).
68
- * Attractive force from particle j on particle i.
69
- *
70
- * F_attract(i,j) = G_M * m_i * m_j * max(0, cosine(i,j))^3 * direction(j→i in embedding space)
71
- *
72
- * Direction is computed as the component of (pos_j - pos_i) that lies tangent to the
73
- * unit sphere at pos_i (since we normalize positions back to the sphere after integration).
74
- */
75
- export declare function attractionForce(pi: PhysicsParticle, pj: PhysicsParticle, G_memory: number): number[];
76
- /**
77
- * Conflict repulsion force vector (consolidation-time).
78
- * Repulsive force pushing i away from j.
79
- *
80
- * F_repel(i,j) = K_R * m_i * m_j / max(0.01, cosine_distance(i,j))^2
81
- * where cosine_distance = 1 - cosine_similarity
82
- */
50
+ /** Attraction force on particle i from j (consolidation-time): G_M m_i m_j max(0, cosine)^3, directed along (pos_j - pos_i) projected tangent to the unit
51
+ * sphere at pos_i (positions are re-normalized to the sphere after integration). Adds into `out` (a fresh zero vector by default) using `diff` as scratch. */
52
+ export declare function attractionForce(pi: PhysicsParticle, pj: PhysicsParticle, G_memory: number, out?: number[], diff?: number[]): number[];
53
+ /** Conflict repulsion on i away from j (consolidation-time): K_R * m_i * m_j / max(0.01, cosine_distance)^2, where cosine_distance = 1 - cosine_similarity. */
83
54
  export declare function repulsionForce(pi: PhysicsParticle, pj: PhysicsParticle, K_repulsion: number): number[];
84
- /**
85
- * Drag force vector (consolidation-time).
86
- * F_drag(i) = -drag * velocity(i) / max(1, effective_half_life(i))
87
- *
88
- * effectiveHalfLife should be passed in from the memory's current half_life_days.
89
- */
55
+ /** Drag force (consolidation-time): -drag * velocity / max(1, effectiveHalfLife), with effectiveHalfLife from the memory's current half_life_days. */
90
56
  export declare function dragForce(particle: PhysicsParticle, drag: number, effectiveHalfLife: number): number[];
91
57
  export interface ForceContext {
92
58
  /** Map of memory ID -> list of conflicting memory IDs */
@@ -95,26 +61,14 @@ export interface ForceContext {
95
61
  halfLives: Map<string, number>;
96
62
  config: PhysicsConfig;
97
63
  }
98
- /**
99
- * Run the full physics simulation for one sleep cycle.
100
- * Mutates particles in place. Returns simulation statistics.
101
- */
64
+ /** Full physics simulation for one sleep cycle; mutates particles in place and returns simulation statistics. */
102
65
  export declare function simulate(particles: PhysicsParticle[], ctx: ForceContext): SimulationStats;
103
66
  export declare function computeSystemEnergy(particles: PhysicsParticle[], G_memory: number): SystemEnergy;
104
- /**
105
- * Score all particles against a query embedding using physics-based ranking.
106
- * Does NOT modify particle positions (virtual force computation).
107
- */
67
+ /** Scores all particles against a query embedding; virtual force computation, so it does NOT modify particle positions. */
108
68
  export declare function physicsScore(particles: PhysicsParticle[], queryEmbedding: number[], config: PhysicsConfig,
109
- /** Cross-ingest-stable tie key per memoryId (typically the memory's
110
- * content, supplied by the caller which has entries in scope). Without
111
- * it ties fall to memoryId -- per-instance only, which lets the
112
- * cluster_top_k amplification set vary across fresh ingests. */
69
+ /** Cross-ingest-stable tie key per memoryId (typically the memory content, from a caller with entries in scope); without it ties fall to memoryId,
70
+ * which is per-instance only and lets the cluster_top_k amplification set vary across fresh ingests. */
113
71
  tieKeyOf?: (memoryId: string) => string): ScoredPhysicsResult[];
114
- /**
115
- * Nudge a particle's position toward (good outcome) or away from (bad outcome)
116
- * the query embedding. Respects temperature: new memories respond more.
117
- * Mutates particle in place.
118
- */
72
+ /** Nudges a particle toward (good outcome) or away from (bad outcome) the query embedding; new memories respond more (temperature). Mutates in place. */
119
73
  export declare function applyOutcomeFeedback(particle: PhysicsParticle, queryEmbedding: number[], good: boolean, feedbackAlpha: number): void;
120
74
  //# sourceMappingURL=physics.d.ts.map