@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.
- package/deploy/compose/.env.customer.example +45 -10
- package/deploy/compose/.env.example +46 -9
- package/deploy/compose/docker-compose.yml +136 -18
- package/deploy/compose/generate-env.ts +142 -34
- package/deploy/compose/sso-edge/default.conf.template +78 -7
- package/deploy/compose/sso-edge/sso-redirect.conf +109 -13
- package/deploy/stack-manifests/v0.9.30-apps.json +1 -1
- package/deploy/stack-manifests/v0.9.json +4 -4
- package/dist/.dist-verified.json +3 -3
- package/dist/{active-agent-GRT5MKD5.js → active-agent-ONPPEWQV.js} +7 -6
- package/dist/{active-agent-L2ZSSXDK.js → active-agent-UJKMG7LJ.js} +7 -6
- package/dist/{agent-defs-generator-M4ZNYIVX.js → agent-defs-generator-ZWI6DXOE.js} +6 -5
- package/dist/{agent-loop-FOK2IRZQ.js → agent-loop-OYHJKNYH.js} +1 -1
- package/dist/{agentic-ontology-DMPRDEUX.js → agentic-ontology-WHFJ3QFS.js} +1 -1
- package/dist/{artifact-backup-767STHSW.js → artifact-backup-WXZNB7KE.js} +2 -1
- package/dist/{backfill-gate-VX2RZTQV.js → backfill-gate-KWJQ35YX.js} +3 -2
- package/dist/{backfill-metadata-ZMEHJQ5M.js → backfill-metadata-3OUSQD5V.js} +8 -7
- package/dist/{background-jobs-LTPWCMA3.js → background-jobs-6VMD55PK.js} +3 -2
- package/dist/{backup-verify-EX2K732J.js → backup-verify-ZKTUYLTA.js} +4 -3
- package/dist/{behavior-injection-22AGMS25.js → behavior-injection-M6UYZCMW.js} +17 -15
- package/dist/{behaviors-DVFXAWF5.js → behaviors-ZJ45TFBJ.js} +21 -13
- package/dist/bin/age-ontology-load.js +3 -2
- package/dist/bin/agentic-ontology-backfill.js +10 -9
- package/dist/bin/agentic-reflection-backfill.js +11 -10
- package/dist/bin/agentic-semantic-label.js +10 -9
- package/dist/bin/backfill-conversations.js +13 -11
- package/dist/bin/backfill-responses.js +13 -11
- package/dist/bin/backfill-vectors.js +17 -15
- package/dist/bin/bulk-sync-postgres.js +22 -20
- package/dist/bin/cc-doctor.js +10 -9
- package/dist/bin/cleanup-stale-review-tasks.js +29 -26
- package/dist/bin/cli.js +36 -26
- package/dist/bin/deferred-daemon-restart.js +114 -110
- package/dist/bin/exe-agent-config.js +6 -5
- package/dist/bin/exe-agent.js +127 -33
- package/dist/bin/exe-assign.js +15 -13
- package/dist/bin/exe-boot.js +57 -54
- package/dist/bin/exe-call.js +8 -7
- package/dist/bin/exe-cloud.js +24 -22
- package/dist/bin/exe-config-dump.js +6 -5
- package/dist/bin/exe-dispatch.js +30 -27
- package/dist/bin/exe-doctor.js +14 -10
- package/dist/bin/exe-export-behaviors.js +19 -17
- package/dist/bin/exe-forget.js +10 -9
- package/dist/bin/exe-gateway.js +199 -19
- package/dist/bin/exe-grant.js +5 -5
- package/dist/bin/exe-healthcheck.js +10 -9
- package/dist/bin/exe-heartbeat.js +35 -32
- package/dist/bin/exe-kill.js +34 -31
- package/dist/bin/exe-launch-agent.js +126 -54
- package/dist/bin/exe-mcp.js +6 -5
- package/dist/bin/exe-memory-reads.js +8 -7
- package/dist/bin/exe-new-employee.js +12 -11
- package/dist/bin/exe-os-mcp-proxy.js +6 -5
- package/dist/bin/exe-pending-messages.js +30 -27
- package/dist/bin/exe-pending-notifications.js +29 -26
- package/dist/bin/exe-pending-reviews.js +30 -27
- package/dist/bin/exe-rename.js +8 -7
- package/dist/bin/exe-repo-truth.js +1 -1
- package/dist/bin/exe-review.js +33 -30
- package/dist/bin/exe-search.js +9 -8
- package/dist/bin/exe-session-cleanup.js +35 -32
- package/dist/bin/exe-settings.js +24 -22
- package/dist/bin/exe-start-codex.js +137 -55
- package/dist/bin/exe-start-opencode.js +121 -23
- package/dist/bin/exe-status.js +31 -28
- package/dist/bin/exe-support.js +5 -4
- package/dist/bin/exe-team.js +7 -6
- package/dist/bin/exe-watchdog.js +31 -11
- package/dist/bin/generate-hook-manifest.js +44 -7
- package/dist/bin/git-sweep.js +31 -28
- package/dist/bin/graph-backfill.js +89 -35
- package/dist/bin/graph-export.js +9 -8
- package/dist/bin/import-history.js +14 -13
- package/dist/bin/install.js +137 -113
- package/dist/bin/intercom-check.js +5 -5
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +7 -6
- package/dist/bin/postgres-agentic-reflection-backfill.js +5 -4
- package/dist/bin/postgres-agentic-semantic-backfill.js +4 -3
- package/dist/bin/pre-publish.js +1 -1
- package/dist/bin/reconcile-backlog.js +2 -2
- package/dist/bin/registry-proxy.js +1 -1
- package/dist/bin/scan-tasks.js +29 -26
- package/dist/bin/setup.js +5 -4
- package/dist/bin/shard-migrate.js +9 -8
- package/dist/bin/stack-update.js +40 -9
- package/dist/bin/verify-stack.js +2 -2
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-OHXH4YC5.js → boot-generation-JKVZ4ZAT.js} +6 -5
- package/dist/{boot-review-sections-N5IXIGSS.js → boot-review-sections-2M6BTG73.js} +28 -25
- package/dist/{branch-hygiene-KCGXRAWP.js → branch-hygiene-U5GFRSTP.js} +31 -7
- package/dist/{branding-GH43W3PU.js → branding-I6KIMB7F.js} +3 -2
- package/dist/budget-fallback-XJRPMP2D.js +11 -0
- package/dist/build-manifest.json +1318 -1233
- package/dist/{capability-cards-4PXVLIVS.js → capability-cards-5IMJT6J7.js} +5 -4
- package/dist/{capacity-monitor-FKMQXORX.js → capacity-monitor-SAXCQK7O.js} +30 -27
- package/dist/{catchup-brief-SN5EKO4N.js → catchup-brief-U2TXBLHD.js} +34 -31
- package/dist/{chunk-CNC57JCS.js → chunk-23MVDXLY.js} +4 -4
- package/dist/{chunk-V4XAKXXF.js → chunk-2AJGV5UL.js} +1 -1
- package/dist/{chunk-FBYAXTDM.js → chunk-2ZOEC4KC.js} +10 -2
- package/dist/{chunk-ELXFSIIM.js → chunk-32YV32VA.js} +2 -2
- package/dist/{chunk-44C7QNZS.js → chunk-3KDCORDO.js} +1 -1
- package/dist/{chunk-JTB5V6BV.js → chunk-3SXHEQ7X.js} +1 -1
- package/dist/{chunk-HDW4XPDV.js → chunk-3UUX5OY4.js} +1 -1
- package/dist/{chunk-7PSLK36P.js → chunk-44TLJZJ5.js} +1 -1
- package/dist/{chunk-JTWTBX2M.js → chunk-4EN3IZ3Q.js} +2 -1
- package/dist/{chunk-KPMC7PY7.js → chunk-4HKTO2SV.js} +1 -1
- package/dist/{chunk-CDUB5Q6J.js → chunk-4IK2K3B3.js} +1 -1
- package/dist/{chunk-GH6YJOOC.js → chunk-4SJ4LK4V.js} +6 -6
- package/dist/{chunk-PVEM537A.js → chunk-4YLBKEL5.js} +2 -2
- package/dist/chunk-4YNA3CM6.js +872 -0
- package/dist/{chunk-KYFFVTGO.js → chunk-55BEFF4V.js} +3 -3
- package/dist/{chunk-SEP5ITFQ.js → chunk-636LKCKE.js} +2 -2
- package/dist/{chunk-QTI4QAWA.js → chunk-6EZQUNE6.js} +338 -5
- package/dist/{chunk-WAEKYKTK.js → chunk-6RKKVPYF.js} +1 -1
- package/dist/{chunk-VX2F4ZUY.js → chunk-6SCGLHJ7.js} +3 -3
- package/dist/{chunk-MEGRQ53A.js → chunk-6VHOQ3IM.js} +51 -6
- package/dist/{chunk-HIIXCAEE.js → chunk-6YVUR3OU.js} +3 -3
- package/dist/{chunk-L6ZNURWN.js → chunk-7GE2EQ23.js} +1 -1
- package/dist/{chunk-2CWS374F.js → chunk-7RI2CNXJ.js} +1 -1
- package/dist/{chunk-OL3QP3AU.js → chunk-7TSBV3SD.js} +1 -1
- package/dist/{chunk-DSOQUQTV.js → chunk-A27Q27CT.js} +27 -0
- package/dist/{chunk-5AHRZI3R.js → chunk-AETLDRZB.js} +1 -1
- package/dist/{chunk-RNLF3CBB.js → chunk-AKLJ4JH3.js} +1 -1
- package/dist/{chunk-XHYHX6F7.js → chunk-AKLQSC6W.js} +329 -164
- package/dist/chunk-ANLFH23R.js +261 -0
- package/dist/{chunk-QLA3RTH4.js → chunk-AWWKRZMB.js} +5 -5
- package/dist/{chunk-ERVQTR7P.js → chunk-BBSIEYF5.js} +17 -3
- package/dist/{chunk-IPMUWYRQ.js → chunk-BJ7AVSY6.js} +2 -2
- package/dist/{chunk-HV6Y6F4X.js → chunk-C2L622QJ.js} +89 -3
- package/dist/{chunk-TX3Q2GIL.js → chunk-C5HUMAA7.js} +24 -1
- package/dist/{chunk-QTYJPWJN.js → chunk-CBCGDEJA.js} +7 -7
- package/dist/{chunk-XXSNLM6R.js → chunk-DB55JZHU.js} +1 -1
- package/dist/{chunk-LAZKEJMS.js → chunk-DIXXEE3S.js} +840 -607
- package/dist/{chunk-FB343XQX.js → chunk-DJ7YXOTU.js} +2 -2
- package/dist/{chunk-YFCNWQAM.js → chunk-DJOIMFKV.js} +2 -2
- package/dist/{chunk-UTDMTQNH.js → chunk-DSJI76XL.js} +92 -14
- package/dist/{chunk-EEXX4UMQ.js → chunk-DZKPOSFD.js} +1 -1
- package/dist/{chunk-WSOA3WMC.js → chunk-E426DOSY.js} +161 -4
- package/dist/{chunk-ZISQOOER.js → chunk-EKE37MO4.js} +3 -3
- package/dist/{chunk-RIECV7SR.js → chunk-EKYYMIVT.js} +1 -1
- package/dist/{chunk-HIVZ53YB.js → chunk-EXTZSNWL.js} +2 -2
- package/dist/{chunk-YYA5LXCT.js → chunk-FNEZ4BWT.js} +1 -1
- package/dist/chunk-FTZET5YX.js +313 -0
- package/dist/chunk-GHR4ZPJ7.js +70 -0
- package/dist/{chunk-MINXPXAB.js → chunk-GJI77VDO.js} +3 -3
- package/dist/{chunk-AAMGHW5W.js → chunk-GLQEJOXE.js} +1 -0
- package/dist/{chunk-ADNBOKYZ.js → chunk-GM7TLYOK.js} +60 -18
- package/dist/{chunk-RUWWES2K.js → chunk-GNUAL43X.js} +2 -2
- package/dist/{chunk-QZL6E4UB.js → chunk-GOMQ7PVQ.js} +2 -2
- package/dist/{chunk-GB3AHV5F.js → chunk-GQOEWNVM.js} +1 -1
- package/dist/{chunk-NQZUSEAR.js → chunk-GS7LIT34.js} +246 -17
- package/dist/{chunk-XTWHNLGD.js → chunk-GZOG2MAX.js} +1 -1
- package/dist/{chunk-E5HAY3DQ.js → chunk-HDLAB7W3.js} +1 -1
- package/dist/{chunk-E5QQZDQN.js → chunk-HNWS7YHN.js} +358 -136
- package/dist/{chunk-VV5EZZNT.js → chunk-HTBEVCO2.js} +1 -1
- package/dist/{chunk-OZBII5E3.js → chunk-I4DNJFDR.js} +4 -4
- package/dist/{chunk-SI5SZAJA.js → chunk-IBS2FAI4.js} +21 -4
- package/dist/{chunk-J5EYOBFF.js → chunk-IHXW4VUI.js} +1 -1
- package/dist/{chunk-RUVO3NJC.js → chunk-IN6CAM4F.js} +9 -3
- package/dist/{chunk-53PYNYTW.js → chunk-IRVOXUSK.js} +5 -5
- package/dist/{chunk-THM7J6UI.js → chunk-JHI5WMK5.js} +5 -5
- package/dist/{chunk-3KTQWMHI.js → chunk-JSMDRKPJ.js} +12 -4
- package/dist/chunk-JTVIANUB.js +131 -0
- package/dist/{chunk-2ADYTOHQ.js → chunk-K4ESASPL.js} +1 -1
- package/dist/{chunk-YWUQVHDL.js → chunk-KTCXJWJG.js} +1 -1
- package/dist/{chunk-RGUDGC6A.js → chunk-KTU3EAWK.js} +5 -5
- package/dist/{chunk-DKBPCOU4.js → chunk-L6RXG36J.js} +2 -2
- package/dist/{chunk-T4EK56WI.js → chunk-LDNYSMPZ.js} +1 -1
- package/dist/{chunk-RIK5GRWI.js → chunk-LGS2V2XD.js} +3 -3
- package/dist/{chunk-JKXZGRWR.js → chunk-LP4GB656.js} +2 -2
- package/dist/{chunk-H74466TM.js → chunk-M7O7TGGU.js} +1 -1
- package/dist/chunk-MJCSEIFI.js +54 -0
- package/dist/{chunk-IDZPQG2D.js → chunk-MOGA4Q7F.js} +2 -2
- package/dist/{chunk-OYQNNKNS.js → chunk-MXPNVSXI.js} +37 -14
- package/dist/{chunk-UVW7YFAF.js → chunk-N7VEP5B3.js} +4 -4
- package/dist/{chunk-HHE2HV3V.js → chunk-NBXDXKLC.js} +1 -1
- package/dist/{chunk-LDL3S7AC.js → chunk-NKETJCB5.js} +7 -3
- package/dist/{chunk-ECHLVLA7.js → chunk-NMH5ZQPU.js} +1 -1
- package/dist/{chunk-U3XLRMJD.js → chunk-NT7W4RXD.js} +1 -1
- package/dist/{chunk-UQUUNGTP.js → chunk-NUK7EEN5.js} +11 -9
- package/dist/{chunk-GBNB4EWD.js → chunk-ORM7ZFKC.js} +16 -0
- package/dist/{chunk-O4ZFRK6W.js → chunk-OVEQE6YS.js} +244 -49
- package/dist/{chunk-4ZJ5BPY6.js → chunk-PB5S7YOF.js} +2 -2
- package/dist/{chunk-JR23BL74.js → chunk-PDVXWXTL.js} +4 -4
- package/dist/{chunk-3CIMDFXG.js → chunk-PFQ3VEEM.js} +1 -1
- package/dist/{chunk-SBJV2PCU.js → chunk-PHBU4LGO.js} +1 -1
- package/dist/{chunk-W25RLOQ2.js → chunk-PLZSZOZN.js} +3 -3
- package/dist/{chunk-THIJIOE2.js → chunk-PY3FOMRN.js} +18 -6
- package/dist/{chunk-AAUWFXOX.js → chunk-Q3AXXKDF.js} +3 -3
- package/dist/{chunk-VKXS2YGN.js → chunk-QHJR7IMX.js} +2 -2
- package/dist/chunk-QLZ46RCK.js +45 -0
- package/dist/{chunk-UHPMK6QZ.js → chunk-R3CZWFFC.js} +10 -2
- package/dist/{chunk-6XEYELCA.js → chunk-R4CBHKZ2.js} +1 -1
- package/dist/{chunk-5APCDDJZ.js → chunk-R522MWAR.js} +9 -9
- package/dist/chunk-RH4AH3YB.js +80 -0
- package/dist/{chunk-AMKSDKMK.js → chunk-S2WBS6BG.js} +22 -35
- package/dist/{chunk-WUKQVNLP.js → chunk-SEQIPGLU.js} +1 -1
- package/dist/{chunk-7WQRFSZI.js → chunk-SL6KQYDU.js} +26 -6
- package/dist/chunk-SLLLOOEI.js +103 -0
- package/dist/{chunk-5N4SG5NB.js → chunk-T35RCQFE.js} +3 -3
- package/dist/{chunk-7V6M3QUS.js → chunk-T3QUKNLI.js} +1 -1
- package/dist/{chunk-CW2UCKHS.js → chunk-TADAO3HV.js} +2 -2
- package/dist/{chunk-5DCCKHDY.js → chunk-TAMDAOCU.js} +109 -13
- package/dist/{chunk-ZXB56YR2.js → chunk-TFKCERAK.js} +101 -23
- package/dist/{chunk-RBYHJDAT.js → chunk-TQAZTRQ3.js} +3 -3
- package/dist/{chunk-OKGIOWOB.js → chunk-U6SUKSZR.js} +2 -2
- package/dist/{chunk-23QKEUF6.js → chunk-U73AC5AN.js} +34 -12
- package/dist/{chunk-PM6WSWVU.js → chunk-UBK7HK3J.js} +3 -3
- package/dist/{chunk-H37FSTF2.js → chunk-UBMZ3YQU.js} +1 -1
- package/dist/{chunk-JJUGI2YL.js → chunk-UCFC2AEI.js} +1 -1
- package/dist/{chunk-6IWLAQ7O.js → chunk-UCUOGVDX.js} +4 -0
- package/dist/{chunk-E7UCDSUE.js → chunk-UKLN57Q5.js} +2 -2
- package/dist/{chunk-ZYCLSEZT.js → chunk-ULIBLJ6W.js} +33 -11
- package/dist/{chunk-RLR6VVKV.js → chunk-UM3N6VND.js} +4 -4
- package/dist/{chunk-ZNUJFX7L.js → chunk-UQGSBM3U.js} +1 -1
- package/dist/{chunk-ZZXMB5F2.js → chunk-UZDF6FLJ.js} +1 -1
- package/dist/{chunk-LNOS24GV.js → chunk-V3WLC5TJ.js} +2 -95
- package/dist/{chunk-UXLO7VHX.js → chunk-VI4ATC6I.js} +1 -1
- package/dist/{chunk-77JP3LK4.js → chunk-VKJGHAZT.js} +92 -21
- package/dist/{chunk-7R73IAHU.js → chunk-VMTZ4RUW.js} +67 -150
- package/dist/{chunk-TGPQMMQP.js → chunk-VYQ7B7DI.js} +30 -17
- package/dist/{chunk-E2WEFZOR.js → chunk-W75GTHR3.js} +1 -1
- package/dist/{chunk-UKLF7F3Z.js → chunk-WJG344NC.js} +9 -9
- package/dist/{chunk-MBNIJXKI.js → chunk-WMEYJT4R.js} +18 -4
- package/dist/{chunk-R6FLELV6.js → chunk-XFTEX77S.js} +3 -3
- package/dist/{chunk-MDGYXUOV.js → chunk-XH7YL7JM.js} +1 -1
- package/dist/{chunk-JOO35RHR.js → chunk-XL5MFGMR.js} +3 -3
- package/dist/{chunk-OW5RZIDW.js → chunk-XNNECNDL.js} +95 -33
- package/dist/{chunk-5AHDQCTB.js → chunk-XXFKSJYA.js} +6 -6
- package/dist/{chunk-TGEPLJ66.js → chunk-XXOPG4BW.js} +3 -3
- package/dist/{chunk-PGLPUP37.js → chunk-XZ65ST2I.js} +1 -1
- package/dist/{chunk-3TTKAT6V.js → chunk-YKC7QDZH.js} +9 -4
- package/dist/{chunk-KXYFBBZR.js → chunk-YMP2QSOP.js} +20 -3
- package/dist/{chunk-TK4MI6F6.js → chunk-YSLGFPWX.js} +6 -6
- package/dist/{chunk-X2P43TB2.js → chunk-YTSXPJUQ.js} +1 -1
- package/dist/{chunk-HECXZGGZ.js → chunk-ZCERWHY2.js} +33 -35
- package/dist/{chunk-IVU3WN7S.js → chunk-ZG62LIK3.js} +74 -4
- package/dist/{chunk-GU62SNDH.js → chunk-ZGYNKA3O.js} +744 -111
- package/dist/{chunk-QMSEL5YS.js → chunk-ZIG7VPJV.js} +28 -76
- package/dist/{chunk-WZJVGA5I.js → chunk-ZL4AGWAH.js} +258 -13
- package/dist/{chunk-QR624DER.js → chunk-ZSODLMFV.js} +2 -2
- package/dist/{cleanup-graph-garbage-IPYDS5OX.js → cleanup-graph-garbage-DPJGO52H.js} +11 -10
- package/dist/{cloud-sync-command-JLNVG7H4.js → cloud-sync-command-JPNTT4OQ.js} +2 -2
- package/dist/{cloud-sync-db-init-JXUF6GI3.js → cloud-sync-db-init-V2LWIUQU.js} +1 -1
- package/dist/{cloud-sync-shutdown-Z4SBP6PL.js → cloud-sync-shutdown-BNALPWGX.js} +5 -4
- package/dist/{co-activation-74RDFTKS.js → co-activation-CMNSWS6B.js} +5 -4
- package/dist/{co-occurrence-CN3TBYVR.js → co-occurrence-WRI2NAN6.js} +9 -8
- package/dist/{code-context-index-D4MJ4VFX.js → code-context-index-NOJSHLPN.js} +12 -6
- package/dist/code-context-watcher-VZNZU3BO.js +118 -0
- package/dist/{codex-consolidation-PPXNBXCV.js → codex-consolidation-SH4UKFBQ.js} +2 -1
- package/dist/{conversation-entity-extractor-QGTLH4BP.js → conversation-entity-extractor-74252CAO.js} +4 -4
- package/dist/{conversation-wiki-populator-EBUZXYEU.js → conversation-wiki-populator-OS4C6W54.js} +1 -1
- package/dist/conversations-retention-C4BLKFEL.js +54 -0
- package/dist/coordinator-notice-MHUY7AQB.js +55 -0
- package/dist/{crdt-sync-7T4WCOKD.js → crdt-sync-B3JN6AIV.js} +1 -1
- package/dist/{crm-webhook-FTW3XZTO.js → crm-webhook-GYWQRFET.js} +2 -2
- package/dist/{cto-delegation-gate-SZCE34LB.js → cto-delegation-gate-LQHVLEMW.js} +29 -26
- package/dist/{daemon-auth-SSPY5ODS.js → daemon-auth-QZHEO7IQ.js} +3 -2
- package/dist/{daemon-orchestration-IGPHVNFR.js → daemon-orchestration-5HIQALZH.js} +36 -34
- package/dist/{daemon-ready-OT2VQLS7.js → daemon-ready-P2BR2XP5.js} +1 -1
- package/dist/{db-integrity-events-5DTASXJF.js → db-integrity-events-2DTFO37N.js} +3 -2
- package/dist/{db-restore-events-2FI4ZMKA.js → db-restore-events-G6NOQOVE.js} +2 -1
- package/dist/{destructive-data-guard-6I5MDFVD.js → destructive-data-guard-BVFWPPIS.js} +1 -1
- package/dist/doc-graph-extractor-PQHDHQPQ.js +367 -0
- package/dist/{documents-URULIXGM.js → documents-C4SSPJMC.js} +15 -13
- package/dist/{dreaming-VIZO3QDO.js → dreaming-XAO3FCBV.js} +33 -30
- package/dist/{employee-boot-brief-XLOG4ULP.js → employee-boot-brief-W4OHUMRQ.js} +37 -34
- package/dist/{exe-drift-TLQM3IHD.js → exe-drift-AG2KMKD5.js} +6 -5
- package/dist/{exe-export-7YWYWJHY.js → exe-export-IC5BT335.js} +17 -15
- package/dist/{exe-import-DW6VAUKW.js → exe-import-A35ZLDPG.js} +17 -15
- package/dist/{exe-key-TLJP2B4Y.js → exe-key-TCMJNYLA.js} +116 -112
- package/dist/{exe-org-LU46N36E.js → exe-org-JXCR3JYZ.js} +24 -23
- package/dist/{exe-snapshot-QHUZRS62.js → exe-snapshot-SV6SRIG6.js} +36 -33
- package/dist/{fast-db-init-SCTOOIUT.js → fast-db-init-L2RGKJWH.js} +1 -1
- package/dist/{founder-context-ZFZC4UHO.js → founder-context-D4HFIESJ.js} +4 -3
- package/dist/{founder-monitor-envelope-5KTKNL5G.js → founder-monitor-envelope-TFKRGCFE.js} +5 -4
- package/dist/{fts-integrity-LKAZEZJE.js → fts-integrity-4YB34KWX.js} +3 -2
- package/dist/gateway/index.js +19 -17
- package/dist/{git-main-guard-TN27QBAI.js → git-main-guard-VTW4N3CM.js} +7 -1
- package/dist/{git-staleness-GSGP344N.js → git-staleness-TN7CYGFG.js} +5 -4
- package/dist/{global-procedures-YAR7G4C6.js → global-procedures-YFDEIOG7.js} +7 -6
- package/dist/{graph-auto-extract-GNQS64F5.js → graph-auto-extract-3YR3TYRW.js} +9 -8
- package/dist/{graph-rag-RMSFLUOB.js → graph-rag-Z2KCJTPK.js} +6 -4
- package/dist/{hook-integrity-CF567MVN.js → hook-integrity-KGAV6ZC2.js} +14 -4
- package/dist/{hook-prefetch-36BK4F7U.js → hook-prefetch-K5DN3TOQ.js} +29 -26
- package/dist/hooks/bug-report-worker.js +34 -30
- package/dist/hooks/codex-stop-task-finalizer.js +36 -32
- package/dist/hooks/commit-complete.js +33 -30
- package/dist/hooks/error-recall.js +12 -11
- package/dist/hooks/exe-heartbeat-hook.js +8 -7
- package/dist/hooks/ingest-worker.js +23 -11
- package/dist/hooks/ingest.js +18 -17
- package/dist/hooks/instructions-loaded.js +10 -9
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +9 -8
- package/dist/hooks/post-compact.js +8 -7
- package/dist/hooks/post-tool-combined.js +26 -15
- package/dist/hooks/pre-compact.js +33 -30
- package/dist/hooks/pre-tool-use.js +404 -46
- package/dist/hooks/prompt-submit.js +57 -47
- package/dist/hooks/session-end.js +40 -41
- package/dist/hooks/session-start.js +21 -20
- package/dist/hooks/stop.js +40 -37
- package/dist/hooks/subagent-stop.js +38 -35
- package/dist/hooks/summary-worker.js +39 -36
- package/dist/hyde-MP4QNMU5.js +80 -0
- package/dist/index.js +44 -39
- package/dist/{installer-LUN4HQIC.js → installer-54HTN5RE.js} +8 -7
- package/dist/{installer-OC5VXNC7.js → installer-LK35OX6R.js} +8 -7
- package/dist/{installer-MPRFUQJE.js → installer-LLWKZI2S.js} +8 -7
- package/dist/intercom-ack-VCW755TN.js +13 -0
- package/dist/{intercom-queue-6DZ7BANV.js → intercom-queue-5NOT2RKI.js} +28 -25
- package/dist/{key-backup-status-6L2ARCXW.js → key-backup-status-LQPINQ3W.js} +2 -1
- package/dist/lib/agent-config.js +3 -2
- package/dist/lib/cloud-sync.js +26 -20
- package/dist/lib/config.js +2 -1
- package/dist/lib/consolidation.js +17 -10
- package/dist/lib/database.js +7 -4
- package/dist/lib/db-backup.js +17 -2
- package/dist/lib/db-daemon-client.js +8 -6
- package/dist/lib/db-write-worker-client.js +3 -1
- package/dist/lib/db-write-worker.js +20 -3
- package/dist/lib/db.js +7 -4
- package/dist/lib/device-registry.js +3 -2
- package/dist/lib/embed-worker.js +2 -1
- package/dist/lib/embedder.js +8 -6
- package/dist/lib/employee-templates.js +8 -7
- package/dist/lib/employees.js +5 -4
- package/dist/lib/exe-daemon-client.js +7 -5
- package/dist/lib/exe-daemon.js +467 -221
- package/dist/lib/hybrid-search.js +11 -8
- package/dist/lib/identity.js +5 -4
- package/dist/lib/license.js +4 -3
- package/dist/lib/messaging.js +29 -26
- package/dist/lib/post-tool-memory.js +16 -2
- package/dist/lib/registry-proxy.js +3 -1
- package/dist/lib/reminders.js +6 -5
- package/dist/lib/schedules.js +9 -8
- package/dist/lib/session-registry.js +7 -6
- package/dist/lib/skill-learning.js +16 -14
- package/dist/lib/stack-invariants.js +17 -1
- package/dist/lib/status-brief.js +5 -4
- package/dist/lib/store.js +10 -7
- package/dist/lib/task-router.js +6 -5
- package/dist/lib/tasks.js +31 -27
- package/dist/lib/tmux-routing.js +40 -25
- package/dist/lib/tmux-status.js +3 -1
- package/dist/lib/tmux-transport.js +2 -1
- package/dist/lib/token-spend.js +6 -5
- package/dist/lib/transport.js +3 -2
- package/dist/{license-gate-ESER24PJ.js → license-gate-JVMB6OFD.js} +5 -4
- package/dist/{license-sync-JVG5KNIY.js → license-sync-5VYS2F2W.js} +4 -3
- package/dist/mcp/register-tools.js +113 -109
- package/dist/mcp/server.js +118 -114
- package/dist/mcp/tools/complete-reminder.js +7 -6
- package/dist/mcp/tools/create-reminder.js +7 -6
- package/dist/mcp/tools/create-task.js +34 -30
- package/dist/mcp/tools/deactivate-behavior.js +18 -16
- package/dist/mcp/tools/list-reminders.js +7 -6
- package/dist/mcp/tools/list-tasks.js +34 -30
- package/dist/mcp/tools/send-message.js +32 -29
- package/dist/mcp/tools/update-task.js +32 -28
- package/dist/mcp-child-registry-OTG4MWO7.js +25 -0
- package/dist/{mcp-http-config-6K6IKH5F.js → mcp-http-config-DQWL7U2Z.js} +6 -5
- package/dist/{mcp-session-identity-LRC6WJSD.js → mcp-session-identity-277GASTQ.js} +28 -25
- package/dist/{memory-cards-V3OZHIYP.js → memory-cards-3S2ZQPR7.js} +17 -8
- package/dist/{memory-graph-extractor-JC2Z64L4.js → memory-graph-extractor-A6DFEFIN.js} +10 -9
- package/dist/{memory-poisoning-defense-YM4QJHCX.js → memory-poisoning-defense-ZVP4H6DY.js} +5 -4
- package/dist/{memory-pressure-watchdog-6F6KEQHN.js → memory-pressure-watchdog-6W5F6R7H.js} +29 -26
- package/dist/{memory-queue-QJNWKWKG.js → memory-queue-YF7IDSFY.js} +3 -2
- package/dist/{memory-queue-client-COA4ABEV.js → memory-queue-client-ADSDP6OX.js} +9 -7
- package/dist/{memory-reflection-QXHJPYPC.js → memory-reflection-BKB2YOE6.js} +52 -6
- package/dist/{monitor-grants-BW2WL4IU.js → monitor-grants-EV747HMW.js} +4 -3
- package/dist/{notification-ledger-6QRLQW4Q.js → notification-ledger-CLGM7ODF.js} +30 -27
- package/dist/{notifications-7B6D7Y5C.js → notifications-MACUZPYP.js} +28 -25
- package/dist/{oauth-server-TZFNQAFS.js → oauth-server-AYM37SQ4.js} +25 -4
- package/dist/{orchestration-events-GY5VP5LU.js → orchestration-events-N7LYMUGA.js} +6 -5
- package/dist/{orchestration-phase-UDS24CVQ.js → orchestration-phase-T2WD45UA.js} +3 -2
- package/dist/{orchestrator-JVPVOYWA.js → orchestrator-4X24EWHV.js} +30 -27
- package/dist/{org-brief-session-GRV5R5E3.js → org-brief-session-FZOFMO5U.js} +13 -12
- package/dist/{org-consent-policy-3FHHSYXV.js → org-consent-policy-O5E6HXBL.js} +1 -1
- package/dist/{org-join-BY4PV6UO.js → org-join-POWUG25F.js} +8 -7
- package/dist/{org-key-admin-WSCPT2CZ.js → org-key-admin-E7EMDOZZ.js} +9 -8
- package/dist/{org-key-pin-5WUSPGVN.js → org-key-pin-WHWHVWUO.js} +4 -3
- package/dist/{org-membership-ESALTLLN.js → org-membership-WRT2IHJK.js} +5 -4
- package/dist/{org-partner-config-YKHPDPZR.js → org-partner-config-B7T4CL2T.js} +7 -6
- package/dist/{org-partner-runtime-UJDGECZ4.js → org-partner-runtime-FODONVTM.js} +13 -12
- package/dist/{org-row-visibility-V5DXIHTE.js → org-row-visibility-VX4AVV5Q.js} +1 -1
- package/dist/{pipeline-router-YY5FQKTY.js → pipeline-router-6GGT2ZW3.js} +6 -5
- package/dist/{plan-limits-OVX6SN6B.js → plan-limits-FUN76LYY.js} +8 -7
- package/dist/{platform-procedures-I57ITMDC.js → platform-procedures-7YSCLF4Z.js} +1 -1
- package/dist/{postinstall-failure-B2JHNFPM.js → postinstall-failure-O6TSSNJB.js} +3 -2
- package/dist/{project-boot-LXLU2J32.js → project-boot-3Q65LCIP.js} +2 -1
- package/dist/project-name-LJVFMYTQ.js +30 -0
- package/dist/{projection-worker-D2472IOD.js → projection-worker-4OANGP5K.js} +5 -4
- package/dist/{prospective-memory-JXO2A6PL.js → prospective-memory-KR3P4T6N.js} +5 -4
- package/dist/{push-notifications-HR3FZRDI.js → push-notifications-NCZLH6DI.js} +29 -26
- package/dist/ref-provenance-gate-M4AQO4OT.js +269 -0
- package/dist/{reproject-worktree-memories-OSS3PGRF.js → reproject-worktree-memories-PWYKPB2U.js} +106 -23
- package/dist/{reranker-IMZRPYJ2.js → reranker-6V3C2AO4.js} +3 -2
- package/dist/resolve-image-labels-ZI6UBW5W.js +15 -0
- package/dist/{retrieval-health-W7OD44FE.js → retrieval-health-5D7O6VH6.js} +4 -3
- package/dist/{review-polling-2INP7H6M.js → review-polling-QW3LJ4KN.js} +29 -26
- package/dist/runtime/index.js +38 -34
- package/dist/{session-events-G4XUPVWV.js → session-events-T45SSTMF.js} +31 -26
- package/dist/{session-kill-telemetry-W7MHWJTQ.js → session-kill-telemetry-QSPVJGBF.js} +29 -26
- package/dist/{session-mcp-config-F7KATWOF.js → session-mcp-config-SC5BLWZG.js} +3 -2
- package/dist/{session-scope-LG2J4EMQ.js → session-scope-KRWE54C4.js} +28 -25
- package/dist/{setup-wizard-YQJI3SVM.js → setup-wizard-GP3TBTPF.js} +5 -4
- package/dist/{shard-manager-UROHZE46.js → shard-manager-OE36A4MY.js} +3 -2
- package/dist/{skill-refinement-RA37U756.js → skill-refinement-C7JTMLJG.js} +6 -5
- package/dist/stack-generate-manifest-MFMDWRUP.js +810 -0
- package/dist/{stack-promote-IYBRXHTA.js → stack-promote-EKSCYY63.js} +8 -6
- package/dist/{stack-release-OXWLVVG6.js → stack-release-2GZAAFO4.js} +8 -6
- package/dist/{stack-update-2CZEROPK.js → stack-update-J6JXSTAZ.js} +51 -5
- package/dist/{steward-gate-LTNFB3FY.js → steward-gate-BFCCMCSW.js} +6 -5
- package/dist/{subagent-brief-injection-OHLWLECQ.js → subagent-brief-injection-ED36PLYY.js} +44 -36
- package/dist/{subagent-spawn-ledger-USYZXU3M.js → subagent-spawn-ledger-E6U3OY6Z.js} +3 -2
- package/dist/{supervisor-handoff-CSJQMI53.js → supervisor-handoff-SGLEPOCY.js} +12 -3
- package/dist/{support-inbox-4KCEPAZQ.js → support-inbox-YW47SYJF.js} +20 -5
- package/dist/{task-enforcement-LGXWXGVZ.js → task-enforcement-CECTQX4U.js} +29 -26
- package/dist/{task-request-inbox-WHCOSUCP.js → task-request-inbox-Q5T4N5K7.js} +1 -1
- package/dist/{task-scope-KXF7Y6KA.js → task-scope-ERVEUEYU.js} +28 -25
- package/dist/{tasks-crud-5EM55WRZ.js → tasks-crud-ZRQNJXQ2.js} +28 -25
- package/dist/{tasks-notify-VFMAURTN.js → tasks-notify-MIZH4C2O.js} +29 -26
- package/dist/{tasks-review-MHGMBHUZ.js → tasks-review-Z7J2P6DG.js} +28 -25
- package/dist/{telemetry-upload-6NRTN7QJ.js → telemetry-upload-LVQUQYFP.js} +10 -9
- package/dist/{token-budget-LZPOYTRP.js → token-budget-BU4NOVZF.js} +6 -5
- package/dist/{tool-capability-index-ED5OAPMW.js → tool-capability-index-7F42MOJT.js} +1 -1
- package/dist/{tool-gates-7PLIOLAL.js → tool-gates-JWVSAYTW.js} +1 -1
- package/dist/{tool-gates-2OZY3GZM.js → tool-gates-VXITVRFQ.js} +1 -1
- package/dist/{tool-telemetry-ZX7VSAXK.js → tool-telemetry-O27EVMBR.js} +1 -1
- package/dist/tui/App.js +43 -40
- package/dist/{tui-data-CC5POSUV.js → tui-data-TPWWBIUQ.js} +28 -25
- package/dist/{update-support-KH6NSQON.js → update-support-F2F5537B.js} +22 -20
- package/dist/{whatsapp-QW3X7OCN.js → whatsapp-YM4A2CSK.js} +3 -1
- package/dist/{work-claims-MNK7PEPW.js → work-claims-B73X5NE7.js} +6 -5
- package/dist/{work-state-heartbeat-YEWT5NMZ.js → work-state-heartbeat-P4YX6E2R.js} +1 -1
- package/dist/{worker-gate-BOQSIU2Z.js → worker-gate-BEEIIVWA.js} +3 -2
- package/dist/{workflow-engine-MUUD7ZEX.js → workflow-engine-5X46PFCW.js} +4 -2
- package/dist/{worktree-GOGT2LZP.js → worktree-W47CIMJ6.js} +9 -6
- package/dist/worktree-ownership-guard-OUWJROW2.js +88 -0
- package/dist/{worktree-sweep-46VWPVQT.js → worktree-sweep-BNBD4RFX.js} +8 -7
- package/package.json +14 -5
- package/release-notes.json +5 -5
- package/src/commands/exe/call.md +1 -1
- package/stack.release.json +6 -0
- package/dist/chunk-KZXMP6JG.js +0 -319
- package/dist/chunk-TCTED52S.js +0 -120
- package/dist/chunk-W2IRQJ6R.js +0 -67
- package/dist/doc-graph-extractor-VPTRIEKN.js +0 -149
- package/dist/project-name-ILJTETUE.js +0 -14
- /package/dist/{chunk-3Y5THOU6.js → chunk-6WIFPD2P.js} +0 -0
- /package/dist/{chunk-7XGXRD22.js → chunk-AISULNGL.js} +0 -0
- /package/dist/{chunk-3F2UB4IQ.js → chunk-DN4YVV4Z.js} +0 -0
- /package/dist/{chunk-WV3TOOL7.js → chunk-KQ6RJWRW.js} +0 -0
- /package/dist/{chunk-HR2R2QER.js → chunk-M4IRPXSZ.js} +0 -0
- /package/dist/{chunk-ORA5BWCV.js → chunk-NRG7KZIP.js} +0 -0
- /package/dist/{chunk-7UTJA6HF.js → chunk-VZAFWPAY.js} +0 -0
- /package/dist/{chunk-VJSDGDNS.js → chunk-WSQASFLP.js} +0 -0
- /package/dist/{chunk-FZQWVQJG.js → chunk-YO4BO2CL.js} +0 -0
- /package/dist/{core-memory-6WBNT2HL.js → core-memory-7I7RE2SJ.js} +0 -0
- /package/dist/{entity-boost-MT336PI3.js → entity-boost-3UWGXG5O.js} +0 -0
- /package/dist/{memory-isolation-EJ45IXBH.js → memory-isolation-2TUZ7Z4K.js} +0 -0
- /package/dist/{message-queue-client-MVBTYCSV.js → message-queue-client-XQN7QABL.js} +0 -0
- /package/dist/{webhook-pipe-UQSEHFPO.js → webhook-pipe-W2FVXY7M.js} +0 -0
- /package/dist/{wiki-acl-WXRJGZ5Q.js → wiki-acl-IBQLLBTS.js} +0 -0
- /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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
# ------------------------------------------------------------------
|