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