@askexenow/exe-os 0.9.364 → 0.9.367

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 (433) hide show
  1. package/deploy/compose/.env.customer.example +36 -1
  2. package/deploy/compose/.env.example +39 -1
  3. package/deploy/compose/docker-compose.yml +131 -19
  4. package/deploy/compose/generate-env.ts +65 -1
  5. package/deploy/stack-manifests/v0.9.json +117 -2
  6. package/dist/.dist-verified.json +3 -3
  7. package/dist/{active-agent-WL3VEPS3.js → active-agent-R6Q7UEUD.js} +6 -6
  8. package/dist/{active-agent-MVEEEKUD.js → active-agent-V3CUDNED.js} +6 -6
  9. package/dist/{agent-defs-generator-MLQ4ULA2.js → agent-defs-generator-MLPRGY75.js} +5 -5
  10. package/dist/agent-heartbeat-CQPGJIFF.js +13 -0
  11. package/dist/{agent-loop-E7RZCFDB.js → agent-loop-FOK2IRZQ.js} +1 -1
  12. package/dist/{agentic-ontology-X3JMWNAM.js → agentic-ontology-5FMQWGDZ.js} +1 -1
  13. package/dist/{artifact-backup-6VQ2332X.js → artifact-backup-767STHSW.js} +1 -1
  14. package/dist/{backfill-gate-BWFX6B55.js → backfill-gate-VX2RZTQV.js} +2 -2
  15. package/dist/{backfill-metadata-FFDTWSGA.js → backfill-metadata-YXUMCKRV.js} +7 -7
  16. package/dist/{background-jobs-EB4BPQMT.js → background-jobs-LTPWCMA3.js} +2 -2
  17. package/dist/{backup-verify-BZQ5RI5I.js → backup-verify-GYHKAX7K.js} +3 -3
  18. package/dist/{behavior-injection-U7FGR6VM.js → behavior-injection-7VGYY2KO.js} +13 -12
  19. package/dist/{behaviors-NLOMQW34.js → behaviors-O6HKTSOF.js} +12 -11
  20. package/dist/bin/age-ontology-load.js +2 -2
  21. package/dist/bin/agentic-ontology-backfill.js +9 -9
  22. package/dist/bin/agentic-reflection-backfill.js +10 -10
  23. package/dist/bin/agentic-semantic-label.js +9 -9
  24. package/dist/bin/backfill-conversations.js +10 -9
  25. package/dist/bin/backfill-responses.js +10 -9
  26. package/dist/bin/backfill-vectors.js +14 -13
  27. package/dist/bin/bulk-sync-postgres.js +19 -18
  28. package/dist/bin/cc-doctor.js +11 -9
  29. package/dist/bin/cleanup-stale-review-tasks.js +23 -21
  30. package/dist/bin/cli.js +25 -25
  31. package/dist/bin/deferred-daemon-restart.js +105 -100
  32. package/dist/bin/exe-agent-config.js +5 -5
  33. package/dist/bin/exe-agent.js +258 -20
  34. package/dist/bin/exe-assign.js +12 -11
  35. package/dist/bin/exe-boot.js +49 -46
  36. package/dist/bin/exe-call.js +7 -7
  37. package/dist/bin/exe-cloud.js +21 -20
  38. package/dist/bin/exe-config-dump.js +5 -5
  39. package/dist/bin/exe-dispatch.js +24 -22
  40. package/dist/bin/exe-doctor.js +10 -9
  41. package/dist/bin/exe-export-behaviors.js +14 -13
  42. package/dist/bin/exe-forget.js +9 -9
  43. package/dist/bin/exe-gateway.js +9 -9
  44. package/dist/bin/exe-grant.js +5 -5
  45. package/dist/bin/exe-healthcheck.js +11 -9
  46. package/dist/bin/exe-heartbeat.js +29 -27
  47. package/dist/bin/exe-kill.js +27 -25
  48. package/dist/bin/exe-launch-agent.js +35 -33
  49. package/dist/bin/exe-mcp.js +5 -5
  50. package/dist/bin/exe-memory-reads.js +7 -7
  51. package/dist/bin/exe-new-employee.js +11 -11
  52. package/dist/bin/exe-os-mcp-proxy.js +5 -5
  53. package/dist/bin/exe-pending-messages.js +24 -22
  54. package/dist/bin/exe-pending-notifications.js +23 -21
  55. package/dist/bin/exe-pending-reviews.js +24 -22
  56. package/dist/bin/exe-rename.js +7 -7
  57. package/dist/bin/exe-review.js +26 -24
  58. package/dist/bin/exe-search.js +8 -8
  59. package/dist/bin/exe-session-cleanup.js +28 -26
  60. package/dist/bin/exe-settings.js +20 -19
  61. package/dist/bin/exe-start-codex.js +28 -19
  62. package/dist/bin/exe-start-opencode.js +15 -14
  63. package/dist/bin/exe-status.js +25 -23
  64. package/dist/bin/exe-support.js +4 -4
  65. package/dist/bin/exe-team.js +6 -6
  66. package/dist/bin/exe-watchdog.js +16 -6
  67. package/dist/bin/git-sweep.js +32 -22
  68. package/dist/bin/graph-backfill.js +9 -9
  69. package/dist/bin/graph-export.js +8 -8
  70. package/dist/bin/import-history.js +12 -12
  71. package/dist/bin/install.js +107 -102
  72. package/dist/bin/intercom-check.js +5 -5
  73. package/dist/bin/mcp-sessions.js +2 -2
  74. package/dist/bin/orchestration-metrics.js +6 -6
  75. package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
  76. package/dist/bin/postgres-agentic-semantic-backfill.js +3 -3
  77. package/dist/bin/pre-publish.js +1 -1
  78. package/dist/bin/reconcile-backlog.js +2 -2
  79. package/dist/bin/registry-proxy.js +1 -1
  80. package/dist/bin/scan-tasks.js +23 -21
  81. package/dist/bin/setup.js +3 -3
  82. package/dist/bin/shard-migrate.js +8 -8
  83. package/dist/bin/stack-update.js +115 -40
  84. package/dist/bin/verify-stack.js +6 -1
  85. package/dist/bin/vps-health-gate.js +1 -1
  86. package/dist/{boot-generation-LGWKWMCF.js → boot-generation-EZ2Y74IG.js} +5 -5
  87. package/dist/{boot-review-sections-IXBD7UGL.js → boot-review-sections-7CNQTAYR.js} +22 -20
  88. package/dist/{branch-hygiene-UYHJ5SC5.js → branch-hygiene-HFJ3HA62.js} +1 -1
  89. package/dist/{branding-J2MTHQUP.js → branding-GH43W3PU.js} +2 -2
  90. package/dist/build-manifest.json +1072 -1032
  91. package/dist/{capability-cards-3OGBIJRM.js → capability-cards-ZTFMK4VJ.js} +4 -4
  92. package/dist/{capacity-monitor-6VDEATYE.js → capacity-monitor-B2XU4YHP.js} +24 -22
  93. package/dist/{catchup-brief-XYX5SOC6.js → catchup-brief-3BEOL7EV.js} +27 -25
  94. package/dist/{chunk-H5G2VUIX.js → chunk-25EN7XXN.js} +6 -6
  95. package/dist/{chunk-SCGQOY5F.js → chunk-267QB6VB.js} +1 -1
  96. package/dist/{chunk-UXX2JSZO.js → chunk-2ADYTOHQ.js} +20 -1
  97. package/dist/{chunk-7ZBIZFC3.js → chunk-2CWS374F.js} +1 -1
  98. package/dist/{chunk-QY6B23U2.js → chunk-2IZH6W73.js} +3 -3
  99. package/dist/{chunk-OJ56HXDB.js → chunk-3CIMDFXG.js} +1 -1
  100. package/dist/{chunk-B5T43JSQ.js → chunk-4DJDC4Y2.js} +13 -13
  101. package/dist/{chunk-6BDSDDKT.js → chunk-4WOOCTON.js} +3 -3
  102. package/dist/{chunk-P7JLMFKX.js → chunk-52CFP2AV.js} +1 -1
  103. package/dist/{chunk-Y2DUIE6X.js → chunk-53LCVVX5.js} +2 -2
  104. package/dist/{chunk-CAV64C4J.js → chunk-5CH6XKVC.js} +2 -2
  105. package/dist/{chunk-6WBEFNO4.js → chunk-65ZSFW3O.js} +1 -1
  106. package/dist/{chunk-AU7AVWTM.js → chunk-66BFQOWR.js} +4 -4
  107. package/dist/{chunk-HJQILEBL.js → chunk-6MCUXRIP.js} +1 -1
  108. package/dist/{chunk-RKUGAHPO.js → chunk-6NJURKRG.js} +1 -1
  109. package/dist/{chunk-XE23TMKN.js → chunk-7W5LCREK.js} +82 -14
  110. package/dist/{chunk-U4KDN5B7.js → chunk-7W6FDHHY.js} +1 -1
  111. package/dist/{chunk-E6ORBQHP.js → chunk-AAMGHW5W.js} +1 -0
  112. package/dist/{chunk-ZT5PSVWW.js → chunk-AE3PYLLS.js} +11 -11
  113. package/dist/{chunk-G4XMAGTW.js → chunk-AEVE654G.js} +2 -2
  114. package/dist/{chunk-JCVDT3DG.js → chunk-ALKYXAMB.js} +5 -5
  115. package/dist/{chunk-74H5NWLY.js → chunk-ALYI3P5D.js} +2 -2
  116. package/dist/{chunk-FXPWMPU2.js → chunk-BNHAZ65R.js} +42 -50
  117. package/dist/{chunk-UCSD67VW.js → chunk-BQYQES2Z.js} +14 -14
  118. package/dist/{chunk-7WVR5UQF.js → chunk-BTMX2D4X.js} +12 -12
  119. package/dist/chunk-BTSWFMEH.js +14 -0
  120. package/dist/{chunk-W33NLSKN.js → chunk-BY3V5CLX.js} +6 -5
  121. package/dist/{chunk-Z75FBAP2.js → chunk-CDUB5Q6J.js} +1 -1
  122. package/dist/{chunk-W3Q53NBI.js → chunk-CKKLSY7B.js} +299 -26
  123. package/dist/{chunk-NQKZKOYF.js → chunk-CTPG4KYZ.js} +1 -1
  124. package/dist/{chunk-VFYF7EMB.js → chunk-CW2UCKHS.js} +2 -2
  125. package/dist/{chunk-RSDCOZVM.js → chunk-CWBFOAGM.js} +2 -2
  126. package/dist/{chunk-HJVXKDEK.js → chunk-CX4MVEM3.js} +1 -1
  127. package/dist/{chunk-X24VCGZA.js → chunk-CYNL3ZFD.js} +3 -3
  128. package/dist/{chunk-YNR3DSAF.js → chunk-DTTISDTI.js} +2 -2
  129. package/dist/{chunk-6NGFGT23.js → chunk-DXCTHNEF.js} +57 -25
  130. package/dist/{chunk-MM45YT2B.js → chunk-E5HAY3DQ.js} +1 -1
  131. package/dist/{chunk-KSVLBATT.js → chunk-E5QQZDQN.js} +53 -0
  132. package/dist/{chunk-TLBAZU3V.js → chunk-EDZ5URGR.js} +1 -1
  133. package/dist/{chunk-J2OTTJWG.js → chunk-F3PIHVVY.js} +2 -2
  134. package/dist/{chunk-4DJCHH5R.js → chunk-FSIAGX55.js} +1 -1
  135. package/dist/{chunk-HEFM2DBN.js → chunk-GTOMDMJL.js} +21 -27
  136. package/dist/{chunk-6G6JGJD3.js → chunk-GUOMZ3JM.js} +2 -2
  137. package/dist/{chunk-G6EUAI67.js → chunk-H37FSTF2.js} +1 -1
  138. package/dist/{chunk-IR2MLURD.js → chunk-H74466TM.js} +1 -1
  139. package/dist/{chunk-ZACPAM2C.js → chunk-HHGOCBVQ.js} +4 -4
  140. package/dist/{chunk-KAF66DIP.js → chunk-HSBKV5LB.js} +43 -12
  141. package/dist/{chunk-2HRAVECR.js → chunk-IIVFXD6P.js} +1 -1
  142. package/dist/{chunk-JLG3GAQS.js → chunk-J5EYOBFF.js} +1 -1
  143. package/dist/{chunk-M4REI3JS.js → chunk-J6VQ7HYV.js} +5 -5
  144. package/dist/{chunk-YWFFAM2S.js → chunk-JFOZHVNO.js} +1 -1
  145. package/dist/{chunk-P5OPYQZE.js → chunk-JJRZE2LD.js} +2 -2
  146. package/dist/{chunk-DSQCXCPS.js → chunk-JOKKIFRN.js} +3 -3
  147. package/dist/{chunk-X73CND7J.js → chunk-JTB5V6BV.js} +1 -1
  148. package/dist/{chunk-JWLZQSHW.js → chunk-K2OFS57E.js} +2 -2
  149. package/dist/{chunk-4LYIZD3H.js → chunk-KDD26FUY.js} +1 -1
  150. package/dist/{chunk-L3TB7CC3.js → chunk-KM6XSFHP.js} +12 -2
  151. package/dist/{chunk-OFQBR26Y.js → chunk-KOYGRP2L.js} +3 -3
  152. package/dist/{chunk-BIMCKCGZ.js → chunk-LIZ3QQGK.js} +1 -1
  153. package/dist/chunk-LNOS24GV.js +214 -0
  154. package/dist/{chunk-6LNT6NCB.js → chunk-LW5WRSDD.js} +2 -2
  155. package/dist/{chunk-4KFTA7U7.js → chunk-MLPPG2OG.js} +2 -2
  156. package/dist/{chunk-M2IZ3TQT.js → chunk-MQ3N4KZY.js} +1 -1
  157. package/dist/{chunk-34XAUB2R.js → chunk-N3JLNMPF.js} +3 -3
  158. package/dist/{chunk-BRZR76TS.js → chunk-NJFJWQNN.js} +49 -14
  159. package/dist/{chunk-Y4JCCHHJ.js → chunk-NPND34FS.js} +4 -4
  160. package/dist/{chunk-TPXBX2LD.js → chunk-O3F5P6Z5.js} +2 -2
  161. package/dist/{chunk-FLK5IS6R.js → chunk-OADOH45L.js} +3 -3
  162. package/dist/{chunk-6ML32VHG.js → chunk-OISZ2I4X.js} +5 -5
  163. package/dist/{chunk-XI2BLVH6.js → chunk-OPS7KUFV.js} +3 -3
  164. package/dist/{chunk-GVZI4MK2.js → chunk-OUIEDJFO.js} +1 -1
  165. package/dist/{chunk-CA7JP44I.js → chunk-P5XER5QY.js} +3 -3
  166. package/dist/{chunk-5M6LXPR4.js → chunk-P5XTVIEC.js} +3 -3
  167. package/dist/{chunk-6TF4ZOXP.js → chunk-P76VYS6V.js} +207 -60
  168. package/dist/{chunk-XOFIXD5U.js → chunk-PFOJX6CR.js} +5 -5
  169. package/dist/chunk-PFR6EOUY.js +356 -0
  170. package/dist/{agent-heartbeat-I5UPGXAU.js → chunk-PHUHIVD5.js} +4 -5
  171. package/dist/{chunk-VVXXMY6I.js → chunk-PQ6NRLKL.js} +1 -1
  172. package/dist/{chunk-J2W3XZHV.js → chunk-PR3AHVFW.js} +5 -5
  173. package/dist/{chunk-3NETEIM6.js → chunk-PS4NA7PM.js} +1458 -968
  174. package/dist/{chunk-E5TFF3M7.js → chunk-PS6VPW64.js} +1 -1
  175. package/dist/{chunk-OZIDGXKH.js → chunk-PVEM537A.js} +2 -2
  176. package/dist/{chunk-PX2OHZKN.js → chunk-PWCZFIQH.js} +4 -4
  177. package/dist/{chunk-EKOWJXHN.js → chunk-QMSEL5YS.js} +77 -23
  178. package/dist/{chunk-Z6VZ62MY.js → chunk-QS6HI4B6.js} +34 -11
  179. package/dist/{chunk-GETICKB4.js → chunk-QWDZNQXA.js} +3 -3
  180. package/dist/{chunk-ZVZEYHWY.js → chunk-QX33D4CH.js} +32 -38
  181. package/dist/{chunk-TOLJH6XP.js → chunk-R3H3WW7H.js} +2 -2
  182. package/dist/chunk-R4AROSYI.js +496 -0
  183. package/dist/{chunk-CE323JHD.js → chunk-RIECV7SR.js} +1 -1
  184. package/dist/{chunk-IANRPLHA.js → chunk-RLDMUSRM.js} +2 -2
  185. package/dist/{chunk-LYXICKAH.js → chunk-SBJV2PCU.js} +1 -1
  186. package/dist/{chunk-U6E3CLKI.js → chunk-SFKIZYKK.js} +3 -3
  187. package/dist/{chunk-7JR2IRBY.js → chunk-TCR7NBHD.js} +6 -6
  188. package/dist/{chunk-DVPBCGC2.js → chunk-TJSTWACD.js} +2 -2
  189. package/dist/chunk-TX3Q2GIL.js +97 -0
  190. package/dist/{chunk-V3K6FLAS.js → chunk-TZFOWWPM.js} +1 -1
  191. package/dist/{chunk-4FNUBXYO.js → chunk-UI3K73LD.js} +1 -1
  192. package/dist/{chunk-5WADTD5Y.js → chunk-URHJDUWO.js} +1 -1
  193. package/dist/{chunk-K2HYCBAG.js → chunk-V3ISR2QT.js} +17 -6
  194. package/dist/{chunk-UPCXDJ2S.js → chunk-VMJ2UH4S.js} +1 -1
  195. package/dist/{chunk-JQTM2UFN.js → chunk-VV5EZZNT.js} +1 -1
  196. package/dist/{chunk-AA6AD7OM.js → chunk-VY3QUSWS.js} +10 -10
  197. package/dist/{chunk-OPU3NYOO.js → chunk-W2IRQJ6R.js} +12 -0
  198. package/dist/{chunk-5G46JZTE.js → chunk-WBKIU6UJ.js} +3 -3
  199. package/dist/{chunk-EUEESRS6.js → chunk-WCDIDSLR.js} +3 -3
  200. package/dist/{chunk-43PHKRHR.js → chunk-WSLFGJBA.js} +2 -2
  201. package/dist/{chunk-DNRLIHUO.js → chunk-WYVBWDFY.js} +1 -1
  202. package/dist/{chunk-BU36IRW2.js → chunk-X2P43TB2.js} +1 -1
  203. package/dist/{chunk-UIUO3N5Y.js → chunk-XA4EU3CW.js} +2 -2
  204. package/dist/{chunk-AIVK4A5Y.js → chunk-XAMLDTRA.js} +4 -4
  205. package/dist/{chunk-ZSQNPN2W.js → chunk-XKFMNAJ7.js} +1 -1
  206. package/dist/{chunk-5KLQCGI5.js → chunk-XKZD5FGK.js} +55 -0
  207. package/dist/{chunk-AYMOVFBG.js → chunk-XM7HJ5SS.js} +1 -1
  208. package/dist/{chunk-HKQH4R5X.js → chunk-XSXZVKJ7.js} +6 -6
  209. package/dist/{chunk-J4VETNHT.js → chunk-XTEKGO44.js} +1 -1
  210. package/dist/{chunk-2ROXEOGE.js → chunk-XTWHNLGD.js} +1 -1
  211. package/dist/{chunk-MR56CIB5.js → chunk-XUGOVOID.js} +3 -3
  212. package/dist/{chunk-T26JNDO3.js → chunk-XVRQZCTS.js} +2 -2
  213. package/dist/{chunk-O3OGCHUZ.js → chunk-Y4JVM3SI.js} +1 -1
  214. package/dist/{chunk-AUIXAFYX.js → chunk-Y7OK5PJE.js} +5 -5
  215. package/dist/{chunk-PGJG5TCQ.js → chunk-YA4PM3MV.js} +3 -3
  216. package/dist/{chunk-J7EXACGN.js → chunk-YYA5LXCT.js} +1 -1
  217. package/dist/{chunk-JVLQJWUG.js → chunk-YYLVHUYZ.js} +1 -1
  218. package/dist/{chunk-TF5T2ASS.js → chunk-Z5Z3MYUW.js} +3 -3
  219. package/dist/chunk-ZNUJFX7L.js +135 -0
  220. package/dist/{chunk-K5RPFS6A.js → chunk-ZSHLY5BS.js} +1 -1
  221. package/dist/{chunk-ECVWCFY4.js → chunk-ZVTKWWLV.js} +2 -2
  222. package/dist/{chunk-ASBMFQAY.js → chunk-ZZ3JQM5I.js} +9 -9
  223. package/dist/{chunk-JN7IFPIQ.js → chunk-ZZXMB5F2.js} +1 -1
  224. package/dist/{cleanup-graph-garbage-MLRFYWDJ.js → cleanup-graph-garbage-XDIX3HLN.js} +9 -9
  225. package/dist/{cloud-sync-command-LU5KLLQY.js → cloud-sync-command-VPYE4FIH.js} +2 -2
  226. package/dist/{cloud-sync-db-init-G7LBCE7T.js → cloud-sync-db-init-NSDBTFGI.js} +1 -1
  227. package/dist/{cloud-sync-shutdown-4IZXMEKK.js → cloud-sync-shutdown-6OUYTG4T.js} +4 -4
  228. package/dist/{co-activation-FCEZYVGI.js → co-activation-EAAKGGZH.js} +4 -4
  229. package/dist/{co-occurrence-5WBK7HPH.js → co-occurrence-OFVF55RX.js} +7 -7
  230. package/dist/{code-context-index-4EQJW44K.js → code-context-index-XOP6TLPZ.js} +5 -4
  231. package/dist/codex-consolidation-PPXNBXCV.js +96 -0
  232. package/dist/{conversation-entity-extractor-JXAKVKF2.js → conversation-entity-extractor-ZR5GFKAI.js} +3 -3
  233. package/dist/{conversation-wiki-populator-6BCICVAB.js → conversation-wiki-populator-EBUZXYEU.js} +1 -1
  234. package/dist/{crdt-sync-RTAWVLV4.js → crdt-sync-FGH4SBFW.js} +1 -1
  235. package/dist/{crm-webhook-EWALI4C5.js → crm-webhook-PJATR2DC.js} +2 -2
  236. package/dist/{cto-delegation-gate-HU4YUH7C.js → cto-delegation-gate-PO4LSSQ4.js} +38 -21
  237. package/dist/{daemon-auth-LXP5I6BA.js → daemon-auth-SSPY5ODS.js} +2 -2
  238. package/dist/{daemon-orchestration-35RSNUNI.js → daemon-orchestration-IJFZFQUX.js} +27 -25
  239. package/dist/{daemon-ready-ZC2ANOR3.js → daemon-ready-MKBH4QWD.js} +1 -1
  240. package/dist/db-integrity-events-5DTASXJF.js +22 -0
  241. package/dist/{db-restore-events-NBARRGAC.js → db-restore-events-2FI4ZMKA.js} +1 -1
  242. package/dist/{doc-graph-extractor-PTNIPSDV.js → doc-graph-extractor-CAYUAM5A.js} +7 -7
  243. package/dist/{documents-BUFAJHVZ.js → documents-W2G477QE.js} +12 -11
  244. package/dist/{dreaming-ZPUWXFEJ.js → dreaming-FVXSIIWV.js} +26 -24
  245. package/dist/{employee-boot-brief-QD2SP4FM.js → employee-boot-brief-OYMSHFHA.js} +29 -27
  246. package/dist/{exe-drift-KCZFM2RP.js → exe-drift-67RGJOBX.js} +5 -5
  247. package/dist/{exe-export-W2SXNMYL.js → exe-export-SGYX6XZG.js} +14 -13
  248. package/dist/{exe-import-YCYNUMER.js → exe-import-UABVA5N3.js} +14 -13
  249. package/dist/{exe-key-7IIKQRR2.js → exe-key-XNYDCVFE.js} +107 -102
  250. package/dist/{exe-org-223EX7VP.js → exe-org-XJVSU5HN.js} +23 -23
  251. package/dist/{exe-snapshot-QX3RERAL.js → exe-snapshot-YXOGYZUX.js} +30 -37
  252. package/dist/{fast-db-init-PAC3C5O5.js → fast-db-init-GDFJY5UH.js} +1 -1
  253. package/dist/{founder-context-XM47756J.js → founder-context-KUXSNXKS.js} +3 -3
  254. package/dist/{founder-monitor-envelope-4WFWI26F.js → founder-monitor-envelope-5KTKNL5G.js} +4 -4
  255. package/dist/{fts-integrity-4M2MF2LQ.js → fts-integrity-LKAZEZJE.js} +2 -2
  256. package/dist/gateway/index.js +10 -10
  257. package/dist/{git-staleness-XT6GXOYG.js → git-staleness-NN6RWNLW.js} +4 -4
  258. package/dist/{global-procedures-QICIAC33.js → global-procedures-XDNA3TNA.js} +6 -6
  259. package/dist/{graph-auto-extract-RYX57CW5.js → graph-auto-extract-KTOR45V4.js} +7 -7
  260. package/dist/{graph-rag-MOBZTWOD.js → graph-rag-L5NV5YWD.js} +3 -3
  261. package/dist/{hook-integrity-LGUYWWQX.js → hook-integrity-X3YAVGUW.js} +1 -1
  262. package/dist/{hook-prefetch-VE2NXAFN.js → hook-prefetch-WE4MIXBM.js} +23 -21
  263. package/dist/hooks/bug-report-worker.js +27 -25
  264. package/dist/hooks/codex-stop-task-finalizer.js +29 -27
  265. package/dist/hooks/commit-complete.js +42 -27
  266. package/dist/hooks/error-recall.js +11 -11
  267. package/dist/hooks/exe-heartbeat-hook.js +7 -7
  268. package/dist/hooks/ingest-worker.js +10 -9
  269. package/dist/hooks/ingest.js +18 -17
  270. package/dist/hooks/instructions-loaded.js +12 -9
  271. package/dist/hooks/manifest.json +20 -20
  272. package/dist/hooks/notification.js +8 -8
  273. package/dist/hooks/post-compact.js +7 -7
  274. package/dist/hooks/post-tool-combined.js +16 -15
  275. package/dist/hooks/pre-compact.js +28 -26
  276. package/dist/hooks/pre-tool-use.js +79 -33
  277. package/dist/hooks/prompt-submit.js +42 -40
  278. package/dist/hooks/session-end.js +128 -111
  279. package/dist/hooks/session-start.js +20 -20
  280. package/dist/hooks/stop.js +101 -34
  281. package/dist/hooks/subagent-stop.js +29 -27
  282. package/dist/hooks/summary-worker.js +32 -30
  283. package/dist/index.js +34 -32
  284. package/dist/{installer-4VXHJEVU.js → installer-EAAYEEEF.js} +8 -8
  285. package/dist/{installer-CH7GIFHI.js → installer-EPQAOI6M.js} +154 -10
  286. package/dist/{installer-IK4HFXD4.js → installer-UDRMFY75.js} +8 -8
  287. package/dist/{intercom-queue-PI5APF65.js → intercom-queue-IBOAVT2I.js} +22 -20
  288. package/dist/{key-backup-status-G7CHESRL.js → key-backup-status-6L2ARCXW.js} +1 -1
  289. package/dist/lib/agent-config.js +2 -2
  290. package/dist/lib/cloud-sync.js +19 -18
  291. package/dist/lib/config.js +1 -1
  292. package/dist/lib/consolidation.js +9 -9
  293. package/dist/lib/database.js +4 -4
  294. package/dist/lib/db-backup.js +2 -2
  295. package/dist/lib/db-daemon-client.js +5 -4
  296. package/dist/lib/db-write-worker.js +3 -3
  297. package/dist/lib/db.js +4 -4
  298. package/dist/lib/device-registry.js +2 -2
  299. package/dist/lib/embed-worker.js +1 -1
  300. package/dist/lib/embedder.js +5 -4
  301. package/dist/lib/employee-templates.js +7 -7
  302. package/dist/lib/employees.js +4 -4
  303. package/dist/lib/exe-daemon-client.js +4 -3
  304. package/dist/lib/exe-daemon.js +219 -112
  305. package/dist/lib/hybrid-search.js +8 -8
  306. package/dist/lib/identity-templates.js +1 -1
  307. package/dist/lib/identity.js +4 -4
  308. package/dist/lib/license.js +3 -3
  309. package/dist/lib/messaging.js +23 -21
  310. package/dist/lib/post-tool-memory.js +2 -2
  311. package/dist/lib/registry-proxy.js +1 -1
  312. package/dist/lib/reminders.js +5 -5
  313. package/dist/lib/schedules.js +8 -8
  314. package/dist/lib/session-registry.js +6 -6
  315. package/dist/lib/skill-learning.js +13 -12
  316. package/dist/lib/status-brief.js +4 -3
  317. package/dist/lib/store.js +7 -7
  318. package/dist/lib/task-router.js +5 -5
  319. package/dist/lib/tasks.js +24 -22
  320. package/dist/lib/tmux-routing.js +22 -20
  321. package/dist/lib/token-spend.js +5 -5
  322. package/dist/{license-gate-Z5YXTWMH.js → license-gate-3TTWJABL.js} +4 -4
  323. package/dist/{license-sync-LLX3FTHY.js → license-sync-ZC6TPKVV.js} +3 -3
  324. package/dist/mcp/register-tools.js +104 -99
  325. package/dist/mcp/server.js +106 -101
  326. package/dist/mcp/tools/complete-reminder.js +6 -6
  327. package/dist/mcp/tools/create-reminder.js +6 -6
  328. package/dist/mcp/tools/create-task.js +27 -25
  329. package/dist/mcp/tools/deactivate-behavior.js +15 -14
  330. package/dist/mcp/tools/list-reminders.js +6 -6
  331. package/dist/mcp/tools/list-tasks.js +27 -25
  332. package/dist/mcp/tools/send-message.js +26 -24
  333. package/dist/mcp/tools/update-task.js +25 -23
  334. package/dist/{mcp-http-config-PTGZH6RV.js → mcp-http-config-ROF5EPEF.js} +5 -5
  335. package/dist/{mcp-session-identity-JRR4ZW2F.js → mcp-session-identity-ERU6FEUB.js} +22 -20
  336. package/dist/{memory-cards-ENOF74LR.js → memory-cards-3QTXI2SG.js} +7 -7
  337. package/dist/{memory-graph-extractor-V4ZUDCUN.js → memory-graph-extractor-7GAILMYG.js} +8 -8
  338. package/dist/{memory-poisoning-defense-VNCV5BFL.js → memory-poisoning-defense-TPXSRJTQ.js} +4 -4
  339. package/dist/{memory-pressure-watchdog-5WKDX7KP.js → memory-pressure-watchdog-ZSOP6T2F.js} +23 -21
  340. package/dist/{memory-queue-RD5CSMSC.js → memory-queue-QJNWKWKG.js} +2 -2
  341. package/dist/{memory-queue-client-2NHZQRSD.js → memory-queue-client-HIHCA3W4.js} +6 -5
  342. package/dist/{memory-reflection-H7AGGSO5.js → memory-reflection-3AI4JBV2.js} +4 -4
  343. package/dist/{monitor-grants-5KVETEJB.js → monitor-grants-BW2WL4IU.js} +3 -3
  344. package/dist/{notification-ledger-4DRPS7GP.js → notification-ledger-ZU7ZFJJX.js} +26 -23
  345. package/dist/{notifications-ZNIPKB3G.js → notifications-S4GU22GF.js} +22 -20
  346. package/dist/{orchestration-events-FWR64GIC.js → orchestration-events-HVG56HJ5.js} +5 -5
  347. package/dist/{orchestration-phase-ZED4QYF3.js → orchestration-phase-UDS24CVQ.js} +2 -2
  348. package/dist/{orchestrator-AVQRCIMG.js → orchestrator-UW3Q3WYG.js} +24 -22
  349. package/dist/{org-brief-session-XK2BTYHE.js → org-brief-session-G36TJBN4.js} +12 -12
  350. package/dist/{org-consent-policy-ULCYJC4W.js → org-consent-policy-RMYVMM3X.js} +1 -1
  351. package/dist/{org-join-P6PHLFFK.js → org-join-BMBQDMVF.js} +7 -7
  352. package/dist/{org-key-admin-BXGBQ3XY.js → org-key-admin-SCCVVE2H.js} +8 -8
  353. package/dist/{org-key-pin-CVVHZIMZ.js → org-key-pin-5WUSPGVN.js} +3 -3
  354. package/dist/{org-membership-VC54DLZ7.js → org-membership-ESALTLLN.js} +4 -4
  355. package/dist/{org-partner-config-VQVT62IZ.js → org-partner-config-YKHPDPZR.js} +6 -6
  356. package/dist/{org-partner-runtime-CCXM2LEA.js → org-partner-runtime-KXMGEYFW.js} +12 -12
  357. package/dist/{org-row-visibility-OSDGUOYT.js → org-row-visibility-UI5PGN76.js} +1 -1
  358. package/dist/{pipeline-router-YA6JZ7SA.js → pipeline-router-IODWXDDI.js} +5 -5
  359. package/dist/{plan-limits-YC6TLA4S.js → plan-limits-XMAQVEJZ.js} +7 -7
  360. package/dist/{platform-procedures-QNOMEXJF.js → platform-procedures-44NDFTB6.js} +1 -1
  361. package/dist/{postinstall-failure-M6PCKX4P.js → postinstall-failure-B2JHNFPM.js} +2 -2
  362. package/dist/{project-boot-INRUUEND.js → project-boot-LCFBQ6NB.js} +9 -1
  363. package/dist/project-name-ILJTETUE.js +14 -0
  364. package/dist/{projection-worker-G3AO6ASG.js → projection-worker-6LZUCI3B.js} +4 -4
  365. package/dist/{prospective-memory-GXCBC5WL.js → prospective-memory-G5VK5GCD.js} +4 -4
  366. package/dist/{push-notifications-BZZJTMN6.js → push-notifications-S2RYRXLF.js} +23 -21
  367. package/dist/reproject-worktree-memories-IXYGHTGA.js +224 -0
  368. package/dist/{reranker-O3NLXWT3.js → reranker-EHQTAA3L.js} +2 -2
  369. package/dist/{retrieval-health-5OSAJIQF.js → retrieval-health-WZ4ICGNF.js} +5 -1
  370. package/dist/{review-polling-3D2KID2T.js → review-polling-MAWLRDSP.js} +23 -21
  371. package/dist/runtime/index.js +31 -29
  372. package/dist/{session-events-KJKEKAXC.js → session-events-BRUIZ5E4.js} +23 -21
  373. package/dist/{session-kill-telemetry-RRAZEXLS.js → session-kill-telemetry-PTZLHT33.js} +23 -21
  374. package/dist/{session-mcp-config-JTPM2XBN.js → session-mcp-config-F7KATWOF.js} +2 -2
  375. package/dist/{session-scope-IPEVYKRA.js → session-scope-G4RVJJGR.js} +23 -21
  376. package/dist/{setup-wizard-7XF4NFQK.js → setup-wizard-WFEUB63Z.js} +3 -3
  377. package/dist/{shard-manager-FW4KRSE4.js → shard-manager-UROHZE46.js} +2 -2
  378. package/dist/{skill-refinement-5444QK44.js → skill-refinement-2OYPH7WD.js} +5 -5
  379. package/dist/{stack-promote-FZAXOG5N.js → stack-promote-DLYYQXQI.js} +6 -5
  380. package/dist/{stack-release-AF4KZWQA.js → stack-release-OPWARLXI.js} +6 -5
  381. package/dist/{stack-update-RIL3XYZG.js → stack-update-SJ43IEQE.js} +39 -6
  382. package/dist/{steward-gate-V3CDSK35.js → steward-gate-V7PBGVFK.js} +5 -5
  383. package/dist/{subagent-brief-injection-WZJRP6VC.js → subagent-brief-injection-BLCRI2AJ.js} +31 -29
  384. package/dist/{subagent-spawn-ledger-P6Q6JX3E.js → subagent-spawn-ledger-USYZXU3M.js} +4 -2
  385. package/dist/{support-inbox-45CEKHAK.js → support-inbox-6HOQYFD2.js} +4 -4
  386. package/dist/{task-enforcement-HG6LBTYU.js → task-enforcement-EF6O2V26.js} +23 -21
  387. package/dist/{task-request-inbox-ZIQW2TPL.js → task-request-inbox-OB2KIJWO.js} +1 -1
  388. package/dist/{task-scope-ZWRHD2PQ.js → task-scope-74JBTKJN.js} +26 -23
  389. package/dist/{tasks-crud-QN33WNXT.js → tasks-crud-ZU6RZDEZ.js} +22 -20
  390. package/dist/{tasks-notify-DQKP253B.js → tasks-notify-767DRYAA.js} +23 -21
  391. package/dist/{tasks-review-P7JTBLWK.js → tasks-review-4F6PZZ3B.js} +22 -20
  392. package/dist/{telemetry-upload-55GD4D27.js → telemetry-upload-2JM6KIAB.js} +9 -9
  393. package/dist/{token-budget-PPDT7CLD.js → token-budget-NH2RD4YX.js} +5 -5
  394. package/dist/{tool-capability-index-MOZ5EOIO.js → tool-capability-index-BT2GGLLI.js} +1 -1
  395. package/dist/{tool-gates-3IC7DK4R.js → tool-gates-2OZY3GZM.js} +1 -1
  396. package/dist/{tool-gates-GXSYBVK4.js → tool-gates-7PLIOLAL.js} +1 -1
  397. package/dist/{tool-telemetry-R27EMAEB.js → tool-telemetry-CHCBD4OQ.js} +1 -1
  398. package/dist/tui/App.js +37 -35
  399. package/dist/{tui-data-KJNJBAAT.js → tui-data-244GF3BI.js} +22 -20
  400. package/dist/{update-support-VDS4ME3L.js → update-support-P2LO3DAB.js} +16 -15
  401. package/dist/work-claims-4QOE7DT2.js +53 -0
  402. package/dist/{work-state-heartbeat-RUE6ETPX.js → work-state-heartbeat-GX3VWWWK.js} +1 -1
  403. package/dist/{worker-gate-LAXZSHSZ.js → worker-gate-62PZATOV.js} +2 -2
  404. package/dist/{workflow-engine-RPKV7XM3.js → workflow-engine-7YIRU62F.js} +2 -2
  405. package/dist/{worktree-6LRKLO2U.js → worktree-3TUKIZWY.js} +6 -6
  406. package/dist/{worktree-sweep-NAPVXZHQ.js → worktree-sweep-MYQHUXDE.js} +7 -7
  407. package/package.json +8 -2
  408. package/release-notes.json +90 -89
  409. package/src/commands/exe/call.md +6 -4
  410. package/src/commands/exe-reference.md +11 -7
  411. package/src/commands/exe.md +16 -20
  412. package/dist/chunk-6MQWZZS5.js +0 -275
  413. package/dist/chunk-CTXNEZFW.js +0 -78
  414. package/dist/db-integrity-events-RBX7FN5E.js +0 -16
  415. package/dist/project-name-EWG5KAZP.js +0 -10
  416. /package/dist/{chunk-GSWAKK5Q.js → chunk-62U63R3E.js} +0 -0
  417. /package/dist/{chunk-HVMZBCP4.js → chunk-6CAX7YH4.js} +0 -0
  418. /package/dist/{chunk-CLCNYC3F.js → chunk-BTFDA3UJ.js} +0 -0
  419. /package/dist/{chunk-VNVDUM5X.js → chunk-DAXFAXLN.js} +0 -0
  420. /package/dist/{chunk-3DWNESVC.js → chunk-FLP2BQOA.js} +0 -0
  421. /package/dist/{chunk-ESOETGYC.js → chunk-JLYHJJHU.js} +0 -0
  422. /package/dist/{chunk-W352QOGG.js → chunk-JZBZI36P.js} +0 -0
  423. /package/dist/{chunk-QKOLA6FI.js → chunk-WM7Y5ZV2.js} +0 -0
  424. /package/dist/{chunk-IY7LTYEP.js → chunk-YNPOELAN.js} +0 -0
  425. /package/dist/{chunk-7VBIK4HP.js → chunk-YSDIJ3VI.js} +0 -0
  426. /package/dist/{core-memory-RZHRZPKR.js → core-memory-EARETDZ6.js} +0 -0
  427. /package/dist/{entity-boost-ZLQIQ4JU.js → entity-boost-CDFAXVYL.js} +0 -0
  428. /package/dist/{memory-isolation-OSZBBUHB.js → memory-isolation-XASOGA7G.js} +0 -0
  429. /package/dist/{message-queue-client-UKGJ6QKQ.js → message-queue-client-PL2POQOV.js} +0 -0
  430. /package/dist/{oauth-server-MHOTAUOI.js → oauth-server-C3BXAKAW.js} +0 -0
  431. /package/dist/{webhook-pipe-BVLWBMIC.js → webhook-pipe-UQSEHFPO.js} +0 -0
  432. /package/dist/{wiki-acl-E24PM3YR.js → wiki-acl-XQH4UBP2.js} +0 -0
  433. /package/dist/{wiki-client-ZDPDQDX2.js → wiki-client-AXNM5FWY.js} +0 -0
@@ -51,7 +51,7 @@ SMTP_PASS=
51
51
  # --- Auth gateway (exe-auth — shared SSO sign-in UI at auth.<domain>) ---
52
52
  # Bug 58840873: pin the auth image so compose never falls back to its stale
53
53
  # hardcoded default tag. Keep in sync with the manifest AUTH_IMAGE_TAG.
54
- AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.2.0
54
+ AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.5.0
55
55
  # Bug 379e5c13: server_name / CORS from the CONFIGURED apex domain, not by naive
56
56
  # last-2-label slicing (which breaks company.co.uk → co.uk).
57
57
  AUTH_SERVER_NAME=auth.CHANGEME_DOMAIN
@@ -61,10 +61,45 @@ AUTH_DEFAULT_PRODUCT=AUTH
61
61
  # the sign-up UI/route instead of showing a form that always fails.
62
62
  AUTH_DISABLE_SIGNUP=true
63
63
 
64
+ # --- Centralized role administration (permissions) ---
65
+ # The apps refuse to let an unmanaged first login mint its own admin
66
+ # (exe-crm#102 / exe-wiki#45). Both flags below are therefore left at their
67
+ # SECURE default of true, stated explicitly rather than inherited silently.
68
+ #
69
+ # Because of that, a fresh CRM gets its first admin from EXE_CRM_ADMIN_EMAIL
70
+ # in the CRM section below — NOT from whoever signs in first. That user is
71
+ # seeded at boot, so their sign-in is an existing-user login and is allowed;
72
+ # every OTHER unmanaged first login is still refused. If you leave
73
+ # EXE_CRM_ADMIN_EMAIL empty, the seed silently does not happen and the CRM
74
+ # cannot be bootstrapped at all. The wiki does not need this: its first admin
75
+ # comes from POST /system/enable-multi-user, authorised by WIKI_AUTH_TOKEN.
76
+ CRM_REQUIRE_MANAGED_PERMS=true
77
+ WIKI_REQUIRE_MANAGED_PERMS=true
78
+ #
79
+ # MANAGED MODE — roles set ONLY in the Exe dashboard. Empty means unmanaged:
80
+ # no token can carry permissions for an org that was never named. To adopt it:
81
+ # EXE_ORG_ID=<org id from the Exe dashboard>
82
+ # EXE_ORG_WORKSPACE_ID=<the org's canonical ACTIVE CRM workspace>
83
+ # EXE_ORG_WORKSPACE_ID must ALREADY EXIST and have a legitimate admin, because
84
+ # managed users join THAT workspace instead of creating their own. That is why
85
+ # managed mode cannot be the shipped default: on a fresh stack the workspace
86
+ # does not exist yet, so its id is unknowable at install time. Bootstrap the
87
+ # stack first, then set these and redeploy. The wiki needs only EXE_ORG_ID.
88
+ EXE_ORG_ID=
89
+ EXE_ORG_WORKSPACE_ID=
90
+
64
91
  # --- CRM ---
65
92
  CRM_IMAGE_TAG=update.askexe.com/askexe/exe-crm:v0.9.51
66
93
  CRM_SERVER_URL=https://crm.CHANGEME_DOMAIN
67
94
  CRM_APP_SECRET=CHANGEME_CRM_APP_SECRET
95
+ # The CRM's first admin — seeded at boot by WorkspaceBootstrapService, which is
96
+ # what makes that person an EXISTING user whose sign-in is allowed while every
97
+ # other unmanaged first login is refused (e51ca54c §10.6b). Must be a real
98
+ # mailbox that also exists in GoTrue (CUSTOMER-GUIDE Step 6), so it cannot be
99
+ # generated. Leave it empty and the seed silently throws: the CRM comes up
100
+ # healthy with no workspace and no user, and nobody can ever sign in.
101
+ # SET_MANUALLY
102
+ EXE_CRM_ADMIN_EMAIL=CHANGEME_ADMIN_EMAIL
68
103
  CRM_HOST_PORT=3000
69
104
 
70
105
  # --- Wiki ---
@@ -80,21 +80,59 @@ SMTP_PASS=
80
80
  # Bug 58840873: pin the auth image so compose never falls back to its stale
81
81
  # hardcoded default tag. Keep in sync with the manifest AUTH_IMAGE_TAG. exe-auth
82
82
  # ships only from the private update.askexe.com registry (no GHCR mirror).
83
- AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.2.0
83
+ AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.5.0
84
84
  # Bug 379e5c13: server_name / CORS derived from the CONFIGURED apex domain,
85
85
  # not by naive last-2-label slicing (which breaks company.co.uk → co.uk).
86
86
  AUTH_SERVER_NAME=auth.CHANGEME_DOMAIN
87
87
  AUTH_CORS_ORIGIN=https://CHANGEME_DOMAIN
88
88
  AUTH_DEFAULT_PRODUCT=AUTH
89
+ # Brand word after the gold "EXE" in the login logo (exe-auth v0.5.0+). One
90
+ # identity for the whole front door — ?product= never rebrands the page. Leave
91
+ # unset for the stack default "EXE INTELLIGENCE"; white-label deploys set their
92
+ # own word here.
93
+ #AUTH_BRAND_NAME=INTELLIGENCE
89
94
  # Bug 5960ebb1: invite-only — mirror GOTRUE_DISABLE_SIGNUP so the auth SPA hides
90
95
  # the sign-up UI/route instead of showing a form that always fails.
91
96
  AUTH_DISABLE_SIGNUP=true
92
97
 
98
+ # --- Centralized role administration (permissions) ---
99
+ # The apps refuse to let an unmanaged first login mint its own admin
100
+ # (exe-crm#102 / exe-wiki#45). Both flags below are therefore left at their
101
+ # SECURE default of true, stated explicitly rather than inherited silently.
102
+ #
103
+ # Because of that, a fresh CRM gets its first admin from EXE_CRM_ADMIN_EMAIL
104
+ # in the CRM section below — NOT from whoever signs in first. That user is
105
+ # seeded at boot, so their sign-in is an existing-user login and is allowed;
106
+ # every OTHER unmanaged first login is still refused. If you leave
107
+ # EXE_CRM_ADMIN_EMAIL empty, the seed silently does not happen and the CRM
108
+ # cannot be bootstrapped at all. The wiki does not need this: its first admin
109
+ # comes from POST /system/enable-multi-user, authorised by WIKI_AUTH_TOKEN.
110
+ CRM_REQUIRE_MANAGED_PERMS=true
111
+ WIKI_REQUIRE_MANAGED_PERMS=true
112
+ #
113
+ # MANAGED MODE — roles set ONLY in the Exe dashboard. Empty means unmanaged:
114
+ # no token can carry permissions for an org that was never named. To adopt it:
115
+ # EXE_ORG_ID=<org id from the Exe dashboard>
116
+ # EXE_ORG_WORKSPACE_ID=<the org's canonical ACTIVE CRM workspace>
117
+ # EXE_ORG_WORKSPACE_ID must ALREADY EXIST and have a legitimate admin, because
118
+ # managed users join THAT workspace instead of creating their own. That is why
119
+ # managed mode cannot be the shipped default: on a fresh stack the workspace
120
+ # does not exist yet, so its id is unknowable at install time. Bootstrap the
121
+ # stack first, then set these and redeploy. The wiki needs only EXE_ORG_ID.
122
+ EXE_ORG_ID=
123
+ EXE_ORG_WORKSPACE_ID=
124
+
93
125
  # --- CRM ---
94
126
  CRM_IMAGE_TAG=ghcr.io/askexe/exe-crm:v0.9.51
95
127
  CRM_SERVER_URL=https://crm.CHANGEME_DOMAIN
96
128
  CRM_APP_SECRET=CHANGEME_CRM_APP_SECRET
97
129
  EXE_CRM_ADMIN_TOKEN=CHANGEME_EXE_CRM_ADMIN_TOKEN
130
+ # The CRM's first admin — seeded at boot by WorkspaceBootstrapService, which
131
+ # is what makes that person an EXISTING user whose sign-in is allowed while
132
+ # every other unmanaged first login is refused (e51ca54c §10.6b). Must be a
133
+ # real mailbox that also exists in GoTrue, so it cannot be generated.
134
+ # SET_MANUALLY
135
+ EXE_CRM_ADMIN_EMAIL=CHANGEME_ADMIN_EMAIL
98
136
  CRM_HOST_PORT=3000
99
137
 
100
138
  # --- Wiki ---
@@ -254,7 +254,7 @@ services:
254
254
  options: { max-size: "10m", max-file: "3" }
255
255
 
256
256
  exe-monitor-hub:
257
- image: ${MONITOR_HUB_IMAGE_TAG:-ghcr.io/askexe/exe-monitor-hub:v0.9.5}
257
+ image: ${MONITOR_HUB_IMAGE_TAG:-ghcr.io/askexe/exe-monitor-hub:v0.9.5@sha256:1af31893cc8b1e51892be7d7705fa6c6b3108af8366b1fa8da2879d8ae21ec88}
258
258
  container_name: exe-monitor-hub
259
259
  restart: unless-stopped
260
260
  # bug d3d49101 / 1fdb8be9: PocketBase's data dir for this hub is a RELATIVE
@@ -332,7 +332,7 @@ services:
332
332
  # ------------------------------------------------------------------
333
333
 
334
334
  exe-crm:
335
- image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.51}
335
+ image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.51@sha256:73864ce14aaac06b73d67100bbf88e669fd13c7da39edd9644107037211559b7}
336
336
  container_name: exe-crm
337
337
  restart: unless-stopped
338
338
  # bug ad4471ad: NO compose `command` override. The image entrypoint
@@ -368,7 +368,52 @@ services:
368
368
  MONITOR_API_KEY: ${MONITOR_API_KEY:-${EXE_MONITOR_KEY:-}}
369
369
  APP_SECRET: ${CRM_APP_SECRET:?CRM_APP_SECRET is required}
370
370
  EXE_CRM_ADMIN_TOKEN: ${EXE_CRM_ADMIN_TOKEN:-}
371
+ # ── Centralized role administration (e51ca54c §10.6b) ──────────────────
372
+ # READ BEFORE CHANGING. These four values decide whether a fresh install
373
+ # can seat an administrator at all, and whether a stranger can seat
374
+ # himself. Both failure modes are one empty variable away.
375
+ #
376
+ # HOW A FIRST ADMIN IS MEANT TO APPEAR. On an empty database
377
+ # WorkspaceBootstrapService (workspace-bootstrap.service.ts, OnModuleInit)
378
+ # seeds one workspace (activationStatus=PENDING_CREATION) plus the user
379
+ # named by EXE_CRM_ADMIN_EMAIL. When that person later signs in through
380
+ # GoTrue they are an EXISTING user, so the first-login path is never
381
+ # entered; the pending workspace is activated and setupDefaultRoles grants
382
+ # them Admin. The first admin is therefore chosen by the OPERATOR, in this
383
+ # file, before anyone logs in.
384
+ #
385
+ # WHY EXE_CRM_ADMIN_EMAIL IS NOT OPTIONAL IN PRACTICE. bootstrapIfEmpty()
386
+ # THROWS when it is empty, and onModuleInit swallows that error as
387
+ # "non-fatal" — the CRM boots healthy with no workspace and no user. Leave
388
+ # it unset and the seed silently does not happen; the next sign-in is then
389
+ # a FIRST login, which exe-crm#102 refuses (403), and the
390
+ # POST /api/auth/admin-token break-glass also fails ("No workspace found"),
391
+ # because it activates an existing workspace and never creates one. That is
392
+ # a fresh install nobody can ever get into. It is left `:-` rather than
393
+ # `:?` ONLY so that already-provisioned customer stacks keep parsing this
394
+ # file; a NEW install that omits it is broken, which is why generate-env.ts
395
+ # now emits it and .env.customer.example marks it SET_MANUALLY.
371
396
  EXE_CRM_ADMIN_EMAIL: ${EXE_CRM_ADMIN_EMAIL:-}
397
+ # The guard itself stays at its SECURE default, stated rather than
398
+ # inherited. exe-crm#102 makes managed-permissions required by default so
399
+ # an unmanaged FIRST login can no longer create a workspace and take its
400
+ # Admin role. Because the bootstrap above seats the intended owner as an
401
+ # existing user, keeping this ON costs a correct install nothing — and it
402
+ # still refuses every OTHER unmanaged first login. Set it to false only for
403
+ # a deliberate no-control-plane bootstrap where you accept that the first
404
+ # unmanaged sign-in becomes a workspace Admin; the app logs that choice as
405
+ # a SECURITY DOWNGRADE on every boot.
406
+ CRM_REQUIRE_MANAGED_PERMS: ${CRM_REQUIRE_MANAGED_PERMS:-true}
407
+ # Managed mode (roles set ONLY in the Exe dashboard). Empty here means
408
+ # unmanaged: no token can carry permissions for an org that was never
409
+ # named, so every login resolves { managed: false }. To adopt it, set both
410
+ # — EXE_ORG_WORKSPACE_ID must name an ALREADY-EXISTING active workspace
411
+ # with a legitimate admin, because managed users join THAT workspace
412
+ # instead of minting their own. That ordering is why managed mode cannot be
413
+ # the shipped default: on a fresh stack the workspace does not exist yet,
414
+ # so its id is unknowable at install time. Bootstrap first, then adopt.
415
+ EXE_ORG_ID: ${EXE_ORG_ID:-}
416
+ EXE_ORG_WORKSPACE_ID: ${EXE_ORG_WORKSPACE_ID:-}
372
417
  GOTRUE_URL: http://gotrue:9999
373
418
  # Bug 51086951: the EXPECTED JWT issuer. GOTRUE_URL above is the INTERNAL
374
419
  # address used to call GoTrue, but browser tokens are signed with the PUBLIC
@@ -413,7 +458,7 @@ services:
413
458
  options: { max-size: "10m", max-file: "3" }
414
459
 
415
460
  exe-crm-worker:
416
- image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.51}
461
+ image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.51@sha256:73864ce14aaac06b73d67100bbf88e669fd13c7da39edd9644107037211559b7}
417
462
  container_name: exe-crm-worker
418
463
  restart: unless-stopped
419
464
  command: ["yarn", "worker:prod"]
@@ -515,7 +560,7 @@ services:
515
560
  options: { max-size: "10m", max-file: "3" }
516
561
 
517
562
  exe-wiki:
518
- image: ${WIKI_IMAGE_TAG:-ghcr.io/askexe/exe-wiki:v0.9.26}
563
+ image: ${WIKI_IMAGE_TAG:-ghcr.io/askexe/exe-wiki:v0.9.26@sha256:c0d61d183b274a67977fdfb1b40d5e4736559a9d90507843183e5642da2a959d}
519
564
  container_name: exe-wiki
520
565
  restart: unless-stopped
521
566
  # Wiki uses Prisma — runs migrate on boot via built-in entrypoint.
@@ -561,6 +606,29 @@ services:
561
606
  DATABASE_URL: postgres://${POSTGRES_USER:-exe}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@exe-db:5432/${POSTGRES_DB:-exedb}?schema=${WIKI_DB_SCHEMA:-public}&sslmode=disable
562
607
  AUTH_TOKEN: ${WIKI_AUTH_TOKEN:?WIKI_AUTH_TOKEN is required}
563
608
  EXE_WIKI_ADMIN_TOKEN: ${EXE_WIKI_ADMIN_TOKEN:-}
609
+ # ── Centralized role administration (e51ca54c §10.6b) ──────────────────
610
+ # The wiki keeps the SECURE default, stated rather than inherited.
611
+ #
612
+ # exe-wiki#45 makes WIKI_REQUIRE_MANAGED_PERMS default ON: an unmanaged
613
+ # identity (which is every identity while EXE_ORG_ID is empty) provisions
614
+ # as a non-privileged `default` — it can sign in, gets no admin and no
615
+ # workspace, and sees "contact your administrator to request access to a
616
+ # team". Unlike the CRM this does NOT strand a fresh install, because the
617
+ # wiki's first admin does not come from an SSO first login at all: a fresh
618
+ # wiki boots in single-user mode (prisma seed sets multi_user_mode=false)
619
+ # and POST /system/enable-multi-user — authorised by the admin-token bypass
620
+ # in validatedRequest.js, which accepts EXE_WIKI_ADMIN_TOKEN *or* the
621
+ # always-required AUTH_TOKEN above — creates the first `role: admin` user
622
+ # directly, never touching resolveGoTrueUser. So the guard costs a correct
623
+ # install nothing here and is left ON.
624
+ #
625
+ # Managed mode: set EXE_ORG_ID (shared with exe-crm) and roles follow the
626
+ # dashboard's caps. The wiki needs no workspace-id pin because it never
627
+ # creates a tenant, so it can be flipped as soon as an org id exists.
628
+ # Setting this to false restores first-user-admin and is logged as a
629
+ # SECURITY DOWNGRADE on every boot.
630
+ WIKI_REQUIRE_MANAGED_PERMS: ${WIKI_REQUIRE_MANAGED_PERMS:-true}
631
+ EXE_ORG_ID: ${EXE_ORG_ID:-}
564
632
  GOTRUE_URL: http://gotrue:9999
565
633
  # Bug 0c0d5187: the wiki verifies GoTrue HS256 tokens with GOTRUE_JWT_SECRET
566
634
  # (server/utils/gotrue/index.js getGoTrueJwtSecret reads ONLY
@@ -632,7 +700,7 @@ services:
632
700
  # to pin the split server image; falls back to the combined EXE_OS_IMAGE_TAG
633
701
  # for backward compatibility with existing manifests.
634
702
  exe-os:
635
- image: ${EXE_OS_SERVER_IMAGE_TAG:-${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-ghcr.io/askexe/exe-os:v0.9.311}}}
703
+ image: ${EXE_OS_SERVER_IMAGE_TAG:-${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-ghcr.io/askexe/exe-os:v0.9.311@sha256:011730042f55277724dbe83fde1a6416db2f3e8bf62d3254738d68d8de33e1f9}}}
636
704
  container_name: exe-os
637
705
  restart: unless-stopped
638
706
  # bug debf4a39 / 93ddfa27: the daemon connects to exe-db at boot
@@ -697,7 +765,22 @@ services:
697
765
  # the GGUF model files at /home/exed/.exe-os/models/.
698
766
  # ------------------------------------------------------------------
699
767
  exe-os-worker:
700
- image: ${EXE_OS_WORKER_IMAGE_TAG:-ghcr.io/askexe/exe-os-worker:v0.9.311}
768
+ # NO DEFAULT ON PURPOSE. This slot used to default to
769
+ # ghcr.io/askexe/exe-os-worker:v0.9.311 — an image that has NEVER been
770
+ # published (GHCR returns "manifest unknown" for every tag, and the package
771
+ # itself 404s). Nobody noticed because embeddings are off by default and this
772
+ # service is profile-gated, so the tag was only ever a promise.
773
+ #
774
+ # A default that cannot be pulled is worse than no default: it turns "enable
775
+ # embeddings" into an unpullable-image failure, and it cannot be digest-pinned,
776
+ # which is what the strict-digest gate requires. The slot is left EMPTY instead —
777
+ # `docker compose` refuses to start a service with no image, so activating the
778
+ # embeddings profile without setting this fails loudly and immediately. When a
779
+ # worker image is published, set EXE_OS_WORKER_IMAGE_TAG to a digest-pinned ref
780
+ # (ghcr.io/askexe/exe-os-worker:<tag>@sha256:<digest>) — strict-digest enforces
781
+ # the pin from there. Deliberately NOT `:?`: that would make the variable
782
+ # mandatory for every deploy, including the default embeddings-off one.
783
+ image: ${EXE_OS_WORKER_IMAGE_TAG:-}
701
784
  container_name: exe-os-worker
702
785
  profiles: ["embeddings"]
703
786
  restart: unless-stopped
@@ -736,7 +819,7 @@ services:
736
819
  options: { max-size: "10m", max-file: "3" }
737
820
 
738
821
  exe-gateway:
739
- image: ${GATEWAY_IMAGE_TAG:-ghcr.io/askexe/exe-gateway:v0.9.24}
822
+ image: ${GATEWAY_IMAGE_TAG:-ghcr.io/askexe/exe-gateway:v0.9.24@sha256:9cda7c00d886b4ab16a3b88aa953aa45c991f2977084ea8532f55fcaf75e8f37}
740
823
  container_name: exe-gateway
741
824
  restart: unless-stopped
742
825
  # Gateway needs 45s to flush outbound queues + disconnect Baileys adapters.
@@ -884,7 +967,7 @@ services:
884
967
  # include "monitor-agent". See deploy/monitor/HOST-ACCESS-CONSENT.md.
885
968
  # ------------------------------------------------------------------
886
969
  exe-monitor-agent:
887
- image: ${MONITOR_AGENT_IMAGE_TAG:-ghcr.io/askexe/exe-monitor-agent:v0.9.5}
970
+ image: ${MONITOR_AGENT_IMAGE_TAG:-ghcr.io/askexe/exe-monitor-agent:v0.9.5@sha256:cada7dace00ccb629aa10976e80e20d7d25685042519bd2aec58ab4bf35ff0cd}
888
971
  container_name: exe-monitor-agent
889
972
  # Host-access consent gate: only starts when the operator has
890
973
  # acknowledged the host-access scope (COMPOSE_PROFILES=monitor-agent).
@@ -933,11 +1016,32 @@ services:
933
1016
  networks:
934
1017
  - backend
935
1018
  healthcheck:
936
- # bug 9ce2a68b: the released agent image binary is /agent (scratch image,
937
- # see exe-monitor internal/dockerfile_agent), NOT /app/beszel-agent. The
938
- # binary-native `/agent health` checks the freshness of the agent's health
939
- # file, which only stays fresh while it is actively reporting to the hub.
940
- test: ["CMD", "/agent", "health"]
1019
+ # COUPLED TO THE PINNED AGENT IMAGE GENERATION change both together.
1020
+ #
1021
+ # Two agent image generations exist with DIFFERENT binary paths:
1022
+ # v0.9.4 and earlier -> /app/beszel-agent (has a shell)
1023
+ # v2026.08.09-*-stamped -> /agent (scratch, NO shell)
1024
+ #
1025
+ # bug 9ce2a68b moved this to `/agent health` for the stamped generation.
1026
+ # The stack manifest pins the v0.9.4 generation (the stamped monitor
1027
+ # rollout in stack 0.9.34 was attempted 3x on exe-db-jkt and rolled back
1028
+ # every time), so the check must address /app/beszel-agent again.
1029
+ #
1030
+ # A generation-agnostic check is NOT possible: the stamped image is
1031
+ # scratch, so there is no shell for a `a || b` fallback and no
1032
+ # wget/curl for a port probe. Docker healthchecks execute inside the
1033
+ # container, so the check can only use binaries the image ships.
1034
+ #
1035
+ # If this mismatches the pinned image the container is permanently
1036
+ # unhealthy from the first recreate. Observed live on exe-db-jkt
1037
+ # 2026-08-10 08:13-08:40, every 30s:
1038
+ # Health check ... error: OCI runtime exec failed: exec: "/agent":
1039
+ # stat /agent: no such file or directory
1040
+ #
1041
+ # The binary-native `health` subcommand checks the freshness of the
1042
+ # agent's health file, which only stays fresh while it is actively
1043
+ # reporting to the hub.
1044
+ test: ["CMD", "/app/beszel-agent", "health"]
941
1045
  interval: 30s
942
1046
  timeout: 5s
943
1047
  start_period: 30s
@@ -964,7 +1068,7 @@ services:
964
1068
  # Without a token the binary exits 0 (no crash-loop). (bug 3416cead)
965
1069
  # ------------------------------------------------------------------
966
1070
  exe-update:
967
- image: ${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-ghcr.io/askexe/exe-os:v0.9.311}}
1071
+ image: ${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-ghcr.io/askexe/exe-os:v0.9.311@sha256:011730042f55277724dbe83fde1a6416db2f3e8bf62d3254738d68d8de33e1f9}}
968
1072
  container_name: exe-update
969
1073
  profiles: ["registry-proxy", "askexe-control-plane"]
970
1074
  restart: unless-stopped
@@ -1173,7 +1277,7 @@ services:
1173
1277
  # 4 services: gunicorn API, websocket, RQ worker, scheduler.
1174
1278
 
1175
1279
  exe-erp:
1176
- image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.2}
1280
+ image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.2@sha256:00fecc790ff848bfd4b7d87f42f859edfeb6090a7ca26bf2359dc6cb96767afb}
1177
1281
  container_name: exe-erp
1178
1282
  restart: unless-stopped
1179
1283
  entrypoint: ["/usr/local/bin/entrypoint.sh"]
@@ -1314,7 +1418,7 @@ services:
1314
1418
  options: { max-size: "10m", max-file: "3" }
1315
1419
 
1316
1420
  exe-erp-websocket:
1317
- image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.2}
1421
+ image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.2@sha256:00fecc790ff848bfd4b7d87f42f859edfeb6090a7ca26bf2359dc6cb96767afb}
1318
1422
  container_name: exe-erp-websocket
1319
1423
  restart: unless-stopped
1320
1424
  entrypoint: []
@@ -1376,7 +1480,7 @@ services:
1376
1480
  options: { max-size: "10m", max-file: "3" }
1377
1481
 
1378
1482
  exe-erp-queue:
1379
- image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.2}
1483
+ image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.2@sha256:00fecc790ff848bfd4b7d87f42f859edfeb6090a7ca26bf2359dc6cb96767afb}
1380
1484
  container_name: exe-erp-queue
1381
1485
  restart: unless-stopped
1382
1486
  entrypoint: []
@@ -1430,7 +1534,7 @@ services:
1430
1534
  options: { max-size: "10m", max-file: "3" }
1431
1535
 
1432
1536
  exe-erp-scheduler:
1433
- image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.2}
1537
+ image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.2@sha256:00fecc790ff848bfd4b7d87f42f859edfeb6090a7ca26bf2359dc6cb96767afb}
1434
1538
  container_name: exe-erp-scheduler
1435
1539
  restart: unless-stopped
1436
1540
  entrypoint: []
@@ -1560,7 +1664,7 @@ services:
1560
1664
  # a fresh/migrated install boots an old image while the manifest reads "latest".
1561
1665
  # generate-env.ts now always writes AUTH_IMAGE_TAG, and this default mirrors the
1562
1666
  # pin as defense-in-depth — keep BOTH in lockstep on every auth release.
1563
- image: ${AUTH_IMAGE_TAG:-update.askexe.com/askexe/exe-auth:v0.2.0}
1667
+ image: ${AUTH_IMAGE_TAG:-update.askexe.com/askexe/exe-auth:v0.5.0@sha256:ecc57f92b1f2c2d9df4fafe648622fe1fdd87c27012048d950e3f6b82086ccf9}
1564
1668
  container_name: exe-auth
1565
1669
  restart: unless-stopped
1566
1670
  environment:
@@ -1577,6 +1681,14 @@ services:
1577
1681
  AUTH_CORS_ORIGIN: ${AUTH_CORS_ORIGIN:-https://${DOMAIN}}
1578
1682
  AUTH_DEFAULT_REDIRECT: ${AUTH_DEFAULT_REDIRECT:-}
1579
1683
  AUTH_DEFAULT_PRODUCT: ${AUTH_DEFAULT_PRODUCT:-AUTH}
1684
+ # Brand word rendered after the gold "EXE" in the login logo (exe-auth
1685
+ # v0.5.0+). The auth gateway is ONE front door for the whole stack, so it
1686
+ # carries one identity regardless of which product bounced the visitor
1687
+ # here — ?product= no longer rebrands the page. Unset => the image
1688
+ # defaults to INTELLIGENCE ("EXE INTELLIGENCE"); white-label deploys set
1689
+ # AUTH_BRAND_NAME in .env. Passthrough is required or the .env value can
1690
+ # never reach the container.
1691
+ AUTH_BRAND_NAME: ${AUTH_BRAND_NAME:-}
1580
1692
  # Bug 5960ebb1: invite-only posture. Mirror GOTRUE_DISABLE_SIGNUP (which
1581
1693
  # blocks signup server-side) so the auth SPA hides its sign-up UI/route
1582
1694
  # instead of presenting a form that can only ever fail. Defaults true.
@@ -18,7 +18,7 @@ const EXE_BUILD_RELEASE_TAG = "v0.1.0";
18
18
  // Bug 58840873: pin exe-auth to the manifest-pinned tag so a generated .env never
19
19
  // lets compose fall back to its (stale) hardcoded default image. MUST equal the
20
20
  // AUTH_IMAGE_TAG tag in deploy/stack-manifests/v0.9.json and the compose default.
21
- const AUTH_RELEASE_TAG = "v0.2.0";
21
+ const AUTH_RELEASE_TAG = "v0.5.0";
22
22
 
23
23
  const POSTGRES_USER = "exe";
24
24
  const POSTGRES_DB = "exedb";
@@ -46,6 +46,47 @@ const GATEWAY_WS_HOST_PORT = "3101";
46
46
  const RANDOM_SECRET_16 = 16;
47
47
  const RANDOM_SECRET_32 = 32;
48
48
  const RANDOM_SECRET_48 = 48;
49
+ // Centralized role administration (e51ca54c §10.6b). Emitted verbatim into both
50
+ // the generated customer .env and the checked-in .env.example so a fresh install
51
+ // STATES its permissions posture instead of inheriting one silently.
52
+ //
53
+ // exe-crm#102 / exe-wiki#45 make managed permissions REQUIRED by default in the
54
+ // apps, so an unmanaged first login can no longer mint its own admin. Those
55
+ // defaults are kept. What a fresh install needs in addition is a legitimate way
56
+ // to seat its FIRST admin, and for the CRM that way is EXE_CRM_ADMIN_EMAIL: the
57
+ // boot-time WorkspaceBootstrapService seeds that user, so the intended owner is
58
+ // an EXISTING user by the time they sign in and the first-login refusal never
59
+ // applies to them. Leave it empty and the seed silently throws (onModuleInit
60
+ // swallows it), after which nobody can ever get in.
61
+ const MANAGED_PERMS_ENV_BLOCK = [
62
+ "# --- Centralized role administration (permissions) ---",
63
+ "# The apps refuse to let an unmanaged first login mint its own admin",
64
+ "# (exe-crm#102 / exe-wiki#45). Both flags below are therefore left at their",
65
+ "# SECURE default of true, stated explicitly rather than inherited silently.",
66
+ "#",
67
+ "# Because of that, a fresh CRM gets its first admin from EXE_CRM_ADMIN_EMAIL",
68
+ "# in the CRM section below — NOT from whoever signs in first. That user is",
69
+ "# seeded at boot, so their sign-in is an existing-user login and is allowed;",
70
+ "# every OTHER unmanaged first login is still refused. If you leave",
71
+ "# EXE_CRM_ADMIN_EMAIL empty, the seed silently does not happen and the CRM",
72
+ "# cannot be bootstrapped at all. The wiki does not need this: its first admin",
73
+ "# comes from POST /system/enable-multi-user, authorised by WIKI_AUTH_TOKEN.",
74
+ "CRM_REQUIRE_MANAGED_PERMS=true",
75
+ "WIKI_REQUIRE_MANAGED_PERMS=true",
76
+ "#",
77
+ "# MANAGED MODE — roles set ONLY in the Exe dashboard. Empty means unmanaged:",
78
+ "# no token can carry permissions for an org that was never named. To adopt it:",
79
+ "# EXE_ORG_ID=<org id from the Exe dashboard>",
80
+ "# EXE_ORG_WORKSPACE_ID=<the org's canonical ACTIVE CRM workspace>",
81
+ "# EXE_ORG_WORKSPACE_ID must ALREADY EXIST and have a legitimate admin, because",
82
+ "# managed users join THAT workspace instead of creating their own. That is why",
83
+ "# managed mode cannot be the shipped default: on a fresh stack the workspace",
84
+ "# does not exist yet, so its id is unknowable at install time. Bootstrap the",
85
+ "# stack first, then set these and redeploy. The wiki needs only EXE_ORG_ID.",
86
+ "EXE_ORG_ID=",
87
+ "EXE_ORG_WORKSPACE_ID=",
88
+ ];
89
+
49
90
  const LICENSE_KEY_COMMENT = "# injected by deploy_client";
50
91
  const MANUAL_VALUE_COMMENT = "# SET_MANUALLY";
51
92
  const EXAMPLE_LICENSE_KEY = "CHANGEME_EXE_LICENSE_KEY";
@@ -169,11 +210,21 @@ export function generateEnv(options: GenerateEnvOptions): string {
169
210
  "# resolved GOTRUE_DISABLE_SIGNUP value above (bug d6f980c1).",
170
211
  `AUTH_DISABLE_SIGNUP=${disableSignup}`,
171
212
  "",
213
+ ...MANAGED_PERMS_ENV_BLOCK,
214
+ "",
172
215
  "# --- CRM ---",
173
216
  `CRM_IMAGE_TAG=${CRM_IMAGE_TAG}`,
174
217
  `CRM_SERVER_URL=https://crm.${normalizedDomain}`,
175
218
  `CRM_APP_SECRET=${randomSecret(RANDOM_SECRET_48)}`,
176
219
  `EXE_CRM_ADMIN_TOKEN=${randomSecret(RANDOM_SECRET_48)}`,
220
+ // The CRM's first admin. Seeded into core."user" at boot by
221
+ // WorkspaceBootstrapService, which is what makes that person an EXISTING
222
+ // user whose sign-in is allowed while every other unmanaged first login is
223
+ // refused (e51ca54c §10.6b). It cannot be generated — it must be a real
224
+ // mailbox that also exists in GoTrue — so it ships as SET_MANUALLY rather
225
+ // than as a random secret or a guessed admin@<domain>.
226
+ MANUAL_VALUE_COMMENT,
227
+ "EXE_CRM_ADMIN_EMAIL=CHANGEME_ADMIN_EMAIL",
177
228
  `CRM_HOST_PORT=${CRM_HOST_PORT}`,
178
229
  "",
179
230
  "# --- Wiki ---",
@@ -428,15 +479,28 @@ export function generateExampleEnv(): string {
428
479
  "AUTH_SERVER_NAME=auth.CHANGEME_DOMAIN",
429
480
  "AUTH_CORS_ORIGIN=https://CHANGEME_DOMAIN",
430
481
  "AUTH_DEFAULT_PRODUCT=AUTH",
482
+ '# Brand word after the gold "EXE" in the login logo (exe-auth v0.5.0+). One',
483
+ "# identity for the whole front door — ?product= never rebrands the page. Leave",
484
+ '# unset for the stack default "EXE INTELLIGENCE"; white-label deploys set their',
485
+ "# own word here.",
486
+ "#AUTH_BRAND_NAME=INTELLIGENCE",
431
487
  "# Bug 5960ebb1: invite-only — mirror GOTRUE_DISABLE_SIGNUP so the auth SPA hides",
432
488
  "# the sign-up UI/route instead of showing a form that always fails.",
433
489
  "AUTH_DISABLE_SIGNUP=true",
434
490
  "",
491
+ ...MANAGED_PERMS_ENV_BLOCK,
492
+ "",
435
493
  "# --- CRM ---",
436
494
  `CRM_IMAGE_TAG=${CRM_IMAGE_TAG}`,
437
495
  "CRM_SERVER_URL=https://crm.CHANGEME_DOMAIN",
438
496
  "CRM_APP_SECRET=CHANGEME_CRM_APP_SECRET",
439
497
  "EXE_CRM_ADMIN_TOKEN=CHANGEME_EXE_CRM_ADMIN_TOKEN",
498
+ "# The CRM's first admin — seeded at boot by WorkspaceBootstrapService, which",
499
+ "# is what makes that person an EXISTING user whose sign-in is allowed while",
500
+ "# every other unmanaged first login is refused (e51ca54c §10.6b). Must be a",
501
+ "# real mailbox that also exists in GoTrue, so it cannot be generated.",
502
+ MANUAL_VALUE_COMMENT,
503
+ "EXE_CRM_ADMIN_EMAIL=CHANGEME_ADMIN_EMAIL",
440
504
  `CRM_HOST_PORT=${CRM_HOST_PORT}`,
441
505
  "",
442
506
  "# --- Wiki ---",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "latest": "0.9.34",
3
+ "latest": "0.9.35",
4
4
  "stacks": {
5
5
  "0.9.0": {
6
6
  "version": "0.9.0",
@@ -2574,11 +2574,126 @@
2574
2574
  }
2575
2575
  },
2576
2576
  "rolloutStage": "ga"
2577
+ },
2578
+ "0.9.35": {
2579
+ "version": "0.9.35",
2580
+ "releasedAt": "2026-08-13T00:16:05Z",
2581
+ "notes": "exe-auth v0.5.0 — the shared SSO login page is now one front door with one identity: the logo reads EXE INTELLIGENCE regardless of which product bounced the visitor here (?product= no longer rebrands it), configurable per-deploy via AUTH_BRAND_NAME. Includes the brand-word escaping fix (every '<' encoded for the JS/HTML context) so a white-label value can never break the login page. Bumps the auth image digest ONLY; every other pin is identical to 0.9.34. Founder-approved GO 2026-08-12.",
2582
+ "npmVersion": "0.9.324",
2583
+ "services": {
2584
+ "exe-db": {
2585
+ "image": "update.askexe.com/askexe/pgvector:0.8.0-pg16@sha256:a132765ec351c65111b5b675928a3a0515a466a40f97277329db8b8209ad8bc9",
2586
+ "env": "EXE_DB_IMAGE",
2587
+ "composeService": "exe-db",
2588
+ "required": true,
2589
+ "category": "core",
2590
+ "description": "Postgres (pgvector) — digest-pinned (bug 32d6e02f; was tag-only in 0.9.25, regressed from 0.9.24)"
2591
+ },
2592
+ "exe-os": {
2593
+ "image": "update.askexe.com/askexe/exe-os:v0.9.324@sha256:3ce6406e0f7f279ff2568bbbb7d55de51a46fdf35c49691f24fd959d6fd2d3fa",
2594
+ "env": "EXE_OS_IMAGE_TAG",
2595
+ "composeService": "exe-os",
2596
+ "healthUrl": "http://127.0.0.1:8765/health",
2597
+ "required": true,
2598
+ "category": "core",
2599
+ "description": "exe-os daemon + MCP server"
2600
+ },
2601
+ "crm": {
2602
+ "image": "update.askexe.com/askexe/exe-crm:v0.9.53@sha256:a586dcc8bbd992538e3caa18c44e772d30f31155dfef0a2b7466ca3fc7c553d8",
2603
+ "env": "CRM_IMAGE_TAG",
2604
+ "composeService": "exe-crm",
2605
+ "healthUrl": "http://127.0.0.1:3000/healthz",
2606
+ "category": "app"
2607
+ },
2608
+ "wiki": {
2609
+ "image": "update.askexe.com/askexe/exe-wiki:v0.9.28@sha256:61856a4c6b97ce62c62ecdc3a377139287be5860eb807d9fbb737115758d7856",
2610
+ "env": "WIKI_IMAGE_TAG",
2611
+ "composeService": "exe-wiki",
2612
+ "healthUrl": "http://127.0.0.1:3001/api/ping",
2613
+ "category": "app"
2614
+ },
2615
+ "gateway": {
2616
+ "image": "update.askexe.com/askexe/exe-gateway:v2026.08.07-c15f093-stamped@sha256:1bc11a2a0ad1f3929d59d2685696f22a72042b9fca9c75e15c02dc7d3c640105",
2617
+ "env": "GATEWAY_IMAGE_TAG",
2618
+ "composeService": "exe-gateway",
2619
+ "healthUrl": "http://127.0.0.1:3100/health",
2620
+ "category": "app",
2621
+ "description": "WhatsApp/messaging gateway — provenance-stamped rebuild of main (outbound message persistence fix); pinned by digest, dated immutable tag.",
2622
+ "gitSha": "c15f093a0f59730bd5c2c73791ff77059dfa7cc1"
2623
+ },
2624
+ "monitorAgent": {
2625
+ "image": "update.askexe.com/askexe/exe-monitor-agent:v2026.08.09-10660eb4-stamped@sha256:29fbd445f79484df04f000603e4ff445e76f0380f86d687a0033e3a0ef7d1b7a",
2626
+ "env": "MONITOR_AGENT_IMAGE_TAG",
2627
+ "composeService": "exe-monitor-agent",
2628
+ "category": "monitoring",
2629
+ "gitSha": "10660eb4abdeffbcba2aad13549aa58e208ac7a3"
2630
+ },
2631
+ "monitorHub": {
2632
+ "image": "update.askexe.com/askexe/exe-monitor-hub:v2026.08.09-10660eb4-stamped@sha256:c9a9218c2713b8dffea7e1cf8c0702a614657d311a7a4e821c6a543bab29bb97",
2633
+ "env": "MONITOR_HUB_IMAGE_TAG",
2634
+ "composeService": "exe-monitor-hub",
2635
+ "healthUrl": "http://127.0.0.1:8090/api/health",
2636
+ "category": "monitoring",
2637
+ "gitSha": "10660eb4abdeffbcba2aad13549aa58e208ac7a3"
2638
+ },
2639
+ "auth": {
2640
+ "image": "update.askexe.com/askexe/exe-auth:v0.5.0@sha256:ecc57f92b1f2c2d9df4fafe648622fe1fdd87c27012048d950e3f6b82086ccf9",
2641
+ "env": "AUTH_IMAGE_TAG",
2642
+ "composeService": "exe-auth",
2643
+ "healthUrl": "http://127.0.0.1:3300/api/health",
2644
+ "category": "auth",
2645
+ "description": "exe-auth v0.5.0 — one front door, one identity: logo reads EXE INTELLIGENCE (config-driven via AUTH_BRAND_NAME, escaped for the JS/HTML context).",
2646
+ "gitSha": "874941df74041299d829fbc0b37887d64fae6f78"
2647
+ },
2648
+ "erp": {
2649
+ "image": "update.askexe.com/askexe/exe-erp:v2026.08.07-d185286-stamped@sha256:1c655f3f7819c797afd13c79561354f0276cf337403f32aee3e406a497e8827b",
2650
+ "env": "ERP_IMAGE_TAG",
2651
+ "composeService": "exe-erp",
2652
+ "healthUrl": "http://127.0.0.1:8069/api/method/ping",
2653
+ "healthHost": "localhost",
2654
+ "required": false,
2655
+ "category": "app",
2656
+ "description": "Enterprise Resource Planning",
2657
+ "gitSha": "d185286873dcfa11e4b3f9672c4e23efea240cc5"
2658
+ },
2659
+ "gotrue": {
2660
+ "image": "update.askexe.com/askexe/gotrue:v2.172.1@sha256:b0dd7aa28dd1f9a8bd31f136c8b912661f701d9b863171e5843cb08f18f49de4",
2661
+ "composeService": "gotrue",
2662
+ "healthUrl": "http://127.0.0.1:9999/health",
2663
+ "category": "infra"
2664
+ },
2665
+ "redis": {
2666
+ "image": "update.askexe.com/askexe/redis:7.4-alpine@sha256:6ab0b6e7381779332f97b8ca76193e45b0756f38d4c0dcda72dbb3c32061ab99",
2667
+ "composeService": "redis",
2668
+ "category": "infra"
2669
+ },
2670
+ "clickhouse": {
2671
+ "image": "update.askexe.com/askexe/clickhouse-server:24.8.4.13-alpine@sha256:88a45f9e328549b2579256c46ee38e5c0e25ae58303d9eb6d9c7ed8d6d2bbf3c",
2672
+ "composeService": "clickhouse",
2673
+ "category": "infra"
2674
+ },
2675
+ "cloudflared": {
2676
+ "image": "update.askexe.com/askexe/cloudflared:2026-07@sha256:ba461b8aa9c042156dbd39c38657fe7431bafa063220eab8d5330a523863da9f",
2677
+ "composeService": "cloudflared",
2678
+ "category": "infra"
2679
+ },
2680
+ "exe-sso-edge": {
2681
+ "image": "update.askexe.com/askexe/nginx:alpine@sha256:20316569d8f81a160065d7d2a5eeffc7ca97d79022462ee255fd23fa103a6b5c",
2682
+ "composeService": "exe-sso-edge",
2683
+ "category": "infra"
2684
+ },
2685
+ "exe-otel-collector": {
2686
+ "image": "update.askexe.com/askexe/otel-collector-contrib:0.114.0@sha256:37fa87091cfaaec7234a27e4e395a40c31c2bfaea97a349a4afef6d9e9681197",
2687
+ "composeService": "exe-otel-collector",
2688
+ "category": "infra"
2689
+ }
2690
+ },
2691
+ "rolloutStage": "ga"
2577
2692
  }
2578
2693
  },
2579
2694
  "signature": {
2580
2695
  "keyId": "exe-stack-1",
2581
2696
  "alg": "ed25519",
2582
- "signature": "i3o3MZRZK46RCnWrzn/W4LyQdkyqPlprlK2hQVCtcqd3/1y9HPJUZMIQ8MX0pLFrQjK7BTtQA0YBUAnLDxlyCg=="
2697
+ "signature": "pm9jH5HQp+Wo+eSqsFKBYekhFmSFUdJp1YYyBMqaufsnbOxj7JXakBGL4ssrzzi8s+xuNRY6SVXgXTT4biIpAg=="
2583
2698
  }
2584
2699
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "verified_at": "2026-08-13T02:24:58.833Z",
4
- "manifest_sha256": "9f5cf3755cf786a6053c42f7a3bdea6f5df40a844cff0a3202f6ab883ab1e13f",
5
- "package_version": "0.9.364"
3
+ "verified_at": "2026-08-13T14:39:38.295Z",
4
+ "manifest_sha256": "347aa641dc9a0643d96a98a87cc14cb14edc413fad524aad808a86625b1079fe",
5
+ "package_version": "0.9.367"
6
6
  }