@askexenow/exe-os 0.9.373 → 0.9.376
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 +44 -11
- package/deploy/compose/.env.example +44 -9
- package/deploy/compose/docker-compose.yml +181 -30
- package/deploy/compose/gateway-watchdog.sh +17 -0
- package/deploy/compose/generate-env.ts +163 -32
- package/deploy/compose/sso-edge/default.conf.template +59 -24
- package/deploy/compose/sso-edge/error-pages/404.html +129 -0
- package/deploy/compose/sso-edge/error-pages/500.html +129 -0
- package/deploy/compose/sso-edge/error-pages/503.html +118 -0
- package/deploy/compose/sso-edge/sso-redirect.conf +116 -57
- package/dist/.dist-verified.json +3 -3
- package/dist/{active-agent-BVREYGFJ.js → active-agent-BOBBUJ74.js} +6 -6
- package/dist/{active-agent-HLV7IEU3.js → active-agent-GFGEGK2U.js} +6 -6
- package/dist/{agent-defs-generator-TFBUJ67B.js → agent-defs-generator-OX6UFPRX.js} +5 -5
- package/dist/{agent-loop-CYDFBCNA.js → agent-loop-7ZRH56EX.js} +1 -1
- package/dist/{agentic-ontology-WZKVHOUV.js → agentic-ontology-DT3VOXBT.js} +1 -1
- package/dist/{backfill-metadata-FN3YMSKC.js → backfill-metadata-VRP6PTPP.js} +9 -9
- package/dist/{backup-verify-76235AHA.js → backup-verify-LWHKGOOV.js} +1 -1
- package/dist/behavior-injection-GMZKZ3BT.js +83 -0
- package/dist/behavior-promotion-QPC4AQ24.js +62 -0
- package/dist/{behaviors-33WKK3BG.js → behaviors-GPI4BLTC.js} +18 -15
- package/dist/bin/agentic-ontology-backfill.js +10 -10
- package/dist/bin/agentic-reflection-backfill.js +11 -11
- package/dist/bin/agentic-semantic-label.js +10 -10
- package/dist/bin/backfill-conversations.js +16 -13
- package/dist/bin/backfill-responses.js +16 -13
- package/dist/bin/backfill-vectors.js +18 -15
- package/dist/bin/bulk-sync-postgres.js +23 -20
- package/dist/bin/cc-doctor.js +20 -12
- package/dist/bin/cleanup-stale-review-tasks.js +29 -27
- package/dist/bin/cli.js +85 -108
- package/dist/bin/daemon-restart-handoff.js +2 -1
- package/dist/bin/deferred-daemon-restart.js +120 -111
- package/dist/bin/exe-actions.js +176 -0
- package/dist/bin/exe-agent-config.js +5 -5
- package/dist/bin/exe-agent.js +19 -18
- package/dist/bin/exe-assign.js +18 -15
- package/dist/bin/exe-boot.js +93 -72
- package/dist/bin/exe-call.js +8 -8
- package/dist/bin/exe-cicd.js +1210 -0
- package/dist/bin/exe-cloud.js +72 -38
- package/dist/bin/exe-config-dump.js +5 -5
- package/dist/bin/exe-dispatch.js +30 -28
- package/dist/bin/exe-doctor.js +14 -11
- package/dist/bin/exe-export-behaviors.js +22 -19
- package/dist/bin/exe-forget.js +11 -11
- package/dist/bin/exe-gateway.js +10 -10
- package/dist/bin/exe-healthcheck.js +23 -11
- package/dist/bin/exe-heartbeat.js +35 -33
- package/dist/bin/exe-kill.js +34 -32
- package/dist/bin/exe-launch-agent.js +78 -55
- package/dist/bin/exe-mcp.js +10 -6
- package/dist/bin/exe-memory-reads.js +9 -9
- package/dist/bin/exe-model-supervisor.js +138 -0
- package/dist/bin/exe-new-employee.js +14 -14
- package/dist/bin/exe-os-mcp-proxy.js +10 -6
- package/dist/bin/exe-pending-messages.js +30 -28
- package/dist/bin/exe-pending-notifications.js +29 -27
- package/dist/bin/exe-pending-reviews.js +30 -28
- package/dist/bin/exe-rename.js +9 -9
- package/dist/bin/exe-repo-truth.js +1 -1
- package/dist/bin/exe-review.js +33 -31
- package/dist/bin/exe-search.js +10 -10
- package/dist/bin/exe-session-cleanup.js +34 -32
- package/dist/bin/exe-settings.js +23 -20
- package/dist/bin/exe-start-codex.js +32 -25
- package/dist/bin/exe-start-opencode.js +26 -23
- package/dist/bin/exe-start.sh +11 -2
- package/dist/bin/exe-status.js +31 -29
- package/dist/bin/exe-support.js +3 -3
- package/dist/bin/exe-team.js +7 -7
- package/dist/bin/exe-timers.js +2 -1
- package/dist/bin/exe-watchdog.js +180 -15
- package/dist/bin/generate-hook-manifest.js +8 -41
- package/dist/bin/git-sweep.js +30 -28
- package/dist/bin/graph-backfill.js +10 -10
- package/dist/bin/graph-export.js +10 -10
- package/dist/bin/hooks-cli.js +289 -0
- package/dist/bin/import-history.js +13 -13
- package/dist/bin/install.js +132 -117
- package/dist/bin/intercom-check.js +5 -5
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +7 -7
- package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
- package/dist/bin/postgres-agentic-semantic-backfill.js +4 -4
- package/dist/bin/pre-publish.js +1 -1
- package/dist/bin/reconcile-backlog.js +2 -2
- package/dist/bin/registry-proxy.js +2 -2
- package/dist/bin/scan-tasks.js +54 -39
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +9 -9
- package/dist/bin/stack-update.js +12 -6
- package/dist/bin/verify-stack.js +4 -2
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-QY4H2VST.js → boot-generation-BN6GKASY.js} +6 -6
- package/dist/{boot-review-sections-ITQVY2ZQ.js → boot-review-sections-OQ5JGSOD.js} +28 -26
- package/dist/{branch-hygiene-U5GFRSTP.js → branch-hygiene-QLD77IMJ.js} +1 -1
- package/dist/build-manifest.json +1243 -1133
- package/dist/{capability-cards-JDJTJX4D.js → capability-cards-EDZ62HKG.js} +5 -5
- package/dist/{capacity-monitor-GK5IB6FJ.js → capacity-monitor-6GMTVILS.js} +30 -28
- package/dist/{catchup-brief-ROSFMS46.js → catchup-brief-SGGBMDUP.js} +34 -32
- package/dist/{cc-binary-detect-6TNIY5JX.js → cc-binary-detect-ZR6WNOUU.js} +1 -3
- package/dist/{chunk-J7RIPMDI.js → chunk-2ODXCCMR.js} +18 -3
- package/dist/{hook-integrity-UU5OXONF.js → chunk-3L72UBUH.js} +28 -15
- package/dist/chunk-3OX5S7KZ.js +273 -0
- package/dist/{chunk-PHA3OES7.js → chunk-3SRZNJKD.js} +1 -1
- package/dist/{chunk-4XUPFJNB.js → chunk-42IFYZUN.js} +4 -4
- package/dist/{chunk-6D5KMMK4.js → chunk-473JUDCT.js} +5 -5
- package/dist/{chunk-NMICTLJK.js → chunk-4F5CNI65.js} +1 -1
- package/dist/{chunk-JG4IOKQE.js → chunk-4KVSCQND.js} +88 -15
- package/dist/{chunk-ZFXOA2CF.js → chunk-4M6RXJEY.js} +33 -23
- package/dist/{chunk-D2AR5PXE.js → chunk-4YJEEOYT.js} +3 -3
- package/dist/{chunk-NY75HDWW.js → chunk-4YUGB637.js} +1 -1
- package/dist/{chunk-G6P45SFB.js → chunk-4ZSOKEDY.js} +3 -3
- package/dist/{chunk-UUPAOKEO.js → chunk-5DF4Y6EC.js} +1 -1
- package/dist/{chunk-4QCFFW2H.js → chunk-5QCIWWFA.js} +46 -0
- package/dist/{chunk-NLGEFBND.js → chunk-5QKLWJ4Z.js} +1 -1
- package/dist/{chunk-ZN3FAXDX.js → chunk-5UBWBXLF.js} +3 -3
- package/dist/chunk-5WA4DG2A.js +117 -0
- package/dist/{chunk-MQAHDPU5.js → chunk-64ODONK2.js} +67 -1
- package/dist/{chunk-USMESBOR.js → chunk-66CGXQUA.js} +239 -39
- package/dist/{chunk-OTJVG7JM.js → chunk-6F3FQCAQ.js} +3 -3
- package/dist/{chunk-PBVBMZGO.js → chunk-6FG34V6D.js} +15 -14
- package/dist/{chunk-7HNQK2JA.js → chunk-6KQ6WMTI.js} +1 -1
- package/dist/{chunk-ODOLBT7W.js → chunk-6WKBTZVL.js} +10 -4
- package/dist/{chunk-NOKJCF27.js → chunk-7INEFMVU.js} +9 -3
- package/dist/{chunk-GSJLB6JI.js → chunk-7THUQU44.js} +34 -8
- package/dist/{chunk-HDLAB7W3.js → chunk-7UH2JWBF.js} +1 -1
- package/dist/{chunk-MJKWLOCW.js → chunk-7UNMSF5O.js} +1 -1
- package/dist/{chunk-TTELLO3M.js → chunk-AEUGIJDO.js} +3 -1
- package/dist/{chunk-ZFFRW73K.js → chunk-AHNVFBVB.js} +113 -16
- package/dist/{chunk-IBS2FAI4.js → chunk-AUKRBHHZ.js} +4 -1
- package/dist/{chunk-7TIAQUBH.js → chunk-BBK2TSK3.js} +1 -1
- package/dist/{chunk-L67OHDSD.js → chunk-BNWWVYRN.js} +6 -5
- package/dist/{chunk-PY3FOMRN.js → chunk-BQEZPRUC.js} +4 -4
- package/dist/{chunk-XPPQ4PBN.js → chunk-BQXYXJYC.js} +733 -309
- package/dist/{chunk-ORM7ZFKC.js → chunk-BZ546I4Q.js} +32 -0
- package/dist/{chunk-JS5XMVXY.js → chunk-C2UN464N.js} +1 -1
- package/dist/{chunk-75H4R62K.js → chunk-CBPNZFSU.js} +0 -2
- package/dist/{chunk-YLXTKI6M.js → chunk-CHO5SNWR.js} +1 -1
- package/dist/{chunk-HTUEAERH.js → chunk-CIEVY5TD.js} +15 -11
- package/dist/{chunk-RHNIWSOP.js → chunk-CKLJT2DH.js} +2 -2
- package/dist/{chunk-3FLDC2ZI.js → chunk-CKOJP7JI.js} +1 -1
- package/dist/{chunk-V3W3SATA.js → chunk-CL4J4757.js} +1 -1
- package/dist/{chunk-3J37XIWU.js → chunk-CQFWTWC6.js} +59 -14
- package/dist/{chunk-U45XMFOM.js → chunk-CROVXJ4S.js} +3 -3
- package/dist/{chunk-VYNY7K44.js → chunk-CWSLTSL6.js} +8 -8
- package/dist/{chunk-V6KKNYF2.js → chunk-DDMGQ5Q3.js} +63 -27
- package/dist/{chunk-YKC7QDZH.js → chunk-DN24VTS5.js} +31 -6
- package/dist/{chunk-6F4QFV4Q.js → chunk-EHAN752X.js} +7 -7
- package/dist/{chunk-2HB5U5QT.js → chunk-EPHSISMT.js} +2 -2
- package/dist/{chunk-2W5J4T2F.js → chunk-FCMQVEVL.js} +36 -3
- package/dist/{chunk-3L2QU5ZF.js → chunk-FS7XF7SE.js} +1 -1
- package/dist/{chunk-6WUXRDTF.js → chunk-FTZET5YX.js} +138 -1
- package/dist/{chunk-XEPLZKEB.js → chunk-FUKVP54K.js} +66 -19
- package/dist/{chunk-SNW6E3Y4.js → chunk-FX2QRSRT.js} +1 -1
- package/dist/{chunk-PWRC5XZO.js → chunk-FXZ6VGFW.js} +16 -8
- package/dist/chunk-GHR4ZPJ7.js +70 -0
- package/dist/{chunk-6WMJHNGN.js → chunk-GKDAQL45.js} +1 -1
- package/dist/{chunk-DMPIS4BY.js → chunk-GOT5ZHPX.js} +3 -3
- package/dist/chunk-GPJIBLP4.js +104 -0
- package/dist/{chunk-EKYYMIVT.js → chunk-GPUOUUHA.js} +10 -1
- package/dist/{chunk-PLSY7Y5F.js → chunk-GXNBPTPJ.js} +1 -1
- package/dist/{chunk-NMOEWLJY.js → chunk-HE34XVD5.js} +5 -5
- package/dist/{chunk-EM7NP2AC.js → chunk-HHAKXIKX.js} +12 -9
- package/dist/{chunk-AMPNM6SB.js → chunk-HHT527PV.js} +82 -37
- package/dist/{chunk-WC6WL52H.js → chunk-HIVOLPLD.js} +1 -40
- package/dist/{chunk-7P6YUA53.js → chunk-I3LDTSWU.js} +1 -1
- package/dist/{chunk-Q3AXXKDF.js → chunk-IKXH4BFC.js} +5 -5
- package/dist/chunk-IMYGYIAI.js +23 -0
- package/dist/{chunk-KEC47ERR.js → chunk-IPHLUZ37.js} +121 -5
- package/dist/{chunk-NZH5VSBC.js → chunk-IZA7XW2Q.js} +3 -3
- package/dist/{chunk-LFKRM3RK.js → chunk-IZLML47J.js} +1 -1
- package/dist/{chunk-4IZ2ELU7.js → chunk-JRMHGO5B.js} +1 -1
- package/dist/{chunk-TRMR77JJ.js → chunk-JSTTPYL3.js} +12 -12
- package/dist/{chunk-HWKSG33T.js → chunk-JVWLHBAV.js} +4 -4
- package/dist/{chunk-4Y523526.js → chunk-K7UNIEB4.js} +254 -48
- package/dist/{chunk-PFLDEJJJ.js → chunk-KBR5LIWD.js} +1 -1
- package/dist/{chunk-IMX3VIIT.js → chunk-KI7O64XV.js} +328 -98
- package/dist/{chunk-AWKZRRPX.js → chunk-KK3MIY5C.js} +5 -5
- package/dist/{chunk-NFFCNZVD.js → chunk-KO3OHI6V.js} +3 -3
- package/dist/{chunk-NJFJWQNN.js → chunk-L5CGXEZC.js} +27 -22
- package/dist/{chunk-UEZQNJET.js → chunk-LK3XQDBP.js} +1 -1
- package/dist/{chunk-T7AZ5K5K.js → chunk-LM443ORV.js} +1 -1
- package/dist/{chunk-ICHQULGD.js → chunk-LNAFLXL7.js} +12 -4
- package/dist/{chunk-72Y3I24H.js → chunk-LTUA5EYI.js} +122 -11
- package/dist/{chunk-FGHPLZDF.js → chunk-MAXD5JQL.js} +11 -10
- package/dist/{chunk-45KCQK24.js → chunk-MFASHRJ6.js} +5 -5
- package/dist/chunk-MFYMDGE7.js +37 -0
- package/dist/{chunk-SMGSSWCW.js → chunk-MGVILAYU.js} +55 -11
- package/dist/{chunk-J4C442ZT.js → chunk-MSLWRWTI.js} +1 -1
- package/dist/{chunk-C2L622QJ.js → chunk-NB5IRTC4.js} +52 -44
- package/dist/{chunk-O5HTTJ2X.js → chunk-ND75TGPR.js} +2 -2
- package/dist/{chunk-VRTCVZND.js → chunk-NE34MWVL.js} +142 -16
- package/dist/{chunk-X63RNRZF.js → chunk-NMOFLWDY.js} +1 -1
- package/dist/{chunk-CRCB5S7I.js → chunk-NPXKGBVZ.js} +140 -23
- package/dist/{chunk-LSY2JAFY.js → chunk-NRBGUIPE.js} +1 -1
- package/dist/{chunk-4LWBC7CM.js → chunk-NY6SBR4O.js} +1 -1
- package/dist/{chunk-UCUOGVDX.js → chunk-O3K2C22L.js} +13 -1
- package/dist/{chunk-BZYEOIT3.js → chunk-OATET4BV.js} +2 -2
- package/dist/chunk-OOZU5H3T.js +86 -0
- package/dist/{chunk-XXNSHYPO.js → chunk-OQ4FNDRG.js} +28 -6
- package/dist/{chunk-GJD7D6HM.js → chunk-OWVX52XF.js} +4 -4
- package/dist/{chunk-X65OJFQM.js → chunk-PEAAX6UA.js} +1 -1
- package/dist/{chunk-X36BZYJ3.js → chunk-PFAVHC5N.js} +5 -5
- package/dist/chunk-PMVVUIHH.js +85 -0
- package/dist/chunk-PPMGQFLJ.js +2317 -0
- package/dist/{chunk-U6RXHPK4.js → chunk-PTY2N23C.js} +311 -3
- package/dist/{chunk-5SDE2HWI.js → chunk-PZ5SKYK6.js} +4 -4
- package/dist/{chunk-WZFVNICF.js → chunk-Q6ZLQMP2.js} +1 -1
- package/dist/{chunk-KBRHGXE7.js → chunk-QFR5EKZG.js} +29 -7
- package/dist/{chunk-SWK6MNAI.js → chunk-QN56VQ6Z.js} +1 -1
- package/dist/{chunk-6KS57E66.js → chunk-QR3BUMOS.js} +2 -2
- package/dist/{chunk-UMNMC3DZ.js → chunk-QV5CQLQH.js} +2 -2
- package/dist/{chunk-SCHARPXE.js → chunk-REZIGNA6.js} +2 -2
- package/dist/{chunk-UQGSBM3U.js → chunk-RFPMXR6B.js} +11 -0
- package/dist/{chunk-DHWJMFR6.js → chunk-RSABKW6B.js} +1 -1
- package/dist/{chunk-RHRK3VDF.js → chunk-RZNP35SI.js} +2 -2
- package/dist/{chunk-NUTZJZKW.js → chunk-SKTAZGFI.js} +10 -42
- package/dist/{chunk-JVKIRKLC.js → chunk-SVXUT2DN.js} +4 -4
- package/dist/{chunk-YRC4NV2C.js → chunk-T7EF5CQO.js} +3 -3
- package/dist/{chunk-QAEWWYHL.js → chunk-TDF2XKLK.js} +5 -1
- package/dist/{chunk-52EK7KIA.js → chunk-TT5BBVLX.js} +51 -111
- package/dist/{chunk-5H47VHB7.js → chunk-UWX6MMCX.js} +1 -1
- package/dist/{chunk-KXBMR4ZD.js → chunk-V3WLC5TJ.js} +1 -98
- package/dist/{chunk-E7DFTCUW.js → chunk-V4YNN7PA.js} +10 -3
- package/dist/{chunk-S37PAH7F.js → chunk-V5DDXXMP.js} +25 -5
- package/dist/{chunk-3LQVIRGL.js → chunk-VH6SPPNA.js} +1 -1
- package/dist/{chunk-TN2AXREB.js → chunk-VJUUI2VT.js} +1 -1
- package/dist/{chunk-L6WHOLGP.js → chunk-VN5WOOAQ.js} +42 -6
- package/dist/{chunk-EXDW3E2R.js → chunk-VPHJ2LUI.js} +165 -15
- package/dist/{chunk-I73AHVH5.js → chunk-WJC6AAJN.js} +1 -1
- package/dist/{chunk-FLNUXH6H.js → chunk-WVBVUVZB.js} +6 -5
- package/dist/{chunk-A6PDF4BO.js → chunk-XTQ7R2PA.js} +2 -2
- package/dist/{chunk-3W7U6ZKY.js → chunk-Y2HD2YB7.js} +1 -1
- package/dist/{chunk-MLYG3TI6.js → chunk-YAACLBZ7.js} +5 -5
- package/dist/{chunk-DRXO46LA.js → chunk-YGVAKKGJ.js} +11 -6
- package/dist/chunk-YLHACCCB.js +166 -0
- package/dist/{chunk-JKLA7AUZ.js → chunk-YP6UGVEY.js} +3 -3
- package/dist/{chunk-QSAAN3H6.js → chunk-YYC553FO.js} +2 -2
- package/dist/{chunk-T35RCQFE.js → chunk-YZPEQW7H.js} +9 -8
- package/dist/{chunk-IVU3WN7S.js → chunk-ZG62LIK3.js} +74 -4
- package/dist/{chunk-KI5PFRG6.js → chunk-ZKGWHT56.js} +60 -2
- package/dist/{chunk-P5YTFPCV.js → chunk-ZKJ5S23O.js} +37 -15
- package/dist/chunk-ZLPS3GR7.js +146 -0
- package/dist/{chunk-L6MLYKY5.js → chunk-ZMX22HSS.js} +50 -6
- package/dist/{chunk-JY5GAZYC.js → chunk-ZQEJ4IX2.js} +4 -0
- package/dist/{chunk-P3DQL6JT.js → chunk-ZS5JO6QV.js} +7 -6
- package/dist/{cleanup-graph-garbage-6IJ6GJY2.js → cleanup-graph-garbage-LAPIZGFX.js} +11 -11
- package/dist/{cloud-sync-command-TZVPTKZV.js → cloud-sync-command-QAZ2NWRA.js} +11 -2
- package/dist/{cloud-sync-db-init-2QLU6GCD.js → cloud-sync-db-init-HAGVF32Y.js} +1 -1
- package/dist/{cloud-sync-shutdown-OPCDMH4L.js → cloud-sync-shutdown-DAEPCFVK.js} +5 -5
- package/dist/{co-activation-YMDKMDZ6.js → co-activation-523TKQPZ.js} +5 -5
- package/dist/{co-occurrence-VYWPQSLC.js → co-occurrence-PQUCTENN.js} +35 -16
- package/dist/{code-context-index-QLJDRL7B.js → code-context-index-LIDOFKOR.js} +12 -5
- package/dist/code-context-watcher-4F7K2N3U.js +120 -0
- package/dist/{content-extractor-NXYNEF5K.js → content-extractor-DJM5EUDA.js} +2 -2
- package/dist/{conversation-entity-extractor-KGW4UEY4.js → conversation-entity-extractor-THGKQ5RD.js} +4 -4
- package/dist/{crdt-sync-QS2DHTKW.js → crdt-sync-32B55NOJ.js} +1 -1
- package/dist/{crm-webhook-5PNRCVO2.js → crm-webhook-FHRISFYQ.js} +2 -2
- package/dist/{cto-delegation-gate-LD4XTG6U.js → cto-delegation-gate-O6XPGECP.js} +29 -27
- package/dist/{daemon-auth-QZHEO7IQ.js → daemon-auth-PNKHERLV.js} +6 -1
- package/dist/daemon-drift-N2GKUBAO.js +15 -0
- package/dist/{daemon-orchestration-XC2VTPVI.js → daemon-orchestration-BWLSJG2X.js} +35 -31
- package/dist/{daemon-ready-3WSKI3R5.js → daemon-ready-BN6EZLTQ.js} +1 -1
- package/dist/{daemon-ready-signal-CKXPUMJ2.js → daemon-ready-signal-PNDMVKPJ.js} +3 -1
- package/dist/{daemon-restart-circuit-breaker-SMTWFX27.js → daemon-restart-circuit-breaker-CD4VMCU7.js} +1 -1
- package/dist/daemon-restart-report-FIO5HZTJ.js +15 -0
- package/dist/{daemon-timer-report-TNJH5SFY.js → daemon-timer-report-6UK5PSDP.js} +2 -1
- package/dist/{db-integrity-events-2DTFO37N.js → db-integrity-events-GYGANKZV.js} +1 -1
- package/dist/{destructive-data-guard-BVFWPPIS.js → destructive-data-guard-HHWUBIGS.js} +1 -1
- package/dist/{doc-graph-extractor-6TVQTBLO.js → doc-graph-extractor-HOKOV7BE.js} +9 -9
- package/dist/{documents-4WQ5MQR2.js → documents-HWEJMONR.js} +18 -15
- package/dist/{dreaming-SO4VH44W.js → dreaming-FMNDODG2.js} +33 -31
- package/dist/{employee-boot-brief-Z4WTZVUC.js → employee-boot-brief-DBFROOQJ.js} +37 -35
- package/dist/{entity-boost-JY3KNTO2.js → entity-boost-5V4W6NFA.js} +1 -1
- package/dist/{exe-drift-BWSUUAEA.js → exe-drift-V55UAYRT.js} +6 -6
- package/dist/{exe-export-4WPMVRNO.js → exe-export-LHN42ZUS.js} +20 -17
- package/dist/{exe-import-7C3SS62E.js → exe-import-M536BEZC.js} +20 -17
- package/dist/{exe-key-NFHZNJU6.js → exe-key-37XIR22X.js} +113 -108
- package/dist/{exe-org-5HYTAUH6.js → exe-org-7TDIRNTE.js} +14 -14
- package/dist/{exe-snapshot-REKNH2WI.js → exe-snapshot-EOUBCIQK.js} +36 -34
- package/dist/{fast-db-init-OW6Z4YDB.js → fast-db-init-GWUZ746B.js} +1 -1
- package/dist/{founder-context-6FAAM5LY.js → founder-context-6LQKET4A.js} +2 -2
- package/dist/{fts-integrity-4YB34KWX.js → fts-integrity-PLAL6NMG.js} +1 -1
- package/dist/gateway/index.js +17 -17
- package/dist/{git-main-guard-VTW4N3CM.js → git-main-guard-BGICS25C.js} +1 -1
- package/dist/{git-staleness-ELGGOVRV.js → git-staleness-QNNXJK3W.js} +5 -5
- package/dist/{global-procedures-JBMGJRR6.js → global-procedures-NMQGF54V.js} +7 -7
- package/dist/{gotrue-session-ODZ2ERJX.js → gotrue-session-U4H3UGHL.js} +1 -3
- package/dist/{graph-auto-extract-O6IIL5O3.js → graph-auto-extract-7POGAKHM.js} +9 -9
- package/dist/{graph-query-AP5R6ZHO.js → graph-query-ZEDO4BDF.js} +1 -1
- package/dist/{graph-rag-WHZ6EPMW.js → graph-rag-JA7XN7NO.js} +4 -4
- package/dist/hook-integrity-6NLSNTXD.js +15 -0
- package/dist/{hook-prefetch-VWHIZBTX.js → hook-prefetch-4KH3D4YU.js} +30 -27
- package/dist/hook-tamper-log-Z4PWC7N4.js +90 -0
- package/dist/hooks/bug-report-worker.js +33 -31
- package/dist/hooks/codex-stop-task-finalizer.js +35 -33
- package/dist/hooks/commit-complete.js +32 -30
- package/dist/hooks/error-recall.js +12 -12
- package/dist/hooks/exe-heartbeat-hook.js +7 -7
- package/dist/hooks/ingest-worker.js +19 -16
- package/dist/hooks/ingest.js +20 -20
- package/dist/hooks/instructions-loaded.js +9 -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 +14 -14
- package/dist/hooks/pre-compact.js +32 -30
- package/dist/hooks/pre-tool-use.js +305 -490
- package/dist/hooks/prompt-submit.js +63 -55
- package/dist/hooks/session-end.js +37 -35
- package/dist/hooks/session-start.js +18 -18
- package/dist/hooks/stop.js +38 -36
- package/dist/hooks/subagent-stop.js +34 -32
- package/dist/hooks/summary-worker.js +38 -36
- package/dist/index.js +40 -38
- package/dist/{installer-RYW65FRY.js → installer-M34Q7LAS.js} +25 -10
- package/dist/{installer-OYBQQ7BY.js → installer-POV6TDQ5.js} +12 -8
- package/dist/{installer-A3V2W3NV.js → installer-S624ZOMB.js} +12 -8
- package/dist/{intercom-queue-XBS5WVJM.js → intercom-queue-MKDWAEUV.js} +28 -26
- package/dist/lib/cloud-sync.js +29 -20
- package/dist/lib/consolidation.js +11 -11
- package/dist/lib/database.js +5 -5
- package/dist/lib/db-backup.js +7 -1
- package/dist/lib/db-daemon-client.js +10 -7
- package/dist/lib/db-write-worker.js +4 -4
- package/dist/lib/db.js +5 -5
- package/dist/lib/device-registry.js +1 -1
- package/dist/lib/embedder.js +8 -5
- package/dist/lib/employee-templates.js +8 -8
- package/dist/lib/employees.js +5 -5
- package/dist/lib/exe-daemon-client.js +7 -4
- package/dist/lib/exe-daemon.js +440 -255
- package/dist/lib/hybrid-search.js +12 -10
- package/dist/lib/identity-templates.js +1 -1
- package/dist/lib/identity.js +17 -7
- package/dist/lib/license.js +2 -2
- package/dist/lib/messaging.js +29 -27
- package/dist/lib/post-tool-memory.js +9 -9
- package/dist/lib/registry-proxy.js +3 -1
- package/dist/lib/reminders.js +6 -6
- package/dist/lib/schedules.js +11 -11
- package/dist/lib/session-registry.js +11 -7
- package/dist/lib/session-wrappers.js +1 -1
- package/dist/lib/skill-learning.js +19 -16
- package/dist/lib/stack-invariants.js +11 -1
- package/dist/lib/status-brief.js +2 -1
- package/dist/lib/store.js +9 -9
- package/dist/lib/task-router.js +6 -6
- package/dist/lib/tasks.js +30 -28
- package/dist/lib/tmux-routing.js +28 -26
- package/dist/lib/tmux-status.js +5 -1
- package/dist/lib/token-spend.js +6 -6
- package/dist/{license-gate-EOLMF7J5.js → license-gate-2QNMBAZU.js} +3 -3
- package/dist/{license-sync-ELY6PKEU.js → license-sync-FEDKH5MD.js} +2 -2
- package/dist/{mailbox-inbox-4MEUOL3J.js → mailbox-inbox-XE72D3AX.js} +2 -2
- package/dist/{mailbox-outbox-J6WIF3UY.js → mailbox-outbox-DNDDP2HW.js} +1 -1
- package/dist/mcp/register-tools.js +112 -107
- package/dist/mcp/server.js +113 -108
- package/dist/mcp/tools/complete-reminder.js +7 -7
- package/dist/mcp/tools/create-reminder.js +7 -7
- package/dist/mcp/tools/create-task.js +32 -30
- package/dist/mcp/tools/deactivate-behavior.js +20 -17
- package/dist/mcp/tools/list-reminders.js +7 -7
- package/dist/mcp/tools/list-tasks.js +32 -30
- package/dist/mcp/tools/send-message.js +35 -31
- package/dist/mcp/tools/update-task.js +31 -29
- package/dist/{mcp-child-registry-FVGV5XSB.js → mcp-child-registry-DVHYAHPW.js} +3 -2
- package/dist/{mcp-health-HNVSWKFA.js → mcp-health-B5EKRCZG.js} +2 -2
- package/dist/{mcp-http-config-4PHK6RHB.js → mcp-http-config-ZJ7XHWT7.js} +10 -6
- package/dist/{mcp-session-identity-5DBVDLQR.js → mcp-session-identity-PEVM7VIP.js} +28 -26
- package/dist/{memory-cards-WJM4NG3Q.js → memory-cards-VN5DEWPD.js} +13 -9
- package/dist/{memory-graph-extractor-TSTO7PYI.js → memory-graph-extractor-TMEB6WLA.js} +10 -10
- package/dist/{memory-poisoning-defense-BWVA5OBI.js → memory-poisoning-defense-DYHARQ2G.js} +5 -5
- package/dist/{memory-pressure-watchdog-GES7RFL3.js → memory-pressure-watchdog-J6Q3SIBL.js} +29 -27
- package/dist/{memory-queue-client-62NS3U56.js → memory-queue-client-QC2OTMJB.js} +8 -5
- package/dist/{memory-reflection-6UAL4IHM.js → memory-reflection-ZYJUOSFX.js} +34 -14
- package/dist/{message-queue-client-VMVKIPV7.js → message-queue-client-OEQCGSWC.js} +1 -25
- package/dist/{notification-ledger-E2WOQ3WQ.js → notification-ledger-TG6EFYBP.js} +31 -29
- package/dist/{notifications-IHLUYF3E.js → notifications-LGYY22W5.js} +28 -26
- package/dist/{orchestration-events-TKZV4PAI.js → orchestration-events-JPHB6NPY.js} +6 -6
- package/dist/{orchestrator-MQXUNOS2.js → orchestrator-IC4WGP6L.js} +30 -28
- package/dist/{org-brief-session-7KKLV5OW.js → org-brief-session-DEPHWCQR.js} +9 -9
- package/dist/{org-consent-policy-7AHSKB6L.js → org-consent-policy-T27AO5OJ.js} +2 -2
- package/dist/{org-join-POWUG25F.js → org-join-A3YXC5RB.js} +2 -2
- package/dist/{org-key-admin-E7EMDOZZ.js → org-key-admin-SQFHCVP2.js} +3 -3
- package/dist/{org-partner-runtime-EVZKR2SJ.js → org-partner-runtime-L7L2WWGN.js} +10 -10
- package/dist/{org-row-visibility-GUMNPRK7.js → org-row-visibility-M54Z6ZH3.js} +1 -1
- package/dist/{pipeline-router-E5XQUJGU.js → pipeline-router-NKYAUR3Y.js} +6 -6
- package/dist/{plan-limits-AJ6K2P6R.js → plan-limits-ISRRGF23.js} +8 -8
- package/dist/{platform-procedures-7YSCLF4Z.js → platform-procedures-Z7ZGBJWN.js} +1 -1
- package/dist/{project-boot-5ZXAIOBB.js → project-boot-BLYGVUJH.js} +4 -1
- package/dist/{project-name-FQKW5SFG.js → project-name-WKSNNKXK.js} +6 -6
- package/dist/{projection-worker-UKSYJ4PG.js → projection-worker-RNYPE46G.js} +2 -2
- package/dist/{prospective-memory-S22KIIBP.js → prospective-memory-GEO6E3UL.js} +5 -5
- package/dist/{push-notifications-T5SJMFL4.js → push-notifications-EY6BXZUY.js} +29 -27
- package/dist/ref-provenance-gate-M4AQO4OT.js +269 -0
- package/dist/{reproject-worktree-memories-G6QO5J3X.js → reproject-worktree-memories-DAA5GWMH.js} +30 -28
- package/dist/{reranker-NYOFY5FK.js → reranker-7OADQPMG.js} +1 -1
- package/dist/resolve-image-labels-ZI6UBW5W.js +15 -0
- package/dist/{retrieval-health-LWDBIBWJ.js → retrieval-health-FCEDWN2P.js} +2 -2
- package/dist/{review-polling-BSZXGHER.js → review-polling-G52BR4MC.js} +29 -27
- package/dist/runtime/index.js +37 -35
- package/dist/{session-events-EO7BFQ73.js → session-events-P6E2373E.js} +29 -27
- package/dist/{session-kill-telemetry-FXUGITZK.js → session-kill-telemetry-OHNJMIVT.js} +29 -27
- package/dist/{session-mcp-config-SC5BLWZG.js → session-mcp-config-WFZAH6R5.js} +2 -1
- package/dist/{session-scope-B3VWUG4G.js → session-scope-DKOHPQPJ.js} +28 -26
- package/dist/{setup-wizard-3JEJSXXN.js → setup-wizard-RNU3RFBE.js} +1 -1
- package/dist/{skill-refinement-5DDEQHGM.js → skill-refinement-AKJTHFXC.js} +6 -6
- package/dist/stack-generate-manifest-7WJZWSPK.js +958 -0
- package/dist/{stack-promote-KPEARCCS.js → stack-promote-OP2URGFF.js} +5 -4
- package/dist/{stack-release-FMGC57AD.js → stack-release-MY6U2QIO.js} +32 -8
- package/dist/{stack-update-TZ4P6EXU.js → stack-update-QSHSLUTZ.js} +4 -3
- package/dist/{steward-gate-PC6MD5VP.js → steward-gate-KMLS5ECC.js} +6 -6
- package/dist/{subagent-brief-injection-NBSQ5IBS.js → subagent-brief-injection-HCKZQZBF.js} +39 -37
- package/dist/{supervisor-handoff-CSJQMI53.js → supervisor-handoff-SGLEPOCY.js} +12 -3
- package/dist/{support-inbox-M3HDZFVF.js → support-inbox-UBXU5RKV.js} +11 -11
- package/dist/{support-outbox-HFJWG52M.js → support-outbox-G2NG2U5K.js} +2 -2
- package/dist/{sweep-budget-KMPJ7O5Z.js → sweep-budget-YGLCNXZZ.js} +9 -3
- package/dist/{task-enforcement-LXNIF3US.js → task-enforcement-2GR7HU6V.js} +29 -27
- package/dist/{task-request-inbox-3EFDJT4E.js → task-request-inbox-ANCVK2VG.js} +2 -2
- package/dist/{task-scope-ERJTOAS4.js → task-scope-QANJJXXB.js} +32 -30
- package/dist/{tasks-crud-GUP437HH.js → tasks-crud-45WOIMIM.js} +46 -26
- package/dist/{tasks-notify-AXFFZTI2.js → tasks-notify-ZJS4MA3S.js} +31 -27
- package/dist/{tasks-review-AYNV37GQ.js → tasks-review-ZVPKY47Z.js} +28 -26
- package/dist/{telemetry-upload-4IP7KKIR.js → telemetry-upload-VY3UWAEL.js} +10 -10
- package/dist/{token-budget-UJD5CHUG.js → token-budget-XHX6XFEC.js} +6 -6
- package/dist/{tool-capability-index-TCTWUUBO.js → tool-capability-index-6HLZU437.js} +1 -1
- package/dist/{tool-telemetry-YRVOD2RP.js → tool-telemetry-GBDI4AXR.js} +1 -1
- package/dist/tui/App.js +38 -36
- package/dist/{tui-data-ZUFCSQ3G.js → tui-data-IQFE3UW3.js} +32 -30
- package/dist/{typed-messages-RCMPEKJN.js → typed-messages-P2HLLA62.js} +1 -1
- package/dist/{update-support-V5LF2KMQ.js → update-support-BDN5AK4R.js} +27 -23
- package/dist/{work-claims-2BECZ5GA.js → work-claims-PDQNLE5K.js} +7 -7
- package/dist/{work-state-heartbeat-7TMN2GSO.js → work-state-heartbeat-CH6BLQKV.js} +1 -1
- package/dist/{worker-gate-WUX2AYYZ.js → worker-gate-NUUSQMBT.js} +1 -3
- package/dist/{workflow-engine-HDEYIAWI.js → workflow-engine-RZ7QEI3Z.js} +2 -2
- package/dist/{worktree-ZMNKH46X.js → worktree-Q25PZST6.js} +11 -7
- package/dist/worktree-ownership-guard-4LKMW6PW.js +421 -0
- package/dist/{worktree-sweep-ZNX6R25W.js → worktree-sweep-EV5YQ2OB.js} +8 -8
- package/package.json +16 -3
- package/release-notes.json +5 -5
- package/src/commands/exe.md +16 -16
- package/stack.release.json +13 -6
- package/dist/behavior-injection-76FH424R.js +0 -62
- package/dist/chunk-I422WQ3A.js +0 -50
- package/dist/daemon-restart-report-EIVD6WDJ.js +0 -10
- package/dist/worktree-ownership-guard-OUWJROW2.js +0 -88
- /package/dist/{chunk-X7HB4KLA.js → chunk-4EG4DT4F.js} +0 -0
- /package/dist/{chunk-B72KXFDR.js → chunk-BRAIWGMF.js} +0 -0
- /package/dist/{chunk-D2Q3AYMB.js → chunk-HQEAZDAC.js} +0 -0
- /package/dist/{chunk-SBMBWO2Y.js → chunk-IK4344V5.js} +0 -0
- /package/dist/{chunk-4VB6NJOL.js → chunk-K3VDF6II.js} +0 -0
- /package/dist/{chunk-KXIYWHBU.js → chunk-KM7DAG5J.js} +0 -0
- /package/dist/{chunk-RWTYLRNY.js → chunk-QIEYJ4KZ.js} +0 -0
- /package/dist/{chunk-OJTF4SV7.js → chunk-VCTK5HRA.js} +0 -0
- /package/dist/{chunk-NP62DK7V.js → chunk-VPT6VMBG.js} +0 -0
- /package/dist/{chunk-IUXVUUIA.js → chunk-YZ4AEMR7.js} +0 -0
- /package/dist/{core-memory-33XVE547.js → core-memory-UIZKCY4L.js} +0 -0
- /package/dist/{memory-isolation-Q3DSVL72.js → memory-isolation-3GJ6WLYX.js} +0 -0
- /package/dist/{oauth-server-ZP5ZXRL7.js → oauth-server-ZRHXIRXQ.js} +0 -0
- /package/dist/{wiki-acl-EICCXRAK.js → wiki-acl-MFOYK5F4.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
|
|
@@ -106,7 +124,7 @@ EXE_ORG_ID=
|
|
|
106
124
|
EXE_ORG_WORKSPACE_ID=
|
|
107
125
|
|
|
108
126
|
# --- CRM ---
|
|
109
|
-
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
|
|
110
128
|
CRM_SERVER_URL=https://crm.CHANGEME_DOMAIN
|
|
111
129
|
CRM_APP_SECRET=CHANGEME_CRM_APP_SECRET
|
|
112
130
|
# The CRM's first admin — seeded at boot by WorkspaceBootstrapService, which is
|
|
@@ -120,7 +138,7 @@ EXE_CRM_ADMIN_EMAIL=CHANGEME_ADMIN_EMAIL
|
|
|
120
138
|
CRM_HOST_PORT=3000
|
|
121
139
|
|
|
122
140
|
# --- Wiki ---
|
|
123
|
-
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
|
|
124
142
|
# Bug 2a8d3003 — DO NOT change this without migrating the data first.
|
|
125
143
|
# The wiki's users / workspaces / workspace_documents live in `public`. Point it at a
|
|
126
144
|
# different schema and Prisma will NOT error: it finds no tables, assumes a fresh
|
|
@@ -131,7 +149,22 @@ WIKI_IMAGE_TAG=update.askexe.com/askexe/exe-wiki:v0.9.26
|
|
|
131
149
|
# only thing holding production together was a host-local compose override.
|
|
132
150
|
# exe-wiki-schema-guard blocks the boot if you get this wrong.
|
|
133
151
|
WIKI_DB_SCHEMA=public
|
|
134
|
-
|
|
152
|
+
# Bugs bed3cb4a / c604df37 — see deploy/compose/docker-compose.yml's exe-wiki
|
|
153
|
+
# environment block for the full rationale. pgvector reuses this same
|
|
154
|
+
# exe-db instance; native runs in-process (no API key, no exe-os MCP daemon).
|
|
155
|
+
WIKI_VECTOR_DB=pgvector
|
|
156
|
+
# bug bed3cb4a / corrected 2026-08-31 (founder direction): wiki's RAG/chat
|
|
157
|
+
# uses GLM via Z.ai directly (exe-wiki PR #78's real, verified `zai`
|
|
158
|
+
# provider) — not Anthropic through exe-gateway. Supply ZAI_API_KEY to match.
|
|
159
|
+
WIKI_LLM_PROVIDER=zai
|
|
160
|
+
ZAI_MODEL_PREF=glm-4.6
|
|
161
|
+
ZAI_BASE_PATH=https://api.z.ai/api/coding/paas/v4
|
|
162
|
+
# exe-gateway's /v1/messages authenticates via an exe_sk_* billing API key
|
|
163
|
+
# (exe-gateway src/api-keys.ts), provisioned per-customer through
|
|
164
|
+
# dashboard.askexe.com — it cannot be generated here. Chat/RAG will fail
|
|
165
|
+
# ("No Anthropic API key was set") until this is set.
|
|
166
|
+
# SET_MANUALLY
|
|
167
|
+
WIKI_ANTHROPIC_API_KEY=CHANGEME_WIKI_ANTHROPIC_API_KEY
|
|
135
168
|
WIKI_AUTH_TOKEN=CHANGEME_WIKI_AUTH_TOKEN
|
|
136
169
|
WIKI_JWT_SECRET=CHANGEME_WIKI_JWT_SECRET
|
|
137
170
|
WIKI_SIG_KEY=CHANGEME_WIKI_SIG_KEY
|
|
@@ -143,7 +176,7 @@ WIKI_HOST_PORT=3001
|
|
|
143
176
|
EXE_SSO_COOKIE_NAME=exe_access_token
|
|
144
177
|
|
|
145
178
|
# --- exe-os ---
|
|
146
|
-
EXE_OS_IMAGE_TAG=update.askexe.com/askexe/exe-os:v0.9.
|
|
179
|
+
EXE_OS_IMAGE_TAG=update.askexe.com/askexe/exe-os:v0.9.324@sha256:3ce6406e0f7f279ff2568bbbb7d55de51a46fdf35c49691f24fd959d6fd2d3fa
|
|
147
180
|
EXED_MCP_TOKEN=CHANGEME_EXED_MCP_TOKEN
|
|
148
181
|
EXED_DEVICE_ID=CHANGEME_DEVICE_ID
|
|
149
182
|
EXE_MCP_HOST_BIND=127.0.0.1
|
|
@@ -153,7 +186,7 @@ EXE_MCP_HOST_PORT=48739
|
|
|
153
186
|
EXE_CLOUD_SYNC_TO_POSTGRES=true
|
|
154
187
|
|
|
155
188
|
# --- ERP (Frappe/ERPNext fork) ---
|
|
156
|
-
ERP_IMAGE_TAG=update.askexe.com/askexe/exe-erp:
|
|
189
|
+
ERP_IMAGE_TAG=update.askexe.com/askexe/exe-erp:v2026.08.07-d185286-stamped@sha256:1c655f3f7819c797afd13c79561354f0276cf337403f32aee3e406a497e8827b
|
|
157
190
|
# Administrator password for the ERPNext site (created on first boot).
|
|
158
191
|
# bug 43854b31: this only applies at FIRST boot. To rotate it later you must also
|
|
159
192
|
# run `bench --site $ERP_SITE_NAME set-admin-password <new>` inside exe-erp —
|
|
@@ -169,7 +202,7 @@ ERP_WS_PORT=9069
|
|
|
169
202
|
ERP_SENTRY_DSN=
|
|
170
203
|
|
|
171
204
|
# --- Gateway ---
|
|
172
|
-
GATEWAY_IMAGE_TAG=update.askexe.com/askexe/exe-gateway:
|
|
205
|
+
GATEWAY_IMAGE_TAG=update.askexe.com/askexe/exe-gateway:v2026.08.07-c15f093-stamped@sha256:1bc11a2a0ad1f3929d59d2685696f22a72042b9fca9c75e15c02dc7d3c640105
|
|
173
206
|
EXE_GATEWAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_AUTH_TOKEN
|
|
174
207
|
EXE_GATEWAY_WS_RELAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_WS_RELAY_AUTH_TOKEN
|
|
175
208
|
EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN=CHANGEME_EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN
|
|
@@ -190,7 +223,7 @@ CRM_GRAPHQL_URL=http://exe-crm:3000/graphql
|
|
|
190
223
|
# bug 633995f1: v0.9.5 is a QUARANTINED build that crashloops on any existing
|
|
191
224
|
# deployment; v0.9.4 is the last known-good generation and matches the signed
|
|
192
225
|
# apps manifest. See deploy/known-bad-images.json.
|
|
193
|
-
MONITOR_HUB_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-hub:
|
|
226
|
+
MONITOR_HUB_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-hub:v2026.08.09-10660eb4-stamped@sha256:c9a9218c2713b8dffea7e1cf8c0702a614657d311a7a4e821c6a543bab29bb97
|
|
194
227
|
MONITOR_HUB_PORT=8090
|
|
195
228
|
# Bootstrap superuser created on first start. Use your admin email + a strong password.
|
|
196
229
|
# After first boot these values are no longer used (stored in pb_data volume).
|
|
@@ -224,7 +257,7 @@ GATEWAY_ALERT_URL=http://exe-gateway:3100/api/alerts/error-spike
|
|
|
224
257
|
# Full scope details: deploy/monitor/HOST-ACCESS-CONSENT.md
|
|
225
258
|
# COMPOSE_PROFILES=monitor-agent
|
|
226
259
|
# bug 633995f1 / 9ce2a68b: the agent healthcheck is coupled to this generation.
|
|
227
|
-
MONITOR_AGENT_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-agent:
|
|
260
|
+
MONITOR_AGENT_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-agent:v2026.08.09-10660eb4-stamped@sha256:29fbd445f79484df04f000603e4ff445e76f0380f86d687a0033e3a0ef7d1b7a
|
|
228
261
|
# Reports to the local hub. Auto-populated by `exe-os stack-update` during bootstrap.
|
|
229
262
|
MONITOR_HUB_URL=http://exe-monitor-hub:8090
|
|
230
263
|
# bug dacf0042: TOKEN and KEY MUST start EMPTY (the safe "unpaired" state) — NOT a
|
|
@@ -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
|
|
@@ -140,7 +155,7 @@ EXE_ORG_ID=
|
|
|
140
155
|
EXE_ORG_WORKSPACE_ID=
|
|
141
156
|
|
|
142
157
|
# --- CRM ---
|
|
143
|
-
CRM_IMAGE_TAG=ghcr.io/askexe/exe-crm:v0.9.
|
|
158
|
+
CRM_IMAGE_TAG=ghcr.io/askexe/exe-crm:v0.9.53@sha256:a586dcc8bbd992538e3caa18c44e772d30f31155dfef0a2b7466ca3fc7c553d8
|
|
144
159
|
CRM_SERVER_URL=https://crm.CHANGEME_DOMAIN
|
|
145
160
|
CRM_APP_SECRET=CHANGEME_CRM_APP_SECRET
|
|
146
161
|
EXE_CRM_ADMIN_TOKEN=CHANGEME_EXE_CRM_ADMIN_TOKEN
|
|
@@ -153,7 +168,7 @@ EXE_CRM_ADMIN_EMAIL=CHANGEME_ADMIN_EMAIL
|
|
|
153
168
|
CRM_HOST_PORT=3000
|
|
154
169
|
|
|
155
170
|
# --- Wiki ---
|
|
156
|
-
WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.
|
|
171
|
+
WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.28@sha256:61856a4c6b97ce62c62ecdc3a377139287be5860eb807d9fbb737115758d7856
|
|
157
172
|
# Bug 2a8d3003 — DO NOT change this without migrating the data first.
|
|
158
173
|
# The wiki's users / workspaces / workspace_documents live in `public`. Point it at a
|
|
159
174
|
# different schema and Prisma will NOT error: it finds no tables, assumes a fresh
|
|
@@ -164,7 +179,22 @@ WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.26
|
|
|
164
179
|
# only thing holding production together was a host-local compose override.
|
|
165
180
|
# exe-wiki-schema-guard blocks the boot if you get this wrong.
|
|
166
181
|
WIKI_DB_SCHEMA=public
|
|
167
|
-
|
|
182
|
+
# Bugs bed3cb4a / c604df37 — see deploy/compose/docker-compose.yml's exe-wiki
|
|
183
|
+
# environment block for the full rationale. pgvector reuses this same
|
|
184
|
+
# exe-db instance; native runs in-process (no API key, no exe-os MCP daemon).
|
|
185
|
+
WIKI_VECTOR_DB=pgvector
|
|
186
|
+
# bug bed3cb4a / corrected 2026-08-31 (founder direction): wiki's RAG/chat
|
|
187
|
+
# uses GLM via Z.ai directly (exe-wiki PR #78's real, verified `zai`
|
|
188
|
+
# provider) — not Anthropic through exe-gateway. Supply ZAI_API_KEY to match.
|
|
189
|
+
WIKI_LLM_PROVIDER=zai
|
|
190
|
+
ZAI_MODEL_PREF=glm-4.6
|
|
191
|
+
ZAI_BASE_PATH=https://api.z.ai/api/coding/paas/v4
|
|
192
|
+
# exe-gateway's /v1/messages authenticates via an exe_sk_* billing API key
|
|
193
|
+
# (exe-gateway src/api-keys.ts), provisioned per-customer through
|
|
194
|
+
# dashboard.askexe.com — it cannot be generated here. Chat/RAG will fail
|
|
195
|
+
# ("No Anthropic API key was set") until this is set.
|
|
196
|
+
# SET_MANUALLY
|
|
197
|
+
WIKI_ANTHROPIC_API_KEY=CHANGEME_WIKI_ANTHROPIC_API_KEY
|
|
168
198
|
WIKI_AUTH_TOKEN=CHANGEME_WIKI_AUTH_TOKEN
|
|
169
199
|
EXE_WIKI_ADMIN_TOKEN=CHANGEME_EXE_WIKI_ADMIN_TOKEN
|
|
170
200
|
WIKI_JWT_SECRET=CHANGEME_WIKI_JWT_SECRET
|
|
@@ -176,7 +206,12 @@ WIKI_HOST_PORT=3001
|
|
|
176
206
|
EXE_SSO_COOKIE_NAME=exe_access_token
|
|
177
207
|
|
|
178
208
|
# --- exe-os ---
|
|
179
|
-
EXE_OS_IMAGE_TAG=ghcr.io/askexe/exe-os:v0.9.
|
|
209
|
+
EXE_OS_IMAGE_TAG=ghcr.io/askexe/exe-os:v0.9.324@sha256:3ce6406e0f7f279ff2568bbbb7d55de51a46fdf35c49691f24fd959d6fd2d3fa
|
|
210
|
+
|
|
211
|
+
# Infra image pins — manifest-derived. Compose has no fallback default for
|
|
212
|
+
# these: a missing pin ABORTS the deploy instead of substituting an old image.
|
|
213
|
+
EXE_DB_IMAGE=update.askexe.com/askexe/pgvector:0.8.0-pg16@sha256:a132765ec351c65111b5b675928a3a0515a466a40f97277329db8b8209ad8bc9
|
|
214
|
+
OTEL_COLLECTOR_IMAGE=update.askexe.com/askexe/otel-collector-contrib:0.114.0@sha256:37fa87091cfaaec7234a27e4e395a40c31c2bfaea97a349a4afef6d9e9681197
|
|
180
215
|
EXED_MCP_TOKEN=CHANGEME_EXED_MCP_TOKEN
|
|
181
216
|
EXED_DEVICE_ID=vps-default
|
|
182
217
|
EXE_MCP_HOST_BIND=127.0.0.1
|
|
@@ -186,7 +221,7 @@ EXE_MCP_HOST_PORT=48739
|
|
|
186
221
|
EXE_CLOUD_SYNC_TO_POSTGRES=true
|
|
187
222
|
|
|
188
223
|
# --- Gateway ---
|
|
189
|
-
GATEWAY_IMAGE_TAG=ghcr.io/askexe/exe-gateway:
|
|
224
|
+
GATEWAY_IMAGE_TAG=ghcr.io/askexe/exe-gateway:v2026.08.07-c15f093-stamped@sha256:1bc11a2a0ad1f3929d59d2685696f22a72042b9fca9c75e15c02dc7d3c640105
|
|
190
225
|
EXE_GATEWAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_AUTH_TOKEN
|
|
191
226
|
EXE_GATEWAY_WS_RELAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_WS_RELAY_AUTH_TOKEN
|
|
192
227
|
EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN=CHANGEME_EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN
|
|
@@ -226,7 +261,7 @@ ERROR_REPORTING_ENABLED=true
|
|
|
226
261
|
MONITOR_ERROR_URL=http://exe-monitor-hub:8090/api/exe-monitor/errors
|
|
227
262
|
|
|
228
263
|
# --- ERP (optional — Exe ERP, Frappe/ERPNext fork) ---
|
|
229
|
-
ERP_IMAGE_TAG=ghcr.io/askexe/exe-erp:
|
|
264
|
+
ERP_IMAGE_TAG=ghcr.io/askexe/exe-erp:v2026.08.07-d185286-stamped@sha256:1c655f3f7819c797afd13c79561354f0276cf337403f32aee3e406a497e8827b
|
|
230
265
|
ERP_ADMIN_PASSWORD=CHANGEME_ERP_ADMIN_PASSWORD
|
|
231
266
|
EXE_ERP_ADMIN_TOKEN=CHANGEME_EXE_ERP_ADMIN_TOKEN
|
|
232
267
|
# Frappe site name — must match the erp.<domain> the customer serves (bug e61ad373).
|
|
@@ -248,7 +283,7 @@ EXE_BUILD_HTTP_PORT=9222
|
|
|
248
283
|
# data dir and entrypoint all changed) and crashloops on any existing
|
|
249
284
|
# deployment. v0.9.4 is the last known-good generation and is what the signed
|
|
250
285
|
# apps manifest pins. See deploy/known-bad-images.json.
|
|
251
|
-
MONITOR_HUB_IMAGE_TAG=ghcr.io/askexe/exe-monitor-hub:
|
|
286
|
+
MONITOR_HUB_IMAGE_TAG=ghcr.io/askexe/exe-monitor-hub:v2026.08.09-10660eb4-stamped@sha256:c9a9218c2713b8dffea7e1cf8c0702a614657d311a7a4e821c6a543bab29bb97
|
|
252
287
|
MONITOR_HUB_PORT=8090
|
|
253
288
|
# Bootstrap superuser created on first start. Use your admin email + a strong password.
|
|
254
289
|
# After first boot these values are no longer used (stored in pb_data volume).
|
|
@@ -268,7 +303,7 @@ MONITOR_HUB_ADMIN_PASSWORD=CHANGEME_MONITOR_HUB_ADMIN_PASSWORD
|
|
|
268
303
|
# COMPOSE_PROFILES=monitor-agent
|
|
269
304
|
# bug 633995f1 / 9ce2a68b: keep the agent on the v0.9.4 generation — the
|
|
270
305
|
# compose healthcheck (`/app/beszel-agent health`) is coupled to it.
|
|
271
|
-
MONITOR_AGENT_IMAGE_TAG=ghcr.io/askexe/exe-monitor-agent:
|
|
306
|
+
MONITOR_AGENT_IMAGE_TAG=ghcr.io/askexe/exe-monitor-agent:v2026.08.09-10660eb4-stamped@sha256:29fbd445f79484df04f000603e4ff445e76f0380f86d687a0033e3a0ef7d1b7a
|
|
272
307
|
# Reports to the local hub. Auto-populated by `exe-os stack-update` during bootstrap.
|
|
273
308
|
MONITOR_HUB_URL=http://exe-monitor-hub:8090
|
|
274
309
|
# 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
|
|
@@ -278,7 +278,7 @@ services:
|
|
|
278
278
|
# is what the signed apps manifest (deploy/stack-manifests/v0.9.30-apps.json)
|
|
279
279
|
# and exe-monitor's own stack.release.json pin. Do not reintroduce the bad
|
|
280
280
|
# digest.
|
|
281
|
-
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}
|
|
282
282
|
container_name: exe-monitor-hub
|
|
283
283
|
restart: unless-stopped
|
|
284
284
|
# bug d3d49101 / 1fdb8be9: PocketBase's data dir for this hub is a RELATIVE
|
|
@@ -360,7 +360,7 @@ services:
|
|
|
360
360
|
# ------------------------------------------------------------------
|
|
361
361
|
|
|
362
362
|
exe-crm:
|
|
363
|
-
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}
|
|
364
364
|
container_name: exe-crm
|
|
365
365
|
restart: unless-stopped
|
|
366
366
|
# bug ad4471ad: NO compose `command` override. The image entrypoint
|
|
@@ -467,6 +467,13 @@ services:
|
|
|
467
467
|
STORAGE_TYPE: local
|
|
468
468
|
STORAGE_LOCAL_PATH: /app/.local-storage
|
|
469
469
|
BRANDING_CONFIG_PATH: /app/branding.json
|
|
470
|
+
# Bug 2355a199 / exe-crm PR #125: exe-crm sits behind two hops of reverse
|
|
471
|
+
# proxy (cloudflared -> exe-sso-edge -> exe-crm), so the raw peer address
|
|
472
|
+
# Node sees is exe-sso-edge, not the real client. Without telling the app
|
|
473
|
+
# how many trusted hops to peel off X-Forwarded-For, rate limiting keys on
|
|
474
|
+
# the wrong address (the edge, shared by every request) instead of the
|
|
475
|
+
# actual client.
|
|
476
|
+
EXE_TRUSTED_PROXY_HOPS: "2"
|
|
470
477
|
ports:
|
|
471
478
|
- "127.0.0.1:${CRM_HOST_PORT:-3000}:3000"
|
|
472
479
|
volumes:
|
|
@@ -486,7 +493,7 @@ services:
|
|
|
486
493
|
options: { max-size: "10m", max-file: "3" }
|
|
487
494
|
|
|
488
495
|
exe-crm-worker:
|
|
489
|
-
image: ${CRM_IMAGE_TAG
|
|
496
|
+
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}
|
|
490
497
|
container_name: exe-crm-worker
|
|
491
498
|
restart: unless-stopped
|
|
492
499
|
command: ["yarn", "worker:prod"]
|
|
@@ -552,7 +559,7 @@ services:
|
|
|
552
559
|
# erroring, so "wiki looks wiped" and "wiki is misconfigured" are indistinguishable
|
|
553
560
|
# at a glance, and the wrong diagnosis (restore from backup) destroys real data.
|
|
554
561
|
exe-wiki-schema-guard:
|
|
555
|
-
image: ${EXE_DB_IMAGE
|
|
562
|
+
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}
|
|
556
563
|
container_name: exe-wiki-schema-guard
|
|
557
564
|
restart: "no"
|
|
558
565
|
depends_on:
|
|
@@ -588,7 +595,7 @@ services:
|
|
|
588
595
|
options: { max-size: "10m", max-file: "3" }
|
|
589
596
|
|
|
590
597
|
exe-wiki:
|
|
591
|
-
image: ${WIKI_IMAGE_TAG
|
|
598
|
+
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}
|
|
592
599
|
container_name: exe-wiki
|
|
593
600
|
restart: unless-stopped
|
|
594
601
|
# Wiki uses Prisma — runs migrate on boot via built-in entrypoint.
|
|
@@ -684,25 +691,78 @@ services:
|
|
|
684
691
|
JWT_SECRET: ${WIKI_JWT_SECRET:?WIKI_JWT_SECRET is required}
|
|
685
692
|
SIG_KEY: ${WIKI_SIG_KEY:?WIKI_SIG_KEY is required}
|
|
686
693
|
SIG_SALT: ${WIKI_SIG_SALT:?WIKI_SIG_SALT is required}
|
|
687
|
-
# Embeddings
|
|
688
|
-
#
|
|
689
|
-
#
|
|
690
|
-
#
|
|
691
|
-
#
|
|
692
|
-
#
|
|
693
|
-
#
|
|
694
|
-
#
|
|
695
|
-
#
|
|
696
|
-
|
|
694
|
+
# Embeddings + vector DB (bugs bed3cb4a, c604df37). This used to default to
|
|
695
|
+
# exeOsMcp + native, on the assumption that exeOsMcp was the only functional
|
|
696
|
+
# embedding path. Two things changed that:
|
|
697
|
+
# 1. exe-wiki PR #78 ("revive the embedding pipeline, unbreak pgvector
|
|
698
|
+
# retrieval", merged 2026-08-31) restored the real EMBEDDING_ENGINE
|
|
699
|
+
# switch in getEmbeddingEngineSelection() (it had been reduced to an
|
|
700
|
+
# unconditional exeOsMcp shim) and fixed pgvector's table-schema
|
|
701
|
+
# resolution (server/utils/vectorDbProviders/pgvector). native + pgvector
|
|
702
|
+
# is now the wiki's own documented default (docker/.env.example) and a
|
|
703
|
+
# genuinely self-contained combo: native runs @xenova/transformers
|
|
704
|
+
# in-process — no API key, no exe-os MCP daemon, no separate database.
|
|
705
|
+
# 2. bug c604df37: the exeOsMcp path was never actually reachable in
|
|
706
|
+
# production. server/utils/vectorDbProviders/exeOsMcpClient spawns
|
|
707
|
+
# `npx @askexenow/exe-os@<pin> mcp`, but in exe-os `args[0] === "mcp"`
|
|
708
|
+
# (src/bin/cli.ts) routes to the Claude Code MCP config-manager CLI
|
|
709
|
+
# (src/bin/exe-mcp.ts), not the JSON-RPC stdio server
|
|
710
|
+
# (src/mcp/server.ts, exposed only as a package export with no bin
|
|
711
|
+
# entry). The handshake never completes and every embed call no-ops.
|
|
712
|
+
# Default to pgvector so a fresh deploy actually vectorizes documents.
|
|
713
|
+
# exeOsMcp remains selectable via WIKI_VECTOR_DB for an operator who fixes
|
|
714
|
+
# the client-side routing bug above first.
|
|
715
|
+
VECTOR_DB: ${WIKI_VECTOR_DB:-pgvector}
|
|
697
716
|
EMBEDDING_ENGINE: ${WIKI_EMBEDDING_ENGINE:-native}
|
|
698
|
-
#
|
|
699
|
-
#
|
|
700
|
-
# the
|
|
701
|
-
#
|
|
702
|
-
#
|
|
703
|
-
#
|
|
704
|
-
#
|
|
705
|
-
#
|
|
717
|
+
# pgvector reuses the SAME exe-db Postgres instance the wiki's own
|
|
718
|
+
# DATABASE_URL points at — exe-db already runs pgvector/pgvector:pg16 (see
|
|
719
|
+
# the exe-db image comment above), so `CREATE EXTENSION IF NOT EXISTS
|
|
720
|
+
# vector` in server/utils/vectorDbProviders/pgvector/index.js succeeds with
|
|
721
|
+
# no separate database or extra service to provision.
|
|
722
|
+
#
|
|
723
|
+
# NOTE this is NOT the same shape as DATABASE_URL above: PGVECTOR_CONNECTION_STRING
|
|
724
|
+
# is handed straight to the `pg` client, not Prisma, so it does not understand
|
|
725
|
+
# a `?schema=` query param (Prisma-only syntax) — it is deliberately omitted.
|
|
726
|
+
# pgvector resolves its own table (default name `exe-wiki_vectors`, see
|
|
727
|
+
# PGVECTOR_TABLE_NAME) through the connection's default search_path, i.e. the
|
|
728
|
+
# same `public` schema the wiki's own Prisma tables live in (WIKI_DB_SCHEMA
|
|
729
|
+
# above). See server/utils/vectorDbProviders/pgvector/SETUP.md for the
|
|
730
|
+
# provider's own setup notes.
|
|
731
|
+
PGVECTOR_CONNECTION_STRING: ${WIKI_PGVECTOR_CONNECTION_STRING:-postgres://${POSTGRES_USER:-exe}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@exe-db:5432/${POSTGRES_DB:-exedb}?sslmode=disable}
|
|
732
|
+
# LLM provider (bug bed3cb4a, corrected per founder direction 2026-08-31:
|
|
733
|
+
# wiki's RAG/chat must use GLM, not Anthropic-via-gateway).
|
|
734
|
+
#
|
|
735
|
+
# A fresh deploy shipped NO LLM_PROVIDER at all, so AnythingLLM's
|
|
736
|
+
# getLLMProvider() fell back to the OpenAI provider, which throws "No
|
|
737
|
+
# OpenAI API key was set" on every chat/RAG request. exe-wiki PR #78 added
|
|
738
|
+
# a real, working `zai` provider directly (no gateway hop needed — GLM/Z.ai
|
|
739
|
+
# exposes its own OpenAI-Messages-compatible endpoint that the wiki client
|
|
740
|
+
# speaks natively), verified end-to-end against a real uploaded PDF
|
|
741
|
+
# including a negative control (correctly declines to answer an
|
|
742
|
+
# out-of-corpus question rather than hallucinating). Use that.
|
|
743
|
+
#
|
|
744
|
+
# An earlier draft of this config pointed wiki at exe-gateway with
|
|
745
|
+
# LLM_PROVIDER=anthropic instead, reasoning that the gateway only speaks
|
|
746
|
+
# the Anthropic Messages protocol. That reasoning is correct AS FAR AS THE
|
|
747
|
+
# GATEWAY GOES, but it's the wrong fix: it routes around wiki's own
|
|
748
|
+
# already-built, already-verified GLM integration instead of using it, and
|
|
749
|
+
# it does not match what the founder explicitly asked for. If exe-wiki
|
|
750
|
+
# ever needs to go through exe-gateway instead of calling Z.ai directly
|
|
751
|
+
# (e.g. for centralized billing/rate-limiting), that's a deliberate future
|
|
752
|
+
# change, not the default.
|
|
753
|
+
LLM_PROVIDER: ${WIKI_LLM_PROVIDER:-zai}
|
|
754
|
+
# Z.ai key is an account credential, not a generatable secret — left empty
|
|
755
|
+
# so the operator fills it in; compose reads it as ${ZAI_API_KEY:-} rather
|
|
756
|
+
# than failing closed. WARN-first check for this lives in generate-env.ts.
|
|
757
|
+
ZAI_API_KEY: ${ZAI_API_KEY:-}
|
|
758
|
+
ZAI_MODEL_PREF: ${ZAI_MODEL_PREF:-glm-4.6}
|
|
759
|
+
# bug 62ba51e9: default to the Coding Plan path (the entitlement we hold).
|
|
760
|
+
# ZAI_BASE_PATH is only honoured by a wiki image carrying exe-wiki PR #78;
|
|
761
|
+
# older images hardcode the PAYG path and will 1113 regardless of this.
|
|
762
|
+
ZAI_BASE_PATH: ${ZAI_BASE_PATH:-https://api.z.ai/api/coding/paas/v4}
|
|
763
|
+
# stdio spawn of the exe-os MCP server. Only used if WIKI_VECTOR_DB is
|
|
764
|
+
# overridden back to exeOsMcp — see bug c604df37 above before doing that;
|
|
765
|
+
# the spawn args below currently point at the wrong CLI entrypoint.
|
|
706
766
|
EXE_OS_MCP_COMMAND: ${WIKI_EXE_OS_MCP_COMMAND:-npx}
|
|
707
767
|
EXE_OS_MCP_ARGS: ${WIKI_EXE_OS_MCP_ARGS:--y @askexenow/exe-os@${WIKI_EXE_OS_NPM_VERSION:-0.9.324} mcp}
|
|
708
768
|
BRANDING_CONFIG_PATH: /app/branding.json
|
|
@@ -728,7 +788,15 @@ services:
|
|
|
728
788
|
# to pin the split server image; falls back to the combined EXE_OS_IMAGE_TAG
|
|
729
789
|
# for backward compatibility with existing manifests.
|
|
730
790
|
exe-os:
|
|
731
|
-
|
|
791
|
+
# FAIL-CLOSED PIN. The signed stack manifest is the single source of truth for
|
|
792
|
+
# this image; stack-update writes EXE_OS_IMAGE_TAG from it. The legacy aliases are
|
|
793
|
+
# kept so an older .env keeps working, and the chain terminates EMPTY on purpose:
|
|
794
|
+
# docker compose evaluates nested defaults eagerly, so `:?` inside a chain would
|
|
795
|
+
# fire even when an alias IS set. With no pin at all compose aborts with
|
|
796
|
+
# "has neither an image nor a build context specified" — loud, not a silent
|
|
797
|
+
# substitution of a stale hard-coded version (which is how auth nearly shipped a
|
|
798
|
+
# four-minor-version downgrade).
|
|
799
|
+
image: ${EXE_OS_SERVER_IMAGE_TAG:-${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-}}}
|
|
732
800
|
container_name: exe-os
|
|
733
801
|
restart: unless-stopped
|
|
734
802
|
# bug debf4a39 / 93ddfa27: the daemon connects to exe-db at boot
|
|
@@ -847,7 +915,7 @@ services:
|
|
|
847
915
|
options: { max-size: "10m", max-file: "3" }
|
|
848
916
|
|
|
849
917
|
exe-gateway:
|
|
850
|
-
image: ${GATEWAY_IMAGE_TAG
|
|
918
|
+
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}
|
|
851
919
|
container_name: exe-gateway
|
|
852
920
|
restart: unless-stopped
|
|
853
921
|
# Gateway needs 45s to flush outbound queues + disconnect Baileys adapters.
|
|
@@ -1011,7 +1079,7 @@ services:
|
|
|
1011
1079
|
# v0.9.5 default contradicted that healthcheck, so the agent was
|
|
1012
1080
|
# permanently unhealthy from the first recreate. Matches the signed apps
|
|
1013
1081
|
# manifest and exe-monitor's stack.release.json.
|
|
1014
|
-
image: ${MONITOR_AGENT_IMAGE_TAG
|
|
1082
|
+
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}
|
|
1015
1083
|
container_name: exe-monitor-agent
|
|
1016
1084
|
# Host-access consent gate: only starts when the operator has
|
|
1017
1085
|
# acknowledged the host-access scope (COMPOSE_PROFILES=monitor-agent).
|
|
@@ -1116,7 +1184,15 @@ services:
|
|
|
1116
1184
|
# Without a token the binary exits 0 (no crash-loop). (bug 3416cead)
|
|
1117
1185
|
# ------------------------------------------------------------------
|
|
1118
1186
|
exe-update:
|
|
1119
|
-
|
|
1187
|
+
# FAIL-CLOSED PIN. The signed stack manifest is the single source of truth for
|
|
1188
|
+
# this image; stack-update writes EXE_OS_IMAGE_TAG from it. The legacy aliases are
|
|
1189
|
+
# kept so an older .env keeps working, and the chain terminates EMPTY on purpose:
|
|
1190
|
+
# docker compose evaluates nested defaults eagerly, so `:?` inside a chain would
|
|
1191
|
+
# fire even when an alias IS set. With no pin at all compose aborts with
|
|
1192
|
+
# "has neither an image nor a build context specified" — loud, not a silent
|
|
1193
|
+
# substitution of a stale hard-coded version (which is how auth nearly shipped a
|
|
1194
|
+
# four-minor-version downgrade).
|
|
1195
|
+
image: ${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-}}
|
|
1120
1196
|
container_name: exe-update
|
|
1121
1197
|
profiles: ["registry-proxy", "askexe-control-plane"]
|
|
1122
1198
|
restart: unless-stopped
|
|
@@ -1205,6 +1281,8 @@ services:
|
|
|
1205
1281
|
- ./sso-edge/default.conf.template:/etc/nginx/exe-templates/default.conf.template:ro
|
|
1206
1282
|
- ./sso-edge/sso-redirect.conf:/etc/nginx/snippets/sso-redirect.conf:ro
|
|
1207
1283
|
- ./sso-edge/entrypoint.sh:/docker-entrypoint.d/99-render-sso-edge.sh:ro
|
|
1284
|
+
# Branded shared error pages (packages/exe-error-pages, vendored by its sync.mjs; bug 64324162).
|
|
1285
|
+
- ./sso-edge/error-pages:/usr/share/nginx/html/error-pages:ro
|
|
1208
1286
|
# nginx:alpine runs /docker-entrypoint.d/*.sh then `nginx -g 'daemon off;'`.
|
|
1209
1287
|
# Our script renders the template from ${DOMAIN}; it does not exec nginx
|
|
1210
1288
|
# itself (the base entrypoint does), so it ends after `nginx -t`.
|
|
@@ -1675,7 +1753,7 @@ services:
|
|
|
1675
1753
|
exe-otel-collector:
|
|
1676
1754
|
# bug 32d6e02f: digest-pinned default (was tag-only) — matches the
|
|
1677
1755
|
# stack manifest pin for otel/opentelemetry-collector-contrib:0.114.0.
|
|
1678
|
-
image: ${OTEL_COLLECTOR_IMAGE
|
|
1756
|
+
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}
|
|
1679
1757
|
container_name: exe-otel-collector
|
|
1680
1758
|
restart: unless-stopped
|
|
1681
1759
|
command: ["--config=/etc/otelcol-contrib/config.yaml"]
|
|
@@ -1743,7 +1821,7 @@ services:
|
|
|
1743
1821
|
# a fresh/migrated install boots an old image while the manifest reads "latest".
|
|
1744
1822
|
# generate-env.ts now always writes AUTH_IMAGE_TAG, and this default mirrors the
|
|
1745
1823
|
# pin as defense-in-depth — keep BOTH in lockstep on every auth release.
|
|
1746
|
-
image: ${AUTH_IMAGE_TAG
|
|
1824
|
+
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}
|
|
1747
1825
|
container_name: exe-auth
|
|
1748
1826
|
restart: unless-stopped
|
|
1749
1827
|
environment:
|
|
@@ -1813,6 +1891,79 @@ services:
|
|
|
1813
1891
|
driver: json-file
|
|
1814
1892
|
options: { max-size: "10m", max-file: "3" }
|
|
1815
1893
|
|
|
1894
|
+
# ------------------------------------------------------------------
|
|
1895
|
+
# Dashboard — customer dashboard at dashboard.yourdomain.com
|
|
1896
|
+
# Static nginx image built from dashboard-page/ in the exe-os repo.
|
|
1897
|
+
# ------------------------------------------------------------------
|
|
1898
|
+
#
|
|
1899
|
+
# WHY THIS IS HERE AT ALL (2026-08-20). exe-dashboard has been running in
|
|
1900
|
+
# production for months WITHOUT a service in this file. Its only compose
|
|
1901
|
+
# definition was dashboard-page/docker-compose.yml — a standalone side-car
|
|
1902
|
+
# that carried `build: .` and a hardcoded `image: …:v0.1.0`, joined the
|
|
1903
|
+
# external `exe-net` network, and answered the `upstream sso_dashboard`
|
|
1904
|
+
# in sso-edge/default.conf.template. Nothing in the stack manifest could pin
|
|
1905
|
+
# a service the stack compose did not define, which is exactly why the
|
|
1906
|
+
# dashboard drifted three builds behind main with nobody able to see it.
|
|
1907
|
+
# This entry makes it a first-class, manifest-governed stack service.
|
|
1908
|
+
#
|
|
1909
|
+
# OPT-IN VIA PROFILE. `profiles: ["dashboard"]` keeps this off for every
|
|
1910
|
+
# existing deployment that has not opted in. That is deliberate and it is why
|
|
1911
|
+
# the image pin uses the empty-default form and NOT the required-variable
|
|
1912
|
+
# (colon-question-mark) form: compose interpolates the WHOLE file before it
|
|
1913
|
+
# filters by profile (verified on Docker 28.5.1 — a required-variable
|
|
1914
|
+
# reference inside an INACTIVE profile still aborts `docker compose config`),
|
|
1915
|
+
# so that form here would break every customer who never asked for the
|
|
1916
|
+
# dashboard. The empty terminator gets the same fail-loud
|
|
1917
|
+
# behaviour exactly where it belongs: with the profile ACTIVE and the variable
|
|
1918
|
+
# unset, compose refuses with `service "exe-dashboard" has neither an image nor
|
|
1919
|
+
# a build context specified` instead of silently substituting a stale literal.
|
|
1920
|
+
exe-dashboard:
|
|
1921
|
+
image: ${DASHBOARD_IMAGE_TAG:-}
|
|
1922
|
+
profiles: ["dashboard"]
|
|
1923
|
+
container_name: exe-dashboard
|
|
1924
|
+
restart: unless-stopped
|
|
1925
|
+
environment:
|
|
1926
|
+
# Customer apex domain — templates server_name, CSP and the SPA's API/auth
|
|
1927
|
+
# URLs at container start via dashboard-page/docker-entrypoint.sh. Never
|
|
1928
|
+
# falls back to askexe.com.
|
|
1929
|
+
DOMAIN: ${DOMAIN:?DOMAIN is required — set to your customer apex domain (e.g. hygo.co)}
|
|
1930
|
+
# Optional explicit overrides; each defaults to the matching *.${DOMAIN}.
|
|
1931
|
+
DASH_DOMAIN: ${DASH_DOMAIN:-}
|
|
1932
|
+
DASH_API_URL: ${DASH_API_URL:-}
|
|
1933
|
+
DASH_AUTH_URL: ${DASH_AUTH_URL:-}
|
|
1934
|
+
DASH_DASHBOARD_URL: ${DASH_DASHBOARD_URL:-}
|
|
1935
|
+
ports:
|
|
1936
|
+
- "127.0.0.1:${DASHBOARD_PORT:-3301}:80"
|
|
1937
|
+
networks:
|
|
1938
|
+
# `backend` so exe-sso-edge can resolve `exe-dashboard` for its
|
|
1939
|
+
# `upstream sso_dashboard { server exe-dashboard:80; }`; `frontend` so the
|
|
1940
|
+
# cloudflared tunnel can reach it. Same pair as exe-auth/exe-crm/exe-wiki.
|
|
1941
|
+
#
|
|
1942
|
+
# NOTE: exe-sso-edge deliberately does NOT list this service in its
|
|
1943
|
+
# depends_on. The edge must keep starting on deployments that never enable
|
|
1944
|
+
# the dashboard profile, and a depends_on would make the edge unstartable
|
|
1945
|
+
# for them.
|
|
1946
|
+
- backend
|
|
1947
|
+
- frontend
|
|
1948
|
+
healthcheck:
|
|
1949
|
+
# dashboard-page/nginx.conf serves `location = /health` as a literal 200.
|
|
1950
|
+
# This is the same URL the stack manifest's healthUrl names, so the deploy
|
|
1951
|
+
# gate and the container agree on what "up" means. Before this existed,
|
|
1952
|
+
# /health fell through to the SPA `location /` and returned the index page
|
|
1953
|
+
# with a 200 — a probe that could not fail while nginx was running at all.
|
|
1954
|
+
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1/health"]
|
|
1955
|
+
interval: 30s
|
|
1956
|
+
timeout: 5s
|
|
1957
|
+
start_period: 5s
|
|
1958
|
+
retries: 3
|
|
1959
|
+
deploy:
|
|
1960
|
+
resources:
|
|
1961
|
+
limits:
|
|
1962
|
+
memory: 128M
|
|
1963
|
+
logging:
|
|
1964
|
+
driver: json-file
|
|
1965
|
+
options: { max-size: "10m", max-file: "3" }
|
|
1966
|
+
|
|
1816
1967
|
# ------------------------------------------------------------------
|
|
1817
1968
|
# Volumes
|
|
1818
1969
|
# ------------------------------------------------------------------
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
# chmod +x /opt/exe-stack/gateway-watchdog.sh
|
|
8
8
|
# crontab -l | { cat; echo "*/2 * * * * /opt/exe-stack/gateway-watchdog.sh 2>&1 | logger -t exe-gw-watchdog"; } | crontab -
|
|
9
9
|
#
|
|
10
|
+
# Or via Ansible (preferred — this header alone was never enough; see bug
|
|
11
|
+
# b5b01c2d, part 2: the install line above documented here was never actually
|
|
12
|
+
# run on exe-db-jkt): import_tasks: deploy/ansible/tasks/gateway-watchdog-cron.yml
|
|
13
|
+
#
|
|
10
14
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
11
15
|
# BUG HISTORY (facd5078, P0)
|
|
12
16
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -54,12 +58,25 @@ COOLDOWN_SECS="${EXE_GATEWAY_WATCHDOG_COOLDOWN_SECS:-300}"
|
|
|
54
58
|
STATE_DIR="${EXE_GATEWAY_WATCHDOG_STATE_DIR:-${STACK_DIR}/.gateway-watchdog}"
|
|
55
59
|
STRIKE_FILE="${STATE_DIR}/strikes"
|
|
56
60
|
LAST_RESTART_FILE="${STATE_DIR}/last-restart"
|
|
61
|
+
LAST_RUN_FILE="${STATE_DIR}/last-run"
|
|
57
62
|
|
|
58
63
|
mkdir -p "$STATE_DIR" 2>/dev/null || true
|
|
59
64
|
|
|
60
65
|
ts() { date -u +"%Y-%m-%dT%H:%M:%SZ"; }
|
|
61
66
|
log() { echo "[$(ts)] gateway-watchdog: $*"; }
|
|
62
67
|
|
|
68
|
+
# Heartbeat: proves the cron entry is actually firing, independent of what the
|
|
69
|
+
# probe finds. strikes/last-restart only update on specific outcomes, so a
|
|
70
|
+
# process that stopped being scheduled would leave them looking unremarkable
|
|
71
|
+
# forever. This file updates on EVERY invocation — same "a monitor going quiet
|
|
72
|
+
# must be detectable" pattern as backup.sh's LAST_STATUS file. A stale
|
|
73
|
+
# last-run (older than a few cron intervals) means the cron stopped firing,
|
|
74
|
+
# not that the gateway is healthy.
|
|
75
|
+
write_heartbeat() {
|
|
76
|
+
printf 'last_run=%s\nepoch=%s\n' "$(ts)" "$(date -u +%s)" > "$LAST_RUN_FILE" 2>/dev/null || true
|
|
77
|
+
}
|
|
78
|
+
trap write_heartbeat EXIT
|
|
79
|
+
|
|
63
80
|
# Read a single KEY=VALUE from the stack .env WITHOUT sourcing it (the .env holds
|
|
64
81
|
# many secrets and arbitrary values; sourcing could execute / mangle them).
|
|
65
82
|
read_env() {
|