@askexenow/exe-os 0.9.374 → 0.9.377
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 +16 -1
- package/deploy/compose/.env.example +16 -1
- package/deploy/compose/docker-compose.yml +80 -18
- package/deploy/compose/gateway-watchdog.sh +17 -0
- package/deploy/compose/generate-env.ts +41 -1
- package/deploy/compose/sso-edge/default.conf.template +92 -64
- 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 +115 -92
- package/dist/.dist-verified.json +3 -3
- package/dist/{active-agent-ONPPEWQV.js → active-agent-BOBBUJ74.js} +6 -6
- package/dist/{active-agent-UJKMG7LJ.js → active-agent-GFGEGK2U.js} +6 -6
- package/dist/{agent-defs-generator-ZWI6DXOE.js → agent-defs-generator-OX6UFPRX.js} +5 -5
- package/dist/{agent-loop-OYHJKNYH.js → agent-loop-7ZRH56EX.js} +1 -1
- package/dist/{agentic-ontology-WHFJ3QFS.js → agentic-ontology-DT3VOXBT.js} +1 -1
- package/dist/{backfill-metadata-3OUSQD5V.js → backfill-metadata-VRP6PTPP.js} +9 -9
- package/dist/{backup-verify-ZKTUYLTA.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-ZJ45TFBJ.js → behaviors-GPI4BLTC.js} +16 -14
- 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 +14 -12
- package/dist/bin/backfill-responses.js +14 -12
- package/dist/bin/backfill-vectors.js +16 -14
- package/dist/bin/bulk-sync-postgres.js +21 -19
- package/dist/bin/cc-doctor.js +19 -11
- package/dist/bin/cleanup-stale-review-tasks.js +27 -26
- package/dist/bin/cli.js +83 -109
- package/dist/bin/daemon-restart-handoff.js +2 -1
- package/dist/bin/deferred-daemon-restart.js +118 -110
- package/dist/bin/exe-actions.js +176 -0
- package/dist/bin/exe-agent-config.js +5 -5
- package/dist/bin/exe-agent.js +23 -23
- package/dist/bin/exe-assign.js +16 -14
- package/dist/bin/exe-boot.js +91 -71
- package/dist/bin/exe-call.js +8 -8
- package/dist/bin/exe-cicd.js +1210 -0
- package/dist/bin/exe-cloud.js +70 -37
- package/dist/bin/exe-config-dump.js +5 -5
- package/dist/bin/exe-dispatch.js +28 -27
- package/dist/bin/exe-doctor.js +12 -11
- package/dist/bin/exe-export-behaviors.js +20 -18
- package/dist/bin/exe-forget.js +11 -11
- package/dist/bin/exe-gateway.js +10 -10
- package/dist/bin/exe-healthcheck.js +22 -10
- package/dist/bin/exe-heartbeat.js +33 -32
- package/dist/bin/exe-kill.js +32 -31
- package/dist/bin/exe-launch-agent.js +76 -54
- 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 +28 -27
- package/dist/bin/exe-pending-notifications.js +27 -26
- package/dist/bin/exe-pending-reviews.js +28 -27
- package/dist/bin/exe-rename.js +9 -9
- package/dist/bin/exe-repo-truth.js +1 -1
- package/dist/bin/exe-review.js +31 -30
- package/dist/bin/exe-search.js +10 -10
- package/dist/bin/exe-session-cleanup.js +32 -31
- package/dist/bin/exe-settings.js +21 -19
- package/dist/bin/exe-start-codex.js +31 -25
- package/dist/bin/exe-start-opencode.js +24 -22
- package/dist/bin/exe-start.sh +11 -2
- package/dist/bin/exe-status.js +29 -28
- 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 +170 -16
- package/dist/bin/generate-hook-manifest.js +8 -41
- package/dist/bin/git-sweep.js +28 -27
- package/dist/bin/graph-backfill.js +11 -11
- package/dist/bin/graph-export.js +10 -10
- package/dist/bin/hooks-cli.js +289 -0
- package/dist/bin/import-history.js +14 -14
- package/dist/bin/install.js +130 -116
- 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 +52 -38
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +9 -9
- package/dist/bin/stack-update.js +10 -5
- package/dist/bin/verify-stack.js +3 -1
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-JKVZ4ZAT.js → boot-generation-BN6GKASY.js} +6 -6
- package/dist/{boot-review-sections-2M6BTG73.js → boot-review-sections-OQ5JGSOD.js} +26 -25
- package/dist/{branch-hygiene-U5GFRSTP.js → branch-hygiene-QLD77IMJ.js} +1 -1
- package/dist/build-manifest.json +1186 -1106
- package/dist/{capability-cards-5IMJT6J7.js → capability-cards-EDZ62HKG.js} +5 -5
- package/dist/{capacity-monitor-SAXCQK7O.js → capacity-monitor-6GMTVILS.js} +28 -27
- package/dist/{catchup-brief-U2TXBLHD.js → catchup-brief-SGGBMDUP.js} +32 -31
- package/dist/{cc-binary-detect-6TNIY5JX.js → cc-binary-detect-ZR6WNOUU.js} +1 -3
- package/dist/{chunk-NKETJCB5.js → chunk-2ODXCCMR.js} +18 -3
- package/dist/{hook-integrity-KGAV6ZC2.js → chunk-3L72UBUH.js} +28 -15
- package/dist/chunk-3OX5S7KZ.js +273 -0
- package/dist/{chunk-W75GTHR3.js → chunk-3SRZNJKD.js} +1 -1
- package/dist/{chunk-I4DNJFDR.js → chunk-42IFYZUN.js} +4 -4
- package/dist/{chunk-JHI5WMK5.js → chunk-473JUDCT.js} +5 -5
- package/dist/{chunk-ANLFH23R.js → chunk-4F5CNI65.js} +1 -1
- package/dist/{chunk-AWWKRZMB.js → chunk-4KVSCQND.js} +87 -14
- package/dist/{chunk-ZCERWHY2.js → chunk-4M6RXJEY.js} +33 -23
- package/dist/{chunk-YTSXPJUQ.js → chunk-4YJEEOYT.js} +3 -3
- package/dist/{chunk-6RKKVPYF.js → chunk-4YUGB637.js} +1 -1
- package/dist/{chunk-XXOPG4BW.js → chunk-4ZSOKEDY.js} +3 -3
- package/dist/{chunk-55BEFF4V.js → chunk-5DF4Y6EC.js} +1 -1
- package/dist/{chunk-4QCFFW2H.js → chunk-5QCIWWFA.js} +46 -0
- package/dist/{chunk-3UUX5OY4.js → chunk-5QKLWJ4Z.js} +1 -1
- package/dist/{chunk-YSLGFPWX.js → chunk-5UBWBXLF.js} +3 -3
- package/dist/chunk-5WA4DG2A.js +117 -0
- package/dist/{chunk-4EN3IZ3Q.js → chunk-64ODONK2.js} +67 -1
- package/dist/{chunk-TAMDAOCU.js → chunk-66CGXQUA.js} +239 -39
- package/dist/{chunk-QHJR7IMX.js → chunk-6F3FQCAQ.js} +3 -3
- package/dist/{chunk-WMEYJT4R.js → chunk-6FG34V6D.js} +15 -14
- package/dist/{chunk-NMH5ZQPU.js → chunk-6KQ6WMTI.js} +1 -1
- package/dist/{chunk-IRVOXUSK.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-KTCXJWJG.js → chunk-7UNMSF5O.js} +1 -1
- package/dist/{chunk-JTVIANUB.js → chunk-AEUGIJDO.js} +3 -1
- package/dist/{chunk-DSJI76XL.js → chunk-AHNVFBVB.js} +113 -16
- package/dist/{chunk-IBS2FAI4.js → chunk-AUKRBHHZ.js} +4 -1
- package/dist/{chunk-AKLJ4JH3.js → chunk-BBK2TSK3.js} +1 -1
- package/dist/{chunk-ZL4AGWAH.js → chunk-BNWWVYRN.js} +6 -5
- package/dist/{chunk-PY3FOMRN.js → chunk-BQEZPRUC.js} +4 -4
- package/dist/{chunk-DIXXEE3S.js → chunk-BQXYXJYC.js} +721 -309
- package/dist/{chunk-ORM7ZFKC.js → chunk-BZ546I4Q.js} +32 -0
- package/dist/{chunk-3KDCORDO.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-MXPNVSXI.js → chunk-CIEVY5TD.js} +11 -11
- package/dist/{chunk-UBK7HK3J.js → chunk-CKLJT2DH.js} +2 -2
- package/dist/{chunk-MOGA4Q7F.js → chunk-CKOJP7JI.js} +1 -1
- package/dist/{chunk-V3W3SATA.js → chunk-CL4J4757.js} +1 -1
- package/dist/{chunk-XNNECNDL.js → chunk-CQFWTWC6.js} +13 -13
- package/dist/{chunk-PDVXWXTL.js → chunk-CROVXJ4S.js} +3 -3
- package/dist/{chunk-WJG344NC.js → chunk-CWSLTSL6.js} +8 -8
- package/dist/{chunk-VMTZ4RUW.js → chunk-DDMGQ5Q3.js} +60 -26
- package/dist/{chunk-YKC7QDZH.js → chunk-DN24VTS5.js} +31 -6
- package/dist/{chunk-IN6CAM4F.js → chunk-EHAN752X.js} +7 -7
- package/dist/{chunk-EXTZSNWL.js → chunk-EPHSISMT.js} +2 -2
- package/dist/{chunk-6EZQUNE6.js → chunk-FCMQVEVL.js} +36 -3
- package/dist/{chunk-3L2QU5ZF.js → chunk-FS7XF7SE.js} +1 -1
- package/dist/{chunk-LGS2V2XD.js → chunk-FUKVP54K.js} +66 -19
- package/dist/{chunk-44TLJZJ5.js → chunk-FX2QRSRT.js} +1 -1
- package/dist/{chunk-PWRC5XZO.js → chunk-FXZ6VGFW.js} +16 -8
- package/dist/{chunk-NT7W4RXD.js → chunk-GKDAQL45.js} +1 -1
- package/dist/{chunk-EKE37MO4.js → chunk-GOT5ZHPX.js} +3 -3
- package/dist/{chunk-SLLLOOEI.js → chunk-GPJIBLP4.js} +1 -0
- package/dist/{chunk-EKYYMIVT.js → chunk-GPUOUUHA.js} +10 -1
- package/dist/{chunk-PB5S7YOF.js → chunk-GXNBPTPJ.js} +1 -1
- package/dist/{chunk-4SJ4LK4V.js → chunk-HE34XVD5.js} +5 -5
- package/dist/{chunk-6VHOQ3IM.js → chunk-HHAKXIKX.js} +12 -9
- package/dist/{chunk-TFKCERAK.js → chunk-HHT527PV.js} +38 -41
- package/dist/{chunk-ZSODLMFV.js → chunk-HIVOLPLD.js} +1 -40
- package/dist/{chunk-UCFC2AEI.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-GS7LIT34.js → chunk-IPHLUZ37.js} +1 -1
- package/dist/{chunk-M4IRPXSZ.js → chunk-IZA7XW2Q.js} +3 -3
- package/dist/{chunk-SEQIPGLU.js → chunk-IZLML47J.js} +1 -1
- package/dist/{chunk-4HKTO2SV.js → chunk-JRMHGO5B.js} +1 -1
- package/dist/{chunk-U73AC5AN.js → chunk-JSTTPYL3.js} +16 -16
- package/dist/{chunk-6SCGLHJ7.js → chunk-JVWLHBAV.js} +4 -4
- package/dist/{chunk-OVEQE6YS.js → chunk-K7UNIEB4.js} +254 -48
- package/dist/{chunk-HNWS7YHN.js → chunk-KBR5LIWD.js} +1 -1
- package/dist/{chunk-AKLQSC6W.js → chunk-KI7O64XV.js} +328 -98
- package/dist/{chunk-XXFKSJYA.js → chunk-KK3MIY5C.js} +5 -5
- package/dist/{chunk-U6SUKSZR.js → chunk-KO3OHI6V.js} +3 -3
- package/dist/{chunk-NJFJWQNN.js → chunk-L5CGXEZC.js} +27 -22
- package/dist/{chunk-NBXDXKLC.js → chunk-LK3XQDBP.js} +1 -1
- package/dist/{chunk-T3QUKNLI.js → chunk-LM443ORV.js} +1 -1
- package/dist/{chunk-BBSIEYF5.js → chunk-LNAFLXL7.js} +12 -4
- package/dist/{chunk-32YV32VA.js → chunk-LTUA5EYI.js} +122 -11
- package/dist/{chunk-23MVDXLY.js → chunk-MAXD5JQL.js} +11 -10
- package/dist/{chunk-GNUAL43X.js → chunk-MFASHRJ6.js} +5 -5
- package/dist/chunk-MFYMDGE7.js +37 -0
- package/dist/{chunk-VKJGHAZT.js → chunk-MGVILAYU.js} +57 -13
- package/dist/{chunk-DB55JZHU.js → chunk-MSLWRWTI.js} +1 -1
- package/dist/{chunk-C2L622QJ.js → chunk-NB5IRTC4.js} +52 -44
- package/dist/{chunk-2ZOEC4KC.js → chunk-ND75TGPR.js} +2 -2
- package/dist/{chunk-VRTCVZND.js → chunk-NE34MWVL.js} +142 -16
- package/dist/{chunk-S2WBS6BG.js → chunk-NMOFLWDY.js} +1 -1
- package/dist/{chunk-CRCB5S7I.js → chunk-NPXKGBVZ.js} +140 -23
- package/dist/{chunk-JSMDRKPJ.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-R522MWAR.js → chunk-OATET4BV.js} +2 -2
- package/dist/chunk-OOZU5H3T.js +86 -0
- package/dist/{chunk-XFTEX77S.js → chunk-OQ4FNDRG.js} +28 -6
- package/dist/{chunk-VYQ7B7DI.js → chunk-OWVX52XF.js} +4 -4
- package/dist/{chunk-AETLDRZB.js → chunk-PEAAX6UA.js} +1 -1
- package/dist/{chunk-UM3N6VND.js → chunk-PFAVHC5N.js} +5 -5
- package/dist/chunk-PMVVUIHH.js +85 -0
- package/dist/chunk-PPMGQFLJ.js +2317 -0
- package/dist/{chunk-7TSBV3SD.js → chunk-PTY2N23C.js} +310 -2
- package/dist/{chunk-UKLN57Q5.js → chunk-PZ5SKYK6.js} +4 -4
- package/dist/{chunk-636LKCKE.js → chunk-Q6ZLQMP2.js} +1 -1
- package/dist/{chunk-N7VEP5B3.js → chunk-QFR5EKZG.js} +29 -7
- package/dist/{chunk-YMP2QSOP.js → chunk-QN56VQ6Z.js} +1 -1
- package/dist/{chunk-6YVUR3OU.js → chunk-QR3BUMOS.js} +2 -2
- package/dist/{chunk-XZ65ST2I.js → chunk-QV5CQLQH.js} +2 -2
- package/dist/{chunk-DJOIMFKV.js → chunk-REZIGNA6.js} +2 -2
- package/dist/{chunk-UQGSBM3U.js → chunk-RFPMXR6B.js} +11 -0
- package/dist/{chunk-DN4YVV4Z.js → chunk-RSABKW6B.js} +1 -1
- package/dist/{chunk-LP4GB656.js → chunk-RZNP35SI.js} +2 -2
- package/dist/{chunk-NUTZJZKW.js → chunk-SKTAZGFI.js} +10 -42
- package/dist/{chunk-TQAZTRQ3.js → chunk-SVXUT2DN.js} +4 -4
- package/dist/{chunk-DJ7YXOTU.js → chunk-T7EF5CQO.js} +3 -3
- package/dist/{chunk-QAEWWYHL.js → chunk-TDF2XKLK.js} +5 -1
- package/dist/{chunk-ZGYNKA3O.js → chunk-TT5BBVLX.js} +29 -31
- package/dist/{chunk-5H47VHB7.js → chunk-UWX6MMCX.js} +1 -1
- package/dist/{chunk-XL5MFGMR.js → chunk-V4YNN7PA.js} +10 -3
- package/dist/{chunk-SL6KQYDU.js → chunk-V5DDXXMP.js} +7 -7
- package/dist/{chunk-DZKPOSFD.js → chunk-VH6SPPNA.js} +1 -1
- package/dist/{chunk-LDNYSMPZ.js → chunk-VJUUI2VT.js} +1 -1
- package/dist/{chunk-CBCGDEJA.js → chunk-VN5WOOAQ.js} +42 -6
- package/dist/{chunk-EXDW3E2R.js → chunk-VPHJ2LUI.js} +165 -15
- package/dist/{chunk-GOMQ7PVQ.js → chunk-WJC6AAJN.js} +1 -1
- package/dist/{chunk-GJI77VDO.js → chunk-WVBVUVZB.js} +6 -5
- package/dist/{chunk-A6PDF4BO.js → chunk-XTQ7R2PA.js} +2 -2
- package/dist/{chunk-L6RXG36J.js → chunk-Y2HD2YB7.js} +1 -1
- package/dist/{chunk-KTU3EAWK.js → chunk-YAACLBZ7.js} +5 -5
- package/dist/{chunk-7GE2EQ23.js → chunk-YGVAKKGJ.js} +11 -6
- package/dist/chunk-YLHACCCB.js +166 -0
- package/dist/{chunk-PLZSZOZN.js → chunk-YP6UGVEY.js} +3 -3
- package/dist/{chunk-ULIBLJ6W.js → chunk-YYC553FO.js} +5 -5
- package/dist/{chunk-T35RCQFE.js → chunk-YZPEQW7H.js} +9 -8
- package/dist/{chunk-KI5PFRG6.js → chunk-ZKGWHT56.js} +60 -2
- package/dist/{chunk-NUK7EEN5.js → chunk-ZKJ5S23O.js} +33 -13
- package/dist/chunk-ZLPS3GR7.js +146 -0
- package/dist/{chunk-XH7YL7JM.js → chunk-ZMX22HSS.js} +50 -6
- package/dist/{chunk-JY5GAZYC.js → chunk-ZQEJ4IX2.js} +4 -0
- package/dist/{chunk-R4CBHKZ2.js → chunk-ZS5JO6QV.js} +7 -6
- package/dist/{cleanup-graph-garbage-DPJGO52H.js → cleanup-graph-garbage-LAPIZGFX.js} +12 -12
- package/dist/{cloud-sync-command-JPNTT4OQ.js → cloud-sync-command-QAZ2NWRA.js} +11 -2
- package/dist/{cloud-sync-db-init-V2LWIUQU.js → cloud-sync-db-init-HAGVF32Y.js} +1 -1
- package/dist/{cloud-sync-shutdown-BNALPWGX.js → cloud-sync-shutdown-DAEPCFVK.js} +5 -5
- package/dist/{co-activation-CMNSWS6B.js → co-activation-523TKQPZ.js} +5 -5
- package/dist/{co-occurrence-WRI2NAN6.js → co-occurrence-PQUCTENN.js} +36 -17
- package/dist/{code-context-index-NOJSHLPN.js → code-context-index-LIDOFKOR.js} +6 -4
- package/dist/{code-context-watcher-VZNZU3BO.js → code-context-watcher-4F7K2N3U.js} +6 -4
- package/dist/{content-extractor-NXYNEF5K.js → content-extractor-DJM5EUDA.js} +2 -2
- package/dist/{conversation-entity-extractor-74252CAO.js → conversation-entity-extractor-THGKQ5RD.js} +5 -5
- package/dist/{crdt-sync-B3JN6AIV.js → crdt-sync-32B55NOJ.js} +1 -1
- package/dist/{crm-webhook-GYWQRFET.js → crm-webhook-FHRISFYQ.js} +2 -2
- package/dist/{cto-delegation-gate-LQHVLEMW.js → cto-delegation-gate-O6XPGECP.js} +27 -26
- package/dist/{daemon-auth-QZHEO7IQ.js → daemon-auth-PNKHERLV.js} +6 -1
- package/dist/daemon-drift-N2GKUBAO.js +15 -0
- package/dist/{daemon-orchestration-5HIQALZH.js → daemon-orchestration-BWLSJG2X.js} +33 -30
- package/dist/{daemon-ready-P2BR2XP5.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-PQHDHQPQ.js → doc-graph-extractor-HOKOV7BE.js} +10 -10
- package/dist/{documents-C4SSPJMC.js → documents-HWEJMONR.js} +16 -14
- package/dist/{dreaming-XAO3FCBV.js → dreaming-FMNDODG2.js} +31 -30
- package/dist/{employee-boot-brief-W4OHUMRQ.js → employee-boot-brief-DBFROOQJ.js} +35 -34
- package/dist/{entity-boost-3UWGXG5O.js → entity-boost-5V4W6NFA.js} +1 -1
- package/dist/{exe-drift-AG2KMKD5.js → exe-drift-V55UAYRT.js} +6 -6
- package/dist/{exe-export-IC5BT335.js → exe-export-LHN42ZUS.js} +18 -16
- package/dist/{exe-import-A35ZLDPG.js → exe-import-M536BEZC.js} +18 -16
- package/dist/{exe-key-TCMJNYLA.js → exe-key-37XIR22X.js} +111 -107
- package/dist/{exe-org-JXCR3JYZ.js → exe-org-7TDIRNTE.js} +14 -14
- package/dist/{exe-snapshot-SV6SRIG6.js → exe-snapshot-EOUBCIQK.js} +34 -33
- package/dist/{fast-db-init-L2RGKJWH.js → fast-db-init-GWUZ746B.js} +1 -1
- package/dist/{founder-context-D4HFIESJ.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-TN7CYGFG.js → git-staleness-QNNXJK3W.js} +5 -5
- package/dist/{global-procedures-YFDEIOG7.js → global-procedures-NMQGF54V.js} +7 -7
- package/dist/{gotrue-session-ODZ2ERJX.js → gotrue-session-U4H3UGHL.js} +1 -3
- package/dist/{graph-auto-extract-3YR3TYRW.js → graph-auto-extract-7POGAKHM.js} +10 -10
- package/dist/{graph-query-AP5R6ZHO.js → graph-query-ZEDO4BDF.js} +1 -1
- package/dist/{graph-rag-Z2KCJTPK.js → graph-rag-JA7XN7NO.js} +5 -5
- package/dist/hook-integrity-6NLSNTXD.js +15 -0
- package/dist/{hook-prefetch-K5DN3TOQ.js → hook-prefetch-4KH3D4YU.js} +28 -26
- package/dist/hook-tamper-log-Z4PWC7N4.js +90 -0
- package/dist/hooks/bug-report-worker.js +31 -30
- package/dist/hooks/codex-stop-task-finalizer.js +33 -32
- package/dist/hooks/commit-complete.js +30 -29
- package/dist/hooks/error-recall.js +12 -12
- package/dist/hooks/exe-heartbeat-hook.js +7 -7
- package/dist/hooks/ingest-worker.js +17 -15
- 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 +30 -29
- package/dist/hooks/pre-tool-use.js +303 -489
- package/dist/hooks/prompt-submit.js +61 -54
- package/dist/hooks/session-end.js +35 -34
- package/dist/hooks/session-start.js +18 -18
- package/dist/hooks/stop.js +36 -35
- package/dist/hooks/subagent-stop.js +32 -31
- package/dist/hooks/summary-worker.js +36 -35
- package/dist/index.js +39 -38
- package/dist/{installer-LK35OX6R.js → installer-M34Q7LAS.js} +25 -10
- package/dist/{installer-54HTN5RE.js → installer-POV6TDQ5.js} +12 -8
- package/dist/{installer-LLWKZI2S.js → installer-S624ZOMB.js} +12 -8
- package/dist/{intercom-queue-5NOT2RKI.js → intercom-queue-MKDWAEUV.js} +26 -25
- package/dist/lib/cloud-sync.js +27 -19
- package/dist/lib/consolidation.js +12 -12
- package/dist/lib/database.js +5 -5
- package/dist/lib/db-backup.js +7 -1
- package/dist/lib/db-daemon-client.js +8 -6
- 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 +6 -4
- package/dist/lib/employee-templates.js +8 -8
- package/dist/lib/employees.js +5 -5
- package/dist/lib/exe-daemon-client.js +5 -3
- package/dist/lib/exe-daemon.js +333 -262
- package/dist/lib/hybrid-search.js +10 -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 +27 -26
- 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 +17 -15
- 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 +28 -27
- package/dist/lib/tmux-routing.js +26 -25
- package/dist/lib/tmux-status.js +5 -1
- package/dist/lib/token-spend.js +6 -6
- package/dist/{license-gate-JVMB6OFD.js → license-gate-2QNMBAZU.js} +3 -3
- package/dist/{license-sync-5VYS2F2W.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 +110 -106
- package/dist/mcp/server.js +113 -109
- 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 +30 -29
- package/dist/mcp/tools/deactivate-behavior.js +18 -16
- package/dist/mcp/tools/list-reminders.js +7 -7
- package/dist/mcp/tools/list-tasks.js +30 -29
- package/dist/mcp/tools/send-message.js +33 -30
- package/dist/mcp/tools/update-task.js +29 -28
- package/dist/{mcp-child-registry-OTG4MWO7.js → mcp-child-registry-DVHYAHPW.js} +2 -2
- package/dist/{mcp-health-HNVSWKFA.js → mcp-health-B5EKRCZG.js} +2 -2
- package/dist/{mcp-http-config-DQWL7U2Z.js → mcp-http-config-ZJ7XHWT7.js} +10 -6
- package/dist/{mcp-session-identity-277GASTQ.js → mcp-session-identity-PEVM7VIP.js} +26 -25
- package/dist/{memory-cards-3S2ZQPR7.js → memory-cards-VN5DEWPD.js} +9 -9
- package/dist/{memory-graph-extractor-A6DFEFIN.js → memory-graph-extractor-TMEB6WLA.js} +11 -11
- package/dist/{memory-poisoning-defense-ZVP4H6DY.js → memory-poisoning-defense-DYHARQ2G.js} +5 -5
- package/dist/{memory-pressure-watchdog-6W5F6R7H.js → memory-pressure-watchdog-J6Q3SIBL.js} +27 -26
- package/dist/{memory-queue-client-ADSDP6OX.js → memory-queue-client-QC2OTMJB.js} +6 -4
- package/dist/{memory-reflection-BKB2YOE6.js → memory-reflection-ZYJUOSFX.js} +9 -9
- package/dist/{message-queue-client-XQN7QABL.js → message-queue-client-OEQCGSWC.js} +1 -25
- package/dist/{notification-ledger-CLGM7ODF.js → notification-ledger-TG6EFYBP.js} +29 -28
- package/dist/{notifications-MACUZPYP.js → notifications-LGYY22W5.js} +26 -25
- package/dist/{orchestration-events-N7LYMUGA.js → orchestration-events-JPHB6NPY.js} +6 -6
- package/dist/{orchestrator-4X24EWHV.js → orchestrator-IC4WGP6L.js} +28 -27
- package/dist/{org-brief-session-FZOFMO5U.js → org-brief-session-DEPHWCQR.js} +9 -9
- package/dist/{org-consent-policy-O5E6HXBL.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-FODONVTM.js → org-partner-runtime-L7L2WWGN.js} +10 -10
- package/dist/{org-row-visibility-VX4AVV5Q.js → org-row-visibility-M54Z6ZH3.js} +1 -1
- package/dist/{pipeline-router-6GGT2ZW3.js → pipeline-router-NKYAUR3Y.js} +6 -6
- package/dist/{plan-limits-FUN76LYY.js → plan-limits-ISRRGF23.js} +8 -8
- package/dist/{platform-procedures-7YSCLF4Z.js → platform-procedures-Z7ZGBJWN.js} +1 -1
- package/dist/{project-boot-3Q65LCIP.js → project-boot-BLYGVUJH.js} +4 -1
- package/dist/{project-name-LJVFMYTQ.js → project-name-WKSNNKXK.js} +6 -6
- package/dist/{projection-worker-4OANGP5K.js → projection-worker-RNYPE46G.js} +2 -2
- package/dist/{prospective-memory-KR3P4T6N.js → prospective-memory-GEO6E3UL.js} +5 -5
- package/dist/{push-notifications-NCZLH6DI.js → push-notifications-EY6BXZUY.js} +27 -26
- package/dist/{reproject-worktree-memories-PWYKPB2U.js → reproject-worktree-memories-DAA5GWMH.js} +28 -27
- package/dist/{reranker-6V3C2AO4.js → reranker-7OADQPMG.js} +1 -1
- package/dist/{retrieval-health-5D7O6VH6.js → retrieval-health-FCEDWN2P.js} +2 -2
- package/dist/{review-polling-QW3LJ4KN.js → review-polling-G52BR4MC.js} +27 -26
- package/dist/runtime/index.js +39 -38
- package/dist/{session-events-T45SSTMF.js → session-events-P6E2373E.js} +27 -26
- package/dist/{session-kill-telemetry-QSPVJGBF.js → session-kill-telemetry-OHNJMIVT.js} +27 -26
- package/dist/{session-mcp-config-SC5BLWZG.js → session-mcp-config-WFZAH6R5.js} +2 -1
- package/dist/{session-scope-KRWE54C4.js → session-scope-DKOHPQPJ.js} +26 -25
- package/dist/{setup-wizard-GP3TBTPF.js → setup-wizard-RNU3RFBE.js} +1 -1
- package/dist/{skill-refinement-C7JTMLJG.js → skill-refinement-AKJTHFXC.js} +6 -6
- package/dist/{stack-generate-manifest-MFMDWRUP.js → stack-generate-manifest-7WJZWSPK.js} +163 -15
- package/dist/{stack-promote-EKSCYY63.js → stack-promote-OP2URGFF.js} +4 -4
- package/dist/{stack-release-2GZAAFO4.js → stack-release-MY6U2QIO.js} +31 -8
- package/dist/{stack-update-J6JXSTAZ.js → stack-update-QSHSLUTZ.js} +3 -3
- package/dist/{steward-gate-BFCCMCSW.js → steward-gate-KMLS5ECC.js} +6 -6
- package/dist/{subagent-brief-injection-ED36PLYY.js → subagent-brief-injection-HCKZQZBF.js} +37 -36
- package/dist/{support-inbox-YW47SYJF.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-CECTQX4U.js → task-enforcement-2GR7HU6V.js} +27 -26
- package/dist/{task-request-inbox-Q5T4N5K7.js → task-request-inbox-ANCVK2VG.js} +2 -2
- package/dist/{task-scope-ERVEUEYU.js → task-scope-QANJJXXB.js} +30 -29
- package/dist/{tasks-crud-ZRQNJXQ2.js → tasks-crud-45WOIMIM.js} +44 -25
- package/dist/{tasks-notify-MIZH4C2O.js → tasks-notify-ZJS4MA3S.js} +29 -26
- package/dist/{tasks-review-Z7J2P6DG.js → tasks-review-ZVPKY47Z.js} +26 -25
- package/dist/{telemetry-upload-LVQUQYFP.js → telemetry-upload-VY3UWAEL.js} +10 -10
- package/dist/{token-budget-BU4NOVZF.js → token-budget-XHX6XFEC.js} +6 -6
- package/dist/{tool-capability-index-7F42MOJT.js → tool-capability-index-6HLZU437.js} +1 -1
- package/dist/{tool-telemetry-O27EVMBR.js → tool-telemetry-GBDI4AXR.js} +1 -1
- package/dist/tui/App.js +36 -35
- package/dist/{tui-data-TPWWBIUQ.js → tui-data-IQFE3UW3.js} +30 -29
- package/dist/{typed-messages-RCMPEKJN.js → typed-messages-P2HLLA62.js} +1 -1
- package/dist/{update-support-F2F5537B.js → update-support-BDN5AK4R.js} +25 -22
- package/dist/{work-claims-B73X5NE7.js → work-claims-PDQNLE5K.js} +7 -7
- package/dist/{work-state-heartbeat-P4YX6E2R.js → work-state-heartbeat-CH6BLQKV.js} +1 -1
- package/dist/{worker-gate-BEEIIVWA.js → worker-gate-NUUSQMBT.js} +1 -3
- package/dist/{workflow-engine-5X46PFCW.js → workflow-engine-RZ7QEI3Z.js} +2 -2
- package/dist/{worktree-W47CIMJ6.js → worktree-Q25PZST6.js} +11 -7
- package/dist/worktree-ownership-guard-4LKMW6PW.js +421 -0
- package/dist/{worktree-sweep-BNBD4RFX.js → worktree-sweep-EV5YQ2OB.js} +8 -8
- package/package.json +15 -3
- package/release-notes.json +13 -6
- package/src/commands/exe.md +16 -16
- package/stack.release.json +9 -8
- package/dist/behavior-injection-M6UYZCMW.js +0 -63
- package/dist/chunk-BJ7AVSY6.js +0 -50
- package/dist/daemon-restart-report-EIVD6WDJ.js +0 -10
- package/dist/worktree-ownership-guard-OUWJROW2.js +0 -88
- /package/dist/{chunk-GQOEWNVM.js → chunk-4EG4DT4F.js} +0 -0
- /package/dist/{chunk-AISULNGL.js → chunk-BRAIWGMF.js} +0 -0
- /package/dist/{chunk-NRG7KZIP.js → chunk-HQEAZDAC.js} +0 -0
- /package/dist/{chunk-VZAFWPAY.js → chunk-IK4344V5.js} +0 -0
- /package/dist/{chunk-GM7TLYOK.js → chunk-K3VDF6II.js} +0 -0
- /package/dist/{chunk-2AJGV5UL.js → chunk-KM7DAG5J.js} +0 -0
- /package/dist/{chunk-YO4BO2CL.js → chunk-QIEYJ4KZ.js} +0 -0
- /package/dist/{chunk-WSQASFLP.js → chunk-VCTK5HRA.js} +0 -0
- /package/dist/{chunk-KQ6RJWRW.js → chunk-VPT6VMBG.js} +0 -0
- /package/dist/{chunk-6WIFPD2P.js → chunk-YZ4AEMR7.js} +0 -0
- /package/dist/{core-memory-7I7RE2SJ.js → core-memory-UIZKCY4L.js} +0 -0
- /package/dist/{memory-isolation-2TUZ7Z4K.js → memory-isolation-3GJ6WLYX.js} +0 -0
- /package/dist/{oauth-server-AYM37SQ4.js → oauth-server-ZRHXIRXQ.js} +0 -0
- /package/dist/{wiki-acl-IBQLLBTS.js → wiki-acl-MFOYK5F4.js} +0 -0
|
@@ -149,7 +149,22 @@ WIKI_IMAGE_TAG=update.askexe.com/askexe/exe-wiki:v0.9.28@sha256:61856a4c6b97ce62
|
|
|
149
149
|
# only thing holding production together was a host-local compose override.
|
|
150
150
|
# exe-wiki-schema-guard blocks the boot if you get this wrong.
|
|
151
151
|
WIKI_DB_SCHEMA=public
|
|
152
|
-
|
|
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
|
|
153
168
|
WIKI_AUTH_TOKEN=CHANGEME_WIKI_AUTH_TOKEN
|
|
154
169
|
WIKI_JWT_SECRET=CHANGEME_WIKI_JWT_SECRET
|
|
155
170
|
WIKI_SIG_KEY=CHANGEME_WIKI_SIG_KEY
|
|
@@ -179,7 +179,22 @@ WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.28@sha256:61856a4c6b97ce62c62ecdc3a3
|
|
|
179
179
|
# only thing holding production together was a host-local compose override.
|
|
180
180
|
# exe-wiki-schema-guard blocks the boot if you get this wrong.
|
|
181
181
|
WIKI_DB_SCHEMA=public
|
|
182
|
-
|
|
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
|
|
183
198
|
WIKI_AUTH_TOKEN=CHANGEME_WIKI_AUTH_TOKEN
|
|
184
199
|
EXE_WIKI_ADMIN_TOKEN=CHANGEME_EXE_WIKI_ADMIN_TOKEN
|
|
185
200
|
WIKI_JWT_SECRET=CHANGEME_WIKI_JWT_SECRET
|
|
@@ -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:
|
|
@@ -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
|
|
@@ -1221,6 +1281,8 @@ services:
|
|
|
1221
1281
|
- ./sso-edge/default.conf.template:/etc/nginx/exe-templates/default.conf.template:ro
|
|
1222
1282
|
- ./sso-edge/sso-redirect.conf:/etc/nginx/snippets/sso-redirect.conf:ro
|
|
1223
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
|
|
1224
1286
|
# nginx:alpine runs /docker-entrypoint.d/*.sh then `nginx -g 'daemon off;'`.
|
|
1225
1287
|
# Our script renders the template from ${DOMAIN}; it does not exec nginx
|
|
1226
1288
|
# itself (the base entrypoint does), so it ends after `nginx -t`.
|
|
@@ -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() {
|
|
@@ -89,7 +89,17 @@ export const WIKI_IMAGE_TAG = pin("wiki", REGISTRY, "exe-wiki");
|
|
|
89
89
|
// pinned the wiki to an empty schema — Prisma bootstraps it silently rather than
|
|
90
90
|
// erroring, so the wiki simply comes up with no users and no documents.
|
|
91
91
|
const WIKI_DB_SCHEMA = "public";
|
|
92
|
-
|
|
92
|
+
// Bugs bed3cb4a / c604df37: exeOsMcp is not reachable in production (the wiki's
|
|
93
|
+
// client spawns the wrong exe-os CLI subcommand) and exe-wiki PR #78 made
|
|
94
|
+
// native + pgvector the working, self-contained default. See the matching
|
|
95
|
+
// comment in deploy/compose/docker-compose.yml's exe-wiki environment block.
|
|
96
|
+
const WIKI_VECTOR_DB = "pgvector";
|
|
97
|
+
const WIKI_LLM_PROVIDER = "zai";
|
|
98
|
+
const WIKI_ZAI_MODEL_PREF = "glm-4.6";
|
|
99
|
+
const WIKI_ZAI_BASE_PATH = "https://api.z.ai/api/coding/paas/v4";
|
|
100
|
+
// codex P1: docker-compose.yml reads the UNPREFIXED ZAI_MODEL_PREF / ZAI_BASE_PATH
|
|
101
|
+
// (matching the already-unprefixed ZAI_API_KEY) — emit those names, not
|
|
102
|
+
// WIKI_-prefixed ones a fresh customer .env would generate but compose never reads.
|
|
93
103
|
const WIKI_HOST_PORT = "3001";
|
|
94
104
|
export const EXE_OS_IMAGE_TAG = pin("exe-os", REGISTRY, "exe-os");
|
|
95
105
|
export const GATEWAY_IMAGE_TAG = pin("gateway", REGISTRY, "exe-gateway");
|
|
@@ -313,7 +323,22 @@ export function generateEnv(options: GenerateEnvOptions): string {
|
|
|
313
323
|
"# only thing holding production together was a host-local compose override.",
|
|
314
324
|
"# exe-wiki-schema-guard blocks the boot if you get this wrong.",
|
|
315
325
|
`WIKI_DB_SCHEMA=${WIKI_DB_SCHEMA}`,
|
|
326
|
+
"# Bugs bed3cb4a / c604df37 — see deploy/compose/docker-compose.yml's exe-wiki",
|
|
327
|
+
"# environment block for the full rationale. pgvector reuses this same",
|
|
328
|
+
"# exe-db instance; native runs in-process (no API key, no exe-os MCP daemon).",
|
|
316
329
|
`WIKI_VECTOR_DB=${WIKI_VECTOR_DB}`,
|
|
330
|
+
"# bug bed3cb4a / corrected 2026-08-31 (founder direction): wiki's RAG/chat",
|
|
331
|
+
"# uses GLM via Z.ai directly (exe-wiki PR #78's real, verified `zai`",
|
|
332
|
+
"# provider) — not Anthropic through exe-gateway. Supply ZAI_API_KEY to match.",
|
|
333
|
+
`WIKI_LLM_PROVIDER=${WIKI_LLM_PROVIDER}`,
|
|
334
|
+
`ZAI_MODEL_PREF=${WIKI_ZAI_MODEL_PREF}`,
|
|
335
|
+
`ZAI_BASE_PATH=${WIKI_ZAI_BASE_PATH}`,
|
|
336
|
+
"# exe-gateway's /v1/messages authenticates via an exe_sk_* billing API key",
|
|
337
|
+
"# (exe-gateway src/api-keys.ts), provisioned per-customer through",
|
|
338
|
+
"# dashboard.askexe.com — it cannot be generated here. Chat/RAG will fail",
|
|
339
|
+
'# ("No Anthropic API key was set") until this is set.',
|
|
340
|
+
MANUAL_VALUE_COMMENT,
|
|
341
|
+
"WIKI_ANTHROPIC_API_KEY=",
|
|
317
342
|
`WIKI_AUTH_TOKEN=${randomSecret(RANDOM_SECRET_48)}`,
|
|
318
343
|
`EXE_WIKI_ADMIN_TOKEN=${randomSecret(RANDOM_SECRET_48)}`,
|
|
319
344
|
`WIKI_JWT_SECRET=${randomSecret(RANDOM_SECRET_48)}`,
|
|
@@ -632,7 +657,22 @@ export function generateExampleEnv(): string {
|
|
|
632
657
|
"# only thing holding production together was a host-local compose override.",
|
|
633
658
|
"# exe-wiki-schema-guard blocks the boot if you get this wrong.",
|
|
634
659
|
`WIKI_DB_SCHEMA=${WIKI_DB_SCHEMA}`,
|
|
660
|
+
"# Bugs bed3cb4a / c604df37 — see deploy/compose/docker-compose.yml's exe-wiki",
|
|
661
|
+
"# environment block for the full rationale. pgvector reuses this same",
|
|
662
|
+
"# exe-db instance; native runs in-process (no API key, no exe-os MCP daemon).",
|
|
635
663
|
`WIKI_VECTOR_DB=${WIKI_VECTOR_DB}`,
|
|
664
|
+
"# bug bed3cb4a / corrected 2026-08-31 (founder direction): wiki's RAG/chat",
|
|
665
|
+
"# uses GLM via Z.ai directly (exe-wiki PR #78's real, verified `zai`",
|
|
666
|
+
"# provider) — not Anthropic through exe-gateway. Supply ZAI_API_KEY to match.",
|
|
667
|
+
`WIKI_LLM_PROVIDER=${WIKI_LLM_PROVIDER}`,
|
|
668
|
+
`ZAI_MODEL_PREF=${WIKI_ZAI_MODEL_PREF}`,
|
|
669
|
+
`ZAI_BASE_PATH=${WIKI_ZAI_BASE_PATH}`,
|
|
670
|
+
"# exe-gateway's /v1/messages authenticates via an exe_sk_* billing API key",
|
|
671
|
+
"# (exe-gateway src/api-keys.ts), provisioned per-customer through",
|
|
672
|
+
"# dashboard.askexe.com — it cannot be generated here. Chat/RAG will fail",
|
|
673
|
+
'# ("No Anthropic API key was set") until this is set.',
|
|
674
|
+
MANUAL_VALUE_COMMENT,
|
|
675
|
+
"WIKI_ANTHROPIC_API_KEY=CHANGEME_WIKI_ANTHROPIC_API_KEY",
|
|
636
676
|
"WIKI_AUTH_TOKEN=CHANGEME_WIKI_AUTH_TOKEN",
|
|
637
677
|
"EXE_WIKI_ADMIN_TOKEN=CHANGEME_EXE_WIKI_ADMIN_TOKEN",
|
|
638
678
|
"WIKI_JWT_SECRET=CHANGEME_WIKI_JWT_SECRET",
|
|
@@ -70,54 +70,15 @@ map $http_cookie $sso_gotrue_cookie {
|
|
|
70
70
|
"~(?:^|;\s*)exe_access_token=([^\s;]+)" $1;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
#
|
|
74
|
-
#
|
|
75
|
-
#
|
|
76
|
-
#
|
|
77
|
-
#
|
|
78
|
-
#
|
|
79
|
-
#
|
|
80
|
-
#
|
|
81
|
-
#
|
|
82
|
-
# completely inert from the day it shipped. $request_uri IS inherited, but it
|
|
83
|
-
# carries the query string, so the anchor admits `?`/`#` as well as end-of-
|
|
84
|
-
# string — without that, /assets/app.js?v=abc would fall back into the gate.
|
|
85
|
-
#
|
|
86
|
-
# SCOPED BY PATH PREFIX, NOT BY BARE EXTENSION (P0 review of PR #874). A bare
|
|
87
|
-
# extension test over $request_uri exempts ANY URL shaped like an asset, and the
|
|
88
|
-
# app locations are catch-all proxies, so `/uploads/customer.png` and
|
|
89
|
-
# `/api/export.js` would walk straight past the gate — the gate returns 204
|
|
90
|
-
# before it ever looks at a cookie. The allow arms below are anchored at `^/`
|
|
91
|
-
# on the build-output directories the SPAs actually boot from; everything else
|
|
92
|
-
# — including every proxied application path — falls to `default ""` and stays
|
|
93
|
-
# gated. This is now a path test AND an extension test, not a URL-shape test.
|
|
94
|
-
#
|
|
95
|
-
# nginx takes the FIRST matching regex in a map, so the deny arms are listed
|
|
96
|
-
# first and win unconditionally over the allow arms.
|
|
97
|
-
map $request_uri $sso_is_static {
|
|
98
|
-
default "";
|
|
99
|
-
|
|
100
|
-
# ── DENY (evaluated first, wins over everything below) ───────────────────
|
|
101
|
-
# Proxied application surface: API, user uploads and app-served files can
|
|
102
|
-
# never be exempt, whatever extension or query string they are dressed in.
|
|
103
|
-
"~*^/(?:api|uploads?|files|private|attachments|media|desk|app|method|admin)(?:[/?#]|$)" "";
|
|
104
|
-
# Traversal, raw or percent-encoded. $request_uri is the RAW request line:
|
|
105
|
-
# `/assets/../api/secret.js` is a prefix match here but normalizes to
|
|
106
|
-
# `/api/secret.js` before it reaches the app, so it must never be exempt.
|
|
107
|
-
"~\.\." "";
|
|
108
|
-
"~*%2e" "";
|
|
109
|
-
"~*%2f" "";
|
|
110
|
-
"~*%5c" "";
|
|
111
|
-
|
|
112
|
-
# ── ALLOW ────────────────────────────────────────────────────────────────
|
|
113
|
-
# Build-output directories only: Vite/Frappe `/assets/`, CRA/Twenty
|
|
114
|
-
# `/static/`, Next `/_next/static/`, Nuxt `/_nuxt/`, Vite-in-subdir
|
|
115
|
-
# `/build/assets/`. `[^?#]*` keeps the extension test on the PATH, so a
|
|
116
|
-
# query string can never supply the matching extension.
|
|
117
|
-
"~*^/(?:_next/static|_nuxt|assets|static|build/assets)/[^?#]*\.(?:js|mjs|css|map|png|jpe?g|gif|svg|ico|webp|woff2?|ttf)(?:[?#]|$)" "static";
|
|
118
|
-
# Root icons the browser requests on its own before any app code runs.
|
|
119
|
-
"~*^/(?:favicon\.(?:ico|svg|png)|apple-touch-icon(?:-precomposed)?\.png)(?:[?#]|$)" "static";
|
|
120
|
-
}
|
|
73
|
+
# NO static-asset exemption map here — deliberately (bug 419e1231). A
|
|
74
|
+
# `map $uri $sso_is_static` used to live at this spot, feeding a step-0 bypass
|
|
75
|
+
# in /_sso_gate that could never fire ($uri inside an auth_request subrequest is
|
|
76
|
+
# "/_sso_gate", not the parent path). Since bug 83ba9546 the gate authenticates
|
|
77
|
+
# off the apex `exe_sess` cookie, which the browser sends on the very first
|
|
78
|
+
# request, so assets need no exemption to load. Do not re-add this map over
|
|
79
|
+
# $request_uri "to make it work" — that would newly open a real bypass for every
|
|
80
|
+
# path ending in an asset extension (CRM attachments, wiki images included).
|
|
81
|
+
# Ungate a specific path with `location = /p { auth_request off; }` instead.
|
|
121
82
|
|
|
122
83
|
map $http_upgrade $sso_conn_upgrade {
|
|
123
84
|
default upgrade;
|
|
@@ -152,6 +113,12 @@ server {
|
|
|
152
113
|
location = /health { auth_request off; proxy_pass http://sso_crm/healthz; }
|
|
153
114
|
location = /healthz { auth_request off; proxy_pass http://sso_crm/healthz; }
|
|
154
115
|
|
|
116
|
+
# Logout endpoint must be exempt from SSO gate (bug 96f8b2b2). Without this,
|
|
117
|
+
# /auth/logout triggers 401 -> redirect to auth with logout URL as redirect param
|
|
118
|
+
# -> infinite loop. Let the app handle logout (clear its own cookies), then it
|
|
119
|
+
# redirects to auth.askexe.com/logout for the central SSO cookie clear.
|
|
120
|
+
location = /auth/logout { auth_request off; proxy_pass http://sso_crm/auth/logout; }
|
|
121
|
+
|
|
155
122
|
location / { proxy_pass http://sso_crm; }
|
|
156
123
|
}
|
|
157
124
|
|
|
@@ -163,15 +130,25 @@ server {
|
|
|
163
130
|
set $sso_auth_base "https://auth.${DOMAIN}";
|
|
164
131
|
set $sso_app_url "https://wiki.${DOMAIN}";
|
|
165
132
|
set $sso_product "Wiki";
|
|
166
|
-
# Bug
|
|
167
|
-
#
|
|
168
|
-
#
|
|
169
|
-
#
|
|
170
|
-
#
|
|
171
|
-
#
|
|
172
|
-
#
|
|
173
|
-
#
|
|
174
|
-
|
|
133
|
+
# Bug 4a6650f5: EMPTY ON PURPOSE — the wiki has no app-native session cookie.
|
|
134
|
+
#
|
|
135
|
+
# This used to be $cookie_exe_access_token (bug f1bb40d8's "one canonical SSO
|
|
136
|
+
# cookie key"), but exe_access_token is the apex PRESENCE SENTINEL: value is
|
|
137
|
+
# the literal "1", deliberately JS-readable, forgeable by any visitor. Using
|
|
138
|
+
# it here made step 1 of /_sso_gate satisfy its app-cookie arm and its
|
|
139
|
+
# sentinel arm from that single cookie, so `Cookie: exe_access_token=1`
|
|
140
|
+
# returned 204 with no credential at all (live: wiki 200 instead of 302), and
|
|
141
|
+
# a logged-out user could walk back in by re-setting it, defeating cross-app
|
|
142
|
+
# logout. exe-wiki never had a second, real session cookie to point at — its
|
|
143
|
+
# boot script only mirrors this same sentinel name (EXE_SSO_COOKIE_NAME).
|
|
144
|
+
#
|
|
145
|
+
# Leaving it empty makes step 1 unmatchable, so every wiki request falls
|
|
146
|
+
# through to steps 2-3 and is authenticated by the apex `exe_sess` cookie
|
|
147
|
+
# validated against GoTrue /user — the same path CRM/ERP take on first visit
|
|
148
|
+
# since bug 83ba9546, and strictly stronger than presence-trusting a cookie.
|
|
149
|
+
# If exe-wiki ever mints a real server-side session cookie, set that name
|
|
150
|
+
# here — never the sentinel.
|
|
151
|
+
set $sso_session_cookie "";
|
|
175
152
|
include /etc/nginx/snippets/sso-redirect.conf;
|
|
176
153
|
|
|
177
154
|
# Bug d3ba1136: wiki's actual health probe is /api/ping. Expose the standard
|
|
@@ -180,6 +157,9 @@ server {
|
|
|
180
157
|
location = /health { auth_request off; proxy_pass http://sso_wiki/api/ping; }
|
|
181
158
|
location = /healthz { auth_request off; proxy_pass http://sso_wiki/api/ping; }
|
|
182
159
|
|
|
160
|
+
# Logout endpoint must be exempt from SSO gate (bug 96f8b2b2).
|
|
161
|
+
location = /auth/logout { auth_request off; proxy_pass http://sso_wiki/auth/logout; }
|
|
162
|
+
|
|
183
163
|
location / { proxy_pass http://sso_wiki; }
|
|
184
164
|
}
|
|
185
165
|
|
|
@@ -207,7 +187,27 @@ server {
|
|
|
207
187
|
set $sso_session_cookie $cookie_sid; # Frappe/ERPNext session cookie
|
|
208
188
|
include /etc/nginx/snippets/sso-redirect.conf;
|
|
209
189
|
|
|
210
|
-
|
|
190
|
+
# ERP is the one upstream that runs a realtime socket.io service with
|
|
191
|
+
# origin authentication: frappe's realtime middleware compares the Host
|
|
192
|
+
# header against the Origin header and rejects mismatches ("Invalid
|
|
193
|
+
# origin"), and the websocket upgrade needs explicit HTTP/1.1 + Upgrade
|
|
194
|
+
# headers. A bare proxy_pass sends Host: exe-erp-nginx and no upgrade
|
|
195
|
+
# headers, so every desk socket.io connection is rejected and the desk
|
|
196
|
+
# shows "Error connecting to socket.io: Invalid origin" (found in the
|
|
197
|
+
# 2026-09-02 four-domain demo verification).
|
|
198
|
+
location / {
|
|
199
|
+
proxy_pass http://sso_erp;
|
|
200
|
+
proxy_set_header Host $host;
|
|
201
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
202
|
+
# Literal https, matching the template-level convention at the top of
|
|
203
|
+
# this file: this edge is reached via cloudflared over plain HTTP, so
|
|
204
|
+
# $scheme would report "http" for public HTTPS requests.
|
|
205
|
+
proxy_set_header X-Forwarded-Proto https;
|
|
206
|
+
proxy_http_version 1.1;
|
|
207
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
208
|
+
proxy_set_header Connection "upgrade";
|
|
209
|
+
proxy_read_timeout 75s;
|
|
210
|
+
}
|
|
211
211
|
}
|
|
212
212
|
|
|
213
213
|
# ── Dashboard ────────────────────────────────────────────────────────────────
|
|
@@ -218,21 +218,49 @@ server {
|
|
|
218
218
|
set $sso_auth_base "https://auth.${DOMAIN}";
|
|
219
219
|
set $sso_app_url "https://dashboard.${DOMAIN}";
|
|
220
220
|
set $sso_product "Dashboard";
|
|
221
|
-
#
|
|
222
|
-
#
|
|
223
|
-
#
|
|
224
|
-
|
|
221
|
+
# Bug 4a6650f5: EMPTY ON PURPOSE — same defect and same fix as the Wiki
|
|
222
|
+
# vhost above (see its comment). The dashboard keeps its access token in
|
|
223
|
+
# localStorage and only mirrors the apex `exe_access_token` sentinel into a
|
|
224
|
+
# cookie; that sentinel is a forgeable "1", not a credential, so gating on it
|
|
225
|
+
# admitted anyone sending `Cookie: exe_access_token=1`. The dashboard has no
|
|
226
|
+
# app-native session cookie to name instead, so leave this empty and let
|
|
227
|
+
# steps 2-3 validate the apex `exe_sess` cookie against GoTrue.
|
|
228
|
+
set $sso_session_cookie "";
|
|
225
229
|
include /etc/nginx/snippets/sso-redirect.conf;
|
|
226
230
|
|
|
227
231
|
location = /health { auth_request off; proxy_pass http://sso_dashboard/health; }
|
|
228
232
|
location = /healthz { auth_request off; proxy_pass http://sso_dashboard/health; }
|
|
229
233
|
|
|
234
|
+
# Logout endpoint must be exempt from SSO gate (bug 96f8b2b2).
|
|
235
|
+
location = /auth/logout { auth_request off; proxy_pass http://sso_dashboard/auth/logout; }
|
|
236
|
+
|
|
230
237
|
location / { proxy_pass http://sso_dashboard; }
|
|
231
238
|
}
|
|
232
239
|
|
|
233
|
-
# Default — unknown host →
|
|
240
|
+
# Default — unknown host or edge-generated error → branded shared error pages
|
|
241
|
+
# (packages/exe-error-pages, vendored here by packages/exe-error-pages/sync.mjs
|
|
242
|
+
# and bind-mounted at /usr/share/nginx/html/error-pages; bug 64324162 delivery
|
|
243
|
+
# path). Scoped to THIS server only: app 4xx/5xx from crm/wiki/erp/etc. are
|
|
244
|
+
# proxied responses and pass through untouched (no proxy_intercept_errors).
|
|
234
245
|
server {
|
|
235
246
|
listen 80 default_server;
|
|
236
247
|
server_name _;
|
|
237
|
-
|
|
248
|
+
|
|
249
|
+
root /usr/share/nginx/html;
|
|
250
|
+
|
|
251
|
+
error_page 404 /error-pages/404.html;
|
|
252
|
+
error_page 500 502 504 /error-pages/500.html;
|
|
253
|
+
error_page 503 /error-pages/503.html;
|
|
254
|
+
|
|
255
|
+
# The shared pages, reachable only via the error_page directives above.
|
|
256
|
+
location ^~ /error-pages/ {
|
|
257
|
+
internal;
|
|
258
|
+
# Static HTML, inline CSS; Google Fonts is the only external dep.
|
|
259
|
+
add_header Cache-Control "no-store" always;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
# Any request to an unconfigured host falls here and returns the branded 404.
|
|
263
|
+
location / {
|
|
264
|
+
return 404;
|
|
265
|
+
}
|
|
238
266
|
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<!-- Build provenance: stamped by stamp.mjs at delivery-build time so a served page reveals the exact source commit. Unstamped (literal __EXE_BUILD_*__) => served straight from git without a provenance step. -->
|
|
7
|
+
<meta name="exe-build-rev" content="__EXE_BUILD_REV__">
|
|
8
|
+
<meta name="exe-build-ref" content="__EXE_BUILD_REF__">
|
|
9
|
+
<meta name="exe-build-time" content="__EXE_BUILD_TIME__">
|
|
10
|
+
<title>404 — Page Not Found | Exe</title>
|
|
11
|
+
<style>
|
|
12
|
+
@import url('https://fonts.googleapis.com/css2?family=Epilogue:wght@400;700&family=Manrope:wght@400;500;600&display=swap');
|
|
13
|
+
|
|
14
|
+
*, *::before, *::after {
|
|
15
|
+
margin: 0;
|
|
16
|
+
padding: 0;
|
|
17
|
+
box-sizing: border-box;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
body {
|
|
21
|
+
background: #0F0E1A;
|
|
22
|
+
color: #FFFFFF;
|
|
23
|
+
font-family: 'Manrope', sans-serif;
|
|
24
|
+
min-height: 100vh;
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
align-items: center;
|
|
28
|
+
justify-content: center;
|
|
29
|
+
-webkit-font-smoothing: antialiased;
|
|
30
|
+
-moz-osx-font-smoothing: grayscale;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.container {
|
|
34
|
+
text-align: center;
|
|
35
|
+
padding: 2rem;
|
|
36
|
+
max-width: 480px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.logo {
|
|
40
|
+
font-family: 'Epilogue', sans-serif;
|
|
41
|
+
font-weight: 700;
|
|
42
|
+
font-size: 30px;
|
|
43
|
+
color: #F5D76E;
|
|
44
|
+
letter-spacing: 0.08em;
|
|
45
|
+
margin-bottom: 3rem;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.error-code {
|
|
49
|
+
font-family: 'Epilogue', sans-serif;
|
|
50
|
+
font-weight: 700;
|
|
51
|
+
font-size: 120px;
|
|
52
|
+
line-height: 1;
|
|
53
|
+
color: #FFFFFF;
|
|
54
|
+
margin-bottom: 1rem;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.description {
|
|
58
|
+
font-family: 'Manrope', sans-serif;
|
|
59
|
+
font-size: 16px;
|
|
60
|
+
font-weight: 400;
|
|
61
|
+
color: #A09CAF;
|
|
62
|
+
line-height: 1.6;
|
|
63
|
+
margin-bottom: 2.5rem;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.btn {
|
|
67
|
+
display: inline-block;
|
|
68
|
+
font-family: 'Manrope', sans-serif;
|
|
69
|
+
font-weight: 600;
|
|
70
|
+
font-size: 14px;
|
|
71
|
+
letter-spacing: 0.04em;
|
|
72
|
+
text-transform: uppercase;
|
|
73
|
+
color: #0F0E1A;
|
|
74
|
+
background: #F5D76E;
|
|
75
|
+
border: none;
|
|
76
|
+
border-radius: 8px;
|
|
77
|
+
padding: 14px 36px;
|
|
78
|
+
cursor: pointer;
|
|
79
|
+
text-decoration: none;
|
|
80
|
+
transition: background 0.2s ease, transform 0.1s ease;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.btn:hover {
|
|
84
|
+
background: #f7e08a;
|
|
85
|
+
transform: translateY(-1px);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.btn:active {
|
|
89
|
+
transform: translateY(0);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.services {
|
|
93
|
+
margin-top: 4rem;
|
|
94
|
+
font-family: 'Manrope', sans-serif;
|
|
95
|
+
font-size: 13px;
|
|
96
|
+
color: #5A5669;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.services a {
|
|
100
|
+
color: #5A5669;
|
|
101
|
+
text-decoration: none;
|
|
102
|
+
transition: color 0.2s ease;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.services a:hover {
|
|
106
|
+
color: #A09CAF;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.services .sep {
|
|
110
|
+
margin: 0 0.6em;
|
|
111
|
+
}
|
|
112
|
+
</style>
|
|
113
|
+
</head>
|
|
114
|
+
<body>
|
|
115
|
+
<div class="container">
|
|
116
|
+
<div class="logo">EXE</div>
|
|
117
|
+
<div class="error-code">404</div>
|
|
118
|
+
<p class="description">The page you're looking for doesn't exist or has been moved.</p>
|
|
119
|
+
<a href="/" class="btn">Go Home</a>
|
|
120
|
+
<div class="services">
|
|
121
|
+
<a href="https://crm.askexe.com">CRM</a>
|
|
122
|
+
<span class="sep">·</span>
|
|
123
|
+
<a href="https://wiki.askexe.com">Wiki</a>
|
|
124
|
+
<span class="sep">·</span>
|
|
125
|
+
<a href="https://erp.askexe.com">ERP</a>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
</body>
|
|
129
|
+
</html>
|