@deepseek-harness-tui/dsh-tui 0.8.5 → 0.8.7
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 +13 -3
- package/bin/dsh-tui.js +269 -218
- package/cordis.patch.yml +48 -22
- 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/figures.d.ts +7 -0
- package/lib/types/cc/figures.d.ts.map +1 -1
- package/lib/types/cc/figures.js +24 -0
- package/lib/types/cc/markdown.d.ts.map +1 -1
- package/lib/types/cc/markdown.js +47 -14
- package/lib/types/cc/syntaxRuns.d.ts +16 -0
- package/lib/types/cc/syntaxRuns.d.ts.map +1 -0
- package/lib/types/cc/syntaxRuns.js +79 -0
- package/lib/types/cc/syntaxTheme.d.ts +12 -0
- package/lib/types/cc/syntaxTheme.d.ts.map +1 -0
- package/lib/types/cc/syntaxTheme.js +76 -0
- package/lib/types/commands.d.ts +14 -0
- package/lib/types/commands.d.ts.map +1 -1
- package/lib/types/commands.js +20 -1
- package/lib/types/components/Chat/SubagentMessage.d.ts +19 -0
- package/lib/types/components/Chat/SubagentMessage.d.ts.map +1 -0
- package/lib/types/components/Chat/SubagentMessage.js +75 -0
- package/lib/types/components/EffortChargeGlyph.d.ts +26 -0
- package/lib/types/components/EffortChargeGlyph.d.ts.map +1 -0
- package/lib/types/components/EffortChargeGlyph.js +70 -0
- package/lib/types/components/EffortInputBorder.d.ts +36 -0
- package/lib/types/components/EffortInputBorder.d.ts.map +1 -0
- package/lib/types/components/EffortInputBorder.js +73 -0
- package/lib/types/components/EffortTierBadge.d.ts +26 -0
- package/lib/types/components/EffortTierBadge.d.ts.map +1 -0
- package/lib/types/components/EffortTierBadge.js +97 -0
- package/lib/types/components/HelpMenu.d.ts +8 -1
- package/lib/types/components/HelpMenu.d.ts.map +1 -1
- package/lib/types/components/HelpMenu.js +15 -4
- package/lib/types/components/LoadedContextPanel.js +1 -1
- package/lib/types/components/LogoV2.d.ts +3 -1
- package/lib/types/components/LogoV2.d.ts.map +1 -1
- package/lib/types/components/LogoV2.js +2 -2
- package/lib/types/components/MessageList.d.ts +6 -2
- package/lib/types/components/MessageList.d.ts.map +1 -1
- package/lib/types/components/MessageList.js +22 -13
- package/lib/types/components/ModelPicker.js +2 -2
- package/lib/types/components/PromptInput.d.ts +1 -1
- package/lib/types/components/PromptInput.d.ts.map +1 -1
- package/lib/types/components/PromptInput.js +83 -18
- package/lib/types/components/SkillsPicker.js +2 -2
- package/lib/types/components/SplitDiffView.d.ts +2 -17
- package/lib/types/components/SplitDiffView.d.ts.map +1 -1
- package/lib/types/components/SplitDiffView.js +9 -162
- package/lib/types/components/StreamingMarkdown.js +1 -1
- package/lib/types/components/SubagentCard.d.ts +9 -0
- package/lib/types/components/SubagentCard.d.ts.map +1 -0
- package/lib/types/components/SubagentCard.js +26 -0
- package/lib/types/components/SubagentDashboard.d.ts +13 -0
- package/lib/types/components/SubagentDashboard.d.ts.map +1 -0
- package/lib/types/components/SubagentDashboard.js +50 -0
- package/lib/types/components/SubagentDetailScene.d.ts +16 -0
- package/lib/types/components/SubagentDetailScene.d.ts.map +1 -0
- package/lib/types/components/SubagentDetailScene.js +141 -0
- package/lib/types/components/SyntaxText.d.ts +15 -0
- package/lib/types/components/SyntaxText.d.ts.map +1 -0
- package/lib/types/components/SyntaxText.js +34 -0
- package/lib/types/components/ThinkingToggle.d.ts +3 -10
- package/lib/types/components/ThinkingToggle.d.ts.map +1 -1
- package/lib/types/components/ThinkingToggle.js +4 -9
- package/lib/types/components/design-system/ListItem.d.ts.map +1 -1
- package/lib/types/components/design-system/ListItem.js +1 -1
- package/lib/types/components/design-system/ThemedBox.d.ts.map +1 -1
- package/lib/types/components/design-system/ThemedBox.js +4 -1
- package/lib/types/components/design-system/ThemedText.js +2 -2
- package/lib/types/components/messages/AssistantThinkingMessage.d.ts +12 -6
- package/lib/types/components/messages/AssistantThinkingMessage.d.ts.map +1 -1
- package/lib/types/components/messages/AssistantThinkingMessage.js +37 -10
- package/lib/types/components/messages/AssistantToolUseMessage.d.ts +2 -0
- package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -1
- package/lib/types/components/messages/AssistantToolUseMessage.js +71 -18
- package/lib/types/components/messages/UserPromptMessage.d.ts +4 -6
- package/lib/types/components/messages/UserPromptMessage.d.ts.map +1 -1
- package/lib/types/components/messages/UserPromptMessage.js +19 -10
- package/lib/types/dsh-adapter/channel.d.ts +58 -2
- package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel.js +337 -7
- package/lib/types/dsh-adapter/contract.d.ts +27 -4
- package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
- package/lib/types/dsh-adapter/contract.js +56 -10
- package/lib/types/dsh-adapter/index.d.ts.map +1 -1
- package/lib/types/dsh-adapter/index.js +9 -3
- package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
- package/lib/types/dsh-adapter/plugin.js +38 -0
- package/lib/types/dsh-adapter/shortcuts.js +3 -3
- package/lib/types/dsh-adapter/subagents.d.ts +87 -0
- package/lib/types/dsh-adapter/subagents.d.ts.map +1 -0
- package/lib/types/dsh-adapter/subagents.js +204 -0
- package/lib/types/herdr.d.ts +28 -0
- package/lib/types/herdr.d.ts.map +1 -0
- package/lib/types/herdr.js +133 -0
- package/lib/types/i18n.d.ts +215 -31
- package/lib/types/i18n.d.ts.map +1 -1
- package/lib/types/i18n.js +65 -14
- package/lib/types/ink/ink.d.ts +4 -0
- package/lib/types/ink/ink.d.ts.map +1 -1
- package/lib/types/ink/ink.js +46 -15
- package/lib/types/minimalMode.d.ts +13 -0
- package/lib/types/minimalMode.d.ts.map +1 -0
- package/lib/types/minimalMode.js +17 -0
- package/lib/types/screens/Chat.d.ts +1 -1
- package/lib/types/screens/Chat.d.ts.map +1 -1
- package/lib/types/screens/Chat.js +95 -45
- package/lib/types/screens/StatusLine.d.ts.map +1 -1
- package/lib/types/screens/StatusLine.js +6 -2
- package/lib/types/screens/TrajectoryScene.d.ts.map +1 -1
- package/lib/types/screens/TrajectoryScene.js +4 -2
- package/lib/types/theme.d.ts +20 -0
- package/lib/types/theme.d.ts.map +1 -1
- package/lib/types/theme.js +77 -23
- package/lib/types/tips.js +3 -3
- package/lib/types/trajectory/effortIgnition.d.ts +66 -0
- package/lib/types/trajectory/effortIgnition.d.ts.map +1 -0
- package/lib/types/trajectory/effortIgnition.js +142 -0
- package/lib/types/update.d.ts +18 -0
- package/lib/types/update.d.ts.map +1 -1
- package/lib/types/update.js +73 -2
- package/lib/types/utils/execFileNoThrow.d.ts +3 -20
- package/lib/types/utils/execFileNoThrow.d.ts.map +1 -1
- package/lib/types/utils/execFileNoThrow.js +53 -32
- package/lib/types/utils/externalEditor.d.ts +12 -11
- package/lib/types/utils/externalEditor.d.ts.map +1 -1
- package/lib/types/utils/externalEditor.js +11 -11
- 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 +64 -58
- 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogoV2.d.ts","sourceRoot":"","sources":["../../../src/components/LogoV2.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAiB,KAAK,GAAG,EAAE,MAAM,YAAY,CAAA;AAuDpD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,MAAM,EACN,GAAG,EACH,SAAiB,EACjB,GAAG,
|
|
1
|
+
{"version":3,"file":"LogoV2.d.ts","sourceRoot":"","sources":["../../../src/components/LogoV2.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAiB,KAAK,GAAG,EAAE,MAAM,YAAY,CAAA;AAuDpD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,MAAM,EACN,GAAG,EACH,SAAiB,EACjB,GAAG,EACH,KAAY,GACb,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,mFAAmF;IACnF,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,GAAG,KAAK,CAAC,SAAS,CAqFlB"}
|
|
@@ -65,7 +65,7 @@ function capitalize(text) {
|
|
|
65
65
|
* the whale the welcome tagline, centered under the art, in ice
|
|
66
66
|
* blue. Narrow terminals drop the whale and keep the text column.
|
|
67
67
|
*/
|
|
68
|
-
export function LogoV2({ model, effort, cwd, skipIntro = false, tip, }) {
|
|
68
|
+
export function LogoV2({ model, effort, cwd, skipIntro = false, tip, whale = true, }) {
|
|
69
69
|
const [step, setStep] = React.useState(skipIntro ? OPENING_SEQUENCE.length : 0);
|
|
70
70
|
const settled = step >= OPENING_SEQUENCE.length;
|
|
71
71
|
// Opening clock: drives the shimmer sweep and big-text highlight only
|
|
@@ -89,7 +89,7 @@ export function LogoV2({ model, effort, cwd, skipIntro = false, tip, }) {
|
|
|
89
89
|
const wordmarkRGB = parseRGB(theme.claude) ?? BRAND;
|
|
90
90
|
const wordmarkShimmerRGB = parseRGB(theme.claudeShimmer) ?? ICE;
|
|
91
91
|
const taglineRGB = parseRGB(theme.claudeBlue_FOR_SYSTEM_SPINNER) ?? ICE;
|
|
92
|
-
const showWhale = columns >= WHALE_MIN_COLUMNS;
|
|
92
|
+
const showWhale = whale && columns >= WHALE_MIN_COLUMNS;
|
|
93
93
|
const frameIndex = settled ? STANDARD_FRAME_INDEX : OPENING_SEQUENCE[step].frame;
|
|
94
94
|
// Frozen clock for the settled header: t=0 parks every sweep highlight
|
|
95
95
|
// off-screen, leaving the static gradient behind.
|
|
@@ -3,7 +3,7 @@ import { type ScrollBoxHandle } from '../ui.js';
|
|
|
3
3
|
import type { ChatRow } from '../dsh-adapter/channel.js';
|
|
4
4
|
import type { DOMElement } from '../ink/dom.js';
|
|
5
5
|
import type { ToolBackground } from '../tuiDisplayPrefs.js';
|
|
6
|
-
export declare function MessageList({ rows, expanded, expandedRows, selectedId, onToggleRow, model, diffLayout, thinkingFold, toolBackground, showAll, onToggleAll, onLoadOlder, thinkingVisible, registerRowRef, scrollHandle, forceMountRowId, newSinceRowId, onUnseenCount, failureHintRowId, failureHint, }: {
|
|
6
|
+
export declare function MessageList({ rows, expanded, expandedRows, selectedId, onToggleRow, model, diffLayout, thinkingFold, toolBackground, activityFrames, showAll, onToggleAll, onLoadOlder, thinkingVisible, registerRowRef, scrollHandle, forceMountRowId, newSinceRowId, onUnseenCount, failureHintRowId, failureHint, }: {
|
|
7
7
|
rows: readonly ChatRow[];
|
|
8
8
|
expanded: boolean;
|
|
9
9
|
expandedRows: ReadonlySet<number>;
|
|
@@ -16,6 +16,9 @@ export declare function MessageList({ rows, expanded, expandedRows, selectedId,
|
|
|
16
16
|
thinkingFold?: 'preview' | 'full';
|
|
17
17
|
/** Tool-card background treatment from the live channel settings. */
|
|
18
18
|
toolBackground?: ToolBackground;
|
|
19
|
+
/** Working-activity preset name from the channel; drives the subagent
|
|
20
|
+
* card's running glyph so both indicators follow one setting. */
|
|
21
|
+
activityFrames?: string;
|
|
19
22
|
showAll: boolean;
|
|
20
23
|
onToggleAll: () => void;
|
|
21
24
|
/** Restore folded-away older rows from the session log (CC-style "load
|
|
@@ -48,9 +51,10 @@ export declare function MessageList({ rows, expanded, expandedRows, selectedId,
|
|
|
48
51
|
* welcome line. It scrolls away with the transcript once the conversation
|
|
49
52
|
* fills the viewport (Claude Code shows its ✦ logo in the same slot).
|
|
50
53
|
*/
|
|
51
|
-
export declare function LogoHeader({ model, effort, cwd, }: {
|
|
54
|
+
export declare function LogoHeader({ model, effort, cwd, whale, }: {
|
|
52
55
|
model: string;
|
|
53
56
|
effort?: string | undefined;
|
|
54
57
|
cwd: string;
|
|
58
|
+
whale?: boolean;
|
|
55
59
|
}): React.ReactNode;
|
|
56
60
|
//# sourceMappingURL=MessageList.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAA8B,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AAC3E,OAAO,KAAK,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAA8B,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AAC3E,OAAO,KAAK,EAAE,OAAO,EAAsD,MAAM,2BAA2B,CAAA;AAC5G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAe/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AA2B3D,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,WAAW,EACX,KAAK,EACL,UAAmB,EACnB,YAAwB,EACxB,cAAuB,EACvB,cAAc,EACd,OAAO,EACP,WAAW,EACX,WAAW,EACX,eAAsB,EACtB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,WAAW,GACZ,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,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,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;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,qBAiWA;AA2SD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,GAAG,EACH,KAAY,GACb,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;CAChB,GAAG,KAAK,CAAC,SAAS,CASlB"}
|
|
@@ -7,6 +7,8 @@ import { UserPromptMessage } from './messages/UserPromptMessage.js';
|
|
|
7
7
|
import { AssistantTextMessage } from './messages/AssistantTextMessage.js';
|
|
8
8
|
import { AssistantThinkingMessage } from './messages/AssistantThinkingMessage.js';
|
|
9
9
|
import { AssistantToolUseMessage } from './messages/AssistantToolUseMessage.js';
|
|
10
|
+
import { SubagentMessage } from './Chat/SubagentMessage.js';
|
|
11
|
+
import { isMinimalMode } from '../minimalMode.js';
|
|
10
12
|
import { InterruptedByUser } from './InterruptedByUser.js';
|
|
11
13
|
import { LogoV2 } from './LogoV2.js';
|
|
12
14
|
import { StreamingMarkdown } from './StreamingMarkdown.js';
|
|
@@ -17,7 +19,7 @@ import { truncateToWidth } from '../ink/truncateToWidth.js';
|
|
|
17
19
|
/**
|
|
18
20
|
* Transcript rows rendered in the Claude Code visual language: user prompts
|
|
19
21
|
* on a grey bubble with a `❯` pointer, assistant text with a `●` bullet and
|
|
20
|
-
* markdown, thinking folded to
|
|
22
|
+
* markdown, thinking folded to `⚓ Thinking (ctrl+o to expand)`, tool calls as
|
|
21
23
|
* status-dot cards. `expanded` (Ctrl+O) shows full reasoning + full tool
|
|
22
24
|
* args/results; `expandedRows` (message-selection mode, Enter) expands single
|
|
23
25
|
* rows; `selectedId` highlights the selected row.
|
|
@@ -37,7 +39,7 @@ const DEFAULT_ROW_HEIGHT = 2;
|
|
|
37
39
|
/** Cold-start estimate of the header block above the rows; corrected by the
|
|
38
40
|
* first layout measurement. */
|
|
39
41
|
const DEFAULT_HEADER_LINES = 14;
|
|
40
|
-
export function MessageList({ rows, expanded, expandedRows, selectedId, onToggleRow, model, diffLayout = 'auto', thinkingFold = 'preview', toolBackground = 'none', showAll, onToggleAll, onLoadOlder, thinkingVisible = true, registerRowRef, scrollHandle, forceMountRowId, newSinceRowId, onUnseenCount, failureHintRowId, failureHint, }) {
|
|
42
|
+
export function MessageList({ rows, expanded, expandedRows, selectedId, onToggleRow, model, diffLayout = 'auto', thinkingFold = 'preview', toolBackground = 'none', activityFrames, showAll, onToggleAll, onLoadOlder, thinkingVisible = true, registerRowRef, scrollHandle, forceMountRowId, newSinceRowId, onUnseenCount, failureHintRowId, failureHint, }) {
|
|
41
43
|
const hiddenCount = rows.length - MAX_RENDERED_ROWS;
|
|
42
44
|
// The thinking filter runs BEFORE virtualization so window indices line up.
|
|
43
45
|
const visibleRows = (showAll || hiddenCount <= 0
|
|
@@ -54,14 +56,12 @@ export function MessageList({ rows, expanded, expandedRows, selectedId, onToggle
|
|
|
54
56
|
prev = row.kind;
|
|
55
57
|
}
|
|
56
58
|
}
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
+
// Selection keeps its highlight; expanded rows render with no fill (the
|
|
60
|
+
// diff line tints inside cards are the only backgrounds in the transcript).
|
|
59
61
|
const rowBackground = (rowId) => {
|
|
60
62
|
const isSelected = selectedId === rowId;
|
|
61
63
|
if (isSelected)
|
|
62
64
|
return 'messageActionsBackground';
|
|
63
|
-
if (expandedRows.has(rowId))
|
|
64
|
-
return 'userMessageBackgroundHover';
|
|
65
65
|
return undefined;
|
|
66
66
|
};
|
|
67
67
|
// --- layout virtualization ---------------------------------------------
|
|
@@ -334,10 +334,11 @@ export function MessageList({ rows, expanded, expandedRows, selectedId, onToggle
|
|
|
334
334
|
// spacing; only the very first row of the whole list has none.
|
|
335
335
|
const addMargin = margins.get(row.id) === true;
|
|
336
336
|
const tool = row.tool;
|
|
337
|
-
|
|
337
|
+
const subagent = row.kind === 'subagent' ? row.subagent : undefined;
|
|
338
|
+
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, nowSec: tool?.status === 'running' ? nowSec : undefined, subagent: subagent, onToggleRow: onToggleRow, setRowRef: setRowRef }, row.id));
|
|
338
339
|
}), bottomPad > 0 && _jsx(Box, { height: bottomPad, flexShrink: 0 })] }));
|
|
339
340
|
}
|
|
340
|
-
function TranscriptRow({ rowId, kind, text, executionTarget, streaming, durationMs, time, addMargin, isSelected, isExpanded, expanded, model, diffLayout, thinkingFold, toolBackground, background, toolCallId, toolName, toolArgsText, toolArgsFull, toolStatus, toolResultText, toolResultFull, toolErrorText, toolFootnote, toolCallView, toolResultView, toolStartedAt, toolDurationMs, onToggleRow, setRowRef, }) {
|
|
341
|
+
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, setRowRef, }) {
|
|
341
342
|
const ref = React.useCallback((el) => {
|
|
342
343
|
setRowRef(rowId, el);
|
|
343
344
|
}, [setRowRef, rowId]);
|
|
@@ -346,11 +347,11 @@ function TranscriptRow({ rowId, kind, text, executionTarget, streaming, duration
|
|
|
346
347
|
}, [onToggleRow, rowId]);
|
|
347
348
|
switch (kind) {
|
|
348
349
|
case 'user':
|
|
349
|
-
return (_jsx(Box, { flexDirection: "column", ref: ref, children: _jsx(UserPromptMessage, { text: text, addMargin: addMargin, isSelected: isSelected,
|
|
350
|
+
return (_jsx(Box, { flexDirection: "column", ref: ref, children: _jsx(UserPromptMessage, { text: text, addMargin: addMargin, isSelected: isSelected, onClick: onClick }) }));
|
|
350
351
|
case 'assistant':
|
|
351
|
-
return streaming ? (_jsxs(Box, { alignItems: "flex-start", flexDirection: "row", marginTop: addMargin ? 1 : 0, width: "100%", backgroundColor: background, children: [_jsx(Box, { minWidth: 2, children: _jsx(Text, { color: "text", children: "\u25CF" }) }), _jsx(Box, { flexDirection: "column", children: _jsx(StreamingMarkdown, { children: stripNarration(text) }) })] })) : (_jsxs(Box, { width: "100%", flexDirection: "column", backgroundColor: background, ref: ref, children: [expanded && (_jsx(Box, { flexDirection: "row", justifyContent: "flex-end", gap: 1, marginTop: 1, children: _jsx(MessageMetadata, { timestamp: time, model: model }) })), _jsx(AssistantTextMessage, { text: stripNarration(text), addMargin: addMargin, isSelected: isSelected, isExpanded: isExpanded, onClick: onClick })] }));
|
|
352
|
+
return streaming ? (_jsxs(Box, { alignItems: "flex-start", flexDirection: "row", marginTop: addMargin ? 1 : 0, width: "100%", backgroundColor: background, ref: ref, children: [_jsx(Box, { minWidth: 2, children: _jsx(Text, { color: "text", children: "\u25CF" }) }), _jsx(Box, { flexDirection: "column", children: _jsx(StreamingMarkdown, { children: stripNarration(text) }) })] })) : (_jsxs(Box, { width: "100%", flexDirection: "column", backgroundColor: background, ref: ref, children: [expanded && (_jsx(Box, { flexDirection: "row", justifyContent: "flex-end", gap: 1, marginTop: 1, children: _jsx(MessageMetadata, { timestamp: time, model: model }) })), _jsx(AssistantTextMessage, { text: stripNarration(text), addMargin: addMargin, isSelected: isSelected, isExpanded: isExpanded, onClick: onClick })] }));
|
|
352
353
|
case 'reasoning':
|
|
353
|
-
return (_jsx(Box, { flexDirection: "column", ref: ref, children: _jsx(AssistantThinkingMessage, { thinking: text, addMargin: addMargin, preview: streaming &&
|
|
354
|
+
return (_jsx(Box, { flexDirection: "column", ref: ref, children: _jsx(AssistantThinkingMessage, { thinking: text, addMargin: addMargin, streaming: streaming, preview: streaming &&
|
|
354
355
|
thinkingFold === 'preview' &&
|
|
355
356
|
!expanded &&
|
|
356
357
|
!isExpanded,
|
|
@@ -398,6 +399,10 @@ function TranscriptRow({ rowId, kind, text, executionTarget, streaming, duration
|
|
|
398
399
|
// text preview; Ctrl+O (global) or message-selection Enter reveals
|
|
399
400
|
// the full summary.
|
|
400
401
|
return (_jsx(Box, { marginTop: addMargin ? 1 : 0, paddingLeft: 2, backgroundColor: background, ref: ref, onClick: onClick, children: expanded || isExpanded ? (_jsx(Text, { dimColor: true, children: text })) : (_jsxs(Text, { dimColor: true, italic: true, children: ["\u2234 ", t('compact-summary-folded'), " \u00B7 ", compactPreview(text), ' ', t('hint-expand-ctrl-o')] })) }));
|
|
402
|
+
case 'subagent':
|
|
403
|
+
if (!subagent)
|
|
404
|
+
return null;
|
|
405
|
+
return (_jsx(Box, { flexDirection: "column", ref: ref, children: _jsx(SubagentMessage, { subagent: subagent, addMargin: addMargin, activityFrames: activityFrames, isExpanded: isExpanded, onClick: () => onToggleRow(rowId) }) }));
|
|
401
406
|
}
|
|
402
407
|
}
|
|
403
408
|
/** Folded compact-summary preview: whitespace flattened, capped with an
|
|
@@ -414,6 +419,10 @@ const MemoRow = React.memo(TranscriptRow);
|
|
|
414
419
|
* welcome line. It scrolls away with the transcript once the conversation
|
|
415
420
|
* fills the viewport (Claude Code shows its ✦ logo in the same slot).
|
|
416
421
|
*/
|
|
417
|
-
export function LogoHeader({ model, effort, cwd, }) {
|
|
418
|
-
|
|
422
|
+
export function LogoHeader({ model, effort, cwd, whale = true, }) {
|
|
423
|
+
// Minimal mode drops the whole splash (whale art AND wordmark) — only the
|
|
424
|
+
// transcript and a bare status bar remain.
|
|
425
|
+
if (isMinimalMode())
|
|
426
|
+
return null;
|
|
427
|
+
return (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: _jsx(LogoV2, { model: model, effort: effort, cwd: cwd, whale: whale }) }));
|
|
419
428
|
}
|
|
@@ -18,8 +18,8 @@ export function ModelPicker({ models, focusIndex, currentModel, }) {
|
|
|
18
18
|
const { rows: terminalRows } = useTerminalSize();
|
|
19
19
|
// 焦点窗口化按行预算:ListItem 带 description 时占 2 行(正文+描述,均
|
|
20
20
|
// truncate 成单行),只数项数会把焦点裁出浮层(二次审查实证)。
|
|
21
|
-
// 框架行:浮层预留 8 + Pane 2 + 标题 2 + 页脚 1 =
|
|
22
|
-
const { start, end } = listWindow(models.map(m => (m.description ? 2 : 1)), focusIndex, Math.max(terminalRows -
|
|
21
|
+
// 框架行:浮层预留 8 + Pane 2 + 标题 2 + 页脚 1 + 挂载包裹 marginTop 1 = 14。
|
|
22
|
+
const { start, end } = listWindow(models.map(m => (m.description ? 2 : 1)), focusIndex, Math.max(terminalRows - 14, 2));
|
|
23
23
|
return (_jsxs(Pane, { color: "permission", children: [_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "remember", bold: true, children: t('picker-title-model') }) }), models.slice(start, end).map((model, index) => {
|
|
24
24
|
const absoluteIndex = start + index;
|
|
25
25
|
return (_jsxs(ListItem, { isFocused: absoluteIndex === focusIndex, isSelected: `${model.provider}/${model.id}` === currentModel, description: model.description, showScrollUp: absoluteIndex === start && start > 0, showScrollDown: absoluteIndex === end - 1 && end < models.length, children: [model.provider, " / ", model.name] }, `${model.provider}/${model.id}`));
|
|
@@ -49,7 +49,7 @@ export interface PromptInputProps {
|
|
|
49
49
|
* the input spans multiple lines (history/command selection otherwise); the
|
|
50
50
|
* visible window scrolls to keep the caret row on screen past
|
|
51
51
|
* MAX_VISIBLE_LINES. Enter submits, backspace/delete edit, ←/→ move the
|
|
52
|
-
* cursor, Tab completes the selected command, Ctrl+
|
|
52
|
+
* cursor, Tab completes the selected command, Ctrl+G opens the draft in the
|
|
53
53
|
* external editor ($VISUAL/$EDITOR), Escape clears (or closes the help
|
|
54
54
|
* menu), `?` toggles the help menu. Windows ConPTY pipelines deliver
|
|
55
55
|
* whole lines with the Enter key lost: a trailing CR/LF in the input marks
|
|
@@ -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;AAazB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAkDxD;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;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,qBAg/BlB"}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { readFile, unlink } from 'node:fs/promises';
|
|
4
4
|
import { basename } from 'node:path';
|
|
5
5
|
import { t } from '../i18n.js';
|
|
6
|
-
import { Box, Text, useInput, useTerminalSize } from '../ui.js';
|
|
6
|
+
import { Box, Text, useInput, useTerminalSize, useTheme } from '../ui.js';
|
|
7
|
+
import { EffortChargeGlyph } from './EffortChargeGlyph.js';
|
|
8
|
+
import { EffortInputBorder } from './EffortInputBorder.js';
|
|
9
|
+
import { EffortTierBadge } from './EffortTierBadge.js';
|
|
10
|
+
import { isLightThemeActive } from '../theme.js';
|
|
7
11
|
import { useDeclaredCursor } from '../ink/hooks/use-declared-cursor.js';
|
|
8
12
|
import { stringWidth } from '../ink/stringWidth.js';
|
|
9
13
|
import { formatClipboardInsert, readClipboard } from '../utils/clipboard.js';
|
|
10
14
|
import { editInExternalEditor } from '../utils/externalEditor.js';
|
|
11
|
-
import { parseCommandName } from '../commands.js';
|
|
15
|
+
import { isHiddenCommandName, parseCommandName } from '../commands.js';
|
|
12
16
|
import { appendHistory } from '../history.js';
|
|
13
17
|
import { mentionAtCaret } from '../utils/mentions.js';
|
|
14
18
|
import { isMod } from '../utils/modifiers.js';
|
|
@@ -73,7 +77,7 @@ const MAX_VISIBLE_LINES = 5;
|
|
|
73
77
|
* the input spans multiple lines (history/command selection otherwise); the
|
|
74
78
|
* visible window scrolls to keep the caret row on screen past
|
|
75
79
|
* MAX_VISIBLE_LINES. Enter submits, backspace/delete edit, ←/→ move the
|
|
76
|
-
* cursor, Tab completes the selected command, Ctrl+
|
|
80
|
+
* cursor, Tab completes the selected command, Ctrl+G opens the draft in the
|
|
77
81
|
* external editor ($VISUAL/$EDITOR), Escape clears (or closes the help
|
|
78
82
|
* menu), `?` toggles the help menu. Windows ConPTY pipelines deliver
|
|
79
83
|
* whole lines with the Enter key lost: a trailing CR/LF in the input marks
|
|
@@ -89,6 +93,7 @@ const MAX_VISIBLE_LINES = 5;
|
|
|
89
93
|
* aborts the turn and sends the current input immediately.
|
|
90
94
|
*/
|
|
91
95
|
export function PromptInput({ channel, helpOpen, onToggleHelp, onRunCommand, selectionActive, fillText, onFillConsumed, onRewindRequest, controllerRef, }) {
|
|
96
|
+
const [themeName] = useTheme();
|
|
92
97
|
const [value, setValue] = React.useState('');
|
|
93
98
|
const [cursor, setCursor] = React.useState(0);
|
|
94
99
|
const valueRef = React.useRef(value);
|
|
@@ -135,7 +140,7 @@ export function PromptInput({ channel, helpOpen, onToggleHelp, onRunCommand, sel
|
|
|
135
140
|
const escTimerRef = React.useRef(null);
|
|
136
141
|
/** True while a Ctrl+V clipboard read is in flight (ignore repeat keys). */
|
|
137
142
|
const clipboardBusyRef = React.useRef(false);
|
|
138
|
-
/** True while the external editor owns the terminal (Ctrl+
|
|
143
|
+
/** True while the external editor owns the terminal (Ctrl+G round-trip). */
|
|
139
144
|
const editorBusyRef = React.useRef(false);
|
|
140
145
|
/** Enter dedupe window: cmd pipelines can deliver one Enter as `\r`+`\n`. */
|
|
141
146
|
const lastEnterAtRef = React.useRef(0);
|
|
@@ -146,6 +151,11 @@ export function PromptInput({ channel, helpOpen, onToggleHelp, onRunCommand, sel
|
|
|
146
151
|
};
|
|
147
152
|
}, []);
|
|
148
153
|
const { columns, rows: terminalRows } = useTerminalSize();
|
|
154
|
+
const helpScrollRef = React.useRef(null);
|
|
155
|
+
// OverlayAbove reserves six terminal rows for the composer/status chrome;
|
|
156
|
+
// the help block also keeps one row below it. Its own final row is a
|
|
157
|
+
// persistent navigation hint, leaving the remainder to ScrollBox.
|
|
158
|
+
const helpViewportHeight = Math.max(3, Math.max(terminalRows - 6, 4) - 1);
|
|
149
159
|
const suggestions = value.startsWith('/') ? channel.commandCompletions(value) : [];
|
|
150
160
|
const overlayOpen = suggestions.length > 0 &&
|
|
151
161
|
!helpOpen &&
|
|
@@ -312,10 +322,12 @@ export function PromptInput({ channel, helpOpen, onToggleHelp, onRunCommand, sel
|
|
|
312
322
|
channel.notify(t('input-interrupt-immediate'), { timeoutMs: 2500 });
|
|
313
323
|
};
|
|
314
324
|
/**
|
|
315
|
-
* Execute a slash command (built-in
|
|
316
|
-
* resolves to one: the name parses as the first token so
|
|
317
|
-
* dispatches `plan` with its argument text, and the merged
|
|
318
|
-
* (locals + registry) decides whether the line is a command
|
|
325
|
+
* Execute a slash command (built-in, plugin-registered, or hidden) when
|
|
326
|
+
* the input resolves to one: the name parses as the first token so
|
|
327
|
+
* `/plan off` dispatches `plan` with its argument text, and the merged
|
|
328
|
+
* command list (locals + registry) decides whether the line is a command
|
|
329
|
+
* at all. Hidden commands are recognized even though they are intentionally
|
|
330
|
+
* absent from the suggestion/help catalogs.
|
|
319
331
|
*/
|
|
320
332
|
const tryRunCommand = (text) => {
|
|
321
333
|
if (!text.startsWith('/'))
|
|
@@ -323,7 +335,8 @@ export function PromptInput({ channel, helpOpen, onToggleHelp, onRunCommand, sel
|
|
|
323
335
|
const parsed = parseCommandName(text);
|
|
324
336
|
if (parsed === undefined)
|
|
325
337
|
return false;
|
|
326
|
-
const known = channel.commandList.some(command => command.name === parsed.name)
|
|
338
|
+
const known = channel.commandList.some(command => command.name === parsed.name)
|
|
339
|
+
|| isHiddenCommandName(parsed.name);
|
|
327
340
|
if (!known)
|
|
328
341
|
return false;
|
|
329
342
|
const handled = onRunCommand(parsed.name, parsed.rawInput);
|
|
@@ -446,14 +459,22 @@ export function PromptInput({ channel, helpOpen, onToggleHelp, onRunCommand, sel
|
|
|
446
459
|
});
|
|
447
460
|
return;
|
|
448
461
|
}
|
|
449
|
-
//
|
|
462
|
+
// Help is modal for modified keys and every Enter variant. Ctrl+V above
|
|
463
|
+
// is the intentional exception: paste closes Help and inserts visibly.
|
|
464
|
+
// Swallow here before editor/submit/interrupt branches can mutate hidden
|
|
465
|
+
// composer or working-turn state; plain typing still dismisses Help below.
|
|
466
|
+
if (helpOpen && !key.escape && (key.ctrl || key.meta || key.super || key.return || input.includes('\n') || input.includes('\r'))) {
|
|
467
|
+
event.stopImmediatePropagation();
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
// Ctrl+G: edit the current draft in $VISUAL/$EDITOR (issue #123,
|
|
450
471
|
// readline's edit-and-execute-command). The draft is written to a temp
|
|
451
472
|
// file, the terminal is handed to the editor (Ink's alt-screen handoff),
|
|
452
473
|
// and the saved text replaces the input when it differs. The util maps
|
|
453
474
|
// every failure to an outcome, but the catch/finally here is the hard
|
|
454
475
|
// guarantee: a rejected promise must never kill the process, and the
|
|
455
|
-
// busy flag must always clear or Ctrl+
|
|
456
|
-
if (
|
|
476
|
+
// busy flag must always clear or Ctrl+G stays locked forever.
|
|
477
|
+
if (key.ctrl && input === 'g') {
|
|
457
478
|
editorBusyRef.current = true;
|
|
458
479
|
void (async () => {
|
|
459
480
|
try {
|
|
@@ -516,10 +537,13 @@ export function PromptInput({ channel, helpOpen, onToggleHelp, onRunCommand, sel
|
|
|
516
537
|
}
|
|
517
538
|
if (channel.working && value.trim() !== '') {
|
|
518
539
|
// CC's immediate-command semantics: /btw is exempt from steering —
|
|
519
|
-
// the side question never interrupts the running turn.
|
|
520
|
-
//
|
|
540
|
+
// the side question never interrupts the running turn. Hidden
|
|
541
|
+
// UI-only easter eggs (e.g. /deepseek) are also safe to run while
|
|
542
|
+
// streaming. Every other input keeps the steer behavior so /new
|
|
543
|
+
// /model etc. stay idle-only.
|
|
521
544
|
const parsed = value.startsWith('/') ? parseCommandName(value) : undefined;
|
|
522
|
-
if (parsed
|
|
545
|
+
if (parsed !== undefined && ((parsed.name === 'btw' && channel.commandList.some(c => c.name === 'btw'))
|
|
546
|
+
|| isHiddenCommandName(parsed.name))) {
|
|
523
547
|
tryRunCommand(value);
|
|
524
548
|
return;
|
|
525
549
|
}
|
|
@@ -578,6 +602,12 @@ export function PromptInput({ channel, helpOpen, onToggleHelp, onRunCommand, sel
|
|
|
578
602
|
handleEnter();
|
|
579
603
|
return;
|
|
580
604
|
}
|
|
605
|
+
// Help is modal over the composer. Backtab must not cycle the session
|
|
606
|
+
// mode invisibly behind it, and plain Tab has no Help action.
|
|
607
|
+
if (helpOpen && key.tab) {
|
|
608
|
+
event.stopImmediatePropagation();
|
|
609
|
+
return;
|
|
610
|
+
}
|
|
581
611
|
// Shift+Tab cycles the configured session modes (default: 默认 →
|
|
582
612
|
// 计划模式 → 完全访问; each mode bundles plan/sandbox/approval atoms —
|
|
583
613
|
// see the `modes` config). Must precede the plain-Tab arms — the parser
|
|
@@ -604,6 +634,41 @@ export function PromptInput({ channel, helpOpen, onToggleHelp, onRunCommand, sel
|
|
|
604
634
|
queueSend(value);
|
|
605
635
|
return;
|
|
606
636
|
}
|
|
637
|
+
// Help is a viewport, not prompt history. It deliberately owns every
|
|
638
|
+
// vertical navigation event while visible; otherwise Up/Down silently
|
|
639
|
+
// walk the input history and the clipped command rows remain unreachable.
|
|
640
|
+
if (helpOpen) {
|
|
641
|
+
const page = Math.max(1, helpViewportHeight - 2);
|
|
642
|
+
if (key.upArrow || key.wheelUp) {
|
|
643
|
+
helpScrollRef.current?.scrollBy(key.wheelUp ? -3 : -1);
|
|
644
|
+
event.stopImmediatePropagation();
|
|
645
|
+
return;
|
|
646
|
+
}
|
|
647
|
+
if (key.downArrow || key.wheelDown) {
|
|
648
|
+
helpScrollRef.current?.scrollBy(key.wheelDown ? 3 : 1);
|
|
649
|
+
event.stopImmediatePropagation();
|
|
650
|
+
return;
|
|
651
|
+
}
|
|
652
|
+
if (key.pageUp || key.pageDown) {
|
|
653
|
+
helpScrollRef.current?.scrollBy(key.pageUp ? -page : page);
|
|
654
|
+
event.stopImmediatePropagation();
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
if (key.home) {
|
|
658
|
+
helpScrollRef.current?.scrollTo(0);
|
|
659
|
+
event.stopImmediatePropagation();
|
|
660
|
+
return;
|
|
661
|
+
}
|
|
662
|
+
if (key.end) {
|
|
663
|
+
// Use a deliberately oversized absolute target rather than the
|
|
664
|
+
// sticky-bottom path: compact Help may still be measuring nested
|
|
665
|
+
// sections in this commit, while ScrollBox's render clamp resolves
|
|
666
|
+
// the target to the exact current maximum without a follow-up frame.
|
|
667
|
+
helpScrollRef.current?.scrollTo(Number.MAX_SAFE_INTEGER);
|
|
668
|
+
event.stopImmediatePropagation();
|
|
669
|
+
return;
|
|
670
|
+
}
|
|
671
|
+
}
|
|
607
672
|
if (key.meta && key.upArrow) {
|
|
608
673
|
// Alt+Up: pull the last pending message back for editing (pi/Codex).
|
|
609
674
|
pullBackLast();
|
|
@@ -878,11 +943,11 @@ export function PromptInput({ channel, helpOpen, onToggleHelp, onRunCommand, sel
|
|
|
878
943
|
// 的 style.position,常驻浮层 + 移除普通子节点不会触发 blit 解毒,被
|
|
879
944
|
// 覆盖的转录行会留空(见 Chat.tsx dialogOverlayOpen 注释)。
|
|
880
945
|
const floatersOpen = helpOpen || channel.pending.length > 0 || fileOverlayOpen || overlayOpen;
|
|
881
|
-
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [floatersOpen && (_jsxs(OverlayAbove, { maxHeight: Math.max(terminalRows - 6, 4), children: [helpOpen && (_jsx(Box, { marginBottom: 1, children: _jsx(HelpMenu, { commands: channel.commandList }) })), channel.pending.length > 0 && (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, paddingBottom: 1, children: [channel.pending.some(item => item.placement === 'steer') && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { dimColor: true, children: ["\u26A1 ", t('input-pending-steer-label')] }), channel.pending
|
|
946
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [floatersOpen && (_jsxs(OverlayAbove, { maxHeight: Math.max(terminalRows - 6, 4), children: [helpOpen && (_jsx(Box, { marginBottom: 1, children: _jsx(HelpMenu, { commands: channel.commandList, viewportHeight: helpViewportHeight, viewportWidth: columns, scrollRef: helpScrollRef }) })), !helpOpen && channel.pending.length > 0 && (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, paddingBottom: 1, children: [channel.pending.some(item => item.placement === 'steer') && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { dimColor: true, children: ["\u26A1 ", t('input-pending-steer-label')] }), channel.pending
|
|
882
947
|
.filter(item => item.placement === 'steer')
|
|
883
948
|
.map(item => (_jsxs(Text, { dimColor: true, wrap: "truncate", children: [' ', "\u21B3 ", item.text] }, item.id)))] })), channel.pending.some(item => item.placement === 'followup') && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { dimColor: true, children: ["\u23F3 ", t('input-pending-queue-label')] }), channel.pending
|
|
884
949
|
.filter(item => item.placement === 'followup')
|
|
885
|
-
.map(item => (_jsxs(Text, { dimColor: true, wrap: "truncate", children: [' ', "\u21B3 ", item.text] }, item.id)))] })), _jsxs(Text, { dimColor: true, children: ["Alt+\u2191 ", t('input-pending-actions-hint')] })] })), fileOverlayOpen && (_jsx(Box, { paddingLeft: 2, paddingBottom: 1, children: _jsx(FileSuggestions, { files: fileMatches, selectedIndex: fileSelected, columns: columns }) })), overlayOpen && (_jsx(Box, { paddingLeft: 2, paddingBottom: 1, children: _jsx(CommandSuggestions, { commands: suggestions, selectedIndex: selectedCommand, columns: columns }) }))] })), lastNotification && (_jsx(Box, { position: "absolute", marginTop: -1, height: 1, width: "100%", paddingLeft: 2, paddingRight: 1, flexDirection: "column", justifyContent: "flex-end", overflow: "hidden", children: _jsx(Box, { justifyContent: "flex-end", children: _jsx(Text, { color: lastNotification.color, dimColor: !lastNotification.color, wrap: "truncate", children: lastNotification.text }) }) })), _jsx(
|
|
950
|
+
.map(item => (_jsxs(Text, { dimColor: true, wrap: "truncate", children: [' ', "\u21B3 ", item.text] }, item.id)))] })), _jsxs(Text, { dimColor: true, children: ["Alt+\u2191 ", t('input-pending-actions-hint')] })] })), fileOverlayOpen && (_jsx(Box, { paddingLeft: 2, paddingBottom: 1, children: _jsx(FileSuggestions, { files: fileMatches, selectedIndex: fileSelected, columns: columns }) })), overlayOpen && (_jsx(Box, { paddingLeft: 2, paddingBottom: 1, children: _jsx(CommandSuggestions, { commands: suggestions, selectedIndex: selectedCommand, columns: columns }) }))] })), lastNotification && (_jsx(Box, { position: "absolute", marginTop: -1, height: 1, width: "100%", paddingLeft: 2, paddingRight: 1, flexDirection: "column", justifyContent: "flex-end", overflow: "hidden", children: _jsx(Box, { justifyContent: "flex-end", children: _jsx(Text, { color: lastNotification.color, dimColor: !lastNotification.color, wrap: "truncate", children: lastNotification.text }) }) })), _jsx(EffortInputBorder, { effort: channel.reasoningEffort, levels: channel.effortLevels, columns: columns, onLight: isLightThemeActive(themeName), idleColor: channel.mode.plan === true ? 'planMode' : 'promptBorder', children: _jsxs(Box, { flexDirection: "row", alignItems: "flex-start", width: "100%", children: [_jsx(EffortChargeGlyph, { effort: channel.reasoningEffort, levels: channel.effortLevels, working: channel.working }), _jsx(Box, { ref: valueBoxRef, flexGrow: 1, flexShrink: 1, children: value.length === 0 ? (_jsxs(_Fragment, { children: [_jsx(Text, { inverse: true, children: " " }), _jsx(EffortTierBadge, { effort: channel.reasoningEffort, levels: channel.effortLevels, onLight: isLightThemeActive(themeName), columns: columns, leadingColumns: 3 })] })) : (_jsx(Box, { flexDirection: "column", children: rendered })) })] }) })] }));
|
|
886
951
|
}
|
|
887
952
|
/**
|
|
888
953
|
* Hard-wrap text into visual rows of at most `width` columns (CJK-aware via
|
|
@@ -37,8 +37,8 @@ function sourceLabel(source) {
|
|
|
37
37
|
export function SkillsPicker({ skills, focusIndex, }) {
|
|
38
38
|
const { rows: terminalRows } = useTerminalSize();
|
|
39
39
|
// 每项恒占 2 行(正文 + 来源/简述描述行,均 truncate 成单行)。
|
|
40
|
-
// 框架行:浮层预留 8 + Pane 2 + 标题 2 + 页脚 1 =
|
|
41
|
-
const { start, end } = listWindow(skills.map(() => 2), focusIndex, Math.max(terminalRows -
|
|
40
|
+
// 框架行:浮层预留 8 + Pane 2 + 标题 2 + 页脚 1 + 挂载包裹 marginTop 1 = 14(ModelPicker 同款)。
|
|
41
|
+
const { start, end } = listWindow(skills.map(() => 2), focusIndex, Math.max(terminalRows - 14, 2));
|
|
42
42
|
return (_jsxs(Pane, { color: "permission", children: [_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "remember", bold: true, children: t('picker-title-skills') }) }), skills.length === 0 ? (_jsx(Text, { dimColor: true, children: t('skills-empty') })) : (skills.slice(start, end).map((skill, index) => {
|
|
43
43
|
const absoluteIndex = start + index;
|
|
44
44
|
return (_jsx(ListItem, { isFocused: absoluteIndex === focusIndex, description: `${sourceLabel(skill.source)}${skill.description === '' ? '' : ` · ${skill.description}`}`, showScrollUp: absoluteIndex === start && start > 0, showScrollDown: absoluteIndex === end - 1 && end < skills.length, children: skill.userInvocable ? `/${skill.name}` : skill.name }, skill.name));
|
|
@@ -1,23 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { ToolFileDiff } from '../dsh-adapter/channel.js';
|
|
3
|
-
|
|
3
|
+
export { chalkFromToken } from '../cc/syntaxTheme.js';
|
|
4
|
+
export { parseAnsiRuns, highlightLines } from '../cc/syntaxRuns.js';
|
|
4
5
|
import type { ToolBackground } from '../tuiDisplayPrefs.js';
|
|
5
|
-
/** chalk style for one raw theme value. Accepts every form the theme
|
|
6
|
-
* loader documents: #rgb, #rrggbb, #rrggbbaa (alpha stripped), rgb() with
|
|
7
|
-
* or without spaces, ansi256(n), ansi:name (issue #250, P2-5). */
|
|
8
|
-
export declare function chalkFromToken(token: string): (text: string) => string;
|
|
9
|
-
/** Parse a cli-highlight ANSI string into colored runs, preserving open
|
|
10
|
-
* spans across embedded newlines (multi-line strings/comments). Handles
|
|
11
|
-
* truecolor 38;2, 256-color 38;5 (tmux / FORCE_COLOR=2, issue #250 P1-1),
|
|
12
|
-
* and single-code 16-color SGR. */
|
|
13
|
-
export declare function parseAnsiRuns(text: string): {
|
|
14
|
-
text: string;
|
|
15
|
-
color?: string;
|
|
16
|
-
}[];
|
|
17
|
-
export declare function highlightLines(text: string, language: string | undefined, hl: CliHighlight | null, chTheme: Record<string, (text: string) => string> | undefined, themeSig: string): readonly {
|
|
18
|
-
text: string;
|
|
19
|
-
color?: string;
|
|
20
|
-
}[][] | undefined;
|
|
21
6
|
export declare function SplitDiffView({ diffs, width, maxRows, verbose, toolBackground, }: {
|
|
22
7
|
readonly diffs: readonly ToolFileDiff[];
|
|
23
8
|
/** Content width available to the whole two-pane block (divider included). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SplitDiffView.d.ts","sourceRoot":"","sources":["../../../src/components/SplitDiffView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"SplitDiffView.d.ts","sourceRoot":"","sources":["../../../src/components/SplitDiffView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAO7D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAGnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAuR3D,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,KAAK,EACL,OAAO,EACP,OAAO,EACP,cAAuB,GACxB,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAA;IACvC,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAA;CACzC,GAAG,KAAK,CAAC,SAAS,CAkFlB"}
|