hippo-memory 1.59.0 → 1.61.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 (596) hide show
  1. package/README.md +1 -1
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.js +4 -1
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/gemini.js +1 -1
  7. package/dist/agent-memories/legacy.js +1 -1
  8. package/dist/agent-memories/source.js +1 -1
  9. package/dist/agent-memories/sync.js +8 -3
  10. package/dist/ambient-store.d.ts +14 -0
  11. package/dist/ambient-store.js +90 -0
  12. package/dist/ambient.d.ts +23 -0
  13. package/dist/ambient.js +72 -50
  14. package/dist/api/assemble.d.ts +93 -0
  15. package/dist/api/assemble.js +152 -0
  16. package/dist/api/audit.d.ts +17 -0
  17. package/dist/api/audit.js +23 -0
  18. package/dist/api/auth.d.ts +79 -0
  19. package/dist/api/auth.js +178 -0
  20. package/dist/api/context-types.d.ts +105 -0
  21. package/dist/api/context-types.js +3 -0
  22. package/dist/api/context.d.ts +31 -0
  23. package/dist/api/context.js +705 -0
  24. package/dist/api/dormant.d.ts +30 -0
  25. package/dist/api/dormant.js +140 -0
  26. package/dist/api/drill-down.d.ts +84 -0
  27. package/dist/api/drill-down.js +123 -0
  28. package/dist/api/forget.d.ts +57 -0
  29. package/dist/api/forget.js +87 -0
  30. package/dist/api/goals.d.ts +18 -0
  31. package/dist/api/goals.js +33 -0
  32. package/dist/api/learn.d.ts +31 -0
  33. package/dist/api/learn.js +88 -0
  34. package/dist/api/outcome.d.ts +61 -0
  35. package/dist/api/outcome.js +66 -0
  36. package/dist/api/promote.d.ts +54 -0
  37. package/dist/api/promote.js +203 -0
  38. package/dist/api/quarantine.d.ts +24 -0
  39. package/dist/api/quarantine.js +121 -0
  40. package/dist/api/recall-types.d.ts +390 -0
  41. package/dist/api/recall-types.js +3 -0
  42. package/dist/api/recall.d.ts +36 -0
  43. package/dist/api/recall.js +634 -0
  44. package/dist/api/remember.d.ts +35 -0
  45. package/dist/api/remember.js +43 -0
  46. package/dist/api/sleep.d.ts +136 -0
  47. package/dist/api/sleep.js +271 -0
  48. package/dist/api/tokens.d.ts +26 -0
  49. package/dist/api/tokens.js +60 -0
  50. package/dist/api/types.d.ts +56 -0
  51. package/dist/api/types.js +38 -0
  52. package/dist/api.d.ts +20 -1260
  53. package/dist/api.js +25 -2711
  54. package/dist/audit.d.ts +3 -0
  55. package/dist/audit.js +7 -3
  56. package/dist/auth.d.ts +45 -4
  57. package/dist/auth.js +125 -48
  58. package/dist/autolearn.js +7 -4
  59. package/dist/capture/command.d.ts +33 -0
  60. package/dist/capture/command.js +264 -0
  61. package/dist/capture/compact.d.ts +44 -0
  62. package/dist/capture/compact.js +354 -0
  63. package/dist/capture/extract.d.ts +21 -0
  64. package/dist/capture/extract.js +464 -0
  65. package/dist/capture/transcript.d.ts +40 -0
  66. package/dist/capture/transcript.js +193 -0
  67. package/dist/capture-error.js +2 -1
  68. package/dist/churn-git.js +4 -2
  69. package/dist/cli/audit.d.ts +3 -0
  70. package/dist/cli/audit.js +159 -0
  71. package/dist/cli/auth.d.ts +2 -0
  72. package/dist/cli/auth.js +171 -0
  73. package/dist/cli/briefs.d.ts +4 -0
  74. package/dist/cli/briefs.js +435 -0
  75. package/dist/cli/card.d.ts +3 -0
  76. package/dist/cli/card.js +333 -0
  77. package/dist/cli/context.d.ts +15 -0
  78. package/dist/cli/context.js +366 -0
  79. package/dist/cli/continuity.d.ts +6 -0
  80. package/dist/cli/continuity.js +445 -0
  81. package/dist/cli/curate.d.ts +19 -0
  82. package/dist/cli/curate.js +555 -0
  83. package/dist/cli/dag.d.ts +5 -0
  84. package/dist/cli/dag.js +177 -0
  85. package/dist/cli/decisions.d.ts +4 -0
  86. package/dist/cli/decisions.js +528 -0
  87. package/dist/cli/eval.d.ts +5 -0
  88. package/dist/cli/eval.js +213 -0
  89. package/dist/cli/explain.d.ts +4 -0
  90. package/dist/cli/explain.js +150 -0
  91. package/dist/cli/goals.d.ts +2 -0
  92. package/dist/cli/goals.js +196 -0
  93. package/dist/cli/hook-blocks.d.ts +18 -0
  94. package/dist/cli/hook-blocks.js +233 -0
  95. package/dist/cli/init.d.ts +2 -0
  96. package/dist/cli/init.js +305 -0
  97. package/dist/cli/maintenance.d.ts +4 -0
  98. package/dist/cli/maintenance.js +179 -0
  99. package/dist/cli/playbooks.d.ts +4 -0
  100. package/dist/cli/playbooks.js +556 -0
  101. package/dist/cli/projects.js +1 -1
  102. package/dist/cli/recall.d.ts +7 -0
  103. package/dist/cli/recall.js +597 -0
  104. package/dist/cli/remember.d.ts +5 -0
  105. package/dist/cli/remember.js +442 -0
  106. package/dist/cli/serve.d.ts +5 -0
  107. package/dist/cli/serve.js +40 -0
  108. package/dist/cli/session-hooks.d.ts +29 -0
  109. package/dist/cli/session-hooks.js +637 -0
  110. package/dist/cli/setup.d.ts +4 -0
  111. package/dist/cli/setup.js +376 -0
  112. package/dist/cli/shared.d.ts +15 -19
  113. package/dist/cli/shared.js +50 -341
  114. package/dist/cli/slack.d.ts +2 -0
  115. package/dist/cli/slack.js +171 -0
  116. package/dist/cli/status.d.ts +18 -0
  117. package/dist/cli/status.js +400 -0
  118. package/dist/cli/transfer.d.ts +10 -0
  119. package/dist/cli/transfer.js +438 -0
  120. package/dist/cli/usage.d.ts +85 -0
  121. package/dist/cli/usage.js +741 -0
  122. package/dist/cli.d.ts +319 -13
  123. package/dist/cli.js +436 -8580
  124. package/dist/client.js +15 -8
  125. package/dist/compaction-record.js +12 -9
  126. package/dist/config.js +12 -11
  127. package/dist/connectors/github/backfill.js +94 -87
  128. package/dist/connectors/github/cli-impl.js +5 -3
  129. package/dist/connectors/github/dlq.js +67 -54
  130. package/dist/connectors/github/ingest.js +34 -35
  131. package/dist/connectors/github/tenant-routing.js +3 -2
  132. package/dist/connectors/github/webhook.js +135 -216
  133. package/dist/connectors/slack/dlq.js +49 -61
  134. package/dist/connectors/slack/ingest.js +55 -48
  135. package/dist/connectors/slack/tenant-routing.js +4 -3
  136. package/dist/connectors/slack/webhook.js +72 -74
  137. package/dist/consolidate/conflicts.d.ts +10 -0
  138. package/dist/consolidate/conflicts.js +178 -0
  139. package/dist/consolidate/decay.d.ts +12 -0
  140. package/dist/consolidate/decay.js +145 -0
  141. package/dist/consolidate/llm-passes.d.ts +3 -0
  142. package/dist/consolidate/llm-passes.js +141 -0
  143. package/dist/consolidate/merge.d.ts +7 -0
  144. package/dist/consolidate/merge.js +251 -0
  145. package/dist/consolidate/physics-pass.d.ts +3 -0
  146. package/dist/consolidate/physics-pass.js +60 -0
  147. package/dist/consolidate/run.d.ts +69 -0
  148. package/dist/consolidate/run.js +76 -0
  149. package/dist/consolidate/sleep.d.ts +18 -0
  150. package/dist/consolidate/sleep.js +209 -0
  151. package/dist/consolidate/traces.d.ts +4 -0
  152. package/dist/consolidate/traces.js +178 -0
  153. package/dist/context-auto.js +7 -11
  154. package/dist/context-render.d.ts +1 -1
  155. package/dist/context-render.js +1 -1
  156. package/dist/customer-notes.d.ts +3 -0
  157. package/dist/customer-notes.js +6 -4
  158. package/dist/dag.js +13 -12
  159. package/dist/dashboard-actions.d.ts +20 -0
  160. package/dist/dashboard-actions.js +88 -0
  161. package/dist/dashboard-params.d.ts +45 -0
  162. package/dist/dashboard-params.js +127 -0
  163. package/dist/dashboard-queries.d.ts +15 -0
  164. package/dist/dashboard-queries.js +355 -0
  165. package/dist/dashboard-snapshot.d.ts +138 -0
  166. package/dist/dashboard-snapshot.js +308 -0
  167. package/dist/dashboard-types.d.ts +163 -0
  168. package/dist/dashboard-types.js +3 -0
  169. package/dist/dashboard.d.ts +6 -7
  170. package/dist/dashboard.js +231 -203
  171. package/dist/db/busy.d.ts +5 -0
  172. package/dist/db/busy.js +24 -0
  173. package/dist/db/continuity.d.ts +5 -0
  174. package/dist/db/continuity.js +145 -0
  175. package/dist/db/meta.d.ts +8 -0
  176. package/dist/db/meta.js +35 -0
  177. package/dist/db/migrate.d.ts +9 -0
  178. package/dist/db/migrate.js +138 -0
  179. package/dist/db/migrations/index.d.ts +5 -0
  180. package/dist/db/migrations/index.js +109 -0
  181. package/dist/db/migrations/types.d.ts +14 -0
  182. package/dist/db/migrations/types.js +2 -0
  183. package/dist/db/migrations/v01.d.ts +3 -0
  184. package/dist/db/migrations/v01.js +38 -0
  185. package/dist/db/migrations/v02.d.ts +3 -0
  186. package/dist/db/migrations/v02.js +21 -0
  187. package/dist/db/migrations/v03.d.ts +3 -0
  188. package/dist/db/migrations/v03.js +22 -0
  189. package/dist/db/migrations/v04.d.ts +3 -0
  190. package/dist/db/migrations/v04.js +28 -0
  191. package/dist/db/migrations/v05.d.ts +3 -0
  192. package/dist/db/migrations/v05.js +21 -0
  193. package/dist/db/migrations/v06.d.ts +3 -0
  194. package/dist/db/migrations/v06.js +25 -0
  195. package/dist/db/migrations/v07.d.ts +3 -0
  196. package/dist/db/migrations/v07.js +13 -0
  197. package/dist/db/migrations/v08.d.ts +3 -0
  198. package/dist/db/migrations/v08.js +8 -0
  199. package/dist/db/migrations/v09.d.ts +3 -0
  200. package/dist/db/migrations/v09.js +13 -0
  201. package/dist/db/migrations/v10.d.ts +3 -0
  202. package/dist/db/migrations/v10.js +17 -0
  203. package/dist/db/migrations/v11.d.ts +3 -0
  204. package/dist/db/migrations/v11.js +15 -0
  205. package/dist/db/migrations/v12.d.ts +3 -0
  206. package/dist/db/migrations/v12.js +11 -0
  207. package/dist/db/migrations/v13.d.ts +3 -0
  208. package/dist/db/migrations/v13.js +15 -0
  209. package/dist/db/migrations/v14.d.ts +3 -0
  210. package/dist/db/migrations/v14.js +66 -0
  211. package/dist/db/migrations/v15.d.ts +3 -0
  212. package/dist/db/migrations/v15.js +42 -0
  213. package/dist/db/migrations/v16.d.ts +3 -0
  214. package/dist/db/migrations/v16.js +61 -0
  215. package/dist/db/migrations/v17.d.ts +3 -0
  216. package/dist/db/migrations/v17.js +46 -0
  217. package/dist/db/migrations/v18.d.ts +3 -0
  218. package/dist/db/migrations/v18.js +60 -0
  219. package/dist/db/migrations/v19.d.ts +3 -0
  220. package/dist/db/migrations/v19.js +28 -0
  221. package/dist/db/migrations/v20.d.ts +3 -0
  222. package/dist/db/migrations/v20.js +42 -0
  223. package/dist/db/migrations/v21.d.ts +3 -0
  224. package/dist/db/migrations/v21.js +16 -0
  225. package/dist/db/migrations/v22.d.ts +3 -0
  226. package/dist/db/migrations/v22.js +82 -0
  227. package/dist/db/migrations/v23.d.ts +3 -0
  228. package/dist/db/migrations/v23.js +48 -0
  229. package/dist/db/migrations/v24.d.ts +3 -0
  230. package/dist/db/migrations/v24.js +72 -0
  231. package/dist/db/migrations/v25.d.ts +3 -0
  232. package/dist/db/migrations/v25.js +46 -0
  233. package/dist/db/migrations/v26.d.ts +3 -0
  234. package/dist/db/migrations/v26.js +23 -0
  235. package/dist/db/migrations/v27.d.ts +3 -0
  236. package/dist/db/migrations/v27.js +57 -0
  237. package/dist/db/migrations/v28.d.ts +3 -0
  238. package/dist/db/migrations/v28.js +38 -0
  239. package/dist/db/migrations/v29.d.ts +3 -0
  240. package/dist/db/migrations/v29.js +78 -0
  241. package/dist/db/migrations/v30.d.ts +3 -0
  242. package/dist/db/migrations/v30.js +92 -0
  243. package/dist/db/migrations/v31.d.ts +3 -0
  244. package/dist/db/migrations/v31.js +74 -0
  245. package/dist/db/migrations/v32.d.ts +3 -0
  246. package/dist/db/migrations/v32.js +102 -0
  247. package/dist/db/migrations/v33.d.ts +3 -0
  248. package/dist/db/migrations/v33.js +104 -0
  249. package/dist/db/migrations/v34.d.ts +3 -0
  250. package/dist/db/migrations/v34.js +93 -0
  251. package/dist/db/migrations/v35.d.ts +3 -0
  252. package/dist/db/migrations/v35.js +98 -0
  253. package/dist/db/migrations/v36.d.ts +3 -0
  254. package/dist/db/migrations/v36.js +98 -0
  255. package/dist/db/migrations/v37.d.ts +3 -0
  256. package/dist/db/migrations/v37.js +219 -0
  257. package/dist/db/migrations/v38.d.ts +3 -0
  258. package/dist/db/migrations/v38.js +277 -0
  259. package/dist/db/migrations/v39.d.ts +3 -0
  260. package/dist/db/migrations/v39.js +59 -0
  261. package/dist/db/migrations/v40.d.ts +3 -0
  262. package/dist/db/migrations/v40.js +74 -0
  263. package/dist/db/migrations/v41.d.ts +3 -0
  264. package/dist/db/migrations/v41.js +43 -0
  265. package/dist/db/migrations/v42.d.ts +3 -0
  266. package/dist/db/migrations/v42.js +41 -0
  267. package/dist/db/migrations/v43.d.ts +3 -0
  268. package/dist/db/migrations/v43.js +67 -0
  269. package/dist/db/migrations/v44.d.ts +3 -0
  270. package/dist/db/migrations/v44.js +28 -0
  271. package/dist/db/migrations/v45.d.ts +3 -0
  272. package/dist/db/migrations/v45.js +30 -0
  273. package/dist/db/migrations/v46.d.ts +3 -0
  274. package/dist/db/migrations/v46.js +25 -0
  275. package/dist/db/migrations/v47.d.ts +3 -0
  276. package/dist/db/migrations/v47.js +17 -0
  277. package/dist/db/migrations/v48.d.ts +3 -0
  278. package/dist/db/migrations/v48.js +10 -0
  279. package/dist/db/migrations/v49.d.ts +3 -0
  280. package/dist/db/migrations/v49.js +31 -0
  281. package/dist/db/migrations/v50.d.ts +3 -0
  282. package/dist/db/migrations/v50.js +67 -0
  283. package/dist/db/migrations/v51.d.ts +3 -0
  284. package/dist/db/migrations/v51.js +14 -0
  285. package/dist/db/migrations/v52.d.ts +3 -0
  286. package/dist/db/migrations/v52.js +7 -0
  287. package/dist/db/open.d.ts +23 -0
  288. package/dist/db/open.js +146 -0
  289. package/dist/db/sqlite.d.ts +21 -0
  290. package/dist/db/sqlite.js +8 -0
  291. package/dist/db/tables.d.ts +7 -0
  292. package/dist/db/tables.js +38 -0
  293. package/dist/db.d.ts +6 -46
  294. package/dist/db.js +5 -3036
  295. package/dist/decisions.d.ts +4 -1
  296. package/dist/decisions.js +9 -7
  297. package/dist/dedupe.js +3 -2
  298. package/dist/delivery-recorder.js +5 -1
  299. package/dist/doctor.js +4 -3
  300. package/dist/dormant.js +1 -0
  301. package/dist/embedding-provider.d.ts +1 -1
  302. package/dist/embedding-provider.js +7 -5
  303. package/dist/embeddings.d.ts +9 -52
  304. package/dist/embeddings.js +47 -298
  305. package/dist/env.d.ts +75 -0
  306. package/dist/env.js +119 -0
  307. package/dist/eval-suite.js +1 -1
  308. package/dist/eval.js +2 -2
  309. package/dist/extract.js +5 -4
  310. package/dist/gated-write.js +3 -1
  311. package/dist/goals.d.ts +3 -1
  312. package/dist/goals.js +18 -0
  313. package/dist/graph/read.d.ts +73 -0
  314. package/dist/graph/read.js +325 -0
  315. package/dist/graph/rows.d.ts +45 -0
  316. package/dist/graph/rows.js +51 -0
  317. package/dist/graph/types.d.ts +83 -0
  318. package/dist/graph/types.js +11 -0
  319. package/dist/graph/write.d.ts +93 -0
  320. package/dist/{graph.js → graph/write.js} +8 -391
  321. package/dist/graph-extract.js +2 -1
  322. package/dist/graph-recall.d.ts +1 -1
  323. package/dist/graph-recall.js +2 -2
  324. package/dist/graph-stream.js +1 -1
  325. package/dist/graph-view.d.ts +1 -1
  326. package/dist/graph-view.js +1 -1
  327. package/dist/half-life-migration.d.ts +1 -1
  328. package/dist/half-life-migration.js +2 -1
  329. package/dist/handoff.js +3 -0
  330. package/dist/hooks/codex-session.d.ts +8 -0
  331. package/dist/hooks/codex-session.js +76 -0
  332. package/dist/hooks/codex-wrapper.d.ts +55 -0
  333. package/dist/hooks/codex-wrapper.js +288 -0
  334. package/dist/hooks/json-hooks.d.ts +63 -0
  335. package/dist/hooks/json-hooks.js +356 -0
  336. package/dist/hooks/opencode.d.ts +50 -0
  337. package/dist/hooks/opencode.js +202 -0
  338. package/dist/hooks/shared.d.ts +54 -0
  339. package/dist/hooks/shared.js +77 -0
  340. package/dist/http-retry.d.ts +2 -0
  341. package/dist/http-retry.js +4 -3
  342. package/dist/http-util.d.ts +3 -0
  343. package/dist/http-util.js +10 -0
  344. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  345. package/dist/importers/core.js +141 -0
  346. package/dist/importers/markdown-parse.d.ts +41 -0
  347. package/dist/importers/markdown-parse.js +132 -0
  348. package/dist/importers/markdown.d.ts +3 -0
  349. package/dist/importers/markdown.js +92 -0
  350. package/dist/importers/sources.d.ts +7 -0
  351. package/dist/importers/sources.js +229 -0
  352. package/dist/importers/vault.d.ts +11 -0
  353. package/dist/importers/vault.js +352 -0
  354. package/dist/incidents.d.ts +3 -0
  355. package/dist/incidents.js +8 -5
  356. package/dist/index.d.ts +25 -6
  357. package/dist/index.js +23 -6
  358. package/dist/invalidation.js +2 -1
  359. package/dist/judgment.js +7 -3
  360. package/dist/keyset.d.ts +13 -0
  361. package/dist/keyset.js +8 -0
  362. package/dist/local-embedding.d.ts +13 -0
  363. package/dist/local-embedding.js +165 -0
  364. package/dist/log.d.ts +7 -0
  365. package/dist/log.js +19 -1
  366. package/dist/mcp/admin-tools.d.ts +8 -0
  367. package/dist/mcp/admin-tools.js +116 -0
  368. package/dist/mcp/format.d.ts +27 -0
  369. package/dist/mcp/format.js +135 -0
  370. package/dist/mcp/memory-tools.d.ts +5 -0
  371. package/dist/mcp/memory-tools.js +83 -0
  372. package/dist/mcp/protocol.d.ts +83 -0
  373. package/dist/mcp/protocol.js +55 -0
  374. package/dist/mcp/recall-tools.d.ts +6 -0
  375. package/dist/mcp/recall-tools.js +320 -0
  376. package/dist/mcp/request.d.ts +10 -0
  377. package/dist/mcp/request.js +163 -0
  378. package/dist/mcp/server.d.ts +4 -70
  379. package/dist/mcp/server.js +8 -1172
  380. package/dist/mcp/session-state.d.ts +11 -0
  381. package/dist/mcp/session-state.js +28 -0
  382. package/dist/mcp/stdio.d.ts +8 -0
  383. package/dist/mcp/stdio.js +79 -0
  384. package/dist/mcp/tools.d.ts +11 -0
  385. package/dist/mcp/tools.js +247 -0
  386. package/dist/memory.d.ts +8 -3
  387. package/dist/memory.js +27 -1
  388. package/dist/multihop.d.ts +1 -1
  389. package/dist/multihop.js +2 -1
  390. package/dist/owner-validation.js +2 -1
  391. package/dist/physics-state.js +10 -7
  392. package/dist/policies.d.ts +3 -0
  393. package/dist/policies.js +8 -6
  394. package/dist/postinstall.js +3 -2
  395. package/dist/predictions/planning-fallacy.d.ts +100 -0
  396. package/dist/predictions/planning-fallacy.js +190 -0
  397. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  398. package/dist/predictions/store.js +434 -0
  399. package/dist/processes.d.ts +3 -0
  400. package/dist/processes.js +8 -5
  401. package/dist/project-briefs.d.ts +3 -0
  402. package/dist/project-briefs.js +7 -5
  403. package/dist/project-identity.d.ts +1 -1
  404. package/dist/project-identity.js +12 -6
  405. package/dist/project-merge.js +3 -1
  406. package/dist/quarantine.d.ts +2 -1
  407. package/dist/quarantine.js +8 -5
  408. package/dist/raw-archive-mirror-cleanup.js +2 -1
  409. package/dist/raw-archive.js +1 -1
  410. package/dist/recall-history.js +3 -2
  411. package/dist/recall-pipeline.d.ts +2 -2
  412. package/dist/recall-pipeline.js +16 -8
  413. package/dist/recall-scope.js +1 -1
  414. package/dist/recall-trace.d.ts +3 -3
  415. package/dist/recall-trace.js +10 -14
  416. package/dist/refine-llm.js +20 -11
  417. package/dist/reject-flow.js +6 -1
  418. package/dist/rerankers/clef.d.ts +2 -2
  419. package/dist/rerankers/clef.js +72 -30
  420. package/dist/rerankers/cross-encoder.js +6 -4
  421. package/dist/rerankers/jev.d.ts +4 -2
  422. package/dist/rerankers/jev.js +24 -19
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +61 -41
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/same-text.d.ts +2 -0
  428. package/dist/same-text.js +4 -0
  429. package/dist/scheduler.d.ts +1 -0
  430. package/dist/scheduler.js +26 -3
  431. package/dist/scope.js +4 -3
  432. package/dist/search/as-of.d.ts +10 -0
  433. package/dist/search/as-of.js +22 -0
  434. package/dist/search/bm25-search.d.ts +14 -0
  435. package/dist/search/bm25-search.js +43 -0
  436. package/dist/search/bm25.d.ts +15 -0
  437. package/dist/search/bm25.js +54 -0
  438. package/dist/search/boosts.d.ts +54 -0
  439. package/dist/search/boosts.js +94 -0
  440. package/dist/search/breakdown.d.ts +7 -0
  441. package/dist/search/breakdown.js +20 -0
  442. package/dist/search/explain.d.ts +25 -0
  443. package/dist/search/explain.js +31 -0
  444. package/dist/search/finalize.d.ts +8 -0
  445. package/dist/search/finalize.js +52 -0
  446. package/dist/search/fusion.d.ts +27 -0
  447. package/dist/search/fusion.js +42 -0
  448. package/dist/search/hybrid-score.d.ts +20 -0
  449. package/dist/search/hybrid-score.js +73 -0
  450. package/dist/search/hybrid.d.ts +46 -0
  451. package/dist/search/hybrid.js +64 -0
  452. package/dist/search/physics-search.d.ts +29 -0
  453. package/dist/search/physics-search.js +162 -0
  454. package/dist/search/rerank.d.ts +10 -0
  455. package/dist/search/rerank.js +72 -0
  456. package/dist/search/temporal.d.ts +15 -0
  457. package/dist/search/temporal.js +45 -0
  458. package/dist/search/types.d.ts +91 -0
  459. package/dist/search/types.js +2 -0
  460. package/dist/search/vector.d.ts +30 -0
  461. package/dist/search/vector.js +71 -0
  462. package/dist/secret-detect.d.ts +2 -0
  463. package/dist/secret-detect.js +3 -1
  464. package/dist/server/auth.d.ts +52 -0
  465. package/dist/server/auth.js +221 -0
  466. package/dist/server/client-ip.d.ts +25 -0
  467. package/dist/server/client-ip.js +92 -0
  468. package/dist/server/cursor.d.ts +23 -0
  469. package/dist/server/cursor.js +58 -0
  470. package/dist/server/lifecycle.d.ts +7 -0
  471. package/dist/server/lifecycle.js +29 -0
  472. package/dist/server/mcp-http.d.ts +5 -0
  473. package/dist/server/mcp-http.js +199 -0
  474. package/dist/server/request.d.ts +33 -0
  475. package/dist/server/request.js +103 -0
  476. package/dist/server/routes/admin.d.ts +9 -0
  477. package/dist/server/routes/admin.js +158 -0
  478. package/dist/server/routes/customer-notes.d.ts +7 -0
  479. package/dist/server/routes/customer-notes.js +112 -0
  480. package/dist/server/routes/decisions.d.ts +7 -0
  481. package/dist/server/routes/decisions.js +133 -0
  482. package/dist/server/routes/incidents.d.ts +7 -0
  483. package/dist/server/routes/incidents.js +126 -0
  484. package/dist/server/routes/memories.d.ts +10 -0
  485. package/dist/server/routes/memories.js +179 -0
  486. package/dist/server/routes/policies.d.ts +8 -0
  487. package/dist/server/routes/policies.js +151 -0
  488. package/dist/server/routes/predictions.d.ts +7 -0
  489. package/dist/server/routes/predictions.js +164 -0
  490. package/dist/server/routes/processes.d.ts +7 -0
  491. package/dist/server/routes/processes.js +161 -0
  492. package/dist/server/routes/project-briefs.d.ts +8 -0
  493. package/dist/server/routes/project-briefs.js +136 -0
  494. package/dist/server/routes/recall.d.ts +8 -0
  495. package/dist/server/routes/recall.js +340 -0
  496. package/dist/server/routes/skills.d.ts +8 -0
  497. package/dist/server/routes/skills.js +150 -0
  498. package/dist/server/types.d.ts +56 -0
  499. package/dist/server/types.js +2 -0
  500. package/dist/server/validation.d.ts +14 -0
  501. package/dist/server/validation.js +91 -0
  502. package/dist/server.d.ts +7 -61
  503. package/dist/server.js +92 -2368
  504. package/dist/session-digest.d.ts +1 -1
  505. package/dist/session-digest.js +9 -2
  506. package/dist/shared.d.ts +3 -1
  507. package/dist/shared.js +46 -40
  508. package/dist/skills.d.ts +3 -0
  509. package/dist/skills.js +7 -5
  510. package/dist/stdin.js +3 -2
  511. package/dist/store/audit-event.d.ts +19 -0
  512. package/dist/store/audit-event.js +33 -0
  513. package/dist/store/candidates.d.ts +42 -0
  514. package/dist/store/candidates.js +152 -0
  515. package/dist/store/conflicts.d.ts +44 -0
  516. package/dist/store/conflicts.js +444 -0
  517. package/dist/store/delete-and-batch.d.ts +63 -0
  518. package/dist/store/delete-and-batch.js +310 -0
  519. package/dist/store/entry-reads.d.ts +92 -0
  520. package/dist/store/entry-reads.js +255 -0
  521. package/dist/store/entry-row.d.ts +67 -0
  522. package/dist/store/entry-row.js +208 -0
  523. package/dist/store/entry-writes.d.ts +46 -0
  524. package/dist/store/entry-writes.js +148 -0
  525. package/dist/store/handoffs.d.ts +26 -0
  526. package/dist/store/handoffs.js +184 -0
  527. package/dist/store/index-and-stats.d.ts +52 -0
  528. package/dist/store/index-and-stats.js +214 -0
  529. package/dist/store/markdown.d.ts +10 -0
  530. package/dist/store/markdown.js +108 -0
  531. package/dist/store/mirrors.d.ts +49 -0
  532. package/dist/store/mirrors.js +312 -0
  533. package/dist/store/open.d.ts +15 -0
  534. package/dist/store/open.js +223 -0
  535. package/dist/store/rows.d.ts +178 -0
  536. package/dist/store/rows.js +158 -0
  537. package/dist/store/search-rows.d.ts +86 -0
  538. package/dist/store/search-rows.js +254 -0
  539. package/dist/store/sessions.d.ts +83 -0
  540. package/dist/store/sessions.js +272 -0
  541. package/dist/store/summaries.d.ts +94 -0
  542. package/dist/store/summaries.js +377 -0
  543. package/dist/store/tenant-lookup.d.ts +12 -0
  544. package/dist/store/tenant-lookup.js +16 -0
  545. package/dist/store-cards.js +2 -1
  546. package/dist/summary-dirty.d.ts +4 -0
  547. package/dist/summary-dirty.js +32 -0
  548. package/dist/support-bundle.js +4 -3
  549. package/dist/tenant.js +2 -2
  550. package/dist/token-ledger.js +1 -0
  551. package/dist/tokenize.d.ts +2 -0
  552. package/dist/tokenize.js +16 -0
  553. package/dist/transcript-tail.d.ts +7 -0
  554. package/dist/transcript-tail.js +48 -0
  555. package/dist/vector-store.d.ts +27 -0
  556. package/dist/vector-store.js +210 -0
  557. package/dist/version.d.ts +2 -2
  558. package/dist/version.js +2 -2
  559. package/dist/working-memory.js +1 -1
  560. package/dist/yaml.js +36 -11
  561. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  566. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  570. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  571. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  572. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  573. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  574. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  575. package/dist-ui/index.html +3 -25
  576. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  577. package/extensions/openclaw-plugin/package.json +1 -1
  578. package/openclaw.plugin.json +1 -1
  579. package/package.json +2 -1
  580. package/dist/capture.d.ts +0 -155
  581. package/dist/capture.js +0 -1293
  582. package/dist/consolidate.d.ts +0 -58
  583. package/dist/consolidate.js +0 -1123
  584. package/dist/graph.d.ts +0 -245
  585. package/dist/hooks.d.ts +0 -208
  586. package/dist/hooks.js +0 -1073
  587. package/dist/importers.js +0 -897
  588. package/dist/predictions.js +0 -620
  589. package/dist/search.d.ts +0 -320
  590. package/dist/search.js +0 -968
  591. package/dist/store.d.ts +0 -744
  592. package/dist/store.js +0 -3372
  593. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  594. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  595. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  596. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -0,0 +1,11 @@
1
+ import type { RingBuffer } from '../recall-history.js';
2
+ export declare const sessionRecallHistoryMcp: Map<string, RingBuffer>;
3
+ /** Test-only: reset the module-level recall-history Map. Call from beforeEach. */
4
+ export declare function __resetSessionRecallHistoryMcp(): void;
5
+ export declare const lastRecalledIds: Map<string, string[]>;
6
+ export declare const autoSleepInFlight: Set<string>;
7
+ export declare function resolveClientKey(ctx: {
8
+ clientKey?: string;
9
+ tenantId: string;
10
+ } | undefined): string;
11
+ //# sourceMappingURL=session-state.d.ts.map
@@ -0,0 +1,28 @@
1
+ // Per-process state the MCP tools share across calls: recall rings, last recalled ids, auto-sleep runs.
2
+ // v0.33 / J1 — Module-level per-(tenant, session) recall-history ring map
3
+ // for the MCP pipeline. Separate from CLI/HTTP rings per plan v3
4
+ // architecture (per-pipeline rings; no IPC).
5
+ export const sessionRecallHistoryMcp = new Map();
6
+ /** Test-only: reset the module-level recall-history Map. Call from beforeEach. */
7
+ export function __resetSessionRecallHistoryMcp() {
8
+ sessionRecallHistoryMcp.clear();
9
+ }
10
+ // ── Track last recalled IDs for outcome feedback ──
11
+ //
12
+ // Keyed per-client so two HTTP-MCP clients hitting the same tenant cannot
13
+ // poison each other's outcome feedback. The key is `ctx.clientKey` when the
14
+ // transport supplies one (HTTP-MCP via src/server.ts builds
15
+ // hash(bearer+remoteAddr)); stdio and any caller without a clientKey falls
16
+ // back to `'stdio-${pid}'` (one process = one client) or
17
+ // `${tenantId}:default` if a McpContext is constructed in tests without a
18
+ // pid-bound transport.
19
+ export const lastRecalledIds = new Map();
20
+ export const autoSleepInFlight = new Set();
21
+ export function resolveClientKey(ctx) {
22
+ if (ctx?.clientKey)
23
+ return ctx.clientKey;
24
+ if (ctx?.tenantId)
25
+ return `stdio-${process.pid}:${ctx.tenantId}`;
26
+ return `stdio-${process.pid}:default`;
27
+ }
28
+ //# sourceMappingURL=session-state.js.map
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Wire stdin/stdout to the dispatcher. Idempotent — only the entrypoint
3
+ * (cli.ts `hippo mcp`, or running this file directly) should call this.
4
+ * src/server.ts imports `handleMcpRequest` without invoking this, so the
5
+ * HTTP daemon does not steal stdin or exit when its parent closes a pipe.
6
+ */
7
+ export declare function startStdioLoop(): void;
8
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1,79 @@
1
+ // Stdio transport: newline-delimited JSON-RPC frames in on stdin, replies out on stdout.
2
+ import { errorFields, log } from '../log.js';
3
+ import { parseFrame } from './framing.js';
4
+ import { mcpErrorResponse, isJsonObjectRecord, isJsonString } from './protocol.js';
5
+ import { handleMcpRequest } from './request.js';
6
+ // MCP stdio transport spec: messages are newline-delimited JSON-RPC, no embedded newlines.
7
+ // https://modelcontextprotocol.io/specification/.../basic/transports#stdio
8
+ function send(msg) {
9
+ process.stdout.write(JSON.stringify(msg) + '\n');
10
+ }
11
+ // ── Stdio transport ──
12
+ let buffer = Buffer.alloc(0);
13
+ // Only method is checked: handleMcpRequest narrows params where it reads them, as the HTTP transport does.
14
+ function isRoutableRequest(v) {
15
+ return isJsonObjectRecord(v) && isJsonString(v.method);
16
+ }
17
+ function dispatch(body) {
18
+ let parsed;
19
+ try {
20
+ parsed = JSON.parse(body);
21
+ }
22
+ catch {
23
+ log.debug('mcp: answered a frame that is not valid JSON with a parse error');
24
+ send({ jsonrpc: '2.0', id: null, error: { code: -32700, message: 'Parse error' } });
25
+ return;
26
+ }
27
+ // A frame without a string method cannot be routed; dropping it keeps a stray value from crashing the process.
28
+ if (!isRoutableRequest(parsed))
29
+ return;
30
+ const req = parsed;
31
+ if (req.method.startsWith('notifications/')) {
32
+ handleMcpRequest(req).catch((err) => {
33
+ log.error(`mcp notification ${req.method} failed: ${err instanceof Error ? err.message : String(err)}`);
34
+ });
35
+ return;
36
+ }
37
+ handleMcpRequest(req).then((resp) => { if (resp)
38
+ send(resp); }).catch((err) => {
39
+ send(mcpErrorResponse(req.id, err));
40
+ });
41
+ }
42
+ /**
43
+ * Wire stdin/stdout to the dispatcher. Idempotent — only the entrypoint
44
+ * (cli.ts `hippo mcp`, or running this file directly) should call this.
45
+ * src/server.ts imports `handleMcpRequest` without invoking this, so the
46
+ * HTTP daemon does not steal stdin or exit when its parent closes a pipe.
47
+ */
48
+ export function startStdioLoop() {
49
+ process.stdin.on('data', (chunk) => {
50
+ buffer = Buffer.concat([buffer, chunk]);
51
+ while (true) {
52
+ const result = parseFrame(buffer);
53
+ if (result.kind === 'incomplete')
54
+ break;
55
+ buffer = result.rest;
56
+ if (result.kind === 'message')
57
+ dispatch(result.body);
58
+ }
59
+ });
60
+ process.stdin.on('end', () => process.exit(0));
61
+ // After an uncaught throw the process state is unknown, so log the cause and exit for the client to restart the server.
62
+ const crash = (kind, err) => {
63
+ log.error(`mcp ${kind}: ${err instanceof Error ? err.message : String(err)}`, errorFields(err));
64
+ exitAfterFlush(1);
65
+ };
66
+ process.on('uncaughtException', (err) => crash('uncaught exception', err));
67
+ process.on('unhandledRejection', (err) => crash('unhandled rejection', err));
68
+ }
69
+ /** Exit once stdout and stderr have drained, so the last reply and the crash log reach the client; capped at 1 s. */
70
+ function exitAfterFlush(code) {
71
+ process.exitCode = code;
72
+ let pending = 2;
73
+ const done = () => { if (--pending === 0)
74
+ process.exit(code); };
75
+ process.stdout.write('', done);
76
+ process.stderr.write('', done);
77
+ setTimeout(() => process.exit(code), 1000).unref();
78
+ }
79
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1,11 @@
1
+ import type { ToolInputSchema } from './tool-args.js';
2
+ interface McpToolDefinition {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: ToolInputSchema;
6
+ }
7
+ export declare const TOOLS: readonly McpToolDefinition[];
8
+ export declare const TOOLS_BY_NAME: Map<string, McpToolDefinition>;
9
+ export declare const ARGS_CHECKED_BY_API: Map<string, ReadonlySet<string>>;
10
+ export {};
11
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1,247 @@
1
+ // Tool definitions and input schemas served by tools/list.
2
+ // ── Tool definitions ──
3
+ // HTTP sets no budget cap; 25x the 4000 recall default leaves room for large-context clients while bounding one call's work.
4
+ const MAX_BUDGET_TOKENS = 100_000;
5
+ // Same ceiling as the HTTP list routes' parseListLimit.
6
+ const MAX_LIST_LIMIT = 1000;
7
+ export const TOOLS = [
8
+ {
9
+ name: 'hippo_recall',
10
+ description: 'Retrieve relevant memories from the project memory store. Returns memories ranked by relevance, strength, and recency within the token budget. Use at session start or when you need context about a topic. Pass include_continuity=true to also surface the active task snapshot, latest matching session handoff, and recent session events as a "## Continuity" appendix.',
11
+ inputSchema: {
12
+ type: 'object',
13
+ properties: {
14
+ query: { type: 'string', description: 'What to search for in memory (natural language)' },
15
+ budget: {
16
+ type: 'number',
17
+ minimum: 0,
18
+ maximum: MAX_BUDGET_TOKENS,
19
+ description: `Max tokens to return (default: config.defaultBudget, 4000; max ${MAX_BUDGET_TOKENS})`,
20
+ },
21
+ include_continuity: {
22
+ type: 'boolean',
23
+ description: 'Append continuity context (active snapshot + handoff + last 5 session events) below the memory results. Useful at session boot.',
24
+ },
25
+ scope: {
26
+ type: 'string',
27
+ description: 'Restrict results and continuity to memories/rows matching this scope exactly. When omitted, default-deny applies to ANY <source>:private:* (slack, github, ...) and unknown-legacy rows.',
28
+ },
29
+ fresh_tail_count: {
30
+ type: 'number',
31
+ description: 'When > 0, surface the last N kind=raw rows tagged isFreshTail=true regardless of query match. Useful for "what did I just see" continuity. Capped at 200.',
32
+ },
33
+ fresh_tail_session_id: {
34
+ type: 'string',
35
+ description: 'Restrict the fresh-tail window to a specific session. Without this, fresh-tail is tenant-wide (legacy v1.5.2 behaviour, pre-v1.6.3 default).',
36
+ },
37
+ summarize_overflow: {
38
+ type: 'boolean',
39
+ description: 'When true (default), entries that overflow the limit and share a level-2 parent summary cause that summary to be appended in their place. Set false for strict-limit behaviour.',
40
+ },
41
+ scorer_window: {
42
+ type: 'number',
43
+ description: 'How many of the top-ranked memories the fresh-tail and summarize-overflow appendix is worked out against. The main list ranks the whole tenant store, so scorer_window does not narrow it. Default 200. Rejected as RecallContractError code=invalid_scorer_window if 0/negative/non-finite/non-numeric.',
44
+ },
45
+ session_id: {
46
+ type: 'string',
47
+ maxLength: 256,
48
+ description: 'Optional session id (v1.7.4). When set AND (tenant, session) has active goals, applies the dlPFC goal-stack boost to the ranked memories before formatting. Mirrors fresh_tail_session_id shape (256-char cap).',
49
+ },
50
+ },
51
+ required: ['query'],
52
+ },
53
+ },
54
+ {
55
+ name: 'hippo_assemble',
56
+ description: 'Build a chronologically-ordered context window for a session. Returns ordered items: fresh-tail raw rows + level-2 summary substitutions for older rows + budget-fit. Hippo-additive vs lossless-claw: eviction picks lowest-strength non-fresh-tail items first instead of oldest-first. Tenant-scoped; default-deny on private scopes.',
57
+ inputSchema: {
58
+ type: 'object',
59
+ properties: {
60
+ session_id: {
61
+ type: 'string',
62
+ description: 'Session identifier. Returns clean empty result if no kind=raw rows match.',
63
+ },
64
+ budget: {
65
+ type: 'number',
66
+ minimum: 0,
67
+ maximum: MAX_BUDGET_TOKENS,
68
+ description: `Token budget for the assembled context (default 4000; max ${MAX_BUDGET_TOKENS}). Eviction kicks in over budget.`,
69
+ },
70
+ fresh_tail_count: {
71
+ type: 'number',
72
+ description: 'Recent raw rows always kept verbatim (default 10). These are never evicted.',
73
+ },
74
+ summarize_older: {
75
+ type: 'boolean',
76
+ description: 'When true (default), older raws sharing a level-2 parent summary get substituted. Set false to keep every older raw as-is.',
77
+ },
78
+ scope: {
79
+ type: 'string',
80
+ description: 'Restrict to memories whose scope matches exactly. When omitted, default-deny applies to ANY <source>:private:* scope and unknown:legacy rows. Pass an explicit scope to assemble a private session with consent.',
81
+ },
82
+ },
83
+ required: ['session_id'],
84
+ },
85
+ },
86
+ {
87
+ name: 'hippo_drill',
88
+ description: 'Walk one step down the DAG from a level-2+ topic summary to its direct children. Companion to hippo_recall: when recall returns an item with isSummary=true and substitutedFor=[ids], pass the summary id here to recover the original detail. Tenant-scoped; default-deny on private scopes.',
89
+ inputSchema: {
90
+ type: 'object',
91
+ properties: {
92
+ summary_id: {
93
+ type: 'string',
94
+ description: 'ID of the level-2 (or higher) summary to drill into. Must be a summary, not a leaf — leaves are not drillable.',
95
+ },
96
+ limit: {
97
+ type: 'number',
98
+ minimum: 0,
99
+ maximum: MAX_LIST_LIMIT,
100
+ description: `Max children to return (default 50; max ${MAX_LIST_LIMIT}).`,
101
+ },
102
+ budget: {
103
+ type: 'number',
104
+ minimum: 0,
105
+ maximum: MAX_BUDGET_TOKENS,
106
+ description: `Max total token cost (~ chars/4) of returned children (max ${MAX_BUDGET_TOKENS}). Truncates chronologically.`,
107
+ },
108
+ depth: {
109
+ type: 'integer',
110
+ minimum: 1,
111
+ maximum: 10,
112
+ description: 'v0.30 / E5: walk N levels down (default 1 = direct children only). Higher values include children of children. Token budget remains GLOBAL across levels. Hard cap 10.',
113
+ },
114
+ },
115
+ required: ['summary_id'],
116
+ },
117
+ },
118
+ {
119
+ name: 'hippo_remember',
120
+ description: 'Store a new memory. Use when you learn something non-obvious, hit an error, or discover a useful pattern. Memories decay over time unless retrieved. Errors get 2x half-life.',
121
+ inputSchema: {
122
+ type: 'object',
123
+ properties: {
124
+ text: {
125
+ type: 'string',
126
+ description: 'The memory to store (1-2 sentences, specific and concrete)',
127
+ },
128
+ error: { type: 'boolean', description: 'Mark as error memory (doubles half-life)' },
129
+ pin: { type: 'boolean', description: 'Pin memory (never decays)' },
130
+ tag: { type: 'string', description: 'Optional tag for categorization' },
131
+ },
132
+ required: ['text'],
133
+ },
134
+ },
135
+ {
136
+ name: 'hippo_outcome',
137
+ description: 'Report whether recalled memories were useful. Strengthens good memories (+5 days half-life) and weakens bad ones (-3 days). Call after completing work.',
138
+ inputSchema: {
139
+ type: 'object',
140
+ properties: {
141
+ good: {
142
+ type: 'boolean',
143
+ description: 'true = memories helped, false = memories were irrelevant',
144
+ },
145
+ },
146
+ required: ['good'],
147
+ },
148
+ },
149
+ {
150
+ name: 'hippo_context',
151
+ description: 'Smart context injection: auto-detects current task from git state and returns relevant memories plus the active task snapshot, session handoff and recent session trail (the same bundle as GET /v1/context). Use at the start of any session. Memories and those sections are scope-filtered: a no-scope caller does NOT see ANY <source>:private:* (slack, github, ...) or legacy-quarantine rows.',
152
+ inputSchema: {
153
+ type: 'object',
154
+ properties: {
155
+ budget: {
156
+ type: 'number',
157
+ minimum: 0,
158
+ maximum: MAX_BUDGET_TOKENS,
159
+ description: `Max tokens (default: config.defaultContextBudget, 3000; max ${MAX_BUDGET_TOKENS})`,
160
+ },
161
+ scope: {
162
+ type: 'string',
163
+ description: 'Restrict memories, snapshot, handoff and trail to this scope exactly. When omitted, default-deny applies to ANY <source>:private:* (slack, github, ...) and unknown-legacy rows.',
164
+ },
165
+ },
166
+ },
167
+ },
168
+ {
169
+ name: 'hippo_status',
170
+ description: 'Check memory health: counts, strengths, at-risk memories, last consolidation time.',
171
+ inputSchema: {
172
+ type: 'object',
173
+ properties: {},
174
+ },
175
+ },
176
+ {
177
+ name: 'hippo_learn',
178
+ description: 'Scan recent git commits for lessons from fix/revert/bug/refactor/perf patterns. Run after coding sessions.',
179
+ inputSchema: {
180
+ type: 'object',
181
+ properties: {
182
+ days: { type: 'number', description: 'Days to scan back (default: 7)' },
183
+ },
184
+ },
185
+ },
186
+ {
187
+ name: 'hippo_conflicts',
188
+ description: 'List open memory conflicts — contradictory memories that need resolution.',
189
+ inputSchema: {
190
+ type: 'object',
191
+ properties: {},
192
+ },
193
+ },
194
+ {
195
+ name: 'hippo_resolve',
196
+ description: 'Resolve a memory conflict by keeping one memory and weakening or deleting the other.',
197
+ inputSchema: {
198
+ type: 'object',
199
+ properties: {
200
+ conflict_id: { type: 'number', description: 'The conflict ID to resolve' },
201
+ keep: { type: 'string', description: 'ID of the memory to keep' },
202
+ forget: { type: 'boolean', description: 'Delete the loser instead of weakening (default: false)' },
203
+ rejectLoser: { type: 'boolean', description: 'Tombstone the loser\'s value too, so it refuses re-ingestion (implies removal; default: false)' },
204
+ reason: { type: 'string', description: 'Reason recorded on the tombstone when rejectLoser is set (default: a conflict-context string)' },
205
+ },
206
+ required: ['conflict_id', 'keep'],
207
+ },
208
+ },
209
+ {
210
+ name: 'hippo_share',
211
+ description: 'Share a memory to the global store for cross-project use with transfer scoring.',
212
+ inputSchema: {
213
+ type: 'object',
214
+ properties: {
215
+ id: { type: 'string', description: 'Memory ID to share' },
216
+ force: { type: 'boolean', description: 'Share even if transfer score is low' },
217
+ },
218
+ required: ['id'],
219
+ },
220
+ },
221
+ {
222
+ name: 'hippo_peers',
223
+ description: 'List all projects that have contributed memories to the global shared store.',
224
+ inputSchema: {
225
+ type: 'object',
226
+ properties: {},
227
+ },
228
+ },
229
+ {
230
+ name: 'hippo_predict_baserate',
231
+ description: 'J3 reference-class / planning-fallacy detector. Get base-rate stats for closed predictions in a class. Call this when you make a forward-looking claim (effort estimate, rollout risk, deadline) to anchor on the past track record rather than the inside view. Returns count + mean estimate + mean actual + mean ratio + median ratio + MAE + a human-readable summary. Tenant-scoped.',
232
+ inputSchema: {
233
+ type: 'object',
234
+ properties: {
235
+ class_tag: {
236
+ type: 'string',
237
+ description: 'Cohort label, e.g. "migration-effort", "rollout-risk", "deadline-week". Must match the class_tag used when the predictions were created via hippo_predict (or `hippo predict ...`).',
238
+ },
239
+ },
240
+ required: ['class_tag'],
241
+ },
242
+ },
243
+ ];
244
+ export const TOOLS_BY_NAME = new Map(TOOLS.map((t) => [t.name, t]));
245
+ // api.retrieve rejects these itself, so MCP and HTTP callers get the same typed error code for the same bad value.
246
+ export const ARGS_CHECKED_BY_API = new Map([['hippo_recall', new Set(['scorer_window'])]]);
247
+ //# sourceMappingURL=tools.js.map
package/dist/memory.d.ts CHANGED
@@ -135,19 +135,21 @@ export declare function _resetLossAversionRatioCacheForTests(): void;
135
135
  * Modulates effective half-life: memories with consistent positive outcomes
136
136
  * decay slower; consistent negative outcomes decay faster.
137
137
  */
138
- export declare function calculateRewardFactor(entry: MemoryEntry): number;
138
+ export declare function calculateRewardFactor(entry: Pick<MemoryEntry, 'outcome_positive' | 'outcome_negative'>): number;
139
139
  /**
140
140
  * Net wrongness: bad outcome marks past good ones, never below zero.
141
141
  * Strength halves per unit (capped at 3) and recall stops strengthening
142
142
  * the memory, so a correction outranks pinning, error tags and heavy recall.
143
143
  */
144
- export declare function netWrong(entry: MemoryEntry): number;
144
+ export declare function netWrong(entry: Pick<MemoryEntry, 'outcome_positive' | 'outcome_negative'>): number;
145
145
  /**
146
146
  * Options for decay basis.
147
147
  * - clock: wall-clock time (default pre-v0.15)
148
148
  * - session: decay by sleep cycle count (for intermittent agents)
149
149
  * - adaptive: auto-scale half-life by session frequency (default v0.15+)
150
150
  */
151
+ /** What calculateStrength reads, so a caller can score a row without loading its text. */
152
+ export type StrengthInputs = Pick<MemoryEntry, 'pinned' | 'created' | 'last_retrieved' | 'half_life_days' | 'retrieval_count' | 'emotional_valence' | 'outcome_positive' | 'outcome_negative'>;
151
153
  export interface DecayOptions {
152
154
  decayBasis?: 'clock' | 'session' | 'adaptive';
153
155
  /** Average interval between sleep cycles, in days. Used by 'adaptive' and 'session' modes. */
@@ -166,7 +168,10 @@ export interface DecayOptions {
166
168
  *
167
169
  * Pinned memories skip time decay; being marked wrong still fades them (netWrong).
168
170
  */
169
- export declare function calculateStrength(entry: MemoryEntry, now?: Date, options?: DecayOptions): number;
171
+ export declare function calculateStrength(entry: StrengthInputs, now?: Date, options?: DecayOptions): number;
172
+ /** calculateStrength's clock-basis formula as SQL over `memories` columns, flags and multipliers baked in; keep in step.
173
+ * An unparseable date scores NULL here and 0 in JS, so sums agree. */
174
+ export declare function strengthSql(now: Date): string;
170
175
  /**
171
176
  * Derive half-life based on signals, as per PLAN.md table.
172
177
  */
package/dist/memory.js CHANGED
@@ -2,6 +2,7 @@
2
2
  * Core data model for Hippo memory entries.
3
3
  * Based on the strength formula from PLAN.md.
4
4
  */
5
+ import { envLossAversionRatio } from './env.js';
5
6
  import { BadRequestError } from './api-errors.js';
6
7
  import { randomUUID } from 'crypto';
7
8
  import { isDecayAblated, isOutcomeSlowAblated, isRecallBoostAblated, evalNow, } from './ablation.js';
@@ -80,7 +81,7 @@ let _lossAversionRatioCache;
80
81
  function getLossAversionRatio() {
81
82
  if (_lossAversionRatioCache !== undefined)
82
83
  return _lossAversionRatioCache;
83
- const raw = process.env.HIPPO_LOSS_AVERSION_RATIO;
84
+ const raw = envLossAversionRatio();
84
85
  if (raw === undefined || raw === '') {
85
86
  _lossAversionRatioCache = 1.0;
86
87
  return 1.0;
@@ -231,6 +232,31 @@ now = evalNow(), options = {}) {
231
232
  const clamped = Math.min(1.0, Math.max(0.0, raw));
232
233
  return Number.isFinite(clamped) ? clamped * wrongPenalty : 0.0;
233
234
  }
235
+ /** calculateStrength's clock-basis formula as SQL over `memories` columns, flags and multipliers baked in; keep in step.
236
+ * An unparseable date scores NULL here and 0 in JS, so sums agree. */
237
+ export function strengthSql(now) {
238
+ const num = (n) => (Number.isInteger(n) ? n.toFixed(1) : String(n));
239
+ const pos = 'COALESCE(outcome_positive, 0)';
240
+ const neg = 'COALESCE(outcome_negative, 0)';
241
+ const wrong = isOutcomeSlowAblated() || isDecayAblated() ? '0' : `MAX(0, ${neg} - ${pos})`;
242
+ const reward = isOutcomeSlowAblated()
243
+ ? '1.0'
244
+ : `(CASE WHEN ${pos} = 0 AND ${neg} = 0 THEN 1.0 ELSE 1.0 + 0.5 * (${pos} - ${neg}) / (${pos} + ${neg} + 1.0) END)`;
245
+ const halfLife = `(COALESCE(half_life_days, 7) * ${reward})`;
246
+ const anchor = isRecallBoostAblated() ? 'created' : 'last_retrieved';
247
+ const nowJulian = num(now.getTime() / 86400000 + 2440587.5);
248
+ const decay = isDecayAblated() ? '1.0' : `pow(0.5, (${nowJulian} - julianday(${anchor})) / ${halfLife})`;
249
+ const boost = isRecallBoostAblated()
250
+ ? '1.0'
251
+ : `(CASE WHEN ${wrong} > 0 THEN 1.0 ELSE 1.0 + 0.1 * log2(COALESCE(retrieval_count, 0) + 1) END)`;
252
+ const valences = /* SAFETY: a Record keyed by EmotionalValence */ Object.keys(EMOTIONAL_MULTIPLIERS);
253
+ const emotion = `(CASE COALESCE(emotional_valence, 'neutral') ${valences
254
+ .map((v) => `WHEN '${v}' THEN ${num(applyLossAversionRatio(v, EMOTIONAL_MULTIPLIERS[v]))}`)
255
+ .join(' ')} ELSE 1.0 END)`;
256
+ const penalty = `pow(0.5, MIN(${wrong}, ${MAX_WRONG_HALVINGS}))`;
257
+ return `(CASE WHEN pinned THEN ${penalty} WHEN ${halfLife} <= 0 THEN 0.0
258
+ ELSE MIN(1.0, MAX(0.0, ${decay} * ${boost} * ${emotion})) * ${penalty} END)`;
259
+ }
234
260
  /**
235
261
  * Derive half-life based on signals, as per PLAN.md table.
236
262
  */
@@ -1,5 +1,5 @@
1
1
  import type { MemoryEntry } from './memory.js';
2
- import { type ResultCost, type SearchResult } from './search.js';
2
+ import type { ResultCost, SearchResult } from './search/types.js';
3
3
  export declare function multihopSearch(query: string, entries: MemoryEntry[], options?: {
4
4
  budget?: number;
5
5
  now?: Date;
package/dist/multihop.js CHANGED
@@ -1,4 +1,5 @@
1
- import { fitBudget, search } from './search.js';
1
+ import { fitBudget } from './search/finalize.js';
2
+ import { search } from './search/bm25-search.js';
2
3
  export function multihopSearch(query, entries, options = {}) {
3
4
  const budget = options.budget ?? 4000;
4
5
  // Pass 1 searches wide to find entities, so each return fits the caller's budget, as search() does.
@@ -10,6 +10,7 @@
10
10
  * to reject + exit. Strict mode will become the default once A5 v2 lands
11
11
  * (see `TODOS.md` A3 follow-ups for the migration path).
12
12
  */
13
+ import { processEnv } from './env.js';
13
14
  export const OWNER_RE = /^(user|agent):[A-Za-z0-9_-]+$/;
14
15
  export const OWNER_CONTRACT_HINT = 'Must match ^(user|agent):[A-Za-z0-9_-]+$ (e.g. user:alice, agent:capture-bot).';
15
16
  /**
@@ -50,7 +51,7 @@ export function validateOwner(owner, opts = {}) {
50
51
  * Returns true when strict-owner enforcement is enabled via env var.
51
52
  * Centralised here so any future bump to default-strict is one edit.
52
53
  */
53
- export function isStrictOwnerEnv(env = process.env) {
54
+ export function isStrictOwnerEnv(env = processEnv()) {
54
55
  return env.HIPPO_STRICT_OWNER === '1';
55
56
  }
56
57
  //# sourceMappingURL=owner-validation.js.map
@@ -46,19 +46,22 @@ export function createPhysicsTable(db) {
46
46
  ON memory_physics(mass DESC);
47
47
  `);
48
48
  }
49
+ const PHYSICS_ID_CHUNK = 500;
49
50
  /**
50
51
  * Load physics state for specific memory IDs (or all if no IDs given).
51
52
  */
52
53
  export function loadPhysicsState(db, memoryIds) {
53
54
  const map = new Map();
54
- let rows;
55
+ let rows = [];
55
56
  if (memoryIds && memoryIds.length > 0) {
56
- const placeholders = memoryIds.map(() => '?').join(',');
57
- // SAFETY: rows come from the SELECT above, which projects exactly the
58
- // PhysicsRow columns (memory_id, position_blob, velocity_blob, mass,
59
- // charge, temperature, last_simulation) in that order.
60
- rows = db.prepare(`SELECT memory_id, position_blob, velocity_blob, mass, charge, temperature, last_simulation
61
- FROM memory_physics WHERE memory_id IN (${placeholders})`).all(...memoryIds);
57
+ // Chunked so a whole-store candidate list stays under SQLite's bound-parameter limit.
58
+ for (let i = 0; i < memoryIds.length; i += PHYSICS_ID_CHUNK) {
59
+ const chunk = memoryIds.slice(i, i + PHYSICS_ID_CHUNK);
60
+ const placeholders = chunk.map(() => '?').join(',');
61
+ // SAFETY: the SELECT projects exactly the PhysicsRow columns, in order.
62
+ rows = rows.concat(db.prepare(`SELECT memory_id, position_blob, velocity_blob, mass, charge, temperature, last_simulation
63
+ FROM memory_physics WHERE memory_id IN (${placeholders})`).all(...chunk));
64
+ }
62
65
  }
63
66
  else {
64
67
  // SAFETY: same PhysicsRow column projection as the branch above, just
@@ -36,6 +36,7 @@
36
36
  * Dual-write atomicity: `savePolicy` writes the memory + policies row (and, on
37
37
  * supersede, the predecessor's UPDATE) inside writeEntry's SAVEPOINT.
38
38
  */
39
+ import { type KeysetPosition } from './keyset.js';
39
40
  export type PolicyStatus = 'active' | 'superseded' | 'closed';
40
41
  export declare const VALID_POLICY_STATES: ReadonlySet<PolicyStatus>;
41
42
  export interface Policy {
@@ -77,6 +78,8 @@ export interface SavePolicyOpts {
77
78
  export interface ListPoliciesOpts {
78
79
  status?: PolicyStatus;
79
80
  limit?: number;
81
+ /** Resume after this row: the position the previous page ended on. */
82
+ after?: KeysetPosition;
80
83
  }
81
84
  /**
82
85
  * Parse + canonicalize a date input to ISO-8601 datetime (`toISOString`). Throws
package/dist/policies.js CHANGED
@@ -38,12 +38,13 @@
38
38
  */
39
39
  import { BadRequestError, ConflictError, NotFoundError } from './api-errors.js';
40
40
  import { openHippoDb, closeHippoDb } from './db.js';
41
- import { writeEntry } from './store.js';
41
+ import { writeEntry } from './store/entry-writes.js';
42
42
  import { assertTenantId } from './tenant.js';
43
- import { markGraphDirty, removeGraphEntitiesForObject } from './graph.js';
43
+ import { markGraphDirty, removeGraphEntitiesForObject } from './graph/write.js';
44
44
  import { createMemory, Layer } from './memory.js';
45
45
  import { appendAuditEvent } from './audit.js';
46
46
  import { objectHalfLifeDays } from './half-life-migration.js';
47
+ import { keysetAfter } from './keyset.js';
47
48
  export const VALID_POLICY_STATES = new Set([
48
49
  'active',
49
50
  'superseded',
@@ -311,6 +312,7 @@ export function loadPolicyById(hippoRoot, tenantId, id) {
311
312
  export function loadPolicies(hippoRoot, tenantId, opts = {}) {
312
313
  assertTenantId('loadPolicies', tenantId);
313
314
  const limit = opts.limit ?? 100;
315
+ const after = keysetAfter('created_at', 'id', opts.after);
314
316
  const db = openHippoDb(hippoRoot);
315
317
  try {
316
318
  let rows;
@@ -322,20 +324,20 @@ export function loadPolicies(hippoRoot, tenantId, opts = {}) {
322
324
  // .all() returns rows in that shape regardless of the status filter applied.
323
325
  rows = db.prepare(`
324
326
  SELECT ${POLICY_COLS} FROM policies
325
- WHERE tenant_id = ? AND status = ?
327
+ WHERE tenant_id = ? AND status = ?${after.sql}
326
328
  ORDER BY created_at DESC, id DESC
327
329
  LIMIT ?
328
- `).all(tenantId, opts.status, limit);
330
+ `).all(tenantId, opts.status, ...after.params, limit);
329
331
  }
330
332
  else {
331
333
  // SAFETY: SELECT ${POLICY_COLS} projects exactly the PolicyRow columns;
332
334
  // .all() returns rows in that shape for every tenant-scoped row.
333
335
  rows = db.prepare(`
334
336
  SELECT ${POLICY_COLS} FROM policies
335
- WHERE tenant_id = ?
337
+ WHERE tenant_id = ?${after.sql}
336
338
  ORDER BY created_at DESC, id DESC
337
339
  LIMIT ?
338
- `).all(tenantId, limit);
340
+ `).all(tenantId, ...after.params, limit);
339
341
  }
340
342
  return rows.map(rowToPolicy);
341
343
  }
@@ -1,9 +1,10 @@
1
+ import { envSkipPostinstall } from './env.js';
1
2
  import * as fs from 'node:fs';
2
3
  import * as os from 'node:os';
3
4
  import * as path from 'node:path';
4
- import { detectRealCodexPath, isCodexWrapperInstalled, repairCodexWrapperIfInstalled, } from './hooks.js';
5
+ import { detectRealCodexPath, isCodexWrapperInstalled, repairCodexWrapperIfInstalled } from './hooks/codex-wrapper.js';
5
6
  function main() {
6
- if (process.env.HIPPO_SKIP_POSTINSTALL === '1')
7
+ if (envSkipPostinstall())
7
8
  return;
8
9
  try {
9
10
  // Repair-only: re-ensure the wrapper for users who previously opted in