indusagi 0.1.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/README.md +27 -0
- package/dist/agent/agent-loop.d.ts +21 -0
- package/dist/agent/agent-loop.d.ts.map +1 -0
- package/dist/agent/agent-loop.js +307 -0
- package/dist/agent/agent.d.ts +122 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +347 -0
- package/dist/agent/index.d.ts +5 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +8 -0
- package/dist/agent/proxy.d.ts +85 -0
- package/dist/agent/proxy.d.ts.map +1 -0
- package/dist/agent/proxy.js +267 -0
- package/dist/agent/types.d.ts +178 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +1 -0
- package/dist/agent.d.ts +2 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +1 -0
- package/dist/ai/api-registry.d.ts +20 -0
- package/dist/ai/api-registry.d.ts.map +1 -0
- package/dist/ai/api-registry.js +43 -0
- package/dist/ai/cli.d.ts +3 -0
- package/dist/ai/cli.d.ts.map +1 -0
- package/dist/ai/cli.js +115 -0
- package/dist/ai/env-api-keys.d.ts +9 -0
- package/dist/ai/env-api-keys.d.ts.map +1 -0
- package/dist/ai/env-api-keys.js +90 -0
- package/dist/ai/index.d.ts +20 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +19 -0
- package/dist/ai/models.d.ts +21 -0
- package/dist/ai/models.d.ts.map +1 -0
- package/dist/ai/models.generated.d.ts +11500 -0
- package/dist/ai/models.generated.d.ts.map +1 -0
- package/dist/ai/models.generated.js +11350 -0
- package/dist/ai/models.js +47 -0
- package/dist/ai/providers/amazon-bedrock.d.ts +15 -0
- package/dist/ai/providers/amazon-bedrock.d.ts.map +1 -0
- package/dist/ai/providers/amazon-bedrock.js +510 -0
- package/dist/ai/providers/anthropic.d.ts +13 -0
- package/dist/ai/providers/anthropic.d.ts.map +1 -0
- package/dist/ai/providers/anthropic.js +584 -0
- package/dist/ai/providers/azure-openai-responses.d.ts +15 -0
- package/dist/ai/providers/azure-openai-responses.d.ts.map +1 -0
- package/dist/ai/providers/azure-openai-responses.js +183 -0
- package/dist/ai/providers/google-gemini-cli.d.ts +74 -0
- package/dist/ai/providers/google-gemini-cli.d.ts.map +1 -0
- package/dist/ai/providers/google-gemini-cli.js +807 -0
- package/dist/ai/providers/google-shared.d.ts +64 -0
- package/dist/ai/providers/google-shared.d.ts.map +1 -0
- package/dist/ai/providers/google-shared.js +300 -0
- package/dist/ai/providers/google-vertex.d.ts +15 -0
- package/dist/ai/providers/google-vertex.d.ts.map +1 -0
- package/dist/ai/providers/google-vertex.js +370 -0
- package/dist/ai/providers/google.d.ts +13 -0
- package/dist/ai/providers/google.d.ts.map +1 -0
- package/dist/ai/providers/google.js +351 -0
- package/dist/ai/providers/openai-codex-responses.d.ts +9 -0
- package/dist/ai/providers/openai-codex-responses.d.ts.map +1 -0
- package/dist/ai/providers/openai-codex-responses.js +341 -0
- package/dist/ai/providers/openai-completions.d.ts +15 -0
- package/dist/ai/providers/openai-completions.d.ts.map +1 -0
- package/dist/ai/providers/openai-completions.js +701 -0
- package/dist/ai/providers/openai-responses-shared.d.ts +17 -0
- package/dist/ai/providers/openai-responses-shared.d.ts.map +1 -0
- package/dist/ai/providers/openai-responses-shared.js +423 -0
- package/dist/ai/providers/openai-responses.d.ts +13 -0
- package/dist/ai/providers/openai-responses.d.ts.map +1 -0
- package/dist/ai/providers/openai-responses.js +182 -0
- package/dist/ai/providers/register-builtins.d.ts +3 -0
- package/dist/ai/providers/register-builtins.d.ts.map +1 -0
- package/dist/ai/providers/register-builtins.js +62 -0
- package/dist/ai/providers/simple-options.d.ts +8 -0
- package/dist/ai/providers/simple-options.d.ts.map +1 -0
- package/dist/ai/providers/simple-options.js +31 -0
- package/dist/ai/providers/transform-messages.d.ts +8 -0
- package/dist/ai/providers/transform-messages.d.ts.map +1 -0
- package/dist/ai/providers/transform-messages.js +149 -0
- package/dist/ai/stream.d.ts +8 -0
- package/dist/ai/stream.d.ts.map +1 -0
- package/dist/ai/stream.js +34 -0
- package/dist/ai/types.d.ts +234 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +1 -0
- package/dist/ai/utils/event-stream.d.ts +21 -0
- package/dist/ai/utils/event-stream.d.ts.map +1 -0
- package/dist/ai/utils/event-stream.js +76 -0
- package/dist/ai/utils/json-parse.d.ts +9 -0
- package/dist/ai/utils/json-parse.d.ts.map +1 -0
- package/dist/ai/utils/json-parse.js +28 -0
- package/dist/ai/utils/oauth/anthropic.d.ts +17 -0
- package/dist/ai/utils/oauth/anthropic.d.ts.map +1 -0
- package/dist/ai/utils/oauth/anthropic.js +103 -0
- package/dist/ai/utils/oauth/github-copilot.d.ts +30 -0
- package/dist/ai/utils/oauth/github-copilot.d.ts.map +1 -0
- package/dist/ai/utils/oauth/github-copilot.js +280 -0
- package/dist/ai/utils/oauth/google-antigravity.d.ts +26 -0
- package/dist/ai/utils/oauth/google-antigravity.d.ts.map +1 -0
- package/dist/ai/utils/oauth/google-antigravity.js +355 -0
- package/dist/ai/utils/oauth/google-gemini-cli.d.ts +26 -0
- package/dist/ai/utils/oauth/google-gemini-cli.d.ts.map +1 -0
- package/dist/ai/utils/oauth/google-gemini-cli.js +461 -0
- package/dist/ai/utils/oauth/index.d.ts +50 -0
- package/dist/ai/utils/oauth/index.d.ts.map +1 -0
- package/dist/ai/utils/oauth/index.js +106 -0
- package/dist/ai/utils/oauth/openai-codex.d.ts +34 -0
- package/dist/ai/utils/oauth/openai-codex.d.ts.map +1 -0
- package/dist/ai/utils/oauth/openai-codex.js +379 -0
- package/dist/ai/utils/oauth/pkce.d.ts +13 -0
- package/dist/ai/utils/oauth/pkce.d.ts.map +1 -0
- package/dist/ai/utils/oauth/pkce.js +30 -0
- package/dist/ai/utils/oauth/types.d.ts +47 -0
- package/dist/ai/utils/oauth/types.d.ts.map +1 -0
- package/dist/ai/utils/oauth/types.js +1 -0
- package/dist/ai/utils/overflow.d.ts +51 -0
- package/dist/ai/utils/overflow.d.ts.map +1 -0
- package/dist/ai/utils/overflow.js +111 -0
- package/dist/ai/utils/sanitize-unicode.d.ts +22 -0
- package/dist/ai/utils/sanitize-unicode.d.ts.map +1 -0
- package/dist/ai/utils/sanitize-unicode.js +25 -0
- package/dist/ai/utils/typebox-helpers.d.ts +17 -0
- package/dist/ai/utils/typebox-helpers.d.ts.map +1 -0
- package/dist/ai/utils/typebox-helpers.js +20 -0
- package/dist/ai/utils/validation.d.ts +18 -0
- package/dist/ai/utils/validation.d.ts.map +1 -0
- package/dist/ai/utils/validation.js +71 -0
- package/dist/ai.d.ts +2 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/tui/autocomplete.d.ts +47 -0
- package/dist/tui/autocomplete.d.ts.map +1 -0
- package/dist/tui/autocomplete.js +474 -0
- package/dist/tui/components/box.d.ts +24 -0
- package/dist/tui/components/box.d.ts.map +1 -0
- package/dist/tui/components/box.js +100 -0
- package/dist/tui/components/cancellable-loader.d.ts +22 -0
- package/dist/tui/components/cancellable-loader.d.ts.map +1 -0
- package/dist/tui/components/cancellable-loader.js +35 -0
- package/dist/tui/components/editor.d.ts +171 -0
- package/dist/tui/components/editor.d.ts.map +1 -0
- package/dist/tui/components/editor.js +1540 -0
- package/dist/tui/components/image.d.ts +28 -0
- package/dist/tui/components/image.d.ts.map +1 -0
- package/dist/tui/components/image.js +60 -0
- package/dist/tui/components/input.d.ts +25 -0
- package/dist/tui/components/input.d.ts.map +1 -0
- package/dist/tui/components/input.js +297 -0
- package/dist/tui/components/loader.d.ts +21 -0
- package/dist/tui/components/loader.d.ts.map +1 -0
- package/dist/tui/components/loader.js +45 -0
- package/dist/tui/components/markdown.d.ts +89 -0
- package/dist/tui/components/markdown.d.ts.map +1 -0
- package/dist/tui/components/markdown.js +525 -0
- package/dist/tui/components/select-list.d.ts +32 -0
- package/dist/tui/components/select-list.d.ts.map +1 -0
- package/dist/tui/components/select-list.js +147 -0
- package/dist/tui/components/settings-list.d.ts +50 -0
- package/dist/tui/components/settings-list.d.ts.map +1 -0
- package/dist/tui/components/settings-list.js +176 -0
- package/dist/tui/components/spacer.d.ts +12 -0
- package/dist/tui/components/spacer.d.ts.map +1 -0
- package/dist/tui/components/spacer.js +21 -0
- package/dist/tui/components/text.d.ts +19 -0
- package/dist/tui/components/text.d.ts.map +1 -0
- package/dist/tui/components/text.js +80 -0
- package/dist/tui/components/truncated-text.d.ts +13 -0
- package/dist/tui/components/truncated-text.d.ts.map +1 -0
- package/dist/tui/components/truncated-text.js +47 -0
- package/dist/tui/editor-component.d.ts +35 -0
- package/dist/tui/editor-component.d.ts.map +1 -0
- package/dist/tui/editor-component.js +1 -0
- package/dist/tui/fuzzy.d.ts +16 -0
- package/dist/tui/fuzzy.d.ts.map +1 -0
- package/dist/tui/fuzzy.js +106 -0
- package/dist/tui/index.d.ts +23 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +31 -0
- package/dist/tui/keybindings.d.ts +39 -0
- package/dist/tui/keybindings.d.ts.map +1 -0
- package/dist/tui/keybindings.js +110 -0
- package/dist/tui/keys.d.ts +160 -0
- package/dist/tui/keys.d.ts.map +1 -0
- package/dist/tui/keys.js +939 -0
- package/dist/tui/stdin-buffer.d.ts +48 -0
- package/dist/tui/stdin-buffer.d.ts.map +1 -0
- package/dist/tui/stdin-buffer.js +315 -0
- package/dist/tui/terminal-image.d.ts +67 -0
- package/dist/tui/terminal-image.d.ts.map +1 -0
- package/dist/tui/terminal-image.js +277 -0
- package/dist/tui/terminal.d.ts +63 -0
- package/dist/tui/terminal.d.ts.map +1 -0
- package/dist/tui/terminal.js +174 -0
- package/dist/tui/tui.d.ts +191 -0
- package/dist/tui/tui.d.ts.map +1 -0
- package/dist/tui/tui.js +881 -0
- package/dist/tui/utils.d.ts +78 -0
- package/dist/tui/utils.d.ts.map +1 -0
- package/dist/tui/utils.js +801 -0
- package/dist/tui.d.ts +2 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +1 -0
- package/dist/webui/ChatPanel.d.ts +28 -0
- package/dist/webui/ChatPanel.d.ts.map +1 -0
- package/dist/webui/ChatPanel.js +192 -0
- package/dist/webui/components/AgentInterface.d.ts +39 -0
- package/dist/webui/components/AgentInterface.d.ts.map +1 -0
- package/dist/webui/components/AgentInterface.js +370 -0
- package/dist/webui/components/AttachmentTile.d.ts +12 -0
- package/dist/webui/components/AttachmentTile.d.ts.map +1 -0
- package/dist/webui/components/AttachmentTile.js +110 -0
- package/dist/webui/components/ConsoleBlock.d.ts +12 -0
- package/dist/webui/components/ConsoleBlock.d.ts.map +1 -0
- package/dist/webui/components/ConsoleBlock.js +83 -0
- package/dist/webui/components/CustomProviderCard.d.ts +17 -0
- package/dist/webui/components/CustomProviderCard.d.ts.map +1 -0
- package/dist/webui/components/CustomProviderCard.js +109 -0
- package/dist/webui/components/ExpandableSection.d.ts +15 -0
- package/dist/webui/components/ExpandableSection.d.ts.map +1 -0
- package/dist/webui/components/ExpandableSection.js +62 -0
- package/dist/webui/components/Input.d.ts +26 -0
- package/dist/webui/components/Input.d.ts.map +1 -0
- package/dist/webui/components/Input.js +56 -0
- package/dist/webui/components/MessageEditor.d.ts +44 -0
- package/dist/webui/components/MessageEditor.d.ts.map +1 -0
- package/dist/webui/components/MessageEditor.js +413 -0
- package/dist/webui/components/MessageList.d.ts +14 -0
- package/dist/webui/components/MessageList.d.ts.map +1 -0
- package/dist/webui/components/MessageList.js +103 -0
- package/dist/webui/components/Messages.d.ts +94 -0
- package/dist/webui/components/Messages.d.ts.map +1 -0
- package/dist/webui/components/Messages.js +351 -0
- package/dist/webui/components/ProviderKeyInput.d.ts +16 -0
- package/dist/webui/components/ProviderKeyInput.d.ts.map +1 -0
- package/dist/webui/components/ProviderKeyInput.js +170 -0
- package/dist/webui/components/SandboxedIframe.d.ts +85 -0
- package/dist/webui/components/SandboxedIframe.d.ts.map +1 -0
- package/dist/webui/components/SandboxedIframe.js +510 -0
- package/dist/webui/components/StreamingMessageContainer.d.ts +19 -0
- package/dist/webui/components/StreamingMessageContainer.d.ts.map +1 -0
- package/dist/webui/components/StreamingMessageContainer.js +116 -0
- package/dist/webui/components/ThinkingBlock.d.ts +11 -0
- package/dist/webui/components/ThinkingBlock.d.ts.map +1 -0
- package/dist/webui/components/ThinkingBlock.js +57 -0
- package/dist/webui/components/message-renderer-registry.d.ts +12 -0
- package/dist/webui/components/message-renderer-registry.d.ts.map +1 -0
- package/dist/webui/components/message-renderer-registry.js +11 -0
- package/dist/webui/components/sandbox/ArtifactsRuntimeProvider.d.ts +35 -0
- package/dist/webui/components/sandbox/ArtifactsRuntimeProvider.d.ts.map +1 -0
- package/dist/webui/components/sandbox/ArtifactsRuntimeProvider.js +188 -0
- package/dist/webui/components/sandbox/AttachmentsRuntimeProvider.d.ts +17 -0
- package/dist/webui/components/sandbox/AttachmentsRuntimeProvider.d.ts.map +1 -0
- package/dist/webui/components/sandbox/AttachmentsRuntimeProvider.js +63 -0
- package/dist/webui/components/sandbox/ConsoleRuntimeProvider.d.ts +42 -0
- package/dist/webui/components/sandbox/ConsoleRuntimeProvider.d.ts.map +1 -0
- package/dist/webui/components/sandbox/ConsoleRuntimeProvider.js +160 -0
- package/dist/webui/components/sandbox/FileDownloadRuntimeProvider.d.ts +30 -0
- package/dist/webui/components/sandbox/FileDownloadRuntimeProvider.d.ts.map +1 -0
- package/dist/webui/components/sandbox/FileDownloadRuntimeProvider.js +96 -0
- package/dist/webui/components/sandbox/RuntimeMessageBridge.d.ts +19 -0
- package/dist/webui/components/sandbox/RuntimeMessageBridge.d.ts.map +1 -0
- package/dist/webui/components/sandbox/RuntimeMessageBridge.js +73 -0
- package/dist/webui/components/sandbox/RuntimeMessageRouter.d.ts +65 -0
- package/dist/webui/components/sandbox/RuntimeMessageRouter.d.ts.map +1 -0
- package/dist/webui/components/sandbox/RuntimeMessageRouter.js +167 -0
- package/dist/webui/components/sandbox/SandboxRuntimeProvider.d.ts +48 -0
- package/dist/webui/components/sandbox/SandboxRuntimeProvider.d.ts.map +1 -0
- package/dist/webui/components/sandbox/SandboxRuntimeProvider.js +1 -0
- package/dist/webui/dialogs/ApiKeyPromptDialog.d.ts +15 -0
- package/dist/webui/dialogs/ApiKeyPromptDialog.d.ts.map +1 -0
- package/dist/webui/dialogs/ApiKeyPromptDialog.js +78 -0
- package/dist/webui/dialogs/AttachmentOverlay.d.ts +32 -0
- package/dist/webui/dialogs/AttachmentOverlay.d.ts.map +1 -0
- package/dist/webui/dialogs/AttachmentOverlay.js +575 -0
- package/dist/webui/dialogs/CustomProviderDialog.d.ts +25 -0
- package/dist/webui/dialogs/CustomProviderDialog.d.ts.map +1 -0
- package/dist/webui/dialogs/CustomProviderDialog.js +269 -0
- package/dist/webui/dialogs/ModelSelector.d.ts +27 -0
- package/dist/webui/dialogs/ModelSelector.d.ts.map +1 -0
- package/dist/webui/dialogs/ModelSelector.js +319 -0
- package/dist/webui/dialogs/PersistentStorageDialog.d.ts +17 -0
- package/dist/webui/dialogs/PersistentStorageDialog.d.ts.map +1 -0
- package/dist/webui/dialogs/PersistentStorageDialog.js +146 -0
- package/dist/webui/dialogs/ProvidersModelsTab.d.ts +20 -0
- package/dist/webui/dialogs/ProvidersModelsTab.d.ts.map +1 -0
- package/dist/webui/dialogs/ProvidersModelsTab.js +190 -0
- package/dist/webui/dialogs/SessionListDialog.d.ts +19 -0
- package/dist/webui/dialogs/SessionListDialog.d.ts.map +1 -0
- package/dist/webui/dialogs/SessionListDialog.js +153 -0
- package/dist/webui/dialogs/SettingsDialog.d.ts +30 -0
- package/dist/webui/dialogs/SettingsDialog.d.ts.map +1 -0
- package/dist/webui/dialogs/SettingsDialog.js +228 -0
- package/dist/webui/index.d.ts +65 -0
- package/dist/webui/index.d.ts.map +1 -0
- package/dist/webui/index.js +67 -0
- package/dist/webui/prompts/prompts.d.ts +11 -0
- package/dist/webui/prompts/prompts.d.ts.map +1 -0
- package/dist/webui/prompts/prompts.js +271 -0
- package/dist/webui/storage/app-storage.d.ts +33 -0
- package/dist/webui/storage/app-storage.d.ts.map +1 -0
- package/dist/webui/storage/app-storage.js +37 -0
- package/dist/webui/storage/backends/indexeddb-storage-backend.d.ts +27 -0
- package/dist/webui/storage/backends/indexeddb-storage-backend.d.ts.map +1 -0
- package/dist/webui/storage/backends/indexeddb-storage-backend.js +165 -0
- package/dist/webui/storage/store.d.ts +23 -0
- package/dist/webui/storage/store.d.ts.map +1 -0
- package/dist/webui/storage/store.js +25 -0
- package/dist/webui/storage/stores/custom-providers-store.d.ts +25 -0
- package/dist/webui/storage/stores/custom-providers-store.d.ts.map +1 -0
- package/dist/webui/storage/stores/custom-providers-store.js +34 -0
- package/dist/webui/storage/stores/provider-keys-store.d.ts +14 -0
- package/dist/webui/storage/stores/provider-keys-store.d.ts.map +1 -0
- package/dist/webui/storage/stores/provider-keys-store.js +26 -0
- package/dist/webui/storage/stores/sessions-store.d.ts +32 -0
- package/dist/webui/storage/stores/sessions-store.d.ts.map +1 -0
- package/dist/webui/storage/stores/sessions-store.js +112 -0
- package/dist/webui/storage/stores/settings-store.d.ts +14 -0
- package/dist/webui/storage/stores/settings-store.d.ts.map +1 -0
- package/dist/webui/storage/stores/settings-store.js +27 -0
- package/dist/webui/storage/types.d.ts +176 -0
- package/dist/webui/storage/types.d.ts.map +1 -0
- package/dist/webui/storage/types.js +1 -0
- package/dist/webui/tools/artifacts/ArtifactElement.d.ts +9 -0
- package/dist/webui/tools/artifacts/ArtifactElement.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/ArtifactElement.js +10 -0
- package/dist/webui/tools/artifacts/ArtifactPill.d.ts +4 -0
- package/dist/webui/tools/artifacts/ArtifactPill.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/ArtifactPill.js +22 -0
- package/dist/webui/tools/artifacts/Console.d.ts +18 -0
- package/dist/webui/tools/artifacts/Console.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/Console.js +94 -0
- package/dist/webui/tools/artifacts/DocxArtifact.d.ts +22 -0
- package/dist/webui/tools/artifacts/DocxArtifact.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/DocxArtifact.js +207 -0
- package/dist/webui/tools/artifacts/ExcelArtifact.d.ts +24 -0
- package/dist/webui/tools/artifacts/ExcelArtifact.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/ExcelArtifact.js +215 -0
- package/dist/webui/tools/artifacts/GenericArtifact.d.ts +19 -0
- package/dist/webui/tools/artifacts/GenericArtifact.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/GenericArtifact.js +116 -0
- package/dist/webui/tools/artifacts/HtmlArtifact.d.ts +27 -0
- package/dist/webui/tools/artifacts/HtmlArtifact.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/HtmlArtifact.js +188 -0
- package/dist/webui/tools/artifacts/ImageArtifact.d.ts +20 -0
- package/dist/webui/tools/artifacts/ImageArtifact.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/ImageArtifact.js +119 -0
- package/dist/webui/tools/artifacts/MarkdownArtifact.d.ts +19 -0
- package/dist/webui/tools/artifacts/MarkdownArtifact.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/MarkdownArtifact.js +81 -0
- package/dist/webui/tools/artifacts/PdfArtifact.d.ts +25 -0
- package/dist/webui/tools/artifacts/PdfArtifact.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/PdfArtifact.js +183 -0
- package/dist/webui/tools/artifacts/SvgArtifact.d.ts +18 -0
- package/dist/webui/tools/artifacts/SvgArtifact.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/SvgArtifact.js +77 -0
- package/dist/webui/tools/artifacts/TextArtifact.d.ts +19 -0
- package/dist/webui/tools/artifacts/TextArtifact.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/TextArtifact.js +143 -0
- package/dist/webui/tools/artifacts/artifacts-tool-renderer.d.ts +11 -0
- package/dist/webui/tools/artifacts/artifacts-tool-renderer.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/artifacts-tool-renderer.js +271 -0
- package/dist/webui/tools/artifacts/artifacts.d.ts +63 -0
- package/dist/webui/tools/artifacts/artifacts.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/artifacts.js +658 -0
- package/dist/webui/tools/artifacts/index.d.ts +8 -0
- package/dist/webui/tools/artifacts/index.d.ts.map +1 -0
- package/dist/webui/tools/artifacts/index.js +7 -0
- package/dist/webui/tools/extract-document.d.ts +24 -0
- package/dist/webui/tools/extract-document.d.ts.map +1 -0
- package/dist/webui/tools/extract-document.js +215 -0
- package/dist/webui/tools/index.d.ts +16 -0
- package/dist/webui/tools/index.d.ts.map +1 -0
- package/dist/webui/tools/index.js +32 -0
- package/dist/webui/tools/javascript-repl.d.ts +44 -0
- package/dist/webui/tools/javascript-repl.d.ts.map +1 -0
- package/dist/webui/tools/javascript-repl.js +223 -0
- package/dist/webui/tools/renderer-registry.d.ts +23 -0
- package/dist/webui/tools/renderer-registry.d.ts.map +1 -0
- package/dist/webui/tools/renderer-registry.js +106 -0
- package/dist/webui/tools/renderers/BashRenderer.d.ts +10 -0
- package/dist/webui/tools/renderers/BashRenderer.d.ts.map +1 -0
- package/dist/webui/tools/renderers/BashRenderer.js +41 -0
- package/dist/webui/tools/renderers/CalculateRenderer.d.ts +10 -0
- package/dist/webui/tools/renderers/CalculateRenderer.d.ts.map +1 -0
- package/dist/webui/tools/renderers/CalculateRenderer.js +44 -0
- package/dist/webui/tools/renderers/DefaultRenderer.d.ts +6 -0
- package/dist/webui/tools/renderers/DefaultRenderer.d.ts.map +1 -0
- package/dist/webui/tools/renderers/DefaultRenderer.js +93 -0
- package/dist/webui/tools/renderers/GetCurrentTimeRenderer.d.ts +10 -0
- package/dist/webui/tools/renderers/GetCurrentTimeRenderer.d.ts.map +1 -0
- package/dist/webui/tools/renderers/GetCurrentTimeRenderer.js +71 -0
- package/dist/webui/tools/types.d.ts +10 -0
- package/dist/webui/tools/types.d.ts.map +1 -0
- package/dist/webui/tools/types.js +1 -0
- package/dist/webui/utils/attachment-utils.d.ts +19 -0
- package/dist/webui/utils/attachment-utils.d.ts.map +1 -0
- package/dist/webui/utils/attachment-utils.js +414 -0
- package/dist/webui/utils/auth-token.d.ts +3 -0
- package/dist/webui/utils/auth-token.d.ts.map +1 -0
- package/dist/webui/utils/auth-token.js +18 -0
- package/dist/webui/utils/format.d.ts +6 -0
- package/dist/webui/utils/format.d.ts.map +1 -0
- package/dist/webui/utils/format.js +46 -0
- package/dist/webui/utils/i18n.d.ts +636 -0
- package/dist/webui/utils/i18n.d.ts.map +1 -0
- package/dist/webui/utils/i18n.js +417 -0
- package/dist/webui/utils/model-discovery.d.ts +38 -0
- package/dist/webui/utils/model-discovery.d.ts.map +1 -0
- package/dist/webui/utils/model-discovery.js +242 -0
- package/dist/webui/utils/proxy-utils.d.ts +45 -0
- package/dist/webui/utils/proxy-utils.d.ts.map +1 -0
- package/dist/webui/utils/proxy-utils.js +115 -0
- package/dist/webui/utils/test-sessions.d.ts +359 -0
- package/dist/webui/utils/test-sessions.d.ts.map +1 -0
- package/dist/webui/utils/test-sessions.js +2324 -0
- package/dist/webui.d.ts +2 -0
- package/dist/webui.d.ts.map +1 -0
- package/dist/webui.js +1 -0
- package/package.json +105 -0
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini CLI OAuth flow (Google Cloud Code Assist)
|
|
3
|
+
* Standard Gemini models only (gemini-2.0-flash, gemini-2.5-*)
|
|
4
|
+
*
|
|
5
|
+
* NOTE: This module uses Node.js http.createServer for the OAuth callback.
|
|
6
|
+
* It is only intended for CLI use, not browser environments.
|
|
7
|
+
*/
|
|
8
|
+
import { generatePKCE } from "./pkce.js";
|
|
9
|
+
const decode = (s) => atob(s);
|
|
10
|
+
// NOTE: Provide OAuth credentials via environment variables to avoid committing secrets.
|
|
11
|
+
const CLIENT_ID = process.env.GEMINI_CLI_CLIENT_ID || "";
|
|
12
|
+
const CLIENT_SECRET = process.env.GEMINI_CLI_CLIENT_SECRET || "";
|
|
13
|
+
const REDIRECT_URI = "http://localhost:8085/oauth2callback";
|
|
14
|
+
const SCOPES = [
|
|
15
|
+
"https://www.googleapis.com/auth/cloud-platform",
|
|
16
|
+
"https://www.googleapis.com/auth/userinfo.email",
|
|
17
|
+
"https://www.googleapis.com/auth/userinfo.profile",
|
|
18
|
+
];
|
|
19
|
+
const AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
|
|
20
|
+
const TOKEN_URL = "https://oauth2.googleapis.com/token";
|
|
21
|
+
const CODE_ASSIST_ENDPOINT = "https://cloudcode-pa.googleapis.com";
|
|
22
|
+
/**
|
|
23
|
+
* Start a local HTTP server to receive the OAuth callback
|
|
24
|
+
*/
|
|
25
|
+
async function startCallbackServer() {
|
|
26
|
+
const { createServer } = await import("http");
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
let result = null;
|
|
29
|
+
let cancelled = false;
|
|
30
|
+
const server = createServer((req, res) => {
|
|
31
|
+
const url = new URL(req.url || "", `http://localhost:8085`);
|
|
32
|
+
if (url.pathname === "/oauth2callback") {
|
|
33
|
+
const code = url.searchParams.get("code");
|
|
34
|
+
const state = url.searchParams.get("state");
|
|
35
|
+
const error = url.searchParams.get("error");
|
|
36
|
+
if (error) {
|
|
37
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
38
|
+
res.end(`<html><body><h1>Authentication Failed</h1><p>Error: ${error}</p><p>You can close this window.</p></body></html>`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (code && state) {
|
|
42
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
43
|
+
res.end(`<html><body><h1>Authentication Successful</h1><p>You can close this window and return to the terminal.</p></body></html>`);
|
|
44
|
+
result = { code, state };
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
48
|
+
res.end(`<html><body><h1>Authentication Failed</h1><p>Missing code or state parameter.</p></body></html>`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
res.writeHead(404);
|
|
53
|
+
res.end();
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
server.on("error", (err) => {
|
|
57
|
+
reject(err);
|
|
58
|
+
});
|
|
59
|
+
server.listen(8085, "127.0.0.1", () => {
|
|
60
|
+
resolve({
|
|
61
|
+
server,
|
|
62
|
+
cancelWait: () => {
|
|
63
|
+
cancelled = true;
|
|
64
|
+
},
|
|
65
|
+
waitForCode: async () => {
|
|
66
|
+
const sleep = () => new Promise((r) => setTimeout(r, 100));
|
|
67
|
+
while (!result && !cancelled) {
|
|
68
|
+
await sleep();
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Parse redirect URL to extract code and state
|
|
78
|
+
*/
|
|
79
|
+
function parseRedirectUrl(input) {
|
|
80
|
+
const value = input.trim();
|
|
81
|
+
if (!value)
|
|
82
|
+
return {};
|
|
83
|
+
try {
|
|
84
|
+
const url = new URL(value);
|
|
85
|
+
return {
|
|
86
|
+
code: url.searchParams.get("code") ?? undefined,
|
|
87
|
+
state: url.searchParams.get("state") ?? undefined,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Not a URL, return empty
|
|
92
|
+
return {};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Tier IDs as used by the Cloud Code API
|
|
96
|
+
const TIER_FREE = "free-tier";
|
|
97
|
+
const TIER_LEGACY = "legacy-tier";
|
|
98
|
+
const TIER_STANDARD = "standard-tier";
|
|
99
|
+
/**
|
|
100
|
+
* Wait helper for onboarding retries
|
|
101
|
+
*/
|
|
102
|
+
function wait(ms) {
|
|
103
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get default tier from allowed tiers
|
|
107
|
+
*/
|
|
108
|
+
function getDefaultTier(allowedTiers) {
|
|
109
|
+
if (!allowedTiers || allowedTiers.length === 0)
|
|
110
|
+
return { id: TIER_LEGACY };
|
|
111
|
+
const defaultTier = allowedTiers.find((t) => t.isDefault);
|
|
112
|
+
return defaultTier ?? { id: TIER_LEGACY };
|
|
113
|
+
}
|
|
114
|
+
function isVpcScAffectedUser(payload) {
|
|
115
|
+
if (!payload || typeof payload !== "object")
|
|
116
|
+
return false;
|
|
117
|
+
if (!("error" in payload))
|
|
118
|
+
return false;
|
|
119
|
+
const error = payload.error;
|
|
120
|
+
if (!error?.details || !Array.isArray(error.details))
|
|
121
|
+
return false;
|
|
122
|
+
return error.details.some((detail) => detail.reason === "SECURITY_POLICY_VIOLATED");
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Poll a long-running operation until completion
|
|
126
|
+
*/
|
|
127
|
+
async function pollOperation(operationName, headers, onProgress) {
|
|
128
|
+
let attempt = 0;
|
|
129
|
+
while (true) {
|
|
130
|
+
if (attempt > 0) {
|
|
131
|
+
onProgress?.(`Waiting for project provisioning (attempt ${attempt + 1})...`);
|
|
132
|
+
await wait(5000);
|
|
133
|
+
}
|
|
134
|
+
const response = await fetch(`${CODE_ASSIST_ENDPOINT}/v1internal/${operationName}`, {
|
|
135
|
+
method: "GET",
|
|
136
|
+
headers,
|
|
137
|
+
});
|
|
138
|
+
if (!response.ok) {
|
|
139
|
+
throw new Error(`Failed to poll operation: ${response.status} ${response.statusText}`);
|
|
140
|
+
}
|
|
141
|
+
const data = (await response.json());
|
|
142
|
+
if (data.done) {
|
|
143
|
+
return data;
|
|
144
|
+
}
|
|
145
|
+
attempt += 1;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Discover or provision a Google Cloud project for the user
|
|
150
|
+
*/
|
|
151
|
+
async function discoverProject(accessToken, onProgress) {
|
|
152
|
+
// Check for user-provided project ID via environment variable
|
|
153
|
+
const envProjectId = process.env.GOOGLE_CLOUD_PROJECT || process.env.GOOGLE_CLOUD_PROJECT_ID;
|
|
154
|
+
const headers = {
|
|
155
|
+
Authorization: `Bearer ${accessToken}`,
|
|
156
|
+
"Content-Type": "application/json",
|
|
157
|
+
"User-Agent": "google-api-nodejs-client/9.15.1",
|
|
158
|
+
"X-Goog-Api-Client": "gl-node/22.17.0",
|
|
159
|
+
};
|
|
160
|
+
// Try to load existing project via loadCodeAssist
|
|
161
|
+
onProgress?.("Checking for existing Cloud Code Assist project...");
|
|
162
|
+
const loadResponse = await fetch(`${CODE_ASSIST_ENDPOINT}/v1internal:loadCodeAssist`, {
|
|
163
|
+
method: "POST",
|
|
164
|
+
headers,
|
|
165
|
+
body: JSON.stringify({
|
|
166
|
+
cloudaicompanionProject: envProjectId,
|
|
167
|
+
metadata: {
|
|
168
|
+
ideType: "IDE_UNSPECIFIED",
|
|
169
|
+
platform: "PLATFORM_UNSPECIFIED",
|
|
170
|
+
pluginType: "GEMINI",
|
|
171
|
+
duetProject: envProjectId,
|
|
172
|
+
},
|
|
173
|
+
}),
|
|
174
|
+
});
|
|
175
|
+
let data;
|
|
176
|
+
if (!loadResponse.ok) {
|
|
177
|
+
let errorPayload;
|
|
178
|
+
try {
|
|
179
|
+
errorPayload = await loadResponse.clone().json();
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
errorPayload = undefined;
|
|
183
|
+
}
|
|
184
|
+
if (isVpcScAffectedUser(errorPayload)) {
|
|
185
|
+
data = { currentTier: { id: TIER_STANDARD } };
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
const errorText = await loadResponse.text();
|
|
189
|
+
throw new Error(`loadCodeAssist failed: ${loadResponse.status} ${loadResponse.statusText}: ${errorText}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
data = (await loadResponse.json());
|
|
194
|
+
}
|
|
195
|
+
// If user already has a current tier and project, use it
|
|
196
|
+
if (data.currentTier) {
|
|
197
|
+
if (data.cloudaicompanionProject) {
|
|
198
|
+
return data.cloudaicompanionProject;
|
|
199
|
+
}
|
|
200
|
+
// User has a tier but no managed project - they need to provide one via env var
|
|
201
|
+
if (envProjectId) {
|
|
202
|
+
return envProjectId;
|
|
203
|
+
}
|
|
204
|
+
throw new Error("This account requires setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. " +
|
|
205
|
+
"See https://goo.gle/gemini-cli-auth-docs#workspace-gca");
|
|
206
|
+
}
|
|
207
|
+
// User needs to be onboarded - get the default tier
|
|
208
|
+
const tier = getDefaultTier(data.allowedTiers);
|
|
209
|
+
const tierId = tier?.id ?? TIER_FREE;
|
|
210
|
+
if (tierId !== TIER_FREE && !envProjectId) {
|
|
211
|
+
throw new Error("This account requires setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. " +
|
|
212
|
+
"See https://goo.gle/gemini-cli-auth-docs#workspace-gca");
|
|
213
|
+
}
|
|
214
|
+
onProgress?.("Provisioning Cloud Code Assist project (this may take a moment)...");
|
|
215
|
+
// Build onboard request - for free tier, don't include project ID (Google provisions one)
|
|
216
|
+
// For other tiers, include the user's project ID if available
|
|
217
|
+
const onboardBody = {
|
|
218
|
+
tierId,
|
|
219
|
+
metadata: {
|
|
220
|
+
ideType: "IDE_UNSPECIFIED",
|
|
221
|
+
platform: "PLATFORM_UNSPECIFIED",
|
|
222
|
+
pluginType: "GEMINI",
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
if (tierId !== TIER_FREE && envProjectId) {
|
|
226
|
+
onboardBody.cloudaicompanionProject = envProjectId;
|
|
227
|
+
onboardBody.metadata.duetProject = envProjectId;
|
|
228
|
+
}
|
|
229
|
+
// Start onboarding - this returns a long-running operation
|
|
230
|
+
const onboardResponse = await fetch(`${CODE_ASSIST_ENDPOINT}/v1internal:onboardUser`, {
|
|
231
|
+
method: "POST",
|
|
232
|
+
headers,
|
|
233
|
+
body: JSON.stringify(onboardBody),
|
|
234
|
+
});
|
|
235
|
+
if (!onboardResponse.ok) {
|
|
236
|
+
const errorText = await onboardResponse.text();
|
|
237
|
+
throw new Error(`onboardUser failed: ${onboardResponse.status} ${onboardResponse.statusText}: ${errorText}`);
|
|
238
|
+
}
|
|
239
|
+
let lroData = (await onboardResponse.json());
|
|
240
|
+
// If the operation isn't done yet, poll until completion
|
|
241
|
+
if (!lroData.done && lroData.name) {
|
|
242
|
+
lroData = await pollOperation(lroData.name, headers, onProgress);
|
|
243
|
+
}
|
|
244
|
+
// Try to get project ID from the response
|
|
245
|
+
const projectId = lroData.response?.cloudaicompanionProject?.id;
|
|
246
|
+
if (projectId) {
|
|
247
|
+
return projectId;
|
|
248
|
+
}
|
|
249
|
+
// If no project ID from onboarding, fall back to env var
|
|
250
|
+
if (envProjectId) {
|
|
251
|
+
return envProjectId;
|
|
252
|
+
}
|
|
253
|
+
throw new Error("Could not discover or provision a Google Cloud project. " +
|
|
254
|
+
"Try setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. " +
|
|
255
|
+
"See https://goo.gle/gemini-cli-auth-docs#workspace-gca");
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get user email from the access token
|
|
259
|
+
*/
|
|
260
|
+
async function getUserEmail(accessToken) {
|
|
261
|
+
try {
|
|
262
|
+
const response = await fetch("https://www.googleapis.com/oauth2/v1/userinfo?alt=json", {
|
|
263
|
+
headers: {
|
|
264
|
+
Authorization: `Bearer ${accessToken}`,
|
|
265
|
+
},
|
|
266
|
+
});
|
|
267
|
+
if (response.ok) {
|
|
268
|
+
const data = (await response.json());
|
|
269
|
+
return data.email;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
// Ignore errors, email is optional
|
|
274
|
+
}
|
|
275
|
+
return undefined;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Refresh Google Cloud Code Assist token
|
|
279
|
+
*/
|
|
280
|
+
export async function refreshGoogleCloudToken(refreshToken, projectId) {
|
|
281
|
+
const response = await fetch(TOKEN_URL, {
|
|
282
|
+
method: "POST",
|
|
283
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
284
|
+
body: new URLSearchParams({
|
|
285
|
+
client_id: CLIENT_ID,
|
|
286
|
+
client_secret: CLIENT_SECRET,
|
|
287
|
+
refresh_token: refreshToken,
|
|
288
|
+
grant_type: "refresh_token",
|
|
289
|
+
}),
|
|
290
|
+
});
|
|
291
|
+
if (!response.ok) {
|
|
292
|
+
const error = await response.text();
|
|
293
|
+
throw new Error(`Google Cloud token refresh failed: ${error}`);
|
|
294
|
+
}
|
|
295
|
+
const data = (await response.json());
|
|
296
|
+
return {
|
|
297
|
+
refresh: data.refresh_token || refreshToken,
|
|
298
|
+
access: data.access_token,
|
|
299
|
+
expires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,
|
|
300
|
+
projectId,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Login with Gemini CLI (Google Cloud Code Assist) OAuth
|
|
305
|
+
*
|
|
306
|
+
* @param onAuth - Callback with URL and optional instructions
|
|
307
|
+
* @param onProgress - Optional progress callback
|
|
308
|
+
* @param onManualCodeInput - Optional promise that resolves with user-pasted redirect URL.
|
|
309
|
+
* Races with browser callback - whichever completes first wins.
|
|
310
|
+
*/
|
|
311
|
+
export async function loginGeminiCli(onAuth, onProgress, onManualCodeInput) {
|
|
312
|
+
const { verifier, challenge } = await generatePKCE();
|
|
313
|
+
// Start local server for callback
|
|
314
|
+
onProgress?.("Starting local server for OAuth callback...");
|
|
315
|
+
const server = await startCallbackServer();
|
|
316
|
+
let code;
|
|
317
|
+
try {
|
|
318
|
+
// Build authorization URL
|
|
319
|
+
const authParams = new URLSearchParams({
|
|
320
|
+
client_id: CLIENT_ID,
|
|
321
|
+
response_type: "code",
|
|
322
|
+
redirect_uri: REDIRECT_URI,
|
|
323
|
+
scope: SCOPES.join(" "),
|
|
324
|
+
code_challenge: challenge,
|
|
325
|
+
code_challenge_method: "S256",
|
|
326
|
+
state: verifier,
|
|
327
|
+
access_type: "offline",
|
|
328
|
+
prompt: "consent",
|
|
329
|
+
});
|
|
330
|
+
const authUrl = `${AUTH_URL}?${authParams.toString()}`;
|
|
331
|
+
// Notify caller with URL to open
|
|
332
|
+
onAuth({
|
|
333
|
+
url: authUrl,
|
|
334
|
+
instructions: "Complete the sign-in in your browser.",
|
|
335
|
+
});
|
|
336
|
+
// Wait for the callback, racing with manual input if provided
|
|
337
|
+
onProgress?.("Waiting for OAuth callback...");
|
|
338
|
+
if (onManualCodeInput) {
|
|
339
|
+
// Race between browser callback and manual input
|
|
340
|
+
let manualInput;
|
|
341
|
+
let manualError;
|
|
342
|
+
const manualPromise = onManualCodeInput()
|
|
343
|
+
.then((input) => {
|
|
344
|
+
manualInput = input;
|
|
345
|
+
server.cancelWait();
|
|
346
|
+
})
|
|
347
|
+
.catch((err) => {
|
|
348
|
+
manualError = err instanceof Error ? err : new Error(String(err));
|
|
349
|
+
server.cancelWait();
|
|
350
|
+
});
|
|
351
|
+
const result = await server.waitForCode();
|
|
352
|
+
// If manual input was cancelled, throw that error
|
|
353
|
+
if (manualError) {
|
|
354
|
+
throw manualError;
|
|
355
|
+
}
|
|
356
|
+
if (result?.code) {
|
|
357
|
+
// Browser callback won - verify state
|
|
358
|
+
if (result.state !== verifier) {
|
|
359
|
+
throw new Error("OAuth state mismatch - possible CSRF attack");
|
|
360
|
+
}
|
|
361
|
+
code = result.code;
|
|
362
|
+
}
|
|
363
|
+
else if (manualInput) {
|
|
364
|
+
// Manual input won
|
|
365
|
+
const parsed = parseRedirectUrl(manualInput);
|
|
366
|
+
if (parsed.state && parsed.state !== verifier) {
|
|
367
|
+
throw new Error("OAuth state mismatch - possible CSRF attack");
|
|
368
|
+
}
|
|
369
|
+
code = parsed.code;
|
|
370
|
+
}
|
|
371
|
+
// If still no code, wait for manual promise and try that
|
|
372
|
+
if (!code) {
|
|
373
|
+
await manualPromise;
|
|
374
|
+
if (manualError) {
|
|
375
|
+
throw manualError;
|
|
376
|
+
}
|
|
377
|
+
if (manualInput) {
|
|
378
|
+
const parsed = parseRedirectUrl(manualInput);
|
|
379
|
+
if (parsed.state && parsed.state !== verifier) {
|
|
380
|
+
throw new Error("OAuth state mismatch - possible CSRF attack");
|
|
381
|
+
}
|
|
382
|
+
code = parsed.code;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
// Original flow: just wait for callback
|
|
388
|
+
const result = await server.waitForCode();
|
|
389
|
+
if (result?.code) {
|
|
390
|
+
if (result.state !== verifier) {
|
|
391
|
+
throw new Error("OAuth state mismatch - possible CSRF attack");
|
|
392
|
+
}
|
|
393
|
+
code = result.code;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
if (!code) {
|
|
397
|
+
throw new Error("No authorization code received");
|
|
398
|
+
}
|
|
399
|
+
// Exchange code for tokens
|
|
400
|
+
onProgress?.("Exchanging authorization code for tokens...");
|
|
401
|
+
const tokenResponse = await fetch(TOKEN_URL, {
|
|
402
|
+
method: "POST",
|
|
403
|
+
headers: {
|
|
404
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
405
|
+
},
|
|
406
|
+
body: new URLSearchParams({
|
|
407
|
+
client_id: CLIENT_ID,
|
|
408
|
+
client_secret: CLIENT_SECRET,
|
|
409
|
+
code,
|
|
410
|
+
grant_type: "authorization_code",
|
|
411
|
+
redirect_uri: REDIRECT_URI,
|
|
412
|
+
code_verifier: verifier,
|
|
413
|
+
}),
|
|
414
|
+
});
|
|
415
|
+
if (!tokenResponse.ok) {
|
|
416
|
+
const error = await tokenResponse.text();
|
|
417
|
+
throw new Error(`Token exchange failed: ${error}`);
|
|
418
|
+
}
|
|
419
|
+
const tokenData = (await tokenResponse.json());
|
|
420
|
+
if (!tokenData.refresh_token) {
|
|
421
|
+
throw new Error("No refresh token received. Please try again.");
|
|
422
|
+
}
|
|
423
|
+
// Get user email
|
|
424
|
+
onProgress?.("Getting user info...");
|
|
425
|
+
const email = await getUserEmail(tokenData.access_token);
|
|
426
|
+
// Discover project
|
|
427
|
+
const projectId = await discoverProject(tokenData.access_token, onProgress);
|
|
428
|
+
// Calculate expiry time (current time + expires_in seconds - 5 min buffer)
|
|
429
|
+
const expiresAt = Date.now() + tokenData.expires_in * 1000 - 5 * 60 * 1000;
|
|
430
|
+
const credentials = {
|
|
431
|
+
refresh: tokenData.refresh_token,
|
|
432
|
+
access: tokenData.access_token,
|
|
433
|
+
expires: expiresAt,
|
|
434
|
+
projectId,
|
|
435
|
+
email,
|
|
436
|
+
};
|
|
437
|
+
return credentials;
|
|
438
|
+
}
|
|
439
|
+
finally {
|
|
440
|
+
server.server.close();
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
export const geminiCliOAuthProvider = {
|
|
444
|
+
id: "google-gemini-cli",
|
|
445
|
+
name: "Google Cloud Code Assist (Gemini CLI)",
|
|
446
|
+
usesCallbackServer: true,
|
|
447
|
+
async login(callbacks) {
|
|
448
|
+
return loginGeminiCli(callbacks.onAuth, callbacks.onProgress, callbacks.onManualCodeInput);
|
|
449
|
+
},
|
|
450
|
+
async refreshToken(credentials) {
|
|
451
|
+
const creds = credentials;
|
|
452
|
+
if (!creds.projectId) {
|
|
453
|
+
throw new Error("Google Cloud credentials missing projectId");
|
|
454
|
+
}
|
|
455
|
+
return refreshGoogleCloudToken(creds.refresh, creds.projectId);
|
|
456
|
+
},
|
|
457
|
+
getApiKey(credentials) {
|
|
458
|
+
const creds = credentials;
|
|
459
|
+
return JSON.stringify({ token: creds.access, projectId: creds.projectId });
|
|
460
|
+
},
|
|
461
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth credential management for AI providers.
|
|
3
|
+
*
|
|
4
|
+
* This module handles login, token refresh, and credential storage
|
|
5
|
+
* for OAuth-based providers:
|
|
6
|
+
* - Anthropic (Claude Pro/Max)
|
|
7
|
+
* - GitHub Copilot
|
|
8
|
+
* - Google Cloud Code Assist (Gemini CLI)
|
|
9
|
+
* - Antigravity (Gemini 3, Claude, GPT-OSS via Google Cloud)
|
|
10
|
+
*/
|
|
11
|
+
export { anthropicOAuthProvider, loginAnthropic, refreshAnthropicToken } from "./anthropic.js";
|
|
12
|
+
export { getGitHubCopilotBaseUrl, githubCopilotOAuthProvider, loginGitHubCopilot, normalizeDomain, refreshGitHubCopilotToken, } from "./github-copilot.js";
|
|
13
|
+
export { antigravityOAuthProvider, loginAntigravity, refreshAntigravityToken } from "./google-antigravity.js";
|
|
14
|
+
export { geminiCliOAuthProvider, loginGeminiCli, refreshGoogleCloudToken } from "./google-gemini-cli.js";
|
|
15
|
+
export { loginOpenAICodex, openaiCodexOAuthProvider, refreshOpenAICodexToken } from "./openai-codex.js";
|
|
16
|
+
export * from "./types.js";
|
|
17
|
+
import type { OAuthCredentials, OAuthProviderId, OAuthProviderInfo, OAuthProviderInterface } from "./types.js";
|
|
18
|
+
/**
|
|
19
|
+
* Get an OAuth provider by ID
|
|
20
|
+
*/
|
|
21
|
+
export declare function getOAuthProvider(id: OAuthProviderId): OAuthProviderInterface | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Register a custom OAuth provider
|
|
24
|
+
*/
|
|
25
|
+
export declare function registerOAuthProvider(provider: OAuthProviderInterface): void;
|
|
26
|
+
/**
|
|
27
|
+
* Get all registered OAuth providers
|
|
28
|
+
*/
|
|
29
|
+
export declare function getOAuthProviders(): OAuthProviderInterface[];
|
|
30
|
+
/**
|
|
31
|
+
* @deprecated Use getOAuthProviders() which returns OAuthProviderInterface[]
|
|
32
|
+
*/
|
|
33
|
+
export declare function getOAuthProviderInfoList(): OAuthProviderInfo[];
|
|
34
|
+
/**
|
|
35
|
+
* Refresh token for any OAuth provider.
|
|
36
|
+
* @deprecated Use getOAuthProvider(id).refreshToken() instead
|
|
37
|
+
*/
|
|
38
|
+
export declare function refreshOAuthToken(providerId: OAuthProviderId, credentials: OAuthCredentials): Promise<OAuthCredentials>;
|
|
39
|
+
/**
|
|
40
|
+
* Get API key for a provider from OAuth credentials.
|
|
41
|
+
* Automatically refreshes expired tokens.
|
|
42
|
+
*
|
|
43
|
+
* @returns API key string and updated credentials, or null if no credentials
|
|
44
|
+
* @throws Error if refresh fails
|
|
45
|
+
*/
|
|
46
|
+
export declare function getOAuthApiKey(providerId: OAuthProviderId, credentials: Record<string, OAuthCredentials>): Promise<{
|
|
47
|
+
newCredentials: OAuthCredentials;
|
|
48
|
+
apiKey: string;
|
|
49
|
+
} | null>;
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ai/utils/oauth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE/F,OAAO,EACN,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,yBAAyB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAE9G,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEzG,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAExG,cAAc,YAAY,CAAC;AAW3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAU/G;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,eAAe,GAAG,sBAAsB,GAAG,SAAS,CAExF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAE5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,sBAAsB,EAAE,CAE5D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,iBAAiB,EAAE,CAM9D;AAMD;;;GAGG;AACH,wBAAsB,iBAAiB,CACtC,UAAU,EAAE,eAAe,EAC3B,WAAW,EAAE,gBAAgB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CACnC,UAAU,EAAE,eAAe,EAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC3C,OAAO,CAAC;IAAE,cAAc,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAsBtE"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth credential management for AI providers.
|
|
3
|
+
*
|
|
4
|
+
* This module handles login, token refresh, and credential storage
|
|
5
|
+
* for OAuth-based providers:
|
|
6
|
+
* - Anthropic (Claude Pro/Max)
|
|
7
|
+
* - GitHub Copilot
|
|
8
|
+
* - Google Cloud Code Assist (Gemini CLI)
|
|
9
|
+
* - Antigravity (Gemini 3, Claude, GPT-OSS via Google Cloud)
|
|
10
|
+
*/
|
|
11
|
+
// Anthropic
|
|
12
|
+
export { anthropicOAuthProvider, loginAnthropic, refreshAnthropicToken } from "./anthropic.js";
|
|
13
|
+
// GitHub Copilot
|
|
14
|
+
export { getGitHubCopilotBaseUrl, githubCopilotOAuthProvider, loginGitHubCopilot, normalizeDomain, refreshGitHubCopilotToken, } from "./github-copilot.js";
|
|
15
|
+
// Google Antigravity
|
|
16
|
+
export { antigravityOAuthProvider, loginAntigravity, refreshAntigravityToken } from "./google-antigravity.js";
|
|
17
|
+
// Google Gemini CLI
|
|
18
|
+
export { geminiCliOAuthProvider, loginGeminiCli, refreshGoogleCloudToken } from "./google-gemini-cli.js";
|
|
19
|
+
// OpenAI Codex (ChatGPT OAuth)
|
|
20
|
+
export { loginOpenAICodex, openaiCodexOAuthProvider, refreshOpenAICodexToken } from "./openai-codex.js";
|
|
21
|
+
export * from "./types.js";
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Provider Registry
|
|
24
|
+
// ============================================================================
|
|
25
|
+
import { anthropicOAuthProvider } from "./anthropic.js";
|
|
26
|
+
import { githubCopilotOAuthProvider } from "./github-copilot.js";
|
|
27
|
+
import { antigravityOAuthProvider } from "./google-antigravity.js";
|
|
28
|
+
import { geminiCliOAuthProvider } from "./google-gemini-cli.js";
|
|
29
|
+
import { openaiCodexOAuthProvider } from "./openai-codex.js";
|
|
30
|
+
const oauthProviderRegistry = new Map([
|
|
31
|
+
[anthropicOAuthProvider.id, anthropicOAuthProvider],
|
|
32
|
+
[githubCopilotOAuthProvider.id, githubCopilotOAuthProvider],
|
|
33
|
+
[geminiCliOAuthProvider.id, geminiCliOAuthProvider],
|
|
34
|
+
[antigravityOAuthProvider.id, antigravityOAuthProvider],
|
|
35
|
+
[openaiCodexOAuthProvider.id, openaiCodexOAuthProvider],
|
|
36
|
+
]);
|
|
37
|
+
/**
|
|
38
|
+
* Get an OAuth provider by ID
|
|
39
|
+
*/
|
|
40
|
+
export function getOAuthProvider(id) {
|
|
41
|
+
return oauthProviderRegistry.get(id);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Register a custom OAuth provider
|
|
45
|
+
*/
|
|
46
|
+
export function registerOAuthProvider(provider) {
|
|
47
|
+
oauthProviderRegistry.set(provider.id, provider);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get all registered OAuth providers
|
|
51
|
+
*/
|
|
52
|
+
export function getOAuthProviders() {
|
|
53
|
+
return Array.from(oauthProviderRegistry.values());
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* @deprecated Use getOAuthProviders() which returns OAuthProviderInterface[]
|
|
57
|
+
*/
|
|
58
|
+
export function getOAuthProviderInfoList() {
|
|
59
|
+
return getOAuthProviders().map((p) => ({
|
|
60
|
+
id: p.id,
|
|
61
|
+
name: p.name,
|
|
62
|
+
available: true,
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// High-level API (uses provider registry)
|
|
67
|
+
// ============================================================================
|
|
68
|
+
/**
|
|
69
|
+
* Refresh token for any OAuth provider.
|
|
70
|
+
* @deprecated Use getOAuthProvider(id).refreshToken() instead
|
|
71
|
+
*/
|
|
72
|
+
export async function refreshOAuthToken(providerId, credentials) {
|
|
73
|
+
const provider = getOAuthProvider(providerId);
|
|
74
|
+
if (!provider) {
|
|
75
|
+
throw new Error(`Unknown OAuth provider: ${providerId}`);
|
|
76
|
+
}
|
|
77
|
+
return provider.refreshToken(credentials);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get API key for a provider from OAuth credentials.
|
|
81
|
+
* Automatically refreshes expired tokens.
|
|
82
|
+
*
|
|
83
|
+
* @returns API key string and updated credentials, or null if no credentials
|
|
84
|
+
* @throws Error if refresh fails
|
|
85
|
+
*/
|
|
86
|
+
export async function getOAuthApiKey(providerId, credentials) {
|
|
87
|
+
const provider = getOAuthProvider(providerId);
|
|
88
|
+
if (!provider) {
|
|
89
|
+
throw new Error(`Unknown OAuth provider: ${providerId}`);
|
|
90
|
+
}
|
|
91
|
+
let creds = credentials[providerId];
|
|
92
|
+
if (!creds) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
// Refresh if expired
|
|
96
|
+
if (Date.now() >= creds.expires) {
|
|
97
|
+
try {
|
|
98
|
+
creds = await provider.refreshToken(creds);
|
|
99
|
+
}
|
|
100
|
+
catch (_error) {
|
|
101
|
+
throw new Error(`Failed to refresh OAuth token for ${providerId}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const apiKey = provider.getApiKey(creds);
|
|
105
|
+
return { newCredentials: creds, apiKey };
|
|
106
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Codex (ChatGPT OAuth) flow
|
|
3
|
+
*
|
|
4
|
+
* NOTE: This module uses Node.js crypto and http for the OAuth callback.
|
|
5
|
+
* It is only intended for CLI use, not browser environments.
|
|
6
|
+
*/
|
|
7
|
+
import type { OAuthCredentials, OAuthPrompt, OAuthProviderInterface } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Login with OpenAI Codex OAuth
|
|
10
|
+
*
|
|
11
|
+
* @param options.onAuth - Called with URL and instructions when auth starts
|
|
12
|
+
* @param options.onPrompt - Called to prompt user for manual code paste (fallback if no onManualCodeInput)
|
|
13
|
+
* @param options.onProgress - Optional progress messages
|
|
14
|
+
* @param options.onManualCodeInput - Optional promise that resolves with user-pasted code.
|
|
15
|
+
* Races with browser callback - whichever completes first wins.
|
|
16
|
+
* Useful for showing paste input immediately alongside browser flow.
|
|
17
|
+
* @param options.originator - OAuth originator parameter (defaults to "pi")
|
|
18
|
+
*/
|
|
19
|
+
export declare function loginOpenAICodex(options: {
|
|
20
|
+
onAuth: (info: {
|
|
21
|
+
url: string;
|
|
22
|
+
instructions?: string;
|
|
23
|
+
}) => void;
|
|
24
|
+
onPrompt: (prompt: OAuthPrompt) => Promise<string>;
|
|
25
|
+
onProgress?: (message: string) => void;
|
|
26
|
+
onManualCodeInput?: () => Promise<string>;
|
|
27
|
+
originator?: string;
|
|
28
|
+
}): Promise<OAuthCredentials>;
|
|
29
|
+
/**
|
|
30
|
+
* Refresh OpenAI Codex OAuth token
|
|
31
|
+
*/
|
|
32
|
+
export declare function refreshOpenAICodexToken(refreshToken: string): Promise<OAuthCredentials>;
|
|
33
|
+
export declare const openaiCodexOAuthProvider: OAuthProviderInterface;
|
|
34
|
+
//# sourceMappingURL=openai-codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-codex.d.ts","sourceRoot":"","sources":["../../../../src/ai/utils/oauth/openai-codex.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,OAAO,KAAK,EAAE,gBAAgB,EAAuB,WAAW,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAiR7G;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC/C,MAAM,EAAE,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/D,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmG5B;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiB7F;AAED,eAAO,MAAM,wBAAwB,EAAE,sBAqBtC,CAAC"}
|