@deepseek-harness-tui/dsh-tui 0.9.0 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -256
- package/bin/dsh-tui.js +172 -5
- package/cordis.patch.yml +16 -4
- package/dsh-ecosystem-spec/protocols/profile-definitions.d.ts +13 -13
- package/dsh-ecosystem-spec/protocols/profile-definitions.js +59 -59
- package/dsh-ecosystem-spec/protocols/tui-channel-http.d.ts +15 -15
- package/dsh-ecosystem-spec/protocols/tui-channel-http.js +32 -32
- package/dsh-ecosystem-spec/protocols/tui-channel.d.ts +59 -59
- package/dsh-ecosystem-spec/protocols/tui-channel.js +166 -166
- package/dsh-ecosystem-spec/protocols/tui-contributions.d.ts +42 -42
- package/dsh-ecosystem-spec/protocols/tui-contributions.js +143 -143
- package/dsh-ecosystem-spec/registry/README.md +14 -14
- package/dsh-ecosystem-spec/registry/host-descriptor.tui.example.json +56 -56
- package/dsh-ecosystem-spec/registry/permissions-0.1.json +13 -13
- package/dsh-ecosystem-spec/registry/registry-0.15.json +149 -149
- package/lib/types/cc/hyperlink.d.ts +7 -1
- package/lib/types/cc/hyperlink.d.ts.map +1 -1
- package/lib/types/cc/hyperlink.js +3 -2
- package/lib/types/cc/markdown.d.ts.map +1 -1
- package/lib/types/cc/markdown.js +33 -3
- package/lib/types/cc/sessionColors.d.ts +27 -0
- package/lib/types/cc/sessionColors.d.ts.map +1 -0
- package/lib/types/cc/sessionColors.js +39 -0
- package/lib/types/commands.d.ts.map +1 -1
- package/lib/types/commands.js +6 -0
- package/lib/types/components/AutoRecapRow.d.ts +23 -0
- package/lib/types/components/AutoRecapRow.d.ts.map +1 -0
- package/lib/types/components/AutoRecapRow.js +23 -0
- package/lib/types/components/ColorPicker.d.ts +17 -0
- package/lib/types/components/ColorPicker.d.ts.map +1 -0
- package/lib/types/components/ColorPicker.js +20 -0
- package/lib/types/components/CommandSuggestions.d.ts +3 -1
- package/lib/types/components/CommandSuggestions.d.ts.map +1 -1
- package/lib/types/components/ContextBarView.d.ts +33 -0
- package/lib/types/components/ContextBarView.d.ts.map +1 -0
- package/lib/types/components/ContextBarView.js +46 -0
- package/lib/types/components/EffortInputBorder.d.ts +12 -1
- package/lib/types/components/EffortInputBorder.d.ts.map +1 -1
- package/lib/types/components/EffortInputBorder.js +22 -5
- package/lib/types/components/FileActionsPanel.d.ts +22 -0
- package/lib/types/components/FileActionsPanel.d.ts.map +1 -0
- package/lib/types/components/FileActionsPanel.js +28 -0
- package/lib/types/components/FileSuggestions.d.ts +3 -1
- package/lib/types/components/FileSuggestions.d.ts.map +1 -1
- package/lib/types/components/MessageList.d.ts +3 -1
- package/lib/types/components/MessageList.d.ts.map +1 -1
- package/lib/types/components/MessageList.js +13 -6
- package/lib/types/components/ModelPicker.d.ts +26 -4
- package/lib/types/components/ModelPicker.d.ts.map +1 -1
- package/lib/types/components/ModelPicker.js +26 -6
- package/lib/types/components/PromptInput.d.ts.map +1 -1
- package/lib/types/components/PromptInput.js +365 -57
- package/lib/types/components/RecapPanel.d.ts +25 -0
- package/lib/types/components/RecapPanel.d.ts.map +1 -0
- package/lib/types/components/RecapPanel.js +55 -0
- package/lib/types/components/ScrollbarGutter.d.ts.map +1 -1
- package/lib/types/components/ScrollbarGutter.js +55 -4
- package/lib/types/components/SubagentCard.d.ts.map +1 -1
- package/lib/types/components/SubagentCard.js +6 -4
- package/lib/types/components/SuggestionCard.d.ts +4 -2
- package/lib/types/components/SuggestionCard.d.ts.map +1 -1
- package/lib/types/components/TimelineRail.d.ts.map +1 -1
- package/lib/types/components/TimelineRail.js +9 -2
- package/lib/types/components/design-system/ThemeProvider.d.ts +7 -0
- package/lib/types/components/design-system/ThemeProvider.d.ts.map +1 -1
- package/lib/types/components/design-system/ThemeProvider.js +2 -1
- package/lib/types/components/messages/AssistantToolUseMessage.d.ts +8 -1
- package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -1
- package/lib/types/components/messages/AssistantToolUseMessage.js +36 -8
- package/lib/types/components/questions/AskUserQuestionPanel.d.ts +7 -3
- package/lib/types/components/questions/AskUserQuestionPanel.d.ts.map +1 -1
- package/lib/types/components/questions/AskUserQuestionPanel.js +41 -9
- package/lib/types/dsh-adapter/channel.d.ts +101 -2
- package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel.js +969 -93
- package/lib/types/dsh-adapter/compat/index.d.ts +8 -6
- package/lib/types/dsh-adapter/compat/index.d.ts.map +1 -1
- package/lib/types/dsh-adapter/compat/index.js +8 -6
- package/lib/types/dsh-adapter/compat/sessionLog.d.ts +150 -0
- package/lib/types/dsh-adapter/compat/sessionLog.d.ts.map +1 -1
- package/lib/types/dsh-adapter/compat/sessionLog.js +518 -41
- package/lib/types/dsh-adapter/contract.d.ts +1 -1
- package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
- package/lib/types/dsh-adapter/contract.js +1 -0
- package/lib/types/dsh-adapter/extension-events.d.ts +1 -1
- package/lib/types/dsh-adapter/extension-events.d.ts.map +1 -1
- package/lib/types/dsh-adapter/index.d.ts +10 -0
- package/lib/types/dsh-adapter/index.d.ts.map +1 -1
- package/lib/types/dsh-adapter/index.js +5 -0
- package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
- package/lib/types/dsh-adapter/plugin.js +317 -8
- package/lib/types/dsh-adapter/presets.d.ts +18 -0
- package/lib/types/dsh-adapter/presets.d.ts.map +1 -1
- package/lib/types/dsh-adapter/presets.js +31 -0
- package/lib/types/dsh-adapter/providerWizard.d.ts +29 -1
- package/lib/types/dsh-adapter/providerWizard.d.ts.map +1 -1
- package/lib/types/dsh-adapter/providerWizard.js +89 -5
- package/lib/types/dsh-adapter/questions.d.ts +19 -2
- package/lib/types/dsh-adapter/questions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/questions.js +53 -10
- package/lib/types/dsh-adapter/recap.d.ts +49 -0
- package/lib/types/dsh-adapter/recap.d.ts.map +1 -0
- package/lib/types/dsh-adapter/recap.js +121 -0
- package/lib/types/dsh-adapter/sessionTree.d.ts +314 -0
- package/lib/types/dsh-adapter/sessionTree.d.ts.map +1 -0
- package/lib/types/dsh-adapter/sessionTree.js +954 -0
- package/lib/types/dsh-adapter/shortcuts.d.ts +15 -44
- package/lib/types/dsh-adapter/shortcuts.d.ts.map +1 -1
- package/lib/types/dsh-adapter/shortcuts.js +28 -165
- package/lib/types/dsh-adapter/types.d.ts +1 -1
- package/lib/types/dsh-adapter/types.d.ts.map +1 -1
- package/lib/types/herdr.js +1 -1
- package/lib/types/i18n.d.ts +604 -176
- package/lib/types/i18n.d.ts.map +1 -1
- package/lib/types/i18n.js +206 -72
- package/lib/types/ink/log-update.d.ts.map +1 -1
- package/lib/types/ink/log-update.js +21 -0
- package/lib/types/migrationPrefs.d.ts +60 -0
- package/lib/types/migrationPrefs.d.ts.map +1 -0
- package/lib/types/migrationPrefs.js +97 -0
- package/lib/types/modelGroups.d.ts +72 -0
- package/lib/types/modelGroups.d.ts.map +1 -0
- package/lib/types/modelGroups.js +97 -0
- package/lib/types/modelRecents.d.ts +39 -0
- package/lib/types/modelRecents.d.ts.map +1 -0
- package/lib/types/modelRecents.js +97 -0
- package/lib/types/native-ts/yoga-layout/index.d.ts +11 -0
- package/lib/types/native-ts/yoga-layout/index.d.ts.map +1 -1
- package/lib/types/native-ts/yoga-layout/index.js +31 -1
- package/lib/types/oauth.d.ts +15 -0
- package/lib/types/oauth.d.ts.map +1 -0
- package/lib/types/oauth.js +14 -0
- package/lib/types/plugin-spec/registry.d.ts +1 -1
- package/lib/types/plugin-spec/registry.js +1 -1
- package/lib/types/reload.d.ts +109 -0
- package/lib/types/reload.d.ts.map +1 -0
- package/lib/types/reload.js +118 -0
- package/lib/types/screens/Chat.d.ts +3 -1
- package/lib/types/screens/Chat.d.ts.map +1 -1
- package/lib/types/screens/Chat.js +588 -64
- package/lib/types/screens/SessionTree.d.ts +27 -0
- package/lib/types/screens/SessionTree.d.ts.map +1 -0
- package/lib/types/screens/SessionTree.js +555 -0
- package/lib/types/screens/StatusLine.d.ts +0 -9
- package/lib/types/screens/StatusLine.d.ts.map +1 -1
- package/lib/types/screens/StatusLine.js +215 -52
- package/lib/types/screens/StatusMetrics.d.ts +35 -3
- package/lib/types/screens/StatusMetrics.d.ts.map +1 -1
- package/lib/types/screens/StatusMetrics.js +63 -8
- package/lib/types/screens/chatOverlay.d.ts +17 -1
- package/lib/types/screens/chatOverlay.d.ts.map +1 -1
- package/lib/types/screens/chatOverlay.js +3 -1
- package/lib/types/tips.d.ts.map +1 -1
- package/lib/types/tips.js +22 -4
- package/lib/types/update.d.ts +159 -0
- package/lib/types/update.d.ts.map +1 -1
- package/lib/types/update.js +496 -30
- package/lib/types/utils/debug.d.ts +1 -1
- package/lib/types/utils/debug.js +3 -3
- package/lib/types/utils/fileTarget.d.ts +46 -0
- package/lib/types/utils/fileTarget.d.ts.map +1 -0
- package/lib/types/utils/fileTarget.js +178 -0
- package/lib/types/utils/keymap.d.ts +134 -0
- package/lib/types/utils/keymap.d.ts.map +1 -0
- package/lib/types/utils/keymap.js +311 -0
- package/lib/types/utils/mentions.d.ts +25 -2
- package/lib/types/utils/mentions.d.ts.map +1 -1
- package/lib/types/utils/mentions.js +69 -10
- package/lib/types/utils/openExternal.d.ts +50 -0
- package/lib/types/utils/openExternal.d.ts.map +1 -0
- package/lib/types/utils/openExternal.js +170 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/LICENSE +21 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/README.md +140 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/cordis.patch.yml +11 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/dsh-plugin.json +44 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/command.d.ts +14 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/command.js +67 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/credentials.d.ts +64 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/credentials.js +170 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/index.d.ts +79 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/index.js +196 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/interaction.d.ts +68 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/interaction.js +193 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/opener.d.ts +32 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/opener.js +101 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/profiles.d.ts +31 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/profiles.js +68 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/service.d.ts +69 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/service.js +129 -0
- package/node_modules/@deepseek-harness-tui/dsh-auth/package.json +70 -0
- package/node_modules/@dsh-std/command/CHANGELOG.md +8 -8
- package/node_modules/@dsh-std/command/LICENSE +21 -21
- package/node_modules/@dsh-std/command/README.md +26 -26
- package/node_modules/@dsh-std/command/README.zh.md +28 -28
- package/node_modules/@dsh-std/command/lib/index.js.map +1 -1
- package/node_modules/@dsh-std/command/package.json +22 -22
- package/node_modules/@dsh-std/connection/CHANGELOG.md +8 -8
- package/node_modules/@dsh-std/connection/LICENSE +21 -21
- package/node_modules/@dsh-std/connection/README.md +42 -42
- package/node_modules/@dsh-std/connection/README.zh.md +42 -42
- package/node_modules/@dsh-std/connection/lib/index.js.map +1 -1
- package/node_modules/@dsh-std/connection/lib/memory.js.map +1 -1
- package/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -1
- package/node_modules/@dsh-std/connection/package.json +20 -20
- package/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
- package/node_modules/@dsh-std/core/LICENSE +21 -21
- package/node_modules/@dsh-std/core/README.md +13 -13
- package/node_modules/@dsh-std/core/README.zh.md +13 -13
- package/node_modules/@dsh-std/core/lib/index.js.map +1 -1
- package/node_modules/@dsh-std/core/package.json +21 -21
- package/node_modules/@dsh-std/manifest/CHANGELOG.md +9 -9
- package/node_modules/@dsh-std/manifest/LICENSE +21 -21
- package/node_modules/@dsh-std/manifest/README.md +5 -5
- package/node_modules/@dsh-std/manifest/README.zh.md +5 -5
- package/node_modules/@dsh-std/manifest/lib/index.js.map +1 -1
- package/node_modules/@dsh-std/manifest/package.json +20 -20
- package/node_modules/@dsh-std/manifest/schema/dsh-plugin-0.15.schema.json +144 -144
- package/node_modules/@dsh-std/messages/CHANGELOG.md +8 -8
- package/node_modules/@dsh-std/messages/LICENSE +21 -21
- package/node_modules/@dsh-std/messages/README.md +5 -5
- package/node_modules/@dsh-std/messages/README.zh.md +7 -7
- package/node_modules/@dsh-std/messages/lib/index.js.map +1 -1
- package/node_modules/@dsh-std/messages/package.json +20 -20
- package/node_modules/@dsh-std/messages/schema/message-observer-envelope-0.15.schema.json +54 -54
- package/node_modules/@dsh-std/presentation/CHANGELOG.md +9 -9
- package/node_modules/@dsh-std/presentation/LICENSE +21 -21
- package/node_modules/@dsh-std/presentation/README.md +27 -27
- package/node_modules/@dsh-std/presentation/README.zh.md +29 -29
- package/node_modules/@dsh-std/presentation/lib/callback.js.map +1 -1
- package/node_modules/@dsh-std/presentation/lib/index.js.map +1 -1
- package/node_modules/@dsh-std/presentation/package.json +25 -25
- package/node_modules/@dsh-std/storage/CHANGELOG.md +8 -8
- package/node_modules/@dsh-std/storage/LICENSE +21 -21
- package/node_modules/@dsh-std/storage/README.md +5 -5
- package/node_modules/@dsh-std/storage/README.zh.md +7 -7
- package/node_modules/@dsh-std/storage/lib/index.js.map +1 -1
- package/node_modules/@dsh-std/storage/package.json +20 -20
- package/node_modules/@dsh-std/storage/schema/local-storage-0.15.schema.json +56 -56
- package/package.json +17 -5
- package/presets/liangshen/.dsh-tui-managed.json +1 -1
- package/presets/liangshen/instruction-hint.mjs +8 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/CHANGELOG.md +8 -8
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/LICENSE +21 -21
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/README.md +42 -42
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/README.zh.md +42 -42
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/index.js.map +1 -1
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/memory.js.map +1 -1
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -1
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/package.json +20 -20
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/LICENSE +21 -21
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/README.md +13 -13
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/README.zh.md +13 -13
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/lib/index.js.map +1 -1
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/package.json +21 -21
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/CHANGELOG.md +9 -9
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/LICENSE +21 -21
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/README.md +5 -5
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/README.zh.md +5 -5
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/lib/index.js.map +1 -1
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/package.json +20 -20
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/schema/dsh-plugin-0.15.schema.json +144 -144
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/CHANGELOG.md +9 -9
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/LICENSE +21 -21
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/README.md +27 -27
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/README.zh.md +29 -29
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/callback.js.map +1 -1
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/index.js.map +1 -1
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/package.json +25 -25
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/LICENSE +21 -21
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/README.md +13 -13
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/README.zh.md +13 -13
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/lib/index.js.map +1 -1
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/package.json +21 -21
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/LICENSE +21 -21
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/README.md +13 -13
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/README.zh.md +13 -13
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/lib/index.js.map +1 -1
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/package.json +21 -21
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/LICENSE +21 -21
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/README.md +13 -13
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/README.zh.md +13 -13
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/lib/index.js.map +1 -1
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/package.json +21 -21
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/CHANGELOG.md +8 -8
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/LICENSE +21 -21
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/README.md +42 -42
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/README.zh.md +42 -42
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/index.js.map +1 -1
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/memory.js.map +1 -1
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -1
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/package.json +20 -20
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/LICENSE +21 -21
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/README.md +13 -13
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/README.zh.md +13 -13
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/lib/index.js.map +1 -1
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/package.json +21 -21
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/LICENSE +21 -21
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/README.md +13 -13
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/README.zh.md +13 -13
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/lib/index.js.map +1 -1
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/package.json +21 -21
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import type { Color } from '../ink/styles.js';
|
|
3
|
+
import type { Theme } from '../theme.js';
|
|
2
4
|
import type { LocalCommand } from '../commands.js';
|
|
3
5
|
/**
|
|
4
6
|
* The slash-command suggestion overlay, mirroring Claude Code's
|
|
@@ -23,7 +25,7 @@ export declare function CommandSuggestions({ commands, selectedIndex, columns, q
|
|
|
23
25
|
columns: number;
|
|
24
26
|
/** 原始 `/…` 输入;其最后一段 token 用于名字前缀高亮。 */
|
|
25
27
|
query?: string;
|
|
26
|
-
accent?:
|
|
28
|
+
accent?: keyof Theme | Color;
|
|
27
29
|
/** 鼠标点击行(fullscreen):上报过滤后列表的绝对索引(与键盘
|
|
28
30
|
* selectedIndex 同一索引空间),接受路径由 PromptInput 复用。 */
|
|
29
31
|
onPick?: (index: number) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandSuggestions.d.ts","sourceRoot":"","sources":["../../../src/components/CommandSuggestions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAMlD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,aAAa,EACb,OAAO,EACP,KAAU,EACV,MAAM,EACN,MAAM,EACN,WAAW,GACZ,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC,YAAY,GAAG;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAA;IACjE,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"CommandSuggestions.d.ts","sourceRoot":"","sources":["../../../src/components/CommandSuggestions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAMlD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,aAAa,EACb,OAAO,EACP,KAAU,EACV,MAAM,EACN,MAAM,EACN,WAAW,GACZ,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC,YAAY,GAAG;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAA;IACjE,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,KAAK,GAAG,KAAK,CAAA;IAC5B;sDACkD;IAClD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,iCAAiC;IACjC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAA;CACrC,GAAG,KAAK,CAAC,SAAS,CAmFlB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Color } from '../ink/styles.js';
|
|
3
|
+
import { type ContextSegments } from '../screens/StatusMetrics.js';
|
|
4
|
+
/**
|
|
5
|
+
* The hoverable JSX twin of `renderContextBar`: the same segmented context
|
|
6
|
+
* bar (same largest-remainder column split, same label fallback ladder,
|
|
7
|
+
* same free-segment readout), rendered as one Box per segment so each
|
|
8
|
+
* carries its own mouse handlers. Hovering a segment reports its key (or
|
|
9
|
+
* `free`) upward through `onHover`; the footer turns that into a detail
|
|
10
|
+
* readout on its supplemental row.
|
|
11
|
+
*
|
|
12
|
+
* Pixel parity with the ANSI path is the contract: this exists so the bar
|
|
13
|
+
* can react to the pointer, not to restyle it.
|
|
14
|
+
*/
|
|
15
|
+
export declare function ContextBarView({ segments, usedTokens, contextWindow, width, colors, onHover, }: {
|
|
16
|
+
/** Used tokens per content type. */
|
|
17
|
+
segments: ContextSegments;
|
|
18
|
+
/** Total used tokens, driving the usage readout. */
|
|
19
|
+
usedTokens: number;
|
|
20
|
+
/** The context window size in tokens. */
|
|
21
|
+
contextWindow: number;
|
|
22
|
+
/** Total bar width in terminal columns. */
|
|
23
|
+
width: number;
|
|
24
|
+
/** Theme overrides for the free segment (light theme passes its own). */
|
|
25
|
+
colors?: {
|
|
26
|
+
freeFill: Color;
|
|
27
|
+
freeText: Color;
|
|
28
|
+
};
|
|
29
|
+
/** Hover signal: a segment key (`system`…`tools`), `free`, or null on
|
|
30
|
+
* leave. Absent handlers render a static bar (tests, headless embeds). */
|
|
31
|
+
onHover?: (segment: string | null) => void;
|
|
32
|
+
}): React.ReactNode;
|
|
33
|
+
//# sourceMappingURL=ContextBarView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextBarView.d.ts","sourceRoot":"","sources":["../../../src/components/ContextBarView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAA;AAOpC;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,UAAU,EACV,aAAa,EACb,KAAK,EACL,MAAM,EACN,OAAO,GACR,EAAE;IACD,oCAAoC;IACpC,QAAQ,EAAE,eAAe,CAAA;IACzB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAA;IAClB,yCAAyC;IACzC,aAAa,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,yEAAyE;IACzE,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,KAAK,CAAC;QAAC,QAAQ,EAAE,KAAK,CAAA;KAAE,CAAA;IAC7C;+EAC2E;IAC3E,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;CAC3C,GAAG,KAAK,CAAC,SAAS,CAgElB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from '../ui.js';
|
|
3
|
+
import { USED_SEGMENTS, allocateBarColumns, centeredText, chooseLabel, composeFreeSegmentText, formatTokens, } from '../screens/StatusMetrics.js';
|
|
4
|
+
/** Free-segment colors, mirroring StatusMetrics' dark-theme defaults. */
|
|
5
|
+
const FREE_FILL = '#E8E8E8';
|
|
6
|
+
const FREE_TEXT = '#4A4A4A';
|
|
7
|
+
const USED_TEXT = '#FFFFFF';
|
|
8
|
+
/**
|
|
9
|
+
* The hoverable JSX twin of `renderContextBar`: the same segmented context
|
|
10
|
+
* bar (same largest-remainder column split, same label fallback ladder,
|
|
11
|
+
* same free-segment readout), rendered as one Box per segment so each
|
|
12
|
+
* carries its own mouse handlers. Hovering a segment reports its key (or
|
|
13
|
+
* `free`) upward through `onHover`; the footer turns that into a detail
|
|
14
|
+
* readout on its supplemental row.
|
|
15
|
+
*
|
|
16
|
+
* Pixel parity with the ANSI path is the contract: this exists so the bar
|
|
17
|
+
* can react to the pointer, not to restyle it.
|
|
18
|
+
*/
|
|
19
|
+
export function ContextBarView({ segments, usedTokens, contextWindow, width, colors, onHover, }) {
|
|
20
|
+
if (width <= 0 || contextWindow <= 0)
|
|
21
|
+
return null;
|
|
22
|
+
const freeTokens = Math.max(0, contextWindow - usedTokens);
|
|
23
|
+
const values = [...USED_SEGMENTS.map(segment => segments[segment.key]), freeTokens];
|
|
24
|
+
const columns = allocateBarColumns(values, width);
|
|
25
|
+
const percent = `${((usedTokens / contextWindow) * 100).toFixed(1)}%`;
|
|
26
|
+
const total = `${formatTokens(usedTokens)}/${formatTokens(contextWindow)}`;
|
|
27
|
+
const free = formatTokens(contextWindow - usedTokens);
|
|
28
|
+
const nodes = [];
|
|
29
|
+
for (const [index, segment] of USED_SEGMENTS.entries()) {
|
|
30
|
+
const segmentWidth = columns[index] ?? 0;
|
|
31
|
+
if (segmentWidth <= 0)
|
|
32
|
+
continue;
|
|
33
|
+
const label = chooseLabel(segment.labels, segmentWidth);
|
|
34
|
+
nodes.push(_jsx(Box, { width: segmentWidth, height: 1, flexShrink: 0, backgroundColor: segment.color, onMouseEnter: onHover === undefined ? undefined : () => onHover(segment.key), onMouseLeave: onHover === undefined ? undefined : () => onHover(null), children: _jsx(Text, { color: USED_TEXT, children: label.length > 0 ? centeredText(label, segmentWidth) : ' '.repeat(segmentWidth) }) }, segment.key));
|
|
35
|
+
}
|
|
36
|
+
const freeWidth = columns[USED_SEGMENTS.length] ?? 0;
|
|
37
|
+
if (freeWidth > 0) {
|
|
38
|
+
nodes.push(_jsx(Box, { width: freeWidth, height: 1, flexShrink: 0, backgroundColor: colors?.freeFill ?? FREE_FILL, onMouseEnter: onHover === undefined ? undefined : () => onHover('free'), onMouseLeave: onHover === undefined ? undefined : () => onHover(null), children: _jsx(Text, { color: colors?.freeText ?? FREE_TEXT, children: composeFreeSegmentText([
|
|
39
|
+
`ctx ${total} ${percent} ${free}`,
|
|
40
|
+
`${total} ${percent} ${free}`,
|
|
41
|
+
`${total} ${percent}`,
|
|
42
|
+
percent,
|
|
43
|
+
], freeWidth) }) }, "free"));
|
|
44
|
+
}
|
|
45
|
+
return (_jsx(Box, { flexDirection: "row", flexShrink: 0, width: width, children: nodes }));
|
|
46
|
+
}
|
|
@@ -22,7 +22,16 @@
|
|
|
22
22
|
import React from 'react';
|
|
23
23
|
import type { Color } from '../ink/styles.js';
|
|
24
24
|
import type { Theme } from '../theme.js';
|
|
25
|
-
|
|
25
|
+
/** A static chip on the top border row (the session label, CC-style). */
|
|
26
|
+
export interface InputBorderLabel {
|
|
27
|
+
/** Visible text (already width-truncated by the caller). */
|
|
28
|
+
text: string;
|
|
29
|
+
/** Chip background (theme token or raw color). */
|
|
30
|
+
color: keyof Theme | Color;
|
|
31
|
+
/** Chip foreground (theme token or raw color). */
|
|
32
|
+
ink: keyof Theme | Color;
|
|
33
|
+
}
|
|
34
|
+
export declare function EffortInputBorder({ effort, levels, columns, onLight, idleColor, topRightLabel, children, }: {
|
|
26
35
|
/** 当前思考强度档 id;`undefined` 表示路线未声明。 */
|
|
27
36
|
effort: string | undefined;
|
|
28
37
|
/** 当前路线的档位表(低→高,末位为最高档);未知时传 `undefined`。 */
|
|
@@ -31,6 +40,8 @@ export declare function EffortInputBorder({ effort, levels, columns, onLight, id
|
|
|
31
40
|
onLight: boolean;
|
|
32
41
|
/** 静止边框色(主题 token 名,如 'promptBorder' / 'planMode')。 */
|
|
33
42
|
idleColor: keyof Theme | Color;
|
|
43
|
+
/** 顶边框右侧的静态标签 chip(会话名标签);undefined = 不显示。 */
|
|
44
|
+
topRightLabel?: InputBorderLabel;
|
|
34
45
|
children: React.ReactNode;
|
|
35
46
|
}): React.ReactNode;
|
|
36
47
|
//# sourceMappingURL=EffortInputBorder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EffortInputBorder.d.ts","sourceRoot":"","sources":["../../../src/components/EffortInputBorder.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAA8D,MAAM,OAAO,CAAA;AAGlF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"EffortInputBorder.d.ts","sourceRoot":"","sources":["../../../src/components/EffortInputBorder.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAA8D,MAAM,OAAO,CAAA;AAGlF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAKxC,yEAAyE;AACzE,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAA;IACZ,kDAAkD;IAClD,KAAK,EAAE,MAAM,KAAK,GAAG,KAAK,CAAA;IAC1B,kDAAkD;IAClD,GAAG,EAAE,MAAM,KAAK,GAAG,KAAK,CAAA;CACzB;AAiDD,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,MAAM,EACN,OAAO,EACP,OAAO,EACP,SAAS,EACT,aAAa,EACb,QAAQ,GACT,EAAE;IACD,sCAAsC;IACtC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,6CAA6C;IAC7C,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAA;IACrC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,uDAAuD;IACvD,SAAS,EAAE,MAAM,KAAK,GAAG,KAAK,CAAA;IAC9B,8CAA8C;IAC9C,aAAa,CAAC,EAAE,gBAAgB,CAAA;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,GAAG,KAAK,CAAC,SAAS,CA0DlB"}
|
|
@@ -23,12 +23,29 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
23
23
|
import { useContext, useEffect, useReducer, useState } from 'react';
|
|
24
24
|
import { Box, Text } from '../ui.js';
|
|
25
25
|
import { ClockContext } from '../ink/components/ClockContext.js';
|
|
26
|
+
import { stringWidth } from '../ink/stringWidth.js';
|
|
26
27
|
import { IGNITION_TIMELINE, ignitionLineColors } from '../trajectory/effortIgnition.js';
|
|
27
|
-
/**
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
/** 边框行(顶/底共用同一色段序列——同步变色)。顶行可在右圆角前插入
|
|
29
|
+
* 一个静态标签 chip(会话名),占用的列数从色段序列里扣掉,行宽不变。 */
|
|
30
|
+
function BorderRow({ left, right, runs, idleColor, label, }) {
|
|
31
|
+
const labelWidth = label === undefined ? 0 : stringWidth(` ${label.text} `);
|
|
32
|
+
// chip 与右圆角之间的留白(边框线格数):视觉上不让标签贴死 ╮。
|
|
33
|
+
const labelGap = label === undefined ? 0 : 2;
|
|
34
|
+
// 裁剪色段序列到剩余列数(label 行与底行的列数一致,总宽不变)。
|
|
35
|
+
// 色段保留左侧部分,右侧让位给 chip + 留白(右上角布局)。
|
|
36
|
+
let budget = Math.max(0, runs.reduce((sum, run) => sum + run.glyph.length, 0) - labelWidth - labelGap);
|
|
37
|
+
const clipped = [];
|
|
38
|
+
for (const run of runs) {
|
|
39
|
+
if (budget <= 0)
|
|
40
|
+
break;
|
|
41
|
+
const take = Math.min(run.glyph.length, budget);
|
|
42
|
+
if (take > 0)
|
|
43
|
+
clipped.push({ glyph: run.glyph.slice(0, take), color: run.color });
|
|
44
|
+
budget -= take;
|
|
45
|
+
}
|
|
46
|
+
return (_jsx(Box, { width: "100%", height: 1, flexShrink: 0, overflow: "hidden", children: _jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { color: idleColor, children: left }), clipped.map((run, i) => (_jsx(Text, { color: run.color, children: run.glyph }, i))), label !== undefined && (_jsx(Text, { backgroundColor: label.color, color: label.ink, children: ` ${label.text} ` })), label !== undefined && _jsx(Text, { color: idleColor, children: '─'.repeat(labelGap) }), _jsx(Text, { color: idleColor, children: right })] }) }));
|
|
30
47
|
}
|
|
31
|
-
export function EffortInputBorder({ effort, levels, columns, onLight, idleColor, children, }) {
|
|
48
|
+
export function EffortInputBorder({ effort, levels, columns, onLight, idleColor, topRightLabel, children, }) {
|
|
32
49
|
const clock = useContext(ClockContext);
|
|
33
50
|
const [overlay, setOverlay] = useState(null);
|
|
34
51
|
const [prevEffort, setPrevEffort] = useState(effort);
|
|
@@ -69,5 +86,5 @@ export function EffortInputBorder({ effort, levels, columns, onLight, idleColor,
|
|
|
69
86
|
else
|
|
70
87
|
runs.push({ glyph: '─', color });
|
|
71
88
|
}
|
|
72
|
-
return (_jsxs(Box, { flexDirection: "column", alignItems: "flex-start", justifyContent: "flex-start", width: "100%", flexShrink: 0, children: [_jsx(BorderRow, { left: "\u256D", right: "\u256E", runs: runs, idleColor: idleColor }), _jsx(Box, { flexShrink: 0, children: children }), _jsx(BorderRow, { left: "\u2570", right: "\u256F", runs: runs, idleColor: idleColor })] }));
|
|
89
|
+
return (_jsxs(Box, { flexDirection: "column", alignItems: "flex-start", justifyContent: "flex-start", width: "100%", flexShrink: 0, children: [_jsx(BorderRow, { left: "\u256D", right: "\u256E", runs: runs, idleColor: idleColor, label: topRightLabel }), _jsx(Box, { flexShrink: 0, children: children }), _jsx(BorderRow, { left: "\u2570", right: "\u256F", runs: runs, idleColor: idleColor })] }));
|
|
73
90
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Click-to-act file menu (fullscreen): opened by clicking a file path in
|
|
4
|
+
* the transcript (tool cards, markdown code spans / plain text, file://
|
|
5
|
+
* links). Rows: open the target, reveal it in the file manager, copy its
|
|
6
|
+
* absolute path. The path shown is already resolved to an absolute path by
|
|
7
|
+
* the caller (Chat.tsx resolves against the channel cwd at click time).
|
|
8
|
+
* When the target is a directory, the first row reads "open folder" — the
|
|
9
|
+
* same action (default handler), just honest about what it opens.
|
|
10
|
+
*/
|
|
11
|
+
export declare const FILE_ACTION_COUNT = 3;
|
|
12
|
+
export declare function FileActionsPanel({ path, isDir, focusIndex, onPick, }: {
|
|
13
|
+
/** Absolute path the actions operate on (caller-resolved). */
|
|
14
|
+
path: string;
|
|
15
|
+
/** Whether the target exists on disk and is a directory. */
|
|
16
|
+
isDir: boolean;
|
|
17
|
+
/** Index of the keyboard-focused row. */
|
|
18
|
+
focusIndex: number;
|
|
19
|
+
/** Mouse pick (fullscreen): clicked row's absolute index. */
|
|
20
|
+
onPick?: (index: number) => void;
|
|
21
|
+
}): React.ReactNode;
|
|
22
|
+
//# sourceMappingURL=FileActionsPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileActionsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/FileActionsPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAKlC,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,KAAK,EACL,UAAU,EACV,MAAM,GACP,EAAE;IACD,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAA;IACZ,4DAA4D;IAC5D,KAAK,EAAE,OAAO,CAAA;IACd,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAA;IAClB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC,GAAG,KAAK,CAAC,SAAS,CAiClB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { t } from '../i18n.js';
|
|
4
|
+
import { Box, Text } from '../ui.js';
|
|
5
|
+
import { Pane } from './design-system/Pane.js';
|
|
6
|
+
import { Select } from './Select.js';
|
|
7
|
+
import { HintLine } from './design-system/HintLine.js';
|
|
8
|
+
import { truncateToWidth } from '../ink/truncateToWidth.js';
|
|
9
|
+
/**
|
|
10
|
+
* Click-to-act file menu (fullscreen): opened by clicking a file path in
|
|
11
|
+
* the transcript (tool cards, markdown code spans / plain text, file://
|
|
12
|
+
* links). Rows: open the target, reveal it in the file manager, copy its
|
|
13
|
+
* absolute path. The path shown is already resolved to an absolute path by
|
|
14
|
+
* the caller (Chat.tsx resolves against the channel cwd at click time).
|
|
15
|
+
* When the target is a directory, the first row reads "open folder" — the
|
|
16
|
+
* same action (default handler), just honest about what it opens.
|
|
17
|
+
*/
|
|
18
|
+
export const FILE_ACTION_COUNT = 3;
|
|
19
|
+
/** How many terminal cells of the path fit next to the title. */
|
|
20
|
+
const PATH_DISPLAY_BUDGET = 48;
|
|
21
|
+
export function FileActionsPanel({ path, isDir, focusIndex, onPick, }) {
|
|
22
|
+
const options = React.useMemo(() => [
|
|
23
|
+
{ value: 'open', label: t(isDir ? 'file-actions-open-dir' : 'file-actions-open') },
|
|
24
|
+
{ value: 'reveal', label: t('file-actions-reveal') },
|
|
25
|
+
{ value: 'copy', label: t('file-actions-copy') },
|
|
26
|
+
], [isDir]);
|
|
27
|
+
return (_jsx(Pane, { color: "permission", children: _jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", marginBottom: 1, children: [_jsx(Text, { color: "remember", bold: true, children: t('file-actions-title') }), _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: [' ', truncateToWidth(path, PATH_DISPLAY_BUDGET)] })] }), _jsx(Select, { options: options, focusIndex: focusIndex, selectedValue: undefined, visibleOptionCount: FILE_ACTION_COUNT, onPick: onPick ? index => onPick(index) : undefined }), _jsx(Text, { dimColor: true, italic: true, children: _jsx(HintLine, { text: t('hint-confirm-exit') }) })] }) }));
|
|
28
|
+
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import type { Color } from '../ink/styles.js';
|
|
3
|
+
import type { Theme } from '../theme.js';
|
|
2
4
|
import type { FileCandidate } from '../utils/fileSuggestions.js';
|
|
3
5
|
/**
|
|
4
6
|
* The `@` file-completion overlay in CC's suggestion style, wrapped in the
|
|
@@ -23,7 +25,7 @@ export declare function FileSuggestions({ files, selectedIndex, columns, query,
|
|
|
23
25
|
columns: number;
|
|
24
26
|
/** `@` 触发 token 里已输入的查询(`mention.query`),用于名字前缀高亮。 */
|
|
25
27
|
query?: string;
|
|
26
|
-
accent?:
|
|
28
|
+
accent?: keyof Theme | Color;
|
|
27
29
|
/** 鼠标点击行(fullscreen):上报过滤后列表的绝对索引(与键盘
|
|
28
30
|
* selectedIndex 同一索引空间),接受路径由 PromptInput 复用。 */
|
|
29
31
|
onPick?: (index: number) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileSuggestions.d.ts","sourceRoot":"","sources":["../../../src/components/FileSuggestions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAKhE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,aAAa,EACb,OAAO,EACP,KAAU,EACV,MAAM,EACN,MAAM,EACN,WAAW,GACZ,EAAE;IACD,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IAC/B,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"FileSuggestions.d.ts","sourceRoot":"","sources":["../../../src/components/FileSuggestions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAKhE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,aAAa,EACb,OAAO,EACP,KAAU,EACV,MAAM,EACN,MAAM,EACN,WAAW,GACZ,EAAE;IACD,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IAC/B,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,KAAK,GAAG,KAAK,CAAA;IAC5B;sDACkD;IAClD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,iCAAiC;IACjC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAA;CACrC,GAAG,KAAK,CAAC,SAAS,CAgFlB"}
|
|
@@ -4,7 +4,7 @@ import type { ChatRow } from '../dsh-adapter/channel.js';
|
|
|
4
4
|
import type { DOMElement } from '../ink/dom.js';
|
|
5
5
|
import { type TimelineSnapshot } from '../ink/timeline-rail.js';
|
|
6
6
|
import type { ToolBackground } from '../tuiDisplayPrefs.js';
|
|
7
|
-
export declare function MessageList({ rows, expanded, expandedRows, selectedId, onToggleRow, streamFoldedRows, onToggleStreamFold, model, diffLayout, thinkingFold, toolBackground, activityFrames, showAll, onToggleAll, onLoadOlder, thinkingVisible, historyPaintEnabled, registerRowRef, scrollHandle, forceMountRowId, newSinceRowId, onUnseenCount, onTimeline, failureHintRowId, failureHint, onOpenSubagent, }: {
|
|
7
|
+
export declare function MessageList({ rows, expanded, expandedRows, selectedId, onToggleRow, streamFoldedRows, onToggleStreamFold, model, diffLayout, thinkingFold, toolBackground, activityFrames, showAll, onToggleAll, onLoadOlder, thinkingVisible, historyPaintEnabled, registerRowRef, scrollHandle, forceMountRowId, newSinceRowId, onUnseenCount, onTimeline, failureHintRowId, failureHint, onOpenSubagent, onOpenFile, }: {
|
|
8
8
|
rows: readonly ChatRow[];
|
|
9
9
|
expanded: boolean;
|
|
10
10
|
expandedRows: ReadonlySet<number>;
|
|
@@ -82,6 +82,8 @@ export declare function MessageList({ rows, expanded, expandedRows, selectedId,
|
|
|
82
82
|
failureHint?: string;
|
|
83
83
|
/** 打开子代理详情场景(transcript 内点击子代理卡)。 */
|
|
84
84
|
onOpenSubagent?: (agentId: string) => void;
|
|
85
|
+
/** 点击工具卡内的文件路径(打开文件操作菜单)。 */
|
|
86
|
+
onOpenFile?: (path: string) => void;
|
|
85
87
|
}): React.JSX.Element;
|
|
86
88
|
/**
|
|
87
89
|
* The header block pinned above the transcript: the DeepSeek pixel whale
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAEvC,OAAO,EAA8B,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AAE3E,OAAO,KAAK,EAAE,OAAO,EAAsD,MAAM,2BAA2B,CAAA;AAC5G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAgB/C,OAAO,EAAe,KAAK,gBAAgB,EAAqB,MAAM,yBAAyB,CAAA;AAC/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAgI3D,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,WAAW,EACX,gBAAmC,EACnC,kBAA4C,EAC5C,KAAK,EACL,UAAmB,EACnB,YAAwB,EACxB,cAAuB,EACvB,cAAc,EACd,OAAO,EACP,WAAW,EACX,WAAW,EACX,eAAsB,EACtB,mBAA0B,EAC1B,cAAc,EACd,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,cAAc,
|
|
1
|
+
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAEvC,OAAO,EAA8B,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AAE3E,OAAO,KAAK,EAAE,OAAO,EAAsD,MAAM,2BAA2B,CAAA;AAC5G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAgB/C,OAAO,EAAe,KAAK,gBAAgB,EAAqB,MAAM,yBAAyB,CAAA;AAC/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAgI3D,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,WAAW,EACX,gBAAmC,EACnC,kBAA4C,EAC5C,KAAK,EACL,UAAmB,EACnB,YAAwB,EACxB,cAAuB,EACvB,cAAc,EACd,OAAO,EACP,WAAW,EACX,WAAW,EACX,eAAsB,EACtB,mBAA0B,EAC1B,cAAc,EACd,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,UAAU,GACX,EAAE;IACD,IAAI,EAAE,SAAS,OAAO,EAAE,CAAA;IACxB,QAAQ,EAAE,OAAO,CAAA;IACjB,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACjC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACtC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C,KAAK,EAAE,MAAM,CAAA;IACb,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;IACzC,mEAAmE;IACnE,YAAY,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IACjC,qEAAqE;IACrE,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B;sEACkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB;2EACuE;IACvE,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAA;IAC/D,oDAAoD;IACpD,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACrC,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B;8EAC0E;IAC1E,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,0EAA0E;IAC1E,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAC9C;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qCAAqC;IACrC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,6BAA6B;IAC7B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC,qBA0wBA;AAuVD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,GAAG,EACH,KAAY,EACZ,SAAiB,GAClB,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;qEACiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,GAAG,KAAK,CAAC,SAAS,CASlB"}
|
|
@@ -115,7 +115,7 @@ function signatureParts(row, columns, expanded, expandedRows, streamFolded, thin
|
|
|
115
115
|
}
|
|
116
116
|
return signatureScratch;
|
|
117
117
|
}
|
|
118
|
-
export function MessageList({ rows, expanded, expandedRows, selectedId, onToggleRow, streamFoldedRows = NO_STREAM_FOLDED, onToggleStreamFold = NOOP_TOGGLE_STREAM_FOLD, model, diffLayout = 'auto', thinkingFold = 'preview', toolBackground = 'none', activityFrames, showAll, onToggleAll, onLoadOlder, thinkingVisible = true, historyPaintEnabled = true, registerRowRef, scrollHandle, forceMountRowId, newSinceRowId, onUnseenCount, onTimeline, failureHintRowId, failureHint, onOpenSubagent, }) {
|
|
118
|
+
export function MessageList({ rows, expanded, expandedRows, selectedId, onToggleRow, streamFoldedRows = NO_STREAM_FOLDED, onToggleStreamFold = NOOP_TOGGLE_STREAM_FOLD, model, diffLayout = 'auto', thinkingFold = 'preview', toolBackground = 'none', activityFrames, showAll, onToggleAll, onLoadOlder, thinkingVisible = true, historyPaintEnabled = true, registerRowRef, scrollHandle, forceMountRowId, newSinceRowId, onUnseenCount, onTimeline, failureHintRowId, failureHint, onOpenSubagent, onOpenFile, }) {
|
|
119
119
|
const hiddenCount = rows.length - MAX_RENDERED_ROWS;
|
|
120
120
|
// The thinking filter runs BEFORE virtualization so window indices line up.
|
|
121
121
|
//
|
|
@@ -164,15 +164,22 @@ export function MessageList({ rows, expanded, expandedRows, selectedId, onToggle
|
|
|
164
164
|
// that is STILL STREAMING keeps its place even with empty text — the
|
|
165
165
|
// live dot is the "model is answering" affordance and content may yet
|
|
166
166
|
// arrive.
|
|
167
|
+
// The emptiness test must match what RENDERING shows: the `⏵`
|
|
168
|
+
// self-narration line (dsh-working-activity narrate contract) is
|
|
169
|
+
// stripped at render (stripNarration below), so a narration-only step —
|
|
170
|
+
// thinking, `⏵ …` line, straight to a tool call — has non-empty raw
|
|
171
|
+
// text but RENDERS as that same lone `●`. Test the stripped text, or
|
|
172
|
+
// the raw-text check lets the dot through forever.
|
|
173
|
+
const rendersEmptyAssistant = (row) => row.kind === 'assistant' && row.streaming !== true && stripNarration(row.text ?? '').trim() === '';
|
|
167
174
|
let hasEmptyAssistant = false;
|
|
168
175
|
for (const row of sliced) {
|
|
169
|
-
if (
|
|
176
|
+
if (rendersEmptyAssistant(row)) {
|
|
170
177
|
hasEmptyAssistant = true;
|
|
171
178
|
break;
|
|
172
179
|
}
|
|
173
180
|
}
|
|
174
181
|
const out = hasEmptyAssistant
|
|
175
|
-
? sliced.filter(row => !(row
|
|
182
|
+
? sliced.filter(row => !rendersEmptyAssistant(row) &&
|
|
176
183
|
(thinkingVisible || row.kind !== 'reasoning'))
|
|
177
184
|
: thinkingVisible
|
|
178
185
|
? sliced
|
|
@@ -821,7 +828,7 @@ export function MessageList({ rows, expanded, expandedRows, selectedId, onToggle
|
|
|
821
828
|
const addMargin = margins.get(row.id) === true;
|
|
822
829
|
const tool = row.tool;
|
|
823
830
|
const subagent = row.kind === 'subagent' ? row.subagent : undefined;
|
|
824
|
-
return (_jsx(MemoRow, { rowId: row.id, kind: row.kind, text: row.text, executionTarget: row.executionTarget, streaming: row.streaming === true, durationMs: row.durationMs, time: row.time, addMargin: addMargin, isSelected: selectedId === row.id, isExpanded: expandedRows.has(row.id), expanded: expanded, model: model, diffLayout: diffLayout, thinkingFold: thinkingFold, toolBackground: toolBackground, activityFrames: activityFrames, background: rowBackground(row.id), toolCallId: tool?.callId, toolName: tool?.name, toolArgsText: tool?.argsText, toolArgsFull: tool?.argsFull, toolStatus: tool?.status, toolResultText: tool?.resultText, toolResultFull: tool?.resultFull, toolErrorText: tool?.errorText, toolFootnote: failureHintRowId === row.id ? failureHint : undefined, toolCallView: tool?.callView, toolResultView: tool?.resultView, toolStartedAt: tool?.startedAt, toolDurationMs: tool?.durationMs, subagent: subagent, onToggleRow: onToggleRow, onToggleStreamFold: onToggleStreamFold, streamFolded: streamFoldedRows.has(row.id), onOpenSubagent: onOpenSubagent, setRowRef: setRowRef }, row.id));
|
|
831
|
+
return (_jsx(MemoRow, { rowId: row.id, kind: row.kind, text: row.text, executionTarget: row.executionTarget, streaming: row.streaming === true, durationMs: row.durationMs, time: row.time, addMargin: addMargin, isSelected: selectedId === row.id, isExpanded: expandedRows.has(row.id), expanded: expanded, model: model, diffLayout: diffLayout, thinkingFold: thinkingFold, toolBackground: toolBackground, activityFrames: activityFrames, background: rowBackground(row.id), toolCallId: tool?.callId, toolName: tool?.name, toolArgsText: tool?.argsText, toolArgsFull: tool?.argsFull, toolStatus: tool?.status, toolResultText: tool?.resultText, toolResultFull: tool?.resultFull, toolErrorText: tool?.errorText, toolFootnote: failureHintRowId === row.id ? failureHint : undefined, toolCallView: tool?.callView, toolResultView: tool?.resultView, toolStartedAt: tool?.startedAt, toolDurationMs: tool?.durationMs, subagent: subagent, onToggleRow: onToggleRow, onToggleStreamFold: onToggleStreamFold, streamFolded: streamFoldedRows.has(row.id), onOpenSubagent: onOpenSubagent, onOpenFile: onOpenFile, setRowRef: setRowRef }, row.id));
|
|
825
832
|
}), bottomPad > 0 && _jsx(Box, { height: bottomPad, flexShrink: 0 })] }));
|
|
826
833
|
}
|
|
827
834
|
/** Load-earlier / show-previous divider row with a mouse hover tint — the
|
|
@@ -830,7 +837,7 @@ function ClickableDivider({ title, onClick }) {
|
|
|
830
837
|
const [hovered, setHovered] = useState(false);
|
|
831
838
|
return (_jsx(Box, { marginTop: 1, onClick: onClick, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), backgroundColor: hovered ? 'userMessageBackgroundHover' : undefined, children: _jsx(Divider, { title: title }) }));
|
|
832
839
|
}
|
|
833
|
-
function TranscriptRow({ rowId, kind, text, executionTarget, streaming, durationMs, time, addMargin, isSelected, isExpanded, expanded, model, diffLayout, thinkingFold, toolBackground, activityFrames, background, toolCallId, toolName, toolArgsText, toolArgsFull, toolStatus, toolResultText, toolResultFull, toolErrorText, toolFootnote, toolCallView, toolResultView, toolStartedAt, toolDurationMs, subagent, onToggleRow, onToggleStreamFold, streamFolded, onOpenSubagent, setRowRef, }) {
|
|
840
|
+
function TranscriptRow({ rowId, kind, text, executionTarget, streaming, durationMs, time, addMargin, isSelected, isExpanded, expanded, model, diffLayout, thinkingFold, toolBackground, activityFrames, background, toolCallId, toolName, toolArgsText, toolArgsFull, toolStatus, toolResultText, toolResultFull, toolErrorText, toolFootnote, toolCallView, toolResultView, toolStartedAt, toolDurationMs, subagent, onToggleRow, onToggleStreamFold, streamFolded, onOpenSubagent, onOpenFile, setRowRef, }) {
|
|
834
841
|
const ref = React.useCallback((el) => {
|
|
835
842
|
setRowRef(rowId, el);
|
|
836
843
|
}, [setRowRef, rowId]);
|
|
@@ -895,7 +902,7 @@ function TranscriptRow({ rowId, kind, text, executionTarget, streaming, duration
|
|
|
895
902
|
startedAt: toolStartedAt,
|
|
896
903
|
durationMs: toolDurationMs,
|
|
897
904
|
};
|
|
898
|
-
return (_jsx(Box, { flexDirection: "column", ref: ref, children: _jsx(AssistantToolUseMessage, { tool: tool, addMargin: addMargin, verbose: isExpanded || expanded, isSelected: isSelected, isExpanded: isExpanded, footnote: toolFootnote, diffLayout: diffLayout, toolBackground: toolBackground, onClick: foldOnClick }) }));
|
|
905
|
+
return (_jsx(Box, { flexDirection: "column", ref: ref, children: _jsx(AssistantToolUseMessage, { tool: tool, addMargin: addMargin, verbose: isExpanded || expanded, isSelected: isSelected, isExpanded: isExpanded, footnote: toolFootnote, diffLayout: diffLayout, toolBackground: toolBackground, onClick: foldOnClick, onOpenFile: onOpenFile }) }));
|
|
899
906
|
}
|
|
900
907
|
case 'notice':
|
|
901
908
|
return (_jsx(Box, { marginTop: 1, ref: ref, children: _jsx(Divider, { title: ` ${text} ` }) }));
|
|
@@ -1,20 +1,42 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { LlmModelInfo } from '../dsh-adapter/types.js';
|
|
3
|
+
import type { ModelGroupRow } from '../modelGroups.js';
|
|
3
4
|
/**
|
|
4
5
|
* Model picker in the CC ModelPicker style: a permission-colored Pane with
|
|
5
|
-
* the
|
|
6
|
+
* the rows as Select entries (❯ focus pointer, ✓ on the active row,
|
|
6
7
|
* descriptions), plus the Enter/Esc hint line. The DSH agent's model is
|
|
7
8
|
* fixed at creation time, so a selection notifies "restart to apply".
|
|
8
9
|
*
|
|
10
|
+
* Two levels: the top level lists **provider groups** (registry display
|
|
11
|
+
* name + model count, ✓ on the current provider's row) and drills in with
|
|
12
|
+
* Enter; the second level lists that group's models and switches with
|
|
13
|
+
* Enter — the same live-fork path the flat picker always had. A
|
|
14
|
+
* single-group catalog skips the top level entirely (showBack=false, plain
|
|
15
|
+
* confirm/exit hint), so single-provider setups keep the pre-grouping UX.
|
|
16
|
+
*
|
|
9
17
|
* 长列表按焦点窗口化(Select 同款):picker 经 OverlayAbove 浮层挂载后有
|
|
10
18
|
* maxHeight 裁剪,全量渲染会让焦点行被裁掉(看不到焦点按 Enter)。
|
|
11
19
|
*/
|
|
12
|
-
export declare function ModelPicker(
|
|
20
|
+
export declare function ModelPicker(props: {
|
|
21
|
+
/** Top level: provider groups; Enter/click drills into one. */
|
|
22
|
+
groups: readonly ModelGroupRow[];
|
|
23
|
+
focusIndex: number;
|
|
24
|
+
/** Current route key — its group row carries the ✓ marker. */
|
|
25
|
+
currentProvider: string;
|
|
26
|
+
onPick?: (index: number) => void;
|
|
27
|
+
} | {
|
|
28
|
+
/** Second level (or single-group fast path): one provider's models —
|
|
29
|
+
* or the mixed-provider recents list (`showProviderPrefix`). */
|
|
13
30
|
models: readonly LlmModelInfo[];
|
|
31
|
+
/** The group's display label as this pane's title (default: "Model"). */
|
|
32
|
+
groupLabel?: string;
|
|
33
|
+
/** Multi-group catalogs show the back hint; the fast path keeps the plain one. */
|
|
34
|
+
showBack: boolean;
|
|
35
|
+
/** Prefix each row with its provider (the recents group mixes providers). */
|
|
36
|
+
showProviderPrefix?: boolean;
|
|
14
37
|
focusIndex: number;
|
|
38
|
+
/** `provider/model` of the current model — its row carries the ✓ marker. */
|
|
15
39
|
currentModel: string;
|
|
16
|
-
/** Mouse pick (fullscreen): reports the clicked row's absolute index —
|
|
17
|
-
* Chat applies it with the same code path as the keyboard Enter. */
|
|
18
40
|
onPick?: (index: number) => void;
|
|
19
41
|
}): React.ReactNode;
|
|
20
42
|
//# sourceMappingURL=ModelPicker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelPicker.d.ts","sourceRoot":"","sources":["../../../src/components/ModelPicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"ModelPicker.d.ts","sourceRoot":"","sources":["../../../src/components/ModelPicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAOtD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAC7B;IACA,+DAA+D;IAC/D,MAAM,EAAE,SAAS,aAAa,EAAE,CAAA;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,8DAA8D;IAC9D,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC,GACC;IACA;qEACiE;IACjE,MAAM,EAAE,SAAS,YAAY,EAAE,CAAA;IAC/B,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kFAAkF;IAClF,QAAQ,EAAE,OAAO,CAAA;IACjB,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC,GAAG,KAAK,CAAC,SAAS,CA4DpB"}
|
|
@@ -1,27 +1,47 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { t } from '../i18n.js';
|
|
3
3
|
import { Box, Text, useTerminalSize } from '../ui.js';
|
|
4
|
+
import { RECENTS_GROUP_PROVIDER, RECENTS_LABEL_PLACEHOLDER } from '../modelGroups.js';
|
|
4
5
|
import { Pane } from './design-system/Pane.js';
|
|
5
6
|
import { ListItem } from './design-system/ListItem.js';
|
|
6
7
|
import { HintLine } from './design-system/HintLine.js';
|
|
7
8
|
import { listWindow } from './listWindow.js';
|
|
8
9
|
/**
|
|
9
10
|
* Model picker in the CC ModelPicker style: a permission-colored Pane with
|
|
10
|
-
* the
|
|
11
|
+
* the rows as Select entries (❯ focus pointer, ✓ on the active row,
|
|
11
12
|
* descriptions), plus the Enter/Esc hint line. The DSH agent's model is
|
|
12
13
|
* fixed at creation time, so a selection notifies "restart to apply".
|
|
13
14
|
*
|
|
15
|
+
* Two levels: the top level lists **provider groups** (registry display
|
|
16
|
+
* name + model count, ✓ on the current provider's row) and drills in with
|
|
17
|
+
* Enter; the second level lists that group's models and switches with
|
|
18
|
+
* Enter — the same live-fork path the flat picker always had. A
|
|
19
|
+
* single-group catalog skips the top level entirely (showBack=false, plain
|
|
20
|
+
* confirm/exit hint), so single-provider setups keep the pre-grouping UX.
|
|
21
|
+
*
|
|
14
22
|
* 长列表按焦点窗口化(Select 同款):picker 经 OverlayAbove 浮层挂载后有
|
|
15
23
|
* maxHeight 裁剪,全量渲染会让焦点行被裁掉(看不到焦点按 Enter)。
|
|
16
24
|
*/
|
|
17
|
-
export function ModelPicker(
|
|
25
|
+
export function ModelPicker(props) {
|
|
26
|
+
const inGroups = 'groups' in props;
|
|
18
27
|
const { rows: terminalRows } = useTerminalSize();
|
|
28
|
+
// Captured before the map: union narrowing does not survive into closures.
|
|
29
|
+
const onPick = props.onPick;
|
|
19
30
|
// 焦点窗口化按行预算:ListItem 带 description 时占 2 行(正文+描述,均
|
|
20
31
|
// truncate 成单行),只数项数会把焦点裁出浮层(二次审查实证)。
|
|
21
32
|
// 框架行:浮层预留 8 + Pane 2 + 标题 2 + 页脚 1 + 挂载包裹 marginTop 1 = 14。
|
|
22
|
-
const
|
|
23
|
-
|
|
33
|
+
const rowHeights = inGroups
|
|
34
|
+
? props.groups.map(() => 2)
|
|
35
|
+
: props.models.map(m => (m.description ? 2 : 1));
|
|
36
|
+
const rows = inGroups ? props.groups : props.models;
|
|
37
|
+
const { start, end } = listWindow(rowHeights, props.focusIndex, Math.max(terminalRows - 14, 2));
|
|
38
|
+
const hint = inGroups
|
|
39
|
+
? t('hint-model-groups')
|
|
40
|
+
: props.showBack ? t('hint-model-back') : t('hint-confirm-exit');
|
|
41
|
+
return (_jsxs(Pane, { color: "permission", children: [_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "remember", bold: true, children: inGroups || props.groupLabel === undefined ? t('picker-title-model') : props.groupLabel }) }), rows.slice(start, end).map((row, index) => {
|
|
24
42
|
const absoluteIndex = start + index;
|
|
25
|
-
return (
|
|
26
|
-
|
|
43
|
+
return inGroups ? (_jsx(ListItem, { isFocused: absoluteIndex === props.focusIndex, isSelected: row.provider === props.currentProvider, description: t('picker-group-count', { count: row.count }), showScrollUp: absoluteIndex === start && start > 0, showScrollDown: absoluteIndex === end - 1 && end < rows.length, onClick: onPick ? () => onPick(absoluteIndex) : undefined, children: row.label === RECENTS_LABEL_PLACEHOLDER && row.provider === RECENTS_GROUP_PROVIDER
|
|
44
|
+
? t('picker-group-recent')
|
|
45
|
+
: row.label }, row.provider)) : (_jsx(ListItem, { isFocused: absoluteIndex === props.focusIndex, isSelected: `${row.provider}/${row.id}` === props.currentModel, description: row.description, showScrollUp: absoluteIndex === start && start > 0, showScrollDown: absoluteIndex === end - 1 && end < rows.length, onClick: onPick ? () => onPick(absoluteIndex) : undefined, children: props.showProviderPrefix === true ? `${row.provider} / ${row.name}` : row.name }, `${row.provider}/${row.id}`));
|
|
46
|
+
})] }), _jsx(Text, { dimColor: true, italic: true, children: _jsx(HintLine, { text: hint }) })] }));
|
|
27
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptInput.d.ts","sourceRoot":"","sources":["../../../src/components/PromptInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"PromptInput.d.ts","sourceRoot":"","sources":["../../../src/components/PromptInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAmBzB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAmJxD;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,IAAI,OAAO,CAAA;IAClB,KAAK,IAAI,IAAI,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,0EAA0E;IAC1E,QAAQ,EAAE,OAAO,CAAA;IACjB,YAAY,IAAI,IAAI,CAAA;IACpB;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;IACrD,6EAA6E;IAC7E,eAAe,EAAE,OAAO,CAAA;IACxB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,cAAc,CAAC,IAAI,IAAI,CAAA;IACvB,8EAA8E;IAC9E,eAAe,CAAC,IAAI,IAAI,CAAA;IACxB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;CACzD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,cAAc,EACd,eAAe,EACf,aAAa,GACd,EAAE,gBAAgB,qBAi8ClB"}
|