hippo-memory 1.60.0 → 1.62.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 (593) hide show
  1. package/README.md +29 -54
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.d.ts +1 -1
  4. package/dist/agent-memories/apply.js +4 -1
  5. package/dist/agent-memories/claude-code.d.ts +3 -1
  6. package/dist/agent-memories/claude-code.js +54 -10
  7. package/dist/agent-memories/codex.js +1 -1
  8. package/dist/agent-memories/gemini.js +1 -1
  9. package/dist/agent-memories/legacy.js +1 -1
  10. package/dist/agent-memories/source.js +1 -1
  11. package/dist/agent-memories/sync.d.ts +3 -3
  12. package/dist/agent-memories/sync.js +22 -9
  13. package/dist/agent-memories/types.d.ts +0 -2
  14. package/dist/ambient-store.d.ts +14 -0
  15. package/dist/ambient-store.js +90 -0
  16. package/dist/ambient.d.ts +23 -0
  17. package/dist/ambient.js +72 -50
  18. package/dist/api/assemble.d.ts +93 -0
  19. package/dist/api/assemble.js +153 -0
  20. package/dist/api/audit.d.ts +17 -0
  21. package/dist/api/audit.js +23 -0
  22. package/dist/api/auth.d.ts +79 -0
  23. package/dist/api/auth.js +178 -0
  24. package/dist/api/context-select.d.ts +49 -0
  25. package/dist/api/context-select.js +344 -0
  26. package/dist/api/context-types.d.ts +105 -0
  27. package/dist/api/context-types.js +3 -0
  28. package/dist/api/context.d.ts +31 -0
  29. package/dist/api/context.js +378 -0
  30. package/dist/api/dormant.d.ts +30 -0
  31. package/dist/api/dormant.js +140 -0
  32. package/dist/api/drill-down.d.ts +84 -0
  33. package/dist/api/drill-down.js +126 -0
  34. package/dist/api/forget.d.ts +57 -0
  35. package/dist/api/forget.js +87 -0
  36. package/dist/api/goals.d.ts +18 -0
  37. package/dist/api/goals.js +33 -0
  38. package/dist/api/learn.d.ts +31 -0
  39. package/dist/api/learn.js +88 -0
  40. package/dist/api/outcome.d.ts +61 -0
  41. package/dist/api/outcome.js +66 -0
  42. package/dist/api/promote.d.ts +54 -0
  43. package/dist/api/promote.js +192 -0
  44. package/dist/api/quarantine.d.ts +24 -0
  45. package/dist/api/quarantine.js +121 -0
  46. package/dist/api/recall-types.d.ts +390 -0
  47. package/dist/api/recall-types.js +3 -0
  48. package/dist/api/recall.d.ts +36 -0
  49. package/dist/api/recall.js +499 -0
  50. package/dist/api/remember.d.ts +35 -0
  51. package/dist/api/remember.js +43 -0
  52. package/dist/api/sleep.d.ts +136 -0
  53. package/dist/api/sleep.js +256 -0
  54. package/dist/api/tokens.d.ts +26 -0
  55. package/dist/api/tokens.js +60 -0
  56. package/dist/api/types.d.ts +56 -0
  57. package/dist/api/types.js +38 -0
  58. package/dist/api.d.ts +20 -1262
  59. package/dist/api.js +25 -2727
  60. package/dist/audit.d.ts +3 -0
  61. package/dist/audit.js +6 -3
  62. package/dist/auth.d.ts +45 -4
  63. package/dist/auth.js +125 -48
  64. package/dist/autolearn.js +2 -2
  65. package/dist/capture/command.d.ts +33 -0
  66. package/dist/capture/command.js +264 -0
  67. package/dist/capture/compact.d.ts +44 -0
  68. package/dist/capture/compact.js +354 -0
  69. package/dist/capture/extract.d.ts +21 -0
  70. package/dist/capture/extract.js +464 -0
  71. package/dist/capture/transcript.d.ts +40 -0
  72. package/dist/capture/transcript.js +193 -0
  73. package/dist/capture-error.js +2 -1
  74. package/dist/churn-git.js +4 -2
  75. package/dist/cli/audit.d.ts +3 -0
  76. package/dist/cli/audit.js +159 -0
  77. package/dist/cli/auth.d.ts +2 -0
  78. package/dist/cli/auth.js +171 -0
  79. package/dist/cli/briefs.d.ts +4 -0
  80. package/dist/cli/briefs.js +453 -0
  81. package/dist/cli/card.d.ts +3 -0
  82. package/dist/cli/card.js +333 -0
  83. package/dist/cli/context.d.ts +15 -0
  84. package/dist/cli/context.js +376 -0
  85. package/dist/cli/continuity.d.ts +6 -0
  86. package/dist/cli/continuity.js +457 -0
  87. package/dist/cli/curate.d.ts +19 -0
  88. package/dist/cli/curate.js +556 -0
  89. package/dist/cli/dag.d.ts +5 -0
  90. package/dist/cli/dag.js +177 -0
  91. package/dist/cli/decisions.d.ts +4 -0
  92. package/dist/cli/decisions.js +528 -0
  93. package/dist/cli/eval.d.ts +5 -0
  94. package/dist/cli/eval.js +213 -0
  95. package/dist/cli/explain.d.ts +4 -0
  96. package/dist/cli/explain.js +156 -0
  97. package/dist/cli/goals.d.ts +2 -0
  98. package/dist/cli/goals.js +196 -0
  99. package/dist/cli/hook-blocks.d.ts +18 -0
  100. package/dist/cli/hook-blocks.js +233 -0
  101. package/dist/cli/init.d.ts +2 -0
  102. package/dist/cli/init.js +305 -0
  103. package/dist/cli/maintenance.d.ts +4 -0
  104. package/dist/cli/maintenance.js +190 -0
  105. package/dist/cli/playbooks.d.ts +4 -0
  106. package/dist/cli/playbooks.js +573 -0
  107. package/dist/cli/projects.js +9 -6
  108. package/dist/cli/recall.d.ts +7 -0
  109. package/dist/cli/recall.js +582 -0
  110. package/dist/cli/remember.d.ts +5 -0
  111. package/dist/cli/remember.js +485 -0
  112. package/dist/cli/serve.d.ts +5 -0
  113. package/dist/cli/serve.js +40 -0
  114. package/dist/cli/session-hooks.d.ts +29 -0
  115. package/dist/cli/session-hooks.js +647 -0
  116. package/dist/cli/setup.d.ts +4 -0
  117. package/dist/cli/setup.js +397 -0
  118. package/dist/cli/shared.d.ts +15 -19
  119. package/dist/cli/shared.js +50 -341
  120. package/dist/cli/slack.d.ts +2 -0
  121. package/dist/cli/slack.js +171 -0
  122. package/dist/cli/status.d.ts +18 -0
  123. package/dist/cli/status.js +409 -0
  124. package/dist/cli/transfer.d.ts +10 -0
  125. package/dist/cli/transfer.js +424 -0
  126. package/dist/cli/usage.d.ts +85 -0
  127. package/dist/cli/usage.js +741 -0
  128. package/dist/cli.d.ts +71 -120
  129. package/dist/cli.js +170 -8469
  130. package/dist/client.js +15 -8
  131. package/dist/compaction-record.d.ts +0 -2
  132. package/dist/compaction-record.js +7 -5
  133. package/dist/connectors/github/backfill.js +94 -87
  134. package/dist/connectors/github/cli-impl.js +4 -3
  135. package/dist/connectors/github/dlq.js +67 -54
  136. package/dist/connectors/github/ingest.js +34 -35
  137. package/dist/connectors/github/tenant-routing.js +3 -2
  138. package/dist/connectors/github/webhook.js +135 -216
  139. package/dist/connectors/slack/dlq.js +49 -61
  140. package/dist/connectors/slack/ingest.js +55 -48
  141. package/dist/connectors/slack/tenant-routing.js +4 -3
  142. package/dist/connectors/slack/webhook.js +72 -74
  143. package/dist/consolidate/conflicts.d.ts +10 -0
  144. package/dist/consolidate/conflicts.js +178 -0
  145. package/dist/consolidate/decay.d.ts +12 -0
  146. package/dist/consolidate/decay.js +145 -0
  147. package/dist/consolidate/llm-passes.d.ts +3 -0
  148. package/dist/consolidate/llm-passes.js +141 -0
  149. package/dist/consolidate/merge.d.ts +7 -0
  150. package/dist/consolidate/merge.js +251 -0
  151. package/dist/consolidate/physics-pass.d.ts +3 -0
  152. package/dist/consolidate/physics-pass.js +60 -0
  153. package/dist/consolidate/run.d.ts +69 -0
  154. package/dist/consolidate/run.js +76 -0
  155. package/dist/consolidate/sleep.d.ts +18 -0
  156. package/dist/consolidate/sleep.js +209 -0
  157. package/dist/consolidate/traces.d.ts +4 -0
  158. package/dist/consolidate/traces.js +178 -0
  159. package/dist/context-auto.js +7 -11
  160. package/dist/context-render.d.ts +1 -1
  161. package/dist/context-render.js +1 -1
  162. package/dist/customer-notes.d.ts +3 -0
  163. package/dist/customer-notes.js +83 -72
  164. package/dist/dag.js +225 -188
  165. package/dist/dashboard-actions.d.ts +20 -0
  166. package/dist/dashboard-actions.js +88 -0
  167. package/dist/dashboard-params.d.ts +45 -0
  168. package/dist/dashboard-params.js +127 -0
  169. package/dist/dashboard-queries.d.ts +15 -0
  170. package/dist/dashboard-queries.js +355 -0
  171. package/dist/dashboard-snapshot.d.ts +138 -0
  172. package/dist/dashboard-snapshot.js +308 -0
  173. package/dist/dashboard-types.d.ts +163 -0
  174. package/dist/dashboard-types.js +3 -0
  175. package/dist/dashboard.d.ts +6 -7
  176. package/dist/dashboard.js +228 -202
  177. package/dist/db/busy.d.ts +5 -0
  178. package/dist/db/busy.js +24 -0
  179. package/dist/db/continuity.d.ts +5 -0
  180. package/dist/db/continuity.js +145 -0
  181. package/dist/db/meta.d.ts +8 -0
  182. package/dist/db/meta.js +35 -0
  183. package/dist/db/migrate.d.ts +9 -0
  184. package/dist/db/migrate.js +138 -0
  185. package/dist/db/migrations/index.d.ts +5 -0
  186. package/dist/db/migrations/index.js +109 -0
  187. package/dist/db/migrations/types.d.ts +14 -0
  188. package/dist/db/migrations/types.js +2 -0
  189. package/dist/db/migrations/v01.d.ts +3 -0
  190. package/dist/db/migrations/v01.js +38 -0
  191. package/dist/db/migrations/v02.d.ts +3 -0
  192. package/dist/db/migrations/v02.js +21 -0
  193. package/dist/db/migrations/v03.d.ts +3 -0
  194. package/dist/db/migrations/v03.js +22 -0
  195. package/dist/db/migrations/v04.d.ts +3 -0
  196. package/dist/db/migrations/v04.js +28 -0
  197. package/dist/db/migrations/v05.d.ts +3 -0
  198. package/dist/db/migrations/v05.js +21 -0
  199. package/dist/db/migrations/v06.d.ts +3 -0
  200. package/dist/db/migrations/v06.js +25 -0
  201. package/dist/db/migrations/v07.d.ts +3 -0
  202. package/dist/db/migrations/v07.js +13 -0
  203. package/dist/db/migrations/v08.d.ts +3 -0
  204. package/dist/db/migrations/v08.js +8 -0
  205. package/dist/db/migrations/v09.d.ts +3 -0
  206. package/dist/db/migrations/v09.js +13 -0
  207. package/dist/db/migrations/v10.d.ts +3 -0
  208. package/dist/db/migrations/v10.js +17 -0
  209. package/dist/db/migrations/v11.d.ts +3 -0
  210. package/dist/db/migrations/v11.js +15 -0
  211. package/dist/db/migrations/v12.d.ts +3 -0
  212. package/dist/db/migrations/v12.js +11 -0
  213. package/dist/db/migrations/v13.d.ts +3 -0
  214. package/dist/db/migrations/v13.js +15 -0
  215. package/dist/db/migrations/v14.d.ts +3 -0
  216. package/dist/db/migrations/v14.js +66 -0
  217. package/dist/db/migrations/v15.d.ts +3 -0
  218. package/dist/db/migrations/v15.js +42 -0
  219. package/dist/db/migrations/v16.d.ts +3 -0
  220. package/dist/db/migrations/v16.js +61 -0
  221. package/dist/db/migrations/v17.d.ts +3 -0
  222. package/dist/db/migrations/v17.js +46 -0
  223. package/dist/db/migrations/v18.d.ts +3 -0
  224. package/dist/db/migrations/v18.js +60 -0
  225. package/dist/db/migrations/v19.d.ts +3 -0
  226. package/dist/db/migrations/v19.js +28 -0
  227. package/dist/db/migrations/v20.d.ts +3 -0
  228. package/dist/db/migrations/v20.js +42 -0
  229. package/dist/db/migrations/v21.d.ts +3 -0
  230. package/dist/db/migrations/v21.js +16 -0
  231. package/dist/db/migrations/v22.d.ts +3 -0
  232. package/dist/db/migrations/v22.js +82 -0
  233. package/dist/db/migrations/v23.d.ts +3 -0
  234. package/dist/db/migrations/v23.js +48 -0
  235. package/dist/db/migrations/v24.d.ts +3 -0
  236. package/dist/db/migrations/v24.js +72 -0
  237. package/dist/db/migrations/v25.d.ts +3 -0
  238. package/dist/db/migrations/v25.js +46 -0
  239. package/dist/db/migrations/v26.d.ts +3 -0
  240. package/dist/db/migrations/v26.js +23 -0
  241. package/dist/db/migrations/v27.d.ts +3 -0
  242. package/dist/db/migrations/v27.js +57 -0
  243. package/dist/db/migrations/v28.d.ts +3 -0
  244. package/dist/db/migrations/v28.js +38 -0
  245. package/dist/db/migrations/v29.d.ts +3 -0
  246. package/dist/db/migrations/v29.js +78 -0
  247. package/dist/db/migrations/v30.d.ts +3 -0
  248. package/dist/db/migrations/v30.js +92 -0
  249. package/dist/db/migrations/v31.d.ts +3 -0
  250. package/dist/db/migrations/v31.js +74 -0
  251. package/dist/db/migrations/v32.d.ts +3 -0
  252. package/dist/db/migrations/v32.js +102 -0
  253. package/dist/db/migrations/v33.d.ts +3 -0
  254. package/dist/db/migrations/v33.js +104 -0
  255. package/dist/db/migrations/v34.d.ts +3 -0
  256. package/dist/db/migrations/v34.js +93 -0
  257. package/dist/db/migrations/v35.d.ts +3 -0
  258. package/dist/db/migrations/v35.js +98 -0
  259. package/dist/db/migrations/v36.d.ts +3 -0
  260. package/dist/db/migrations/v36.js +98 -0
  261. package/dist/db/migrations/v37.d.ts +3 -0
  262. package/dist/db/migrations/v37.js +219 -0
  263. package/dist/db/migrations/v38.d.ts +3 -0
  264. package/dist/db/migrations/v38.js +277 -0
  265. package/dist/db/migrations/v39.d.ts +3 -0
  266. package/dist/db/migrations/v39.js +59 -0
  267. package/dist/db/migrations/v40.d.ts +3 -0
  268. package/dist/db/migrations/v40.js +74 -0
  269. package/dist/db/migrations/v41.d.ts +3 -0
  270. package/dist/db/migrations/v41.js +43 -0
  271. package/dist/db/migrations/v42.d.ts +3 -0
  272. package/dist/db/migrations/v42.js +41 -0
  273. package/dist/db/migrations/v43.d.ts +3 -0
  274. package/dist/db/migrations/v43.js +67 -0
  275. package/dist/db/migrations/v44.d.ts +3 -0
  276. package/dist/db/migrations/v44.js +28 -0
  277. package/dist/db/migrations/v45.d.ts +3 -0
  278. package/dist/db/migrations/v45.js +30 -0
  279. package/dist/db/migrations/v46.d.ts +3 -0
  280. package/dist/db/migrations/v46.js +25 -0
  281. package/dist/db/migrations/v47.d.ts +3 -0
  282. package/dist/db/migrations/v47.js +17 -0
  283. package/dist/db/migrations/v48.d.ts +3 -0
  284. package/dist/db/migrations/v48.js +10 -0
  285. package/dist/db/migrations/v49.d.ts +3 -0
  286. package/dist/db/migrations/v49.js +31 -0
  287. package/dist/db/migrations/v50.d.ts +3 -0
  288. package/dist/db/migrations/v50.js +67 -0
  289. package/dist/db/migrations/v51.d.ts +3 -0
  290. package/dist/db/migrations/v51.js +14 -0
  291. package/dist/db/migrations/v52.d.ts +3 -0
  292. package/dist/db/migrations/v52.js +7 -0
  293. package/dist/db/open.d.ts +23 -0
  294. package/dist/db/open.js +146 -0
  295. package/dist/db/sqlite.d.ts +21 -0
  296. package/dist/db/sqlite.js +8 -0
  297. package/dist/db/tables.d.ts +7 -0
  298. package/dist/db/tables.js +38 -0
  299. package/dist/db.d.ts +6 -46
  300. package/dist/db.js +5 -3049
  301. package/dist/decisions.d.ts +4 -1
  302. package/dist/decisions.js +102 -83
  303. package/dist/dedupe.js +3 -2
  304. package/dist/delivery-recorder.js +4 -1
  305. package/dist/doctor.js +14 -10
  306. package/dist/embedding-provider.d.ts +1 -1
  307. package/dist/embedding-provider.js +4 -3
  308. package/dist/embeddings.d.ts +9 -52
  309. package/dist/embeddings.js +43 -297
  310. package/dist/env.d.ts +75 -0
  311. package/dist/env.js +119 -0
  312. package/dist/eval-suite.js +1 -1
  313. package/dist/eval.js +2 -2
  314. package/dist/extract.js +1 -1
  315. package/dist/gated-write.js +3 -1
  316. package/dist/goals.d.ts +3 -1
  317. package/dist/goals.js +117 -86
  318. package/dist/graph/read.d.ts +73 -0
  319. package/dist/graph/read.js +325 -0
  320. package/dist/graph/rows.d.ts +45 -0
  321. package/dist/graph/rows.js +51 -0
  322. package/dist/graph/types.d.ts +83 -0
  323. package/dist/graph/types.js +11 -0
  324. package/dist/graph/write.d.ts +93 -0
  325. package/dist/{graph.js → graph/write.js} +6 -384
  326. package/dist/graph-extract.js +2 -1
  327. package/dist/graph-recall.d.ts +1 -1
  328. package/dist/graph-recall.js +2 -2
  329. package/dist/graph-stream.js +1 -1
  330. package/dist/graph-view.d.ts +1 -1
  331. package/dist/graph-view.js +1 -1
  332. package/dist/half-life-migration.d.ts +1 -1
  333. package/dist/half-life-migration.js +2 -1
  334. package/dist/hooks/codex-session.d.ts +8 -0
  335. package/dist/hooks/codex-session.js +76 -0
  336. package/dist/hooks/codex-wrapper.d.ts +55 -0
  337. package/dist/hooks/codex-wrapper.js +288 -0
  338. package/dist/hooks/json-hooks.d.ts +63 -0
  339. package/dist/hooks/json-hooks.js +356 -0
  340. package/dist/hooks/opencode.d.ts +50 -0
  341. package/dist/hooks/opencode.js +202 -0
  342. package/dist/hooks/shared.d.ts +54 -0
  343. package/dist/hooks/shared.js +77 -0
  344. package/dist/http-retry.d.ts +2 -0
  345. package/dist/http-retry.js +4 -3
  346. package/dist/http-util.d.ts +3 -0
  347. package/dist/http-util.js +10 -0
  348. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  349. package/dist/importers/core.js +141 -0
  350. package/dist/importers/markdown-parse.d.ts +41 -0
  351. package/dist/importers/markdown-parse.js +132 -0
  352. package/dist/importers/markdown.d.ts +3 -0
  353. package/dist/importers/markdown.js +92 -0
  354. package/dist/importers/sources.d.ts +7 -0
  355. package/dist/importers/sources.js +229 -0
  356. package/dist/importers/vault.d.ts +11 -0
  357. package/dist/importers/vault.js +352 -0
  358. package/dist/incidents.d.ts +3 -0
  359. package/dist/incidents.js +52 -43
  360. package/dist/index.d.ts +25 -6
  361. package/dist/index.js +23 -6
  362. package/dist/invalidation.js +2 -1
  363. package/dist/judgment.js +2 -1
  364. package/dist/keyset.d.ts +13 -0
  365. package/dist/keyset.js +8 -0
  366. package/dist/local-embedding.d.ts +13 -0
  367. package/dist/local-embedding.js +165 -0
  368. package/dist/log.d.ts +7 -0
  369. package/dist/log.js +19 -1
  370. package/dist/mcp/admin-tools.d.ts +8 -0
  371. package/dist/mcp/admin-tools.js +116 -0
  372. package/dist/mcp/format.d.ts +27 -0
  373. package/dist/mcp/format.js +135 -0
  374. package/dist/mcp/memory-tools.d.ts +5 -0
  375. package/dist/mcp/memory-tools.js +83 -0
  376. package/dist/mcp/protocol.d.ts +83 -0
  377. package/dist/mcp/protocol.js +55 -0
  378. package/dist/mcp/recall-tools.d.ts +6 -0
  379. package/dist/mcp/recall-tools.js +320 -0
  380. package/dist/mcp/request.d.ts +10 -0
  381. package/dist/mcp/request.js +163 -0
  382. package/dist/mcp/server.d.ts +4 -75
  383. package/dist/mcp/server.js +7 -1190
  384. package/dist/mcp/session-state.d.ts +11 -0
  385. package/dist/mcp/session-state.js +28 -0
  386. package/dist/mcp/stdio.d.ts +8 -0
  387. package/dist/mcp/stdio.js +79 -0
  388. package/dist/mcp/tools.d.ts +11 -0
  389. package/dist/mcp/tools.js +247 -0
  390. package/dist/memory.d.ts +3 -0
  391. package/dist/memory.js +27 -1
  392. package/dist/multihop.d.ts +1 -1
  393. package/dist/multihop.js +2 -1
  394. package/dist/owner-validation.js +2 -1
  395. package/dist/physics-state.js +10 -7
  396. package/dist/policies.d.ts +3 -0
  397. package/dist/policies.js +93 -74
  398. package/dist/postinstall.js +3 -2
  399. package/dist/predictions/planning-fallacy.d.ts +100 -0
  400. package/dist/predictions/planning-fallacy.js +190 -0
  401. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  402. package/dist/predictions/store.js +434 -0
  403. package/dist/processes.d.ts +3 -0
  404. package/dist/processes.js +94 -76
  405. package/dist/project-briefs.d.ts +3 -0
  406. package/dist/project-briefs.js +142 -113
  407. package/dist/project-identity.js +3 -2
  408. package/dist/project-merge.d.ts +12 -4
  409. package/dist/project-merge.js +132 -45
  410. package/dist/quarantine.d.ts +2 -1
  411. package/dist/quarantine.js +8 -5
  412. package/dist/raw-archive.js +1 -1
  413. package/dist/recall-history.js +3 -2
  414. package/dist/recall-pipeline.d.ts +2 -2
  415. package/dist/recall-pipeline.js +16 -8
  416. package/dist/recall-scope.js +1 -1
  417. package/dist/recall-trace.d.ts +1 -1
  418. package/dist/refine-llm.js +2 -1
  419. package/dist/reject-flow.js +6 -1
  420. package/dist/rerankers/clef.js +6 -5
  421. package/dist/rerankers/jev.d.ts +1 -1
  422. package/dist/rerankers/jev.js +4 -4
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +58 -38
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/scheduler.d.ts +1 -0
  428. package/dist/scheduler.js +26 -4
  429. package/dist/scope.js +4 -3
  430. package/dist/search/as-of.d.ts +10 -0
  431. package/dist/search/as-of.js +22 -0
  432. package/dist/search/bm25-search.d.ts +14 -0
  433. package/dist/search/bm25-search.js +43 -0
  434. package/dist/search/bm25.d.ts +15 -0
  435. package/dist/search/bm25.js +54 -0
  436. package/dist/search/boosts.d.ts +54 -0
  437. package/dist/search/boosts.js +94 -0
  438. package/dist/search/breakdown.d.ts +7 -0
  439. package/dist/search/breakdown.js +20 -0
  440. package/dist/search/explain.d.ts +25 -0
  441. package/dist/search/explain.js +31 -0
  442. package/dist/search/finalize.d.ts +8 -0
  443. package/dist/search/finalize.js +52 -0
  444. package/dist/search/fusion.d.ts +27 -0
  445. package/dist/search/fusion.js +42 -0
  446. package/dist/search/hybrid-score.d.ts +20 -0
  447. package/dist/search/hybrid-score.js +73 -0
  448. package/dist/search/hybrid.d.ts +46 -0
  449. package/dist/search/hybrid.js +64 -0
  450. package/dist/search/physics-search.d.ts +29 -0
  451. package/dist/search/physics-search.js +162 -0
  452. package/dist/search/rerank.d.ts +10 -0
  453. package/dist/search/rerank.js +72 -0
  454. package/dist/search/temporal.d.ts +15 -0
  455. package/dist/search/temporal.js +45 -0
  456. package/dist/search/types.d.ts +91 -0
  457. package/dist/search/types.js +2 -0
  458. package/dist/search/vector.d.ts +30 -0
  459. package/dist/search/vector.js +71 -0
  460. package/dist/secret-detect.d.ts +2 -0
  461. package/dist/secret-detect.js +2 -1
  462. package/dist/server/auth.d.ts +52 -0
  463. package/dist/server/auth.js +221 -0
  464. package/dist/server/client-ip.d.ts +25 -0
  465. package/dist/server/client-ip.js +92 -0
  466. package/dist/server/cursor.d.ts +23 -0
  467. package/dist/server/cursor.js +58 -0
  468. package/dist/server/lifecycle.d.ts +7 -0
  469. package/dist/server/lifecycle.js +29 -0
  470. package/dist/server/mcp-http.d.ts +5 -0
  471. package/dist/server/mcp-http.js +199 -0
  472. package/dist/server/request.d.ts +33 -0
  473. package/dist/server/request.js +103 -0
  474. package/dist/server/routes/admin.d.ts +9 -0
  475. package/dist/server/routes/admin.js +158 -0
  476. package/dist/server/routes/customer-notes.d.ts +7 -0
  477. package/dist/server/routes/customer-notes.js +112 -0
  478. package/dist/server/routes/decisions.d.ts +7 -0
  479. package/dist/server/routes/decisions.js +133 -0
  480. package/dist/server/routes/incidents.d.ts +7 -0
  481. package/dist/server/routes/incidents.js +126 -0
  482. package/dist/server/routes/memories.d.ts +10 -0
  483. package/dist/server/routes/memories.js +179 -0
  484. package/dist/server/routes/policies.d.ts +8 -0
  485. package/dist/server/routes/policies.js +151 -0
  486. package/dist/server/routes/predictions.d.ts +7 -0
  487. package/dist/server/routes/predictions.js +164 -0
  488. package/dist/server/routes/processes.d.ts +7 -0
  489. package/dist/server/routes/processes.js +161 -0
  490. package/dist/server/routes/project-briefs.d.ts +8 -0
  491. package/dist/server/routes/project-briefs.js +136 -0
  492. package/dist/server/routes/recall.d.ts +8 -0
  493. package/dist/server/routes/recall.js +340 -0
  494. package/dist/server/routes/skills.d.ts +8 -0
  495. package/dist/server/routes/skills.js +150 -0
  496. package/dist/server/types.d.ts +56 -0
  497. package/dist/server/types.js +2 -0
  498. package/dist/server/validation.d.ts +14 -0
  499. package/dist/server/validation.js +91 -0
  500. package/dist/server.d.ts +7 -61
  501. package/dist/server.js +69 -2362
  502. package/dist/session-digest.d.ts +1 -1
  503. package/dist/session-digest.js +9 -2
  504. package/dist/shared.d.ts +12 -1
  505. package/dist/shared.js +33 -27
  506. package/dist/skills.d.ts +3 -0
  507. package/dist/skills.js +88 -70
  508. package/dist/stdin.js +2 -2
  509. package/dist/store/audit-event.d.ts +19 -0
  510. package/dist/store/audit-event.js +33 -0
  511. package/dist/store/candidates.d.ts +42 -0
  512. package/dist/store/candidates.js +152 -0
  513. package/dist/store/conflicts.d.ts +44 -0
  514. package/dist/store/conflicts.js +444 -0
  515. package/dist/store/delete-and-batch.d.ts +63 -0
  516. package/dist/store/delete-and-batch.js +310 -0
  517. package/dist/store/entry-reads.d.ts +92 -0
  518. package/dist/store/entry-reads.js +255 -0
  519. package/dist/store/entry-row.d.ts +67 -0
  520. package/dist/store/entry-row.js +208 -0
  521. package/dist/store/entry-writes.d.ts +46 -0
  522. package/dist/store/entry-writes.js +148 -0
  523. package/dist/store/handoffs.d.ts +26 -0
  524. package/dist/store/handoffs.js +184 -0
  525. package/dist/store/index-and-stats.d.ts +52 -0
  526. package/dist/store/index-and-stats.js +214 -0
  527. package/dist/store/markdown.d.ts +10 -0
  528. package/dist/store/markdown.js +108 -0
  529. package/dist/store/mirrors.d.ts +49 -0
  530. package/dist/store/mirrors.js +312 -0
  531. package/dist/store/open.d.ts +15 -0
  532. package/dist/store/open.js +223 -0
  533. package/dist/store/rows.d.ts +178 -0
  534. package/dist/store/rows.js +158 -0
  535. package/dist/store/search-rows.d.ts +86 -0
  536. package/dist/store/search-rows.js +260 -0
  537. package/dist/store/sessions.d.ts +83 -0
  538. package/dist/store/sessions.js +272 -0
  539. package/dist/store/summaries.d.ts +94 -0
  540. package/dist/store/summaries.js +377 -0
  541. package/dist/store/tenant-lookup.d.ts +12 -0
  542. package/dist/store/tenant-lookup.js +16 -0
  543. package/dist/store-cards.js +2 -1
  544. package/dist/summary-dirty.d.ts +4 -0
  545. package/dist/summary-dirty.js +32 -0
  546. package/dist/support-bundle.js +4 -3
  547. package/dist/tenant.js +2 -2
  548. package/dist/tokenize.d.ts +2 -0
  549. package/dist/tokenize.js +16 -0
  550. package/dist/transcript-tail.d.ts +7 -0
  551. package/dist/transcript-tail.js +48 -0
  552. package/dist/vector-store.d.ts +27 -0
  553. package/dist/vector-store.js +210 -0
  554. package/dist/version.d.ts +2 -2
  555. package/dist/version.js +2 -2
  556. package/dist/working-memory.js +1 -1
  557. package/dist/yaml.js +36 -11
  558. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  559. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  560. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  561. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  566. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  570. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  571. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  572. package/dist-ui/index.html +3 -25
  573. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  574. package/extensions/openclaw-plugin/package.json +1 -1
  575. package/openclaw.plugin.json +1 -1
  576. package/package.json +1 -1
  577. package/dist/capture.d.ts +0 -155
  578. package/dist/capture.js +0 -1295
  579. package/dist/consolidate.d.ts +0 -58
  580. package/dist/consolidate.js +0 -1124
  581. package/dist/graph.d.ts +0 -245
  582. package/dist/hooks.d.ts +0 -208
  583. package/dist/hooks.js +0 -1076
  584. package/dist/importers.js +0 -900
  585. package/dist/predictions.js +0 -620
  586. package/dist/search.d.ts +0 -320
  587. package/dist/search.js +0 -970
  588. package/dist/store.d.ts +0 -776
  589. package/dist/store.js +0 -3473
  590. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  591. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  592. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  593. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -0,0 +1,116 @@
1
+ // Store health and admin tool handlers: base rates, status, conflicts, resolve, share and peers.
2
+ import { calculateStrength } from '../memory.js';
3
+ import { evalNow } from '../ablation.js';
4
+ import { loadStrengthRows } from '../store/candidates.js';
5
+ import { listMemoryConflicts, resolveConflict } from '../store/conflicts.js';
6
+ import { shareMemory, listPeers } from '../shared.js';
7
+ import { computePredictionBaserate } from '../predictions/store.js';
8
+ import { isJsonString } from './protocol.js';
9
+ export function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId }) {
10
+ // J3 reference-class / planning-fallacy detector. Reads from the E2
11
+ // predictions table; returns text-only response matching the existing
12
+ // MCP tool convention (no structured JSON over the wire). Direct call
13
+ // to computePredictionBaserate; helper opens its own db + emits audit
14
+ // (single source of truth, no caller-site drift).
15
+ const classTag = String(args.class_tag || '').trim();
16
+ if (!classTag)
17
+ return 'No class_tag provided. Usage: pass class_tag matching a class used in past predictions (e.g. "migration-effort").';
18
+ const baserate = computePredictionBaserate(hippoRoot, tenantId, classTag, ctx?.actor ?? 'mcp');
19
+ if (baserate.nClosed === 0) {
20
+ return `No closed predictions in class "${classTag}" yet. Create one via hippo_predict (or 'hippo predict ...' CLI) and close it with hippo_predict_close once the actual outcome is known. Base rates need closed predictions with numeric actual_value to compute.`;
21
+ }
22
+ const lines = [baserate.summary, ''];
23
+ lines.push(`n_closed: ${baserate.nClosed}`);
24
+ lines.push(`n_ratio_eligible: ${baserate.nRatioEligible}`);
25
+ if (baserate.meanEstimate !== null)
26
+ lines.push(`mean_estimate: ${baserate.meanEstimate.toFixed(3)}`);
27
+ if (baserate.meanActual !== null)
28
+ lines.push(`mean_actual: ${baserate.meanActual.toFixed(3)}`);
29
+ if (baserate.meanRatio !== null)
30
+ lines.push(`mean_ratio: ${baserate.meanRatio.toFixed(3)}x`);
31
+ if (baserate.p50Ratio !== null)
32
+ lines.push(`p50_ratio: ${baserate.p50Ratio.toFixed(3)}x`);
33
+ if (baserate.mae !== null)
34
+ lines.push(`mae: ${baserate.mae.toFixed(3)}`);
35
+ return lines.join('\n');
36
+ }
37
+ export function runStatusTool({ hippoRoot, config, tenantId }) {
38
+ // Every row counts toward the averages, so this scans the store, but without its text.
39
+ const entries = loadStrengthRows(hippoRoot, tenantId);
40
+ const now = evalNow(); // honors HIPPO_FAKE_NOW (eval-only; see ablation.ts)
41
+ let atRisk = 0;
42
+ let totalStrength = 0;
43
+ for (const e of entries) {
44
+ const s = calculateStrength(e, now);
45
+ totalStrength += s;
46
+ if (s < 0.1 && !e.pinned)
47
+ atRisk++;
48
+ }
49
+ const avgStrength = entries.length > 0 ? (totalStrength / entries.length).toFixed(2) : '0';
50
+ const pinned = entries.filter((e) => e.pinned).length;
51
+ const errors = entries.filter((e) => e.tags.includes('error')).length;
52
+ const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId).length;
53
+ return [
54
+ `Memories: ${entries.length} (${pinned} pinned, ${errors} errors)`,
55
+ `Avg strength: ${avgStrength}`,
56
+ `At risk (<0.1): ${atRisk}`,
57
+ `Open conflicts: ${conflicts}`,
58
+ `Half-life default: ${config.defaultHalfLifeDays}d`,
59
+ ].join('\n');
60
+ }
61
+ export function runConflictsTool({ hippoRoot, tenantId }) {
62
+ const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId);
63
+ if (conflicts.length === 0)
64
+ return 'No open conflicts.';
65
+ return conflicts.map((c) => `conflict_${c.id}: ${c.memory_a_id} <-> ${c.memory_b_id} (score=${c.score.toFixed(2)}) — ${c.reason}`).join('\n');
66
+ }
67
+ export function runResolveTool({ args, ctx, hippoRoot, tenantId }) {
68
+ const conflictId = Number(args.conflict_id);
69
+ const keepId = String(args.keep || '');
70
+ const forget = Boolean(args.forget);
71
+ // AT1: optional rejectLoser + reason, threaded straight through to
72
+ // resolveConflict's opts (plan §5 — mirrors the CLI's --reject-loser).
73
+ const rejectLoser = Boolean(args.rejectLoser);
74
+ const reason = isJsonString(args.reason) ? args.reason : undefined;
75
+ if (isNaN(conflictId) || !keepId)
76
+ return 'Required: conflict_id and keep.';
77
+ const result = resolveConflict(hippoRoot, conflictId, keepId, forget, tenantId, {
78
+ rejectLoserValue: rejectLoser,
79
+ reason,
80
+ // P2 fix: resolveConflict's opts.rejectedBy defaults to 'cli' when
81
+ // omitted — this call site never passed it, so the tombstone's
82
+ // rejected_by AND the conflict_resolve audit's actor both landed as
83
+ // 'cli' even though the caller was MCP. ctx.actor carries the
84
+ // auth-resolved actor for HTTP-MCP (see McpContext above); stdio
85
+ // callers pass no ctx, so 'mcp' is the honest fallback there.
86
+ rejectedBy: ctx?.actor ?? 'mcp',
87
+ });
88
+ if (!result)
89
+ return 'Could not resolve. Check the conflict ID and --keep value.';
90
+ const action = rejectLoser ? 'rejected (tombstoned) and removed' : forget ? 'deleted' : 'weakened';
91
+ return `Resolved conflict ${conflictId}: kept ${keepId}, ${action} ${result.loserId}`;
92
+ }
93
+ export function runShareTool({ args, hippoRoot, tenantId }) {
94
+ const shareId = String(args.id || '');
95
+ if (!shareId)
96
+ return 'Required: id (memory ID to share).';
97
+ const force = Boolean(args.force);
98
+ // Pass tenantId so shareMemory's readEntry filters by tenant. Without
99
+ // this, a Bearer for tenant A could call hippo_share with tenant B's
100
+ // id and copy the row to the global store. The 'Memory not found'
101
+ // error matches the cross-tenant deny shape elsewhere in the code.
102
+ const shared = shareMemory(hippoRoot, shareId, { force, tenantId });
103
+ if (!shared)
104
+ return 'Transfer score too low. Use force=true to override.';
105
+ return `Shared [${shared.id}] to global store. Source: ${shared.source}`;
106
+ }
107
+ export function runPeersTool({ tenantId }) {
108
+ // D4 v1.12.10: tenant-scope the cross-project peer discovery.
109
+ // tenantId is the caller's tenant (matches hippo_share above);
110
+ // passing undefined would restore the pre-D4 host-wide behaviour.
111
+ const peers = listPeers(undefined, tenantId);
112
+ if (peers.length === 0)
113
+ return 'No peers found.';
114
+ return peers.map((p) => `${p.project}: ${p.count} memories (latest: ${p.latest.slice(0, 10)})`).join('\n');
115
+ }
116
+ //# sourceMappingURL=admin-tools.js.map
@@ -0,0 +1,27 @@
1
+ import type { SearchResult } from '../search/types.js';
2
+ import type { SessionEvent, TaskSnapshot } from '../store/rows.js';
3
+ import type { ContextCost, ContinuityBlock, RecallResult, RecallResultItem } from '../api.js';
4
+ import { type SessionHandoff } from '../handoff.js';
5
+ import { detectAnchoring } from '../recall-history.js';
6
+ import { detectAvailabilityBias } from '../availability.js';
7
+ export declare function formatContinuityBlock(block: ContinuityBlock): string;
8
+ export declare function formatMemories(results: ReadonlyArray<Pick<SearchResult, 'entry'>>): string;
9
+ export interface RenderedRecall {
10
+ anchoring: ReturnType<typeof detectAnchoring>;
11
+ availability: ReturnType<typeof detectAvailabilityBias>;
12
+ text: string;
13
+ list: SearchResult[];
14
+ }
15
+ export interface RenderSlot {
16
+ rendered?: RenderedRecall;
17
+ }
18
+ /** What a memory costs the budget: the text formatMemories prints for it. */
19
+ export declare const memoryCost: (r: Pick<SearchResult, "entry">) => number;
20
+ export declare function memoriesReserve(budget: number): number;
21
+ export declare function snapshotPiece(s: TaskSnapshot): string;
22
+ export declare function handoffPiece(h: SessionHandoff): string;
23
+ export declare function trailPiece(events: readonly SessionEvent[]): string;
24
+ export declare const contextCost: ContextCost;
25
+ export declare function tailSection(rows: RecallResultItem[]): string;
26
+ export declare function planningSection(r: RecallResult): string;
27
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1,135 @@
1
+ // Text the MCP recall and context tools print, and what each printed piece costs the token budget.
2
+ import { confidenceLabel } from '../memory.js';
3
+ import { formatHandoffEvidenceLine } from '../handoff.js';
4
+ import { printedTokens } from '../context-render.js';
5
+ import { estimateTokens } from '../token-ledger.js';
6
+ // ── Format helpers ──
7
+ function handoffLines(h) {
8
+ const lines = [`- Summary: ${h.summary}`];
9
+ if (h.nextAction)
10
+ lines.push(`- Next action: ${h.nextAction}`);
11
+ if ((h.artifacts ?? []).length > 0)
12
+ lines.push(`- Artifacts: ${(h.artifacts ?? []).join(', ')}`);
13
+ if (h.outcome)
14
+ lines.push(`- Outcome: ${h.outcome}`);
15
+ if (h.targetRuntime)
16
+ lines.push(`- Target runtime: ${h.targetRuntime}`);
17
+ if (h.cardId)
18
+ lines.push(`- Card: ${h.cardId}`);
19
+ if ((h.constraints ?? []).length > 0)
20
+ lines.push(`- Constraints: ${(h.constraints ?? []).join(', ')}`);
21
+ if (h.evidence)
22
+ lines.push(`- Evidence: ${formatHandoffEvidenceLine(h.evidence)}`);
23
+ return lines;
24
+ }
25
+ function trailLines(events) {
26
+ return events.map((e) => {
27
+ const preview = e.content.length > 200 ? e.content.slice(0, 200) + '…' : e.content;
28
+ return `- [${e.event_type}] ${preview}`;
29
+ });
30
+ }
31
+ export function formatContinuityBlock(block) {
32
+ const lines = ['## Continuity'];
33
+ if (block.activeSnapshot) {
34
+ lines.push('');
35
+ lines.push('### Active Task Snapshot');
36
+ lines.push(`- Task: ${block.activeSnapshot.task}`);
37
+ lines.push(`- Summary: ${block.activeSnapshot.summary}`);
38
+ lines.push(`- Next: ${block.activeSnapshot.next_step}`);
39
+ }
40
+ if (block.sessionHandoff) {
41
+ lines.push('');
42
+ lines.push('### Session Handoff');
43
+ lines.push(...handoffLines(block.sessionHandoff));
44
+ }
45
+ if (block.recentSessionEvents.length > 0) {
46
+ lines.push('');
47
+ lines.push('### Recent Session Trail');
48
+ lines.push(...trailLines(block.recentSessionEvents));
49
+ }
50
+ if (lines.length === 1) {
51
+ lines.push('');
52
+ lines.push('(no active task snapshot, handoff, or recent events for this tenant)');
53
+ }
54
+ return lines.join('\n');
55
+ }
56
+ const NO_MEMORIES = 'No relevant memories found.';
57
+ function memoriesHeading(count) {
58
+ return `Found ${count} memories:\n`;
59
+ }
60
+ function formatMemory(r) {
61
+ const conf = confidenceLabel(r.entry).text;
62
+ const tags = r.entry.tags.length > 0 ? ` tags: ${r.entry.tags.join(', ')}` : '';
63
+ return `[${conf}]${tags} (strength=${r.entry.strength.toFixed(2)})\n${r.entry.content}\n`;
64
+ }
65
+ export function formatMemories(results) {
66
+ if (results.length === 0)
67
+ return NO_MEMORIES;
68
+ return [memoriesHeading(results.length), ...results.map(formatMemory)].join('\n');
69
+ }
70
+ /** What a memory costs the budget: the text formatMemories prints for it. */
71
+ export const memoryCost = (r) => printedTokens(formatMemory(r));
72
+ // The widest heading or the empty-list line, whichever costs more, so either prints inside the budget.
73
+ export function memoriesReserve(budget) {
74
+ return Math.max(printedTokens(memoriesHeading(budget)), estimateTokens(NO_MEMORIES));
75
+ }
76
+ export function snapshotPiece(s) {
77
+ return [
78
+ '## Active Task Snapshot',
79
+ `- Task: ${s.task}`,
80
+ `- Status: ${s.status}`,
81
+ `- Updated: ${s.updated_at}`,
82
+ '',
83
+ '### Summary',
84
+ s.summary,
85
+ '',
86
+ '### Next step',
87
+ s.next_step,
88
+ '',
89
+ '',
90
+ ].join('\n');
91
+ }
92
+ export function handoffPiece(h) {
93
+ return ['## Session Handoff', ...handoffLines(h), '', ''].join('\n');
94
+ }
95
+ export function trailPiece(events) {
96
+ return ['## Recent Session Trail', ...trailLines(events), '', ''].join('\n');
97
+ }
98
+ // Sections print ahead of the memories in hippo_context, so getContext pays for each as printed before any memory.
99
+ export const contextCost = {
100
+ entry: memoryCost,
101
+ fixed: (budget) => memoriesReserve(budget),
102
+ snapshot: (s) => estimateTokens(snapshotPiece(s)),
103
+ handoff: (h) => estimateTokens(handoffPiece(h)),
104
+ trail: (events) => estimateTokens(trailPiece(events)),
105
+ };
106
+ // Rows the ranked list already shows drop out of this section, so pricing every row bounds what it prints.
107
+ export function tailSection(rows) {
108
+ if (rows.length === 0)
109
+ return '';
110
+ const lines = ['', '## Fresh tail / substituted summaries'];
111
+ for (const r of rows) {
112
+ const tag = r.isSummary ? '[summary]' : '[tail]';
113
+ const head = r.content.length > 200 ? r.content.slice(0, 200) + '…' : r.content;
114
+ if (r.isSummary && r.substitutedFor && r.substitutedFor.length > 0) {
115
+ lines.push(`- ${tag} ${r.id} (covers ${r.substitutedFor.length} rows): ${head}`);
116
+ }
117
+ else {
118
+ lines.push(`- ${tag} ${r.id}: ${head}`);
119
+ }
120
+ }
121
+ return '\n' + lines.join('\n');
122
+ }
123
+ // J3.2: the hint depends on the query alone, so api.retrieve's copy is the one shown; JSON.stringify fences the phrase.
124
+ export function planningSection(r) {
125
+ if (r.planningFallacyHint) {
126
+ const h = r.planningFallacyHint;
127
+ return `## Planning fallacy hint\nClass: ${h.classTag}\n${h.baserateSummary}\n(detected: ${JSON.stringify(h.detectedPhrase)})\n\n---\n\n`;
128
+ }
129
+ if (r.planningFallacyWatching) {
130
+ const w = r.planningFallacyWatching;
131
+ return `## Planning fallacy watch\nReason: ${w.reason}\n${w.suggestion}\n(detected: ${JSON.stringify(w.detectedPhrase)})\n\n---\n\n`;
132
+ }
133
+ return '';
134
+ }
135
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1,5 @@
1
+ import { type ToolCall } from './protocol.js';
2
+ export declare function runRememberTool({ args, ctx, hippoRoot, config, tenantId }: ToolCall): string;
3
+ export declare function runOutcomeTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
4
+ export declare function runLearnTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
5
+ //# sourceMappingURL=memory-tools.d.ts.map
@@ -0,0 +1,83 @@
1
+ // Write-side tool handlers: hippo_remember, hippo_outcome and hippo_learn.
2
+ import { log } from '../log.js';
3
+ import { readEntry } from '../store/entry-reads.js';
4
+ import { countCreatedSinceLastSleep } from '../store/index-and-stats.js';
5
+ import { consolidate } from '../consolidate/sleep.js';
6
+ import { resolveTenantId } from '../tenant.js';
7
+ import { remember as apiRemember, outcome as apiOutcome, learn as apiLearn, MCP_LEARN } from '../api.js';
8
+ import { mcpActor } from './protocol.js';
9
+ import { lastRecalledIds, autoSleepInFlight, resolveClientKey } from './session-state.js';
10
+ export function runRememberTool({ args, ctx, hippoRoot, config, tenantId }) {
11
+ const text = String(args.text || '');
12
+ if (!text)
13
+ return 'No text provided.';
14
+ const tags = [];
15
+ if (args.error)
16
+ tags.push('error');
17
+ if (args.tag)
18
+ tags.push(String(args.tag));
19
+ // Route through api.ts so audit_log captures the caller identity
20
+ // uniformly with CLI/REST: the auth-resolved ctx.actor under HTTP-MCP,
21
+ // 'mcp' for stdio (no ctx). api.ts.remember writes the memory + audit
22
+ // row in one transaction-friendly path; we re-read the entry to surface
23
+ // the half-life used in the MCP human-readable response.
24
+ const apiCtx = {
25
+ hippoRoot,
26
+ tenantId,
27
+ actor: mcpActor(ctx),
28
+ };
29
+ const result = apiRemember(apiCtx, {
30
+ content: text,
31
+ tags,
32
+ });
33
+ const entry = readEntry(hippoRoot, result.id, tenantId);
34
+ // Auto-sleep: one run per store at a time, triggered by what arrived since the last one.
35
+ // Consolidation is host-wide, so only the host tenant's writes may start it.
36
+ if (config.autoSleep.enabled &&
37
+ tenantId === resolveTenantId({}) &&
38
+ !autoSleepInFlight.has(hippoRoot) &&
39
+ countCreatedSinceLastSleep(hippoRoot, tenantId) >= config.autoSleep.threshold) {
40
+ autoSleepInFlight.add(hippoRoot);
41
+ // Fire-and-forget (never block the response); an unhandled rejection would kill the server, so log it.
42
+ consolidate(hippoRoot)
43
+ .catch((err) => {
44
+ log.error(`auto-sleep consolidate failed (tenant ${tenantId}): ${err instanceof Error ? err.message : String(err)}`);
45
+ })
46
+ .finally(() => autoSleepInFlight.delete(hippoRoot));
47
+ }
48
+ const halfLife = entry?.half_life_days ?? config.defaultHalfLifeDays;
49
+ const tagStr = entry?.tags.join(', ') || tags.join(', ') || 'none';
50
+ const warnings = (result.warnings ?? []).map((w) => `\nWarning: ${w}`).join('');
51
+ return `Remembered [${result.id}] (half-life: ${halfLife}d, tags: ${tagStr})${warnings}`;
52
+ }
53
+ export function runOutcomeTool({ args, ctx, hippoRoot, tenantId }) {
54
+ const good = Boolean(args.good);
55
+ const clientKey = resolveClientKey(ctx);
56
+ const ids = lastRecalledIds.get(clientKey) ?? [];
57
+ if (ids.length === 0)
58
+ return 'No recent recalls to apply outcome to.';
59
+ // Route through src/api.ts so audit_log captures the caller identity
60
+ // (auth-resolved ctx.actor under HTTP-MCP, 'mcp' for stdio) and tenant
61
+ // scoping is enforced uniformly (same surface as recall/remember).
62
+ // outcome() also handles cross-tenant id skip silently.
63
+ const apiCtx = {
64
+ hippoRoot,
65
+ tenantId,
66
+ actor: mcpActor(ctx),
67
+ };
68
+ const { applied } = apiOutcome(apiCtx, ids, good);
69
+ return `Applied ${good ? 'positive' : 'negative'} outcome to ${applied} memories`;
70
+ }
71
+ export function runLearnTool({ args, ctx, hippoRoot, tenantId }) {
72
+ const days = Number(args.days) || 7;
73
+ const result = apiLearn({ hippoRoot, tenantId, actor: mcpActor(ctx) }, { repoPath: process.cwd(), days, profile: MCP_LEARN });
74
+ if (result.status === 'not-a-repo')
75
+ return 'No git history found.';
76
+ if (result.status === 'no-commits')
77
+ return 'No fix/revert/bug commits found in the specified period.';
78
+ const { added, skipped, rejected, lowInfo } = result;
79
+ const rejectedSuffix = rejected > 0 ? `, ${rejected} rejected values skipped` : '';
80
+ const lowInfoSuffix = lowInfo > 0 ? `, ${lowInfo} low-information subjects dropped` : '';
81
+ return `Git learn: ${added} new, ${skipped} duplicates skipped${rejectedSuffix}${lowInfoSuffix} (scanned ${days} days)`;
82
+ }
83
+ //# sourceMappingURL=memory-tools.js.map
@@ -0,0 +1,83 @@
1
+ import { loadConfig } from '../config.js';
2
+ import type { Actor as ApiActor } from '../api.js';
3
+ import { type ResolveProjectIdentityOpts } from '../project-identity.js';
4
+ /** Same bounded walk as the CLI (ends at home, so HIPPO_HOME wins over ~/.hippo); cwd/opts are the test seam. */
5
+ export declare function findHippoRoot(cwd?: string, opts?: ResolveProjectIdentityOpts): string | null;
6
+ interface McpRequest {
7
+ jsonrpc: '2.0';
8
+ id: number | string;
9
+ method: string;
10
+ params?: Record<string, JsonValue>;
11
+ }
12
+ interface McpResponse {
13
+ jsonrpc: '2.0';
14
+ id: number | string | null;
15
+ result?: unknown;
16
+ error?: {
17
+ code: number;
18
+ message: string;
19
+ data?: {
20
+ requestId: string;
21
+ };
22
+ };
23
+ }
24
+ /** JSON-RPC reply for a request that threw: typed API errors keep their text; anything else is logged and answered generically. */
25
+ export declare function mcpErrorResponse<E>(id: McpResponse['id'], err: E, requestId?: string): McpResponse;
26
+ export type { McpRequest, McpResponse };
27
+ /**
28
+ * Optional execution context threaded from a non-stdio transport. When the
29
+ * HTTP transport in src/server.ts calls handleMcpRequest, it knows the
30
+ * server's bound hippoRoot and the auth-resolved tenantId/actor. Passing
31
+ * those through here lets executeTool skip the findHippoRoot() walk and
32
+ * the env-based resolveTenantId({}) fallback — both of which would
33
+ * otherwise produce the wrong store and the wrong tenant for HTTP callers.
34
+ *
35
+ * Stdio callers pass nothing; behavior stays unchanged for that path.
36
+ */
37
+ export interface McpContext {
38
+ hippoRoot: string;
39
+ tenantId: string;
40
+ actor: string;
41
+ /**
42
+ * The caller's role from the HTTP transport's auth. Absent for stdio, which
43
+ * is the local operator and runs as admin. Tools must use this rather than
44
+ * assuming admin, or a member key over HTTP-MCP would act as admin.
45
+ */
46
+ role?: 'admin' | 'member';
47
+ /** EI2: scope grants for the HTTP-MCP caller's key. Absent for stdio (admin, needs none). */
48
+ scopes?: readonly string[];
49
+ viaAuthResolver?: true;
50
+ /** Set by the HTTP transport for the host's operator; a context without a role is in-process and implies it. */
51
+ hostAdmin?: true;
52
+ /**
53
+ * Per-client key for state isolation under HTTP-MCP. For stdio: 'stdio-${pid}'
54
+ * (one process = one client). For HTTP-SSE / HTTP MCP: hash(bearer + remoteAddr)
55
+ * built by src/server.ts when constructing McpContext for the request.
56
+ * Optional for backwards compatibility; defaults to `${tenantId}:default`.
57
+ */
58
+ clientKey?: string;
59
+ }
60
+ /**
61
+ * The api-layer actor for a tool call. Stdio (no ctx) is the local operator
62
+ * and runs as admin; over HTTP the transport's authenticated role is used, so
63
+ * a member key never acts as admin through MCP.
64
+ */
65
+ export declare function mcpActor(ctx: McpContext | undefined): ApiActor;
66
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
67
+ [key: string]: JsonValue;
68
+ };
69
+ export declare function isJsonString(v: JsonValue | undefined): v is string;
70
+ export declare function isJsonBoolean(v: JsonValue | undefined): v is boolean;
71
+ export declare function isJsonObjectRecord(v: JsonValue | undefined): v is {
72
+ [key: string]: JsonValue;
73
+ };
74
+ /** One tool call after the store, config and tenant are resolved; every handler reads the same four. */
75
+ export interface ToolCall {
76
+ args: Record<string, JsonValue>;
77
+ ctx?: McpContext;
78
+ hippoRoot: string;
79
+ config: ReturnType<typeof loadConfig>;
80
+ tenantId: string;
81
+ }
82
+ export type ToolHandler = (call: ToolCall) => string | Promise<string>;
83
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1,55 @@
1
+ // MCP wire types, the caller context, and the JSON predicates every tool handler narrows its arguments with.
2
+ import * as fs from 'fs';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { INTERNAL_ERROR_MESSAGE, mapApiError } from '../http-util.js';
5
+ import { log } from '../log.js';
6
+ import { getGlobalRoot } from '../shared.js';
7
+ import { findHippoStoreDir } from '../project-identity.js';
8
+ import { isSqliteBusy, STORE_BUSY_MESSAGE } from '../db.js';
9
+ // ── Find hippo root ──
10
+ /** Same bounded walk as the CLI (ends at home, so HIPPO_HOME wins over ~/.hippo); cwd/opts are the test seam. */
11
+ export function findHippoRoot(cwd = process.cwd(), opts) {
12
+ const local = findHippoStoreDir(cwd, opts);
13
+ if (local !== null)
14
+ return local;
15
+ // Global fallback (respects $HIPPO_HOME / $XDG_DATA_HOME)
16
+ const global = getGlobalRoot();
17
+ return fs.existsSync(global) ? global : null;
18
+ }
19
+ /** JSON-RPC reply for a request that threw: typed API errors keep their text; anything else is logged and answered generically. */
20
+ export function mcpErrorResponse(id, err, requestId = randomUUID()) {
21
+ if (isSqliteBusy(err))
22
+ return { jsonrpc: '2.0', id, error: { code: -32603, message: STORE_BUSY_MESSAGE } };
23
+ const { status, message } = mapApiError(err);
24
+ if (status !== 500)
25
+ return { jsonrpc: '2.0', id, error: { code: -32603, message } };
26
+ log.error(`mcp request failed: ${err instanceof Error ? err.message : String(err)}`, { requestId });
27
+ return {
28
+ jsonrpc: '2.0',
29
+ id,
30
+ error: { code: -32603, message: `${INTERNAL_ERROR_MESSAGE} (request id ${requestId})`, data: { requestId } },
31
+ };
32
+ }
33
+ /**
34
+ * The api-layer actor for a tool call. Stdio (no ctx) is the local operator
35
+ * and runs as admin; over HTTP the transport's authenticated role is used, so
36
+ * a member key never acts as admin through MCP.
37
+ */
38
+ export function mcpActor(ctx) {
39
+ const actor = { subject: ctx?.actor ?? 'mcp', role: ctx?.role ?? 'admin', scopes: ctx?.scopes };
40
+ if (ctx?.viaAuthResolver)
41
+ actor.viaAuthResolver = true;
42
+ if (ctx?.role === undefined || ctx.hostAdmin)
43
+ actor.hostAdmin = true;
44
+ return actor;
45
+ }
46
+ export function isJsonString(v) {
47
+ return typeof v === 'string';
48
+ }
49
+ export function isJsonBoolean(v) {
50
+ return typeof v === 'boolean';
51
+ }
52
+ export function isJsonObjectRecord(v) {
53
+ return v !== undefined && v !== null && typeof v === 'object' && !Array.isArray(v);
54
+ }
55
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1,6 @@
1
+ import { type ToolCall } from './protocol.js';
2
+ export declare function runRecallTool(call: ToolCall): Promise<string>;
3
+ export declare function runAssembleTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
4
+ export declare function runDrillTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
5
+ export declare function runContextTool({ args, ctx, hippoRoot, config, tenantId }: ToolCall): Promise<string>;
6
+ //# sourceMappingURL=recall-tools.d.ts.map