@askexenow/exe-os 0.9.288 → 0.9.290

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 (444) hide show
  1. package/deploy/compose/README.md +6 -0
  2. package/deploy/compose/docker-compose.yml +48 -53
  3. package/dist/active-agent-DVMG6WVY.js +27 -0
  4. package/dist/active-agent-JJVXXRZV.js +26 -0
  5. package/dist/active-agent-L22OENGJ.js +26 -0
  6. package/dist/active-agent-SVG6F6HY.js +27 -0
  7. package/dist/agentic-ontology-2LJST3BE.js +25 -0
  8. package/dist/agentic-ontology-3GHJHLDY.js +25 -0
  9. package/dist/backfill-metadata-HJNVBORD.js +599 -0
  10. package/dist/backfill-metadata-W7PJ6YGP.js +599 -0
  11. package/dist/background-jobs-YTYZRTCM.js +25 -0
  12. package/dist/behaviors-EM5KZSHT.js +39 -0
  13. package/dist/behaviors-ROOZS234.js +39 -0
  14. package/dist/bin/age-ontology-load.js +2 -2
  15. package/dist/bin/agentic-ontology-backfill.js +8 -8
  16. package/dist/bin/agentic-reflection-backfill.js +9 -9
  17. package/dist/bin/agentic-semantic-label.js +8 -8
  18. package/dist/bin/backfill-conversations.js +8 -8
  19. package/dist/bin/backfill-responses.js +8 -8
  20. package/dist/bin/backfill-vectors.js +104 -19
  21. package/dist/bin/bulk-sync-postgres.js +9 -9
  22. package/dist/bin/cc-doctor.js +7 -7
  23. package/dist/bin/cleanup-stale-review-tasks.js +13 -13
  24. package/dist/bin/cli.js +56 -20
  25. package/dist/bin/deferred-daemon-restart.js +1 -1
  26. package/dist/bin/exe-agent-config.js +5 -5
  27. package/dist/bin/exe-agent.js +6 -6
  28. package/dist/bin/exe-assign.js +10 -10
  29. package/dist/bin/exe-boot.js +20 -20
  30. package/dist/bin/exe-call.js +6 -6
  31. package/dist/bin/exe-cloud.js +27 -9
  32. package/dist/bin/exe-dispatch.js +13 -13
  33. package/dist/bin/exe-doctor.js +1 -1
  34. package/dist/bin/exe-export-behaviors.js +9 -9
  35. package/dist/bin/exe-forget.js +8 -8
  36. package/dist/bin/exe-gateway.js +9 -9
  37. package/dist/bin/exe-healthcheck.js +7 -7
  38. package/dist/bin/exe-heartbeat.js +13 -13
  39. package/dist/bin/exe-kill.js +16 -16
  40. package/dist/bin/exe-launch-agent.js +20 -20
  41. package/dist/bin/exe-new-employee.js +9 -9
  42. package/dist/bin/exe-pending-messages.js +14 -14
  43. package/dist/bin/exe-pending-notifications.js +13 -13
  44. package/dist/bin/exe-pending-reviews.js +13 -13
  45. package/dist/bin/exe-rename.js +6 -6
  46. package/dist/bin/exe-review.js +15 -15
  47. package/dist/bin/exe-search.js +7 -7
  48. package/dist/bin/exe-session-cleanup.js +18 -18
  49. package/dist/bin/exe-settings.js +8 -8
  50. package/dist/bin/exe-start-codex.js +13 -13
  51. package/dist/bin/exe-start-opencode.js +10 -10
  52. package/dist/bin/exe-start.sh +29 -7
  53. package/dist/bin/exe-status.js +14 -14
  54. package/dist/bin/exe-support.js +3 -3
  55. package/dist/bin/exe-team.js +5 -5
  56. package/dist/bin/git-sweep.js +14 -14
  57. package/dist/bin/graph-backfill.js +7 -7
  58. package/dist/bin/graph-export.js +7 -7
  59. package/dist/bin/import-history.js +9 -9
  60. package/dist/bin/install-launchd.js +24 -1
  61. package/dist/bin/install.js +36 -12
  62. package/dist/bin/intercom-check.js +4 -4
  63. package/dist/bin/mcp-sessions.js +2 -2
  64. package/dist/bin/orchestration-metrics.js +6 -6
  65. package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
  66. package/dist/bin/postgres-agentic-semantic-backfill.js +3 -3
  67. package/dist/bin/scan-tasks.js +13 -13
  68. package/dist/bin/setup.js +2 -2
  69. package/dist/bin/shard-migrate.js +7 -7
  70. package/dist/bin/stack-update.js +7 -6
  71. package/dist/bin/vps-health-gate.js +1 -1
  72. package/dist/branding-PCLBJ3EP.js +97 -0
  73. package/dist/capability-cards-O6XB2AU4.js +88 -0
  74. package/dist/capability-cards-OEL47N2B.js +88 -0
  75. package/dist/capacity-monitor-UGMHVSUD.js +50 -0
  76. package/dist/capacity-monitor-ZE7CFVWH.js +50 -0
  77. package/dist/catchup-brief-3NONSIMA.js +174 -0
  78. package/dist/catchup-brief-HNEUKB7X.js +174 -0
  79. package/dist/chunk-232DHK5C.js +1119 -0
  80. package/dist/chunk-272SJ4RN.js +129 -0
  81. package/dist/chunk-2F5SG3CE.js +230 -0
  82. package/dist/chunk-2QMWIGJK.js +197 -0
  83. package/dist/chunk-2ZAOSGBX.js +668 -0
  84. package/dist/chunk-32K5NWMR.js +42 -0
  85. package/dist/chunk-32VOJ4GK.js +181 -0
  86. package/dist/chunk-3AUM4JVV.js +127 -0
  87. package/dist/chunk-3Q4UEXDE.js +297 -0
  88. package/dist/chunk-3RZNDPPW.js +2113 -0
  89. package/dist/chunk-3X2ZT5FN.js +3276 -0
  90. package/dist/chunk-44CP7NR2.js +333 -0
  91. package/dist/chunk-4FMNDJMY.js +50 -0
  92. package/dist/chunk-4NMTGHUE.js +127 -0
  93. package/dist/chunk-5J2L25OK.js +203 -0
  94. package/dist/chunk-5NQOIKAB.js +214 -0
  95. package/dist/chunk-5P3HOBZX.js +487 -0
  96. package/dist/chunk-5PLW3QL6.js +668 -0
  97. package/dist/chunk-5VAARLQR.js +58 -0
  98. package/dist/chunk-64GBV67L.js +1068 -0
  99. package/dist/chunk-66EIYAF2.js +157 -0
  100. package/dist/chunk-6IPJF5QD.js +630 -0
  101. package/dist/chunk-6MFM4N37.js +574 -0
  102. package/dist/chunk-6NSJTOXE.js +122 -0
  103. package/dist/chunk-6TLURATK.js +4318 -0
  104. package/dist/chunk-6WEETM7D.js +81 -0
  105. package/dist/chunk-6ZD3MW7T.js +97 -0
  106. package/dist/chunk-73JAJQRY.js +85 -0
  107. package/dist/chunk-73ORCJNJ.js +231 -0
  108. package/dist/chunk-75GH76GO.js +129 -0
  109. package/dist/chunk-7CHKD5IP.js +38 -0
  110. package/dist/chunk-7FTKXL5A.js +286 -0
  111. package/dist/chunk-7GTKCVVG.js +735 -0
  112. package/dist/chunk-7IRQSO3F.js +735 -0
  113. package/dist/chunk-7K4YVOAK.js +76 -0
  114. package/dist/chunk-7LOYIUOF.js +456 -0
  115. package/dist/chunk-7MINWZ3J.js +214 -0
  116. package/dist/chunk-7T5PS5DG.js +14439 -0
  117. package/dist/chunk-7XUJF3LZ.js +284 -0
  118. package/dist/chunk-A74WXY4S.js +227 -0
  119. package/dist/chunk-AVD5C3NG.js +197 -0
  120. package/dist/chunk-B36MRLEP.js +58 -0
  121. package/dist/chunk-B4TCZ3PS.js +373 -0
  122. package/dist/chunk-BJYLTU2G.js +621 -0
  123. package/dist/chunk-BPLEJ3EU.js +411 -0
  124. package/dist/chunk-BR2OA4AZ.js +123 -0
  125. package/dist/chunk-BTDPLFGK.js +221 -0
  126. package/dist/chunk-BTP3LPMP.js +210 -0
  127. package/dist/chunk-BU45UYTK.js +185 -0
  128. package/dist/chunk-BYOEIN37.js +176 -0
  129. package/dist/chunk-CCAA6XOZ.js +284 -0
  130. package/dist/chunk-CMDKYYFK.js +630 -0
  131. package/dist/chunk-D6LUKYKM.js +731 -0
  132. package/dist/chunk-DBQ6I6K2.js +3276 -0
  133. package/dist/chunk-DDWFHEPG.js +345 -0
  134. package/dist/chunk-DFSI6HFJ.js +2078 -0
  135. package/dist/chunk-DJLDKRXK.js +30 -0
  136. package/dist/chunk-DSOKTUTT.js +167 -0
  137. package/dist/chunk-EESAZNRC.js +348 -0
  138. package/dist/chunk-EQY6GDVD.js +369 -0
  139. package/dist/chunk-ETCARC76.js +836 -0
  140. package/dist/chunk-EYLU6MJT.js +192 -0
  141. package/dist/chunk-EZHTLPOS.js +280 -0
  142. package/dist/chunk-F23GFLKY.js +4318 -0
  143. package/dist/chunk-F3DQ3HDH.js +333 -0
  144. package/dist/chunk-F5SADWWW.js +240 -0
  145. package/dist/chunk-F6ZCUDCN.js +244 -0
  146. package/dist/chunk-FE6HKM2N.js +157 -0
  147. package/dist/chunk-FI5Q6F5S.js +382 -0
  148. package/dist/chunk-FNQZGNSG.js +1094 -0
  149. package/dist/chunk-FTG36JG5.js +280 -0
  150. package/dist/chunk-FVKTXXKK.js +128 -0
  151. package/dist/chunk-FZDW76SH.js +89 -0
  152. package/dist/chunk-G6GC2YSP.js +262 -0
  153. package/dist/chunk-HH2JVSKL.js +1157 -0
  154. package/dist/chunk-HHR5NB6N.js +377 -0
  155. package/dist/chunk-HJQQ7746.js +185 -0
  156. package/dist/chunk-HLFNLJSB.js +271 -0
  157. package/dist/chunk-HRZLGHT6.js +290 -0
  158. package/dist/chunk-HSSRWMVA.js +68 -0
  159. package/dist/chunk-HX735WX7.js +33 -0
  160. package/dist/chunk-I3NVB5MG.js +85 -0
  161. package/dist/chunk-I7Z6MK2B.js +240 -0
  162. package/dist/chunk-ID4SMRYX.js +2078 -0
  163. package/dist/chunk-IUQBMSBI.js +1350 -0
  164. package/dist/chunk-J6PDP2GY.js +221 -0
  165. package/dist/chunk-JGOGSH55.js +14378 -0
  166. package/dist/chunk-JRZ47IFL.js +82 -0
  167. package/dist/chunk-JXGHDROV.js +546 -0
  168. package/dist/chunk-JZEROVAU.js +546 -0
  169. package/dist/chunk-KFHAVF6J.js +97 -0
  170. package/dist/chunk-KJALZ6F6.js +128 -0
  171. package/dist/chunk-KMAIBYV3.js +402 -0
  172. package/dist/chunk-KMTNAXIB.js +54 -0
  173. package/dist/chunk-KQY4QIEN.js +731 -0
  174. package/dist/chunk-LHW7TZGJ.js +244 -0
  175. package/dist/chunk-LIH36DXG.js +159 -0
  176. package/dist/chunk-LRSU2ZU2.js +38 -0
  177. package/dist/chunk-M3VHV2RV.js +106 -0
  178. package/dist/chunk-MFCL4GAN.js +2113 -0
  179. package/dist/chunk-MFGMVKGM.js +150 -0
  180. package/dist/chunk-MFTGN7KN.js +411 -0
  181. package/dist/chunk-MUHKJCF7.js +128 -0
  182. package/dist/chunk-NHGBVLCD.js +210 -0
  183. package/dist/chunk-NOEBJMNN.js +33 -0
  184. package/dist/chunk-NQ2VNTGL.js +538 -0
  185. package/dist/chunk-NV5SSKZE.js +171 -0
  186. package/dist/chunk-NXJ2CP2C.js +290 -0
  187. package/dist/chunk-O4PZPM6H.js +204 -0
  188. package/dist/chunk-O5OW3YGQ.js +262 -0
  189. package/dist/chunk-OJQTONDJ.js +171 -0
  190. package/dist/chunk-OKZGUHE5.js +76 -0
  191. package/dist/chunk-OOH5M36Q.js +448 -0
  192. package/dist/chunk-OXUHCIGV.js +1352 -0
  193. package/dist/chunk-P5ARTZP2.js +128 -0
  194. package/dist/chunk-PKRSYS7F.js +402 -0
  195. package/dist/chunk-PNQDP3OA.js +800 -0
  196. package/dist/chunk-PQWO5D3F.js +348 -0
  197. package/dist/chunk-PYTSVZWG.js +377 -0
  198. package/dist/chunk-Q2R3WUW4.js +448 -0
  199. package/dist/chunk-Q6MJIJ2O.js +1352 -0
  200. package/dist/chunk-QFGJERAP.js +1119 -0
  201. package/dist/chunk-QKDRYZ2N.js +231 -0
  202. package/dist/chunk-QO7M774X.js +1094 -0
  203. package/dist/chunk-QODXLGH2.js +70 -0
  204. package/dist/chunk-RAV356E6.js +30 -0
  205. package/dist/chunk-RHC57KVT.js +85 -0
  206. package/dist/chunk-RHE7SHZJ.js +345 -0
  207. package/dist/chunk-RJY45A5J.js +133 -0
  208. package/dist/chunk-RK7EAA53.js +1157 -0
  209. package/dist/chunk-RSLVAYWS.js +192 -0
  210. package/dist/chunk-RVOPNDGY.js +150 -0
  211. package/dist/chunk-S3QEHFGE.js +373 -0
  212. package/dist/chunk-SCQEAMO3.js +299 -0
  213. package/dist/chunk-SL6WJP2Q.js +123 -0
  214. package/dist/chunk-SYOGNG2R.js +379 -0
  215. package/dist/chunk-T57DOVGE.js +97 -0
  216. package/dist/chunk-TEOJ63HX.js +362 -0
  217. package/dist/chunk-TMCKL43Q.js +181 -0
  218. package/dist/chunk-TMV5LCTC.js +167 -0
  219. package/dist/chunk-TO5ZXGDF.js +190 -0
  220. package/dist/chunk-TQZABASE.js +97 -0
  221. package/dist/chunk-U5RKF7MQ.js +836 -0
  222. package/dist/chunk-UBWBEY6I.js +81 -0
  223. package/dist/chunk-UDMFABWN.js +510 -0
  224. package/dist/chunk-UKS5CXQU.js +382 -0
  225. package/dist/chunk-UP7DNYG7.js +456 -0
  226. package/dist/chunk-V2OOLS63.js +41 -0
  227. package/dist/chunk-V5MGYIZS.js +70 -0
  228. package/dist/chunk-VBAY3OA7.js +604 -0
  229. package/dist/chunk-VK4KORCQ.js +204 -0
  230. package/dist/chunk-XCPVYQVK.js +336 -0
  231. package/dist/chunk-XWVBLZRP.js +50 -0
  232. package/dist/chunk-Y4ZA4GCQ.js +85 -0
  233. package/dist/chunk-YBTN5F2U.js +1068 -0
  234. package/dist/chunk-YMMYZXVZ.js +55 -0
  235. package/dist/chunk-Z5RXZRUC.js +227 -0
  236. package/dist/chunk-Z772TGD2.js +54 -0
  237. package/dist/chunk-ZAMPIXLH.js +1350 -0
  238. package/dist/chunk-ZPILUBWK.js +2142 -0
  239. package/dist/chunk-ZYEOHGU5.js +362 -0
  240. package/dist/co-activation-WCLF766F.js +73 -0
  241. package/dist/co-activation-WJTFJOTK.js +73 -0
  242. package/dist/co-occurrence-KFP6ZS7G.js +94 -0
  243. package/dist/co-occurrence-LPHW6UTZ.js +94 -0
  244. package/dist/code-context-index-QR5PAXM4.js +30 -0
  245. package/dist/conversation-wiki-populator-IMHNWKEU.js +105 -0
  246. package/dist/core-memory-3LSCC75D.js +110 -0
  247. package/dist/core-memory-DBZJ72TV.js +110 -0
  248. package/dist/crdt-sync-6DVGRMTV.js +33 -0
  249. package/dist/crdt-sync-UQ3PXFRB.js +33 -0
  250. package/dist/crm-webhook-55T4Z6XJ.js +10 -0
  251. package/dist/crm-webhook-VONTDB3M.js +10 -0
  252. package/dist/cto-delegation-gate-B7AKO7FX.js +279 -0
  253. package/dist/cto-delegation-gate-SPM6LAL2.js +279 -0
  254. package/dist/daemon-auth-55T2DI6G.js +13 -0
  255. package/dist/daemon-orchestration-XZLWWIV4.js +138 -0
  256. package/dist/daemon-orchestration-ZBDBRKVR.js +138 -0
  257. package/dist/db-backup-JHCI47JQ.js +37 -0
  258. package/dist/db-backup-LPCCZYIL.js +33 -0
  259. package/dist/db-restore-events-QF3KCGVZ.js +76 -0
  260. package/dist/doc-graph-extractor-4X23NP4I.js +132 -0
  261. package/dist/doc-graph-extractor-IOSZSDDW.js +132 -0
  262. package/dist/dreaming-KA3SN53N.js +33 -0
  263. package/dist/dreaming-TFZDGA72.js +33 -0
  264. package/dist/entity-boost-YFIFLE6N.js +375 -0
  265. package/dist/exe-drift-CLJ74KCO.js +69 -0
  266. package/dist/exe-drift-TEM7ELNY.js +69 -0
  267. package/dist/exe-export-CRCA4T4S.js +75 -0
  268. package/dist/exe-export-QF5V54XC.js +75 -0
  269. package/dist/exe-import-M4VYXCJZ.js +78 -0
  270. package/dist/exe-import-UZMMWNHJ.js +78 -0
  271. package/dist/exe-key-7PDQ72W2.js +580 -0
  272. package/dist/exe-key-NQQXEDUA.js +672 -0
  273. package/dist/exe-org-VAUMR7TL.js +73 -0
  274. package/dist/exe-snapshot-P7PUAJTV.js +337 -0
  275. package/dist/exe-snapshot-W5IVP6VF.js +337 -0
  276. package/dist/fast-db-init-G63PRINQ.js +7 -0
  277. package/dist/fast-db-init-MZOQZ2BW.js +7 -0
  278. package/dist/founder-context-QGKRISJH.js +96 -0
  279. package/dist/gateway/index.js +10 -10
  280. package/dist/git-staleness-42TTCFDP.js +111 -0
  281. package/dist/git-staleness-U7ADZARV.js +111 -0
  282. package/dist/git-task-sweep-4LW5RYYO.js +41 -0
  283. package/dist/git-task-sweep-T27IFHBH.js +41 -0
  284. package/dist/global-procedures-BVFRWJAV.js +21 -0
  285. package/dist/global-procedures-VJUQAYZ5.js +21 -0
  286. package/dist/graph-auto-extract-4ZA7UC6C.js +182 -0
  287. package/dist/graph-auto-extract-ZTZ44VKT.js +182 -0
  288. package/dist/hook-integrity-YPMNLP7B.js +89 -0
  289. package/dist/hooks/bug-report-worker.js +15 -15
  290. package/dist/hooks/codex-stop-task-finalizer.js +15 -15
  291. package/dist/hooks/commit-complete.js +16 -16
  292. package/dist/hooks/error-recall.js +9 -9
  293. package/dist/hooks/exe-heartbeat-hook.js +6 -6
  294. package/dist/hooks/ingest-worker.js +5 -5
  295. package/dist/hooks/ingest.js +13 -13
  296. package/dist/hooks/instructions-loaded.js +7 -7
  297. package/dist/hooks/manifest.json +20 -20
  298. package/dist/hooks/notification.js +7 -7
  299. package/dist/hooks/post-compact.js +15 -15
  300. package/dist/hooks/post-tool-combined.js +7 -7
  301. package/dist/hooks/pre-compact.js +20 -20
  302. package/dist/hooks/pre-tool-use.js +19 -19
  303. package/dist/hooks/prompt-submit.js +27 -27
  304. package/dist/hooks/session-end.js +25 -25
  305. package/dist/hooks/session-start.js +24 -18
  306. package/dist/hooks/stop.js +22 -22
  307. package/dist/hooks/subagent-stop.js +15 -15
  308. package/dist/hooks/summary-worker.js +22 -22
  309. package/dist/index.js +21 -21
  310. package/dist/installer-2MDIUMZS.js +343 -0
  311. package/dist/installer-CBGRTGIF.js +297 -0
  312. package/dist/installer-DGU4WZKJ.js +39 -0
  313. package/dist/installer-DS7H47GB.js +297 -0
  314. package/dist/installer-JSUC44TR.js +39 -0
  315. package/dist/installer-WTWEOSEK.js +343 -0
  316. package/dist/key-backup-status-X5CBECJ3.js +39 -0
  317. package/dist/lib/agent-config.js +2 -2
  318. package/dist/lib/cloud-sync.js +7 -7
  319. package/dist/lib/config.js +7 -1
  320. package/dist/lib/consolidation.js +9 -7
  321. package/dist/lib/database.js +4 -4
  322. package/dist/lib/db-daemon-client.js +3 -3
  323. package/dist/lib/db.js +4 -4
  324. package/dist/lib/device-registry.js +1 -1
  325. package/dist/lib/embed-worker.js +18 -7
  326. package/dist/lib/embedder.js +4 -4
  327. package/dist/lib/employee-templates.js +6 -6
  328. package/dist/lib/employees.js +4 -4
  329. package/dist/lib/exe-daemon-client.js +3 -3
  330. package/dist/lib/exe-daemon.js +165 -67
  331. package/dist/lib/hybrid-search.js +7 -7
  332. package/dist/lib/identity-templates.js +1 -1
  333. package/dist/lib/identity.js +4 -4
  334. package/dist/lib/license.js +2 -2
  335. package/dist/lib/messaging.js +13 -13
  336. package/dist/lib/reminders.js +5 -5
  337. package/dist/lib/schedules.js +7 -7
  338. package/dist/lib/session-registry.js +6 -6
  339. package/dist/lib/skill-learning.js +8 -8
  340. package/dist/lib/store.js +6 -6
  341. package/dist/lib/task-router.js +5 -5
  342. package/dist/lib/tasks.js +14 -14
  343. package/dist/lib/tmux-routing.js +12 -12
  344. package/dist/lib/token-spend.js +5 -5
  345. package/dist/lib/ws-client.js +5 -0
  346. package/dist/license-gate-OSPA2OD7.js +16 -0
  347. package/dist/license-gate-R5EZ7HD3.js +14 -0
  348. package/dist/mcp/register-tools.js +67 -67
  349. package/dist/mcp/server.js +128 -84
  350. package/dist/mcp/tools/complete-reminder.js +6 -6
  351. package/dist/mcp/tools/create-reminder.js +6 -6
  352. package/dist/mcp/tools/create-task.js +16 -16
  353. package/dist/mcp/tools/deactivate-behavior.js +9 -9
  354. package/dist/mcp/tools/list-reminders.js +6 -6
  355. package/dist/mcp/tools/list-tasks.js +16 -16
  356. package/dist/mcp/tools/send-message.js +15 -15
  357. package/dist/mcp/tools/update-task.js +15 -15
  358. package/dist/mcp-http-config-DV6S22TF.js +28 -0
  359. package/dist/mcp-http-config-OGFPLJYH.js +28 -0
  360. package/dist/memory-cards-AUWC6FN6.js +179 -0
  361. package/dist/memory-cards-GJ3VHKAM.js +179 -0
  362. package/dist/memory-graph-extractor-7OWSK2ON.js +21 -0
  363. package/dist/memory-graph-extractor-TCTCM7PZ.js +21 -0
  364. package/dist/memory-poisoning-defense-FVLGA35X.js +223 -0
  365. package/dist/memory-poisoning-defense-TLVXFY43.js +223 -0
  366. package/dist/memory-queue-4QU434ZH.js +19 -0
  367. package/dist/memory-queue-client-6KTL3U3I.js +16 -0
  368. package/dist/memory-reflection-BYJFIFSV.js +243 -0
  369. package/dist/memory-reflection-C52FI4W2.js +243 -0
  370. package/dist/message-queue-client-DFXF7LJD.js +92 -0
  371. package/dist/notifications-AQKZFSR3.js +46 -0
  372. package/dist/notifications-U3NJYMXX.js +46 -0
  373. package/dist/oauth-server-NR3XEPA4.js +437 -0
  374. package/dist/orchestration-events-RDSYLFXZ.js +26 -0
  375. package/dist/orchestration-events-TKODYRYP.js +26 -0
  376. package/dist/orchestration-phase-UCTFU32J.js +23 -0
  377. package/dist/orchestrator-2JTJQLPG.js +34 -0
  378. package/dist/orchestrator-GNI5PCA6.js +34 -0
  379. package/dist/pipeline-router-HBSTKHG5.js +14 -0
  380. package/dist/pipeline-router-P2QAQHUY.js +14 -0
  381. package/dist/plan-limits-GQENSNTG.js +27 -0
  382. package/dist/plan-limits-UDKZ2O7W.js +27 -0
  383. package/dist/project-boot-5R3GLCVN.js +299 -0
  384. package/dist/project-boot-W2LTP7WW.js +299 -0
  385. package/dist/projection-worker-7EWWMJHG.js +1034 -0
  386. package/dist/projection-worker-ZMT5KNJJ.js +1084 -0
  387. package/dist/prospective-memory-7B65EHWB.js +231 -0
  388. package/dist/prospective-memory-LANRNOJX.js +231 -0
  389. package/dist/push-notifications-X7E7GSC7.js +15 -0
  390. package/dist/reranker-EUG4XM44.js +19 -0
  391. package/dist/reranker-QGJO6EHO.js +19 -0
  392. package/dist/retrieval-health-JE66LJ3I.js +11 -0
  393. package/dist/retrieval-health-WLNAPJCX.js +11 -0
  394. package/dist/review-polling-IXJ57M6Q.js +125 -0
  395. package/dist/review-polling-WHPJUENR.js +125 -0
  396. package/dist/runtime/index.js +15 -15
  397. package/dist/session-events-WMK6FCKZ.js +37 -0
  398. package/dist/session-events-XKG66APL.js +37 -0
  399. package/dist/session-kill-telemetry-2BU72YXD.js +30 -0
  400. package/dist/session-kill-telemetry-VTU7YBII.js +30 -0
  401. package/dist/session-scope-RYBNHQ43.js +87 -0
  402. package/dist/session-scope-TQZONLZL.js +87 -0
  403. package/dist/setup-wizard-NID5EPDN.js +12 -0
  404. package/dist/setup-wizard-PXK6SC2D.js +12 -0
  405. package/dist/shard-manager-F3YYEG5S.js +30 -0
  406. package/dist/skill-refinement-KRMGOT5M.js +158 -0
  407. package/dist/skill-refinement-Y6LLKYRL.js +158 -0
  408. package/dist/stack-update-3LZQWW3G.js +80 -0
  409. package/dist/steward-gate-KC4NOULU.js +14 -0
  410. package/dist/steward-gate-QV2APBFB.js +14 -0
  411. package/dist/task-enforcement-AI433TPY.js +439 -0
  412. package/dist/task-enforcement-GLDD2W5D.js +505 -0
  413. package/dist/task-scope-HMPIP6XB.js +36 -0
  414. package/dist/task-scope-XRH4KDJB.js +36 -0
  415. package/dist/tasks-crud-2KYGDJG2.js +78 -0
  416. package/dist/tasks-crud-FH2SFCNQ.js +78 -0
  417. package/dist/tasks-notify-3ZW2GLCS.js +39 -0
  418. package/dist/tasks-notify-AJSRQHLZ.js +39 -0
  419. package/dist/tasks-review-ISSCHGTG.js +48 -0
  420. package/dist/tasks-review-XERV6KZD.js +48 -0
  421. package/dist/telemetry-upload-R77W7I7G.js +740 -0
  422. package/dist/telemetry-upload-VZ3A6EPD.js +740 -0
  423. package/dist/token-budget-NA4WQAY6.js +85 -0
  424. package/dist/token-budget-SIXJ7ED5.js +85 -0
  425. package/dist/tool-capability-index-TK5K76RB.js +10 -0
  426. package/dist/tool-telemetry-D4Q76LAS.js +17 -0
  427. package/dist/tool-telemetry-NTFTPF3L.js +17 -0
  428. package/dist/tui/App.js +25 -25
  429. package/dist/tui-data-2LNENF36.js +259 -0
  430. package/dist/tui-data-NJSEIA2Q.js +259 -0
  431. package/dist/webhook-pipe-VQMOLXMW.js +114 -0
  432. package/dist/wiki-acl-33D5QTU4.js +111 -0
  433. package/dist/wiki-acl-RE5IR5VV.js +111 -0
  434. package/dist/wiki-client-XZ6VZTH6.js +157 -0
  435. package/dist/worker-gate-NCEAKLJE.js +21 -0
  436. package/dist/worker-gate-VN2POPFL.js +21 -0
  437. package/dist/workflow-engine-D7ALMSDM.js +28 -0
  438. package/dist/workflow-engine-WFN3HPAZ.js +28 -0
  439. package/dist/worktree-6I45JV5N.js +27 -0
  440. package/dist/worktree-O66YDTSF.js +27 -0
  441. package/dist/worktree-sweep-IMDR3XHT.js +20 -0
  442. package/dist/worktree-sweep-M2ENRTY6.js +20 -0
  443. package/package.json +1 -1
  444. package/release-notes.json +127 -127
@@ -0,0 +1,343 @@
1
+ import {
2
+ resolvePackageRoot
3
+ } from "./chunk-64GBV67L.js";
4
+ import {
5
+ loadPreferences
6
+ } from "./chunk-GNHN5HRQ.js";
7
+ import {
8
+ EXE_HOOKS,
9
+ isLegacySplitPostToolCommand
10
+ } from "./chunk-L3TB7CC3.js";
11
+ import {
12
+ buildMcpHttpHeaders,
13
+ mcpHttpUrl
14
+ } from "./chunk-KFHAVF6J.js";
15
+ import "./chunk-QODXLGH2.js";
16
+ import "./chunk-HYZV25LY.js";
17
+ import "./chunk-3X2ZT5FN.js";
18
+ import "./chunk-2I23RPSI.js";
19
+ import "./chunk-SCQEAMO3.js";
20
+ import "./chunk-PNQDP3OA.js";
21
+ import "./chunk-FXU7JOXK.js";
22
+ import "./chunk-5P3HOBZX.js";
23
+ import "./chunk-LYH5HE24.js";
24
+ import "./chunk-MLKGABMK.js";
25
+
26
+ // src/adapters/codex/installer.ts
27
+ import { readFile, writeFile, mkdir } from "fs/promises";
28
+ import { existsSync, readFileSync } from "fs";
29
+ import path from "path";
30
+ import os from "os";
31
+ async function mergeCodexHooks(packageRoot, homeDir = os.homedir()) {
32
+ const codexDir = path.join(homeDir, ".codex");
33
+ const hooksPath = path.join(codexDir, "hooks.json");
34
+ const logsDir = path.join(homeDir, ".exe-os", "logs");
35
+ const hookLogPath = path.join(logsDir, "hooks.log");
36
+ const logSuffix = ` 2>> "${hookLogPath}"`;
37
+ await mkdir(codexDir, { recursive: true });
38
+ await mkdir(logsDir, { recursive: true });
39
+ let hooksJson = {};
40
+ if (existsSync(hooksPath)) {
41
+ try {
42
+ hooksJson = JSON.parse(await readFile(hooksPath, "utf-8"));
43
+ } catch {
44
+ hooksJson = {};
45
+ }
46
+ }
47
+ if (!hooksJson.hooks) {
48
+ hooksJson.hooks = {};
49
+ }
50
+ const hooksToRegister = [
51
+ {
52
+ event: "PostToolUse",
53
+ group: {
54
+ matcher: "Bash|apply_patch|Edit|Write|Read|Glob|Grep|mcp__.*",
55
+ hooks: [
56
+ {
57
+ // Combined hook: runs ingest + error-recall in one Node process.
58
+ // Eliminates a cold-start cycle per tool call (~3-6s savings on Codex).
59
+ type: "command",
60
+ command: `node "${path.join(packageRoot, "dist", "hooks", "post-tool-combined.js")}"${logSuffix}`
61
+ }
62
+ ]
63
+ },
64
+ marker: EXE_HOOKS.postToolCombined
65
+ },
66
+ {
67
+ event: "UserPromptSubmit",
68
+ group: {
69
+ hooks: [
70
+ {
71
+ // Single hook: prompt-submit handles memory retrieval + entity boost.
72
+ // exe-heartbeat-hook is CC-specific (intercom) — omitted on Codex.
73
+ type: "command",
74
+ command: `node "${path.join(packageRoot, "dist", "hooks", "prompt-submit.js")}"${logSuffix}`
75
+ }
76
+ ]
77
+ },
78
+ marker: EXE_HOOKS.promptSubmit
79
+ },
80
+ {
81
+ event: "Stop",
82
+ group: {
83
+ hooks: [
84
+ {
85
+ type: "command",
86
+ command: `node "${path.join(packageRoot, "dist", "hooks", "stop.js")}"${logSuffix}`
87
+ }
88
+ ]
89
+ },
90
+ marker: EXE_HOOKS.stop
91
+ },
92
+ {
93
+ event: "PreToolUse",
94
+ group: {
95
+ matcher: "Bash|apply_patch",
96
+ hooks: [
97
+ {
98
+ type: "command",
99
+ command: `node "${path.join(packageRoot, "dist", "hooks", "pre-tool-use.js")}"${logSuffix}`
100
+ }
101
+ ]
102
+ },
103
+ marker: EXE_HOOKS.preToolUse
104
+ }
105
+ ];
106
+ let added = 0;
107
+ let skipped = 0;
108
+ const sessionStartGroups = hooksJson.hooks["SessionStart"];
109
+ if (Array.isArray(sessionStartGroups)) {
110
+ hooksJson.hooks["SessionStart"] = sessionStartGroups.map((g) => ({
111
+ ...g,
112
+ hooks: g.hooks.filter((h) => !h.command.includes(EXE_HOOKS.sessionStart))
113
+ })).filter((g) => g.hooks.length > 0);
114
+ if (hooksJson.hooks["SessionStart"].length === 0) {
115
+ delete hooksJson.hooks["SessionStart"];
116
+ }
117
+ }
118
+ const postToolGroups = hooksJson.hooks["PostToolUse"];
119
+ if (Array.isArray(postToolGroups)) {
120
+ hooksJson.hooks["PostToolUse"] = postToolGroups.map((g) => ({
121
+ ...g,
122
+ hooks: g.hooks.filter((h) => !isLegacySplitPostToolCommand(h.command))
123
+ })).filter((g) => g.hooks.length > 0);
124
+ }
125
+ for (const { event, group, marker } of hooksToRegister) {
126
+ if (!hooksJson.hooks[event]) {
127
+ hooksJson.hooks[event] = [];
128
+ }
129
+ const existing = hooksJson.hooks[event];
130
+ const correctCommand = group.hooks[0]?.command ?? "";
131
+ const alreadyCorrect = existing.some(
132
+ (g) => g.hooks.some((h) => h.command === correctCommand)
133
+ );
134
+ if (alreadyCorrect) {
135
+ skipped++;
136
+ } else {
137
+ hooksJson.hooks[event] = existing.filter(
138
+ (g) => !g.hooks.some((h) => h.command.includes(marker))
139
+ );
140
+ hooksJson.hooks[event].push(group);
141
+ added++;
142
+ }
143
+ }
144
+ await writeFile(hooksPath, JSON.stringify(hooksJson, null, 2) + "\n");
145
+ return { added, skipped };
146
+ }
147
+ function verifyCodexHooks(homeDir = os.homedir()) {
148
+ const hooksPath = path.join(homeDir, ".codex", "hooks.json");
149
+ if (!existsSync(hooksPath)) return false;
150
+ try {
151
+ const hooksJson = JSON.parse(readFileSync(hooksPath, "utf-8"));
152
+ if (!hooksJson.hooks) return false;
153
+ const required = ["PostToolUse", "UserPromptSubmit", "Stop", "PreToolUse"];
154
+ for (const event of required) {
155
+ const groups = hooksJson.hooks[event];
156
+ if (!groups || !groups.some(
157
+ (g) => g.hooks.some((h) => h.command.includes("dist/hooks/"))
158
+ )) {
159
+ return false;
160
+ }
161
+ }
162
+ const postToolCommands = (hooksJson.hooks.PostToolUse ?? []).flatMap((g) => g.hooks.map((h) => h.command));
163
+ if (!postToolCommands.some((cmd) => cmd.includes(EXE_HOOKS.postToolCombined))) {
164
+ return false;
165
+ }
166
+ if (postToolCommands.some(
167
+ (cmd) => isLegacySplitPostToolCommand(cmd)
168
+ )) {
169
+ return false;
170
+ }
171
+ const sessionStartCommands = (hooksJson.hooks.SessionStart ?? []).flatMap((g) => g.hooks.map((h) => h.command));
172
+ if (sessionStartCommands.some((cmd) => cmd.includes(EXE_HOOKS.sessionStart))) {
173
+ return false;
174
+ }
175
+ return true;
176
+ } catch {
177
+ return false;
178
+ }
179
+ }
180
+ var DEFAULT_CODEX_STATUS_LINE = [
181
+ "model-with-reasoning",
182
+ "current-dir",
183
+ "project-name",
184
+ "git-branch",
185
+ "run-state",
186
+ "context-used"
187
+ ];
188
+ async function installCodexStatusLine(homeDir = os.homedir()) {
189
+ const prefs = loadPreferences(homeDir);
190
+ if (prefs.codexStatusLine === false) return "opted-out";
191
+ const codexDir = path.join(homeDir, ".codex");
192
+ const configPath = path.join(codexDir, "config.toml");
193
+ await mkdir(codexDir, { recursive: true });
194
+ let content = "";
195
+ if (existsSync(configPath)) {
196
+ content = await readFile(configPath, "utf-8");
197
+ if (/\[tui\][\s\S]*?status_line\s*=/.test(content)) {
198
+ return "already-configured";
199
+ }
200
+ }
201
+ const statusLineToml = `[tui]
202
+ status_line = [${DEFAULT_CODEX_STATUS_LINE.map((s) => `"${s}"`).join(", ")}]`;
203
+ if (content.includes("[tui]")) {
204
+ content = content.replace(/\[tui\]/, `${statusLineToml}`);
205
+ } else {
206
+ const separator = content.length > 0 && !content.endsWith("\n") ? "\n\n" : content.length > 0 ? "\n" : "";
207
+ content = content + separator + statusLineToml + "\n";
208
+ }
209
+ await writeFile(configPath, content);
210
+ return "installed";
211
+ }
212
+ var CODEX_EXE_MCP_STARTUP_TIMEOUT_SEC = 30;
213
+ var CODEX_EXE_MCP_TOOL_TIMEOUT_SEC = 120;
214
+ function tomlString(value) {
215
+ return JSON.stringify(value);
216
+ }
217
+ function codexHttpHeadersToml(homeDir) {
218
+ const headers = buildMcpHttpHeaders(homeDir);
219
+ return `{ ${Object.entries(headers).map(([key, value]) => `${tomlString(key)} = ${tomlString(value)}`).join(", ")} }`;
220
+ }
221
+ function desiredCodexMcpSection(homeDir) {
222
+ return [
223
+ "[mcp_servers.exe-os]",
224
+ `url = ${tomlString(mcpHttpUrl())}`,
225
+ `http_headers = ${codexHttpHeadersToml(homeDir)}`,
226
+ `startup_timeout_sec = ${CODEX_EXE_MCP_STARTUP_TIMEOUT_SEC}`,
227
+ `tool_timeout_sec = ${CODEX_EXE_MCP_TOOL_TIMEOUT_SEC}`,
228
+ ""
229
+ ].join("\n");
230
+ }
231
+ function reconcileCodexMcpSection(sectionContent, homeDir) {
232
+ const desiredLines = {
233
+ url: `url = ${tomlString(mcpHttpUrl())}`,
234
+ headers: `http_headers = ${codexHttpHeadersToml(homeDir)}`,
235
+ startup: `startup_timeout_sec = ${CODEX_EXE_MCP_STARTUP_TIMEOUT_SEC}`,
236
+ tool: `tool_timeout_sec = ${CODEX_EXE_MCP_TOOL_TIMEOUT_SEC}`
237
+ };
238
+ let next = sectionContent;
239
+ next = next.split("\n").filter((line) => !/^(command|args|env|type|url|http_headers|startup_timeout_sec|tool_timeout_sec)\s*=/.test(line.trim())).join("\n").replace(/\n{3,}/g, "\n\n");
240
+ for (const line of [desiredLines.url, desiredLines.headers, desiredLines.startup, desiredLines.tool]) {
241
+ next = next.endsWith("\n") ? `${next}${line}
242
+ ` : `${next}
243
+ ${line}
244
+ `;
245
+ }
246
+ return { content: next, changed: next !== sectionContent };
247
+ }
248
+ async function registerCodexMcpServer(packageRoot, homeDir = os.homedir()) {
249
+ const codexDir = path.join(homeDir, ".codex");
250
+ const configPath = path.join(codexDir, "config.toml");
251
+ void packageRoot;
252
+ await mkdir(codexDir, { recursive: true });
253
+ let content = "";
254
+ if (existsSync(configPath)) {
255
+ content = await readFile(configPath, "utf-8");
256
+ }
257
+ const sectionHeader = "[mcp_servers.exe-os]";
258
+ const headerIndex = content.indexOf(sectionHeader);
259
+ if (headerIndex !== -1) {
260
+ const afterHeader = content.slice(headerIndex + sectionHeader.length);
261
+ const nextSectionMatch = afterHeader.match(/\n\[(?!mcp_servers\.exe-os)/);
262
+ const sectionEnd = nextSectionMatch ? headerIndex + sectionHeader.length + nextSectionMatch.index : content.length;
263
+ const sectionContent = content.slice(headerIndex, sectionEnd);
264
+ const reconciled = reconcileCodexMcpSection(sectionContent, homeDir);
265
+ if (!reconciled.changed) {
266
+ return "already-registered";
267
+ }
268
+ content = content.slice(0, headerIndex) + reconciled.content + content.slice(sectionEnd);
269
+ await writeFile(configPath, content);
270
+ return "updated";
271
+ }
272
+ const newSection = desiredCodexMcpSection(homeDir);
273
+ const separator = content.length > 0 && !content.endsWith("\n") ? "\n\n" : content.length > 0 ? "\n" : "";
274
+ content = content + separator + newSection;
275
+ await writeFile(configPath, content);
276
+ return "registered";
277
+ }
278
+ async function ensureCodexHooksFeature(homeDir = os.homedir()) {
279
+ const configPath = path.join(homeDir, ".codex", "config.toml");
280
+ await mkdir(path.join(homeDir, ".codex"), { recursive: true });
281
+ let content = "";
282
+ if (existsSync(configPath)) {
283
+ content = await readFile(configPath, "utf-8");
284
+ }
285
+ if (/codex_hooks\s*=/.test(content)) {
286
+ content = content.replace(/codex_hooks\s*=\s*(true|false)/g, "hooks = $1");
287
+ }
288
+ if (/\[features\][\s\S]*?hooks\s*=\s*true/.test(content)) {
289
+ if (/codex_hooks/.test(await readFile(configPath, "utf-8").catch(() => ""))) {
290
+ await writeFile(configPath, content);
291
+ }
292
+ return "already-enabled";
293
+ }
294
+ if (content.includes("[features]")) {
295
+ if (/hooks\s*=\s*false/.test(content)) {
296
+ content = content.replace(/hooks\s*=\s*false/, "hooks = true");
297
+ } else {
298
+ content = content.replace(/\[features\]/, "[features]\nhooks = true");
299
+ }
300
+ } else {
301
+ const firstSectionMatch = content.match(/\n\[(?!features\])/);
302
+ if (firstSectionMatch && firstSectionMatch.index != null) {
303
+ const insertAt = firstSectionMatch.index;
304
+ content = content.slice(0, insertAt) + "\n\n[features]\nhooks = true" + content.slice(insertAt);
305
+ } else {
306
+ const separator = content.length > 0 && !content.endsWith("\n") ? "\n\n" : "\n";
307
+ content = content + separator + "[features]\nhooks = true\n";
308
+ }
309
+ }
310
+ await writeFile(configPath, content);
311
+ return "enabled";
312
+ }
313
+ async function runCodexInstaller(homeDir) {
314
+ const packageRoot = resolvePackageRoot();
315
+ const result = await mergeCodexHooks(packageRoot, homeDir);
316
+ process.stderr.write(
317
+ `[exe-os] Codex hooks: ${result.added} added, ${result.skipped} unchanged
318
+ `
319
+ );
320
+ const featureResult = await ensureCodexHooksFeature(homeDir);
321
+ process.stderr.write(
322
+ `[exe-os] Codex hooks feature: ${featureResult}
323
+ `
324
+ );
325
+ const mcpResult = await registerCodexMcpServer(packageRoot, homeDir);
326
+ process.stderr.write(
327
+ `[exe-os] Codex MCP server: ${mcpResult}
328
+ `
329
+ );
330
+ const statusResult = await installCodexStatusLine(homeDir);
331
+ process.stderr.write(
332
+ `[exe-os] Codex status line: ${statusResult}
333
+ `
334
+ );
335
+ }
336
+ export {
337
+ ensureCodexHooksFeature,
338
+ installCodexStatusLine,
339
+ mergeCodexHooks,
340
+ registerCodexMcpServer,
341
+ runCodexInstaller,
342
+ verifyCodexHooks
343
+ };
@@ -0,0 +1,297 @@
1
+ import {
2
+ resolvePackageRoot
3
+ } from "./chunk-YBTN5F2U.js";
4
+ import "./chunk-GNHN5HRQ.js";
5
+ import {
6
+ EXE_HOOK_FILES,
7
+ textHasLegacySplitPostToolHook
8
+ } from "./chunk-L3TB7CC3.js";
9
+ import {
10
+ buildMcpHttpHeaders,
11
+ mcpHttpUrl
12
+ } from "./chunk-TQZABASE.js";
13
+ import "./chunk-V5MGYIZS.js";
14
+ import "./chunk-HYZV25LY.js";
15
+ import "./chunk-DBQ6I6K2.js";
16
+ import "./chunk-2I23RPSI.js";
17
+ import "./chunk-XCPVYQVK.js";
18
+ import "./chunk-PNQDP3OA.js";
19
+ import "./chunk-FXU7JOXK.js";
20
+ import "./chunk-5P3HOBZX.js";
21
+ import "./chunk-LYH5HE24.js";
22
+ import "./chunk-MLKGABMK.js";
23
+
24
+ // src/adapters/opencode/installer.ts
25
+ import { readFile, writeFile, mkdir } from "fs/promises";
26
+ import { existsSync, readFileSync } from "fs";
27
+ import path from "path";
28
+ import os from "os";
29
+
30
+ // src/adapters/opencode/plugin-template.ts
31
+ var PLUGIN_TEMPLATE = `
32
+ import { spawn } from "node:child_process";
33
+ import { randomUUID } from "node:crypto";
34
+ import path from "node:path";
35
+
36
+ const PACKAGE_ROOT = "__PACKAGE_ROOT__";
37
+ const HOOKS_DIR = path.join(PACKAGE_ROOT, "dist", "hooks");
38
+
39
+ function hookPath(name) {
40
+ return path.join(HOOKS_DIR, name);
41
+ }
42
+
43
+ function getAgentEnv() {
44
+ return {
45
+ AGENT_ID: process.env.AGENT_ID || process.env.EXE_AGENT_ID || "default",
46
+ AGENT_ROLE: process.env.AGENT_ROLE || process.env.EXE_AGENT_ROLE || "employee",
47
+ EXE_OS_DIR: process.env.EXE_OS_DIR || path.join(process.env.HOME || "", ".exe-os"),
48
+ };
49
+ }
50
+
51
+ /**
52
+ * Spawn a hook script with JSON on stdin, return parsed stdout.
53
+ * Times out after the given ms. Returns null on failure.
54
+ */
55
+ function runHook(scriptName, payload, timeoutMs = 10000) {
56
+ return new Promise((resolve) => {
57
+ try {
58
+ const child = spawn("node", [hookPath(scriptName)], {
59
+ stdio: ["pipe", "pipe", "ignore"],
60
+ env: { ...process.env, ...getAgentEnv() },
61
+ timeout: timeoutMs,
62
+ });
63
+
64
+ let stdout = "";
65
+ child.stdout.on("data", (chunk) => { stdout += chunk; });
66
+ child.on("close", () => {
67
+ try {
68
+ resolve(stdout.trim() ? JSON.parse(stdout) : null);
69
+ } catch {
70
+ resolve(null);
71
+ }
72
+ });
73
+ child.on("error", () => resolve(null));
74
+
75
+ child.stdin.write(JSON.stringify(payload));
76
+ child.stdin.end();
77
+ } catch {
78
+ resolve(null);
79
+ }
80
+ });
81
+ }
82
+
83
+ /**
84
+ * Spawn a hook script fire-and-forget (detached, no stdout capture).
85
+ * Used for ingestion workers that do background DB writes.
86
+ */
87
+ function fireHook(scriptName, payload) {
88
+ try {
89
+ const child = spawn("node", [hookPath(scriptName)], {
90
+ detached: true,
91
+ stdio: ["pipe", "ignore", "ignore"],
92
+ env: { ...process.env, ...getAgentEnv() },
93
+ });
94
+ child.stdin.write(JSON.stringify(payload));
95
+ child.stdin.end();
96
+ child.unref();
97
+ } catch {
98
+ // Silent \u2014 hooks must never crash the host
99
+ }
100
+ }
101
+
102
+ export const ExeOsPlugin = async ({ project, directory }) => {
103
+ const cwd = directory || process.cwd();
104
+
105
+ return {
106
+ // --- Session start: inject memory brief ---
107
+ "session.created": async (input) => {
108
+ const payload = {
109
+ session_id: input?.sessionId || randomUUID(),
110
+ cwd,
111
+ hook_event_name: "SessionStart",
112
+ source: "startup",
113
+ model: input?.model || "unknown",
114
+ };
115
+ const result = await runHook("session-start.js", payload, 10000);
116
+ if (result?.hookSpecificOutput?.additionalContext) {
117
+ // Return context to be injected as system message
118
+ return result.hookSpecificOutput.additionalContext;
119
+ }
120
+ },
121
+
122
+ // --- Pre tool use: safety checks ---
123
+ "tool.execute.before": async (input, output) => {
124
+ const toolName = input?.metadata?.name || input?.tool || "unknown";
125
+ const payload = {
126
+ session_id: input?.sessionId || "opencode",
127
+ cwd,
128
+ hook_event_name: "PreToolUse",
129
+ tool_name: toolName,
130
+ tool_input: output?.args || input?.args || {},
131
+ tool_use_id: input?.toolUseId || randomUUID(),
132
+ transcript_path: "",
133
+ permission_mode: "dangerously-skip-permissions",
134
+ };
135
+ const result = await runHook("pre-tool-use.js", payload, 5000);
136
+ if (result?.hookSpecificOutput?.permissionDecision === "deny") {
137
+ // Block the tool call
138
+ output.denied = true;
139
+ output.reason = result.hookSpecificOutput.permissionDecisionReason || "Blocked by exe-os";
140
+ }
141
+ },
142
+
143
+ // --- Post tool use: memory ingestion + error recall ---
144
+ "tool.execute.after": async (input) => {
145
+ const toolName = input?.metadata?.name || input?.tool || "unknown";
146
+ const payload = {
147
+ session_id: input?.sessionId || "opencode",
148
+ cwd,
149
+ hook_event_name: "PostToolUse",
150
+ tool_name: toolName,
151
+ tool_input: input?.args || {},
152
+ tool_response: input?.result || {},
153
+ tool_use_id: input?.toolUseId || randomUUID(),
154
+ transcript_path: "",
155
+ permission_mode: "dangerously-skip-permissions",
156
+ };
157
+
158
+ // Combined hook: runs memory ingestion + error recall in the same
159
+ // orchestrator used by Claude Code and Codex. This prevents duplicate
160
+ // PostToolUse pipelines and keeps error-recall output formatting in one
161
+ // place.
162
+ const result = await runHook("post-tool-combined.js", payload, 10000);
163
+ if (result?.hookSpecificOutput?.additionalContext) {
164
+ return result.hookSpecificOutput.additionalContext;
165
+ }
166
+ },
167
+
168
+ // --- Message updated: entity boost ---
169
+ "message.updated": async (input) => {
170
+ // Only fire for user messages (prompts), not assistant responses
171
+ const role = input?.message?.role || input?.role;
172
+ if (role !== "user") return;
173
+
174
+ const prompt = input?.message?.content || input?.content || "";
175
+ if (typeof prompt !== "string" || prompt.length < 10) return;
176
+
177
+ const payload = {
178
+ session_id: input?.sessionId || "opencode",
179
+ cwd,
180
+ hook_event_name: "UserPromptSubmit",
181
+ prompt,
182
+ };
183
+ const result = await runHook("prompt-submit.js", payload, 5000);
184
+ if (result?.hookSpecificOutput?.additionalContext) {
185
+ return result.hookSpecificOutput.additionalContext;
186
+ }
187
+ },
188
+
189
+ // --- Session idle: capture response ---
190
+ "session.idle": async (input) => {
191
+ const lastMessage = input?.lastMessage || input?.message || "";
192
+ if (typeof lastMessage !== "string" || lastMessage.length < 100) return;
193
+
194
+ const payload = {
195
+ session_id: input?.sessionId || "opencode",
196
+ cwd,
197
+ hook_event_name: "Stop",
198
+ last_assistant_message: lastMessage,
199
+ stop_hook_active: true,
200
+ transcript_path: "",
201
+ };
202
+ fireHook("stop.js", payload);
203
+ },
204
+ };
205
+ };
206
+ `;
207
+
208
+ // src/adapters/opencode/installer.ts
209
+ async function registerOpenCodeMcp(packageRoot, homeDir = os.homedir()) {
210
+ void packageRoot;
211
+ const configDir = path.join(homeDir, ".config", "opencode");
212
+ const configPath = path.join(configDir, "opencode.json");
213
+ await mkdir(configDir, { recursive: true });
214
+ let config = {};
215
+ if (existsSync(configPath)) {
216
+ try {
217
+ config = JSON.parse(await readFile(configPath, "utf-8"));
218
+ } catch {
219
+ config = {};
220
+ }
221
+ }
222
+ if (!config.mcp) {
223
+ config.mcp = {};
224
+ }
225
+ const newEntry = {
226
+ type: "remote",
227
+ url: mcpHttpUrl(),
228
+ headers: buildMcpHttpHeaders(homeDir),
229
+ enabled: true
230
+ };
231
+ const current = config.mcp["exe-os"];
232
+ if (current && JSON.stringify(current) === JSON.stringify(newEntry)) {
233
+ return false;
234
+ }
235
+ config.mcp["exe-os"] = newEntry;
236
+ if (!config.$schema) {
237
+ config.$schema = "https://opencode.ai/config.json";
238
+ }
239
+ await writeFile(configPath, JSON.stringify(config, null, 2) + "\n");
240
+ return true;
241
+ }
242
+ async function installOpenCodePlugin(packageRoot, homeDir = os.homedir()) {
243
+ const pluginDir = path.join(homeDir, ".config", "opencode", "plugins");
244
+ const pluginPath = path.join(pluginDir, "exe-os.mjs");
245
+ await mkdir(pluginDir, { recursive: true });
246
+ const pluginContent = PLUGIN_TEMPLATE.replace(
247
+ /__PACKAGE_ROOT__/g,
248
+ packageRoot.replace(/\\/g, "\\\\")
249
+ );
250
+ if (existsSync(pluginPath)) {
251
+ const existing = await readFile(pluginPath, "utf-8");
252
+ if (existing === pluginContent) {
253
+ return false;
254
+ }
255
+ }
256
+ await writeFile(pluginPath, pluginContent);
257
+ return true;
258
+ }
259
+ function verifyOpenCodeHooks(homeDir = os.homedir()) {
260
+ const configPath = path.join(homeDir, ".config", "opencode", "opencode.json");
261
+ const pluginPath = path.join(homeDir, ".config", "opencode", "plugins", "exe-os.mjs");
262
+ if (!existsSync(configPath)) return false;
263
+ try {
264
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
265
+ if (!config.mcp?.["exe-os"]?.enabled) return false;
266
+ } catch {
267
+ return false;
268
+ }
269
+ if (!existsSync(pluginPath)) return false;
270
+ try {
271
+ const plugin = readFileSync(pluginPath, "utf-8");
272
+ if (!plugin.includes(EXE_HOOK_FILES.postToolCombined)) return false;
273
+ if (textHasLegacySplitPostToolHook(plugin)) return false;
274
+ } catch {
275
+ return false;
276
+ }
277
+ return true;
278
+ }
279
+ async function runOpenCodeInstaller(homeDir) {
280
+ const packageRoot = resolvePackageRoot();
281
+ const mcpChanged = await registerOpenCodeMcp(packageRoot, homeDir);
282
+ process.stderr.write(
283
+ `[exe-os] OpenCode MCP: ${mcpChanged ? "registered" : "already registered"}
284
+ `
285
+ );
286
+ const pluginChanged = await installOpenCodePlugin(packageRoot, homeDir);
287
+ process.stderr.write(
288
+ `[exe-os] OpenCode plugin: ${pluginChanged ? "installed" : "already installed"}
289
+ `
290
+ );
291
+ }
292
+ export {
293
+ installOpenCodePlugin,
294
+ registerOpenCodeMcp,
295
+ runOpenCodeInstaller,
296
+ verifyOpenCodeHooks
297
+ };
@@ -0,0 +1,39 @@
1
+ import {
2
+ cleanOldShellFunctions,
3
+ copySlashCommands,
4
+ detectMcpNameCollisions,
5
+ installStatusLine,
6
+ mergeHooks,
7
+ registerMcpServer,
8
+ resolvePackageRoot,
9
+ runInstaller,
10
+ setupGhostty,
11
+ setupTmux,
12
+ setupWezterm
13
+ } from "./chunk-YBTN5F2U.js";
14
+ import "./chunk-GNHN5HRQ.js";
15
+ import "./chunk-L3TB7CC3.js";
16
+ import "./chunk-TQZABASE.js";
17
+ import "./chunk-V5MGYIZS.js";
18
+ import "./chunk-HYZV25LY.js";
19
+ import "./chunk-DBQ6I6K2.js";
20
+ import "./chunk-2I23RPSI.js";
21
+ import "./chunk-XCPVYQVK.js";
22
+ import "./chunk-PNQDP3OA.js";
23
+ import "./chunk-FXU7JOXK.js";
24
+ import "./chunk-5P3HOBZX.js";
25
+ import "./chunk-LYH5HE24.js";
26
+ import "./chunk-MLKGABMK.js";
27
+ export {
28
+ cleanOldShellFunctions,
29
+ copySlashCommands,
30
+ detectMcpNameCollisions,
31
+ installStatusLine,
32
+ mergeHooks,
33
+ registerMcpServer,
34
+ resolvePackageRoot,
35
+ runInstaller,
36
+ setupGhostty,
37
+ setupTmux,
38
+ setupWezterm
39
+ };