@askexenow/exe-os 0.9.379 → 0.9.381
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.example +2 -2
- package/deploy/compose/generate-env.ts +57 -2
- package/deploy/compose/sso-edge/default.conf.template +88 -24
- package/deploy/compose/sso-edge/sso-redirect.conf +48 -8
- package/deploy/stack-manifests/v0.9.json +8 -6
- package/dist/.dist-verified.json +3 -3
- package/dist/{active-agent-6UGMMF5I.js → active-agent-GE6HDADY.js} +3 -3
- package/dist/{active-agent-AS7KFTVH.js → active-agent-GZ6O7KKS.js} +3 -3
- package/dist/{agent-defs-generator-DICJCKOD.js → agent-defs-generator-3VHBN56U.js} +2 -2
- package/dist/{agentic-ontology-ZBSTAMKZ.js → agentic-ontology-6X5Z5QPD.js} +1 -1
- package/dist/{backfill-metadata-LORTB4VD.js → backfill-metadata-4NI4MZEE.js} +5 -5
- package/dist/{backup-verify-H2DMGI2H.js → backup-verify-7UQ5PXRZ.js} +1 -1
- package/dist/{behavior-injection-QEBTBEOD.js → behavior-injection-LZSLBWIF.js} +8 -8
- package/dist/{behavior-promotion-FH55UV7T.js → behavior-promotion-7IZKCZFC.js} +7 -7
- package/dist/{behaviors-R5O6CGRR.js → behaviors-S6MOP2C3.js} +6 -6
- package/dist/bin/agentic-ontology-backfill.js +6 -6
- package/dist/bin/agentic-reflection-backfill.js +7 -7
- package/dist/bin/agentic-semantic-label.js +6 -6
- package/dist/bin/backfill-conversations.js +5 -5
- package/dist/bin/backfill-responses.js +5 -5
- package/dist/bin/backfill-vectors.js +5 -5
- package/dist/bin/bulk-sync-postgres.js +10 -10
- package/dist/bin/cc-doctor.js +6 -6
- package/dist/bin/cleanup-stale-review-tasks.js +15 -15
- package/dist/bin/cli.js +21 -21
- package/dist/bin/deferred-daemon-restart.js +77 -77
- package/dist/bin/exe-agent-config.js +2 -2
- package/dist/bin/exe-agent.js +4 -4
- package/dist/bin/exe-assign.js +6 -6
- package/dist/bin/exe-boot.js +36 -39
- package/dist/bin/exe-call.js +4 -4
- package/dist/bin/exe-cicd.js +29 -5
- package/dist/bin/exe-cloud.js +11 -11
- package/dist/bin/exe-config-dump.js +2 -2
- package/dist/bin/exe-dispatch.js +16 -16
- package/dist/bin/exe-doctor.js +4 -4
- package/dist/bin/exe-export-behaviors.js +10 -10
- package/dist/bin/exe-forget.js +7 -7
- package/dist/bin/exe-gateway.js +7 -7
- package/dist/bin/exe-healthcheck.js +6 -6
- package/dist/bin/exe-heartbeat.js +21 -21
- package/dist/bin/exe-kill.js +19 -19
- package/dist/bin/exe-launch-agent.js +25 -25
- package/dist/bin/exe-mcp.js +4 -4
- package/dist/bin/exe-memory-reads.js +5 -5
- package/dist/bin/exe-new-employee.js +8 -8
- package/dist/bin/exe-os-mcp-proxy.js +4 -4
- package/dist/bin/exe-pending-messages.js +16 -16
- package/dist/bin/exe-pending-notifications.js +15 -15
- package/dist/bin/exe-pending-reviews.js +16 -16
- package/dist/bin/exe-rename.js +4 -4
- package/dist/bin/exe-review.js +18 -18
- package/dist/bin/exe-search.js +6 -6
- package/dist/bin/exe-session-cleanup.js +19 -19
- package/dist/bin/exe-settings.js +10 -10
- package/dist/bin/exe-start-codex.js +17 -17
- package/dist/bin/exe-start-opencode.js +14 -14
- package/dist/bin/exe-status.js +17 -17
- package/dist/bin/exe-support.js +3 -3
- package/dist/bin/exe-team.js +4 -4
- package/dist/bin/git-sweep.js +16 -16
- package/dist/bin/graph-backfill.js +6 -6
- package/dist/bin/graph-export.js +6 -6
- package/dist/bin/hooks-cli.js +1 -1
- package/dist/bin/import-history.js +9 -9
- package/dist/bin/install.js +79 -79
- package/dist/bin/intercom-check.js +5 -5
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +4 -4
- package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
- package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
- package/dist/bin/reconcile-backlog.js +2 -2
- package/dist/bin/registry-proxy.js +1 -1
- package/dist/bin/scan-tasks.js +16 -16
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +5 -5
- package/dist/bin/stack-update.js +4 -4
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-YJUT2Q3W.js → boot-generation-K5EI6KLP.js} +3 -3
- package/dist/{boot-review-sections-KQ4IKECT.js → boot-review-sections-RNJY5D7E.js} +14 -14
- package/dist/build-manifest.json +789 -779
- package/dist/{capability-cards-ARD5EHTB.js → capability-cards-G3ZT3KJ5.js} +2 -2
- package/dist/{capacity-monitor-F7LP4CDD.js → capacity-monitor-6P26RG7K.js} +16 -16
- package/dist/{catchup-brief-DVBMG32B.js → catchup-brief-5TUY3RPB.js} +19 -19
- package/dist/{chunk-GASB6XNZ.js → chunk-23BI4FIU.js} +1 -1
- package/dist/{chunk-4DRTAGYN.js → chunk-2P5B4PMY.js} +2 -2
- package/dist/{chunk-5PPSASHK.js → chunk-3PFQKTW3.js} +1 -1
- package/dist/{chunk-LIAG7DOC.js → chunk-3UFGISID.js} +1 -1
- package/dist/{chunk-ZFWEXIG4.js → chunk-4CWPMTPV.js} +1 -1
- package/dist/{chunk-VHSZZPC2.js → chunk-5DE75FKS.js} +2 -2
- package/dist/{chunk-N6DTPJ6C.js → chunk-5WCRSUOT.js} +1 -1
- package/dist/{chunk-BLMK6NAK.js → chunk-66J2QLDB.js} +1 -1
- package/dist/{chunk-VCNWOALN.js → chunk-6EDL7IV2.js} +4 -4
- package/dist/{chunk-LIFGH26F.js → chunk-6V33K5VX.js} +1 -1
- package/dist/{chunk-K3ACRDEI.js → chunk-7KXJ2Y5G.js} +2 -2
- package/dist/{chunk-V3NQOJOA.js → chunk-A2HKHDVO.js} +1 -1
- package/dist/{chunk-ROJF67OK.js → chunk-ATKH4YHE.js} +1 -1
- package/dist/{chunk-C7WMED5K.js → chunk-B2324KTU.js} +3 -3
- package/dist/{chunk-IQDLB634.js → chunk-BL6FTJ4R.js} +4 -4
- package/dist/{chunk-JAG4E447.js → chunk-BVJWGIBA.js} +5 -5
- package/dist/{chunk-KT67FH72.js → chunk-CAFAVLFW.js} +1 -1
- package/dist/{chunk-BXNZJFPZ.js → chunk-CLXDTM6D.js} +5 -5
- package/dist/{chunk-JVQ3MAIU.js → chunk-CMU73A3R.js} +1 -1
- package/dist/{chunk-SKWD6AMO.js → chunk-CSAK5WHK.js} +2 -2
- package/dist/{chunk-MBNR2JKG.js → chunk-CURJYC3V.js} +2 -2
- package/dist/{chunk-CMFNKCQG.js → chunk-DF4V7ME3.js} +1 -1
- package/dist/{chunk-SYDLUOOQ.js → chunk-DLG6YKHQ.js} +2 -2
- package/dist/{chunk-AMSQQNBR.js → chunk-DNP6Z7FD.js} +3 -3
- package/dist/{chunk-EWC3KJ3N.js → chunk-DVMOZPMN.js} +2 -2
- package/dist/{chunk-O6REYGDW.js → chunk-DWA7QET3.js} +2 -2
- package/dist/{chunk-DSW4XOUS.js → chunk-DYGBOWGB.js} +4 -4
- package/dist/{chunk-ST7SGEV6.js → chunk-EQWKSGBY.js} +3 -3
- package/dist/{chunk-37IFESFI.js → chunk-EXIMHXHN.js} +5 -5
- package/dist/{chunk-IAKMYWSL.js → chunk-FX7VMFWS.js} +1 -1
- package/dist/{chunk-3SM4AIDZ.js → chunk-G3RANZRO.js} +2 -2
- package/dist/{chunk-VQM2Y54R.js → chunk-GODDBYPL.js} +2 -2
- package/dist/{chunk-IYSQFFKJ.js → chunk-GQAEAIBH.js} +4 -4
- package/dist/{chunk-ITZ73III.js → chunk-GTSWUQFT.js} +1 -1
- package/dist/{chunk-UPHGJRJT.js → chunk-HELW3SV2.js} +3 -3
- package/dist/{chunk-W67LU4ZK.js → chunk-HESUCM6A.js} +1 -1
- package/dist/{chunk-IBSWNWHY.js → chunk-HWPKB52A.js} +4 -4
- package/dist/{chunk-QH3RZPVR.js → chunk-HYXHA4EJ.js} +3 -3
- package/dist/{chunk-ET25ZHWR.js → chunk-I44IJ3TV.js} +1 -1
- package/dist/{chunk-CCVFN4IJ.js → chunk-IXPDII4H.js} +11 -11
- package/dist/{chunk-FFWYDUTB.js → chunk-JEJ6C64A.js} +9 -7
- package/dist/{chunk-TDKZBY6B.js → chunk-JMNPPQEM.js} +1 -1
- package/dist/{chunk-F2TILSIL.js → chunk-JRHLVN6K.js} +1 -1
- package/dist/{chunk-DCRF2KVG.js → chunk-JZGMDMN7.js} +22 -22
- package/dist/{chunk-XPRGGB76.js → chunk-KL3GZVFJ.js} +9 -9
- package/dist/{chunk-UF6WVH5H.js → chunk-KQLTJWK3.js} +3 -3
- package/dist/{chunk-6IVMQCNS.js → chunk-M64Y62AR.js} +4 -4
- package/dist/{chunk-53X5AU22.js → chunk-MAOKR5AL.js} +4 -4
- package/dist/{chunk-HUDNFIQ6.js → chunk-ME3SE5HB.js} +6 -6
- package/dist/{chunk-LV6Y24CS.js → chunk-MGLY2HRK.js} +2 -2
- package/dist/{chunk-4PVV3WE5.js → chunk-NBYX3Y4Y.js} +1 -1
- package/dist/{chunk-TDIF5BBB.js → chunk-NNSBI4H4.js} +3 -3
- package/dist/{chunk-MBYNG4MG.js → chunk-O6NASQJQ.js} +1 -1
- package/dist/{chunk-7FTQPH6R.js → chunk-OKHCISVQ.js} +2 -2
- package/dist/{chunk-YL7X737C.js → chunk-OKLZXKO6.js} +10 -10
- package/dist/{chunk-EVKPSPG7.js → chunk-OX4ELHFB.js} +4 -4
- package/dist/{chunk-HPO55JH2.js → chunk-OZLVWDZ3.js} +1 -1
- package/dist/{chunk-5TWVGD4F.js → chunk-PAETAECN.js} +1 -1
- package/dist/{chunk-ADJDRHBD.js → chunk-PHXRUJXH.js} +2 -2
- package/dist/{chunk-LWUX44DM.js → chunk-PL6FWDSB.js} +2 -2
- package/dist/{chunk-UUD24U44.js → chunk-PNFUHLNT.js} +1 -1
- package/dist/{chunk-MOIAA7UB.js → chunk-PSWGRTUP.js} +1 -1
- package/dist/{chunk-M4CCRJNR.js → chunk-PUQI4R46.js} +1 -1
- package/dist/{chunk-CPKESCII.js → chunk-QRYZRLIF.js} +215 -141
- package/dist/{chunk-CT6FNUFF.js → chunk-QV4YQQAH.js} +4 -4
- package/dist/{chunk-QU5YJ4SW.js → chunk-RLIHHSIY.js} +1 -1
- package/dist/{chunk-XOHZD3TS.js → chunk-RUWXKXUQ.js} +3 -3
- package/dist/{chunk-RJIMOSGO.js → chunk-S25C5FPP.js} +2 -2
- package/dist/{chunk-HZYXJR5K.js → chunk-S7W5WHKI.js} +109 -28
- package/dist/{chunk-4YSSV4JI.js → chunk-SFFYGYET.js} +1 -1
- package/dist/{chunk-M3RTXUE7.js → chunk-SJNKMUXK.js} +6 -6
- package/dist/{chunk-HWBI6PYZ.js → chunk-TG6UC6OC.js} +1 -1
- package/dist/{chunk-SD34BNIW.js → chunk-TKTEFYPH.js} +1 -1
- package/dist/{chunk-UAA2ILFU.js → chunk-TX2WJE27.js} +1 -1
- package/dist/{chunk-3MBZHG5L.js → chunk-U272MACB.js} +5 -5
- package/dist/{chunk-2Y24YUEG.js → chunk-UB7CHH4B.js} +3 -3
- package/dist/{chunk-5C5A66MU.js → chunk-UVM3HYIC.js} +52 -17
- package/dist/{chunk-3E555QQS.js → chunk-VJ76SXBN.js} +1 -1
- package/dist/{chunk-RH4VTC3P.js → chunk-VLOVI6EW.js} +1 -1
- package/dist/{chunk-YMK6S42O.js → chunk-VMEZNP7H.js} +2 -2
- package/dist/{chunk-L7VNUQUY.js → chunk-VOBQG46I.js} +3 -3
- package/dist/{chunk-XC5TZF7P.js → chunk-VYSHZB7N.js} +2 -2
- package/dist/{chunk-3IGUYHWC.js → chunk-W4EZ5RSQ.js} +2 -2
- package/dist/{chunk-A5KNAZB6.js → chunk-W7ZGTTHN.js} +2 -2
- package/dist/{chunk-F3WL7OQJ.js → chunk-WATC3K3F.js} +1 -1
- package/dist/{chunk-4OAJ4JEJ.js → chunk-WH25C4IE.js} +1 -1
- package/dist/{chunk-TJA4CAW7.js → chunk-WLB5M4VC.js} +12 -12
- package/dist/{chunk-M7O7AQTY.js → chunk-XBLUWKRG.js} +1 -1
- package/dist/{chunk-RVPGMZH2.js → chunk-XN5AN3JP.js} +2 -2
- package/dist/{chunk-AJIXH5JF.js → chunk-XU57KFD6.js} +1 -1
- package/dist/{chunk-R5HTG7HS.js → chunk-YG5JKDTX.js} +2 -2
- package/dist/{chunk-2PENMUW7.js → chunk-YZCVZT67.js} +5 -5
- package/dist/{chunk-MPWQHEB5.js → chunk-ZONICSKY.js} +1 -1
- package/dist/{cleanup-graph-garbage-QI4UGQJK.js → cleanup-graph-garbage-KY6WU5G4.js} +7 -7
- package/dist/{cloud-sync-command-36JRHDVB.js → cloud-sync-command-XCQDIMQF.js} +2 -2
- package/dist/{cloud-sync-db-init-U5SQUYOE.js → cloud-sync-db-init-244Q5GSC.js} +1 -1
- package/dist/{cloud-sync-shutdown-2RPLPWQN.js → cloud-sync-shutdown-2GQEUM25.js} +2 -2
- package/dist/{co-activation-ABG5M3WI.js → co-activation-T4E5BQME.js} +2 -2
- package/dist/{co-occurrence-Z3XNRORW.js → co-occurrence-H3T4EJDD.js} +5 -5
- package/dist/{conversation-entity-extractor-JN5ZY5HW.js → conversation-entity-extractor-FMZDYA5F.js} +3 -3
- package/dist/{crdt-sync-SBHASJXY.js → crdt-sync-ZFRTVKPP.js} +1 -1
- package/dist/{crm-webhook-NQMSCTX3.js → crm-webhook-FBHC6ZSX.js} +2 -2
- package/dist/{cto-delegation-gate-PF47SVQQ.js → cto-delegation-gate-NLE4XAAW.js} +14 -14
- package/dist/{daemon-orchestration-YZJHOS6X.js → daemon-orchestration-Y2NUGJAG.js} +25 -19
- package/dist/{dispatch-ack-AZL3WKCK.js → dispatch-ack-X4DXUSKP.js} +1 -1
- package/dist/{doc-graph-extractor-KEDYBPUX.js → doc-graph-extractor-XI6GYDAF.js} +5 -5
- package/dist/{documents-KPCVGOXE.js → documents-M73UVEWK.js} +6 -6
- package/dist/{dreaming-EMGLRSZN.js → dreaming-T73YLCHX.js} +18 -18
- package/dist/{employee-boot-brief-IGAWLDY4.js → employee-boot-brief-TA4ECIMC.js} +21 -21
- package/dist/{entity-boost-HQYWS7BD.js → entity-boost-A6NVXNBE.js} +1 -1
- package/dist/{exe-drift-YFA7KTHW.js → exe-drift-GLCRFOSM.js} +3 -3
- package/dist/{exe-export-BVJMPQMC.js → exe-export-MTAACTQO.js} +7 -7
- package/dist/{exe-import-Y2Q252DZ.js → exe-import-ZK7RVQAX.js} +7 -7
- package/dist/{exe-key-VGAY6RLJ.js → exe-key-HFAEVMPQ.js} +77 -77
- package/dist/{exe-org-6Y4IEM2S.js → exe-org-3PBCLPUK.js} +8 -8
- package/dist/{exe-snapshot-J3G2WMIJ.js → exe-snapshot-N6DHTLHQ.js} +20 -20
- package/dist/{fast-db-init-43H3VKFG.js → fast-db-init-XXCFUBVI.js} +1 -1
- package/dist/{founder-context-Q7CJSMME.js → founder-context-ZGGEQ3Q4.js} +2 -2
- package/dist/gateway/index.js +8 -8
- package/dist/{git-staleness-JUJINVYA.js → git-staleness-W3EI5FYL.js} +2 -2
- package/dist/{global-procedures-YI6632XR.js → global-procedures-DKZV2JUY.js} +3 -3
- package/dist/{graph-auto-extract-LAMZ3JVC.js → graph-auto-extract-RSV72JPO.js} +5 -5
- package/dist/{graph-query-KGAQDJ3L.js → graph-query-W4XVTJQ2.js} +1 -1
- package/dist/{graph-rag-JE4SDECL.js → graph-rag-HKHUQLVO.js} +3 -3
- package/dist/{hook-integrity-KWXIY4X2.js → hook-integrity-7FKR3HRX.js} +1 -1
- package/dist/{hook-prefetch-HIBFYJ3W.js → hook-prefetch-UWTAY5IR.js} +15 -15
- package/dist/hooks/bug-report-worker.js +19 -19
- package/dist/hooks/codex-stop-task-finalizer.js +21 -21
- package/dist/hooks/commit-complete.js +18 -18
- package/dist/hooks/error-recall.js +8 -8
- package/dist/hooks/exe-heartbeat-hook.js +4 -4
- package/dist/hooks/ingest-worker.js +6 -6
- package/dist/hooks/ingest.js +12 -12
- package/dist/hooks/instructions-loaded.js +6 -6
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +5 -5
- package/dist/hooks/post-compact.js +4 -4
- package/dist/hooks/post-tool-combined.js +12 -12
- package/dist/hooks/pre-compact.js +18 -18
- package/dist/hooks/pre-tool-use.js +5 -1126
- package/dist/hooks/prompt-submit.js +33 -33
- package/dist/hooks/session-end.js +22 -22
- package/dist/hooks/session-start.js +17 -17
- package/dist/hooks/stop.js +21 -21
- package/dist/hooks/subagent-stop.js +22 -22
- package/dist/hooks/summary-worker.js +21 -21
- package/dist/index.js +24 -24
- package/dist/{installer-B7N3KUN6.js → installer-JVDKOZSC.js} +6 -6
- package/dist/{installer-3RWXM34E.js → installer-OMXHKOUV.js} +6 -6
- package/dist/{installer-A63AQRYJ.js → installer-RWV4GBVV.js} +6 -6
- package/dist/{intercom-queue-YKLKFYG6.js → intercom-queue-73AFFNQU.js} +14 -14
- package/dist/lib/cloud-sync.js +10 -10
- package/dist/lib/consolidation.js +7 -7
- package/dist/lib/database.js +2 -2
- package/dist/lib/db-backup.js +1 -1
- package/dist/lib/db-write-worker.js +3 -3
- package/dist/lib/db.js +2 -2
- package/dist/lib/device-registry.js +1 -1
- package/dist/lib/employee-templates.js +4 -4
- package/dist/lib/employees.js +2 -2
- package/dist/lib/exe-daemon.js +85 -79
- package/dist/lib/hybrid-search.js +6 -6
- package/dist/lib/identity.js +2 -2
- package/dist/lib/license.js +10 -2
- package/dist/lib/messaging.js +15 -15
- package/dist/lib/post-tool-memory.js +4 -4
- package/dist/lib/registry-proxy.js +1 -1
- package/dist/lib/reminders.js +3 -3
- package/dist/lib/schedules.js +6 -6
- package/dist/lib/session-registry.js +4 -4
- package/dist/lib/skill-learning.js +7 -7
- package/dist/lib/store.js +5 -5
- package/dist/lib/task-router.js +3 -3
- package/dist/lib/tasks.js +16 -16
- package/dist/lib/tmux-routing.js +14 -14
- package/dist/lib/token-spend.js +3 -3
- package/dist/{license-gate-X2H3HJED.js → license-gate-D6JW5OTJ.js} +3 -3
- package/dist/license-recheck-AGRXJ5WR.js +48 -0
- package/dist/{license-sync-NEYBY6EG.js → license-sync-K7LZ74FG.js} +2 -2
- package/dist/mcp/register-tools.js +76 -76
- package/dist/mcp/server.js +76 -76
- package/dist/mcp/tools/complete-reminder.js +4 -4
- package/dist/mcp/tools/create-reminder.js +4 -4
- package/dist/mcp/tools/create-task.js +18 -18
- package/dist/mcp/tools/deactivate-behavior.js +8 -8
- package/dist/mcp/tools/list-reminders.js +4 -4
- package/dist/mcp/tools/list-tasks.js +18 -18
- package/dist/mcp/tools/send-message.js +17 -17
- package/dist/mcp/tools/update-task.js +17 -17
- package/dist/{mcp-http-config-QMD2K7F6.js → mcp-http-config-UNDKWKQU.js} +4 -4
- package/dist/{mcp-session-identity-EBKNLZSG.js → mcp-session-identity-CVAS3E3G.js} +14 -14
- package/dist/{memory-cards-YEZEEWHH.js → memory-cards-UMXD44FU.js} +5 -5
- package/dist/{memory-graph-extractor-6T5LWBPB.js → memory-graph-extractor-AFPSMFEZ.js} +6 -6
- package/dist/{memory-poisoning-defense-5HFHMIOW.js → memory-poisoning-defense-QGR7HUYM.js} +2 -2
- package/dist/{memory-pressure-watchdog-LJE5XGQU.js → memory-pressure-watchdog-ZXWKCBWJ.js} +15 -15
- package/dist/{memory-reflection-H4EX3R6U.js → memory-reflection-2VWEWVHH.js} +5 -5
- package/dist/{notification-ledger-B5ANVGZ2.js → notification-ledger-Z2K5VWCZ.js} +15 -15
- package/dist/{notifications-KYXAY4PY.js → notifications-7OHREN67.js} +14 -14
- package/dist/{orchestration-events-S2BP3MQF.js → orchestration-events-ODSQAZU4.js} +3 -3
- package/dist/{orchestrator-NQMUV6NS.js → orchestrator-CAUOELC6.js} +16 -16
- package/dist/{org-brief-session-OJBIDJAS.js → org-brief-session-EDZUREPX.js} +5 -5
- package/dist/{org-consent-policy-J7UCDPGY.js → org-consent-policy-FPYT63CA.js} +1 -1
- package/dist/{org-partner-runtime-STZKLUBV.js → org-partner-runtime-4P2APMAS.js} +5 -5
- package/dist/{org-row-visibility-H5Q6VALK.js → org-row-visibility-FMZ7GCW6.js} +1 -1
- package/dist/{pipeline-router-V5BBOU4U.js → pipeline-router-WEVGOK2Q.js} +3 -3
- package/dist/{plan-limits-RJZTFSSK.js → plan-limits-HQL4YPCO.js} +5 -5
- package/dist/pre-tool-use-impl-2LZ3IWVG.js +1139 -0
- package/dist/{project-name-HZJOUQKP.js → project-name-HSNEM2B6.js} +3 -3
- package/dist/{projection-worker-UUSQ6AZM.js → projection-worker-YNWVG66K.js} +2 -2
- package/dist/{prospective-memory-M4KYDM54.js → prospective-memory-JIAU7G7X.js} +2 -2
- package/dist/{push-notifications-ZUX2BJ4S.js → push-notifications-4BVJBPFG.js} +15 -15
- package/dist/{reproject-worktree-memories-ZXJ4IVD6.js → reproject-worktree-memories-VVXJYJPX.js} +14 -14
- package/dist/{reranker-YJSAKEFD.js → reranker-ROOUTM6H.js} +1 -1
- package/dist/{retrieval-health-64Y2NTIE.js → retrieval-health-RJLW7V34.js} +1 -1
- package/dist/{review-polling-PXQ5IC5S.js → review-polling-OFT7YVVR.js} +15 -15
- package/dist/runtime/index.js +18 -18
- package/dist/{session-events-LAPHQWRU.js → session-events-5DMOCC55.js} +15 -15
- package/dist/{session-kill-telemetry-XUN4FONH.js → session-kill-telemetry-GQIMT6Q6.js} +15 -15
- package/dist/{session-scope-VUN67VUS.js → session-scope-2ZCD23FN.js} +14 -14
- package/dist/{setup-wizard-7LWD2JY5.js → setup-wizard-K6TQ4DUY.js} +1 -1
- package/dist/{skill-refinement-PX2NX67D.js → skill-refinement-GJ7GPZI7.js} +3 -3
- package/dist/{stack-generate-manifest-NJKCCANO.js → stack-generate-manifest-CYL3WO73.js} +4 -4
- package/dist/{stack-promote-EN3R63C6.js → stack-promote-IFBEA572.js} +4 -4
- package/dist/{stack-release-MLEECJAN.js → stack-release-WOWE5OEX.js} +4 -4
- package/dist/{stack-update-2A7WXPMD.js → stack-update-WCBBURSE.js} +3 -3
- package/dist/{steward-gate-36IPGV5I.js → steward-gate-OBUY7NHD.js} +3 -3
- package/dist/{subagent-brief-injection-YGGCLJIE.js → subagent-brief-injection-7EZOA6IB.js} +23 -23
- package/dist/{support-inbox-BQLX4YSJ.js → support-inbox-FOP23OI5.js} +6 -6
- package/dist/{task-enforcement-DZNJ4CXF.js → task-enforcement-44SYOIF2.js} +15 -15
- package/dist/{task-request-inbox-QP6MB7HA.js → task-request-inbox-GRTPLCVU.js} +1 -1
- package/dist/{task-scope-Z6J5W5Y4.js → task-scope-VD7QNIVO.js} +14 -14
- package/dist/{tasks-crud-DAAEBTCW.js → tasks-crud-XJIRYQZ7.js} +14 -14
- package/dist/{tasks-notify-AQJPJKCK.js → tasks-notify-EBKXIYFO.js} +15 -15
- package/dist/{tasks-review-UWNDMOHS.js → tasks-review-3RVFDTHF.js} +14 -14
- package/dist/{telemetry-upload-JIWLIOJV.js → telemetry-upload-IEWVUEZD.js} +7 -7
- package/dist/{token-budget-V2DU5NL6.js → token-budget-6R5E23BK.js} +3 -3
- package/dist/{tool-telemetry-BZQ57QJR.js → tool-telemetry-4Z5UN7OR.js} +1 -1
- package/dist/tui/App.js +22 -22
- package/dist/{tui-data-PQWYWSTK.js → tui-data-VJXHRQUO.js} +18 -18
- package/dist/{update-support-CBSL2OUS.js → update-support-NWGGDGBT.js} +9 -9
- package/dist/{work-claims-B6V4JJIU.js → work-claims-OFNMCIKF.js} +3 -3
- package/dist/{work-state-heartbeat-AHROBVGE.js → work-state-heartbeat-PZFJI7LF.js} +1 -1
- package/dist/{workflow-engine-6Y6RPWHJ.js → workflow-engine-WE6GMJGU.js} +2 -2
- package/dist/{worktree-LCLQUCYZ.js → worktree-WV722AND.js} +4 -4
- package/dist/{worktree-sweep-BMKJNAVK.js → worktree-sweep-ZYQWLIHA.js} +5 -5
- package/package.json +2 -1
- package/release-notes.json +13 -9
- package/stack.release.json +4 -4
- /package/dist/{chunk-AMZR7IDV.js → chunk-25DUFD2C.js} +0 -0
- /package/dist/{chunk-QS5W2LKP.js → chunk-2XIMJNWB.js} +0 -0
- /package/dist/{chunk-TJXGFTCH.js → chunk-3LITZ2RB.js} +0 -0
- /package/dist/{chunk-KAEQTXDI.js → chunk-4G5MWV7O.js} +0 -0
- /package/dist/{chunk-MKHI44BG.js → chunk-7PXV7NUN.js} +0 -0
- /package/dist/{chunk-UCYL2AZE.js → chunk-GKK7SSUW.js} +0 -0
- /package/dist/{chunk-74HDDH3D.js → chunk-HB5JD7UK.js} +0 -0
- /package/dist/{chunk-C33C62XO.js → chunk-JTOS2R26.js} +0 -0
- /package/dist/{chunk-EO5HVQSX.js → chunk-NQYXSLEM.js} +0 -0
- /package/dist/{chunk-NWEDLXRY.js → chunk-PAVF2CXV.js} +0 -0
- /package/dist/{chunk-GLZZIQ3W.js → chunk-SFUNP5Q6.js} +0 -0
- /package/dist/{chunk-3IAUJXPC.js → chunk-TGMCTZVW.js} +0 -0
- /package/dist/{chunk-AVIDWQW2.js → chunk-TYAM2ROO.js} +0 -0
- /package/dist/{core-memory-3TMXQQO2.js → core-memory-3EFPOWVG.js} +0 -0
- /package/dist/{memory-isolation-N7GUW4FA.js → memory-isolation-BWOZSIF3.js} +0 -0
- /package/dist/{oauth-server-2ZZ5Y523.js → oauth-server-ISCDJMWO.js} +0 -0
- /package/dist/{project-boot-BEYJ3OGY.js → project-boot-2JBCNWZH.js} +0 -0
- /package/dist/{wiki-acl-SX4UR544.js → wiki-acl-OLXP4N4T.js} +0 -0
|
@@ -98,7 +98,7 @@ SMTP_PASS=
|
|
|
98
98
|
# Bug 58840873: pin the auth image so compose never falls back to its stale
|
|
99
99
|
# hardcoded default tag. Keep in sync with the manifest AUTH_IMAGE_TAG. exe-auth
|
|
100
100
|
# ships only from the private update.askexe.com registry (no GHCR mirror).
|
|
101
|
-
AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.6.
|
|
101
|
+
AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.6.5@sha256:dc8c1476ef1247079a6e115450bd35681712fa06367461589998ecf943f88089
|
|
102
102
|
# Bug 379e5c13: server_name / CORS derived from the CONFIGURED apex domain,
|
|
103
103
|
# not by naive last-2-label slicing (which breaks company.co.uk → co.uk).
|
|
104
104
|
AUTH_SERVER_NAME=auth.CHANGEME_DOMAIN
|
|
@@ -171,7 +171,7 @@ EXE_CRM_ADMIN_EMAIL=CHANGEME_ADMIN_EMAIL
|
|
|
171
171
|
CRM_HOST_PORT=3000
|
|
172
172
|
|
|
173
173
|
# --- Wiki ---
|
|
174
|
-
WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.
|
|
174
|
+
WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.33@sha256:1f9e04a557c6034e0eac85ecdf76d465eab88394614184387ecf06cd2281e7d8
|
|
175
175
|
# Bug 2a8d3003 — DO NOT change this without migrating the data first.
|
|
176
176
|
# The wiki's users / workspaces / workspace_documents live in `public`. Point it at a
|
|
177
177
|
# different schema and Prisma will NOT error: it finds no tables, assumes a fresh
|
|
@@ -873,8 +873,63 @@ function normalizeClientName(clientName: string): string {
|
|
|
873
873
|
.replace(/^-|-$/g, "") || "client";
|
|
874
874
|
}
|
|
875
875
|
|
|
876
|
-
|
|
877
|
-
|
|
876
|
+
// Bug 5dc66955: a multi-word value (e.g. an SSH public key —
|
|
877
|
+
// "ssh-ed25519 AAAA... comment") written to .env WITHOUT quoting breaks every
|
|
878
|
+
// shell consumer that does `set -a; . /opt/exe-stack/.env`. The shell parses
|
|
879
|
+
// the first whitespace-delimited token as VAR=first-word, then tries to RUN
|
|
880
|
+
// the second token as a command:
|
|
881
|
+
// /opt/exe-stack/.env: line N: AAAAC3NzaC1lZDI1NTE5...: command not found
|
|
882
|
+
// Under `set -e` that aborts the whole source mid-file, leaving every var
|
|
883
|
+
// after the bad line unset while the script believes the environment loaded.
|
|
884
|
+
// Docker Compose's own env_file parser tolerates bare multi-word values (it
|
|
885
|
+
// reads to end-of-line, not to the first space), which is exactly why this
|
|
886
|
+
// class of bug goes unnoticed — only shell consumers break, and nothing here
|
|
887
|
+
// exercises that path.
|
|
888
|
+
//
|
|
889
|
+
// INVESTIGATED: this generator does NOT currently emit that SSH-key line —
|
|
890
|
+
// grepped every value it writes (deploy/compose/generate-env.ts,
|
|
891
|
+
// .env.example, .env.customer.example) and none holds an SSH key or any
|
|
892
|
+
// other value containing a space; ssh_public_key lives only in the Ansible
|
|
893
|
+
// role (deploy/ansible/group_vars/all.yml), which is a wholly separate write
|
|
894
|
+
// path that never touches this file. So /opt/exe-stack/.env line 38 was
|
|
895
|
+
// hand-edited on the host — that repair is NOT made here, on purpose (an
|
|
896
|
+
// operator-maintained host file is not something to guess at from the repo).
|
|
897
|
+
//
|
|
898
|
+
// Quoting is applied ONLY to values that actually need it (contain
|
|
899
|
+
// whitespace), not blanket-applied to every line. Several deploy scripts
|
|
900
|
+
// read specific .env values with `grep '^VAR=' .env | cut -d= -f2-`
|
|
901
|
+
// (deploy/upgrade.sh, deploy/compose/{setup,backup}.sh,
|
|
902
|
+
// deploy/host/exe-db-jkt/*) — those return the literal text after `=`,
|
|
903
|
+
// quote characters included, so blanket-quoting every existing token/URL/key
|
|
904
|
+
// value would silently inject stray `'` characters into every one of those
|
|
905
|
+
// currently-unquoted, single-word values. Every value this generator emits
|
|
906
|
+
// today is single-word (verified: no `=` line here contains a space), so
|
|
907
|
+
// conditional quoting changes NOTHING for any value produced today — it only
|
|
908
|
+
// activates for the next multi-word value someone adds, which is exactly the
|
|
909
|
+
// pattern this bug is about (and which would already be broken for
|
|
910
|
+
// `set -a; .` sourcing, quoted or not, if left bare).
|
|
911
|
+
function quoteEnvValue(value: string): string {
|
|
912
|
+
// Single-quote: no escape-sequence interpretation to worry about (unlike
|
|
913
|
+
// double quotes), just the standard shell trick for an embedded quote —
|
|
914
|
+
// close the quote, emit an escaped one, reopen it.
|
|
915
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
const ENV_ASSIGNMENT = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/;
|
|
919
|
+
const NEEDS_QUOTING = /[ \t]/;
|
|
920
|
+
|
|
921
|
+
function quoteEnvLine(line: string): string {
|
|
922
|
+
const match = ENV_ASSIGNMENT.exec(line);
|
|
923
|
+
if (!match) return line; // comments, blank lines, section headers — untouched
|
|
924
|
+
const [, key, value] = match;
|
|
925
|
+
if (!NEEDS_QUOTING.test(value)) return line; // no whitespace — nothing to break, leave bare
|
|
926
|
+
const alreadyQuoted = /^'.*'$|^".*"$/.test(value);
|
|
927
|
+
if (alreadyQuoted) return line;
|
|
928
|
+
return `${key}=${quoteEnvValue(value)}`;
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
export function joinEnvLines(lines: string[]): string {
|
|
932
|
+
return `${lines.map(quoteEnvLine).join("\n")}\n`;
|
|
878
933
|
}
|
|
879
934
|
|
|
880
935
|
function printUsage(): void {
|
|
@@ -16,18 +16,38 @@
|
|
|
16
16
|
# in the entrypoint so envsubst leaves them untouched.
|
|
17
17
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
# Backend hostnames (bug 94a6a19a — see the resolver note below for why these
|
|
20
|
+
# are no longer `upstream {}` blocks).
|
|
21
|
+
#
|
|
22
22
|
# ERP must be reached through its own nginx (gunicorn can't serve /assets/ — bug 6776edf0)
|
|
23
|
-
|
|
23
|
+
#
|
|
24
24
|
# Dashboard — must be on the same docker network as exe-sso-edge.
|
|
25
25
|
# If the dashboard uses a separate compose (dashboard-page/docker-compose.yml),
|
|
26
26
|
# ensure it joins exe-os_backend or exe-os_frontend (not the legacy exe-net).
|
|
27
|
-
|
|
27
|
+
#
|
|
28
28
|
# Shared GoTrue — the sso-redirect snippet's /_sso_gate validates ?access_token=
|
|
29
|
-
# against GET /user here instead of trusting
|
|
30
|
-
|
|
29
|
+
# / the Bearer header against GET /user here instead of trusting presence
|
|
30
|
+
# alone (P0 bug 462d3273, bug cc40e9ea).
|
|
31
|
+
#
|
|
32
|
+
# STALE-IP FIX (bug 94a6a19a): these used to be static `upstream sso_X {
|
|
33
|
+
# server host:port; }` blocks. An nginx `upstream` block resolves its
|
|
34
|
+
# `server` hostnames ONCE, at config load (container start or `nginx -s
|
|
35
|
+
# reload`), and then proxies to that cached IP forever — Docker's embedded
|
|
36
|
+
# DNS (127.0.0.11) is never consulted again. When a backend container is
|
|
37
|
+
# recreated (redeploy, `docker compose up -d <service>`, OOM restart, ...) it
|
|
38
|
+
# gets a new IP; the edge keeps sending traffic to the dead old one and every
|
|
39
|
+
# request 502s until someone reloads/restarts THIS container too, which is
|
|
40
|
+
# not otherwise required for a backend-only change.
|
|
41
|
+
#
|
|
42
|
+
# Fix: no `upstream` block, plus an explicit `resolver` pointed at Docker's
|
|
43
|
+
# embedded DNS with a short TTL, plus a `set $x_upstream host:port;` in each
|
|
44
|
+
# server block. Putting the hostname in a variable is what makes nginx defer
|
|
45
|
+
# resolution to REQUEST time instead of config-load time — a static
|
|
46
|
+
# `proxy_pass http://exe-crm:3000;` with no variable is just as stale as the
|
|
47
|
+
# upstream block was. `valid=10s` bounds how long a dead IP can keep being
|
|
48
|
+
# used after a recreate to one DNS TTL, without hammering the embedded
|
|
49
|
+
# resolver on every request.
|
|
50
|
+
resolver 127.0.0.11 valid=10s ipv6=off;
|
|
31
51
|
|
|
32
52
|
# Extract the SSO callback token from the request line (P0 bug 462d3273).
|
|
33
53
|
# The gate's auth_request subrequest does not inherit the query string, but it
|
|
@@ -37,6 +57,22 @@ map $request_uri $sso_uri_access_token {
|
|
|
37
57
|
"~[?&]access_token=(?<tok>[^&]+)" $tok;
|
|
38
58
|
}
|
|
39
59
|
|
|
60
|
+
# Extract a Developer API bearer token from `Authorization: Bearer <token>`
|
|
61
|
+
# (bug cc40e9ea). auth_request DOES inherit request headers (unlike the query
|
|
62
|
+
# string above), so the subrequest reads this directly off $http_authorization.
|
|
63
|
+
# Anchored to require the `Bearer` scheme (case-insensitive) and at least one
|
|
64
|
+
# non-whitespace token character; a missing header, an empty/whitespace-only
|
|
65
|
+
# token, or any other scheme (Basic, Digest, a bare garbage string) all miss
|
|
66
|
+
# every arm and resolve to the map's `default ""` below — presence of the
|
|
67
|
+
# header alone can never satisfy this map. The extracted value is still only a
|
|
68
|
+
# CANDIDATE credential: sso-redirect.conf's /_sso_gate validates it against
|
|
69
|
+
# GoTrue /user in step 3 exactly like every other bearer source, so a
|
|
70
|
+
# well-formed-but-invalid token is rejected there, not trusted here.
|
|
71
|
+
map $http_authorization $sso_header_bearer {
|
|
72
|
+
default "";
|
|
73
|
+
"~*^Bearer\s+(?<tok>\S.*)$" $tok;
|
|
74
|
+
}
|
|
75
|
+
|
|
40
76
|
# Extract the shared apex SSO cookie from the Cookie header.
|
|
41
77
|
#
|
|
42
78
|
# THE COOKIE IS `exe_access_token` (bug 21ae2388). This map previously matched
|
|
@@ -105,21 +141,33 @@ server {
|
|
|
105
141
|
set $sso_app_url "https://crm.${DOMAIN}";
|
|
106
142
|
set $sso_product "CRM";
|
|
107
143
|
set $sso_session_cookie $cookie_tokenPair; # Twenty/CRM session cookie
|
|
144
|
+
# Re-resolved per request via the file-level `resolver` (bug 94a6a19a) —
|
|
145
|
+
# see the note above the old upstream blocks.
|
|
146
|
+
set $crm_upstream exe-crm:3000;
|
|
147
|
+
set $gotrue_upstream gotrue:9999; # used by sso-redirect.conf's /_sso_gate
|
|
108
148
|
include /etc/nginx/snippets/sso-redirect.conf;
|
|
109
149
|
|
|
110
150
|
# Bug d3ba1136: public monitors hit /health as well as /healthz. Keep both
|
|
111
151
|
# exact paths outside the SSO gate and proxy them to CRM's real health
|
|
112
152
|
# endpoint so they never fall through to the app shell HTML.
|
|
113
|
-
location = /health { auth_request off; proxy_pass http
|
|
114
|
-
location = /healthz { auth_request off; proxy_pass http
|
|
153
|
+
location = /health { auth_request off; proxy_pass http://$crm_upstream/healthz; }
|
|
154
|
+
location = /healthz { auth_request off; proxy_pass http://$crm_upstream/healthz; }
|
|
115
155
|
|
|
116
156
|
# Logout endpoint must be exempt from SSO gate (bug 96f8b2b2). Without this,
|
|
117
157
|
# /auth/logout triggers 401 -> redirect to auth with logout URL as redirect param
|
|
118
158
|
# -> infinite loop. Let the app handle logout (clear its own cookies), then it
|
|
119
159
|
# redirects to auth.askexe.com/logout for the central SSO cookie clear.
|
|
120
|
-
location = /auth/logout { auth_request off; proxy_pass http
|
|
121
|
-
|
|
122
|
-
|
|
160
|
+
location = /auth/logout { auth_request off; proxy_pass http://$crm_upstream/auth/logout; }
|
|
161
|
+
|
|
162
|
+
# No URI after $crm_upstream (bug 94a6a19a): nginx's location-prefix
|
|
163
|
+
# substitution (the thing a *static* `proxy_pass http://host/path;` relies
|
|
164
|
+
# on) is only computed for a literal, config-time-known target. The moment
|
|
165
|
+
# the host is a variable, that substitution is undefined, so the directive
|
|
166
|
+
# must be written exactly as it was before (bare host, no trailing path) —
|
|
167
|
+
# nginx then falls back to its other documented behavior for "proxy_pass
|
|
168
|
+
# without URI": forward $request_uri unchanged. That is the exact routing
|
|
169
|
+
# this location already had; only the DNS timing changed.
|
|
170
|
+
location / { proxy_pass http://$crm_upstream; }
|
|
123
171
|
}
|
|
124
172
|
|
|
125
173
|
# ── Wiki ─────────────────────────────────────────────────────────────────────
|
|
@@ -149,18 +197,21 @@ server {
|
|
|
149
197
|
# If exe-wiki ever mints a real server-side session cookie, set that name
|
|
150
198
|
# here — never the sentinel.
|
|
151
199
|
set $sso_session_cookie "";
|
|
200
|
+
set $wiki_upstream exe-wiki:3001; # re-resolved per request (bug 94a6a19a)
|
|
201
|
+
set $gotrue_upstream gotrue:9999; # used by sso-redirect.conf's /_sso_gate
|
|
152
202
|
include /etc/nginx/snippets/sso-redirect.conf;
|
|
153
203
|
|
|
154
204
|
# Bug d3ba1136: wiki's actual health probe is /api/ping. Expose the standard
|
|
155
205
|
# monitor aliases as exact, ungated health routes so /health cannot return
|
|
156
206
|
# a false-healthy SPA HTML page.
|
|
157
|
-
location = /health { auth_request off; proxy_pass http
|
|
158
|
-
location = /healthz { auth_request off; proxy_pass http
|
|
207
|
+
location = /health { auth_request off; proxy_pass http://$wiki_upstream/api/ping; }
|
|
208
|
+
location = /healthz { auth_request off; proxy_pass http://$wiki_upstream/api/ping; }
|
|
159
209
|
|
|
160
210
|
# Logout endpoint must be exempt from SSO gate (bug 96f8b2b2).
|
|
161
|
-
location = /auth/logout { auth_request off; proxy_pass http
|
|
211
|
+
location = /auth/logout { auth_request off; proxy_pass http://$wiki_upstream/auth/logout; }
|
|
162
212
|
|
|
163
|
-
|
|
213
|
+
# No URI after $wiki_upstream — see the CRM vhost's comment above (bug 94a6a19a).
|
|
214
|
+
location / { proxy_pass http://$wiki_upstream; }
|
|
164
215
|
}
|
|
165
216
|
|
|
166
217
|
# ── Auth ─────────────────────────────────────────────────────────────────────
|
|
@@ -168,12 +219,17 @@ server {
|
|
|
168
219
|
listen 80;
|
|
169
220
|
server_name auth.${DOMAIN};
|
|
170
221
|
|
|
222
|
+
# Re-resolved per request via the file-level `resolver` (bug 94a6a19a).
|
|
223
|
+
set $gotrue_upstream gotrue:9999;
|
|
224
|
+
set $auth_upstream exe-auth:80;
|
|
225
|
+
|
|
171
226
|
# Route auth.<domain> through this edge too, so exact health aliases can
|
|
172
227
|
# probe GoTrue instead of the auth SPA's nginx fallback.
|
|
173
|
-
location = /health { proxy_pass http
|
|
174
|
-
location = /healthz { proxy_pass http
|
|
228
|
+
location = /health { proxy_pass http://$gotrue_upstream/health; }
|
|
229
|
+
location = /healthz { proxy_pass http://$gotrue_upstream/health; }
|
|
175
230
|
|
|
176
|
-
|
|
231
|
+
# No URI after $auth_upstream — see the CRM vhost's comment (bug 94a6a19a).
|
|
232
|
+
location / { proxy_pass http://$auth_upstream; }
|
|
177
233
|
}
|
|
178
234
|
|
|
179
235
|
# ── ERP ──────────────────────────────────────────────────────────────────────
|
|
@@ -185,6 +241,9 @@ server {
|
|
|
185
241
|
set $sso_app_url "https://erp.${DOMAIN}";
|
|
186
242
|
set $sso_product "ERP";
|
|
187
243
|
set $sso_session_cookie $cookie_sid; # Frappe/ERPNext session cookie
|
|
244
|
+
# Re-resolved per request via the file-level `resolver` (bug 94a6a19a).
|
|
245
|
+
set $erp_upstream exe-erp-nginx:80;
|
|
246
|
+
set $gotrue_upstream gotrue:9999; # used by sso-redirect.conf's /_sso_gate
|
|
188
247
|
include /etc/nginx/snippets/sso-redirect.conf;
|
|
189
248
|
|
|
190
249
|
# ERP is the one upstream that runs a realtime socket.io service with
|
|
@@ -195,8 +254,10 @@ server {
|
|
|
195
254
|
# headers, so every desk socket.io connection is rejected and the desk
|
|
196
255
|
# shows "Error connecting to socket.io: Invalid origin" (found in the
|
|
197
256
|
# 2026-09-02 four-domain demo verification).
|
|
257
|
+
#
|
|
258
|
+
# No URI after $erp_upstream — see the CRM vhost's comment (bug 94a6a19a).
|
|
198
259
|
location / {
|
|
199
|
-
proxy_pass http
|
|
260
|
+
proxy_pass http://$erp_upstream;
|
|
200
261
|
proxy_set_header Host $host;
|
|
201
262
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
202
263
|
# Literal https, matching the template-level convention at the top of
|
|
@@ -226,15 +287,18 @@ server {
|
|
|
226
287
|
# app-native session cookie to name instead, so leave this empty and let
|
|
227
288
|
# steps 2-3 validate the apex `exe_sess` cookie against GoTrue.
|
|
228
289
|
set $sso_session_cookie "";
|
|
290
|
+
set $dashboard_upstream exe-dashboard:80; # re-resolved per request (bug 94a6a19a)
|
|
291
|
+
set $gotrue_upstream gotrue:9999; # used by sso-redirect.conf's /_sso_gate
|
|
229
292
|
include /etc/nginx/snippets/sso-redirect.conf;
|
|
230
293
|
|
|
231
|
-
location = /health { auth_request off; proxy_pass http
|
|
232
|
-
location = /healthz { auth_request off; proxy_pass http
|
|
294
|
+
location = /health { auth_request off; proxy_pass http://$dashboard_upstream/health; }
|
|
295
|
+
location = /healthz { auth_request off; proxy_pass http://$dashboard_upstream/health; }
|
|
233
296
|
|
|
234
297
|
# Logout endpoint must be exempt from SSO gate (bug 96f8b2b2).
|
|
235
|
-
location = /auth/logout { auth_request off; proxy_pass http
|
|
298
|
+
location = /auth/logout { auth_request off; proxy_pass http://$dashboard_upstream/auth/logout; }
|
|
236
299
|
|
|
237
|
-
|
|
300
|
+
# No URI after $dashboard_upstream — see the CRM vhost's comment (bug 94a6a19a).
|
|
301
|
+
location / { proxy_pass http://$dashboard_upstream; }
|
|
238
302
|
}
|
|
239
303
|
|
|
240
304
|
# Default — unknown host or edge-generated error → branded shared error pages
|
|
@@ -38,13 +38,18 @@
|
|
|
38
38
|
# These are templated values — replace before installing, or render with envsubst
|
|
39
39
|
# (DOMAIN, APP_NAME, APP_SUBDOMAIN, APP_SESSION_COOKIE):
|
|
40
40
|
#
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
#
|
|
41
|
+
# FOUR http-context declarations MUST exist once per nginx config (the
|
|
42
|
+
# compose edge ships them in sso-edge/default.conf.template; host-nginx
|
|
43
|
+
# installs add them next to their `include`s — see sso-redirect.README.md):
|
|
44
44
|
# #
|
|
45
|
-
# # 1.
|
|
46
|
-
# #
|
|
47
|
-
#
|
|
45
|
+
# # 1. A resolver + a per-server $gotrue_upstream variable the gate
|
|
46
|
+
# # validates tokens against (bug 94a6a19a: a static `upstream sso_gotrue
|
|
47
|
+
# # { server ...; }` block resolves its hostname ONCE at config load and
|
|
48
|
+
# # never re-resolves it, so it goes stale — and 502s — the moment the
|
|
49
|
+
# # GoTrue container is recreated with a new IP):
|
|
50
|
+
# resolver 127.0.0.11 valid=10s ipv6=off; # Docker embedded DNS (host nginx: your resolver)
|
|
51
|
+
# # ... then inside EACH server block that includes this snippet:
|
|
52
|
+
# # set $gotrue_upstream gotrue:9999; # compose: container name; host nginx: 127.0.0.1:9999
|
|
48
53
|
# # 2. The callback-token extractor. The auth_request subrequest does not
|
|
49
54
|
# # inherit the query string, but it DOES inherit $request_uri, so the
|
|
50
55
|
# # token is mapped from it:
|
|
@@ -52,7 +57,16 @@
|
|
|
52
57
|
# default "";
|
|
53
58
|
# "~[?&]access_token=(?<tok>[^&]+)" $tok;
|
|
54
59
|
# }
|
|
55
|
-
# # 3. The
|
|
60
|
+
# # 3. The Developer API bearer-header extractor (bug cc40e9ea) — a
|
|
61
|
+
# # well-formed `Authorization: Bearer <token>` request must be read at
|
|
62
|
+
# # the edge or a programmatic client always falls through to a 401 ->
|
|
63
|
+
# # HTML login redirect. Extraction only; step 3 below still validates
|
|
64
|
+
# # whatever this pulls out against GoTrue before trusting it:
|
|
65
|
+
# map $http_authorization $sso_header_bearer {
|
|
66
|
+
# default "";
|
|
67
|
+
# "~*^Bearer\s+(?<tok>\S.*)$" $tok;
|
|
68
|
+
# }
|
|
69
|
+
# # 4. The shared apex SSO cookie — the cross-app-logout signal. The name is
|
|
56
70
|
# # `exe_access_token` (bug 21ae2388: this used to read a nonexistent
|
|
57
71
|
# # `exe-auth`, which 401'd every authenticated request). Presence only —
|
|
58
72
|
# # the value is the literal "1", never a bearer token:
|
|
@@ -227,7 +241,30 @@ location = /_sso_gate {
|
|
|
227
241
|
# Precedence keeps the callback param first purely for backward
|
|
228
242
|
# compatibility with any older auth build still mid-rollout; it is still
|
|
229
243
|
# validated, never trusted on presence (bug 462d3273 stays fixed).
|
|
244
|
+
#
|
|
245
|
+
# Bug cc40e9ea: an `Authorization: Bearer <token>` request — the
|
|
246
|
+
# Developer API pattern — was never inspected at all (nothing here read
|
|
247
|
+
# $http_authorization), so a programmatic client always fell through to
|
|
248
|
+
# "no credential" and got a 401 -> HTML login redirect for what should
|
|
249
|
+
# have been an API response. $sso_header_bearer (map on $http_authorization,
|
|
250
|
+
# defined alongside the other gate maps) extracts the token ONLY when the
|
|
251
|
+
# header is a well-formed `Bearer <token>`; a missing header, a header
|
|
252
|
+
# with no scheme, an empty/whitespace-only token, or a non-Bearer scheme
|
|
253
|
+
# (e.g. Basic) all fail the map and leave this "" — they fall through to
|
|
254
|
+
# the cookie arm exactly like today, never satisfying the gate on
|
|
255
|
+
# presence alone. Whatever token IS extracted is still just a candidate:
|
|
256
|
+
# it flows into the same step 3 GoTrue /user validation as every other
|
|
257
|
+
# source below, so a well-formed-but-bogus Bearer value is rejected
|
|
258
|
+
# there, not trusted here. This is chosen over exempting an /api/v1/*
|
|
259
|
+
# path prefix (rejected: a path exemption widens the unauthenticated
|
|
260
|
+
# surface to anything ever served under that prefix, present or future;
|
|
261
|
+
# a header check narrows to a single well-formed credential shape and
|
|
262
|
+
# still funnels through the existing validation, so it cannot become a
|
|
263
|
+
# bypass on its own).
|
|
230
264
|
set $sso_bearer $sso_uri_access_token;
|
|
265
|
+
if ($sso_bearer = "") {
|
|
266
|
+
set $sso_bearer $sso_header_bearer;
|
|
267
|
+
}
|
|
231
268
|
if ($sso_bearer = "") {
|
|
232
269
|
set $sso_bearer $cookie_exe_sess;
|
|
233
270
|
}
|
|
@@ -246,7 +283,10 @@ location = /_sso_gate {
|
|
|
246
283
|
# server-side exchange of the apex `exe_sess` cookie for its own session
|
|
247
284
|
# (exe-wiki / exe-erp / exe-crm, bug d0652644 and related) — the edge is
|
|
248
285
|
# the login funnel, not the authorization boundary, exactly as before.
|
|
249
|
-
|
|
286
|
+
# $gotrue_upstream is set by every including server block (bug 94a6a19a —
|
|
287
|
+
# re-resolved per request via the file-level `resolver`, not a static
|
|
288
|
+
# upstream{} cached at config load).
|
|
289
|
+
proxy_pass http://$gotrue_upstream/user;
|
|
250
290
|
proxy_pass_request_body off;
|
|
251
291
|
proxy_set_header Content-Length "";
|
|
252
292
|
proxy_set_header Authorization "Bearer $sso_bearer";
|
|
@@ -2721,11 +2721,13 @@
|
|
|
2721
2721
|
"category": "app"
|
|
2722
2722
|
},
|
|
2723
2723
|
"wiki": {
|
|
2724
|
-
"image": "update.askexe.com/askexe/exe-wiki:v0.9.
|
|
2724
|
+
"image": "update.askexe.com/askexe/exe-wiki:v0.9.33@sha256:1f9e04a557c6034e0eac85ecdf76d465eab88394614184387ecf06cd2281e7d8",
|
|
2725
2725
|
"env": "WIKI_IMAGE_TAG",
|
|
2726
2726
|
"composeService": "exe-wiki",
|
|
2727
2727
|
"healthUrl": "http://127.0.0.1:3001/api/ping",
|
|
2728
|
-
"category": "app"
|
|
2728
|
+
"category": "app",
|
|
2729
|
+
"description": "exe-wiki v0.9.33 — typography unified onto the shared @askexenow/exe-theme tokens. plus-jakarta-sans removed repo-wide, and a latent bug fixed: font-headline was defined in Tailwind but no rule ever applied it, so h1-h6 had silently inherited the body font and wiki headings had never once rendered in Epilogue. Also dark first paint before stylesheets load, so switching between CRM, wiki and ERP no longer flashes white.",
|
|
2730
|
+
"gitSha": "3f35bd9c52543987e2ebaec9e5876cc6c6fd8f3a"
|
|
2729
2731
|
},
|
|
2730
2732
|
"gateway": {
|
|
2731
2733
|
"image": "update.askexe.com/askexe/exe-gateway:v2026.08.07-c15f093-stamped@sha256:1bc11a2a0ad1f3929d59d2685696f22a72042b9fca9c75e15c02dc7d3c640105",
|
|
@@ -2752,13 +2754,13 @@
|
|
|
2752
2754
|
"gitSha": "10660eb4abdeffbcba2aad13549aa58e208ac7a3"
|
|
2753
2755
|
},
|
|
2754
2756
|
"auth": {
|
|
2755
|
-
"image": "update.askexe.com/askexe/exe-auth:v0.6.
|
|
2757
|
+
"image": "update.askexe.com/askexe/exe-auth:v0.6.5@sha256:dc8c1476ef1247079a6e115450bd35681712fa06367461589998ecf943f88089",
|
|
2756
2758
|
"env": "AUTH_IMAGE_TAG",
|
|
2757
2759
|
"composeService": "exe-auth",
|
|
2758
2760
|
"healthUrl": "http://127.0.0.1:3300/api/health",
|
|
2759
2761
|
"category": "auth",
|
|
2760
|
-
"description": "exe-auth v0.6.
|
|
2761
|
-
"gitSha": "
|
|
2762
|
+
"description": "exe-auth v0.6.5 — an already-authenticated user switching between ERP, wiki and CRM no longer sees the login page flash. The session is now validated SERVER-SIDE before any login markup is sent, so an authenticated request gets a bare 302 (bug 910ff2a5). A forged exe_access_token sentinel still receives the login page, so this is not an auth bypass. Also strips the leading dot from AUTH_COOKIE_DOMAIN (bug ee4b831d).",
|
|
2763
|
+
"gitSha": "e119d1fa1fd08f2faf951f9998fe33393cf8b258"
|
|
2762
2764
|
},
|
|
2763
2765
|
"erp": {
|
|
2764
2766
|
"image": "update.askexe.com/askexe/exe-erp:v2026.08.07-d185286-stamped@sha256:1c655f3f7819c797afd13c79561354f0276cf337403f32aee3e406a497e8827b",
|
|
@@ -2809,6 +2811,6 @@
|
|
|
2809
2811
|
"signature": {
|
|
2810
2812
|
"keyId": "exe-stack-1",
|
|
2811
2813
|
"alg": "ed25519",
|
|
2812
|
-
"signature": "
|
|
2814
|
+
"signature": "UAQm9FB5Ai8KaBSGe6LEkBfXZ3XtBFT/5/8DozCK1v7f8llD33AhrAF11HEttf33z3w/weWhxZEXG3yGIWw/Dg=="
|
|
2813
2815
|
}
|
|
2814
2816
|
}
|
package/dist/.dist-verified.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 1,
|
|
3
|
-
"verified_at": "2026-09-
|
|
4
|
-
"manifest_sha256": "
|
|
5
|
-
"package_version": "0.9.
|
|
3
|
+
"verified_at": "2026-09-08T02:19:11.078Z",
|
|
4
|
+
"manifest_sha256": "b55b6c21dd560116c3ce9ca67bbfc648b6a910b0bed064e64b9f36e13576ea74",
|
|
5
|
+
"package_version": "0.9.381"
|
|
6
6
|
}
|
|
@@ -8,15 +8,15 @@ import {
|
|
|
8
8
|
resolveAgentAttribution,
|
|
9
9
|
resolveAgentForPayload,
|
|
10
10
|
writeActiveAgent
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-TKTEFYPH.js";
|
|
12
12
|
import "./chunk-K4ESASPL.js";
|
|
13
13
|
import "./chunk-CVYC6DUW.js";
|
|
14
14
|
import "./chunk-GJV3WDWM.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-MAOKR5AL.js";
|
|
16
16
|
import "./chunk-BBMTVAE3.js";
|
|
17
17
|
import "./chunk-TKDITWDN.js";
|
|
18
18
|
import "./chunk-5YEUPUV4.js";
|
|
19
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-GODDBYPL.js";
|
|
20
20
|
import "./chunk-YYB5PMTK.js";
|
|
21
21
|
import "./chunk-L5CGXEZC.js";
|
|
22
22
|
import "./chunk-CL4J4757.js";
|
|
@@ -7,15 +7,15 @@ import {
|
|
|
7
7
|
resolveAgentAttribution,
|
|
8
8
|
resolveAgentForPayload,
|
|
9
9
|
writeActiveAgent
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-TKTEFYPH.js";
|
|
11
11
|
import "./chunk-K4ESASPL.js";
|
|
12
12
|
import "./chunk-CVYC6DUW.js";
|
|
13
13
|
import "./chunk-GJV3WDWM.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-MAOKR5AL.js";
|
|
15
15
|
import "./chunk-BBMTVAE3.js";
|
|
16
16
|
import "./chunk-TKDITWDN.js";
|
|
17
17
|
import "./chunk-5YEUPUV4.js";
|
|
18
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-GODDBYPL.js";
|
|
19
19
|
import "./chunk-YYB5PMTK.js";
|
|
20
20
|
import "./chunk-L5CGXEZC.js";
|
|
21
21
|
import "./chunk-CL4J4757.js";
|
|
@@ -5,11 +5,11 @@ import "./chunk-AM7S2TY6.js";
|
|
|
5
5
|
import {
|
|
6
6
|
loadEmployeesSync,
|
|
7
7
|
validateEmployeeName
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-MAOKR5AL.js";
|
|
9
9
|
import "./chunk-BBMTVAE3.js";
|
|
10
10
|
import "./chunk-TKDITWDN.js";
|
|
11
11
|
import "./chunk-5YEUPUV4.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-GODDBYPL.js";
|
|
13
13
|
import "./chunk-YYB5PMTK.js";
|
|
14
14
|
import "./chunk-L5CGXEZC.js";
|
|
15
15
|
import "./chunk-CL4J4757.js";
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
import {
|
|
3
3
|
disposeStore,
|
|
4
4
|
initStore
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-OKLZXKO6.js";
|
|
6
|
+
import "./chunk-TYAM2ROO.js";
|
|
7
7
|
import "./chunk-CHCA3ZM2.js";
|
|
8
8
|
import "./chunk-OTVEIJUQ.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-SFUNP5Q6.js";
|
|
10
10
|
import "./chunk-5MOYSU5A.js";
|
|
11
11
|
import "./chunk-5QCIWWFA.js";
|
|
12
12
|
import "./chunk-76CJBM36.js";
|
|
@@ -15,11 +15,11 @@ import {
|
|
|
15
15
|
getClient,
|
|
16
16
|
getEmployeeNamesByRole,
|
|
17
17
|
loadEmployeesSync
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-MAOKR5AL.js";
|
|
19
19
|
import "./chunk-BBMTVAE3.js";
|
|
20
20
|
import "./chunk-TKDITWDN.js";
|
|
21
21
|
import "./chunk-5YEUPUV4.js";
|
|
22
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-GODDBYPL.js";
|
|
23
23
|
import "./chunk-YYB5PMTK.js";
|
|
24
24
|
import "./chunk-L5CGXEZC.js";
|
|
25
25
|
import "./chunk-CL4J4757.js";
|
|
@@ -19,19 +19,19 @@ import {
|
|
|
19
19
|
selectInjectedBehaviors,
|
|
20
20
|
selectRelevantBehaviors,
|
|
21
21
|
selectRelevantBehaviorsWithReasons
|
|
22
|
-
} from "./chunk-
|
|
23
|
-
import "./chunk-
|
|
22
|
+
} from "./chunk-CSAK5WHK.js";
|
|
23
|
+
import "./chunk-VMEZNP7H.js";
|
|
24
24
|
import "./chunk-QV5CQLQH.js";
|
|
25
25
|
import "./chunk-QGGH7LOU.js";
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-
|
|
26
|
+
import "./chunk-OKLZXKO6.js";
|
|
27
|
+
import "./chunk-TYAM2ROO.js";
|
|
28
28
|
import "./chunk-CHCA3ZM2.js";
|
|
29
29
|
import "./chunk-OTVEIJUQ.js";
|
|
30
|
-
import "./chunk-
|
|
30
|
+
import "./chunk-SFUNP5Q6.js";
|
|
31
31
|
import "./chunk-5MOYSU5A.js";
|
|
32
32
|
import "./chunk-5QCIWWFA.js";
|
|
33
33
|
import "./chunk-76CJBM36.js";
|
|
34
|
-
import "./chunk-
|
|
34
|
+
import "./chunk-WATC3K3F.js";
|
|
35
35
|
import "./chunk-ZKJ5S23O.js";
|
|
36
36
|
import "./chunk-GPUOUUHA.js";
|
|
37
37
|
import "./chunk-BTSWFMEH.js";
|
|
@@ -41,11 +41,11 @@ import "./chunk-NLEW62VC.js";
|
|
|
41
41
|
import "./chunk-GPJIBLP4.js";
|
|
42
42
|
import "./chunk-V3WLC5TJ.js";
|
|
43
43
|
import "./chunk-MP2AFCGL.js";
|
|
44
|
-
import "./chunk-
|
|
44
|
+
import "./chunk-MAOKR5AL.js";
|
|
45
45
|
import "./chunk-BBMTVAE3.js";
|
|
46
46
|
import "./chunk-TKDITWDN.js";
|
|
47
47
|
import "./chunk-5YEUPUV4.js";
|
|
48
|
-
import "./chunk-
|
|
48
|
+
import "./chunk-GODDBYPL.js";
|
|
49
49
|
import "./chunk-YYB5PMTK.js";
|
|
50
50
|
import "./chunk-L5CGXEZC.js";
|
|
51
51
|
import "./chunk-CL4J4757.js";
|
|
@@ -9,15 +9,15 @@ import {
|
|
|
9
9
|
listPromotionCandidates,
|
|
10
10
|
promoteBehaviorToIdentity,
|
|
11
11
|
promotedRulesDropped
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-CURJYC3V.js";
|
|
13
|
+
import "./chunk-VMEZNP7H.js";
|
|
14
14
|
import "./chunk-QV5CQLQH.js";
|
|
15
15
|
import "./chunk-QGGH7LOU.js";
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-OKLZXKO6.js";
|
|
17
|
+
import "./chunk-TYAM2ROO.js";
|
|
18
18
|
import "./chunk-CHCA3ZM2.js";
|
|
19
19
|
import "./chunk-OTVEIJUQ.js";
|
|
20
|
-
import "./chunk-
|
|
20
|
+
import "./chunk-SFUNP5Q6.js";
|
|
21
21
|
import "./chunk-5MOYSU5A.js";
|
|
22
22
|
import "./chunk-5QCIWWFA.js";
|
|
23
23
|
import "./chunk-76CJBM36.js";
|
|
@@ -30,11 +30,11 @@ import "./chunk-NLEW62VC.js";
|
|
|
30
30
|
import "./chunk-GPJIBLP4.js";
|
|
31
31
|
import "./chunk-V3WLC5TJ.js";
|
|
32
32
|
import "./chunk-MP2AFCGL.js";
|
|
33
|
-
import "./chunk-
|
|
33
|
+
import "./chunk-MAOKR5AL.js";
|
|
34
34
|
import "./chunk-BBMTVAE3.js";
|
|
35
35
|
import "./chunk-TKDITWDN.js";
|
|
36
36
|
import "./chunk-5YEUPUV4.js";
|
|
37
|
-
import "./chunk-
|
|
37
|
+
import "./chunk-GODDBYPL.js";
|
|
38
38
|
import "./chunk-YYB5PMTK.js";
|
|
39
39
|
import "./chunk-L5CGXEZC.js";
|
|
40
40
|
import "./chunk-CL4J4757.js";
|