@office-ai/aioncli-core 0.30.0 → 0.30.1
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/dist/docs/assets/theme-ansi-dark.png +0 -0
- package/dist/docs/assets/theme-atom-one-dark.png +0 -0
- package/dist/docs/assets/theme-ayu-dark.png +0 -0
- package/dist/docs/assets/theme-default-dark.png +0 -0
- package/dist/docs/assets/theme-dracula-dark.png +0 -0
- package/dist/docs/assets/theme-github-dark.png +0 -0
- package/dist/docs/assets/theme-holiday-dark.png +0 -0
- package/dist/docs/assets/theme-shades-of-purple-dark.png +0 -0
- package/dist/docs/assets/theme-solarized-dark.png +0 -0
- package/dist/docs/assets/theme-solarized-light.png +0 -0
- package/dist/docs/cli/notifications.md +58 -0
- package/dist/docs/redirects.json +20 -0
- package/dist/docs/reference/commands.md +563 -0
- package/dist/docs/reference/configuration.md +1804 -0
- package/dist/docs/reference/keyboard-shortcuts.md +168 -0
- package/dist/docs/reference/memport.md +246 -0
- package/dist/docs/reference/policy-engine.md +386 -0
- package/dist/docs/reference/tools.md +106 -0
- package/dist/docs/resources/faq.md +175 -0
- package/dist/docs/resources/quota-and-pricing.md +199 -0
- package/dist/docs/resources/tos-privacy.md +102 -0
- package/dist/docs/resources/troubleshooting.md +176 -0
- package/dist/docs/resources/uninstall.md +56 -0
- package/dist/src/agents/a2a-errors.d.ts +65 -0
- package/dist/src/agents/a2a-errors.js +164 -0
- package/dist/src/agents/a2a-errors.js.map +1 -0
- package/dist/src/agents/a2a-errors.test.d.ts +6 -0
- package/dist/src/agents/a2a-errors.test.js +183 -0
- package/dist/src/agents/a2a-errors.test.js.map +1 -0
- package/dist/src/agents/auth-provider/api-key-provider.d.ts +30 -0
- package/dist/src/agents/auth-provider/api-key-provider.js +66 -0
- package/dist/src/agents/auth-provider/api-key-provider.js.map +1 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.d.ts +6 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.js +130 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.js.map +1 -0
- package/dist/src/agents/auth-provider/http-provider.d.ts +28 -0
- package/dist/src/agents/auth-provider/http-provider.js +73 -0
- package/dist/src/agents/auth-provider/http-provider.js.map +1 -0
- package/dist/src/agents/auth-provider/http-provider.test.d.ts +6 -0
- package/dist/src/agents/auth-provider/http-provider.test.js +112 -0
- package/dist/src/agents/auth-provider/http-provider.test.js.map +1 -0
- package/dist/src/agents/auth-provider/oauth2-provider.d.ts +65 -0
- package/dist/src/agents/auth-provider/oauth2-provider.js +233 -0
- package/dist/src/agents/auth-provider/oauth2-provider.js.map +1 -0
- package/dist/src/agents/auth-provider/oauth2-provider.test.d.ts +6 -0
- package/dist/src/agents/auth-provider/oauth2-provider.test.js +490 -0
- package/dist/src/agents/auth-provider/oauth2-provider.test.js.map +1 -0
- package/dist/src/agents/browser/analyzeScreenshot.d.ts +35 -0
- package/dist/src/agents/browser/analyzeScreenshot.js +183 -0
- package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.d.ts +6 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.js +161 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -0
- package/dist/src/agents/browser/automationOverlay.d.ts +26 -0
- package/dist/src/agents/browser/automationOverlay.js +100 -0
- package/dist/src/agents/browser/automationOverlay.js.map +1 -0
- package/dist/src/agents/browser/browserAgentDefinition.d.ts +50 -0
- package/dist/src/agents/browser/browserAgentDefinition.js +141 -0
- package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -0
- package/dist/src/agents/browser/browserAgentFactory.d.ts +42 -0
- package/dist/src/agents/browser/browserAgentFactory.js +116 -0
- package/dist/src/agents/browser/browserAgentFactory.js.map +1 -0
- package/dist/src/agents/browser/browserAgentFactory.test.d.ts +6 -0
- package/dist/src/agents/browser/browserAgentFactory.test.js +240 -0
- package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -0
- package/dist/src/agents/browser/browserAgentInvocation.d.ts +34 -0
- package/dist/src/agents/browser/browserAgentInvocation.js +386 -0
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.d.ts +6 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.js +382 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -0
- package/dist/src/agents/browser/browserManager.d.ts +115 -0
- package/dist/src/agents/browser/browserManager.js +370 -0
- package/dist/src/agents/browser/browserManager.js.map +1 -0
- package/dist/src/agents/browser/browserManager.test.d.ts +6 -0
- package/dist/src/agents/browser/browserManager.test.js +382 -0
- package/dist/src/agents/browser/browserManager.test.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapper.d.ts +45 -0
- package/dist/src/agents/browser/mcpToolWrapper.js +358 -0
- package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.d.ts +6 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.js +126 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.d.ts +6 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js +59 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js.map +1 -0
- package/dist/src/agents/browser/modelAvailability.d.ts +23 -0
- package/dist/src/agents/browser/modelAvailability.js +23 -0
- package/dist/src/agents/browser/modelAvailability.js.map +1 -0
- package/dist/src/agents/cli-help-agent.d.ts +2 -2
- package/dist/src/billing/billing.d.ts +80 -0
- package/dist/src/billing/billing.js +128 -0
- package/dist/src/billing/billing.js.map +1 -0
- package/dist/src/billing/billing.test.d.ts +6 -0
- package/dist/src/billing/billing.test.js +182 -0
- package/dist/src/billing/billing.test.js.map +1 -0
- package/dist/src/billing/index.d.ts +6 -0
- package/dist/src/billing/index.js +7 -0
- package/dist/src/billing/index.js.map +1 -0
- package/dist/src/code_assist/oauth2.d.ts +1 -1
- package/dist/src/code_assist/types.d.ts +26 -26
- package/dist/src/config/agent-loop-context.d.ts +22 -0
- package/dist/src/config/agent-loop-context.js +7 -0
- package/dist/src/config/agent-loop-context.js.map +1 -0
- package/dist/src/config/trackerFeatureFlag.test.d.ts +6 -0
- package/dist/src/config/trackerFeatureFlag.test.js +43 -0
- package/dist/src/config/trackerFeatureFlag.test.js.map +1 -0
- package/dist/src/config/userHintService.d.ts +46 -0
- package/dist/src/config/userHintService.js +81 -0
- package/dist/src/config/userHintService.js.map +1 -0
- package/dist/src/config/userHintService.test.d.ts +6 -0
- package/dist/src/config/userHintService.test.js +62 -0
- package/dist/src/config/userHintService.test.js.map +1 -0
- package/dist/src/core/localLiteRtLmClient.d.ts +24 -0
- package/dist/src/core/localLiteRtLmClient.js +77 -0
- package/dist/src/core/localLiteRtLmClient.js.map +1 -0
- package/dist/src/core/localLiteRtLmClient.test.d.ts +6 -0
- package/dist/src/core/localLiteRtLmClient.test.js +87 -0
- package/dist/src/core/localLiteRtLmClient.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator.d.ts +1 -0
- package/dist/src/core/openaiContentGenerator.js +13 -13
- package/dist/src/core/openaiContentGenerator.js.map +1 -1
- package/dist/src/hooks/runtimeHooks.test.d.ts +6 -0
- package/dist/src/hooks/runtimeHooks.test.js +100 -0
- package/dist/src/hooks/runtimeHooks.test.js.map +1 -0
- package/dist/src/ide/types.d.ts +6 -6
- package/dist/src/mcp/mcp-oauth-provider.d.ts +43 -0
- package/dist/src/mcp/mcp-oauth-provider.js +67 -0
- package/dist/src/mcp/mcp-oauth-provider.js.map +1 -0
- package/dist/src/mcp/mcp-oauth-provider.test.d.ts +6 -0
- package/dist/src/mcp/mcp-oauth-provider.test.js +63 -0
- package/dist/src/mcp/mcp-oauth-provider.test.js.map +1 -0
- package/dist/src/policy/integrity.d.ts +45 -0
- package/dist/src/policy/integrity.js +121 -0
- package/dist/src/policy/integrity.js.map +1 -0
- package/dist/src/policy/integrity.test.d.ts +6 -0
- package/dist/src/policy/integrity.test.js +132 -0
- package/dist/src/policy/integrity.test.js.map +1 -0
- package/dist/src/policy/policies/conseca.toml +6 -0
- package/dist/src/policy/workspace-policy.test.js +231 -0
- package/dist/src/policy/workspace-policy.test.js.map +1 -0
- package/dist/src/routing/strategies/approvalModeStrategy.d.ts +18 -0
- package/dist/src/routing/strategies/approvalModeStrategy.js +59 -0
- package/dist/src/routing/strategies/approvalModeStrategy.js.map +1 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.d.ts +6 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.js +140 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.js.map +1 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.d.ts +14 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.js +182 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.js.map +1 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.d.ts +6 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js +218 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js.map +1 -0
- package/dist/src/safety/conseca/conseca.d.ts +31 -0
- package/dist/src/safety/conseca/conseca.js +105 -0
- package/dist/src/safety/conseca/conseca.js.map +1 -0
- package/dist/src/safety/conseca/conseca.test.js +226 -0
- package/dist/src/safety/conseca/conseca.test.js.map +1 -0
- package/dist/src/safety/conseca/integration.test.js +19 -0
- package/dist/src/safety/conseca/integration.test.js.map +1 -0
- package/dist/src/safety/conseca/policy-enforcer.d.ts +13 -0
- package/dist/src/safety/conseca/policy-enforcer.js +135 -0
- package/dist/src/safety/conseca/policy-enforcer.js.map +1 -0
- package/dist/src/safety/conseca/policy-enforcer.test.js +141 -0
- package/dist/src/safety/conseca/policy-enforcer.test.js.map +1 -0
- package/dist/src/safety/conseca/policy-generator.d.ts +15 -0
- package/dist/src/safety/conseca/policy-generator.js +144 -0
- package/dist/src/safety/conseca/policy-generator.js.map +1 -0
- package/dist/src/safety/conseca/policy-generator.test.d.ts +6 -0
- package/dist/src/safety/conseca/policy-generator.test.js +84 -0
- package/dist/src/safety/conseca/policy-generator.test.js.map +1 -0
- package/dist/src/safety/conseca/types.d.ts +15 -0
- package/dist/src/safety/conseca/types.js +7 -0
- package/dist/src/safety/conseca/types.js.map +1 -0
- package/dist/src/scheduler/scheduler_parallel.test.d.ts +6 -0
- package/dist/src/scheduler/scheduler_parallel.test.js +401 -0
- package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -0
- package/dist/src/services/FolderTrustDiscoveryService.d.ts +32 -0
- package/dist/src/services/FolderTrustDiscoveryService.js +169 -0
- package/dist/src/services/FolderTrustDiscoveryService.js.map +1 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.d.ts +6 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.js +118 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.js.map +1 -0
- package/dist/src/services/fileKeychain.d.ts +24 -0
- package/dist/src/services/fileKeychain.js +123 -0
- package/dist/src/services/fileKeychain.js.map +1 -0
- package/dist/src/services/keychainService.d.ts +51 -0
- package/dist/src/services/keychainService.js +133 -0
- package/dist/src/services/keychainService.js.map +1 -0
- package/dist/src/services/keychainService.test.d.ts +6 -0
- package/dist/src/services/keychainService.test.js +150 -0
- package/dist/src/services/keychainService.test.js.map +1 -0
- package/dist/src/services/keychainTypes.d.ts +41 -0
- package/dist/src/services/keychainTypes.js +18 -0
- package/dist/src/services/keychainTypes.js.map +1 -0
- package/dist/src/services/trackerService.d.ts +49 -0
- package/dist/src/services/trackerService.js +193 -0
- package/dist/src/services/trackerService.js.map +1 -0
- package/dist/src/services/trackerService.test.d.ts +6 -0
- package/dist/src/services/trackerService.test.js +117 -0
- package/dist/src/services/trackerService.test.js.map +1 -0
- package/dist/src/services/trackerTypes.d.ts +51 -0
- package/dist/src/services/trackerTypes.js +33 -0
- package/dist/src/services/trackerTypes.js.map +1 -0
- package/dist/src/telemetry/billingEvents.d.ts +75 -0
- package/dist/src/telemetry/billingEvents.js +181 -0
- package/dist/src/telemetry/billingEvents.js.map +1 -0
- package/dist/src/telemetry/billingEvents.test.d.ts +6 -0
- package/dist/src/telemetry/billingEvents.test.js +139 -0
- package/dist/src/telemetry/billingEvents.test.js.map +1 -0
- package/dist/src/telemetry/conseca-logger.d.ts +9 -0
- package/dist/src/telemetry/conseca-logger.js +91 -0
- package/dist/src/telemetry/conseca-logger.js.map +1 -0
- package/dist/src/telemetry/conseca-logger.test.d.ts +6 -0
- package/dist/src/telemetry/conseca-logger.test.js +90 -0
- package/dist/src/telemetry/conseca-logger.test.js.map +1 -0
- package/dist/src/telemetry/trace.test.d.ts +6 -0
- package/dist/src/telemetry/trace.test.js +116 -0
- package/dist/src/telemetry/trace.test.js.map +1 -0
- package/dist/src/tools/definitions/trackerTools.d.ts +12 -0
- package/dist/src/tools/definitions/trackerTools.js +146 -0
- package/dist/src/tools/definitions/trackerTools.js.map +1 -0
- package/dist/src/tools/diff-utils.d.ts +9 -0
- package/dist/src/tools/diff-utils.js +66 -0
- package/dist/src/tools/diff-utils.js.map +1 -0
- package/dist/src/tools/diff-utils.test.d.ts +6 -0
- package/dist/src/tools/diff-utils.test.js +53 -0
- package/dist/src/tools/diff-utils.test.js.map +1 -0
- package/dist/src/tools/grep-utils.d.ts +49 -0
- package/dist/src/tools/grep-utils.js +147 -0
- package/dist/src/tools/grep-utils.js.map +1 -0
- package/dist/src/tools/omissionPlaceholderDetector.d.ts +15 -0
- package/dist/src/tools/omissionPlaceholderDetector.js +90 -0
- package/dist/src/tools/omissionPlaceholderDetector.js.map +1 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.d.ts +6 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.js +49 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.js.map +1 -0
- package/dist/src/tools/trackerTools.d.ts +122 -0
- package/dist/src/tools/trackerTools.js +365 -0
- package/dist/src/tools/trackerTools.js.map +1 -0
- package/dist/src/tools/trackerTools.test.d.ts +6 -0
- package/dist/src/tools/trackerTools.test.js +97 -0
- package/dist/src/tools/trackerTools.test.js.map +1 -0
- package/dist/src/utils/approvalModeUtils.d.ts +14 -0
- package/dist/src/utils/approvalModeUtils.js +35 -0
- package/dist/src/utils/approvalModeUtils.js.map +1 -0
- package/dist/src/utils/approvalModeUtils.test.d.ts +6 -0
- package/dist/src/utils/approvalModeUtils.test.js +36 -0
- package/dist/src/utils/approvalModeUtils.test.js.map +1 -0
- package/dist/src/utils/cache.d.ts +63 -0
- package/dist/src/utils/cache.js +103 -0
- package/dist/src/utils/cache.js.map +1 -0
- package/dist/src/utils/cache.test.d.ts +6 -0
- package/dist/src/utils/cache.test.js +158 -0
- package/dist/src/utils/cache.test.js.map +1 -0
- package/dist/src/utils/checkpointUtils.d.ts +2 -2
- package/dist/src/utils/compatibility.d.ts +41 -0
- package/dist/src/utils/compatibility.js +112 -0
- package/dist/src/utils/compatibility.js.map +1 -0
- package/dist/src/utils/compatibility.test.d.ts +6 -0
- package/dist/src/utils/compatibility.test.js +233 -0
- package/dist/src/utils/compatibility.test.js.map +1 -0
- package/dist/src/utils/envExpansion.d.ts +18 -0
- package/dist/src/utils/envExpansion.js +46 -0
- package/dist/src/utils/envExpansion.js.map +1 -0
- package/dist/src/utils/envExpansion.test.d.ts +6 -0
- package/dist/src/utils/envExpansion.test.js +110 -0
- package/dist/src/utils/envExpansion.test.js.map +1 -0
- package/dist/src/utils/errors_timeout.test.d.ts +6 -0
- package/dist/src/utils/errors_timeout.test.js +40 -0
- package/dist/src/utils/errors_timeout.test.js.map +1 -0
- package/dist/src/utils/fetch.test.d.ts +6 -0
- package/dist/src/utils/fetch.test.js +206 -0
- package/dist/src/utils/fetch.test.js.map +1 -0
- package/dist/src/utils/markdownUtils.d.ts +22 -0
- package/dist/src/utils/markdownUtils.js +126 -0
- package/dist/src/utils/markdownUtils.js.map +1 -0
- package/dist/src/utils/markdownUtils.test.d.ts +6 -0
- package/dist/src/utils/markdownUtils.test.js +107 -0
- package/dist/src/utils/markdownUtils.test.js.map +1 -0
- package/dist/src/utils/oauth-flow.d.ts +105 -0
- package/dist/src/utils/oauth-flow.js +370 -0
- package/dist/src/utils/oauth-flow.js.map +1 -0
- package/dist/src/utils/oauth-flow.test.d.ts +6 -0
- package/dist/src/utils/oauth-flow.test.js +360 -0
- package/dist/src/utils/oauth-flow.test.js.map +1 -0
- package/dist/src/utils/sessionUtils.d.ts +14 -0
- package/dist/src/utils/sessionUtils.js +122 -0
- package/dist/src/utils/sessionUtils.js.map +1 -0
- package/dist/src/utils/sessionUtils.test.d.ts +1 -0
- package/dist/src/utils/sessionUtils.test.js +171 -0
- package/dist/src/utils/sessionUtils.test.js.map +1 -0
- package/dist/src/voice/responseFormatter.d.ts +38 -0
- package/dist/src/voice/responseFormatter.js +130 -0
- package/dist/src/voice/responseFormatter.js.map +1 -0
- package/dist/src/voice/responseFormatter.test.d.ts +6 -0
- package/dist/src/voice/responseFormatter.test.js +214 -0
- package/dist/src/voice/responseFormatter.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/docs/CONTRIBUTING.md +0 -555
- package/dist/src/agents/executor.d.ts +0 -114
- package/dist/src/agents/executor.js +0 -779
- package/dist/src/agents/executor.js.map +0 -1
- package/dist/src/agents/executor.test.js +0 -1362
- package/dist/src/agents/executor.test.js.map +0 -1
- package/dist/src/agents/invocation.d.ts +0 -46
- package/dist/src/agents/invocation.js +0 -102
- package/dist/src/agents/invocation.js.map +0 -1
- package/dist/src/agents/invocation.test.js +0 -215
- package/dist/src/agents/invocation.test.js.map +0 -1
- package/dist/src/core/subagent.d.ts +0 -236
- package/dist/src/core/subagent.js +0 -482
- package/dist/src/core/subagent.js.map +0 -1
- package/dist/src/core/subagent.test.js +0 -530
- package/dist/src/core/subagent.test.js.map +0 -1
- package/dist/src/tools/smart-edit.d.ts +0 -78
- package/dist/src/tools/smart-edit.js +0 -717
- package/dist/src/tools/smart-edit.js.map +0 -1
- package/dist/src/tools/smart-edit.test.js +0 -592
- package/dist/src/tools/smart-edit.test.js.map +0 -1
- /package/dist/src/{agents/executor.test.d.ts → policy/workspace-policy.test.d.ts} +0 -0
- /package/dist/src/{agents/invocation.test.d.ts → safety/conseca/conseca.test.d.ts} +0 -0
- /package/dist/src/{core/subagent.test.d.ts → safety/conseca/integration.test.d.ts} +0 -0
- /package/dist/src/{tools/smart-edit.test.d.ts → safety/conseca/policy-enforcer.test.d.ts} +0 -0
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Shared OAuth 2.0 Authorization Code flow primitives with PKCE support.
|
|
8
|
+
*
|
|
9
|
+
* These utilities are protocol-agnostic and can be used by both MCP OAuth
|
|
10
|
+
* and A2A OAuth authentication providers.
|
|
11
|
+
*/
|
|
12
|
+
import * as http from 'node:http';
|
|
13
|
+
import * as crypto from 'node:crypto';
|
|
14
|
+
import { URL } from 'node:url';
|
|
15
|
+
import { debugLogger } from './debugLogger.js';
|
|
16
|
+
/** The path the local callback server listens on. */
|
|
17
|
+
export const REDIRECT_PATH = '/oauth/callback';
|
|
18
|
+
const HTTP_OK = 200;
|
|
19
|
+
/**
|
|
20
|
+
* Generate PKCE parameters for OAuth flow.
|
|
21
|
+
*
|
|
22
|
+
* @returns PKCE parameters including code verifier, challenge, and state
|
|
23
|
+
*/
|
|
24
|
+
export function generatePKCEParams() {
|
|
25
|
+
// Generate code verifier (43-128 characters)
|
|
26
|
+
// using 64 bytes results in ~86 characters, safely above the minimum of 43
|
|
27
|
+
const codeVerifier = crypto.randomBytes(64).toString('base64url');
|
|
28
|
+
// Generate code challenge using SHA256
|
|
29
|
+
const codeChallenge = crypto
|
|
30
|
+
.createHash('sha256')
|
|
31
|
+
.update(codeVerifier)
|
|
32
|
+
.digest('base64url');
|
|
33
|
+
// Generate state for CSRF protection
|
|
34
|
+
const state = crypto.randomBytes(16).toString('base64url');
|
|
35
|
+
return { codeVerifier, codeChallenge, state };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Start a local HTTP server to handle OAuth callback.
|
|
39
|
+
* The server will listen on the specified port (or port 0 for OS assignment).
|
|
40
|
+
*
|
|
41
|
+
* @param expectedState The state parameter to validate
|
|
42
|
+
* @param port Optional preferred port to listen on
|
|
43
|
+
* @returns Object containing the port (available immediately) and a promise for the auth response
|
|
44
|
+
*/
|
|
45
|
+
export function startCallbackServer(expectedState, port) {
|
|
46
|
+
let portResolve;
|
|
47
|
+
let portReject;
|
|
48
|
+
const portPromise = new Promise((resolve, reject) => {
|
|
49
|
+
portResolve = resolve;
|
|
50
|
+
portReject = reject;
|
|
51
|
+
});
|
|
52
|
+
const responsePromise = new Promise((resolve, reject) => {
|
|
53
|
+
let serverPort;
|
|
54
|
+
const server = http.createServer(async (req, res) => {
|
|
55
|
+
try {
|
|
56
|
+
const url = new URL(req.url, `http://localhost:${serverPort}`);
|
|
57
|
+
if (url.pathname !== REDIRECT_PATH) {
|
|
58
|
+
res.writeHead(404);
|
|
59
|
+
res.end('Not found');
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const code = url.searchParams.get('code');
|
|
63
|
+
const state = url.searchParams.get('state');
|
|
64
|
+
const error = url.searchParams.get('error');
|
|
65
|
+
if (error) {
|
|
66
|
+
res.writeHead(HTTP_OK, { 'Content-Type': 'text/html' });
|
|
67
|
+
res.end(`
|
|
68
|
+
<html>
|
|
69
|
+
<body>
|
|
70
|
+
<h1>Authentication Failed</h1>
|
|
71
|
+
<p>Error: ${error.replace(/</g, '<').replace(/>/g, '>')}</p>
|
|
72
|
+
<p>${(url.searchParams.get('error_description') || '').replace(/</g, '<').replace(/>/g, '>')}</p>
|
|
73
|
+
<p>You can close this window.</p>
|
|
74
|
+
</body>
|
|
75
|
+
</html>
|
|
76
|
+
`);
|
|
77
|
+
server.close();
|
|
78
|
+
reject(new Error(`OAuth error: ${error}`));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (!code || !state) {
|
|
82
|
+
res.writeHead(400);
|
|
83
|
+
res.end('Missing code or state parameter');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (state !== expectedState) {
|
|
87
|
+
res.writeHead(400);
|
|
88
|
+
res.end('Invalid state parameter');
|
|
89
|
+
server.close();
|
|
90
|
+
reject(new Error('State mismatch - possible CSRF attack'));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Send success response to browser
|
|
94
|
+
res.writeHead(HTTP_OK, { 'Content-Type': 'text/html' });
|
|
95
|
+
res.end(`
|
|
96
|
+
<html>
|
|
97
|
+
<body>
|
|
98
|
+
<h1>Authentication Successful!</h1>
|
|
99
|
+
<p>You can close this window and return to Gemini CLI.</p>
|
|
100
|
+
<script>window.close();</script>
|
|
101
|
+
</body>
|
|
102
|
+
</html>
|
|
103
|
+
`);
|
|
104
|
+
server.close();
|
|
105
|
+
resolve({ code, state });
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
server.close();
|
|
109
|
+
reject(error);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
server.on('error', (error) => {
|
|
113
|
+
portReject(error);
|
|
114
|
+
reject(error);
|
|
115
|
+
});
|
|
116
|
+
// Determine which port to use (env var, argument, or OS-assigned)
|
|
117
|
+
let listenPort = 0; // Default to OS-assigned port
|
|
118
|
+
const portStr = process.env['OAUTH_CALLBACK_PORT'];
|
|
119
|
+
if (portStr) {
|
|
120
|
+
const envPort = parseInt(portStr, 10);
|
|
121
|
+
if (isNaN(envPort) || envPort <= 0 || envPort > 65535) {
|
|
122
|
+
const error = new Error(`Invalid value for OAUTH_CALLBACK_PORT: "${portStr}"`);
|
|
123
|
+
portReject(error);
|
|
124
|
+
reject(error);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
listenPort = envPort;
|
|
128
|
+
}
|
|
129
|
+
else if (port !== undefined) {
|
|
130
|
+
listenPort = port;
|
|
131
|
+
}
|
|
132
|
+
server.listen(listenPort, () => {
|
|
133
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
134
|
+
const address = server.address();
|
|
135
|
+
serverPort = address.port;
|
|
136
|
+
debugLogger.log(`OAuth callback server listening on port ${serverPort}`);
|
|
137
|
+
portResolve(serverPort); // Resolve port promise immediately
|
|
138
|
+
});
|
|
139
|
+
// Timeout after 5 minutes
|
|
140
|
+
setTimeout(() => {
|
|
141
|
+
server.close();
|
|
142
|
+
reject(new Error('OAuth callback timeout'));
|
|
143
|
+
}, 5 * 60 * 1000);
|
|
144
|
+
});
|
|
145
|
+
return { port: portPromise, response: responsePromise };
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Extract the port number from a URL string if available and valid.
|
|
149
|
+
*
|
|
150
|
+
* @param urlString The URL string to parse
|
|
151
|
+
* @returns The port number or undefined if not found or invalid
|
|
152
|
+
*/
|
|
153
|
+
export function getPortFromUrl(urlString) {
|
|
154
|
+
if (!urlString) {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
const url = new URL(urlString);
|
|
159
|
+
if (url.port) {
|
|
160
|
+
const parsedPort = parseInt(url.port, 10);
|
|
161
|
+
if (!isNaN(parsedPort) && parsedPort > 0 && parsedPort <= 65535) {
|
|
162
|
+
return parsedPort;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Ignore invalid URL
|
|
168
|
+
}
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Build the authorization URL for the OAuth flow.
|
|
173
|
+
*
|
|
174
|
+
* @param config OAuth flow configuration
|
|
175
|
+
* @param pkceParams PKCE parameters
|
|
176
|
+
* @param redirectPort The port to use for the redirect URI
|
|
177
|
+
* @param resource Optional resource parameter value (RFC 8707)
|
|
178
|
+
* @returns The authorization URL
|
|
179
|
+
*/
|
|
180
|
+
export function buildAuthorizationUrl(config, pkceParams, redirectPort, resource) {
|
|
181
|
+
const redirectUri = config.redirectUri || `http://localhost:${redirectPort}${REDIRECT_PATH}`;
|
|
182
|
+
const params = new URLSearchParams({
|
|
183
|
+
client_id: config.clientId,
|
|
184
|
+
response_type: 'code',
|
|
185
|
+
redirect_uri: redirectUri,
|
|
186
|
+
state: pkceParams.state,
|
|
187
|
+
code_challenge: pkceParams.codeChallenge,
|
|
188
|
+
code_challenge_method: 'S256',
|
|
189
|
+
});
|
|
190
|
+
if (config.scopes && config.scopes.length > 0) {
|
|
191
|
+
params.append('scope', config.scopes.join(' '));
|
|
192
|
+
}
|
|
193
|
+
if (config.audiences && config.audiences.length > 0) {
|
|
194
|
+
params.append('audience', config.audiences.join(' '));
|
|
195
|
+
}
|
|
196
|
+
if (resource) {
|
|
197
|
+
params.append('resource', resource);
|
|
198
|
+
}
|
|
199
|
+
const url = new URL(config.authorizationUrl);
|
|
200
|
+
params.forEach((value, key) => {
|
|
201
|
+
url.searchParams.append(key, value);
|
|
202
|
+
});
|
|
203
|
+
return url.toString();
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Parse a token endpoint response, handling both JSON and form-urlencoded formats.
|
|
207
|
+
*
|
|
208
|
+
* @param response The HTTP response from the token endpoint
|
|
209
|
+
* @param operationName Human-readable operation name for error messages (e.g., "Token exchange", "Token refresh")
|
|
210
|
+
* @param defaultErrorCode Default error code when access_token is missing (e.g., "no_access_token", "unknown_error")
|
|
211
|
+
* @returns The parsed token response
|
|
212
|
+
*/
|
|
213
|
+
async function parseTokenEndpointResponse(response, operationName, defaultErrorCode) {
|
|
214
|
+
const responseText = await response.text();
|
|
215
|
+
const contentType = response.headers.get('content-type') || '';
|
|
216
|
+
if (!response.ok) {
|
|
217
|
+
// Try to parse error from form-urlencoded response
|
|
218
|
+
let errorMessage = null;
|
|
219
|
+
try {
|
|
220
|
+
const errorParams = new URLSearchParams(responseText);
|
|
221
|
+
const error = errorParams.get('error');
|
|
222
|
+
const errorDescription = errorParams.get('error_description');
|
|
223
|
+
if (error) {
|
|
224
|
+
errorMessage = `${operationName} failed: ${error} - ${errorDescription || 'No description'}`;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// Fall back to raw error
|
|
229
|
+
}
|
|
230
|
+
throw new Error(errorMessage ||
|
|
231
|
+
`${operationName} failed: ${response.status} - ${responseText}`);
|
|
232
|
+
}
|
|
233
|
+
// Log unexpected content types for debugging
|
|
234
|
+
if (!contentType.includes('application/json') &&
|
|
235
|
+
!contentType.includes('application/x-www-form-urlencoded')) {
|
|
236
|
+
debugLogger.warn(`${operationName} endpoint returned unexpected content-type: ${contentType}. ` +
|
|
237
|
+
`Expected application/json or application/x-www-form-urlencoded. ` +
|
|
238
|
+
`Will attempt to parse response.`);
|
|
239
|
+
}
|
|
240
|
+
// Try to parse as JSON first, fall back to form-urlencoded
|
|
241
|
+
try {
|
|
242
|
+
const data = JSON.parse(responseText);
|
|
243
|
+
if (data &&
|
|
244
|
+
typeof data === 'object' &&
|
|
245
|
+
'access_token' in data &&
|
|
246
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
247
|
+
typeof data['access_token'] === 'string') {
|
|
248
|
+
const obj = data;
|
|
249
|
+
const result = {
|
|
250
|
+
access_token: String(obj['access_token']),
|
|
251
|
+
token_type:
|
|
252
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
253
|
+
typeof obj['token_type'] === 'string' ? obj['token_type'] : 'Bearer',
|
|
254
|
+
expires_in:
|
|
255
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
256
|
+
typeof obj['expires_in'] === 'number' ? obj['expires_in'] : undefined,
|
|
257
|
+
refresh_token:
|
|
258
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
259
|
+
typeof obj['refresh_token'] === 'string'
|
|
260
|
+
? obj['refresh_token']
|
|
261
|
+
: undefined,
|
|
262
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
263
|
+
scope: typeof obj['scope'] === 'string' ? obj['scope'] : undefined,
|
|
264
|
+
};
|
|
265
|
+
return result;
|
|
266
|
+
}
|
|
267
|
+
// JSON parsed but doesn't look like a token response — fall through
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
// Not JSON — fall through to form-urlencoded parsing
|
|
271
|
+
}
|
|
272
|
+
// Parse form-urlencoded response
|
|
273
|
+
const tokenParams = new URLSearchParams(responseText);
|
|
274
|
+
const accessToken = tokenParams.get('access_token');
|
|
275
|
+
const tokenType = tokenParams.get('token_type') || 'Bearer';
|
|
276
|
+
const expiresIn = tokenParams.get('expires_in');
|
|
277
|
+
const refreshToken = tokenParams.get('refresh_token');
|
|
278
|
+
const scope = tokenParams.get('scope');
|
|
279
|
+
if (!accessToken) {
|
|
280
|
+
// Check for error in response
|
|
281
|
+
const error = tokenParams.get('error');
|
|
282
|
+
const errorDescription = tokenParams.get('error_description');
|
|
283
|
+
throw new Error(`${operationName} failed: ${error || defaultErrorCode} - ${errorDescription || responseText}`);
|
|
284
|
+
}
|
|
285
|
+
return {
|
|
286
|
+
access_token: accessToken,
|
|
287
|
+
token_type: tokenType,
|
|
288
|
+
expires_in: expiresIn ? parseInt(expiresIn, 10) : undefined,
|
|
289
|
+
refresh_token: refreshToken || undefined,
|
|
290
|
+
scope: scope || undefined,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Exchange an authorization code for tokens.
|
|
295
|
+
*
|
|
296
|
+
* @param config OAuth flow configuration
|
|
297
|
+
* @param code Authorization code
|
|
298
|
+
* @param codeVerifier PKCE code verifier
|
|
299
|
+
* @param redirectPort The port to use for the redirect URI
|
|
300
|
+
* @param resource Optional resource parameter value (RFC 8707)
|
|
301
|
+
* @returns The token response
|
|
302
|
+
*/
|
|
303
|
+
export async function exchangeCodeForToken(config, code, codeVerifier, redirectPort, resource) {
|
|
304
|
+
const redirectUri = config.redirectUri || `http://localhost:${redirectPort}${REDIRECT_PATH}`;
|
|
305
|
+
const params = new URLSearchParams({
|
|
306
|
+
grant_type: 'authorization_code',
|
|
307
|
+
code,
|
|
308
|
+
redirect_uri: redirectUri,
|
|
309
|
+
code_verifier: codeVerifier,
|
|
310
|
+
client_id: config.clientId,
|
|
311
|
+
});
|
|
312
|
+
if (config.clientSecret) {
|
|
313
|
+
params.append('client_secret', config.clientSecret);
|
|
314
|
+
}
|
|
315
|
+
if (config.audiences && config.audiences.length > 0) {
|
|
316
|
+
params.append('audience', config.audiences.join(' '));
|
|
317
|
+
}
|
|
318
|
+
if (resource) {
|
|
319
|
+
params.append('resource', resource);
|
|
320
|
+
}
|
|
321
|
+
// eslint-disable-next-line no-restricted-syntax -- TODO: Migrate to safeFetch for SSRF protection
|
|
322
|
+
const response = await fetch(config.tokenUrl, {
|
|
323
|
+
method: 'POST',
|
|
324
|
+
headers: {
|
|
325
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
326
|
+
Accept: 'application/json, application/x-www-form-urlencoded',
|
|
327
|
+
},
|
|
328
|
+
body: params.toString(),
|
|
329
|
+
});
|
|
330
|
+
return parseTokenEndpointResponse(response, 'Token exchange', 'no_access_token');
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Refresh an access token using a refresh token.
|
|
334
|
+
*
|
|
335
|
+
* @param config OAuth configuration subset needed for refresh
|
|
336
|
+
* @param refreshToken The refresh token
|
|
337
|
+
* @param tokenUrl The token endpoint URL
|
|
338
|
+
* @param resource Optional resource parameter value (RFC 8707)
|
|
339
|
+
* @returns The new token response
|
|
340
|
+
*/
|
|
341
|
+
export async function refreshAccessToken(config, refreshToken, tokenUrl, resource) {
|
|
342
|
+
const params = new URLSearchParams({
|
|
343
|
+
grant_type: 'refresh_token',
|
|
344
|
+
refresh_token: refreshToken,
|
|
345
|
+
client_id: config.clientId,
|
|
346
|
+
});
|
|
347
|
+
if (config.clientSecret) {
|
|
348
|
+
params.append('client_secret', config.clientSecret);
|
|
349
|
+
}
|
|
350
|
+
if (config.scopes && config.scopes.length > 0) {
|
|
351
|
+
params.append('scope', config.scopes.join(' '));
|
|
352
|
+
}
|
|
353
|
+
if (config.audiences && config.audiences.length > 0) {
|
|
354
|
+
params.append('audience', config.audiences.join(' '));
|
|
355
|
+
}
|
|
356
|
+
if (resource) {
|
|
357
|
+
params.append('resource', resource);
|
|
358
|
+
}
|
|
359
|
+
// eslint-disable-next-line no-restricted-syntax -- TODO: Migrate to safeFetch for SSRF protection
|
|
360
|
+
const response = await fetch(tokenUrl, {
|
|
361
|
+
method: 'POST',
|
|
362
|
+
headers: {
|
|
363
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
364
|
+
Accept: 'application/json, application/x-www-form-urlencoded',
|
|
365
|
+
},
|
|
366
|
+
body: params.toString(),
|
|
367
|
+
});
|
|
368
|
+
return parseTokenEndpointResponse(response, 'Token refresh', 'unknown_error');
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=oauth-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-flow.js","sourceRoot":"","sources":["../../../src/utils/oauth-flow.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAoD/C,qDAAqD;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAE/C,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,6CAA6C;IAC7C,2EAA2E;IAC3E,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAElE,uCAAuC;IACvC,MAAM,aAAa,GAAG,MAAM;SACzB,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,YAAY,CAAC;SACpB,MAAM,CAAC,WAAW,CAAC,CAAC;IAEvB,qCAAqC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE3D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,aAAqB,EACrB,IAAa;IAKb,IAAI,WAAmC,CAAC;IACxC,IAAI,UAAkC,CAAC;IACvC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1D,WAAW,GAAG,OAAO,CAAC;QACtB,UAAU,GAAG,MAAM,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,IAAI,OAAO,CACjC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClB,IAAI,UAAkB,CAAC;QAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAC9B,KAAK,EAAE,GAAyB,EAAE,GAAwB,EAAE,EAAE;YAC5D,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAI,EAAE,oBAAoB,UAAU,EAAE,CAAC,CAAC;gBAEhE,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;oBACnC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBAED,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAE5C,IAAI,KAAK,EAAE,CAAC;oBACV,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACxD,GAAG,CAAC,GAAG,CAAC;;;;8BAIQ,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;uBACxD,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;;;;aAIvG,CAAC,CAAC;oBACD,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAAC;oBAC3C,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACpB,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;oBAC3C,OAAO;gBACT,CAAC;gBAED,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;oBAC5B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;oBACnC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;oBAC3D,OAAO;gBACT,CAAC;gBAED,mCAAmC;gBACnC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;gBACxD,GAAG,CAAC,GAAG,CAAC;;;;;;;;WAQT,CAAC,CAAC;gBAED,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,kEAAkE;QAClE,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,8BAA8B;QAElD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,GAAG,KAAK,EAAE,CAAC;gBACtD,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,2CAA2C,OAAO,GAAG,CACtD,CAAC;gBACF,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,UAAU,GAAG,OAAO,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE;YAC7B,uEAAuE;YACvE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAqB,CAAC;YACpD,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YAC1B,WAAW,CAAC,GAAG,CACb,2CAA2C,UAAU,EAAE,CACxD,CAAC;YACF,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,mCAAmC;QAC9D,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,UAAU,CACR,GAAG,EAAE;YACH,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAC9C,CAAC,EACD,CAAC,GAAG,EAAE,GAAG,IAAI,CACd,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;AAC1D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,SAAkB;IAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/B,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;gBAChE,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAuB,EACvB,UAAsB,EACtB,YAAoB,EACpB,QAAiB;IAEjB,MAAM,WAAW,GACf,MAAM,CAAC,WAAW,IAAI,oBAAoB,YAAY,GAAG,aAAa,EAAE,CAAC;IAE3E,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,SAAS,EAAE,MAAM,CAAC,QAAQ;QAC1B,aAAa,EAAE,MAAM;QACrB,YAAY,EAAE,WAAW;QACzB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,cAAc,EAAE,UAAU,CAAC,aAAa;QACxC,qBAAqB,EAAE,MAAM;KAC9B,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC7C,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5B,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,0BAA0B,CACvC,QAAkB,EAClB,aAAqB,EACrB,gBAAwB;IAExB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAE/D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,mDAAmD;QACnD,IAAI,YAAY,GAAkB,IAAI,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YAC9D,IAAI,KAAK,EAAE,CAAC;gBACV,YAAY,GAAG,GAAG,aAAa,YAAY,KAAK,MAAM,gBAAgB,IAAI,gBAAgB,EAAE,CAAC;YAC/F,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QACD,MAAM,IAAI,KAAK,CACb,YAAY;YACV,GAAG,aAAa,YAAY,QAAQ,CAAC,MAAM,MAAM,YAAY,EAAE,CAClE,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,IACE,CAAC,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACzC,CAAC,WAAW,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAC1D,CAAC;QACD,WAAW,CAAC,IAAI,CACd,GAAG,aAAa,+CAA+C,WAAW,IAAI;YAC5E,kEAAkE;YAClE,iCAAiC,CACpC,CAAC;IACJ,CAAC;IAED,2DAA2D;IAC3D,IAAI,CAAC;QACH,MAAM,IAAI,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC/C,IACE,IAAI;YACJ,OAAO,IAAI,KAAK,QAAQ;YACxB,cAAc,IAAI,IAAI;YACtB,gDAAgD;YAChD,OAAQ,IAAgC,CAAC,cAAc,CAAC,KAAK,QAAQ,EACrE,CAAC;YACD,MAAM,GAAG,GAAG,IAA+B,CAAC;YAC5C,MAAM,MAAM,GAAuB;gBACjC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACzC,UAAU;gBACR,gDAAgD;gBAChD,OAAO,GAAG,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ;gBACtE,UAAU;gBACR,gDAAgD;gBAChD,OAAO,GAAG,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;gBACvE,aAAa;gBACX,gDAAgD;gBAChD,OAAO,GAAG,CAAC,eAAe,CAAC,KAAK,QAAQ;oBACtC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC;oBACtB,CAAC,CAAC,SAAS;gBACf,gDAAgD;gBAChD,KAAK,EAAE,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;aACnE,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,oEAAoE;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;IAED,iCAAiC;IACjC,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC;IAC5D,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAEvC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,8BAA8B;QAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,IAAI,KAAK,CACb,GAAG,aAAa,YAAY,KAAK,IAAI,gBAAgB,MAAM,gBAAgB,IAAI,YAAY,EAAE,CAC9F,CAAC;IACJ,CAAC;IAED,OAAO;QACL,YAAY,EAAE,WAAW;QACzB,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3D,aAAa,EAAE,YAAY,IAAI,SAAS;QACxC,KAAK,EAAE,KAAK,IAAI,SAAS;KACJ,CAAC;AAC1B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAuB,EACvB,IAAY,EACZ,YAAoB,EACpB,YAAoB,EACpB,QAAiB;IAEjB,MAAM,WAAW,GACf,MAAM,CAAC,WAAW,IAAI,oBAAoB,YAAY,GAAG,aAAa,EAAE,CAAC;IAE3E,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,UAAU,EAAE,oBAAoB;QAChC,IAAI;QACJ,YAAY,EAAE,WAAW;QACzB,aAAa,EAAE,YAAY;QAC3B,SAAS,EAAE,MAAM,CAAC,QAAQ;KAC3B,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,kGAAkG;IAClG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE;QAC5C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,mCAAmC;YACnD,MAAM,EAAE,qDAAqD;SAC9D;QACD,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;KACxB,CAAC,CAAC;IAEH,OAAO,0BAA0B,CAC/B,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,CAClB,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAA0B,EAC1B,YAAoB,EACpB,QAAgB,EAChB,QAAiB;IAEjB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,UAAU,EAAE,eAAe;QAC3B,aAAa,EAAE,YAAY;QAC3B,SAAS,EAAE,MAAM,CAAC,QAAQ;KAC3B,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,kGAAkG;IAClG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;QACrC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,mCAAmC;YACnD,MAAM,EAAE,qDAAqD;SAC9D;QACD,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;KACxB,CAAC,CAAC;IAEH,OAAO,0BAA0B,CAAC,QAAQ,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;AAChF,CAAC"}
|