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
@@ -7,7 +7,7 @@
7
7
  * stays green. Used by the CLI (`hippo graph show` / `hippo graph view`) and the
8
8
  * HTTP `GET /v1/graph` route, which all build the same `GraphModel`.
9
9
  */
10
- import { type EntityType, type RelationType } from './graph.js';
10
+ import { type EntityType, type RelationType } from './graph/types.js';
11
11
  export interface GraphNode {
12
12
  id: number;
13
13
  type: EntityType;
@@ -7,7 +7,7 @@
7
7
  * stays green. Used by the CLI (`hippo graph show` / `hippo graph view`) and the
8
8
  * HTTP `GET /v1/graph` route, which all build the same `GraphModel`.
9
9
  */
10
- import { loadEntities, loadEntitiesByName, loadEntitiesByIds, loadRelations, loadNeighborRelations, loadRelationsAmong, withGraphReadSnapshot, } from './graph.js';
10
+ import { loadEntities, loadEntitiesByName, loadEntitiesByIds, loadRelations, loadNeighborRelations, loadRelationsAmong, withGraphReadSnapshot, } from './graph/read.js';
11
11
  /** Default bound for the CLI viewer / show so an unbounded set is never laid out. */
12
12
  export const DEFAULT_VIEW_LIMIT = 500;
13
13
  /**
@@ -21,7 +21,7 @@
21
21
  * moves memories of live decisions, incidents and other objects off the flat 90 days they used to get.
22
22
  */
23
23
  import { type MemoryEntry } from './memory.js';
24
- import { HALF_LIFE_BASE_META_KEY } from './store.js';
24
+ import { HALF_LIFE_BASE_META_KEY } from './store/open.js';
25
25
  /** The base every store used before the base was recorded. */
26
26
  export declare const LEGACY_HALF_LIFE_BASE = 7;
27
27
  /** The flat half-life the decision, incident and other object writers gave their memories before they took the default. */
@@ -21,7 +21,8 @@
21
21
  * moves memories of live decisions, incidents and other objects off the flat 90 days they used to get.
22
22
  */
23
23
  import { deriveHalfLife } from './memory.js';
24
- import { openStore, selectAllEntries, HALF_LIFE_BASE_META_KEY, TYPED_HALF_LIFE_META_KEY } from './store.js';
24
+ import { openStore, HALF_LIFE_BASE_META_KEY, TYPED_HALF_LIFE_META_KEY } from './store/open.js';
25
+ import { selectAllEntries } from './store/entry-reads.js';
25
26
  import { openHippoDb, closeHippoDb, getMeta, setMeta } from './db.js';
26
27
  import { appendAuditEvent } from './audit.js';
27
28
  import { loadConfig } from './config.js';
package/dist/handoff.js CHANGED
@@ -25,6 +25,7 @@ export function rowToSessionHandoff(row) {
25
25
  }
26
26
  }
27
27
  catch {
28
+ // A corrupt column degrades to empty instead of hiding the whole handoff.
28
29
  artifacts = [];
29
30
  }
30
31
  let constraints = [];
@@ -35,6 +36,7 @@ export function rowToSessionHandoff(row) {
35
36
  }
36
37
  }
37
38
  catch {
39
+ // Same degrade-to-empty rule as artifacts.
38
40
  constraints = [];
39
41
  }
40
42
  let evidence = null;
@@ -43,6 +45,7 @@ export function rowToSessionHandoff(row) {
43
45
  evidence = row.evidence_json ? JSON.parse(row.evidence_json) : null;
44
46
  }
45
47
  catch {
48
+ // Same degrade rule as artifacts: bad evidence reads as none.
46
49
  evidence = null;
47
50
  }
48
51
  return {
@@ -0,0 +1,8 @@
1
+ export interface CodexSessionTranscriptOptions {
2
+ codexHome: string;
3
+ historyPath: string;
4
+ startOffsetBytes: number;
5
+ startedAtMs: number;
6
+ }
7
+ export declare function resolveCodexSessionTranscript(options: CodexSessionTranscriptOptions): string | null;
8
+ //# sourceMappingURL=codex-session.d.ts.map
@@ -0,0 +1,76 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { isJsonString } from './shared.js';
4
+ function collectFiles(dir) {
5
+ if (!fs.existsSync(dir))
6
+ return [];
7
+ const out = [];
8
+ const stack = [dir];
9
+ while (stack.length > 0) {
10
+ const current = stack.pop();
11
+ if (current === undefined)
12
+ break;
13
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
14
+ const full = path.join(current, entry.name);
15
+ if (entry.isDirectory()) {
16
+ stack.push(full);
17
+ }
18
+ else if (entry.isFile()) {
19
+ out.push(full);
20
+ }
21
+ }
22
+ }
23
+ return out;
24
+ }
25
+ function readCodexSessionIdsFromHistoryDelta(historyPath, startOffsetBytes) {
26
+ if (!fs.existsSync(historyPath))
27
+ return [];
28
+ const raw = fs.readFileSync(historyPath);
29
+ if (startOffsetBytes >= raw.length)
30
+ return [];
31
+ const delta = raw.subarray(startOffsetBytes).toString('utf8');
32
+ const seen = new Set();
33
+ const ordered = [];
34
+ for (const line of delta.split('\n')) {
35
+ if (!line.trim())
36
+ continue;
37
+ try {
38
+ const parsed = JSON.parse(line);
39
+ const sessionId = parsed.session_id;
40
+ if (isJsonString(sessionId) && sessionId && !seen.has(sessionId)) {
41
+ seen.add(sessionId);
42
+ ordered.push(sessionId);
43
+ }
44
+ }
45
+ catch {
46
+ // ignore malformed JSONL lines
47
+ }
48
+ }
49
+ return ordered;
50
+ }
51
+ function findCodexTranscriptBySessionId(sessionsDir, sessionId) {
52
+ const matches = collectFiles(sessionsDir).filter((filePath) => filePath.endsWith('.jsonl') && filePath.includes(sessionId));
53
+ if (matches.length === 0)
54
+ return null;
55
+ matches.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
56
+ return matches[0];
57
+ }
58
+ function findNewestCodexTranscriptSince(sessionsDir, startedAtMs) {
59
+ const matches = collectFiles(sessionsDir)
60
+ .filter((filePath) => filePath.endsWith('.jsonl'))
61
+ .map((filePath) => ({ filePath, mtimeMs: fs.statSync(filePath).mtimeMs }))
62
+ .filter((entry) => entry.mtimeMs >= startedAtMs)
63
+ .sort((a, b) => b.mtimeMs - a.mtimeMs);
64
+ return matches[0]?.filePath ?? null;
65
+ }
66
+ export function resolveCodexSessionTranscript(options) {
67
+ const { codexHome, historyPath, startOffsetBytes, startedAtMs } = options;
68
+ const sessionsDir = path.join(codexHome, 'sessions');
69
+ for (const sessionId of readCodexSessionIdsFromHistoryDelta(historyPath, startOffsetBytes).reverse()) {
70
+ const transcript = findCodexTranscriptBySessionId(sessionsDir, sessionId);
71
+ if (transcript)
72
+ return transcript;
73
+ }
74
+ return findNewestCodexTranscriptSince(sessionsDir, startedAtMs);
75
+ }
76
+ //# sourceMappingURL=codex-session.js.map
@@ -0,0 +1,55 @@
1
+ export interface CodexWrapperPaths {
2
+ wrapperDir: string;
3
+ metadataPath: string;
4
+ wrapperCmdPath: string;
5
+ wrapperPs1Path: string;
6
+ wrapperShPath: string;
7
+ logFile: string;
8
+ runsDir: string;
9
+ codexHome: string;
10
+ historyPath: string;
11
+ }
12
+ export interface CodexWrapperInstallResult {
13
+ installed: boolean;
14
+ metadataPath: string;
15
+ realCodexPath: string;
16
+ commandPath: string;
17
+ backupPath: string;
18
+ installMode: 'same-path' | 'cmd-shim';
19
+ }
20
+ export interface CodexWrapperMetadata {
21
+ originalCodexPath: string;
22
+ realCodexPath: string;
23
+ commandPath: string;
24
+ backupPath: string;
25
+ installMode: 'same-path' | 'cmd-shim';
26
+ logFile: string;
27
+ installedAt: string;
28
+ }
29
+ export interface EnsureCodexWrapperResult {
30
+ status: 'installed' | 'already-installed' | 'not-found' | 'source-checkout';
31
+ metadataPath?: string;
32
+ realCodexPath?: string;
33
+ commandPath?: string;
34
+ backupPath?: string;
35
+ }
36
+ export declare function resolveCodexWrapperPaths(): CodexWrapperPaths;
37
+ export declare function detectRealCodexPath(): string | null;
38
+ export declare function installCodexWrapper(realCodexPath?: string): CodexWrapperInstallResult;
39
+ export declare function uninstallCodexWrapper(): boolean;
40
+ export declare function ensureCodexWrapperInstalled(): EnsureCodexWrapperResult;
41
+ /**
42
+ * True if Codex wrapper metadata exists on this machine, i.e. the user opted
43
+ * in to the wrapper at some point (via `hippo hook install codex`).
44
+ */
45
+ export declare function isCodexWrapperInstalled(): boolean;
46
+ /**
47
+ * Repair-only variant of `ensureCodexWrapperInstalled`: re-ensures the wrapper
48
+ * ONLY when wrapper metadata already exists — that metadata is the user's
49
+ * opt-in record. Never performs a first install. Replacing another vendor's
50
+ * binary must stay behind the explicit `hippo hook install codex` command;
51
+ * doing it from postinstall or routine commands is a consent violation and
52
+ * reads as binary hijacking to security scanners (issue #133).
53
+ */
54
+ export declare function repairCodexWrapperIfInstalled(hippoCliPath?: string): EnsureCodexWrapperResult;
55
+ //# sourceMappingURL=codex-wrapper.d.ts.map
@@ -0,0 +1,288 @@
1
+ import { envPath } from '../env.js';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { isJsonString, HIPPO_CODEX_WRAPPER_MARKER, homeDir, codexHomeDir, ensureDir } from './shared.js';
6
+ export function resolveCodexWrapperPaths() {
7
+ const home = homeDir();
8
+ const codexHome = codexHomeDir(home);
9
+ const wrapperDir = path.join(home, '.hippo', 'bin');
10
+ return {
11
+ wrapperDir,
12
+ metadataPath: path.join(home, '.hippo', 'integrations', 'codex.json'),
13
+ wrapperCmdPath: path.join(wrapperDir, 'codex.cmd'),
14
+ wrapperPs1Path: path.join(wrapperDir, 'codex.ps1'),
15
+ wrapperShPath: path.join(wrapperDir, 'codex'),
16
+ logFile: path.join(home, '.hippo', 'logs', 'codex-sleep.log'),
17
+ runsDir: path.join(home, '.hippo', 'runs', 'codex'),
18
+ codexHome,
19
+ historyPath: path.join(codexHome, 'history.jsonl'),
20
+ };
21
+ }
22
+ function pathEquals(a, b) {
23
+ return path.resolve(a).toLowerCase() === path.resolve(b).toLowerCase();
24
+ }
25
+ function readCodexWrapperMetadata() {
26
+ const { metadataPath } = resolveCodexWrapperPaths();
27
+ if (!fs.existsSync(metadataPath))
28
+ return null;
29
+ try {
30
+ // This optimistic parse is never trusted directly — every call site reads fields off
31
+ // the result only after isCodexWrapperMetadataValid has runtime-checked each string
32
+ // field and the referenced paths.
33
+ const parsed = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
34
+ return parsed;
35
+ }
36
+ catch {
37
+ // Unreadable metadata is treated like the missing-file case above.
38
+ return null;
39
+ }
40
+ }
41
+ function readTextFile(filePath) {
42
+ try {
43
+ return fs.readFileSync(filePath, 'utf8');
44
+ }
45
+ catch {
46
+ // Callers treat an unreadable file as absent.
47
+ return null;
48
+ }
49
+ }
50
+ function isHippoCodexWrapperFile(filePath) {
51
+ if (!fs.existsSync(filePath))
52
+ return false;
53
+ const text = readTextFile(filePath);
54
+ return text !== null && text.includes(HIPPO_CODEX_WRAPPER_MARKER);
55
+ }
56
+ function isCodexWrapperMetadataValid(metadata) {
57
+ if (!metadata)
58
+ return false;
59
+ return (isJsonString(metadata.originalCodexPath) &&
60
+ isJsonString(metadata.realCodexPath) &&
61
+ isJsonString(metadata.commandPath) &&
62
+ isJsonString(metadata.backupPath) &&
63
+ fs.existsSync(metadata.realCodexPath) &&
64
+ fs.existsSync(metadata.backupPath) &&
65
+ isHippoCodexWrapperFile(metadata.commandPath));
66
+ }
67
+ function resolveHippoCliPath() {
68
+ return fileURLToPath(new URL('../bin/hippo.js', import.meta.url));
69
+ }
70
+ function quoteForShell(value) {
71
+ return `"${value.replace(/(["\\$`])/g, '\\$1')}"`;
72
+ }
73
+ function quoteForPowerShell(value) {
74
+ return `'${value.replace(/'/g, "''")}'`;
75
+ }
76
+ function quoteForCmd(value) {
77
+ return `"${value.replace(/"/g, '""')}"`;
78
+ }
79
+ function resolveCodexInstallPlan(originalCodexPath) {
80
+ const dir = path.dirname(originalCodexPath);
81
+ const ext = path.extname(originalCodexPath).toLowerCase();
82
+ const name = path.basename(originalCodexPath, ext);
83
+ const backupPath = path.join(dir, `${name}.hippo-real${ext}`);
84
+ if (process.platform === 'win32' && ext === '.exe') {
85
+ return {
86
+ commandPath: path.join(dir, `${name}.cmd`),
87
+ backupPath,
88
+ installMode: 'cmd-shim',
89
+ };
90
+ }
91
+ return {
92
+ commandPath: originalCodexPath,
93
+ backupPath,
94
+ installMode: 'same-path',
95
+ };
96
+ }
97
+ function writeCodexLauncherWrapper(commandPath) {
98
+ const ext = path.extname(commandPath).toLowerCase();
99
+ const nodePath = process.execPath;
100
+ const hippoCliPath = resolveHippoCliPath();
101
+ if (process.platform === 'win32' && ext === '.ps1') {
102
+ writeExecutableFile(commandPath, [
103
+ `# ${HIPPO_CODEX_WRAPPER_MARKER}`,
104
+ `& ${quoteForPowerShell(nodePath)} ${quoteForPowerShell(hippoCliPath)} codex-run -- @args`,
105
+ '',
106
+ ].join('\n'));
107
+ return;
108
+ }
109
+ if (process.platform === 'win32' && (ext === '.cmd' || ext === '.bat')) {
110
+ writeExecutableFile(commandPath, [
111
+ '@echo off',
112
+ `REM ${HIPPO_CODEX_WRAPPER_MARKER}`,
113
+ `${quoteForCmd(nodePath)} ${quoteForCmd(hippoCliPath)} codex-run -- %*`,
114
+ '',
115
+ ].join('\r\n'));
116
+ return;
117
+ }
118
+ writeExecutableFile(commandPath, [
119
+ '#!/usr/bin/env sh',
120
+ `# ${HIPPO_CODEX_WRAPPER_MARKER}`,
121
+ `exec ${quoteForShell(nodePath)} ${quoteForShell(hippoCliPath)} codex-run -- "$@"`,
122
+ '',
123
+ ].join('\n'));
124
+ }
125
+ function cleanupLegacyCodexPathWrappers(paths) {
126
+ for (const filePath of [paths.wrapperCmdPath, paths.wrapperPs1Path, paths.wrapperShPath]) {
127
+ if (fs.existsSync(filePath))
128
+ fs.rmSync(filePath, { force: true });
129
+ }
130
+ }
131
+ export function detectRealCodexPath() {
132
+ const metadata = readCodexWrapperMetadata();
133
+ if (isCodexWrapperMetadataValid(metadata))
134
+ return metadata.realCodexPath;
135
+ const { wrapperDir } = resolveCodexWrapperPaths();
136
+ const entries = (envPath() ?? '')
137
+ .split(path.delimiter)
138
+ .map((entry) => entry.trim())
139
+ .filter(Boolean)
140
+ .filter((entry) => !pathEquals(entry, wrapperDir));
141
+ const names = process.platform === 'win32'
142
+ ? ['codex.cmd', 'codex.ps1', 'codex.exe', 'codex']
143
+ : ['codex'];
144
+ for (const entry of entries) {
145
+ for (const name of names) {
146
+ const candidate = path.join(entry, name);
147
+ if (fs.existsSync(candidate))
148
+ return candidate;
149
+ }
150
+ }
151
+ return null;
152
+ }
153
+ function writeExecutableFile(filePath, content) {
154
+ fs.writeFileSync(filePath, content, 'utf8');
155
+ try {
156
+ fs.chmodSync(filePath, 0o755);
157
+ }
158
+ catch {
159
+ // chmod is best-effort on Windows
160
+ }
161
+ }
162
+ export function installCodexWrapper(realCodexPath) {
163
+ const existingMetadata = readCodexWrapperMetadata();
164
+ if (isCodexWrapperMetadataValid(existingMetadata) && !realCodexPath) {
165
+ cleanupLegacyCodexPathWrappers(resolveCodexWrapperPaths());
166
+ return {
167
+ installed: true,
168
+ metadataPath: resolveCodexWrapperPaths().metadataPath,
169
+ realCodexPath: existingMetadata.realCodexPath,
170
+ commandPath: existingMetadata.commandPath,
171
+ backupPath: existingMetadata.backupPath,
172
+ installMode: existingMetadata.installMode,
173
+ };
174
+ }
175
+ const resolvedRealCodexPath = realCodexPath ?? detectRealCodexPath();
176
+ if (!resolvedRealCodexPath) {
177
+ throw new Error('Could not locate the real Codex executable on PATH.');
178
+ }
179
+ const paths = resolveCodexWrapperPaths();
180
+ ensureDir(path.dirname(paths.metadataPath));
181
+ ensureDir(path.dirname(paths.logFile));
182
+ ensureDir(paths.runsDir);
183
+ cleanupLegacyCodexPathWrappers(paths);
184
+ const plan = resolveCodexInstallPlan(resolvedRealCodexPath);
185
+ ensureDir(path.dirname(plan.commandPath));
186
+ if (isCodexWrapperMetadataValid(existingMetadata)) {
187
+ uninstallCodexWrapper();
188
+ }
189
+ if (!fs.existsSync(plan.backupPath)) {
190
+ fs.renameSync(resolvedRealCodexPath, plan.backupPath);
191
+ }
192
+ writeCodexLauncherWrapper(plan.commandPath);
193
+ const metadata = {
194
+ originalCodexPath: resolvedRealCodexPath,
195
+ realCodexPath: plan.backupPath,
196
+ commandPath: plan.commandPath,
197
+ backupPath: plan.backupPath,
198
+ installMode: plan.installMode,
199
+ logFile: paths.logFile,
200
+ installedAt: new Date().toISOString(),
201
+ };
202
+ fs.writeFileSync(paths.metadataPath, JSON.stringify(metadata, null, 2) + '\n', 'utf8');
203
+ return {
204
+ installed: true,
205
+ metadataPath: paths.metadataPath,
206
+ realCodexPath: metadata.realCodexPath,
207
+ commandPath: metadata.commandPath,
208
+ backupPath: metadata.backupPath,
209
+ installMode: metadata.installMode,
210
+ };
211
+ }
212
+ export function uninstallCodexWrapper() {
213
+ const paths = resolveCodexWrapperPaths();
214
+ let changed = false;
215
+ const metadata = readCodexWrapperMetadata();
216
+ if (metadata) {
217
+ if (fs.existsSync(metadata.commandPath) && isHippoCodexWrapperFile(metadata.commandPath)) {
218
+ fs.rmSync(metadata.commandPath, { force: true });
219
+ changed = true;
220
+ }
221
+ if (fs.existsSync(metadata.backupPath)) {
222
+ fs.renameSync(metadata.backupPath, metadata.originalCodexPath);
223
+ changed = true;
224
+ }
225
+ }
226
+ cleanupLegacyCodexPathWrappers(paths);
227
+ if (fs.existsSync(paths.metadataPath)) {
228
+ fs.rmSync(paths.metadataPath, { force: true });
229
+ changed = true;
230
+ }
231
+ return changed;
232
+ }
233
+ export function ensureCodexWrapperInstalled() {
234
+ const metadata = readCodexWrapperMetadata();
235
+ if (isCodexWrapperMetadataValid(metadata)) {
236
+ cleanupLegacyCodexPathWrappers(resolveCodexWrapperPaths());
237
+ return {
238
+ status: 'already-installed',
239
+ metadataPath: resolveCodexWrapperPaths().metadataPath,
240
+ realCodexPath: metadata.realCodexPath,
241
+ commandPath: metadata.commandPath,
242
+ backupPath: metadata.backupPath,
243
+ };
244
+ }
245
+ if (metadata) {
246
+ uninstallCodexWrapper();
247
+ }
248
+ const detectedRealCodexPath = detectRealCodexPath();
249
+ if (!detectedRealCodexPath) {
250
+ return { status: 'not-found' };
251
+ }
252
+ const result = installCodexWrapper(detectedRealCodexPath);
253
+ return {
254
+ status: 'installed',
255
+ metadataPath: result.metadataPath,
256
+ realCodexPath: result.realCodexPath,
257
+ commandPath: result.commandPath,
258
+ backupPath: result.backupPath,
259
+ };
260
+ }
261
+ /**
262
+ * True if Codex wrapper metadata exists on this machine, i.e. the user opted
263
+ * in to the wrapper at some point (via `hippo hook install codex`).
264
+ */
265
+ export function isCodexWrapperInstalled() {
266
+ return readCodexWrapperMetadata() !== null;
267
+ }
268
+ /**
269
+ * Repair-only variant of `ensureCodexWrapperInstalled`: re-ensures the wrapper
270
+ * ONLY when wrapper metadata already exists — that metadata is the user's
271
+ * opt-in record. Never performs a first install. Replacing another vendor's
272
+ * binary must stay behind the explicit `hippo hook install codex` command;
273
+ * doing it from postinstall or routine commands is a consent violation and
274
+ * reads as binary hijacking to security scanners (issue #133).
275
+ */
276
+ export function repairCodexWrapperIfInstalled(hippoCliPath = resolveHippoCliPath()) {
277
+ if (readCodexWrapperMetadata() === null) {
278
+ return { status: 'not-found' };
279
+ }
280
+ // A checkout's own `npm install` or CLI would point the user's launcher at a folder that may be deleted.
281
+ // SHORTCUT: any node_modules copy (npx cache, a project dependency) still repairs; record the opted-in CLI path in the metadata to close that.
282
+ const packageDir = path.dirname(path.dirname(hippoCliPath));
283
+ if (path.basename(path.dirname(packageDir)).toLowerCase() !== 'node_modules') {
284
+ return { status: 'source-checkout' };
285
+ }
286
+ return ensureCodexWrapperInstalled();
287
+ }
288
+ //# sourceMappingURL=codex-wrapper.js.map
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Hook install/uninstall for AI coding tools.
3
+ *
4
+ * Two integration models live in this file:
5
+ *
6
+ * 1. JSON-hook install (Claude Code only). Writes a `hooks` block into the
7
+ * tool's settings.json with two entries:
8
+ * - SessionEnd: `hippo session-end --log-file <path>` - spawns a detached
9
+ * child that runs `hippo sleep` then `hippo capture --last-session` in
10
+ * sequence, writing both outputs to the log file. The parent returns in
11
+ * <100ms so the TUI teardown can't kill the child before it finishes.
12
+ * - SessionStart: `hippo last-sleep --path <path>` - prints the log
13
+ * written by the previous session's detached worker to stderr, which
14
+ * keeps it out of the model's context, and then clears it.
15
+ * Earlier Claude Code forms are detected and migrated automatically:
16
+ * - < 0.20.2: `Stop` hook firing `hippo sleep` on every assistant turn.
17
+ * - < 0.21.0: bare `hippo sleep` in SessionEnd, no `--log-file`.
18
+ * - 0.22.x: separate sleep + capture SessionEnd entries.
19
+ * PreCompact and PostCompact entries go in too: the first records the compaction and
20
+ * asks the summariser for a "Memories for hippo" list, the second saves that list.
21
+ * Codex's hooks.json gets only two groups (per-prompt memory and
22
+ * compact-resume); see installCodexHooks.
23
+ *
24
+ * 2. Plugin install (OpenCode only). OpenCode does NOT share Claude Code's
25
+ * JSON-hook schema — its config has `additionalProperties: false` and no
26
+ * `hooks` key, so v1.10.x-v1.11.1's JSON-hook installer broke opencode
27
+ * launch (issue #24). Hippo now installs a TypeScript plugin at
28
+ * `~/.config/opencode/plugins/hippo.ts` subscribing to opencode's
29
+ * `session.idle` (→ `hippo session-end`) and `session.created` (→
30
+ * `hippo last-sleep`) events. See OPENCODE_PLUGIN_SOURCE below for the
31
+ * plugin file content + design rationale; see installOpencodePlugin for
32
+ * the installer + the migration that removes any pre-existing broken
33
+ * `hooks` block from opencode.json.
34
+ */
35
+ import { type JsonHookTarget } from './shared.js';
36
+ export interface JsonHookPaths {
37
+ settings: string;
38
+ logFile: string;
39
+ display: string;
40
+ }
41
+ export interface InstallResult {
42
+ target: JsonHookTarget;
43
+ settingsPath: string;
44
+ installedSessionEnd: boolean;
45
+ installedSessionStart: boolean;
46
+ installedUserPromptSubmit: boolean;
47
+ installedPreCompact: boolean;
48
+ installedCompactResume: boolean;
49
+ /** PostCompact -> `hippo post-compact` (saves the summary's memories, tells the user how many). */
50
+ installedPostCompact: boolean;
51
+ /** PostToolUseFailure -> `hippo capture-error` (failed tool calls become error memories). */
52
+ installedCaptureError: boolean;
53
+ migratedPinnedInjectRecent: boolean;
54
+ migratedFromStop: boolean;
55
+ migratedLegacySessionEnd: boolean;
56
+ migratedSplitSessionEnd: boolean;
57
+ /** The file exists but is not JSON hippo can merge into, so it was left untouched. */
58
+ invalidJson: boolean;
59
+ }
60
+ export declare function resolveJsonHookPaths(target: JsonHookTarget): JsonHookPaths;
61
+ export declare function installJsonHooks(target: JsonHookTarget): InstallResult;
62
+ export declare function uninstallJsonHooks(target: JsonHookTarget): boolean;
63
+ //# sourceMappingURL=json-hooks.d.ts.map