@deepseek-harness-tui/dsh-tui 0.8.0 → 0.8.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 +32 -15
- package/cordis.patch.yml +21 -2
- package/cordis.yml +12 -1
- package/dsh-ecosystem-spec/protocols/profile-definitions.d.ts +13 -0
- package/dsh-ecosystem-spec/protocols/profile-definitions.js +59 -0
- package/dsh-ecosystem-spec/protocols/tui-channel-http.d.ts +15 -0
- package/dsh-ecosystem-spec/protocols/tui-channel-http.js +32 -0
- package/dsh-ecosystem-spec/protocols/tui-channel.d.ts +59 -0
- package/dsh-ecosystem-spec/protocols/tui-channel.js +166 -0
- package/dsh-ecosystem-spec/protocols/tui-contributions.d.ts +42 -0
- package/dsh-ecosystem-spec/protocols/tui-contributions.js +143 -0
- package/dsh-ecosystem-spec/registry/README.md +14 -0
- package/dsh-ecosystem-spec/registry/contracts/decision-events-v1alpha1.json +13 -0
- package/dsh-ecosystem-spec/registry/contracts/scene-v1alpha1.json +13 -0
- package/dsh-ecosystem-spec/registry/contracts/settings-section-v1alpha1.json +13 -0
- package/dsh-ecosystem-spec/registry/contracts/tui-channel-v1alpha1.json +30 -0
- package/dsh-ecosystem-spec/registry/contracts/workspace-provider-v1alpha1.json +6 -0
- package/dsh-ecosystem-spec/registry/host-descriptor.tui.example.json +56 -0
- package/dsh-ecosystem-spec/registry/permissions-0.1.json +13 -0
- package/dsh-ecosystem-spec/registry/registry-0.15.json +149 -0
- package/dsh-ecosystem-spec/schemas/conformance-claim.schema.json +15 -0
- package/dsh-ecosystem-spec/schemas/effect-ledger-record.schema.json +16 -0
- package/dsh-ecosystem-spec/schemas/host-descriptor.schema.json +26 -0
- package/lib/types/cc/figures.d.ts +4 -0
- package/lib/types/cc/figures.d.ts.map +1 -1
- package/lib/types/cc/figures.js +4 -0
- package/lib/types/command-trees.d.ts +2 -1
- package/lib/types/command-trees.d.ts.map +1 -1
- package/lib/types/command-trees.js +1 -1
- package/lib/types/commands.d.ts.map +1 -1
- package/lib/types/commands.js +2 -0
- package/lib/types/components/ExtensionDialog.d.ts +40 -0
- package/lib/types/components/ExtensionDialog.d.ts.map +1 -0
- package/lib/types/components/ExtensionDialog.js +210 -0
- package/lib/types/components/HelpMenu.js +1 -1
- package/lib/types/components/LoadedContextPanel.d.ts +5 -5
- package/lib/types/components/LoadedContextPanel.js +6 -6
- package/lib/types/components/LogoV2.d.ts.map +1 -1
- package/lib/types/components/LogoV2.js +16 -8
- package/lib/types/components/Markdown.d.ts +13 -1
- package/lib/types/components/Markdown.d.ts.map +1 -1
- package/lib/types/components/Markdown.js +15 -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 +111 -6
- package/lib/types/components/PromptInput.d.ts.map +1 -1
- package/lib/types/components/PromptInput.js +26 -12
- package/lib/types/components/RewindPicker.d.ts +13 -1
- package/lib/types/components/RewindPicker.d.ts.map +1 -1
- package/lib/types/components/RewindPicker.js +26 -2
- package/lib/types/components/StreamingMarkdown.d.ts +2 -8
- package/lib/types/components/StreamingMarkdown.d.ts.map +1 -1
- package/lib/types/components/StreamingMarkdown.js +51 -9
- package/lib/types/components/ToolUseLoader.d.ts +8 -3
- package/lib/types/components/ToolUseLoader.d.ts.map +1 -1
- package/lib/types/components/ToolUseLoader.js +43 -9
- package/lib/types/components/activityFrames.d.ts +1 -1
- package/lib/types/components/activityFrames.d.ts.map +1 -1
- package/lib/types/components/activityFrames.js +4 -1
- package/lib/types/components/messages/AssistantThinkingMessage.d.ts +5 -1
- package/lib/types/components/messages/AssistantThinkingMessage.d.ts.map +1 -1
- package/lib/types/components/messages/AssistantThinkingMessage.js +26 -3
- package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -1
- package/lib/types/components/messages/AssistantToolUseMessage.js +13 -2
- package/lib/types/dsh-adapter/channel.d.ts +61 -11
- package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel.js +767 -120
- package/lib/types/dsh-adapter/childStderr.d.ts.map +1 -1
- package/lib/types/dsh-adapter/childStderr.js +10 -0
- package/lib/types/dsh-adapter/command-attribution.d.ts +51 -0
- package/lib/types/dsh-adapter/command-attribution.d.ts.map +1 -0
- package/lib/types/dsh-adapter/command-attribution.js +93 -0
- package/lib/types/dsh-adapter/command-errors.d.ts +42 -0
- package/lib/types/dsh-adapter/command-errors.d.ts.map +1 -0
- package/lib/types/dsh-adapter/command-errors.js +63 -0
- package/lib/types/dsh-adapter/command-trees.d.ts +7 -1
- package/lib/types/dsh-adapter/command-trees.d.ts.map +1 -1
- package/lib/types/dsh-adapter/command-trees.js +70 -20
- package/lib/types/dsh-adapter/component-identity.d.ts +33 -0
- package/lib/types/dsh-adapter/component-identity.d.ts.map +1 -0
- package/lib/types/dsh-adapter/component-identity.js +108 -0
- package/lib/types/dsh-adapter/contract.d.ts +1 -1
- package/lib/types/dsh-adapter/contract.js +2 -2
- package/lib/types/dsh-adapter/decision-guard.d.ts +84 -0
- package/lib/types/dsh-adapter/decision-guard.d.ts.map +1 -0
- package/lib/types/dsh-adapter/decision-guard.js +348 -0
- package/lib/types/dsh-adapter/dialogs.d.ts +145 -0
- package/lib/types/dsh-adapter/dialogs.d.ts.map +1 -0
- package/lib/types/dsh-adapter/dialogs.js +316 -0
- package/lib/types/dsh-adapter/effect-ledger.d.ts +91 -0
- package/lib/types/dsh-adapter/effect-ledger.d.ts.map +1 -0
- package/lib/types/dsh-adapter/effect-ledger.js +251 -0
- package/lib/types/dsh-adapter/extension-events.d.ts +193 -0
- package/lib/types/dsh-adapter/extension-events.d.ts.map +1 -0
- package/lib/types/dsh-adapter/extension-events.js +207 -0
- package/lib/types/dsh-adapter/extensions.d.ts +32 -0
- package/lib/types/dsh-adapter/extensions.d.ts.map +1 -0
- package/lib/types/dsh-adapter/extensions.js +42 -0
- package/lib/types/dsh-adapter/grants.d.ts +25 -0
- package/lib/types/dsh-adapter/grants.d.ts.map +1 -0
- package/lib/types/dsh-adapter/grants.js +213 -0
- package/lib/types/dsh-adapter/host-access.d.ts +37 -0
- package/lib/types/dsh-adapter/host-access.d.ts.map +1 -0
- package/lib/types/dsh-adapter/host-access.js +652 -0
- package/lib/types/dsh-adapter/host-descriptor.d.ts +24 -0
- package/lib/types/dsh-adapter/host-descriptor.d.ts.map +1 -0
- package/lib/types/dsh-adapter/host-descriptor.js +169 -0
- package/lib/types/dsh-adapter/index.d.ts +4 -0
- package/lib/types/dsh-adapter/index.d.ts.map +1 -1
- package/lib/types/dsh-adapter/index.js +1 -0
- package/lib/types/dsh-adapter/message-observer.d.ts +173 -0
- package/lib/types/dsh-adapter/message-observer.d.ts.map +1 -0
- package/lib/types/dsh-adapter/message-observer.js +553 -0
- package/lib/types/dsh-adapter/plugin-host.d.ts +136 -0
- package/lib/types/dsh-adapter/plugin-host.d.ts.map +1 -0
- package/lib/types/dsh-adapter/plugin-host.js +365 -0
- package/lib/types/dsh-adapter/plugin-storage.d.ts +108 -0
- package/lib/types/dsh-adapter/plugin-storage.d.ts.map +1 -0
- package/lib/types/dsh-adapter/plugin-storage.js +397 -0
- package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
- package/lib/types/dsh-adapter/plugin.js +124 -14
- package/lib/types/dsh-adapter/plugins-info.d.ts +43 -0
- package/lib/types/dsh-adapter/plugins-info.d.ts.map +1 -0
- package/lib/types/dsh-adapter/plugins-info.js +276 -0
- package/lib/types/dsh-adapter/promptDebug.d.ts +0 -6
- package/lib/types/dsh-adapter/promptDebug.d.ts.map +1 -1
- package/lib/types/dsh-adapter/promptDebug.js +13 -4
- package/lib/types/dsh-adapter/renderers.d.ts +57 -0
- package/lib/types/dsh-adapter/renderers.d.ts.map +1 -0
- package/lib/types/dsh-adapter/renderers.js +173 -0
- package/lib/types/dsh-adapter/sanitize.d.ts +36 -0
- package/lib/types/dsh-adapter/sanitize.d.ts.map +1 -0
- package/lib/types/dsh-adapter/sanitize.js +65 -0
- package/lib/types/dsh-adapter/scenes.d.ts +15 -5
- package/lib/types/dsh-adapter/scenes.d.ts.map +1 -1
- package/lib/types/dsh-adapter/scenes.js +149 -35
- package/lib/types/dsh-adapter/settings-sections.d.ts +7 -3
- package/lib/types/dsh-adapter/settings-sections.d.ts.map +1 -1
- package/lib/types/dsh-adapter/settings-sections.js +106 -26
- package/lib/types/dsh-adapter/shortcuts.d.ts +107 -0
- package/lib/types/dsh-adapter/shortcuts.d.ts.map +1 -0
- package/lib/types/dsh-adapter/shortcuts.js +340 -0
- package/lib/types/dsh-adapter/status.d.ts +74 -0
- package/lib/types/dsh-adapter/status.d.ts.map +1 -0
- package/lib/types/dsh-adapter/status.js +234 -0
- package/lib/types/dsh-adapter/workspaces.d.ts +16 -5
- package/lib/types/dsh-adapter/workspaces.d.ts.map +1 -1
- package/lib/types/dsh-adapter/workspaces.js +287 -170
- package/lib/types/extensions.d.ts +13 -0
- package/lib/types/extensions.d.ts.map +1 -0
- package/lib/types/extensions.js +21 -0
- package/lib/types/force-production-react.d.ts +1 -0
- package/lib/types/force-production-react.d.ts.map +1 -0
- package/lib/types/force-production-react.js +12 -0
- package/lib/types/i18n.d.ts +174 -20
- package/lib/types/i18n.d.ts.map +1 -1
- package/lib/types/i18n.js +56 -6
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +1 -0
- package/lib/types/ink/components/App.d.ts +2 -0
- package/lib/types/ink/components/App.d.ts.map +1 -1
- package/lib/types/ink/components/App.js +4 -0
- package/lib/types/ink/ink.d.ts +31 -3
- package/lib/types/ink/ink.d.ts.map +1 -1
- package/lib/types/ink/ink.js +90 -5
- package/lib/types/ink/log-update.d.ts.map +1 -1
- package/lib/types/ink/log-update.js +225 -56
- package/lib/types/ink/output.d.ts +35 -2
- package/lib/types/ink/output.d.ts.map +1 -1
- package/lib/types/ink/output.js +281 -14
- package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
- package/lib/types/ink/render-node-to-output.js +14 -6
- package/lib/types/ink/screen.d.ts +39 -0
- package/lib/types/ink/screen.d.ts.map +1 -1
- package/lib/types/ink/screen.js +117 -0
- package/lib/types/ink/terminal.d.ts.map +1 -1
- package/lib/types/ink/terminal.js +26 -6
- package/lib/types/ink/wrapAnsi.d.ts +1 -1
- package/lib/types/ink/wrapAnsi.d.ts.map +1 -1
- package/lib/types/ink/wrapAnsi.js +29 -2
- package/lib/types/plugin-host.d.ts +15 -0
- package/lib/types/plugin-host.d.ts.map +1 -0
- package/lib/types/plugin-host.js +17 -0
- package/lib/types/plugin-spec/negotiate.d.ts +11 -0
- package/lib/types/plugin-spec/negotiate.d.ts.map +1 -0
- package/lib/types/plugin-spec/negotiate.js +97 -0
- package/lib/types/plugin-spec/permission-scope.d.ts +32 -0
- package/lib/types/plugin-spec/permission-scope.d.ts.map +1 -0
- package/lib/types/plugin-spec/permission-scope.js +90 -0
- package/lib/types/plugin-spec/registry.d.ts +23 -0
- package/lib/types/plugin-spec/registry.d.ts.map +1 -0
- package/lib/types/plugin-spec/registry.js +252 -0
- package/lib/types/plugin-spec/schema-check.d.ts +17 -0
- package/lib/types/plugin-spec/schema-check.d.ts.map +1 -0
- package/lib/types/plugin-spec/schema-check.js +165 -0
- package/lib/types/plugin-spec/tui-extension.d.ts +16 -0
- package/lib/types/plugin-spec/tui-extension.d.ts.map +1 -0
- package/lib/types/plugin-spec/tui-extension.js +79 -0
- package/lib/types/plugin-spec/types.d.ts +114 -0
- package/lib/types/plugin-spec/types.d.ts.map +1 -0
- package/lib/types/plugin-spec/types.js +10 -0
- package/lib/types/plugin-spec/validate.d.ts +21 -0
- package/lib/types/plugin-spec/validate.d.ts.map +1 -0
- package/lib/types/plugin-spec/validate.js +138 -0
- package/lib/types/scenes.d.ts +2 -1
- package/lib/types/scenes.d.ts.map +1 -1
- package/lib/types/scenes.js +1 -1
- package/lib/types/screens/Chat.d.ts +14 -1
- package/lib/types/screens/Chat.d.ts.map +1 -1
- package/lib/types/screens/Chat.js +173 -49
- package/lib/types/screens/SessionBrowser.d.ts.map +1 -1
- package/lib/types/screens/SessionBrowser.js +10 -3
- package/lib/types/sessions/view.d.ts +3 -2
- package/lib/types/sessions/view.d.ts.map +1 -1
- package/lib/types/sessions/view.js +18 -0
- package/lib/types/settings-sections.d.ts +2 -1
- package/lib/types/settings-sections.d.ts.map +1 -1
- package/lib/types/settings-sections.js +1 -1
- package/lib/types/theme.d.ts +5 -0
- package/lib/types/theme.d.ts.map +1 -1
- package/lib/types/theme.js +15 -0
- package/lib/types/update.d.ts +20 -0
- package/lib/types/update.d.ts.map +1 -1
- package/lib/types/update.js +54 -7
- package/lib/types/utils/execFileNoThrow.d.ts.map +1 -1
- package/lib/types/utils/execFileNoThrow.js +3 -0
- package/lib/types/utils/loaded-context.d.ts +8 -3
- package/lib/types/utils/loaded-context.d.ts.map +1 -1
- package/lib/types/utils/loaded-context.js +39 -3
- package/lib/types/utils/modifiers.d.ts.map +1 -1
- package/lib/types/utils/modifiers.js +3 -2
- package/lib/types/working-activity.d.ts +12 -0
- package/lib/types/working-activity.d.ts.map +1 -1
- package/lib/types/working-activity.js +13 -0
- package/lib/types/workspaces.d.ts +2 -1
- package/lib/types/workspaces.d.ts.map +1 -1
- package/lib/types/workspaces.js +1 -1
- package/node_modules/@dsh-std/command/CHANGELOG.md +8 -0
- package/node_modules/@dsh-std/command/LICENSE +21 -0
- package/node_modules/@dsh-std/command/README.md +26 -0
- package/node_modules/@dsh-std/command/README.zh.md +28 -0
- package/node_modules/@dsh-std/command/lib/index.d.ts +144 -0
- package/node_modules/@dsh-std/command/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/command/lib/index.js +252 -0
- package/node_modules/@dsh-std/command/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/command/package.json +22 -0
- package/node_modules/@dsh-std/connection/CHANGELOG.md +8 -0
- package/node_modules/@dsh-std/connection/LICENSE +21 -0
- package/node_modules/@dsh-std/connection/README.md +42 -0
- package/node_modules/@dsh-std/connection/README.zh.md +42 -0
- package/node_modules/@dsh-std/connection/lib/connection-CdGcSQnu.d.ts +125 -0
- package/node_modules/@dsh-std/connection/lib/connection-CdGcSQnu.d.ts.map +1 -0
- package/node_modules/@dsh-std/connection/lib/index.d.ts +89 -0
- package/node_modules/@dsh-std/connection/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/connection/lib/index.js +158 -0
- package/node_modules/@dsh-std/connection/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/connection/lib/memory.d.ts +24 -0
- package/node_modules/@dsh-std/connection/lib/memory.d.ts.map +1 -0
- package/node_modules/@dsh-std/connection/lib/memory.js +258 -0
- package/node_modules/@dsh-std/connection/lib/memory.js.map +1 -0
- package/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js +226 -0
- package/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -0
- package/node_modules/@dsh-std/connection/package.json +20 -0
- package/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/node_modules/@dsh-std/core/LICENSE +21 -0
- package/node_modules/@dsh-std/core/README.md +13 -0
- package/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/core/package.json +21 -0
- package/node_modules/@dsh-std/manifest/CHANGELOG.md +9 -0
- package/node_modules/@dsh-std/manifest/LICENSE +21 -0
- package/node_modules/@dsh-std/manifest/README.md +5 -0
- package/node_modules/@dsh-std/manifest/README.zh.md +5 -0
- package/node_modules/@dsh-std/manifest/lib/index.d.ts +182 -0
- package/node_modules/@dsh-std/manifest/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/manifest/lib/index.js +625 -0
- package/node_modules/@dsh-std/manifest/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/manifest/package.json +20 -0
- package/node_modules/@dsh-std/manifest/schema/dsh-plugin-0.15.schema.json +144 -0
- package/node_modules/@dsh-std/messages/CHANGELOG.md +8 -0
- package/node_modules/@dsh-std/messages/LICENSE +21 -0
- package/node_modules/@dsh-std/messages/README.md +5 -0
- package/node_modules/@dsh-std/messages/README.zh.md +7 -0
- package/node_modules/@dsh-std/messages/lib/index.d.ts +50 -0
- package/node_modules/@dsh-std/messages/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/messages/lib/index.js +151 -0
- package/node_modules/@dsh-std/messages/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/messages/package.json +20 -0
- package/node_modules/@dsh-std/messages/schema/message-observer-envelope-0.15.schema.json +54 -0
- package/node_modules/@dsh-std/presentation/CHANGELOG.md +9 -0
- package/node_modules/@dsh-std/presentation/LICENSE +21 -0
- package/node_modules/@dsh-std/presentation/README.md +27 -0
- package/node_modules/@dsh-std/presentation/README.zh.md +29 -0
- package/node_modules/@dsh-std/presentation/lib/callback.d.ts +2 -0
- package/node_modules/@dsh-std/presentation/lib/callback.js +179 -0
- package/node_modules/@dsh-std/presentation/lib/callback.js.map +1 -0
- package/node_modules/@dsh-std/presentation/lib/index.d.ts +262 -0
- package/node_modules/@dsh-std/presentation/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/presentation/lib/index.js +550 -0
- package/node_modules/@dsh-std/presentation/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/presentation/lib/interaction.d.ts +2 -0
- package/node_modules/@dsh-std/presentation/lib/interaction.js +2 -0
- package/node_modules/@dsh-std/presentation/lib/operations.d.ts +2 -0
- package/node_modules/@dsh-std/presentation/lib/operations.js +2 -0
- package/node_modules/@dsh-std/presentation/package.json +25 -0
- package/node_modules/@dsh-std/storage/CHANGELOG.md +8 -0
- package/node_modules/@dsh-std/storage/LICENSE +21 -0
- package/node_modules/@dsh-std/storage/README.md +5 -0
- package/node_modules/@dsh-std/storage/README.zh.md +7 -0
- package/node_modules/@dsh-std/storage/lib/index.d.ts +48 -0
- package/node_modules/@dsh-std/storage/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/storage/lib/index.js +104 -0
- package/node_modules/@dsh-std/storage/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/storage/package.json +20 -0
- package/node_modules/@dsh-std/storage/schema/local-storage-0.15.schema.json +56 -0
- package/package.json +110 -70
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/LICENSE +21 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/README.md +42 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/README.zh.md +42 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/connection-CdGcSQnu.d.ts +125 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/connection-CdGcSQnu.d.ts.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/index.d.ts +89 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/index.js +158 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/memory.d.ts +24 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/memory.d.ts.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/memory.js +258 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/memory.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js +226 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/package.json +20 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/LICENSE +21 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/README.md +13 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/package.json +21 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/CHANGELOG.md +9 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/LICENSE +21 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/README.md +5 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/README.zh.md +5 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/lib/index.d.ts +182 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/lib/index.js +625 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/package.json +20 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/schema/dsh-plugin-0.15.schema.json +144 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/CHANGELOG.md +9 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/LICENSE +21 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/README.md +27 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/README.zh.md +29 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/callback.d.ts +2 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/callback.js +179 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/callback.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/index.d.ts +262 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/index.js +550 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/interaction.d.ts +2 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/interaction.js +2 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/operations.d.ts +2 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/operations.js +2 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/package.json +25 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/LICENSE +21 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/README.md +13 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/package.json +21 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/LICENSE +21 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/README.md +13 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/package.json +21 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/LICENSE +21 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/README.md +13 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/package.json +21 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/LICENSE +21 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/README.md +42 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/README.zh.md +42 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/connection-CdGcSQnu.d.ts +125 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/connection-CdGcSQnu.d.ts.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/index.d.ts +89 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/index.js +158 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/memory.d.ts +24 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/memory.d.ts.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/memory.js +258 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/memory.js.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js +226 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/package.json +20 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/LICENSE +21 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/README.md +13 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/package.json +21 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/LICENSE +21 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/README.md +13 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/package.json +21 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The managed plugin dialog (`ctx.tuiDialogs`) — one panel rendering the
|
|
3
|
+
* store's current snapshot in the chat chrome (the slot approval/question
|
|
4
|
+
* panels occupy). Three kinds share one component:
|
|
5
|
+
*
|
|
6
|
+
* - `select` — focus list (↑/↓, windowed), Enter settles the option id
|
|
7
|
+
* - `confirm` — two rows (confirm/cancel), Enter settles the boolean
|
|
8
|
+
* - `input` — single-line text edit, Enter settles the text
|
|
9
|
+
*
|
|
10
|
+
* Esc (and Ctrl+C) always cancels — the plugin's promise resolves with the
|
|
11
|
+
* cancelled value. The panel owns the keyboard through its own useInput,
|
|
12
|
+
* the same contract as ApprovalPanel/AskUserQuestionPanel: Chat's global
|
|
13
|
+
* handler early-returns while a snapshot is pending.
|
|
14
|
+
*
|
|
15
|
+
* Two input-pipeline rules shape every handler below:
|
|
16
|
+
*
|
|
17
|
+
* - BATCHED KEYS: a terminal delivers one stdin chunk as several key events
|
|
18
|
+
* inside a single React batch (Down+Enter arrives together), so state
|
|
19
|
+
* queued by the first event is NOT visible to the second. Every piece of
|
|
20
|
+
* editing state the handlers act on (focus, value, cursor) therefore
|
|
21
|
+
* lives in a ref mutated SYNCHRONOUSLY per event; the useState mirror
|
|
22
|
+
* only exists to re-render.
|
|
23
|
+
* - CODE POINTS: cursor movement and deletion step over whole code points
|
|
24
|
+
* (`[...s]` iteration, same contract as the transcript search box), so an
|
|
25
|
+
* emoji can never be split into a lone surrogate.
|
|
26
|
+
*
|
|
27
|
+
* All text arrives pre-sanitized from TuiDialogRuntime (control chars
|
|
28
|
+
* stripped, cell-width capped); the panel still renders everything through
|
|
29
|
+
* ListItem's single-line truncation.
|
|
30
|
+
*/
|
|
31
|
+
import React from 'react';
|
|
32
|
+
import { type TuiDialogAnswer, type TuiDialogSnapshot } from '../dsh-adapter/dialogs.js';
|
|
33
|
+
export type ExtensionDialogProps = {
|
|
34
|
+
/** The pending dialog (TuiDialogStore snapshot; `key` remounts per dialog). */
|
|
35
|
+
readonly dialog: TuiDialogSnapshot;
|
|
36
|
+
readonly onDecide: (value: TuiDialogAnswer) => void;
|
|
37
|
+
readonly onCancel: () => void;
|
|
38
|
+
};
|
|
39
|
+
export declare function ExtensionDialog({ dialog, onDecide, onCancel }: ExtensionDialogProps): React.ReactNode;
|
|
40
|
+
//# sourceMappingURL=ExtensionDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExtensionDialog.d.ts","sourceRoot":"","sources":["../../../src/components/ExtensionDialog.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAA;AASzB,OAAO,EAAe,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAGrG,MAAM,MAAM,oBAAoB,GAAG;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;CAC9B,CAAA;AAED,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,oBAAoB,GAAG,KAAK,CAAC,SAAS,CASrG"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The managed plugin dialog (`ctx.tuiDialogs`) — one panel rendering the
|
|
4
|
+
* store's current snapshot in the chat chrome (the slot approval/question
|
|
5
|
+
* panels occupy). Three kinds share one component:
|
|
6
|
+
*
|
|
7
|
+
* - `select` — focus list (↑/↓, windowed), Enter settles the option id
|
|
8
|
+
* - `confirm` — two rows (confirm/cancel), Enter settles the boolean
|
|
9
|
+
* - `input` — single-line text edit, Enter settles the text
|
|
10
|
+
*
|
|
11
|
+
* Esc (and Ctrl+C) always cancels — the plugin's promise resolves with the
|
|
12
|
+
* cancelled value. The panel owns the keyboard through its own useInput,
|
|
13
|
+
* the same contract as ApprovalPanel/AskUserQuestionPanel: Chat's global
|
|
14
|
+
* handler early-returns while a snapshot is pending.
|
|
15
|
+
*
|
|
16
|
+
* Two input-pipeline rules shape every handler below:
|
|
17
|
+
*
|
|
18
|
+
* - BATCHED KEYS: a terminal delivers one stdin chunk as several key events
|
|
19
|
+
* inside a single React batch (Down+Enter arrives together), so state
|
|
20
|
+
* queued by the first event is NOT visible to the second. Every piece of
|
|
21
|
+
* editing state the handlers act on (focus, value, cursor) therefore
|
|
22
|
+
* lives in a ref mutated SYNCHRONOUSLY per event; the useState mirror
|
|
23
|
+
* only exists to re-render.
|
|
24
|
+
* - CODE POINTS: cursor movement and deletion step over whole code points
|
|
25
|
+
* (`[...s]` iteration, same contract as the transcript search box), so an
|
|
26
|
+
* emoji can never be split into a lone surrogate.
|
|
27
|
+
*
|
|
28
|
+
* All text arrives pre-sanitized from TuiDialogRuntime (control chars
|
|
29
|
+
* stripped, cell-width capped); the panel still renders everything through
|
|
30
|
+
* ListItem's single-line truncation.
|
|
31
|
+
*/
|
|
32
|
+
import React from 'react';
|
|
33
|
+
import { t } from '../i18n.js';
|
|
34
|
+
import { Box, Text, useInput, useTerminalSize } from '../ui.js';
|
|
35
|
+
import { stringWidth } from '../ink/stringWidth.js';
|
|
36
|
+
import { isPlainReturnInput } from '../utils/modifiers.js';
|
|
37
|
+
import { Pane } from './design-system/Pane.js';
|
|
38
|
+
import { ListItem } from './design-system/ListItem.js';
|
|
39
|
+
import { HintLine } from './design-system/HintLine.js';
|
|
40
|
+
import { listWindow } from './listWindow.js';
|
|
41
|
+
import { INPUT_CELLS } from '../dsh-adapter/dialogs.js';
|
|
42
|
+
import { capCells, flattenInline } from '../dsh-adapter/sanitize.js';
|
|
43
|
+
export function ExtensionDialog({ dialog, onDecide, onCancel }) {
|
|
44
|
+
switch (dialog.kind) {
|
|
45
|
+
case 'select':
|
|
46
|
+
return _jsx(SelectDialog, { dialog: dialog, onDecide: onDecide, onCancel: onCancel });
|
|
47
|
+
case 'confirm':
|
|
48
|
+
return _jsx(ConfirmDialog, { dialog: dialog, onDecide: onDecide, onCancel: onCancel });
|
|
49
|
+
case 'input':
|
|
50
|
+
return _jsx(InputDialog, { dialog: dialog, onDecide: onDecide, onCancel: onCancel });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function SelectDialog({ dialog, onDecide, onCancel, }) {
|
|
54
|
+
const [focusIndex, setFocusIndex] = React.useState(0);
|
|
55
|
+
// Synchronous source of truth for the handlers (see the module header):
|
|
56
|
+
// Down+Enter in one stdin chunk must move AND read the new focus.
|
|
57
|
+
const focusRef = React.useRef(0);
|
|
58
|
+
const moveFocus = (delta) => {
|
|
59
|
+
const next = (focusRef.current + delta + dialog.options.length) % dialog.options.length;
|
|
60
|
+
focusRef.current = next;
|
|
61
|
+
setFocusIndex(next);
|
|
62
|
+
};
|
|
63
|
+
const { rows: terminalRows } = useTerminalSize();
|
|
64
|
+
useInput((input, key, event) => {
|
|
65
|
+
if (key.escape || (key.ctrl && input === 'c')) {
|
|
66
|
+
onCancel();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (key.upArrow) {
|
|
70
|
+
moveFocus(-1);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (key.downArrow) {
|
|
74
|
+
moveFocus(1);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// isPasted lives on the InputEvent, not the key: a bracketed paste that
|
|
78
|
+
// is all line breaks is pasted content, never an Enter press.
|
|
79
|
+
if (isPlainReturnInput(input, { ...key, isPasted: event.isPasted })) {
|
|
80
|
+
const option = dialog.options[focusRef.current];
|
|
81
|
+
if (option !== undefined)
|
|
82
|
+
onDecide(option.id);
|
|
83
|
+
}
|
|
84
|
+
}, { isActive: true });
|
|
85
|
+
// Row budget mirrors the rewind picker: a described option costs 2 rows,
|
|
86
|
+
// a bare one 1; frame rows: Pane 2 + title 2 + footer 1 + slack.
|
|
87
|
+
const { start, end } = listWindow(dialog.options.map(option => (option.description === undefined ? 1 : 2)), focusIndex, Math.max(terminalRows - 10, 2));
|
|
88
|
+
return (_jsxs(Pane, { color: "permission", children: [_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "remember", bold: true, children: dialog.title }) }), dialog.options.slice(start, end).map((option, index) => {
|
|
89
|
+
const absoluteIndex = start + index;
|
|
90
|
+
return (_jsx(ListItem, { isFocused: absoluteIndex === focusIndex, description: option.description, showScrollUp: absoluteIndex === start && start > 0, showScrollDown: absoluteIndex === end - 1 && end < dialog.options.length, children: option.label }, option.id));
|
|
91
|
+
})] }), _jsx(Text, { dimColor: true, italic: true, children: _jsx(HintLine, { text: t('hint-select-exit') }) })] }));
|
|
92
|
+
}
|
|
93
|
+
function ConfirmDialog({ dialog, onDecide, onCancel, }) {
|
|
94
|
+
const [focusIndex, setFocusIndex] = React.useState(0);
|
|
95
|
+
// Synchronous source of truth for the handlers (see the module header):
|
|
96
|
+
// Right+Enter in one stdin chunk must settle the NEW row, not the old.
|
|
97
|
+
const focusRef = React.useRef(0);
|
|
98
|
+
const labels = [
|
|
99
|
+
dialog.confirmLabel || t('ext-dialog-yes'),
|
|
100
|
+
dialog.cancelLabel || t('ext-dialog-no'),
|
|
101
|
+
];
|
|
102
|
+
const moveFocus = (delta) => {
|
|
103
|
+
const next = (focusRef.current + delta + labels.length) % labels.length;
|
|
104
|
+
focusRef.current = next;
|
|
105
|
+
setFocusIndex(next);
|
|
106
|
+
};
|
|
107
|
+
useInput((input, key, event) => {
|
|
108
|
+
if (key.escape || (key.ctrl && input === 'c')) {
|
|
109
|
+
onCancel();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (key.upArrow || key.leftArrow) {
|
|
113
|
+
moveFocus(-1);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (key.downArrow || key.rightArrow) {
|
|
117
|
+
moveFocus(1);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// isPasted lives on the InputEvent, not the key: a bracketed paste that
|
|
121
|
+
// is all line breaks must not confirm on the default focus.
|
|
122
|
+
if (isPlainReturnInput(input, { ...key, isPasted: event.isPasted })) {
|
|
123
|
+
onDecide(focusRef.current === 0);
|
|
124
|
+
}
|
|
125
|
+
}, { isActive: true });
|
|
126
|
+
return (_jsxs(Pane, { color: "permission", children: [_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: "remember", bold: true, children: dialog.title }), dialog.message !== undefined && _jsx(Text, { dimColor: true, children: dialog.message })] }), labels.map((label, index) => (_jsx(ListItem, { isFocused: index === focusIndex, children: label }, label)))] }), _jsx(Text, { dimColor: true, italic: true, children: _jsx(HintLine, { text: t('hint-select-exit') }) })] }));
|
|
127
|
+
}
|
|
128
|
+
function InputDialog({ dialog, onDecide, onCancel, }) {
|
|
129
|
+
const [value, setValue] = React.useState(dialog.initial);
|
|
130
|
+
const [cursor, setCursor] = React.useState(() => [...dialog.initial].length);
|
|
131
|
+
// Synchronous source of truth for the handlers (see the module header):
|
|
132
|
+
// two Backspaces in one stdin chunk must BOTH delete, each seeing the
|
|
133
|
+
// other's result. The cursor counts CODE POINTS, not UTF-16 units — an
|
|
134
|
+
// emoji is one step and can never be split into a lone surrogate.
|
|
135
|
+
const valueRef = React.useRef(dialog.initial);
|
|
136
|
+
const cursorRef = React.useRef([...dialog.initial].length);
|
|
137
|
+
const applyEdit = (nextValue, nextCursor) => {
|
|
138
|
+
valueRef.current = nextValue;
|
|
139
|
+
cursorRef.current = nextCursor;
|
|
140
|
+
setValue(nextValue);
|
|
141
|
+
setCursor(nextCursor);
|
|
142
|
+
};
|
|
143
|
+
useInput((input, key, event) => {
|
|
144
|
+
if (key.escape || (key.ctrl && input === 'c')) {
|
|
145
|
+
onCancel();
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// isPasted lives on the InputEvent, not the key: a bracketed paste that
|
|
149
|
+
// is all line breaks is inserted as text, not submitted.
|
|
150
|
+
if (isPlainReturnInput(input, { ...key, isPasted: event.isPasted })) {
|
|
151
|
+
onDecide(valueRef.current);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const points = [...valueRef.current];
|
|
155
|
+
const at = cursorRef.current;
|
|
156
|
+
// Single-line editing, same key set as the transcript search bar.
|
|
157
|
+
if (key.backspace) {
|
|
158
|
+
if (at > 0) {
|
|
159
|
+
points.splice(at - 1, 1);
|
|
160
|
+
applyEdit(points.join(''), at - 1);
|
|
161
|
+
}
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (key.delete) {
|
|
165
|
+
if (at < points.length) {
|
|
166
|
+
points.splice(at, 1);
|
|
167
|
+
applyEdit(points.join(''), at);
|
|
168
|
+
}
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (key.leftArrow) {
|
|
172
|
+
if (at > 0)
|
|
173
|
+
applyEdit(valueRef.current, at - 1);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (key.rightArrow) {
|
|
177
|
+
if (at < points.length)
|
|
178
|
+
applyEdit(valueRef.current, at + 1);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (key.home) {
|
|
182
|
+
applyEdit(valueRef.current, 0);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (key.end) {
|
|
186
|
+
applyEdit(valueRef.current, points.length);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (input && !key.ctrl && !key.meta && !key.super && !key.tab && !key.escape) {
|
|
190
|
+
// A bracketed paste arrives as one chunk and may carry newlines/control
|
|
191
|
+
// chars — this is a single-line panel, so flatten them to spaces. Every
|
|
192
|
+
// edit path holds the value at INPUT_CELLS cells so the resolved answer
|
|
193
|
+
// keeps the documented bound: typing past the cap is ignored, an
|
|
194
|
+
// oversized paste is truncated (never silently unbounded).
|
|
195
|
+
const chunk = event.isPasted ? flattenInline(input) : input;
|
|
196
|
+
const chunkPoints = [...chunk].length;
|
|
197
|
+
const candidate = points.slice(0, at).join('') + chunk + points.slice(at).join('');
|
|
198
|
+
if (stringWidth(candidate) <= INPUT_CELLS) {
|
|
199
|
+
applyEdit(candidate, at + chunkPoints);
|
|
200
|
+
}
|
|
201
|
+
else if (event.isPasted) {
|
|
202
|
+
const capped = capCells(candidate, INPUT_CELLS);
|
|
203
|
+
applyEdit(capped, Math.min(at + chunkPoints, [...capped].length));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}, { isActive: true });
|
|
207
|
+
const shown = value === '' && dialog.placeholder !== undefined ? dialog.placeholder : value;
|
|
208
|
+
const shownPoints = [...shown];
|
|
209
|
+
return (_jsxs(Pane, { color: "permission", children: [_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "remember", bold: true, children: dialog.title }) }), _jsxs(Text, { children: [_jsx(Text, { dimColor: value === '', children: shownPoints.slice(0, cursor).join('') }), _jsx(Text, { inverse: true, children: shownPoints[cursor] ?? ' ' }), _jsx(Text, { children: shownPoints.slice(cursor + 1).join('') })] })] }), _jsx(Text, { dimColor: true, italic: true, children: _jsx(HintLine, { text: t('hint-ext-dialog-input') }) })] }));
|
|
210
|
+
}
|
|
@@ -16,5 +16,5 @@ import { modLabel } from '../utils/modifiers.js';
|
|
|
16
16
|
*/
|
|
17
17
|
export function HelpMenu({ commands, }) {
|
|
18
18
|
const chrome = commands.filter(command => !command.skill);
|
|
19
|
-
return (_jsxs(Box, { paddingX: 2, flexDirection: "row", gap: 4, children: [_jsxs(Box, { flexDirection: "column", width: 26, flexShrink: 0, children: [_jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-for-commands') }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-this-help') }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-verbose-output', { mod: modLabel }) }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-
|
|
19
|
+
return (_jsxs(Box, { paddingX: 2, flexDirection: "row", gap: 4, children: [_jsxs(Box, { flexDirection: "column", width: 26, flexShrink: 0, children: [_jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-for-commands') }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-this-help') }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-verbose-output', { mod: modLabel }) }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-open-trajectory', { mod: modLabel }) }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-search-history', { mod: modLabel }) }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-interrupt') }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-exit') }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-redraw', { mod: modLabel }) }) })] }), _jsxs(Box, { flexDirection: "column", width: 24, flexShrink: 0, children: [_jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-clear-input') }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-history-nav') }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-move-cursor') }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-word-jumps', { mod: modLabel }) }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-complete-command') }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-cycle-mode') }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: t('help-open-editor') }) })] }), _jsxs(Box, { flexDirection: "column", flexShrink: 1, children: [_jsx(Text, { dimColor: true, children: t('help-commands-title') }), chrome.map(command => (_jsx(Box, { children: _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: ["/", command.name, " \u2014 ", localizedDescription(command)] }) }, command.name)))] })] }));
|
|
20
20
|
}
|
|
@@ -4,13 +4,13 @@ import type { LoadedContext } from '../dsh-adapter/channel.js';
|
|
|
4
4
|
* The startup context panel: a collapsed one-line summary of what a
|
|
5
5
|
* fresh conversation will load for the current agent (system prompt
|
|
6
6
|
* sections, workspace instruction files, dynamic context, skill catalog,
|
|
7
|
-
* tools)
|
|
8
|
-
*
|
|
9
|
-
* only while the transcript is still empty — the first
|
|
10
|
-
* over. Renders nothing for an empty snapshot.
|
|
7
|
+
* tools), expandable to the grouped details with Ctrl+P. The `/context`
|
|
8
|
+
* local command still prints the same details as a transcript report.
|
|
9
|
+
* The panel renders only while the transcript is still empty — the first
|
|
10
|
+
* message's rows take over. Renders nothing for an empty snapshot.
|
|
11
11
|
* @param context - the channel's loaded-context snapshot.
|
|
12
12
|
* @param open - whether the grouped details are shown.
|
|
13
|
-
* @param onToggle - flips `open`; fired by the Ctrl+
|
|
13
|
+
* @param onToggle - flips `open`; fired by the Ctrl+P keybinding.
|
|
14
14
|
*/
|
|
15
15
|
export declare function LoadedContextPanel({ context, open, onToggle, }: {
|
|
16
16
|
context: LoadedContext;
|
|
@@ -14,17 +14,17 @@ function Group({ title, children }) {
|
|
|
14
14
|
* The startup context panel: a collapsed one-line summary of what a
|
|
15
15
|
* fresh conversation will load for the current agent (system prompt
|
|
16
16
|
* sections, workspace instruction files, dynamic context, skill catalog,
|
|
17
|
-
* tools)
|
|
18
|
-
*
|
|
19
|
-
* only while the transcript is still empty — the first
|
|
20
|
-
* over. Renders nothing for an empty snapshot.
|
|
17
|
+
* tools), expandable to the grouped details with Ctrl+P. The `/context`
|
|
18
|
+
* local command still prints the same details as a transcript report.
|
|
19
|
+
* The panel renders only while the transcript is still empty — the first
|
|
20
|
+
* message's rows take over. Renders nothing for an empty snapshot.
|
|
21
21
|
* @param context - the channel's loaded-context snapshot.
|
|
22
22
|
* @param open - whether the grouped details are shown.
|
|
23
|
-
* @param onToggle - flips `open`; fired by the Ctrl+
|
|
23
|
+
* @param onToggle - flips `open`; fired by the Ctrl+P keybinding.
|
|
24
24
|
*/
|
|
25
25
|
export function LoadedContextPanel({ context, open, onToggle, }) {
|
|
26
26
|
const summary = summarizeLoadedContext(context);
|
|
27
27
|
if (summary === '')
|
|
28
28
|
return null;
|
|
29
|
-
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, marginBottom: 1, children: [_jsx(Box, { paddingX: 1, backgroundColor: open ? 'userMessageBackground' : undefined, children: _jsxs(Text, { wrap: "truncate",
|
|
29
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, marginBottom: 1, children: [_jsx(Box, { paddingX: 1, backgroundColor: open ? 'userMessageBackground' : undefined, children: _jsxs(Text, { bold: open, wrap: "truncate", children: [open ? '▼' : '▶', " ", _jsxs(Text, { dimColor: true, children: ["\uFF08Ctrl+P", open ? t('context-panel-collapse') : t('context-panel-expand'), "\uFF09"] }), " ", t('context-loaded'), " \u00B7 ", summary] }) }), open && (_jsxs(Box, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [context.sections.length > 0 && (_jsx(Group, { title: t('context-panel-sections', { n: context.sections.length }), children: context.sections.map(section => (_jsx(Entry, { entry: section }, section.name))) })), context.files.length > 0 && (_jsx(Group, { title: t('context-panel-files', { n: context.files.length }), children: context.files.map(file => (_jsx(Text, { dimColor: true, children: file.displayPath }, file.displayPath))) })), context.contexts.length > 0 && (_jsx(Group, { title: t('context-panel-runtime', { n: context.contexts.length }), children: context.contexts.map(entry => (_jsx(Entry, { entry: entry }, entry.name))) })), context.skills.length > 0 && (_jsx(Group, { title: t('context-panel-skills', { n: context.skills.length }), children: context.skills.map(skill => (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, dimColor: true, children: skill.name }), _jsx(Text, { dimColor: true, wrap: "wrap", children: skill.description })] }, skill.name))) })), context.tools.length > 0 && (_jsx(Group, { title: t('context-panel-tools', { n: context.tools.length }), children: context.tools.map(tool => (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, dimColor: true, children: tool.name }), _jsx(Text, { dimColor: true, wrap: "wrap", children: truncateContextText(tool.description, 160) })] }, tool.name))) })), _jsx(Text, { dimColor: true, children: "\u00B7 /context" })] }))] }));
|
|
30
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogoV2.d.ts","sourceRoot":"","sources":["../../../src/components/LogoV2.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"LogoV2.d.ts","sourceRoot":"","sources":["../../../src/components/LogoV2.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAwDzB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,MAAM,EACN,GAAG,EACH,SAAiB,GAClB,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;CACpB,GAAG,KAAK,CAAC,SAAS,CAqFlB"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { t as tr } from '../i18n.js';
|
|
4
|
-
import { modLabel } from '../utils/modifiers.js';
|
|
5
4
|
import { readFileSync } from 'node:fs';
|
|
6
5
|
import { dirname, join } from 'node:path';
|
|
7
6
|
import { fileURLToPath } from 'node:url';
|
|
@@ -10,6 +9,7 @@ import { getTheme } from '../theme.js';
|
|
|
10
9
|
import { useTheme } from './design-system/ThemeProvider.js';
|
|
11
10
|
import { parseRGB } from './Spinner/spinnerUtils.js';
|
|
12
11
|
import { renderBigText } from './bigfont.js';
|
|
12
|
+
import { stringWidth } from '../ink/stringWidth.js';
|
|
13
13
|
import { BRAND, FLASH, ICE, PALE, sweep } from './shimmer.js';
|
|
14
14
|
import { STANDARD_FRAME_INDEX, WhaleArt } from './Whale.js';
|
|
15
15
|
import { OPENING_SEQUENCE } from './whaleFrames.js';
|
|
@@ -36,13 +36,16 @@ const WHALE_MIN_COLUMNS = 64;
|
|
|
36
36
|
*/
|
|
37
37
|
const FULL_WHALE_WIDTH = 40;
|
|
38
38
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
39
|
+
* Center of the whale art's bounding box: sprite columns 3..34 (center
|
|
40
|
+
* 18.5) of the 40-wide box. The welcome tagline is indented so its own
|
|
41
|
+
* center lands on this column — for the 14-column Chinese tagline that is
|
|
42
|
+
* 18.5 − 7 = 11.5 → 12 leading spaces. (Centering on the full 40-column
|
|
43
|
+
* box would need 13, which reads one column right of the whale body.)
|
|
44
|
+
* The pad is recomputed from the rendered tagline's display width so
|
|
45
|
+
* longer locales — e.g. the 21-column English tagline → 8 — stay
|
|
46
|
+
* centered under the art too.
|
|
44
47
|
*/
|
|
45
|
-
const
|
|
48
|
+
const WHALE_CENTER = 18.5;
|
|
46
49
|
/** `max` → `Max` (effort levels arrive lower-case from the adapter). */
|
|
47
50
|
function capitalize(text) {
|
|
48
51
|
return text.length === 0 ? text : text[0].toUpperCase() + text.slice(1);
|
|
@@ -90,7 +93,12 @@ export function LogoV2({ model, effort, cwd, skipIntro = false, }) {
|
|
|
90
93
|
// Frozen clock for the settled header: t=0 parks every sweep highlight
|
|
91
94
|
// off-screen, leaving the static gradient behind.
|
|
92
95
|
const t = settled ? 0 : time;
|
|
96
|
+
const tagline = tr('logo-tagline');
|
|
97
|
+
// Indent that centers the tagline under the whale art's bounding box.
|
|
98
|
+
const welcomePad = showWhale
|
|
99
|
+
? Math.max(0, Math.round(WHALE_CENTER - stringWidth(tagline) / 2))
|
|
100
|
+
: 2;
|
|
93
101
|
const bigDeepSeek = renderBigText('DEEPSEEK', t, wordmarkRGB, taglineRGB, FLASH, 60);
|
|
94
102
|
const bigHarness = renderBigText('HARNESS', t, taglineRGB, PALE, FLASH, 60);
|
|
95
|
-
return (_jsxs(Box, { ref: ref, flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { flexDirection: "row", gap: 2, width: "100%", alignItems: "center", children: [showWhale && _jsx(WhaleArt, { frameIndex: frameIndex, width: FULL_WHALE_WIDTH }), _jsxs(Box, { flexDirection: "column", flexShrink: 1, children: [_jsxs(Text, { wrap: "truncate-end", children: [sweep('✦ dsh-TUI', t, wordmarkRGB, wordmarkShimmerRGB, 60), _jsx(Text, { dimColor: true, children: ' v' + VERSION })] }), bigDeepSeek.map((row, index) => (_jsx(Text, { wrap: "truncate-end", children: row }, `ds-${index}`))), bigHarness.map((row, index) => (_jsx(Text, { wrap: "truncate-end", children: row }, `h-${index}`))), _jsxs(Text, { wrap: "truncate-end", children: [model, effort !== undefined && _jsx(Text, { dimColor: true, children: ' · ' + capitalize(effort) + ' effort' })] }), _jsx(Text, { dimColor: true, wrap: "truncate-end", children: cwd }), _jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { dimColor: true, children: tr('logo-tip-prefix') }), "/model", _jsxs(Text, { dimColor: true, children: [" ", tr('logo-tip-model'), " \u00B7 "] }), "/help", _jsxs(Text, { dimColor: true, children: [" ", tr('logo-tip-help'), " \u00B7 "] }),
|
|
103
|
+
return (_jsxs(Box, { ref: ref, flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { flexDirection: "row", gap: 2, width: "100%", alignItems: "center", children: [showWhale && _jsx(WhaleArt, { frameIndex: frameIndex, width: FULL_WHALE_WIDTH }), _jsxs(Box, { flexDirection: "column", flexShrink: 1, children: [_jsxs(Text, { wrap: "truncate-end", children: [sweep('✦ dsh-TUI', t, wordmarkRGB, wordmarkShimmerRGB, 60), _jsx(Text, { dimColor: true, children: ' v' + VERSION })] }), bigDeepSeek.map((row, index) => (_jsx(Text, { wrap: "truncate-end", children: row }, `ds-${index}`))), bigHarness.map((row, index) => (_jsx(Text, { wrap: "truncate-end", children: row }, `h-${index}`))), _jsxs(Text, { wrap: "truncate-end", children: [model, effort !== undefined && _jsx(Text, { dimColor: true, children: ' · ' + capitalize(effort) + ' effort' })] }), _jsx(Text, { dimColor: true, wrap: "truncate-end", children: cwd }), _jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { dimColor: true, children: tr('logo-tip-prefix') }), "/model", _jsxs(Text, { dimColor: true, children: [" ", tr('logo-tip-model'), " \u00B7 "] }), "/help", _jsxs(Text, { dimColor: true, children: [" ", tr('logo-tip-help'), " \u00B7 "] }), "Tab", _jsxs(Text, { dimColor: true, children: [" ", tr('logo-tip-tab')] })] })] })] }), _jsx(Box, { marginTop: 1, paddingLeft: welcomePad, children: _jsx(Text, { children: sweep(tagline, t, taglineRGB, FLASH, 60) }) })] }));
|
|
96
104
|
}
|
|
@@ -18,7 +18,19 @@ type Props = {
|
|
|
18
18
|
/**
|
|
19
19
|
* 混合渲染 Markdown 内容:表格用带边框的 flexbox 组件,其余内容由
|
|
20
20
|
* formatToken 生成 ANSI 字符串放入 Text。高亮对象异步就绪后自动刷新。
|
|
21
|
+
*
|
|
22
|
+
* memo by content: finished transcript blocks render with the SAME string
|
|
23
|
+
* identity for the whole session (StreamingMarkdown keeps its stable prefix
|
|
24
|
+
* identity-stable precisely to hit this); without the memo every parent
|
|
25
|
+
* re-render re-ran the full token→ANSI→yoga pipeline for every settled
|
|
26
|
+
* block — the dominant long-output stall (string-width via wrap-ansi, 60%+
|
|
27
|
+
* of CPU in streaming profiles).
|
|
28
|
+
*/
|
|
29
|
+
declare function MarkdownImpl({ children, dimColor, cacheTokens }: Props): React.ReactNode;
|
|
30
|
+
/**
|
|
31
|
+
* Memoized Markdown: skips the whole token→ANSI→layout pipeline when the
|
|
32
|
+
* content string is the same reference (see MarkdownImpl's doc comment).
|
|
21
33
|
*/
|
|
22
|
-
export declare
|
|
34
|
+
export declare const Markdown: React.MemoExoticComponent<typeof MarkdownImpl>;
|
|
23
35
|
export {};
|
|
24
36
|
//# sourceMappingURL=Markdown.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../../src/components/Markdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB;;;;;;;;GAQG;AAEH,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AA4GD
|
|
1
|
+
{"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../../src/components/Markdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB;;;;;;;;GAQG;AAEH,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AA4GD;;;;;;;;;;GAUG;AACH,iBAAS,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAgB,EAAE,WAAkB,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,SAAS,CA6BhG;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,gDAMpB,CAAA"}
|
|
@@ -90,8 +90,15 @@ function renderTokensToNodes(tokens, highlight, dimColor) {
|
|
|
90
90
|
/**
|
|
91
91
|
* 混合渲染 Markdown 内容:表格用带边框的 flexbox 组件,其余内容由
|
|
92
92
|
* formatToken 生成 ANSI 字符串放入 Text。高亮对象异步就绪后自动刷新。
|
|
93
|
+
*
|
|
94
|
+
* memo by content: finished transcript blocks render with the SAME string
|
|
95
|
+
* identity for the whole session (StreamingMarkdown keeps its stable prefix
|
|
96
|
+
* identity-stable precisely to hit this); without the memo every parent
|
|
97
|
+
* re-render re-ran the full token→ANSI→yoga pipeline for every settled
|
|
98
|
+
* block — the dominant long-output stall (string-width via wrap-ansi, 60%+
|
|
99
|
+
* of CPU in streaming profiles).
|
|
93
100
|
*/
|
|
94
|
-
|
|
101
|
+
function MarkdownImpl({ children, dimColor = false, cacheTokens = true }) {
|
|
95
102
|
const [highlight, setHighlight] = React.useState(null);
|
|
96
103
|
React.useEffect(() => {
|
|
97
104
|
let mounted = true;
|
|
@@ -110,3 +117,10 @@ export function Markdown({ children, dimColor = false, cacheTokens = true }) {
|
|
|
110
117
|
}, [children, dimColor, highlight, cacheTokens]);
|
|
111
118
|
return (_jsx(Box, { flexDirection: "column", gap: 1, children: renderedNodes }));
|
|
112
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Memoized Markdown: skips the whole token→ANSI→layout pipeline when the
|
|
122
|
+
* content string is the same reference (see MarkdownImpl's doc comment).
|
|
123
|
+
*/
|
|
124
|
+
export const Markdown = React.memo(MarkdownImpl, (prev, next) => prev.children === next.children &&
|
|
125
|
+
prev.dimColor === next.dimColor &&
|
|
126
|
+
prev.cacheTokens === next.cacheTokens);
|
|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
|
2
2
|
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
|
-
export declare function MessageList({ rows, expanded, expandedRows, selectedId, onToggleRow, model, diffLayout, showAll, onToggleAll, onLoadOlder, thinkingVisible, registerRowRef, scrollHandle, forceMountRowId, newSinceRowId, onUnseenCount, failureHintRowId, failureHint, }: {
|
|
5
|
+
export declare function MessageList({ rows, expanded, expandedRows, selectedId, onToggleRow, model, diffLayout, thinkingFold, showAll, onToggleAll, onLoadOlder, thinkingVisible, registerRowRef, scrollHandle, forceMountRowId, newSinceRowId, onUnseenCount, failureHintRowId, failureHint, }: {
|
|
6
6
|
rows: readonly ChatRow[];
|
|
7
7
|
expanded: boolean;
|
|
8
8
|
expandedRows: ReadonlySet<number>;
|
|
@@ -11,6 +11,8 @@ export declare function MessageList({ rows, expanded, expandedRows, selectedId,
|
|
|
11
11
|
model: string;
|
|
12
12
|
/** Edit/Write diff presentation preference (forwarded to tool cards). */
|
|
13
13
|
diffLayout?: 'auto' | 'split' | 'unified';
|
|
14
|
+
/** Thinking-block display mode from channel (`preview`/`full`). */
|
|
15
|
+
thinkingFold?: 'preview' | 'full';
|
|
14
16
|
showAll: boolean;
|
|
15
17
|
onToggleAll: () => void;
|
|
16
18
|
/** Restore folded-away older rows from the session log (CC-style "load
|
|
@@ -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,EAAyC,MAAM,2BAA2B,CAAA;AAC/F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAuC/C,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,WAAW,EACX,KAAK,EACL,UAAmB,EACnB,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,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,
|
|
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,EAAyC,MAAM,2BAA2B,CAAA;AAC/F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAuC/C,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,WAAW,EACX,KAAK,EACL,UAAmB,EACnB,YAAwB,EACxB,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,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,qBA6VA;AAmRD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,GAAG,GACJ,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,GAAG,EAAE,MAAM,CAAA;CACZ,GAAG,KAAK,CAAC,SAAS,CAMlB"}
|