@askexenow/exe-os 0.9.410 → 0.9.412

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 (408) hide show
  1. package/delivery/catalog.json +29 -38
  2. package/deploy/compose/.env.customer.example +5 -5
  3. package/deploy/compose/.env.default +4 -4
  4. package/deploy/compose/.env.example +5 -5
  5. package/deploy/compose/docker-compose.yml +1 -1
  6. package/deploy/stack-manifests/v0.9.json +263 -2
  7. package/dist/.dist-verified.json +3 -3
  8. package/dist/{active-agent-2ELFTYNT.js → active-agent-3YCLS7GB.js} +4 -4
  9. package/dist/{active-agent-SS4SRXYZ.js → active-agent-MHWQDMML.js} +4 -4
  10. package/dist/{agent-defs-generator-6S2BSYCP.js → agent-defs-generator-DNXMO34I.js} +4 -4
  11. package/dist/{agentic-ontology-TJOAUAPD.js → agentic-ontology-RA6CMND6.js} +1 -1
  12. package/dist/{artifact-backup-STQQZDZ5.js → artifact-backup-EETHNFFP.js} +3 -3
  13. package/dist/{backfill-metadata-I2FVENKJ.js → backfill-metadata-WYT257VG.js} +7 -7
  14. package/dist/backup-verify-AG54CYGR.js +62 -0
  15. package/dist/{behavior-injection-CTSIKHTH.js → behavior-injection-G7GAUHGO.js} +10 -10
  16. package/dist/{behavior-promotion-NZMTTFHK.js → behavior-promotion-I2DIUFUR.js} +9 -9
  17. package/dist/{behaviors-RUNSC5WI.js → behaviors-SKVKPCRW.js} +8 -8
  18. package/dist/bin/agentic-ontology-backfill.js +8 -8
  19. package/dist/bin/agentic-reflection-backfill.js +9 -9
  20. package/dist/bin/agentic-semantic-label.js +8 -8
  21. package/dist/bin/backfill-conversations.js +7 -7
  22. package/dist/bin/backfill-responses.js +7 -7
  23. package/dist/bin/backfill-vectors.js +7 -7
  24. package/dist/bin/bulk-sync-postgres.js +16 -16
  25. package/dist/bin/cc-doctor.js +8 -8
  26. package/dist/bin/cleanup-stale-review-tasks.js +13 -13
  27. package/dist/bin/cli.js +24 -24
  28. package/dist/bin/deferred-daemon-restart.js +95 -95
  29. package/dist/bin/exe-actions.js +1 -1
  30. package/dist/bin/exe-agent-config.js +3 -3
  31. package/dist/bin/exe-agent.js +15 -15
  32. package/dist/bin/exe-assign.js +8 -8
  33. package/dist/bin/exe-boot.js +35 -35
  34. package/dist/bin/exe-call.js +9 -9
  35. package/dist/bin/exe-cloud.js +17 -17
  36. package/dist/bin/exe-config-dump.js +3 -3
  37. package/dist/bin/exe-dispatch.js +14 -14
  38. package/dist/bin/exe-doctor.js +5 -5
  39. package/dist/bin/exe-export-behaviors.js +12 -12
  40. package/dist/bin/exe-forget.js +10 -10
  41. package/dist/bin/exe-gateway.js +9 -9
  42. package/dist/bin/exe-grant.js +6 -6
  43. package/dist/bin/exe-healthcheck.js +8 -8
  44. package/dist/bin/exe-heartbeat.js +19 -19
  45. package/dist/bin/exe-kill.js +18 -18
  46. package/dist/bin/exe-launch-agent.js +75 -36
  47. package/dist/bin/exe-mcp.js +5 -5
  48. package/dist/bin/exe-memory-reads.js +7 -7
  49. package/dist/bin/exe-new-employee.js +11 -11
  50. package/dist/bin/exe-os-mcp-proxy.js +5 -5
  51. package/dist/bin/exe-pending-messages.js +14 -14
  52. package/dist/bin/exe-pending-notifications.js +13 -13
  53. package/dist/bin/exe-pending-reviews.js +14 -14
  54. package/dist/bin/exe-rename.js +7 -7
  55. package/dist/bin/exe-review.js +17 -17
  56. package/dist/bin/exe-search.js +9 -9
  57. package/dist/bin/exe-session-cleanup.js +18 -18
  58. package/dist/bin/exe-settings.js +16 -16
  59. package/dist/bin/exe-start-codex.js +37 -19
  60. package/dist/bin/exe-start-opencode.js +35 -17
  61. package/dist/bin/exe-status.js +15 -15
  62. package/dist/bin/exe-support.js +3 -3
  63. package/dist/bin/exe-team.js +5 -5
  64. package/dist/bin/git-sweep.js +15 -15
  65. package/dist/bin/graph-backfill.js +8 -8
  66. package/dist/bin/graph-export.js +8 -8
  67. package/dist/bin/hooks-cli.js +1 -1
  68. package/dist/bin/import-history.js +11 -11
  69. package/dist/bin/install.js +97 -97
  70. package/dist/bin/intercom-check.js +5 -5
  71. package/dist/bin/mcp-sessions.js +2 -2
  72. package/dist/bin/orchestration-metrics.js +5 -5
  73. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  74. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  75. package/dist/bin/pre-publish.js +1 -1
  76. package/dist/bin/reconcile-backlog.js +2 -2
  77. package/dist/bin/registry-proxy.js +1 -1
  78. package/dist/bin/repair-document-chunks.js +7 -7
  79. package/dist/bin/scan-tasks.js +14 -14
  80. package/dist/bin/setup.js +2 -2
  81. package/dist/bin/shard-migrate.js +8 -8
  82. package/dist/bin/stack-update.js +41 -16
  83. package/dist/bin/verify-stack.js +1 -1
  84. package/dist/bin/vps-health-gate.js +1 -1
  85. package/dist/{boot-generation-4W4CDJSX.js → boot-generation-RPJVFAQJ.js} +4 -4
  86. package/dist/{boot-review-sections-HJN25GMU.js → boot-review-sections-FOPPZTJI.js} +12 -12
  87. package/dist/{bug-landed-reconciler-GGQU6G2L.js → bug-landed-reconciler-FN5KPBRK.js} +6 -6
  88. package/dist/build-info.json +3 -3
  89. package/dist/build-manifest.json +936 -926
  90. package/dist/{capability-cards-EV7VHL3W.js → capability-cards-YQWBEG7A.js} +3 -3
  91. package/dist/{capacity-monitor-YO3WRSRY.js → capacity-monitor-7SMEJHYG.js} +14 -14
  92. package/dist/{catchup-brief-4XFFW3H2.js → catchup-brief-IBQ26LEB.js} +19 -19
  93. package/dist/{chunk-YJ7MCZSY.js → chunk-27NG2NTG.js} +2 -2
  94. package/dist/{chunk-2AXJRXA6.js → chunk-2BOLFLAU.js} +4 -2
  95. package/dist/{chunk-AGXV5HLA.js → chunk-2EYVXUGA.js} +4 -4
  96. package/dist/{chunk-2YZZR2BW.js → chunk-2YFMBXUU.js} +4 -4
  97. package/dist/{chunk-ZBXZFOIF.js → chunk-2YGBJHC2.js} +3 -3
  98. package/dist/{chunk-I35OMCL3.js → chunk-353XF4LU.js} +2 -2
  99. package/dist/{chunk-UF5BDAF6.js → chunk-3DXAJVXE.js} +6 -6
  100. package/dist/{chunk-AEOB4JCJ.js → chunk-3GGMHSY2.js} +3 -3
  101. package/dist/{chunk-K6XWIJN7.js → chunk-3N24FV22.js} +1 -1
  102. package/dist/{chunk-7WCYJXOF.js → chunk-47YGEM4N.js} +1 -1
  103. package/dist/{chunk-NVM3SKJ4.js → chunk-4CN3EE6U.js} +27 -21
  104. package/dist/{chunk-IQCC6WFI.js → chunk-4J77TCTX.js} +1 -1
  105. package/dist/{chunk-H5H2LGVE.js → chunk-5BWDUUMH.js} +3 -3
  106. package/dist/{chunk-O5RKAXCG.js → chunk-5DLZJ3MY.js} +1 -1
  107. package/dist/{chunk-E3ZO4EL3.js → chunk-5ZMNFSHV.js} +1 -1
  108. package/dist/{chunk-7QFRZT4H.js → chunk-657I6PUF.js} +3 -3
  109. package/dist/{chunk-IXRYS5X3.js → chunk-6777GNWI.js} +1 -1
  110. package/dist/{chunk-4THJIDJE.js → chunk-6BD6JYR2.js} +1 -1
  111. package/dist/{chunk-JTXXLNYD.js → chunk-6DMURUBY.js} +4 -4
  112. package/dist/{chunk-47UBJKS3.js → chunk-6HJF7IA3.js} +168 -205
  113. package/dist/{chunk-PONGX3YG.js → chunk-6J2J3VJS.js} +10 -10
  114. package/dist/{chunk-XBCIRNNU.js → chunk-6PXFF6IV.js} +1 -1
  115. package/dist/{chunk-DWK5HEKY.js → chunk-7HLAYQRG.js} +4 -4
  116. package/dist/{chunk-RWM6TZH6.js → chunk-7KPZQ65I.js} +3 -3
  117. package/dist/{chunk-BPXWWD7P.js → chunk-7PDZBPGW.js} +1 -1
  118. package/dist/{chunk-2K7IKLBL.js → chunk-7SHU5MOD.js} +1 -1
  119. package/dist/{chunk-APKEGWFB.js → chunk-A5I2GYVQ.js} +3 -3
  120. package/dist/{chunk-X4V5ZLNX.js → chunk-A75TAU2I.js} +628 -4
  121. package/dist/{chunk-T7W75LII.js → chunk-BE3UETW6.js} +3 -3
  122. package/dist/{chunk-575FWHQJ.js → chunk-BG6RAOCJ.js} +63 -9
  123. package/dist/{chunk-YSDSQRE2.js → chunk-BIPTWAEO.js} +1 -1
  124. package/dist/{chunk-FYKEL2L6.js → chunk-BLTXAUP6.js} +2 -2
  125. package/dist/{chunk-ASA2UJDH.js → chunk-CFFSHBQF.js} +1 -1
  126. package/dist/{chunk-XCKTCOK3.js → chunk-CJ6CS2IH.js} +5 -5
  127. package/dist/{chunk-V7AID6MC.js → chunk-CRW63CDI.js} +1 -1
  128. package/dist/{chunk-B34RSIUP.js → chunk-CWHTUNJX.js} +2 -2
  129. package/dist/{chunk-HKAWEIB2.js → chunk-D6NZNUVH.js} +1 -1
  130. package/dist/{chunk-CEHGXPMO.js → chunk-DHLJZDWI.js} +4 -4
  131. package/dist/{chunk-FCX2XHIC.js → chunk-DWRULKB3.js} +2 -2
  132. package/dist/{chunk-KNEEOZWN.js → chunk-EOWJXCYC.js} +25 -7
  133. package/dist/{chunk-5BWN6A5E.js → chunk-EWDBWOCX.js} +1 -1
  134. package/dist/{chunk-IUAW7FVX.js → chunk-FPF2PJFK.js} +3 -3
  135. package/dist/{chunk-B55U5BKF.js → chunk-FSXMKIDO.js} +1 -1
  136. package/dist/{chunk-2A556FNI.js → chunk-FUDXITKX.js} +1 -1
  137. package/dist/{chunk-FZT7CBXB.js → chunk-FYV2CTKP.js} +1 -1
  138. package/dist/{chunk-R2ZHPVF2.js → chunk-GATAYYAF.js} +3 -3
  139. package/dist/{chunk-CKRZBQ2K.js → chunk-GHYHNHDL.js} +1 -1
  140. package/dist/{chunk-IHBYJG7N.js → chunk-GL5ZG72X.js} +1 -1
  141. package/dist/{chunk-WSYIQKZ6.js → chunk-GM4UEZDE.js} +20 -20
  142. package/dist/{chunk-QKHQTHE6.js → chunk-GZVFHFO3.js} +10 -135
  143. package/dist/{chunk-XC2KAJK4.js → chunk-HA6BIZ6L.js} +5 -5
  144. package/dist/chunk-HDQAVAV6.js +248 -0
  145. package/dist/{chunk-5Q64Q5ZD.js → chunk-HDV2V25K.js} +1 -1
  146. package/dist/{chunk-26CY4EAR.js → chunk-HTFM7ZDD.js} +2 -2
  147. package/dist/{chunk-NUEDA2US.js → chunk-HUHR5CKJ.js} +4 -4
  148. package/dist/{chunk-BIHPY7JW.js → chunk-IC2AONBH.js} +9 -9
  149. package/dist/{chunk-2YK5HP2B.js → chunk-IHAXXDBH.js} +3 -3
  150. package/dist/{chunk-5JHIAGZY.js → chunk-IPUDXR67.js} +1 -1
  151. package/dist/{chunk-BBTNF72N.js → chunk-J6U4ZR77.js} +2 -2
  152. package/dist/{chunk-2OIVIPU7.js → chunk-JAIZCE6W.js} +3 -3
  153. package/dist/{chunk-WLV27PAO.js → chunk-JGBYZTWH.js} +1 -1
  154. package/dist/{chunk-4XY33GRO.js → chunk-JJZZXEAN.js} +3 -3
  155. package/dist/{chunk-3UEDFBDE.js → chunk-JNULO6I5.js} +3 -3
  156. package/dist/{chunk-JZ23D5YF.js → chunk-JTJP4JK7.js} +3 -3
  157. package/dist/{chunk-JDZNGC4O.js → chunk-JW5NUXPN.js} +11 -11
  158. package/dist/{chunk-GGT6Y5AN.js → chunk-K2HIXAIF.js} +12 -12
  159. package/dist/{chunk-NYV4A5IG.js → chunk-KEDZRQI3.js} +2 -2
  160. package/dist/{chunk-S2DTXCV6.js → chunk-KN5GAVCG.js} +2 -2
  161. package/dist/{chunk-LBEBSXZA.js → chunk-L5JFVK5T.js} +4 -4
  162. package/dist/{chunk-HNJLAMD3.js → chunk-LBSCOP25.js} +1 -1
  163. package/dist/{chunk-FOZSHNET.js → chunk-LLZUL7M2.js} +1 -1
  164. package/dist/{chunk-53GNYXNR.js → chunk-LQGLGSBY.js} +2 -2
  165. package/dist/{chunk-X2EBM5BQ.js → chunk-LSHUX7P4.js} +16 -16
  166. package/dist/{chunk-AWTLUJZL.js → chunk-M6AX64J2.js} +2 -2
  167. package/dist/{chunk-7RVTQXST.js → chunk-M6SUJLNP.js} +2 -2
  168. package/dist/{chunk-OUUNFTS4.js → chunk-MZNLQC6W.js} +1 -1
  169. package/dist/{chunk-PCF4QMJS.js → chunk-N7POJZJT.js} +10 -10
  170. package/dist/{chunk-2CG3LHI6.js → chunk-NCNT2C2P.js} +2 -2
  171. package/dist/{chunk-R3N5BCMM.js → chunk-O3BLL6MY.js} +1 -1
  172. package/dist/{chunk-SLG3T26A.js → chunk-O6KQAJCC.js} +3 -3
  173. package/dist/{chunk-2WOHFX4Z.js → chunk-OHHZNNUD.js} +1 -1
  174. package/dist/{chunk-HWP3WCLC.js → chunk-OPG237ZQ.js} +154 -50
  175. package/dist/{chunk-2LJ2GZEE.js → chunk-PDQGR5LZ.js} +1 -1
  176. package/dist/{chunk-UBTKHJCB.js → chunk-PTF5TB6O.js} +6 -6
  177. package/dist/{chunk-5F3E57TQ.js → chunk-PYXXL7N7.js} +1 -1
  178. package/dist/{chunk-HLNRLXUS.js → chunk-Q6KUBP6R.js} +5 -5
  179. package/dist/{chunk-AGY2KUQ6.js → chunk-QJWLQXR7.js} +1 -1
  180. package/dist/{chunk-ZEDLED43.js → chunk-QOFQY7BJ.js} +1 -1
  181. package/dist/{chunk-6T5RC3L4.js → chunk-QSW5DHMZ.js} +1 -1
  182. package/dist/{chunk-54Q7M2AG.js → chunk-QV26G2BF.js} +1 -1
  183. package/dist/{chunk-5WNZGNQL.js → chunk-RHHEYC6H.js} +3 -3
  184. package/dist/{chunk-K464YYT5.js → chunk-RHJOTGEU.js} +1 -1
  185. package/dist/{chunk-LZS2B2JT.js → chunk-RIKFXHLE.js} +247 -31
  186. package/dist/{chunk-6TOV7UVU.js → chunk-RJIH7JXM.js} +4 -4
  187. package/dist/{chunk-2Q2U3NB2.js → chunk-RMC2A6EE.js} +1 -1
  188. package/dist/{chunk-FUEKSCTN.js → chunk-RYMXD2NT.js} +1 -1
  189. package/dist/{chunk-MNWN3SQ3.js → chunk-RYYFFCJG.js} +1 -1
  190. package/dist/{chunk-E2346GKI.js → chunk-SINIRUYZ.js} +101 -9
  191. package/dist/{chunk-22XJWSWN.js → chunk-SXUABANK.js} +3 -3
  192. package/dist/{backup-verify-AOTKX5DA.js → chunk-T3AM52YT.js} +345 -89
  193. package/dist/{chunk-LCXWQVOD.js → chunk-TCBWHLKH.js} +4 -4
  194. package/dist/{chunk-YWZGDFAL.js → chunk-TS4LSNRI.js} +2 -2
  195. package/dist/{chunk-J6RTX7XT.js → chunk-TVWYMOZ4.js} +1 -1
  196. package/dist/{chunk-3WNDI5KT.js → chunk-VAHQOIQY.js} +1 -1
  197. package/dist/{chunk-QH2V67NX.js → chunk-VBYSAQJD.js} +1 -1
  198. package/dist/{chunk-MQD3JJCO.js → chunk-VQQPYI4X.js} +1 -1
  199. package/dist/{chunk-XJQGS4IM.js → chunk-VS7V5HNO.js} +1 -1
  200. package/dist/{chunk-CPC75PXE.js → chunk-W3ABSZ6G.js} +2 -2
  201. package/dist/{chunk-SUGAHHVR.js → chunk-W7VKGB42.js} +1 -1
  202. package/dist/{chunk-UG3YOQAC.js → chunk-X2ZHCNNB.js} +5 -5
  203. package/dist/{chunk-YC6SZFVD.js → chunk-X4FHT6ST.js} +5 -5
  204. package/dist/{chunk-RXICR3D7.js → chunk-XC5OASHV.js} +1 -1
  205. package/dist/{chunk-TU5Y5ZNC.js → chunk-XDOCXKHW.js} +58 -1
  206. package/dist/{chunk-DLHE4PCM.js → chunk-XEAZJXMZ.js} +4 -4
  207. package/dist/{chunk-XMMWBLQK.js → chunk-XQ7BIVLI.js} +6 -6
  208. package/dist/{chunk-FRJICRED.js → chunk-Z3LGAFMG.js} +1 -1
  209. package/dist/{chunk-HCBISGUU.js → chunk-ZJ6AMC4Y.js} +7 -7
  210. package/dist/{chunk-AEEAQZ3E.js → chunk-ZZR2WRNW.js} +4 -4
  211. package/dist/{cleanup-graph-garbage-N7FTWU6C.js → cleanup-graph-garbage-SYGPMPUM.js} +8 -8
  212. package/dist/{cli-shutdown-NCBQTN7G.js → cli-shutdown-JI7CASE4.js} +1 -1
  213. package/dist/{cloud-sync-command-UL7GNN3J.js → cloud-sync-command-ZV3P5FP6.js} +2 -2
  214. package/dist/{cloud-sync-db-init-ASM7ZXBH.js → cloud-sync-db-init-RQIHWKV4.js} +1 -1
  215. package/dist/{cloud-sync-shutdown-HER4ISBU.js → cloud-sync-shutdown-V2N7VLD3.js} +3 -3
  216. package/dist/{co-activation-V5XXR327.js → co-activation-SRE6DIRX.js} +3 -3
  217. package/dist/{co-occurrence-MKZ6YWSQ.js → co-occurrence-F5TMSEQZ.js} +6 -6
  218. package/dist/{consent-passphrase-YI3J4UEL.js → consent-passphrase-MWZRHJRC.js} +2 -2
  219. package/dist/{conversation-entity-extractor-66G7ROQ3.js → conversation-entity-extractor-XMOUHGMT.js} +3 -3
  220. package/dist/{crdt-sync-Z62SWOKD.js → crdt-sync-FXEKABM7.js} +4 -4
  221. package/dist/{crm-webhook-6GBACWJX.js → crm-webhook-D6IJOPRQ.js} +2 -2
  222. package/dist/{cto-delegation-gate-FUKPBFCM.js → cto-delegation-gate-BU3JRCYN.js} +12 -12
  223. package/dist/{daemon-orchestration-O3QPSJEP.js → daemon-orchestration-K4NKFYXO.js} +19 -19
  224. package/dist/{destructive-data-guard-JDUJ2ULM.js → destructive-data-guard-3TGAAE7K.js} +77 -23
  225. package/dist/{doc-graph-extractor-BBPKLIVM.js → doc-graph-extractor-TVK2NGAR.js} +6 -6
  226. package/dist/{documents-NILTWYSQ.js → documents-MDZ4VB5X.js} +8 -8
  227. package/dist/{dreaming-KMDGPIFY.js → dreaming-L24PSS35.js} +17 -17
  228. package/dist/{employee-boot-brief-KSH3MWIF.js → employee-boot-brief-GQVL3FQC.js} +21 -21
  229. package/dist/{entity-boost-XETN7C2S.js → entity-boost-OMFA5QCG.js} +1 -1
  230. package/dist/{exe-drift-SFD7SHXC.js → exe-drift-JDDG3OPT.js} +4 -4
  231. package/dist/{exe-export-NHWKEZL4.js → exe-export-EEGIE3JP.js} +10 -10
  232. package/dist/{exe-import-SPI5HJBU.js → exe-import-UJNC5Q2L.js} +10 -10
  233. package/dist/{exe-key-TY5LFUEM.js → exe-key-TYEY4W4E.js} +95 -95
  234. package/dist/{exe-org-LVQLXA7C.js → exe-org-B3ICTTEV.js} +32 -32
  235. package/dist/{exe-snapshot-WH2DSRZW.js → exe-snapshot-VBFBONYN.js} +20 -20
  236. package/dist/{fast-db-init-UN225WS7.js → fast-db-init-TFRTK6EH.js} +1 -1
  237. package/dist/{founder-context-DVHSVBM5.js → founder-context-3X4QUWKD.js} +2 -2
  238. package/dist/{founder-monitor-envelope-HMPPUBUT.js → founder-monitor-envelope-54UNZNY4.js} +4 -4
  239. package/dist/gateway/index.js +14 -14
  240. package/dist/{gateway-client-TXHCHOVM.js → gateway-client-OUDO5GGV.js} +1 -1
  241. package/dist/{git-staleness-CUVLXQOJ.js → git-staleness-73YZ5PGU.js} +3 -3
  242. package/dist/{global-procedures-T5W3S6OU.js → global-procedures-PYNE2BQG.js} +20 -6
  243. package/dist/{graph-auto-extract-S7OIZXYP.js → graph-auto-extract-PGUMEEQB.js} +6 -6
  244. package/dist/{graph-query-CRIH4DXF.js → graph-query-7YA3YNKL.js} +1 -1
  245. package/dist/{graph-rag-LH34CEGC.js → graph-rag-UWOTK4AQ.js} +3 -3
  246. package/dist/{hook-integrity-TSJYZFZ6.js → hook-integrity-6MNEPT6W.js} +1 -1
  247. package/dist/{hook-prefetch-SNW5DFCZ.js → hook-prefetch-JOF6YZSR.js} +13 -13
  248. package/dist/hooks/bug-report-worker.js +17 -17
  249. package/dist/hooks/codex-stop-task-finalizer.js +19 -19
  250. package/dist/hooks/commit-complete.js +16 -16
  251. package/dist/hooks/error-recall.js +11 -11
  252. package/dist/hooks/exe-heartbeat-hook.js +5 -5
  253. package/dist/hooks/ingest-worker.js +15 -15
  254. package/dist/hooks/ingest.js +13 -13
  255. package/dist/hooks/instructions-loaded.js +7 -7
  256. package/dist/hooks/manifest.json +20 -20
  257. package/dist/hooks/notification.js +6 -6
  258. package/dist/hooks/post-compact.js +5 -5
  259. package/dist/hooks/post-tool-combined.js +13 -13
  260. package/dist/hooks/pre-compact.js +16 -16
  261. package/dist/hooks/pre-tool-use.js +2 -2
  262. package/dist/hooks/prompt-submit.js +34 -34
  263. package/dist/hooks/session-end.js +21 -21
  264. package/dist/hooks/session-start.js +18 -18
  265. package/dist/hooks/stop.js +19 -19
  266. package/dist/hooks/subagent-stop.js +18 -18
  267. package/dist/hooks/summary-worker.js +20 -20
  268. package/dist/index.js +26 -26
  269. package/dist/{installer-4IVP2PTX.js → installer-34XZ7JMW.js} +6 -6
  270. package/dist/{installer-UFRZHMX5.js → installer-356RMQ2K.js} +6 -6
  271. package/dist/{installer-CJWNUASI.js → installer-7TN36Z7T.js} +112 -28
  272. package/dist/{intercom-queue-II6RRK3J.js → intercom-queue-ZJ3MNULM.js} +12 -12
  273. package/dist/lib/backup-verify-worker.js +157 -0
  274. package/dist/lib/cloud-sync.js +16 -20
  275. package/dist/lib/consolidation.js +9 -9
  276. package/dist/lib/crypto.js +3 -3
  277. package/dist/lib/database.js +3 -3
  278. package/dist/lib/db-backup.js +7 -3
  279. package/dist/lib/db-write-worker.js +3 -3
  280. package/dist/lib/db.js +3 -3
  281. package/dist/lib/device-registry.js +1 -1
  282. package/dist/lib/employee-templates.js +7 -7
  283. package/dist/lib/employees.js +3 -3
  284. package/dist/lib/exe-daemon.js +89 -84
  285. package/dist/lib/hybrid-search.js +9 -9
  286. package/dist/lib/identity.js +3 -3
  287. package/dist/lib/keychain.js +1 -1
  288. package/dist/lib/license.js +2 -2
  289. package/dist/lib/messaging.js +13 -13
  290. package/dist/lib/post-tool-memory.js +13 -13
  291. package/dist/lib/registry-proxy.js +1 -1
  292. package/dist/lib/reminders.js +4 -4
  293. package/dist/lib/schedules.js +8 -8
  294. package/dist/lib/session-registry.js +5 -5
  295. package/dist/lib/skill-learning.js +9 -9
  296. package/dist/lib/store.js +7 -7
  297. package/dist/lib/task-router.js +4 -4
  298. package/dist/lib/tasks.js +14 -14
  299. package/dist/lib/tmux-routing.js +12 -12
  300. package/dist/lib/token-spend.js +4 -4
  301. package/dist/lib/ws-client.js +1 -1
  302. package/dist/{license-gate-M7EDJLAA.js → license-gate-4BXUTHLB.js} +3 -3
  303. package/dist/{license-recheck-DLTOHAH2.js → license-recheck-QFPUKISQ.js} +1 -1
  304. package/dist/{license-sync-YTDCUN3S.js → license-sync-FDEDT4AC.js} +2 -2
  305. package/dist/mcp/register-tools.js +94 -94
  306. package/dist/mcp/server.js +97 -97
  307. package/dist/mcp/tools/complete-reminder.js +5 -5
  308. package/dist/mcp/tools/create-reminder.js +5 -5
  309. package/dist/mcp/tools/create-task.js +16 -16
  310. package/dist/mcp/tools/deactivate-behavior.js +10 -10
  311. package/dist/mcp/tools/list-reminders.js +5 -5
  312. package/dist/mcp/tools/list-tasks.js +16 -16
  313. package/dist/mcp/tools/send-message.js +15 -15
  314. package/dist/mcp/tools/update-task.js +15 -15
  315. package/dist/{mcp-http-config-652YK3CI.js → mcp-http-config-GKP5QGAO.js} +5 -5
  316. package/dist/{mcp-session-identity-6QGXD52Y.js → mcp-session-identity-JHAGRB7B.js} +12 -12
  317. package/dist/{memory-cards-FOPSLULE.js → memory-cards-O377ETAM.js} +7 -7
  318. package/dist/{memory-graph-extractor-7G3CIGN7.js → memory-graph-extractor-4KJCCUOP.js} +7 -7
  319. package/dist/{memory-maintenance-5XIGUPYL.js → memory-maintenance-RR5UPRW3.js} +1 -1
  320. package/dist/{memory-poisoning-defense-MI7Y5XBP.js → memory-poisoning-defense-Y5TTKGOP.js} +3 -3
  321. package/dist/{memory-pressure-watchdog-SPIDPGU2.js → memory-pressure-watchdog-NGXTI4HR.js} +13 -13
  322. package/dist/{memory-reflection-DVAT4QKS.js → memory-reflection-EXNHRZL7.js} +7 -7
  323. package/dist/{memory-write-repository-YC7HJTV5.js → memory-write-repository-S4TX7WQB.js} +1 -1
  324. package/dist/{monitor-grants-3A77O6XK.js → monitor-grants-57Q4NL25.js} +3 -3
  325. package/dist/{monitor-identity-BTFFMFEX.js → monitor-identity-3FQ52SYU.js} +2 -2
  326. package/dist/{notification-ledger-AV5242RM.js → notification-ledger-O6KQYYGK.js} +13 -13
  327. package/dist/{notifications-75FVPJLY.js → notifications-6FCQCJ4P.js} +12 -12
  328. package/dist/{orchestration-events-ARGZU6KS.js → orchestration-events-2Z2BMMA5.js} +4 -4
  329. package/dist/{orchestrator-TCXZMLSB.js → orchestrator-AGOSKPHD.js} +14 -14
  330. package/dist/{org-brief-session-B455POUI.js → org-brief-session-WJHZVXXJ.js} +15 -15
  331. package/dist/{org-consent-policy-7K5H6FOB.js → org-consent-policy-X43UGTHI.js} +5 -5
  332. package/dist/{org-join-ETR5KO27.js → org-join-M3UTBMHC.js} +9 -9
  333. package/dist/{org-key-admin-IRC6H3TL.js → org-key-admin-AA2DRHB2.js} +11 -11
  334. package/dist/{org-key-epoch-EG4YQ47A.js → org-key-epoch-Z5UIVUHT.js} +5 -5
  335. package/dist/{org-key-pin-GLQEU3P3.js → org-key-pin-FE6YHEZ3.js} +3 -3
  336. package/dist/{org-membership-JC5YVU6N.js → org-membership-3J2MIGE4.js} +4 -4
  337. package/dist/{org-partner-config-QFSVGHEA.js → org-partner-config-5HATZYG4.js} +8 -8
  338. package/dist/{org-partner-runtime-7AD7WY3Y.js → org-partner-runtime-UI35IHUC.js} +15 -15
  339. package/dist/{org-row-visibility-AXZKVOA6.js → org-row-visibility-TRJERVYP.js} +1 -1
  340. package/dist/{pipeline-router-2KY4X6PO.js → pipeline-router-EKQ6D7ZA.js} +4 -4
  341. package/dist/{plan-limits-PG6HG2DT.js → plan-limits-3BGHIHX6.js} +6 -6
  342. package/dist/{platform-procedures-QP3W2NLH.js → platform-procedures-RXW46WNY.js} +1 -1
  343. package/dist/{pre-tool-use-impl-45B4NFIF.js → pre-tool-use-impl-7BT5TJVM.js} +28 -28
  344. package/dist/{project-name-LHYHR4VN.js → project-name-PGJGUEJY.js} +4 -4
  345. package/dist/{projection-worker-POT2AOR5.js → projection-worker-3GEVFPAI.js} +2 -2
  346. package/dist/{prospective-memory-ECXSAEAW.js → prospective-memory-GEN7CN7H.js} +3 -3
  347. package/dist/{push-notifications-W3UNHDC5.js → push-notifications-QW4BWRC7.js} +13 -13
  348. package/dist/{reproject-worktree-memories-PIXMJBHG.js → reproject-worktree-memories-DIULBEBD.js} +12 -12
  349. package/dist/{reranker-ZBPYIRBB.js → reranker-LQ6OPJOI.js} +1 -1
  350. package/dist/{retrieval-health-42MFLOEP.js → retrieval-health-XDFYFEOP.js} +1 -1
  351. package/dist/{review-polling-V4CSK4TZ.js → review-polling-ED33YLFT.js} +13 -13
  352. package/dist/runtime/index.js +20 -20
  353. package/dist/{session-events-C3NUY6MR.js → session-events-7IJGTBVH.js} +13 -13
  354. package/dist/{session-kill-telemetry-ZOSAIYU2.js → session-kill-telemetry-RUTEARJ3.js} +13 -13
  355. package/dist/{session-scope-BZALGKYZ.js → session-scope-SSYA64L3.js} +12 -12
  356. package/dist/{setup-wizard-DNA2UT4J.js → setup-wizard-XD7FZVLJ.js} +2 -2
  357. package/dist/{shard-manager-NG4SXV7L.js → shard-manager-FH5JZRSE.js} +2 -2
  358. package/dist/{skill-refinement-Y3M7XBRE.js → skill-refinement-UHD4E6GV.js} +4 -4
  359. package/dist/{skill-retrieval-XDY352AS.js → skill-retrieval-F6PAJ3I5.js} +11 -11
  360. package/dist/{skill-usage-QOLIJQJC.js → skill-usage-2MBTF7Y4.js} +4 -4
  361. package/dist/{stack-generate-manifest-VFHCOLAD.js → stack-generate-manifest-MVJDTU4F.js} +13 -37
  362. package/dist/{stack-promote-24BY6AXF.js → stack-promote-BMGEY6SQ.js} +4 -4
  363. package/dist/{stack-release-AXH7ZIOR.js → stack-release-64UJ6Y4W.js} +17 -34
  364. package/dist/{stack-update-7ET7S3ED.js → stack-update-EBATTQPP.js} +5 -3
  365. package/dist/{steward-gate-2MUESY3V.js → steward-gate-EWG2BHYQ.js} +4 -4
  366. package/dist/{subagent-brief-injection-6PM3WMMR.js → subagent-brief-injection-YZGSWUEY.js} +23 -23
  367. package/dist/{support-bug-actions-WWKDXT74.js → support-bug-actions-RU6WZ3UV.js} +3 -3
  368. package/dist/{support-inbox-AN44HIOG.js → support-inbox-A3S52SPS.js} +12 -12
  369. package/dist/{task-enforcement-QO7RXYK2.js → task-enforcement-LVAS55AR.js} +13 -13
  370. package/dist/{task-request-inbox-RXAT2QJF.js → task-request-inbox-2TN4ZUH2.js} +5 -5
  371. package/dist/{task-scope-4EKZBTTM.js → task-scope-NLKUVCP5.js} +12 -12
  372. package/dist/{tasks-crud-MB7WXGPW.js → tasks-crud-NQDPLHNZ.js} +12 -12
  373. package/dist/{tasks-notify-BCWO7AP6.js → tasks-notify-BDM2NEHP.js} +13 -13
  374. package/dist/{tasks-review-HXHYA76X.js → tasks-review-3G7CAW2O.js} +12 -12
  375. package/dist/{telemetry-upload-Q7DLE5I3.js → telemetry-upload-6DR6AL3V.js} +8 -8
  376. package/dist/{token-budget-EL6BEBDP.js → token-budget-KNC2WGR7.js} +4 -4
  377. package/dist/{tool-telemetry-SNWF4WDH.js → tool-telemetry-I3SEU5M5.js} +1 -1
  378. package/dist/tui/App.js +23 -23
  379. package/dist/{tui-data-ZMSBEPJT.js → tui-data-KJDWP4CB.js} +16 -16
  380. package/dist/{update-support-QY7WALUZ.js → update-support-UYDYMHVR.js} +11 -11
  381. package/dist/{whatsapp-NCZ43BB3.js → whatsapp-5EMPZHF5.js} +2 -2
  382. package/dist/{wiki-acl-3L7BRJUV.js → wiki-acl-M7BTQJBZ.js} +1 -1
  383. package/dist/{work-claims-XQXT2VWJ.js → work-claims-5CFMZTML.js} +4 -4
  384. package/dist/{work-state-heartbeat-GAIQ7M73.js → work-state-heartbeat-7IA2DZ2E.js} +1 -1
  385. package/dist/{workflow-engine-FCOOI5M6.js → workflow-engine-S5JOE2YR.js} +2 -2
  386. package/dist/{worktree-GS4ODQ4C.js → worktree-7V4ZMF3D.js} +5 -5
  387. package/dist/{worktree-sweep-6LMC7H5Y.js → worktree-sweep-34MXJ7S6.js} +6 -6
  388. package/package.json +2 -1
  389. package/release-notes.json +21 -25
  390. package/stack.release.json +5 -5
  391. package/dist/chunk-WZPD4QSE.js +0 -113
  392. /package/dist/{chunk-IKJUZ3VO.js → chunk-542FBM5U.js} +0 -0
  393. /package/dist/{chunk-XJDSTA2C.js → chunk-6D2O5SAH.js} +0 -0
  394. /package/dist/{chunk-FDQXQBBC.js → chunk-6NRZLVK3.js} +0 -0
  395. /package/dist/{chunk-XDWIJBTY.js → chunk-CFO47VW4.js} +0 -0
  396. /package/dist/{chunk-R6H2IRCF.js → chunk-EULAP6L6.js} +0 -0
  397. /package/dist/{chunk-LK6OG47X.js → chunk-FYSKQPTE.js} +0 -0
  398. /package/dist/{chunk-LAWI42NC.js → chunk-J4B4M5PH.js} +0 -0
  399. /package/dist/{chunk-AC36VWNB.js → chunk-J635FA7T.js} +0 -0
  400. /package/dist/{chunk-UQKGV6SX.js → chunk-MOBZTIJQ.js} +0 -0
  401. /package/dist/{chunk-7ZP2PAW3.js → chunk-N45FAI6D.js} +0 -0
  402. /package/dist/{chunk-ZQS4S4AX.js → chunk-QDSNEGJE.js} +0 -0
  403. /package/dist/{chunk-CS4SHHLY.js → chunk-SKSXROKP.js} +0 -0
  404. /package/dist/{chunk-JXGOO53U.js → chunk-YVWXI2HM.js} +0 -0
  405. /package/dist/{core-memory-3TZV3ZDW.js → core-memory-PZEO3OWH.js} +0 -0
  406. /package/dist/{memory-isolation-TE4AOMQX.js → memory-isolation-MFNT2ITE.js} +0 -0
  407. /package/dist/{oauth-server-CWQ6EBGQ.js → oauth-server-CBGEWD6H.js} +0 -0
  408. /package/dist/{project-boot-MX2FNKTJ.js → project-boot-VESAYDIH.js} +0 -0
@@ -19,10 +19,10 @@ import {
19
19
  } from "./chunk-RT57D7C4.js";
20
20
  import {
21
21
  loadLicense
22
- } from "./chunk-KNEEOZWN.js";
22
+ } from "./chunk-EOWJXCYC.js";
23
23
 
24
24
  // src/lib/stack-update.ts
25
- import { execFileSync, spawnSync as spawnSync2 } from "child_process";
25
+ import { execFileSync as execFileSync2, spawnSync as spawnSync2 } from "child_process";
26
26
  import { createHash, createVerify, randomBytes, verify as verifySignature } from "crypto";
27
27
  import { chmodSync, closeSync, copyFileSync, existsSync, lstatSync, mkdirSync, openSync, realpathSync, readdirSync, readFileSync, renameSync, rmSync, statSync, unlinkSync, utimesSync, writeFileSync } from "fs";
28
28
  import http from "http";
@@ -32,6 +32,183 @@ import path from "path";
32
32
  import { fileURLToPath } from "url";
33
33
  import { parseDocument as parseYamlDocument } from "yaml";
34
34
 
35
+ // src/lib/stack-worker-migration.ts
36
+ import { isScalar, parseDocument } from "yaml";
37
+ var LEGACY_IMAGE = "${EXE_OS_WORKER_IMAGE_TAG:-ghcr.io/askexe/exe-os-worker:v0.9.311}";
38
+ var DISABLED_IMAGE = "${EXE_OS_WORKER_IMAGE_TAG:-}";
39
+ var WORKER = "exe-os-worker";
40
+ function planLegacyWorkerMigration(input) {
41
+ const unchanged = { raw: input.composeRaw, changed: false };
42
+ if (!input.composeRaw.includes(LEGACY_IMAGE)) return unchanged;
43
+ const doc = parseDocument(input.composeRaw, { uniqueKeys: true });
44
+ if (doc.errors.length) throw new Error("Cannot inspect legacy worker migration: invalid Compose YAML");
45
+ const image = doc.getIn(["services", WORKER, "image"], true);
46
+ if (!isScalar(image) || image.value !== LEGACY_IMAGE) return unchanged;
47
+ const refuse = (reason) => {
48
+ throw new Error(`Cannot migrate the legacy embeddings worker: ${reason}. Keep the signed-manifest and digest checks enabled.`);
49
+ };
50
+ const worker = doc.getIn(["services", WORKER]);
51
+ const definition = worker.toJSON();
52
+ if (definition.extends || !Array.isArray(definition.profiles) || definition.profiles.length !== 1 || definition.profiles[0] !== "embeddings") {
53
+ refuse("the worker is not the shipped embeddings-only service");
54
+ }
55
+ const processEnv = input.processEnv ?? process.env;
56
+ const unquote = (value) => value.trim().replace(/\s+#.*$/, "").replace(/^(["'])(.*)\1$/, "$2").trim();
57
+ for (const value of [input.env.get("COMPOSE_PROFILES") ?? "", processEnv.COMPOSE_PROFILES ?? ""]) {
58
+ const profiles = unquote(value).split(",").map((profile) => profile.trim()).filter(Boolean);
59
+ if (profiles.some((profile) => !/^(?:[a-zA-Z0-9][a-zA-Z0-9_.-]*|\*)$/.test(profile))) {
60
+ refuse("enabled profiles could not be determined");
61
+ }
62
+ if (profiles.includes("embeddings") || profiles.includes("*")) refuse("embeddings are enabled");
63
+ }
64
+ if ([input.env.get("EXE_OS_WORKER_IMAGE_TAG") ?? "", processEnv.EXE_OS_WORKER_IMAGE_TAG ?? ""].some((value) => unquote(value))) {
65
+ refuse("an explicit worker image is configured; it must be covered by a signed release");
66
+ }
67
+ if (input.hostServicesUnavailable) refuse("the host's running services could not be observed");
68
+ if (input.hostServices.includes(WORKER)) refuse("the worker exists on the host");
69
+ if (input.overrideRaw) {
70
+ const override = parseDocument(input.overrideRaw, { uniqueKeys: true });
71
+ if (override.errors.length) refuse("the customer override could not be inspected");
72
+ if (override.hasIn(["services", WORKER])) refuse("the customer override defines the worker");
73
+ }
74
+ const targetComposeRaw = typeof input.targetComposeRaw === "function" ? input.targetComposeRaw() : input.targetComposeRaw;
75
+ if (!targetComposeRaw) refuse("the packaged replacement template is missing");
76
+ const target = parseDocument(targetComposeRaw, { uniqueKeys: true });
77
+ if (target.errors.length || target.getIn(["services", WORKER, "image"]) !== DISABLED_IMAGE) {
78
+ refuse("the packaged replacement does not contain the current disabled worker slot");
79
+ }
80
+ if (!image.range) refuse("the legacy image location is unavailable");
81
+ return {
82
+ raw: input.composeRaw.slice(0, image.range[0]) + JSON.stringify(DISABLED_IMAGE) + input.composeRaw.slice(image.range[1]),
83
+ changed: true
84
+ };
85
+ }
86
+
87
+ // src/lib/monitor-rollback.ts
88
+ import { execFileSync } from "child_process";
89
+ var LEGACY_HUB_DIGEST = "sha256:1af31893cc8b1e51892be7d7705fa6c6b3108af8366b1fa8da2879d8ae21ec88";
90
+ var runDocker = (args) => execFileSync("docker", args, {
91
+ encoding: "utf8",
92
+ timeout: 12e4,
93
+ maxBuffer: 1024 * 1024
94
+ });
95
+ function restoreLegacyMonitorOwnership(composeArgs, run = runDocker) {
96
+ const configured = JSON.parse(
97
+ run([...composeArgs, "config", "--format", "json"])
98
+ ).services?.["exe-monitor-hub"];
99
+ if (!configured || typeof configured.image !== "string" || !configured.image.trim())
100
+ return false;
101
+ if (configured.user != null && String(configured.user).trim() && !["65532", "65532:65532"].includes(String(configured.user)))
102
+ return false;
103
+ const ids = run([...composeArgs, "ps", "--all", "--quiet", "exe-monitor-hub"]).trim().split(/\s+/).filter(Boolean);
104
+ if (ids.length === 0) return false;
105
+ if (ids.length !== 1 || !/^[a-f0-9]{12,64}$/.test(ids[0])) {
106
+ throw new Error("Cannot attribute the installed monitor container safely");
107
+ }
108
+ const image = JSON.parse(run(["image", "inspect", configured.image]))[0];
109
+ if (!image?.RepoDigests?.some(
110
+ (ref) => ref.endsWith("@" + LEGACY_HUB_DIGEST)
111
+ ))
112
+ return false;
113
+ if (image.Config?.User !== "65532:65532")
114
+ throw new Error(
115
+ "Legacy monitor runtime identity differs from its verified artifact"
116
+ );
117
+ const hub = JSON.parse(run(["inspect", ids[0]]))[0];
118
+ if (typeof hub?.Id !== "string" || !hub.Id.startsWith(ids[0]))
119
+ throw new Error("Monitor observation changed before recovery");
120
+ const project = hub?.Config?.Labels?.["com.docker.compose.project"];
121
+ const mount = hub?.Mounts?.find(
122
+ (m) => m.Destination === "/app/exe-monitor_data"
123
+ );
124
+ if (!project || hub.Config.Labels["com.docker.compose.service"] !== "exe-monitor-hub" || mount?.Type !== "volume" || typeof mount.Name !== "string" || !/^[A-Za-z0-9][A-Za-z0-9_.-]*$/.test(mount.Name)) {
125
+ throw new Error(
126
+ "Legacy monitor recovery requires its managed named data volume"
127
+ );
128
+ }
129
+ const volume = JSON.parse(run(["volume", "inspect", mount.Name]))[0];
130
+ if (volume?.Name !== mount.Name || volume.Labels?.["com.docker.compose.project"] !== project || volume.Labels["com.docker.compose.volume"] !== "monitor_hub_data") {
131
+ throw new Error(
132
+ "Legacy monitor data-volume ownership is not attributable to this stack"
133
+ );
134
+ }
135
+ const db = JSON.parse(run(["inspect", "exe-db"]))[0];
136
+ if (db?.Config?.Labels?.["com.docker.compose.project"] !== project || db.Config.Labels["com.docker.compose.service"] !== "exe-db" || !/^sha256:[a-f0-9]{64}$/.test(db.Image)) {
137
+ throw new Error(
138
+ "Legacy monitor recovery requires this stack's immutable database helper image"
139
+ );
140
+ }
141
+ let helper = JSON.parse(run(["image", "inspect", db.Image]))[0];
142
+ let helperId = db.Image;
143
+ if (!helper?.Os || !helper?.Architecture) {
144
+ const descriptor = db.ImageManifestDescriptor;
145
+ const platform = descriptor?.platform;
146
+ if (!/^sha256:[a-f0-9]{64}$/.test(descriptor?.digest ?? "") || platform?.os !== "linux" || !["amd64", "arm64"].includes(platform.architecture))
147
+ throw new Error("Cannot resolve native recovery helper platform");
148
+ helper = JSON.parse(
149
+ run([
150
+ "image",
151
+ "inspect",
152
+ "--platform",
153
+ `linux/${platform.architecture}`,
154
+ db.Image
155
+ ])
156
+ )[0];
157
+ helperId = descriptor.digest;
158
+ if (helper?.Architecture !== platform.architecture)
159
+ throw new Error("Recovery helper differs from the running DB platform");
160
+ }
161
+ if (helper?.Id !== helperId || helper.Os !== "linux" || !["amd64", "arm64"].includes(helper.Architecture)) {
162
+ throw new Error("Legacy monitor recovery helper metadata is inconsistent");
163
+ }
164
+ const base = [
165
+ "run",
166
+ "--rm",
167
+ "--network",
168
+ "none",
169
+ "--read-only",
170
+ "--user",
171
+ "0:0",
172
+ "--platform",
173
+ `linux/${helper.Architecture}`,
174
+ "--label",
175
+ `com.askexe.monitor-recovery=${project}`
176
+ ];
177
+ const owner = run([
178
+ ...base,
179
+ "--entrypoint",
180
+ "stat",
181
+ "--mount",
182
+ `type=volume,src=${mount.Name},dst=/recovery,readonly`,
183
+ db.Image,
184
+ "-c",
185
+ "%u:%g",
186
+ "/recovery"
187
+ ]).trim();
188
+ if (owner === "65532:65532") return false;
189
+ if (!/^\d+:\d+$/.test(owner))
190
+ throw new Error("Cannot observe legacy monitor data ownership safely");
191
+ run([...composeArgs, "stop", "--timeout", "10", "exe-monitor-hub"]);
192
+ run([
193
+ ...base,
194
+ "--cap-drop",
195
+ "ALL",
196
+ "--cap-add",
197
+ "CHOWN",
198
+ "--cap-add",
199
+ "DAC_OVERRIDE",
200
+ "--entrypoint",
201
+ "chown",
202
+ "--mount",
203
+ `type=volume,src=${mount.Name},dst=/recovery`,
204
+ db.Image,
205
+ "-Rh",
206
+ "65532:65532",
207
+ "/recovery"
208
+ ]);
209
+ return true;
210
+ }
211
+
35
212
  // src/lib/askexe-image-prefixes.ts
36
213
  var ASKEXE_IMAGE_PREFIXES = ["ghcr.io/askexe/", "update.askexe.com/askexe/"];
37
214
  function isAskExeHostedImageRef(trimmedImage) {
@@ -1292,6 +1469,11 @@ async function rollbackStackUpdate(options) {
1292
1469
  if (options.retainCompose && !(scopedServiceNames.length === 1 && lockData?.services)) {
1293
1470
  throw new Error("--retain-compose rollback refused an unscoped restart; restore the selected service from backup manually");
1294
1471
  }
1472
+ if (!options.exec && (scopedServiceNames.length === 0 || scopedServiceNames.includes("monitorHub"))) {
1473
+ if (restoreLegacyMonitorOwnership(composeArgs)) {
1474
+ console.log("[stack-update] Restored legacy monitor data ownership before rollback restart");
1475
+ }
1476
+ }
1295
1477
  if (scopedServiceNames.length > 0 && lockData?.services) {
1296
1478
  const scopedComposeServices = scopedComposeImageServices(
1297
1479
  scopedServiceNames.map((serviceName) => lockData.services[serviceName]?.composeService ?? serviceName),
@@ -1936,6 +2118,7 @@ var MONITOR_IMAGE_TAG_ENV = {
1936
2118
  monitorHub: "MONITOR_HUB_IMAGE_TAG",
1937
2119
  monitorAgent: "MONITOR_AGENT_IMAGE_TAG"
1938
2120
  };
2121
+ var OBSERVED_ROOT_AGENT_DIGEST = "sha256:29fbd445f79484df04f000603e4ff445e76f0380f86d687a0033e3a0ef7d1b7a";
1939
2122
  var STOCK_BESZEL_MONITOR_VERSIONS = /* @__PURE__ */ new Set(["0.9.5"]);
1940
2123
  function monitorImageVersion(imageRef) {
1941
2124
  const noDigest = imageRef.split("@")[0] ?? imageRef;
@@ -1950,6 +2133,7 @@ function isStockBeszelMonitorImage(imageRef) {
1950
2133
  return version !== void 0 && STOCK_BESZEL_MONITOR_VERSIONS.has(version);
1951
2134
  }
1952
2135
  function monitorHealthBinForImage(serviceKey, imageRef) {
2136
+ if (serviceKey === "monitorAgent" && imageRef.endsWith(`@${OBSERVED_ROOT_AGENT_DIGEST}`)) return "/agent";
1953
2137
  const stock = isStockBeszelMonitorImage(imageRef);
1954
2138
  if (serviceKey === "monitorHub") return stock ? "/beszel" : "/app/beszel";
1955
2139
  return stock ? "/agent" : "/app/beszel-agent";
@@ -2202,14 +2386,17 @@ function collectImageAvailabilityIssues(plan) {
2202
2386
  try {
2203
2387
  const result = spawnSync2("docker", ["manifest", "inspect", manifestInspectRef(image), "--verbose"], {
2204
2388
  stdio: ["ignore", "pipe", "pipe"],
2205
- timeout: 3e4
2389
+ // Multi-platform official images can require dozens of child-manifest
2390
+ // requests through the proxy. A valid Redis index took 68s in the
2391
+ // legacy-upgrade rehearsal; 30s misreported it as an absent image.
2392
+ timeout: 12e4
2206
2393
  });
2207
2394
  if (result.status === 0) {
2208
2395
  inspected = true;
2209
2396
  inspectOutput = result.stdout?.toString() ?? "";
2210
2397
  break;
2211
2398
  }
2212
- lastStderr = result.stderr?.toString().trim() ?? "";
2399
+ lastStderr = result.error?.message || result.stderr?.toString().trim() || "manifest inspection failed";
2213
2400
  if (attempt < maxAttempts) {
2214
2401
  const delayMs = baseDelayMs * Math.pow(2, attempt - 1);
2215
2402
  console.log(
@@ -2232,13 +2419,14 @@ function collectImageAvailabilityIssues(plan) {
2232
2419
  try {
2233
2420
  const parsed = JSON.parse(inspectOutput);
2234
2421
  const manifests = Array.isArray(parsed) ? parsed : [parsed];
2422
+ const platformOf = (m) => m.platform ?? m.Descriptor?.platform;
2235
2423
  const hasAmd64 = manifests.some((m) => {
2236
- const platform = m.platform;
2424
+ const platform = platformOf(m);
2237
2425
  return platform?.architecture === "amd64" && platform?.os === "linux";
2238
2426
  });
2239
- if (!hasAmd64 && manifests.length > 0 && manifests[0]?.platform) {
2427
+ if (!hasAmd64 && manifests.some((m) => platformOf(m))) {
2240
2428
  const platforms = manifests.map((m) => {
2241
- const p = m.platform;
2429
+ const p = platformOf(m);
2242
2430
  return `${p?.os ?? "?"}/${p?.architecture ?? "?"}`;
2243
2431
  }).join(", ");
2244
2432
  issues.push({
@@ -3904,6 +4092,9 @@ async function runStackUpdate(options) {
3904
4092
  return withStackUpdateOperationLock(options.envFile, () => runStackUpdateUnlocked(options));
3905
4093
  }
3906
4094
  async function runStackUpdateUnlocked(options) {
4095
+ if (options.rollback && (options.dryRun || options.verifyImages)) {
4096
+ throw new Error("Rollback cannot be combined with a read-only preview; no rollback was performed.");
4097
+ }
3907
4098
  const exec = options.exec ?? defaultExec;
3908
4099
  const now = options.now ?? (() => /* @__PURE__ */ new Date());
3909
4100
  const phaseDurations = [];
@@ -3925,17 +4116,17 @@ async function runStackUpdateUnlocked(options) {
3925
4116
  };
3926
4117
  if (options.rollback) return rollbackStackUpdate(options);
3927
4118
  let preBootstrapBackup;
3928
- if (!options.dryRun && existsSync(options.envFile)) {
4119
+ if (!options.dryRun && !options.verifyImages && existsSync(options.envFile)) {
3929
4120
  const preBootstrapEnvRaw = readFileSync(options.envFile, "utf8");
3930
4121
  preBootstrapBackup = backupStackConfig(path.dirname(options.envFile), options.composeFile, preBootstrapEnvRaw, now);
3931
4122
  }
3932
- if (options.bootstrap !== false) {
4123
+ if (options.bootstrap !== false && !options.dryRun && !options.verifyImages) {
3933
4124
  const report = bootstrapStackHost({ ...options, installDocker: options.installDocker ?? !!options.yes });
3934
4125
  if (!options.dryRun) assertHostReadyForApply(report);
3935
4126
  }
3936
4127
  assertBindMountsExist(path.dirname(options.envFile));
3937
4128
  warnLegacyDaemonVolume(options.volumeExists);
3938
- if (!options.dryRun) {
4129
+ if (!options.dryRun && !options.verifyImages) {
3939
4130
  try {
3940
4131
  const endPhase = startPhase("preflight");
3941
4132
  if (!options.preflight) {
@@ -3962,7 +4153,7 @@ async function runStackUpdateUnlocked(options) {
3962
4153
  const hubUrl = options.monitorHubUrl || parseEnv(readFileSync(options.envFile, "utf8")).get("MONITOR_HUB_URL") || "";
3963
4154
  const pairLicense = options.licenseKey || process.env.EXE_LICENSE_KEY || loadLicense() || "";
3964
4155
  const pairDomain = options.domain || process.env.EXE_STACK_DOMAIN || process.env.CUSTOMER_DOMAIN || "";
3965
- if (!options.retainCompose && hubUrl && pairLicense && pairDomain) {
4156
+ if (!options.dryRun && !options.verifyImages && !options.retainCompose && hubUrl && pairLicense && pairDomain) {
3966
4157
  const envBefore = readFileSync(options.envFile, "utf8");
3967
4158
  const parsedEnvBefore = parseEnv(envBefore);
3968
4159
  const monitorToken = parsedEnvBefore.get("MONITOR_AGENT_TOKEN") ?? "";
@@ -3990,6 +4181,7 @@ async function runStackUpdateUnlocked(options) {
3990
4181
  );
3991
4182
  reportStackManifestSource(manifestLoad);
3992
4183
  const manifest = manifestLoad.manifest;
4184
+ let previewServiceSelection;
3993
4185
  if (options.addService || options.removeService) {
3994
4186
  const effectiveVersion = options.targetVersion ?? manifest.latest;
3995
4187
  const manifestRelease = manifest.stacks[effectiveVersion];
@@ -4013,11 +4205,16 @@ async function runStackUpdateUnlocked(options) {
4013
4205
  currentServices.delete(options.removeService);
4014
4206
  console.log(`[stack-update] Removed service: ${options.removeService}`);
4015
4207
  }
4016
- saveServiceSelection(options.envFile, [...currentServices]);
4017
- console.log(`[stack-update] Saved service selection: ${[...currentServices].join(", ")}`);
4208
+ if (options.dryRun || options.verifyImages) {
4209
+ previewServiceSelection = runScopedServiceSelection([...currentServices], now);
4210
+ console.log(`[stack-update] Planned service selection (not saved): ${[...currentServices].join(", ")}`);
4211
+ } else {
4212
+ saveServiceSelection(options.envFile, [...currentServices]);
4213
+ console.log(`[stack-update] Saved service selection: ${[...currentServices].join(", ")}`);
4214
+ }
4018
4215
  }
4019
4216
  const isRunScoped = Boolean(options.services && options.services.length > 0);
4020
- const serviceSelection = isRunScoped ? runScopedServiceSelection(options.services, now) : loadServiceSelection(options.envFile);
4217
+ const serviceSelection = isRunScoped ? runScopedServiceSelection(options.services, now) : previewServiceSelection ?? loadServiceSelection(options.envFile);
4021
4218
  if (isRunScoped) {
4022
4219
  console.log(
4023
4220
  `[stack-update] Service scope for THIS RUN ONLY: ${options.services.join(", ")} (the managed set in ${serviceSelectionPath(options.envFile)} is unchanged)`
@@ -4094,7 +4291,22 @@ ${lines.join("\n")}`
4094
4291
  `[stack-update] Synced monitor healthcheck bin path(s) into the deploy environment: ${[...processHealthBins.pinned, ...processHealthBins.cleared].join(", ")}`
4095
4292
  );
4096
4293
  }
4097
- assertProductionDeployGate(plan, plannedEnvRaw, composeRaw, {
4294
+ const hostState = listHostComposeServices(
4295
+ composeArgsForStack(options.composeFile, options.envFile),
4296
+ options.composePsCapture ?? defaultComposePsCapture
4297
+ );
4298
+ const overrideFile = composeOverrideFileFor(options.composeFile);
4299
+ const workerMigration = options.retainCompose ? { raw: composeRaw, changed: false } : planLegacyWorkerMigration({
4300
+ composeRaw,
4301
+ targetComposeRaw: stagedCompose.templateFound ? stagedCompose.raw : null,
4302
+ env: parseEnv(plannedEnvRaw),
4303
+ hostServices: hostState.services,
4304
+ hostServicesUnavailable: hostState.unavailable,
4305
+ overrideRaw: existsSync(overrideFile) ? readFileSync(overrideFile, "utf8") : null
4306
+ });
4307
+ const composeRawForGate = workerMigration.raw;
4308
+ if (workerMigration.changed) console.log("[stack-update] Planned configuration migration: clear the unused legacy embeddings-worker image default.");
4309
+ assertProductionDeployGate(plan, plannedEnvRaw, composeRawForGate, {
4098
4310
  breakGlassReason: options.breakGlassReason,
4099
4311
  breakGlassAuditFile: options.breakGlassAuditFile,
4100
4312
  strictDigest: options.strictDigest,
@@ -4139,14 +4351,10 @@ ${lines.join("\n")}`
4139
4351
  );
4140
4352
  }
4141
4353
  }
4142
- const hostState = listHostComposeServices(
4143
- composeArgsForStack(options.composeFile, options.envFile),
4144
- options.composePsCapture ?? defaultComposePsCapture
4145
- );
4146
4354
  assertSignedManifestDeliveryGate({
4147
4355
  release: manifest.stacks[plan.targetVersion],
4148
4356
  targetVersion: plan.targetVersion,
4149
- composeRaw,
4357
+ composeRaw: composeRawForGate,
4150
4358
  envRaw: plannedEnvRaw,
4151
4359
  hostServices: hostState.services,
4152
4360
  hostServicesUnavailable: hostState.unavailable,
@@ -4263,7 +4471,9 @@ ${lines.join("\n")}`
4263
4471
  }
4264
4472
  };
4265
4473
  const containersRunning = plan.changes.length === 0 ? (options.stackContainersRunning ?? areStackContainersRunning)(options.composeFile, options.envFile) : true;
4266
- if (options.dryRun || !options.resume && plan.changes.length === 0 && containersRunning) {
4474
+ const managedTargetPlan = isRunScoped ? createStackUpdatePlan(manifest, envRaw, effectiveTargetVersion, void 0, loadServiceSelection(options.envFile), composeRaw) : fullTargetPlan;
4475
+ const versionOnlyUpgrade = Boolean(options.targetVersion && previousVersion && previousVersion !== plan.targetVersion && managedTargetPlan.changes.length === 0);
4476
+ if (options.dryRun || !options.resume && plan.changes.length === 0 && containersRunning && !versionOnlyUpgrade && !workerMigration.changed) {
4267
4477
  const ssoOutcome = skipSsoEdgeReconcileForRetainScope ? { attempted: false, delivered: true } : await reconcileSsoEdge({ apply: !options.dryRun });
4268
4478
  if (!options.dryRun && !ssoOutcome.delivered) {
4269
4479
  throw new Error(
@@ -4341,6 +4551,7 @@ ${lines.join("\n")}`
4341
4551
  }
4342
4552
  } catch (err) {
4343
4553
  if (options.retainCompose) throw err;
4554
+ if (workerMigration.changed) throw new Error(`Could not install the validated legacy worker migration: ${err instanceof Error ? err.message : String(err)}`);
4344
4555
  const reason = err instanceof Error ? err.message : String(err);
4345
4556
  console.warn(`[stack-update] Could not refresh docker-compose.yml (${reason}); using existing compose.`);
4346
4557
  }
@@ -5292,25 +5503,28 @@ function listHostComposeServices(composeArgs, capture = defaultComposePsCapture)
5292
5503
  if (trimmed.startsWith("[")) {
5293
5504
  try {
5294
5505
  const parsed = JSON.parse(trimmed);
5295
- if (Array.isArray(parsed)) records.push(...parsed);
5506
+ if (!Array.isArray(parsed)) return { services: [], unavailable: true };
5507
+ records.push(...parsed);
5296
5508
  } catch {
5509
+ return { services: [], unavailable: true };
5297
5510
  }
5298
- }
5299
- if (records.length === 0) {
5511
+ } else {
5300
5512
  for (const line of trimmed.split("\n")) {
5301
5513
  const l = line.trim();
5302
5514
  if (!l) continue;
5303
5515
  try {
5304
5516
  records.push(JSON.parse(l));
5305
5517
  } catch {
5518
+ return { services: [], unavailable: true };
5306
5519
  }
5307
5520
  }
5308
5521
  }
5309
- if (records.length === 0) return { services: [], unavailable: true };
5310
5522
  const services = /* @__PURE__ */ new Set();
5311
5523
  for (const obj of records) {
5312
- const service = String(obj.Service ?? "").trim();
5313
- if (service) services.add(service);
5524
+ if (!obj || typeof obj !== "object" || Array.isArray(obj) || typeof obj.Service !== "string" || !obj.Service.trim()) {
5525
+ return { services: [], unavailable: true };
5526
+ }
5527
+ services.add(obj.Service.trim());
5314
5528
  }
5315
5529
  return { services: [...services], unavailable: false };
5316
5530
  }
@@ -5663,16 +5877,16 @@ function httpStatus(urlString, hostHeader) {
5663
5877
  });
5664
5878
  }
5665
5879
  function defaultExec(cmd, args, opts) {
5666
- execFileSync(cmd, args, { stdio: "inherit", cwd: opts?.cwd });
5880
+ execFileSync2(cmd, args, { stdio: "inherit", cwd: opts?.cwd });
5667
5881
  }
5668
5882
  function defaultDockerLogin(creds) {
5669
- execFileSync("docker", ["login", creds.registry, "-u", creds.username, "--password-stdin"], {
5883
+ execFileSync2("docker", ["login", creds.registry, "-u", creds.username, "--password-stdin"], {
5670
5884
  input: creds.password,
5671
5885
  stdio: ["pipe", "inherit", "inherit"]
5672
5886
  });
5673
5887
  }
5674
5888
  function defaultDockerLogout(registry) {
5675
- execFileSync("docker", ["logout", registry], { stdio: "ignore" });
5889
+ execFileSync2("docker", ["logout", registry], { stdio: "ignore" });
5676
5890
  }
5677
5891
  async function defaultFetchText(ref, authToken) {
5678
5892
  const res = await fetch(ref, {
@@ -5895,7 +6109,7 @@ function removeDanglingVolumes(volumes, scope) {
5895
6109
  continue;
5896
6110
  }
5897
6111
  try {
5898
- execFileSync("docker", ["volume", "rm", vol.name], {
6112
+ execFileSync2("docker", ["volume", "rm", vol.name], {
5899
6113
  stdio: ["pipe", "pipe", "pipe"],
5900
6114
  timeout: 3e4
5901
6115
  });
@@ -5963,6 +6177,7 @@ export {
5963
6177
  retainedCompletedDependencies,
5964
6178
  retainedContainerIsHealthy,
5965
6179
  assessRetainedHealthBefore,
6180
+ planLegacyWorkerMigration,
5966
6181
  resolveServiceHealthTimeout,
5967
6182
  serviceSelectionPath,
5968
6183
  loadServiceSelection,
@@ -6042,6 +6257,7 @@ export {
6042
6257
  assertRolloutStageAllowed,
6043
6258
  assertBreakingChangesAllowed,
6044
6259
  verifyManifestImagesAvailable,
6260
+ readStagedComposeTemplate,
6045
6261
  assertRetainedComposePlan,
6046
6262
  verifyPreDeployImages,
6047
6263
  collectImageProvenanceIssues,
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  sendMessage
3
- } from "./chunk-RWM6TZH6.js";
3
+ } from "./chunk-7KPZQ65I.js";
4
4
  import {
5
5
  getActiveAgent
6
- } from "./chunk-IHBYJG7N.js";
6
+ } from "./chunk-GL5ZG72X.js";
7
7
  import {
8
8
  resolveExeSession
9
- } from "./chunk-WSYIQKZ6.js";
9
+ } from "./chunk-GM4UEZDE.js";
10
10
  import {
11
11
  getDispatcherSession
12
12
  } from "./chunk-PCV52RYM.js";
@@ -16,7 +16,7 @@ import {
16
16
  import {
17
17
  getCoordinatorName,
18
18
  isCoordinatorName
19
- } from "./chunk-LBEBSXZA.js";
19
+ } from "./chunk-L5JFVK5T.js";
20
20
 
21
21
  // src/mcp/tools/send-message.ts
22
22
  import { z } from "zod";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-LBEBSXZA.js";
3
+ } from "./chunk-L5JFVK5T.js";
4
4
 
5
5
  // src/lib/boot-generation.ts
6
6
  var SYNC_META_KEY = "daemon_boot_generation";
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-WCGNCH3Q.js";
4
4
  import {
5
5
  registerAllTools
6
- } from "./chunk-47UBJKS3.js";
6
+ } from "./chunk-6HJF7IA3.js";
7
7
 
8
8
  // src/mcp/mcp-surface-hash.ts
9
9
  function computeMcpSurfaceHash() {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-LBEBSXZA.js";
3
+ } from "./chunk-L5JFVK5T.js";
4
4
  import {
5
5
  loadConfig
6
6
  } from "./chunk-MMS2HBRT.js";