@askexenow/exe-os 0.9.312 → 0.9.313

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 (344) hide show
  1. package/deploy/compose/.env.askexe-control-plane.example +1 -1
  2. package/deploy/compose/.env.customer.example +11 -7
  3. package/deploy/compose/.env.default +4 -4
  4. package/deploy/compose/.env.example +7 -7
  5. package/deploy/compose/docker-compose.yml +43 -19
  6. package/deploy/compose/gateway.json +2 -2
  7. package/deploy/compose/init-db.sql +6 -20
  8. package/deploy/compose/setup.sh +74 -132
  9. package/deploy/compose/status.sh +5 -0
  10. package/deploy/stack-manifests/v0.9.json +21 -0
  11. package/dist/{active-agent-ORX47ZKW.js → active-agent-EWF2HJ3W.js} +6 -6
  12. package/dist/{active-agent-S5T2YMOR.js → active-agent-FFN5ARMC.js} +6 -6
  13. package/dist/{agentic-ontology-6KBAXLSJ.js → agentic-ontology-AAUATKUS.js} +1 -1
  14. package/dist/{backfill-metadata-FV7GX6AS.js → backfill-metadata-FBYFDOTH.js} +7 -7
  15. package/dist/{background-jobs-A2LV36UX.js → background-jobs-2QZ5IQKE.js} +5 -3
  16. package/dist/{behaviors-47CPEKJ7.js → behaviors-PQ77IPJR.js} +8 -8
  17. package/dist/bin/age-ontology-load.js +3 -3
  18. package/dist/bin/agentic-ontology-backfill.js +9 -9
  19. package/dist/bin/agentic-reflection-backfill.js +10 -10
  20. package/dist/bin/agentic-semantic-label.js +9 -9
  21. package/dist/bin/backfill-conversations.js +10 -10
  22. package/dist/bin/backfill-responses.js +10 -10
  23. package/dist/bin/backfill-vectors.js +13 -13
  24. package/dist/bin/bulk-sync-postgres.js +16 -16
  25. package/dist/bin/cc-doctor.js +9 -9
  26. package/dist/bin/cleanup-stale-review-tasks.js +15 -15
  27. package/dist/bin/cli.js +21 -21
  28. package/dist/bin/deferred-daemon-restart.js +1 -1
  29. package/dist/bin/exe-agent-config.js +6 -6
  30. package/dist/bin/exe-agent.js +14 -14
  31. package/dist/bin/exe-assign.js +12 -12
  32. package/dist/bin/exe-boot.js +78 -57
  33. package/dist/bin/exe-call.js +7 -7
  34. package/dist/bin/exe-cloud.js +17 -17
  35. package/dist/bin/exe-config-dump.js +7 -7
  36. package/dist/bin/exe-dispatch.js +15 -15
  37. package/dist/bin/exe-doctor.js +11 -2
  38. package/dist/bin/exe-export-behaviors.js +10 -10
  39. package/dist/bin/exe-forget.js +9 -9
  40. package/dist/bin/exe-gateway.js +10 -10
  41. package/dist/bin/exe-healthcheck.js +9 -9
  42. package/dist/bin/exe-heartbeat.js +15 -15
  43. package/dist/bin/exe-kill.js +18 -18
  44. package/dist/bin/exe-launch-agent.js +30 -28
  45. package/dist/bin/exe-new-employee.js +36 -15
  46. package/dist/bin/exe-pending-messages.js +16 -16
  47. package/dist/bin/exe-pending-notifications.js +15 -15
  48. package/dist/bin/exe-pending-reviews.js +15 -15
  49. package/dist/bin/exe-preflight.js +1 -1
  50. package/dist/bin/exe-rename.js +19 -29
  51. package/dist/bin/exe-review.js +17 -17
  52. package/dist/bin/exe-search.js +8 -8
  53. package/dist/bin/exe-session-cleanup.js +41 -20
  54. package/dist/bin/exe-settings.js +18 -18
  55. package/dist/bin/exe-start-codex.js +15 -15
  56. package/dist/bin/exe-start-opencode.js +11 -11
  57. package/dist/bin/exe-status.js +16 -16
  58. package/dist/bin/exe-support.js +5 -5
  59. package/dist/bin/exe-team.js +6 -6
  60. package/dist/bin/exe-watchdog.js +32 -3
  61. package/dist/bin/git-sweep.js +16 -16
  62. package/dist/bin/graph-backfill.js +8 -8
  63. package/dist/bin/graph-export.js +8 -8
  64. package/dist/bin/import-history.js +10 -10
  65. package/dist/bin/install-launchd.js +2 -2
  66. package/dist/bin/install.js +15 -15
  67. package/dist/bin/intercom-check.js +4 -4
  68. package/dist/bin/mcp-sessions.js +2 -2
  69. package/dist/bin/orchestration-metrics.js +7 -7
  70. package/dist/bin/postgres-agentic-reflection-backfill.js +5 -5
  71. package/dist/bin/postgres-agentic-semantic-backfill.js +4 -4
  72. package/dist/bin/pre-build-guard.js +12 -1
  73. package/dist/bin/scan-tasks.js +15 -15
  74. package/dist/bin/setup.js +3 -3
  75. package/dist/bin/shard-migrate.js +8 -8
  76. package/dist/bin/stack-update.js +8 -8
  77. package/dist/bin/verify-stack.js +3 -1
  78. package/dist/bin/vps-health-gate.js +1 -1
  79. package/dist/{branding-SC4BOPUY.js → branding-EDUC7TUP.js} +2 -2
  80. package/dist/{browser-session-store-DV5TDXXD.js → browser-session-store-CXQMOSEC.js} +1 -1
  81. package/dist/{capability-cards-WQVY7WSS.js → capability-cards-2U3XWCDP.js} +5 -5
  82. package/dist/{capacity-monitor-BUKYPSWR.js → capacity-monitor-ZRLW7TVL.js} +16 -16
  83. package/dist/{catchup-brief-X5IVQAOH.js → catchup-brief-FSBZVYPL.js} +18 -18
  84. package/dist/{chunk-PMEOSD6S.js → chunk-24BUDF3J.js} +9 -6
  85. package/dist/{chunk-2NVEKSSP.js → chunk-2FULKRDO.js} +56 -38
  86. package/dist/{chunk-QB5JOGPK.js → chunk-2PI6JBJL.js} +5 -4
  87. package/dist/{chunk-MTIJ2NXY.js → chunk-2PWRUIKZ.js} +1 -1
  88. package/dist/{chunk-NIZQ3CIS.js → chunk-3AMGSCRH.js} +1 -1
  89. package/dist/{chunk-7ODTYODO.js → chunk-3LGID56M.js} +10 -7
  90. package/dist/{chunk-GSY6HL3T.js → chunk-4JI54RHR.js} +5 -5
  91. package/dist/{chunk-ISILDO7P.js → chunk-4THK7IA4.js} +1 -1
  92. package/dist/{chunk-IRIPGGGL.js → chunk-4UHQYBMQ.js} +1 -1
  93. package/dist/{chunk-HQODUV3G.js → chunk-552IGUBB.js} +2 -2
  94. package/dist/{chunk-IRHNV4GY.js → chunk-5KLQCGI5.js} +72 -18
  95. package/dist/{chunk-SOT23KWW.js → chunk-63UEWYM3.js} +4 -4
  96. package/dist/{chunk-QE7UVQDP.js → chunk-6PR2RAKM.js} +1 -1
  97. package/dist/{chunk-ZZXADKAP.js → chunk-6SPUK67A.js} +2 -2
  98. package/dist/{chunk-RVXWGPD3.js → chunk-75TM3APG.js} +29 -6
  99. package/dist/{chunk-IZPO6IOZ.js → chunk-7QSXARI3.js} +1 -1
  100. package/dist/{chunk-A2YZG4AD.js → chunk-AIUXE3ZJ.js} +6 -6
  101. package/dist/{chunk-U63BZI2B.js → chunk-AJERMFD6.js} +3 -3
  102. package/dist/{chunk-BUOMSIXH.js → chunk-BMNX3YWX.js} +2 -2
  103. package/dist/{chunk-YUBTHJVV.js → chunk-BRSMAFBN.js} +1 -1
  104. package/dist/{chunk-JZW5AOWI.js → chunk-BSPALHIR.js} +2 -2
  105. package/dist/{chunk-VDYUKTNS.js → chunk-CLAYNAXC.js} +4 -5
  106. package/dist/{chunk-J3QZPDNH.js → chunk-CNQ25C4C.js} +1 -1
  107. package/dist/{chunk-GWPICNSO.js → chunk-CSTL7BMK.js} +49 -4
  108. package/dist/{chunk-5DPE7B7K.js → chunk-CTYHSVHP.js} +1 -1
  109. package/dist/{chunk-EM4EYF3P.js → chunk-CVTWQZOR.js} +13 -5
  110. package/dist/{chunk-JNARUXDC.js → chunk-CW3FPWUW.js} +2 -2
  111. package/dist/{chunk-V42BSVX6.js → chunk-CWACO2D4.js} +51 -4
  112. package/dist/{chunk-RPBTYQKJ.js → chunk-CWUCD7C7.js} +1 -1
  113. package/dist/{chunk-DFUCFLZH.js → chunk-D4EMVYI7.js} +2 -2
  114. package/dist/{chunk-W2J2RF5N.js → chunk-DIHMGQGV.js} +3 -3
  115. package/dist/{chunk-YB7U4WTY.js → chunk-DJ4RG3RK.js} +2 -2
  116. package/dist/{chunk-KSMITUGY.js → chunk-DR7QPGX4.js} +3 -3
  117. package/dist/{chunk-QNXM2HXW.js → chunk-ELFFRVNL.js} +1 -1
  118. package/dist/{chunk-QEGXNJGR.js → chunk-EV2SMRLF.js} +4 -4
  119. package/dist/{chunk-VFSYVQX4.js → chunk-F3QMXKKJ.js} +8 -2
  120. package/dist/{chunk-NCC3F6GM.js → chunk-F5XPKUPK.js} +2 -2
  121. package/dist/{chunk-43R2GILO.js → chunk-FIBL4JRZ.js} +2 -2
  122. package/dist/{chunk-B2J3BBJC.js → chunk-FQH4R6UG.js} +2 -2
  123. package/dist/{chunk-AC6DKMVS.js → chunk-FSAKWKWU.js} +1 -1
  124. package/dist/{chunk-GL5NU6IK.js → chunk-FXS5OFGH.js} +1 -1
  125. package/dist/{chunk-K7KBAJQL.js → chunk-GHJRLETI.js} +10 -10
  126. package/dist/{chunk-VQRTO7IS.js → chunk-H73TUI4Y.js} +9 -2
  127. package/dist/{chunk-IIHE3FNC.js → chunk-HSXWUZOD.js} +3 -3
  128. package/dist/{chunk-JV225JBX.js → chunk-I6RHLHVW.js} +2 -2
  129. package/dist/{chunk-S6HVQF27.js → chunk-IEDCQRGG.js} +88 -4
  130. package/dist/{chunk-4Q5VNQTV.js → chunk-IFSOVXGN.js} +3 -3
  131. package/dist/{chunk-JMHKK7A5.js → chunk-ITVMRPCQ.js} +1 -1
  132. package/dist/{chunk-VT6P7FV4.js → chunk-IU44MPY3.js} +1 -1
  133. package/dist/{chunk-6OD2RVIA.js → chunk-IXTDBQYU.js} +273 -397
  134. package/dist/{chunk-2NGPZCWX.js → chunk-JB7QUK3D.js} +3 -3
  135. package/dist/{chunk-VT2B5BHM.js → chunk-JBSCL2XT.js} +2 -1
  136. package/dist/{chunk-MPX3TRMQ.js → chunk-JD5S5AAV.js} +1 -1
  137. package/dist/{chunk-XYG722JW.js → chunk-JIJKUZIO.js} +3 -3
  138. package/dist/{chunk-KMIAYKIH.js → chunk-K5C6LC2G.js} +159 -39
  139. package/dist/{chunk-DAOHCXM2.js → chunk-KH6BCYLC.js} +1 -1
  140. package/dist/{chunk-4L4R6AQJ.js → chunk-KMI4TUTW.js} +1 -1
  141. package/dist/{chunk-PHFPIUWU.js → chunk-KWOAM7TA.js} +3 -0
  142. package/dist/{chunk-RZJ6DXVE.js → chunk-L6QI2NNG.js} +1 -1
  143. package/dist/{chunk-HED6D5KR.js → chunk-MMNMQNLD.js} +43 -29
  144. package/dist/{chunk-KAVUTP5G.js → chunk-N3CRJ2VW.js} +3 -3
  145. package/dist/{chunk-OBJXZII2.js → chunk-N7LBAQGK.js} +3 -3
  146. package/dist/{chunk-LMX7UKGX.js → chunk-OUAGTQC4.js} +17 -11
  147. package/dist/{chunk-WZBUKC5N.js → chunk-OUJI2ZTY.js} +2 -2
  148. package/dist/{chunk-YUGLOZOR.js → chunk-OXTZEKVA.js} +1 -1
  149. package/dist/{chunk-OR3TAZL3.js → chunk-P4ULFI2N.js} +1 -1
  150. package/dist/{chunk-6LNSZADA.js → chunk-PVC4RNHQ.js} +50 -11
  151. package/dist/{chunk-FM7XZDZI.js → chunk-R2WP3XIN.js} +1 -1
  152. package/dist/{chunk-IBDPPBFK.js → chunk-R5IPZ5ZC.js} +1 -1
  153. package/dist/{chunk-7WDIGRSO.js → chunk-R5TZ2FC3.js} +1 -1
  154. package/dist/{chunk-2UVN2NBN.js → chunk-RICNNGYH.js} +3 -3
  155. package/dist/{chunk-WBJXJ2R4.js → chunk-RLBVY5FE.js} +17 -14
  156. package/dist/{chunk-XXJRZ75E.js → chunk-RV634O2W.js} +5 -2
  157. package/dist/{chunk-3KH6GXXX.js → chunk-RYPFOZQH.js} +2 -2
  158. package/dist/{chunk-DNFU56ZS.js → chunk-SB7W6XI4.js} +1 -1
  159. package/dist/{chunk-PPXQE7AS.js → chunk-SE6MLUOK.js} +33 -34
  160. package/dist/{chunk-65DBIEM2.js → chunk-SHIICYJW.js} +7 -1
  161. package/dist/{chunk-KPVVTHPK.js → chunk-SRMNWAHN.js} +15 -10
  162. package/dist/chunk-T2DJR7ND.js +367 -0
  163. package/dist/{chunk-Z6H6Y4BS.js → chunk-TA22MGGN.js} +1 -1
  164. package/dist/{chunk-ZOVHXTGC.js → chunk-TN7SC2ZQ.js} +1 -1
  165. package/dist/{chunk-XV5HRIXG.js → chunk-TRPGNCVB.js} +8 -8
  166. package/dist/{chunk-4BANMHJ5.js → chunk-UDZP2SHJ.js} +3 -3
  167. package/dist/{chunk-GMZMBLHT.js → chunk-UM6WUSQ7.js} +2 -2
  168. package/dist/{chunk-2EJ636HI.js → chunk-UST3MKK7.js} +1 -1
  169. package/dist/{chunk-RQ7OVXUZ.js → chunk-V2CZVZUO.js} +2 -2
  170. package/dist/{chunk-4RJJ5FJ2.js → chunk-V4UKBUUA.js} +1 -1
  171. package/dist/{chunk-EOS7VPVT.js → chunk-VA2MDALR.js} +8 -8
  172. package/dist/{chunk-SCYWCWKY.js → chunk-VG4ZH2Z3.js} +24 -10
  173. package/dist/{chunk-255DIG4B.js → chunk-VHLI6CTD.js} +1 -1
  174. package/dist/{chunk-DFIOOK5R.js → chunk-WCES22KG.js} +4 -3
  175. package/dist/{chunk-5A6KTWQL.js → chunk-WOTKNUKK.js} +126 -2
  176. package/dist/{chunk-62UZWGFX.js → chunk-WZZBGGSD.js} +63 -2
  177. package/dist/{chunk-ELXR65AN.js → chunk-X2FHTDIU.js} +6 -3
  178. package/dist/{chunk-V4BW5HFQ.js → chunk-X5I5QRC2.js} +3 -3
  179. package/dist/{chunk-X4AFBL4N.js → chunk-XCORXJ3M.js} +1 -1
  180. package/dist/{chunk-66JPZELX.js → chunk-Y5CNGG4F.js} +24 -16
  181. package/dist/{chunk-SPOXL7HF.js → chunk-YEWNIBNA.js} +9 -9
  182. package/dist/{chunk-WJ2PZGRV.js → chunk-ZAA344BL.js} +29 -2
  183. package/dist/{chunk-TN2YCFQE.js → chunk-ZGLJ2VD7.js} +5 -5
  184. package/dist/{co-activation-WN25AJOC.js → co-activation-RH46OQ3N.js} +5 -5
  185. package/dist/{co-occurrence-YP2Q3OEA.js → co-occurrence-MJWERUWY.js} +5 -5
  186. package/dist/{code-context-index-ZWONKBKX.js → code-context-index-WFUBYGQT.js} +6 -6
  187. package/dist/{content-extractor-EYRVGD6O.js → content-extractor-RHITF2KM.js} +1 -1
  188. package/dist/{conversation-wiki-populator-XFUC7S5P.js → conversation-wiki-populator-SK233TL4.js} +1 -1
  189. package/dist/{crdt-sync-ZFIFL2QM.js → crdt-sync-4R7SXTNB.js} +1 -1
  190. package/dist/{crm-webhook-DGPHULOO.js → crm-webhook-YDXX5FDK.js} +2 -2
  191. package/dist/{cto-delegation-gate-OF2A3TSS.js → cto-delegation-gate-ZJHLPK4Y.js} +14 -14
  192. package/dist/{daemon-auth-N6P2MZAV.js → daemon-auth-5FCYVQIZ.js} +3 -3
  193. package/dist/{daemon-orchestration-G4RRTPP7.js → daemon-orchestration-NBU5RZ2O.js} +18 -18
  194. package/dist/{daemon-ready-signal-3L2MJT7C.js → daemon-ready-signal-KXLL6ZFL.js} +1 -1
  195. package/dist/{db-backup-EORG4LBO.js → db-backup-BTL2FBBL.js} +9 -3
  196. package/dist/{db-restore-events-3R7G4FP4.js → db-restore-events-3A57GMLW.js} +2 -2
  197. package/dist/{doc-graph-extractor-APZS3DFD.js → doc-graph-extractor-ADYRG7DB.js} +5 -5
  198. package/dist/documents-VWPZTDFA.js +56 -0
  199. package/dist/{dreaming-Q4E3WBGY.js → dreaming-76WKGTL6.js} +15 -15
  200. package/dist/embeddings-config-FANLORDH.js +21 -0
  201. package/dist/{exe-drift-CI5R6GUT.js → exe-drift-T3IO2SPX.js} +6 -6
  202. package/dist/{exe-export-HQIQASIT.js → exe-export-6YEHSJMP.js} +9 -9
  203. package/dist/{exe-import-ULZK56WC.js → exe-import-3NERK63O.js} +9 -9
  204. package/dist/{exe-key-ILNSBGRN.js → exe-key-RCMBMLSQ.js} +8 -8
  205. package/dist/{exe-org-WQWQZRLR.js → exe-org-KCOOLUTW.js} +3 -3
  206. package/dist/{exe-snapshot-RUZTWZOF.js → exe-snapshot-JIY7MNRI.js} +18 -18
  207. package/dist/{fast-db-init-KNJRL7T3.js → fast-db-init-PVJ72264.js} +1 -1
  208. package/dist/{founder-context-QCTMEK66.js → founder-context-A4VUEKDH.js} +4 -4
  209. package/dist/gateway/index.js +17 -17
  210. package/dist/{git-staleness-KIA5YI4H.js → git-staleness-IOAHAGBI.js} +5 -5
  211. package/dist/{git-task-sweep-WH6QE7HL.js → git-task-sweep-IGM5RILF.js} +17 -15
  212. package/dist/{global-procedures-SYZZCGDS.js → global-procedures-VZL2X4RK.js} +6 -6
  213. package/dist/{graph-auto-extract-J2TIWZEE.js → graph-auto-extract-TIXRGBC5.js} +5 -5
  214. package/dist/{hook-integrity-I6PWJQER.js → hook-integrity-XNPNCMAS.js} +1 -1
  215. package/dist/hooks/bug-report-worker.js +47 -17
  216. package/dist/hooks/codex-stop-task-finalizer.js +47 -17
  217. package/dist/hooks/commit-complete.js +18 -18
  218. package/dist/hooks/error-recall.js +11 -11
  219. package/dist/hooks/exe-heartbeat-hook.js +7 -7
  220. package/dist/hooks/ingest-worker.js +39 -9
  221. package/dist/hooks/ingest.js +17 -17
  222. package/dist/hooks/instructions-loaded.js +8 -8
  223. package/dist/hooks/manifest.json +20 -20
  224. package/dist/hooks/notification.js +8 -8
  225. package/dist/hooks/post-compact.js +17 -17
  226. package/dist/hooks/post-tool-combined.js +60 -7
  227. package/dist/hooks/pre-compact.js +23 -23
  228. package/dist/hooks/pre-tool-use.js +64 -34
  229. package/dist/hooks/prompt-submit.js +40 -32
  230. package/dist/hooks/session-end.js +29 -29
  231. package/dist/hooks/session-start.js +17 -17
  232. package/dist/hooks/stop.js +24 -24
  233. package/dist/hooks/subagent-stop.js +17 -17
  234. package/dist/hooks/summary-worker.js +55 -25
  235. package/dist/index.js +27 -27
  236. package/dist/{installer-PSDYMGN7.js → installer-D7D5O4KL.js} +10 -10
  237. package/dist/{installer-3NB3IBHF.js → installer-EQP2EMNZ.js} +10 -10
  238. package/dist/{installer-IIJFCTMH.js → installer-IWRYH55Z.js} +10 -10
  239. package/dist/{key-backup-status-FNSN3NXH.js → key-backup-status-ZNGDSPLT.js} +2 -2
  240. package/dist/lib/agent-config.js +3 -3
  241. package/dist/lib/cloud-sync.js +16 -16
  242. package/dist/lib/config.js +2 -2
  243. package/dist/lib/consolidation.js +8 -8
  244. package/dist/lib/database.js +7 -5
  245. package/dist/lib/db-daemon-client.js +6 -6
  246. package/dist/lib/db.js +7 -5
  247. package/dist/lib/device-registry.js +3 -3
  248. package/dist/lib/embed-worker.js +2 -2
  249. package/dist/lib/embedder.js +6 -6
  250. package/dist/lib/employee-templates.js +7 -7
  251. package/dist/lib/employees.js +5 -5
  252. package/dist/lib/exe-daemon-client.js +5 -5
  253. package/dist/lib/exe-daemon.js +449 -89
  254. package/dist/lib/hybrid-search.js +8 -8
  255. package/dist/lib/identity.js +5 -5
  256. package/dist/lib/license.js +4 -4
  257. package/dist/lib/messaging.js +15 -15
  258. package/dist/lib/post-tool-memory.js +2 -2
  259. package/dist/lib/reminders.js +6 -6
  260. package/dist/lib/schedules.js +8 -8
  261. package/dist/lib/session-registry.js +9 -7
  262. package/dist/lib/session-wrappers.js +1 -1
  263. package/dist/lib/skill-learning.js +9 -9
  264. package/dist/lib/store.js +7 -7
  265. package/dist/lib/task-router.js +6 -6
  266. package/dist/lib/tasks.js +16 -16
  267. package/dist/lib/tmux-routing.js +14 -14
  268. package/dist/lib/token-spend.js +6 -6
  269. package/dist/{license-gate-7SDHCJUO.js → license-gate-PZOP7S2S.js} +5 -5
  270. package/dist/mcp/register-tools.js +73 -72
  271. package/dist/mcp/server.js +74 -73
  272. package/dist/mcp/tools/complete-reminder.js +7 -7
  273. package/dist/mcp/tools/create-reminder.js +7 -7
  274. package/dist/mcp/tools/create-task.js +18 -18
  275. package/dist/mcp/tools/deactivate-behavior.js +10 -10
  276. package/dist/mcp/tools/list-reminders.js +7 -7
  277. package/dist/mcp/tools/list-tasks.js +18 -18
  278. package/dist/mcp/tools/send-message.js +17 -17
  279. package/dist/mcp/tools/update-task.js +17 -17
  280. package/dist/{mcp-http-config-QSOVFXHW.js → mcp-http-config-23DHJAU4.js} +7 -7
  281. package/dist/{mcp-port-config-AWWRZA22.js → mcp-port-config-FFAMMLLE.js} +2 -1
  282. package/dist/{memory-cards-II67WFL2.js → memory-cards-CNLMHSZC.js} +5 -5
  283. package/dist/{memory-graph-extractor-PM4Q2KJG.js → memory-graph-extractor-HIXP2BQS.js} +6 -6
  284. package/dist/{memory-poisoning-defense-ECXSX7HK.js → memory-poisoning-defense-YL53IBBF.js} +5 -5
  285. package/dist/{memory-queue-VAE6WMSS.js → memory-queue-3Q5P43AM.js} +3 -3
  286. package/dist/memory-queue-client-YP2QKX6J.js +16 -0
  287. package/dist/{memory-reflection-PXF6YFDU.js → memory-reflection-VHQRUZWK.js} +5 -5
  288. package/dist/{notifications-UP7WQGG4.js → notifications-Q5NEAP6K.js} +14 -14
  289. package/dist/{orchestration-events-PZLLPCKY.js → orchestration-events-7SNWRJYE.js} +6 -6
  290. package/dist/{orchestration-phase-SJOXDB7X.js → orchestration-phase-U45T4VG3.js} +3 -3
  291. package/dist/{orchestrator-PUT45J4O.js → orchestrator-XWLKNWUG.js} +16 -16
  292. package/dist/{pipeline-router-5CRWKESM.js → pipeline-router-5IBJBH7P.js} +6 -6
  293. package/dist/{plan-limits-SH2NDFNX.js → plan-limits-PBEZVHRQ.js} +8 -8
  294. package/dist/{preferences-YWBTKW3M.js → preferences-TYTGDXQZ.js} +2 -2
  295. package/dist/{project-boot-2TCPDZ4S.js → project-boot-OHEGJD2L.js} +2 -2
  296. package/dist/{projection-worker-HWY37MNC.js → projection-worker-HELRBNDR.js} +5 -5
  297. package/dist/{prospective-memory-FQSVMCGG.js → prospective-memory-N55XRGJP.js} +5 -5
  298. package/dist/{push-notifications-DK6XA5B3.js → push-notifications-PAFNP3EC.js} +3 -3
  299. package/dist/{reranker-AALRMGMM.js → reranker-MNJSTOPR.js} +3 -3
  300. package/dist/{retrieval-health-PNWJSJNG.js → retrieval-health-W4HNR3WX.js} +1 -1
  301. package/dist/{review-polling-65JZUE3T.js → review-polling-SRYZU2PI.js} +15 -15
  302. package/dist/runtime/index.js +22 -22
  303. package/dist/{session-events-EJ3OSAA6.js → session-events-L4DK5J6J.js} +15 -15
  304. package/dist/{session-kill-telemetry-3HGM7SNQ.js → session-kill-telemetry-U2YHKHCB.js} +15 -15
  305. package/dist/{session-scope-JGDYAMJO.js → session-scope-JTPHECAU.js} +14 -14
  306. package/dist/{setup-wizard-44LMFM2C.js → setup-wizard-IP5R66LR.js} +3 -3
  307. package/dist/{shard-manager-KUCJPLC6.js → shard-manager-RASGFMGS.js} +3 -3
  308. package/dist/{skill-refinement-DUOO6B7V.js → skill-refinement-VTYL4OMJ.js} +5 -5
  309. package/dist/{stack-release-XYMKU7NT.js → stack-release-TOCCJQOF.js} +244 -45
  310. package/dist/{stack-update-TUBZTY7Z.js → stack-update-MRNVHUZZ.js} +11 -5
  311. package/dist/{steward-gate-6NWRDLX2.js → steward-gate-JEVUDTBI.js} +6 -6
  312. package/dist/{task-enforcement-UOULTGFB.js → task-enforcement-VFSAAZUN.js} +14 -14
  313. package/dist/{task-scope-P5STKYAC.js → task-scope-P4VLIQNP.js} +14 -14
  314. package/dist/{tasks-crud-24HMTULR.js → tasks-crud-SC3ERIUR.js} +14 -14
  315. package/dist/{tasks-notify-LAIU7UUI.js → tasks-notify-WJYBUCIB.js} +15 -15
  316. package/dist/{tasks-review-AFJAU2DY.js → tasks-review-XPVPHCGD.js} +14 -14
  317. package/dist/{telemetry-upload-DWFGC2XJ.js → telemetry-upload-4QEYQROW.js} +10 -10
  318. package/dist/{token-budget-4RFZKWGH.js → token-budget-UBOP3HVE.js} +6 -6
  319. package/dist/{tool-capability-index-ZEXBWKUZ.js → tool-capability-index-SHYCBE2Z.js} +1 -1
  320. package/dist/{tool-telemetry-BS5JXM5M.js → tool-telemetry-CDNPES5B.js} +1 -1
  321. package/dist/tui/App.js +27 -27
  322. package/dist/{tui-data-UNO5B7PU.js → tui-data-HVYY7GRK.js} +14 -14
  323. package/dist/{worker-gate-C6CTTYMD.js → worker-gate-KQTODSUQ.js} +3 -3
  324. package/dist/{workflow-engine-4W2KYCDV.js → workflow-engine-OP2DQISD.js} +2 -2
  325. package/dist/{working-memory-FXHQCJJE.js → working-memory-PY4AG577.js} +22 -2
  326. package/dist/{worktree-2CXY6NEB.js → worktree-Z2G4CP4Z.js} +7 -7
  327. package/dist/{worktree-sweep-K3CJFSUL.js → worktree-sweep-LWSCAZW6.js} +8 -8
  328. package/package.json +2 -2
  329. package/release-notes.json +56 -113
  330. package/stack.release.json +7 -7
  331. package/dist/memory-queue-client-HLURQEV6.js +0 -16
  332. /package/dist/{chunk-J3SR5MGG.js → chunk-GIS4GBZE.js} +0 -0
  333. /package/dist/{chunk-AE74NOE6.js → chunk-NAPBIDGH.js} +0 -0
  334. /package/dist/{chunk-I3DPCSDG.js → chunk-OJS2H5HR.js} +0 -0
  335. /package/dist/{chunk-K4BKJJ4F.js → chunk-PCRRDXGL.js} +0 -0
  336. /package/dist/{chunk-MQCTK6EF.js → chunk-RRYJTPVW.js} +0 -0
  337. /package/dist/{chunk-2NS3QRMJ.js → chunk-ZIVUMDHA.js} +0 -0
  338. /package/dist/{core-memory-OC5ITKKV.js → core-memory-4JWCAGJI.js} +0 -0
  339. /package/dist/{entity-boost-NF3LE6OJ.js → entity-boost-AU342QRK.js} +0 -0
  340. /package/dist/{message-queue-client-4VDU6BZY.js → message-queue-client-IXYLJJVJ.js} +0 -0
  341. /package/dist/{oauth-server-EWUL7DMD.js → oauth-server-F4QWESK2.js} +0 -0
  342. /package/dist/{webhook-pipe-DHIGZHPW.js → webhook-pipe-S4CWK6H5.js} +0 -0
  343. /package/dist/{wiki-acl-CONNF6ES.js → wiki-acl-6GZHUA44.js} +0 -0
  344. /package/dist/{wiki-client-N6PT5P7W.js → wiki-client-CIJXRMKL.js} +0 -0
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  loadPreferences
3
- } from "./chunk-VDYUKTNS.js";
3
+ } from "./chunk-CLAYNAXC.js";
4
4
  import {
5
5
  buildClaudeHttpMcpEntry
6
- } from "./chunk-JZW5AOWI.js";
6
+ } from "./chunk-BSPALHIR.js";
7
7
  import {
8
8
  EXE_HOOKS,
9
9
  isLegacyHomeDirHookCommand,
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-L3TB7CC3.js";
12
12
  import {
13
13
  ensureAllAgentSymlinks
14
- } from "./chunk-NIZQ3CIS.js";
14
+ } from "./chunk-3AMGSCRH.js";
15
15
  import {
16
16
  MCP_LEGACY_KEY,
17
17
  MCP_PRIMARY_KEY
@@ -40,7 +40,8 @@ function extractSemanticText(toolName, toolInput, toolResponse) {
40
40
  extracted = extractDefault(toolName, toolInput, toolResponse);
41
41
  }
42
42
  }
43
- return redactSecrets(extracted).text;
43
+ const sanitized = redactSecrets(extracted).text;
44
+ return sanitized.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])/g, "\uFFFD").replace(/(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g, "\uFFFD");
44
45
  }
45
46
  function findContainingChunk(filePath, snippet) {
46
47
  try {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  extractSemanticText
3
- } from "./chunk-VT2B5BHM.js";
3
+ } from "./chunk-JBSCL2XT.js";
4
4
  import {
5
5
  detectError
6
6
  } from "./chunk-AHMUF6RO.js";
@@ -3,15 +3,15 @@ import {
3
3
  getClient,
4
4
  isInitialized,
5
5
  loadEmployees
6
- } from "./chunk-SCYWCWKY.js";
6
+ } from "./chunk-VG4ZH2Z3.js";
7
7
  import {
8
8
  PLAN_LIMITS,
9
9
  checkLicense,
10
10
  isFeatureAllowed
11
- } from "./chunk-JV225JBX.js";
11
+ } from "./chunk-I6RHLHVW.js";
12
12
  import {
13
13
  EXE_AI_DIR
14
- } from "./chunk-DFIOOK5R.js";
14
+ } from "./chunk-WCES22KG.js";
15
15
 
16
16
  // src/lib/plan-limits.ts
17
17
  import { readFileSync, existsSync } from "fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  loadLicense
3
- } from "./chunk-JV225JBX.js";
3
+ } from "./chunk-I6RHLHVW.js";
4
4
 
5
5
  // src/lib/stack-update.ts
6
6
  import { execFileSync, spawnSync } from "child_process";
@@ -93,6 +93,37 @@ function parseComposeDependsOn(composeRaw) {
93
93
  }
94
94
  return deps;
95
95
  }
96
+ function parseComposeServiceNames(composeRaw) {
97
+ const names = /* @__PURE__ */ new Set();
98
+ for (const line of composeRaw.split(/\r?\n/)) {
99
+ if (!line.trim() || line.trim().startsWith("#")) continue;
100
+ const indent = line.length - line.trimStart().length;
101
+ const trimmed = line.trim();
102
+ if (indent === 2 && /^[a-zA-Z0-9_-]+:\s*$/.test(trimmed)) {
103
+ names.add(trimmed.replace(/:.*$/, ""));
104
+ }
105
+ }
106
+ return names;
107
+ }
108
+ function isUsableTunnelToken(value) {
109
+ const v = (value ?? "").trim();
110
+ if (v === "") return false;
111
+ if (/CHANGEME/i.test(v)) return false;
112
+ return true;
113
+ }
114
+ function isCloudflaredTunnelMisconfigured(composeFile, envFile) {
115
+ if (!existsSync(composeFile)) return false;
116
+ const composeRaw = readFileSync(composeFile, "utf8");
117
+ if (!parseComposeServiceNames(composeRaw).has("cloudflared")) return false;
118
+ const token = existsSync(envFile) ? parseEnv(readFileSync(envFile, "utf8")).get("CLOUDFLARE_TUNNEL_TOKEN") : void 0;
119
+ if (isUsableTunnelToken(token)) return false;
120
+ const configYml = path.join(path.dirname(composeFile), "cloudflared", "config.yml");
121
+ if (existsSync(configYml)) {
122
+ const cfg = readFileSync(configYml, "utf8");
123
+ if (/\btunnel\s*:/i.test(cfg) || /credentials[-_]file\s*:/i.test(cfg)) return false;
124
+ }
125
+ return true;
126
+ }
96
127
  function resolveTransitiveDeps(selected, depsMap) {
97
128
  const resolved = new Set(selected);
98
129
  const queue = [...selected];
@@ -287,10 +318,9 @@ async function rollbackStackUpdate(options) {
287
318
  const rollbackEnvRaw = readFileSync(rollbackEnv, "utf8");
288
319
  if (scopedServiceNames.length > 0 && lockData?.services) {
289
320
  const rollbackEnvMap = parseEnv(rollbackEnvRaw);
290
- const scopedUpdates = Object.fromEntries(scopedServiceNames.map((serviceName) => {
291
- const key = lockData.services[serviceName].env;
292
- return [key, rollbackEnvMap.get(key) ?? ""];
293
- }));
321
+ const scopedUpdates = Object.fromEntries(
322
+ scopedServiceNames.map((serviceName) => lockData.services[serviceName].env).filter((key) => Boolean(key)).map((key) => [key, rollbackEnvMap.get(key) ?? ""])
323
+ );
294
324
  console.log(`[stack-update] Restoring env keys for service ${scopedServiceNames.join(", ")} from ${rollbackEnv}`);
295
325
  writeSecretFile(options.envFile, patchEnv(readFileSync(options.envFile, "utf8"), scopedUpdates));
296
326
  } else {
@@ -442,7 +472,7 @@ function buildInitialServiceStatus(plan, envRaw, now, activeServices) {
442
472
  service: serviceName,
443
473
  image: service.image,
444
474
  env: service.env,
445
- before: env.get(service.env),
475
+ before: service.env ? env.get(service.env) : void 0,
446
476
  after: service.image,
447
477
  status: activeServices && !activeServices.has(serviceName) ? "skipped" : "pending",
448
478
  error: activeServices && !activeServices.has(serviceName) ? "not selected for this service-scoped update" : void 0,
@@ -468,6 +498,11 @@ function incompleteServicesFromLock(lockFile) {
468
498
  const serviceStatus = lock?.serviceStatus ?? {};
469
499
  return Object.entries(serviceStatus).filter(([, status]) => status.status !== "completed" && status.status !== "skipped").map(([service]) => service);
470
500
  }
501
+ function sanitizeImageRef(image) {
502
+ let ref = image.trim().replace(/^['"]|['"]$/g, "");
503
+ ref = ref.replace(/:([^:@/]+):(v\d)/, ":$2");
504
+ return ref;
505
+ }
471
506
  function parseStackManifest(raw, publicKey) {
472
507
  const parsedRaw = JSON.parse(raw);
473
508
  const parsed = isSignedEnvelope(parsedRaw) ? { ...parsedRaw.manifest, signature: parsedRaw.signature } : parsedRaw;
@@ -482,9 +517,10 @@ function parseStackManifest(raw, publicKey) {
482
517
  throw new Error(`Invalid stack manifest: release ${version} has no services`);
483
518
  }
484
519
  for (const [serviceName, service] of Object.entries(release.services)) {
485
- if (!service.image || !service.env) {
486
- throw new Error(`Invalid stack manifest: ${version}.${serviceName} requires image and env`);
520
+ if (!service.image) {
521
+ throw new Error(`Invalid stack manifest: ${version}.${serviceName} requires image`);
487
522
  }
523
+ service.image = sanitizeImageRef(service.image);
488
524
  }
489
525
  }
490
526
  return parsed;
@@ -629,6 +665,7 @@ function createStackUpdatePlan(manifest, envRaw, targetVersion, serviceNames, se
629
665
  const env = parseEnv(envRaw);
630
666
  const changes = [];
631
667
  for (const [serviceName, service] of Object.entries(release.services)) {
668
+ if (!service.env) continue;
632
669
  const before = env.get(service.env);
633
670
  if (before !== service.image) {
634
671
  changes.push({ key: service.env, before, after: service.image, service: serviceName });
@@ -684,6 +721,39 @@ function classifyAskExeImage(image, label, strictDigest) {
684
721
  }
685
722
  return null;
686
723
  }
724
+ function classifyManifestImage(image, label, strictDigest, serviceCategory) {
725
+ const trimmed = image.trim().replace(/^['"]|['"]$/g, "");
726
+ if (!trimmed) return { kind: "manifest-image", message: `${label} is empty`, severity: "error" };
727
+ if (trimmed.includes("${")) return null;
728
+ if (trimmed.startsWith("ghcr.io/askexe/") || trimmed.startsWith("update.askexe.com/askexe/")) {
729
+ return classifyAskExeImage(trimmed, label, strictDigest);
730
+ }
731
+ if (OFFICIAL_COMPOSE_IMAGE.test(trimmed)) {
732
+ if (isMutableTag(imageTag(trimmed)) && !IMAGE_DIGEST.test(trimmed)) {
733
+ return {
734
+ kind: "manifest-image",
735
+ message: `${label} uses a mutable tag (${trimmed}); pin a version tag or @sha256: digest for the infra image`,
736
+ severity: strictDigest ? "error" : "warn"
737
+ };
738
+ }
739
+ return null;
740
+ }
741
+ if (serviceCategory === "infra") {
742
+ if (isMutableTag(imageTag(trimmed)) && !IMAGE_DIGEST.test(trimmed)) {
743
+ return {
744
+ kind: "manifest-image",
745
+ message: `${label} uses a mutable tag (${trimmed}); pin a version tag or @sha256: digest for the infra image`,
746
+ severity: "warn"
747
+ };
748
+ }
749
+ return null;
750
+ }
751
+ return {
752
+ kind: "manifest-image",
753
+ message: `${label} uses unsupported image ${trimmed}; AskExe app images must come from ghcr.io/askexe or update.askexe.com/askexe, and third-party infra must be a recognised official image`,
754
+ severity: "error"
755
+ };
756
+ }
687
757
  function validateComposeImageLiteral(image, label, strictDigest = false) {
688
758
  const trimmed = image.trim().replace(/^['"]|['"]$/g, "");
689
759
  if (!trimmed) return { kind: "compose-image", message: `${label} is empty`, severity: "error" };
@@ -724,11 +794,11 @@ function collectProductionDeployGateIssues(plan, envRaw, composeRaw, options = {
724
794
  const issues = [];
725
795
  const env = parseEnv(envRaw);
726
796
  for (const [serviceName, service] of Object.entries(plan.release.services)) {
727
- const manifestIssue = classifyAskExeImage(service.image, `manifest ${plan.targetVersion}.${serviceName}.image`, strictDigest);
797
+ const manifestIssue = classifyManifestImage(service.image, `manifest ${plan.targetVersion}.${serviceName}.image`, strictDigest, service.category);
728
798
  if (manifestIssue) issues.push({ ...manifestIssue, kind: "manifest-image" });
729
- const envImage = env.get(service.env);
799
+ const envImage = service.env ? env.get(service.env) : void 0;
730
800
  if (envImage) {
731
- const envIssue = classifyAskExeImage(envImage, `env ${service.env}`, strictDigest);
801
+ const envIssue = classifyManifestImage(envImage, `env ${service.env}`, strictDigest, service.category);
732
802
  if (envIssue) issues.push({ ...envIssue, kind: "env-image" });
733
803
  }
734
804
  }
@@ -761,38 +831,59 @@ function collectImageAvailabilityIssues(plan) {
761
831
  const image = service.image;
762
832
  if (checked.has(image)) continue;
763
833
  checked.add(image);
764
- try {
765
- const result = spawnSync("docker", ["manifest", "inspect", image, "--verbose"], {
766
- stdio: ["ignore", "pipe", "pipe"],
767
- timeout: 3e4
768
- });
769
- if (result.status !== 0) {
770
- const stderr = result.stderr?.toString().trim() ?? "";
771
- issues.push({
772
- kind: "image-not-pullable",
773
- message: `${serviceName} image ${image} not found on registry. ${stderr.slice(0, 200)}`
774
- });
775
- continue;
776
- }
777
- const output = result.stdout?.toString() ?? "";
834
+ const isProxyImage = image.startsWith("update.askexe.com/");
835
+ const maxAttempts = isProxyImage ? 3 : 1;
836
+ const baseDelayMs = 2e3;
837
+ let lastStderr = "";
838
+ let inspected = false;
839
+ let inspectOutput = "";
840
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
778
841
  try {
779
- const parsed = JSON.parse(output);
780
- const manifests = Array.isArray(parsed) ? parsed : [parsed];
781
- const hasAmd64 = manifests.some((m) => {
782
- const platform = m.platform;
783
- return platform?.architecture === "amd64" && platform?.os === "linux";
842
+ const result = spawnSync("docker", ["manifest", "inspect", image, "--verbose"], {
843
+ stdio: ["ignore", "pipe", "pipe"],
844
+ timeout: 3e4
784
845
  });
785
- if (!hasAmd64 && manifests.length > 0 && manifests[0]?.platform) {
786
- const platforms = manifests.map((m) => {
787
- const p = m.platform;
788
- return `${p?.os ?? "?"}/${p?.architecture ?? "?"}`;
789
- }).join(", ");
790
- issues.push({
791
- kind: "platform-mismatch",
792
- message: `${serviceName} image ${image} has no linux/amd64 manifest (available: ${platforms}). Rebuild with: docker buildx build --platform linux/amd64 --push`
793
- });
846
+ if (result.status === 0) {
847
+ inspected = true;
848
+ inspectOutput = result.stdout?.toString() ?? "";
849
+ break;
850
+ }
851
+ lastStderr = result.stderr?.toString().trim() ?? "";
852
+ if (attempt < maxAttempts) {
853
+ const delayMs = baseDelayMs * Math.pow(2, attempt - 1);
854
+ console.log(
855
+ `[stack-update] Image ${image} not yet available on proxy (attempt ${attempt}/${maxAttempts}), retrying in ${delayMs / 1e3}s\u2026 (bug d11c9809)`
856
+ );
857
+ spawnSync("sleep", [String(delayMs / 1e3)], { stdio: "ignore" });
794
858
  }
795
859
  } catch {
860
+ inspected = true;
861
+ break;
862
+ }
863
+ }
864
+ if (!inspected) {
865
+ issues.push({
866
+ kind: "image-not-pullable",
867
+ message: `${serviceName} image ${image} not found on registry after ${maxAttempts} attempt(s). ${lastStderr.slice(0, 200)}`
868
+ });
869
+ continue;
870
+ }
871
+ try {
872
+ const parsed = JSON.parse(inspectOutput);
873
+ const manifests = Array.isArray(parsed) ? parsed : [parsed];
874
+ const hasAmd64 = manifests.some((m) => {
875
+ const platform = m.platform;
876
+ return platform?.architecture === "amd64" && platform?.os === "linux";
877
+ });
878
+ if (!hasAmd64 && manifests.length > 0 && manifests[0]?.platform) {
879
+ const platforms = manifests.map((m) => {
880
+ const p = m.platform;
881
+ return `${p?.os ?? "?"}/${p?.architecture ?? "?"}`;
882
+ }).join(", ");
883
+ issues.push({
884
+ kind: "platform-mismatch",
885
+ message: `${serviceName} image ${image} has no linux/amd64 manifest (available: ${platforms}). Rebuild with: docker buildx build --platform linux/amd64 --push`
886
+ });
796
887
  }
797
888
  } catch {
798
889
  }
@@ -1249,6 +1340,10 @@ function bootstrapStackHost(options) {
1249
1340
  envHadPlaceholders,
1250
1341
  envRemainingPlaceholders,
1251
1342
  licensePresent: !!(options.licenseKey || process.env.EXE_LICENSE_KEY || loadLicense()),
1343
+ // bug 820c6473: evaluated AFTER hydration (which deliberately skips the
1344
+ // tunnel token) so a missing/placeholder CLOUDFLARE_TUNNEL_TOKEN with the
1345
+ // cloudflared service present is caught as a hard blocker downstream.
1346
+ cloudflaredTunnelMisconfigured: isCloudflaredTunnelMisconfigured(options.composeFile, options.envFile),
1252
1347
  createdFiles,
1253
1348
  actions
1254
1349
  };
@@ -1262,6 +1357,11 @@ function assertHostReadyForApply(report) {
1262
1357
  if (!report.licensePresent) blockers.push("Exe OS license key is missing. Run `exe-os setup`, `exe-os --activate <key>`, or pass --license-key.");
1263
1358
  const hardPlaceholders = report.envRemainingPlaceholders.filter((p) => !/WHATSAPP|API_ROUTER|MONITOR_AGENT|MONITOR_HUB_ADMIN|CLOUDFLARE_TUNNEL_TOKEN/.test(p));
1264
1359
  if (hardPlaceholders.length > 0) blockers.push(`Required .env placeholders remain: ${hardPlaceholders.join(", ")}`);
1360
+ if (report.cloudflaredTunnelMisconfigured) {
1361
+ blockers.push(
1362
+ "Cloudflare tunnel is required (cloudflared service is in docker-compose) but CLOUDFLARE_TUNNEL_TOKEN is missing/empty/placeholder. Create a tunnel in the Cloudflare dashboard, copy the token, and set CLOUDFLARE_TUNNEL_TOKEN in .env (or use advanced config-file mode: leave the token empty and populate cloudflared/config.yml)."
1363
+ );
1364
+ }
1265
1365
  if (blockers.length > 0) throw new Error(`Stack host is not ready:
1266
1366
  - ${blockers.join("\n- ")}`);
1267
1367
  }
@@ -1863,6 +1963,23 @@ ${lines.join("\n")}`
1863
1963
  (options.dockerLogin ?? defaultDockerLogin)(creds);
1864
1964
  registryForLogout = creds.registry;
1865
1965
  }
1966
+ const runImageAvailabilityCheck = !options.skipImageAvailabilityCheck && !options.exec;
1967
+ if (runImageAvailabilityCheck) {
1968
+ const availabilityIssues = collectImageAvailabilityIssues(plan);
1969
+ if (availabilityIssues.length > 0) {
1970
+ const details = availabilityIssues.map((i) => `- [${i.kind}] ${i.message}`).join("\n");
1971
+ if (options.breakGlassReason?.trim()) {
1972
+ console.warn(`[stack-update] BREAK-GLASS: proceeding past image availability issues:
1973
+ ${details}`);
1974
+ } else {
1975
+ throw new Error(
1976
+ `Pre-deploy image availability check failed \u2014 aborting before any container swap.
1977
+ ${details}
1978
+ Push the missing image(s) to the registry, or re-run with --break-glass <reason> to override.`
1979
+ );
1980
+ }
1981
+ }
1982
+ }
1866
1983
  const imagesToPull = manifestImagesForPull(plan.release);
1867
1984
  const allServiceNames = Object.keys(plan.release.services);
1868
1985
  const progress = new ProgressReporter(allServiceNames);
@@ -2601,6 +2718,9 @@ export {
2601
2718
  loadServiceSelection,
2602
2719
  saveServiceSelection,
2603
2720
  parseComposeDependsOn,
2721
+ parseComposeServiceNames,
2722
+ isUsableTunnelToken,
2723
+ isCloudflaredTunnelMisconfigured,
2604
2724
  resolveTransitiveDeps,
2605
2725
  filterServicesBySelection,
2606
2726
  buildDefaultServiceSelection,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  loadConfig,
3
3
  saveConfig
4
- } from "./chunk-DFIOOK5R.js";
4
+ } from "./chunk-WCES22KG.js";
5
5
 
6
6
  // src/lib/orchestration-phase.ts
7
7
  var ORCHESTRATION_PHASES = [
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isCoordinatorRole
3
- } from "./chunk-SCYWCWKY.js";
3
+ } from "./chunk-VG4ZH2Z3.js";
4
4
 
5
5
  // src/lib/task-router.ts
6
6
  import { randomUUID } from "crypto";
@@ -54,8 +54,11 @@ function resolveHookSearchEnabled(env, config, sentinelPath = EMBEDDINGS_SENTINE
54
54
  }
55
55
 
56
56
  export {
57
+ EXE_AI_DIR,
57
58
  EMBEDDINGS_SENTINEL_PATH,
59
+ parseEmbeddingsEnv,
58
60
  readSentinel,
61
+ deriveFromLegacyConfig,
59
62
  resolveEmbeddingsEnabled,
60
63
  setEmbeddingsEnabled,
61
64
  resolveHookSearchEnabled
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  recordOrchestrationEventBestEffort
3
- } from "./chunk-OR3TAZL3.js";
3
+ } from "./chunk-P4ULFI2N.js";
4
4
 
5
5
  // src/lib/worktree.ts
6
6
  import { execSync } from "child_process";
@@ -2,7 +2,7 @@ import {
2
2
  ensureWorktree,
3
3
  getGitRoot,
4
4
  isWorktreeDirty
5
- } from "./chunk-RZJ6DXVE.js";
5
+ } from "./chunk-L6QI2NNG.js";
6
6
  import {
7
7
  buildTaskResult,
8
8
  serializeMessage
@@ -16,7 +16,7 @@ import {
16
16
  } from "./chunk-E23LNUWJ.js";
17
17
  import {
18
18
  registerSession
19
- } from "./chunk-WJ2PZGRV.js";
19
+ } from "./chunk-ZAA344BL.js";
20
20
  import {
21
21
  listTmuxSessions
22
22
  } from "./chunk-SSTLTIF3.js";
@@ -25,18 +25,18 @@ import {
25
25
  } from "./chunk-KOO3J5PV.js";
26
26
  import {
27
27
  recordOrchestrationEventBestEffort
28
- } from "./chunk-OR3TAZL3.js";
28
+ } from "./chunk-P4ULFI2N.js";
29
29
  import {
30
30
  getAgentRuntime,
31
31
  normalizeCcModelName
32
- } from "./chunk-QB5JOGPK.js";
32
+ } from "./chunk-2PI6JBJL.js";
33
33
  import {
34
34
  RUNTIME_TABLE
35
35
  } from "./chunk-NGP6LSV2.js";
36
36
  import {
37
37
  PlanLimitError,
38
38
  assertEmployeeLimitSync
39
- } from "./chunk-XYG722JW.js";
39
+ } from "./chunk-JIJKUZIO.js";
40
40
  import {
41
41
  getSessionKey
42
42
  } from "./chunk-CVYC6DUW.js";
@@ -51,7 +51,7 @@ import {
51
51
  } from "./chunk-MP2AFCGL.js";
52
52
  import {
53
53
  ensureAgentSymlink
54
- } from "./chunk-NIZQ3CIS.js";
54
+ } from "./chunk-3AMGSCRH.js";
55
55
  import {
56
56
  expandDualPrefixTools
57
57
  } from "./chunk-HYZV25LY.js";
@@ -62,18 +62,19 @@ import {
62
62
  getEmployee,
63
63
  isCoordinatorName,
64
64
  loadEmployees,
65
- loadEmployeesSync
66
- } from "./chunk-SCYWCWKY.js";
65
+ loadEmployeesSync,
66
+ offloadReadIfMain
67
+ } from "./chunk-VG4ZH2Z3.js";
67
68
  import {
68
69
  loadDeviceId
69
- } from "./chunk-JV225JBX.js";
70
+ } from "./chunk-I6RHLHVW.js";
70
71
  import {
71
72
  EXE_AI_DIR
72
- } from "./chunk-DFIOOK5R.js";
73
+ } from "./chunk-WCES22KG.js";
73
74
  import {
74
75
  atomicWriteJsonSync,
75
76
  atomicWriteSync
76
- } from "./chunk-65DBIEM2.js";
77
+ } from "./chunk-SHIICYJW.js";
77
78
 
78
79
  // src/lib/tmux-routing.ts
79
80
  import { execFile, execFileSync as execFileSync2 } from "child_process";
@@ -673,7 +674,7 @@ async function createTaskCore(input) {
673
674
  if (isCoordinatorSession) {
674
675
  earlySessionScope = resolved;
675
676
  } else {
676
- const { getSessionProject } = await import("./session-scope-JGDYAMJO.js");
677
+ const { getSessionProject } = await import("./session-scope-JTPHECAU.js");
677
678
  const sessionProject = getSessionProject(resolved);
678
679
  if (sessionProject && sessionProject !== input.projectName) {
679
680
  scopeMismatchWarning = `session/project mismatch: session "${resolved}" owns "${sessionProject}" but task targets "${input.projectName}". Routed to default scope.`;
@@ -922,7 +923,7 @@ async function queryTaskRows(opts) {
922
923
  }
923
924
  if (opts.founderId !== null) {
924
925
  try {
925
- const { founderScopeFilter } = await import("./founder-context-QCTMEK66.js");
926
+ const { founderScopeFilter } = await import("./founder-context-A4VUEKDH.js");
926
927
  const founderFilter = founderScopeFilter(opts.founderId);
927
928
  const cleaned = founderFilter.sql.replace(/^\s*AND\s+/, "");
928
929
  conditions.push(cleaned);
@@ -940,10 +941,12 @@ async function queryTaskRows(opts) {
940
941
  const cols = opts.columns ?? "*";
941
942
  const order = opts.orderBy ?? "priority ASC, created_at DESC";
942
943
  const limit = opts.limit ?? 100;
943
- const result = await client.execute({
944
- sql: `SELECT ${cols} FROM tasks ${where} ORDER BY ${order} LIMIT ?`,
945
- args: [...args, limit]
946
- });
944
+ const result = await offloadReadIfMain(
945
+ client,
946
+ `SELECT ${cols} FROM tasks ${where} ORDER BY ${order} LIMIT ?`,
947
+ [...args, limit],
948
+ true
949
+ );
947
950
  return result.rows;
948
951
  }
949
952
  function getProjectNameSafe() {
@@ -1104,9 +1107,10 @@ async function updateTaskStatus(input) {
1104
1107
  if (input.status === "done") {
1105
1108
  input.status = "needs_review";
1106
1109
  }
1107
- const isReviewTransition = requestedStatus === "done" && input.status === "needs_review" && (previousStatus === "open" || previousStatus === "in_progress");
1108
- if (isReviewTransition && row.reviewer) {
1109
- const reviewer = String(row.reviewer);
1110
+ const isReviewTransition = input.status === "needs_review" && previousStatus !== "needs_review" && (previousStatus === "open" || previousStatus === "in_progress");
1111
+ const effectiveReviewer = row.reviewer ? String(row.reviewer) : row.assigned_by ? String(row.assigned_by) : "";
1112
+ if (isReviewTransition && effectiveReviewer) {
1113
+ const reviewer = effectiveReviewer;
1110
1114
  try {
1111
1115
  const { sendIntercom: sendIntercom2, employeeSessionName: employeeSessionName2, resolveExeSession: resolveExeSession2, isExeSession: isExeSession2 } = await import("./lib/tmux-routing.js");
1112
1116
  const exeSession = row.session_scope ? String(row.session_scope) : resolveExeSession2();
@@ -1154,7 +1158,7 @@ async function updateTaskStatus(input) {
1154
1158
  } catch {
1155
1159
  }
1156
1160
  try {
1157
- const { writeNotification: writeNotification2 } = await import("./notifications-UP7WQGG4.js");
1161
+ const { writeNotification: writeNotification2 } = await import("./notifications-Q5NEAP6K.js");
1158
1162
  await writeNotification2({
1159
1163
  agentId: reviewer,
1160
1164
  agentRole: isCoordinatorName(reviewer) ? "COO" : "manager",
@@ -1574,7 +1578,7 @@ ${input.result ?? ""}`;
1574
1578
  }
1575
1579
  if (shouldWriteCompletionMemory && input.result) {
1576
1580
  try {
1577
- const { writeMemoryViaDaemon } = await import("./memory-queue-client-HLURQEV6.js");
1581
+ const { writeMemoryViaDaemon } = await import("./memory-queue-client-YP2QKX6J.js");
1578
1582
  await writeMemoryViaDaemon({
1579
1583
  raw_text: input.result,
1580
1584
  agent_id: String(row.assigned_to),
@@ -1677,7 +1681,7 @@ ${input.result ?? ""}`;
1677
1681
  }
1678
1682
  if (input.status === "done" || input.status === "needs_review") {
1679
1683
  try {
1680
- const { incrementSkillSuccess } = await import("./skill-refinement-DUOO6B7V.js");
1684
+ const { incrementSkillSuccess } = await import("./skill-refinement-VTYL4OMJ.js");
1681
1685
  await incrementSkillSuccess(
1682
1686
  String(row.assigned_to),
1683
1687
  row.project_name ? String(row.project_name) : null
@@ -2836,7 +2840,7 @@ function formatIntercomPrompt(reason = "nudge") {
2836
2840
  case "completion":
2837
2841
  return "An employee completed work. Run task(action='list', status='needs_review') to review it.";
2838
2842
  case "message":
2839
- return "You have a new message. Run message(action='acknowledge') after reading it, and check task(action='list') only if the message references work.";
2843
+ return "Check your inbox for new messages. Run message(action='read') to check, and message(action='acknowledge') after reading. Only check task(action='list') if a message references work.";
2840
2844
  case "notification":
2841
2845
  return "You have pending notifications. Run task(action='list', status='needs_review') and task(action='list', status='open') to check actionable work.";
2842
2846
  case "signal":
@@ -3014,6 +3018,7 @@ function isRootSession(name) {
3014
3018
  }
3015
3019
  var VALID_SESSION_NAME = /^[a-z]+\d*-[a-zA-Z0-9_]+$/;
3016
3020
  function employeeSessionName(employee, exeSession, instance) {
3021
+ employee = employee.toLowerCase();
3017
3022
  if (!isRootSession(exeSession)) {
3018
3023
  const root = extractRootExe(exeSession);
3019
3024
  if (root) {
@@ -3315,7 +3320,7 @@ async function verifyPaneAtCapacity(sessionName) {
3315
3320
  reason: `capture-pane failed: ${err instanceof Error ? err.message : String(err)}`
3316
3321
  };
3317
3322
  }
3318
- const { isAtCapacity } = await import("./capacity-monitor-BUKYPSWR.js");
3323
+ const { isAtCapacity } = await import("./capacity-monitor-ZRLW7TVL.js");
3319
3324
  if (!isAtCapacity(pane)) {
3320
3325
  return {
3321
3326
  atCapacity: false,
@@ -3780,6 +3785,7 @@ async function ensureWorktreeAsync(projectDir, employeeName, instance) {
3780
3785
  }
3781
3786
  }
3782
3787
  function ensureEmployee(employeeName, exeSession, projectDir, opts) {
3788
+ employeeName = employeeName.toLowerCase();
3783
3789
  if (isCoordinatorName(employeeName)) {
3784
3790
  return { status: "failed", sessionName: "", error: "The coordinator is not a dispatchable employee" };
3785
3791
  }
@@ -3874,7 +3880,7 @@ function ensureEmployee(employeeName, exeSession, projectDir, opts) {
3874
3880
  return { status: "failed", sessionName, error: "intercom delivery failed" };
3875
3881
  }
3876
3882
  const spawnOpts = { ...opts, instance: effectiveInstance };
3877
- if (!spawnOpts.cwd && process.env.EXE_IS_DAEMON !== "1") {
3883
+ if (!spawnOpts.cwd) {
3878
3884
  const COORDINATOR_ROLES = /* @__PURE__ */ new Set(["COO", "CTO", "CMO"]);
3879
3885
  try {
3880
3886
  const roster = loadEmployeesSync();
@@ -3965,13 +3971,21 @@ async function ensureEmployeeAsync(employeeName, exeSession, projectDir, opts) {
3965
3971
  const wtPath = await ensureWorktreeAsync(projectDir, employeeName, asyncOpts.instance);
3966
3972
  if (wtPath) asyncOpts.cwd = wtPath;
3967
3973
  }
3968
- } catch {
3974
+ } catch (err) {
3975
+ process.stderr.write(
3976
+ `[ensureEmployeeAsync] worktree setup failed for ${employeeName}: ${err instanceof Error ? err.message : String(err)}
3977
+ `
3978
+ );
3969
3979
  }
3970
3980
  }
3971
3981
  try {
3972
3982
  const sessionName = employeeSessionName(employeeName, exeSession, asyncOpts.instance);
3973
3983
  await exportBehaviorsAsync(employeeName, path7.basename(asyncOpts.cwd ?? projectDir), sessionName);
3974
- } catch {
3984
+ } catch (err) {
3985
+ process.stderr.write(
3986
+ `[ensureEmployeeAsync] behavior export failed for ${employeeName}: ${err instanceof Error ? err.message : String(err)}
3987
+ `
3988
+ );
3975
3989
  }
3976
3990
  const result = ensureEmployee(employeeName, exeSession, projectDir, asyncOpts);
3977
3991
  if (asyncOpts.spawnLockHeld && result.status === "failed" && result.sessionName) {
@@ -4075,7 +4089,7 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
4075
4089
  );
4076
4090
  const isCodeRole = emp != null && !COORDINATOR_ROLES.has(emp.role);
4077
4091
  if (isCodeRole) {
4078
- const reason = opts?.cwd != null ? "preset_cwd" : process.env.EXE_IS_DAEMON === "1" ? "daemon_env" : "git_timeout";
4092
+ const reason = opts?.cwd != null ? "preset_cwd" : "git_timeout";
4079
4093
  process.stderr.write(
4080
4094
  `[tmux-routing] WORKTREE BYPASSED: code-role ${employeeName} (role=${emp.role}) spawning in MAIN checkout ${spawnCwd} (reason=${reason}) \u2014 commits will land on main
4081
4095
  `
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  storeBehavior
3
- } from "./chunk-PMEOSD6S.js";
3
+ } from "./chunk-24BUDF3J.js";
4
4
  import {
5
5
  getClient
6
- } from "./chunk-SCYWCWKY.js";
6
+ } from "./chunk-VG4ZH2Z3.js";
7
7
  import {
8
8
  loadConfig
9
- } from "./chunk-DFIOOK5R.js";
9
+ } from "./chunk-WCES22KG.js";
10
10
 
11
11
  // src/lib/skill-learning.ts
12
12
  import crypto from "crypto";
@@ -3,16 +3,16 @@ import {
3
3
  } from "./chunk-VUH67PT4.js";
4
4
  import {
5
5
  isGhostBehaviorRow
6
- } from "./chunk-PMEOSD6S.js";
6
+ } from "./chunk-24BUDF3J.js";
7
7
  import {
8
8
  getClient,
9
9
  getIdentity,
10
10
  listIdentities,
11
11
  updateIdentity
12
- } from "./chunk-SCYWCWKY.js";
12
+ } from "./chunk-VG4ZH2Z3.js";
13
13
  import {
14
14
  atomicWriteJsonSync
15
- } from "./chunk-65DBIEM2.js";
15
+ } from "./chunk-SHIICYJW.js";
16
16
 
17
17
  // src/lib/orchestration-package.ts
18
18
  import { randomUUID } from "crypto";