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
@@ -1,32 +1,30 @@
1
1
  // Helpers two or more CLI verbs use, split from cli.ts so a verb can move to its own file without importing cli.ts.
2
2
  // This module must never import cli.ts.
3
+ import { envApiKey, envClaudeCodeSessionId, envHippoSessionId, envRequireServer } from '../env.js';
3
4
  import * as path from 'path';
4
5
  import * as fs from 'fs';
5
6
  import { execFileSync, execSync } from 'child_process';
6
- import { installJsonHooks, CODEX_TRUST_LINE } from '../hooks.js';
7
- import { confidenceLabel, computeSchemaFit, createMemory, Layer } from '../memory.js';
8
- import { isInitialized, loadAllEntries, writeEntry, updateStats } from '../store.js';
9
- import { RejectedValueError } from '../rejection.js';
10
- import { explainMatch } from '../search.js';
11
- import { embedMemory } from '../embeddings.js';
7
+ import { installJsonHooks } from '../hooks/json-hooks.js';
8
+ import { CODEX_TRUST_LINE } from '../hooks/shared.js';
9
+ import { confidenceLabel } from '../memory.js';
10
+ import { isInitialized } from '../store/open.js';
11
+ import { explainMatch } from '../search/explain.js';
12
12
  import { loadConfig } from '../config.js';
13
- import { openHippoDb, closeHippoDb, isSqliteBusy, noteStoreBusy } from '../db.js';
13
+ import { openHippoDb, closeHippoDb, isSqliteBusy, noteStoreBusy, withSharedStoreHandles, HOOK_DB_WAIT_MS } from '../db.js';
14
+ import { ensurePilotArm, hashArm, readPilotArm } from '../pilot-arm.js';
14
15
  import { hookPayloadSessionId, isSubagentPayload, recordTokenUse } from '../token-ledger.js';
15
- import { isGitRepo, fetchGitLog, extractLessons, partitionLessons } from '../autolearn.js';
16
- import { storedTextKeys, duplicateKey } from '../same-text.js';
17
16
  import { importAtSessionEnd, currentMachine } from '../agent-memories/sync.js';
18
17
  import { summaryLine } from '../agent-memories/report.js';
19
- import { detectChurnStale, extractInvalidationTarget, invalidateMatching } from '../invalidation.js';
18
+ import { detectChurnStale } from '../invalidation.js';
20
19
  import { resolveProjectIdentity } from '../project-identity.js';
21
- import { extractPathTags } from '../path-context.js';
22
20
  import { getGlobalRoot, initGlobal } from '../shared.js';
23
21
  import { DAILY_TASK_NAME, buildDailyRunnerCommand, buildSchtasksCreateArgs, buildWindowsTaskRun } from '../scheduler.js';
24
- import { sanitizeLogMessage } from '../capture.js';
22
+ import { sanitizeLogMessage } from '../capture/compact.js';
25
23
  import { appendAuditEvent, reportAuditWriteFailure } from '../audit.js';
26
- import { createHash } from 'node:crypto';
27
24
  import * as client from '../client.js';
28
25
  import { detectServer, removePidfileIfOwned } from '../server-detect.js';
29
26
  import { resolveTenantId } from '../tenant.js';
27
+ import { adminActor, learn, CLI_LEARN } from '../api.js';
30
28
  import { snapshotText, sessionTrailText, handoffText } from '../context-render.js';
31
29
  import { log } from '../log.js';
32
30
  import { printError } from './output.js';
@@ -92,7 +90,7 @@ export function requireInit(hippoRoot) {
92
90
  }
93
91
  /** Runs detectChurnStale against every store this repo's memories can live in. */
94
92
  export function runChurnStaleForRepo(hippoRoot, dryRun) {
95
- const repoRoot = execFileSync('git', ['rev-parse', '--show-toplevel'], { cwd: process.cwd(), encoding: 'utf8', windowsHide: true }).trim();
93
+ const repoRoot = execFileSync('git', ['rev-parse', '--show-toplevel'], { cwd: process.cwd(), encoding: 'utf8', timeout: 10_000, windowsHide: true }).trim();
96
94
  const projectName = resolveProjectIdentity(process.cwd()).name;
97
95
  const globalRoot = getGlobalRoot();
98
96
  const roots = globalRoot !== hippoRoot && isInitialized(globalRoot) ? [hippoRoot, globalRoot] : [hippoRoot];
@@ -116,7 +114,7 @@ export function runChurnStaleForRepo(hippoRoot, dryRun) {
116
114
  * promote); every other command opens the store directly, knob or not.
117
115
  */
118
116
  function failIfServerRequired(reason) {
119
- if (process.env['HIPPO_REQUIRE_SERVER']) {
117
+ if (envRequireServer()) {
120
118
  throw new Error(`hippo: HIPPO_REQUIRE_SERVER is set but ${reason}. ` +
121
119
  `Start \`hippo serve\`, or unset HIPPO_REQUIRE_SERVER to allow direct-mode fallback.`);
122
120
  }
@@ -142,7 +140,7 @@ export async function runViaServerIfAvailable(hippoRoot, httpFn) {
142
140
  failIfServerRequired('no running server was detected for this hippoRoot');
143
141
  return false;
144
142
  }
145
- const apiKey = process.env['HIPPO_API_KEY'];
143
+ const apiKey = envApiKey();
146
144
  try {
147
145
  await httpFn(info, apiKey);
148
146
  return true;
@@ -220,19 +218,6 @@ export function printAgentImport(report, indent = ' ') {
220
218
  for (const warning of report.warnings)
221
219
  printError(`hippo: agent memories: ${warning}`);
222
220
  }
223
- /** The first hippo block in `text` and the agent whose current or shipped text it is; `owner` is undefined for an edited block. */
224
- export function hippoBlock(text) {
225
- const at = text.indexOf(HOOK_MARKERS.start);
226
- const start = at + HOOK_MARKERS.start.length;
227
- const end = text.indexOf(HOOK_MARKERS.end, start);
228
- if (at < 0 || end < 0)
229
- return null;
230
- // git autocrlf checks these files out with CRLF: match as LF, write back in the file's own ending.
231
- const raw = text.slice(start, end);
232
- const inner = raw.replace(/\r\n/g, '\n').trim();
233
- const owner = Object.keys(HOOKS).find((k) => HOOKS[k].content === inner) ?? SHIPPED_HOOK_HASHES.get(createHash('sha256').update(inner).digest('hex'));
234
- return { start, end, eol: raw.includes('\r\n') ? '\r\n' : '\n', inner, owner };
235
- }
236
221
  /** Adds hippo's two Codex hooks and says what changed; each install ends on the trust reminder, since Codex skips an untrusted hook. */
237
222
  export function installCodexMemoryHooks(indent) {
238
223
  const result = installJsonHooks('codex');
@@ -420,7 +405,7 @@ export function cardStringFlag(flags, key) {
420
405
  }
421
406
  // Claude Code exports its own session var, not ours; without the fallback agent-run recalls trace with no session.
422
407
  export function hostSessionId() {
423
- return process.env.HIPPO_SESSION_ID?.trim() || process.env.CLAUDE_CODE_SESSION_ID?.trim() || undefined;
408
+ return envHippoSessionId()?.trim() || envClaudeCodeSessionId()?.trim() || undefined;
424
409
  }
425
410
  /**
426
411
  * Compaction drops the pinned blocks the per-prompt hook injected
@@ -505,106 +490,19 @@ export function withLedgerDb(hippoRoot, fn) {
505
490
  }
506
491
  export function learnFromRepo(hippoRoot, repoPath, days, label) {
507
492
  const prefix = label ? `[${label}] ` : '';
508
- if (!isGitRepo(repoPath)) {
493
+ const ctx = { hippoRoot, tenantId: resolveTenantId({}), actor: adminActor('cli') };
494
+ const result = learn(ctx, { repoPath, days, profile: CLI_LEARN });
495
+ if (result.status === 'not-a-repo') {
509
496
  console.log(`${prefix}No git history found (or not a git repository).`);
510
497
  return { added: 0, skipped: 0, lowInfo: 0 };
511
498
  }
512
- const gitLog = fetchGitLog(repoPath, days);
513
- if (!gitLog.trim()) {
514
- console.log(`${prefix}No fix/revert/bug commits found in the specified period.`);
515
- return { added: 0, skipped: 0, lowInfo: 0 };
516
- }
517
- // Same patterns as MCP hippo_learn: config.gitLearnPatterns (whose default
518
- // equals extractLessons' built-in list) so a custom list applies everywhere.
519
- const config = loadConfig(hippoRoot);
520
- const parsedLessons = extractLessons(gitLog, config.gitLearnPatterns);
521
- if (parsedLessons.length === 0) {
499
+ if (result.status !== 'scanned') {
522
500
  console.log(`${prefix}No fix/revert/bug commits found in the specified period.`);
523
501
  return { added: 0, skipped: 0, lowInfo: 0 };
524
502
  }
525
- // The admission gate lives at the write path, not in extractLessons
526
- // (a published API surface that only parses). Bare subjects like "fixed
527
- // signals" are dropped here, before they ever become a memory.
528
- // The gate filters the loop INPUT, so a dropped lesson neither stores nor
529
- // invalidates. That is deliberate, and it was argued both ways.
530
- //
531
- // One review called the lost invalidation serious: a migration subject
532
- // too thin to store ("replace webpack with vite") would stop weakening
533
- // stale webpack memories. True. So the loop was widened to walk every
534
- // parsed lesson with the gate on the write alone.
535
- //
536
- // A second review found the cure was worse. STORAGE is what makes invalidation
537
- // idempotent here: a stored lesson is recognised by its same-text key on
538
- // the next scan and short-circuits before invalidating again. A lesson that
539
- // invalidates but is never stored has no such record, so every rescan
540
- // re-invalidates, and invalidateMatching halves half_life_days each time.
541
- // Measured: 7 -> 3 -> 1 over two runs. That is compounding data damage.
542
- //
543
- // Measured frequency decided it. Across 413 real auto-learn rows in 4
544
- // stores, 24 are gated and ZERO of those carry an invalidation target; the
545
- // 45 lessons that do carry targets all pass the gate and are unaffected
546
- // either way. Both failure modes are empty on real data, so the tie breaks
547
- // on which one is benign if it ever fires: not invalidating is a missed
548
- // improvement, re-invalidating forever is damage.
549
- //
550
- // Documented limitation, pinned by test: a migration subject too thin to
551
- // store also does not invalidate. Making invalidateMatching idempotent
552
- // would allow both, and is backlogged - it is a latent issue for the manual
553
- // `hippo invalidate` path too, not just this one.
554
- const { kept: lessons, dropped } = partitionLessons(parsedLessons);
555
- const lowInfo = dropped.length;
556
- let added = 0;
557
- let skipped = 0;
558
- // Containment: per-lesson refusal must not abort the rest
559
- // of the git-log scan. No signature change (added/skipped return shape
560
- // used by cmdLearn + cmdSleepCore callers) — counted locally, folded into
561
- // the existing summary line.
562
- let rejected = 0;
563
- const gitLearnTags = ['error', 'git-learned'];
564
- const existingForSchema = loadAllEntries(hippoRoot, resolveTenantId({}));
565
- const keys = storedTextKeys(existingForSchema);
566
- for (const lesson of lessons) {
567
- if (keys.has(duplicateKey(lesson))) {
568
- skipped++;
569
- continue;
570
- }
571
- const target = extractInvalidationTarget(lesson);
572
- if (target) {
573
- const invResult = invalidateMatching(hippoRoot, target, resolveTenantId({}));
574
- if (invResult.invalidated > 0) {
575
- console.log(`${prefix} Invalidated ${invResult.invalidated} memories referencing "${target.from}"`);
576
- }
577
- }
578
- const schemaFitVal = computeSchemaFit(lesson, gitLearnTags, existingForSchema);
579
- const entry = createMemory(lesson, {
580
- layer: Layer.Episodic,
581
- tags: [...gitLearnTags],
582
- source: 'git-learn',
583
- confidence: 'observed',
584
- schema_fit: schemaFitVal,
585
- tenantId: resolveTenantId({}),
586
- baseHalfLifeDays: config.defaultHalfLifeDays,
587
- });
588
- // Auto-tag with path context from the repo being learned
589
- const learnPathTags = extractPathTags(repoPath);
590
- for (const pt of learnPathTags) {
591
- if (!entry.tags.includes(pt))
592
- entry.tags.push(pt);
593
- }
594
- try {
595
- writeEntry(hippoRoot, entry);
596
- }
597
- catch (err) {
598
- if (err instanceof RejectedValueError) {
599
- rejected++;
600
- continue;
601
- }
602
- throw err;
603
- }
604
- updateStats(hippoRoot, { remembered: 1 });
605
- keys.add(duplicateKey(lesson));
606
- void embedMemory(hippoRoot, entry);
607
- added++;
503
+ const { added, skipped, rejected, lowInfo } = result;
504
+ for (const { from, count } of result.invalidations) {
505
+ console.log(`${prefix} Invalidated ${count} memories referencing "${from}"`);
608
506
  }
609
507
  console.log(`${prefix}${added} new lessons added, ${skipped} duplicates skipped` +
610
508
  (rejected > 0 ? `, ${rejected} rejected value(s) skipped` : '') +
@@ -612,223 +510,6 @@ export function learnFromRepo(hippoRoot, repoPath, days, label) {
612
510
  '.');
613
511
  return { added, skipped, lowInfo };
614
512
  }
615
- export const HOOK_MARKERS = {
616
- start: '<!-- hippo:start -->',
617
- end: '<!-- hippo:end -->',
618
- };
619
- export const HOOKS = {
620
- 'claude-code': {
621
- file: 'CLAUDE.md',
622
- description: 'Claude Code',
623
- content: `
624
- ## Project Memory (Hippo)
625
-
626
- Pinned rules and recent writes auto-inject at every prompt via the installed
627
- UserPromptSubmit hook; never re-run that part manually. At the START of a
628
- task (not per prompt), additionally load task-specific context: git-aware
629
- recall over the full store that per-prompt injection does not cover. Also
630
- run it if the hook is not installed:
631
- \`\`\`bash
632
- hippo context --auto --budget 1500
633
- \`\`\`
634
-
635
- When you find out why something failed, record it right then, while you
636
- work, never as a closing step:
637
- \`\`\`bash
638
- hippo remember "<what went wrong and why>" --error
639
- \`\`\`
640
-
641
- The installed hooks store failed tool calls and capture the session when it
642
- ends, so there is nothing to run before you finish.
643
- `.trim(),
644
- },
645
- 'codex': {
646
- file: 'AGENTS.md',
647
- description: 'OpenAI Codex',
648
- content: `
649
- ## Project Memory (Hippo)
650
-
651
- At the start of every task, run:
652
- \`\`\`bash
653
- hippo context --auto --budget 1500
654
- \`\`\`
655
- Read the output before writing any code.
656
-
657
- On errors or unexpected behaviour, record it right then, while you work,
658
- never as a closing step:
659
- \`\`\`bash
660
- hippo remember "<description of what went wrong>" --error
661
- \`\`\`
662
-
663
- When you learn something that should outlive this session (a decision and
664
- its reason, a user preference, a lesson), record it right then, while you
665
- work, never as a closing step. Leave out secrets and personal details:
666
- \`\`\`bash
667
- hippo remember "<what you learned and why>"
668
- \`\`\`
669
-
670
- When Hippo's Codex wrapper is installed, session-end capture runs automatically.
671
- If the wrapper is not installed, capture a brief summary manually:
672
- \`\`\`bash
673
- hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
674
- \`\`\`
675
- `.trim(),
676
- },
677
- 'cursor': {
678
- file: 'AGENTS.md',
679
- description: 'Cursor',
680
- content: `
681
- ## Project Memory (Hippo)
682
-
683
- At the start of every task, run:
684
- \`\`\`bash
685
- hippo context --auto --budget 1500
686
- \`\`\`
687
- Read the output before writing any code.
688
-
689
- On errors or unexpected behaviour, record it right then, while you work,
690
- never as a closing step:
691
- \`\`\`bash
692
- hippo remember "<description of what went wrong>" --error
693
- \`\`\`
694
-
695
- When you learn something that should outlive this session (a decision and
696
- its reason, a user preference, a lesson), record it right then, while you
697
- work, never as a closing step. Leave out secrets and personal details:
698
- \`\`\`bash
699
- hippo remember "<what you learned and why>"
700
- \`\`\`
701
-
702
- When ending a session, capture a brief summary:
703
- \`\`\`bash
704
- hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
705
- \`\`\`
706
- `.trim(),
707
- },
708
- 'openclaw': {
709
- file: 'AGENTS.md',
710
- description: 'OpenClaw',
711
- content: `
712
- ## Project Memory (Hippo)
713
-
714
- At the start of every session, run:
715
- \`\`\`bash
716
- hippo context --auto --budget 1500
717
- \`\`\`
718
- Read the output before writing any code.
719
-
720
- On errors or unexpected behaviour, record it right then, while you work,
721
- never as a closing step:
722
- \`\`\`bash
723
- hippo remember "<description of what went wrong>" --error
724
- \`\`\`
725
-
726
- When you learn something that should outlive this session (a decision and
727
- its reason, a user preference, a lesson), record it right then, while you
728
- work, never as a closing step. Leave out secrets and personal details:
729
- \`\`\`bash
730
- hippo remember "<what you learned and why>"
731
- \`\`\`
732
-
733
- When ending a session, capture a brief summary:
734
- \`\`\`bash
735
- hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
736
- \`\`\`
737
- `.trim(),
738
- },
739
- 'opencode': {
740
- file: 'AGENTS.md',
741
- description: 'OpenCode',
742
- content: `
743
- ## Project Memory (Hippo)
744
-
745
- At the start of every task, run:
746
- \`\`\`bash
747
- hippo context --auto --budget 1500
748
- \`\`\`
749
- Read the output before writing any code.
750
-
751
- On errors or unexpected behaviour, record it right then, while you work,
752
- never as a closing step:
753
- \`\`\`bash
754
- hippo remember "<description of what went wrong>" --error
755
- \`\`\`
756
-
757
- When you learn something that should outlive this session (a decision and
758
- its reason, a user preference, a lesson), record it right then, while you
759
- work, never as a closing step. Leave out secrets and personal details:
760
- \`\`\`bash
761
- hippo remember "<what you learned and why>"
762
- \`\`\`
763
-
764
- When stuck or repeating yourself, check if this happened before:
765
- \`\`\`bash
766
- hippo recall "<what's going wrong>" --budget 2000
767
- \`\`\`
768
-
769
- When ending a session, capture a brief summary:
770
- \`\`\`bash
771
- hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
772
- \`\`\`
773
- `.trim(),
774
- },
775
- 'pi': {
776
- file: 'AGENTS.md',
777
- description: 'Pi',
778
- content: `
779
- ## Project Memory (Hippo)
780
-
781
- At the start of every session, run:
782
- \`\`\`bash
783
- hippo context --auto --budget 1500
784
- \`\`\`
785
- Read the output before writing any code.
786
-
787
- On errors or unexpected behaviour, record it right then, while you work,
788
- never as a closing step:
789
- \`\`\`bash
790
- hippo remember "<description of what went wrong>" --error
791
- \`\`\`
792
-
793
- When you learn something that should outlive this session (a decision and
794
- its reason, a user preference, a lesson), record it right then, while you
795
- work, never as a closing step. Leave out secrets and personal details:
796
- \`\`\`bash
797
- hippo remember "<what you learned and why>"
798
- \`\`\`
799
-
800
- When ending a session, capture a brief summary:
801
- \`\`\`bash
802
- hippo capture --stdin <<< '<decisions, errors, lessons: 2-5 bullets>'
803
- \`\`\`
804
-
805
- For full integration, copy the hippo-memory Pi extension to \`~/.pi/agent/extensions/hippo-memory/\`.
806
- `.trim(),
807
- },
808
- };
809
- // sha256 of each trimmed block an earlier hippo wrote, so init refreshes only blocks nobody edited. Add the old hash when a block changes.
810
- const SHIPPED_HOOK_HASHES = new Map([
811
- ['c04e48f2896a4fee9ae98f8f832e2d26a3910269df3beb5bcd6baee3cd9db68e', 'claude-code'],
812
- ['e6b12bd8983c032e5ca8e95a97aeff4178a5a05026d10acad5b2e1b25d5656dd', 'claude-code'],
813
- ['4c64e11d3e5be68fa547c9248d7553feb645a02f7cf13ba02f7275e1854baf44', 'claude-code'],
814
- ['293bd319bbc86225a0ee027490a3322a0336257f5832f7fade65e4ffb2530654', 'claude-code'],
815
- ['15abcece9712279fb4721f7a8f0ba117457400278977beb5cf5b5d7ba49f7b1a', 'codex'],
816
- ['0c81a6b2c21473313001f624b80ea870e661aecbfda9bfe8503febc0d5f34533', 'codex'],
817
- ['88e45358aba4f17912f113221c991dc758275991335d1daa4aa1974a69c46769', 'codex'],
818
- ['e61632fe177450a06541c148a9a4f9182530d8df667806927a99792825903298', 'codex'],
819
- ['a1415ecda9b2f8f317c233738e4a5ac16e6b2cc385a017c0c8ecfbfacbcab6a3', 'cursor'],
820
- ['a38c428bbdfc14ec50f6f7b9183785170a4eae1ce9cde60257cca6efc7206b3a', 'cursor'],
821
- ['0ec9f556abfd55e94f9e6fb47ece0fc5acb841977d144b35a2371e03645d8636', 'cursor'],
822
- ['40524c3bd5a2eb04036567cc761451961d950995768bccd93a9900b0f75eafea', 'openclaw'],
823
- ['7b3518e8c0feaa7b8b454cde7743f7598ad14cd9979e1680d0954484e2464aae', 'openclaw'],
824
- ['1137dcf04568caf011e41db77bc55324faee88bc29c3a5fcc98ab687cd952a16', 'openclaw'],
825
- ['4601c67c31f41cd5b1324cfccdb1afc66872b7fb0bc1e7c5789ecabb1f6bd942', 'opencode'],
826
- ['90d9e21d8d1ecbe99a0fc7b7f2d9f8af7b5315a6b4b0203df4f7a9bdc0699b98', 'opencode'],
827
- ['ca4e00284f1397ed2f2fcc53210c27f63b90edf6b37fd66dad5ee58b94ea3eee', 'opencode'],
828
- ['8b8f5986d7f7ed15f06e68720d8913c3cab23d94366b411935ca2bbaa334553b', 'pi'],
829
- ['37767b355e18beac726b05b9e2b898dab8c6135fd7b98f3aa52edc734d5dd283', 'pi'],
830
- ['6e85a5cccb3cfeaa9a080713754936db730f96376f94cc9a9888a746149c7268', 'pi'],
831
- ]);
832
513
  export function resolveAuthRoot(hippoRoot, flags) {
833
514
  if (flags['global']) {
834
515
  initGlobal();
@@ -837,4 +518,32 @@ export function resolveAuthRoot(hippoRoot, flags) {
837
518
  requireInit(hippoRoot);
838
519
  return hippoRoot;
839
520
  }
521
+ /** Hook commands share one handle per store and wait at most HOOK_DB_WAIT_MS for a lock; a store still busy after that skips the hook's work with one warning, exit 0. */
522
+ export async function runHookWithStores(fn) {
523
+ try {
524
+ return await withSharedStoreHandles(fn, { busyWaitMs: HOOK_DB_WAIT_MS });
525
+ }
526
+ catch (error) {
527
+ if (!isSqliteBusy(error))
528
+ throw error;
529
+ noteStoreBusy('hook skipped');
530
+ return undefined;
531
+ }
532
+ }
533
+ /**
534
+ * Whether this session sits in the pilot's holdout arm (src/pilot-arm.ts). Off at rate 0 and with no session id.
535
+ * `write` books the arm row; a read-only caller (env-only id, sub-agent) follows the stored arm, else the hash.
536
+ */
537
+ export function inPilotHoldout(hippoRoot, tenantId, sessionId, write) {
538
+ if (sessionId === undefined || sessionId.trim() === '')
539
+ return false;
540
+ const root = isInitialized(hippoRoot) ? hippoRoot : isInitialized(getGlobalRoot()) ? getGlobalRoot() : null;
541
+ if (root === null)
542
+ return false;
543
+ const rate = loadConfig(root).pilot.holdoutRateBp;
544
+ if (rate <= 0)
545
+ return false;
546
+ const arm = withLedgerDb(hippoRoot, (db) => write ? ensurePilotArm(db, tenantId, sessionId, rate) : readPilotArm(db, sessionId) ?? hashArm(sessionId, rate));
547
+ return (arm ?? hashArm(sessionId, rate)) === 'holdout';
548
+ }
840
549
  //# sourceMappingURL=shared.js.map
@@ -0,0 +1,2 @@
1
+ export declare function cmdSlack(hippoRoot: string, args: string[], flags: Record<string, string | boolean | string[]>): void;
2
+ //# sourceMappingURL=slack.d.ts.map
@@ -0,0 +1,171 @@
1
+ // `hippo slack`: backfill, dead-letter queue and workspace registry for the Slack connector.
2
+ import { envSlackBotToken, envSlackSigningSecret, envSlackTeamId } from '../env.js';
3
+ import { openHippoDb, closeHippoDb } from '../db.js';
4
+ import * as api from '../api.js';
5
+ import { resolveTenantId } from '../tenant.js';
6
+ import { listDlq, replayDlqEntry } from '../connectors/slack/dlq.js';
7
+ import { backfillChannel } from '../connectors/slack/backfill.js';
8
+ import { slackHistoryFetcher } from '../connectors/slack/web-client.js';
9
+ import { addWorkspace as addSlackWorkspace, listWorkspaces as listSlackWorkspaces, removeWorkspace as removeSlackWorkspace, } from '../connectors/slack/workspaces.js';
10
+ import { printError } from './output.js';
11
+ import { printSlackBackfillUsage, printSlackWorkspacesUsage } from './usage.js';
12
+ // ---------------------------------------------------------------------------
13
+ // Slack subcommands (E1.3 — `hippo slack backfill` / `hippo slack dlq list`)
14
+ // ---------------------------------------------------------------------------
15
+ function cmdSlackBackfill(hippoRoot, flags) {
16
+ const channel = typeof flags['channel'] === 'string' ? flags['channel'] : undefined;
17
+ if (!channel) {
18
+ printSlackBackfillUsage();
19
+ process.exit(1);
20
+ }
21
+ // Real fetcher requires SLACK_BOT_TOKEN with channels:history scope.
22
+ const token = envSlackBotToken();
23
+ if (!token) {
24
+ printError('SLACK_BOT_TOKEN is not set. Backfill requires a Slack bot token with channels:history scope.');
25
+ process.exit(2);
26
+ }
27
+ // --since is advisory in V1: the slack_cursors row drives resume, so the
28
+ // backfill loop always picks up where it last left off. Honoured-by-cursor
29
+ // semantics keep idempotency clean.
30
+ const sinceIso = flags['since'];
31
+ void sinceIso;
32
+ const fetcher = slackHistoryFetcher(token);
33
+ const ctx = {
34
+ hippoRoot,
35
+ tenantId: resolveTenantId({}),
36
+ actor: api.adminActor('cli:slack-backfill'),
37
+ };
38
+ backfillChannel(ctx, {
39
+ teamId: envSlackTeamId() ?? 'T_UNKNOWN',
40
+ channel: { id: channel, is_private: false },
41
+ fetcher,
42
+ })
43
+ .then((r) => {
44
+ console.log(`backfill ${channel}: ${r.ingested} new messages across ${r.pages} pages`);
45
+ })
46
+ .catch((e) => {
47
+ printError('backfill failed:', e.message);
48
+ process.exit(3);
49
+ });
50
+ }
51
+ function cmdSlackDlqList(hippoRoot, _flags) {
52
+ const db = openHippoDb(hippoRoot);
53
+ try {
54
+ const tenantId = resolveTenantId({});
55
+ const items = listDlq(db, { tenantId });
56
+ for (const it of items) {
57
+ console.log(`${it.id}\t${it.receivedAt}\t${it.error}`);
58
+ }
59
+ }
60
+ finally {
61
+ closeHippoDb(db);
62
+ }
63
+ }
64
+ function cmdSlackDlqReplay(hippoRoot, args, flags) {
65
+ const idArg = args[2];
66
+ if (!idArg) {
67
+ printError('Usage: hippo slack dlq replay <id> [--force]');
68
+ process.exit(1);
69
+ }
70
+ const id = Number(idArg);
71
+ if (!Number.isFinite(id) || !Number.isInteger(id) || id < 1) {
72
+ printError(`replay: invalid id ${idArg}`);
73
+ process.exit(1);
74
+ }
75
+ const force = flags.force === true;
76
+ const result = replayDlqEntry({ hippoRoot }, id, {
77
+ force,
78
+ signingSecret: envSlackSigningSecret(),
79
+ });
80
+ if (!result.ok) {
81
+ printError(`replay failed: status=${result.status} retry_count=${result.retryCount}${result.reason ? ` reason=${result.reason}` : ''}`);
82
+ process.exit(1);
83
+ }
84
+ console.log(`replay ok: status=${result.status} memory_id=${result.memoryId ?? '(none)'} retry_count=${result.retryCount}`);
85
+ }
86
+ function cmdSlackWorkspacesAdd(hippoRoot, flags) {
87
+ const teamId = typeof flags['team'] === 'string' ? flags['team'].trim() : '';
88
+ const tenantId = typeof flags['tenant'] === 'string' ? flags['tenant'].trim() : '';
89
+ if (!teamId || !tenantId) {
90
+ printError('Usage: hippo slack workspaces add --team <T> --tenant <t>');
91
+ process.exit(1);
92
+ }
93
+ const db = openHippoDb(hippoRoot);
94
+ try {
95
+ const ws = addSlackWorkspace(db, { teamId, tenantId });
96
+ console.log(`added: ${ws.teamId} -> ${ws.tenantId} (${ws.addedAt})`);
97
+ }
98
+ finally {
99
+ closeHippoDb(db);
100
+ }
101
+ }
102
+ function cmdSlackWorkspacesList(hippoRoot) {
103
+ const db = openHippoDb(hippoRoot);
104
+ try {
105
+ const items = listSlackWorkspaces(db);
106
+ if (items.length === 0) {
107
+ console.log('(no registered workspaces; routing via HIPPO_TENANT fallback)');
108
+ return;
109
+ }
110
+ for (const ws of items) {
111
+ console.log(`${ws.teamId}\t${ws.tenantId}\t${ws.addedAt}`);
112
+ }
113
+ }
114
+ finally {
115
+ closeHippoDb(db);
116
+ }
117
+ }
118
+ function cmdSlackWorkspacesRemove(hippoRoot, flags) {
119
+ const teamId = typeof flags['team'] === 'string' ? flags['team'].trim() : '';
120
+ if (!teamId) {
121
+ printError('Usage: hippo slack workspaces remove --team <T>');
122
+ process.exit(1);
123
+ }
124
+ const db = openHippoDb(hippoRoot);
125
+ try {
126
+ const removed = removeSlackWorkspace(db, teamId);
127
+ if (!removed) {
128
+ printError(`no workspace registered for team ${teamId}`);
129
+ process.exit(1);
130
+ }
131
+ console.log(`removed: ${teamId}`);
132
+ }
133
+ finally {
134
+ closeHippoDb(db);
135
+ }
136
+ }
137
+ export function cmdSlack(hippoRoot, args, flags) {
138
+ const sub = args[0];
139
+ if (sub === 'backfill') {
140
+ cmdSlackBackfill(hippoRoot, flags);
141
+ return;
142
+ }
143
+ if (sub === 'dlq' && args[1] === 'list') {
144
+ cmdSlackDlqList(hippoRoot, flags);
145
+ return;
146
+ }
147
+ if (sub === 'dlq' && args[1] === 'replay') {
148
+ cmdSlackDlqReplay(hippoRoot, args, flags);
149
+ return;
150
+ }
151
+ if (sub === 'workspaces') {
152
+ const action = args[1];
153
+ if (action === 'add') {
154
+ cmdSlackWorkspacesAdd(hippoRoot, flags);
155
+ return;
156
+ }
157
+ if (action === 'list') {
158
+ cmdSlackWorkspacesList(hippoRoot);
159
+ return;
160
+ }
161
+ if (action === 'remove') {
162
+ cmdSlackWorkspacesRemove(hippoRoot, flags);
163
+ return;
164
+ }
165
+ printSlackWorkspacesUsage();
166
+ process.exit(1);
167
+ }
168
+ printError('Usage: hippo slack <backfill|dlq list|dlq replay <id> [--force]|workspaces add|workspaces list|workspaces remove> [...]');
169
+ process.exit(1);
170
+ }
171
+ //# sourceMappingURL=slack.js.map
@@ -0,0 +1,18 @@
1
+ import { type CommandContext } from './shared.js';
2
+ export declare function cmdStatus(hippoRoot: string): void;
3
+ /**
4
+ * `hippo tokens [--days <n>] [--json] [--global]`: the token ledger
5
+ * (ROADMAP TE0). Tokens of memory text handed to agents per surface, blocks
6
+ * the per-prompt hook skipped as unchanged (TE2) and the tokens that saved,
7
+ * and the hook blocks' tokens later model calls re-read, counted when each session ends.
8
+ * Counts are estimates (characters / 4), the same estimate every budget uses.
9
+ */
10
+ export declare function cmdTokens(hippoRoot: string, flags: Record<string, string | boolean | string[]>): void;
11
+ /** `hippo failures [--days <n>] [--json] [--global]`: failed tool calls by outcome, and repeats across sessions (CD13). */
12
+ export declare function cmdFailures(hippoRoot: string, flags: Record<string, string | boolean | string[]>): void;
13
+ export declare function handleCorrectionLatency({ hippoRoot, flags }: CommandContext): void;
14
+ export declare function handleProvenance({ hippoRoot, flags }: CommandContext): void;
15
+ export declare function handleDoctor({ flags }: CommandContext): void;
16
+ export declare function handleSupportBundle({ flags }: CommandContext): void;
17
+ export declare function handleInspect({ hippoRoot, args }: CommandContext): void;
18
+ //# sourceMappingURL=status.d.ts.map