@shareai-lab/kode 1.1.12 → 1.1.13
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/cli.js +44 -23
- package/dist/ProjectOnboarding.js +99 -0
- package/dist/ProjectOnboarding.js.map +7 -0
- package/dist/Tool.js +1 -0
- package/dist/Tool.js.map +7 -0
- package/dist/commands/agents.js +2087 -0
- package/dist/commands/agents.js.map +7 -0
- package/dist/commands/approvedTools.js +36 -0
- package/dist/commands/approvedTools.js.map +7 -0
- package/dist/commands/bug.js +21 -0
- package/dist/commands/bug.js.map +7 -0
- package/dist/commands/clear.js +37 -0
- package/dist/commands/clear.js.map +7 -0
- package/dist/commands/compact.js +104 -0
- package/dist/commands/compact.js.map +7 -0
- package/dist/commands/config.js +20 -0
- package/dist/commands/config.js.map +7 -0
- package/dist/commands/cost.js +19 -0
- package/dist/commands/cost.js.map +7 -0
- package/dist/commands/ctx_viz.js +152 -0
- package/dist/commands/ctx_viz.js.map +7 -0
- package/dist/commands/doctor.js +25 -0
- package/dist/commands/doctor.js.map +7 -0
- package/dist/commands/help.js +20 -0
- package/dist/commands/help.js.map +7 -0
- package/dist/commands/init.js +38 -0
- package/dist/commands/init.js.map +7 -0
- package/dist/commands/listen.js +37 -0
- package/dist/commands/listen.js.map +7 -0
- package/dist/commands/login.js +37 -0
- package/dist/commands/login.js.map +7 -0
- package/dist/commands/logout.js +33 -0
- package/dist/commands/logout.js.map +7 -0
- package/dist/commands/mcp.js +34 -0
- package/dist/commands/mcp.js.map +7 -0
- package/dist/commands/model.js +41 -0
- package/dist/commands/model.js.map +7 -0
- package/dist/commands/modelstatus.js +21 -0
- package/dist/commands/modelstatus.js.map +7 -0
- package/dist/commands/onboarding.js +36 -0
- package/dist/commands/onboarding.js.map +7 -0
- package/dist/commands/pr_comments.js +61 -0
- package/dist/commands/pr_comments.js.map +7 -0
- package/dist/commands/refreshCommands.js +37 -0
- package/dist/commands/refreshCommands.js.map +7 -0
- package/dist/commands/release-notes.js +30 -0
- package/dist/commands/release-notes.js.map +7 -0
- package/dist/commands/resume.js +35 -0
- package/dist/commands/resume.js.map +7 -0
- package/dist/commands/review.js +51 -0
- package/dist/commands/review.js.map +7 -0
- package/dist/commands/terminalSetup.js +163 -0
- package/dist/commands/terminalSetup.js.map +7 -0
- package/dist/commands.js +84 -0
- package/dist/commands.js.map +7 -0
- package/dist/components/ApproveApiKey.js +74 -0
- package/dist/components/ApproveApiKey.js.map +7 -0
- package/dist/components/AsciiLogo.js +12 -0
- package/dist/components/AsciiLogo.js.map +7 -0
- package/dist/components/AutoUpdater.js +74 -0
- package/dist/components/AutoUpdater.js.map +7 -0
- package/dist/components/Bug.js +147 -0
- package/dist/components/Bug.js.map +7 -0
- package/dist/components/Config.js +166 -0
- package/dist/components/Config.js.map +7 -0
- package/dist/components/ConsoleOAuthFlow.js +188 -0
- package/dist/components/ConsoleOAuthFlow.js.map +7 -0
- package/dist/components/Cost.js +13 -0
- package/dist/components/Cost.js.map +7 -0
- package/dist/components/CostThresholdDialog.js +38 -0
- package/dist/components/CostThresholdDialog.js.map +7 -0
- package/dist/components/CustomSelect/option-map.js +32 -0
- package/dist/components/CustomSelect/option-map.js.map +7 -0
- package/dist/components/CustomSelect/select-option.js +34 -0
- package/dist/components/CustomSelect/select-option.js.map +7 -0
- package/dist/components/CustomSelect/select.js +64 -0
- package/dist/components/CustomSelect/select.js.map +7 -0
- package/dist/components/CustomSelect/theme.js +1 -0
- package/dist/components/CustomSelect/theme.js.map +7 -0
- package/dist/components/CustomSelect/use-select-state.js +220 -0
- package/dist/components/CustomSelect/use-select-state.js.map +7 -0
- package/dist/components/CustomSelect/use-select.js +21 -0
- package/dist/components/CustomSelect/use-select.js.map +7 -0
- package/dist/components/FallbackToolUseRejectedMessage.js +11 -0
- package/dist/components/FallbackToolUseRejectedMessage.js.map +7 -0
- package/dist/components/FileEditToolUpdatedMessage.js +31 -0
- package/dist/components/FileEditToolUpdatedMessage.js.map +7 -0
- package/dist/components/Help.js +41 -0
- package/dist/components/Help.js.map +7 -0
- package/dist/components/HighlightedCode.js +30 -0
- package/dist/components/HighlightedCode.js.map +7 -0
- package/dist/components/InvalidConfigDialog.js +83 -0
- package/dist/components/InvalidConfigDialog.js.map +7 -0
- package/dist/components/Link.js +18 -0
- package/dist/components/Link.js.map +7 -0
- package/dist/components/LogSelector.js +50 -0
- package/dist/components/LogSelector.js.map +7 -0
- package/dist/components/Logo.js +89 -0
- package/dist/components/Logo.js.map +7 -0
- package/dist/components/MCPServerApprovalDialog.js +79 -0
- package/dist/components/MCPServerApprovalDialog.js.map +7 -0
- package/dist/components/MCPServerDialogCopy.js +11 -0
- package/dist/components/MCPServerDialogCopy.js.map +7 -0
- package/dist/components/MCPServerMultiselectDialog.js +80 -0
- package/dist/components/MCPServerMultiselectDialog.js.map +7 -0
- package/dist/components/Message.js +146 -0
- package/dist/components/Message.js.map +7 -0
- package/dist/components/MessageResponse.js +9 -0
- package/dist/components/MessageResponse.js.map +7 -0
- package/dist/components/MessageSelector.js +133 -0
- package/dist/components/MessageSelector.js.map +7 -0
- package/dist/components/ModeIndicator.js +38 -0
- package/dist/components/ModeIndicator.js.map +7 -0
- package/dist/components/ModelConfig.js +208 -0
- package/dist/components/ModelConfig.js.map +7 -0
- package/dist/components/ModelListManager.js +140 -0
- package/dist/components/ModelListManager.js.map +7 -0
- package/dist/components/ModelSelector.js +1985 -0
- package/dist/components/ModelSelector.js.map +7 -0
- package/dist/components/ModelStatusDisplay.js +87 -0
- package/dist/components/ModelStatusDisplay.js.map +7 -0
- package/dist/components/Onboarding.js +153 -0
- package/dist/components/Onboarding.js.map +7 -0
- package/dist/components/PressEnterToContinue.js +10 -0
- package/dist/components/PressEnterToContinue.js.map +7 -0
- package/dist/components/PromptInput.js +501 -0
- package/dist/components/PromptInput.js.map +7 -0
- package/dist/components/SentryErrorBoundary.js +27 -0
- package/dist/components/SentryErrorBoundary.js.map +7 -0
- package/dist/components/Spinner.js +101 -0
- package/dist/components/Spinner.js.map +7 -0
- package/dist/components/StickerRequestForm.js +7 -0
- package/dist/components/StickerRequestForm.js.map +7 -0
- package/dist/components/StructuredDiff.js +148 -0
- package/dist/components/StructuredDiff.js.map +7 -0
- package/dist/components/TextInput.js +100 -0
- package/dist/components/TextInput.js.map +7 -0
- package/dist/components/TodoItem.js +35 -0
- package/dist/components/TodoItem.js.map +7 -0
- package/dist/components/TokenWarning.js +19 -0
- package/dist/components/TokenWarning.js.map +7 -0
- package/dist/components/ToolUseLoader.js +24 -0
- package/dist/components/ToolUseLoader.js.map +7 -0
- package/dist/components/TrustDialog.js +76 -0
- package/dist/components/TrustDialog.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedback.js +50 -0
- package/dist/components/binary-feedback/BinaryFeedback.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackOption.js +94 -0
- package/dist/components/binary-feedback/BinaryFeedbackOption.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js +139 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js.map +7 -0
- package/dist/components/binary-feedback/utils.js +161 -0
- package/dist/components/binary-feedback/utils.js.map +7 -0
- package/dist/components/messages/AssistantBashOutputMessage.js +23 -0
- package/dist/components/messages/AssistantBashOutputMessage.js.map +7 -0
- package/dist/components/messages/AssistantLocalCommandOutputMessage.js +36 -0
- package/dist/components/messages/AssistantLocalCommandOutputMessage.js.map +7 -0
- package/dist/components/messages/AssistantRedactedThinkingMessage.js +12 -0
- package/dist/components/messages/AssistantRedactedThinkingMessage.js.map +7 -0
- package/dist/components/messages/AssistantTextMessage.js +78 -0
- package/dist/components/messages/AssistantTextMessage.js.map +7 -0
- package/dist/components/messages/AssistantThinkingMessage.js +27 -0
- package/dist/components/messages/AssistantThinkingMessage.js.map +7 -0
- package/dist/components/messages/AssistantToolUseMessage.js +91 -0
- package/dist/components/messages/AssistantToolUseMessage.js.map +7 -0
- package/dist/components/messages/TaskProgressMessage.js +11 -0
- package/dist/components/messages/TaskProgressMessage.js.map +7 -0
- package/dist/components/messages/TaskToolMessage.js +39 -0
- package/dist/components/messages/TaskToolMessage.js.map +7 -0
- package/dist/components/messages/UserBashInputMessage.js +18 -0
- package/dist/components/messages/UserBashInputMessage.js.map +7 -0
- package/dist/components/messages/UserCommandMessage.js +20 -0
- package/dist/components/messages/UserCommandMessage.js.map +7 -0
- package/dist/components/messages/UserKodingInputMessage.js +18 -0
- package/dist/components/messages/UserKodingInputMessage.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +20 -0
- package/dist/components/messages/UserPromptMessage.js.map +7 -0
- package/dist/components/messages/UserTextMessage.js +25 -0
- package/dist/components/messages/UserTextMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +10 -0
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js +15 -0
- package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +25 -0
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +47 -0
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +23 -0
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/utils.js +42 -0
- package/dist/components/messages/UserToolResultMessage/utils.js.map +7 -0
- package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js +112 -0
- package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js.map +7 -0
- package/dist/components/permissions/FallbackPermissionRequest.js +131 -0
- package/dist/components/permissions/FallbackPermissionRequest.js.map +7 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +159 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js.map +7 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js +58 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js.map +7 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +153 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js.map +7 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js +70 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js.map +7 -0
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +212 -0
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +7 -0
- package/dist/components/permissions/PermissionRequest.js +70 -0
- package/dist/components/permissions/PermissionRequest.js.map +7 -0
- package/dist/components/permissions/PermissionRequestTitle.js +52 -0
- package/dist/components/permissions/PermissionRequestTitle.js.map +7 -0
- package/dist/components/permissions/hooks.js +28 -0
- package/dist/components/permissions/hooks.js.map +7 -0
- package/dist/components/permissions/toolUseOptions.js +46 -0
- package/dist/components/permissions/toolUseOptions.js.map +7 -0
- package/dist/components/permissions/utils.js +21 -0
- package/dist/components/permissions/utils.js.map +7 -0
- package/dist/constants/betas.js +11 -0
- package/dist/constants/betas.js.map +7 -0
- package/dist/constants/claude-asterisk-ascii-art.js +242 -0
- package/dist/constants/claude-asterisk-ascii-art.js.map +7 -0
- package/dist/constants/figures.js +6 -0
- package/dist/constants/figures.js.map +7 -0
- package/dist/constants/keys.js +7 -0
- package/dist/constants/keys.js.map +7 -0
- package/dist/constants/macros.js +13 -0
- package/dist/constants/macros.js.map +7 -0
- package/dist/constants/modelCapabilities.js +154 -0
- package/dist/constants/modelCapabilities.js.map +7 -0
- package/dist/constants/models.js +1029 -0
- package/dist/constants/models.js.map +7 -0
- package/dist/constants/oauth.js +18 -0
- package/dist/constants/oauth.js.map +7 -0
- package/dist/constants/product.js +26 -0
- package/dist/constants/product.js.map +7 -0
- package/dist/constants/prompts.js +168 -0
- package/dist/constants/prompts.js.map +7 -0
- package/dist/constants/releaseNotes.js +9 -0
- package/dist/constants/releaseNotes.js.map +7 -0
- package/dist/context/PermissionContext.js +111 -0
- package/dist/context/PermissionContext.js.map +7 -0
- package/dist/context.js +259 -0
- package/dist/context.js.map +7 -0
- package/dist/cost-tracker.js +76 -0
- package/dist/cost-tracker.js.map +7 -0
- package/dist/entrypoints/cli.js +1101 -0
- package/dist/entrypoints/cli.js.map +7 -0
- package/dist/entrypoints/mcp.js +150 -0
- package/dist/entrypoints/mcp.js.map +7 -0
- package/dist/history.js +25 -0
- package/dist/history.js.map +7 -0
- package/dist/hooks/useApiKeyVerification.js +12 -0
- package/dist/hooks/useApiKeyVerification.js.map +7 -0
- package/dist/hooks/useArrowKeyHistory.js +50 -0
- package/dist/hooks/useArrowKeyHistory.js.map +7 -0
- package/dist/hooks/useCanUseTool.js +112 -0
- package/dist/hooks/useCanUseTool.js.map +7 -0
- package/dist/hooks/useCancelRequest.js +30 -0
- package/dist/hooks/useCancelRequest.js.map +7 -0
- package/dist/hooks/useDoublePress.js +31 -0
- package/dist/hooks/useDoublePress.js.map +7 -0
- package/dist/hooks/useExitOnCtrlCD.js +26 -0
- package/dist/hooks/useExitOnCtrlCD.js.map +7 -0
- package/dist/hooks/useInterval.js +18 -0
- package/dist/hooks/useInterval.js.map +7 -0
- package/dist/hooks/useLogMessages.js +14 -0
- package/dist/hooks/useLogMessages.js.map +7 -0
- package/dist/hooks/useLogStartupTime.js +15 -0
- package/dist/hooks/useLogStartupTime.js.map +7 -0
- package/dist/hooks/useNotifyAfterTimeout.js +42 -0
- package/dist/hooks/useNotifyAfterTimeout.js.map +7 -0
- package/dist/hooks/usePermissionRequestLogging.js +28 -0
- package/dist/hooks/usePermissionRequestLogging.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +38 -0
- package/dist/hooks/useTerminalSize.js.map +7 -0
- package/dist/hooks/useTextInput.js +250 -0
- package/dist/hooks/useTextInput.js.map +7 -0
- package/dist/hooks/useUnifiedCompletion.js +929 -0
- package/dist/hooks/useUnifiedCompletion.js.map +7 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +7 -0
- package/dist/messages.js +33 -0
- package/dist/messages.js.map +7 -0
- package/dist/package.json +1 -0
- package/dist/permissions.js +194 -0
- package/dist/permissions.js.map +7 -0
- package/dist/query.js +492 -0
- package/dist/query.js.map +7 -0
- package/dist/screens/ConfigureNpmPrefix.js +128 -0
- package/dist/screens/ConfigureNpmPrefix.js.map +7 -0
- package/dist/screens/Doctor.js +143 -0
- package/dist/screens/Doctor.js.map +7 -0
- package/dist/screens/LogList.js +55 -0
- package/dist/screens/LogList.js.map +7 -0
- package/dist/screens/REPL.js +596 -0
- package/dist/screens/REPL.js.map +7 -0
- package/dist/screens/ResumeConversation.js +56 -0
- package/dist/screens/ResumeConversation.js.map +7 -0
- package/dist/services/adapters/base.js +29 -0
- package/dist/services/adapters/base.js.map +7 -0
- package/dist/services/adapters/chatCompletions.js +69 -0
- package/dist/services/adapters/chatCompletions.js.map +7 -0
- package/dist/services/adapters/responsesAPI.js +126 -0
- package/dist/services/adapters/responsesAPI.js.map +7 -0
- package/dist/services/browserMocks.js +48 -0
- package/dist/services/browserMocks.js.map +7 -0
- package/dist/services/claude.js +1605 -0
- package/dist/services/claude.js.map +7 -0
- package/dist/services/customCommands.js +359 -0
- package/dist/services/customCommands.js.map +7 -0
- package/dist/services/fileFreshness.js +280 -0
- package/dist/services/fileFreshness.js.map +7 -0
- package/dist/services/gpt5ConnectionTest.js +248 -0
- package/dist/services/gpt5ConnectionTest.js.map +7 -0
- package/dist/services/mcpClient.js +435 -0
- package/dist/services/mcpClient.js.map +7 -0
- package/dist/services/mcpServerApproval.js +55 -0
- package/dist/services/mcpServerApproval.js.map +7 -0
- package/dist/services/mentionProcessor.js +200 -0
- package/dist/services/mentionProcessor.js.map +7 -0
- package/dist/services/modelAdapterFactory.js +47 -0
- package/dist/services/modelAdapterFactory.js.map +7 -0
- package/dist/services/notifier.js +35 -0
- package/dist/services/notifier.js.map +7 -0
- package/dist/services/oauth.js +259 -0
- package/dist/services/oauth.js.map +7 -0
- package/dist/services/openai.js +998 -0
- package/dist/services/openai.js.map +7 -0
- package/dist/services/responseStateManager.js +68 -0
- package/dist/services/responseStateManager.js.map +7 -0
- package/dist/services/sentry.js +9 -0
- package/dist/services/sentry.js.map +7 -0
- package/dist/services/statsig.js +112 -0
- package/dist/services/statsig.js.map +7 -0
- package/dist/services/statsigStorage.js +75 -0
- package/dist/services/statsigStorage.js.map +7 -0
- package/dist/services/systemReminder.js +353 -0
- package/dist/services/systemReminder.js.map +7 -0
- package/dist/services/vcr.js +133 -0
- package/dist/services/vcr.js.map +7 -0
- package/dist/test/testAdapters.js +88 -0
- package/dist/test/testAdapters.js.map +1 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js +119 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +7 -0
- package/dist/tools/ArchitectTool/prompt.js +18 -0
- package/dist/tools/ArchitectTool/prompt.js.map +7 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +423 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +7 -0
- package/dist/tools/BashTool/BashTool.js +188 -0
- package/dist/tools/BashTool/BashTool.js.map +7 -0
- package/dist/tools/BashTool/BashToolResultMessage.js +21 -0
- package/dist/tools/BashTool/BashToolResultMessage.js.map +7 -0
- package/dist/tools/BashTool/OutputLine.js +30 -0
- package/dist/tools/BashTool/OutputLine.js.map +7 -0
- package/dist/tools/BashTool/prompt.js +179 -0
- package/dist/tools/BashTool/prompt.js.map +7 -0
- package/dist/tools/BashTool/utils.js +51 -0
- package/dist/tools/BashTool/utils.js.map +7 -0
- package/dist/tools/FileEditTool/FileEditTool.js +228 -0
- package/dist/tools/FileEditTool/FileEditTool.js.map +7 -0
- package/dist/tools/FileEditTool/prompt.js +54 -0
- package/dist/tools/FileEditTool/prompt.js.map +7 -0
- package/dist/tools/FileEditTool/utils.js +42 -0
- package/dist/tools/FileEditTool/utils.js.map +7 -0
- package/dist/tools/FileReadTool/FileReadTool.js +272 -0
- package/dist/tools/FileReadTool/FileReadTool.js.map +7 -0
- package/dist/tools/FileReadTool/prompt.js +10 -0
- package/dist/tools/FileReadTool/prompt.js.map +7 -0
- package/dist/tools/FileWriteTool/FileWriteTool.js +204 -0
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +7 -0
- package/dist/tools/FileWriteTool/prompt.js +14 -0
- package/dist/tools/FileWriteTool/prompt.js.map +7 -0
- package/dist/tools/GlobTool/GlobTool.js +88 -0
- package/dist/tools/GlobTool/GlobTool.js.map +7 -0
- package/dist/tools/GlobTool/prompt.js +12 -0
- package/dist/tools/GlobTool/prompt.js.map +7 -0
- package/dist/tools/GrepTool/GrepTool.js +107 -0
- package/dist/tools/GrepTool/GrepTool.js.map +7 -0
- package/dist/tools/GrepTool/prompt.js +15 -0
- package/dist/tools/GrepTool/prompt.js.map +7 -0
- package/dist/tools/MCPTool/MCPTool.js +90 -0
- package/dist/tools/MCPTool/MCPTool.js.map +7 -0
- package/dist/tools/MCPTool/prompt.js +7 -0
- package/dist/tools/MCPTool/prompt.js.map +7 -0
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +103 -0
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +7 -0
- package/dist/tools/MemoryReadTool/prompt.js +7 -0
- package/dist/tools/MemoryReadTool/prompt.js.map +7 -0
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +77 -0
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +7 -0
- package/dist/tools/MemoryWriteTool/prompt.js +7 -0
- package/dist/tools/MemoryWriteTool/prompt.js.map +7 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js +293 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +7 -0
- package/dist/tools/MultiEditTool/prompt.js +48 -0
- package/dist/tools/MultiEditTool/prompt.js.map +7 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +238 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +7 -0
- package/dist/tools/NotebookEditTool/prompt.js +7 -0
- package/dist/tools/NotebookEditTool/prompt.js.map +7 -0
- package/dist/tools/NotebookReadTool/NotebookReadTool.js +212 -0
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +7 -0
- package/dist/tools/NotebookReadTool/prompt.js +7 -0
- package/dist/tools/NotebookReadTool/prompt.js.map +7 -0
- package/dist/tools/StickerRequestTool/StickerRequestTool.js +86 -0
- package/dist/tools/StickerRequestTool/StickerRequestTool.js.map +7 -0
- package/dist/tools/StickerRequestTool/prompt.js +23 -0
- package/dist/tools/StickerRequestTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +308 -0
- package/dist/tools/TaskTool/TaskTool.js.map +7 -0
- package/dist/tools/TaskTool/constants.js +5 -0
- package/dist/tools/TaskTool/constants.js.map +7 -0
- package/dist/tools/TaskTool/prompt.js +82 -0
- package/dist/tools/TaskTool/prompt.js.map +7 -0
- package/dist/tools/ThinkTool/ThinkTool.js +48 -0
- package/dist/tools/ThinkTool/ThinkTool.js.map +7 -0
- package/dist/tools/ThinkTool/prompt.js +16 -0
- package/dist/tools/ThinkTool/prompt.js.map +7 -0
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +216 -0
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +7 -0
- package/dist/tools/TodoWriteTool/prompt.js +66 -0
- package/dist/tools/TodoWriteTool/prompt.js.map +7 -0
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +137 -0
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +7 -0
- package/dist/tools/URLFetcherTool/cache.js +45 -0
- package/dist/tools/URLFetcherTool/cache.js.map +7 -0
- package/dist/tools/URLFetcherTool/htmlToMarkdown.js +42 -0
- package/dist/tools/URLFetcherTool/htmlToMarkdown.js.map +7 -0
- package/dist/tools/URLFetcherTool/prompt.js +22 -0
- package/dist/tools/URLFetcherTool/prompt.js.map +7 -0
- package/dist/tools/WebSearchTool/WebSearchTool.js +86 -0
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +7 -0
- package/dist/tools/WebSearchTool/prompt.js +17 -0
- package/dist/tools/WebSearchTool/prompt.js.map +7 -0
- package/dist/tools/WebSearchTool/searchProviders.js +48 -0
- package/dist/tools/WebSearchTool/searchProviders.js.map +7 -0
- package/dist/tools/lsTool/lsTool.js +201 -0
- package/dist/tools/lsTool/lsTool.js.map +7 -0
- package/dist/tools/lsTool/prompt.js +5 -0
- package/dist/tools/lsTool/prompt.js.map +7 -0
- package/dist/tools.js +64 -0
- package/dist/tools.js.map +7 -0
- package/dist/types/PermissionMode.js +82 -0
- package/dist/types/PermissionMode.js.map +7 -0
- package/dist/types/RequestContext.js +47 -0
- package/dist/types/RequestContext.js.map +7 -0
- package/dist/types/common.d.js +1 -0
- package/dist/types/common.d.js.map +7 -0
- package/dist/types/conversation.js +1 -0
- package/dist/types/conversation.js.map +7 -0
- package/dist/types/logs.js +1 -0
- package/dist/types/logs.js.map +7 -0
- package/dist/types/modelCapabilities.js +1 -0
- package/dist/types/modelCapabilities.js.map +7 -0
- package/dist/types/notebook.js +1 -0
- package/dist/types/notebook.js.map +7 -0
- package/dist/utils/Cursor.js +313 -0
- package/dist/utils/Cursor.js.map +7 -0
- package/dist/utils/PersistentShell.js +382 -0
- package/dist/utils/PersistentShell.js.map +7 -0
- package/dist/utils/advancedFuzzyMatcher.js +206 -0
- package/dist/utils/advancedFuzzyMatcher.js.map +7 -0
- package/dist/utils/agentLoader.js +199 -0
- package/dist/utils/agentLoader.js.map +7 -0
- package/dist/utils/agentStorage.js +59 -0
- package/dist/utils/agentStorage.js.map +7 -0
- package/dist/utils/array.js +7 -0
- package/dist/utils/array.js.map +7 -0
- package/dist/utils/ask.js +77 -0
- package/dist/utils/ask.js.map +7 -0
- package/dist/utils/auth.js +11 -0
- package/dist/utils/auth.js.map +7 -0
- package/dist/utils/autoCompactCore.js +149 -0
- package/dist/utils/autoCompactCore.js.map +7 -0
- package/dist/utils/autoUpdater.js +362 -0
- package/dist/utils/autoUpdater.js.map +7 -0
- package/dist/utils/betas.js +21 -0
- package/dist/utils/betas.js.map +7 -0
- package/dist/utils/browser.js +15 -0
- package/dist/utils/browser.js.map +7 -0
- package/dist/utils/cleanup.js +54 -0
- package/dist/utils/cleanup.js.map +7 -0
- package/dist/utils/commands.js +207 -0
- package/dist/utils/commands.js.map +7 -0
- package/dist/utils/commonUnixCommands.js +687 -0
- package/dist/utils/commonUnixCommands.js.map +7 -0
- package/dist/utils/config.js +655 -0
- package/dist/utils/config.js.map +7 -0
- package/dist/utils/conversationRecovery.js +35 -0
- package/dist/utils/conversationRecovery.js.map +7 -0
- package/dist/utils/debugLogger.js +891 -0
- package/dist/utils/debugLogger.js.map +7 -0
- package/dist/utils/diff.js +32 -0
- package/dist/utils/diff.js.map +7 -0
- package/dist/utils/env.js +44 -0
- package/dist/utils/env.js.map +7 -0
- package/dist/utils/errors.js +23 -0
- package/dist/utils/errors.js.map +7 -0
- package/dist/utils/exampleCommands.js +80 -0
- package/dist/utils/exampleCommands.js.map +7 -0
- package/dist/utils/execFileNoThrow.js +44 -0
- package/dist/utils/execFileNoThrow.js.map +7 -0
- package/dist/utils/expertChatStorage.js +78 -0
- package/dist/utils/expertChatStorage.js.map +7 -0
- package/dist/utils/file.js +282 -0
- package/dist/utils/file.js.map +7 -0
- package/dist/utils/fileRecoveryCore.js +41 -0
- package/dist/utils/fileRecoveryCore.js.map +7 -0
- package/dist/utils/format.js +41 -0
- package/dist/utils/format.js.map +7 -0
- package/dist/utils/fuzzyMatcher.js +252 -0
- package/dist/utils/fuzzyMatcher.js.map +7 -0
- package/dist/utils/generators.js +46 -0
- package/dist/utils/generators.js.map +7 -0
- package/dist/utils/git.js +83 -0
- package/dist/utils/git.js.map +7 -0
- package/dist/utils/globalLogger.js +54 -0
- package/dist/utils/globalLogger.js.map +7 -0
- package/dist/utils/http.js +7 -0
- package/dist/utils/http.js.map +7 -0
- package/dist/utils/imagePaste.js +29 -0
- package/dist/utils/imagePaste.js.map +7 -0
- package/dist/utils/json.js +16 -0
- package/dist/utils/json.js.map +7 -0
- package/dist/utils/log.js +298 -0
- package/dist/utils/log.js.map +7 -0
- package/dist/utils/markdown.js +187 -0
- package/dist/utils/markdown.js.map +7 -0
- package/dist/utils/messageContextManager.js +195 -0
- package/dist/utils/messageContextManager.js.map +7 -0
- package/dist/utils/messages.js +633 -0
- package/dist/utils/messages.js.map +7 -0
- package/dist/utils/model.js +687 -0
- package/dist/utils/model.js.map +7 -0
- package/dist/utils/permissions/filesystem.js +80 -0
- package/dist/utils/permissions/filesystem.js.map +7 -0
- package/dist/utils/responseState.js +20 -0
- package/dist/utils/responseState.js.map +7 -0
- package/dist/utils/ripgrep.js +131 -0
- package/dist/utils/ripgrep.js.map +7 -0
- package/dist/utils/secureFile.js +483 -0
- package/dist/utils/secureFile.js.map +7 -0
- package/dist/utils/sessionState.js +31 -0
- package/dist/utils/sessionState.js.map +7 -0
- package/dist/utils/state.js +24 -0
- package/dist/utils/state.js.map +7 -0
- package/dist/utils/style.js +31 -0
- package/dist/utils/style.js.map +7 -0
- package/dist/utils/terminal.js +43 -0
- package/dist/utils/terminal.js.map +7 -0
- package/dist/utils/theme.js +102 -0
- package/dist/utils/theme.js.map +7 -0
- package/dist/utils/thinking.js +103 -0
- package/dist/utils/thinking.js.map +7 -0
- package/dist/utils/todoStorage.js +291 -0
- package/dist/utils/todoStorage.js.map +7 -0
- package/dist/utils/tokens.js +30 -0
- package/dist/utils/tokens.js.map +7 -0
- package/dist/utils/toolExecutionController.js +109 -0
- package/dist/utils/toolExecutionController.js.map +7 -0
- package/dist/utils/unaryLogging.js +14 -0
- package/dist/utils/unaryLogging.js.map +7 -0
- package/dist/utils/user.js +40 -0
- package/dist/utils/user.js.map +7 -0
- package/dist/utils/validate.js +132 -0
- package/dist/utils/validate.js.map +7 -0
- package/dist/yoga.wasm +0 -0
- package/package.json +28 -7
- package/src/Tool.ts +4 -3
- package/src/commands/agents.tsx +10 -4
- package/src/components/messages/AssistantToolUseMessage.tsx +5 -6
- package/src/constants/macros.ts +5 -2
- package/src/entrypoints/cli.tsx +38 -19
- package/src/entrypoints/mcp.ts +1 -2
- package/src/hooks/useDoublePress.ts +0 -1
- package/src/hooks/useTextInput.ts +4 -5
- package/src/hooks/useUnifiedCompletion.ts +2 -2
- package/src/index.ts +34 -0
- package/src/query.ts +13 -8
- package/src/screens/Doctor.tsx +1 -1
- package/src/screens/REPL.tsx +13 -9
- package/src/services/openai.ts +25 -4
- package/src/tools/ArchitectTool/ArchitectTool.tsx +18 -5
- package/src/tools/AskExpertModelTool/AskExpertModelTool.tsx +21 -14
- package/src/tools/FileEditTool/FileEditTool.tsx +6 -2
- package/src/tools/FileWriteTool/FileWriteTool.tsx +7 -3
- package/src/tools/MultiEditTool/MultiEditTool.tsx +26 -4
- package/src/tools/NotebookReadTool/NotebookReadTool.tsx +1 -1
- package/src/tools/StickerRequestTool/StickerRequestTool.tsx +28 -14
- package/src/tools/TaskTool/TaskTool.tsx +8 -36
- package/src/types/common.d.ts +2 -0
- package/src/utils/generators.ts +1 -1
- package/src/utils/messageContextManager.ts +5 -0
- package/src/utils/messages.tsx +8 -2
- package/src/utils/thinking.ts +1 -1
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { emitReminderEvent } from "./systemReminder.js";
|
|
2
|
+
import { getAvailableAgentTypes } from "../utils/agentLoader.js";
|
|
3
|
+
import { existsSync } from "fs";
|
|
4
|
+
import { resolve } from "path";
|
|
5
|
+
import { getCwd } from "../utils/state.js";
|
|
6
|
+
class MentionProcessorService {
|
|
7
|
+
// Centralized mention patterns - single source of truth
|
|
8
|
+
static MENTION_PATTERNS = {
|
|
9
|
+
runAgent: /@(run-agent-[\w\-]+)/g,
|
|
10
|
+
agent: /@(agent-[\w\-]+)/g,
|
|
11
|
+
// Legacy support
|
|
12
|
+
askModel: /@(ask-[\w\-]+)/g,
|
|
13
|
+
file: /@([a-zA-Z0-9/._-]+(?:\.[a-zA-Z0-9]+)?)/g
|
|
14
|
+
};
|
|
15
|
+
agentCache = /* @__PURE__ */ new Map();
|
|
16
|
+
lastAgentCheck = 0;
|
|
17
|
+
CACHE_TTL = 6e4;
|
|
18
|
+
// 1 minute cache
|
|
19
|
+
/**
|
|
20
|
+
* Process mentions in user input and emit appropriate events
|
|
21
|
+
* This follows the event-driven philosophy of system reminders
|
|
22
|
+
*/
|
|
23
|
+
async processMentions(input) {
|
|
24
|
+
const result = {
|
|
25
|
+
agents: [],
|
|
26
|
+
files: [],
|
|
27
|
+
hasAgentMentions: false,
|
|
28
|
+
hasFileMentions: false
|
|
29
|
+
};
|
|
30
|
+
try {
|
|
31
|
+
const agentMentions = this.extractAgentMentions(input);
|
|
32
|
+
if (agentMentions.length > 0) {
|
|
33
|
+
await this.refreshAgentCache();
|
|
34
|
+
for (const { mention, agentType, isAskModel } of agentMentions) {
|
|
35
|
+
if (isAskModel || this.agentCache.has(agentType)) {
|
|
36
|
+
result.agents.push({
|
|
37
|
+
type: "agent",
|
|
38
|
+
mention,
|
|
39
|
+
resolved: agentType,
|
|
40
|
+
exists: true,
|
|
41
|
+
metadata: isAskModel ? { type: "ask-model" } : void 0
|
|
42
|
+
});
|
|
43
|
+
result.hasAgentMentions = true;
|
|
44
|
+
this.emitAgentMentionEvent(mention, agentType, isAskModel);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const fileMatches = [...input.matchAll(MentionProcessorService.MENTION_PATTERNS.file)];
|
|
49
|
+
const processedAgentMentions = new Set(agentMentions.map((am) => am.mention));
|
|
50
|
+
for (const match of fileMatches) {
|
|
51
|
+
const mention = match[1];
|
|
52
|
+
if (mention.startsWith("run-agent-") || mention.startsWith("agent-") || mention.startsWith("ask-") || processedAgentMentions.has(mention)) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const filePath = this.resolveFilePath(mention);
|
|
56
|
+
if (existsSync(filePath)) {
|
|
57
|
+
result.files.push({
|
|
58
|
+
type: "file",
|
|
59
|
+
mention,
|
|
60
|
+
resolved: filePath,
|
|
61
|
+
exists: true
|
|
62
|
+
});
|
|
63
|
+
result.hasFileMentions = true;
|
|
64
|
+
emitReminderEvent("file:mentioned", {
|
|
65
|
+
filePath,
|
|
66
|
+
originalMention: mention,
|
|
67
|
+
timestamp: Date.now()
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
} catch (error) {
|
|
73
|
+
console.warn("[MentionProcessor] Failed to process mentions:", {
|
|
74
|
+
input: input.substring(0, 100) + (input.length > 100 ? "..." : ""),
|
|
75
|
+
error: error instanceof Error ? error.message : error
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
agents: [],
|
|
79
|
+
files: [],
|
|
80
|
+
hasAgentMentions: false,
|
|
81
|
+
hasFileMentions: false
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Removed identifyMention method as it's no longer needed with separate processing
|
|
86
|
+
/**
|
|
87
|
+
* Resolve file path relative to current working directory
|
|
88
|
+
*/
|
|
89
|
+
resolveFilePath(mention) {
|
|
90
|
+
return resolve(getCwd(), mention);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Refresh the agent cache periodically
|
|
94
|
+
* This avoids hitting the agent loader on every mention
|
|
95
|
+
*/
|
|
96
|
+
async refreshAgentCache() {
|
|
97
|
+
const now = Date.now();
|
|
98
|
+
if (now - this.lastAgentCheck < this.CACHE_TTL) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const agents = await getAvailableAgentTypes();
|
|
103
|
+
const previousCacheSize = this.agentCache.size;
|
|
104
|
+
this.agentCache.clear();
|
|
105
|
+
for (const agent of agents) {
|
|
106
|
+
this.agentCache.set(agent.agentType, true);
|
|
107
|
+
}
|
|
108
|
+
this.lastAgentCheck = now;
|
|
109
|
+
if (agents.length !== previousCacheSize) {
|
|
110
|
+
console.log("[MentionProcessor] Agent cache refreshed:", {
|
|
111
|
+
agentCount: agents.length,
|
|
112
|
+
previousCacheSize,
|
|
113
|
+
cacheAge: now - this.lastAgentCheck
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
} catch (error) {
|
|
117
|
+
console.warn("[MentionProcessor] Failed to refresh agent cache, keeping existing cache:", {
|
|
118
|
+
error: error instanceof Error ? error.message : error,
|
|
119
|
+
cacheSize: this.agentCache.size,
|
|
120
|
+
lastRefresh: new Date(this.lastAgentCheck).toISOString()
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Extract agent mentions with unified pattern matching
|
|
126
|
+
* Consolidates run-agent, agent, and ask-model detection logic
|
|
127
|
+
*/
|
|
128
|
+
extractAgentMentions(input) {
|
|
129
|
+
const mentions = [];
|
|
130
|
+
const runAgentMatches = [...input.matchAll(MentionProcessorService.MENTION_PATTERNS.runAgent)];
|
|
131
|
+
for (const match of runAgentMatches) {
|
|
132
|
+
const mention = match[1];
|
|
133
|
+
const agentType = mention.replace(/^run-agent-/, "");
|
|
134
|
+
mentions.push({ mention, agentType, isAskModel: false });
|
|
135
|
+
}
|
|
136
|
+
const agentMatches = [...input.matchAll(MentionProcessorService.MENTION_PATTERNS.agent)];
|
|
137
|
+
for (const match of agentMatches) {
|
|
138
|
+
const mention = match[1];
|
|
139
|
+
const agentType = mention.replace(/^agent-/, "");
|
|
140
|
+
mentions.push({ mention, agentType, isAskModel: false });
|
|
141
|
+
}
|
|
142
|
+
const askModelMatches = [...input.matchAll(MentionProcessorService.MENTION_PATTERNS.askModel)];
|
|
143
|
+
for (const match of askModelMatches) {
|
|
144
|
+
const mention = match[1];
|
|
145
|
+
mentions.push({ mention, agentType: mention, isAskModel: true });
|
|
146
|
+
}
|
|
147
|
+
return mentions;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Emit agent mention event with proper typing
|
|
151
|
+
* Centralized event emission to ensure consistency
|
|
152
|
+
*/
|
|
153
|
+
emitAgentMentionEvent(mention, agentType, isAskModel) {
|
|
154
|
+
try {
|
|
155
|
+
const eventData = {
|
|
156
|
+
originalMention: mention,
|
|
157
|
+
timestamp: Date.now()
|
|
158
|
+
};
|
|
159
|
+
if (isAskModel) {
|
|
160
|
+
emitReminderEvent("ask-model:mentioned", {
|
|
161
|
+
...eventData,
|
|
162
|
+
modelName: mention
|
|
163
|
+
});
|
|
164
|
+
} else {
|
|
165
|
+
emitReminderEvent("agent:mentioned", {
|
|
166
|
+
...eventData,
|
|
167
|
+
agentType
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
console.log("[MentionProcessor] Emitted mention event:", {
|
|
171
|
+
type: isAskModel ? "ask-model" : "agent",
|
|
172
|
+
mention,
|
|
173
|
+
agentType: isAskModel ? void 0 : agentType
|
|
174
|
+
});
|
|
175
|
+
} catch (error) {
|
|
176
|
+
console.error("[MentionProcessor] Failed to emit mention event:", {
|
|
177
|
+
mention,
|
|
178
|
+
agentType,
|
|
179
|
+
isAskModel,
|
|
180
|
+
error: error instanceof Error ? error.message : error
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Clear caches - useful for testing or reset
|
|
186
|
+
*/
|
|
187
|
+
clearCache() {
|
|
188
|
+
this.agentCache.clear();
|
|
189
|
+
this.lastAgentCheck = 0;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const mentionProcessor = new MentionProcessorService();
|
|
193
|
+
const processMentions = (input) => mentionProcessor.processMentions(input);
|
|
194
|
+
const clearMentionCache = () => mentionProcessor.clearCache();
|
|
195
|
+
export {
|
|
196
|
+
clearMentionCache,
|
|
197
|
+
mentionProcessor,
|
|
198
|
+
processMentions
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=mentionProcessor.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/services/mentionProcessor.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Mention Processor Service\n * Handles @agent and @file mentions through the system reminder infrastructure\n * Designed to integrate naturally with the existing event-driven architecture\n */\n\nimport { emitReminderEvent } from './systemReminder'\nimport { getAvailableAgentTypes } from '../utils/agentLoader'\nimport { existsSync } from 'fs'\nimport { resolve } from 'path'\nimport { getCwd } from '../utils/state'\n\nexport interface MentionContext {\n type: 'agent' | 'file'\n mention: string\n resolved: string\n exists: boolean\n metadata?: any\n}\n\nexport interface ProcessedMentions {\n agents: MentionContext[]\n files: MentionContext[]\n hasAgentMentions: boolean\n hasFileMentions: boolean\n}\n\nclass MentionProcessorService {\n // Centralized mention patterns - single source of truth\n private static readonly MENTION_PATTERNS = {\n runAgent: /@(run-agent-[\\w\\-]+)/g,\n agent: /@(agent-[\\w\\-]+)/g, // Legacy support\n askModel: /@(ask-[\\w\\-]+)/g,\n file: /@([a-zA-Z0-9/._-]+(?:\\.[a-zA-Z0-9]+)?)/g\n } as const\n\n private agentCache: Map<string, boolean> = new Map()\n private lastAgentCheck: number = 0\n private CACHE_TTL = 60000 // 1 minute cache\n\n /**\n * Process mentions in user input and emit appropriate events\n * This follows the event-driven philosophy of system reminders\n */\n public async processMentions(input: string): Promise<ProcessedMentions> {\n const result: ProcessedMentions = {\n agents: [],\n files: [],\n hasAgentMentions: false,\n hasFileMentions: false,\n }\n\n try {\n\n // Process agent mentions with unified logic to eliminate code duplication\n const agentMentions = this.extractAgentMentions(input)\n if (agentMentions.length > 0) {\n await this.refreshAgentCache()\n \n for (const { mention, agentType, isAskModel } of agentMentions) {\n if (isAskModel || this.agentCache.has(agentType)) {\n result.agents.push({\n type: 'agent',\n mention,\n resolved: agentType,\n exists: true,\n metadata: isAskModel ? { type: 'ask-model' } : undefined\n })\n result.hasAgentMentions = true\n \n // Emit appropriate event based on mention type\n this.emitAgentMentionEvent(mention, agentType, isAskModel)\n }\n }\n }\n \n // No longer process @xxx format - treat as regular text (emails, etc.)\n\n // Process file mentions (exclude agent and ask-model mentions)\n const fileMatches = [...input.matchAll(MentionProcessorService.MENTION_PATTERNS.file)]\n const processedAgentMentions = new Set(agentMentions.map(am => am.mention))\n \n for (const match of fileMatches) {\n const mention = match[1]\n \n // Skip if this is an agent or ask-model mention (already processed)\n if (mention.startsWith('run-agent-') || mention.startsWith('agent-') || mention.startsWith('ask-') || processedAgentMentions.has(mention)) {\n continue\n }\n \n // Check if it's a file\n const filePath = this.resolveFilePath(mention)\n if (existsSync(filePath)) {\n result.files.push({\n type: 'file',\n mention,\n resolved: filePath,\n exists: true,\n })\n result.hasFileMentions = true\n \n // Emit file mention event for system reminder to handle\n emitReminderEvent('file:mentioned', {\n filePath: filePath,\n originalMention: mention,\n timestamp: Date.now(),\n })\n }\n }\n\n return result\n } catch (error) {\n console.warn('[MentionProcessor] Failed to process mentions:', {\n input: input.substring(0, 100) + (input.length > 100 ? '...' : ''),\n error: error instanceof Error ? error.message : error\n })\n \n // Return empty result on error to maintain system stability\n return {\n agents: [],\n files: [],\n hasAgentMentions: false,\n hasFileMentions: false,\n }\n }\n }\n\n // Removed identifyMention method as it's no longer needed with separate processing\n\n /**\n * Resolve file path relative to current working directory\n */\n private resolveFilePath(mention: string): string {\n // Simple consistent logic: mention is always relative to current directory\n return resolve(getCwd(), mention)\n }\n\n /**\n * Refresh the agent cache periodically\n * This avoids hitting the agent loader on every mention\n */\n private async refreshAgentCache(): Promise<void> {\n const now = Date.now()\n if (now - this.lastAgentCheck < this.CACHE_TTL) {\n return // Cache is still fresh\n }\n\n try {\n const agents = await getAvailableAgentTypes()\n const previousCacheSize = this.agentCache.size\n this.agentCache.clear()\n \n for (const agent of agents) {\n // Store only the agent type without prefix for consistent lookup\n this.agentCache.set(agent.agentType, true)\n }\n \n this.lastAgentCheck = now\n \n // Log cache refresh for debugging mention resolution issues\n if (agents.length !== previousCacheSize) {\n console.log('[MentionProcessor] Agent cache refreshed:', {\n agentCount: agents.length,\n previousCacheSize,\n cacheAge: now - this.lastAgentCheck\n })\n }\n } catch (error) {\n console.warn('[MentionProcessor] Failed to refresh agent cache, keeping existing cache:', {\n error: error instanceof Error ? error.message : error,\n cacheSize: this.agentCache.size,\n lastRefresh: new Date(this.lastAgentCheck).toISOString()\n })\n // Keep existing cache on error to maintain functionality\n }\n }\n\n /**\n * Extract agent mentions with unified pattern matching\n * Consolidates run-agent, agent, and ask-model detection logic\n */\n private extractAgentMentions(input: string): Array<{ mention: string; agentType: string; isAskModel: boolean }> {\n const mentions: Array<{ mention: string; agentType: string; isAskModel: boolean }> = []\n \n // Process @run-agent-xxx format (preferred)\n const runAgentMatches = [...input.matchAll(MentionProcessorService.MENTION_PATTERNS.runAgent)]\n for (const match of runAgentMatches) {\n const mention = match[1]\n const agentType = mention.replace(/^run-agent-/, '')\n mentions.push({ mention, agentType, isAskModel: false })\n }\n \n // Process @agent-xxx format (legacy)\n const agentMatches = [...input.matchAll(MentionProcessorService.MENTION_PATTERNS.agent)]\n for (const match of agentMatches) {\n const mention = match[1]\n const agentType = mention.replace(/^agent-/, '')\n mentions.push({ mention, agentType, isAskModel: false })\n }\n \n // Process @ask-model mentions\n const askModelMatches = [...input.matchAll(MentionProcessorService.MENTION_PATTERNS.askModel)]\n for (const match of askModelMatches) {\n const mention = match[1]\n mentions.push({ mention, agentType: mention, isAskModel: true })\n }\n \n return mentions\n }\n \n /**\n * Emit agent mention event with proper typing\n * Centralized event emission to ensure consistency\n */\n private emitAgentMentionEvent(mention: string, agentType: string, isAskModel: boolean): void {\n try {\n const eventData = {\n originalMention: mention,\n timestamp: Date.now(),\n }\n\n if (isAskModel) {\n emitReminderEvent('ask-model:mentioned', {\n ...eventData,\n modelName: mention,\n })\n } else {\n emitReminderEvent('agent:mentioned', {\n ...eventData,\n agentType,\n })\n }\n \n // Debug log for mention event emission tracking\n console.log('[MentionProcessor] Emitted mention event:', {\n type: isAskModel ? 'ask-model' : 'agent',\n mention,\n agentType: isAskModel ? undefined : agentType\n })\n } catch (error) {\n console.error('[MentionProcessor] Failed to emit mention event:', {\n mention,\n agentType,\n isAskModel,\n error: error instanceof Error ? error.message : error\n })\n }\n }\n\n /**\n * Clear caches - useful for testing or reset\n */\n public clearCache(): void {\n this.agentCache.clear()\n this.lastAgentCheck = 0\n }\n}\n\n// Export singleton instance\nexport const mentionProcessor = new MentionProcessorService()\n\n/**\n * Process mentions in user input\n * This is the main API for the mention processor\n */\nexport const processMentions = (input: string) => \n mentionProcessor.processMentions(input)\n\n/**\n * Clear mention processor caches\n */\nexport const clearMentionCache = () =>\n mentionProcessor.clearCache()"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ResponsesAPIAdapter } from "./adapters/responsesAPI.js";
|
|
2
|
+
import { ChatCompletionsAdapter } from "./adapters/chatCompletions.js";
|
|
3
|
+
import { getModelCapabilities } from "../constants/modelCapabilities.js";
|
|
4
|
+
class ModelAdapterFactory {
|
|
5
|
+
/**
|
|
6
|
+
* Create appropriate adapter based on model configuration
|
|
7
|
+
*/
|
|
8
|
+
static createAdapter(modelProfile) {
|
|
9
|
+
const capabilities = getModelCapabilities(modelProfile.modelName);
|
|
10
|
+
const apiType = this.determineAPIType(modelProfile, capabilities);
|
|
11
|
+
switch (apiType) {
|
|
12
|
+
case "responses_api":
|
|
13
|
+
return new ResponsesAPIAdapter(capabilities, modelProfile);
|
|
14
|
+
case "chat_completions":
|
|
15
|
+
default:
|
|
16
|
+
return new ChatCompletionsAdapter(capabilities, modelProfile);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Determine which API should be used
|
|
21
|
+
*/
|
|
22
|
+
static determineAPIType(modelProfile, capabilities) {
|
|
23
|
+
if (capabilities.apiArchitecture.primary !== "responses_api") {
|
|
24
|
+
return "chat_completions";
|
|
25
|
+
}
|
|
26
|
+
const isOfficialOpenAI = !modelProfile.baseURL || modelProfile.baseURL.includes("api.openai.com");
|
|
27
|
+
if (!isOfficialOpenAI) {
|
|
28
|
+
if (capabilities.apiArchitecture.fallback === "chat_completions") {
|
|
29
|
+
return "chat_completions";
|
|
30
|
+
}
|
|
31
|
+
return capabilities.apiArchitecture.primary;
|
|
32
|
+
}
|
|
33
|
+
return capabilities.apiArchitecture.primary;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if model should use Responses API
|
|
37
|
+
*/
|
|
38
|
+
static shouldUseResponsesAPI(modelProfile) {
|
|
39
|
+
const capabilities = getModelCapabilities(modelProfile.modelName);
|
|
40
|
+
const apiType = this.determineAPIType(modelProfile, capabilities);
|
|
41
|
+
return apiType === "responses_api";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
ModelAdapterFactory
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=modelAdapterFactory.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/services/modelAdapterFactory.ts"],
|
|
4
|
+
"sourcesContent": ["import { ModelAPIAdapter } from './adapters/base'\nimport { ResponsesAPIAdapter } from './adapters/responsesAPI'\nimport { ChatCompletionsAdapter } from './adapters/chatCompletions'\nimport { getModelCapabilities } from '../constants/modelCapabilities'\nimport { ModelProfile, getGlobalConfig } from '../utils/config'\nimport { ModelCapabilities } from '../types/modelCapabilities'\n\nexport class ModelAdapterFactory {\n /**\n * Create appropriate adapter based on model configuration\n */\n static createAdapter(modelProfile: ModelProfile): ModelAPIAdapter {\n const capabilities = getModelCapabilities(modelProfile.modelName)\n \n // Determine which API to use\n const apiType = this.determineAPIType(modelProfile, capabilities)\n \n // Create corresponding adapter\n switch (apiType) {\n case 'responses_api':\n return new ResponsesAPIAdapter(capabilities, modelProfile)\n case 'chat_completions':\n default:\n return new ChatCompletionsAdapter(capabilities, modelProfile)\n }\n }\n \n /**\n * Determine which API should be used\n */\n private static determineAPIType(\n modelProfile: ModelProfile,\n capabilities: ModelCapabilities\n ): 'responses_api' | 'chat_completions' {\n // If model doesn't support Responses API, use Chat Completions directly\n if (capabilities.apiArchitecture.primary !== 'responses_api') {\n return 'chat_completions'\n }\n \n // Check if this is official OpenAI endpoint\n const isOfficialOpenAI = !modelProfile.baseURL || \n modelProfile.baseURL.includes('api.openai.com')\n \n // Non-official endpoints use Chat Completions (even if model supports Responses API)\n if (!isOfficialOpenAI) {\n // If there's a fallback option, use fallback\n if (capabilities.apiArchitecture.fallback === 'chat_completions') {\n return 'chat_completions'\n }\n // Otherwise use primary (might fail, but let it try)\n return capabilities.apiArchitecture.primary\n }\n \n // For now, always use Responses API for supported models when on official endpoint\n // Streaming fallback will be handled at runtime if needed\n \n // Use primary API type\n return capabilities.apiArchitecture.primary\n }\n \n /**\n * Check if model should use Responses API\n */\n static shouldUseResponsesAPI(modelProfile: ModelProfile): boolean {\n const capabilities = getModelCapabilities(modelProfile.modelName)\n const apiType = this.determineAPIType(modelProfile, capabilities)\n return apiType === 'responses_api'\n }\n}"],
|
|
5
|
+
"mappings": "AACA,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AACvC,SAAS,4BAA4B;AAI9B,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA,EAI/B,OAAO,cAAc,cAA6C;AAChE,UAAM,eAAe,qBAAqB,aAAa,SAAS;AAGhE,UAAM,UAAU,KAAK,iBAAiB,cAAc,YAAY;AAGhE,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,eAAO,IAAI,oBAAoB,cAAc,YAAY;AAAA,MAC3D,KAAK;AAAA,MACL;AACE,eAAO,IAAI,uBAAuB,cAAc,YAAY;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,iBACb,cACA,cACsC;AAEtC,QAAI,aAAa,gBAAgB,YAAY,iBAAiB;AAC5D,aAAO;AAAA,IACT;AAGA,UAAM,mBAAmB,CAAC,aAAa,WACrC,aAAa,QAAQ,SAAS,gBAAgB;AAGhD,QAAI,CAAC,kBAAkB;AAErB,UAAI,aAAa,gBAAgB,aAAa,oBAAoB;AAChE,eAAO;AAAA,MACT;AAEA,aAAO,aAAa,gBAAgB;AAAA,IACtC;AAMA,WAAO,aAAa,gBAAgB;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,sBAAsB,cAAqC;AAChE,UAAM,eAAe,qBAAqB,aAAa,SAAS;AAChE,UAAM,UAAU,KAAK,iBAAiB,cAAc,YAAY;AAChE,WAAO,YAAY;AAAA,EACrB;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { getGlobalConfig } from "../utils/config.js";
|
|
2
|
+
function sendITerm2Notification({ message, title }) {
|
|
3
|
+
const displayString = title ? `${title}:
|
|
4
|
+
${message}` : message;
|
|
5
|
+
try {
|
|
6
|
+
process.stdout.write(`\x1B]9;
|
|
7
|
+
|
|
8
|
+
${displayString}\x07`);
|
|
9
|
+
} catch {
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function sendTerminalBell() {
|
|
13
|
+
process.stdout.write("\x07");
|
|
14
|
+
}
|
|
15
|
+
async function sendNotification(notif) {
|
|
16
|
+
const channel = getGlobalConfig().preferredNotifChannel;
|
|
17
|
+
switch (channel) {
|
|
18
|
+
case "iterm2":
|
|
19
|
+
sendITerm2Notification(notif);
|
|
20
|
+
break;
|
|
21
|
+
case "terminal_bell":
|
|
22
|
+
sendTerminalBell();
|
|
23
|
+
break;
|
|
24
|
+
case "iterm2_with_bell":
|
|
25
|
+
sendITerm2Notification(notif);
|
|
26
|
+
sendTerminalBell();
|
|
27
|
+
break;
|
|
28
|
+
case "notifications_disabled":
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
sendNotification
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=notifier.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/services/notifier.ts"],
|
|
4
|
+
"sourcesContent": ["import { getGlobalConfig } from '../utils/config'\n\nexport type NotificationOptions = {\n message: string\n title?: string\n}\n\nfunction sendITerm2Notification({ message, title }: NotificationOptions): void {\n const displayString = title ? `${title}:\\n${message}` : message\n try {\n process.stdout.write(`\\x1b]9;\\n\\n${displayString}\\x07`)\n } catch {\n // Ignore errors\n }\n}\n\nfunction sendTerminalBell(): void {\n process.stdout.write('\\x07')\n}\n\nexport async function sendNotification(\n notif: NotificationOptions,\n): Promise<void> {\n const channel = getGlobalConfig().preferredNotifChannel\n switch (channel) {\n case 'iterm2':\n sendITerm2Notification(notif)\n break\n case 'terminal_bell':\n sendTerminalBell()\n break\n case 'iterm2_with_bell':\n sendITerm2Notification(notif)\n sendTerminalBell()\n break\n case 'notifications_disabled':\n // Do nothing\n break\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,uBAAuB;AAOhC,SAAS,uBAAuB,EAAE,SAAS,MAAM,GAA8B;AAC7E,QAAM,gBAAgB,QAAQ,GAAG,KAAK;AAAA,EAAM,OAAO,KAAK;AACxD,MAAI;AACF,YAAQ,OAAO,MAAM;AAAA;AAAA,EAAc,aAAa,MAAM;AAAA,EACxD,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,mBAAyB;AAChC,UAAQ,OAAO,MAAM,MAAM;AAC7B;AAEA,eAAsB,iBACpB,OACe;AACf,QAAM,UAAU,gBAAgB,EAAE;AAClC,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,6BAAuB,KAAK;AAC5B;AAAA,IACF,KAAK;AACH,uBAAiB;AACjB;AAAA,IACF,KAAK;AACH,6BAAuB,KAAK;AAC5B,uBAAiB;AACjB;AAAA,IACF,KAAK;AAEH;AAAA,EACJ;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import * as crypto from "crypto";
|
|
2
|
+
import * as http from "http";
|
|
3
|
+
import * as url from "url";
|
|
4
|
+
import { OAUTH_CONFIG } from "../constants/oauth.js";
|
|
5
|
+
import { openBrowser } from "../utils/browser.js";
|
|
6
|
+
import { logEvent } from "../services/statsig.js";
|
|
7
|
+
import { logError } from "../utils/log.js";
|
|
8
|
+
import { resetAnthropicClient } from "./claude.js";
|
|
9
|
+
import {
|
|
10
|
+
getGlobalConfig,
|
|
11
|
+
saveGlobalConfig,
|
|
12
|
+
normalizeApiKeyForConfig
|
|
13
|
+
} from "../utils/config.js";
|
|
14
|
+
function base64URLEncode(buffer) {
|
|
15
|
+
return buffer.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
16
|
+
}
|
|
17
|
+
function generateCodeVerifier() {
|
|
18
|
+
return base64URLEncode(crypto.randomBytes(32));
|
|
19
|
+
}
|
|
20
|
+
async function generateCodeChallenge(verifier) {
|
|
21
|
+
const encoder = new TextEncoder();
|
|
22
|
+
const data = encoder.encode(verifier);
|
|
23
|
+
const digest = await crypto.subtle.digest("SHA-256", data);
|
|
24
|
+
return base64URLEncode(Buffer.from(digest));
|
|
25
|
+
}
|
|
26
|
+
class OAuthService {
|
|
27
|
+
server = null;
|
|
28
|
+
codeVerifier;
|
|
29
|
+
expectedState = null;
|
|
30
|
+
pendingCodePromise = null;
|
|
31
|
+
constructor() {
|
|
32
|
+
this.codeVerifier = generateCodeVerifier();
|
|
33
|
+
}
|
|
34
|
+
generateAuthUrls(codeChallenge, state) {
|
|
35
|
+
function makeUrl(isManual) {
|
|
36
|
+
const authUrl = new URL(OAUTH_CONFIG.AUTHORIZE_URL);
|
|
37
|
+
authUrl.searchParams.append("client_id", OAUTH_CONFIG.CLIENT_ID);
|
|
38
|
+
authUrl.searchParams.append("response_type", "code");
|
|
39
|
+
authUrl.searchParams.append(
|
|
40
|
+
"redirect_uri",
|
|
41
|
+
isManual ? OAUTH_CONFIG.MANUAL_REDIRECT_URL : `http://localhost:${OAUTH_CONFIG.REDIRECT_PORT}/callback`
|
|
42
|
+
);
|
|
43
|
+
authUrl.searchParams.append("scope", OAUTH_CONFIG.SCOPES.join(" "));
|
|
44
|
+
authUrl.searchParams.append("code_challenge", codeChallenge);
|
|
45
|
+
authUrl.searchParams.append("code_challenge_method", "S256");
|
|
46
|
+
authUrl.searchParams.append("state", state);
|
|
47
|
+
return authUrl.toString();
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
autoUrl: makeUrl(false),
|
|
51
|
+
manualUrl: makeUrl(true)
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async startOAuthFlow(authURLHandler) {
|
|
55
|
+
const codeChallenge = await generateCodeChallenge(this.codeVerifier);
|
|
56
|
+
const state = base64URLEncode(crypto.randomBytes(32));
|
|
57
|
+
this.expectedState = state;
|
|
58
|
+
const { autoUrl, manualUrl } = this.generateAuthUrls(codeChallenge, state);
|
|
59
|
+
const onReady = async () => {
|
|
60
|
+
await authURLHandler(manualUrl);
|
|
61
|
+
await openBrowser(autoUrl);
|
|
62
|
+
};
|
|
63
|
+
const { authorizationCode, useManualRedirect } = await new Promise((resolve, reject) => {
|
|
64
|
+
this.pendingCodePromise = { resolve, reject };
|
|
65
|
+
this.startLocalServer(state, onReady);
|
|
66
|
+
});
|
|
67
|
+
const {
|
|
68
|
+
access_token: accessToken,
|
|
69
|
+
account,
|
|
70
|
+
organization
|
|
71
|
+
} = await this.exchangeCodeForTokens(
|
|
72
|
+
authorizationCode,
|
|
73
|
+
state,
|
|
74
|
+
useManualRedirect
|
|
75
|
+
);
|
|
76
|
+
if (account) {
|
|
77
|
+
const accountInfo = {
|
|
78
|
+
accountUuid: account.uuid,
|
|
79
|
+
emailAddress: account.email_address,
|
|
80
|
+
organizationUuid: organization?.uuid
|
|
81
|
+
};
|
|
82
|
+
const config = getGlobalConfig();
|
|
83
|
+
config.oauthAccount = accountInfo;
|
|
84
|
+
saveGlobalConfig(config);
|
|
85
|
+
}
|
|
86
|
+
return { accessToken };
|
|
87
|
+
}
|
|
88
|
+
startLocalServer(state, onReady) {
|
|
89
|
+
if (this.server) {
|
|
90
|
+
this.closeServer();
|
|
91
|
+
}
|
|
92
|
+
this.server = http.createServer(
|
|
93
|
+
(req, res) => {
|
|
94
|
+
const parsedUrl = url.parse(req.url || "", true);
|
|
95
|
+
if (parsedUrl.pathname === "/callback") {
|
|
96
|
+
const authorizationCode = parsedUrl.query.code;
|
|
97
|
+
const returnedState = parsedUrl.query.state;
|
|
98
|
+
if (!authorizationCode) {
|
|
99
|
+
res.writeHead(400);
|
|
100
|
+
res.end("Authorization code not found");
|
|
101
|
+
if (this.pendingCodePromise) {
|
|
102
|
+
this.pendingCodePromise.reject(
|
|
103
|
+
new Error("No authorization code received")
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (returnedState !== state) {
|
|
109
|
+
res.writeHead(400);
|
|
110
|
+
res.end("Invalid state parameter");
|
|
111
|
+
if (this.pendingCodePromise) {
|
|
112
|
+
this.pendingCodePromise.reject(
|
|
113
|
+
new Error("Invalid state parameter")
|
|
114
|
+
// Possible CSRF attack
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
res.writeHead(302, {
|
|
120
|
+
Location: OAUTH_CONFIG.SUCCESS_URL
|
|
121
|
+
});
|
|
122
|
+
res.end();
|
|
123
|
+
logEvent("tengu_oauth_automatic_redirect", {});
|
|
124
|
+
this.processCallback({
|
|
125
|
+
authorizationCode,
|
|
126
|
+
state,
|
|
127
|
+
useManualRedirect: false
|
|
128
|
+
});
|
|
129
|
+
} else {
|
|
130
|
+
res.writeHead(404);
|
|
131
|
+
res.end();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
);
|
|
135
|
+
this.server.listen(OAUTH_CONFIG.REDIRECT_PORT, async () => {
|
|
136
|
+
onReady?.();
|
|
137
|
+
});
|
|
138
|
+
this.server.on("error", (err) => {
|
|
139
|
+
const portError = err;
|
|
140
|
+
if (portError.code === "EADDRINUSE") {
|
|
141
|
+
const error = new Error(
|
|
142
|
+
`Port ${OAUTH_CONFIG.REDIRECT_PORT} is already in use. Please ensure no other applications are using this port.`
|
|
143
|
+
);
|
|
144
|
+
logError(error);
|
|
145
|
+
this.closeServer();
|
|
146
|
+
if (this.pendingCodePromise) {
|
|
147
|
+
this.pendingCodePromise.reject(error);
|
|
148
|
+
}
|
|
149
|
+
return;
|
|
150
|
+
} else {
|
|
151
|
+
logError(err);
|
|
152
|
+
this.closeServer();
|
|
153
|
+
if (this.pendingCodePromise) {
|
|
154
|
+
this.pendingCodePromise.reject(err);
|
|
155
|
+
}
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
async exchangeCodeForTokens(authorizationCode, state, useManualRedirect = false) {
|
|
161
|
+
const requestBody = {
|
|
162
|
+
grant_type: "authorization_code",
|
|
163
|
+
code: authorizationCode,
|
|
164
|
+
redirect_uri: useManualRedirect ? OAUTH_CONFIG.MANUAL_REDIRECT_URL : `http://localhost:${OAUTH_CONFIG.REDIRECT_PORT}/callback`,
|
|
165
|
+
client_id: OAUTH_CONFIG.CLIENT_ID,
|
|
166
|
+
code_verifier: this.codeVerifier,
|
|
167
|
+
state
|
|
168
|
+
};
|
|
169
|
+
const response = await fetch(OAUTH_CONFIG.TOKEN_URL, {
|
|
170
|
+
method: "POST",
|
|
171
|
+
headers: {
|
|
172
|
+
"Content-Type": "application/json"
|
|
173
|
+
},
|
|
174
|
+
body: JSON.stringify(requestBody)
|
|
175
|
+
});
|
|
176
|
+
if (!response.ok) {
|
|
177
|
+
throw new Error(`Token exchange failed: ${response.statusText}`);
|
|
178
|
+
}
|
|
179
|
+
const data = await response.json();
|
|
180
|
+
return data;
|
|
181
|
+
}
|
|
182
|
+
processCallback({
|
|
183
|
+
authorizationCode,
|
|
184
|
+
state,
|
|
185
|
+
useManualRedirect
|
|
186
|
+
}) {
|
|
187
|
+
this.closeServer();
|
|
188
|
+
if (state !== this.expectedState) {
|
|
189
|
+
if (this.pendingCodePromise) {
|
|
190
|
+
this.pendingCodePromise.reject(
|
|
191
|
+
new Error("Invalid state parameter")
|
|
192
|
+
// Possible CSRF attack
|
|
193
|
+
);
|
|
194
|
+
this.pendingCodePromise = null;
|
|
195
|
+
}
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (this.pendingCodePromise) {
|
|
199
|
+
this.pendingCodePromise.resolve({ authorizationCode, useManualRedirect });
|
|
200
|
+
this.pendingCodePromise = null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
closeServer() {
|
|
204
|
+
if (this.server) {
|
|
205
|
+
this.server.close();
|
|
206
|
+
this.server = null;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async function createAndStoreApiKey(accessToken) {
|
|
211
|
+
try {
|
|
212
|
+
const createApiKeyResp = await fetch(OAUTH_CONFIG.API_KEY_URL, {
|
|
213
|
+
method: "POST",
|
|
214
|
+
headers: { Authorization: `Bearer ${accessToken}` }
|
|
215
|
+
});
|
|
216
|
+
let apiKeyData;
|
|
217
|
+
let errorText = "";
|
|
218
|
+
try {
|
|
219
|
+
apiKeyData = await createApiKeyResp.json();
|
|
220
|
+
} catch (_e) {
|
|
221
|
+
errorText = await createApiKeyResp.text();
|
|
222
|
+
}
|
|
223
|
+
logEvent("tengu_oauth_api_key", {
|
|
224
|
+
status: createApiKeyResp.ok ? "success" : "failure",
|
|
225
|
+
statusCode: createApiKeyResp.status.toString(),
|
|
226
|
+
error: createApiKeyResp.ok ? "" : errorText || JSON.stringify(apiKeyData)
|
|
227
|
+
});
|
|
228
|
+
if (createApiKeyResp.ok && apiKeyData && apiKeyData.raw_key) {
|
|
229
|
+
const apiKey = apiKeyData.raw_key;
|
|
230
|
+
const config = getGlobalConfig();
|
|
231
|
+
if (!config.customApiKeyResponses) {
|
|
232
|
+
config.customApiKeyResponses = { approved: [], rejected: [] };
|
|
233
|
+
}
|
|
234
|
+
if (!config.customApiKeyResponses.approved) {
|
|
235
|
+
config.customApiKeyResponses.approved = [];
|
|
236
|
+
}
|
|
237
|
+
const normalizedKey = normalizeApiKeyForConfig(apiKey);
|
|
238
|
+
if (!config.customApiKeyResponses.approved.includes(normalizedKey)) {
|
|
239
|
+
config.customApiKeyResponses.approved.push(normalizedKey);
|
|
240
|
+
}
|
|
241
|
+
saveGlobalConfig(config);
|
|
242
|
+
resetAnthropicClient();
|
|
243
|
+
return apiKey;
|
|
244
|
+
}
|
|
245
|
+
return null;
|
|
246
|
+
} catch (error) {
|
|
247
|
+
logEvent("tengu_oauth_api_key", {
|
|
248
|
+
status: "failure",
|
|
249
|
+
statusCode: "exception",
|
|
250
|
+
error: error instanceof Error ? error.message : String(error)
|
|
251
|
+
});
|
|
252
|
+
throw error;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
export {
|
|
256
|
+
OAuthService,
|
|
257
|
+
createAndStoreApiKey
|
|
258
|
+
};
|
|
259
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/services/oauth.ts"],
|
|
4
|
+
"sourcesContent": ["import * as crypto from 'crypto'\nimport * as http from 'http'\nimport { IncomingMessage, ServerResponse } from 'http'\nimport * as url from 'url'\n\nimport { OAUTH_CONFIG } from '../constants/oauth'\nimport { openBrowser } from '../utils/browser'\nimport { logEvent } from '../services/statsig'\nimport { logError } from '../utils/log'\nimport { resetAnthropicClient } from './claude'\nimport {\n AccountInfo,\n getGlobalConfig,\n saveGlobalConfig,\n normalizeApiKeyForConfig,\n} from '../utils/config.js'\n\n// Base64URL encoding function (RFC 4648)\nfunction base64URLEncode(buffer: Buffer): string {\n return buffer\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '')\n}\n\nfunction generateCodeVerifier(): string {\n return base64URLEncode(crypto.randomBytes(32))\n}\n\nasync function generateCodeChallenge(verifier: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(verifier)\n const digest = await crypto.subtle.digest('SHA-256', data)\n return base64URLEncode(Buffer.from(digest))\n}\n\ntype OAuthTokenExchangeResponse = {\n access_token: string\n account?: {\n uuid: string\n email_address: string\n }\n organization?: {\n uuid: string\n name: string\n }\n}\n\nexport type OAuthResult = {\n accessToken: string\n}\n\nexport class OAuthService {\n private server: http.Server | null = null\n private codeVerifier: string\n private expectedState: string | null = null\n private pendingCodePromise: {\n resolve: (result: {\n authorizationCode: string\n useManualRedirect: boolean\n }) => void\n reject: (err: Error) => void\n } | null = null\n\n constructor() {\n this.codeVerifier = generateCodeVerifier()\n }\n\n private generateAuthUrls(\n codeChallenge: string,\n state: string,\n ): { autoUrl: string; manualUrl: string } {\n function makeUrl(isManual: boolean): string {\n const authUrl = new URL(OAUTH_CONFIG.AUTHORIZE_URL)\n authUrl.searchParams.append('client_id', OAUTH_CONFIG.CLIENT_ID)\n authUrl.searchParams.append('response_type', 'code')\n authUrl.searchParams.append(\n 'redirect_uri',\n isManual\n ? OAUTH_CONFIG.MANUAL_REDIRECT_URL\n : `http://localhost:${OAUTH_CONFIG.REDIRECT_PORT}/callback`,\n )\n authUrl.searchParams.append('scope', OAUTH_CONFIG.SCOPES.join(' '))\n authUrl.searchParams.append('code_challenge', codeChallenge)\n authUrl.searchParams.append('code_challenge_method', 'S256')\n authUrl.searchParams.append('state', state)\n return authUrl.toString()\n }\n\n return {\n autoUrl: makeUrl(false),\n manualUrl: makeUrl(true),\n }\n }\n\n async startOAuthFlow(\n authURLHandler: (url: string) => Promise<void>,\n ): Promise<OAuthResult> {\n const codeChallenge = await generateCodeChallenge(this.codeVerifier)\n const state = base64URLEncode(crypto.randomBytes(32))\n this.expectedState = state\n const { autoUrl, manualUrl } = this.generateAuthUrls(codeChallenge, state)\n\n const onReady = async () => {\n await authURLHandler(manualUrl)\n await openBrowser(autoUrl)\n }\n\n const { authorizationCode, useManualRedirect } = await new Promise<{\n authorizationCode: string\n useManualRedirect: boolean\n }>((resolve, reject) => {\n this.pendingCodePromise = { resolve, reject }\n this.startLocalServer(state, onReady)\n })\n\n // Exchange code for tokens\n const {\n access_token: accessToken,\n account,\n organization,\n } = await this.exchangeCodeForTokens(\n authorizationCode,\n state,\n useManualRedirect,\n )\n\n // Store account info\n if (account) {\n const accountInfo: AccountInfo = {\n accountUuid: account.uuid,\n emailAddress: account.email_address,\n organizationUuid: organization?.uuid,\n }\n const config = getGlobalConfig()\n config.oauthAccount = accountInfo\n saveGlobalConfig(config)\n }\n\n return { accessToken }\n }\n\n private startLocalServer(state: string, onReady?: () => void): void {\n if (this.server) {\n this.closeServer()\n }\n this.server = http.createServer(\n (req: IncomingMessage, res: ServerResponse) => {\n const parsedUrl = url.parse(req.url || '', true)\n\n if (parsedUrl.pathname === '/callback') {\n const authorizationCode = parsedUrl.query.code as string\n const returnedState = parsedUrl.query.state as string\n\n if (!authorizationCode) {\n res.writeHead(400)\n res.end('Authorization code not found')\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(\n new Error('No authorization code received'),\n )\n }\n return\n }\n\n if (returnedState !== state) {\n res.writeHead(400)\n res.end('Invalid state parameter')\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(\n new Error('Invalid state parameter'), // Possible CSRF attack\n )\n }\n return\n }\n\n res.writeHead(302, {\n Location: OAUTH_CONFIG.SUCCESS_URL,\n })\n res.end()\n\n // Track which path the user is taking (automatic browser redirect)\n logEvent('tengu_oauth_automatic_redirect', {})\n\n this.processCallback({\n authorizationCode,\n state,\n useManualRedirect: false,\n })\n } else {\n res.writeHead(404)\n res.end()\n }\n },\n )\n\n this.server.listen(OAUTH_CONFIG.REDIRECT_PORT, async () => {\n onReady?.()\n })\n\n this.server.on('error', (err: Error) => {\n const portError = err as NodeJS.ErrnoException\n if (portError.code === 'EADDRINUSE') {\n const error = new Error(\n `Port ${OAUTH_CONFIG.REDIRECT_PORT} is already in use. Please ensure no other applications are using this port.`,\n )\n logError(error)\n this.closeServer()\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(error)\n }\n return\n } else {\n logError(err)\n this.closeServer()\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(err)\n }\n return\n }\n })\n }\n\n private async exchangeCodeForTokens(\n authorizationCode: string,\n state: string,\n useManualRedirect: boolean = false,\n ): Promise<OAuthTokenExchangeResponse> {\n const requestBody = {\n grant_type: 'authorization_code',\n code: authorizationCode,\n redirect_uri: useManualRedirect\n ? OAUTH_CONFIG.MANUAL_REDIRECT_URL\n : `http://localhost:${OAUTH_CONFIG.REDIRECT_PORT}/callback`,\n client_id: OAUTH_CONFIG.CLIENT_ID,\n code_verifier: this.codeVerifier,\n state,\n }\n\n const response = await fetch(OAUTH_CONFIG.TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n throw new Error(`Token exchange failed: ${response.statusText}`)\n }\n\n const data = await response.json()\n return data\n }\n\n processCallback({\n authorizationCode,\n state,\n useManualRedirect,\n }: {\n authorizationCode: string\n state: string\n useManualRedirect: boolean\n }): void {\n this.closeServer()\n\n if (state !== this.expectedState) {\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(\n new Error('Invalid state parameter'), // Possible CSRF attack\n )\n this.pendingCodePromise = null\n }\n return\n }\n\n if (this.pendingCodePromise) {\n this.pendingCodePromise.resolve({ authorizationCode, useManualRedirect })\n this.pendingCodePromise = null\n }\n }\n\n private closeServer(): void {\n if (this.server) {\n this.server.close()\n this.server = null\n }\n }\n}\n\nexport async function createAndStoreApiKey(\n accessToken: string,\n): Promise<string | null> {\n try {\n // Call create_api_key endpoint\n const createApiKeyResp = await fetch(OAUTH_CONFIG.API_KEY_URL, {\n method: 'POST',\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n\n let apiKeyData\n let errorText = ''\n\n try {\n apiKeyData = await createApiKeyResp.json()\n } catch (_e) {\n // If response is not valid JSON, get as text for error logging\n errorText = await createApiKeyResp.text()\n }\n\n logEvent('tengu_oauth_api_key', {\n status: createApiKeyResp.ok ? 'success' : 'failure',\n statusCode: createApiKeyResp.status.toString(),\n error: createApiKeyResp.ok ? '' : errorText || JSON.stringify(apiKeyData),\n })\n\n if (createApiKeyResp.ok && apiKeyData && apiKeyData.raw_key) {\n const apiKey = apiKeyData.raw_key\n\n // Store in global config\n const config = getGlobalConfig()\n\n // Note: API key is now managed per model profile\n\n // Add to approved list\n if (!config.customApiKeyResponses) {\n config.customApiKeyResponses = { approved: [], rejected: [] }\n }\n if (!config.customApiKeyResponses.approved) {\n config.customApiKeyResponses.approved = []\n }\n\n const normalizedKey = normalizeApiKeyForConfig(apiKey)\n if (!config.customApiKeyResponses.approved.includes(normalizedKey)) {\n config.customApiKeyResponses.approved.push(normalizedKey)\n }\n\n // Save config\n saveGlobalConfig(config)\n\n // Reset the Anthropic client to force creation with new API key\n resetAnthropicClient()\n\n return apiKey\n }\n\n return null\n } catch (error) {\n logEvent('tengu_oauth_api_key', {\n status: 'failure',\n statusCode: 'exception',\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|