@askexenow/exe-os 0.9.409 → 0.9.410

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 (400) hide show
  1. package/deploy/stack-manifests/v0.9.json +408 -1
  2. package/dist/.dist-verified.json +3 -3
  3. package/dist/{active-agent-5AKPW2N7.js → active-agent-2ELFTYNT.js} +4 -4
  4. package/dist/{active-agent-2AMJC3SC.js → active-agent-SS4SRXYZ.js} +4 -4
  5. package/dist/agent-defs-generator-6S2BSYCP.js +32 -0
  6. package/dist/{agentic-ontology-6RS7A7KP.js → agentic-ontology-TJOAUAPD.js} +1 -1
  7. package/dist/{artifact-backup-6O4FNYPS.js → artifact-backup-STQQZDZ5.js} +3 -3
  8. package/dist/{backfill-metadata-6YX6LGPJ.js → backfill-metadata-I2FVENKJ.js} +7 -7
  9. package/dist/{backup-verify-QIAQ63VC.js → backup-verify-AOTKX5DA.js} +69 -4
  10. package/dist/{behavior-injection-NRXTNROW.js → behavior-injection-CTSIKHTH.js} +10 -10
  11. package/dist/{behavior-promotion-MW7OQ72V.js → behavior-promotion-NZMTTFHK.js} +9 -9
  12. package/dist/{behaviors-7AOK44QK.js → behaviors-RUNSC5WI.js} +8 -8
  13. package/dist/bin/agentic-ontology-backfill.js +8 -8
  14. package/dist/bin/agentic-reflection-backfill.js +9 -9
  15. package/dist/bin/agentic-semantic-label.js +8 -8
  16. package/dist/bin/backfill-conversations.js +7 -7
  17. package/dist/bin/backfill-responses.js +7 -7
  18. package/dist/bin/backfill-vectors.js +7 -7
  19. package/dist/bin/bulk-sync-postgres.js +16 -16
  20. package/dist/bin/cc-doctor.js +8 -8
  21. package/dist/bin/cleanup-stale-review-tasks.js +13 -16
  22. package/dist/bin/cli.js +24 -24
  23. package/dist/bin/deferred-daemon-restart.js +95 -95
  24. package/dist/bin/exe-agent-config.js +3 -3
  25. package/dist/bin/exe-agent.js +11 -11
  26. package/dist/bin/exe-assign.js +8 -8
  27. package/dist/bin/exe-boot.js +33 -36
  28. package/dist/bin/exe-call.js +8 -8
  29. package/dist/bin/exe-cloud.js +26 -22
  30. package/dist/bin/exe-config-dump.js +3 -3
  31. package/dist/bin/exe-dispatch.js +14 -17
  32. package/dist/bin/exe-doctor.js +5 -5
  33. package/dist/bin/exe-export-behaviors.js +12 -12
  34. package/dist/bin/exe-forget.js +12 -12
  35. package/dist/bin/exe-gateway.js +9 -9
  36. package/dist/bin/exe-grant.js +6 -6
  37. package/dist/bin/exe-healthcheck.js +8 -8
  38. package/dist/bin/exe-heartbeat.js +19 -22
  39. package/dist/bin/exe-kill.js +18 -21
  40. package/dist/bin/exe-launch-agent.js +215 -100
  41. package/dist/bin/exe-mcp.js +5 -5
  42. package/dist/bin/exe-memory-reads.js +7 -7
  43. package/dist/bin/exe-new-employee.js +10 -10
  44. package/dist/bin/exe-os-mcp-proxy.js +5 -5
  45. package/dist/bin/exe-pending-messages.js +14 -17
  46. package/dist/bin/exe-pending-notifications.js +13 -16
  47. package/dist/bin/exe-pending-reviews.js +14 -17
  48. package/dist/bin/exe-rename.js +6 -6
  49. package/dist/bin/exe-review.js +17 -20
  50. package/dist/bin/exe-search.js +11 -11
  51. package/dist/bin/exe-session-cleanup.js +18 -21
  52. package/dist/bin/exe-settings.js +16 -16
  53. package/dist/bin/exe-start-codex.js +18 -18
  54. package/dist/bin/exe-start-opencode.js +16 -16
  55. package/dist/bin/exe-status.js +15 -18
  56. package/dist/bin/exe-support.js +3 -3
  57. package/dist/bin/exe-team.js +5 -5
  58. package/dist/bin/git-sweep.js +15 -17
  59. package/dist/bin/graph-backfill.js +8 -8
  60. package/dist/bin/graph-export.js +8 -8
  61. package/dist/bin/hooks-cli.js +1 -1
  62. package/dist/bin/import-history.js +11 -11
  63. package/dist/bin/install.js +97 -97
  64. package/dist/bin/intercom-check.js +5 -5
  65. package/dist/bin/mcp-sessions.js +2 -2
  66. package/dist/bin/orchestration-metrics.js +5 -5
  67. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  68. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  69. package/dist/bin/reconcile-backlog.js +2 -2
  70. package/dist/bin/registry-proxy.js +1 -1
  71. package/dist/bin/repair-document-chunks.js +7 -7
  72. package/dist/bin/scan-tasks.js +14 -17
  73. package/dist/bin/setup.js +2 -2
  74. package/dist/bin/shard-migrate.js +8 -8
  75. package/dist/bin/stack-update.js +4 -4
  76. package/dist/bin/vps-health-gate.js +1 -1
  77. package/dist/{boot-generation-HG6LLZLY.js → boot-generation-4W4CDJSX.js} +4 -4
  78. package/dist/{boot-review-sections-STZ5EAIL.js → boot-review-sections-HJN25GMU.js} +12 -15
  79. package/dist/{bug-landed-reconciler-EO72HUI2.js → bug-landed-reconciler-GGQU6G2L.js} +6 -6
  80. package/dist/build-info.json +3 -3
  81. package/dist/build-manifest.json +989 -989
  82. package/dist/{capability-cards-C3SMHB2E.js → capability-cards-EV7VHL3W.js} +3 -3
  83. package/dist/{capacity-monitor-UI553HRL.js → capacity-monitor-YO3WRSRY.js} +14 -17
  84. package/dist/{catchup-brief-VE2X4HML.js → catchup-brief-4XFFW3H2.js} +21 -23
  85. package/dist/{chunk-R7QZXQPU.js → chunk-22XJWSWN.js} +216 -147
  86. package/dist/{chunk-XGPBHKU3.js → chunk-26CY4EAR.js} +2 -2
  87. package/dist/{chunk-E2Z3F26R.js → chunk-2A556FNI.js} +1 -1
  88. package/dist/{chunk-EIM7OGTD.js → chunk-2AXJRXA6.js} +2 -2
  89. package/dist/{chunk-DE2V7547.js → chunk-2CG3LHI6.js} +2 -2
  90. package/dist/{chunk-VLAENYCN.js → chunk-2K7IKLBL.js} +1 -1
  91. package/dist/{chunk-6JLVCMKH.js → chunk-2LJ2GZEE.js} +1 -1
  92. package/dist/{chunk-7I6KVKFF.js → chunk-2OIVIPU7.js} +3 -3
  93. package/dist/{chunk-6TB7UXCA.js → chunk-2Q2U3NB2.js} +1 -1
  94. package/dist/{chunk-QUK3UDZV.js → chunk-2WOHFX4Z.js} +1 -1
  95. package/dist/{chunk-23XUZHB7.js → chunk-2YK5HP2B.js} +245 -36
  96. package/dist/{chunk-LMF2YC5C.js → chunk-2YZZR2BW.js} +4 -4
  97. package/dist/{chunk-VMHZSZQJ.js → chunk-3ARSKDHC.js} +52 -0
  98. package/dist/{chunk-IZ24HRDC.js → chunk-3UEDFBDE.js} +3 -3
  99. package/dist/{chunk-TCV3WA5I.js → chunk-3WNDI5KT.js} +1 -1
  100. package/dist/{chunk-W5XAB2SW.js → chunk-47UBJKS3.js} +271 -167
  101. package/dist/{chunk-TBYWOHTE.js → chunk-4THJIDJE.js} +1 -1
  102. package/dist/{chunk-HRYWB4TO.js → chunk-4XY33GRO.js} +2 -2
  103. package/dist/{chunk-PCFYNK7V.js → chunk-53GNYXNR.js} +2 -2
  104. package/dist/{chunk-OFT5KSBM.js → chunk-54Q7M2AG.js} +1 -1
  105. package/dist/{chunk-GG73NHZD.js → chunk-575FWHQJ.js} +2 -2
  106. package/dist/{chunk-4W7Y67B5.js → chunk-5BWN6A5E.js} +1 -1
  107. package/dist/{chunk-KBHK2WNO.js → chunk-5F3E57TQ.js} +1 -1
  108. package/dist/{chunk-4S6H2NWS.js → chunk-5JHIAGZY.js} +1 -1
  109. package/dist/{chunk-IPANAGA3.js → chunk-5Q64Q5ZD.js} +1 -1
  110. package/dist/{chunk-LVEMYNYH.js → chunk-5WNZGNQL.js} +3 -3
  111. package/dist/{chunk-HYZV25LY.js → chunk-67IVG6CB.js} +1 -11
  112. package/dist/{chunk-5N34MMKS.js → chunk-6APOLYIZ.js} +43 -3
  113. package/dist/{chunk-HFXBL7XE.js → chunk-6T5RC3L4.js} +1 -1
  114. package/dist/{chunk-HUMNRJZE.js → chunk-6TOV7UVU.js} +4 -4
  115. package/dist/{chunk-HNGAM3U4.js → chunk-7QFRZT4H.js} +3 -3
  116. package/dist/{chunk-52Z435PH.js → chunk-7RVTQXST.js} +15 -10
  117. package/dist/{chunk-SY53PYLU.js → chunk-7WCYJXOF.js} +1 -1
  118. package/dist/{chunk-IURGBN5B.js → chunk-AEEAQZ3E.js} +4 -4
  119. package/dist/{chunk-HFSFWMID.js → chunk-AEOB4JCJ.js} +3 -3
  120. package/dist/{chunk-DM4VTXM6.js → chunk-AGXV5HLA.js} +4 -4
  121. package/dist/{chunk-NDCW4G55.js → chunk-AGY2KUQ6.js} +1 -1
  122. package/dist/{chunk-6RRPVE5O.js → chunk-APKEGWFB.js} +3 -3
  123. package/dist/{chunk-FJKUFMNF.js → chunk-ASA2UJDH.js} +1 -1
  124. package/dist/{chunk-GRAMRMWS.js → chunk-AWTLUJZL.js} +2 -2
  125. package/dist/{chunk-BHDDDNC6.js → chunk-B34RSIUP.js} +2 -2
  126. package/dist/{chunk-BPBEJD7U.js → chunk-B55U5BKF.js} +1 -1
  127. package/dist/{chunk-UXJAW4IQ.js → chunk-BBTNF72N.js} +2 -2
  128. package/dist/{chunk-IPBNHPTE.js → chunk-BIHPY7JW.js} +9 -9
  129. package/dist/{chunk-SYUJCVJG.js → chunk-BPXWWD7P.js} +1 -1
  130. package/dist/{chunk-G2M7WQ2M.js → chunk-CBC3JCIF.js} +1 -1
  131. package/dist/{chunk-GKPPLIMJ.js → chunk-CEHGXPMO.js} +4 -4
  132. package/dist/{chunk-L5CPS34O.js → chunk-CKRZBQ2K.js} +1 -1
  133. package/dist/{chunk-NHQWPKX7.js → chunk-CPC75PXE.js} +2 -2
  134. package/dist/{chunk-OEHZ46WQ.js → chunk-DLHE4PCM.js} +4 -4
  135. package/dist/{chunk-RZ23QQCI.js → chunk-DWK5HEKY.js} +4 -4
  136. package/dist/{chunk-YUAOQJVV.js → chunk-E2346GKI.js} +2 -2
  137. package/dist/{chunk-VYKXRSHU.js → chunk-E3ZO4EL3.js} +1 -1
  138. package/dist/{chunk-GTRB6DGI.js → chunk-FCX2XHIC.js} +2 -2
  139. package/dist/{chunk-K7DAE2HO.js → chunk-FOZSHNET.js} +19 -6
  140. package/dist/{chunk-7P2TDFZL.js → chunk-FRJICRED.js} +1 -1
  141. package/dist/{chunk-XCPD7NGP.js → chunk-FUEKSCTN.js} +1 -1
  142. package/dist/{chunk-B3ISLIKE.js → chunk-FYKEL2L6.js} +2 -2
  143. package/dist/{chunk-SFGFNJBR.js → chunk-FZT7CBXB.js} +1 -1
  144. package/dist/{chunk-NFNM64A7.js → chunk-GGT6Y5AN.js} +22 -18
  145. package/dist/{chunk-Q4GS5VW7.js → chunk-H5H2LGVE.js} +3 -3
  146. package/dist/{chunk-GEQQGN3J.js → chunk-HCBISGUU.js} +7 -7
  147. package/dist/{chunk-FZT4VQP7.js → chunk-HKAWEIB2.js} +1 -1
  148. package/dist/{chunk-QK3Z4TKQ.js → chunk-HLNRLXUS.js} +5 -5
  149. package/dist/{chunk-FBZ32BD4.js → chunk-HNJLAMD3.js} +1 -1
  150. package/dist/{chunk-6EY6OFBC.js → chunk-I35OMCL3.js} +2 -2
  151. package/dist/{chunk-OISOA6NX.js → chunk-IHBYJG7N.js} +1 -1
  152. package/dist/{chunk-KIJRAZWR.js → chunk-IQCC6WFI.js} +1 -1
  153. package/dist/{chunk-EHILXBVT.js → chunk-IUAW7FVX.js} +3 -3
  154. package/dist/{chunk-OE7TAEOG.js → chunk-IXRYS5X3.js} +1 -1
  155. package/dist/{chunk-4Q7H3TO7.js → chunk-J6RTX7XT.js} +1 -1
  156. package/dist/{chunk-BIV4IHED.js → chunk-JDZNGC4O.js} +15 -28
  157. package/dist/{chunk-JJYAETCO.js → chunk-JTXXLNYD.js} +4 -4
  158. package/dist/{chunk-YVS77JPW.js → chunk-JZ23D5YF.js} +3 -3
  159. package/dist/{chunk-QYIR64RR.js → chunk-K464YYT5.js} +1 -1
  160. package/dist/{chunk-BM467PZN.js → chunk-K6XWIJN7.js} +1 -1
  161. package/dist/{chunk-DIKLSAJE.js → chunk-KNEEOZWN.js} +1 -1
  162. package/dist/{chunk-3MDUKF3N.js → chunk-LBEBSXZA.js} +5 -4
  163. package/dist/{chunk-NK4JHJNP.js → chunk-LCXWQVOD.js} +4 -4
  164. package/dist/{chunk-3AL2LO3L.js → chunk-LZS2B2JT.js} +1 -1
  165. package/dist/{chunk-W2VDJKTB.js → chunk-MNWN3SQ3.js} +1 -1
  166. package/dist/{chunk-ZEHBSA25.js → chunk-MQD3JJCO.js} +1 -1
  167. package/dist/{chunk-KPLMY2GT.js → chunk-NUEDA2US.js} +4 -4
  168. package/dist/{chunk-F5ZRHLG5.js → chunk-NYV4A5IG.js} +2 -2
  169. package/dist/{chunk-M7774YLB.js → chunk-O5RKAXCG.js} +1 -1
  170. package/dist/{chunk-GPWXUU3L.js → chunk-OUUNFTS4.js} +1 -1
  171. package/dist/{chunk-G3ZYXXO7.js → chunk-PCF4QMJS.js} +10 -10
  172. package/dist/{chunk-HRKN3DQE.js → chunk-PONGX3YG.js} +7 -7
  173. package/dist/{chunk-JR3GTBV3.js → chunk-QH2V67NX.js} +1 -1
  174. package/dist/{chunk-4O7OUBEX.js → chunk-QKHQTHE6.js} +27 -15
  175. package/dist/{chunk-4M24XCTI.js → chunk-R2ZHPVF2.js} +53 -7
  176. package/dist/{chunk-HK7HIDXP.js → chunk-R3N5BCMM.js} +1 -1
  177. package/dist/{chunk-IUBCS6TA.js → chunk-RWM6TZH6.js} +3 -3
  178. package/dist/{chunk-N3JEYUDV.js → chunk-RXICR3D7.js} +1 -1
  179. package/dist/{chunk-QPMKVSHU.js → chunk-S2DTXCV6.js} +2 -2
  180. package/dist/{chunk-YLWKWEJJ.js → chunk-SLG3T26A.js} +3 -3
  181. package/dist/{chunk-7R7KDRKV.js → chunk-SUGAHHVR.js} +1 -1
  182. package/dist/{chunk-SGR4ZQAV.js → chunk-T7W75LII.js} +3 -3
  183. package/dist/{agent-defs-generator-QN3J6FVJ.js → chunk-TU5Y5ZNC.js} +4 -21
  184. package/dist/{chunk-LE3DIA25.js → chunk-UBTKHJCB.js} +6 -6
  185. package/dist/{chunk-ZYOIH5NY.js → chunk-UF5BDAF6.js} +6 -6
  186. package/dist/{chunk-4RQ62XXK.js → chunk-UG3YOQAC.js} +5 -5
  187. package/dist/{chunk-7LTAA55U.js → chunk-V7AID6MC.js} +1 -1
  188. package/dist/{chunk-SA66WRBT.js → chunk-WLV27PAO.js} +1 -1
  189. package/dist/{chunk-XAGIZVYI.js → chunk-WSYIQKZ6.js} +180 -1624
  190. package/dist/{chunk-KCRSJ3VU.js → chunk-WZPD4QSE.js} +2 -2
  191. package/dist/{chunk-APVU4Q5B.js → chunk-X2EBM5BQ.js} +16 -16
  192. package/dist/{chunk-XFGS22VE.js → chunk-XBCIRNNU.js} +1 -1
  193. package/dist/{chunk-M4N7I2H5.js → chunk-XC2KAJK4.js} +5 -5
  194. package/dist/{chunk-WYNIWJRN.js → chunk-XCKTCOK3.js} +5 -5
  195. package/dist/{chunk-PZDAPIQL.js → chunk-XJQGS4IM.js} +1 -1
  196. package/dist/{chunk-DACRR362.js → chunk-XMMWBLQK.js} +6 -6
  197. package/dist/{chunk-T2PAFWRK.js → chunk-YC6SZFVD.js} +5 -5
  198. package/dist/{chunk-6ZW6BRI4.js → chunk-YJ7MCZSY.js} +2 -2
  199. package/dist/{chunk-DMYJVGQM.js → chunk-YSDSQRE2.js} +1 -1
  200. package/dist/{chunk-R6CKQLEA.js → chunk-YWZGDFAL.js} +1 -1
  201. package/dist/{chunk-C426MZMD.js → chunk-ZBXZFOIF.js} +3 -3
  202. package/dist/{chunk-ME733Y2F.js → chunk-ZEDLED43.js} +37 -9
  203. package/dist/{cleanup-graph-garbage-NKAJSCWZ.js → cleanup-graph-garbage-N7FTWU6C.js} +8 -8
  204. package/dist/{cli-shutdown-F3DFDCB5.js → cli-shutdown-NCBQTN7G.js} +1 -1
  205. package/dist/{cloud-sync-command-3YBLSMAL.js → cloud-sync-command-UL7GNN3J.js} +2 -2
  206. package/dist/{cloud-sync-db-init-JWSPAFKY.js → cloud-sync-db-init-ASM7ZXBH.js} +1 -1
  207. package/dist/{cloud-sync-shutdown-4R6RIO67.js → cloud-sync-shutdown-HER4ISBU.js} +3 -3
  208. package/dist/{co-activation-2ZRANV3Q.js → co-activation-V5XXR327.js} +3 -3
  209. package/dist/{co-occurrence-6EELW2L2.js → co-occurrence-MKZ6YWSQ.js} +6 -6
  210. package/dist/{consent-passphrase-TDR263MC.js → consent-passphrase-YI3J4UEL.js} +2 -2
  211. package/dist/content-extractor-GWF2T7FK.js +13 -0
  212. package/dist/{conversation-entity-extractor-KUJN3MOH.js → conversation-entity-extractor-66G7ROQ3.js} +3 -3
  213. package/dist/{crdt-sync-IX43KVQ3.js → crdt-sync-Z62SWOKD.js} +4 -4
  214. package/dist/{crm-webhook-GSCIW6CE.js → crm-webhook-6GBACWJX.js} +2 -2
  215. package/dist/{cto-delegation-gate-ZWD4EFRR.js → cto-delegation-gate-FUKPBFCM.js} +12 -15
  216. package/dist/{daemon-orchestration-WL6V4QL4.js → daemon-orchestration-O3QPSJEP.js} +19 -21
  217. package/dist/{doc-graph-extractor-NJ7ZZC2C.js → doc-graph-extractor-BBPKLIVM.js} +6 -6
  218. package/dist/{documents-O7WYZFFE.js → documents-NILTWYSQ.js} +8 -8
  219. package/dist/{dreaming-TUESPDT3.js → dreaming-KMDGPIFY.js} +17 -20
  220. package/dist/{employee-boot-brief-UCP6QLN4.js → employee-boot-brief-KSH3MWIF.js} +23 -25
  221. package/dist/{entity-boost-TK43XT24.js → entity-boost-XETN7C2S.js} +2 -2
  222. package/dist/{exe-drift-QD6LUZT2.js → exe-drift-SFD7SHXC.js} +4 -4
  223. package/dist/{exe-export-QIUNHFSS.js → exe-export-NHWKEZL4.js} +9 -9
  224. package/dist/{exe-import-3UFOLHEW.js → exe-import-SPI5HJBU.js} +9 -9
  225. package/dist/{exe-key-D5NDKGHT.js → exe-key-TY5LFUEM.js} +95 -95
  226. package/dist/{exe-org-UWDJBOCV.js → exe-org-LVQLXA7C.js} +32 -32
  227. package/dist/{exe-snapshot-P6SFODEN.js → exe-snapshot-WH2DSRZW.js} +20 -23
  228. package/dist/{fast-db-init-SD7JZSEC.js → fast-db-init-UN225WS7.js} +1 -1
  229. package/dist/{founder-context-QIXDZIJX.js → founder-context-DVHSVBM5.js} +2 -2
  230. package/dist/{founder-monitor-envelope-TLOC4UYG.js → founder-monitor-envelope-HMPPUBUT.js} +4 -4
  231. package/dist/gateway/index.js +14 -14
  232. package/dist/{gateway-client-CQTSYJLP.js → gateway-client-TXHCHOVM.js} +1 -1
  233. package/dist/{git-staleness-JSQTHB4Z.js → git-staleness-CUVLXQOJ.js} +3 -3
  234. package/dist/{global-procedures-T3RKI4QX.js → global-procedures-T5W3S6OU.js} +5 -5
  235. package/dist/{graph-auto-extract-V75GSTNX.js → graph-auto-extract-S7OIZXYP.js} +6 -6
  236. package/dist/{graph-query-VAQN2RK3.js → graph-query-CRIH4DXF.js} +1 -1
  237. package/dist/{graph-rag-GBA5E3QC.js → graph-rag-LH34CEGC.js} +3 -3
  238. package/dist/{hook-integrity-II6QK6Y4.js → hook-integrity-TSJYZFZ6.js} +1 -1
  239. package/dist/{hook-prefetch-5EHPOYY3.js → hook-prefetch-SNW5DFCZ.js} +13 -16
  240. package/dist/hooks/bug-report-worker.js +17 -20
  241. package/dist/hooks/codex-stop-task-finalizer.js +19 -22
  242. package/dist/hooks/commit-complete.js +16 -19
  243. package/dist/hooks/error-recall.js +14 -14
  244. package/dist/hooks/exe-heartbeat-hook.js +5 -5
  245. package/dist/hooks/ingest-worker.js +18 -20
  246. package/dist/hooks/ingest.js +16 -16
  247. package/dist/hooks/instructions-loaded.js +7 -7
  248. package/dist/hooks/manifest.json +20 -20
  249. package/dist/hooks/notification.js +6 -6
  250. package/dist/hooks/post-compact.js +5 -5
  251. package/dist/hooks/post-tool-combined.js +13 -13
  252. package/dist/hooks/pre-compact.js +16 -19
  253. package/dist/hooks/pre-tool-use.js +2 -2
  254. package/dist/hooks/prompt-submit.js +40 -39
  255. package/dist/hooks/session-end.js +21 -24
  256. package/dist/hooks/session-start.js +18 -18
  257. package/dist/hooks/stop.js +19 -22
  258. package/dist/hooks/subagent-stop.js +18 -21
  259. package/dist/hooks/summary-worker.js +20 -23
  260. package/dist/index.js +25 -28
  261. package/dist/{installer-XEEZSF3V.js → installer-4IVP2PTX.js} +7 -8
  262. package/dist/{installer-ILYC4LI5.js → installer-CJWNUASI.js} +7 -8
  263. package/dist/{installer-MPVQ5L22.js → installer-UFRZHMX5.js} +7 -8
  264. package/dist/{intercom-queue-QGHAW2KO.js → intercom-queue-II6RRK3J.js} +12 -15
  265. package/dist/lib/cloud-sync.js +16 -16
  266. package/dist/lib/consolidation.js +9 -9
  267. package/dist/lib/crypto.js +3 -3
  268. package/dist/lib/database.js +3 -3
  269. package/dist/lib/db-backup.js +1 -1
  270. package/dist/lib/db-write-worker.js +3 -3
  271. package/dist/lib/db.js +3 -3
  272. package/dist/lib/device-registry.js +1 -1
  273. package/dist/lib/employee-templates.js +6 -6
  274. package/dist/lib/employees.js +3 -3
  275. package/dist/lib/error-detector.js +2 -2
  276. package/dist/lib/exe-daemon.js +83 -86
  277. package/dist/lib/hybrid-search.js +11 -11
  278. package/dist/lib/identity.js +5 -3
  279. package/dist/lib/keychain.js +1 -1
  280. package/dist/lib/license.js +2 -2
  281. package/dist/lib/messaging.js +13 -16
  282. package/dist/lib/post-tool-memory.js +16 -18
  283. package/dist/lib/registry-proxy.js +1 -1
  284. package/dist/lib/reminders.js +4 -4
  285. package/dist/lib/schedules.js +8 -8
  286. package/dist/lib/session-registry.js +5 -5
  287. package/dist/lib/skill-learning.js +9 -9
  288. package/dist/lib/store.js +7 -7
  289. package/dist/lib/task-router.js +4 -4
  290. package/dist/lib/tasks.js +14 -17
  291. package/dist/lib/tmux-routing.js +14 -41
  292. package/dist/lib/token-spend.js +4 -4
  293. package/dist/lib/ws-client.js +1 -1
  294. package/dist/{license-gate-CARN6AB6.js → license-gate-M7EDJLAA.js} +3 -3
  295. package/dist/{license-recheck-7Z3LS6YS.js → license-recheck-DLTOHAH2.js} +1 -1
  296. package/dist/{license-sync-PUQV3HSZ.js → license-sync-YTDCUN3S.js} +2 -2
  297. package/dist/mcp/register-tools.js +94 -94
  298. package/dist/mcp/server.js +97 -97
  299. package/dist/mcp/tools/complete-reminder.js +5 -5
  300. package/dist/mcp/tools/create-reminder.js +5 -5
  301. package/dist/mcp/tools/create-task.js +16 -19
  302. package/dist/mcp/tools/deactivate-behavior.js +10 -10
  303. package/dist/mcp/tools/list-reminders.js +5 -5
  304. package/dist/mcp/tools/list-tasks.js +16 -19
  305. package/dist/mcp/tools/send-message.js +15 -18
  306. package/dist/mcp/tools/update-task.js +15 -18
  307. package/dist/{mcp-http-config-RJKTZPHZ.js → mcp-http-config-652YK3CI.js} +5 -5
  308. package/dist/{mcp-session-identity-HN444A3G.js → mcp-session-identity-6QGXD52Y.js} +12 -15
  309. package/dist/{memory-cards-AT3QCCWU.js → memory-cards-FOPSLULE.js} +8 -8
  310. package/dist/{memory-graph-extractor-B43UWGV5.js → memory-graph-extractor-7G3CIGN7.js} +7 -7
  311. package/dist/{memory-maintenance-WDLL3ZX3.js → memory-maintenance-5XIGUPYL.js} +1 -1
  312. package/dist/{memory-poisoning-defense-TS4WNW4S.js → memory-poisoning-defense-MI7Y5XBP.js} +3 -3
  313. package/dist/{memory-pressure-watchdog-6YH7S6W7.js → memory-pressure-watchdog-SPIDPGU2.js} +13 -16
  314. package/dist/{memory-reflection-N6NSYW6S.js → memory-reflection-DVAT4QKS.js} +8 -8
  315. package/dist/{memory-write-repository-D35RDO62.js → memory-write-repository-YC7HJTV5.js} +1 -1
  316. package/dist/{monitor-grants-FH4PNYN5.js → monitor-grants-3A77O6XK.js} +3 -3
  317. package/dist/{monitor-identity-LK5ZCCND.js → monitor-identity-BTFFMFEX.js} +2 -2
  318. package/dist/{notification-ledger-3WJYJGGS.js → notification-ledger-AV5242RM.js} +13 -16
  319. package/dist/{notifications-T5C2CVB3.js → notifications-75FVPJLY.js} +12 -15
  320. package/dist/{orchestration-events-73VEJT7Q.js → orchestration-events-ARGZU6KS.js} +4 -4
  321. package/dist/{orchestrator-3O657734.js → orchestrator-TCXZMLSB.js} +14 -17
  322. package/dist/{org-brief-session-EGB35QLM.js → org-brief-session-B455POUI.js} +15 -15
  323. package/dist/{org-consent-policy-MSVSRI53.js → org-consent-policy-7K5H6FOB.js} +5 -5
  324. package/dist/{org-join-4BK2XJJI.js → org-join-ETR5KO27.js} +9 -9
  325. package/dist/{org-key-admin-EUSSGXQ3.js → org-key-admin-IRC6H3TL.js} +11 -11
  326. package/dist/{org-key-epoch-NMEWDT5L.js → org-key-epoch-EG4YQ47A.js} +5 -5
  327. package/dist/{org-key-pin-HUSXGINB.js → org-key-pin-GLQEU3P3.js} +3 -3
  328. package/dist/{org-membership-B74IWEM5.js → org-membership-JC5YVU6N.js} +4 -4
  329. package/dist/{org-partner-config-5FJTJABN.js → org-partner-config-QFSVGHEA.js} +8 -8
  330. package/dist/{org-partner-runtime-GN4GFWI2.js → org-partner-runtime-7AD7WY3Y.js} +15 -15
  331. package/dist/{org-row-visibility-PBZ2TSCR.js → org-row-visibility-AXZKVOA6.js} +1 -1
  332. package/dist/{pipeline-router-2IELBSVJ.js → pipeline-router-2KY4X6PO.js} +4 -4
  333. package/dist/{plan-limits-4GXK5PFT.js → plan-limits-PG6HG2DT.js} +6 -6
  334. package/dist/{pre-tool-use-impl-CY73PRJP.js → pre-tool-use-impl-45B4NFIF.js} +34 -32
  335. package/dist/{project-name-337ERIAX.js → project-name-LHYHR4VN.js} +4 -4
  336. package/dist/{projection-worker-W476IG6V.js → projection-worker-POT2AOR5.js} +2 -2
  337. package/dist/{prospective-memory-5INB7NUL.js → prospective-memory-ECXSAEAW.js} +3 -3
  338. package/dist/{push-notifications-YVOP4KGN.js → push-notifications-W3UNHDC5.js} +13 -16
  339. package/dist/{reproject-worktree-memories-OGBR3CMO.js → reproject-worktree-memories-PIXMJBHG.js} +12 -15
  340. package/dist/{reranker-W7WCJH6Y.js → reranker-ZBPYIRBB.js} +1 -1
  341. package/dist/{retrieval-health-R6MGXLTP.js → retrieval-health-42MFLOEP.js} +1 -1
  342. package/dist/{review-polling-TKAWVY6G.js → review-polling-V4CSK4TZ.js} +13 -16
  343. package/dist/runtime/index.js +16 -19
  344. package/dist/{session-events-HUCZ7TOR.js → session-events-C3NUY6MR.js} +13 -16
  345. package/dist/{session-kill-telemetry-RWRWOW4C.js → session-kill-telemetry-ZOSAIYU2.js} +13 -16
  346. package/dist/{session-scope-5CDRHV75.js → session-scope-BZALGKYZ.js} +12 -15
  347. package/dist/{setup-wizard-RBTJAZOP.js → setup-wizard-DNA2UT4J.js} +2 -2
  348. package/dist/{shard-manager-LRPAAQA4.js → shard-manager-NG4SXV7L.js} +2 -2
  349. package/dist/{skill-refinement-MDXKDCY6.js → skill-refinement-Y3M7XBRE.js} +4 -4
  350. package/dist/{skill-retrieval-OWY6MTCX.js → skill-retrieval-XDY352AS.js} +11 -11
  351. package/dist/{skill-usage-GNV737U5.js → skill-usage-QOLIJQJC.js} +4 -4
  352. package/dist/{stack-generate-manifest-S4SBLKBY.js → stack-generate-manifest-VFHCOLAD.js} +4 -4
  353. package/dist/{stack-promote-U4EZNLOV.js → stack-promote-24BY6AXF.js} +4 -4
  354. package/dist/{stack-release-4VBGOYGK.js → stack-release-AXH7ZIOR.js} +5 -5
  355. package/dist/{stack-update-C5YKHE7A.js → stack-update-7ET7S3ED.js} +3 -3
  356. package/dist/{steward-gate-QFPXQBUZ.js → steward-gate-2MUESY3V.js} +4 -4
  357. package/dist/{subagent-brief-injection-GDXO5WNS.js → subagent-brief-injection-6PM3WMMR.js} +25 -27
  358. package/dist/{support-bug-actions-4XEKXIIO.js → support-bug-actions-WWKDXT74.js} +3 -3
  359. package/dist/{support-inbox-Y7AFCOGM.js → support-inbox-AN44HIOG.js} +12 -12
  360. package/dist/{task-enforcement-CN3Q4PEH.js → task-enforcement-QO7RXYK2.js} +13 -16
  361. package/dist/{task-request-inbox-AY3C6DND.js → task-request-inbox-RXAT2QJF.js} +5 -5
  362. package/dist/{task-scope-AMR3Z3DJ.js → task-scope-4EKZBTTM.js} +12 -15
  363. package/dist/{tasks-crud-2GHKIZOM.js → tasks-crud-MB7WXGPW.js} +14 -15
  364. package/dist/{tasks-notify-Z53446KM.js → tasks-notify-BCWO7AP6.js} +13 -16
  365. package/dist/{tasks-review-APRNSHMQ.js → tasks-review-HXHYA76X.js} +12 -15
  366. package/dist/{telemetry-upload-5XR42SQN.js → telemetry-upload-Q7DLE5I3.js} +8 -8
  367. package/dist/{token-budget-TTNJXI7W.js → token-budget-EL6BEBDP.js} +4 -4
  368. package/dist/{tool-telemetry-36ST422N.js → tool-telemetry-SNWF4WDH.js} +1 -1
  369. package/dist/tui/App.js +22 -25
  370. package/dist/{tui-data-AP5TPUOQ.js → tui-data-ZMSBEPJT.js} +16 -19
  371. package/dist/{update-support-SFTI2PUD.js → update-support-QY7WALUZ.js} +11 -11
  372. package/dist/{whatsapp-5CXE3JHG.js → whatsapp-NCZ43BB3.js} +2 -2
  373. package/dist/{wiki-acl-N754BC2W.js → wiki-acl-3L7BRJUV.js} +1 -1
  374. package/dist/{work-claims-OAICQBWO.js → work-claims-XQXT2VWJ.js} +4 -4
  375. package/dist/{work-state-heartbeat-MTTUGMPU.js → work-state-heartbeat-GAIQ7M73.js} +1 -1
  376. package/dist/{workflow-engine-RID3QL2U.js → workflow-engine-FCOOI5M6.js} +2 -2
  377. package/dist/{worktree-XWVNDBRD.js → worktree-GS4ODQ4C.js} +5 -5
  378. package/dist/{worktree-sweep-6VEHGH7U.js → worktree-sweep-6LMC7H5Y.js} +6 -6
  379. package/package.json +1 -1
  380. package/release-notes.json +27 -9
  381. package/stack.release.json +3 -3
  382. package/dist/chunk-ESO5JDOT.js +0 -70
  383. package/dist/content-extractor-OVD7PTSN.js +0 -9
  384. /package/dist/{chunk-EZQ4W3WW.js → chunk-7ZP2PAW3.js} +0 -0
  385. /package/dist/{chunk-YBB43SXC.js → chunk-AC36VWNB.js} +0 -0
  386. /package/dist/{chunk-YG4DZZ6J.js → chunk-CS4SHHLY.js} +0 -0
  387. /package/dist/{chunk-33PG3KNY.js → chunk-FDQXQBBC.js} +0 -0
  388. /package/dist/{chunk-OLMLA377.js → chunk-IKJUZ3VO.js} +0 -0
  389. /package/dist/{chunk-FUZHMV7K.js → chunk-JXGOO53U.js} +0 -0
  390. /package/dist/{chunk-WIDOLS7T.js → chunk-LAWI42NC.js} +0 -0
  391. /package/dist/{chunk-PKM456D2.js → chunk-LK6OG47X.js} +0 -0
  392. /package/dist/{chunk-FLO24BNN.js → chunk-R6H2IRCF.js} +0 -0
  393. /package/dist/{chunk-64UAHPXA.js → chunk-UQKGV6SX.js} +0 -0
  394. /package/dist/{chunk-CLV7ALXV.js → chunk-XDWIJBTY.js} +0 -0
  395. /package/dist/{chunk-LDHJX4TZ.js → chunk-XJDSTA2C.js} +0 -0
  396. /package/dist/{chunk-OEEHLATI.js → chunk-ZQS4S4AX.js} +0 -0
  397. /package/dist/{core-memory-WR7I7DIP.js → core-memory-3TZV3ZDW.js} +0 -0
  398. /package/dist/{memory-isolation-4RQJ5RCK.js → memory-isolation-TE4AOMQX.js} +0 -0
  399. /package/dist/{oauth-server-VBDMZIEV.js → oauth-server-CWQ6EBGQ.js} +0 -0
  400. /package/dist/{project-boot-G7T5WHO6.js → project-boot-MX2FNKTJ.js} +0 -0
@@ -14,37 +14,101 @@ import {
14
14
  import {
15
15
  buildClaudeHttpMcpEntry,
16
16
  buildClaudeStdioProxyMcpEntry
17
- } from "./chunk-6ZW6BRI4.js";
18
- import {
19
- ensureAllAgentSymlinks
20
- } from "./chunk-ESO5JDOT.js";
17
+ } from "./chunk-YJ7MCZSY.js";
21
18
  import {
22
19
  MCP_LEGACY_KEY,
23
20
  MCP_PRIMARY_KEY
24
- } from "./chunk-HYZV25LY.js";
21
+ } from "./chunk-67IVG6CB.js";
22
+ import {
23
+ loadEmployees
24
+ } from "./chunk-LBEBSXZA.js";
25
25
  import {
26
26
  loadConfigSync
27
27
  } from "./chunk-MMS2HBRT.js";
28
28
 
29
29
  // src/adapters/claude/installer.ts
30
30
  import { readFile, writeFile, mkdir, readdir, rm } from "fs/promises";
31
- import { existsSync, readFileSync, writeFileSync, copyFileSync, mkdirSync, realpathSync, statSync } from "fs";
31
+ import { existsSync as existsSync2, readFileSync, writeFileSync, copyFileSync, mkdirSync as mkdirSync2, realpathSync, statSync } from "fs";
32
32
  import { createHash } from "crypto";
33
- import path from "path";
34
- import os from "os";
33
+ import path2 from "path";
34
+ import os2 from "os";
35
35
  import { execSync } from "child_process";
36
36
  import { fileURLToPath } from "url";
37
+
38
+ // src/lib/agent-symlinks.ts
39
+ import os from "os";
40
+ import path from "path";
41
+ import {
42
+ existsSync,
43
+ lstatSync,
44
+ mkdirSync,
45
+ readlinkSync,
46
+ symlinkSync
47
+ } from "fs";
48
+ function claudeAgentsDir(homeDir) {
49
+ return path.join(homeDir, ".claude", "agents");
50
+ }
51
+ function identitySourcePath(homeDir, agentId) {
52
+ return path.join(homeDir, ".exe-os", "identity", `${agentId}.md`);
53
+ }
54
+ function claudeAgentLinkPath(homeDir, agentId) {
55
+ return path.join(claudeAgentsDir(homeDir), `${agentId}.md`);
56
+ }
57
+ function ensureAgentSymlink(agentId, homeDir = os.homedir()) {
58
+ const target = identitySourcePath(homeDir, agentId);
59
+ const link = claudeAgentLinkPath(homeDir, agentId);
60
+ mkdirSync(claudeAgentsDir(homeDir), { recursive: true });
61
+ if (existsSync(link)) {
62
+ let stat;
63
+ try {
64
+ stat = lstatSync(link);
65
+ } catch {
66
+ return { agentId, action: "conflict", target, link, conflict: "stat_failed" };
67
+ }
68
+ if (!stat.isSymbolicLink()) {
69
+ return { agentId, action: "conflict", target, link, conflict: "regular_file" };
70
+ }
71
+ let currentTarget;
72
+ try {
73
+ currentTarget = readlinkSync(link);
74
+ } catch {
75
+ return { agentId, action: "conflict", target, link, conflict: "readlink_failed" };
76
+ }
77
+ if (currentTarget === target) {
78
+ return { agentId, action: "already_correct", target, link };
79
+ }
80
+ return { agentId, action: "conflict", target, link, conflict: `points_to:${currentTarget}` };
81
+ }
82
+ try {
83
+ symlinkSync(target, link);
84
+ } catch (err) {
85
+ return {
86
+ agentId,
87
+ action: "conflict",
88
+ target,
89
+ link,
90
+ conflict: err instanceof Error ? err.message : String(err)
91
+ };
92
+ }
93
+ return { agentId, action: "created", target, link };
94
+ }
95
+ async function ensureAllAgentSymlinks(homeDir = os.homedir()) {
96
+ const employees = await loadEmployees();
97
+ return employees.map((emp) => ensureAgentSymlink(emp.name, homeDir));
98
+ }
99
+
100
+ // src/adapters/claude/installer.ts
37
101
  function assertCanonicalInstallRoot(packageRoot, opts = {}) {
38
102
  if (process.env.EXE_ALLOW_NONCANONICAL_INSTALL === "1") return;
39
103
  const real = (() => {
40
104
  try {
41
105
  return realpathSync(packageRoot);
42
106
  } catch {
43
- return path.resolve(packageRoot);
107
+ return path2.resolve(packageRoot);
44
108
  }
45
109
  })();
46
110
  const tmpRoots = [...new Set(
47
- [os.tmpdir(), "/tmp", "/private/tmp", "/var/folders", "/private/var/folders"].flatMap(
111
+ [os2.tmpdir(), "/tmp", "/private/tmp", "/var/folders", "/private/var/folders"].flatMap(
48
112
  (p) => {
49
113
  try {
50
114
  return [p, realpathSync(p)];
@@ -54,7 +118,7 @@ function assertCanonicalInstallRoot(packageRoot, opts = {}) {
54
118
  }
55
119
  )
56
120
  )];
57
- const sep = path.sep;
121
+ const sep = path2.sep;
58
122
  const ephemeral = tmpRoots.some((t) => real === t || real.startsWith(t + sep)) || real.includes(`${sep}.claude${sep}worktrees${sep}`);
59
123
  if (ephemeral) {
60
124
  throw new Error(
@@ -78,7 +142,7 @@ This checkout is a linked worktree (.git is a gitdir pointer file), so it is exp
78
142
  }
79
143
  }
80
144
  function isLinkedGitWorktree(root) {
81
- const dotGit = path.join(root, ".git");
145
+ const dotGit = path2.join(root, ".git");
82
146
  try {
83
147
  if (!statSync(dotGit).isFile()) return false;
84
148
  } catch {
@@ -92,20 +156,20 @@ function isLinkedGitWorktree(root) {
92
156
  }
93
157
  function resolvePackageRoot() {
94
158
  const thisFile = fileURLToPath(import.meta.url);
95
- let dir = path.dirname(thisFile);
96
- const root = path.parse(dir).root;
159
+ let dir = path2.dirname(thisFile);
160
+ const root = path2.parse(dir).root;
97
161
  while (dir !== root) {
98
- const pkgPath = path.join(dir, "package.json");
99
- if (existsSync(pkgPath)) {
162
+ const pkgPath = path2.join(dir, "package.json");
163
+ if (existsSync2(pkgPath)) {
100
164
  try {
101
165
  const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
102
166
  if (pkg.name === "@askexenow/exe-os" || pkg.name === "exe-os") return dir;
103
167
  } catch {
104
168
  }
105
169
  }
106
- dir = path.dirname(dir);
170
+ dir = path2.dirname(dir);
107
171
  }
108
- return path.resolve(path.dirname(thisFile), "..", "..", "..");
172
+ return path2.resolve(path2.dirname(thisFile), "..", "..", "..");
109
173
  }
110
174
  var RETIRED_TMUX_SKILLS = /* @__PURE__ */ new Set([
111
175
  "launch",
@@ -117,51 +181,51 @@ var RETIRED_TMUX_SKILLS = /* @__PURE__ */ new Set([
117
181
  "call",
118
182
  "afk"
119
183
  ]);
120
- async function copySlashCommands(packageRoot, homeDir = os.homedir()) {
184
+ async function copySlashCommands(packageRoot, homeDir = os2.homedir()) {
121
185
  let copied = 0;
122
186
  let skipped = 0;
123
- const skillsBase = path.join(homeDir, ".claude", "skills");
124
- const deprecatedExeLink = path.join(skillsBase, "exe-link");
125
- if (existsSync(deprecatedExeLink)) {
187
+ const skillsBase = path2.join(homeDir, ".claude", "skills");
188
+ const deprecatedExeLink = path2.join(skillsBase, "exe-link");
189
+ if (existsSync2(deprecatedExeLink)) {
126
190
  await rm(deprecatedExeLink, { recursive: true, force: true });
127
191
  }
128
192
  for (const retired of RETIRED_TMUX_SKILLS) {
129
- const staleDir = path.join(skillsBase, `exe-${retired}`);
130
- if (existsSync(staleDir)) {
193
+ const staleDir = path2.join(skillsBase, `exe-${retired}`);
194
+ if (existsSync2(staleDir)) {
131
195
  await rm(staleDir, { recursive: true, force: true });
132
196
  }
133
197
  }
134
- const exeDir = path.join(packageRoot, "src", "commands", "exe");
135
- if (existsSync(exeDir)) {
198
+ const exeDir = path2.join(packageRoot, "src", "commands", "exe");
199
+ if (existsSync2(exeDir)) {
136
200
  const entries = await readdir(exeDir);
137
201
  const mdFiles = entries.filter((f) => f.endsWith(".md")).filter((f) => !RETIRED_TMUX_SKILLS.has(f.replace(/\.md$/, "")));
138
202
  for (const file of mdFiles) {
139
203
  const name = file.replace(".md", "");
140
- const destDir = path.join(skillsBase, `exe-${name}`);
204
+ const destDir = path2.join(skillsBase, `exe-${name}`);
141
205
  await mkdir(destDir, { recursive: true });
142
- const srcPath = path.join(exeDir, file);
143
- const destPath = path.join(destDir, "SKILL.md");
206
+ const srcPath = path2.join(exeDir, file);
207
+ const destPath = path2.join(destDir, "SKILL.md");
144
208
  const result = await copyAsSkill(srcPath, destPath, `exe-${name}`);
145
209
  if (result) copied++;
146
210
  else skipped++;
147
211
  }
148
212
  }
149
- const topLevelSrc = path.join(packageRoot, "src", "commands", "exe.md");
150
- if (existsSync(topLevelSrc)) {
151
- const destDir = path.join(skillsBase, "exe");
213
+ const topLevelSrc = path2.join(packageRoot, "src", "commands", "exe.md");
214
+ if (existsSync2(topLevelSrc)) {
215
+ const destDir = path2.join(skillsBase, "exe");
152
216
  await mkdir(destDir, { recursive: true });
153
- const destPath = path.join(destDir, "SKILL.md");
217
+ const destPath = path2.join(destDir, "SKILL.md");
154
218
  const result = await copyAsSkill(topLevelSrc, destPath, "exe");
155
219
  if (result) copied++;
156
220
  else skipped++;
157
221
  }
158
- const referenceSrc = path.join(packageRoot, "src", "commands", "exe-reference.md");
159
- if (existsSync(referenceSrc)) {
160
- const destDir = path.join(skillsBase, "exe");
222
+ const referenceSrc = path2.join(packageRoot, "src", "commands", "exe-reference.md");
223
+ if (existsSync2(referenceSrc)) {
224
+ const destDir = path2.join(skillsBase, "exe");
161
225
  await mkdir(destDir, { recursive: true });
162
- const referenceDest = path.join(destDir, "reference.md");
226
+ const referenceDest = path2.join(destDir, "reference.md");
163
227
  const referenceContent = await readFile(referenceSrc, "utf-8");
164
- const unchanged = existsSync(referenceDest) && await readFile(referenceDest, "utf-8") === referenceContent;
228
+ const unchanged = existsSync2(referenceDest) && await readFile(referenceDest, "utf-8") === referenceContent;
165
229
  if (unchanged) {
166
230
  skipped++;
167
231
  } else {
@@ -187,7 +251,7 @@ name: ${skillName}
187
251
  `);
188
252
  }
189
253
  }
190
- if (existsSync(destPath)) {
254
+ if (existsSync2(destPath)) {
191
255
  const existing = await readFile(destPath, "utf-8");
192
256
  if (existing === content) return false;
193
257
  }
@@ -203,25 +267,25 @@ function readJsonFile(filePath) {
203
267
  }
204
268
  function findAncestorMcpJsons(startDir, homeDir) {
205
269
  const files = [];
206
- let dir = path.resolve(startDir);
207
- const root = path.parse(dir).root;
208
- const stop = path.resolve(homeDir);
270
+ let dir = path2.resolve(startDir);
271
+ const root = path2.parse(dir).root;
272
+ const stop = path2.resolve(homeDir);
209
273
  while (dir !== root) {
210
- const candidate = path.join(dir, ".mcp.json");
211
- if (existsSync(candidate)) files.push(candidate);
274
+ const candidate = path2.join(dir, ".mcp.json");
275
+ if (existsSync2(candidate)) files.push(candidate);
212
276
  if (dir === stop) break;
213
- dir = path.dirname(dir);
277
+ dir = path2.dirname(dir);
214
278
  }
215
279
  return files;
216
280
  }
217
281
  function pathApplies(projectPath, cwd) {
218
- const project = path.resolve(projectPath);
219
- const current = path.resolve(cwd);
220
- return current === project || current.startsWith(project + path.sep);
282
+ const project = path2.resolve(projectPath);
283
+ const current = path2.resolve(cwd);
284
+ return current === project || current.startsWith(project + path2.sep);
221
285
  }
222
- function detectMcpNameCollisions(homeDir = os.homedir(), cwd = process.cwd()) {
223
- const claudeJsonPath = path.join(homeDir, ".claude.json");
224
- if (!existsSync(claudeJsonPath)) return [];
286
+ function detectMcpNameCollisions(homeDir = os2.homedir(), cwd = process.cwd()) {
287
+ const claudeJsonPath = path2.join(homeDir, ".claude.json");
288
+ if (!existsSync2(claudeJsonPath)) return [];
225
289
  const claudeJson = readJsonFile(claudeJsonPath);
226
290
  if (!claudeJson?.projects) return [];
227
291
  const collisions = [];
@@ -252,7 +316,7 @@ function buildStdioMcpEntry(packageRoot) {
252
316
  return {
253
317
  type: "stdio",
254
318
  command: "node",
255
- args: [path.join(packageRoot, "dist", "mcp", "server.js")],
319
+ args: [path2.join(packageRoot, "dist", "mcp", "server.js")],
256
320
  env: {}
257
321
  };
258
322
  }
@@ -260,7 +324,7 @@ function mcpTransportMode() {
260
324
  const value = process.env.EXE_OS_MCP_TRANSPORT?.trim().toLowerCase();
261
325
  if (value === "stdio") return "stdio";
262
326
  if (value === "http") return "http";
263
- const totalGB = os.totalmem() / (1024 * 1024 * 1024);
327
+ const totalGB = os2.totalmem() / (1024 * 1024 * 1024);
264
328
  if (totalGB <= 8) return "stdio";
265
329
  return "http";
266
330
  }
@@ -272,10 +336,10 @@ function useMcpProxy() {
272
336
  return false;
273
337
  }
274
338
  }
275
- async function registerMcpServer(packageRoot, homeDir = os.homedir()) {
276
- const claudeJsonPath = path.join(homeDir, ".claude.json");
339
+ async function registerMcpServer(packageRoot, homeDir = os2.homedir()) {
340
+ const claudeJsonPath = path2.join(homeDir, ".claude.json");
277
341
  let claudeJson = {};
278
- if (existsSync(claudeJsonPath)) {
342
+ if (existsSync2(claudeJsonPath)) {
279
343
  try {
280
344
  claudeJson = JSON.parse(await readFile(claudeJsonPath, "utf-8"));
281
345
  } catch {
@@ -288,8 +352,8 @@ async function registerMcpServer(packageRoot, homeDir = os.homedir()) {
288
352
  const transportMode = mcpTransportMode();
289
353
  let proxyReady = false;
290
354
  if (transportMode === "http" && useMcpProxy()) {
291
- const proxyBin = path.join(packageRoot, "dist", "bin", "exe-os-mcp-proxy.js");
292
- proxyReady = existsSync(proxyBin);
355
+ const proxyBin = path2.join(packageRoot, "dist", "bin", "exe-os-mcp-proxy.js");
356
+ proxyReady = existsSync2(proxyBin);
293
357
  if (!proxyReady) {
294
358
  process.stderr.write(
295
359
  `exe-os: WARNING MCP proxy requested (EXE_MCP_PROXY/mcpProxy) but ${proxyBin} is missing \u2014 falling back to direct HTTP MCP entry
@@ -331,8 +395,8 @@ async function registerMcpServer(packageRoot, homeDir = os.homedir()) {
331
395
  const currentOs = claudeJson.mcpServers[MCP_PRIMARY_KEY];
332
396
  const osMatches = currentOs && JSON.stringify(currentOs) === JSON.stringify(newEntry);
333
397
  if (osMatches) {
334
- await cleanSettingsJsonMcp(path.join(homeDir, ".claude", "settings.json"));
335
- await migratePermissionsToExeOs(path.join(homeDir, ".claude", "settings.json"));
398
+ await cleanSettingsJsonMcp(path2.join(homeDir, ".claude", "settings.json"));
399
+ await migratePermissionsToExeOs(path2.join(homeDir, ".claude", "settings.json"));
336
400
  const collisions2 = detectMcpNameCollisions(homeDir, packageRoot).filter((c) => c.serverName === MCP_PRIMARY_KEY || c.serverName === MCP_LEGACY_KEY);
337
401
  for (const c of collisions2) {
338
402
  process.stderr.write(
@@ -345,11 +409,11 @@ async function registerMcpServer(packageRoot, homeDir = os.homedir()) {
345
409
  }
346
410
  claudeJson.mcpServers[MCP_PRIMARY_KEY] = newEntry;
347
411
  await writeFile(claudeJsonPath, JSON.stringify(claudeJson, null, 2) + "\n");
348
- await cleanSettingsJsonMcp(path.join(homeDir, ".claude", "settings.json"));
349
- await migratePermissionsToExeOs(path.join(homeDir, ".claude", "settings.json"));
412
+ await cleanSettingsJsonMcp(path2.join(homeDir, ".claude", "settings.json"));
413
+ await migratePermissionsToExeOs(path2.join(homeDir, ".claude", "settings.json"));
350
414
  try {
351
- const settingsPath = path.join(homeDir, ".claude", "settings.json");
352
- if (existsSync(settingsPath)) {
415
+ const settingsPath = path2.join(homeDir, ".claude", "settings.json");
416
+ if (existsSync2(settingsPath)) {
353
417
  const settings = JSON.parse(await readFile(settingsPath, "utf-8"));
354
418
  if (!settings.autoUpdatesChannel || settings.autoUpdatesChannel === "latest") {
355
419
  settings.autoUpdatesChannel = "stable";
@@ -369,11 +433,11 @@ async function registerMcpServer(packageRoot, homeDir = os.homedir()) {
369
433
  return true;
370
434
  }
371
435
  async function registerExeRustMcpConfig(packageRoot, homeDir) {
372
- const exeDir = path.join(homeDir, ".exe");
373
- const exeMcpPath = path.join(exeDir, "mcp.json");
436
+ const exeDir = path2.join(homeDir, ".exe");
437
+ const exeMcpPath = path2.join(exeDir, "mcp.json");
374
438
  await mkdir(exeDir, { recursive: true });
375
439
  let config = { servers: {} };
376
- if (existsSync(exeMcpPath)) {
440
+ if (existsSync2(exeMcpPath)) {
377
441
  try {
378
442
  config = JSON.parse(await readFile(exeMcpPath, "utf-8"));
379
443
  if (!config.servers) config.servers = {};
@@ -383,7 +447,7 @@ async function registerExeRustMcpConfig(packageRoot, homeDir) {
383
447
  }
384
448
  const stdioEntry = {
385
449
  command: "node",
386
- args: [path.join(packageRoot, "dist", "mcp", "server.js")],
450
+ args: [path2.join(packageRoot, "dist", "mcp", "server.js")],
387
451
  env: {},
388
452
  shared: true
389
453
  };
@@ -399,7 +463,7 @@ async function registerExeRustMcpConfig(packageRoot, homeDir) {
399
463
  process.stderr.write("exe-os: registered MCP server in ~/.exe/mcp.json (Rust runtime)\n");
400
464
  }
401
465
  async function cleanSettingsJsonMcp(settingsPath) {
402
- if (!existsSync(settingsPath)) return;
466
+ if (!existsSync2(settingsPath)) return;
403
467
  try {
404
468
  const settings = JSON.parse(await readFile(settingsPath, "utf-8"));
405
469
  const servers = settings.mcpServers;
@@ -420,7 +484,7 @@ async function cleanSettingsJsonMcp(settingsPath) {
420
484
  }
421
485
  }
422
486
  async function migratePermissionsToExeOs(settingsPath) {
423
- if (!existsSync(settingsPath)) return;
487
+ if (!existsSync2(settingsPath)) return;
424
488
  try {
425
489
  const settings = JSON.parse(await readFile(settingsPath, "utf-8"));
426
490
  const permissions = settings.permissions;
@@ -448,14 +512,14 @@ async function migratePermissionsToExeOs(settingsPath) {
448
512
  } catch {
449
513
  }
450
514
  }
451
- async function mergeHooks(packageRoot, homeDir = os.homedir()) {
452
- const settingsPath = path.join(homeDir, ".claude", "settings.json");
453
- const logsDir = path.join(homeDir, ".exe-os", "logs");
454
- const hookLogPath = path.join(logsDir, "hooks.log");
515
+ async function mergeHooks(packageRoot, homeDir = os2.homedir()) {
516
+ const settingsPath = path2.join(homeDir, ".claude", "settings.json");
517
+ const logsDir = path2.join(homeDir, ".exe-os", "logs");
518
+ const hookLogPath = path2.join(logsDir, "hooks.log");
455
519
  const logSuffix = ` 2>> "${hookLogPath}"`;
456
520
  await mkdir(logsDir, { recursive: true });
457
521
  let settings = {};
458
- if (existsSync(settingsPath)) {
522
+ if (existsSync2(settingsPath)) {
459
523
  try {
460
524
  settings = JSON.parse(await readFile(settingsPath, "utf-8"));
461
525
  } catch {
@@ -477,7 +541,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
477
541
  hooks: [
478
542
  {
479
543
  type: "command",
480
- command: `node "${path.join(packageRoot, "dist", "hooks", "post-tool-combined.js")}"${logSuffix}`
544
+ command: `node "${path2.join(packageRoot, "dist", "hooks", "post-tool-combined.js")}"${logSuffix}`
481
545
  }
482
546
  ]
483
547
  },
@@ -489,7 +553,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
489
553
  hooks: [
490
554
  {
491
555
  type: "command",
492
- command: `node "${path.join(packageRoot, "dist", "hooks", "session-start.js")}"${logSuffix}`,
556
+ command: `node "${path2.join(packageRoot, "dist", "hooks", "session-start.js")}"${logSuffix}`,
493
557
  timeout: 10
494
558
  }
495
559
  ]
@@ -502,7 +566,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
502
566
  hooks: [
503
567
  {
504
568
  type: "command",
505
- command: `node "${path.join(packageRoot, "dist", "hooks", "prompt-submit.js")}"${logSuffix}`
569
+ command: `node "${path2.join(packageRoot, "dist", "hooks", "prompt-submit.js")}"${logSuffix}`
506
570
  }
507
571
  ]
508
572
  },
@@ -514,7 +578,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
514
578
  hooks: [
515
579
  {
516
580
  type: "command",
517
- command: `node "${path.join(packageRoot, "dist", "hooks", "exe-heartbeat-hook.js")}"${logSuffix}`,
581
+ command: `node "${path2.join(packageRoot, "dist", "hooks", "exe-heartbeat-hook.js")}"${logSuffix}`,
518
582
  timeout: 5
519
583
  }
520
584
  ]
@@ -527,7 +591,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
527
591
  hooks: [
528
592
  {
529
593
  type: "command",
530
- command: `node "${path.join(packageRoot, "dist", "hooks", "stop.js")}"${logSuffix}`
594
+ command: `node "${path2.join(packageRoot, "dist", "hooks", "stop.js")}"${logSuffix}`
531
595
  }
532
596
  ]
533
597
  },
@@ -536,11 +600,16 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
536
600
  {
537
601
  event: "PreToolUse",
538
602
  group: {
539
- matcher: "Write|Edit|Read|Bash|Task|Agent",
603
+ // Bug 24488803: mcp__.* MUST be here — the sidechain task-mutation
604
+ // refusal (and other MCP-tool denials) live in pre-tool-use.js, but
605
+ // Claude Code never invokes the hook for MCP tool calls unless the
606
+ // matcher routes them. PostToolUse already matched mcp__.*; the
607
+ // omission was on the side that can actually deny.
608
+ matcher: "Write|Edit|Read|Bash|Task|Agent|mcp__.*",
540
609
  hooks: [
541
610
  {
542
611
  type: "command",
543
- command: `node "${path.join(packageRoot, "dist", "hooks", "pre-tool-use.js")}"${logSuffix}`
612
+ command: `node "${path2.join(packageRoot, "dist", "hooks", "pre-tool-use.js")}"${logSuffix}`
544
613
  }
545
614
  ]
546
615
  },
@@ -552,7 +621,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
552
621
  hooks: [
553
622
  {
554
623
  type: "command",
555
- command: `node "${path.join(packageRoot, "dist", "hooks", "subagent-stop.js")}"${logSuffix}`
624
+ command: `node "${path2.join(packageRoot, "dist", "hooks", "subagent-stop.js")}"${logSuffix}`
556
625
  }
557
626
  ]
558
627
  },
@@ -564,7 +633,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
564
633
  hooks: [
565
634
  {
566
635
  type: "command",
567
- command: `node "${path.join(packageRoot, "dist", "hooks", "pre-compact.js")}"${logSuffix}`,
636
+ command: `node "${path2.join(packageRoot, "dist", "hooks", "pre-compact.js")}"${logSuffix}`,
568
637
  timeout: 10
569
638
  }
570
639
  ]
@@ -577,7 +646,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
577
646
  hooks: [
578
647
  {
579
648
  type: "command",
580
- command: `node "${path.join(packageRoot, "dist", "hooks", "session-end.js")}"${logSuffix}`
649
+ command: `node "${path2.join(packageRoot, "dist", "hooks", "session-end.js")}"${logSuffix}`
581
650
  }
582
651
  ]
583
652
  },
@@ -589,7 +658,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
589
658
  hooks: [
590
659
  {
591
660
  type: "command",
592
- command: `node "${path.join(packageRoot, "dist", "hooks", "notification.js")}"${logSuffix}`
661
+ command: `node "${path2.join(packageRoot, "dist", "hooks", "notification.js")}"${logSuffix}`
593
662
  }
594
663
  ]
595
664
  },
@@ -601,7 +670,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
601
670
  hooks: [
602
671
  {
603
672
  type: "command",
604
- command: `node "${path.join(packageRoot, "dist", "hooks", "post-compact.js")}"${logSuffix}`,
673
+ command: `node "${path2.join(packageRoot, "dist", "hooks", "post-compact.js")}"${logSuffix}`,
605
674
  timeout: 10
606
675
  }
607
676
  ]
@@ -614,7 +683,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
614
683
  hooks: [
615
684
  {
616
685
  type: "command",
617
- command: `node "${path.join(packageRoot, "dist", "hooks", "instructions-loaded.js")}"${logSuffix}`
686
+ command: `node "${path2.join(packageRoot, "dist", "hooks", "instructions-loaded.js")}"${logSuffix}`
618
687
  }
619
688
  ]
620
689
  },
@@ -738,13 +807,13 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
738
807
  allowList.push(fullName);
739
808
  }
740
809
  }
741
- await mkdir(path.dirname(settingsPath), { recursive: true });
810
+ await mkdir(path2.dirname(settingsPath), { recursive: true });
742
811
  await writeFile(settingsPath, JSON.stringify(settings, null, 2) + "\n");
743
812
  return { added, skipped };
744
813
  }
745
- async function cleanOldShellFunctions(homeDir = os.homedir()) {
746
- const rosterPath = path.join(homeDir, ".exe-os", "exe-employees.json");
747
- if (!existsSync(rosterPath)) return 0;
814
+ async function cleanOldShellFunctions(homeDir = os2.homedir()) {
815
+ const rosterPath = path2.join(homeDir, ".exe-os", "exe-employees.json");
816
+ if (!existsSync2(rosterPath)) return 0;
748
817
  let employees;
749
818
  try {
750
819
  employees = JSON.parse(await readFile(rosterPath, "utf-8"));
@@ -759,13 +828,13 @@ async function cleanOldShellFunctions(homeDir = os.homedir()) {
759
828
  return { name: n, funcDef, forLoop };
760
829
  });
761
830
  const rcFiles = [
762
- path.join(homeDir, ".zshrc"),
763
- path.join(homeDir, ".bashrc")
831
+ path2.join(homeDir, ".zshrc"),
832
+ path2.join(homeDir, ".bashrc")
764
833
  ];
765
834
  const REMOVED_MARKER = "# Removed by exe-os \u2014 wrappers now at ~/.exe-os/bin/";
766
835
  let totalRemoved = 0;
767
836
  for (const rcPath of rcFiles) {
768
- if (!existsSync(rcPath)) continue;
837
+ if (!existsSync2(rcPath)) continue;
769
838
  let content;
770
839
  try {
771
840
  content = await readFile(rcPath, "utf-8");
@@ -873,8 +942,8 @@ function escapeRegExp(s) {
873
942
  var EXE_SECTION_START = "<!-- exe-os:orchestration-start -->";
874
943
  var EXE_SECTION_END = "<!-- exe-os:orchestration-end -->";
875
944
  async function removeLegacyOrchestrationRules(homeDir) {
876
- const claudeDir = path.join(homeDir, ".claude");
877
- const claudeMdPath = path.join(claudeDir, "CLAUDE.md");
945
+ const claudeDir = path2.join(homeDir, ".claude");
946
+ const claudeMdPath = path2.join(claudeDir, "CLAUDE.md");
878
947
  await mkdir(claudeDir, { recursive: true });
879
948
  let existing = "";
880
949
  try {
@@ -890,19 +959,19 @@ async function removeLegacyOrchestrationRules(homeDir) {
890
959
  }
891
960
  return "absent";
892
961
  }
893
- async function installStatusLine(packageRoot, homeDir = os.homedir()) {
962
+ async function installStatusLine(packageRoot, homeDir = os2.homedir()) {
894
963
  const prefs = loadPreferences(homeDir);
895
964
  if (prefs.ccStatusLine === false) return "opted-out";
896
- const claudeDir = path.join(homeDir, ".claude");
965
+ const claudeDir = path2.join(homeDir, ".claude");
897
966
  await mkdir(claudeDir, { recursive: true });
898
- const assetPath = path.join(packageRoot, "dist", "assets", "statusline-command.sh");
899
- if (!existsSync(assetPath)) return "asset-missing";
900
- const destScript = path.join(claudeDir, "statusline-command.sh");
967
+ const assetPath = path2.join(packageRoot, "dist", "assets", "statusline-command.sh");
968
+ if (!existsSync2(assetPath)) return "asset-missing";
969
+ const destScript = path2.join(claudeDir, "statusline-command.sh");
901
970
  const assetContent = await readFile(assetPath, "utf-8");
902
971
  await writeFile(destScript, assetContent, { mode: 493 });
903
- const settingsPath = path.join(claudeDir, "settings.json");
972
+ const settingsPath = path2.join(claudeDir, "settings.json");
904
973
  let settings = {};
905
- if (existsSync(settingsPath)) {
974
+ if (existsSync2(settingsPath)) {
906
975
  try {
907
976
  settings = JSON.parse(await readFile(settingsPath, "utf-8"));
908
977
  } catch {
@@ -940,13 +1009,13 @@ async function runInstaller(homeDir) {
940
1009
  `Hooks: ${hookResult.added} added, ${hookResult.skipped} unchanged
941
1010
  `
942
1011
  );
943
- const resolvedHome = homeDir ?? os.homedir();
944
- const exeWorkspace = path.join(resolvedHome, "exe");
945
- if (!existsSync(exeWorkspace)) {
1012
+ const resolvedHome = homeDir ?? os2.homedir();
1013
+ const exeWorkspace = path2.join(resolvedHome, "exe");
1014
+ if (!existsSync2(exeWorkspace)) {
946
1015
  try {
947
- await mkdir(path.join(exeWorkspace, "content"), { recursive: true });
948
- await mkdir(path.join(exeWorkspace, "operations"), { recursive: true });
949
- await mkdir(path.join(exeWorkspace, "output"), { recursive: true });
1016
+ await mkdir(path2.join(exeWorkspace, "content"), { recursive: true });
1017
+ await mkdir(path2.join(exeWorkspace, "operations"), { recursive: true });
1018
+ await mkdir(path2.join(exeWorkspace, "output"), { recursive: true });
950
1019
  process.stderr.write(
951
1020
  `Created ~/exe/ \u2014 your automation workspace for non-code projects
952
1021
  `
@@ -977,7 +1046,7 @@ async function runInstaller(homeDir) {
977
1046
  );
978
1047
  }
979
1048
  try {
980
- const { generateAgentDefs, summarizeAgentDefResults } = await import("./agent-defs-generator-QN3J6FVJ.js");
1049
+ const { generateAgentDefs, summarizeAgentDefResults } = await import("./agent-defs-generator-6S2BSYCP.js");
981
1050
  const defResults = generateAgentDefs({ homeDir: resolvedHome });
982
1051
  process.stderr.write(`Agent definitions: ${summarizeAgentDefResults(defResults)}
983
1052
  `);
@@ -992,33 +1061,33 @@ exe-os installed successfully.
992
1061
  `);
993
1062
  }
994
1063
  function setupTmux(home) {
995
- const homeDir = home ?? os.homedir();
1064
+ const homeDir = home ?? os2.homedir();
996
1065
  const prefs = loadPreferences(homeDir);
997
1066
  if (prefs.tmux === false) {
998
1067
  process.stderr.write("exe-os: tmux config skipped (user preference)\n");
999
1068
  return;
1000
1069
  }
1001
- const exeDir = path.join(homeDir, ".exe-os");
1002
- const exeTmuxConf = path.join(exeDir, "tmux.conf");
1003
- const userTmuxConf = path.join(homeDir, ".tmux.conf");
1070
+ const exeDir = path2.join(homeDir, ".exe-os");
1071
+ const exeTmuxConf = path2.join(exeDir, "tmux.conf");
1072
+ const userTmuxConf = path2.join(homeDir, ".tmux.conf");
1004
1073
  const sourceLine = "source-file ~/.exe-os/tmux.conf";
1005
1074
  const shellQuote = (value) => `'${value.replace(/'/g, "'\\''")}'`;
1006
1075
  const pkgRoot = resolvePackageRoot();
1007
- const assetPath = path.join(pkgRoot, "dist", "assets", "tmux.conf");
1008
- if (!existsSync(assetPath)) {
1076
+ const assetPath = path2.join(pkgRoot, "dist", "assets", "tmux.conf");
1077
+ if (!existsSync2(assetPath)) {
1009
1078
  process.stderr.write(`exe-os: tmux.conf asset not found at ${assetPath} \u2014 skipping tmux setup
1010
1079
  `);
1011
1080
  return;
1012
1081
  }
1013
- mkdirSync(exeDir, { recursive: true });
1014
- if (existsSync(exeTmuxConf)) {
1082
+ mkdirSync2(exeDir, { recursive: true });
1083
+ if (existsSync2(exeTmuxConf)) {
1015
1084
  const currentContent = readFileSync(exeTmuxConf, "utf8");
1016
1085
  const newContent = readFileSync(assetPath, "utf8");
1017
1086
  const currentHash = createHash("sha256").update(currentContent).digest("hex");
1018
1087
  const newHash = createHash("sha256").update(newContent).digest("hex");
1019
1088
  if (currentHash !== newHash) {
1020
- const shippedPath = path.join(exeDir, ".tmux.conf.shipped-hash");
1021
- const lastShippedHash = existsSync(shippedPath) ? readFileSync(shippedPath, "utf8").trim() : "";
1089
+ const shippedPath = path2.join(exeDir, ".tmux.conf.shipped-hash");
1090
+ const lastShippedHash = existsSync2(shippedPath) ? readFileSync(shippedPath, "utf8").trim() : "";
1022
1091
  if (lastShippedHash && currentHash !== lastShippedHash) {
1023
1092
  process.stderr.write("exe-os: tmux config has user customizations \u2014 skipping overwrite\n");
1024
1093
  } else {
@@ -1033,13 +1102,13 @@ function setupTmux(home) {
1033
1102
  copyFileSync(assetPath, exeTmuxConf);
1034
1103
  const newContent = readFileSync(assetPath, "utf8");
1035
1104
  const newHash = createHash("sha256").update(newContent).digest("hex");
1036
- writeFileSync(path.join(exeDir, ".tmux.conf.shipped-hash"), newHash, "utf8");
1105
+ writeFileSync(path2.join(exeDir, ".tmux.conf.shipped-hash"), newHash, "utf8");
1037
1106
  }
1038
- if (existsSync(userTmuxConf)) {
1107
+ if (existsSync2(userTmuxConf)) {
1039
1108
  const existing = readFileSync(userTmuxConf, "utf8");
1040
1109
  if (!existing.includes(sourceLine)) {
1041
- const backupPath = path.join(homeDir, ".tmux.conf.backup");
1042
- if (!existsSync(backupPath)) {
1110
+ const backupPath = path2.join(homeDir, ".tmux.conf.backup");
1111
+ if (!existsSync2(backupPath)) {
1043
1112
  copyFileSync(userTmuxConf, backupPath);
1044
1113
  process.stderr.write(`exe-os: backed up existing tmux config to ${backupPath}
1045
1114
  `);
@@ -1059,15 +1128,15 @@ ${sourceLine}
1059
1128
  process.stderr.write("exe-os: tmux config installed\n");
1060
1129
  }
1061
1130
  function setupGhostty(home) {
1062
- const homeDir = home ?? os.homedir();
1131
+ const homeDir = home ?? os2.homedir();
1063
1132
  const prefs = loadPreferences(homeDir);
1064
1133
  if (prefs.ghostty === false) {
1065
1134
  process.stderr.write("exe-os: Ghostty config skipped (user preference)\n");
1066
1135
  return;
1067
1136
  }
1068
- const xdgConfig = path.join(homeDir, ".config", "ghostty");
1069
- const macConfig = path.join(homeDir, "Library", "Application Support", "com.mitchellh.ghostty");
1070
- const ghosttyInstalled = existsSync(xdgConfig) || existsSync(macConfig) || (() => {
1137
+ const xdgConfig = path2.join(homeDir, ".config", "ghostty");
1138
+ const macConfig = path2.join(homeDir, "Library", "Application Support", "com.mitchellh.ghostty");
1139
+ const ghosttyInstalled = existsSync2(xdgConfig) || existsSync2(macConfig) || (() => {
1071
1140
  try {
1072
1141
  execSync("which ghostty 2>/dev/null");
1073
1142
  return true;
@@ -1079,28 +1148,28 @@ function setupGhostty(home) {
1079
1148
  return;
1080
1149
  }
1081
1150
  const pkgRoot = resolvePackageRoot();
1082
- const assetPath = path.join(pkgRoot, "dist", "assets", "ghostty.conf");
1083
- if (!existsSync(assetPath)) {
1151
+ const assetPath = path2.join(pkgRoot, "dist", "assets", "ghostty.conf");
1152
+ if (!existsSync2(assetPath)) {
1084
1153
  process.stderr.write("exe-os: ghostty.conf asset not found \u2014 skipping Ghostty setup\n");
1085
1154
  return;
1086
1155
  }
1087
1156
  const configDir = xdgConfig;
1088
- const configPath = path.join(configDir, "config");
1089
- const backupPath = path.join(configDir, "config.backup");
1090
- mkdirSync(configDir, { recursive: true });
1157
+ const configPath = path2.join(configDir, "config");
1158
+ const backupPath = path2.join(configDir, "config.backup");
1159
+ mkdirSync2(configDir, { recursive: true });
1091
1160
  const START_MARKER = "# \u2500\u2500 exe-os:ghostty-start \u2500\u2500";
1092
1161
  const END_MARKER = "# \u2500\u2500 exe-os:ghostty-end \u2500\u2500";
1093
1162
  const assetContent = readFileSync(assetPath, "utf8").trim();
1094
1163
  const markedSection = `${START_MARKER}
1095
1164
  ${assetContent}
1096
1165
  ${END_MARKER}`;
1097
- if (existsSync(configPath)) {
1166
+ if (existsSync2(configPath)) {
1098
1167
  const existing = readFileSync(configPath, "utf8");
1099
1168
  if (existing.includes(START_MARKER) && existing.includes(END_MARKER)) {
1100
1169
  process.stderr.write("exe-os: Ghostty config already installed \u2014 preserving local settings\n");
1101
1170
  return;
1102
1171
  } else if (existing.includes("Exe OS")) {
1103
- if (!existsSync(backupPath)) {
1172
+ if (!existsSync2(backupPath)) {
1104
1173
  copyFileSync(configPath, backupPath);
1105
1174
  process.stderr.write(`exe-os: backed up existing Ghostty config to ${backupPath}
1106
1175
  `);
@@ -1110,7 +1179,7 @@ ${existing.trim()}
1110
1179
  ${END_MARKER}
1111
1180
  `);
1112
1181
  } else {
1113
- if (!existsSync(backupPath)) {
1182
+ if (!existsSync2(backupPath)) {
1114
1183
  copyFileSync(configPath, backupPath);
1115
1184
  process.stderr.write(`exe-os: backed up existing Ghostty config to ${backupPath}
1116
1185
  `);
@@ -1126,15 +1195,15 @@ ${existing}`);
1126
1195
  process.stderr.write("exe-os: Ghostty config installed\n");
1127
1196
  }
1128
1197
  function setupWezterm(home) {
1129
- const homeDir = home ?? os.homedir();
1198
+ const homeDir = home ?? os2.homedir();
1130
1199
  const prefs = loadPreferences(homeDir);
1131
1200
  if (prefs.wezterm === false) {
1132
1201
  process.stderr.write("exe-os: WezTerm config skipped (user preference)\n");
1133
1202
  return;
1134
1203
  }
1135
- const weztermLua = path.join(homeDir, ".wezterm.lua");
1136
- const weztermDir = path.join(homeDir, ".config", "wezterm");
1137
- const weztermInstalled = existsSync(weztermLua) || existsSync(weztermDir) || (() => {
1204
+ const weztermLua = path2.join(homeDir, ".wezterm.lua");
1205
+ const weztermDir = path2.join(homeDir, ".config", "wezterm");
1206
+ const weztermInstalled = existsSync2(weztermLua) || existsSync2(weztermDir) || (() => {
1138
1207
  try {
1139
1208
  execSync("which wezterm 2>/dev/null", { encoding: "utf8", timeout: 5e3 });
1140
1209
  return true;
@@ -1146,8 +1215,8 @@ function setupWezterm(home) {
1146
1215
  return;
1147
1216
  }
1148
1217
  const pkgRoot = resolvePackageRoot();
1149
- const assetPath = path.join(pkgRoot, "dist", "assets", "wezterm.lua");
1150
- if (!existsSync(assetPath)) {
1218
+ const assetPath = path2.join(pkgRoot, "dist", "assets", "wezterm.lua");
1219
+ if (!existsSync2(assetPath)) {
1151
1220
  process.stderr.write("exe-os: wezterm.lua asset not found \u2014 skipping WezTerm setup\n");
1152
1221
  return;
1153
1222
  }
@@ -1155,7 +1224,7 @@ function setupWezterm(home) {
1155
1224
  const START_MARKER = "-- \u2500\u2500 exe-os:wezterm-start \u2500\u2500";
1156
1225
  const END_MARKER = "-- \u2500\u2500 exe-os:wezterm-end \u2500\u2500";
1157
1226
  const assetContent = readFileSync(assetPath, "utf8").trim();
1158
- if (existsSync(configPath)) {
1227
+ if (existsSync2(configPath)) {
1159
1228
  const existing = readFileSync(configPath, "utf8");
1160
1229
  if (existing.includes(START_MARKER) && existing.includes(END_MARKER)) {
1161
1230
  process.stderr.write("exe-os: WezTerm config already installed \u2014 preserving local settings\n");
@@ -1164,9 +1233,9 @@ function setupWezterm(home) {
1164
1233
  process.stderr.write(
1165
1234
  "exe-os: existing WezTerm config found at ~/.wezterm.lua \u2014 skipping (manual integration needed)\nexe-os: see ~/.exe-os/assets/wezterm.lua for exe-os defaults you can merge\n"
1166
1235
  );
1167
- const refDir = path.join(homeDir, ".exe-os", "assets");
1168
- mkdirSync(refDir, { recursive: true });
1169
- copyFileSync(assetPath, path.join(refDir, "wezterm.lua"));
1236
+ const refDir = path2.join(homeDir, ".exe-os", "assets");
1237
+ mkdirSync2(refDir, { recursive: true });
1238
+ copyFileSync(assetPath, path2.join(refDir, "wezterm.lua"));
1170
1239
  return;
1171
1240
  }
1172
1241
  writeFileSync(configPath, assetContent + "\n");