@askexenow/exe-os 0.9.372 → 0.9.374

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 (470) hide show
  1. package/deploy/compose/.env.customer.example +45 -10
  2. package/deploy/compose/.env.example +46 -9
  3. package/deploy/compose/docker-compose.yml +136 -18
  4. package/deploy/compose/generate-env.ts +142 -34
  5. package/deploy/compose/sso-edge/default.conf.template +78 -7
  6. package/deploy/compose/sso-edge/sso-redirect.conf +109 -13
  7. package/deploy/stack-manifests/v0.9.30-apps.json +1 -1
  8. package/deploy/stack-manifests/v0.9.json +4 -4
  9. package/dist/.dist-verified.json +3 -3
  10. package/dist/{active-agent-GRT5MKD5.js → active-agent-ONPPEWQV.js} +7 -6
  11. package/dist/{active-agent-L2ZSSXDK.js → active-agent-UJKMG7LJ.js} +7 -6
  12. package/dist/{agent-defs-generator-M4ZNYIVX.js → agent-defs-generator-ZWI6DXOE.js} +6 -5
  13. package/dist/{agent-loop-FOK2IRZQ.js → agent-loop-OYHJKNYH.js} +1 -1
  14. package/dist/{agentic-ontology-DMPRDEUX.js → agentic-ontology-WHFJ3QFS.js} +1 -1
  15. package/dist/{artifact-backup-767STHSW.js → artifact-backup-WXZNB7KE.js} +2 -1
  16. package/dist/{backfill-gate-VX2RZTQV.js → backfill-gate-KWJQ35YX.js} +3 -2
  17. package/dist/{backfill-metadata-ZMEHJQ5M.js → backfill-metadata-3OUSQD5V.js} +8 -7
  18. package/dist/{background-jobs-LTPWCMA3.js → background-jobs-6VMD55PK.js} +3 -2
  19. package/dist/{backup-verify-EX2K732J.js → backup-verify-ZKTUYLTA.js} +4 -3
  20. package/dist/{behavior-injection-22AGMS25.js → behavior-injection-M6UYZCMW.js} +17 -15
  21. package/dist/{behaviors-DVFXAWF5.js → behaviors-ZJ45TFBJ.js} +21 -13
  22. package/dist/bin/age-ontology-load.js +3 -2
  23. package/dist/bin/agentic-ontology-backfill.js +10 -9
  24. package/dist/bin/agentic-reflection-backfill.js +11 -10
  25. package/dist/bin/agentic-semantic-label.js +10 -9
  26. package/dist/bin/backfill-conversations.js +13 -11
  27. package/dist/bin/backfill-responses.js +13 -11
  28. package/dist/bin/backfill-vectors.js +17 -15
  29. package/dist/bin/bulk-sync-postgres.js +22 -20
  30. package/dist/bin/cc-doctor.js +10 -9
  31. package/dist/bin/cleanup-stale-review-tasks.js +29 -26
  32. package/dist/bin/cli.js +36 -26
  33. package/dist/bin/deferred-daemon-restart.js +114 -110
  34. package/dist/bin/exe-agent-config.js +6 -5
  35. package/dist/bin/exe-agent.js +127 -33
  36. package/dist/bin/exe-assign.js +15 -13
  37. package/dist/bin/exe-boot.js +57 -54
  38. package/dist/bin/exe-call.js +8 -7
  39. package/dist/bin/exe-cloud.js +24 -22
  40. package/dist/bin/exe-config-dump.js +6 -5
  41. package/dist/bin/exe-dispatch.js +30 -27
  42. package/dist/bin/exe-doctor.js +14 -10
  43. package/dist/bin/exe-export-behaviors.js +19 -17
  44. package/dist/bin/exe-forget.js +10 -9
  45. package/dist/bin/exe-gateway.js +199 -19
  46. package/dist/bin/exe-grant.js +5 -5
  47. package/dist/bin/exe-healthcheck.js +10 -9
  48. package/dist/bin/exe-heartbeat.js +35 -32
  49. package/dist/bin/exe-kill.js +34 -31
  50. package/dist/bin/exe-launch-agent.js +126 -54
  51. package/dist/bin/exe-mcp.js +6 -5
  52. package/dist/bin/exe-memory-reads.js +8 -7
  53. package/dist/bin/exe-new-employee.js +12 -11
  54. package/dist/bin/exe-os-mcp-proxy.js +6 -5
  55. package/dist/bin/exe-pending-messages.js +30 -27
  56. package/dist/bin/exe-pending-notifications.js +29 -26
  57. package/dist/bin/exe-pending-reviews.js +30 -27
  58. package/dist/bin/exe-rename.js +8 -7
  59. package/dist/bin/exe-repo-truth.js +1 -1
  60. package/dist/bin/exe-review.js +33 -30
  61. package/dist/bin/exe-search.js +9 -8
  62. package/dist/bin/exe-session-cleanup.js +35 -32
  63. package/dist/bin/exe-settings.js +24 -22
  64. package/dist/bin/exe-start-codex.js +137 -55
  65. package/dist/bin/exe-start-opencode.js +121 -23
  66. package/dist/bin/exe-status.js +31 -28
  67. package/dist/bin/exe-support.js +5 -4
  68. package/dist/bin/exe-team.js +7 -6
  69. package/dist/bin/exe-watchdog.js +31 -11
  70. package/dist/bin/generate-hook-manifest.js +44 -7
  71. package/dist/bin/git-sweep.js +31 -28
  72. package/dist/bin/graph-backfill.js +89 -35
  73. package/dist/bin/graph-export.js +9 -8
  74. package/dist/bin/import-history.js +14 -13
  75. package/dist/bin/install.js +137 -113
  76. package/dist/bin/intercom-check.js +5 -5
  77. package/dist/bin/mcp-sessions.js +2 -2
  78. package/dist/bin/orchestration-metrics.js +7 -6
  79. package/dist/bin/postgres-agentic-reflection-backfill.js +5 -4
  80. package/dist/bin/postgres-agentic-semantic-backfill.js +4 -3
  81. package/dist/bin/pre-publish.js +1 -1
  82. package/dist/bin/reconcile-backlog.js +2 -2
  83. package/dist/bin/registry-proxy.js +1 -1
  84. package/dist/bin/scan-tasks.js +29 -26
  85. package/dist/bin/setup.js +5 -4
  86. package/dist/bin/shard-migrate.js +9 -8
  87. package/dist/bin/stack-update.js +40 -9
  88. package/dist/bin/verify-stack.js +2 -2
  89. package/dist/bin/vps-health-gate.js +1 -1
  90. package/dist/{boot-generation-OHXH4YC5.js → boot-generation-JKVZ4ZAT.js} +6 -5
  91. package/dist/{boot-review-sections-N5IXIGSS.js → boot-review-sections-2M6BTG73.js} +28 -25
  92. package/dist/{branch-hygiene-KCGXRAWP.js → branch-hygiene-U5GFRSTP.js} +31 -7
  93. package/dist/{branding-GH43W3PU.js → branding-I6KIMB7F.js} +3 -2
  94. package/dist/budget-fallback-XJRPMP2D.js +11 -0
  95. package/dist/build-manifest.json +1318 -1233
  96. package/dist/{capability-cards-4PXVLIVS.js → capability-cards-5IMJT6J7.js} +5 -4
  97. package/dist/{capacity-monitor-FKMQXORX.js → capacity-monitor-SAXCQK7O.js} +30 -27
  98. package/dist/{catchup-brief-SN5EKO4N.js → catchup-brief-U2TXBLHD.js} +34 -31
  99. package/dist/{chunk-CNC57JCS.js → chunk-23MVDXLY.js} +4 -4
  100. package/dist/{chunk-V4XAKXXF.js → chunk-2AJGV5UL.js} +1 -1
  101. package/dist/{chunk-FBYAXTDM.js → chunk-2ZOEC4KC.js} +10 -2
  102. package/dist/{chunk-ELXFSIIM.js → chunk-32YV32VA.js} +2 -2
  103. package/dist/{chunk-44C7QNZS.js → chunk-3KDCORDO.js} +1 -1
  104. package/dist/{chunk-JTB5V6BV.js → chunk-3SXHEQ7X.js} +1 -1
  105. package/dist/{chunk-HDW4XPDV.js → chunk-3UUX5OY4.js} +1 -1
  106. package/dist/{chunk-7PSLK36P.js → chunk-44TLJZJ5.js} +1 -1
  107. package/dist/{chunk-JTWTBX2M.js → chunk-4EN3IZ3Q.js} +2 -1
  108. package/dist/{chunk-KPMC7PY7.js → chunk-4HKTO2SV.js} +1 -1
  109. package/dist/{chunk-CDUB5Q6J.js → chunk-4IK2K3B3.js} +1 -1
  110. package/dist/{chunk-GH6YJOOC.js → chunk-4SJ4LK4V.js} +6 -6
  111. package/dist/{chunk-PVEM537A.js → chunk-4YLBKEL5.js} +2 -2
  112. package/dist/chunk-4YNA3CM6.js +872 -0
  113. package/dist/{chunk-KYFFVTGO.js → chunk-55BEFF4V.js} +3 -3
  114. package/dist/{chunk-SEP5ITFQ.js → chunk-636LKCKE.js} +2 -2
  115. package/dist/{chunk-QTI4QAWA.js → chunk-6EZQUNE6.js} +338 -5
  116. package/dist/{chunk-WAEKYKTK.js → chunk-6RKKVPYF.js} +1 -1
  117. package/dist/{chunk-VX2F4ZUY.js → chunk-6SCGLHJ7.js} +3 -3
  118. package/dist/{chunk-MEGRQ53A.js → chunk-6VHOQ3IM.js} +51 -6
  119. package/dist/{chunk-HIIXCAEE.js → chunk-6YVUR3OU.js} +3 -3
  120. package/dist/{chunk-L6ZNURWN.js → chunk-7GE2EQ23.js} +1 -1
  121. package/dist/{chunk-2CWS374F.js → chunk-7RI2CNXJ.js} +1 -1
  122. package/dist/{chunk-OL3QP3AU.js → chunk-7TSBV3SD.js} +1 -1
  123. package/dist/{chunk-DSOQUQTV.js → chunk-A27Q27CT.js} +27 -0
  124. package/dist/{chunk-5AHRZI3R.js → chunk-AETLDRZB.js} +1 -1
  125. package/dist/{chunk-RNLF3CBB.js → chunk-AKLJ4JH3.js} +1 -1
  126. package/dist/{chunk-XHYHX6F7.js → chunk-AKLQSC6W.js} +329 -164
  127. package/dist/chunk-ANLFH23R.js +261 -0
  128. package/dist/{chunk-QLA3RTH4.js → chunk-AWWKRZMB.js} +5 -5
  129. package/dist/{chunk-ERVQTR7P.js → chunk-BBSIEYF5.js} +17 -3
  130. package/dist/{chunk-IPMUWYRQ.js → chunk-BJ7AVSY6.js} +2 -2
  131. package/dist/{chunk-HV6Y6F4X.js → chunk-C2L622QJ.js} +89 -3
  132. package/dist/{chunk-TX3Q2GIL.js → chunk-C5HUMAA7.js} +24 -1
  133. package/dist/{chunk-QTYJPWJN.js → chunk-CBCGDEJA.js} +7 -7
  134. package/dist/{chunk-XXSNLM6R.js → chunk-DB55JZHU.js} +1 -1
  135. package/dist/{chunk-LAZKEJMS.js → chunk-DIXXEE3S.js} +840 -607
  136. package/dist/{chunk-FB343XQX.js → chunk-DJ7YXOTU.js} +2 -2
  137. package/dist/{chunk-YFCNWQAM.js → chunk-DJOIMFKV.js} +2 -2
  138. package/dist/{chunk-UTDMTQNH.js → chunk-DSJI76XL.js} +92 -14
  139. package/dist/{chunk-EEXX4UMQ.js → chunk-DZKPOSFD.js} +1 -1
  140. package/dist/{chunk-WSOA3WMC.js → chunk-E426DOSY.js} +161 -4
  141. package/dist/{chunk-ZISQOOER.js → chunk-EKE37MO4.js} +3 -3
  142. package/dist/{chunk-RIECV7SR.js → chunk-EKYYMIVT.js} +1 -1
  143. package/dist/{chunk-HIVZ53YB.js → chunk-EXTZSNWL.js} +2 -2
  144. package/dist/{chunk-YYA5LXCT.js → chunk-FNEZ4BWT.js} +1 -1
  145. package/dist/chunk-FTZET5YX.js +313 -0
  146. package/dist/chunk-GHR4ZPJ7.js +70 -0
  147. package/dist/{chunk-MINXPXAB.js → chunk-GJI77VDO.js} +3 -3
  148. package/dist/{chunk-AAMGHW5W.js → chunk-GLQEJOXE.js} +1 -0
  149. package/dist/{chunk-ADNBOKYZ.js → chunk-GM7TLYOK.js} +60 -18
  150. package/dist/{chunk-RUWWES2K.js → chunk-GNUAL43X.js} +2 -2
  151. package/dist/{chunk-QZL6E4UB.js → chunk-GOMQ7PVQ.js} +2 -2
  152. package/dist/{chunk-GB3AHV5F.js → chunk-GQOEWNVM.js} +1 -1
  153. package/dist/{chunk-NQZUSEAR.js → chunk-GS7LIT34.js} +246 -17
  154. package/dist/{chunk-XTWHNLGD.js → chunk-GZOG2MAX.js} +1 -1
  155. package/dist/{chunk-E5HAY3DQ.js → chunk-HDLAB7W3.js} +1 -1
  156. package/dist/{chunk-E5QQZDQN.js → chunk-HNWS7YHN.js} +358 -136
  157. package/dist/{chunk-VV5EZZNT.js → chunk-HTBEVCO2.js} +1 -1
  158. package/dist/{chunk-OZBII5E3.js → chunk-I4DNJFDR.js} +4 -4
  159. package/dist/{chunk-SI5SZAJA.js → chunk-IBS2FAI4.js} +21 -4
  160. package/dist/{chunk-J5EYOBFF.js → chunk-IHXW4VUI.js} +1 -1
  161. package/dist/{chunk-RUVO3NJC.js → chunk-IN6CAM4F.js} +9 -3
  162. package/dist/{chunk-53PYNYTW.js → chunk-IRVOXUSK.js} +5 -5
  163. package/dist/{chunk-THM7J6UI.js → chunk-JHI5WMK5.js} +5 -5
  164. package/dist/{chunk-3KTQWMHI.js → chunk-JSMDRKPJ.js} +12 -4
  165. package/dist/chunk-JTVIANUB.js +131 -0
  166. package/dist/{chunk-2ADYTOHQ.js → chunk-K4ESASPL.js} +1 -1
  167. package/dist/{chunk-YWUQVHDL.js → chunk-KTCXJWJG.js} +1 -1
  168. package/dist/{chunk-RGUDGC6A.js → chunk-KTU3EAWK.js} +5 -5
  169. package/dist/{chunk-DKBPCOU4.js → chunk-L6RXG36J.js} +2 -2
  170. package/dist/{chunk-T4EK56WI.js → chunk-LDNYSMPZ.js} +1 -1
  171. package/dist/{chunk-RIK5GRWI.js → chunk-LGS2V2XD.js} +3 -3
  172. package/dist/{chunk-JKXZGRWR.js → chunk-LP4GB656.js} +2 -2
  173. package/dist/{chunk-H74466TM.js → chunk-M7O7TGGU.js} +1 -1
  174. package/dist/chunk-MJCSEIFI.js +54 -0
  175. package/dist/{chunk-IDZPQG2D.js → chunk-MOGA4Q7F.js} +2 -2
  176. package/dist/{chunk-OYQNNKNS.js → chunk-MXPNVSXI.js} +37 -14
  177. package/dist/{chunk-UVW7YFAF.js → chunk-N7VEP5B3.js} +4 -4
  178. package/dist/{chunk-HHE2HV3V.js → chunk-NBXDXKLC.js} +1 -1
  179. package/dist/{chunk-LDL3S7AC.js → chunk-NKETJCB5.js} +7 -3
  180. package/dist/{chunk-ECHLVLA7.js → chunk-NMH5ZQPU.js} +1 -1
  181. package/dist/{chunk-U3XLRMJD.js → chunk-NT7W4RXD.js} +1 -1
  182. package/dist/{chunk-UQUUNGTP.js → chunk-NUK7EEN5.js} +11 -9
  183. package/dist/{chunk-GBNB4EWD.js → chunk-ORM7ZFKC.js} +16 -0
  184. package/dist/{chunk-O4ZFRK6W.js → chunk-OVEQE6YS.js} +244 -49
  185. package/dist/{chunk-4ZJ5BPY6.js → chunk-PB5S7YOF.js} +2 -2
  186. package/dist/{chunk-JR23BL74.js → chunk-PDVXWXTL.js} +4 -4
  187. package/dist/{chunk-3CIMDFXG.js → chunk-PFQ3VEEM.js} +1 -1
  188. package/dist/{chunk-SBJV2PCU.js → chunk-PHBU4LGO.js} +1 -1
  189. package/dist/{chunk-W25RLOQ2.js → chunk-PLZSZOZN.js} +3 -3
  190. package/dist/{chunk-THIJIOE2.js → chunk-PY3FOMRN.js} +18 -6
  191. package/dist/{chunk-AAUWFXOX.js → chunk-Q3AXXKDF.js} +3 -3
  192. package/dist/{chunk-VKXS2YGN.js → chunk-QHJR7IMX.js} +2 -2
  193. package/dist/chunk-QLZ46RCK.js +45 -0
  194. package/dist/{chunk-UHPMK6QZ.js → chunk-R3CZWFFC.js} +10 -2
  195. package/dist/{chunk-6XEYELCA.js → chunk-R4CBHKZ2.js} +1 -1
  196. package/dist/{chunk-5APCDDJZ.js → chunk-R522MWAR.js} +9 -9
  197. package/dist/chunk-RH4AH3YB.js +80 -0
  198. package/dist/{chunk-AMKSDKMK.js → chunk-S2WBS6BG.js} +22 -35
  199. package/dist/{chunk-WUKQVNLP.js → chunk-SEQIPGLU.js} +1 -1
  200. package/dist/{chunk-7WQRFSZI.js → chunk-SL6KQYDU.js} +26 -6
  201. package/dist/chunk-SLLLOOEI.js +103 -0
  202. package/dist/{chunk-5N4SG5NB.js → chunk-T35RCQFE.js} +3 -3
  203. package/dist/{chunk-7V6M3QUS.js → chunk-T3QUKNLI.js} +1 -1
  204. package/dist/{chunk-CW2UCKHS.js → chunk-TADAO3HV.js} +2 -2
  205. package/dist/{chunk-5DCCKHDY.js → chunk-TAMDAOCU.js} +109 -13
  206. package/dist/{chunk-ZXB56YR2.js → chunk-TFKCERAK.js} +101 -23
  207. package/dist/{chunk-RBYHJDAT.js → chunk-TQAZTRQ3.js} +3 -3
  208. package/dist/{chunk-OKGIOWOB.js → chunk-U6SUKSZR.js} +2 -2
  209. package/dist/{chunk-23QKEUF6.js → chunk-U73AC5AN.js} +34 -12
  210. package/dist/{chunk-PM6WSWVU.js → chunk-UBK7HK3J.js} +3 -3
  211. package/dist/{chunk-H37FSTF2.js → chunk-UBMZ3YQU.js} +1 -1
  212. package/dist/{chunk-JJUGI2YL.js → chunk-UCFC2AEI.js} +1 -1
  213. package/dist/{chunk-6IWLAQ7O.js → chunk-UCUOGVDX.js} +4 -0
  214. package/dist/{chunk-E7UCDSUE.js → chunk-UKLN57Q5.js} +2 -2
  215. package/dist/{chunk-ZYCLSEZT.js → chunk-ULIBLJ6W.js} +33 -11
  216. package/dist/{chunk-RLR6VVKV.js → chunk-UM3N6VND.js} +4 -4
  217. package/dist/{chunk-ZNUJFX7L.js → chunk-UQGSBM3U.js} +1 -1
  218. package/dist/{chunk-ZZXMB5F2.js → chunk-UZDF6FLJ.js} +1 -1
  219. package/dist/{chunk-LNOS24GV.js → chunk-V3WLC5TJ.js} +2 -95
  220. package/dist/{chunk-UXLO7VHX.js → chunk-VI4ATC6I.js} +1 -1
  221. package/dist/{chunk-77JP3LK4.js → chunk-VKJGHAZT.js} +92 -21
  222. package/dist/{chunk-7R73IAHU.js → chunk-VMTZ4RUW.js} +67 -150
  223. package/dist/{chunk-TGPQMMQP.js → chunk-VYQ7B7DI.js} +30 -17
  224. package/dist/{chunk-E2WEFZOR.js → chunk-W75GTHR3.js} +1 -1
  225. package/dist/{chunk-UKLF7F3Z.js → chunk-WJG344NC.js} +9 -9
  226. package/dist/{chunk-MBNIJXKI.js → chunk-WMEYJT4R.js} +18 -4
  227. package/dist/{chunk-R6FLELV6.js → chunk-XFTEX77S.js} +3 -3
  228. package/dist/{chunk-MDGYXUOV.js → chunk-XH7YL7JM.js} +1 -1
  229. package/dist/{chunk-JOO35RHR.js → chunk-XL5MFGMR.js} +3 -3
  230. package/dist/{chunk-OW5RZIDW.js → chunk-XNNECNDL.js} +95 -33
  231. package/dist/{chunk-5AHDQCTB.js → chunk-XXFKSJYA.js} +6 -6
  232. package/dist/{chunk-TGEPLJ66.js → chunk-XXOPG4BW.js} +3 -3
  233. package/dist/{chunk-PGLPUP37.js → chunk-XZ65ST2I.js} +1 -1
  234. package/dist/{chunk-3TTKAT6V.js → chunk-YKC7QDZH.js} +9 -4
  235. package/dist/{chunk-KXYFBBZR.js → chunk-YMP2QSOP.js} +20 -3
  236. package/dist/{chunk-TK4MI6F6.js → chunk-YSLGFPWX.js} +6 -6
  237. package/dist/{chunk-X2P43TB2.js → chunk-YTSXPJUQ.js} +1 -1
  238. package/dist/{chunk-HECXZGGZ.js → chunk-ZCERWHY2.js} +33 -35
  239. package/dist/{chunk-IVU3WN7S.js → chunk-ZG62LIK3.js} +74 -4
  240. package/dist/{chunk-GU62SNDH.js → chunk-ZGYNKA3O.js} +744 -111
  241. package/dist/{chunk-QMSEL5YS.js → chunk-ZIG7VPJV.js} +28 -76
  242. package/dist/{chunk-WZJVGA5I.js → chunk-ZL4AGWAH.js} +258 -13
  243. package/dist/{chunk-QR624DER.js → chunk-ZSODLMFV.js} +2 -2
  244. package/dist/{cleanup-graph-garbage-IPYDS5OX.js → cleanup-graph-garbage-DPJGO52H.js} +11 -10
  245. package/dist/{cloud-sync-command-JLNVG7H4.js → cloud-sync-command-JPNTT4OQ.js} +2 -2
  246. package/dist/{cloud-sync-db-init-JXUF6GI3.js → cloud-sync-db-init-V2LWIUQU.js} +1 -1
  247. package/dist/{cloud-sync-shutdown-Z4SBP6PL.js → cloud-sync-shutdown-BNALPWGX.js} +5 -4
  248. package/dist/{co-activation-74RDFTKS.js → co-activation-CMNSWS6B.js} +5 -4
  249. package/dist/{co-occurrence-CN3TBYVR.js → co-occurrence-WRI2NAN6.js} +9 -8
  250. package/dist/{code-context-index-D4MJ4VFX.js → code-context-index-NOJSHLPN.js} +12 -6
  251. package/dist/code-context-watcher-VZNZU3BO.js +118 -0
  252. package/dist/{codex-consolidation-PPXNBXCV.js → codex-consolidation-SH4UKFBQ.js} +2 -1
  253. package/dist/{conversation-entity-extractor-QGTLH4BP.js → conversation-entity-extractor-74252CAO.js} +4 -4
  254. package/dist/{conversation-wiki-populator-EBUZXYEU.js → conversation-wiki-populator-OS4C6W54.js} +1 -1
  255. package/dist/conversations-retention-C4BLKFEL.js +54 -0
  256. package/dist/coordinator-notice-MHUY7AQB.js +55 -0
  257. package/dist/{crdt-sync-7T4WCOKD.js → crdt-sync-B3JN6AIV.js} +1 -1
  258. package/dist/{crm-webhook-FTW3XZTO.js → crm-webhook-GYWQRFET.js} +2 -2
  259. package/dist/{cto-delegation-gate-SZCE34LB.js → cto-delegation-gate-LQHVLEMW.js} +29 -26
  260. package/dist/{daemon-auth-SSPY5ODS.js → daemon-auth-QZHEO7IQ.js} +3 -2
  261. package/dist/{daemon-orchestration-IGPHVNFR.js → daemon-orchestration-5HIQALZH.js} +36 -34
  262. package/dist/{daemon-ready-OT2VQLS7.js → daemon-ready-P2BR2XP5.js} +1 -1
  263. package/dist/{db-integrity-events-5DTASXJF.js → db-integrity-events-2DTFO37N.js} +3 -2
  264. package/dist/{db-restore-events-2FI4ZMKA.js → db-restore-events-G6NOQOVE.js} +2 -1
  265. package/dist/{destructive-data-guard-6I5MDFVD.js → destructive-data-guard-BVFWPPIS.js} +1 -1
  266. package/dist/doc-graph-extractor-PQHDHQPQ.js +367 -0
  267. package/dist/{documents-URULIXGM.js → documents-C4SSPJMC.js} +15 -13
  268. package/dist/{dreaming-VIZO3QDO.js → dreaming-XAO3FCBV.js} +33 -30
  269. package/dist/{employee-boot-brief-XLOG4ULP.js → employee-boot-brief-W4OHUMRQ.js} +37 -34
  270. package/dist/{exe-drift-TLQM3IHD.js → exe-drift-AG2KMKD5.js} +6 -5
  271. package/dist/{exe-export-7YWYWJHY.js → exe-export-IC5BT335.js} +17 -15
  272. package/dist/{exe-import-DW6VAUKW.js → exe-import-A35ZLDPG.js} +17 -15
  273. package/dist/{exe-key-TLJP2B4Y.js → exe-key-TCMJNYLA.js} +116 -112
  274. package/dist/{exe-org-LU46N36E.js → exe-org-JXCR3JYZ.js} +24 -23
  275. package/dist/{exe-snapshot-QHUZRS62.js → exe-snapshot-SV6SRIG6.js} +36 -33
  276. package/dist/{fast-db-init-SCTOOIUT.js → fast-db-init-L2RGKJWH.js} +1 -1
  277. package/dist/{founder-context-ZFZC4UHO.js → founder-context-D4HFIESJ.js} +4 -3
  278. package/dist/{founder-monitor-envelope-5KTKNL5G.js → founder-monitor-envelope-TFKRGCFE.js} +5 -4
  279. package/dist/{fts-integrity-LKAZEZJE.js → fts-integrity-4YB34KWX.js} +3 -2
  280. package/dist/gateway/index.js +19 -17
  281. package/dist/{git-main-guard-TN27QBAI.js → git-main-guard-VTW4N3CM.js} +7 -1
  282. package/dist/{git-staleness-GSGP344N.js → git-staleness-TN7CYGFG.js} +5 -4
  283. package/dist/{global-procedures-YAR7G4C6.js → global-procedures-YFDEIOG7.js} +7 -6
  284. package/dist/{graph-auto-extract-GNQS64F5.js → graph-auto-extract-3YR3TYRW.js} +9 -8
  285. package/dist/{graph-rag-RMSFLUOB.js → graph-rag-Z2KCJTPK.js} +6 -4
  286. package/dist/{hook-integrity-CF567MVN.js → hook-integrity-KGAV6ZC2.js} +14 -4
  287. package/dist/{hook-prefetch-36BK4F7U.js → hook-prefetch-K5DN3TOQ.js} +29 -26
  288. package/dist/hooks/bug-report-worker.js +34 -30
  289. package/dist/hooks/codex-stop-task-finalizer.js +36 -32
  290. package/dist/hooks/commit-complete.js +33 -30
  291. package/dist/hooks/error-recall.js +12 -11
  292. package/dist/hooks/exe-heartbeat-hook.js +8 -7
  293. package/dist/hooks/ingest-worker.js +23 -11
  294. package/dist/hooks/ingest.js +18 -17
  295. package/dist/hooks/instructions-loaded.js +10 -9
  296. package/dist/hooks/manifest.json +20 -20
  297. package/dist/hooks/notification.js +9 -8
  298. package/dist/hooks/post-compact.js +8 -7
  299. package/dist/hooks/post-tool-combined.js +26 -15
  300. package/dist/hooks/pre-compact.js +33 -30
  301. package/dist/hooks/pre-tool-use.js +404 -46
  302. package/dist/hooks/prompt-submit.js +57 -47
  303. package/dist/hooks/session-end.js +40 -41
  304. package/dist/hooks/session-start.js +21 -20
  305. package/dist/hooks/stop.js +40 -37
  306. package/dist/hooks/subagent-stop.js +38 -35
  307. package/dist/hooks/summary-worker.js +39 -36
  308. package/dist/hyde-MP4QNMU5.js +80 -0
  309. package/dist/index.js +44 -39
  310. package/dist/{installer-LUN4HQIC.js → installer-54HTN5RE.js} +8 -7
  311. package/dist/{installer-OC5VXNC7.js → installer-LK35OX6R.js} +8 -7
  312. package/dist/{installer-MPRFUQJE.js → installer-LLWKZI2S.js} +8 -7
  313. package/dist/intercom-ack-VCW755TN.js +13 -0
  314. package/dist/{intercom-queue-6DZ7BANV.js → intercom-queue-5NOT2RKI.js} +28 -25
  315. package/dist/{key-backup-status-6L2ARCXW.js → key-backup-status-LQPINQ3W.js} +2 -1
  316. package/dist/lib/agent-config.js +3 -2
  317. package/dist/lib/cloud-sync.js +26 -20
  318. package/dist/lib/config.js +2 -1
  319. package/dist/lib/consolidation.js +17 -10
  320. package/dist/lib/database.js +7 -4
  321. package/dist/lib/db-backup.js +17 -2
  322. package/dist/lib/db-daemon-client.js +8 -6
  323. package/dist/lib/db-write-worker-client.js +3 -1
  324. package/dist/lib/db-write-worker.js +20 -3
  325. package/dist/lib/db.js +7 -4
  326. package/dist/lib/device-registry.js +3 -2
  327. package/dist/lib/embed-worker.js +2 -1
  328. package/dist/lib/embedder.js +8 -6
  329. package/dist/lib/employee-templates.js +8 -7
  330. package/dist/lib/employees.js +5 -4
  331. package/dist/lib/exe-daemon-client.js +7 -5
  332. package/dist/lib/exe-daemon.js +467 -221
  333. package/dist/lib/hybrid-search.js +11 -8
  334. package/dist/lib/identity.js +5 -4
  335. package/dist/lib/license.js +4 -3
  336. package/dist/lib/messaging.js +29 -26
  337. package/dist/lib/post-tool-memory.js +16 -2
  338. package/dist/lib/registry-proxy.js +3 -1
  339. package/dist/lib/reminders.js +6 -5
  340. package/dist/lib/schedules.js +9 -8
  341. package/dist/lib/session-registry.js +7 -6
  342. package/dist/lib/skill-learning.js +16 -14
  343. package/dist/lib/stack-invariants.js +17 -1
  344. package/dist/lib/status-brief.js +5 -4
  345. package/dist/lib/store.js +10 -7
  346. package/dist/lib/task-router.js +6 -5
  347. package/dist/lib/tasks.js +31 -27
  348. package/dist/lib/tmux-routing.js +40 -25
  349. package/dist/lib/tmux-status.js +3 -1
  350. package/dist/lib/tmux-transport.js +2 -1
  351. package/dist/lib/token-spend.js +6 -5
  352. package/dist/lib/transport.js +3 -2
  353. package/dist/{license-gate-ESER24PJ.js → license-gate-JVMB6OFD.js} +5 -4
  354. package/dist/{license-sync-JVG5KNIY.js → license-sync-5VYS2F2W.js} +4 -3
  355. package/dist/mcp/register-tools.js +113 -109
  356. package/dist/mcp/server.js +118 -114
  357. package/dist/mcp/tools/complete-reminder.js +7 -6
  358. package/dist/mcp/tools/create-reminder.js +7 -6
  359. package/dist/mcp/tools/create-task.js +34 -30
  360. package/dist/mcp/tools/deactivate-behavior.js +18 -16
  361. package/dist/mcp/tools/list-reminders.js +7 -6
  362. package/dist/mcp/tools/list-tasks.js +34 -30
  363. package/dist/mcp/tools/send-message.js +32 -29
  364. package/dist/mcp/tools/update-task.js +32 -28
  365. package/dist/mcp-child-registry-OTG4MWO7.js +25 -0
  366. package/dist/{mcp-http-config-6K6IKH5F.js → mcp-http-config-DQWL7U2Z.js} +6 -5
  367. package/dist/{mcp-session-identity-LRC6WJSD.js → mcp-session-identity-277GASTQ.js} +28 -25
  368. package/dist/{memory-cards-V3OZHIYP.js → memory-cards-3S2ZQPR7.js} +17 -8
  369. package/dist/{memory-graph-extractor-JC2Z64L4.js → memory-graph-extractor-A6DFEFIN.js} +10 -9
  370. package/dist/{memory-poisoning-defense-YM4QJHCX.js → memory-poisoning-defense-ZVP4H6DY.js} +5 -4
  371. package/dist/{memory-pressure-watchdog-6F6KEQHN.js → memory-pressure-watchdog-6W5F6R7H.js} +29 -26
  372. package/dist/{memory-queue-QJNWKWKG.js → memory-queue-YF7IDSFY.js} +3 -2
  373. package/dist/{memory-queue-client-COA4ABEV.js → memory-queue-client-ADSDP6OX.js} +9 -7
  374. package/dist/{memory-reflection-QXHJPYPC.js → memory-reflection-BKB2YOE6.js} +52 -6
  375. package/dist/{monitor-grants-BW2WL4IU.js → monitor-grants-EV747HMW.js} +4 -3
  376. package/dist/{notification-ledger-6QRLQW4Q.js → notification-ledger-CLGM7ODF.js} +30 -27
  377. package/dist/{notifications-7B6D7Y5C.js → notifications-MACUZPYP.js} +28 -25
  378. package/dist/{oauth-server-TZFNQAFS.js → oauth-server-AYM37SQ4.js} +25 -4
  379. package/dist/{orchestration-events-GY5VP5LU.js → orchestration-events-N7LYMUGA.js} +6 -5
  380. package/dist/{orchestration-phase-UDS24CVQ.js → orchestration-phase-T2WD45UA.js} +3 -2
  381. package/dist/{orchestrator-JVPVOYWA.js → orchestrator-4X24EWHV.js} +30 -27
  382. package/dist/{org-brief-session-GRV5R5E3.js → org-brief-session-FZOFMO5U.js} +13 -12
  383. package/dist/{org-consent-policy-3FHHSYXV.js → org-consent-policy-O5E6HXBL.js} +1 -1
  384. package/dist/{org-join-BY4PV6UO.js → org-join-POWUG25F.js} +8 -7
  385. package/dist/{org-key-admin-WSCPT2CZ.js → org-key-admin-E7EMDOZZ.js} +9 -8
  386. package/dist/{org-key-pin-5WUSPGVN.js → org-key-pin-WHWHVWUO.js} +4 -3
  387. package/dist/{org-membership-ESALTLLN.js → org-membership-WRT2IHJK.js} +5 -4
  388. package/dist/{org-partner-config-YKHPDPZR.js → org-partner-config-B7T4CL2T.js} +7 -6
  389. package/dist/{org-partner-runtime-UJDGECZ4.js → org-partner-runtime-FODONVTM.js} +13 -12
  390. package/dist/{org-row-visibility-V5DXIHTE.js → org-row-visibility-VX4AVV5Q.js} +1 -1
  391. package/dist/{pipeline-router-YY5FQKTY.js → pipeline-router-6GGT2ZW3.js} +6 -5
  392. package/dist/{plan-limits-OVX6SN6B.js → plan-limits-FUN76LYY.js} +8 -7
  393. package/dist/{platform-procedures-I57ITMDC.js → platform-procedures-7YSCLF4Z.js} +1 -1
  394. package/dist/{postinstall-failure-B2JHNFPM.js → postinstall-failure-O6TSSNJB.js} +3 -2
  395. package/dist/{project-boot-LXLU2J32.js → project-boot-3Q65LCIP.js} +2 -1
  396. package/dist/project-name-LJVFMYTQ.js +30 -0
  397. package/dist/{projection-worker-D2472IOD.js → projection-worker-4OANGP5K.js} +5 -4
  398. package/dist/{prospective-memory-JXO2A6PL.js → prospective-memory-KR3P4T6N.js} +5 -4
  399. package/dist/{push-notifications-HR3FZRDI.js → push-notifications-NCZLH6DI.js} +29 -26
  400. package/dist/ref-provenance-gate-M4AQO4OT.js +269 -0
  401. package/dist/{reproject-worktree-memories-OSS3PGRF.js → reproject-worktree-memories-PWYKPB2U.js} +106 -23
  402. package/dist/{reranker-IMZRPYJ2.js → reranker-6V3C2AO4.js} +3 -2
  403. package/dist/resolve-image-labels-ZI6UBW5W.js +15 -0
  404. package/dist/{retrieval-health-W7OD44FE.js → retrieval-health-5D7O6VH6.js} +4 -3
  405. package/dist/{review-polling-2INP7H6M.js → review-polling-QW3LJ4KN.js} +29 -26
  406. package/dist/runtime/index.js +38 -34
  407. package/dist/{session-events-G4XUPVWV.js → session-events-T45SSTMF.js} +31 -26
  408. package/dist/{session-kill-telemetry-W7MHWJTQ.js → session-kill-telemetry-QSPVJGBF.js} +29 -26
  409. package/dist/{session-mcp-config-F7KATWOF.js → session-mcp-config-SC5BLWZG.js} +3 -2
  410. package/dist/{session-scope-LG2J4EMQ.js → session-scope-KRWE54C4.js} +28 -25
  411. package/dist/{setup-wizard-YQJI3SVM.js → setup-wizard-GP3TBTPF.js} +5 -4
  412. package/dist/{shard-manager-UROHZE46.js → shard-manager-OE36A4MY.js} +3 -2
  413. package/dist/{skill-refinement-RA37U756.js → skill-refinement-C7JTMLJG.js} +6 -5
  414. package/dist/stack-generate-manifest-MFMDWRUP.js +810 -0
  415. package/dist/{stack-promote-IYBRXHTA.js → stack-promote-EKSCYY63.js} +8 -6
  416. package/dist/{stack-release-OXWLVVG6.js → stack-release-2GZAAFO4.js} +8 -6
  417. package/dist/{stack-update-2CZEROPK.js → stack-update-J6JXSTAZ.js} +51 -5
  418. package/dist/{steward-gate-LTNFB3FY.js → steward-gate-BFCCMCSW.js} +6 -5
  419. package/dist/{subagent-brief-injection-OHLWLECQ.js → subagent-brief-injection-ED36PLYY.js} +44 -36
  420. package/dist/{subagent-spawn-ledger-USYZXU3M.js → subagent-spawn-ledger-E6U3OY6Z.js} +3 -2
  421. package/dist/{supervisor-handoff-CSJQMI53.js → supervisor-handoff-SGLEPOCY.js} +12 -3
  422. package/dist/{support-inbox-4KCEPAZQ.js → support-inbox-YW47SYJF.js} +20 -5
  423. package/dist/{task-enforcement-LGXWXGVZ.js → task-enforcement-CECTQX4U.js} +29 -26
  424. package/dist/{task-request-inbox-WHCOSUCP.js → task-request-inbox-Q5T4N5K7.js} +1 -1
  425. package/dist/{task-scope-KXF7Y6KA.js → task-scope-ERVEUEYU.js} +28 -25
  426. package/dist/{tasks-crud-5EM55WRZ.js → tasks-crud-ZRQNJXQ2.js} +28 -25
  427. package/dist/{tasks-notify-VFMAURTN.js → tasks-notify-MIZH4C2O.js} +29 -26
  428. package/dist/{tasks-review-MHGMBHUZ.js → tasks-review-Z7J2P6DG.js} +28 -25
  429. package/dist/{telemetry-upload-6NRTN7QJ.js → telemetry-upload-LVQUQYFP.js} +10 -9
  430. package/dist/{token-budget-LZPOYTRP.js → token-budget-BU4NOVZF.js} +6 -5
  431. package/dist/{tool-capability-index-ED5OAPMW.js → tool-capability-index-7F42MOJT.js} +1 -1
  432. package/dist/{tool-gates-7PLIOLAL.js → tool-gates-JWVSAYTW.js} +1 -1
  433. package/dist/{tool-gates-2OZY3GZM.js → tool-gates-VXITVRFQ.js} +1 -1
  434. package/dist/{tool-telemetry-ZX7VSAXK.js → tool-telemetry-O27EVMBR.js} +1 -1
  435. package/dist/tui/App.js +43 -40
  436. package/dist/{tui-data-CC5POSUV.js → tui-data-TPWWBIUQ.js} +28 -25
  437. package/dist/{update-support-KH6NSQON.js → update-support-F2F5537B.js} +22 -20
  438. package/dist/{whatsapp-QW3X7OCN.js → whatsapp-YM4A2CSK.js} +3 -1
  439. package/dist/{work-claims-MNK7PEPW.js → work-claims-B73X5NE7.js} +6 -5
  440. package/dist/{work-state-heartbeat-YEWT5NMZ.js → work-state-heartbeat-P4YX6E2R.js} +1 -1
  441. package/dist/{worker-gate-BOQSIU2Z.js → worker-gate-BEEIIVWA.js} +3 -2
  442. package/dist/{workflow-engine-MUUD7ZEX.js → workflow-engine-5X46PFCW.js} +4 -2
  443. package/dist/{worktree-GOGT2LZP.js → worktree-W47CIMJ6.js} +9 -6
  444. package/dist/worktree-ownership-guard-OUWJROW2.js +88 -0
  445. package/dist/{worktree-sweep-46VWPVQT.js → worktree-sweep-BNBD4RFX.js} +8 -7
  446. package/package.json +14 -5
  447. package/release-notes.json +5 -5
  448. package/src/commands/exe/call.md +1 -1
  449. package/stack.release.json +6 -0
  450. package/dist/chunk-KZXMP6JG.js +0 -319
  451. package/dist/chunk-TCTED52S.js +0 -120
  452. package/dist/chunk-W2IRQJ6R.js +0 -67
  453. package/dist/doc-graph-extractor-VPTRIEKN.js +0 -149
  454. package/dist/project-name-ILJTETUE.js +0 -14
  455. /package/dist/{chunk-3Y5THOU6.js → chunk-6WIFPD2P.js} +0 -0
  456. /package/dist/{chunk-7XGXRD22.js → chunk-AISULNGL.js} +0 -0
  457. /package/dist/{chunk-3F2UB4IQ.js → chunk-DN4YVV4Z.js} +0 -0
  458. /package/dist/{chunk-WV3TOOL7.js → chunk-KQ6RJWRW.js} +0 -0
  459. /package/dist/{chunk-HR2R2QER.js → chunk-M4IRPXSZ.js} +0 -0
  460. /package/dist/{chunk-ORA5BWCV.js → chunk-NRG7KZIP.js} +0 -0
  461. /package/dist/{chunk-7UTJA6HF.js → chunk-VZAFWPAY.js} +0 -0
  462. /package/dist/{chunk-VJSDGDNS.js → chunk-WSQASFLP.js} +0 -0
  463. /package/dist/{chunk-FZQWVQJG.js → chunk-YO4BO2CL.js} +0 -0
  464. /package/dist/{core-memory-6WBNT2HL.js → core-memory-7I7RE2SJ.js} +0 -0
  465. /package/dist/{entity-boost-MT336PI3.js → entity-boost-3UWGXG5O.js} +0 -0
  466. /package/dist/{memory-isolation-EJ45IXBH.js → memory-isolation-2TUZ7Z4K.js} +0 -0
  467. /package/dist/{message-queue-client-MVBTYCSV.js → message-queue-client-XQN7QABL.js} +0 -0
  468. /package/dist/{webhook-pipe-UQSEHFPO.js → webhook-pipe-W2FVXY7M.js} +0 -0
  469. /package/dist/{wiki-acl-WXRJGZ5Q.js → wiki-acl-IBQLLBTS.js} +0 -0
  470. /package/dist/{wiki-client-AXNM5FWY.js → wiki-client-W65IOSWF.js} +0 -0
@@ -10,7 +10,12 @@ DOMAIN=CHANGEME_DOMAIN
10
10
  # bug 8dc31733: EXE_DB_IMAGE overrides the Postgres image tag in compose.
11
11
  # The manifest declares env: "EXE_DB_IMAGE" — keep this in sync with the
12
12
  # stack manifest pin. Defaults to pgvector/pgvector:0.8.0-pg16 in compose.
13
- # EXE_DB_IMAGE=pgvector/pgvector:0.8.0-pg16
13
+ EXE_DB_IMAGE=update.askexe.com/askexe/pgvector:0.8.0-pg16@sha256:a132765ec351c65111b5b675928a3a0515a466a40f97277329db8b8209ad8bc9
14
+
15
+ # --- Observability ---
16
+ # OTLP collector image. Compose carries no fallback default: a missing pin
17
+ # ABORTS the deploy rather than substituting an old image.
18
+ OTEL_COLLECTOR_IMAGE=update.askexe.com/askexe/otel-collector-contrib:0.114.0@sha256:37fa87091cfaaec7234a27e4e395a40c31c2bfaea97a349a4afef6d9e9681197
14
19
  POSTGRES_USER=exe
15
20
  POSTGRES_PASSWORD=CHANGEME_POSTGRES_PASSWORD
16
21
  POSTGRES_DB=exedb
@@ -33,7 +38,12 @@ GOTRUE_EXTERNAL_URL=https://auth.CHANGEME_DOMAIN
33
38
  # tokens are rejected as iss-mismatch. Keep equal to GOTRUE_EXTERNAL_URL.
34
39
  GOTRUE_JWT_ISSUER=https://auth.CHANGEME_DOMAIN
35
40
  # SSO redirect allow-list (bug 66f8e10a) — app origins for unified SSO.
36
- GOTRUE_URI_ALLOW_LIST=https://crm.CHANGEME_DOMAIN,https://wiki.CHANGEME_DOMAIN,https://erp.CHANGEME_DOMAIN
41
+ # Must list EVERY origin the SPA can redirect back to, including the opt-in
42
+ # dashboard: dashboard-page sends ?redirect=https://dashboard.<domain> through
43
+ # auth, and GoTrue rejects any redirect_to that is not on this list. Kept in
44
+ # lockstep with generate-env.ts and .env.example — a customer who enables the
45
+ # dashboard profile must not have to discover this entry themselves.
46
+ GOTRUE_URI_ALLOW_LIST=https://crm.CHANGEME_DOMAIN,https://wiki.CHANGEME_DOMAIN,https://erp.CHANGEME_DOMAIN,https://dashboard.CHANGEME_DOMAIN,https://gateway.CHANGEME_DOMAIN
37
47
  # Bug 0327b017: parent-domain session cookie → shared across all subdomains.
38
48
  GOTRUE_COOKIE_DOMAIN=.CHANGEME_DOMAIN
39
49
  GOTRUE_COOKIE_KEY=exe-auth
@@ -48,10 +58,18 @@ SMTP_PORT=587
48
58
  SMTP_USER=
49
59
  SMTP_PASS=
50
60
 
61
+ # --- Dashboard (exe-dashboard — customer dashboard at dashboard.<domain>) ---
62
+ # OPT-IN: the exe-dashboard compose service sits behind `profiles: [dashboard]`.
63
+ # No default is written here on purpose — the pin comes from the signed stack
64
+ # manifest (services.dashboard.image), so .env stays derived rather than
65
+ # becoming a competing source of truth that outranks it once it goes stale.
66
+ #DASHBOARD_IMAGE_TAG=update.askexe.com/askexe/exe-dashboard:vX.Y.Z@sha256:...
67
+ #DASHBOARD_PORT=3301
68
+
51
69
  # --- Auth gateway (exe-auth — shared SSO sign-in UI at auth.<domain>) ---
52
70
  # Bug 58840873: pin the auth image so compose never falls back to its stale
53
71
  # hardcoded default tag. Keep in sync with the manifest AUTH_IMAGE_TAG.
54
- AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.5.0
72
+ AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.6.1@sha256:89670a15bc59255299be695525863e66f949694eec1dd8886038dc3659a4a941
55
73
  # Bug 379e5c13: server_name / CORS from the CONFIGURED apex domain, not by naive
56
74
  # last-2-label slicing (which breaks company.co.uk → co.uk).
57
75
  AUTH_SERVER_NAME=auth.CHANGEME_DOMAIN
@@ -61,6 +79,23 @@ AUTH_DEFAULT_PRODUCT=AUTH
61
79
  # the sign-up UI/route instead of showing a form that always fails.
62
80
  AUTH_DISABLE_SIGNUP=true
63
81
 
82
+ # --- Session cookie contract (exe-auth v0.6.0) — INFORMATIONAL, not settings ---
83
+ # Recorded here because operators reason about XSS blast radius from this file,
84
+ # and an earlier draft of these notes described the OPPOSITE of what ships.
85
+ # exe-auth performs the GoTrue token exchange server-side in njs and sets:
86
+ # exe_sess HttpOnly Secure SameSite=Lax — the real access token
87
+ # exe_sess_refresh HttpOnly Secure SameSite=Lax — the real refresh token
88
+ # exe_access_token JS-readable, value literally "1" — presence sentinel only
89
+ # All three are scoped to the apex (AUTH_COOKIE_DOMAIN) so they are shared
90
+ # across product subdomains.
91
+ #
92
+ # The credentials are HttpOnly ON PURPOSE (security bug 368bf916): page
93
+ # JavaScript CANNOT read them, so an XSS on any subdomain cannot exfiltrate a
94
+ # session token from document.cookie. The only JS-readable cookie is the
95
+ # sentinel, whose value is the constant "1" and is not a credential.
96
+ # Apps must NOT read a token from document.cookie — send credentialed
97
+ # same-site requests and let the HttpOnly cookie ride along.
98
+
64
99
  # --- Centralized role administration (permissions) ---
65
100
  # The apps refuse to let an unmanaged first login mint its own admin
66
101
  # (exe-crm#102 / exe-wiki#45). Both flags below are therefore left at their
@@ -89,7 +124,7 @@ EXE_ORG_ID=
89
124
  EXE_ORG_WORKSPACE_ID=
90
125
 
91
126
  # --- CRM ---
92
- CRM_IMAGE_TAG=update.askexe.com/askexe/exe-crm:v0.9.51
127
+ CRM_IMAGE_TAG=update.askexe.com/askexe/exe-crm:v0.9.53@sha256:a586dcc8bbd992538e3caa18c44e772d30f31155dfef0a2b7466ca3fc7c553d8
93
128
  CRM_SERVER_URL=https://crm.CHANGEME_DOMAIN
94
129
  CRM_APP_SECRET=CHANGEME_CRM_APP_SECRET
95
130
  # The CRM's first admin — seeded at boot by WorkspaceBootstrapService, which is
@@ -103,7 +138,7 @@ EXE_CRM_ADMIN_EMAIL=CHANGEME_ADMIN_EMAIL
103
138
  CRM_HOST_PORT=3000
104
139
 
105
140
  # --- Wiki ---
106
- WIKI_IMAGE_TAG=update.askexe.com/askexe/exe-wiki:v0.9.26
141
+ WIKI_IMAGE_TAG=update.askexe.com/askexe/exe-wiki:v0.9.28@sha256:61856a4c6b97ce62c62ecdc3a377139287be5860eb807d9fbb737115758d7856
107
142
  # Bug 2a8d3003 — DO NOT change this without migrating the data first.
108
143
  # The wiki's users / workspaces / workspace_documents live in `public`. Point it at a
109
144
  # different schema and Prisma will NOT error: it finds no tables, assumes a fresh
@@ -126,7 +161,7 @@ WIKI_HOST_PORT=3001
126
161
  EXE_SSO_COOKIE_NAME=exe_access_token
127
162
 
128
163
  # --- exe-os ---
129
- EXE_OS_IMAGE_TAG=update.askexe.com/askexe/exe-os:v0.9.311
164
+ EXE_OS_IMAGE_TAG=update.askexe.com/askexe/exe-os:v0.9.324@sha256:3ce6406e0f7f279ff2568bbbb7d55de51a46fdf35c49691f24fd959d6fd2d3fa
130
165
  EXED_MCP_TOKEN=CHANGEME_EXED_MCP_TOKEN
131
166
  EXED_DEVICE_ID=CHANGEME_DEVICE_ID
132
167
  EXE_MCP_HOST_BIND=127.0.0.1
@@ -136,7 +171,7 @@ EXE_MCP_HOST_PORT=48739
136
171
  EXE_CLOUD_SYNC_TO_POSTGRES=true
137
172
 
138
173
  # --- ERP (Frappe/ERPNext fork) ---
139
- ERP_IMAGE_TAG=update.askexe.com/askexe/exe-erp:v0.2.2
174
+ ERP_IMAGE_TAG=update.askexe.com/askexe/exe-erp:v2026.08.07-d185286-stamped@sha256:1c655f3f7819c797afd13c79561354f0276cf337403f32aee3e406a497e8827b
140
175
  # Administrator password for the ERPNext site (created on first boot).
141
176
  # bug 43854b31: this only applies at FIRST boot. To rotate it later you must also
142
177
  # run `bench --site $ERP_SITE_NAME set-admin-password <new>` inside exe-erp —
@@ -152,7 +187,7 @@ ERP_WS_PORT=9069
152
187
  ERP_SENTRY_DSN=
153
188
 
154
189
  # --- Gateway ---
155
- GATEWAY_IMAGE_TAG=update.askexe.com/askexe/exe-gateway:v0.9.24
190
+ GATEWAY_IMAGE_TAG=update.askexe.com/askexe/exe-gateway:v2026.08.07-c15f093-stamped@sha256:1bc11a2a0ad1f3929d59d2685696f22a72042b9fca9c75e15c02dc7d3c640105
156
191
  EXE_GATEWAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_AUTH_TOKEN
157
192
  EXE_GATEWAY_WS_RELAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_WS_RELAY_AUTH_TOKEN
158
193
  EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN=CHANGEME_EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN
@@ -173,7 +208,7 @@ CRM_GRAPHQL_URL=http://exe-crm:3000/graphql
173
208
  # bug 633995f1: v0.9.5 is a QUARANTINED build that crashloops on any existing
174
209
  # deployment; v0.9.4 is the last known-good generation and matches the signed
175
210
  # apps manifest. See deploy/known-bad-images.json.
176
- MONITOR_HUB_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-hub:v0.9.4
211
+ MONITOR_HUB_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-hub:v2026.08.09-10660eb4-stamped@sha256:c9a9218c2713b8dffea7e1cf8c0702a614657d311a7a4e821c6a543bab29bb97
177
212
  MONITOR_HUB_PORT=8090
178
213
  # Bootstrap superuser created on first start. Use your admin email + a strong password.
179
214
  # After first boot these values are no longer used (stored in pb_data volume).
@@ -207,7 +242,7 @@ GATEWAY_ALERT_URL=http://exe-gateway:3100/api/alerts/error-spike
207
242
  # Full scope details: deploy/monitor/HOST-ACCESS-CONSENT.md
208
243
  # COMPOSE_PROFILES=monitor-agent
209
244
  # bug 633995f1 / 9ce2a68b: the agent healthcheck is coupled to this generation.
210
- MONITOR_AGENT_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-agent:v0.9.4
245
+ MONITOR_AGENT_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-agent:v2026.08.09-10660eb4-stamped@sha256:29fbd445f79484df04f000603e4ff445e76f0380f86d687a0033e3a0ef7d1b7a
211
246
  # Reports to the local hub. Auto-populated by `exe-os stack-update` during bootstrap.
212
247
  MONITOR_HUB_URL=http://exe-monitor-hub:8090
213
248
  # bug dacf0042: TOKEN and KEY MUST start EMPTY (the safe "unpaired" state) — NOT a
@@ -59,7 +59,7 @@ GOTRUE_EXTERNAL_URL=https://auth.CHANGEME_DOMAIN
59
59
  # Bug 51086951: JWT issuer pinned to the public auth URL so signer + consumers agree.
60
60
  GOTRUE_JWT_ISSUER=https://auth.CHANGEME_DOMAIN
61
61
  # SSO redirect allow-list (bug 66f8e10a) — app origins for unified SSO.
62
- GOTRUE_URI_ALLOW_LIST=https://crm.CHANGEME_DOMAIN,https://wiki.CHANGEME_DOMAIN,https://erp.CHANGEME_DOMAIN
62
+ GOTRUE_URI_ALLOW_LIST=https://crm.CHANGEME_DOMAIN,https://wiki.CHANGEME_DOMAIN,https://erp.CHANGEME_DOMAIN,https://dashboard.CHANGEME_DOMAIN,https://gateway.CHANGEME_DOMAIN
63
63
  # Bug 0327b017: parent-domain cookie → session shared across all subdomains.
64
64
  GOTRUE_COOKIE_DOMAIN=.CHANGEME_DOMAIN
65
65
  GOTRUE_COOKIE_KEY=exe-auth
@@ -76,11 +76,26 @@ SMTP_PORT=587
76
76
  SMTP_USER=
77
77
  SMTP_PASS=
78
78
 
79
+ # --- Dashboard (exe-dashboard — customer dashboard at dashboard.<domain>) ---
80
+ # OPT-IN: the exe-dashboard compose service sits behind `profiles: [dashboard]`
81
+ # and is off unless you run `docker compose --profile dashboard ...`.
82
+ # DELIBERATELY UNSET AND COMMENTED OUT. Unlike the older *_IMAGE_TAG lines
83
+ # above/below, this one carries no hardcoded literal: a pinned default here is
84
+ # a second source of truth that silently outranks the manifest the moment it
85
+ # goes stale. Take the value from the signed stack manifest
86
+ # (deploy/stack-manifests/v0.9.json -> services.dashboard.image), digest and all.
87
+ # Leave it unset and compose refuses the dashboard loudly ("has neither an image
88
+ # nor a build context specified") instead of booting something arbitrary.
89
+ #DASHBOARD_IMAGE_TAG=update.askexe.com/askexe/exe-dashboard:vX.Y.Z@sha256:...
90
+ # Host port for the dashboard container (bound to 127.0.0.1; the tunnel and the
91
+ # SSO edge reach it over the docker network, not this port).
92
+ #DASHBOARD_PORT=3301
93
+
79
94
  # --- Auth gateway (exe-auth — shared SSO sign-in UI at auth.<domain>) ---
80
95
  # Bug 58840873: pin the auth image so compose never falls back to its stale
81
96
  # hardcoded default tag. Keep in sync with the manifest AUTH_IMAGE_TAG. exe-auth
82
97
  # ships only from the private update.askexe.com registry (no GHCR mirror).
83
- AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.5.0
98
+ AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.6.1@sha256:89670a15bc59255299be695525863e66f949694eec1dd8886038dc3659a4a941
84
99
  # Bug 379e5c13: server_name / CORS derived from the CONFIGURED apex domain,
85
100
  # not by naive last-2-label slicing (which breaks company.co.uk → co.uk).
86
101
  AUTH_SERVER_NAME=auth.CHANGEME_DOMAIN
@@ -95,6 +110,23 @@ AUTH_DEFAULT_PRODUCT=AUTH
95
110
  # the sign-up UI/route instead of showing a form that always fails.
96
111
  AUTH_DISABLE_SIGNUP=true
97
112
 
113
+ # --- Session cookie contract (exe-auth v0.6.0) — INFORMATIONAL, not settings ---
114
+ # Recorded here because operators reason about XSS blast radius from this file,
115
+ # and an earlier draft of these notes described the OPPOSITE of what ships.
116
+ # exe-auth performs the GoTrue token exchange server-side in njs and sets:
117
+ # exe_sess HttpOnly Secure SameSite=Lax — the real access token
118
+ # exe_sess_refresh HttpOnly Secure SameSite=Lax — the real refresh token
119
+ # exe_access_token JS-readable, value literally "1" — presence sentinel only
120
+ # All three are scoped to the apex (AUTH_COOKIE_DOMAIN) so they are shared
121
+ # across product subdomains.
122
+ #
123
+ # The credentials are HttpOnly ON PURPOSE (security bug 368bf916): page
124
+ # JavaScript CANNOT read them, so an XSS on any subdomain cannot exfiltrate a
125
+ # session token from document.cookie. The only JS-readable cookie is the
126
+ # sentinel, whose value is the constant "1" and is not a credential.
127
+ # Apps must NOT read a token from document.cookie — send credentialed
128
+ # same-site requests and let the HttpOnly cookie ride along.
129
+
98
130
  # --- Centralized role administration (permissions) ---
99
131
  # The apps refuse to let an unmanaged first login mint its own admin
100
132
  # (exe-crm#102 / exe-wiki#45). Both flags below are therefore left at their
@@ -123,7 +155,7 @@ EXE_ORG_ID=
123
155
  EXE_ORG_WORKSPACE_ID=
124
156
 
125
157
  # --- CRM ---
126
- CRM_IMAGE_TAG=ghcr.io/askexe/exe-crm:v0.9.51
158
+ CRM_IMAGE_TAG=ghcr.io/askexe/exe-crm:v0.9.53@sha256:a586dcc8bbd992538e3caa18c44e772d30f31155dfef0a2b7466ca3fc7c553d8
127
159
  CRM_SERVER_URL=https://crm.CHANGEME_DOMAIN
128
160
  CRM_APP_SECRET=CHANGEME_CRM_APP_SECRET
129
161
  EXE_CRM_ADMIN_TOKEN=CHANGEME_EXE_CRM_ADMIN_TOKEN
@@ -136,7 +168,7 @@ EXE_CRM_ADMIN_EMAIL=CHANGEME_ADMIN_EMAIL
136
168
  CRM_HOST_PORT=3000
137
169
 
138
170
  # --- Wiki ---
139
- WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.26
171
+ WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.28@sha256:61856a4c6b97ce62c62ecdc3a377139287be5860eb807d9fbb737115758d7856
140
172
  # Bug 2a8d3003 — DO NOT change this without migrating the data first.
141
173
  # The wiki's users / workspaces / workspace_documents live in `public`. Point it at a
142
174
  # different schema and Prisma will NOT error: it finds no tables, assumes a fresh
@@ -159,7 +191,12 @@ WIKI_HOST_PORT=3001
159
191
  EXE_SSO_COOKIE_NAME=exe_access_token
160
192
 
161
193
  # --- exe-os ---
162
- EXE_OS_IMAGE_TAG=ghcr.io/askexe/exe-os:v0.9.311
194
+ EXE_OS_IMAGE_TAG=ghcr.io/askexe/exe-os:v0.9.324@sha256:3ce6406e0f7f279ff2568bbbb7d55de51a46fdf35c49691f24fd959d6fd2d3fa
195
+
196
+ # Infra image pins — manifest-derived. Compose has no fallback default for
197
+ # these: a missing pin ABORTS the deploy instead of substituting an old image.
198
+ EXE_DB_IMAGE=update.askexe.com/askexe/pgvector:0.8.0-pg16@sha256:a132765ec351c65111b5b675928a3a0515a466a40f97277329db8b8209ad8bc9
199
+ OTEL_COLLECTOR_IMAGE=update.askexe.com/askexe/otel-collector-contrib:0.114.0@sha256:37fa87091cfaaec7234a27e4e395a40c31c2bfaea97a349a4afef6d9e9681197
163
200
  EXED_MCP_TOKEN=CHANGEME_EXED_MCP_TOKEN
164
201
  EXED_DEVICE_ID=vps-default
165
202
  EXE_MCP_HOST_BIND=127.0.0.1
@@ -169,7 +206,7 @@ EXE_MCP_HOST_PORT=48739
169
206
  EXE_CLOUD_SYNC_TO_POSTGRES=true
170
207
 
171
208
  # --- Gateway ---
172
- GATEWAY_IMAGE_TAG=ghcr.io/askexe/exe-gateway:v0.9.24
209
+ GATEWAY_IMAGE_TAG=ghcr.io/askexe/exe-gateway:v2026.08.07-c15f093-stamped@sha256:1bc11a2a0ad1f3929d59d2685696f22a72042b9fca9c75e15c02dc7d3c640105
173
210
  EXE_GATEWAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_AUTH_TOKEN
174
211
  EXE_GATEWAY_WS_RELAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_WS_RELAY_AUTH_TOKEN
175
212
  EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN=CHANGEME_EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN
@@ -209,7 +246,7 @@ ERROR_REPORTING_ENABLED=true
209
246
  MONITOR_ERROR_URL=http://exe-monitor-hub:8090/api/exe-monitor/errors
210
247
 
211
248
  # --- ERP (optional — Exe ERP, Frappe/ERPNext fork) ---
212
- ERP_IMAGE_TAG=ghcr.io/askexe/exe-erp:v0.2.2
249
+ ERP_IMAGE_TAG=ghcr.io/askexe/exe-erp:v2026.08.07-d185286-stamped@sha256:1c655f3f7819c797afd13c79561354f0276cf337403f32aee3e406a497e8827b
213
250
  ERP_ADMIN_PASSWORD=CHANGEME_ERP_ADMIN_PASSWORD
214
251
  EXE_ERP_ADMIN_TOKEN=CHANGEME_EXE_ERP_ADMIN_TOKEN
215
252
  # Frappe site name — must match the erp.<domain> the customer serves (bug e61ad373).
@@ -231,7 +268,7 @@ EXE_BUILD_HTTP_PORT=9222
231
268
  # data dir and entrypoint all changed) and crashloops on any existing
232
269
  # deployment. v0.9.4 is the last known-good generation and is what the signed
233
270
  # apps manifest pins. See deploy/known-bad-images.json.
234
- MONITOR_HUB_IMAGE_TAG=ghcr.io/askexe/exe-monitor-hub:v0.9.4
271
+ MONITOR_HUB_IMAGE_TAG=ghcr.io/askexe/exe-monitor-hub:v2026.08.09-10660eb4-stamped@sha256:c9a9218c2713b8dffea7e1cf8c0702a614657d311a7a4e821c6a543bab29bb97
235
272
  MONITOR_HUB_PORT=8090
236
273
  # Bootstrap superuser created on first start. Use your admin email + a strong password.
237
274
  # After first boot these values are no longer used (stored in pb_data volume).
@@ -251,7 +288,7 @@ MONITOR_HUB_ADMIN_PASSWORD=CHANGEME_MONITOR_HUB_ADMIN_PASSWORD
251
288
  # COMPOSE_PROFILES=monitor-agent
252
289
  # bug 633995f1 / 9ce2a68b: keep the agent on the v0.9.4 generation — the
253
290
  # compose healthcheck (`/app/beszel-agent health`) is coupled to it.
254
- MONITOR_AGENT_IMAGE_TAG=ghcr.io/askexe/exe-monitor-agent:v0.9.4
291
+ MONITOR_AGENT_IMAGE_TAG=ghcr.io/askexe/exe-monitor-agent:v2026.08.09-10660eb4-stamped@sha256:29fbd445f79484df04f000603e4ff445e76f0380f86d687a0033e3a0ef7d1b7a
255
292
  # Reports to the local hub. Auto-populated by `exe-os stack-update` during bootstrap.
256
293
  MONITOR_HUB_URL=http://exe-monitor-hub:8090
257
294
  # bug dacf0042: TOKEN and KEY MUST start EMPTY (the safe "unpaired" state) —
@@ -29,7 +29,7 @@ services:
29
29
  # bug ee16e7ef: pin a versioned tag, not the mutable :pg16 rolling tag.
30
30
  # pgvector/pgvector:pg16 can change upstream without notice; 0.8.0-pg16
31
31
  # is the tested stable release. Override via EXE_DB_IMAGE in .env.
32
- image: ${EXE_DB_IMAGE:-pgvector/pgvector:0.8.0-pg16@sha256:a132765ec351c65111b5b675928a3a0515a466a40f97277329db8b8209ad8bc9}
32
+ image: ${EXE_DB_IMAGE:?EXE_DB_IMAGE must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
33
33
  container_name: exe-db
34
34
  restart: unless-stopped
35
35
  # SECURITY (bug 67d62490): no blanket `env_file: .env`. Each service
@@ -176,6 +176,17 @@ services:
176
176
  GOTRUE_API_PORT: ${GOTRUE_API_PORT:-9999}
177
177
  GOTRUE_DB_DRIVER: postgres
178
178
  GOTRUE_DB_DATABASE_URL: postgres://${POSTGRES_USER:-exe}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@exe-db:5432/${POSTGRES_DB:-exedb}?sslmode=disable&search_path=auth
179
+ # Bug 5c3023a2: GoTrue's DB pool kept connections forever (Go database/sql
180
+ # ConnMaxLifetime defaults to 0). When exe-db (Postgres) restarts during a
181
+ # deploy, GoTrue reused a dead pooled socket for the next `error finding
182
+ # user` query → "write tcp ... broken pipe" → random 500 on /token
183
+ # (founder-visible sign-in failure). exe-db sets NO finite server-side idle
184
+ # timeout, so these bounds sit well below Postgres's ceiling and below any
185
+ # network idle reap: recycle every connection within 5m and drop an idle
186
+ # one after 60s, so a connection killed by a restart is retired, not reused.
187
+ GOTRUE_DB_MAX_POOL_SIZE: ${GOTRUE_DB_MAX_POOL_SIZE:-10}
188
+ GOTRUE_DB_CONN_MAX_LIFETIME: ${GOTRUE_DB_CONN_MAX_LIFETIME:-300s}
189
+ GOTRUE_DB_CONN_MAX_IDLE_TIME: ${GOTRUE_DB_CONN_MAX_IDLE_TIME:-60s}
179
190
  # Bug ae113b23: never fall back to a hardcoded domain here.
180
191
  # GOTRUE_SITE_URL must be set in .env by generate-env.ts. An empty/missing
181
192
  # value is intentionally rejected at runtime so misconfigured stacks fail
@@ -267,7 +278,7 @@ services:
267
278
  # is what the signed apps manifest (deploy/stack-manifests/v0.9.30-apps.json)
268
279
  # and exe-monitor's own stack.release.json pin. Do not reintroduce the bad
269
280
  # digest.
270
- image: ${MONITOR_HUB_IMAGE_TAG:-ghcr.io/askexe/exe-monitor-hub:v0.9.4@sha256:d593bec5a4b248388d0d85353fae1ba8f93cab628a03833aa79acd0632fd11cb}
281
+ image: ${MONITOR_HUB_IMAGE_TAG:?MONITOR_HUB_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
271
282
  container_name: exe-monitor-hub
272
283
  restart: unless-stopped
273
284
  # bug d3d49101 / 1fdb8be9: PocketBase's data dir for this hub is a RELATIVE
@@ -319,7 +330,11 @@ services:
319
330
  # the live exe-db-jkt container (image v0.9.4): /app/beszel exists,
320
331
  # /beszel does not → the old `/beszel` healthcheck failed on every probe
321
332
  # (permanent false-unhealthy). Match the image's own HEALTHCHECK path.
322
- test: ["CMD", "/app/beszel", "health", "--url", "http://127.0.0.1:8090"]
333
+ # bug f9fc272b: the healthcheck binary is coupled to the image generation.
334
+ # stack-update writes MONITOR_HUB_HEALTH_BIN from the pinned manifest image
335
+ # so the probe follows the deployed generation; the default matches the
336
+ # v0.9.4 compose-default image.
337
+ test: ["CMD", "${MONITOR_HUB_HEALTH_BIN:-/app/beszel}", "health", "--url", "http://127.0.0.1:8090"]
323
338
  interval: 30s
324
339
  timeout: 5s
325
340
  start_period: 15s
@@ -345,7 +360,7 @@ services:
345
360
  # ------------------------------------------------------------------
346
361
 
347
362
  exe-crm:
348
- image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.51@sha256:73864ce14aaac06b73d67100bbf88e669fd13c7da39edd9644107037211559b7}
363
+ image: ${CRM_IMAGE_TAG:?CRM_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
349
364
  container_name: exe-crm
350
365
  restart: unless-stopped
351
366
  # bug ad4471ad: NO compose `command` override. The image entrypoint
@@ -471,7 +486,7 @@ services:
471
486
  options: { max-size: "10m", max-file: "3" }
472
487
 
473
488
  exe-crm-worker:
474
- image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.51@sha256:73864ce14aaac06b73d67100bbf88e669fd13c7da39edd9644107037211559b7}
489
+ image: ${CRM_IMAGE_TAG:?CRM_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
475
490
  container_name: exe-crm-worker
476
491
  restart: unless-stopped
477
492
  command: ["yarn", "worker:prod"]
@@ -537,7 +552,7 @@ services:
537
552
  # erroring, so "wiki looks wiped" and "wiki is misconfigured" are indistinguishable
538
553
  # at a glance, and the wrong diagnosis (restore from backup) destroys real data.
539
554
  exe-wiki-schema-guard:
540
- image: ${EXE_DB_IMAGE:-pgvector/pgvector:0.8.0-pg16@sha256:a132765ec351c65111b5b675928a3a0515a466a40f97277329db8b8209ad8bc9}
555
+ image: ${EXE_DB_IMAGE:?EXE_DB_IMAGE must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
541
556
  container_name: exe-wiki-schema-guard
542
557
  restart: "no"
543
558
  depends_on:
@@ -573,7 +588,7 @@ services:
573
588
  options: { max-size: "10m", max-file: "3" }
574
589
 
575
590
  exe-wiki:
576
- image: ${WIKI_IMAGE_TAG:-ghcr.io/askexe/exe-wiki:v0.9.26@sha256:c0d61d183b274a67977fdfb1b40d5e4736559a9d90507843183e5642da2a959d}
591
+ image: ${WIKI_IMAGE_TAG:?WIKI_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
577
592
  container_name: exe-wiki
578
593
  restart: unless-stopped
579
594
  # Wiki uses Prisma — runs migrate on boot via built-in entrypoint.
@@ -713,7 +728,15 @@ services:
713
728
  # to pin the split server image; falls back to the combined EXE_OS_IMAGE_TAG
714
729
  # for backward compatibility with existing manifests.
715
730
  exe-os:
716
- image: ${EXE_OS_SERVER_IMAGE_TAG:-${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-ghcr.io/askexe/exe-os:v0.9.311@sha256:011730042f55277724dbe83fde1a6416db2f3e8bf62d3254738d68d8de33e1f9}}}
731
+ # FAIL-CLOSED PIN. The signed stack manifest is the single source of truth for
732
+ # this image; stack-update writes EXE_OS_IMAGE_TAG from it. The legacy aliases are
733
+ # kept so an older .env keeps working, and the chain terminates EMPTY on purpose:
734
+ # docker compose evaluates nested defaults eagerly, so `:?` inside a chain would
735
+ # fire even when an alias IS set. With no pin at all compose aborts with
736
+ # "has neither an image nor a build context specified" — loud, not a silent
737
+ # substitution of a stale hard-coded version (which is how auth nearly shipped a
738
+ # four-minor-version downgrade).
739
+ image: ${EXE_OS_SERVER_IMAGE_TAG:-${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-}}}
717
740
  container_name: exe-os
718
741
  restart: unless-stopped
719
742
  # bug debf4a39 / 93ddfa27: the daemon connects to exe-db at boot
@@ -832,7 +855,7 @@ services:
832
855
  options: { max-size: "10m", max-file: "3" }
833
856
 
834
857
  exe-gateway:
835
- image: ${GATEWAY_IMAGE_TAG:-ghcr.io/askexe/exe-gateway:v0.9.24@sha256:9cda7c00d886b4ab16a3b88aa953aa45c991f2977084ea8532f55fcaf75e8f37}
858
+ image: ${GATEWAY_IMAGE_TAG:?GATEWAY_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
836
859
  container_name: exe-gateway
837
860
  restart: unless-stopped
838
861
  # Gateway needs 45s to flush outbound queues + disconnect Baileys adapters.
@@ -879,6 +902,16 @@ services:
879
902
  # with (pinned on the gotrue service), NOT the internal GOTRUE_URL above, so
880
903
  # the gateway accepts real browser SSO tokens. Same public value, one default.
881
904
  GOTRUE_JWT_ISSUER: ${GOTRUE_JWT_ISSUER:-${GOTRUE_EXTERNAL_URL:?GOTRUE_EXTERNAL_URL is required — set to https://auth.<your-domain> in .env}}
905
+ # Bug 550d6ab7, third occurrence of the same defect (after exe-wiki
906
+ # 0c0d5187 and exe-crm). The gateway verifies GoTrue tokens IN-PROCESS:
907
+ # src/gotrue-auth.ts verifyGoTrueJWT reads the JWKS first and, because our
908
+ # GoTrue signs symmetrically and therefore publishes `{"keys":[]}` by
909
+ # design, falls back to getSymmetricKey() — which returns null unless
910
+ # GOTRUE_JWT_SECRET is in this container's environment. Without this line
911
+ # the fallback that makes gateway SSO possible at all is unsatisfiable in
912
+ # the stack customers actually run, and every token is rejected by a
913
+ # silent `return null`. Fail loud rather than boot with no key material.
914
+ GOTRUE_JWT_SECRET: ${GOTRUE_JWT_SECRET:?GOTRUE_JWT_SECRET is required}
882
915
  EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN: ${EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN:?EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN is required}
883
916
  EXE_GATEWAY_WS_RELAY_ENABLED: "true"
884
917
  EXE_GATEWAY_WS_RELAY_HOST: "0.0.0.0"
@@ -986,7 +1019,7 @@ services:
986
1019
  # v0.9.5 default contradicted that healthcheck, so the agent was
987
1020
  # permanently unhealthy from the first recreate. Matches the signed apps
988
1021
  # manifest and exe-monitor's stack.release.json.
989
- image: ${MONITOR_AGENT_IMAGE_TAG:-ghcr.io/askexe/exe-monitor-agent:v0.9.4@sha256:9ca4e75577b2ff2abb754140ccfaf8df19161bcef601faf37d1fce743fe814fc}
1022
+ image: ${MONITOR_AGENT_IMAGE_TAG:?MONITOR_AGENT_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
990
1023
  container_name: exe-monitor-agent
991
1024
  # Host-access consent gate: only starts when the operator has
992
1025
  # acknowledged the host-access scope (COMPOSE_PROFILES=monitor-agent).
@@ -1060,7 +1093,11 @@ services:
1060
1093
  # The binary-native `health` subcommand checks the freshness of the
1061
1094
  # agent's health file, which only stays fresh while it is actively
1062
1095
  # reporting to the hub.
1063
- test: ["CMD", "/app/beszel-agent", "health"]
1096
+ # bug f9fc272b: the healthcheck binary is coupled to the image generation.
1097
+ # stack-update writes MONITOR_AGENT_HEALTH_BIN from the pinned manifest image
1098
+ # so the probe follows the deployed generation; the default matches the
1099
+ # v0.9.4 compose-default image.
1100
+ test: ["CMD", "${MONITOR_AGENT_HEALTH_BIN:-/app/beszel-agent}", "health"]
1064
1101
  interval: 30s
1065
1102
  timeout: 5s
1066
1103
  start_period: 30s
@@ -1087,7 +1124,15 @@ services:
1087
1124
  # Without a token the binary exits 0 (no crash-loop). (bug 3416cead)
1088
1125
  # ------------------------------------------------------------------
1089
1126
  exe-update:
1090
- image: ${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-ghcr.io/askexe/exe-os:v0.9.311@sha256:011730042f55277724dbe83fde1a6416db2f3e8bf62d3254738d68d8de33e1f9}}
1127
+ # FAIL-CLOSED PIN. The signed stack manifest is the single source of truth for
1128
+ # this image; stack-update writes EXE_OS_IMAGE_TAG from it. The legacy aliases are
1129
+ # kept so an older .env keeps working, and the chain terminates EMPTY on purpose:
1130
+ # docker compose evaluates nested defaults eagerly, so `:?` inside a chain would
1131
+ # fire even when an alias IS set. With no pin at all compose aborts with
1132
+ # "has neither an image nor a build context specified" — loud, not a silent
1133
+ # substitution of a stale hard-coded version (which is how auth nearly shipped a
1134
+ # four-minor-version downgrade).
1135
+ image: ${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-}}
1091
1136
  container_name: exe-update
1092
1137
  profiles: ["registry-proxy", "askexe-control-plane"]
1093
1138
  restart: unless-stopped
@@ -1296,7 +1341,7 @@ services:
1296
1341
  # 4 services: gunicorn API, websocket, RQ worker, scheduler.
1297
1342
 
1298
1343
  exe-erp:
1299
- image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.2@sha256:00fecc790ff848bfd4b7d87f42f859edfeb6090a7ca26bf2359dc6cb96767afb}
1344
+ image: ${ERP_IMAGE_TAG:?ERP_IMAGE_TAG must be set by stack-update (the digest-pinned ERP image from the signed manifest) — refusing to fall back to an untested image}
1300
1345
  container_name: exe-erp
1301
1346
  restart: unless-stopped
1302
1347
  entrypoint: ["/usr/local/bin/entrypoint.sh"]
@@ -1437,7 +1482,7 @@ services:
1437
1482
  options: { max-size: "10m", max-file: "3" }
1438
1483
 
1439
1484
  exe-erp-websocket:
1440
- image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.2@sha256:00fecc790ff848bfd4b7d87f42f859edfeb6090a7ca26bf2359dc6cb96767afb}
1485
+ image: ${ERP_IMAGE_TAG:?ERP_IMAGE_TAG must be set by stack-update (the digest-pinned ERP image from the signed manifest) — refusing to fall back to an untested image}
1441
1486
  container_name: exe-erp-websocket
1442
1487
  restart: unless-stopped
1443
1488
  entrypoint: []
@@ -1499,7 +1544,7 @@ services:
1499
1544
  options: { max-size: "10m", max-file: "3" }
1500
1545
 
1501
1546
  exe-erp-queue:
1502
- image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.2@sha256:00fecc790ff848bfd4b7d87f42f859edfeb6090a7ca26bf2359dc6cb96767afb}
1547
+ image: ${ERP_IMAGE_TAG:?ERP_IMAGE_TAG must be set by stack-update (the digest-pinned ERP image from the signed manifest) — refusing to fall back to an untested image}
1503
1548
  container_name: exe-erp-queue
1504
1549
  restart: unless-stopped
1505
1550
  entrypoint: []
@@ -1579,7 +1624,7 @@ services:
1579
1624
  options: { max-size: "10m", max-file: "3" }
1580
1625
 
1581
1626
  exe-erp-scheduler:
1582
- image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.2@sha256:00fecc790ff848bfd4b7d87f42f859edfeb6090a7ca26bf2359dc6cb96767afb}
1627
+ image: ${ERP_IMAGE_TAG:?ERP_IMAGE_TAG must be set by stack-update (the digest-pinned ERP image from the signed manifest) — refusing to fall back to an untested image}
1583
1628
  container_name: exe-erp-scheduler
1584
1629
  restart: unless-stopped
1585
1630
  entrypoint: []
@@ -1646,7 +1691,7 @@ services:
1646
1691
  exe-otel-collector:
1647
1692
  # bug 32d6e02f: digest-pinned default (was tag-only) — matches the
1648
1693
  # stack manifest pin for otel/opentelemetry-collector-contrib:0.114.0.
1649
- image: ${OTEL_COLLECTOR_IMAGE:-otel/opentelemetry-collector-contrib:0.114.0@sha256:37fa87091cfaaec7234a27e4e395a40c31c2bfaea97a349a4afef6d9e9681197}
1694
+ image: ${OTEL_COLLECTOR_IMAGE:?OTEL_COLLECTOR_IMAGE must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
1650
1695
  container_name: exe-otel-collector
1651
1696
  restart: unless-stopped
1652
1697
  command: ["--config=/etc/otelcol-contrib/config.yaml"]
@@ -1714,7 +1759,7 @@ services:
1714
1759
  # a fresh/migrated install boots an old image while the manifest reads "latest".
1715
1760
  # generate-env.ts now always writes AUTH_IMAGE_TAG, and this default mirrors the
1716
1761
  # pin as defense-in-depth — keep BOTH in lockstep on every auth release.
1717
- image: ${AUTH_IMAGE_TAG:-update.askexe.com/askexe/exe-auth:v0.5.0@sha256:ecc57f92b1f2c2d9df4fafe648622fe1fdd87c27012048d950e3f6b82086ccf9}
1762
+ image: ${AUTH_IMAGE_TAG:?AUTH_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
1718
1763
  container_name: exe-auth
1719
1764
  restart: unless-stopped
1720
1765
  environment:
@@ -1784,6 +1829,79 @@ services:
1784
1829
  driver: json-file
1785
1830
  options: { max-size: "10m", max-file: "3" }
1786
1831
 
1832
+ # ------------------------------------------------------------------
1833
+ # Dashboard — customer dashboard at dashboard.yourdomain.com
1834
+ # Static nginx image built from dashboard-page/ in the exe-os repo.
1835
+ # ------------------------------------------------------------------
1836
+ #
1837
+ # WHY THIS IS HERE AT ALL (2026-08-20). exe-dashboard has been running in
1838
+ # production for months WITHOUT a service in this file. Its only compose
1839
+ # definition was dashboard-page/docker-compose.yml — a standalone side-car
1840
+ # that carried `build: .` and a hardcoded `image: …:v0.1.0`, joined the
1841
+ # external `exe-net` network, and answered the `upstream sso_dashboard`
1842
+ # in sso-edge/default.conf.template. Nothing in the stack manifest could pin
1843
+ # a service the stack compose did not define, which is exactly why the
1844
+ # dashboard drifted three builds behind main with nobody able to see it.
1845
+ # This entry makes it a first-class, manifest-governed stack service.
1846
+ #
1847
+ # OPT-IN VIA PROFILE. `profiles: ["dashboard"]` keeps this off for every
1848
+ # existing deployment that has not opted in. That is deliberate and it is why
1849
+ # the image pin uses the empty-default form and NOT the required-variable
1850
+ # (colon-question-mark) form: compose interpolates the WHOLE file before it
1851
+ # filters by profile (verified on Docker 28.5.1 — a required-variable
1852
+ # reference inside an INACTIVE profile still aborts `docker compose config`),
1853
+ # so that form here would break every customer who never asked for the
1854
+ # dashboard. The empty terminator gets the same fail-loud
1855
+ # behaviour exactly where it belongs: with the profile ACTIVE and the variable
1856
+ # unset, compose refuses with `service "exe-dashboard" has neither an image nor
1857
+ # a build context specified` instead of silently substituting a stale literal.
1858
+ exe-dashboard:
1859
+ image: ${DASHBOARD_IMAGE_TAG:-}
1860
+ profiles: ["dashboard"]
1861
+ container_name: exe-dashboard
1862
+ restart: unless-stopped
1863
+ environment:
1864
+ # Customer apex domain — templates server_name, CSP and the SPA's API/auth
1865
+ # URLs at container start via dashboard-page/docker-entrypoint.sh. Never
1866
+ # falls back to askexe.com.
1867
+ DOMAIN: ${DOMAIN:?DOMAIN is required — set to your customer apex domain (e.g. hygo.co)}
1868
+ # Optional explicit overrides; each defaults to the matching *.${DOMAIN}.
1869
+ DASH_DOMAIN: ${DASH_DOMAIN:-}
1870
+ DASH_API_URL: ${DASH_API_URL:-}
1871
+ DASH_AUTH_URL: ${DASH_AUTH_URL:-}
1872
+ DASH_DASHBOARD_URL: ${DASH_DASHBOARD_URL:-}
1873
+ ports:
1874
+ - "127.0.0.1:${DASHBOARD_PORT:-3301}:80"
1875
+ networks:
1876
+ # `backend` so exe-sso-edge can resolve `exe-dashboard` for its
1877
+ # `upstream sso_dashboard { server exe-dashboard:80; }`; `frontend` so the
1878
+ # cloudflared tunnel can reach it. Same pair as exe-auth/exe-crm/exe-wiki.
1879
+ #
1880
+ # NOTE: exe-sso-edge deliberately does NOT list this service in its
1881
+ # depends_on. The edge must keep starting on deployments that never enable
1882
+ # the dashboard profile, and a depends_on would make the edge unstartable
1883
+ # for them.
1884
+ - backend
1885
+ - frontend
1886
+ healthcheck:
1887
+ # dashboard-page/nginx.conf serves `location = /health` as a literal 200.
1888
+ # This is the same URL the stack manifest's healthUrl names, so the deploy
1889
+ # gate and the container agree on what "up" means. Before this existed,
1890
+ # /health fell through to the SPA `location /` and returned the index page
1891
+ # with a 200 — a probe that could not fail while nginx was running at all.
1892
+ test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1/health"]
1893
+ interval: 30s
1894
+ timeout: 5s
1895
+ start_period: 5s
1896
+ retries: 3
1897
+ deploy:
1898
+ resources:
1899
+ limits:
1900
+ memory: 128M
1901
+ logging:
1902
+ driver: json-file
1903
+ options: { max-size: "10m", max-file: "3" }
1904
+
1787
1905
  # ------------------------------------------------------------------
1788
1906
  # Volumes
1789
1907
  # ------------------------------------------------------------------