@askexenow/exe-os 0.9.239 → 0.9.243

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 (316) hide show
  1. package/deploy/compose/.env.customer.example +12 -0
  2. package/deploy/compose/.env.example +13 -1
  3. package/deploy/compose/cloudflared/config.yml.example +23 -4
  4. package/deploy/compose/docker-compose.yml +27 -7
  5. package/deploy/compose/generate-env.ts +49 -1
  6. package/deploy/compose/init-db.sql +10 -2
  7. package/deploy/stack-manifests/v0.9.json +113 -9
  8. package/dist/{active-agent-7MIVNARP.js → active-agent-KO4ZWDXE.js} +4 -4
  9. package/dist/{active-agent-55C5Y3XL.js → active-agent-KP2O52HA.js} +4 -4
  10. package/dist/{agentic-ontology-NCAQIQQI.js → agentic-ontology-DXE5J6I5.js} +1 -1
  11. package/dist/{backfill-metadata-3JP7EZ2U.js → backfill-metadata-DFTIGPXP.js} +7 -7
  12. package/dist/{background-jobs-RWL46VRD.js → background-jobs-CRXY7T4Y.js} +2 -2
  13. package/dist/{behaviors-6BGALYGW.js → behaviors-BL3QCHBT.js} +4 -4
  14. package/dist/bin/age-ontology-load.js +2 -2
  15. package/dist/bin/agentic-ontology-backfill.js +9 -9
  16. package/dist/bin/agentic-reflection-backfill.js +10 -10
  17. package/dist/bin/agentic-semantic-label.js +9 -9
  18. package/dist/bin/backfill-conversations.js +9 -9
  19. package/dist/bin/backfill-responses.js +9 -9
  20. package/dist/bin/backfill-vectors.js +11 -11
  21. package/dist/bin/bulk-sync-postgres.js +10 -10
  22. package/dist/bin/cc-doctor.js +3 -3
  23. package/dist/bin/cleanup-stale-review-tasks.js +13 -13
  24. package/dist/bin/cli.js +27 -22
  25. package/dist/bin/exe-agent-config.js +4 -4
  26. package/dist/bin/exe-agent.js +8 -8
  27. package/dist/bin/exe-assign.js +11 -11
  28. package/dist/bin/exe-boot.js +22 -22
  29. package/dist/bin/exe-call.js +5 -5
  30. package/dist/bin/exe-cloud.js +8 -8
  31. package/dist/bin/exe-dispatch.js +13 -13
  32. package/dist/bin/exe-doctor.js +1 -1
  33. package/dist/bin/exe-export-behaviors.js +10 -10
  34. package/dist/bin/exe-forget.js +9 -9
  35. package/dist/bin/exe-gateway.js +8 -8
  36. package/dist/bin/exe-healthcheck.js +3 -3
  37. package/dist/bin/exe-heartbeat.js +13 -13
  38. package/dist/bin/exe-kill.js +18 -18
  39. package/dist/bin/exe-launch-agent.js +22 -22
  40. package/dist/bin/exe-new-employee.js +8 -8
  41. package/dist/bin/exe-pending-messages.js +14 -14
  42. package/dist/bin/exe-pending-notifications.js +13 -13
  43. package/dist/bin/exe-pending-reviews.js +13 -13
  44. package/dist/bin/exe-rename.js +5 -5
  45. package/dist/bin/exe-review.js +17 -17
  46. package/dist/bin/exe-search.js +8 -8
  47. package/dist/bin/exe-session-cleanup.js +20 -20
  48. package/dist/bin/exe-settings.js +7 -7
  49. package/dist/bin/exe-start-codex.js +14 -14
  50. package/dist/bin/exe-start-opencode.js +11 -11
  51. package/dist/bin/exe-status.js +14 -14
  52. package/dist/bin/exe-support.js +3 -3
  53. package/dist/bin/exe-team.js +4 -4
  54. package/dist/bin/git-sweep.js +13 -13
  55. package/dist/bin/graph-backfill.js +8 -8
  56. package/dist/bin/graph-export.js +8 -8
  57. package/dist/bin/import-history.js +10 -10
  58. package/dist/bin/install.js +7 -7
  59. package/dist/bin/intercom-check.js +4 -4
  60. package/dist/bin/mcp-sessions.js +2 -2
  61. package/dist/bin/orchestration-metrics.js +5 -5
  62. package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
  63. package/dist/bin/postgres-agentic-semantic-backfill.js +3 -3
  64. package/dist/bin/scan-tasks.js +13 -13
  65. package/dist/bin/setup.js +3 -3
  66. package/dist/bin/shard-migrate.js +8 -8
  67. package/dist/bin/stack-update.js +324 -20
  68. package/dist/bin/verify-stack.js +3 -383
  69. package/dist/bin/vps-backup.js +8 -160
  70. package/dist/bin/vps-health-gate.js +10 -220
  71. package/dist/{branding-I7YYX4FM.js → branding-XWMO5EDR.js} +1 -1
  72. package/dist/{capacity-monitor-IFCZKRPG.js → capacity-monitor-4CSBC7AP.js} +14 -14
  73. package/dist/{catchup-brief-PIDRWXOW.js → catchup-brief-LF5Z6Q6E.js} +17 -17
  74. package/dist/{chunk-FGJUGDNM.js → chunk-222SI7QC.js} +14 -14
  75. package/dist/{chunk-JZMVLAZ2.js → chunk-2WBBVEIB.js} +1 -1
  76. package/dist/{chunk-JDOE33C2.js → chunk-3V53HH5T.js} +4 -4
  77. package/dist/{chunk-2KZSKURT.js → chunk-57SULZJ2.js} +3 -3
  78. package/dist/{chunk-QI4IXJN7.js → chunk-5CHYEKMH.js} +7 -4
  79. package/dist/chunk-5DMAMQNU.js +168 -0
  80. package/dist/{chunk-PLQAFB3Z.js → chunk-5JIG2FP2.js} +1 -1
  81. package/dist/{chunk-UWQ3XCDG.js → chunk-5WK7X5CF.js} +2 -2
  82. package/dist/{chunk-DDPAQ4LT.js → chunk-6JAGJN77.js} +2 -2
  83. package/dist/{chunk-7F37NMKB.js → chunk-73UE2PHT.js} +1 -1
  84. package/dist/{chunk-JL3K5OTS.js → chunk-7IZWLMTP.js} +1 -1
  85. package/dist/{chunk-ELRRL2NC.js → chunk-A4K2ZT6N.js} +4 -4
  86. package/dist/{chunk-GWYADLIW.js → chunk-AHXEU5XB.js} +1 -1
  87. package/dist/{chunk-WSHMBME6.js → chunk-AWRL5FGM.js} +19 -78
  88. package/dist/{chunk-OMPCFLWA.js → chunk-BSPOEYAO.js} +1 -1
  89. package/dist/{chunk-DHVC4RN7.js → chunk-CBDPEJOR.js} +5 -5
  90. package/dist/{chunk-2H55BIV2.js → chunk-CEJO7244.js} +2 -2
  91. package/dist/{chunk-FKWZVO2T.js → chunk-CPXGLSIL.js} +3 -3
  92. package/dist/{chunk-HX5G4AS4.js → chunk-CWITU7DW.js} +2 -2
  93. package/dist/{chunk-5GG7MTRJ.js → chunk-DGBGIXCC.js} +4 -4
  94. package/dist/{chunk-IQXPMK46.js → chunk-DLZYAYVM.js} +60 -14
  95. package/dist/{chunk-PPYWQV2M.js → chunk-DR5BGWFR.js} +2 -2
  96. package/dist/{chunk-BZWKTFEB.js → chunk-ENVRFBTB.js} +2 -2
  97. package/dist/{chunk-DUVO2PUJ.js → chunk-F3GM6OOP.js} +4 -4
  98. package/dist/{chunk-HNLPLLE6.js → chunk-F7JLZXHC.js} +60 -26
  99. package/dist/{chunk-AL4DRC5H.js → chunk-FFLILAG6.js} +1 -1
  100. package/dist/{chunk-BZNI4OK5.js → chunk-GHEWRYMY.js} +18 -2
  101. package/dist/{chunk-C7SFJO5F.js → chunk-GHT4REOS.js} +5 -5
  102. package/dist/{chunk-FBWUJEXS.js → chunk-HANG6NLF.js} +4 -6
  103. package/dist/{chunk-5NJ4A4ZA.js → chunk-HCBMPZDT.js} +1 -1
  104. package/dist/chunk-HOGTZLVU.js +244 -0
  105. package/dist/{chunk-IQSCZDBQ.js → chunk-I5PIBL56.js} +3 -3
  106. package/dist/chunk-IRHNV4GY.js +388 -0
  107. package/dist/{chunk-F4TCKCKK.js → chunk-ITZVPCBQ.js} +33 -12
  108. package/dist/{chunk-4HROS3GJ.js → chunk-IZVKWBIP.js} +1 -1
  109. package/dist/{chunk-DKI5BTBC.js → chunk-J7V7LPPX.js} +2 -2
  110. package/dist/{chunk-TOZ5NN5V.js → chunk-JLKUVK5J.js} +1 -1
  111. package/dist/{chunk-4SC65UBG.js → chunk-JLNXKG3K.js} +1 -1
  112. package/dist/{chunk-KVSQOG3W.js → chunk-K2BDE2B5.js} +4 -4
  113. package/dist/{chunk-KDJRFJDL.js → chunk-K333WOW4.js} +30 -2
  114. package/dist/{chunk-6LBCUA2A.js → chunk-KEZXW3RP.js} +1 -1
  115. package/dist/{chunk-W7G3GY4I.js → chunk-KLQI7QY4.js} +3 -3
  116. package/dist/{chunk-UODVZGBQ.js → chunk-KN7LPTIB.js} +1 -1
  117. package/dist/{chunk-ESKBZN4Q.js → chunk-L4WRH3DL.js} +1 -1
  118. package/dist/{chunk-VFQKKMKE.js → chunk-LAOB5BKV.js} +2 -2
  119. package/dist/{chunk-MAN5LZQ4.js → chunk-LQSFP2BV.js} +1 -1
  120. package/dist/{chunk-EJ7LOTV2.js → chunk-LSFHEMVI.js} +9 -9
  121. package/dist/{chunk-RA2RO27E.js → chunk-MCESA5UW.js} +2 -2
  122. package/dist/{chunk-UPMHG7ET.js → chunk-MEIHREPM.js} +1 -1
  123. package/dist/{chunk-D5C56WO3.js → chunk-MOZ2YQ54.js} +1 -1
  124. package/dist/{chunk-CLGB3FGL.js → chunk-MPX3TRMQ.js} +2 -2
  125. package/dist/{chunk-5R75ODPS.js → chunk-NBY6R37W.js} +61 -232
  126. package/dist/{chunk-RWFGXC35.js → chunk-NEYQAEYU.js} +7 -7
  127. package/dist/{chunk-MBHZDXGN.js → chunk-NL35XNLI.js} +1 -1
  128. package/dist/{chunk-TPQVLYSV.js → chunk-NLGMHPEN.js} +1 -1
  129. package/dist/{chunk-5LMH4YHG.js → chunk-NRVV4Y5V.js} +4 -4
  130. package/dist/{chunk-GN5VHPPR.js → chunk-NVZR7T4E.js} +1 -1
  131. package/dist/{chunk-Y2L7RMGH.js → chunk-NWBHL5PI.js} +1 -1
  132. package/dist/{chunk-YPYDLW75.js → chunk-OEMX65EA.js} +1 -1
  133. package/dist/{chunk-UAFUGPKO.js → chunk-ONAQAL3O.js} +1 -1
  134. package/dist/{chunk-AVM7XZE4.js → chunk-OWQ3CCYJ.js} +7 -6
  135. package/dist/{chunk-K525WLL7.js → chunk-PI6V23GF.js} +5 -4
  136. package/dist/{chunk-AURM7FOT.js → chunk-Q2OAQPWY.js} +1 -1
  137. package/dist/{chunk-FB5VRO5S.js → chunk-QLDWASTX.js} +28 -32
  138. package/dist/{chunk-EPWDTS2Q.js → chunk-QMTGMCWB.js} +1 -1
  139. package/dist/{chunk-VI2FJY2M.js → chunk-QP4FHME2.js} +2 -2
  140. package/dist/{chunk-NJWK6J4N.js → chunk-QUNKPR6Y.js} +5 -5
  141. package/dist/{chunk-O6DAF2TY.js → chunk-QUZVAHO7.js} +2 -2
  142. package/dist/{chunk-VHKL4S4T.js → chunk-RRHSONV5.js} +2 -2
  143. package/dist/{chunk-GPF6X6HE.js → chunk-RYDHEWYY.js} +2 -2
  144. package/dist/{chunk-C2YS2AA6.js → chunk-U7WOVXBB.js} +2 -2
  145. package/dist/chunk-UIRWDGMB.js +230 -0
  146. package/dist/{chunk-FE45RXGC.js → chunk-V2GZMY6O.js} +1 -1
  147. package/dist/{chunk-PATCHPNY.js → chunk-VHALWCUO.js} +1 -1
  148. package/dist/{chunk-HLZSC5WK.js → chunk-VQAP35DA.js} +20 -18
  149. package/dist/{chunk-452XB7OZ.js → chunk-VRIMTCX2.js} +1 -1
  150. package/dist/{chunk-SUNYJ6YE.js → chunk-VT2B5BHM.js} +1 -1
  151. package/dist/{chunk-UZIJDYDA.js → chunk-VWVJVQDH.js} +2 -2
  152. package/dist/{chunk-TRZ5KA2R.js → chunk-VXIMSRTO.js} +2 -2
  153. package/dist/{chunk-DAZIV4QZ.js → chunk-WCXZF42W.js} +1 -1
  154. package/dist/{chunk-6OJJF4WP.js → chunk-XJUUWHVN.js} +1 -1
  155. package/dist/{chunk-F7LU65PQ.js → chunk-Y25OJWOQ.js} +14 -2
  156. package/dist/{chunk-2ORPA23Y.js → chunk-YMXXD2GW.js} +36 -8
  157. package/dist/{chunk-5WLMF6PL.js → chunk-YMZHTTOQ.js} +1 -1
  158. package/dist/{chunk-7DIDOQCX.js → chunk-YRVW57UW.js} +139 -125
  159. package/dist/{chunk-BRFH5X7G.js → chunk-Z7VDUS6L.js} +1 -1
  160. package/dist/{chunk-YFE6W75D.js → chunk-ZKFPHJIJ.js} +1 -1
  161. package/dist/{chunk-5WUTKDH6.js → chunk-ZVXJSQOR.js} +1 -1
  162. package/dist/{co-activation-VB4CJQZB.js → co-activation-L6I2LSJO.js} +3 -3
  163. package/dist/{co-occurrence-XZQJJIBM.js → co-occurrence-QARWYUAY.js} +3 -3
  164. package/dist/{code-context-index-FCQOPUEA.js → code-context-index-UIYQRDHD.js} +4 -4
  165. package/dist/{content-extractor-SPSH5X33.js → content-extractor-EYRVGD6O.js} +2 -2
  166. package/dist/{conversation-wiki-populator-YU35LNRK.js → conversation-wiki-populator-L7O6F3BB.js} +1 -1
  167. package/dist/{crdt-sync-KXETGV45.js → crdt-sync-R6YROKDH.js} +1 -1
  168. package/dist/{crm-webhook-JMOAHTJ6.js → crm-webhook-WK3PYJJK.js} +2 -2
  169. package/dist/{cto-delegation-gate-IJ3KQIKF.js → cto-delegation-gate-5JZORQIT.js} +12 -12
  170. package/dist/{daemon-auth-2IZACWSG.js → daemon-auth-2HEOL6VG.js} +2 -2
  171. package/dist/{daemon-orchestration-ZCY4GEI3.js → daemon-orchestration-BJ3T5MMF.js} +16 -15
  172. package/dist/{db-backup-HLX5OLIV.js → db-backup-EWS52P2W.js} +2 -2
  173. package/dist/{dreaming-2CJML3TU.js → dreaming-BOSBDRI3.js} +13 -13
  174. package/dist/{entity-boost-T5IYWWDZ.js → entity-boost-6ZVX7DFB.js} +26 -2
  175. package/dist/{exe-drift-P5OIRNSH.js → exe-drift-WRE6RADZ.js} +4 -4
  176. package/dist/{exe-export-QQL2H322.js → exe-export-7N5PBCMK.js} +8 -8
  177. package/dist/{exe-import-V4RJCUEP.js → exe-import-YOOE7S3H.js} +8 -8
  178. package/dist/{exe-key-MENJGDD7.js → exe-key-GXJSTCX2.js} +4 -4
  179. package/dist/{exe-org-3FNET2J7.js → exe-org-42YMQL75.js} +2 -2
  180. package/dist/{exe-snapshot-YRARQE7F.js → exe-snapshot-ODUCFW7G.js} +18 -18
  181. package/dist/{fast-db-init-HIJWWKAO.js → fast-db-init-YSR7RMVZ.js} +1 -1
  182. package/dist/{founder-context-BQ5NBDUV.js → founder-context-Q2HUCZX4.js} +2 -2
  183. package/dist/gateway/index.js +9 -9
  184. package/dist/{gateway-client-YGSA5QMC.js → gateway-client-4QXHKN5C.js} +1 -1
  185. package/dist/{git-staleness-IHTKCUMN.js → git-staleness-BJDTCDPC.js} +3 -3
  186. package/dist/{git-task-sweep-5ZPNQS7Y.js → git-task-sweep-L3U3T5HM.js} +13 -13
  187. package/dist/{global-procedures-XHDIZRJU.js → global-procedures-HCHEHKY2.js} +4 -4
  188. package/dist/{graph-auto-extract-5TPT67GP.js → graph-auto-extract-FP5C76LS.js} +3 -3
  189. package/dist/{hook-integrity-SB53Y7UK.js → hook-integrity-2OU3T6UC.js} +1 -1
  190. package/dist/hooks/bug-report-worker.js +15 -14
  191. package/dist/hooks/codex-stop-task-finalizer.js +15 -14
  192. package/dist/hooks/commit-complete.js +16 -16
  193. package/dist/hooks/error-recall.js +10 -10
  194. package/dist/hooks/exe-heartbeat-hook.js +5 -5
  195. package/dist/hooks/ingest-worker.js +8 -8
  196. package/dist/hooks/ingest.js +13 -13
  197. package/dist/hooks/instructions-loaded.js +7 -7
  198. package/dist/hooks/manifest.json +20 -20
  199. package/dist/hooks/notification.js +6 -6
  200. package/dist/hooks/post-compact.js +15 -15
  201. package/dist/hooks/post-tool-combined.js +7 -7
  202. package/dist/hooks/pre-compact.js +20 -20
  203. package/dist/hooks/pre-tool-use.js +28 -25
  204. package/dist/hooks/prompt-submit.js +62 -31
  205. package/dist/hooks/session-end.js +26 -26
  206. package/dist/hooks/session-start.js +39 -15
  207. package/dist/hooks/stop.js +22 -22
  208. package/dist/hooks/subagent-stop.js +15 -15
  209. package/dist/hooks/summary-worker.js +32 -27
  210. package/dist/index.js +21 -21
  211. package/dist/{installer-AMZM4MLS.js → installer-AWMUCRN4.js} +7 -7
  212. package/dist/{installer-KT5FW4CN.js → installer-HB3NH6FG.js} +9 -9
  213. package/dist/{installer-HW74W3IT.js → installer-RU6EVOBL.js} +6 -6
  214. package/dist/{intercom-queue-RNM6EPGA.js → intercom-queue-A6UJEFIF.js} +1 -1
  215. package/dist/{key-backup-status-OZ2CXUDW.js → key-backup-status-4YKCV4ZV.js} +1 -1
  216. package/dist/lib/agent-config.js +2 -2
  217. package/dist/lib/cloud-sync.js +10 -8
  218. package/dist/lib/config.js +1 -1
  219. package/dist/lib/consolidation.js +8 -8
  220. package/dist/lib/database.js +3 -3
  221. package/dist/lib/db-daemon-client.js +3 -3
  222. package/dist/lib/db.js +3 -3
  223. package/dist/lib/device-registry.js +1 -1
  224. package/dist/lib/embedder.js +4 -4
  225. package/dist/lib/employee-templates.js +5 -5
  226. package/dist/lib/employees.js +3 -3
  227. package/dist/lib/exe-daemon-client.js +3 -3
  228. package/dist/lib/exe-daemon.js +105 -74
  229. package/dist/lib/hybrid-search.js +8 -8
  230. package/dist/lib/identity.js +3 -3
  231. package/dist/lib/keychain.js +1 -1
  232. package/dist/lib/license.js +2 -2
  233. package/dist/lib/messaging.js +13 -13
  234. package/dist/lib/post-tool-memory.js +3 -3
  235. package/dist/lib/reminders.js +4 -4
  236. package/dist/lib/schedules.js +8 -8
  237. package/dist/lib/session-registry.js +5 -5
  238. package/dist/lib/skill-learning.js +5 -5
  239. package/dist/lib/store.js +7 -7
  240. package/dist/lib/task-router.js +4 -4
  241. package/dist/lib/tasks.js +14 -13
  242. package/dist/lib/tmux-routing.js +12 -12
  243. package/dist/lib/token-spend.js +4 -4
  244. package/dist/lib/ws-client.js +1 -1
  245. package/dist/{license-gate-XJDIL6OZ.js → license-gate-6JQQFBHS.js} +3 -3
  246. package/dist/mcp/register-tools.js +68 -67
  247. package/dist/mcp/server.js +70 -69
  248. package/dist/mcp/tools/complete-reminder.js +5 -5
  249. package/dist/mcp/tools/create-reminder.js +5 -5
  250. package/dist/mcp/tools/create-task.js +16 -15
  251. package/dist/mcp/tools/deactivate-behavior.js +6 -6
  252. package/dist/mcp/tools/list-reminders.js +5 -5
  253. package/dist/mcp/tools/list-tasks.js +16 -15
  254. package/dist/mcp/tools/send-message.js +15 -15
  255. package/dist/mcp/tools/update-task.js +15 -14
  256. package/dist/{mcp-http-config-BXX3RZPR.js → mcp-http-config-XIJR5P2Z.js} +4 -4
  257. package/dist/{memory-cards-KRTP5GFM.js → memory-cards-H4BJJ5OK.js} +3 -3
  258. package/dist/{memory-graph-extractor-G532PUHC.js → memory-graph-extractor-SDGM3GVR.js} +4 -4
  259. package/dist/{memory-poisoning-defense-HJM3FQA3.js → memory-poisoning-defense-UVU67DGJ.js} +3 -3
  260. package/dist/{memory-queue-FTNBWLS4.js → memory-queue-FNT5WHXP.js} +2 -2
  261. package/dist/{memory-queue-client-DHSHEIHQ.js → memory-queue-client-JZCFYTWQ.js} +5 -5
  262. package/dist/{memory-reflection-RANRFUQL.js → memory-reflection-GGB5K35L.js} +3 -3
  263. package/dist/{notifications-4P2PVEOT.js → notifications-P3XQZDTH.js} +12 -12
  264. package/dist/{orchestration-events-IYTASMSN.js → orchestration-events-25WEKUKH.js} +4 -4
  265. package/dist/{orchestration-phase-SGA7PJ5G.js → orchestration-phase-C26XVKLZ.js} +2 -2
  266. package/dist/{orchestrator-VKVHZ4MV.js → orchestrator-VIXTY4E4.js} +14 -14
  267. package/dist/{pipeline-router-E4L5BDXN.js → pipeline-router-S5PE5U6B.js} +4 -4
  268. package/dist/{plan-limits-5O5QG55H.js → plan-limits-DGIVM42H.js} +5 -5
  269. package/dist/{prediction-log-OMWHW7FL.js → prediction-log-DOEOHDHS.js} +1 -1
  270. package/dist/{project-boot-WMI6CWRX.js → project-boot-4ZL2W7DN.js} +12 -2
  271. package/dist/{projection-worker-54KRNQSO.js → projection-worker-GG2W5OM3.js} +3 -3
  272. package/dist/{push-notifications-E2XXEWJZ.js → push-notifications-AMHVR6DF.js} +2 -2
  273. package/dist/{reranker-4NTUFNYT.js → reranker-UCPLQZE2.js} +2 -2
  274. package/dist/{review-polling-BFRJDLUA.js → review-polling-P2MWEXLR.js} +13 -13
  275. package/dist/runtime/index.js +15 -15
  276. package/dist/{session-events-KCZCWGE4.js → session-events-5CD66R6U.js} +13 -13
  277. package/dist/{session-kill-telemetry-TMNIDYWY.js → session-kill-telemetry-7FBHTEDN.js} +4 -4
  278. package/dist/{session-scope-DRZBQ32Y.js → session-scope-VMIPAZU7.js} +12 -12
  279. package/dist/{setup-wizard-TQKGDAHO.js → setup-wizard-BNR47URR.js} +3 -3
  280. package/dist/{shard-manager-G6MHCO7X.js → shard-manager-VGA2TYHM.js} +2 -2
  281. package/dist/{skill-refinement-Z5SWD3AM.js → skill-refinement-NRG4WWRW.js} +3 -3
  282. package/dist/stack-release-PFZI22WC.js +521 -0
  283. package/dist/{stack-update-NO5MNARG.js → stack-update-JIWJGGLX.js} +3 -3
  284. package/dist/{steward-gate-7DWYS5AT.js → steward-gate-L7DJMF4C.js} +4 -4
  285. package/dist/{task-enforcement-2VL5J6JJ.js → task-enforcement-XQL77PZH.js} +52 -12
  286. package/dist/{task-scope-YHALISIB.js → task-scope-R3XKBIHL.js} +12 -12
  287. package/dist/{tasks-crud-JXZEBZFR.js → tasks-crud-DQOG2NPG.js} +12 -12
  288. package/dist/tasks-notify-4EQYG52H.js +37 -0
  289. package/dist/{tasks-review-PGPYJQF5.js → tasks-review-XPFJ4DSJ.js} +12 -12
  290. package/dist/{telemetry-upload-H7OJNBIF.js → telemetry-upload-OT5B5HUY.js} +7 -7
  291. package/dist/{token-budget-JJ7JQIA2.js → token-budget-D2LQKCAV.js} +3 -3
  292. package/dist/{tool-capability-index-WIV4K3FB.js → tool-capability-index-FAJ5ZHDF.js} +1 -1
  293. package/dist/{tool-telemetry-W4LFCHFT.js → tool-telemetry-QIF5BCLF.js} +1 -1
  294. package/dist/tui/App.js +26 -26
  295. package/dist/{tui-data-72U6N2DC.js → tui-data-UEV2QOR3.js} +108 -12
  296. package/dist/{whatsapp-config-W63RQ3AU.js → whatsapp-config-GOSELKTE.js} +7 -0
  297. package/dist/{worker-gate-SCSN6IHI.js → worker-gate-PRCKA23W.js} +2 -2
  298. package/dist/{workflow-engine-OICYBE4F.js → workflow-engine-7X6LLH3M.js} +2 -2
  299. package/dist/{worktree-JXN4RCWC.js → worktree-RICSCT2S.js} +5 -5
  300. package/package.json +1 -1
  301. package/release-notes.json +137 -297
  302. package/stack.release.json +4 -3
  303. package/dist/preflight-EAH2MI76.js +0 -287
  304. /package/dist/{chunk-H42LEGLB.js → chunk-AQBEG33D.js} +0 -0
  305. /package/dist/{chunk-AU5426YP.js → chunk-B7JGEDVE.js} +0 -0
  306. /package/dist/{chunk-YFDDTHNM.js → chunk-JXI4XUTV.js} +0 -0
  307. /package/dist/{chunk-SNYDRHV3.js → chunk-U3DUFHOT.js} +0 -0
  308. /package/dist/{chunk-N2XUH2HQ.js → chunk-VBPC7IC7.js} +0 -0
  309. /package/dist/{chunk-HTUJBTBM.js → chunk-VUS6WXQ3.js} +0 -0
  310. /package/dist/{chunk-NOLIN2YI.js → chunk-XAYRZHLV.js} +0 -0
  311. /package/dist/{core-memory-VOBGGB2Q.js → core-memory-4KAIKQRQ.js} +0 -0
  312. /package/dist/{message-queue-client-KAJN6TIJ.js → message-queue-client-S6W5VMJV.js} +0 -0
  313. /package/dist/{oauth-server-QEXRSXEP.js → oauth-server-2ESBZB7F.js} +0 -0
  314. /package/dist/{webhook-pipe-LY4XEDL7.js → webhook-pipe-ZRUVOG5H.js} +0 -0
  315. /package/dist/{wiki-acl-M3OR547L.js → wiki-acl-MFLSS6DE.js} +0 -0
  316. /package/dist/{wiki-client-MAFYBXCQ.js → wiki-client-GBPR45BQ.js} +0 -0
@@ -0,0 +1,521 @@
1
+ #!/usr/bin/env node
2
+ import "./chunk-MLKGABMK.js";
3
+
4
+ // src/bin/stack-release.ts
5
+ import { readFileSync, writeFileSync, existsSync } from "fs";
6
+ import { execFile as execFileCb } from "child_process";
7
+ import { promisify } from "util";
8
+ import path from "path";
9
+ import { createInterface } from "readline";
10
+ var execFile = promisify(execFileCb);
11
+ function findExeOsRoot() {
12
+ let dir = path.dirname(new URL(import.meta.url).pathname);
13
+ for (let i = 0; i < 5; i++) {
14
+ const pkgPath = path.join(dir, "package.json");
15
+ if (existsSync(pkgPath)) {
16
+ try {
17
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
18
+ if (pkg.name === "@askexenow/exe-os") return dir;
19
+ } catch {
20
+ }
21
+ }
22
+ dir = path.dirname(dir);
23
+ }
24
+ return path.resolve(path.dirname(new URL(import.meta.url).pathname), "..", "..");
25
+ }
26
+ var EXE_OS_ROOT = findExeOsRoot();
27
+ var PARENT_DIR = path.dirname(EXE_OS_ROOT);
28
+ var MANIFEST_PATH = path.join(EXE_OS_ROOT, "deploy", "stack-manifests", "v0.9.json");
29
+ function resolveRepoPath(dirName) {
30
+ const direct = path.join(PARENT_DIR, dirName);
31
+ if (existsSync(direct)) return direct;
32
+ const aliases = {
33
+ "exe-crm": ["openclaw", "exe-crm"],
34
+ "exe-wiki": ["ink", "exe-wiki"]
35
+ };
36
+ const candidates = aliases[dirName];
37
+ if (candidates) {
38
+ for (const alias of candidates) {
39
+ const p = path.join(PARENT_DIR, alias);
40
+ if (existsSync(p)) return p;
41
+ }
42
+ }
43
+ return direct;
44
+ }
45
+ function buildRepoConfigs() {
46
+ return [
47
+ {
48
+ serviceKey: "exe-os",
49
+ ghRepo: "AskExe/exe-os",
50
+ localPath: EXE_OS_ROOT,
51
+ imageName: "update.askexe.com/askexe/exe-os",
52
+ releaseWorkflow: "release-stack-image.yml",
53
+ simpleTag: true,
54
+ defaultBranch: "main"
55
+ },
56
+ {
57
+ serviceKey: "gateway",
58
+ ghRepo: "AskExe/exe-gateway",
59
+ localPath: resolveRepoPath("exe-gateway"),
60
+ imageName: "update.askexe.com/askexe/exe-gateway",
61
+ releaseWorkflow: "release-image.yml",
62
+ simpleTag: true,
63
+ defaultBranch: "main"
64
+ },
65
+ {
66
+ serviceKey: "crm",
67
+ ghRepo: "AskExe/exe-crm",
68
+ localPath: resolveRepoPath("exe-crm"),
69
+ imageName: "update.askexe.com/askexe/exe-crm",
70
+ releaseWorkflow: "release-stack-image.yml",
71
+ simpleTag: true,
72
+ defaultBranch: "main"
73
+ },
74
+ {
75
+ serviceKey: "erp",
76
+ ghRepo: "AskExe/exe-erp",
77
+ localPath: resolveRepoPath("exe-erp"),
78
+ imageName: "update.askexe.com/askexe/exe-erp",
79
+ releaseWorkflow: "release-stack-image.yml",
80
+ simpleTag: true,
81
+ defaultBranch: "main"
82
+ },
83
+ {
84
+ serviceKey: "wiki",
85
+ ghRepo: "AskExe/exe-wiki",
86
+ localPath: resolveRepoPath("exe-wiki"),
87
+ imageName: "update.askexe.com/askexe/exe-wiki",
88
+ releaseWorkflow: "release-stack-image.yml",
89
+ simpleTag: true,
90
+ defaultBranch: "master"
91
+ }
92
+ ];
93
+ }
94
+ function parseReleaseArgs(argv) {
95
+ const flags = {
96
+ stack: false,
97
+ dryRun: false,
98
+ yes: false,
99
+ repos: null,
100
+ major: false,
101
+ minor: false
102
+ };
103
+ for (let i = 0; i < argv.length; i++) {
104
+ const arg = argv[i];
105
+ if (arg === "--stack") flags.stack = true;
106
+ else if (arg === "--dry-run") flags.dryRun = true;
107
+ else if (arg === "--yes" || arg === "-y") flags.yes = true;
108
+ else if (arg === "--major") flags.major = true;
109
+ else if (arg === "--minor") flags.minor = true;
110
+ else if (arg === "--repos" && argv[i + 1]) {
111
+ flags.repos = argv[++i].split(",").map((s) => s.trim()).filter(Boolean);
112
+ } else if (arg.startsWith("--repos=")) {
113
+ flags.repos = arg.slice("--repos=".length).split(",").map((s) => s.trim()).filter(Boolean);
114
+ }
115
+ }
116
+ return flags;
117
+ }
118
+ async function git(repoPath, ...args) {
119
+ const { stdout } = await execFile("git", ["-C", repoPath, ...args]);
120
+ return stdout.trim();
121
+ }
122
+ async function getLastTag(repoPath) {
123
+ try {
124
+ return await git(repoPath, "describe", "--tags", "--abbrev=0");
125
+ } catch {
126
+ return null;
127
+ }
128
+ }
129
+ async function getCommitsSinceTag(repoPath, tag) {
130
+ try {
131
+ const output = await git(repoPath, "log", `${tag}..HEAD`, "--oneline");
132
+ return output.split("\n").filter(Boolean);
133
+ } catch {
134
+ return [];
135
+ }
136
+ }
137
+ async function ghRun(args) {
138
+ const { stdout } = await execFile("gh", args);
139
+ return stdout.trim();
140
+ }
141
+ function bumpVersion(version, mode) {
142
+ const parts = version.split(".").map(Number);
143
+ if (parts.length < 3) throw new Error(`Invalid version: ${version}`);
144
+ const [major, minor, patch] = parts;
145
+ switch (mode) {
146
+ case "major":
147
+ return `${major + 1}.0.0`;
148
+ case "minor":
149
+ return `${major}.${minor + 1}.0`;
150
+ case "patch":
151
+ default:
152
+ return `${major}.${minor}.${patch + 1}`;
153
+ }
154
+ }
155
+ function readPackageVersion(repoPath) {
156
+ const pkgPath = path.join(repoPath, "package.json");
157
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
158
+ return pkg.version;
159
+ }
160
+ function readStackReleaseJson(repoPath) {
161
+ const p = path.join(repoPath, "stack.release.json");
162
+ if (!existsSync(p)) return null;
163
+ return JSON.parse(readFileSync(p, "utf8"));
164
+ }
165
+ async function detectChanges(repos) {
166
+ const changes = [];
167
+ for (const repo of repos) {
168
+ if (!existsSync(repo.localPath)) {
169
+ log("warn", `Repo not found: ${repo.localPath} \u2014 skipping ${repo.serviceKey}`);
170
+ continue;
171
+ }
172
+ const lastTag = await getLastTag(repo.localPath);
173
+ if (!lastTag) {
174
+ log("warn", `No tags found in ${repo.serviceKey} \u2014 skipping`);
175
+ continue;
176
+ }
177
+ const commits = await getCommitsSinceTag(repo.localPath, lastTag);
178
+ if (commits.length === 0) {
179
+ log("info", `${repo.serviceKey}: no changes since ${lastTag}`);
180
+ continue;
181
+ }
182
+ const currentVersion = readPackageVersion(repo.localPath);
183
+ changes.push({
184
+ repo,
185
+ currentVersion,
186
+ newVersion: "",
187
+ // filled in step 2
188
+ commits,
189
+ tag: ""
190
+ // filled in step 2
191
+ });
192
+ }
193
+ return changes;
194
+ }
195
+ async function bumpVersions(changes, mode, dryRun) {
196
+ for (const change of changes) {
197
+ const newVersion = bumpVersion(change.currentVersion, mode);
198
+ change.newVersion = newVersion;
199
+ change.tag = `v${newVersion}`;
200
+ if (dryRun) {
201
+ log("dry", `${change.repo.serviceKey}: ${change.currentVersion} -> ${newVersion}`);
202
+ continue;
203
+ }
204
+ const pkgPath = path.join(change.repo.localPath, "package.json");
205
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
206
+ pkg.version = newVersion;
207
+ writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
208
+ const srf = readStackReleaseJson(change.repo.localPath);
209
+ if (srf) {
210
+ srf.version = newVersion;
211
+ srf.sourceVersion = newVersion;
212
+ if (typeof srf.image === "string") {
213
+ const imageBase = srf.image.replace(/:v[^:]+$/, "");
214
+ srf.image = `${imageBase}:v${newVersion}`;
215
+ }
216
+ if (srf.components && typeof srf.components === "object") {
217
+ const components = srf.components;
218
+ for (const key of Object.keys(components)) {
219
+ const base = components[key].replace(/:v[^:]+$/, "");
220
+ components[key] = `${base}:v${newVersion}`;
221
+ }
222
+ }
223
+ writeFileSync(
224
+ path.join(change.repo.localPath, "stack.release.json"),
225
+ JSON.stringify(srf, null, 2) + "\n"
226
+ );
227
+ }
228
+ await git(change.repo.localPath, "add", "package.json", "stack.release.json");
229
+ await git(change.repo.localPath, "commit", "-m", `chore: bump v${newVersion} for stack release`);
230
+ await git(change.repo.localPath, "push", "origin", change.repo.defaultBranch);
231
+ log("ok", `${change.repo.serviceKey}: bumped ${change.currentVersion} -> ${newVersion}`);
232
+ }
233
+ }
234
+ async function tagAndTriggerCI(changes, dryRun) {
235
+ for (const change of changes) {
236
+ if (dryRun) {
237
+ log("dry", `Would tag ${change.repo.serviceKey} ${change.tag}`);
238
+ continue;
239
+ }
240
+ await git(change.repo.localPath, "tag", change.tag);
241
+ await git(change.repo.localPath, "push", "origin", change.tag);
242
+ log("ok", `Tagged ${change.repo.serviceKey} ${change.tag} \u2014 CI triggered`);
243
+ }
244
+ }
245
+ async function waitForCI(changes, dryRun) {
246
+ if (dryRun) {
247
+ return changes.map((c) => ({
248
+ repo: c.repo,
249
+ tag: c.tag,
250
+ status: "completed",
251
+ conclusion: "success"
252
+ }));
253
+ }
254
+ const TIMEOUT_MS = 15 * 60 * 1e3;
255
+ const POLL_INTERVAL_MS = 30 * 1e3;
256
+ const startTime = Date.now();
257
+ const statuses = changes.map((c) => ({
258
+ repo: c.repo,
259
+ tag: c.tag,
260
+ status: "in_progress"
261
+ }));
262
+ log("info", `Waiting for ${changes.length} CI build(s)... (timeout: 15m)`);
263
+ while (Date.now() - startTime < TIMEOUT_MS) {
264
+ const pending = statuses.filter((s) => s.status === "in_progress");
265
+ if (pending.length === 0) break;
266
+ for (const st of pending) {
267
+ try {
268
+ const output = await ghRun([
269
+ "run",
270
+ "list",
271
+ "--repo",
272
+ st.repo.ghRepo,
273
+ "--workflow",
274
+ st.repo.releaseWorkflow,
275
+ "--limit",
276
+ "1",
277
+ "--json",
278
+ "status,conclusion,url"
279
+ ]);
280
+ const runs = JSON.parse(output);
281
+ const latest = runs[0];
282
+ if (!latest) continue;
283
+ if (latest.status === "completed") {
284
+ st.status = "completed";
285
+ st.conclusion = latest.conclusion ?? "unknown";
286
+ st.url = latest.url;
287
+ if (st.conclusion === "success") {
288
+ log("ok", `CI passed: ${st.repo.serviceKey} ${st.tag}`);
289
+ } else {
290
+ log("fail", `CI failed: ${st.repo.serviceKey} ${st.tag} (${st.conclusion}) \u2014 ${st.url}`);
291
+ }
292
+ }
293
+ } catch (err) {
294
+ log("warn", `Failed to check CI for ${st.repo.serviceKey}: ${err instanceof Error ? err.message : String(err)}`);
295
+ }
296
+ }
297
+ const stillPending = statuses.filter((s) => s.status === "in_progress");
298
+ if (stillPending.length === 0) break;
299
+ log("info", `${stillPending.length} CI build(s) still running... (${Math.round((Date.now() - startTime) / 1e3)}s elapsed)`);
300
+ await sleep(POLL_INTERVAL_MS);
301
+ }
302
+ for (const st of statuses) {
303
+ if (st.status === "in_progress") {
304
+ st.status = "timed_out";
305
+ log("fail", `CI timed out: ${st.repo.serviceKey} ${st.tag}`);
306
+ }
307
+ }
308
+ return statuses;
309
+ }
310
+ function updateStackManifest(changes, ciStatuses, dryRun) {
311
+ const manifest = JSON.parse(readFileSync(MANIFEST_PATH, "utf8"));
312
+ const currentLatest = manifest.latest;
313
+ const currentParts = currentLatest.split(".").map(Number);
314
+ const newStackVersion = `${currentParts[0]}.${currentParts[1]}.${(currentParts[2] ?? 0) + 1}`;
315
+ const baseEntry = manifest.stacks[currentLatest];
316
+ const baseServices = baseEntry?.services ?? {};
317
+ const services = {};
318
+ for (const [key, svc] of Object.entries(baseServices)) {
319
+ services[key] = { ...svc };
320
+ }
321
+ const successfulChanges = [];
322
+ for (const change of changes) {
323
+ const ciStatus = ciStatuses.find((s) => s.repo.serviceKey === change.repo.serviceKey);
324
+ if (ciStatus && ciStatus.status === "completed" && ciStatus.conclusion === "success") {
325
+ successfulChanges.push(change);
326
+ const svc = services[change.repo.serviceKey];
327
+ if (svc) {
328
+ svc.image = `${change.repo.imageName}:v${change.newVersion}`;
329
+ }
330
+ }
331
+ }
332
+ if (successfulChanges.length === 0 && !dryRun) {
333
+ log("warn", "No successful CI builds \u2014 manifest not updated");
334
+ return currentLatest;
335
+ }
336
+ const notesParts = [];
337
+ for (const change of successfulChanges) {
338
+ const summaries = change.commits.slice(0, 5).map((c) => {
339
+ const msg = c.replace(/^[a-f0-9]+ /, "");
340
+ return msg;
341
+ });
342
+ notesParts.push(`${change.repo.serviceKey} v${change.newVersion}: ${summaries.join("; ")}`);
343
+ }
344
+ const notes = notesParts.join(". ");
345
+ const exeOsVersion = readPackageVersion(EXE_OS_ROOT);
346
+ const newEntry = {
347
+ version: newStackVersion,
348
+ releasedAt: (/* @__PURE__ */ new Date()).toISOString().replace(/T.*/, "T00:00:00Z"),
349
+ notes,
350
+ npmVersion: exeOsVersion,
351
+ breakingChanges: [],
352
+ services
353
+ };
354
+ if (dryRun) {
355
+ log("dry", `Would create stack ${newStackVersion} in manifest`);
356
+ log("dry", `Notes: ${notes}`);
357
+ return newStackVersion;
358
+ }
359
+ manifest.latest = newStackVersion;
360
+ manifest.stacks[newStackVersion] = newEntry;
361
+ writeFileSync(MANIFEST_PATH, JSON.stringify(manifest, null, 2) + "\n");
362
+ log("ok", `Stack manifest updated: ${currentLatest} -> ${newStackVersion}`);
363
+ return newStackVersion;
364
+ }
365
+ async function commitAndTagExeOs(newStackVersion, _exeOsChange, dryRun) {
366
+ if (dryRun) {
367
+ log("dry", `Would commit manifest + tag exe-os stack-v${newStackVersion}`);
368
+ return;
369
+ }
370
+ const status = await git(EXE_OS_ROOT, "status", "--porcelain", "deploy/stack-manifests/v0.9.json");
371
+ if (status) {
372
+ await git(EXE_OS_ROOT, "add", "deploy/stack-manifests/v0.9.json");
373
+ const commitMsg = `chore: stack release v${newStackVersion}`;
374
+ await git(EXE_OS_ROOT, "commit", "-m", commitMsg);
375
+ await git(EXE_OS_ROOT, "push", "origin", "main");
376
+ log("ok", `Committed stack manifest v${newStackVersion}`);
377
+ }
378
+ const stackTag = `stack-v${newStackVersion}`;
379
+ try {
380
+ await git(EXE_OS_ROOT, "tag", stackTag);
381
+ await git(EXE_OS_ROOT, "push", "origin", stackTag);
382
+ log("ok", `Tagged exe-os ${stackTag}`);
383
+ } catch (err) {
384
+ log("warn", `Failed to tag exe-os ${stackTag}: ${err instanceof Error ? err.message : String(err)}`);
385
+ }
386
+ }
387
+ function printSummary(changes, ciStatuses, newStackVersion, dryRun) {
388
+ const divider = "\u2500".repeat(70);
389
+ console.log(`
390
+ ${divider}`);
391
+ console.log(` ${dryRun ? "[DRY RUN] " : ""}Stack Release Summary \u2014 v${newStackVersion}`);
392
+ console.log(divider);
393
+ console.log(
394
+ ` ${"Service".padEnd(14)} ${"Version".padEnd(20)} ${"Commits".padEnd(8)} ${"CI".padEnd(12)}`
395
+ );
396
+ console.log(` ${"\u2500".repeat(14)} ${"\u2500".repeat(20)} ${"\u2500".repeat(8)} ${"\u2500".repeat(12)}`);
397
+ for (const change of changes) {
398
+ const ci = ciStatuses.find((s) => s.repo.serviceKey === change.repo.serviceKey);
399
+ const ciLabel = dryRun ? "\x1B[33mpending\x1B[0m" : ci?.status === "completed" && ci.conclusion === "success" ? "\x1B[32msuccess\x1B[0m" : ci?.status === "timed_out" ? "\x1B[31mtimed out\x1B[0m" : `\x1B[31m${ci?.conclusion ?? ci?.status ?? "unknown"}\x1B[0m`;
400
+ const versionStr = `${change.currentVersion} -> ${change.newVersion}`;
401
+ console.log(
402
+ ` ${change.repo.serviceKey.padEnd(14)} ${versionStr.padEnd(20)} ${String(change.commits.length).padEnd(8)} ${ciLabel}`
403
+ );
404
+ }
405
+ if (changes.length === 0) {
406
+ console.log(" No changes detected across any repo.");
407
+ }
408
+ console.log(divider);
409
+ if (!dryRun) {
410
+ const failed = ciStatuses.filter(
411
+ (s) => s.status !== "completed" || s.conclusion !== "success"
412
+ );
413
+ if (failed.length > 0) {
414
+ console.log("\n \x1B[31mWarning:\x1B[0m Some CI builds failed. Check the links above.");
415
+ } else if (changes.length > 0) {
416
+ console.log(
417
+ `
418
+ \x1B[32mAll done.\x1B[0m Customers will pull new images from update.askexe.com on next stack-update.`
419
+ );
420
+ }
421
+ }
422
+ console.log("");
423
+ }
424
+ function log(level, msg) {
425
+ const prefix = {
426
+ info: "\x1B[36m[info]\x1B[0m",
427
+ ok: "\x1B[32m[ok]\x1B[0m",
428
+ warn: "\x1B[33m[warn]\x1B[0m",
429
+ fail: "\x1B[31m[fail]\x1B[0m",
430
+ dry: "\x1B[35m[dry-run]\x1B[0m"
431
+ };
432
+ console.log(` ${prefix[level]} ${msg}`);
433
+ }
434
+ function sleep(ms) {
435
+ return new Promise((resolve) => setTimeout(resolve, ms));
436
+ }
437
+ async function confirm(message) {
438
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
439
+ return new Promise((resolve) => {
440
+ rl.question(`
441
+ ${message} [y/N] `, (answer) => {
442
+ rl.close();
443
+ resolve(answer.trim().toLowerCase() === "y" || answer.trim().toLowerCase() === "yes");
444
+ });
445
+ });
446
+ }
447
+ async function runStackRelease(flags) {
448
+ if (!flags.stack) {
449
+ console.error("Usage: exe-os release --stack [--dry-run] [--repos <list>] [--yes]");
450
+ process.exit(1);
451
+ }
452
+ console.log(`
453
+ \x1B[1mexe-os stack release\x1B[0m${flags.dryRun ? " (dry run)" : ""}
454
+ `);
455
+ const allRepos = buildRepoConfigs();
456
+ let repos;
457
+ if (flags.repos) {
458
+ repos = [];
459
+ for (const name of flags.repos) {
460
+ const match = allRepos.find(
461
+ (r) => r.serviceKey === name || r.ghRepo.endsWith(`/${name}`) || r.ghRepo === name
462
+ );
463
+ if (match) {
464
+ repos.push(match);
465
+ } else {
466
+ log("warn", `Unknown repo: ${name} \u2014 skipping`);
467
+ }
468
+ }
469
+ if (repos.length === 0) {
470
+ console.error("No valid repos specified.");
471
+ process.exit(1);
472
+ }
473
+ } else {
474
+ repos = allRepos;
475
+ }
476
+ for (const repo of repos) {
477
+ if (!existsSync(repo.localPath)) {
478
+ log("fail", `Repo not found: ${repo.localPath} (${repo.serviceKey})`);
479
+ log("info", `Expected sibling directory of exe-os. Verify the directory exists.`);
480
+ process.exit(1);
481
+ }
482
+ }
483
+ log("info", "Detecting changes across repos...");
484
+ const changes = await detectChanges(repos);
485
+ if (changes.length === 0) {
486
+ console.log("\n No changes detected since last tags. Nothing to release.\n");
487
+ return;
488
+ }
489
+ const bumpMode = flags.major ? "major" : flags.minor ? "minor" : "patch";
490
+ for (const change of changes) {
491
+ const newVersion = bumpVersion(change.currentVersion, bumpMode);
492
+ change.newVersion = newVersion;
493
+ change.tag = `v${newVersion}`;
494
+ }
495
+ console.log("\n Planned releases:");
496
+ for (const change of changes) {
497
+ console.log(
498
+ ` ${change.repo.serviceKey.padEnd(14)} ${change.currentVersion} -> ${change.newVersion} (${change.commits.length} commit${change.commits.length === 1 ? "" : "s"})`
499
+ );
500
+ }
501
+ if (!flags.yes && !flags.dryRun) {
502
+ const ok = await confirm("Proceed with release?");
503
+ if (!ok) {
504
+ console.log(" Aborted.\n");
505
+ return;
506
+ }
507
+ }
508
+ await bumpVersions(changes, bumpMode, flags.dryRun);
509
+ log("info", "Tagging repos and triggering CI...");
510
+ await tagAndTriggerCI(changes, flags.dryRun);
511
+ const ciStatuses = await waitForCI(changes, flags.dryRun);
512
+ log("info", "Updating stack manifest...");
513
+ const newStackVersion = updateStackManifest(changes, ciStatuses, flags.dryRun);
514
+ const exeOsChange = changes.find((c) => c.repo.serviceKey === "exe-os");
515
+ await commitAndTagExeOs(newStackVersion, exeOsChange, flags.dryRun);
516
+ printSummary(changes, ciStatuses, newStackVersion, flags.dryRun);
517
+ }
518
+ export {
519
+ parseReleaseArgs,
520
+ runStackRelease
521
+ };
@@ -20,9 +20,9 @@ import {
20
20
  runStackUpdate,
21
21
  verifyReleaseHealth,
22
22
  verifyStackManifestSignature
23
- } from "./chunk-F4TCKCKK.js";
24
- import "./chunk-D5C56WO3.js";
25
- import "./chunk-TRZ5KA2R.js";
23
+ } from "./chunk-ITZVPCBQ.js";
24
+ import "./chunk-MOZ2YQ54.js";
25
+ import "./chunk-VXIMSRTO.js";
26
26
  import "./chunk-LYH5HE24.js";
27
27
  import "./chunk-MLKGABMK.js";
28
28
  export {
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  StewardGate
3
- } from "./chunk-AL4DRC5H.js";
4
- import "./chunk-2H55BIV2.js";
5
- import "./chunk-WSHMBME6.js";
3
+ } from "./chunk-FFLILAG6.js";
4
+ import "./chunk-CEJO7244.js";
5
+ import "./chunk-AWRL5FGM.js";
6
6
  import "./chunk-FXU7JOXK.js";
7
- import "./chunk-TRZ5KA2R.js";
7
+ import "./chunk-VXIMSRTO.js";
8
8
  import "./chunk-LYH5HE24.js";
9
9
  import "./chunk-MLKGABMK.js";
10
10
  export {
@@ -1,31 +1,31 @@
1
1
  import {
2
2
  sendIntercom,
3
3
  updateTaskStatus
4
- } from "./chunk-HNLPLLE6.js";
5
- import "./chunk-YFE6W75D.js";
6
- import "./chunk-QI4IXJN7.js";
4
+ } from "./chunk-F7JLZXHC.js";
5
+ import "./chunk-ZKFPHJIJ.js";
6
+ import "./chunk-5CHYEKMH.js";
7
7
  import "./chunk-4JERP7NT.js";
8
- import "./chunk-BZNI4OK5.js";
8
+ import "./chunk-GHEWRYMY.js";
9
9
  import "./chunk-MVW62NIZ.js";
10
10
  import "./chunk-OYNKIAVW.js";
11
11
  import "./chunk-CX6GL3ZJ.js";
12
12
  import {
13
13
  recordOrchestrationEventBestEffort
14
- } from "./chunk-5NJ4A4ZA.js";
15
- import "./chunk-6OJJF4WP.js";
14
+ } from "./chunk-HCBMPZDT.js";
15
+ import "./chunk-XJUUWHVN.js";
16
16
  import "./chunk-NGP6LSV2.js";
17
- import "./chunk-IQSCZDBQ.js";
17
+ import "./chunk-I5PIBL56.js";
18
18
  import "./chunk-CVYC6DUW.js";
19
19
  import "./chunk-OPU3NYOO.js";
20
20
  import "./chunk-GJV3WDWM.js";
21
21
  import "./chunk-MP2AFCGL.js";
22
- import "./chunk-4SC65UBG.js";
22
+ import "./chunk-JLNXKG3K.js";
23
23
  import "./chunk-HYZV25LY.js";
24
- import "./chunk-2H55BIV2.js";
25
- import "./chunk-WSHMBME6.js";
24
+ import "./chunk-CEJO7244.js";
25
+ import "./chunk-AWRL5FGM.js";
26
26
  import "./chunk-FXU7JOXK.js";
27
- import "./chunk-D5C56WO3.js";
28
- import "./chunk-TRZ5KA2R.js";
27
+ import "./chunk-MOZ2YQ54.js";
28
+ import "./chunk-VXIMSRTO.js";
29
29
  import "./chunk-LYH5HE24.js";
30
30
  import "./chunk-MLKGABMK.js";
31
31
 
@@ -267,6 +267,46 @@ async function runTaskEnforcementTick(deps) {
267
267
  } catch {
268
268
  }
269
269
  }
270
+ if (processedAnyEmployee && deps.reviewerSpawn) {
271
+ try {
272
+ const reviewerRows = await client.execute({
273
+ sql: `SELECT DISTINCT reviewer, session_scope FROM tasks
274
+ WHERE status = 'needs_review'
275
+ AND reviewer IS NOT NULL
276
+ AND reviewer != ''${scopeFilter.sql}`,
277
+ args: [...scopeFilter.args]
278
+ });
279
+ const liveSessionSet = new Set(sessions);
280
+ for (const row of reviewerRows.rows) {
281
+ const reviewerName = String(row.reviewer ?? "");
282
+ const sessionScope = row.session_scope ? String(row.session_scope) : null;
283
+ if (!reviewerName || !sessionScope) continue;
284
+ const reviewerSession = `${reviewerName}-${sessionScope}`;
285
+ if (liveSessionSet.has(reviewerSession)) continue;
286
+ try {
287
+ const result = deps.reviewerSpawn(reviewerName, sessionScope);
288
+ if (!result) continue;
289
+ if (result.status === "spawned") {
290
+ process.stderr.write(
291
+ `[exed] Reviewer auto-spawn: spawned ${reviewerName} in ${sessionScope} (has needs_review tasks)
292
+ `
293
+ );
294
+ } else if (result.status === "failed") {
295
+ process.stderr.write(
296
+ `[exed] Reviewer auto-spawn: failed to spawn ${reviewerName} in ${sessionScope}: ${result.error ?? "unknown"}
297
+ `
298
+ );
299
+ }
300
+ } catch (spawnErr) {
301
+ process.stderr.write(
302
+ `[exed] Reviewer auto-spawn error for ${reviewerName}: ${spawnErr instanceof Error ? spawnErr.message : String(spawnErr)}
303
+ `
304
+ );
305
+ }
306
+ }
307
+ } catch {
308
+ }
309
+ }
270
310
  recordOrchestrationEventBestEffort({
271
311
  eventType: "daemon.tick.completed",
272
312
  source: "task-enforcement.runTaskEnforcementTick",
@@ -2,29 +2,29 @@ import {
2
2
  getCurrentSessionScope,
3
3
  sessionScopeFilter,
4
4
  strictSessionScopeFilter
5
- } from "./chunk-HNLPLLE6.js";
6
- import "./chunk-YFE6W75D.js";
7
- import "./chunk-QI4IXJN7.js";
5
+ } from "./chunk-F7JLZXHC.js";
6
+ import "./chunk-ZKFPHJIJ.js";
7
+ import "./chunk-5CHYEKMH.js";
8
8
  import "./chunk-4JERP7NT.js";
9
- import "./chunk-BZNI4OK5.js";
9
+ import "./chunk-GHEWRYMY.js";
10
10
  import "./chunk-MVW62NIZ.js";
11
11
  import "./chunk-OYNKIAVW.js";
12
12
  import "./chunk-CX6GL3ZJ.js";
13
- import "./chunk-5NJ4A4ZA.js";
14
- import "./chunk-6OJJF4WP.js";
13
+ import "./chunk-HCBMPZDT.js";
14
+ import "./chunk-XJUUWHVN.js";
15
15
  import "./chunk-NGP6LSV2.js";
16
- import "./chunk-IQSCZDBQ.js";
16
+ import "./chunk-I5PIBL56.js";
17
17
  import "./chunk-CVYC6DUW.js";
18
18
  import "./chunk-OPU3NYOO.js";
19
19
  import "./chunk-GJV3WDWM.js";
20
20
  import "./chunk-MP2AFCGL.js";
21
- import "./chunk-4SC65UBG.js";
21
+ import "./chunk-JLNXKG3K.js";
22
22
  import "./chunk-HYZV25LY.js";
23
- import "./chunk-2H55BIV2.js";
24
- import "./chunk-WSHMBME6.js";
23
+ import "./chunk-CEJO7244.js";
24
+ import "./chunk-AWRL5FGM.js";
25
25
  import "./chunk-FXU7JOXK.js";
26
- import "./chunk-D5C56WO3.js";
27
- import "./chunk-TRZ5KA2R.js";
26
+ import "./chunk-MOZ2YQ54.js";
27
+ import "./chunk-VXIMSRTO.js";
28
28
  import "./chunk-LYH5HE24.js";
29
29
  import "./chunk-MLKGABMK.js";
30
30
  export {