@umsai/ums-code 0.3.0-v2 → 0.6.0-v1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +6 -6
- package/dist/src/{zed-integration → acp-integration}/acp.d.ts +13 -0
- package/dist/src/{zed-integration → acp-integration}/acp.js +32 -0
- package/dist/src/acp-integration/acp.js.map +1 -0
- package/dist/src/acp-integration/acpAgent.d.ts +10 -0
- package/dist/src/acp-integration/acpAgent.js +264 -0
- package/dist/src/acp-integration/acpAgent.js.map +1 -0
- package/dist/src/{zed-integration → acp-integration}/schema.d.ts +2235 -905
- package/dist/src/{zed-integration → acp-integration}/schema.js +100 -2
- package/dist/src/acp-integration/schema.js.map +1 -0
- package/dist/src/{zed-integration/fileSystemService.d.ts → acp-integration/service/filesystem.d.ts} +1 -1
- package/dist/src/{zed-integration/fileSystemService.js → acp-integration/service/filesystem.js} +14 -1
- package/dist/src/acp-integration/service/filesystem.js.map +1 -0
- package/dist/src/{ui/hooks/useQuotaAndFallback.test.d.ts → acp-integration/service/filesystem.test.d.ts} +1 -1
- package/dist/src/acp-integration/service/filesystem.test.js +39 -0
- package/dist/src/acp-integration/service/filesystem.test.js.map +1 -0
- package/dist/src/acp-integration/session/HistoryReplayer.d.ts +51 -0
- package/dist/src/acp-integration/session/HistoryReplayer.js +164 -0
- package/dist/src/acp-integration/session/HistoryReplayer.js.map +1 -0
- package/dist/src/acp-integration/session/HistoryReplayer.test.d.ts +6 -0
- package/dist/src/acp-integration/session/HistoryReplayer.test.js +374 -0
- package/dist/src/acp-integration/session/HistoryReplayer.test.js.map +1 -0
- package/dist/src/acp-integration/session/Session.d.ts +61 -0
- package/dist/src/acp-integration/session/Session.js +839 -0
- package/dist/src/acp-integration/session/Session.js.map +1 -0
- package/dist/src/acp-integration/session/SubAgentTracker.d.ts +51 -0
- package/dist/src/acp-integration/session/SubAgentTracker.js +257 -0
- package/dist/src/acp-integration/session/SubAgentTracker.js.map +1 -0
- package/dist/src/acp-integration/session/SubAgentTracker.test.d.ts +6 -0
- package/dist/src/acp-integration/session/SubAgentTracker.test.js +369 -0
- package/dist/src/acp-integration/session/SubAgentTracker.test.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/BaseEmitter.d.ts +27 -0
- package/dist/src/acp-integration/session/emitters/BaseEmitter.js +34 -0
- package/dist/src/acp-integration/session/emitters/BaseEmitter.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/MessageEmitter.d.ts +41 -0
- package/dist/src/acp-integration/session/emitters/MessageEmitter.js +77 -0
- package/dist/src/acp-integration/session/emitters/MessageEmitter.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/MessageEmitter.test.d.ts +6 -0
- package/dist/src/acp-integration/session/emitters/MessageEmitter.test.js +174 -0
- package/dist/src/acp-integration/session/emitters/MessageEmitter.test.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/PlanEmitter.d.ts +39 -0
- package/dist/src/acp-integration/session/emitters/PlanEmitter.js +83 -0
- package/dist/src/acp-integration/session/emitters/PlanEmitter.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/PlanEmitter.test.d.ts +6 -0
- package/dist/src/acp-integration/session/emitters/PlanEmitter.test.js +176 -0
- package/dist/src/acp-integration/session/emitters/PlanEmitter.test.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/ToolCallEmitter.d.ts +80 -0
- package/dist/src/acp-integration/session/emitters/ToolCallEmitter.js +248 -0
- package/dist/src/acp-integration/session/emitters/ToolCallEmitter.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/ToolCallEmitter.test.d.ts +6 -0
- package/dist/src/acp-integration/session/emitters/ToolCallEmitter.test.js +561 -0
- package/dist/src/acp-integration/session/emitters/ToolCallEmitter.test.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/index.d.ts +9 -0
- package/dist/src/acp-integration/session/emitters/index.js +10 -0
- package/dist/src/acp-integration/session/emitters/index.js.map +1 -0
- package/dist/src/acp-integration/session/index.d.ts +24 -0
- package/dist/src/acp-integration/session/index.js +16 -0
- package/dist/src/acp-integration/session/index.js.map +1 -0
- package/dist/src/acp-integration/session/types.d.ts +71 -0
- package/dist/src/acp-integration/session/types.js +7 -0
- package/dist/src/acp-integration/session/types.js.map +1 -0
- package/dist/src/commandMode.d.ts +11 -0
- package/dist/src/commandMode.js +238 -0
- package/dist/src/commandMode.js.map +1 -0
- package/dist/src/config/auth.d.ts +1 -0
- package/dist/src/config/auth.js +29 -0
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/config.d.ts +19 -3
- package/dist/src/config/config.js +175 -24
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/extension.js +0 -2
- package/dist/src/config/extension.js.map +1 -1
- package/dist/src/config/extensions/update.test.js +9 -0
- package/dist/src/config/extensions/update.test.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +53 -2
- package/dist/src/config/settingsSchema.js +46 -2
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/core/auth.d.ts +1 -1
- package/dist/src/core/auth.js +3 -2
- package/dist/src/core/auth.js.map +1 -1
- package/dist/src/core/initializer.js +3 -0
- package/dist/src/core/initializer.js.map +1 -1
- package/dist/src/gemini.js +75 -35
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +37 -4
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +3 -3
- package/dist/src/generated/git-commit.js +3 -3
- package/dist/src/i18n/index.d.ts +10 -2
- package/dist/src/i18n/index.js +26 -1
- package/dist/src/i18n/index.js.map +1 -1
- package/dist/src/i18n/languages.d.ts +20 -0
- package/dist/src/i18n/languages.js +36 -0
- package/dist/src/i18n/languages.js.map +1 -0
- package/dist/src/i18n/locales/de.js +1073 -0
- package/dist/src/i18n/locales/en.js +121 -175
- package/dist/src/i18n/locales/ru.js +1095 -0
- package/dist/src/i18n/locales/zh.js +52 -174
- package/dist/src/nonInteractive/control/ControlDispatcher.d.ts +24 -1
- package/dist/src/nonInteractive/control/ControlDispatcher.js +46 -17
- package/dist/src/nonInteractive/control/ControlDispatcher.js.map +1 -1
- package/dist/src/nonInteractive/control/ControlService.d.ts +2 -1
- package/dist/src/nonInteractive/control/ControlService.js +22 -37
- package/dist/src/nonInteractive/control/ControlService.js.map +1 -1
- package/dist/src/nonInteractive/control/controllers/baseController.d.ts +2 -1
- package/dist/src/nonInteractive/control/controllers/baseController.js +38 -5
- package/dist/src/nonInteractive/control/controllers/baseController.js.map +1 -1
- package/dist/src/nonInteractive/control/controllers/permissionController.d.ts +1 -22
- package/dist/src/nonInteractive/control/controllers/permissionController.js +38 -38
- package/dist/src/nonInteractive/control/controllers/permissionController.js.map +1 -1
- package/dist/src/nonInteractive/control/controllers/sdkMcpController.d.ts +54 -0
- package/dist/src/nonInteractive/control/controllers/sdkMcpController.js +84 -0
- package/dist/src/nonInteractive/control/controllers/sdkMcpController.js.map +1 -0
- package/dist/src/nonInteractive/control/controllers/systemController.d.ts +16 -6
- package/dist/src/nonInteractive/control/controllers/systemController.js +184 -44
- package/dist/src/nonInteractive/control/controllers/systemController.js.map +1 -1
- package/dist/src/nonInteractive/control/types/serviceAPIs.d.ts +1 -16
- package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.d.ts +11 -0
- package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.js +64 -5
- package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.js.map +1 -1
- package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.test.js +40 -0
- package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.test.js.map +1 -1
- package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.test.js +50 -0
- package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.test.js.map +1 -1
- package/dist/src/nonInteractive/session.d.ts +0 -16
- package/dist/src/nonInteractive/session.js +317 -321
- package/dist/src/nonInteractive/session.js.map +1 -1
- package/dist/src/nonInteractive/session.test.js +6 -0
- package/dist/src/nonInteractive/session.test.js.map +1 -1
- package/dist/src/nonInteractive/types.d.ts +57 -3
- package/dist/src/nonInteractive/types.js +0 -1
- package/dist/src/nonInteractive/types.js.map +1 -1
- package/dist/src/nonInteractiveCli.js +121 -56
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/nonInteractiveCliCommands.d.ts +48 -9
- package/dist/src/nonInteractiveCliCommands.js +180 -64
- package/dist/src/nonInteractiveCliCommands.js.map +1 -1
- package/dist/src/nonInteractiveCliCommands.test.d.ts +6 -0
- package/dist/src/nonInteractiveCliCommands.test.js +157 -0
- package/dist/src/nonInteractiveCliCommands.test.js.map +1 -0
- package/dist/src/services/BuiltinCommandLoader.js +7 -6
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.test.js +0 -3
- package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
- package/dist/src/services/McpPromptLoader.js +4 -2
- package/dist/src/services/McpPromptLoader.js.map +1 -1
- package/dist/src/services/McpPromptLoader.test.js +1 -1
- package/dist/src/services/McpPromptLoader.test.js.map +1 -1
- package/dist/src/test-utils/mockCommandContext.js +11 -2
- package/dist/src/test-utils/mockCommandContext.js.map +1 -1
- package/dist/src/ui/AppContainer.js +62 -56
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +0 -46
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.test.js +4 -4
- package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
- package/dist/src/ui/auth/useAuth.js +31 -4
- package/dist/src/ui/auth/useAuth.js.map +1 -1
- package/dist/src/ui/commands/approvalModeCommand.js +53 -4
- package/dist/src/ui/commands/approvalModeCommand.js.map +1 -1
- package/dist/src/ui/commands/approvalModeCommand.test.js +72 -10
- package/dist/src/ui/commands/approvalModeCommand.test.js.map +1 -1
- package/dist/src/ui/commands/clearCommand.js +22 -10
- package/dist/src/ui/commands/clearCommand.js.map +1 -1
- package/dist/src/ui/commands/compressCommand.js +86 -16
- package/dist/src/ui/commands/compressCommand.js.map +1 -1
- package/dist/src/ui/commands/languageCommand.d.ts +6 -1
- package/dist/src/ui/commands/languageCommand.js +162 -183
- package/dist/src/ui/commands/languageCommand.js.map +1 -1
- package/dist/src/ui/commands/languageCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/languageCommand.test.js +558 -0
- package/dist/src/ui/commands/languageCommand.test.js.map +1 -0
- package/dist/src/ui/commands/modelCommand.js +4 -2
- package/dist/src/ui/commands/modelCommand.js.map +1 -1
- package/dist/src/ui/commands/quitCommand.d.ts +0 -1
- package/dist/src/ui/commands/quitCommand.js +0 -27
- package/dist/src/ui/commands/quitCommand.js.map +1 -1
- package/dist/src/ui/commands/restoreCommand.js +1 -1
- package/dist/src/ui/commands/restoreCommand.js.map +1 -1
- package/dist/src/ui/commands/resumeCommand.d.ts +7 -0
- package/dist/src/ui/commands/resumeCommand.js +19 -0
- package/dist/src/ui/commands/resumeCommand.js.map +1 -0
- package/dist/src/ui/commands/resumeCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/resumeCommand.test.js +32 -0
- package/dist/src/ui/commands/resumeCommand.test.js.map +1 -0
- package/dist/src/ui/commands/reviewCommand.d.ts +9 -0
- package/dist/src/ui/commands/reviewCommand.js +2046 -0
- package/dist/src/ui/commands/reviewCommand.js.map +1 -0
- package/dist/src/ui/commands/reviewCommand.test.js +600 -0
- package/dist/src/ui/commands/reviewCommand.test.js.map +1 -0
- package/dist/src/ui/commands/setupGithubCommand.js +11 -10
- package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
- package/dist/src/ui/commands/setupGithubCommand.test.js +14 -14
- package/dist/src/ui/commands/setupGithubCommand.test.js.map +1 -1
- package/dist/src/ui/commands/summaryCommand.js +129 -42
- package/dist/src/ui/commands/summaryCommand.js.map +1 -1
- package/dist/src/ui/commands/types.d.ts +24 -10
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/commands/ums/unittestCommand.d.ts +9 -0
- package/dist/src/ui/commands/ums/unittestCommand.js +387 -0
- package/dist/src/ui/commands/ums/unittestCommand.js.map +1 -0
- package/dist/src/ui/components/Composer.test.js +1 -2
- package/dist/src/ui/components/Composer.test.js.map +1 -1
- package/dist/src/ui/components/ContextUsageDisplay.d.ts +3 -2
- package/dist/src/ui/components/ContextUsageDisplay.js +8 -2
- package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -1
- package/dist/src/ui/components/DialogManager.js +7 -23
- package/dist/src/ui/components/DialogManager.js.map +1 -1
- package/dist/src/ui/components/Footer.js +2 -3
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/Help.js +13 -2
- package/dist/src/ui/components/Help.js.map +1 -1
- package/dist/src/ui/components/Help.test.js +6 -0
- package/dist/src/ui/components/Help.test.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js +3 -1
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.test.js +5 -2
- package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.js +6 -4
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.d.ts +3 -1
- package/dist/src/ui/components/ModelDialog.js +25 -5
- package/dist/src/ui/components/ModelDialog.js.map +1 -1
- package/dist/src/ui/components/OpenAIKeyPrompt.d.ts +3 -0
- package/dist/src/ui/components/OpenAIKeyPrompt.js +1 -0
- package/dist/src/ui/components/OpenAIKeyPrompt.js.map +1 -1
- package/dist/src/ui/components/PermissionsModifyTrustDialog.js +1 -1
- package/dist/src/ui/components/PermissionsModifyTrustDialog.js.map +1 -1
- package/dist/src/ui/components/SessionPicker.d.ts +18 -0
- package/dist/src/ui/components/SessionPicker.js +69 -0
- package/dist/src/ui/components/SessionPicker.js.map +1 -0
- package/dist/src/ui/components/SessionSummaryDisplay.js +14 -2
- package/dist/src/ui/components/SessionSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.test.js +2 -2
- package/dist/src/ui/components/StandaloneSessionPicker.d.ts +10 -0
- package/dist/src/ui/components/StandaloneSessionPicker.js +78 -0
- package/dist/src/ui/components/StandaloneSessionPicker.js.map +1 -0
- package/dist/src/ui/components/StandaloneSessionPicker.test.d.ts +6 -0
- package/dist/src/ui/components/StandaloneSessionPicker.test.js +410 -0
- package/dist/src/ui/components/StandaloneSessionPicker.test.js.map +1 -0
- package/dist/src/ui/components/SuggestionsDisplay.js +3 -2
- package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
- package/dist/src/ui/components/messages/GeminiThoughtMessage.d.ts +18 -0
- package/dist/src/ui/components/messages/GeminiThoughtMessage.js +14 -0
- package/dist/src/ui/components/messages/GeminiThoughtMessage.js.map +1 -0
- package/dist/src/ui/components/messages/GeminiThoughtMessageContent.d.ts +18 -0
- package/dist/src/ui/components/messages/GeminiThoughtMessageContent.js +14 -0
- package/dist/src/ui/components/messages/GeminiThoughtMessageContent.js.map +1 -0
- package/dist/src/ui/components/subagents/manage/AgentEditStep.js +4 -1
- package/dist/src/ui/components/subagents/manage/AgentEditStep.js.map +1 -1
- package/dist/src/ui/components/subagents/manage/AgentSelectionStep.js +2 -2
- package/dist/src/ui/components/subagents/manage/AgentSelectionStep.js.map +1 -1
- package/dist/src/ui/components/ums/UMSKeyPrompt.d.ts +1 -1
- package/dist/src/ui/components/ums/UMSKeyPrompt.js +24 -4
- package/dist/src/ui/components/ums/UMSKeyPrompt.js.map +1 -1
- package/dist/src/ui/components/ums/umsStartupWarnings.d.ts +6 -0
- package/dist/src/ui/components/ums/umsStartupWarnings.js +47 -0
- package/dist/src/ui/components/ums/umsStartupWarnings.js.map +1 -0
- package/dist/src/ui/contexts/SessionContext.d.ts +2 -0
- package/dist/src/ui/contexts/SessionContext.js +18 -10
- package/dist/src/ui/contexts/SessionContext.js.map +1 -1
- package/dist/src/ui/contexts/UIActionsContext.d.ts +3 -1
- package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
- package/dist/src/ui/contexts/UIStateContext.d.ts +3 -11
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +3 -8
- package/dist/src/ui/hooks/slashCommandProcessor.js +77 -101
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAttentionNotifications.d.ts +3 -1
- package/dist/src/ui/hooks/useAttentionNotifications.js +10 -5
- package/dist/src/ui/hooks/useAttentionNotifications.js.map +1 -1
- package/dist/src/ui/hooks/useAttentionNotifications.test.js +39 -2
- package/dist/src/ui/hooks/useAttentionNotifications.test.js.map +1 -1
- package/dist/src/ui/hooks/useDialogClose.d.ts +0 -3
- package/dist/src/ui/hooks/useDialogClose.js +0 -2
- package/dist/src/ui/hooks/useDialogClose.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +87 -12
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.test.js +11 -6
- package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/hooks/useLogger.d.ts +1 -1
- package/dist/src/ui/hooks/useLogger.js +6 -3
- package/dist/src/ui/hooks/useLogger.js.map +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.js +12 -136
- package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
- package/dist/src/ui/hooks/useQwenAuth.test.js +1 -1
- package/dist/src/ui/hooks/useQwenAuth.test.js.map +1 -1
- package/dist/src/ui/hooks/useReactToolScheduler.js +2 -2
- package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
- package/dist/src/ui/hooks/useResumeCommand.d.ts +20 -0
- package/dist/src/ui/hooks/useResumeCommand.js +49 -0
- package/dist/src/ui/hooks/useResumeCommand.js.map +1 -0
- package/dist/src/ui/hooks/useResumeCommand.test.d.ts +6 -0
- package/dist/src/ui/hooks/useResumeCommand.test.js +144 -0
- package/dist/src/ui/hooks/useResumeCommand.test.js.map +1 -0
- package/dist/src/ui/hooks/useSessionPicker.d.ts +36 -0
- package/dist/src/ui/hooks/useSessionPicker.js +189 -0
- package/dist/src/ui/hooks/useSessionPicker.js.map +1 -0
- package/dist/src/ui/hooks/useSlashCompletion.js +9 -1
- package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.js +36 -31
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +2 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/models/availableModels.d.ts +9 -2
- package/dist/src/ui/models/availableModels.js +32 -35
- package/dist/src/ui/models/availableModels.js.map +1 -1
- package/dist/src/ui/noninteractive/nonInteractiveUi.js +0 -1
- package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -1
- package/dist/src/ui/types.d.ts +9 -14
- package/dist/src/ui/types.js +0 -1
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/InlineMarkdownRenderer.d.ts +1 -0
- package/dist/src/ui/utils/InlineMarkdownRenderer.js +2 -2
- package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.d.ts +1 -0
- package/dist/src/ui/utils/MarkdownDisplay.js +13 -13
- package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
- package/dist/src/ui/utils/formatters.d.ts +6 -0
- package/dist/src/ui/utils/formatters.js +31 -0
- package/dist/src/ui/utils/formatters.js.map +1 -1
- package/dist/src/ui/utils/formatters.test.js +51 -2
- package/dist/src/ui/utils/formatters.test.js.map +1 -1
- package/dist/src/ui/utils/resumeHistoryUtils.d.ts +19 -0
- package/dist/src/ui/utils/resumeHistoryUtils.js +267 -0
- package/dist/src/ui/utils/resumeHistoryUtils.js.map +1 -0
- package/dist/src/ui/utils/resumeHistoryUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/resumeHistoryUtils.test.js +253 -0
- package/dist/src/ui/utils/resumeHistoryUtils.test.js.map +1 -0
- package/dist/src/ui/utils/sessionPickerUtils.d.ts +30 -0
- package/dist/src/ui/utils/sessionPickerUtils.js +41 -0
- package/dist/src/ui/utils/sessionPickerUtils.js.map +1 -0
- package/dist/src/ui/utils/sessionPickerUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/sessionPickerUtils.test.js +38 -0
- package/dist/src/ui/utils/sessionPickerUtils.test.js.map +1 -0
- package/dist/src/utils/attentionNotification.d.ts +1 -0
- package/dist/src/utils/attentionNotification.js +4 -0
- package/dist/src/utils/attentionNotification.js.map +1 -1
- package/dist/src/utils/errors.d.ts +1 -1
- package/dist/src/utils/errors.js +14 -3
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/errors.test.js +43 -1
- package/dist/src/utils/errors.test.js.map +1 -1
- package/dist/src/utils/gitUtils.js +25 -8
- package/dist/src/utils/gitUtils.js.map +1 -1
- package/dist/src/utils/gitUtils.test.js +59 -0
- package/dist/src/utils/gitUtils.test.js.map +1 -1
- package/dist/src/utils/nonInteractiveHelpers.d.ts +3 -1
- package/dist/src/utils/nonInteractiveHelpers.js +14 -15
- package/dist/src/utils/nonInteractiveHelpers.js.map +1 -1
- package/dist/src/utils/nonInteractiveHelpers.test.js +36 -21
- package/dist/src/utils/nonInteractiveHelpers.test.js.map +1 -1
- package/dist/src/utils/relaunch.js +2 -2
- package/dist/src/utils/relaunch.js.map +1 -1
- package/dist/src/utils/relaunch.test.js +5 -5
- package/dist/src/utils/relaunch.test.js.map +1 -1
- package/dist/src/utils/systemInfo.js +2 -1
- package/dist/src/utils/systemInfo.js.map +1 -1
- package/dist/src/validateNonInterActiveAuth.js +10 -1
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/dist/src/nonInteractive/control/controllers/mcpController.d.ts +0 -42
- package/dist/src/nonInteractive/control/controllers/mcpController.js +0 -205
- package/dist/src/nonInteractive/control/controllers/mcpController.js.map +0 -1
- package/dist/src/ui/commands/chatCommand.d.ts +0 -9
- package/dist/src/ui/commands/chatCommand.js +0 -351
- package/dist/src/ui/commands/chatCommand.js.map +0 -1
- package/dist/src/ui/commands/corgiCommand.d.ts +0 -7
- package/dist/src/ui/commands/corgiCommand.js +0 -16
- package/dist/src/ui/commands/corgiCommand.js.map +0 -1
- package/dist/src/ui/components/ProQuotaDialog.d.ts +0 -13
- package/dist/src/ui/components/ProQuotaDialog.js +0 -24
- package/dist/src/ui/components/ProQuotaDialog.js.map +0 -1
- package/dist/src/ui/components/ProQuotaDialog.test.js +0 -58
- package/dist/src/ui/components/ProQuotaDialog.test.js.map +0 -1
- package/dist/src/ui/components/QuitConfirmationDialog.d.ts +0 -17
- package/dist/src/ui/components/QuitConfirmationDialog.js +0 -49
- package/dist/src/ui/components/QuitConfirmationDialog.js.map +0 -1
- package/dist/src/ui/hooks/usePromptCompletion.d.ts +0 -23
- package/dist/src/ui/hooks/usePromptCompletion.js +0 -177
- package/dist/src/ui/hooks/usePromptCompletion.js.map +0 -1
- package/dist/src/ui/hooks/useQuitConfirmation.d.ts +0 -14
- package/dist/src/ui/hooks/useQuitConfirmation.js +0 -36
- package/dist/src/ui/hooks/useQuitConfirmation.js.map +0 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.d.ts +0 -21
- package/dist/src/ui/hooks/useQuotaAndFallback.js +0 -122
- package/dist/src/ui/hooks/useQuotaAndFallback.js.map +0 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js +0 -269
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +0 -1
- package/dist/src/zed-integration/acp.js.map +0 -1
- package/dist/src/zed-integration/fileSystemService.js.map +0 -1
- package/dist/src/zed-integration/schema.js.map +0 -1
- package/dist/src/zed-integration/zedIntegration.d.ts +0 -17
- package/dist/src/zed-integration/zedIntegration.js +0 -1135
- package/dist/src/zed-integration/zedIntegration.js.map +0 -1
- /package/dist/src/ui/{components/ProQuotaDialog.test.d.ts → commands/reviewCommand.test.d.ts} +0 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Qwen
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
|
+
import { MessageEmitter } from './MessageEmitter.js';
|
|
8
|
+
describe('MessageEmitter', () => {
|
|
9
|
+
let mockContext;
|
|
10
|
+
let sendUpdateSpy;
|
|
11
|
+
let emitter;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
sendUpdateSpy = vi.fn().mockResolvedValue(undefined);
|
|
14
|
+
mockContext = {
|
|
15
|
+
sessionId: 'test-session-id',
|
|
16
|
+
config: {},
|
|
17
|
+
sendUpdate: sendUpdateSpy,
|
|
18
|
+
};
|
|
19
|
+
emitter = new MessageEmitter(mockContext);
|
|
20
|
+
});
|
|
21
|
+
describe('emitUserMessage', () => {
|
|
22
|
+
it('should send user_message_chunk update with text content', async () => {
|
|
23
|
+
await emitter.emitUserMessage('Hello, world!');
|
|
24
|
+
expect(sendUpdateSpy).toHaveBeenCalledTimes(1);
|
|
25
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
26
|
+
sessionUpdate: 'user_message_chunk',
|
|
27
|
+
content: { type: 'text', text: 'Hello, world!' },
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
it('should handle empty text', async () => {
|
|
31
|
+
await emitter.emitUserMessage('');
|
|
32
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
33
|
+
sessionUpdate: 'user_message_chunk',
|
|
34
|
+
content: { type: 'text', text: '' },
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
it('should handle multiline text', async () => {
|
|
38
|
+
const multilineText = 'Line 1\nLine 2\nLine 3';
|
|
39
|
+
await emitter.emitUserMessage(multilineText);
|
|
40
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
41
|
+
sessionUpdate: 'user_message_chunk',
|
|
42
|
+
content: { type: 'text', text: multilineText },
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('emitAgentMessage', () => {
|
|
47
|
+
it('should send agent_message_chunk update with text content', async () => {
|
|
48
|
+
await emitter.emitAgentMessage('I can help you with that.');
|
|
49
|
+
expect(sendUpdateSpy).toHaveBeenCalledTimes(1);
|
|
50
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
51
|
+
sessionUpdate: 'agent_message_chunk',
|
|
52
|
+
content: { type: 'text', text: 'I can help you with that.' },
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe('emitAgentThought', () => {
|
|
57
|
+
it('should send agent_thought_chunk update with text content', async () => {
|
|
58
|
+
await emitter.emitAgentThought('Let me think about this...');
|
|
59
|
+
expect(sendUpdateSpy).toHaveBeenCalledTimes(1);
|
|
60
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
61
|
+
sessionUpdate: 'agent_thought_chunk',
|
|
62
|
+
content: { type: 'text', text: 'Let me think about this...' },
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('emitMessage', () => {
|
|
67
|
+
it('should emit user message when role is user', async () => {
|
|
68
|
+
await emitter.emitMessage('User input', 'user');
|
|
69
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
70
|
+
sessionUpdate: 'user_message_chunk',
|
|
71
|
+
content: { type: 'text', text: 'User input' },
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
it('should emit agent message when role is assistant and isThought is false', async () => {
|
|
75
|
+
await emitter.emitMessage('Agent response', 'assistant', false);
|
|
76
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
77
|
+
sessionUpdate: 'agent_message_chunk',
|
|
78
|
+
content: { type: 'text', text: 'Agent response' },
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
it('should emit agent message when role is assistant and isThought is not provided', async () => {
|
|
82
|
+
await emitter.emitMessage('Agent response', 'assistant');
|
|
83
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
84
|
+
sessionUpdate: 'agent_message_chunk',
|
|
85
|
+
content: { type: 'text', text: 'Agent response' },
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
it('should emit agent thought when role is assistant and isThought is true', async () => {
|
|
89
|
+
await emitter.emitAgentThought('Thinking...');
|
|
90
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
91
|
+
sessionUpdate: 'agent_thought_chunk',
|
|
92
|
+
content: { type: 'text', text: 'Thinking...' },
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
it('should ignore isThought when role is user', async () => {
|
|
96
|
+
// Even if isThought is true, user messages should still be user_message_chunk
|
|
97
|
+
await emitter.emitMessage('User input', 'user', true);
|
|
98
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
99
|
+
sessionUpdate: 'user_message_chunk',
|
|
100
|
+
content: { type: 'text', text: 'User input' },
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('multiple emissions', () => {
|
|
105
|
+
it('should handle multiple sequential emissions', async () => {
|
|
106
|
+
await emitter.emitUserMessage('First');
|
|
107
|
+
await emitter.emitAgentMessage('Second');
|
|
108
|
+
await emitter.emitAgentThought('Third');
|
|
109
|
+
expect(sendUpdateSpy).toHaveBeenCalledTimes(3);
|
|
110
|
+
expect(sendUpdateSpy).toHaveBeenNthCalledWith(1, {
|
|
111
|
+
sessionUpdate: 'user_message_chunk',
|
|
112
|
+
content: { type: 'text', text: 'First' },
|
|
113
|
+
});
|
|
114
|
+
expect(sendUpdateSpy).toHaveBeenNthCalledWith(2, {
|
|
115
|
+
sessionUpdate: 'agent_message_chunk',
|
|
116
|
+
content: { type: 'text', text: 'Second' },
|
|
117
|
+
});
|
|
118
|
+
expect(sendUpdateSpy).toHaveBeenNthCalledWith(3, {
|
|
119
|
+
sessionUpdate: 'agent_thought_chunk',
|
|
120
|
+
content: { type: 'text', text: 'Third' },
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('emitUsageMetadata', () => {
|
|
125
|
+
it('should emit agent_message_chunk with _meta.usage containing token counts', async () => {
|
|
126
|
+
const usageMetadata = {
|
|
127
|
+
promptTokenCount: 100,
|
|
128
|
+
candidatesTokenCount: 50,
|
|
129
|
+
thoughtsTokenCount: 25,
|
|
130
|
+
totalTokenCount: 175,
|
|
131
|
+
cachedContentTokenCount: 10,
|
|
132
|
+
};
|
|
133
|
+
await emitter.emitUsageMetadata(usageMetadata);
|
|
134
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
135
|
+
sessionUpdate: 'agent_message_chunk',
|
|
136
|
+
content: { type: 'text', text: '' },
|
|
137
|
+
_meta: {
|
|
138
|
+
usage: {
|
|
139
|
+
promptTokens: 100,
|
|
140
|
+
completionTokens: 50,
|
|
141
|
+
thoughtsTokens: 25,
|
|
142
|
+
totalTokens: 175,
|
|
143
|
+
cachedTokens: 10,
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
it('should include durationMs in _meta when provided', async () => {
|
|
149
|
+
const usageMetadata = {
|
|
150
|
+
promptTokenCount: 10,
|
|
151
|
+
candidatesTokenCount: 5,
|
|
152
|
+
thoughtsTokenCount: 2,
|
|
153
|
+
totalTokenCount: 17,
|
|
154
|
+
cachedContentTokenCount: 1,
|
|
155
|
+
};
|
|
156
|
+
await emitter.emitUsageMetadata(usageMetadata, 'done', 1234);
|
|
157
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
158
|
+
sessionUpdate: 'agent_message_chunk',
|
|
159
|
+
content: { type: 'text', text: 'done' },
|
|
160
|
+
_meta: {
|
|
161
|
+
usage: {
|
|
162
|
+
promptTokens: 10,
|
|
163
|
+
completionTokens: 5,
|
|
164
|
+
thoughtsTokens: 2,
|
|
165
|
+
totalTokens: 17,
|
|
166
|
+
cachedTokens: 1,
|
|
167
|
+
},
|
|
168
|
+
durationMs: 1234,
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
//# sourceMappingURL=MessageEmitter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageEmitter.test.js","sourceRoot":"","sources":["../../../../../src/acp-integration/session/emitters/MessageEmitter.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,WAA2B,CAAC;IAChC,IAAI,aAAuC,CAAC;IAC5C,IAAI,OAAuB,CAAC;IAE5B,UAAU,CAAC,GAAG,EAAE;QACd,aAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACrD,WAAW,GAAG;YACZ,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,EAAY;YACpB,UAAU,EAAE,aAAa;SAC1B,CAAC;QACF,OAAO,GAAG,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;YAE/C,MAAM,CAAC,aAAa,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC,aAAa,EAAE,oBAAoB;gBACnC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE;aACjD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAElC,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC,aAAa,EAAE,oBAAoB;gBACnC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,aAAa,GAAG,wBAAwB,CAAC;YAC/C,MAAM,OAAO,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;YAE7C,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC,aAAa,EAAE,oBAAoB;gBACnC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;aAC/C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,OAAO,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CAAC;YAE5D,MAAM,CAAC,aAAa,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC,aAAa,EAAE,qBAAqB;gBACpC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE;aAC7D,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,OAAO,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,CAAC;YAE7D,MAAM,CAAC,aAAa,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC,aAAa,EAAE,qBAAqB;gBACpC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE;aAC9D,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAEhD,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC,aAAa,EAAE,oBAAoB;gBACnC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE;aAC9C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YACvF,MAAM,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YAEhE,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC,aAAa,EAAE,qBAAqB;gBACpC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE;aAClD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;YAC9F,MAAM,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAEzD,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC,aAAa,EAAE,qBAAqB;gBACpC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE;aAClD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;YACtF,MAAM,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;YAE9C,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC,aAAa,EAAE,qBAAqB;gBACpC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;aAC/C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,8EAA8E;YAC9E,MAAM,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAEtD,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC,aAAa,EAAE,oBAAoB;gBACnC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE;aAC9C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAExC,MAAM,CAAC,aAAa,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,aAAa,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE;gBAC/C,aAAa,EAAE,oBAAoB;gBACnC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;aACzC,CAAC,CAAC;YACH,MAAM,CAAC,aAAa,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE;gBAC/C,aAAa,EAAE,qBAAqB;gBACpC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC1C,CAAC,CAAC;YACH,MAAM,CAAC,aAAa,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE;gBAC/C,aAAa,EAAE,qBAAqB;gBACpC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;aACzC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;YACxF,MAAM,aAAa,GAAG;gBACpB,gBAAgB,EAAE,GAAG;gBACrB,oBAAoB,EAAE,EAAE;gBACxB,kBAAkB,EAAE,EAAE;gBACtB,eAAe,EAAE,GAAG;gBACpB,uBAAuB,EAAE,EAAE;aAC5B,CAAC;YAEF,MAAM,OAAO,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAE/C,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC,aAAa,EAAE,qBAAqB;gBACpC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;gBACnC,KAAK,EAAE;oBACL,KAAK,EAAE;wBACL,YAAY,EAAE,GAAG;wBACjB,gBAAgB,EAAE,EAAE;wBACpB,cAAc,EAAE,EAAE;wBAClB,WAAW,EAAE,GAAG;wBAChB,YAAY,EAAE,EAAE;qBACjB;iBACF;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,aAAa,GAAG;gBACpB,gBAAgB,EAAE,EAAE;gBACpB,oBAAoB,EAAE,CAAC;gBACvB,kBAAkB,EAAE,CAAC;gBACrB,eAAe,EAAE,EAAE;gBACnB,uBAAuB,EAAE,CAAC;aAC3B,CAAC;YAEF,MAAM,OAAO,CAAC,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC,aAAa,EAAE,qBAAqB;gBACpC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;gBACvC,KAAK,EAAE;oBACL,KAAK,EAAE;wBACL,YAAY,EAAE,EAAE;wBAChB,gBAAgB,EAAE,CAAC;wBACnB,cAAc,EAAE,CAAC;wBACjB,WAAW,EAAE,EAAE;wBACf,YAAY,EAAE,CAAC;qBAChB;oBACD,UAAU,EAAE,IAAI;iBACjB;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Qwen
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { BaseEmitter } from './BaseEmitter.js';
|
|
7
|
+
import type { TodoItem } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Handles emission of plan/todo updates.
|
|
10
|
+
*
|
|
11
|
+
* This emitter is responsible for converting todo items to ACP plan entries
|
|
12
|
+
* and sending plan updates to the client. It also provides utilities for
|
|
13
|
+
* extracting todos from various sources (tool result displays, args, etc.).
|
|
14
|
+
*/
|
|
15
|
+
export declare class PlanEmitter extends BaseEmitter {
|
|
16
|
+
/**
|
|
17
|
+
* Emits a plan update with the given todo items.
|
|
18
|
+
*
|
|
19
|
+
* @param todos - Array of todo items to send as plan entries
|
|
20
|
+
*/
|
|
21
|
+
emitPlan(todos: TodoItem[]): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Extracts todos from tool result display or args.
|
|
24
|
+
* Tries multiple sources in priority order:
|
|
25
|
+
* 1. Result display object with type 'todo_list'
|
|
26
|
+
* 2. Result display as JSON string
|
|
27
|
+
* 3. Args with 'todos' array
|
|
28
|
+
*
|
|
29
|
+
* @param resultDisplay - The tool result display (object, string, or undefined)
|
|
30
|
+
* @param args - The tool call arguments (fallback source)
|
|
31
|
+
* @returns Array of todos if found, null otherwise
|
|
32
|
+
*/
|
|
33
|
+
extractTodos(resultDisplay: unknown, args?: Record<string, unknown>): TodoItem[] | null;
|
|
34
|
+
/**
|
|
35
|
+
* Extracts todos from a result display value.
|
|
36
|
+
* Handles both object and JSON string formats.
|
|
37
|
+
*/
|
|
38
|
+
private extractFromResultDisplay;
|
|
39
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Qwen
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { BaseEmitter } from './BaseEmitter.js';
|
|
7
|
+
/**
|
|
8
|
+
* Handles emission of plan/todo updates.
|
|
9
|
+
*
|
|
10
|
+
* This emitter is responsible for converting todo items to ACP plan entries
|
|
11
|
+
* and sending plan updates to the client. It also provides utilities for
|
|
12
|
+
* extracting todos from various sources (tool result displays, args, etc.).
|
|
13
|
+
*/
|
|
14
|
+
export class PlanEmitter extends BaseEmitter {
|
|
15
|
+
/**
|
|
16
|
+
* Emits a plan update with the given todo items.
|
|
17
|
+
*
|
|
18
|
+
* @param todos - Array of todo items to send as plan entries
|
|
19
|
+
*/
|
|
20
|
+
async emitPlan(todos) {
|
|
21
|
+
const entries = todos.map((todo) => ({
|
|
22
|
+
content: todo.content,
|
|
23
|
+
priority: 'medium', // Default priority since todos don't have priority
|
|
24
|
+
status: todo.status,
|
|
25
|
+
}));
|
|
26
|
+
await this.sendUpdate({
|
|
27
|
+
sessionUpdate: 'plan',
|
|
28
|
+
entries,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Extracts todos from tool result display or args.
|
|
33
|
+
* Tries multiple sources in priority order:
|
|
34
|
+
* 1. Result display object with type 'todo_list'
|
|
35
|
+
* 2. Result display as JSON string
|
|
36
|
+
* 3. Args with 'todos' array
|
|
37
|
+
*
|
|
38
|
+
* @param resultDisplay - The tool result display (object, string, or undefined)
|
|
39
|
+
* @param args - The tool call arguments (fallback source)
|
|
40
|
+
* @returns Array of todos if found, null otherwise
|
|
41
|
+
*/
|
|
42
|
+
extractTodos(resultDisplay, args) {
|
|
43
|
+
// Try resultDisplay first (final state from tool execution)
|
|
44
|
+
const fromDisplay = this.extractFromResultDisplay(resultDisplay);
|
|
45
|
+
if (fromDisplay)
|
|
46
|
+
return fromDisplay;
|
|
47
|
+
// Fallback to args (initial state)
|
|
48
|
+
if (args && Array.isArray(args['todos'])) {
|
|
49
|
+
return args['todos'];
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Extracts todos from a result display value.
|
|
55
|
+
* Handles both object and JSON string formats.
|
|
56
|
+
*/
|
|
57
|
+
extractFromResultDisplay(resultDisplay) {
|
|
58
|
+
if (!resultDisplay)
|
|
59
|
+
return null;
|
|
60
|
+
// Handle direct object with type 'todo_list'
|
|
61
|
+
if (typeof resultDisplay === 'object') {
|
|
62
|
+
const obj = resultDisplay;
|
|
63
|
+
if (obj['type'] === 'todo_list' && Array.isArray(obj['todos'])) {
|
|
64
|
+
return obj['todos'];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Handle JSON string (from subagent events)
|
|
68
|
+
if (typeof resultDisplay === 'string') {
|
|
69
|
+
try {
|
|
70
|
+
const parsed = JSON.parse(resultDisplay);
|
|
71
|
+
if (parsed?.['type'] === 'todo_list' &&
|
|
72
|
+
Array.isArray(parsed['todos'])) {
|
|
73
|
+
return parsed['todos'];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Not JSON, ignore
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=PlanEmitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanEmitter.js","sourceRoot":"","sources":["../../../../../src/acp-integration/session/emitters/PlanEmitter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAI/C;;;;;;GAMG;AACH,MAAM,OAAO,WAAY,SAAQ,WAAW;IAC1C;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAiB;QAC9B,MAAM,OAAO,GAAoB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACpD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,QAAiB,EAAE,mDAAmD;YAChF,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,CAAC,UAAU,CAAC;YACpB,aAAa,EAAE,MAAM;YACrB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACH,YAAY,CACV,aAAsB,EACtB,IAA8B;QAE9B,4DAA4D;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;QACjE,IAAI,WAAW;YAAE,OAAO,WAAW,CAAC;QAEpC,mCAAmC;QACnC,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC,OAAO,CAAe,CAAC;QACrC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACK,wBAAwB,CAAC,aAAsB;QACrD,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAEhC,6CAA6C;QAC7C,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,aAAwC,CAAC;YACrD,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBAC/D,OAAO,GAAG,CAAC,OAAO,CAAe,CAAC;YACpC,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAA4B,CAAC;gBACpE,IACE,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,WAAW;oBAChC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAC9B,CAAC;oBACD,OAAO,MAAM,CAAC,OAAO,CAAe,CAAC;gBACvC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,mBAAmB;YACrB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Qwen
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
|
+
import { PlanEmitter } from './PlanEmitter.js';
|
|
8
|
+
describe('PlanEmitter', () => {
|
|
9
|
+
let mockContext;
|
|
10
|
+
let sendUpdateSpy;
|
|
11
|
+
let emitter;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
sendUpdateSpy = vi.fn().mockResolvedValue(undefined);
|
|
14
|
+
mockContext = {
|
|
15
|
+
sessionId: 'test-session-id',
|
|
16
|
+
config: {},
|
|
17
|
+
sendUpdate: sendUpdateSpy,
|
|
18
|
+
};
|
|
19
|
+
emitter = new PlanEmitter(mockContext);
|
|
20
|
+
});
|
|
21
|
+
describe('emitPlan', () => {
|
|
22
|
+
it('should send plan update with converted todo entries', async () => {
|
|
23
|
+
const todos = [
|
|
24
|
+
{ id: '1', content: 'First task', status: 'pending' },
|
|
25
|
+
{ id: '2', content: 'Second task', status: 'in_progress' },
|
|
26
|
+
{ id: '3', content: 'Third task', status: 'completed' },
|
|
27
|
+
];
|
|
28
|
+
await emitter.emitPlan(todos);
|
|
29
|
+
expect(sendUpdateSpy).toHaveBeenCalledTimes(1);
|
|
30
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
31
|
+
sessionUpdate: 'plan',
|
|
32
|
+
entries: [
|
|
33
|
+
{ content: 'First task', priority: 'medium', status: 'pending' },
|
|
34
|
+
{ content: 'Second task', priority: 'medium', status: 'in_progress' },
|
|
35
|
+
{ content: 'Third task', priority: 'medium', status: 'completed' },
|
|
36
|
+
],
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
it('should handle empty todos array', async () => {
|
|
40
|
+
await emitter.emitPlan([]);
|
|
41
|
+
expect(sendUpdateSpy).toHaveBeenCalledWith({
|
|
42
|
+
sessionUpdate: 'plan',
|
|
43
|
+
entries: [],
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
it('should set default priority to medium for all entries', async () => {
|
|
47
|
+
const todos = [
|
|
48
|
+
{ id: '1', content: 'Task', status: 'pending' },
|
|
49
|
+
];
|
|
50
|
+
await emitter.emitPlan(todos);
|
|
51
|
+
const call = sendUpdateSpy.mock.calls[0][0];
|
|
52
|
+
expect(call.entries[0].priority).toBe('medium');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('extractTodos', () => {
|
|
56
|
+
describe('from resultDisplay object', () => {
|
|
57
|
+
it('should extract todos from valid todo_list object', () => {
|
|
58
|
+
const resultDisplay = {
|
|
59
|
+
type: 'todo_list',
|
|
60
|
+
todos: [
|
|
61
|
+
{ id: '1', content: 'Task 1', status: 'pending' },
|
|
62
|
+
{ id: '2', content: 'Task 2', status: 'completed' },
|
|
63
|
+
],
|
|
64
|
+
};
|
|
65
|
+
const result = emitter.extractTodos(resultDisplay);
|
|
66
|
+
expect(result).toEqual([
|
|
67
|
+
{ id: '1', content: 'Task 1', status: 'pending' },
|
|
68
|
+
{ id: '2', content: 'Task 2', status: 'completed' },
|
|
69
|
+
]);
|
|
70
|
+
});
|
|
71
|
+
it('should return null for object without type todo_list', () => {
|
|
72
|
+
const resultDisplay = {
|
|
73
|
+
type: 'other',
|
|
74
|
+
todos: [],
|
|
75
|
+
};
|
|
76
|
+
const result = emitter.extractTodos(resultDisplay);
|
|
77
|
+
expect(result).toBeNull();
|
|
78
|
+
});
|
|
79
|
+
it('should return null for object without todos array', () => {
|
|
80
|
+
const resultDisplay = {
|
|
81
|
+
type: 'todo_list',
|
|
82
|
+
items: [], // wrong key
|
|
83
|
+
};
|
|
84
|
+
const result = emitter.extractTodos(resultDisplay);
|
|
85
|
+
expect(result).toBeNull();
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('from resultDisplay JSON string', () => {
|
|
89
|
+
it('should extract todos from valid JSON string', () => {
|
|
90
|
+
const resultDisplay = JSON.stringify({
|
|
91
|
+
type: 'todo_list',
|
|
92
|
+
todos: [{ id: '1', content: 'Task', status: 'pending' }],
|
|
93
|
+
});
|
|
94
|
+
const result = emitter.extractTodos(resultDisplay);
|
|
95
|
+
expect(result).toEqual([
|
|
96
|
+
{ id: '1', content: 'Task', status: 'pending' },
|
|
97
|
+
]);
|
|
98
|
+
});
|
|
99
|
+
it('should return null for invalid JSON string', () => {
|
|
100
|
+
const resultDisplay = 'not valid json';
|
|
101
|
+
const result = emitter.extractTodos(resultDisplay);
|
|
102
|
+
expect(result).toBeNull();
|
|
103
|
+
});
|
|
104
|
+
it('should return null for JSON without todo_list type', () => {
|
|
105
|
+
const resultDisplay = JSON.stringify({
|
|
106
|
+
type: 'other',
|
|
107
|
+
data: {},
|
|
108
|
+
});
|
|
109
|
+
const result = emitter.extractTodos(resultDisplay);
|
|
110
|
+
expect(result).toBeNull();
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('from args fallback', () => {
|
|
114
|
+
it('should extract todos from args when resultDisplay is null', () => {
|
|
115
|
+
const args = {
|
|
116
|
+
todos: [{ id: '1', content: 'From args', status: 'pending' }],
|
|
117
|
+
};
|
|
118
|
+
const result = emitter.extractTodos(null, args);
|
|
119
|
+
expect(result).toEqual([
|
|
120
|
+
{ id: '1', content: 'From args', status: 'pending' },
|
|
121
|
+
]);
|
|
122
|
+
});
|
|
123
|
+
it('should extract todos from args when resultDisplay is undefined', () => {
|
|
124
|
+
const args = {
|
|
125
|
+
todos: [{ id: '1', content: 'From args', status: 'pending' }],
|
|
126
|
+
};
|
|
127
|
+
const result = emitter.extractTodos(undefined, args);
|
|
128
|
+
expect(result).toEqual([
|
|
129
|
+
{ id: '1', content: 'From args', status: 'pending' },
|
|
130
|
+
]);
|
|
131
|
+
});
|
|
132
|
+
it('should prefer resultDisplay over args', () => {
|
|
133
|
+
const resultDisplay = {
|
|
134
|
+
type: 'todo_list',
|
|
135
|
+
todos: [{ id: '1', content: 'From display', status: 'completed' }],
|
|
136
|
+
};
|
|
137
|
+
const args = {
|
|
138
|
+
todos: [{ id: '2', content: 'From args', status: 'pending' }],
|
|
139
|
+
};
|
|
140
|
+
const result = emitter.extractTodos(resultDisplay, args);
|
|
141
|
+
expect(result).toEqual([
|
|
142
|
+
{ id: '1', content: 'From display', status: 'completed' },
|
|
143
|
+
]);
|
|
144
|
+
});
|
|
145
|
+
it('should return null when args has no todos array', () => {
|
|
146
|
+
const args = { other: 'value' };
|
|
147
|
+
const result = emitter.extractTodos(null, args);
|
|
148
|
+
expect(result).toBeNull();
|
|
149
|
+
});
|
|
150
|
+
it('should return null when args.todos is not an array', () => {
|
|
151
|
+
const args = { todos: 'not an array' };
|
|
152
|
+
const result = emitter.extractTodos(null, args);
|
|
153
|
+
expect(result).toBeNull();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe('edge cases', () => {
|
|
157
|
+
it('should return null when both resultDisplay and args are undefined', () => {
|
|
158
|
+
const result = emitter.extractTodos(undefined, undefined);
|
|
159
|
+
expect(result).toBeNull();
|
|
160
|
+
});
|
|
161
|
+
it('should return null when resultDisplay is empty object', () => {
|
|
162
|
+
const result = emitter.extractTodos({});
|
|
163
|
+
expect(result).toBeNull();
|
|
164
|
+
});
|
|
165
|
+
it('should handle resultDisplay with todos but wrong type', () => {
|
|
166
|
+
const resultDisplay = {
|
|
167
|
+
type: 'not_todo_list',
|
|
168
|
+
todos: [{ id: '1', content: 'Task', status: 'pending' }],
|
|
169
|
+
};
|
|
170
|
+
const result = emitter.extractTodos(resultDisplay);
|
|
171
|
+
expect(result).toBeNull();
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
//# sourceMappingURL=PlanEmitter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanEmitter.test.js","sourceRoot":"","sources":["../../../../../src/acp-integration/session/emitters/PlanEmitter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Qwen
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { BaseEmitter } from './BaseEmitter.js';
|
|
7
|
+
import type { SessionContext, ToolCallStartParams, ToolCallResultParams, ResolvedToolMetadata } from '../types.js';
|
|
8
|
+
import type * as acp from '../../acp.js';
|
|
9
|
+
import { Kind } from '@umsai/ums-code-core';
|
|
10
|
+
/**
|
|
11
|
+
* Unified tool call event emitter.
|
|
12
|
+
*
|
|
13
|
+
* Handles tool_call and tool_call_update for ALL flows:
|
|
14
|
+
* - Normal tool execution in runTool()
|
|
15
|
+
* - History replay in HistoryReplayer
|
|
16
|
+
* - SubAgent tool tracking in SubAgentTracker
|
|
17
|
+
*
|
|
18
|
+
* This ensures consistent behavior across all tool event sources,
|
|
19
|
+
* including special handling for tools like TodoWriteTool.
|
|
20
|
+
*/
|
|
21
|
+
export declare class ToolCallEmitter extends BaseEmitter {
|
|
22
|
+
private readonly planEmitter;
|
|
23
|
+
constructor(ctx: SessionContext);
|
|
24
|
+
/**
|
|
25
|
+
* Emits a tool call start event.
|
|
26
|
+
*
|
|
27
|
+
* @param params - Tool call start parameters
|
|
28
|
+
* @returns true if event was emitted, false if skipped (e.g., TodoWriteTool)
|
|
29
|
+
*/
|
|
30
|
+
emitStart(params: ToolCallStartParams): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Emits a tool call result event.
|
|
33
|
+
* Handles TodoWriteTool specially by routing to plan updates.
|
|
34
|
+
*
|
|
35
|
+
* @param params - Tool call result parameters
|
|
36
|
+
*/
|
|
37
|
+
emitResult(params: ToolCallResultParams): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Emits a tool call error event.
|
|
40
|
+
* Use this for explicit error handling when not using emitResult.
|
|
41
|
+
*
|
|
42
|
+
* @param callId - The tool call ID
|
|
43
|
+
* @param error - The error that occurred
|
|
44
|
+
*/
|
|
45
|
+
emitError(callId: string, error: Error): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Checks if a tool name is the TodoWriteTool.
|
|
48
|
+
* Exposed for external use in components that need to check this.
|
|
49
|
+
*/
|
|
50
|
+
isTodoWriteTool(toolName: string): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Checks if a tool name is the ExitPlanModeTool.
|
|
53
|
+
*/
|
|
54
|
+
isExitPlanModeTool(toolName: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Resolves tool metadata from the registry.
|
|
57
|
+
* Falls back to defaults if tool not found or build fails.
|
|
58
|
+
*
|
|
59
|
+
* @param toolName - Name of the tool
|
|
60
|
+
* @param args - Tool call arguments (used to build invocation)
|
|
61
|
+
*/
|
|
62
|
+
resolveToolMetadata(toolName: string, args?: Record<string, unknown>): ResolvedToolMetadata;
|
|
63
|
+
/**
|
|
64
|
+
* Maps core Tool Kind enum to ACP ToolKind string literals.
|
|
65
|
+
*
|
|
66
|
+
* @param kind - The core Kind enum value
|
|
67
|
+
* @param toolName - Optional tool name to handle special cases like exit_plan_mode
|
|
68
|
+
*/
|
|
69
|
+
mapToolKind(kind: Kind, toolName?: string): acp.ToolKind;
|
|
70
|
+
/**
|
|
71
|
+
* Extracts diff content from resultDisplay if it's a diff type (edit tool result).
|
|
72
|
+
* Returns null if not a diff.
|
|
73
|
+
*/
|
|
74
|
+
private extractDiffContent;
|
|
75
|
+
/**
|
|
76
|
+
* Transforms Part[] to ToolCallContent[].
|
|
77
|
+
* Extracts text from functionResponse parts and text parts.
|
|
78
|
+
*/
|
|
79
|
+
private transformPartsToToolCallContent;
|
|
80
|
+
}
|