@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
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isCrdtSyncEnabled
3
- } from "./chunk-YFDDTHNM.js";
3
+ } from "./chunk-JXI4XUTV.js";
4
4
  import {
5
5
  decryptSyncBlob,
6
6
  encryptSyncBlob,
@@ -12,13 +12,13 @@ import {
12
12
  loadEmployees,
13
13
  registerBinSymlinks,
14
14
  saveEmployees
15
- } from "./chunk-2H55BIV2.js";
15
+ } from "./chunk-CEJO7244.js";
16
16
  import {
17
17
  loadDeviceId
18
- } from "./chunk-D5C56WO3.js";
18
+ } from "./chunk-MOZ2YQ54.js";
19
19
  import {
20
20
  EXE_AI_DIR
21
- } from "./chunk-TRZ5KA2R.js";
21
+ } from "./chunk-VXIMSRTO.js";
22
22
  import {
23
23
  atomicWriteJsonSync,
24
24
  atomicWriteSync,
@@ -70,6 +70,21 @@ var FETCH_TIMEOUT_MS = 3e4;
70
70
  var PUSH_BATCH_SIZE = 5e3;
71
71
  var ROSTER_LOCK_PATH = path.join(EXE_AI_DIR, "roster-merge.lock");
72
72
  var LOCK_STALE_MS = 3e4;
73
+ var _daemonCrdtSkipLogged = false;
74
+ function shouldUseCrdtMergeForCloudSync() {
75
+ if (!isCrdtSyncEnabled()) return false;
76
+ if (process.env.EXE_IS_DAEMON === "1" && process.env.EXE_DAEMON_CRDT_SYNC !== "1") {
77
+ return false;
78
+ }
79
+ return true;
80
+ }
81
+ function logDaemonCrdtSkipOnce() {
82
+ if (_daemonCrdtSkipLogged) return;
83
+ _daemonCrdtSkipLogged = true;
84
+ process.stderr.write(
85
+ "[cloud-sync] CRDT merge disabled inside daemon; using bounded SQL upsert path. Set EXE_DAEMON_CRDT_SYNC=1 only for diagnostics.\n"
86
+ );
87
+ }
73
88
  var SYNC_COOLDOWN_MS = 1e4;
74
89
  var _lastSyncPushVersion = -1;
75
90
  var _lastSyncPushTimestamp = 0;
@@ -505,8 +520,8 @@ async function cloudSync(config) {
505
520
  const pullResult = await cloudPull(lastPullVersion, config);
506
521
  let pulled = 0;
507
522
  if (pullResult.records.length > 0) {
508
- if (isCrdtSyncEnabled()) {
509
- const { initCrdtDoc, importExistingMemories, readAllMemories } = await import("./crdt-sync-KXETGV45.js");
523
+ if (shouldUseCrdtMergeForCloudSync()) {
524
+ const { initCrdtDoc, importExistingMemories, readAllMemories } = await import("./crdt-sync-R6YROKDH.js");
510
525
  initCrdtDoc();
511
526
  importExistingMemories(
512
527
  pullResult.records.map((rec) => ({
@@ -571,6 +586,9 @@ async function cloudSync(config) {
571
586
  if (stmts.length > 0) await client.batch(stmts, "write");
572
587
  pulled = pullResult.records.length;
573
588
  } else {
589
+ if (process.env.EXE_IS_DAEMON === "1" && isCrdtSyncEnabled()) {
590
+ logDaemonCrdtSkipOnce();
591
+ }
574
592
  try {
575
593
  const incomingIds = pullResult.records.map((r) => sqlSafe(r.id));
576
594
  if (incomingIds.length > 0) {
@@ -935,7 +953,7 @@ async function cloudSync(config) {
935
953
  }
936
954
  const totalMemories = await countRows("SELECT COUNT(*) as cnt FROM memories WHERE status = 'active' OR status IS NULL");
937
955
  try {
938
- const { getLatestBackup } = await import("./db-backup-HLX5OLIV.js");
956
+ const { getLatestBackup } = await import("./db-backup-EWS52P2W.js");
939
957
  const latestBackup = getLatestBackup();
940
958
  if (latestBackup) {
941
959
  const backupSize = statSync(latestBackup).size;
@@ -1577,34 +1595,11 @@ async function cloudPullTasks(config) {
1577
1595
  if (!remoteTasks || remoteTasks.length === 0) return { pulled: 0 };
1578
1596
  const client = getClient();
1579
1597
  const stmts = remoteTasks.map((t) => ({
1580
- sql: `INSERT INTO tasks
1598
+ sql: `INSERT OR IGNORE INTO tasks
1581
1599
  (id, title, assigned_to, assigned_by, project_name, priority, status, task_file, created_at, updated_at,
1582
1600
  blocked_by, parent_task_id, budget_tokens, budget_fallback_model, tokens_used, tokens_warned_at,
1583
1601
  reviewer, context, complexity, session_scope, spawn_runtime, spawn_model, result)
1584
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1585
- ON CONFLICT(id) DO UPDATE SET
1586
- title = excluded.title,
1587
- assigned_to = excluded.assigned_to,
1588
- assigned_by = excluded.assigned_by,
1589
- project_name = excluded.project_name,
1590
- priority = excluded.priority,
1591
- status = excluded.status,
1592
- task_file = excluded.task_file,
1593
- updated_at = excluded.updated_at,
1594
- blocked_by = excluded.blocked_by,
1595
- parent_task_id = excluded.parent_task_id,
1596
- budget_tokens = excluded.budget_tokens,
1597
- budget_fallback_model = excluded.budget_fallback_model,
1598
- tokens_used = excluded.tokens_used,
1599
- tokens_warned_at = excluded.tokens_warned_at,
1600
- reviewer = excluded.reviewer,
1601
- context = excluded.context,
1602
- complexity = excluded.complexity,
1603
- session_scope = excluded.session_scope,
1604
- spawn_runtime = excluded.spawn_runtime,
1605
- spawn_model = excluded.spawn_model,
1606
- result = excluded.result
1607
- WHERE COALESCE(excluded.updated_at, '') > COALESCE(tasks.updated_at, '')`,
1602
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
1608
1603
  args: [
1609
1604
  sqlSafe(t.id),
1610
1605
  sqlSafe(t.title),
@@ -2045,6 +2040,7 @@ async function cloudPullCoreMemory(config) {
2045
2040
  }
2046
2041
 
2047
2042
  export {
2043
+ shouldUseCrdtMergeForCloudSync,
2048
2044
  loadPgClient,
2049
2045
  disposeCloudSync,
2050
2046
  pushToPostgres,
@@ -2,7 +2,7 @@ import {
2
2
  connectEmbedDaemon,
3
3
  disconnectClient,
4
4
  embedViaClient
5
- } from "./chunk-VHKL4S4T.js";
5
+ } from "./chunk-RRHSONV5.js";
6
6
  import {
7
7
  EMBEDDING_DIM
8
8
  } from "./chunk-FXU7JOXK.js";
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  loadLicense,
3
3
  readCachedLicenseToken
4
- } from "./chunk-D5C56WO3.js";
4
+ } from "./chunk-MOZ2YQ54.js";
5
5
  import {
6
6
  EXE_AI_DIR,
7
7
  loadConfig
8
- } from "./chunk-TRZ5KA2R.js";
8
+ } from "./chunk-VXIMSRTO.js";
9
9
 
10
10
  // src/bin/exe-support.ts
11
11
  import { mkdirSync, readFileSync, unlinkSync, writeFileSync } from "fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MultiAgentOrchestrator
3
- } from "./chunk-FKWZVO2T.js";
3
+ } from "./chunk-CPXGLSIL.js";
4
4
  import {
5
5
  createQuietRenderer,
6
6
  createTerminalRenderer,
@@ -206,7 +206,7 @@ function createExeOSHooks(config) {
206
206
  );
207
207
  }
208
208
  try {
209
- const { listBehaviors } = await import("./behaviors-6BGALYGW.js");
209
+ const { listBehaviors } = await import("./behaviors-BL3QCHBT.js");
210
210
  const behaviors = await listBehaviors(config.agentId, config.projectName, 12);
211
211
  if (behaviors.length > 0) {
212
212
  process.stderr.write(
@@ -244,7 +244,7 @@ function createExeOSHooks(config) {
244
244
  const ALLOWED_RE = /^(Bash|Edit|Write|Read|Glob|Grep|Agent|mcp__.*)$/;
245
245
  if (!ALLOWED_RE.test(toolName)) return;
246
246
  try {
247
- const { extractSemanticText } = await import("./content-extractor-SPSH5X33.js");
247
+ const { extractSemanticText } = await import("./content-extractor-EYRVGD6O.js");
248
248
  const { writeMemory } = await import("./lib/store.js");
249
249
  const toolInput = block.input ?? {};
250
250
  const toolResponse = result.isError ? { error: result.content } : { output: result.content };
@@ -327,7 +327,7 @@ function createExeOSHooks(config) {
327
327
  async onSubagentStop(_reason) {
328
328
  try {
329
329
  const { getClient } = await import("./lib/database.js");
330
- const { sessionScopeFilter } = await import("./task-scope-YHALISIB.js");
330
+ const { sessionScopeFilter } = await import("./task-scope-R3XKBIHL.js");
331
331
  const client = getClient();
332
332
  const ehScope = sessionScopeFilter();
333
333
  const tasks = await client.execute({
@@ -419,7 +419,7 @@ function createExeOSHooks(config) {
419
419
  try {
420
420
  const { writeMemory, flushBatch } = await import("./lib/store.js");
421
421
  const { getClient } = await import("./lib/database.js");
422
- const { sessionScopeFilter: cpScopeFilter } = await import("./task-scope-YHALISIB.js");
422
+ const { sessionScopeFilter: cpScopeFilter } = await import("./task-scope-R3XKBIHL.js");
423
423
  const client = getClient();
424
424
  const cpScope = cpScopeFilter();
425
425
  const tasks = await client.execute({
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-2H55BIV2.js";
3
+ } from "./chunk-CEJO7244.js";
4
4
 
5
5
  // src/lib/memory-graph-extractor.ts
6
6
  function entityId(type, name) {
@@ -247,7 +247,7 @@ async function upsertMemoryGraph(result, memoryId) {
247
247
  });
248
248
  }
249
249
  try {
250
- const { createCoOccurrenceEdges } = await import("./co-occurrence-XZQJJIBM.js");
250
+ const { createCoOccurrenceEdges } = await import("./co-occurrence-QARWYUAY.js");
251
251
  await createCoOccurrenceEdges(result.entities, memoryId);
252
252
  } catch {
253
253
  }
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  ensureDaemonToken,
3
3
  readDaemonToken
4
- } from "./chunk-JL3K5OTS.js";
4
+ } from "./chunk-7IZWLMTP.js";
5
5
  import {
6
6
  requestRestart
7
7
  } from "./chunk-PWMMIGVQ.js";
8
8
  import {
9
9
  EXE_AI_DIR
10
- } from "./chunk-TRZ5KA2R.js";
10
+ } from "./chunk-VXIMSRTO.js";
11
11
 
12
12
  // src/lib/exe-daemon-client.ts
13
13
  import net from "net";
@@ -19,7 +19,7 @@ import {
19
19
  import {
20
20
  createCRMWebhookHandler,
21
21
  parseTwentyWebhook
22
- } from "./chunk-MAN5LZQ4.js";
22
+ } from "./chunk-LQSFP2BV.js";
23
23
  import {
24
24
  OllamaProvider
25
25
  } from "./chunk-FWFFZGSC.js";
@@ -49,7 +49,7 @@ import {
49
49
  retryWithBackoff,
50
50
  routeMessage,
51
51
  validateGatewayConfig
52
- } from "./chunk-5LMH4YHG.js";
52
+ } from "./chunk-NRVV4Y5V.js";
53
53
  import {
54
54
  getAccountByName,
55
55
  getAccountByPhoneNumberId,
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  listBehaviors
3
- } from "./chunk-UAFUGPKO.js";
3
+ } from "./chunk-ONAQAL3O.js";
4
4
  import {
5
5
  loadConfigSync
6
- } from "./chunk-TRZ5KA2R.js";
6
+ } from "./chunk-VXIMSRTO.js";
7
7
 
8
8
  // src/lib/behaviors-export.ts
9
9
  import os from "os";
@@ -0,0 +1,230 @@
1
+ // src/bin/vps-health-gate.ts
2
+ import { spawnSync } from "child_process";
3
+ import { appendFileSync, existsSync, mkdirSync, readdirSync } from "fs";
4
+ import http from "http";
5
+ import path from "path";
6
+ var DEPLOY_LOG = "/opt/exe-stack/deploy-log.jsonl";
7
+ var BACKUP_DIR = "/opt/exe-stack/backups";
8
+ async function checkCRM() {
9
+ const start = Date.now();
10
+ try {
11
+ const status = await httpGet("http://localhost:3000/api");
12
+ return {
13
+ check: "crm",
14
+ status: status >= 200 && status < 400 ? "pass" : "fail",
15
+ message: status >= 200 && status < 400 ? `CRM healthy (HTTP ${status})` : `CRM unhealthy (HTTP ${status})`,
16
+ durationMs: Date.now() - start
17
+ };
18
+ } catch (err) {
19
+ return {
20
+ check: "crm",
21
+ status: "fail",
22
+ message: `CRM unreachable: ${err instanceof Error ? err.message : err}`,
23
+ durationMs: Date.now() - start
24
+ };
25
+ }
26
+ }
27
+ async function checkGateway() {
28
+ const start = Date.now();
29
+ try {
30
+ const status = await httpGet("http://localhost:3100/health");
31
+ return {
32
+ check: "gateway",
33
+ status: status >= 200 && status < 300 ? "pass" : "fail",
34
+ message: status >= 200 && status < 300 ? `Gateway healthy (HTTP ${status})` : `Gateway unhealthy (HTTP ${status})`,
35
+ durationMs: Date.now() - start
36
+ };
37
+ } catch (err) {
38
+ return {
39
+ check: "gateway",
40
+ status: "fail",
41
+ message: `Gateway unreachable: ${err instanceof Error ? err.message : err}`,
42
+ durationMs: Date.now() - start
43
+ };
44
+ }
45
+ }
46
+ function checkPostgres() {
47
+ const start = Date.now();
48
+ const databaseUrl = process.env.DATABASE_URL || "postgres://exe@localhost:5432/exedb";
49
+ const result = spawnSync("psql", [databaseUrl, "-c", "SELECT 1"], {
50
+ encoding: "utf8",
51
+ stdio: ["pipe", "pipe", "pipe"],
52
+ timeout: 1e4
53
+ });
54
+ return {
55
+ check: "postgres",
56
+ status: result.status === 0 ? "pass" : "fail",
57
+ message: result.status === 0 ? "Postgres responding" : `Postgres failed: ${result.stderr?.trim() || `exit ${result.status}`}`,
58
+ durationMs: Date.now() - start
59
+ };
60
+ }
61
+ function checkRawEvents() {
62
+ const start = Date.now();
63
+ const databaseUrl = process.env.DATABASE_URL || "postgres://exe@localhost:5432/exedb";
64
+ const result = spawnSync(
65
+ "psql",
66
+ [databaseUrl, "-t", "-c", "SELECT count(*) FROM raw.raw_events"],
67
+ {
68
+ encoding: "utf8",
69
+ stdio: ["pipe", "pipe", "pipe"],
70
+ timeout: 1e4
71
+ }
72
+ );
73
+ if (result.status !== 0) {
74
+ return {
75
+ check: "raw_events",
76
+ status: "fail",
77
+ message: `raw.raw_events query failed: ${result.stderr?.trim() || `exit ${result.status}`}`,
78
+ durationMs: Date.now() - start
79
+ };
80
+ }
81
+ const count = parseInt(result.stdout?.trim() || "0", 10);
82
+ return {
83
+ check: "raw_events",
84
+ status: count > 0 ? "pass" : "fail",
85
+ message: count > 0 ? `raw.raw_events has ${count} rows` : "raw.raw_events is empty",
86
+ durationMs: Date.now() - start
87
+ };
88
+ }
89
+ async function checkGoTrue() {
90
+ const start = Date.now();
91
+ try {
92
+ const status = await httpGet("http://localhost:9999/health");
93
+ return {
94
+ check: "gotrue",
95
+ status: status >= 200 && status < 300 ? "pass" : "fail",
96
+ message: status >= 200 && status < 300 ? `GoTrue healthy (HTTP ${status})` : `GoTrue unhealthy (HTTP ${status})`,
97
+ durationMs: Date.now() - start
98
+ };
99
+ } catch (err) {
100
+ return {
101
+ check: "gotrue",
102
+ status: "fail",
103
+ message: `GoTrue unreachable: ${err instanceof Error ? err.message : err}`,
104
+ durationMs: Date.now() - start
105
+ };
106
+ }
107
+ }
108
+ async function runHealthGate() {
109
+ console.log("[health-gate] Running post-deploy health checks...\n");
110
+ const results = [];
111
+ results.push(checkPostgres());
112
+ results.push(checkRawEvents());
113
+ results.push(await checkCRM());
114
+ results.push(await checkGateway());
115
+ results.push(await checkGoTrue());
116
+ const passed = results.every((r) => r.status === "pass");
117
+ for (const r of results) {
118
+ const icon = r.status === "pass" ? "\u2713" : "\u2717";
119
+ const color = r.status === "pass" ? "\x1B[32m" : "\x1B[31m";
120
+ console.log(` ${color}${icon}\x1B[0m ${r.check.padEnd(12)} ${r.message} (${r.durationMs}ms)`);
121
+ }
122
+ console.log("");
123
+ const result = {
124
+ passed,
125
+ results,
126
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
127
+ };
128
+ return result;
129
+ }
130
+ function logResult(result) {
131
+ mkdirSync(path.dirname(DEPLOY_LOG), { recursive: true });
132
+ const line = JSON.stringify({
133
+ ...result,
134
+ type: "health_gate"
135
+ }) + "\n";
136
+ try {
137
+ appendFileSync(DEPLOY_LOG, line);
138
+ console.log(`[health-gate] Result logged to ${DEPLOY_LOG}`);
139
+ } catch (err) {
140
+ console.warn(`[health-gate] Failed to write deploy log: ${err instanceof Error ? err.message : err}`);
141
+ }
142
+ }
143
+ function restorePreDeployBackup() {
144
+ if (!existsSync(BACKUP_DIR)) return false;
145
+ const backups = readdirSync(BACKUP_DIR).filter((f) => f.startsWith("pg-pre-deploy-") && f.endsWith(".dump")).sort().reverse();
146
+ if (backups.length === 0) {
147
+ console.warn("[health-gate] No pre-deploy backup found to restore");
148
+ return false;
149
+ }
150
+ const latest = backups[0];
151
+ const filepath = path.join(BACKUP_DIR, latest);
152
+ const databaseUrl = process.env.DATABASE_URL || "postgres://exe@localhost:5432/exedb";
153
+ console.log(`[health-gate] Restoring pre-deploy backup: ${latest}`);
154
+ const result = spawnSync("pg_restore", ["-d", databaseUrl, "--clean", "--if-exists", filepath], {
155
+ encoding: "utf8",
156
+ stdio: ["pipe", "pipe", "pipe"],
157
+ timeout: 3e5
158
+ });
159
+ if (result.status !== 0) {
160
+ console.error(`[health-gate] pg_restore failed: ${result.stderr?.trim() || `exit ${result.status}`}`);
161
+ return false;
162
+ }
163
+ console.log("[health-gate] \u2713 Pre-deploy backup restored");
164
+ return true;
165
+ }
166
+ function httpGet(url) {
167
+ return new Promise((resolve, reject) => {
168
+ const req = http.request(url, { method: "GET", timeout: 1e4 }, (res) => {
169
+ res.resume();
170
+ resolve(res.statusCode ?? 0);
171
+ });
172
+ req.on("timeout", () => req.destroy(new Error("timeout")));
173
+ req.on("error", reject);
174
+ req.end();
175
+ });
176
+ }
177
+ async function main(args) {
178
+ if (args.includes("--help") || args.includes("-h")) {
179
+ console.log(`
180
+ exe-os vps-health-gate \u2014 Post-deploy health checks
181
+
182
+ Runs 5 checks: Postgres, raw_events, CRM, Gateway, GoTrue.
183
+ If any check fails, triggers rollback and exits with code 1.
184
+
185
+ Usage:
186
+ exe-os vps-health-gate Run health gate
187
+ exe-os vps-health-gate --check-only Run checks without rollback on failure
188
+ `);
189
+ return;
190
+ }
191
+ const checkOnly = args.includes("--check-only");
192
+ const result = await runHealthGate();
193
+ logResult(result);
194
+ if (result.passed) {
195
+ console.log("[health-gate] \u2713 All checks passed \u2014 deploy is healthy");
196
+ return;
197
+ }
198
+ const failed = result.results.filter((r) => r.status === "fail");
199
+ console.error(`[health-gate] \u2717 ${failed.length} check(s) failed`);
200
+ if (checkOnly) {
201
+ process.exitCode = 1;
202
+ return;
203
+ }
204
+ console.log("[health-gate] Starting rollback...");
205
+ restorePreDeployBackup();
206
+ try {
207
+ const { rollbackStackUpdate, defaultStackPaths } = await import("./stack-update-JIWJGGLX.js");
208
+ const paths = defaultStackPaths();
209
+ await rollbackStackUpdate({
210
+ manifestRef: paths.manifestRef,
211
+ composeFile: paths.composeFile,
212
+ envFile: paths.envFile
213
+ });
214
+ console.log("[health-gate] \u2713 Stack rolled back to previous version");
215
+ } catch (err) {
216
+ console.error(`[health-gate] Stack rollback failed: ${err instanceof Error ? err.message : err}`);
217
+ }
218
+ process.exitCode = 1;
219
+ }
220
+
221
+ export {
222
+ checkCRM,
223
+ checkGateway,
224
+ checkPostgres,
225
+ checkRawEvents,
226
+ checkGoTrue,
227
+ runHealthGate,
228
+ logResult,
229
+ main
230
+ };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  executeAction,
3
3
  substituteTemplate
4
- } from "./chunk-AU5426YP.js";
4
+ } from "./chunk-B7JGEDVE.js";
5
5
 
6
6
  // src/automation/workflow-engine.ts
7
7
  import { randomUUID } from "crypto";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getIdentity,
3
3
  loadEmployeesSync
4
- } from "./chunk-2H55BIV2.js";
4
+ } from "./chunk-CEJO7244.js";
5
5
 
6
6
  // src/lib/drift-probes.ts
7
7
  var DRIFT_THRESHOLD = 80;
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  recordSessionKill
3
- } from "./chunk-452XB7OZ.js";
3
+ } from "./chunk-VRIMTCX2.js";
4
4
  import {
5
5
  updateTask
6
- } from "./chunk-5R75ODPS.js";
6
+ } from "./chunk-NBY6R37W.js";
7
7
  import {
8
8
  ensureEmployee,
9
9
  extractRootExe,
@@ -14,13 +14,13 @@ import {
14
14
  sessionScopeFilter,
15
15
  strictSessionScopeFilter,
16
16
  writeNotification
17
- } from "./chunk-HNLPLLE6.js";
17
+ } from "./chunk-F7JLZXHC.js";
18
18
  import {
19
19
  queueIntercom
20
- } from "./chunk-QI4IXJN7.js";
20
+ } from "./chunk-5CHYEKMH.js";
21
21
  import {
22
22
  listSessions
23
- } from "./chunk-BZNI4OK5.js";
23
+ } from "./chunk-GHEWRYMY.js";
24
24
  import {
25
25
  getTransport
26
26
  } from "./chunk-MVW62NIZ.js";
@@ -30,18 +30,18 @@ import {
30
30
  } from "./chunk-CX6GL3ZJ.js";
31
31
  import {
32
32
  recordOrchestrationEventBestEffort
33
- } from "./chunk-5NJ4A4ZA.js";
33
+ } from "./chunk-HCBMPZDT.js";
34
34
  import {
35
35
  getAgentRuntime
36
- } from "./chunk-6OJJF4WP.js";
36
+ } from "./chunk-XJUUWHVN.js";
37
37
  import {
38
38
  baseAgentName,
39
39
  isCoordinatorName,
40
40
  shouldAutoInstance
41
- } from "./chunk-2H55BIV2.js";
41
+ } from "./chunk-CEJO7244.js";
42
42
  import {
43
43
  loadConfigSync
44
- } from "./chunk-TRZ5KA2R.js";
44
+ } from "./chunk-VXIMSRTO.js";
45
45
 
46
46
  // src/lib/daemon-orchestration.ts
47
47
  import { execSync } from "child_process";
@@ -473,7 +473,7 @@ function createReviewNudgeRealDeps(_getClient) {
473
473
  return Number(rows[0]?.cnt ?? 0);
474
474
  },
475
475
  sendNudge: (sessionName) => {
476
- queueIntercom(sessionName, "review nudge: pending reviews");
476
+ queueIntercom(sessionName, "review nudge: pending reviews", "completion");
477
477
  },
478
478
  persistState: saveNudgeState
479
479
  };
@@ -666,7 +666,8 @@ function shouldAutoWake(input) {
666
666
  return true;
667
667
  }
668
668
  async function pollOrphanedTasks(deps, nowMs = Date.now()) {
669
- const globalGate = checkAutoWakeGates("__global__", nowMs);
669
+ const checkGate = deps.checkGate ?? checkAutoWakeGates;
670
+ const globalGate = checkGate("__global__", nowMs);
670
671
  if (globalGate) {
671
672
  process.stderr.write(`[auto-wake] GLOBAL GATE BLOCKED: ${globalGate} \u2014 skipping all spawns
672
673
  `);
@@ -762,7 +763,7 @@ async function pollOrphanedTasks(deps, nowMs = Date.now()) {
762
763
  }
763
764
  continue;
764
765
  }
765
- const agentGate = checkAutoWakeGates(key, nowMs);
766
+ const agentGate = checkGate(key, nowMs);
766
767
  if (agentGate) {
767
768
  process.stderr.write(`[auto-wake] AGENT GATE BLOCKED: ${agentId} \u2014 ${agentGate}
768
769
  `);
@@ -874,7 +875,7 @@ async function releaseStuckTasks(deps, nowMs = Date.now()) {
874
875
  }
875
876
  if (deps.notifyOrphan) {
876
877
  try {
877
- await deps.notifyOrphan(t.taskId, t.agentId);
878
+ await deps.notifyOrphan(t.taskId, t.agentId, t.sessionScope);
878
879
  } catch {
879
880
  }
880
881
  }
@@ -887,7 +888,7 @@ async function releaseStuckTasks(deps, nowMs = Date.now()) {
887
888
  );
888
889
  if (deps.notifyOrphan) {
889
890
  try {
890
- await deps.notifyOrphan(t.taskId, t.agentId);
891
+ await deps.notifyOrphan(t.taskId, t.agentId, t.sessionScope);
891
892
  } catch {
892
893
  }
893
894
  }
@@ -937,13 +938,14 @@ function createStuckTaskRealDeps(getClient) {
937
938
  const agentPart = sessionName.split("-")[0];
938
939
  return baseAgentName(agentPart);
939
940
  },
940
- notifyOrphan: async (taskId, agentId) => {
941
+ notifyOrphan: async (taskId, agentId, sessionScope) => {
941
942
  await writeNotification({
942
943
  agentId,
943
944
  agentRole: "employee",
944
945
  event: "orphan_task",
945
946
  project: "",
946
- summary: `Agent "${agentId}" session died \u2014 task ${taskId.slice(0, 8)} needs review (auto-closed: session ended without completion)`
947
+ summary: `Agent "${agentId}" session died \u2014 task ${taskId.slice(0, 8)} needs review (auto-closed: session ended without completion)`,
948
+ sessionScope: sessionScope ?? void 0
947
949
  });
948
950
  }
949
951
  };
@@ -1655,7 +1657,7 @@ async function reapOrphanedWorktrees(deps, nowMs = Date.now()) {
1655
1657
  }
1656
1658
  async function createWorktreeReaperRealDeps() {
1657
1659
  const { getPaneCwdAsync } = await import("./lib/tmux-status.js");
1658
- const { getGitRoot, isWorktreeDirty: isDirty } = await import("./worktree-JXN4RCWC.js");
1660
+ const { getGitRoot, isWorktreeDirty: isDirty } = await import("./worktree-RICSCT2S.js");
1659
1661
  const { statSync: statSync2 } = await import("fs");
1660
1662
  const { basename } = await import("path");
1661
1663
  const { promisify } = await import("util");
@@ -1796,7 +1798,7 @@ async function gcStaleCheckpoints() {
1796
1798
  }
1797
1799
  async function pollTaskGroupBarriers() {
1798
1800
  try {
1799
- const { checkAndFireBarriers } = await import("./tasks-crud-JXZEBZFR.js");
1801
+ const { checkAndFireBarriers } = await import("./tasks-crud-DQOG2NPG.js");
1800
1802
  const firedGroupIds = await checkAndFireBarriers();
1801
1803
  if (firedGroupIds.length === 0) return 0;
1802
1804
  const { getClient } = await import("./lib/database.js");
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-2H55BIV2.js";
3
+ } from "./chunk-CEJO7244.js";
4
4
 
5
5
  // src/lib/session-kill-telemetry.ts
6
6
  import crypto from "crypto";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  redactSecrets
3
- } from "./chunk-F7LU65PQ.js";
3
+ } from "./chunk-Y25OJWOQ.js";
4
4
  import {
5
5
  isExeMcpTool,
6
6
  stripExeMcpPrefix
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  connectEmbedDaemon,
9
9
  embedBatchViaClient
10
- } from "./chunk-VHKL4S4T.js";
10
+ } from "./chunk-RRHSONV5.js";
11
11
  import {
12
12
  EXE_AI_DIR
13
- } from "./chunk-TRZ5KA2R.js";
13
+ } from "./chunk-VXIMSRTO.js";
14
14
 
15
15
  // src/lib/code-context-index.ts
16
16
  import crypto from "crypto";