@askexenow/exe-os 0.9.340 → 0.9.342

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 (417) hide show
  1. package/README.md +159 -196
  2. package/deploy/compose/.env.customer.example +1 -0
  3. package/deploy/compose/.env.example +1 -0
  4. package/deploy/compose/docker-compose.yml +13 -4
  5. package/deploy/compose/generate-env.ts +4 -0
  6. package/dist/{active-agent-EC6M7KTX.js → active-agent-PVGE57FY.js} +5 -5
  7. package/dist/{active-agent-WHIUCHLA.js → active-agent-TNIO6IY3.js} +5 -5
  8. package/dist/{agentic-ontology-RNSXGXW4.js → agentic-ontology-3FXYMHKW.js} +1 -1
  9. package/dist/{backfill-gate-J7UXFNXU.js → backfill-gate-65LSYVE5.js} +3 -3
  10. package/dist/{backfill-metadata-MFY6BHKE.js → backfill-metadata-ZSMZC45J.js} +8 -8
  11. package/dist/{background-jobs-STURKDCS.js → background-jobs-EXR5RVGG.js} +3 -3
  12. package/dist/backup-verify-3Y2FHGZU.js +425 -0
  13. package/dist/{behaviors-HLZUJSMP.js → behaviors-KYRB3NGJ.js} +9 -9
  14. package/dist/bin/age-ontology-load.js +3 -3
  15. package/dist/bin/agentic-ontology-backfill.js +10 -10
  16. package/dist/bin/agentic-reflection-backfill.js +11 -11
  17. package/dist/bin/agentic-semantic-label.js +10 -10
  18. package/dist/bin/backfill-conversations.js +10 -10
  19. package/dist/bin/backfill-responses.js +10 -10
  20. package/dist/bin/backfill-vectors.js +14 -14
  21. package/dist/bin/bulk-sync-postgres.js +19 -19
  22. package/dist/bin/cc-doctor.js +10 -8
  23. package/dist/bin/cleanup-stale-review-tasks.js +26 -24
  24. package/dist/bin/cli.js +111 -25
  25. package/dist/bin/customer-readiness.js +1 -1
  26. package/dist/bin/deferred-daemon-restart.js +97 -90
  27. package/dist/bin/exe-agent-config.js +9 -8
  28. package/dist/bin/exe-agent.js +20 -20
  29. package/dist/bin/exe-assign.js +12 -12
  30. package/dist/bin/exe-boot.js +201 -68
  31. package/dist/bin/exe-call.js +7 -7
  32. package/dist/bin/exe-cloud.js +20 -20
  33. package/dist/bin/exe-config-dump.js +9 -8
  34. package/dist/bin/exe-dispatch.js +26 -24
  35. package/dist/bin/exe-doctor.js +10 -6
  36. package/dist/bin/exe-export-behaviors.js +11 -11
  37. package/dist/bin/exe-forget.js +12 -10
  38. package/dist/bin/exe-gateway.js +15 -10
  39. package/dist/bin/exe-grant.js +5 -5
  40. package/dist/bin/exe-healthcheck.js +14 -8
  41. package/dist/bin/exe-heartbeat.js +29 -28
  42. package/dist/bin/exe-kill.js +31 -29
  43. package/dist/bin/exe-launch-agent.js +129 -68
  44. package/dist/bin/exe-memory-reads.js +257 -0
  45. package/dist/bin/exe-new-employee.js +12 -11
  46. package/dist/bin/exe-pending-messages.js +27 -25
  47. package/dist/bin/exe-pending-notifications.js +26 -24
  48. package/dist/bin/exe-pending-reviews.js +26 -24
  49. package/dist/bin/exe-rename.js +7 -7
  50. package/dist/bin/exe-review.js +30 -28
  51. package/dist/bin/exe-search.js +11 -9
  52. package/dist/bin/exe-session-cleanup.js +116 -86
  53. package/dist/bin/exe-settings.js +24 -23
  54. package/dist/bin/exe-start-codex.js +163 -41
  55. package/dist/bin/exe-start-opencode.js +15 -15
  56. package/dist/bin/exe-status.js +27 -25
  57. package/dist/bin/exe-support.js +5 -5
  58. package/dist/bin/exe-team.js +5 -5
  59. package/dist/bin/exe-timers.js +32 -213
  60. package/dist/bin/exe-watchdog.js +6 -5
  61. package/dist/bin/git-sweep.js +27 -25
  62. package/dist/bin/graph-backfill.js +9 -9
  63. package/dist/bin/graph-export.js +9 -9
  64. package/dist/bin/import-history.js +11 -11
  65. package/dist/bin/install.js +102 -95
  66. package/dist/bin/intercom-check.js +4 -4
  67. package/dist/bin/mcp-sessions.js +2 -2
  68. package/dist/bin/orchestration-metrics.js +6 -6
  69. package/dist/bin/postgres-agentic-reflection-backfill.js +5 -5
  70. package/dist/bin/postgres-agentic-semantic-backfill.js +7 -7
  71. package/dist/bin/pre-publish.js +5 -3
  72. package/dist/bin/reconcile-backlog.js +484 -0
  73. package/dist/bin/registry-proxy.js +1 -1
  74. package/dist/bin/scan-tasks.js +26 -24
  75. package/dist/bin/setup.js +6 -5
  76. package/dist/bin/shard-migrate.js +9 -9
  77. package/dist/bin/stack-update.js +15 -9
  78. package/dist/bin/update.js +1 -1
  79. package/dist/bin/vps-health-gate.js +1 -1
  80. package/dist/boot-generation-BL2ISK4U.js +22 -0
  81. package/dist/boot-review-sections-DBMQJT5N.js +107 -0
  82. package/dist/branch-hygiene-TZWK6QCF.js +224 -0
  83. package/dist/{branding-JTEOF4ZV.js → branding-DVXBGVDH.js} +3 -3
  84. package/dist/{browser-session-store-CXQMOSEC.js → browser-session-store-B2NR3LIX.js} +2 -1
  85. package/dist/{capability-cards-YOKVMMOL.js → capability-cards-DN5UIKVN.js} +4 -4
  86. package/dist/{capacity-monitor-S54IOWRL.js → capacity-monitor-ZG5GGFR2.js} +27 -25
  87. package/dist/{catchup-brief-DRRQCMKA.js → catchup-brief-D6HH6DWS.js} +32 -29
  88. package/dist/{support-outbox-MGUVVGHT.js → chunk-25X4JD2V.js} +28 -12
  89. package/dist/{chunk-IYB2NIW3.js → chunk-2KZNGDSW.js} +1 -1
  90. package/dist/{chunk-FUIIVSW6.js → chunk-2WAVZ5UJ.js} +1 -1
  91. package/dist/{chunk-K5WFKEXQ.js → chunk-2ZYO73KO.js} +4 -3
  92. package/dist/{chunk-CLAYNAXC.js → chunk-3EUMUSLE.js} +1 -1
  93. package/dist/{chunk-BVV6NHKQ.js → chunk-3SW4OEHB.js} +5 -5
  94. package/dist/{task-enforcement-VI7L43DC.js → chunk-4CMVFVFC.js} +173 -69
  95. package/dist/{chunk-BU2QQWBQ.js → chunk-4J4PMPXZ.js} +3 -2
  96. package/dist/{chunk-JD5S5AAV.js → chunk-4N2NRGCM.js} +2 -2
  97. package/dist/chunk-4QCFFW2H.js +378 -0
  98. package/dist/{chunk-7EA7LYW4.js → chunk-4VSV5P4D.js} +4 -4
  99. package/dist/{chunk-52KNOQMK.js → chunk-4ZCD2UWW.js} +39 -10
  100. package/dist/{chunk-DZ6OQM67.js → chunk-5ERDIOV3.js} +2 -2
  101. package/dist/chunk-5H47VHB7.js +30 -0
  102. package/dist/{chunk-UCQITDLM.js → chunk-5TY4FPH6.js} +1 -1
  103. package/dist/{chunk-R44Z32O2.js → chunk-6CH3TPHR.js} +2 -2
  104. package/dist/{chunk-WYLV4S6A.js → chunk-6WQ3NNCE.js} +3 -3
  105. package/dist/{chunk-HHIBOU3P.js → chunk-6XWTQUO4.js} +1 -1
  106. package/dist/chunk-76CJBM36.js +88 -0
  107. package/dist/{chunk-H2L4PHGH.js → chunk-7CTRGNLW.js} +2 -2
  108. package/dist/{chunk-XUKPALWT.js → chunk-7V4JADD6.js} +2 -2
  109. package/dist/{chunk-RMOBQ6A5.js → chunk-AD2VCHSS.js} +1 -1
  110. package/dist/{chunk-QXSBB26A.js → chunk-AJYCFKJR.js} +1 -1
  111. package/dist/chunk-AM7S2TY6.js +54 -0
  112. package/dist/{chunk-HEPR6QTL.js → chunk-AOHXREB7.js} +334 -66
  113. package/dist/{chunk-FNZR3B7U.js → chunk-ASAFVDVR.js} +1 -1
  114. package/dist/{chunk-TALWBVZE.js → chunk-BUCXNV32.js} +1 -1
  115. package/dist/{chunk-SHIICYJW.js → chunk-BYTDMAGB.js} +4 -2
  116. package/dist/{chunk-32SXNM3G.js → chunk-C5QAPURN.js} +1 -1
  117. package/dist/{chunk-XCTGRD4S.js → chunk-CE7F6RHG.js} +587 -77
  118. package/dist/{chunk-7WPOJDTA.js → chunk-CNVBKDEY.js} +21 -15
  119. package/dist/{chunk-KPIN44GZ.js → chunk-CWXVH7WV.js} +1 -1
  120. package/dist/chunk-D74XYSA3.js +621 -0
  121. package/dist/{chunk-A47MXY2I.js → chunk-EQHQF5IM.js} +50 -32
  122. package/dist/{chunk-AOO77BDE.js → chunk-EUS4QUKP.js} +1 -1
  123. package/dist/{chunk-RLRT2BVM.js → chunk-EV46QTD3.js} +1 -1
  124. package/dist/{chunk-PAEXYFMY.js → chunk-F27XXN6C.js} +1 -1
  125. package/dist/{chunk-XQNNB5GY.js → chunk-F55P3H4S.js} +37 -2
  126. package/dist/{chunk-MWZFF3Q7.js → chunk-F5O7V7UK.js} +1 -1
  127. package/dist/{chunk-LMZISHSJ.js → chunk-FPFPLPUY.js} +6 -6
  128. package/dist/{chunk-7TS64TBG.js → chunk-G4RGKBCA.js} +8 -3
  129. package/dist/{chunk-4IYSBPX3.js → chunk-G5T6KDG4.js} +1 -1
  130. package/dist/{chunk-7WDXEKUL.js → chunk-GBTTBXAF.js} +4 -4
  131. package/dist/{chunk-6MRWJMI5.js → chunk-GDIJE6D7.js} +1 -1
  132. package/dist/{chunk-AVKXCSBI.js → chunk-GG5NDQNN.js} +2 -2
  133. package/dist/{chunk-I3XKO3KQ.js → chunk-GJ26DULE.js} +2 -2
  134. package/dist/chunk-GL57PO3K.js +104 -0
  135. package/dist/chunk-GWDSB25T.js +6 -0
  136. package/dist/{chunk-F55JF43M.js → chunk-H6BV5TKD.js} +39 -24
  137. package/dist/{chunk-HCJCW7X4.js → chunk-H7I47RS5.js} +34 -1
  138. package/dist/{chunk-65SVQELL.js → chunk-HA5R6USD.js} +31 -5
  139. package/dist/{chunk-VJHUVFIW.js → chunk-HAF2DJYV.js} +3 -3
  140. package/dist/chunk-HJ447YER.js +224 -0
  141. package/dist/chunk-HV4KESRY.js +395 -0
  142. package/dist/{chunk-B76TSEP3.js → chunk-I26FWCSP.js} +216 -9
  143. package/dist/{chunk-X2FHTDIU.js → chunk-IBYL4DHM.js} +1 -1
  144. package/dist/{chunk-JCBKARSK.js → chunk-IOEUAQWP.js} +1 -1
  145. package/dist/{chunk-MW2GJJ53.js → chunk-JGIPOUIK.js} +3 -3
  146. package/dist/{chunk-2233TQCA.js → chunk-JLZ4RYSD.js} +2 -2
  147. package/dist/{chunk-Q7L6G6KV.js → chunk-JMYHW3AL.js} +2 -2
  148. package/dist/{chunk-OJTJYEMX.js → chunk-JPUZPAAF.js} +4 -4
  149. package/dist/{chunk-XWHE4LZK.js → chunk-JTBIS4R5.js} +21 -2
  150. package/dist/{chunk-5Z5NATNS.js → chunk-K7KFGDWF.js} +1 -1
  151. package/dist/{chunk-UIV2WPBT.js → chunk-KGWRTRKC.js} +2 -2
  152. package/dist/{chunk-KTPG4XKI.js → chunk-KP3U5QGJ.js} +1 -1
  153. package/dist/{chunk-TLYAEISW.js → chunk-KW2SD2FL.js} +2 -2
  154. package/dist/{chunk-X7H3HMFH.js → chunk-KWZMQACA.js} +11 -7
  155. package/dist/{chunk-OFX5B2S7.js → chunk-L2R3LN2P.js} +1 -1
  156. package/dist/{chunk-T4KZ2Z2N.js → chunk-L4A5DL6Z.js} +3 -3
  157. package/dist/{chunk-X425OEYF.js → chunk-LU2FALL6.js} +3 -3
  158. package/dist/{chunk-6M36JFFD.js → chunk-MKYFAKDW.js} +4 -4
  159. package/dist/{chunk-I5RLNOFK.js → chunk-MOPUCPXK.js} +12 -4
  160. package/dist/{chunk-ZIVEA3NB.js → chunk-MR6LHP4F.js} +1 -1
  161. package/dist/chunk-MVYB76QG.js +341 -0
  162. package/dist/{chunk-2SG2UGCH.js → chunk-MZM6EJCU.js} +4 -4
  163. package/dist/{chunk-ZREGOV2Q.js → chunk-N7QJKQMX.js} +258 -14
  164. package/dist/{chunk-QLFRCA6I.js → chunk-NBZL5CGA.js} +93 -12
  165. package/dist/{chunk-QFPTDSY2.js → chunk-NN2B2QKU.js} +1 -1
  166. package/dist/chunk-NX5INHHG.js +40 -0
  167. package/dist/{chunk-B75BOKEI.js → chunk-NXUSDL37.js} +2 -2
  168. package/dist/{chunk-TPHCZDE3.js → chunk-O5V57XYE.js} +1 -1
  169. package/dist/chunk-O7LWR36Z.js +269 -0
  170. package/dist/{chunk-ATOU6CYR.js → chunk-OLMQ4UOF.js} +57 -11
  171. package/dist/{chunk-6HBURYON.js → chunk-OTF44GXL.js} +4 -4
  172. package/dist/{chunk-DILD54TU.js → chunk-OZEBAGKR.js} +277 -137
  173. package/dist/{chunk-DADMPMYX.js → chunk-P5HIWY2E.js} +1 -1
  174. package/dist/{chunk-EIF2LQHZ.js → chunk-PDWS3E22.js} +55 -4
  175. package/dist/{chunk-KTY7I7UH.js → chunk-PPCDBE6Z.js} +1 -1
  176. package/dist/{chunk-XACL67CS.js → chunk-PQIDGXSG.js} +13 -4
  177. package/dist/chunk-PWUFMX75.js +186 -0
  178. package/dist/{chunk-UPWE5NOG.js → chunk-QDGZJ653.js} +3 -3
  179. package/dist/{chunk-MQRFKSLI.js → chunk-QOO5RW3K.js} +6 -5
  180. package/dist/{chunk-KCC5A7YL.js → chunk-QQ4E2RYW.js} +95 -18
  181. package/dist/{chunk-BPC5LZ6Y.js → chunk-QRYVCDWS.js} +2 -2
  182. package/dist/{chunk-Z42MXYWW.js → chunk-QWVXN224.js} +110 -28
  183. package/dist/{chunk-542EWGY3.js → chunk-QYZJHTNE.js} +26 -27
  184. package/dist/{chunk-I7Z6KTGF.js → chunk-R2NN3JKH.js} +43 -6
  185. package/dist/{chunk-3OBWSCJN.js → chunk-RACAOE2Z.js} +14 -14
  186. package/dist/{chunk-5RACW3LX.js → chunk-RAXVPNMR.js} +1 -1
  187. package/dist/{chunk-2HZY3ECT.js → chunk-RHWZUUS4.js} +6 -6
  188. package/dist/{chunk-RNAYCUNM.js → chunk-S3THSOWV.js} +1 -1
  189. package/dist/{chunk-W7DHFGCB.js → chunk-S7QUM2UK.js} +2 -2
  190. package/dist/{chunk-SSTLTIF3.js → chunk-SKGMF2SO.js} +25 -2
  191. package/dist/{chunk-GN45PBWI.js → chunk-SQKXKV2Y.js} +2 -2
  192. package/dist/{chunk-QZLIZAS7.js → chunk-TLT7NZCW.js} +4 -4
  193. package/dist/chunk-TTCUG2CF.js +91 -0
  194. package/dist/chunk-UEA3LXOB.js +40 -0
  195. package/dist/{chunk-DRCRZIIJ.js → chunk-UNXQBELK.js} +1 -1
  196. package/dist/{chunk-PLRIJALF.js → chunk-UP75Z5X7.js} +921 -176
  197. package/dist/{chunk-TNJRWUCE.js → chunk-USSB56WK.js} +1 -1
  198. package/dist/{chunk-KMBEL7VB.js → chunk-UUEKJDK6.js} +90 -10
  199. package/dist/{chunk-XJI7Z6LZ.js → chunk-UUQBZPJJ.js} +1 -1
  200. package/dist/{chunk-RRWDYOQS.js → chunk-V3EEVY4L.js} +1 -1
  201. package/dist/{chunk-N5I7RL3I.js → chunk-VPZHJCKW.js} +2 -2
  202. package/dist/chunk-VRAQTFD6.js +265 -0
  203. package/dist/{chunk-H37HHX3E.js → chunk-VSRPS3J7.js} +14 -14
  204. package/dist/{chunk-5ZNY7IZI.js → chunk-WMESXBJM.js} +37 -3
  205. package/dist/{chunk-54QCG45Y.js → chunk-WOYADZF5.js} +56 -5
  206. package/dist/{chunk-7Y5UDEVM.js → chunk-WZHZCDDO.js} +6 -5
  207. package/dist/{chunk-3NGZ4PL7.js → chunk-X2Q5NLUL.js} +11 -2
  208. package/dist/{chunk-YE7NH53A.js → chunk-X33NYQYJ.js} +2 -2
  209. package/dist/{chunk-UXBD22CD.js → chunk-XHK3FS3W.js} +3 -2
  210. package/dist/{chunk-3QDSCJ3F.js → chunk-XZXBB3TN.js} +2 -2
  211. package/dist/{chunk-JSKBHUR7.js → chunk-YCANDMI2.js} +2 -2
  212. package/dist/{chunk-JBSCL2XT.js → chunk-YLXTKI6M.js} +1 -1
  213. package/dist/{chunk-G7WO77Z2.js → chunk-YTCFACP4.js} +812 -896
  214. package/dist/{chunk-LTVCRHHD.js → chunk-Z6RSN7KS.js} +7 -6
  215. package/dist/{cleanup-graph-garbage-KUABW6LS.js → cleanup-graph-garbage-XWUFAMFO.js} +6 -6
  216. package/dist/{co-activation-XMPHKGHR.js → co-activation-ZCHPLLP6.js} +4 -4
  217. package/dist/{co-occurrence-SHKSJ6CV.js → co-occurrence-KG3LKALN.js} +4 -4
  218. package/dist/{code-context-index-EXXDY3QZ.js → code-context-index-WSOJQ72R.js} +5 -5
  219. package/dist/{content-extractor-RHITF2KM.js → content-extractor-NXYNEF5K.js} +2 -2
  220. package/dist/{conversation-wiki-populator-WU4HEQ7C.js → conversation-wiki-populator-WQN3IUU6.js} +1 -1
  221. package/dist/{crdt-sync-UJELKSNX.js → crdt-sync-4PFGPZXV.js} +8 -1
  222. package/dist/{crm-webhook-HHNBS7LY.js → crm-webhook-II7Z45Q6.js} +2 -2
  223. package/dist/cto-delegation-gate-JWWOJPNC.js +669 -0
  224. package/dist/{daemon-auth-7IFSV5FG.js → daemon-auth-3FEAHFWC.js} +5 -3
  225. package/dist/{daemon-orchestration-7QB6QOXT.js → daemon-orchestration-FX4XZDR5.js} +46 -27
  226. package/dist/{daemon-ready-5XI5BIJD.js → daemon-ready-4JTSFKAY.js} +1 -1
  227. package/dist/{daemon-ready-signal-E7VMIQ6I.js → daemon-ready-signal-LPAZWQOV.js} +5 -1
  228. package/dist/daemon-restart-circuit-breaker-PEGEIP6H.js +35 -0
  229. package/dist/daemon-timer-report-NM44WQRH.js +25 -0
  230. package/dist/{db-backup-DLD4QZBO.js → db-backup-W2QFSYQC.js} +15 -5
  231. package/dist/{db-restore-events-JVEEP52Z.js → db-restore-events-MQ2DBGEQ.js} +2 -2
  232. package/dist/dispatch-ack-VYH3ONSS.js +27 -0
  233. package/dist/{doc-graph-extractor-3TRLGD7M.js → doc-graph-extractor-F6ODFIID.js} +4 -4
  234. package/dist/{documents-FHIBU7KJ.js → documents-23WX2FPQ.js} +12 -12
  235. package/dist/dreaming-NWD22UQ5.js +46 -0
  236. package/dist/{exe-drift-KY2KHZEL.js → exe-drift-CW72FBGE.js} +5 -5
  237. package/dist/{exe-export-SP6G3QF6.js → exe-export-AUJ7CV7G.js} +11 -11
  238. package/dist/{exe-import-KJU7FBVQ.js → exe-import-JX4I52VE.js} +11 -11
  239. package/dist/{exe-key-M6TYHNUW.js → exe-key-2N6LY2BU.js} +241 -226
  240. package/dist/{exe-org-BGZNNE4H.js → exe-org-X4CSNCKS.js} +3 -3
  241. package/dist/{exe-snapshot-ZNPGUKRZ.js → exe-snapshot-XZ7FVCYZ.js} +31 -29
  242. package/dist/{fast-db-init-QQB6IVWV.js → fast-db-init-4CWHSOOR.js} +1 -1
  243. package/dist/{founder-context-PQR3BUS7.js → founder-context-7L3CFPYN.js} +4 -4
  244. package/dist/gateway/index.js +14 -14
  245. package/dist/{gateway-client-GRBOJQYC.js → gateway-client-7LMZKHTH.js} +1 -1
  246. package/dist/git-main-guard-UZP3KXYI.js +39 -0
  247. package/dist/{git-staleness-UGB5J3K7.js → git-staleness-CI2R4QOJ.js} +4 -4
  248. package/dist/{global-procedures-R7KRREEK.js → global-procedures-XQX3LUH6.js} +6 -6
  249. package/dist/{graph-auto-extract-LKIQ57PL.js → graph-auto-extract-OURWMGBS.js} +4 -4
  250. package/dist/{hook-integrity-WURH6DS3.js → hook-integrity-XY47IM7G.js} +1 -1
  251. package/dist/hook-prefetch-PHRRKY4C.js +137 -0
  252. package/dist/hooks/bug-report-worker.js +32 -28
  253. package/dist/hooks/codex-stop-task-finalizer.js +32 -28
  254. package/dist/hooks/commit-complete.js +29 -27
  255. package/dist/hooks/error-recall.js +12 -11
  256. package/dist/hooks/exe-heartbeat-hook.js +6 -6
  257. package/dist/hooks/ingest-worker.js +11 -11
  258. package/dist/hooks/ingest.js +18 -18
  259. package/dist/hooks/instructions-loaded.js +7 -7
  260. package/dist/hooks/manifest.json +20 -20
  261. package/dist/hooks/notification.js +7 -7
  262. package/dist/hooks/post-compact.js +28 -26
  263. package/dist/hooks/post-tool-combined.js +12 -12
  264. package/dist/hooks/pre-compact.js +29 -27
  265. package/dist/hooks/pre-tool-use.js +180 -47
  266. package/dist/hooks/prompt-submit.js +324 -273
  267. package/dist/hooks/session-end.js +35 -33
  268. package/dist/hooks/session-start.js +28 -21
  269. package/dist/hooks/stop.js +35 -33
  270. package/dist/hooks/subagent-stop.js +28 -26
  271. package/dist/hooks/summary-worker.js +36 -34
  272. package/dist/index.js +39 -37
  273. package/dist/{installer-SB2N5NKH.js → installer-G3JAO3NT.js} +9 -9
  274. package/dist/{installer-MZWWBXM6.js → installer-JND3RJ6Q.js} +9 -9
  275. package/dist/{installer-MNPXDLGG.js → installer-L7EVH5U5.js} +9 -9
  276. package/dist/{intercom-queue-VU2G6F5R.js → intercom-queue-ZFEQALR3.js} +25 -23
  277. package/dist/{key-backup-status-TNEHXA2X.js → key-backup-status-LOSMVATJ.js} +2 -2
  278. package/dist/lib/agent-config.js +4 -3
  279. package/dist/lib/cloud-sync.js +19 -19
  280. package/dist/lib/config.js +2 -2
  281. package/dist/lib/consolidation.js +9 -9
  282. package/dist/lib/crypto.js +3 -3
  283. package/dist/lib/database.js +6 -4
  284. package/dist/lib/db-daemon-client.js +5 -5
  285. package/dist/lib/db-read-worker-client.js +9 -3
  286. package/dist/lib/db.js +6 -4
  287. package/dist/lib/device-registry.js +3 -3
  288. package/dist/lib/embed-worker.js +2 -2
  289. package/dist/lib/embedder.js +5 -5
  290. package/dist/lib/employee-templates.js +7 -7
  291. package/dist/lib/employees.js +10 -4
  292. package/dist/lib/exe-daemon-client.js +4 -4
  293. package/dist/lib/exe-daemon.js +651 -158
  294. package/dist/lib/hybrid-search.js +11 -9
  295. package/dist/lib/identity.js +4 -4
  296. package/dist/lib/keychain.js +1 -1
  297. package/dist/lib/license.js +4 -4
  298. package/dist/lib/messaging.js +28 -24
  299. package/dist/lib/post-tool-memory.js +3 -3
  300. package/dist/lib/registry-proxy.js +1 -1
  301. package/dist/lib/reminders.js +15 -7
  302. package/dist/lib/schedules.js +9 -9
  303. package/dist/lib/session-registry.js +6 -6
  304. package/dist/lib/skill-learning.js +10 -10
  305. package/dist/lib/status-brief.js +4 -4
  306. package/dist/lib/store.js +8 -8
  307. package/dist/lib/task-router.js +5 -5
  308. package/dist/lib/tasks.js +29 -25
  309. package/dist/lib/tmux-routing.js +56 -25
  310. package/dist/lib/tmux-status.js +9 -3
  311. package/dist/lib/tmux-transport.js +1 -1
  312. package/dist/lib/token-spend.js +5 -5
  313. package/dist/lib/transport.js +2 -2
  314. package/dist/lib/ws-client.js +1 -1
  315. package/dist/{license-gate-BYDMFMFT.js → license-gate-QTRQHV4F.js} +5 -5
  316. package/dist/{license-sync-N3RNYVP2.js → license-sync-N3UJFWAW.js} +4 -4
  317. package/dist/mcp/register-tools.js +96 -89
  318. package/dist/mcp/server.js +98 -91
  319. package/dist/mcp/tools/complete-reminder.js +6 -6
  320. package/dist/mcp/tools/create-reminder.js +6 -6
  321. package/dist/mcp/tools/create-task.js +37 -28
  322. package/dist/mcp/tools/deactivate-behavior.js +11 -11
  323. package/dist/mcp/tools/list-reminders.js +6 -6
  324. package/dist/mcp/tools/list-tasks.js +35 -29
  325. package/dist/mcp/tools/send-message.js +28 -26
  326. package/dist/mcp/tools/update-task.js +34 -28
  327. package/dist/{mcp-http-config-EMAVS2JI.js → mcp-http-config-BDL36JZ3.js} +6 -6
  328. package/dist/{mcp-port-config-FFAMMLLE.js → mcp-port-config-6HYY6J7K.js} +2 -2
  329. package/dist/mcp-session-identity-T7H2EKFQ.js +177 -0
  330. package/dist/{memory-cards-TQRLZI4D.js → memory-cards-ZRDW7QBX.js} +8 -8
  331. package/dist/{memory-graph-extractor-IWGNVAFU.js → memory-graph-extractor-QLXDMHRS.js} +5 -5
  332. package/dist/{memory-poisoning-defense-T4ITBGSG.js → memory-poisoning-defense-HJTXYCWH.js} +4 -4
  333. package/dist/{memory-pressure-watchdog-RRIAXPXQ.js → memory-pressure-watchdog-HN5X7AVN.js} +76 -37
  334. package/dist/{memory-queue-X2CSEAKE.js → memory-queue-2UOOF27L.js} +5 -3
  335. package/dist/{memory-queue-client-BKQHTYTH.js → memory-queue-client-O5U6F6XP.js} +6 -6
  336. package/dist/{memory-reflection-6N4J2FL7.js → memory-reflection-WVNFBJAA.js} +4 -4
  337. package/dist/{monitor-grants-RZOVSYVO.js → monitor-grants-E3ELDEWD.js} +5 -5
  338. package/dist/{monitor-identity-MOXISYNG.js → monitor-identity-GLFZSEAH.js} +2 -2
  339. package/dist/notification-ledger-SZEPGJQ7.js +409 -0
  340. package/dist/{notifications-KONB3C62.js → notifications-4UT53CDG.js} +25 -23
  341. package/dist/{orchestration-events-5SIJOE4H.js → orchestration-events-WV4NWKZH.js} +5 -5
  342. package/dist/{orchestration-phase-CXRCBCK7.js → orchestration-phase-AWBXPO52.js} +3 -3
  343. package/dist/orchestrator-UAC3RW2T.js +47 -0
  344. package/dist/{pipeline-router-O6HU7DKH.js → pipeline-router-LM53NMWJ.js} +5 -5
  345. package/dist/{plan-limits-GRNBOBB3.js → plan-limits-2FEY2GOS.js} +7 -7
  346. package/dist/platform-procedures-X5DFJFV7.js +13 -0
  347. package/dist/{preferences-TYTGDXQZ.js → preferences-TWIXZBKS.js} +2 -2
  348. package/dist/{project-boot-SD7GM24K.js → project-boot-4NUH5FRU.js} +2 -2
  349. package/dist/{projection-worker-ZVOFHTXT.js → projection-worker-FZ7YSN3G.js} +5 -5
  350. package/dist/{prospective-memory-W6S67LZZ.js → prospective-memory-6D2ASWM3.js} +4 -4
  351. package/dist/{push-notifications-W5JRXLKJ.js → push-notifications-U6FIBQRW.js} +3 -3
  352. package/dist/{reranker-QATGTAPC.js → reranker-GYYRPANK.js} +3 -3
  353. package/dist/{retrieval-health-TWHKYCRK.js → retrieval-health-4Z242P3B.js} +1 -1
  354. package/dist/{review-polling-PCMD5BFN.js → review-polling-HXAFJZDA.js} +26 -24
  355. package/dist/runtime/index.js +37 -35
  356. package/dist/{session-events-3LCVQEL7.js → session-events-O3BV56ZX.js} +26 -24
  357. package/dist/{session-kill-telemetry-CZSPN5V6.js → session-kill-telemetry-AELE4JDK.js} +26 -24
  358. package/dist/session-mcp-config-YKNXG5DW.js +50 -0
  359. package/dist/{session-scope-CFHVSVAQ.js → session-scope-5EAPUT45.js} +25 -23
  360. package/dist/setup-wizard-NB6R4QVS.js +14 -0
  361. package/dist/{shard-manager-MBWQEYNG.js → shard-manager-35PWFR3B.js} +3 -3
  362. package/dist/{skill-refinement-74T6VDFM.js → skill-refinement-DVSYXBBP.js} +5 -5
  363. package/dist/stack-promote-RSOWO6EY.js +130 -0
  364. package/dist/{stack-release-XXMV7SPX.js → stack-release-HGFFFCGC.js} +112 -22
  365. package/dist/{stack-update-E2TKHHSQ.js → stack-update-ATCJFOEK.js} +7 -5
  366. package/dist/{steward-gate-WT7WXQIE.js → steward-gate-3GQ5XKMJ.js} +5 -5
  367. package/dist/support-inbox-4L62P4EP.js +33 -0
  368. package/dist/support-outbox-WHGPUYL2.js +16 -0
  369. package/dist/task-enforcement-IPIZX2MM.js +90 -0
  370. package/dist/{task-scope-CQEG5SSJ.js → task-scope-FOIW25HR.js} +27 -23
  371. package/dist/{tasks-crud-UGK5A25L.js → tasks-crud-HBDKE6C5.js} +35 -23
  372. package/dist/tasks-notify-G2U2U2YA.js +53 -0
  373. package/dist/{tasks-review-JKBRACII.js → tasks-review-27SFX5XN.js} +27 -23
  374. package/dist/{telemetry-upload-7LBYGPCB.js → telemetry-upload-ZOXHRWR5.js} +9 -9
  375. package/dist/tmux-command-guard-KSJKIX3C.js +117 -0
  376. package/dist/{token-budget-QBRJR4M5.js → token-budget-5Y4YPDO3.js} +5 -5
  377. package/dist/{tool-capability-index-Q6YQDL7I.js → tool-capability-index-VYF5GNJ2.js} +1 -1
  378. package/dist/{tool-telemetry-ULIDUK3P.js → tool-telemetry-KBXSBDTK.js} +1 -1
  379. package/dist/tui/App.js +40 -38
  380. package/dist/{tui-data-NPTGKT37.js → tui-data-NLFMBIQI.js} +25 -23
  381. package/dist/{update-check-HFO4VHO4.js → update-check-3FHAWIG2.js} +7 -3
  382. package/dist/update-support-UVUSZG7R.js +355 -0
  383. package/dist/{whatsapp-accounts-BWRZUY23.js → whatsapp-accounts-BFIOXYW5.js} +1 -1
  384. package/dist/{whatsapp-config-GOSELKTE.js → whatsapp-config-FAX6EA5K.js} +20 -13
  385. package/dist/{worker-gate-MXUQUG4M.js → worker-gate-3KUBAU32.js} +3 -3
  386. package/dist/{workflow-engine-EWCOLD47.js → workflow-engine-YITHXZR5.js} +2 -2
  387. package/dist/{working-memory-PY4AG577.js → working-memory-NUVB5SFV.js} +1 -1
  388. package/dist/worktree-LL62PLQB.js +47 -0
  389. package/dist/{worktree-sweep-ZAG3V24E.js → worktree-sweep-WTK3MTKH.js} +7 -7
  390. package/package.json +3 -2
  391. package/release-notes.json +86 -76
  392. package/dist/branch-hygiene-R5NVTRAY.js +0 -138
  393. package/dist/chunk-6IRVGOUL.js +0 -30
  394. package/dist/chunk-HMP5VT6A.js +0 -118
  395. package/dist/chunk-PVYR4FCQ.js +0 -113
  396. package/dist/chunk-UFAXZ2PY.js +0 -138
  397. package/dist/chunk-Y25OJWOQ.js +0 -45
  398. package/dist/chunk-YGAAZN3E.js +0 -47
  399. package/dist/cto-delegation-gate-DXNF5HVW.js +0 -290
  400. package/dist/dispatch-ack-4S44HBWB.js +0 -15
  401. package/dist/dreaming-OMFUEUCQ.js +0 -44
  402. package/dist/orchestrator-DUUX7FQV.js +0 -45
  403. package/dist/setup-wizard-TOFEJPLF.js +0 -13
  404. package/dist/tasks-notify-SMLDFBWM.js +0 -50
  405. package/dist/worktree-GVF2I5FP.js +0 -31
  406. /package/dist/{chunk-FLNSJ2TC.js → chunk-GIBYNT6W.js} +0 -0
  407. /package/dist/{chunk-NQBRGXYR.js → chunk-JRM4TAGS.js} +0 -0
  408. /package/dist/{chunk-WHRTDN5J.js → chunk-MGGOSFCR.js} +0 -0
  409. /package/dist/{chunk-D3QASX2W.js → chunk-QIFYLIUF.js} +0 -0
  410. /package/dist/{chunk-OADURIIN.js → chunk-WTH4CSAP.js} +0 -0
  411. /package/dist/{core-memory-VO5ZIBKH.js → core-memory-GAC6EWOQ.js} +0 -0
  412. /package/dist/{entity-boost-DNI4A5I7.js → entity-boost-NT6UO2Z3.js} +0 -0
  413. /package/dist/{message-queue-client-Q5BW3O5W.js → message-queue-client-4EOQRUXW.js} +0 -0
  414. /package/dist/{oauth-server-ROQFOEMM.js → oauth-server-67YBDP32.js} +0 -0
  415. /package/dist/{webhook-pipe-FZYLO6RR.js → webhook-pipe-LEXMUQ5B.js} +0 -0
  416. /package/dist/{wiki-acl-JA5UCQZ4.js → wiki-acl-74BLWG6J.js} +0 -0
  417. /package/dist/{wiki-client-VNDOBK63.js → wiki-client-EAN7F5LV.js} +0 -0
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ isMainModule
4
+ } from "./chunk-6Y4B3QF6.js";
5
+ import "./chunk-MLKGABMK.js";
6
+
7
+ // src/bin/stack-promote.ts
8
+ import { existsSync, readFileSync, writeFileSync } from "fs";
9
+ import path from "path";
10
+ function promoteCanaryStack(manifest, version) {
11
+ const entry = manifest.stacks[version];
12
+ if (!entry) {
13
+ throw new Error(`Stack version ${version} not found in manifest. Known versions: ${Object.keys(manifest.stacks).join(", ")}`);
14
+ }
15
+ if (manifest.latest === version) {
16
+ throw new Error(`Stack version ${version} is already manifest.latest \u2014 nothing to promote.`);
17
+ }
18
+ const stage = entry.rolloutStage ?? "ga";
19
+ if (stage !== "canary") {
20
+ throw new Error(
21
+ `Stack version ${version} has rolloutStage="${stage}", not "canary" \u2014 stack-promote only promotes canary releases to GA. To move the fleet to an older already-GA version, use "exe-os stack-update --target ${version} --yes" (or --rollback) instead.`
22
+ );
23
+ }
24
+ const previousLatest = manifest.latest;
25
+ entry.rolloutStage = "ga";
26
+ manifest.latest = version;
27
+ return { version, previousLatest };
28
+ }
29
+ function findDefaultManifestPath() {
30
+ let dir = path.dirname(new URL(import.meta.url).pathname);
31
+ for (let i = 0; i < 6; i++) {
32
+ const candidate = path.join(dir, "deploy", "stack-manifests", "v0.9.json");
33
+ if (existsSync(candidate)) return candidate;
34
+ dir = path.dirname(dir);
35
+ }
36
+ return path.join(process.cwd(), "deploy", "stack-manifests", "v0.9.json");
37
+ }
38
+ function parseArgs(args) {
39
+ const opts = { version: "", manifestPath: findDefaultManifestPath(), yes: false };
40
+ for (let i = 0; i < args.length; i++) {
41
+ const arg = args[i];
42
+ if (arg === "--version") opts.version = args[++i] ?? "";
43
+ else if (arg.startsWith("--version=")) opts.version = arg.slice("--version=".length);
44
+ else if (arg === "--manifest") opts.manifestPath = args[++i] ?? opts.manifestPath;
45
+ else if (arg.startsWith("--manifest=")) opts.manifestPath = arg.slice("--manifest=".length);
46
+ else if (arg === "--yes" || arg === "-y") opts.yes = true;
47
+ }
48
+ return opts;
49
+ }
50
+ function printUsage() {
51
+ console.log(`
52
+ Usage: exe-os stack-promote --version <version> [options]
53
+
54
+ Promote a CANARY stack version to general availability (GA): flips its
55
+ rolloutStage to "ga" and bumps manifest.latest so every customer running
56
+ plain "stack-update --yes" (no --target) will pick it up.
57
+
58
+ Run this ONLY after the canary host has been deployed and verified healthy
59
+ (vps-health-gate / verify-stack) for an appropriate soak period.
60
+
61
+ Options:
62
+ --version <version> Stack version to promote (must have rolloutStage: "canary")
63
+ --manifest <path> Path to the stack manifest JSON (default: deploy/stack-manifests/v0.9.json)
64
+ --yes, -y Skip the interactive confirmation prompt
65
+ --help Show this help message
66
+
67
+ This command edits the manifest file only \u2014 it does not commit, tag, or
68
+ push. Review the diff and commit/push yourself (or via CI), same as
69
+ "exe-os release --stack".
70
+ `);
71
+ }
72
+ async function runStackPromoteCli(args) {
73
+ if (args.includes("--help") || args.includes("-h")) {
74
+ printUsage();
75
+ return;
76
+ }
77
+ const opts = parseArgs(args);
78
+ if (!opts.version) {
79
+ console.error("[stack-promote] --version <version> is required.\n");
80
+ printUsage();
81
+ process.exitCode = 1;
82
+ return;
83
+ }
84
+ if (!existsSync(opts.manifestPath)) {
85
+ console.error(`[stack-promote] Manifest not found: ${opts.manifestPath}`);
86
+ process.exitCode = 1;
87
+ return;
88
+ }
89
+ const raw = readFileSync(opts.manifestPath, "utf8");
90
+ const manifest = JSON.parse(raw);
91
+ let result;
92
+ try {
93
+ result = promoteCanaryStack(manifest, opts.version);
94
+ } catch (err) {
95
+ console.error(`[stack-promote] ${err instanceof Error ? err.message : String(err)}`);
96
+ process.exitCode = 1;
97
+ return;
98
+ }
99
+ console.log(`[stack-promote] ${result.previousLatest} -> ${result.version}`);
100
+ console.log(`[stack-promote] Manifest: ${opts.manifestPath}`);
101
+ if (!opts.yes) {
102
+ const { createInterface } = await import("readline");
103
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
104
+ const answer = await new Promise((resolve) => {
105
+ rl.question(
106
+ `
107
+ Promote ${result.version} to GA (manifest.latest)? Confirm the canary host is verified healthy. [y/N] `,
108
+ resolve
109
+ );
110
+ });
111
+ rl.close();
112
+ if (answer.trim().toLowerCase() !== "y") {
113
+ console.log("[stack-promote] Aborted.");
114
+ process.exitCode = 1;
115
+ return;
116
+ }
117
+ }
118
+ writeFileSync(opts.manifestPath, JSON.stringify(manifest, null, 2) + "\n");
119
+ console.log(`[stack-promote] \u2713 Promoted ${result.version} to GA. Commit and push ${path.basename(opts.manifestPath)} to publish.`);
120
+ }
121
+ if (isMainModule(import.meta.url) && process.argv[1]?.includes("stack-promote")) {
122
+ runStackPromoteCli(process.argv.slice(2)).catch((err) => {
123
+ console.error(`[stack-promote] Fatal error: ${err instanceof Error ? err.message : String(err)}`);
124
+ process.exitCode = 1;
125
+ });
126
+ }
127
+ export {
128
+ promoteCanaryStack,
129
+ runStackPromoteCli
130
+ };
@@ -144,7 +144,9 @@ function parseReleaseArgs(argv) {
144
144
  skipImageVerify: false,
145
145
  allowRed: false,
146
146
  root: null,
147
- forceBuild: false
147
+ forceBuild: false,
148
+ canary: false,
149
+ allowDirty: false
148
150
  };
149
151
  for (let i = 0; i < argv.length; i++) {
150
152
  const arg = argv[i];
@@ -155,6 +157,8 @@ function parseReleaseArgs(argv) {
155
157
  else if (arg === "--minor") flags.minor = true;
156
158
  else if (arg === "--skip-image-verify") flags.skipImageVerify = true;
157
159
  else if (arg === "--allow-red") flags.allowRed = true;
160
+ else if (arg === "--allow-dirty") flags.allowDirty = true;
161
+ else if (arg === "--canary") flags.canary = true;
158
162
  else if (arg === "--repos" && argv[i + 1]) {
159
163
  flags.repos = argv[++i].split(",").map((s) => s.trim()).filter(Boolean);
160
164
  } else if (arg.startsWith("--repos=")) {
@@ -173,6 +177,24 @@ async function git(repoPath, ...args) {
173
177
  const { stdout } = await execFile("git", ["-C", repoPath, ...args]);
174
178
  return stdout.trim();
175
179
  }
180
+ async function assertCleanWorkingTree(opts) {
181
+ const gitStatus = opts.gitStatus ?? (() => git(EXE_OS_ROOT, "status", "--porcelain"));
182
+ const status = (await gitStatus()).trim();
183
+ if (!status) return;
184
+ const dirtyPaths = status.split("\n").map((l) => l.trim()).filter(Boolean);
185
+ if (opts.allowDirty) {
186
+ console.warn("\n \x1B[33;1m\u26A0 --allow-dirty: releasing with a DIRTY working tree\x1B[0m");
187
+ console.warn(" \x1B[33m Uncommitted changes are present in exe-os and may leak into the release:\x1B[0m");
188
+ for (const p of dirtyPaths) console.warn(` \x1B[33m ${p}\x1B[0m`);
189
+ console.warn(" \x1B[33m Use only for break-glass emergencies.\x1B[0m\n");
190
+ return;
191
+ }
192
+ throw new Error(
193
+ `Refusing to release: the exe-os working tree is not clean (${dirtyPaths.length} dirty path(s)).
194
+ ` + dirtyPaths.map((p) => ` ${p}`).join("\n") + `
195
+ Commit, stash, or discard these changes first \u2014 or pass --allow-dirty to override (break-glass).`
196
+ );
197
+ }
176
198
  async function getLastTag(repoPath) {
177
199
  try {
178
200
  return await git(repoPath, "describe", "--tags", "--abbrev=0");
@@ -351,21 +373,68 @@ async function bumpVersions(changes, mode, dryRun) {
351
373
  log("ok", `${change.repo.serviceKey}: bumped ${change.currentVersion} -> ${newVersion} (local commit, push deferred)`);
352
374
  }
353
375
  }
376
+ async function landViaPR(repoPath, ghRepo, defaultBranch, branch, title) {
377
+ await git(repoPath, "push", "--force-with-lease", "origin", `HEAD:refs/heads/${branch}`);
378
+ try {
379
+ await ghRun([
380
+ "pr",
381
+ "create",
382
+ "--repo",
383
+ ghRepo,
384
+ "--base",
385
+ defaultBranch,
386
+ "--head",
387
+ branch,
388
+ "--title",
389
+ title,
390
+ "--body",
391
+ "Automated release version bump \u2014 auto-merges when required CI is green."
392
+ ]);
393
+ } catch {
394
+ }
395
+ await ghRun(["pr", "merge", branch, "--repo", ghRepo, "--auto", "--squash"]);
396
+ const deadline = Date.now() + 30 * 60 * 1e3;
397
+ for (; ; ) {
398
+ const state = (await ghRun([
399
+ "pr",
400
+ "view",
401
+ branch,
402
+ "--repo",
403
+ ghRepo,
404
+ "--json",
405
+ "state",
406
+ "-q",
407
+ ".state"
408
+ ])).trim();
409
+ if (state === "MERGED") break;
410
+ if (Date.now() > deadline) {
411
+ throw new Error(
412
+ `Release PR ${ghRepo} (${branch}) did not merge within 30m \u2014 required CI likely red. Aborting release; ${defaultBranch} left untouched.`
413
+ );
414
+ }
415
+ await new Promise((r) => setTimeout(r, 3e4));
416
+ }
417
+ await git(repoPath, "fetch", "origin", defaultBranch);
418
+ await git(repoPath, "checkout", defaultBranch);
419
+ await git(repoPath, "reset", "--hard", `origin/${defaultBranch}`);
420
+ }
354
421
  async function tagAndTriggerCI(changes, dryRun) {
355
422
  for (const change of changes) {
356
423
  if (dryRun) {
357
- log("dry", `Would tag ${change.repo.serviceKey} ${change.tag}`);
424
+ log("dry", `Would land ${change.repo.serviceKey} bump via PR + tag ${change.tag}`);
358
425
  continue;
359
426
  }
427
+ const branch = `release/bump-${change.tag}`;
428
+ await landViaPR(
429
+ change.repo.localPath,
430
+ change.repo.ghRepo,
431
+ change.repo.defaultBranch,
432
+ branch,
433
+ `chore: bump ${change.tag} for stack release`
434
+ );
360
435
  await git(change.repo.localPath, "tag", change.tag);
361
- try {
362
- await git(change.repo.localPath, "push", "--atomic", "origin", change.repo.defaultBranch, change.tag);
363
- } catch {
364
- log("warn", `Atomic push not supported for ${change.repo.serviceKey} \u2014 falling back to sequential push`);
365
- await git(change.repo.localPath, "push", "origin", change.repo.defaultBranch);
366
- await git(change.repo.localPath, "push", "origin", change.tag);
367
- }
368
- log("ok", `Pushed ${change.repo.serviceKey} ${change.tag} (bump + tag) \u2014 CI triggered`);
436
+ await git(change.repo.localPath, "push", "origin", change.tag);
437
+ log("ok", `Landed ${change.repo.serviceKey} ${change.tag} via PR + tagged (green-CI gated)`);
369
438
  }
370
439
  }
371
440
  async function rollbackFailedReleases(changes, ciStatuses, dryRun) {
@@ -390,8 +459,14 @@ async function rollbackFailedReleases(changes, ciStatuses, dryRun) {
390
459
  }
391
460
  try {
392
461
  await git(change.repo.localPath, "revert", "--no-edit", "HEAD");
393
- await git(change.repo.localPath, "push", "origin", change.repo.defaultBranch);
394
- log("ok", `Reverted bump commit for ${name} on ${change.repo.defaultBranch}`);
462
+ await landViaPR(
463
+ change.repo.localPath,
464
+ change.repo.ghRepo,
465
+ change.repo.defaultBranch,
466
+ `release/revert-${change.tag}`,
467
+ `Revert bump ${change.tag} (release CI failed)`
468
+ );
469
+ log("ok", `Reverted bump commit for ${name} on ${change.repo.defaultBranch} (via PR)`);
395
470
  } catch (err) {
396
471
  log("fail", `Could not revert bump commit for ${name}: ${err instanceof Error ? err.message : String(err)}. Manual cleanup required.`);
397
472
  }
@@ -672,7 +747,7 @@ function printImageVerification(results) {
672
747
  }
673
748
  console.log("");
674
749
  }
675
- async function updateStackManifest(changes, ciStatuses, dryRun, imageResults) {
750
+ async function updateStackManifest(changes, ciStatuses, dryRun, imageResults, canary = false) {
676
751
  const manifest = JSON.parse(readFileSync(MANIFEST_PATH, "utf8"));
677
752
  const currentLatest = manifest.latest;
678
753
  const currentParts = currentLatest.split(".").map(Number);
@@ -724,17 +799,30 @@ async function updateStackManifest(changes, ciStatuses, dryRun, imageResults) {
724
799
  notes,
725
800
  npmVersion: exeOsVersion,
726
801
  breakingChanges: [],
727
- services
802
+ services,
803
+ // Staged rollout (release-safety canary hardening): "canary" entries are
804
+ // published (images pinned + pullable) but NOT promoted for implicit
805
+ // adoption — see assertRolloutStageAllowed in src/lib/stack-update.ts.
806
+ rolloutStage: canary ? "canary" : "ga"
728
807
  };
729
808
  if (dryRun) {
730
- log("dry", `Would create stack ${newStackVersion} in manifest`);
809
+ log("dry", `Would create stack ${newStackVersion} in manifest${canary ? " (CANARY \u2014 latest would NOT be bumped)" : ""}`);
731
810
  log("dry", `Notes: ${notes}`);
732
811
  return newStackVersion;
733
812
  }
734
- manifest.latest = newStackVersion;
735
813
  manifest.stacks[newStackVersion] = newEntry;
736
- writeFileSync(MANIFEST_PATH, JSON.stringify(manifest, null, 2) + "\n");
737
- log("ok", `Stack manifest updated: ${currentLatest} -> ${newStackVersion}`);
814
+ if (canary) {
815
+ writeFileSync(MANIFEST_PATH, JSON.stringify(manifest, null, 2) + "\n");
816
+ log("ok", `Stack manifest updated: added CANARY ${newStackVersion} (latest unchanged: ${currentLatest})`);
817
+ log("warn", `${newStackVersion} is a CANARY release. Deploy to a designated canary host with:`);
818
+ log("warn", ` exe-os stack-update --target ${newStackVersion} --yes`);
819
+ log("warn", `Then verify health (vps-health-gate / verify-stack) and promote with:`);
820
+ log("warn", ` exe-os stack-promote --version ${newStackVersion} --yes`);
821
+ } else {
822
+ manifest.latest = newStackVersion;
823
+ writeFileSync(MANIFEST_PATH, JSON.stringify(manifest, null, 2) + "\n");
824
+ log("ok", `Stack manifest updated: ${currentLatest} -> ${newStackVersion}`);
825
+ }
738
826
  return newStackVersion;
739
827
  }
740
828
  function gatePublishWithPreflight(newStackVersion, dryRun, allowRed) {
@@ -837,8 +925,8 @@ async function commitAndTagExeOs(newStackVersion, _exeOsChange, dryRun) {
837
925
  await git(EXE_OS_ROOT, "add", "deploy/stack-manifests/v0.9.json");
838
926
  const commitMsg = `chore: stack release v${newStackVersion}`;
839
927
  await git(EXE_OS_ROOT, "commit", "-m", commitMsg);
840
- await git(EXE_OS_ROOT, "push", "origin", "main");
841
- log("ok", `Committed stack manifest v${newStackVersion}`);
928
+ await landViaPR(EXE_OS_ROOT, "AskExe/exe-os", "main", `release/stack-v${newStackVersion}`, commitMsg);
929
+ log("ok", `Committed stack manifest v${newStackVersion} (via PR)`);
842
930
  }
843
931
  const stackTag = `stack-v${newStackVersion}`;
844
932
  try {
@@ -911,7 +999,7 @@ async function confirm(message) {
911
999
  }
912
1000
  async function runStackRelease(flags) {
913
1001
  if (!flags.stack) {
914
- console.error("Usage: exe-os release --stack [--dry-run] [--repos <list>] [--yes] [--skip-image-verify] [--allow-red] [--root <path>] [--force]");
1002
+ console.error("Usage: exe-os release --stack [--dry-run] [--repos <list>] [--yes] [--skip-image-verify] [--allow-red] [--allow-dirty] [--canary] [--root <path>] [--force]");
915
1003
  process.exit(1);
916
1004
  }
917
1005
  if (flags.root) {
@@ -922,6 +1010,7 @@ async function runStackRelease(flags) {
922
1010
  console.warn(" \x1B[33m Docker images will be built WITHOUT requiring green CI.\x1B[0m");
923
1011
  console.warn(" \x1B[33m Use only for break-glass emergencies.\x1B[0m\n");
924
1012
  }
1013
+ await assertCleanWorkingTree({ allowDirty: flags.allowDirty || flags.dryRun });
925
1014
  console.log(`
926
1015
  \x1B[1mexe-os stack release\x1B[0m${flags.dryRun ? " (dry run)" : ""}
927
1016
  `);
@@ -1021,7 +1110,7 @@ async function runStackRelease(flags) {
1021
1110
  printImageVerification(imageResults);
1022
1111
  }
1023
1112
  log("info", "Updating stack manifest...");
1024
- const newStackVersion = await updateStackManifest(changes, ciStatuses, flags.dryRun, imageResults);
1113
+ const newStackVersion = await updateStackManifest(changes, ciStatuses, flags.dryRun, imageResults, flags.canary);
1025
1114
  gatePublishWithPreflight(newStackVersion, flags.dryRun, flags.allowRed);
1026
1115
  const exeOsChange = changes.find((c) => c.repo.serviceKey === "exe-os");
1027
1116
  await commitAndTagExeOs(newStackVersion, exeOsChange, flags.dryRun);
@@ -1044,6 +1133,7 @@ async function runStackRelease(flags) {
1044
1133
  }
1045
1134
  }
1046
1135
  export {
1136
+ assertCleanWorkingTree,
1047
1137
  deriveCloneUrl,
1048
1138
  ensureRepoCloned,
1049
1139
  isCloneTargetSafe,
@@ -6,6 +6,7 @@ import {
6
6
  assertDeploymentScopeAllowed,
7
7
  assertHostReadyForApply,
8
8
  assertProductionDeployGate,
9
+ assertRolloutStageAllowed,
9
10
  backupStackConfig,
10
11
  bootstrapStackHost,
11
12
  buildDefaultServiceSelection,
@@ -58,11 +59,11 @@ import {
58
59
  verifyReleaseHealth,
59
60
  verifyStackManifestSignature,
60
61
  waitForHttpOk
61
- } from "./chunk-XWHE4LZK.js";
62
- import "./chunk-XACL67CS.js";
63
- import "./chunk-5Z5NATNS.js";
64
- import "./chunk-7Y5UDEVM.js";
65
- import "./chunk-SHIICYJW.js";
62
+ } from "./chunk-JTBIS4R5.js";
63
+ import "./chunk-PQIDGXSG.js";
64
+ import "./chunk-K7KFGDWF.js";
65
+ import "./chunk-WZHZCDDO.js";
66
+ import "./chunk-BYTDMAGB.js";
66
67
  import "./chunk-MLKGABMK.js";
67
68
  export {
68
69
  ProgressReporter,
@@ -72,6 +73,7 @@ export {
72
73
  assertDeploymentScopeAllowed,
73
74
  assertHostReadyForApply,
74
75
  assertProductionDeployGate,
76
+ assertRolloutStageAllowed,
75
77
  backupStackConfig,
76
78
  bootstrapStackHost,
77
79
  buildDefaultServiceSelection,
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  StewardGate
3
- } from "./chunk-AOO77BDE.js";
4
- import "./chunk-HEPR6QTL.js";
3
+ } from "./chunk-EUS4QUKP.js";
4
+ import "./chunk-AOHXREB7.js";
5
5
  import "./chunk-2I23RPSI.js";
6
- import "./chunk-ATOU6CYR.js";
6
+ import "./chunk-OLMQ4UOF.js";
7
7
  import "./chunk-PNQDP3OA.js";
8
8
  import "./chunk-H73TUI4Y.js";
9
9
  import "./chunk-7HLWBYH7.js";
10
10
  import "./chunk-FXU7JOXK.js";
11
- import "./chunk-7Y5UDEVM.js";
12
- import "./chunk-SHIICYJW.js";
11
+ import "./chunk-WZHZCDDO.js";
12
+ import "./chunk-BYTDMAGB.js";
13
13
  import "./chunk-MLKGABMK.js";
14
14
  export {
15
15
  StewardGate
@@ -0,0 +1,33 @@
1
+ import {
2
+ registerAddBugReportComment,
3
+ registerGetBugReport,
4
+ registerGetBugReportComments,
5
+ registerGetFeatureRequest,
6
+ registerGetReview,
7
+ registerListBugReports,
8
+ registerListFeatureRequests,
9
+ registerListReviews,
10
+ registerTriageBugReport,
11
+ registerTriageFeatureRequest,
12
+ registerTriageReview
13
+ } from "./chunk-HV4KESRY.js";
14
+ import "./chunk-5H47VHB7.js";
15
+ import "./chunk-4QCFFW2H.js";
16
+ import "./chunk-PQIDGXSG.js";
17
+ import "./chunk-K7KFGDWF.js";
18
+ import "./chunk-WZHZCDDO.js";
19
+ import "./chunk-BYTDMAGB.js";
20
+ import "./chunk-MLKGABMK.js";
21
+ export {
22
+ registerAddBugReportComment,
23
+ registerGetBugReport,
24
+ registerGetBugReportComments,
25
+ registerGetFeatureRequest,
26
+ registerGetReview,
27
+ registerListBugReports,
28
+ registerListFeatureRequests,
29
+ registerListReviews,
30
+ registerTriageBugReport,
31
+ registerTriageFeatureRequest,
32
+ registerTriageReview
33
+ };
@@ -0,0 +1,16 @@
1
+ import {
2
+ flushSupportOutbox,
3
+ getOutboxStatus,
4
+ queueSupportStatusUpdateSync,
5
+ reconcileUpstreamStatus
6
+ } from "./chunk-25X4JD2V.js";
7
+ import "./chunk-MMRUBN3I.js";
8
+ import "./chunk-4QCFFW2H.js";
9
+ import "./chunk-MLKGABMK.js";
10
+ export {
11
+ flushSupportOutbox as flushBugReportOutbox,
12
+ flushSupportOutbox,
13
+ getOutboxStatus,
14
+ queueSupportStatusUpdateSync,
15
+ reconcileUpstreamStatus
16
+ };
@@ -0,0 +1,90 @@
1
+ import {
2
+ IDLE_PATTERNS,
3
+ MANAGER_GRACE_PERIOD_MS,
4
+ MANAGER_ROLES,
5
+ MCP_ZOMBIE_PATTERNS,
6
+ NUDGE_ECHO_PATTERNS,
7
+ STALE_DISPATCH_PENDING_THRESHOLD_MS,
8
+ STUCK_TASK_THRESHOLD_MS,
9
+ TASK_ENFORCEMENT_DEBOUNCE_MS,
10
+ TASK_ENFORCEMENT_INTERVAL_MS,
11
+ _resetNudgeState,
12
+ decideManagerAction,
13
+ decideWorkerAction,
14
+ findStuckTasks,
15
+ isCurrentlyIdle,
16
+ isIdlePane,
17
+ isMcpZombiePane,
18
+ isNudgeEcho,
19
+ isPaneBusy,
20
+ isWorkerPaneIdle,
21
+ runTaskEnforcementTick,
22
+ sendNudge,
23
+ surfaceStaleDispatchPendingSignals,
24
+ transitionCompletedDelegatedParents
25
+ } from "./chunk-4CMVFVFC.js";
26
+ import "./chunk-UP75Z5X7.js";
27
+ import "./chunk-L2R3LN2P.js";
28
+ import "./chunk-I26FWCSP.js";
29
+ import "./chunk-EV46QTD3.js";
30
+ import "./chunk-E23LNUWJ.js";
31
+ import "./chunk-4JERP7NT.js";
32
+ import "./chunk-EIKATSE4.js";
33
+ import "./chunk-KGWRTRKC.js";
34
+ import "./chunk-AD2VCHSS.js";
35
+ import "./chunk-WOYADZF5.js";
36
+ import "./chunk-SKGMF2SO.js";
37
+ import "./chunk-2WAVZ5UJ.js";
38
+ import "./chunk-HA5R6USD.js";
39
+ import "./chunk-AM7S2TY6.js";
40
+ import "./chunk-JGIPOUIK.js";
41
+ import "./chunk-GWDSB25T.js";
42
+ import "./chunk-CVYC6DUW.js";
43
+ import "./chunk-JLZ4RYSD.js";
44
+ import "./chunk-H7I47RS5.js";
45
+ import "./chunk-OPU3NYOO.js";
46
+ import "./chunk-G4RGKBCA.js";
47
+ import "./chunk-AFNRE2RV.js";
48
+ import "./chunk-X2Q5NLUL.js";
49
+ import "./chunk-NLEW62VC.js";
50
+ import "./chunk-HYZV25LY.js";
51
+ import "./chunk-GJV3WDWM.js";
52
+ import "./chunk-MP2AFCGL.js";
53
+ import "./chunk-AOHXREB7.js";
54
+ import "./chunk-2I23RPSI.js";
55
+ import "./chunk-OLMQ4UOF.js";
56
+ import "./chunk-PNQDP3OA.js";
57
+ import "./chunk-H73TUI4Y.js";
58
+ import "./chunk-7HLWBYH7.js";
59
+ import "./chunk-FXU7JOXK.js";
60
+ import "./chunk-NGP6LSV2.js";
61
+ import "./chunk-PQIDGXSG.js";
62
+ import "./chunk-K7KFGDWF.js";
63
+ import "./chunk-WZHZCDDO.js";
64
+ import "./chunk-BYTDMAGB.js";
65
+ import "./chunk-MLKGABMK.js";
66
+ export {
67
+ IDLE_PATTERNS,
68
+ MANAGER_GRACE_PERIOD_MS,
69
+ MANAGER_ROLES,
70
+ MCP_ZOMBIE_PATTERNS,
71
+ NUDGE_ECHO_PATTERNS,
72
+ STALE_DISPATCH_PENDING_THRESHOLD_MS,
73
+ STUCK_TASK_THRESHOLD_MS,
74
+ TASK_ENFORCEMENT_DEBOUNCE_MS,
75
+ TASK_ENFORCEMENT_INTERVAL_MS,
76
+ _resetNudgeState,
77
+ decideManagerAction,
78
+ decideWorkerAction,
79
+ findStuckTasks,
80
+ isCurrentlyIdle,
81
+ isIdlePane,
82
+ isMcpZombiePane,
83
+ isNudgeEcho,
84
+ isPaneBusy,
85
+ isWorkerPaneIdle,
86
+ runTaskEnforcementTick,
87
+ sendNudge,
88
+ surfaceStaleDispatchPendingSignals,
89
+ transitionCompletedDelegatedParents
90
+ };
@@ -1,4 +1,5 @@
1
1
  import {
2
+ VALID_SESSION_SCOPE_RE,
2
3
  allowDeadScopeRescue,
3
4
  getCurrentSessionScope,
4
5
  isAmbiguousMultiCoordinatorContext,
@@ -8,45 +9,48 @@ import {
8
9
  sanitizeSessionScope,
9
10
  sessionScopeFilter,
10
11
  strictSessionScopeFilter
11
- } from "./chunk-PLRIJALF.js";
12
- import "./chunk-OFX5B2S7.js";
13
- import "./chunk-B76TSEP3.js";
14
- import "./chunk-RLRT2BVM.js";
12
+ } from "./chunk-UP75Z5X7.js";
13
+ import "./chunk-L2R3LN2P.js";
14
+ import "./chunk-I26FWCSP.js";
15
+ import "./chunk-EV46QTD3.js";
16
+ import "./chunk-E23LNUWJ.js";
15
17
  import "./chunk-4JERP7NT.js";
16
18
  import "./chunk-EIKATSE4.js";
17
- import "./chunk-E23LNUWJ.js";
18
- import "./chunk-UIV2WPBT.js";
19
- import "./chunk-SSTLTIF3.js";
20
- import "./chunk-RMOBQ6A5.js";
21
- import "./chunk-54QCG45Y.js";
22
- import "./chunk-FUIIVSW6.js";
23
- import "./chunk-65SVQELL.js";
24
- import "./chunk-NGP6LSV2.js";
25
- import "./chunk-MW2GJJ53.js";
19
+ import "./chunk-KGWRTRKC.js";
20
+ import "./chunk-AD2VCHSS.js";
21
+ import "./chunk-WOYADZF5.js";
22
+ import "./chunk-SKGMF2SO.js";
23
+ import "./chunk-2WAVZ5UJ.js";
24
+ import "./chunk-HA5R6USD.js";
25
+ import "./chunk-AM7S2TY6.js";
26
+ import "./chunk-JGIPOUIK.js";
27
+ import "./chunk-GWDSB25T.js";
26
28
  import "./chunk-CVYC6DUW.js";
27
- import "./chunk-2233TQCA.js";
28
- import "./chunk-HCJCW7X4.js";
29
+ import "./chunk-JLZ4RYSD.js";
30
+ import "./chunk-H7I47RS5.js";
29
31
  import "./chunk-OPU3NYOO.js";
30
- import "./chunk-7TS64TBG.js";
32
+ import "./chunk-G4RGKBCA.js";
31
33
  import "./chunk-AFNRE2RV.js";
32
- import "./chunk-3NGZ4PL7.js";
34
+ import "./chunk-X2Q5NLUL.js";
33
35
  import "./chunk-NLEW62VC.js";
34
36
  import "./chunk-HYZV25LY.js";
35
37
  import "./chunk-GJV3WDWM.js";
36
38
  import "./chunk-MP2AFCGL.js";
37
- import "./chunk-HEPR6QTL.js";
39
+ import "./chunk-AOHXREB7.js";
38
40
  import "./chunk-2I23RPSI.js";
39
- import "./chunk-ATOU6CYR.js";
41
+ import "./chunk-OLMQ4UOF.js";
40
42
  import "./chunk-PNQDP3OA.js";
41
43
  import "./chunk-H73TUI4Y.js";
42
44
  import "./chunk-7HLWBYH7.js";
43
45
  import "./chunk-FXU7JOXK.js";
44
- import "./chunk-XACL67CS.js";
45
- import "./chunk-5Z5NATNS.js";
46
- import "./chunk-7Y5UDEVM.js";
47
- import "./chunk-SHIICYJW.js";
46
+ import "./chunk-NGP6LSV2.js";
47
+ import "./chunk-PQIDGXSG.js";
48
+ import "./chunk-K7KFGDWF.js";
49
+ import "./chunk-WZHZCDDO.js";
50
+ import "./chunk-BYTDMAGB.js";
48
51
  import "./chunk-MLKGABMK.js";
49
52
  export {
53
+ VALID_SESSION_SCOPE_RE,
50
54
  allowDeadScopeRescue,
51
55
  getCurrentSessionScope,
52
56
  isAmbiguousMultiCoordinatorContext,