oc-codex-multi-auth 6.0.0
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/LICENSE +21 -0
- package/README.md +162 -0
- package/assets/opencode-logo-ornate-dark.svg +18 -0
- package/assets/readme-hero.svg +31 -0
- package/config/README.md +96 -0
- package/config/minimal-opencode.json +13 -0
- package/config/opencode-legacy.json +871 -0
- package/config/opencode-modern.json +358 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5008 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/accounts/rate-limits.d.ts +22 -0
- package/dist/lib/accounts/rate-limits.d.ts.map +1 -0
- package/dist/lib/accounts/rate-limits.js +63 -0
- package/dist/lib/accounts/rate-limits.js.map +1 -0
- package/dist/lib/accounts.d.ts +134 -0
- package/dist/lib/accounts.d.ts.map +1 -0
- package/dist/lib/accounts.js +795 -0
- package/dist/lib/accounts.js.map +1 -0
- package/dist/lib/audit.d.ts +45 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +154 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/auth/auth.d.ts +51 -0
- package/dist/lib/auth/auth.d.ts.map +1 -0
- package/dist/lib/auth/auth.js +191 -0
- package/dist/lib/auth/auth.js.map +1 -0
- package/dist/lib/auth/browser.d.ts +17 -0
- package/dist/lib/auth/browser.d.ts.map +1 -0
- package/dist/lib/auth/browser.js +90 -0
- package/dist/lib/auth/browser.js.map +1 -0
- package/dist/lib/auth/device-code.d.ts +28 -0
- package/dist/lib/auth/device-code.d.ts.map +1 -0
- package/dist/lib/auth/device-code.js +215 -0
- package/dist/lib/auth/device-code.js.map +1 -0
- package/dist/lib/auth/login-runner.d.ts +55 -0
- package/dist/lib/auth/login-runner.d.ts.map +1 -0
- package/dist/lib/auth/login-runner.js +631 -0
- package/dist/lib/auth/login-runner.js.map +1 -0
- package/dist/lib/auth/server.d.ts +10 -0
- package/dist/lib/auth/server.d.ts.map +1 -0
- package/dist/lib/auth/server.js +98 -0
- package/dist/lib/auth/server.js.map +1 -0
- package/dist/lib/auth/token-utils.d.ts +60 -0
- package/dist/lib/auth/token-utils.d.ts.map +1 -0
- package/dist/lib/auth/token-utils.js +416 -0
- package/dist/lib/auth/token-utils.js.map +1 -0
- package/dist/lib/auth-rate-limit.d.ts +20 -0
- package/dist/lib/auth-rate-limit.d.ts.map +1 -0
- package/dist/lib/auth-rate-limit.js +91 -0
- package/dist/lib/auth-rate-limit.js.map +1 -0
- package/dist/lib/auto-update-checker.d.ts +10 -0
- package/dist/lib/auto-update-checker.d.ts.map +1 -0
- package/dist/lib/auto-update-checker.js +129 -0
- package/dist/lib/auto-update-checker.js.map +1 -0
- package/dist/lib/circuit-breaker.d.ts +34 -0
- package/dist/lib/circuit-breaker.d.ts.map +1 -0
- package/dist/lib/circuit-breaker.js +124 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/cli.d.ts +46 -0
- package/dist/lib/cli.d.ts.map +1 -0
- package/dist/lib/cli.js +192 -0
- package/dist/lib/cli.js.map +1 -0
- package/dist/lib/config.d.ts +42 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +314 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +90 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +90 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/context-overflow.d.ts +27 -0
- package/dist/lib/context-overflow.d.ts.map +1 -0
- package/dist/lib/context-overflow.js +124 -0
- package/dist/lib/context-overflow.js.map +1 -0
- package/dist/lib/errors.d.ts +113 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +103 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/health.d.ts +33 -0
- package/dist/lib/health.d.ts.map +1 -0
- package/dist/lib/health.js +70 -0
- package/dist/lib/health.js.map +1 -0
- package/dist/lib/index.d.ts +20 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +20 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/logger.d.ts +40 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +337 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/oauth-success.html +712 -0
- package/dist/lib/parallel-probe.d.ts +28 -0
- package/dist/lib/parallel-probe.d.ts.map +1 -0
- package/dist/lib/parallel-probe.js +97 -0
- package/dist/lib/parallel-probe.js.map +1 -0
- package/dist/lib/proactive-refresh.d.ts +67 -0
- package/dist/lib/proactive-refresh.d.ts.map +1 -0
- package/dist/lib/proactive-refresh.js +161 -0
- package/dist/lib/proactive-refresh.js.map +1 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts +20 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
- package/dist/lib/prompts/codex-opencode-bridge.js +126 -0
- package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
- package/dist/lib/prompts/codex.d.ts +41 -0
- package/dist/lib/prompts/codex.d.ts.map +1 -0
- package/dist/lib/prompts/codex.js +400 -0
- package/dist/lib/prompts/codex.js.map +1 -0
- package/dist/lib/prompts/opencode-codex.d.ts +25 -0
- package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
- package/dist/lib/prompts/opencode-codex.js +223 -0
- package/dist/lib/prompts/opencode-codex.js.map +1 -0
- package/dist/lib/recovery/constants.d.ts +12 -0
- package/dist/lib/recovery/constants.d.ts.map +1 -0
- package/dist/lib/recovery/constants.js +25 -0
- package/dist/lib/recovery/constants.js.map +1 -0
- package/dist/lib/recovery/index.d.ts +12 -0
- package/dist/lib/recovery/index.d.ts.map +1 -0
- package/dist/lib/recovery/index.js +12 -0
- package/dist/lib/recovery/index.js.map +1 -0
- package/dist/lib/recovery/storage.d.ts +24 -0
- package/dist/lib/recovery/storage.d.ts.map +1 -0
- package/dist/lib/recovery/storage.js +362 -0
- package/dist/lib/recovery/storage.js.map +1 -0
- package/dist/lib/recovery/types.d.ts +116 -0
- package/dist/lib/recovery/types.d.ts.map +1 -0
- package/dist/lib/recovery/types.js +7 -0
- package/dist/lib/recovery/types.js.map +1 -0
- package/dist/lib/recovery.d.ts +31 -0
- package/dist/lib/recovery.d.ts.map +1 -0
- package/dist/lib/recovery.js +313 -0
- package/dist/lib/recovery.js.map +1 -0
- package/dist/lib/refresh-queue.d.ts +131 -0
- package/dist/lib/refresh-queue.d.ts.map +1 -0
- package/dist/lib/refresh-queue.js +297 -0
- package/dist/lib/refresh-queue.js.map +1 -0
- package/dist/lib/request/fetch-helpers.d.ts +142 -0
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
- package/dist/lib/request/fetch-helpers.js +749 -0
- package/dist/lib/request/fetch-helpers.js.map +1 -0
- package/dist/lib/request/helpers/input-utils.d.ts +7 -0
- package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
- package/dist/lib/request/helpers/input-utils.js +214 -0
- package/dist/lib/request/helpers/input-utils.js.map +1 -0
- package/dist/lib/request/helpers/model-map.d.ts +22 -0
- package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
- package/dist/lib/request/helpers/model-map.js +183 -0
- package/dist/lib/request/helpers/model-map.js.map +1 -0
- package/dist/lib/request/helpers/tool-utils.d.ts +29 -0
- package/dist/lib/request/helpers/tool-utils.d.ts.map +1 -0
- package/dist/lib/request/helpers/tool-utils.js +117 -0
- package/dist/lib/request/helpers/tool-utils.js.map +1 -0
- package/dist/lib/request/rate-limit-backoff.d.ts +17 -0
- package/dist/lib/request/rate-limit-backoff.d.ts.map +1 -0
- package/dist/lib/request/rate-limit-backoff.js +83 -0
- package/dist/lib/request/rate-limit-backoff.js.map +1 -0
- package/dist/lib/request/request-transformer.d.ts +107 -0
- package/dist/lib/request/request-transformer.d.ts.map +1 -0
- package/dist/lib/request/request-transformer.js +930 -0
- package/dist/lib/request/request-transformer.js.map +1 -0
- package/dist/lib/request/response-handler.d.ts +23 -0
- package/dist/lib/request/response-handler.d.ts.map +1 -0
- package/dist/lib/request/response-handler.js +245 -0
- package/dist/lib/request/response-handler.js.map +1 -0
- package/dist/lib/request/retry-budget.d.ts +19 -0
- package/dist/lib/request/retry-budget.d.ts.map +1 -0
- package/dist/lib/request/retry-budget.js +99 -0
- package/dist/lib/request/retry-budget.js.map +1 -0
- package/dist/lib/rotation.d.ts +130 -0
- package/dist/lib/rotation.d.ts.map +1 -0
- package/dist/lib/rotation.js +301 -0
- package/dist/lib/rotation.js.map +1 -0
- package/dist/lib/runtime-contracts.d.ts +16 -0
- package/dist/lib/runtime-contracts.d.ts.map +1 -0
- package/dist/lib/runtime-contracts.js +24 -0
- package/dist/lib/runtime-contracts.js.map +1 -0
- package/dist/lib/schemas.d.ts +457 -0
- package/dist/lib/schemas.d.ts.map +1 -0
- package/dist/lib/schemas.js +283 -0
- package/dist/lib/schemas.js.map +1 -0
- package/dist/lib/shutdown.d.ts +7 -0
- package/dist/lib/shutdown.d.ts.map +1 -0
- package/dist/lib/shutdown.js +43 -0
- package/dist/lib/shutdown.js.map +1 -0
- package/dist/lib/storage/migrations.d.ts +65 -0
- package/dist/lib/storage/migrations.d.ts.map +1 -0
- package/dist/lib/storage/migrations.js +44 -0
- package/dist/lib/storage/migrations.js.map +1 -0
- package/dist/lib/storage/paths.d.ts +16 -0
- package/dist/lib/storage/paths.d.ts.map +1 -0
- package/dist/lib/storage/paths.js +92 -0
- package/dist/lib/storage/paths.js.map +1 -0
- package/dist/lib/storage.d.ts +157 -0
- package/dist/lib/storage.d.ts.map +1 -0
- package/dist/lib/storage.js +1169 -0
- package/dist/lib/storage.js.map +1 -0
- package/dist/lib/table-formatter.d.ts +32 -0
- package/dist/lib/table-formatter.d.ts.map +1 -0
- package/dist/lib/table-formatter.js +44 -0
- package/dist/lib/table-formatter.js.map +1 -0
- package/dist/lib/types.d.ts +131 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/ui/ansi.d.ts +22 -0
- package/dist/lib/ui/ansi.d.ts.map +1 -0
- package/dist/lib/ui/ansi.js +38 -0
- package/dist/lib/ui/ansi.js.map +1 -0
- package/dist/lib/ui/auth-menu.d.ts +39 -0
- package/dist/lib/ui/auth-menu.d.ts.map +1 -0
- package/dist/lib/ui/auth-menu.js +186 -0
- package/dist/lib/ui/auth-menu.js.map +1 -0
- package/dist/lib/ui/beginner.d.ts +62 -0
- package/dist/lib/ui/beginner.d.ts.map +1 -0
- package/dist/lib/ui/beginner.js +259 -0
- package/dist/lib/ui/beginner.js.map +1 -0
- package/dist/lib/ui/confirm.d.ts +2 -0
- package/dist/lib/ui/confirm.d.ts.map +1 -0
- package/dist/lib/ui/confirm.js +21 -0
- package/dist/lib/ui/confirm.js.map +1 -0
- package/dist/lib/ui/format.d.ts +9 -0
- package/dist/lib/ui/format.d.ts.map +1 -0
- package/dist/lib/ui/format.js +49 -0
- package/dist/lib/ui/format.js.map +1 -0
- package/dist/lib/ui/runtime.d.ts +11 -0
- package/dist/lib/ui/runtime.d.ts.map +1 -0
- package/dist/lib/ui/runtime.js +31 -0
- package/dist/lib/ui/runtime.js.map +1 -0
- package/dist/lib/ui/select.d.ts +20 -0
- package/dist/lib/ui/select.d.ts.map +1 -0
- package/dist/lib/ui/select.js +343 -0
- package/dist/lib/ui/select.js.map +1 -0
- package/dist/lib/ui/theme.d.ts +34 -0
- package/dist/lib/ui/theme.d.ts.map +1 -0
- package/dist/lib/ui/theme.js +84 -0
- package/dist/lib/ui/theme.js.map +1 -0
- package/dist/lib/utils.d.ts +29 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +54 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +113 -0
- package/scripts/audit-dev-allowlist.js +114 -0
- package/scripts/copy-oauth-success.js +37 -0
- package/scripts/install-oc-codex-multi-auth-core.js +381 -0
- package/scripts/install-oc-codex-multi-auth.js +15 -0
- package/scripts/test-all-models.sh +260 -0
- package/scripts/validate-model-map.sh +97 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-runner.js","sourceRoot":"","sources":["../../../lib/auth/login-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,0BAA0B,GAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAoB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AA2B9D,MAAM,sCAAsC,GAC3C,qDAAqD,CAAC;AAEvD,MAAM,sBAAsB,GAAG,CAC9B,MAAoB,EACpB,SAKC,EACyB,EAAE,CAAC,CAAC;IAC9B,GAAG,MAAM;IACT,iBAAiB,EAAE,SAAS,CAAC,SAAS;IACtC,sBAAsB,EAAE,SAAS,CAAC,cAAc;IAChD,eAAe,EAAE,SAAS,CAAC,MAAM;IACjC,YAAY,EAAE,SAAS,CAAC,KAAK;CAC7B,CAAC,CAAC;AAEH,MAAM,UAAU,uBAAuB,CAAC,MAAoB;IAC3D,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClE,IAAI,QAAQ,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnE,OAAO,CAAC,yDAAyD,MAAM,IAAI,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG;YACf,GAAG,MAAM;YACT,iBAAiB,EAAE,QAAQ;YAC3B,eAAe,EAAE,QAAiB;YAClC,YAAY,EAAE,gBAAgB,MAAM,GAAG;SACvC,CAAC;QACF,OAAO;YACN,OAAO;YACP,sBAAsB,EAAE,CAAC,OAAO,CAAC;SACjC,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO;YACN,OAAO,EAAE,MAAM;YACf,sBAAsB,EAAE,CAAC,MAAM,CAAC;SAChC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO;YACN,OAAO,EAAE,MAAM;YACf,sBAAsB,EAAE,CAAC,MAAM,CAAC;SAChC,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,EAAE;QAC9C,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,OAAO;QAChC,KAAK,EAAE,MAAM,CAAC,KAAK;KACnB,CAAC,CAAC;IAEH,MAAM,sBAAsB,GAA8B,CAAC,OAAO,CAAC,CAAC;IACpE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACpC,IACC,SAAS,CAAC,SAAS,KAAK,OAAO,CAAC,iBAAiB;YACjD,CAAC,SAAS,CAAC,cAAc,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,IAAI,EAAE,CAAC,EAC1E,CAAC;YACF,SAAS;QACV,CAAC;QACD,sBAAsB,CAAC,IAAI,CAC1B,sBAAsB,CAAC,MAAM,EAAE;YAC9B,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,KAAK,EAAE,SAAS,CAAC,KAAK;SACtB,CAAC,CACF,CAAC;IACH,CAAC;IAED,OAAO;QACN,OAAO;QACP,sBAAsB;KACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC7C,SAAiC,EACjC,SAAoC;IAEpC,MAAM,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;IACzC,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IACrE,MAAM,qBAAqB,GAAG,SAAS,CAAC,OAAO,CAAC,sBAAsB,EAAE,IAAI,EAAE,CAAC;IAC/E,MAAM,yBAAyB,GAC9B,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjF,8EAA8E;IAC9E,oEAAoE;IACpE,IAAI,sBAAsB,GAAG,SAAS,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7E,OAAO,KAAK,SAAS,CAAC,OAAO;QAC7B,CAAC,yBAAyB;YACzB,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC;YACtE,CAAC,OAAO,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;QACjF,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CACjB,CAAC;IAEF,MAAM,iBAAiB,GAAG,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC9D,IAAI,CAAC,OAAO,CAAC,iBAAiB,IAAI,iBAAiB,EAAE,CAAC;QACrD,OAAO,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC9C,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,eAAe,IAAI,QAAQ,CAAC;QAChE,sBAAsB,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,sBAAsB,GAAG,SAAS,CAAC,sBAAsB,EAAE,IAAI,EAAE,CAAC;IACxE,IAAI,CAAC,OAAO,CAAC,sBAAsB,IAAI,sBAAsB,EAAE,CAAC;QAC/D,OAAO,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;IACzD,CAAC;IAED,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,YAAY,EAAE,CAAC;QAC3C,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAED,OAAO;QACN,OAAO;QACP,sBAAsB;KACtB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACpD,SAAiC,EACjC,OAGC;IAED,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,OAAO,CAAC,iBAAiB,CAC9B,SAAS,CAAC,sBAAsB,EAChC,OAAO,CAAC,UAAU,IAAI,KAAK,CAC3B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,sCAAsC,EAAE;YACvD,KAAK,EAAE,KAAK;SACZ,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACtD,MAAoB,EACpB,OAIC;IAED,IAAI,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;QACxB,SAAS,GAAG,8BAA8B,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,+BAA+B,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,OAAkC,EAClC,aAAsB,KAAK;IAE3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,MAAM,6BAA6B,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE;QACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC;QACjD,IAAI,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE5D,MAAM,SAAS,GAAG,CACjB,GAA0B,EAC1B,GAAW,EACX,KAAa,EACN,EAAE;YACT,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,QAAQ,EAAE,CAAC;gBACd,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,OAAO;YACR,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,CAAC,OAA6B,EAAsB,EAAE;YAC3E,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YACvD,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;YAC5B,OAAO,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,CAAC,CAAC;QAEF,MAAM,sBAAsB,GAAG,CAAC,aAAqB,EAAE,cAAsB,EAAU,EAAE;YACxF,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;YACzC,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;YAC3C,IAAI,CAAC,QAAQ;gBAAE,OAAO,cAAc,CAAC;YACrC,IAAI,CAAC,SAAS;gBAAE,OAAO,aAAa,CAAC;YACrC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC;YAChD,MAAM,iBAAiB,GAAG,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC;YAClD,IAAI,iBAAiB,GAAG,gBAAgB;gBAAE,OAAO,cAAc,CAAC;YAChE,IAAI,iBAAiB,GAAG,gBAAgB;gBAAE,OAAO,aAAa,CAAC;YAC/D,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;YAC9C,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAO,IAAI,CAAC,CAAC;YAChD,OAAO,gBAAgB,IAAI,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;QAC7E,CAAC,CAAC;QAEF,MAAM,mBAAmB,GAAG,CAAC,WAAmB,EAAE,WAAmB,EAAQ,EAAE;YAC9E,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;gBAAE,OAAO;YAC/B,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;YAC5C,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;YAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;YAC1C,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;YAC1C,MAAM,aAAa,GAClB,cAAc,GAAG,cAAc;gBAC/B,CAAC,cAAc,KAAK,cAAc,IAAI,aAAa,GAAG,aAAa,CAAC,CAAC;YACtE,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YAC9C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YAC9C,MAAM,yBAAyB,GAA2B,EAAE,CAAC;YAC7D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;gBAClC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC;gBAC/C,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC;aAC/C,CAAC,CAAC;YACH,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;gBACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,CAAC;gBAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,CAAC;gBAClD,MAAM,UAAU,GACf,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1E,MAAM,UAAU,GACf,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBAClD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBAClB,yBAAyB,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;gBAC3C,CAAC;YACF,CAAC;YACD,MAAM,aAAa,GAClB,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;gBACnD,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;YACrC,MAAM,sBAAsB,GAC3B,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC;gBACtF,CAAC,CAAC,MAAM,CAAC,gBAAgB;gBACzB,CAAC,CAAC,CAAC,CAAC;YACN,MAAM,sBAAsB,GAC3B,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC;gBACtF,CAAC,CAAC,MAAM,CAAC,gBAAgB;gBACzB,CAAC,CAAC,CAAC,CAAC;YACN,MAAM,2BAA2B,GAAG,IAAI,CAAC,GAAG,CAC3C,sBAAsB,EACtB,sBAAsB,CACtB,CAAC;YACF,MAAM,sBAAsB,GAC3B,2BAA2B,GAAG,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3E,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE;gBAClC,IAAI,2BAA2B,IAAI,CAAC,EAAE,CAAC;oBACtC,OAAO,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC;gBACvD,CAAC;gBACD,IAAI,sBAAsB,GAAG,sBAAsB,EAAE,CAAC;oBACrD,OAAO,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC;gBACvD,CAAC;gBACD,IAAI,sBAAsB,GAAG,sBAAsB,EAAE,CAAC;oBACrD,OAAO,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC;gBACvD,CAAC;gBACD,OAAO,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC;YACvD,CAAC,CAAC,EAAE,CAAC;YACL,QAAQ,CAAC,WAAW,CAAC,GAAG;gBACvB,GAAG,MAAM;gBACT,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS;gBAC/C,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc;gBAC9D,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe;gBACjE,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY;gBACxD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;gBACnC,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY;gBACtD,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW;gBACnD,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;gBAC7C,OAAO,EAAE,aAAa;gBACtB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;gBAC3D,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;gBAC9D,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,gBAAgB;gBACpE,mBAAmB,EAAE,yBAAyB;gBAC9C,gBAAgB,EAAE,sBAAsB;gBACxC,cAAc,EAAE,oBAAoB;aACpC,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,wBAAwB,GAAG,CAChC,OAA2C,EACtB,EAAE;YACvB,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC7C,OAAO,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,CAAC,CAAC;QAEF,MAAM,iCAAiC,GAAG,CACzC,QAA4C,EAC5C,kBAAsC,EAC5B,EAAE;YACZ,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YAC7D,MAAM,mBAAmB,GAAG,kBAAkB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;YACpE,IAAI,CAAC,iBAAiB,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAChD,OAAO,IAAI,CAAC;YACb,CAAC;YACD,OAAO,iBAAiB,KAAK,mBAAmB,CAAC;QAClD,CAAC,CAAC;QAYF,MAAM,wBAAwB,GAAG,CAChC,OAAwB,EACxB,cAAsB,EACtB,kBAAsC,EACjB,EAAE;YACvB,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC7D,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YAEvD,MAAM,WAAW,GAAG,kBAAkB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;YAC5D,IAAI,iBAAqC,CAAC;YAC1C,IAAI,oBAAwC,CAAC;YAC7C,IAAI,0BAA8C,CAAC;YACnD,MAAM,0BAA0B,GAAG,IAAI,GAAG,EAAU,CAAC;YAErD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACjC,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBACxB,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;gBAC7D,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACxB,iBAAiB;wBAChB,OAAO,iBAAiB,KAAK,QAAQ;4BACpC,CAAC,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,KAAK,CAAC;4BAClD,CAAC,CAAC,KAAK,CAAC;oBACV,SAAS;gBACV,CAAC;gBACD,0BAA0B,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAClD,0BAA0B;oBACzB,OAAO,0BAA0B,KAAK,QAAQ;wBAC7C,CAAC,CAAC,sBAAsB,CAAC,0BAA0B,EAAE,KAAK,CAAC;wBAC3D,CAAC,CAAC,KAAK,CAAC;gBACV,IAAI,WAAW,IAAI,iBAAiB,KAAK,WAAW,EAAE,CAAC;oBACtD,oBAAoB;wBACnB,OAAO,oBAAoB,KAAK,QAAQ;4BACvC,CAAC,CAAC,sBAAsB,CAAC,oBAAoB,EAAE,KAAK,CAAC;4BACrD,CAAC,CAAC,KAAK,CAAC;gBACX,CAAC;YACF,CAAC;YAED,IAAI,WAAW,EAAE,CAAC;gBACjB,OAAO,oBAAoB,IAAI,iBAAiB,CAAC;YAClD,CAAC;YACD,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;gBAC3C,OAAO,iBAAiB,CAAC;YAC1B,CAAC;YACD,IAAI,0BAA0B,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC3C,OAAO,0BAA0B,CAAC;YACnC,CAAC;YACD,OAAO,SAAS,CAAC;QAClB,CAAC,CAAC;QAEF,MAAM,wBAAwB,GAAG,CAChC,OAAwB,EACxB,YAAoB,EACpB,kBAAsC,EACjB,EAAE;YACvB,MAAM,WAAW,GAAG,kBAAkB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;YAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC9D,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YACvD,IAAI,iBAAqC,CAAC;YAC1C,IAAI,oBAAwC,CAAC;YAE7C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACjC,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;gBAC7D,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACxB,iBAAiB;wBAChB,OAAO,iBAAiB,KAAK,QAAQ;4BACpC,CAAC,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,KAAK,CAAC;4BAClD,CAAC,CAAC,KAAK,CAAC;oBACV,SAAS;gBACV,CAAC;gBACD,IAAI,WAAW,IAAI,iBAAiB,KAAK,WAAW,EAAE,CAAC;oBACtD,oBAAoB;wBACnB,OAAO,oBAAoB,KAAK,QAAQ;4BACvC,CAAC,CAAC,sBAAsB,CAAC,oBAAoB,EAAE,KAAK,CAAC;4BACrD,CAAC,CAAC,KAAK,CAAC;gBACX,CAAC;YACF,CAAC;YAED,OAAO,oBAAoB,IAAI,iBAAiB,CAAC;QAClD,CAAC,CAAC;QAEF,MAAM,2BAA2B,GAAG,CACnC,OAAwB,EACxB,SAA6B,EAC7B,YAAoB,EACC,EAAE;YACvB,MAAM,WAAW,GAAG,SAAS;gBAC5B,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC5D,CAAC,CAAC,SAAS,CAAC;YACb,IAAI,WAAW,KAAK,SAAS;gBAAE,OAAO,WAAW,CAAC;YAElD,IAAI,SAAS,EAAE,CAAC;gBACf,MAAM,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACnE,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjD,IAAI,kBAAsC,CAAC;oBAC3C,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;wBACpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;wBACjC,IAAI,CAAC,QAAQ;4BAAE,SAAS;wBACxB,MAAM,eAAe,GAAG,QAAQ,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;wBACtD,IAAI,CAAC,eAAe,IAAI,eAAe,KAAK,YAAY,EAAE,CAAC;4BAC1D,SAAS;wBACV,CAAC;wBACD,kBAAkB;4BACjB,OAAO,kBAAkB,KAAK,QAAQ;gCACrC,CAAC,CAAC,sBAAsB,CAAC,kBAAkB,EAAE,KAAK,CAAC;gCACnD,CAAC,CAAC,KAAK,CAAC;oBACX,CAAC;oBACD,IAAI,OAAO,kBAAkB,KAAK,QAAQ,EAAE,CAAC;wBAC5C,OAAO,kBAAkB,CAAC;oBAC3B,CAAC;gBACF,CAAC;YACF,CAAC;YAED,IAAI,SAAS;gBAAE,OAAO,SAAS,CAAC;YAChC,OAAO,aAAa,CAAC,OAAO,CAAC,uBAAuB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC;QAEF,MAAM,oBAAoB,GAAG,GAAoB,EAAE;YAClD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAoB,CAAC;YACrD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;YACnD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAoB,CAAC;YACxD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC/C,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAoB,CAAC;YACzD,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAoB,CAAC;YAC5D,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAoB,CAAC;YAEzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO;oBAAE,SAAS;gBAEvB,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;gBACtD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;gBAC5C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;gBAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;gBAEpC,IAAI,YAAY,EAAE,CAAC;oBAClB,SAAS,CAAC,oBAAoB,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;gBAClD,CAAC;gBAED,IAAI,cAAc,EAAE,CAAC;oBACpB,SAAS,CAAC,gBAAgB,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;oBAC/C,IAAI,SAAS,EAAE,CAAC;wBACf,SAAS,CAAC,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;oBAC/C,CAAC;oBACD,IAAI,YAAY,EAAE,CAAC;wBAClB,SAAS,CAAC,uBAAuB,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;oBACrD,CAAC;oBACD,SAAS;gBACV,CAAC;gBAED,IAAI,SAAS,EAAE,CAAC;oBACf,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBACpC,CAAC;gBACD,IAAI,YAAY,EAAE,CAAC;oBAClB,SAAS,CAAC,mBAAmB,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;gBACjD,CAAC;gBACD,IAAI,KAAK,EAAE,CAAC;oBACX,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC5B,CAAC;YACF,CAAC;YAED,OAAO;gBACN,gBAAgB;gBAChB,gBAAgB;gBAChB,mBAAmB;gBACnB,YAAY;gBACZ,oBAAoB;gBACpB,uBAAuB;gBACvB,oBAAoB;aACpB,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,eAAe,GAAG,oBAAoB,EAAE,CAAC;QAE7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,iBAAiB,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9E,MAAM,mBAAmB,GAAG,SAAS,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;YAC3D,MAAM,cAAc,GAAG,MAAM,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;YAC1E,MAAM,eAAe,GACpB,mBAAmB;gBAClB,CAAC,CAAC,MAAM,CAAC,eAAe;oBACvB,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;gBAChD,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;YACzC,MAAM,YAAY,GAAG,aAAa,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAEvF,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE;gBAC3B,IAAI,cAAc,EAAE,CAAC;oBACpB,OAAO,wBAAwB,CAC9B,eAAe,EACf,cAAc,EACd,mBAAmB,CACnB,CAAC;gBACH,CAAC;gBACD,IAAI,mBAAmB,EAAE,CAAC;oBACzB,MAAM,WAAW,GAAG,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;oBAC9E,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;wBAC/B,OAAO,WAAW,CAAC;oBACpB,CAAC;gBACF,CAAC;gBAED,MAAM,cAAc,GAAG,wBAAwB,CAC9C,eAAe,EACf,MAAM,CAAC,OAAO,EACd,mBAAmB,CACnB,CAAC;gBACF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;oBAClC,OAAO,cAAc,CAAC;gBACvB,CAAC;gBAED,IAAI,YAAY,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC1C,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;oBAC/D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;wBAC3B,OAAO,OAAO,CAAC;oBAChB,CAAC;gBACF,CAAC;gBAED,MAAM,SAAS,GAAG,2BAA2B,CAC5C,eAAe,EACf,mBAAmB,EACnB,MAAM,CAAC,OAAO,CACd,CAAC;gBACF,IAAI,SAAS,KAAK,SAAS;oBAAE,OAAO,SAAS,CAAC;gBAE9C,MAAM,kBAAkB,GAAG,aAAa,CACvC,eAAe,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CACxD,CAAC;gBACF,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;oBACtC,OAAO,SAAS,CAAC;gBAClB,CAAC;gBACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC;gBAC9C,IAAI,CAAC,iCAAiC,CAAC,QAAQ,EAAE,mBAAmB,CAAC,EAAE,CAAC;oBACvE,OAAO,SAAS,CAAC;gBAClB,CAAC;gBACD,OAAO,kBAAkB,CAAC;YAC3B,CAAC,CAAC,EAAE,CAAC;YAEL,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC;oBACb,SAAS,EAAE,mBAAmB;oBAC9B,cAAc;oBACd,eAAe;oBACf,YAAY;oBACZ,KAAK,EAAE,YAAY;oBACnB,YAAY,EAAE,MAAM,CAAC,OAAO;oBAC5B,WAAW,EAAE,MAAM,CAAC,MAAM;oBAC1B,SAAS,EAAE,MAAM,CAAC,OAAO;oBACzB,OAAO,EAAE,GAAG;oBACZ,QAAQ,EAAE,GAAG;iBACb,CAAC,CAAC;gBACH,eAAe,GAAG,oBAAoB,EAAE,CAAC;gBACzC,SAAS;YACV,CAAC;YAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ;gBAAE,SAAS;YAExB,MAAM,SAAS,GAAG,YAAY,IAAI,QAAQ,CAAC,KAAK,CAAC;YACjD,MAAM,kBAAkB,GAAG,cAAc,IAAI,QAAQ,CAAC,cAAc,CAAC;YACrE,MAAM,mBAAmB,GACxB,OAAO,QAAQ,CAAC,cAAc,KAAK,QAAQ;gBAC3C,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBACzC,CAAC,cAAc,CAAC;YACjB,MAAM,aAAa,GAAG,mBAAmB;gBACxC,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,mBAAmB;gBAC3C,CAAC,CAAC,mBAAmB,IAAI,QAAQ,CAAC,SAAS,CAAC;YAC7C,MAAM,mBAAmB,GAAG,mBAAmB;gBAC9C,CAAC,CAAC,QAAQ,CAAC,eAAe,IAAI,eAAe;gBAC7C,CAAC,CAAC,mBAAmB;oBACpB,CAAC,CAAC,eAAe,IAAI,QAAQ,CAAC,eAAe;oBAC7C,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;YAC7B,MAAM,gBAAgB,GAAG,mBAAmB;gBAC3C,CAAC,CAAC,QAAQ,CAAC,YAAY,IAAI,YAAY;gBACvC,CAAC,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAC;YACzC,QAAQ,CAAC,aAAa,CAAC,GAAG;gBACzB,GAAG,QAAQ;gBACX,SAAS,EAAE,aAAa;gBACxB,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,mBAAmB;gBACpC,YAAY,EAAE,gBAAgB;gBAC9B,KAAK,EAAE,SAAS;gBAChB,YAAY,EAAE,MAAM,CAAC,OAAO;gBAC5B,WAAW,EAAE,MAAM,CAAC,MAAM;gBAC1B,SAAS,EAAE,MAAM,CAAC,OAAO;gBACzB,QAAQ,EAAE,GAAG;aACb,CAAC;YACF,eAAe,GAAG,oBAAoB,EAAE,CAAC;QAC1C,CAAC;QAED,MAAM,2BAA2B,GAAG,GAAS,EAAE;YAC9C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;YAC1C,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;YAEvD,MAAM,mBAAmB,GAAG,CAC3B,OAKa,EACJ,EAAE;gBACX,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAC7D,MAAM,SAAS,GAAG,wBAAwB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC1D,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;gBACzD,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACzD,IAAI,cAAc,IAAI,SAAS,EAAE,CAAC;oBACjC,OAAO,OAAO,cAAc,YAAY,SAAS,YAAY,YAAY,EAAE,CAAC;gBAC7E,CAAC;gBACD,OAAO,SAAS,KAAK,YAAY,YAAY,EAAE,CAAC;YACjD,CAAC,CAAC;YAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO;oBAAE,SAAS;gBAEvB,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;gBACjD,MAAM,aAAa,GAAG,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC5D,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;oBACjC,oBAAoB,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;oBACzC,SAAS;gBACV,CAAC;gBAED,MAAM,WAAW,GAAG,sBAAsB,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;gBAC7D,MAAM,aAAa,GAAG,WAAW,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBACxE,mBAAmB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;gBAChD,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACnC,oBAAoB,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACpD,CAAC;YAED,IAAI,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC9B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YACvE,CAAC;QACF,CAAC,CAAC;QAEF,MAAM,mBAAmB,GAAG,CAC3B,OAA2F,EAChF,EAAE;YACb,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;YACvD,IAAI,cAAc;gBAAE,IAAI,CAAC,IAAI,CAAC,OAAO,cAAc,EAAE,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC7C,IAAI,SAAS;gBAAE,IAAI,CAAC,IAAI,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YACnD,IAAI,YAAY;gBAAE,IAAI,CAAC,IAAI,CAAC,WAAW,YAAY,EAAE,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACb,CAAC,CAAC;QAEF,MAAM,uBAAuB,GAAG,CAAC,QAAiB,EAAE,EAAE;YACrD,MAAM,cAAc,GAAG,MAAM,EAAE,QAAQ,CAAC;YACxC,IAAI,CAAC,cAAc;gBAAE,OAAO,SAAS,CAAC;YACtC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,SAAS,CAAC;YACjF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,cAAc,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAC;YAC1E,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC,CAAC;QAEF,MAAM,gBAAgB,GAAG,UAAU;YAClC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;QACrE,MAAM,wBAAwB,GAA2C,EAAE,CAAC;QAC5E,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;gBACrC,MAAM,UAAU,GAAG,mBAAmB,CACrC,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,MAAM,CAAC,CAAC,CAC9D,CAAC;gBACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,wBAAwB,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;gBAC/C,CAAC;YACF,CAAC;QACF,CAAC;QAED,2BAA2B,EAAE,CAAC;QAE9B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAElC,MAAM,0BAA0B,GAAG,CAAC,YAAkC,EAAsB,EAAE;YAC7F,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YACjE,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;gBACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAC/B,CAAC,OAAO,EAAE,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC/D,CAAC;gBACF,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;oBAChB,OAAO,KAAK,CAAC;gBACd,CAAC;YACF,CAAC;YACD,OAAO,SAAS,CAAC;QAClB,CAAC,CAAC;QAEF,MAAM,mBAAmB,GAAG,UAAU;YACrC,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,OAAO,MAAM,EAAE,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC/E,CAAC,CAAC,MAAM,CAAC,WAAW;gBACpB,CAAC,CAAC,CAAC,CAAC;QACN,MAAM,mBAAmB,GAAG,UAAU;YACrC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,mBAAmB,IAAI,mBAAmB,CAAC;QAE/D,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/F,MAAM,mBAAmB,GAAyC,EAAE,CAAC;QACrE,MAAM,iBAAiB,GAAG,UAAU;YACnC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;gBAClC,MAAM,iBAAiB,GAAG,MAAM,EAAE,mBAAmB,EAAE,CAAC,MAAM,CAAC,CAAC;gBAChE,OAAO,OAAO,iBAAiB,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACpF,CAAC,CAAC,CAAC;QACJ,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;YACxC,MAAM,iBAAiB,GAAG,MAAM,EAAE,mBAAmB,EAAE,CAAC,MAAM,CAAC,CAAC;YAChE,MAAM,mBAAmB,GAAG,UAAU;gBACrC,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,0BAA0B,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC;YAChE,MAAM,cAAc,GAAG,UAAU;gBAChC,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,OAAO,mBAAmB,KAAK,QAAQ;oBACxC,CAAC,CAAC,mBAAmB;oBACrB,CAAC,CAAC,OAAO,iBAAiB,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC;wBAC5E,CAAC,CAAC,iBAAiB;wBACnB,CAAC,CAAC,kBAAkB,CAAC;YACxB,mBAAmB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CACrC,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CACzD,CAAC;QACH,CAAC;QAED,MAAM,OAAO,CAAC;YACb,OAAO,EAAE,CAAC;YACV,QAAQ;YACR,WAAW,EAAE,kBAAkB;YAC/B,mBAAmB;SACnB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OAuthServerInfo } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Start a small local HTTP server that waits for /auth/callback and returns the code
|
|
4
|
+
* @param options - OAuth state for validation
|
|
5
|
+
* @returns Promise that resolves to server info
|
|
6
|
+
*/
|
|
7
|
+
export declare function startLocalOAuthServer({ state }: {
|
|
8
|
+
state: string;
|
|
9
|
+
}): Promise<OAuthServerInfo>;
|
|
10
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../lib/auth/server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAanD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAkF5F"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { logError, logWarn } from "../logger.js";
|
|
6
|
+
import { OAUTH_CALLBACK_BIND_URL, OAUTH_CALLBACK_LOOPBACK_HOST, OAUTH_CALLBACK_PATH, OAUTH_CALLBACK_PORT, } from "../runtime-contracts.js";
|
|
7
|
+
// Resolve path to oauth-success.html (one level up from auth/ subfolder)
|
|
8
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const successHtml = fs.readFileSync(path.join(__dirname, "..", "oauth-success.html"), "utf-8");
|
|
10
|
+
/**
|
|
11
|
+
* Start a small local HTTP server that waits for /auth/callback and returns the code
|
|
12
|
+
* @param options - OAuth state for validation
|
|
13
|
+
* @returns Promise that resolves to server info
|
|
14
|
+
*/
|
|
15
|
+
export function startLocalOAuthServer({ state }) {
|
|
16
|
+
let pollAborted = false;
|
|
17
|
+
const server = http.createServer((req, res) => {
|
|
18
|
+
try {
|
|
19
|
+
const url = new URL(req.url || "", "http://localhost");
|
|
20
|
+
if (url.pathname !== OAUTH_CALLBACK_PATH) {
|
|
21
|
+
res.statusCode = 404;
|
|
22
|
+
res.end("Not found");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (url.searchParams.get("state") !== state) {
|
|
26
|
+
res.statusCode = 400;
|
|
27
|
+
res.end("State mismatch");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const code = url.searchParams.get("code");
|
|
31
|
+
if (!code) {
|
|
32
|
+
res.statusCode = 400;
|
|
33
|
+
res.end("Missing authorization code");
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
res.statusCode = 200;
|
|
37
|
+
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
38
|
+
res.setHeader("X-Frame-Options", "DENY");
|
|
39
|
+
res.setHeader("X-Content-Type-Options", "nosniff");
|
|
40
|
+
res.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'none'");
|
|
41
|
+
res.end(successHtml);
|
|
42
|
+
server._lastCode = code;
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
logError(`Request handler error: ${err?.message ?? String(err)}`);
|
|
46
|
+
res.statusCode = 500;
|
|
47
|
+
res.end("Internal error");
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
server.unref();
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
server
|
|
53
|
+
.listen(OAUTH_CALLBACK_PORT, OAUTH_CALLBACK_LOOPBACK_HOST, () => {
|
|
54
|
+
resolve({
|
|
55
|
+
port: OAUTH_CALLBACK_PORT,
|
|
56
|
+
ready: true,
|
|
57
|
+
close: () => {
|
|
58
|
+
pollAborted = true;
|
|
59
|
+
server.close();
|
|
60
|
+
},
|
|
61
|
+
waitForCode: async () => {
|
|
62
|
+
const POLL_INTERVAL_MS = 100;
|
|
63
|
+
const TIMEOUT_MS = 5 * 60 * 1000;
|
|
64
|
+
const maxIterations = Math.floor(TIMEOUT_MS / POLL_INTERVAL_MS);
|
|
65
|
+
const poll = () => new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
|
|
66
|
+
for (let i = 0; i < maxIterations; i++) {
|
|
67
|
+
if (pollAborted)
|
|
68
|
+
return null;
|
|
69
|
+
const lastCode = server._lastCode;
|
|
70
|
+
if (lastCode)
|
|
71
|
+
return { code: lastCode };
|
|
72
|
+
await poll();
|
|
73
|
+
}
|
|
74
|
+
logWarn("OAuth poll timeout after 5 minutes");
|
|
75
|
+
return null;
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
})
|
|
79
|
+
.on("error", (err) => {
|
|
80
|
+
logError(`Failed to bind ${OAUTH_CALLBACK_BIND_URL} (${err?.code}). Suggest device code or manual URL paste.`);
|
|
81
|
+
resolve({
|
|
82
|
+
port: OAUTH_CALLBACK_PORT,
|
|
83
|
+
ready: false,
|
|
84
|
+
close: () => {
|
|
85
|
+
pollAborted = true;
|
|
86
|
+
try {
|
|
87
|
+
server.close();
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
logError(`Failed to close OAuth server: ${err?.message ?? String(err)}`);
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
waitForCode: () => Promise.resolve(null),
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../lib/auth/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token utility functions for JWT parsing and account ID extraction.
|
|
3
|
+
* Extracted from accounts.ts to reduce module size and improve cohesion.
|
|
4
|
+
*/
|
|
5
|
+
import type { AccountIdSource } from "../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Account ID candidate from token or organization data.
|
|
8
|
+
*/
|
|
9
|
+
export interface AccountIdCandidate {
|
|
10
|
+
accountId: string;
|
|
11
|
+
organizationId?: string;
|
|
12
|
+
label: string;
|
|
13
|
+
source: AccountIdSource;
|
|
14
|
+
isDefault?: boolean;
|
|
15
|
+
isPersonal?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Select the best workspace candidate for OAuth account binding.
|
|
19
|
+
* Preference order:
|
|
20
|
+
* 1) org default that is not personal
|
|
21
|
+
* 2) org default (any)
|
|
22
|
+
* 3) id_token candidate
|
|
23
|
+
* 4) non-personal org candidate
|
|
24
|
+
* 5) token candidate
|
|
25
|
+
* 6) first candidate
|
|
26
|
+
*/
|
|
27
|
+
export declare function selectBestAccountCandidate(candidates: AccountIdCandidate[]): AccountIdCandidate | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Extracts the ChatGPT account ID from a JWT access token.
|
|
30
|
+
* @param accessToken - JWT access token from OAuth flow
|
|
31
|
+
* @returns Account ID string or undefined if not found
|
|
32
|
+
*/
|
|
33
|
+
export declare function extractAccountId(accessToken?: string): string | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Extracts the email address from OAuth tokens.
|
|
36
|
+
* Checks id_token first (where OpenAI puts email), then falls back to access_token.
|
|
37
|
+
*/
|
|
38
|
+
export declare function extractAccountEmail(accessToken?: string, idToken?: string): string | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Extracts all accountId candidates from access/id tokens.
|
|
41
|
+
* Used to support business workspaces/organizations that are not the token default.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getAccountIdCandidates(accessToken?: string, idToken?: string): AccountIdCandidate[];
|
|
44
|
+
/**
|
|
45
|
+
* Determines if accountId should be updated from a token-derived value.
|
|
46
|
+
* We keep org/manual selections stable across refreshes.
|
|
47
|
+
*/
|
|
48
|
+
export declare function shouldUpdateAccountIdFromToken(source: AccountIdSource | undefined, currentAccountId?: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Resolve which accountId to use for runtime API calls.
|
|
51
|
+
* Preserves explicit org/manual selections; only token/id_token sources auto-follow token changes.
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveRequestAccountId(storedAccountId: string | undefined, source: AccountIdSource | undefined, tokenAccountId: string | undefined): string | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* Sanitizes an email address by trimming whitespace and lowercasing.
|
|
56
|
+
* @param email - Email string to sanitize
|
|
57
|
+
* @returns Sanitized email or undefined if invalid
|
|
58
|
+
*/
|
|
59
|
+
export declare function sanitizeEmail(email: string | undefined): string | undefined;
|
|
60
|
+
//# sourceMappingURL=token-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-utils.d.ts","sourceRoot":"","sources":["../../../lib/auth/token-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,aAAa,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAoVD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACzC,UAAU,EAAE,kBAAkB,EAAE,GAC9B,kBAAkB,GAAG,SAAS,CA8BhC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKzE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAuB9F;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACrC,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACd,kBAAkB,EAAE,CAiCtB;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC7C,MAAM,EAAE,eAAe,GAAG,SAAS,EACnC,gBAAgB,CAAC,EAAE,MAAM,GACvB,OAAO,CAIT;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACtC,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,MAAM,EAAE,eAAe,GAAG,SAAS,EACnC,cAAc,EAAE,MAAM,GAAG,SAAS,GAChC,MAAM,GAAG,SAAS,CAMpB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAK3E"}
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token utility functions for JWT parsing and account ID extraction.
|
|
3
|
+
* Extracted from accounts.ts to reduce module size and improve cohesion.
|
|
4
|
+
*/
|
|
5
|
+
import { decodeJWT } from "./auth.js";
|
|
6
|
+
import { JWT_CLAIM_PATH } from "../constants.js";
|
|
7
|
+
import { isRecord } from "../utils.js";
|
|
8
|
+
/**
|
|
9
|
+
* Converts a value to a trimmed string if it's a non-empty string.
|
|
10
|
+
* Local helper - returns undefined for non-strings (different from lib/utils.toStringValue).
|
|
11
|
+
*/
|
|
12
|
+
function toStringValue(value) {
|
|
13
|
+
if (typeof value !== "string")
|
|
14
|
+
return undefined;
|
|
15
|
+
const trimmed = value.trim();
|
|
16
|
+
return trimmed ? trimmed : undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Converts a value to boolean if possible.
|
|
20
|
+
*/
|
|
21
|
+
function toBoolean(value) {
|
|
22
|
+
if (value === undefined || value === null)
|
|
23
|
+
return undefined;
|
|
24
|
+
if (typeof value === "boolean")
|
|
25
|
+
return value;
|
|
26
|
+
if (typeof value === "string") {
|
|
27
|
+
const normalized = value.trim().toLowerCase();
|
|
28
|
+
if (normalized === "true")
|
|
29
|
+
return true;
|
|
30
|
+
if (normalized === "false")
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Formats account ID to last 6 characters for display.
|
|
37
|
+
*/
|
|
38
|
+
function formatAccountIdSuffix(accountId) {
|
|
39
|
+
return accountId.length > 6 ? accountId.slice(-6) : accountId;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Formats a label for token-derived account candidates.
|
|
43
|
+
*/
|
|
44
|
+
function formatTokenCandidateLabel(prefix, accountId) {
|
|
45
|
+
const suffix = formatAccountIdSuffix(accountId);
|
|
46
|
+
return `${prefix} [id:${suffix}]`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Extracts account ID from a JWT payload.
|
|
50
|
+
*/
|
|
51
|
+
function extractAccountIdFromPayload(payload) {
|
|
52
|
+
if (!payload)
|
|
53
|
+
return undefined;
|
|
54
|
+
const auth = payload[JWT_CLAIM_PATH];
|
|
55
|
+
if (isRecord(auth)) {
|
|
56
|
+
const id = toStringValue(auth.chatgpt_account_id);
|
|
57
|
+
if (id)
|
|
58
|
+
return id;
|
|
59
|
+
}
|
|
60
|
+
const direct = toStringValue(payload.chatgpt_account_id) ??
|
|
61
|
+
toStringValue(payload.account_id) ??
|
|
62
|
+
toStringValue(payload.accountId);
|
|
63
|
+
return direct;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Normalizes candidate arrays from various response formats.
|
|
67
|
+
*/
|
|
68
|
+
function normalizeCandidateArray(value) {
|
|
69
|
+
if (Array.isArray(value))
|
|
70
|
+
return value;
|
|
71
|
+
if (isRecord(value)) {
|
|
72
|
+
const nested = value.data ??
|
|
73
|
+
value.items ??
|
|
74
|
+
value.accounts ??
|
|
75
|
+
value.organizations ??
|
|
76
|
+
value.workspaces ??
|
|
77
|
+
value.teams;
|
|
78
|
+
if (Array.isArray(nested))
|
|
79
|
+
return nested;
|
|
80
|
+
}
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
function extractOrganizationIdFromRecord(record) {
|
|
84
|
+
return (toStringValue(record.organization_id) ??
|
|
85
|
+
toStringValue(record.organizationId) ??
|
|
86
|
+
toStringValue(record.org_id));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Extracts a single account candidate from a record.
|
|
90
|
+
*/
|
|
91
|
+
function extractCandidateFromRecord(record, source, organizationIdOverride) {
|
|
92
|
+
const accountId = toStringValue(record.account_id) ??
|
|
93
|
+
toStringValue(record.accountId) ??
|
|
94
|
+
toStringValue(record.chatgpt_account_id) ??
|
|
95
|
+
toStringValue(record.organization_id) ??
|
|
96
|
+
toStringValue(record.org_id) ??
|
|
97
|
+
toStringValue(record.workspace_id) ??
|
|
98
|
+
toStringValue(record.team_id) ??
|
|
99
|
+
toStringValue(record.id);
|
|
100
|
+
if (!accountId)
|
|
101
|
+
return null;
|
|
102
|
+
// Prefer explicit org identity from the record; only fall back to positional
|
|
103
|
+
// overrides when a record doesn't carry its own org identifier.
|
|
104
|
+
const organizationId = extractOrganizationIdFromRecord(record) ?? organizationIdOverride;
|
|
105
|
+
const name = toStringValue(record.name) ??
|
|
106
|
+
toStringValue(record.display_name) ??
|
|
107
|
+
toStringValue(record.title) ??
|
|
108
|
+
toStringValue(record.organization_name) ??
|
|
109
|
+
toStringValue(record.workspace_name) ??
|
|
110
|
+
toStringValue(record.team_name) ??
|
|
111
|
+
toStringValue(record.slug);
|
|
112
|
+
const type = toStringValue(record.type) ??
|
|
113
|
+
toStringValue(record.plan_type) ??
|
|
114
|
+
toStringValue(record.kind) ??
|
|
115
|
+
toStringValue(record.account_type);
|
|
116
|
+
const role = toStringValue(record.role) ??
|
|
117
|
+
toStringValue(record.membership_role) ??
|
|
118
|
+
toStringValue(record.user_role);
|
|
119
|
+
const isDefault = toBoolean(record.is_default ?? record.isDefault ?? record.default ?? record.primary ?? record.is_active ?? record.isActive ?? record.current);
|
|
120
|
+
const isPersonal = toBoolean(record.is_personal ?? record.isPersonal ?? record.personal);
|
|
121
|
+
const suffix = formatAccountIdSuffix(accountId);
|
|
122
|
+
const labelParts = [];
|
|
123
|
+
let labelBase = name ?? "Workspace";
|
|
124
|
+
if (!name && type) {
|
|
125
|
+
labelBase = type;
|
|
126
|
+
}
|
|
127
|
+
if (type && (!name || name.toLowerCase() !== type.toLowerCase())) {
|
|
128
|
+
labelParts.push(type);
|
|
129
|
+
}
|
|
130
|
+
if (role) {
|
|
131
|
+
labelParts.push(`role:${role}`);
|
|
132
|
+
}
|
|
133
|
+
if (isPersonal) {
|
|
134
|
+
labelParts.push("personal");
|
|
135
|
+
}
|
|
136
|
+
const meta = labelParts.length > 0 ? ` (${labelParts.join(", ")})` : "";
|
|
137
|
+
const label = `${labelBase}${meta} [id:${suffix}]`;
|
|
138
|
+
return {
|
|
139
|
+
accountId,
|
|
140
|
+
organizationId,
|
|
141
|
+
label,
|
|
142
|
+
source,
|
|
143
|
+
isDefault,
|
|
144
|
+
isPersonal,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Collects candidates from a list of records.
|
|
149
|
+
*/
|
|
150
|
+
function collectCandidatesFromList(value, source, organizationIdsByIndex) {
|
|
151
|
+
const result = [];
|
|
152
|
+
const list = normalizeCandidateArray(value);
|
|
153
|
+
if (list.length === 0)
|
|
154
|
+
return result;
|
|
155
|
+
for (const [index, item] of list.entries()) {
|
|
156
|
+
if (!isRecord(item))
|
|
157
|
+
continue;
|
|
158
|
+
const candidate = extractCandidateFromRecord(item, source, organizationIdsByIndex?.[index]);
|
|
159
|
+
if (candidate) {
|
|
160
|
+
result.push(candidate);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
function extractOrganizationIdsByIndex(value) {
|
|
166
|
+
const organizations = normalizeCandidateArray(value);
|
|
167
|
+
if (organizations.length === 0)
|
|
168
|
+
return [];
|
|
169
|
+
return organizations.map((organization) => {
|
|
170
|
+
if (!isRecord(organization))
|
|
171
|
+
return undefined;
|
|
172
|
+
return (toStringValue(organization.id) ??
|
|
173
|
+
toStringValue(organization.organization_id) ??
|
|
174
|
+
toStringValue(organization.organizationId) ??
|
|
175
|
+
toStringValue(organization.org_id) ??
|
|
176
|
+
toStringValue(organization.team_id) ??
|
|
177
|
+
toStringValue(organization.workspace_id));
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
function extractPrimaryAuthClaimOrganizationId(payload) {
|
|
181
|
+
if (!payload || !isRecord(payload))
|
|
182
|
+
return undefined;
|
|
183
|
+
const auth = payload[JWT_CLAIM_PATH];
|
|
184
|
+
if (!isRecord(auth))
|
|
185
|
+
return undefined;
|
|
186
|
+
const organizations = normalizeCandidateArray(auth.organizations);
|
|
187
|
+
if (organizations.length === 0)
|
|
188
|
+
return undefined;
|
|
189
|
+
const firstOrganization = organizations[0];
|
|
190
|
+
if (!isRecord(firstOrganization))
|
|
191
|
+
return undefined;
|
|
192
|
+
return toStringValue(firstOrganization.id);
|
|
193
|
+
}
|
|
194
|
+
function extractCanonicalOrganizationIds(payload) {
|
|
195
|
+
if (!payload || !isRecord(payload))
|
|
196
|
+
return [];
|
|
197
|
+
const auth = payload[JWT_CLAIM_PATH];
|
|
198
|
+
if (!isRecord(auth))
|
|
199
|
+
return [];
|
|
200
|
+
// Authoritative source: idToken['https://api.openai.com/auth'].organizations[0].id
|
|
201
|
+
// Only fall back to broader field extraction when this exact path is missing.
|
|
202
|
+
const primaryOrganizationId = extractPrimaryAuthClaimOrganizationId(payload);
|
|
203
|
+
if (primaryOrganizationId) {
|
|
204
|
+
const organizationIds = extractOrganizationIdsByIndex(auth.organizations);
|
|
205
|
+
if (organizationIds.length === 0)
|
|
206
|
+
return [primaryOrganizationId];
|
|
207
|
+
organizationIds[0] = primaryOrganizationId;
|
|
208
|
+
return organizationIds;
|
|
209
|
+
}
|
|
210
|
+
// Fallback: broader field extraction
|
|
211
|
+
return extractOrganizationIdsByIndex(auth.organizations);
|
|
212
|
+
}
|
|
213
|
+
function resolveOrganizationOverridesForKey(key, value, canonicalOrganizationIds) {
|
|
214
|
+
if (key === "organizations") {
|
|
215
|
+
if (canonicalOrganizationIds.length > 0)
|
|
216
|
+
return canonicalOrganizationIds;
|
|
217
|
+
return extractOrganizationIdsByIndex(value);
|
|
218
|
+
}
|
|
219
|
+
if (key !== "accounts" && key !== "workspaces" && key !== "teams") {
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
if (canonicalOrganizationIds.length === 0) {
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
const listLength = normalizeCandidateArray(value).length;
|
|
226
|
+
if (listLength === 0 || listLength !== canonicalOrganizationIds.length) {
|
|
227
|
+
return undefined;
|
|
228
|
+
}
|
|
229
|
+
return canonicalOrganizationIds;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Collects candidates from a JWT payload.
|
|
233
|
+
*/
|
|
234
|
+
function collectCandidatesFromPayload(payload, source) {
|
|
235
|
+
if (!payload || !isRecord(payload))
|
|
236
|
+
return [];
|
|
237
|
+
const candidates = [];
|
|
238
|
+
const keys = ["organizations", "orgs", "accounts", "workspaces", "teams"];
|
|
239
|
+
const payloadCanonicalOrganizationIds = extractOrganizationIdsByIndex(payload.organizations);
|
|
240
|
+
for (const key of keys) {
|
|
241
|
+
if (key in payload) {
|
|
242
|
+
candidates.push(...collectCandidatesFromList(payload[key], source, resolveOrganizationOverridesForKey(key, payload[key], payloadCanonicalOrganizationIds)));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
const auth = payload[JWT_CLAIM_PATH];
|
|
246
|
+
if (isRecord(auth)) {
|
|
247
|
+
const canonicalOrganizationIds = extractCanonicalOrganizationIds(payload);
|
|
248
|
+
for (const key of keys) {
|
|
249
|
+
if (key in auth) {
|
|
250
|
+
candidates.push(...collectCandidatesFromList(auth[key], source, resolveOrganizationOverridesForKey(key, auth[key], canonicalOrganizationIds)));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return candidates;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Removes duplicate candidates by identity hierarchy.
|
|
258
|
+
* organizationId -> accountId.
|
|
259
|
+
*/
|
|
260
|
+
function uniqueCandidates(candidates) {
|
|
261
|
+
const seen = new Set();
|
|
262
|
+
const result = [];
|
|
263
|
+
for (const candidate of candidates) {
|
|
264
|
+
const organizationId = candidate.organizationId?.trim();
|
|
265
|
+
const accountId = candidate.accountId.trim();
|
|
266
|
+
const key = organizationId
|
|
267
|
+
? `organizationId:${organizationId}`
|
|
268
|
+
: `accountId:${accountId}`;
|
|
269
|
+
if (seen.has(key))
|
|
270
|
+
continue;
|
|
271
|
+
seen.add(key);
|
|
272
|
+
result.push(candidate);
|
|
273
|
+
}
|
|
274
|
+
return result;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Select the best workspace candidate for OAuth account binding.
|
|
278
|
+
* Preference order:
|
|
279
|
+
* 1) org default that is not personal
|
|
280
|
+
* 2) org default (any)
|
|
281
|
+
* 3) id_token candidate
|
|
282
|
+
* 4) non-personal org candidate
|
|
283
|
+
* 5) token candidate
|
|
284
|
+
* 6) first candidate
|
|
285
|
+
*/
|
|
286
|
+
export function selectBestAccountCandidate(candidates) {
|
|
287
|
+
if (candidates.length === 0)
|
|
288
|
+
return undefined;
|
|
289
|
+
const orgDefaultNonPersonal = candidates.find((candidate) => candidate.source === "org" && candidate.isDefault === true && candidate.isPersonal !== true);
|
|
290
|
+
if (orgDefaultNonPersonal)
|
|
291
|
+
return orgDefaultNonPersonal;
|
|
292
|
+
const orgDefault = candidates.find((candidate) => candidate.source === "org" && candidate.isDefault === true);
|
|
293
|
+
if (orgDefault)
|
|
294
|
+
return orgDefault;
|
|
295
|
+
const idTokenCandidate = candidates.find((candidate) => candidate.source === "id_token");
|
|
296
|
+
if (idTokenCandidate)
|
|
297
|
+
return idTokenCandidate;
|
|
298
|
+
const nonPersonalOrg = candidates.find((candidate) => candidate.source === "org" && candidate.isPersonal !== true);
|
|
299
|
+
if (nonPersonalOrg)
|
|
300
|
+
return nonPersonalOrg;
|
|
301
|
+
const tokenCandidate = candidates.find((candidate) => candidate.source === "token");
|
|
302
|
+
if (tokenCandidate)
|
|
303
|
+
return tokenCandidate;
|
|
304
|
+
return candidates[0];
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Extracts the ChatGPT account ID from a JWT access token.
|
|
308
|
+
* @param accessToken - JWT access token from OAuth flow
|
|
309
|
+
* @returns Account ID string or undefined if not found
|
|
310
|
+
*/
|
|
311
|
+
export function extractAccountId(accessToken) {
|
|
312
|
+
if (!accessToken)
|
|
313
|
+
return undefined;
|
|
314
|
+
const decoded = decodeJWT(accessToken);
|
|
315
|
+
const accountId = decoded?.[JWT_CLAIM_PATH]?.chatgpt_account_id;
|
|
316
|
+
return typeof accountId === "string" && accountId.trim() ? accountId : undefined;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Extracts the email address from OAuth tokens.
|
|
320
|
+
* Checks id_token first (where OpenAI puts email), then falls back to access_token.
|
|
321
|
+
*/
|
|
322
|
+
export function extractAccountEmail(accessToken, idToken) {
|
|
323
|
+
// Try id_token first - OpenAI puts email here
|
|
324
|
+
if (idToken) {
|
|
325
|
+
const idDecoded = decodeJWT(idToken);
|
|
326
|
+
const idEmail = idDecoded?.email;
|
|
327
|
+
if (typeof idEmail === "string" && idEmail.includes("@") && idEmail.trim()) {
|
|
328
|
+
return idEmail;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// Fall back to access_token
|
|
332
|
+
if (!accessToken)
|
|
333
|
+
return undefined;
|
|
334
|
+
const decoded = decodeJWT(accessToken);
|
|
335
|
+
const nested = decoded?.[JWT_CLAIM_PATH];
|
|
336
|
+
const candidate = nested?.email ??
|
|
337
|
+
nested?.chatgpt_user_email ??
|
|
338
|
+
decoded?.email ??
|
|
339
|
+
decoded?.preferred_username;
|
|
340
|
+
if (typeof candidate === "string" && candidate.includes("@") && candidate.trim()) {
|
|
341
|
+
return candidate;
|
|
342
|
+
}
|
|
343
|
+
return undefined;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Extracts all accountId candidates from access/id tokens.
|
|
347
|
+
* Used to support business workspaces/organizations that are not the token default.
|
|
348
|
+
*/
|
|
349
|
+
export function getAccountIdCandidates(accessToken, idToken) {
|
|
350
|
+
const candidates = [];
|
|
351
|
+
const accessId = extractAccountId(accessToken);
|
|
352
|
+
if (accessId) {
|
|
353
|
+
candidates.push({
|
|
354
|
+
accountId: accessId,
|
|
355
|
+
label: formatTokenCandidateLabel("Token account", accessId),
|
|
356
|
+
source: "token",
|
|
357
|
+
isDefault: true,
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
if (accessToken) {
|
|
361
|
+
const accessDecoded = decodeJWT(accessToken);
|
|
362
|
+
candidates.push(...collectCandidatesFromPayload(accessDecoded, "org"));
|
|
363
|
+
}
|
|
364
|
+
if (idToken) {
|
|
365
|
+
const decoded = decodeJWT(idToken);
|
|
366
|
+
const primaryOrganizationId = extractPrimaryAuthClaimOrganizationId(decoded);
|
|
367
|
+
const idAccountId = extractAccountIdFromPayload(decoded);
|
|
368
|
+
if (idAccountId && idAccountId !== accessId) {
|
|
369
|
+
candidates.push({
|
|
370
|
+
accountId: idAccountId,
|
|
371
|
+
organizationId: primaryOrganizationId,
|
|
372
|
+
label: formatTokenCandidateLabel("ID token account", idAccountId),
|
|
373
|
+
source: "id_token",
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
candidates.push(...collectCandidatesFromPayload(decoded, "org"));
|
|
377
|
+
}
|
|
378
|
+
return uniqueCandidates(candidates);
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Determines if accountId should be updated from a token-derived value.
|
|
382
|
+
* We keep org/manual selections stable across refreshes.
|
|
383
|
+
*/
|
|
384
|
+
export function shouldUpdateAccountIdFromToken(source, currentAccountId) {
|
|
385
|
+
if (!currentAccountId)
|
|
386
|
+
return true;
|
|
387
|
+
if (!source)
|
|
388
|
+
return true;
|
|
389
|
+
return source === "token" || source === "id_token";
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Resolve which accountId to use for runtime API calls.
|
|
393
|
+
* Preserves explicit org/manual selections; only token/id_token sources auto-follow token changes.
|
|
394
|
+
*/
|
|
395
|
+
export function resolveRequestAccountId(storedAccountId, source, tokenAccountId) {
|
|
396
|
+
if (!storedAccountId)
|
|
397
|
+
return tokenAccountId;
|
|
398
|
+
if (!shouldUpdateAccountIdFromToken(source, storedAccountId)) {
|
|
399
|
+
return storedAccountId;
|
|
400
|
+
}
|
|
401
|
+
return tokenAccountId ?? storedAccountId;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Sanitizes an email address by trimming whitespace and lowercasing.
|
|
405
|
+
* @param email - Email string to sanitize
|
|
406
|
+
* @returns Sanitized email or undefined if invalid
|
|
407
|
+
*/
|
|
408
|
+
export function sanitizeEmail(email) {
|
|
409
|
+
if (!email)
|
|
410
|
+
return undefined;
|
|
411
|
+
const trimmed = email.trim();
|
|
412
|
+
if (!trimmed || !trimmed.includes("@"))
|
|
413
|
+
return undefined;
|
|
414
|
+
return trimmed.toLowerCase();
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=token-utils.js.map
|