@umsai/ums-code 0.3.0-v2 → 0.5.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 +4 -4
- package/dist/src/{zed-integration → acp-integration}/acp.d.ts +7 -0
- package/dist/src/{zed-integration → acp-integration}/acp.js +25 -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 +238 -0
- package/dist/src/acp-integration/acpAgent.js.map +1 -0
- package/dist/src/{zed-integration → acp-integration}/schema.d.ts +1030 -43
- package/dist/src/{zed-integration → acp-integration}/schema.js +81 -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/acp-integration/service/filesystem.test.d.ts +6 -0
- 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 +66 -0
- package/dist/src/acp-integration/session/Session.js +760 -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/config/auth.d.ts +1 -0
- package/dist/src/config/auth.js +3 -0
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/config.d.ts +11 -3
- package/dist/src/config/config.js +84 -8
- 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/settingsSchema.d.ts +12 -0
- package/dist/src/config/settingsSchema.js +10 -0
- 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/gemini.js +38 -18
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +7 -0
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/i18n/index.d.ts +1 -1
- package/dist/src/i18n/index.js +4 -0
- package/dist/src/i18n/index.js.map +1 -1
- package/dist/src/i18n/locales/en.js +1 -13
- package/dist/src/i18n/locales/ru.js +1121 -0
- package/dist/src/i18n/locales/zh.js +1 -10
- 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 +189 -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 +54 -2
- package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.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 +25 -46
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.js +5 -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/test-utils/mockCommandContext.js +11 -2
- package/dist/src/test-utils/mockCommandContext.js.map +1 -1
- package/dist/src/ui/AppContainer.js +39 -36
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/auth/useAuth.js +20 -1
- package/dist/src/ui/auth/useAuth.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/languageCommand.js +41 -8
- 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 +463 -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/reviewCommand.d.ts +9 -0
- package/dist/src/ui/commands/reviewCommand.js +1267 -0
- package/dist/src/ui/commands/reviewCommand.js.map +1 -0
- package/dist/src/ui/commands/reviewCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/reviewCommand.test.js +545 -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/types.d.ts +4 -9
- 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 +3 -19
- 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/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/ResumeSessionPicker.d.ts +10 -0
- package/dist/src/ui/components/ResumeSessionPicker.js +249 -0
- package/dist/src/ui/components/ResumeSessionPicker.js.map +1 -0
- package/dist/src/ui/components/SessionSummaryDisplay.js +10 -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/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 +23 -3
- 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/UIStateContext.d.ts +1 -3
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +2 -8
- package/dist/src/ui/hooks/slashCommandProcessor.js +68 -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 +49 -9
- package/dist/src/ui/hooks/useGeminiStream.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/useReactToolScheduler.js +2 -2
- package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
- 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 +1 -0
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/models/availableModels.d.ts +8 -2
- package/dist/src/ui/models/availableModels.js +24 -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 +263 -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 +248 -0
- package/dist/src/ui/utils/resumeHistoryUtils.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/gitUtils.js +3 -3
- package/dist/src/utils/gitUtils.js.map +1 -1
- package/dist/src/utils/nonInteractiveHelpers.js +1 -1
- package/dist/src/utils/nonInteractiveHelpers.js.map +1 -1
- package/dist/src/utils/nonInteractiveHelpers.test.js +1 -1
- package/dist/src/utils/nonInteractiveHelpers.test.js.map +1 -1
- package/dist/src/validateNonInterActiveAuth.js +1 -1
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- 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/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/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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@umsai/ums-code",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0-v1",
|
|
4
4
|
"description": "UMS Code CLI",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -36,14 +36,14 @@
|
|
|
36
36
|
"dist"
|
|
37
37
|
],
|
|
38
38
|
"config": {
|
|
39
|
-
"sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.
|
|
39
|
+
"sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.5.0"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"@google/genai": "1.16.0",
|
|
43
43
|
"@iarna/toml": "^2.2.5",
|
|
44
44
|
"@modelcontextprotocol/sdk": "^1.15.1",
|
|
45
45
|
"@types/update-notifier": "^6.0.8",
|
|
46
|
-
"@umsai/ums-code-core": "0.
|
|
46
|
+
"@umsai/ums-code-core": "0.5.0-v1",
|
|
47
47
|
"ansi-regex": "^6.2.2",
|
|
48
48
|
"command-exists": "^1.2.9",
|
|
49
49
|
"comment-json": "^4.2.5",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"dotenv": "^17.1.0",
|
|
52
52
|
"extract-zip": "^2.0.1",
|
|
53
53
|
"fzf": "^0.5.2",
|
|
54
|
-
"glob": "^10.
|
|
54
|
+
"glob": "^10.5.0",
|
|
55
55
|
"highlight.js": "^11.11.1",
|
|
56
56
|
"ink": "^6.4.0",
|
|
57
57
|
"ink-gradient": "^3.0.0",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"string-width": "^7.1.0",
|
|
68
68
|
"strip-ansi": "^7.1.0",
|
|
69
69
|
"strip-json-comments": "^3.1.1",
|
|
70
|
-
"tar": "^7.5.
|
|
70
|
+
"tar": "^7.5.2",
|
|
71
71
|
"undici": "^7.10.0",
|
|
72
72
|
"update-notifier": "^7.3.1",
|
|
73
73
|
"wrap-ansi": "9.0.2",
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Qwen Team
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* MCP Controller
|
|
8
|
-
*
|
|
9
|
-
* Handles MCP-related control requests:
|
|
10
|
-
* - mcp_message: Route MCP messages
|
|
11
|
-
* - mcp_server_status: Return MCP server status
|
|
12
|
-
*/
|
|
13
|
-
import { BaseController } from './baseController.js';
|
|
14
|
-
import type { ControlRequestPayload } from '../../types.js';
|
|
15
|
-
export declare class MCPController extends BaseController {
|
|
16
|
-
/**
|
|
17
|
-
* Handle MCP control requests
|
|
18
|
-
*/
|
|
19
|
-
protected handleRequestPayload(payload: ControlRequestPayload, _signal: AbortSignal): Promise<Record<string, unknown>>;
|
|
20
|
-
/**
|
|
21
|
-
* Handle mcp_message request
|
|
22
|
-
*
|
|
23
|
-
* Routes JSON-RPC messages to MCP servers
|
|
24
|
-
*/
|
|
25
|
-
private handleMcpMessage;
|
|
26
|
-
/**
|
|
27
|
-
* Handle mcp_server_status request
|
|
28
|
-
*
|
|
29
|
-
* Returns status of registered MCP servers
|
|
30
|
-
*/
|
|
31
|
-
private handleMcpStatus;
|
|
32
|
-
/**
|
|
33
|
-
* Get or create MCP client for a server
|
|
34
|
-
*
|
|
35
|
-
* Implements lazy connection and caching
|
|
36
|
-
*/
|
|
37
|
-
private getOrCreateMcpClient;
|
|
38
|
-
/**
|
|
39
|
-
* Cleanup MCP clients
|
|
40
|
-
*/
|
|
41
|
-
cleanup(): void;
|
|
42
|
-
}
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Qwen Team
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* MCP Controller
|
|
8
|
-
*
|
|
9
|
-
* Handles MCP-related control requests:
|
|
10
|
-
* - mcp_message: Route MCP messages
|
|
11
|
-
* - mcp_server_status: Return MCP server status
|
|
12
|
-
*/
|
|
13
|
-
import { BaseController } from './baseController.js';
|
|
14
|
-
import { ResultSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
15
|
-
import { connectToMcpServer, MCP_DEFAULT_TIMEOUT_MSEC, } from '@umsai/ums-code-core';
|
|
16
|
-
export class MCPController extends BaseController {
|
|
17
|
-
/**
|
|
18
|
-
* Handle MCP control requests
|
|
19
|
-
*/
|
|
20
|
-
async handleRequestPayload(payload, _signal) {
|
|
21
|
-
switch (payload.subtype) {
|
|
22
|
-
case 'mcp_message':
|
|
23
|
-
return this.handleMcpMessage(payload);
|
|
24
|
-
case 'mcp_server_status':
|
|
25
|
-
return this.handleMcpStatus();
|
|
26
|
-
default:
|
|
27
|
-
throw new Error(`Unsupported request subtype in MCPController`);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Handle mcp_message request
|
|
32
|
-
*
|
|
33
|
-
* Routes JSON-RPC messages to MCP servers
|
|
34
|
-
*/
|
|
35
|
-
async handleMcpMessage(payload) {
|
|
36
|
-
const serverNameRaw = payload.server_name;
|
|
37
|
-
if (typeof serverNameRaw !== 'string' ||
|
|
38
|
-
serverNameRaw.trim().length === 0) {
|
|
39
|
-
throw new Error('Missing server_name in mcp_message request');
|
|
40
|
-
}
|
|
41
|
-
const message = payload.message;
|
|
42
|
-
if (!message || typeof message !== 'object') {
|
|
43
|
-
throw new Error('Missing or invalid message payload for mcp_message request');
|
|
44
|
-
}
|
|
45
|
-
// Get or create MCP client
|
|
46
|
-
let clientEntry;
|
|
47
|
-
try {
|
|
48
|
-
clientEntry = await this.getOrCreateMcpClient(serverNameRaw.trim());
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
throw new Error(error instanceof Error
|
|
52
|
-
? error.message
|
|
53
|
-
: 'Failed to connect to MCP server');
|
|
54
|
-
}
|
|
55
|
-
const method = message.method;
|
|
56
|
-
if (typeof method !== 'string' || method.trim().length === 0) {
|
|
57
|
-
throw new Error('Invalid MCP message: missing method');
|
|
58
|
-
}
|
|
59
|
-
const jsonrpcVersion = typeof message.jsonrpc === 'string' ? message.jsonrpc : '2.0';
|
|
60
|
-
const messageId = message.id;
|
|
61
|
-
const params = message.params;
|
|
62
|
-
const timeout = typeof clientEntry.config.timeout === 'number'
|
|
63
|
-
? clientEntry.config.timeout
|
|
64
|
-
: MCP_DEFAULT_TIMEOUT_MSEC;
|
|
65
|
-
try {
|
|
66
|
-
// Handle notification (no id)
|
|
67
|
-
if (messageId === undefined) {
|
|
68
|
-
await clientEntry.client.notification({
|
|
69
|
-
method,
|
|
70
|
-
params,
|
|
71
|
-
});
|
|
72
|
-
return {
|
|
73
|
-
subtype: 'mcp_message',
|
|
74
|
-
mcp_response: {
|
|
75
|
-
jsonrpc: jsonrpcVersion,
|
|
76
|
-
id: null,
|
|
77
|
-
result: { success: true, acknowledged: true },
|
|
78
|
-
},
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
// Handle request (with id)
|
|
82
|
-
const result = await clientEntry.client.request({
|
|
83
|
-
method,
|
|
84
|
-
params,
|
|
85
|
-
}, ResultSchema, { timeout });
|
|
86
|
-
return {
|
|
87
|
-
subtype: 'mcp_message',
|
|
88
|
-
mcp_response: {
|
|
89
|
-
jsonrpc: jsonrpcVersion,
|
|
90
|
-
id: messageId,
|
|
91
|
-
result,
|
|
92
|
-
},
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
// If connection closed, remove from cache
|
|
97
|
-
if (error instanceof Error && /closed/i.test(error.message)) {
|
|
98
|
-
this.context.mcpClients.delete(serverNameRaw.trim());
|
|
99
|
-
}
|
|
100
|
-
const errorCode = typeof error?.code === 'number'
|
|
101
|
-
? error.code
|
|
102
|
-
: -32603;
|
|
103
|
-
const errorMessage = error instanceof Error
|
|
104
|
-
? error.message
|
|
105
|
-
: 'Failed to execute MCP request';
|
|
106
|
-
const errorData = error?.data;
|
|
107
|
-
const errorBody = {
|
|
108
|
-
code: errorCode,
|
|
109
|
-
message: errorMessage,
|
|
110
|
-
};
|
|
111
|
-
if (errorData !== undefined) {
|
|
112
|
-
errorBody['data'] = errorData;
|
|
113
|
-
}
|
|
114
|
-
return {
|
|
115
|
-
subtype: 'mcp_message',
|
|
116
|
-
mcp_response: {
|
|
117
|
-
jsonrpc: jsonrpcVersion,
|
|
118
|
-
id: messageId ?? null,
|
|
119
|
-
error: errorBody,
|
|
120
|
-
},
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Handle mcp_server_status request
|
|
126
|
-
*
|
|
127
|
-
* Returns status of registered MCP servers
|
|
128
|
-
*/
|
|
129
|
-
async handleMcpStatus() {
|
|
130
|
-
const status = {};
|
|
131
|
-
// Include SDK MCP servers
|
|
132
|
-
for (const serverName of this.context.sdkMcpServers) {
|
|
133
|
-
status[serverName] = 'connected';
|
|
134
|
-
}
|
|
135
|
-
// Include CLI-managed MCP clients
|
|
136
|
-
for (const serverName of this.context.mcpClients.keys()) {
|
|
137
|
-
status[serverName] = 'connected';
|
|
138
|
-
}
|
|
139
|
-
if (this.context.debugMode) {
|
|
140
|
-
console.error(`[MCPController] MCP status: ${Object.keys(status).length} servers`);
|
|
141
|
-
}
|
|
142
|
-
return status;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Get or create MCP client for a server
|
|
146
|
-
*
|
|
147
|
-
* Implements lazy connection and caching
|
|
148
|
-
*/
|
|
149
|
-
async getOrCreateMcpClient(serverName) {
|
|
150
|
-
// Check cache first
|
|
151
|
-
const cached = this.context.mcpClients.get(serverName);
|
|
152
|
-
if (cached) {
|
|
153
|
-
return cached;
|
|
154
|
-
}
|
|
155
|
-
// Get server configuration
|
|
156
|
-
const provider = this.context.config;
|
|
157
|
-
if (typeof provider.getMcpServers !== 'function') {
|
|
158
|
-
throw new Error(`MCP server "${serverName}" is not configured`);
|
|
159
|
-
}
|
|
160
|
-
const servers = provider.getMcpServers() ?? {};
|
|
161
|
-
const serverConfig = servers[serverName];
|
|
162
|
-
if (!serverConfig) {
|
|
163
|
-
throw new Error(`MCP server "${serverName}" is not configured`);
|
|
164
|
-
}
|
|
165
|
-
const debugMode = typeof provider.getDebugMode === 'function'
|
|
166
|
-
? provider.getDebugMode()
|
|
167
|
-
: false;
|
|
168
|
-
const workspaceContext = typeof provider.getWorkspaceContext === 'function'
|
|
169
|
-
? provider.getWorkspaceContext()
|
|
170
|
-
: undefined;
|
|
171
|
-
if (!workspaceContext) {
|
|
172
|
-
throw new Error('Workspace context is not available for MCP connection');
|
|
173
|
-
}
|
|
174
|
-
// Connect to MCP server
|
|
175
|
-
const client = await connectToMcpServer(serverName, serverConfig, debugMode, workspaceContext);
|
|
176
|
-
// Cache the client
|
|
177
|
-
const entry = { client, config: serverConfig };
|
|
178
|
-
this.context.mcpClients.set(serverName, entry);
|
|
179
|
-
if (this.context.debugMode) {
|
|
180
|
-
console.error(`[MCPController] Connected to MCP server: ${serverName}`);
|
|
181
|
-
}
|
|
182
|
-
return entry;
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Cleanup MCP clients
|
|
186
|
-
*/
|
|
187
|
-
cleanup() {
|
|
188
|
-
if (this.context.debugMode) {
|
|
189
|
-
console.error(`[MCPController] Cleaning up ${this.context.mcpClients.size} MCP clients`);
|
|
190
|
-
}
|
|
191
|
-
// Close all MCP clients
|
|
192
|
-
for (const [serverName, { client }] of this.context.mcpClients.entries()) {
|
|
193
|
-
try {
|
|
194
|
-
client.close();
|
|
195
|
-
}
|
|
196
|
-
catch (error) {
|
|
197
|
-
if (this.context.debugMode) {
|
|
198
|
-
console.error(`[MCPController] Failed to close MCP client ${serverName}:`, error);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
this.context.mcpClients.clear();
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
//# sourceMappingURL=mcpController.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcpController.js","sourceRoot":"","sources":["../../../../../src/nonInteractive/control/controllers/mcpController.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import type { SlashCommand } from './types.js';
|
|
7
|
-
import type { Content } from '@google/genai';
|
|
8
|
-
export declare function serializeHistoryToMarkdown(history: Content[]): string;
|
|
9
|
-
export declare const chatCommand: SlashCommand;
|
|
@@ -1,351 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import * as fsPromises from 'fs/promises';
|
|
7
|
-
import React from 'react';
|
|
8
|
-
import { Text } from 'ink';
|
|
9
|
-
import { CommandKind } from './types.js';
|
|
10
|
-
import { decodeTagName } from '@umsai/ums-code-core';
|
|
11
|
-
import path from 'node:path';
|
|
12
|
-
import { MessageType } from '../types.js';
|
|
13
|
-
import { t } from '../../i18n/index.js';
|
|
14
|
-
const getSavedChatTags = async (context, mtSortDesc) => {
|
|
15
|
-
const cfg = context.services.config;
|
|
16
|
-
const geminiDir = cfg?.storage?.getProjectTempDir();
|
|
17
|
-
if (!geminiDir) {
|
|
18
|
-
return [];
|
|
19
|
-
}
|
|
20
|
-
try {
|
|
21
|
-
const file_head = 'checkpoint-';
|
|
22
|
-
const file_tail = '.json';
|
|
23
|
-
const files = await fsPromises.readdir(geminiDir);
|
|
24
|
-
const chatDetails = [];
|
|
25
|
-
for (const file of files) {
|
|
26
|
-
if (file.startsWith(file_head) && file.endsWith(file_tail)) {
|
|
27
|
-
const filePath = path.join(geminiDir, file);
|
|
28
|
-
const stats = await fsPromises.stat(filePath);
|
|
29
|
-
const tagName = file.slice(file_head.length, -file_tail.length);
|
|
30
|
-
chatDetails.push({
|
|
31
|
-
name: decodeTagName(tagName),
|
|
32
|
-
mtime: stats.mtime,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
chatDetails.sort((a, b) => mtSortDesc
|
|
37
|
-
? b.mtime.getTime() - a.mtime.getTime()
|
|
38
|
-
: a.mtime.getTime() - b.mtime.getTime());
|
|
39
|
-
return chatDetails;
|
|
40
|
-
}
|
|
41
|
-
catch (_err) {
|
|
42
|
-
return [];
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
const listCommand = {
|
|
46
|
-
name: 'list',
|
|
47
|
-
get description() {
|
|
48
|
-
return t('List saved conversation checkpoints');
|
|
49
|
-
},
|
|
50
|
-
kind: CommandKind.BUILT_IN,
|
|
51
|
-
action: async (context) => {
|
|
52
|
-
const chatDetails = await getSavedChatTags(context, false);
|
|
53
|
-
if (chatDetails.length === 0) {
|
|
54
|
-
return {
|
|
55
|
-
type: 'message',
|
|
56
|
-
messageType: 'info',
|
|
57
|
-
content: t('No saved conversation checkpoints found.'),
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
const maxNameLength = Math.max(...chatDetails.map((chat) => chat.name.length));
|
|
61
|
-
let message = t('List of saved conversations:') + '\n\n';
|
|
62
|
-
for (const chat of chatDetails) {
|
|
63
|
-
const paddedName = chat.name.padEnd(maxNameLength, ' ');
|
|
64
|
-
const isoString = chat.mtime.toISOString();
|
|
65
|
-
const match = isoString.match(/(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})/);
|
|
66
|
-
const formattedDate = match ? `${match[1]} ${match[2]}` : 'Invalid Date';
|
|
67
|
-
message += ` - ${paddedName} (saved on ${formattedDate})\n`;
|
|
68
|
-
}
|
|
69
|
-
message += `\n${t('Note: Newest last, oldest first')}`;
|
|
70
|
-
return {
|
|
71
|
-
type: 'message',
|
|
72
|
-
messageType: 'info',
|
|
73
|
-
content: message,
|
|
74
|
-
};
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
const saveCommand = {
|
|
78
|
-
name: 'save',
|
|
79
|
-
get description() {
|
|
80
|
-
return t('Save the current conversation as a checkpoint. Usage: /chat save <tag>');
|
|
81
|
-
},
|
|
82
|
-
kind: CommandKind.BUILT_IN,
|
|
83
|
-
action: async (context, args) => {
|
|
84
|
-
const tag = args.trim();
|
|
85
|
-
if (!tag) {
|
|
86
|
-
return {
|
|
87
|
-
type: 'message',
|
|
88
|
-
messageType: 'error',
|
|
89
|
-
content: t('Missing tag. Usage: /chat save <tag>'),
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
const { logger, config } = context.services;
|
|
93
|
-
await logger.initialize();
|
|
94
|
-
if (!context.overwriteConfirmed) {
|
|
95
|
-
const exists = await logger.checkpointExists(tag);
|
|
96
|
-
if (exists) {
|
|
97
|
-
return {
|
|
98
|
-
type: 'confirm_action',
|
|
99
|
-
prompt: React.createElement(Text, null, t('A checkpoint with the tag {{tag}} already exists. Do you want to overwrite it?', {
|
|
100
|
-
tag,
|
|
101
|
-
})),
|
|
102
|
-
originalInvocation: {
|
|
103
|
-
raw: context.invocation?.raw || `/chat save ${tag}`,
|
|
104
|
-
},
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
const chat = await config?.getGeminiClient()?.getChat();
|
|
109
|
-
if (!chat) {
|
|
110
|
-
return {
|
|
111
|
-
type: 'message',
|
|
112
|
-
messageType: 'error',
|
|
113
|
-
content: t('No chat client available to save conversation.'),
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
const history = chat.getHistory();
|
|
117
|
-
if (history.length > 2) {
|
|
118
|
-
await logger.saveCheckpoint(history, tag);
|
|
119
|
-
return {
|
|
120
|
-
type: 'message',
|
|
121
|
-
messageType: 'info',
|
|
122
|
-
content: t('Conversation checkpoint saved with tag: {{tag}}.', {
|
|
123
|
-
tag: decodeTagName(tag),
|
|
124
|
-
}),
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
return {
|
|
129
|
-
type: 'message',
|
|
130
|
-
messageType: 'info',
|
|
131
|
-
content: t('No conversation found to save.'),
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
},
|
|
135
|
-
};
|
|
136
|
-
const resumeCommand = {
|
|
137
|
-
name: 'resume',
|
|
138
|
-
altNames: ['load'],
|
|
139
|
-
get description() {
|
|
140
|
-
return t('Resume a conversation from a checkpoint. Usage: /chat resume <tag>');
|
|
141
|
-
},
|
|
142
|
-
kind: CommandKind.BUILT_IN,
|
|
143
|
-
action: async (context, args) => {
|
|
144
|
-
const tag = args.trim();
|
|
145
|
-
if (!tag) {
|
|
146
|
-
return {
|
|
147
|
-
type: 'message',
|
|
148
|
-
messageType: 'error',
|
|
149
|
-
content: t('Missing tag. Usage: /chat resume <tag>'),
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
const { logger } = context.services;
|
|
153
|
-
await logger.initialize();
|
|
154
|
-
const conversation = await logger.loadCheckpoint(tag);
|
|
155
|
-
if (conversation.length === 0) {
|
|
156
|
-
return {
|
|
157
|
-
type: 'message',
|
|
158
|
-
messageType: 'info',
|
|
159
|
-
content: t('No saved checkpoint found with tag: {{tag}}.', {
|
|
160
|
-
tag: decodeTagName(tag),
|
|
161
|
-
}),
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
const rolemap = {
|
|
165
|
-
user: MessageType.USER,
|
|
166
|
-
model: MessageType.GEMINI,
|
|
167
|
-
};
|
|
168
|
-
const uiHistory = [];
|
|
169
|
-
let hasSystemPrompt = false;
|
|
170
|
-
let i = 0;
|
|
171
|
-
for (const item of conversation) {
|
|
172
|
-
i += 1;
|
|
173
|
-
const text = item.parts
|
|
174
|
-
?.filter((m) => !!m.text)
|
|
175
|
-
.map((m) => m.text)
|
|
176
|
-
.join('') || '';
|
|
177
|
-
if (!text) {
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
if (i === 1 && text.match(/context for our chat/)) {
|
|
181
|
-
hasSystemPrompt = true;
|
|
182
|
-
}
|
|
183
|
-
if (i > 2 || !hasSystemPrompt) {
|
|
184
|
-
uiHistory.push({
|
|
185
|
-
type: (item.role && rolemap[item.role]) || MessageType.GEMINI,
|
|
186
|
-
text,
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
return {
|
|
191
|
-
type: 'load_history',
|
|
192
|
-
history: uiHistory,
|
|
193
|
-
clientHistory: conversation,
|
|
194
|
-
};
|
|
195
|
-
},
|
|
196
|
-
completion: async (context, partialArg) => {
|
|
197
|
-
const chatDetails = await getSavedChatTags(context, true);
|
|
198
|
-
return chatDetails
|
|
199
|
-
.map((chat) => chat.name)
|
|
200
|
-
.filter((name) => name.startsWith(partialArg));
|
|
201
|
-
},
|
|
202
|
-
};
|
|
203
|
-
const deleteCommand = {
|
|
204
|
-
name: 'delete',
|
|
205
|
-
get description() {
|
|
206
|
-
return t('Delete a conversation checkpoint. Usage: /chat delete <tag>');
|
|
207
|
-
},
|
|
208
|
-
kind: CommandKind.BUILT_IN,
|
|
209
|
-
action: async (context, args) => {
|
|
210
|
-
const tag = args.trim();
|
|
211
|
-
if (!tag) {
|
|
212
|
-
return {
|
|
213
|
-
type: 'message',
|
|
214
|
-
messageType: 'error',
|
|
215
|
-
content: t('Missing tag. Usage: /chat delete <tag>'),
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
const { logger } = context.services;
|
|
219
|
-
await logger.initialize();
|
|
220
|
-
const deleted = await logger.deleteCheckpoint(tag);
|
|
221
|
-
if (deleted) {
|
|
222
|
-
return {
|
|
223
|
-
type: 'message',
|
|
224
|
-
messageType: 'info',
|
|
225
|
-
content: t("Conversation checkpoint '{{tag}}' has been deleted.", {
|
|
226
|
-
tag: decodeTagName(tag),
|
|
227
|
-
}),
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
return {
|
|
232
|
-
type: 'message',
|
|
233
|
-
messageType: 'error',
|
|
234
|
-
content: t("Error: No checkpoint found with tag '{{tag}}'.", {
|
|
235
|
-
tag: decodeTagName(tag),
|
|
236
|
-
}),
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
},
|
|
240
|
-
completion: async (context, partialArg) => {
|
|
241
|
-
const chatDetails = await getSavedChatTags(context, true);
|
|
242
|
-
return chatDetails
|
|
243
|
-
.map((chat) => chat.name)
|
|
244
|
-
.filter((name) => name.startsWith(partialArg));
|
|
245
|
-
},
|
|
246
|
-
};
|
|
247
|
-
export function serializeHistoryToMarkdown(history) {
|
|
248
|
-
return history
|
|
249
|
-
.map((item) => {
|
|
250
|
-
const text = item.parts
|
|
251
|
-
?.map((part) => {
|
|
252
|
-
if (part.text) {
|
|
253
|
-
return part.text;
|
|
254
|
-
}
|
|
255
|
-
if (part.functionCall) {
|
|
256
|
-
return `**Tool Command**:\n\`\`\`json\n${JSON.stringify(part.functionCall, null, 2)}\n\`\`\``;
|
|
257
|
-
}
|
|
258
|
-
if (part.functionResponse) {
|
|
259
|
-
return `**Tool Response**:\n\`\`\`json\n${JSON.stringify(part.functionResponse, null, 2)}\n\`\`\``;
|
|
260
|
-
}
|
|
261
|
-
return '';
|
|
262
|
-
})
|
|
263
|
-
.join('') || '';
|
|
264
|
-
const roleIcon = item.role === 'user' ? '🧑💻' : '✨';
|
|
265
|
-
return `${roleIcon} ## ${(item.role || 'model').toUpperCase()}\n\n${text}`;
|
|
266
|
-
})
|
|
267
|
-
.join('\n\n---\n\n');
|
|
268
|
-
}
|
|
269
|
-
const shareCommand = {
|
|
270
|
-
name: 'share',
|
|
271
|
-
get description() {
|
|
272
|
-
return t('Share the current conversation to a markdown or json file. Usage: /chat share <file>');
|
|
273
|
-
},
|
|
274
|
-
kind: CommandKind.BUILT_IN,
|
|
275
|
-
action: async (context, args) => {
|
|
276
|
-
let filePathArg = args.trim();
|
|
277
|
-
if (!filePathArg) {
|
|
278
|
-
filePathArg = `gemini-conversation-${Date.now()}.json`;
|
|
279
|
-
}
|
|
280
|
-
const filePath = path.resolve(filePathArg);
|
|
281
|
-
const extension = path.extname(filePath);
|
|
282
|
-
if (extension !== '.md' && extension !== '.json') {
|
|
283
|
-
return {
|
|
284
|
-
type: 'message',
|
|
285
|
-
messageType: 'error',
|
|
286
|
-
content: t('Invalid file format. Only .md and .json are supported.'),
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
const chat = await context.services.config?.getGeminiClient()?.getChat();
|
|
290
|
-
if (!chat) {
|
|
291
|
-
return {
|
|
292
|
-
type: 'message',
|
|
293
|
-
messageType: 'error',
|
|
294
|
-
content: t('No chat client available to share conversation.'),
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
const history = chat.getHistory();
|
|
298
|
-
// An empty conversation has two hidden messages that setup the context for
|
|
299
|
-
// the chat. Thus, to check whether a conversation has been started, we
|
|
300
|
-
// can't check for length 0.
|
|
301
|
-
if (history.length <= 2) {
|
|
302
|
-
return {
|
|
303
|
-
type: 'message',
|
|
304
|
-
messageType: 'info',
|
|
305
|
-
content: t('No conversation found to share.'),
|
|
306
|
-
};
|
|
307
|
-
}
|
|
308
|
-
let content = '';
|
|
309
|
-
if (extension === '.json') {
|
|
310
|
-
content = JSON.stringify(history, null, 2);
|
|
311
|
-
}
|
|
312
|
-
else {
|
|
313
|
-
content = serializeHistoryToMarkdown(history);
|
|
314
|
-
}
|
|
315
|
-
try {
|
|
316
|
-
await fsPromises.writeFile(filePath, content);
|
|
317
|
-
return {
|
|
318
|
-
type: 'message',
|
|
319
|
-
messageType: 'info',
|
|
320
|
-
content: t('Conversation shared to {{filePath}}', {
|
|
321
|
-
filePath,
|
|
322
|
-
}),
|
|
323
|
-
};
|
|
324
|
-
}
|
|
325
|
-
catch (err) {
|
|
326
|
-
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
327
|
-
return {
|
|
328
|
-
type: 'message',
|
|
329
|
-
messageType: 'error',
|
|
330
|
-
content: t('Error sharing conversation: {{error}}', {
|
|
331
|
-
error: errorMessage,
|
|
332
|
-
}),
|
|
333
|
-
};
|
|
334
|
-
}
|
|
335
|
-
},
|
|
336
|
-
};
|
|
337
|
-
export const chatCommand = {
|
|
338
|
-
name: 'chat',
|
|
339
|
-
get description() {
|
|
340
|
-
return t('Manage conversation history.');
|
|
341
|
-
},
|
|
342
|
-
kind: CommandKind.BUILT_IN,
|
|
343
|
-
subCommands: [
|
|
344
|
-
listCommand,
|
|
345
|
-
saveCommand,
|
|
346
|
-
resumeCommand,
|
|
347
|
-
deleteCommand,
|
|
348
|
-
shareCommand,
|
|
349
|
-
],
|
|
350
|
-
};
|
|
351
|
-
//# sourceMappingURL=chatCommand.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chatCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/chatCommand.ts"],"names":[],"mappings":"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"}
|