zidane-ui 9.0.4 → 9.1.3
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 +3 -1
- package/dist/adapters/extension-modules.d.ts +147 -0
- package/dist/adapters/extension-modules.js +244 -0
- package/dist/adapters/index.d.ts +3 -1
- package/dist/adapters/index.js +3 -1
- package/dist/adapters/live.d.ts +6 -0
- package/dist/adapters/live.js +33 -3
- package/dist/adapters/server-composer-host.js +20 -37
- package/dist/adapters/server-extensions-host.d.ts +113 -0
- package/dist/adapters/server-extensions-host.js +829 -0
- package/dist/adapters/server-host.js +28 -6
- package/dist/adapters/server-machines-host.js +1 -1
- package/dist/adapters/server-settings-host.js +1 -1
- package/dist/adapters/server-settings-sections.js +36 -13
- package/dist/adapters/server-transcript-members.d.ts +1 -1
- package/dist/adapters/server-transcript-members.js +19 -1
- package/dist/app/AppHostProvider.d.ts +4 -1
- package/dist/app/AppHostProvider.js +11 -4
- package/dist/app/ModalProvider.d.ts +9 -3
- package/dist/app/ModalProvider.js +45 -25
- package/dist/app/headless/app-host.d.ts +3 -0
- package/dist/appearance/AppearanceProvider.d.ts +11 -4
- package/dist/appearance/AppearanceProvider.js +18 -6
- package/dist/appearance/headless/index.js +1 -1
- package/dist/appearance/headless/prefs.d.ts +2 -2
- package/dist/appearance/index.d.ts +1 -1
- package/dist/approvals/ApprovalBar.js +7 -1
- package/dist/approvals/FileEditApproval.js +7 -3
- package/dist/approvals/headless/index.js +2 -2
- package/dist/approvals/headless/labels.js +3 -3
- package/dist/chat/HostBadge.js +1 -1
- package/dist/chat/HostStatusDot.js +1 -1
- package/dist/chat/HostTranscript.d.ts +3 -1
- package/dist/chat/HostTranscript.js +5 -3
- package/dist/chat/RunEstimateChip.d.ts +53 -0
- package/dist/chat/RunEstimateChip.js +116 -0
- package/dist/chat/SessionFilterMenu.d.ts +77 -5
- package/dist/chat/SessionFilterMenu.js +86 -4
- package/dist/chat/SessionGroupHeader.d.ts +6 -2
- package/dist/chat/SessionGroupHeader.js +35 -3
- package/dist/chat/SessionHostHeader.js +1 -1
- package/dist/chat/SessionList.js +1 -1
- package/dist/chat/SessionListRow.d.ts +8 -1
- package/dist/chat/SessionListRow.js +5 -4
- package/dist/chat/Throbber.js +0 -3
- package/dist/chat/Transcript.d.ts +1 -1
- package/dist/chat/Transcript.js +112 -57
- package/dist/chat/composer/ComposerEditor.js +1 -1
- package/dist/chat/composer/ConversationBadges.js +18 -11
- package/dist/chat/composer/HostPicker.js +1 -1
- package/dist/chat/composer/ProjectMenu.d.ts +8 -1
- package/dist/chat/composer/ProjectMenu.js +11 -8
- package/dist/chat/composer/RetryPill.js +1 -1
- package/dist/chat/composer/SelectTurnHint.d.ts +19 -0
- package/dist/chat/composer/SelectTurnHint.js +28 -0
- package/dist/chat/composer/ServerScopeToggle.js +4 -1
- package/dist/chat/composer/composer-bus.d.ts +8 -1
- package/dist/chat/composer/composer-bus.js +10 -1
- package/dist/chat/composer/index.d.ts +4 -4
- package/dist/chat/composer/index.js +3 -3
- package/dist/chat/composer/use-composer-stores.js +1 -1
- package/dist/chat/composer/use-draft-target.d.ts +19 -1
- package/dist/chat/composer/use-draft-target.js +14 -1
- package/dist/chat/composer/use-run-meter.js +1 -1
- package/dist/chat/headless/block-runs.d.ts +57 -0
- package/dist/chat/headless/block-runs.js +123 -0
- package/dist/chat/headless/chip-labels.d.ts +1 -0
- package/dist/chat/headless/chip-labels.js +1 -0
- package/dist/chat/headless/composer/conversation-badges.d.ts +8 -6
- package/dist/chat/headless/composer/conversation-badges.js +26 -24
- package/dist/chat/headless/composer/host-chrome.d.ts +2 -27
- package/dist/chat/headless/composer/host.d.ts +1 -3
- package/dist/chat/headless/composer/index.d.ts +3 -4
- package/dist/chat/headless/composer/index.js +5 -6
- package/dist/chat/headless/composer/labels-chrome.d.ts +1 -1
- package/dist/chat/headless/composer/labels-chrome.js +1 -1
- package/dist/chat/headless/extension-sources.d.ts +17 -0
- package/dist/chat/headless/extension-sources.js +52 -0
- package/dist/chat/headless/fixture-transcript.d.ts +6 -1
- package/dist/chat/headless/fixture-transcript.js +49 -0
- package/dist/chat/headless/host.d.ts +8 -0
- package/dist/chat/headless/hosts.d.ts +2 -0
- package/dist/chat/headless/index.d.ts +10 -8
- package/dist/chat/headless/index.js +21 -18
- package/dist/chat/headless/labels.d.ts +79 -1
- package/dist/chat/headless/labels.js +80 -3
- package/dist/chat/headless/session-list.d.ts +65 -2
- package/dist/chat/headless/session-list.js +10 -2
- package/dist/chat/headless/sidebar/badges.d.ts +2 -0
- package/dist/chat/headless/sidebar/badges.js +20 -1
- package/dist/chat/headless/sidebar/directory.d.ts +46 -6
- package/dist/chat/headless/sidebar/directory.js +198 -22
- package/dist/chat/headless/sidebar/estimates.d.ts +55 -0
- package/dist/chat/headless/sidebar/estimates.js +91 -0
- package/dist/chat/headless/sidebar/index.d.ts +6 -4
- package/dist/chat/headless/sidebar/index.js +6 -3
- package/dist/chat/headless/sidebar/labels.d.ts +71 -1
- package/dist/chat/headless/sidebar/labels.js +17 -0
- package/dist/chat/headless/sidebar/query.d.ts +276 -0
- package/dist/chat/headless/sidebar/query.js +450 -0
- package/dist/chat/headless/sidebar/rows.d.ts +104 -13
- package/dist/chat/headless/sidebar/rows.js +189 -5
- package/dist/chat/headless/sidebar/types.d.ts +37 -4
- package/dist/chat/headless/sidebar/types.js +8 -0
- package/dist/chat/headless/sidebar/view.d.ts +25 -1
- package/dist/chat/headless/sidebar/view.js +56 -3
- package/dist/chat/headless/streams/live-events.js +2 -1
- package/dist/chat/headless/streams/session-streams.js +6 -0
- package/dist/chat/headless/transcript/batch.d.ts +21 -1
- package/dist/chat/headless/transcript/batch.js +55 -10
- package/dist/chat/headless/transcript/collapse.js +22 -3
- package/dist/chat/headless/transcript/fold-attachments.js +1 -1
- package/dist/chat/headless/transcript/fold.js +26 -10
- package/dist/chat/headless/transcript/rows.d.ts +15 -1
- package/dist/chat/headless/transcript-labels.d.ts +1 -0
- package/dist/chat/index.d.ts +14 -6
- package/dist/chat/index.js +40 -32
- package/dist/chat/rich-composer/RichComposer.js +32 -1
- package/dist/chat/rich-composer/badge-decorations.js +1 -1
- package/dist/chat/rich-composer/use-extension-composer.d.ts +32 -0
- package/dist/chat/rich-composer/use-extension-composer.js +46 -0
- package/dist/chat/sidebar/MainSessionRow.js +1 -1
- package/dist/chat/sidebar/ProjectIcon.d.ts +25 -6
- package/dist/chat/sidebar/ProjectIcon.js +79 -34
- package/dist/chat/sidebar/SessionSidebar.d.ts +34 -1
- package/dist/chat/sidebar/SessionSidebar.js +161 -25
- package/dist/chat/sidebar/SidebarDecoration.d.ts +38 -0
- package/dist/chat/sidebar/SidebarDecoration.js +61 -0
- package/dist/chat/sidebar/SidebarFilterMenu.d.ts +15 -2
- package/dist/chat/sidebar/SidebarFilterMenu.js +226 -8
- package/dist/chat/sidebar/SidebarFooter.d.ts +3 -1
- package/dist/chat/sidebar/SidebarFooter.js +17 -4
- package/dist/chat/sidebar/SidebarGroupHeader.d.ts +17 -4
- package/dist/chat/sidebar/SidebarGroupHeader.js +23 -4
- package/dist/chat/sidebar/SidebarRowView.d.ts +30 -0
- package/dist/chat/sidebar/SidebarRowView.js +117 -0
- package/dist/chat/sidebar/SidebarSessionRow.d.ts +4 -1
- package/dist/chat/sidebar/SidebarSessionRow.js +22 -4
- package/dist/chat/sidebar/SpaceSwitcher.d.ts +12 -5
- package/dist/chat/sidebar/SpaceSwitcher.js +142 -49
- package/dist/chat/sidebar/SpacesSection.js +4 -2
- package/dist/chat/sidebar/collapsed.d.ts +24 -0
- package/dist/chat/sidebar/collapsed.js +44 -0
- package/dist/chat/sidebar/index.d.ts +8 -4
- package/dist/chat/sidebar/index.js +6 -2
- package/dist/chat/sidebar/session-menu.d.ts +2 -0
- package/dist/chat/sidebar/session-menu.js +8 -2
- package/dist/chat/sidebar/sidebar-live.d.ts +12 -1
- package/dist/chat/sidebar/sidebar-live.js +57 -17
- package/dist/chat/sidebar/useAgentNames.d.ts +8 -0
- package/dist/chat/sidebar/useAgentNames.js +13 -0
- package/dist/chat/sidebar/useSaveViewAsSpace.d.ts +13 -0
- package/dist/chat/sidebar/useSaveViewAsSpace.js +44 -0
- package/dist/chat/sidebar/useSessionDirectoryView.d.ts +4 -1
- package/dist/chat/sidebar/useSessionDirectoryView.js +46 -12
- package/dist/chat/sidebar/useSidebarKeyboardNav.js +3 -1
- package/dist/chat/testing/composer.contract.d.ts +2 -6
- package/dist/chat/testing/composer.contract.js +2 -31
- package/dist/chat/testing/contract.d.ts +6 -1
- package/dist/chat/testing/contract.js +30 -3
- package/dist/chat/testing/fixture-composer-chrome.d.ts +2 -6
- package/dist/chat/testing/fixture-composer-chrome.js +1 -17
- package/dist/chat/transcript/AnsiText.d.ts +27 -0
- package/dist/chat/transcript/AnsiText.js +73 -0
- package/dist/chat/transcript/BadgeMenu.d.ts +2 -0
- package/dist/chat/transcript/BadgeMenu.js +22 -6
- package/dist/chat/transcript/CardMarkdown.js +17 -5
- package/dist/chat/transcript/ChipCard.js +6 -0
- package/dist/chat/transcript/ChipCards.js +2 -2
- package/dist/chat/transcript/CodemodeScript.d.ts +33 -0
- package/dist/chat/transcript/CodemodeScript.js +212 -0
- package/dist/chat/transcript/EditDiffBlock.js +4 -1
- package/dist/chat/transcript/FileChip.js +20 -7
- package/dist/chat/transcript/InlineChipText.js +1 -1
- package/dist/chat/transcript/InteractionToolBody.js +32 -13
- package/dist/chat/transcript/LiveOutput.d.ts +21 -0
- package/dist/chat/transcript/LiveOutput.js +42 -0
- package/dist/chat/transcript/MermaidDiagram.d.ts +22 -0
- package/dist/chat/transcript/MermaidDiagram.js +410 -0
- package/dist/chat/transcript/PromptEcho.js +5 -5
- package/dist/chat/transcript/ProseMarkdown.js +9 -6
- package/dist/chat/transcript/ReferenceText.js +7 -2
- package/dist/chat/transcript/SelectTurnHint.js +1 -1
- package/dist/chat/transcript/SubagentBlock.d.ts +4 -2
- package/dist/chat/transcript/SubagentBlock.js +5 -2
- package/dist/chat/transcript/TranscriptRow.js +28 -6
- package/dist/chat/transcript/TranscriptSearch.js +1 -1
- package/dist/chat/transcript/actions.d.ts +6 -0
- package/dist/chat/transcript/badges.js +5 -2
- package/dist/chat/transcript/extension-renderers.d.ts +36 -0
- package/dist/chat/transcript/extension-renderers.js +133 -0
- package/dist/chat/transcript/fold-worker.js +2 -2
- package/dist/chat/transcript/fold.js +6 -4
- package/dist/chat/transcript/index.d.ts +8 -2
- package/dist/chat/transcript/index.js +35 -29
- package/dist/chat/transcript/markdown-cache.js +16 -7
- package/dist/chat/transcript/markdown.d.ts +15 -1
- package/dist/chat/transcript/markdown.js +71 -6
- package/dist/chat/transcript/messages.js +3 -2
- package/dist/chat/transcript/notices.js +1 -1
- package/dist/chat/transcript/prompt.js +1 -1
- package/dist/chat/transcript/prose.js +1 -1
- package/dist/chat/transcript/recent-map.d.ts +20 -0
- package/dist/chat/transcript/recent-map.js +22 -0
- package/dist/chat/transcript/references.js +7 -3
- package/dist/chat/transcript/renderers.d.ts +11 -1
- package/dist/chat/transcript/renderers.js +14 -4
- package/dist/chat/transcript/script-input.d.ts +17 -0
- package/dist/chat/transcript/script-input.js +16 -0
- package/dist/chat/transcript/shell-block-scope.d.ts +29 -0
- package/dist/chat/transcript/shell-block-scope.js +18 -0
- package/dist/chat/transcript/shell-block.d.ts +27 -0
- package/dist/chat/transcript/shell-block.js +306 -0
- package/dist/chat/transcript/tool-batch.js +4 -9
- package/dist/chat/transcript/tool-details.js +7 -67
- package/dist/chat/transcript/tool-parts.d.ts +18 -6
- package/dist/chat/transcript/tool-parts.js +15 -5
- package/dist/chat/transcript/tool-payload.d.ts +21 -0
- package/dist/chat/transcript/tool-payload.js +80 -0
- package/dist/chat/transcript/tool-row.js +158 -96
- package/dist/chat/transcript/useTranscriptScroll.js +3 -2
- package/dist/chat/transcript/user-bash.js +3 -2
- package/dist/chat/transcript-options.d.ts +15 -0
- package/dist/chat/transcript-options.js +40 -0
- package/dist/code/CodeHighlightProvider.d.ts +3 -3
- package/dist/code/CodeHighlightProvider.js +4 -4
- package/dist/code/HighlightedCode.d.ts +7 -2
- package/dist/code/HighlightedCode.js +7 -71
- package/dist/code/code-themes.d.ts +13 -6
- package/dist/code/code-themes.js +385 -13
- package/dist/code/editor/CodeHover.d.ts +5 -4
- package/dist/code/editor/CodeHover.js +20 -16
- package/dist/code/editor/HighlightWorkers.js +2 -2
- package/dist/code/editor/edit-session.js +1 -0
- package/dist/code/editor/environment.d.ts +1 -1
- package/dist/code/editor/environment.js +1 -1
- package/dist/code/editor/index.d.ts +2 -2
- package/dist/code/editor/index.js +2 -2
- package/dist/code/editor/pierre-theme.d.ts +5 -5
- package/dist/code/editor/pierre-theme.js +6 -5
- package/dist/code/highlight-lines.d.ts +24 -0
- package/dist/code/highlight-lines.js +41 -0
- package/dist/code/highlight.worker.js +2 -14
- package/dist/code/highlighter.d.ts +24 -9
- package/dist/code/highlighter.js +1 -4
- package/dist/code/highlights.d.ts +12 -0
- package/dist/code/highlights.js +47 -0
- package/dist/code/mermaid-lexer.d.ts +26 -0
- package/dist/code/mermaid-lexer.js +303 -0
- package/dist/code/shiki-theme.d.ts +6 -6
- package/dist/code/shiki-theme.js +3 -3
- package/dist/code/use-highlighted-html.d.ts +5 -0
- package/dist/code/use-highlighted-html.js +75 -0
- package/dist/components/BrandMark.d.ts +6 -4
- package/dist/components/BrandMark.js +5 -2
- package/dist/components/CodeFrame.d.ts +5 -0
- package/dist/components/CodeFrame.js +27 -23
- package/dist/components/Form.js +1 -1
- package/dist/core.css +82 -11
- package/dist/dist/{index-Cx7GDZlz.d.ts → index-WlE93Q6d.d.ts} +255 -51
- package/dist/extensions/ExtensionComponent.d.ts +62 -0
- package/dist/extensions/ExtensionComponent.js +120 -0
- package/dist/extensions/ExtensionDialogHost.d.ts +31 -0
- package/dist/extensions/ExtensionDialogHost.js +439 -0
- package/dist/extensions/ExtensionRenderer.d.ts +30 -0
- package/dist/extensions/ExtensionRenderer.js +78 -0
- package/dist/extensions/ExtensionScreen.d.ts +24 -0
- package/dist/extensions/ExtensionScreen.js +120 -0
- package/dist/extensions/ExtensionSettingsPage.d.ts +19 -0
- package/dist/extensions/ExtensionSettingsPage.js +116 -0
- package/dist/extensions/ExtensionSettingsPages.d.ts +17 -0
- package/dist/extensions/ExtensionSettingsPages.js +33 -0
- package/dist/extensions/ExtensionSettingsSidebar.d.ts +63 -0
- package/dist/extensions/ExtensionSettingsSidebar.js +360 -0
- package/dist/extensions/ExtensionSlot.d.ts +44 -0
- package/dist/extensions/ExtensionSlot.js +161 -0
- package/dist/extensions/ExtensionWebview.d.ts +32 -0
- package/dist/extensions/ExtensionWebview.js +80 -0
- package/dist/extensions/ExtensionsProvider.d.ts +42 -0
- package/dist/extensions/ExtensionsProvider.js +104 -0
- package/dist/extensions/SettingsWireForm.d.ts +44 -0
- package/dist/extensions/SettingsWireForm.js +104 -0
- package/dist/extensions/headless/dialog-queue.d.ts +27 -0
- package/dist/extensions/headless/dialog-queue.js +68 -0
- package/dist/extensions/headless/effect-channel.d.ts +15 -0
- package/dist/extensions/headless/effect-channel.js +33 -0
- package/dist/extensions/headless/effect-router.d.ts +34 -0
- package/dist/extensions/headless/effect-router.js +50 -0
- package/dist/extensions/headless/fixture-host.d.ts +110 -0
- package/dist/extensions/headless/fixture-host.js +258 -0
- package/dist/extensions/headless/host.d.ts +433 -0
- package/dist/extensions/headless/host.js +27 -0
- package/dist/extensions/headless/index.d.ts +10 -0
- package/dist/extensions/headless/index.js +10 -0
- package/dist/extensions/headless/labels.d.ts +45 -0
- package/dist/extensions/headless/labels.js +49 -0
- package/dist/extensions/headless/links.d.ts +30 -0
- package/dist/extensions/headless/links.js +34 -0
- package/dist/extensions/headless/select.d.ts +120 -0
- package/dist/extensions/headless/select.js +191 -0
- package/dist/extensions/headless/webview-bridge.d.ts +71 -0
- package/dist/extensions/headless/webview-bridge.js +78 -0
- package/dist/extensions/headless/wire.d.ts +113 -0
- package/dist/extensions/headless/wire.js +38 -0
- package/dist/extensions/hooks.d.ts +88 -0
- package/dist/extensions/hooks.js +151 -0
- package/dist/extensions/index.d.ts +15 -0
- package/dist/extensions/index.js +15 -0
- package/dist/extensions/kit.d.ts +19 -0
- package/dist/extensions/kit.js +19 -0
- package/dist/extensions/links.d.ts +79 -0
- package/dist/extensions/links.js +94 -0
- package/dist/extensions/testing/contract.d.ts +80 -0
- package/dist/extensions/testing/contract.js +407 -0
- package/dist/extensions/testing/index.d.ts +2 -0
- package/dist/extensions/testing/index.js +1 -0
- package/dist/extensions/useExtensionsLabels.d.ts +6 -0
- package/dist/extensions/useExtensionsLabels.js +18 -0
- package/dist/files/DiffsTab.js +7 -19
- package/dist/files/EditorColumn.js +1 -1
- package/dist/files/EditorEnvironmentRoot.d.ts +15 -0
- package/dist/files/EditorEnvironmentRoot.js +55 -0
- package/dist/files/MediaDiff.js +1 -1
- package/dist/files/drafts-store.d.ts +10 -0
- package/dist/files/drafts-store.js +30 -1
- package/dist/files/headless/lsp-edits.d.ts +4 -1
- package/dist/files/headless/lsp-edits.js +14 -2
- package/dist/files/index.d.ts +2 -1
- package/dist/files/index.js +2 -1
- package/dist/files/session-patch.d.ts +11 -0
- package/dist/files/session-patch.js +44 -0
- package/dist/files/useEntryActions.js +1 -1
- package/dist/files/useLsp.js +5 -2
- package/dist/files/useOpenFiles.js +1 -1
- package/dist/git/BranchMenu.d.ts +1 -5
- package/dist/git/BranchMenu.js +23 -39
- package/dist/git/GitBar.d.ts +1 -1
- package/dist/git/GitBar.js +7 -1
- package/dist/git/ImportRepoDialog.d.ts +3 -1
- package/dist/git/ImportRepoDialog.js +8 -6
- package/dist/git/MoveSessionDialog.js +3 -1
- package/dist/git/headless/labels.d.ts +0 -2
- package/dist/git/headless/labels.js +0 -2
- package/dist/hooks/useDisplayPath.d.ts +40 -0
- package/dist/hooks/useDisplayPath.js +75 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.js +4 -2
- package/dist/keybindings/KeyCommands.js +1 -1
- package/dist/keybindings/KeybindingsProvider.js +1 -1
- package/dist/keybindings/headless/index.js +2 -2
- package/dist/keybindings/headless/overrides.js +1 -1
- package/dist/keybindings/index.d.ts +2 -1
- package/dist/keybindings/index.js +2 -1
- package/dist/keybindings/press.d.ts +27 -0
- package/dist/keybindings/press.js +67 -0
- package/dist/machines/Banners.js +1 -1
- package/dist/machines/HostSyncPanel.js +1 -1
- package/dist/machines/HostsSection.js +1 -1
- package/dist/machines/SyncOutcomeBadge.js +1 -1
- package/dist/machines/headless/index.js +1 -1
- package/dist/machines/headless/labels.d.ts +1 -0
- package/dist/machines/headless/labels.js +1 -0
- package/dist/machines/headless/messages.d.ts +2 -1
- package/dist/machines/headless/messages.js +4 -3
- package/dist/machines/settings-section.d.ts +1 -1
- package/dist/onboarding/conversation.js +21 -3
- package/dist/onboarding/demos/features.d.ts +5 -1
- package/dist/onboarding/demos/features.js +80 -1
- package/dist/onboarding/headless/fixture-host.d.ts +2 -2
- package/dist/onboarding/headless/host.d.ts +2 -2
- package/dist/onboarding/headless/labels.d.ts +2 -0
- package/dist/onboarding/headless/labels.js +2 -0
- package/dist/onboarding/index.d.ts +4 -2
- package/dist/onboarding/index.js +3 -2
- package/dist/onboarding/marks.d.ts +29 -7
- package/dist/onboarding/marks.js +38 -12
- package/dist/onboarding/skills/SkillSourceBrowser.js +56 -247
- package/dist/onboarding/skills/parts.d.ts +31 -4
- package/dist/onboarding/skills/parts.js +8 -11
- package/dist/onboarding/sources/SourceBrowser.d.ts +87 -0
- package/dist/onboarding/sources/SourceBrowser.js +292 -0
- package/dist/onboarding/steps/ConnectStep.js +1 -1
- package/dist/onboarding/steps/ConnectorsStep.js +3 -3
- package/dist/onboarding/steps/ConversationStep.js +2 -1
- package/dist/onboarding/steps/ExtensionsStep.js +2 -2
- package/dist/onboarding/steps/ReadyStep.js +2 -2
- package/dist/onboarding/steps/connect/ProviderPanel.js +1 -1
- package/dist/palette/app-sources.js +1 -1
- package/dist/path.d.ts +24 -2
- package/dist/path.js +34 -2
- package/dist/session/ArtifactRowChips.js +11 -2
- package/dist/session/ArtifactsPanel.d.ts +2 -0
- package/dist/session/ArtifactsPanel.js +67 -27
- package/dist/session/ProjectHome.d.ts +82 -0
- package/dist/session/ProjectHome.js +518 -0
- package/dist/session/ProviderUsageProvider.d.ts +3 -1
- package/dist/session/ProviderUsageProvider.js +5 -2
- package/dist/session/QueueTab.js +1 -1
- package/dist/session/SessionCacheFacts.js +1 -1
- package/dist/session/SessionDetailsDialog.d.ts +1 -1
- package/dist/session/SessionDetailsDialog.js +5 -2
- package/dist/session/SessionHeader.d.ts +3 -1
- package/dist/session/SessionHeader.js +7 -1
- package/dist/session/SideChat.js +2 -2
- package/dist/session/TodosPanel.js +4 -1
- package/dist/session/UsagePanel.js +139 -17
- package/dist/session/WelcomeScreen.d.ts +1 -1
- package/dist/session/WelcomeScreen.js +46 -502
- package/dist/session/headless/fixture-host.js +43 -1
- package/dist/session/headless/home-layout.d.ts +137 -0
- package/dist/session/headless/home-layout.js +235 -0
- package/dist/session/headless/host.d.ts +3 -1
- package/dist/session/headless/index.d.ts +4 -3
- package/dist/session/headless/index.js +4 -3
- package/dist/session/headless/labels.d.ts +33 -36
- package/dist/session/headless/labels.js +48 -47
- package/dist/session/headless/usage-format.d.ts +2 -92
- package/dist/session/headless/usage-format.js +2 -181
- package/dist/session/headless/usage.d.ts +15 -2
- package/dist/session/headless/usage.js +15 -1
- package/dist/session/index.d.ts +3 -1
- package/dist/session/index.js +4 -2
- package/dist/session/modal-shell.d.ts +8 -0
- package/dist/session/modal-shell.js +18 -0
- package/dist/session/testing/contract.d.ts +1 -1
- package/dist/session/testing/contract.js +16 -0
- package/dist/session/testing/demo.js +28 -4
- package/dist/settings/SettingsNav.d.ts +3 -2
- package/dist/settings/SettingsNav.js +86 -13
- package/dist/settings/SettingsRowsPage.d.ts +2 -2
- package/dist/settings/SettingsShell.d.ts +3 -1
- package/dist/settings/SettingsShell.js +16 -9
- package/dist/settings/headless/catalog.js +20 -0
- package/dist/settings/headless/fixture-sections.d.ts +10 -1
- package/dist/settings/headless/fixture-sections.js +88 -3
- package/dist/settings/headless/host.d.ts +2 -0
- package/dist/settings/headless/index.d.ts +4 -4
- package/dist/settings/headless/index.js +1 -1
- package/dist/settings/headless/layout.d.ts +8 -4
- package/dist/settings/headless/layout.js +22 -16
- package/dist/settings/headless/registry.d.ts +14 -0
- package/dist/settings/headless/search.d.ts +1 -1
- package/dist/settings/headless/sections-host.d.ts +36 -3
- package/dist/settings/index.d.ts +5 -3
- package/dist/settings/index.js +8 -6
- package/dist/settings/sections/appearance/AppearanceSection.js +4 -4
- package/dist/settings/sections/claude-import/ClaudeImportDialog.js +1 -1
- package/dist/settings/sections/editor/EditorSection.js +1 -1
- package/dist/settings/sections/environments/EnvironmentsSection.js +1 -1
- package/dist/settings/sections/extensions/ChangeOriginDialog.d.ts +48 -0
- package/dist/settings/sections/extensions/ChangeOriginDialog.js +181 -0
- package/dist/settings/sections/extensions/CreateExtensionDialog.js +5 -2
- package/dist/settings/sections/extensions/ExtensionConfigRows.d.ts +76 -0
- package/dist/settings/sections/extensions/ExtensionConfigRows.js +349 -0
- package/dist/settings/sections/extensions/ExtensionOptionsSection.d.ts +1 -4
- package/dist/settings/sections/extensions/ExtensionOptionsSection.js +23 -286
- package/dist/settings/sections/extensions/ExtensionPicksBar.d.ts +46 -0
- package/dist/settings/sections/extensions/ExtensionPicksBar.js +102 -0
- package/dist/settings/sections/extensions/ExtensionSourceBrowser.d.ts +50 -0
- package/dist/settings/sections/extensions/ExtensionSourceBrowser.js +164 -0
- package/dist/settings/sections/extensions/ExtensionsSection.d.ts +6 -2
- package/dist/settings/sections/extensions/ExtensionsSection.js +233 -42
- package/dist/settings/sections/extensions/labels.d.ts +26 -5
- package/dist/settings/sections/extensions/labels.js +28 -3
- package/dist/settings/sections/extensions/options-labels.d.ts +2 -0
- package/dist/settings/sections/extensions/options-labels.js +2 -0
- package/dist/settings/sections/host-catalog/HostCatalogSection.js +104 -30
- package/dist/settings/sections/host-catalog/labels.js +4 -2
- package/dist/settings/sections/index.d.ts +5 -3
- package/dist/settings/sections/index.js +8 -6
- package/dist/settings/sections/instructions/InstructionsSection.js +7 -4
- package/dist/settings/sections/mcp/McpSection.js +1 -1
- package/dist/settings/sections/mcp/McpServerRow.js +3 -2
- package/dist/settings/sections/models/AgentDefaults.js +1 -1
- package/dist/settings/sections/models/ModelPickField.js +1 -1
- package/dist/settings/sections/models/ModelRows.js +3 -3
- package/dist/settings/sections/plugins/PluginsSection.js +3 -1
- package/dist/settings/sections/providers/ProvidersSection.js +3 -3
- package/dist/settings/sections/providers/ServerProvidersSection.js +2 -2
- package/dist/settings/sections/providers/ServerSignIn.js +3 -3
- package/dist/settings/sections/shared/catalog.d.ts +6 -1
- package/dist/settings/sections/shared/catalog.js +28 -22
- package/dist/settings/sections/skills/SkillList.js +2 -2
- package/dist/settings/sections/skills/SkillsSection.js +1 -1
- package/dist/styles.css +526 -21
- package/dist/terminal/HostTerminalSurface.js +18 -8
- package/dist/terminal/TerminalProvider.d.ts +3 -1
- package/dist/terminal/TerminalProvider.js +5 -1
- package/dist/terminal/headless/store.d.ts +17 -0
- package/dist/terminal/headless/store.js +31 -0
- package/dist/terminal/index.d.ts +2 -2
- package/dist/terminal/index.js +2 -2
- package/dist/theme/runtime-icons.d.ts +50 -0
- package/dist/theme/runtime-icons.js +95 -0
- package/dist/workspace/PanelContentView.d.ts +33 -4
- package/dist/workspace/PanelContentView.js +192 -58
- package/dist/workspace/PanelCorner.d.ts +35 -0
- package/dist/workspace/PanelCorner.js +68 -0
- package/dist/workspace/PanelGroups.d.ts +7 -2
- package/dist/workspace/PanelGroups.js +7 -3
- package/dist/workspace/PanelHome.d.ts +19 -0
- package/dist/workspace/PanelHome.js +74 -0
- package/dist/workspace/PanelItems.d.ts +28 -0
- package/dist/workspace/PanelItems.js +330 -0
- package/dist/workspace/PanelStrip.d.ts +5 -1
- package/dist/workspace/PanelStrip.js +6 -4
- package/dist/workspace/SidePanel.d.ts +9 -3
- package/dist/workspace/SidePanel.js +47 -10
- package/dist/workspace/TabParking.d.ts +2 -0
- package/dist/workspace/TabParking.js +8 -2
- package/dist/workspace/WorkspaceProvider.d.ts +1 -1
- package/dist/workspace/WorkspaceProvider.js +10 -6
- package/dist/workspace/extension-tabs.d.ts +36 -0
- package/dist/workspace/extension-tabs.js +175 -0
- package/dist/workspace/headless/host.d.ts +6 -2
- package/dist/workspace/headless/index.js +1 -1
- package/dist/workspace/headless/labels.d.ts +7 -0
- package/dist/workspace/headless/labels.js +14 -0
- package/dist/workspace/headless/view.d.ts +5 -0
- package/dist/workspace/index.d.ts +3 -2
- package/dist/workspace/index.js +3 -2
- package/package.json +37 -9
- package/src/styles/components.css +24 -8
- package/src/styles/motion.css +35 -0
- package/src/styles/primitives.css +5 -2
- package/src/styles/rich-composer.css +7 -2
- package/src/styles/sidebar.css +24 -0
- package/src/styles/transcript.css +329 -0
- package/src/styles/workspace.css +58 -0
- package/dist/chat/composer/use-hud.d.ts +0 -16
- package/dist/chat/composer/use-hud.js +0 -36
- package/dist/chat/headless/composer/hud.d.ts +0 -25
- package/dist/chat/headless/composer/hud.js +0 -66
- package/src/adapters/browser-appearance-host.ts +0 -51
- package/src/adapters/browser-keybindings-host.ts +0 -48
- package/src/adapters/browser-workspace-host.ts +0 -92
- package/src/adapters/closable-client.ts +0 -34
- package/src/adapters/index.ts +0 -32
- package/src/adapters/live-events.ts +0 -6
- package/src/adapters/live.ts +0 -230
- package/src/adapters/run-host.ts +0 -238
- package/src/adapters/server-approvals-host.ts +0 -102
- package/src/adapters/server-client.ts +0 -15
- package/src/adapters/server-composer-host.ts +0 -474
- package/src/adapters/server-files-host.ts +0 -287
- package/src/adapters/server-git-host.ts +0 -289
- package/src/adapters/server-host.ts +0 -459
- package/src/adapters/server-machines-host.ts +0 -283
- package/src/adapters/server-oauth-flow.ts +0 -133
- package/src/adapters/server-onboarding-host.ts +0 -363
- package/src/adapters/server-palette-host.ts +0 -134
- package/src/adapters/server-session-host.ts +0 -241
- package/src/adapters/server-settings-accounts.ts +0 -212
- package/src/adapters/server-settings-host.ts +0 -120
- package/src/adapters/server-settings-models.ts +0 -46
- package/src/adapters/server-settings-performance.ts +0 -58
- package/src/adapters/server-settings-sections.ts +0 -184
- package/src/adapters/server-sidebar-host.ts +0 -59
- package/src/adapters/server-terminal-host.ts +0 -124
- package/src/adapters/server-transcript-members.ts +0 -131
- package/src/adapters/sse-host.ts +0 -264
- package/src/adapters/sse-parser.ts +0 -82
- package/src/adapters/sse-protocol.ts +0 -118
- package/src/adapters/stream-pacer.ts +0 -122
- package/src/adapters/worker-host.ts +0 -192
- package/src/adapters/worker-protocol.ts +0 -97
- package/src/app/AppHostProvider.tsx +0 -122
- package/src/app/ModalProvider.tsx +0 -711
- package/src/app/headless/app-host.ts +0 -58
- package/src/app/headless/index.ts +0 -6
- package/src/app/headless/resource.ts +0 -444
- package/src/app/index.ts +0 -9
- package/src/app/testing/index.ts +0 -90
- package/src/app/useConfirm.tsx +0 -65
- package/src/app/useResource.ts +0 -30
- package/src/appearance/AppearanceProvider.tsx +0 -359
- package/src/appearance/apply.ts +0 -69
- package/src/appearance/headless/fixture-host.ts +0 -111
- package/src/appearance/headless/fonts.ts +0 -224
- package/src/appearance/headless/host.ts +0 -65
- package/src/appearance/headless/index.ts +0 -12
- package/src/appearance/headless/prefs.ts +0 -252
- package/src/appearance/headless/storage.ts +0 -127
- package/src/appearance/headless/zoom-commands.ts +0 -21
- package/src/appearance/index.ts +0 -11
- package/src/appearance/testing/contract.ts +0 -210
- package/src/appearance/testing/index.ts +0 -6
- package/src/approvals/ApprovalBar.tsx +0 -227
- package/src/approvals/ApprovalConcern.tsx +0 -33
- package/src/approvals/ApprovalShell.tsx +0 -69
- package/src/approvals/ApprovalsProvider.tsx +0 -110
- package/src/approvals/FileEditApproval.tsx +0 -305
- package/src/approvals/HunkPreviews.tsx +0 -225
- package/src/approvals/SafelistPanel.tsx +0 -149
- package/src/approvals/headless/fixture-host.ts +0 -73
- package/src/approvals/headless/fixtures.ts +0 -86
- package/src/approvals/headless/heads.ts +0 -81
- package/src/approvals/headless/host.ts +0 -80
- package/src/approvals/headless/index.ts +0 -12
- package/src/approvals/headless/labels.ts +0 -67
- package/src/approvals/headless/pending.ts +0 -91
- package/src/approvals/headless/preview.ts +0 -94
- package/src/approvals/headless/safelist.ts +0 -63
- package/src/approvals/index.ts +0 -13
- package/src/approvals/key-scope.ts +0 -33
- package/src/approvals/testing/contract.ts +0 -230
- package/src/approvals/testing/index.ts +0 -7
- package/src/brands/marks.ts +0 -298
- package/src/chat/ChatProvider.tsx +0 -60
- package/src/chat/DaemonOrb.tsx +0 -107
- package/src/chat/HostBadge.tsx +0 -71
- package/src/chat/HostStatusDot.tsx +0 -53
- package/src/chat/HostTranscript.tsx +0 -101
- package/src/chat/PdfPreview.tsx +0 -65
- package/src/chat/SessionFilterMenu.tsx +0 -237
- package/src/chat/SessionGroupHeader.tsx +0 -136
- package/src/chat/SessionHostHeader.tsx +0 -66
- package/src/chat/SessionList.tsx +0 -413
- package/src/chat/SessionListRow.tsx +0 -279
- package/src/chat/SessionStreamsProvider.tsx +0 -253
- package/src/chat/StatusDot.tsx +0 -128
- package/src/chat/TextPreview.tsx +0 -121
- package/src/chat/Throbber.tsx +0 -277
- package/src/chat/Transcript.tsx +0 -461
- package/src/chat/composer/AgentPicker.tsx +0 -155
- package/src/chat/composer/AgentPickerDialog.tsx +0 -99
- package/src/chat/composer/ApprovalDock.tsx +0 -64
- package/src/chat/composer/ArchivedBanner.tsx +0 -44
- package/src/chat/composer/AttachmentTiles.tsx +0 -211
- package/src/chat/composer/Composer.tsx +0 -500
- package/src/chat/composer/ComposerBadges.tsx +0 -339
- package/src/chat/composer/ComposerControls.tsx +0 -243
- package/src/chat/composer/ComposerEditor.tsx +0 -101
- package/src/chat/composer/ComposerHostProvider.tsx +0 -46
- package/src/chat/composer/ComposerShell.tsx +0 -129
- package/src/chat/composer/ContextBreakdown.tsx +0 -382
- package/src/chat/composer/ContextOrb.tsx +0 -176
- package/src/chat/composer/ConversationBadges.tsx +0 -159
- package/src/chat/composer/DockCard.tsx +0 -126
- package/src/chat/composer/EffortPickerDialog.tsx +0 -184
- package/src/chat/composer/HostComposer.tsx +0 -135
- package/src/chat/composer/HostContextOrb.tsx +0 -94
- package/src/chat/composer/HostModelChainList.tsx +0 -102
- package/src/chat/composer/HostPicker.tsx +0 -97
- package/src/chat/composer/HostPickers.tsx +0 -320
- package/src/chat/composer/ImageModelList.tsx +0 -151
- package/src/chat/composer/ModelChainList.tsx +0 -442
- package/src/chat/composer/ModelChainParts.tsx +0 -247
- package/src/chat/composer/ModelChainRow.tsx +0 -191
- package/src/chat/composer/ModelChainRows.tsx +0 -223
- package/src/chat/composer/ModelChainTooltip.tsx +0 -121
- package/src/chat/composer/ModelFacts.tsx +0 -204
- package/src/chat/composer/ModelOptionsPicker.tsx +0 -257
- package/src/chat/composer/ModelPicker.tsx +0 -513
- package/src/chat/composer/ModelPickerDialog.tsx +0 -99
- package/src/chat/composer/ModelProviderPills.tsx +0 -141
- package/src/chat/composer/PickerPill.tsx +0 -41
- package/src/chat/composer/ProjectMenu.tsx +0 -170
- package/src/chat/composer/PromptHistoryProvider.tsx +0 -214
- package/src/chat/composer/RetryPill.tsx +0 -47
- package/src/chat/composer/RunStatusChip.tsx +0 -150
- package/src/chat/composer/ScopeToggle.tsx +0 -94
- package/src/chat/composer/SendButton.tsx +0 -89
- package/src/chat/composer/ServerScopeToggle.tsx +0 -179
- package/src/chat/composer/attachment-ingest.ts +0 -413
- package/src/chat/composer/attachments.tsx +0 -176
- package/src/chat/composer/badge-order.ts +0 -65
- package/src/chat/composer/composer-bus.ts +0 -307
- package/src/chat/composer/index.ts +0 -63
- package/src/chat/composer/load-composer-editor.ts +0 -25
- package/src/chat/composer/model-catalog.ts +0 -424
- package/src/chat/composer/model-list-layout.ts +0 -118
- package/src/chat/composer/prompt-history-nav.ts +0 -60
- package/src/chat/composer/scope-side.ts +0 -7
- package/src/chat/composer/suggestion-extension.ts +0 -113
- package/src/chat/composer/suggestions.tsx +0 -115
- package/src/chat/composer/use-agent-profiles.ts +0 -97
- package/src/chat/composer/use-cache-hints.ts +0 -93
- package/src/chat/composer/use-composer-stores.ts +0 -140
- package/src/chat/composer/use-draft-target.ts +0 -284
- package/src/chat/composer/use-hud.ts +0 -38
- package/src/chat/composer/use-new-session-defaults.ts +0 -201
- package/src/chat/composer/use-provider-ready-poll.ts +0 -35
- package/src/chat/composer/use-run-meter.ts +0 -140
- package/src/chat/composer/use-send-prompt.ts +0 -188
- package/src/chat/composer/use-session-meters.ts +0 -109
- package/src/chat/composer/use-sustained-work.ts +0 -74
- package/src/chat/composer/useAttachmentIngest.ts +0 -116
- package/src/chat/composer/useModelListSpy.ts +0 -19
- package/src/chat/headless/badge-refs.ts +0 -76
- package/src/chat/headless/chip-labels.ts +0 -39
- package/src/chat/headless/chip-settle.ts +0 -53
- package/src/chat/headless/chip-views.ts +0 -215
- package/src/chat/headless/composer/attachment-dedupe.ts +0 -50
- package/src/chat/headless/composer/commands.ts +0 -16
- package/src/chat/headless/composer/composer-sources.ts +0 -150
- package/src/chat/headless/composer/conversation-badges.ts +0 -222
- package/src/chat/headless/composer/draft-sync.ts +0 -199
- package/src/chat/headless/composer/editor-markdown.ts +0 -137
- package/src/chat/headless/composer/ghost-autocomplete.ts +0 -381
- package/src/chat/headless/composer/host-chrome.ts +0 -227
- package/src/chat/headless/composer/host.ts +0 -253
- package/src/chat/headless/composer/hud.ts +0 -101
- package/src/chat/headless/composer/index.ts +0 -18
- package/src/chat/headless/composer/labels-chrome.ts +0 -83
- package/src/chat/headless/composer/labels-editor.ts +0 -44
- package/src/chat/headless/composer/labels.ts +0 -18
- package/src/chat/headless/composer/live-cost.ts +0 -67
- package/src/chat/headless/composer/model-knobs.ts +0 -179
- package/src/chat/headless/composer/model-names.ts +0 -145
- package/src/chat/headless/composer/model-picker-prefs.ts +0 -90
- package/src/chat/headless/composer/models.ts +0 -86
- package/src/chat/headless/composer/new-session-defaults.ts +0 -68
- package/src/chat/headless/composer/prompt-suggestions.ts +0 -72
- package/src/chat/headless/composer/remember-model-pick.ts +0 -132
- package/src/chat/headless/composer/run-meter.ts +0 -228
- package/src/chat/headless/composer-modes.ts +0 -170
- package/src/chat/headless/draft-scope.ts +0 -136
- package/src/chat/headless/draft-target.ts +0 -87
- package/src/chat/headless/file-chip.ts +0 -175
- package/src/chat/headless/fixture-host.ts +0 -294
- package/src/chat/headless/fixture-transcript.ts +0 -125
- package/src/chat/headless/fixtures/demo-transcript-all-kinds.ts +0 -233
- package/src/chat/headless/fixtures/demo-transcript.ts +0 -244
- package/src/chat/headless/host.ts +0 -259
- package/src/chat/headless/hosts.ts +0 -53
- package/src/chat/headless/index.ts +0 -31
- package/src/chat/headless/labels.ts +0 -331
- package/src/chat/headless/markdown-chunks.ts +0 -134
- package/src/chat/headless/path-resolver.ts +0 -178
- package/src/chat/headless/prompt-origin.ts +0 -90
- package/src/chat/headless/reference-store.ts +0 -285
- package/src/chat/headless/send-flow.ts +0 -347
- package/src/chat/headless/session-list.ts +0 -390
- package/src/chat/headless/sidebar/activity.ts +0 -179
- package/src/chat/headless/sidebar/badges.ts +0 -163
- package/src/chat/headless/sidebar/compaction.ts +0 -98
- package/src/chat/headless/sidebar/directory.ts +0 -819
- package/src/chat/headless/sidebar/dot-state.ts +0 -36
- package/src/chat/headless/sidebar/environment.ts +0 -70
- package/src/chat/headless/sidebar/host.ts +0 -41
- package/src/chat/headless/sidebar/index.ts +0 -16
- package/src/chat/headless/sidebar/labels.ts +0 -140
- package/src/chat/headless/sidebar/notifications.ts +0 -61
- package/src/chat/headless/sidebar/pinned-projects.ts +0 -51
- package/src/chat/headless/sidebar/pinned-sessions.ts +0 -27
- package/src/chat/headless/sidebar/project-icons.ts +0 -116
- package/src/chat/headless/sidebar/rows.ts +0 -229
- package/src/chat/headless/sidebar/types.ts +0 -61
- package/src/chat/headless/sidebar/view.ts +0 -296
- package/src/chat/headless/site-icons.ts +0 -51
- package/src/chat/headless/smooth-stream.ts +0 -76
- package/src/chat/headless/store.ts +0 -62
- package/src/chat/headless/streams/actions.ts +0 -85
- package/src/chat/headless/streams/index.ts +0 -25
- package/src/chat/headless/streams/live-events.ts +0 -124
- package/src/chat/headless/streams/merge.ts +0 -60
- package/src/chat/headless/streams/pacer.ts +0 -189
- package/src/chat/headless/streams/prompt-previews.ts +0 -64
- package/src/chat/headless/streams/scheduler.ts +0 -36
- package/src/chat/headless/streams/selectors.ts +0 -76
- package/src/chat/headless/streams/session-streams.ts +0 -394
- package/src/chat/headless/streams/store.ts +0 -1107
- package/src/chat/headless/streams/transcript.ts +0 -41
- package/src/chat/headless/streams/types.ts +0 -84
- package/src/chat/headless/transcript/batch.ts +0 -429
- package/src/chat/headless/transcript/collapse.ts +0 -780
- package/src/chat/headless/transcript/fold-actions.ts +0 -269
- package/src/chat/headless/transcript/fold-attachments.ts +0 -78
- package/src/chat/headless/transcript/fold.ts +0 -382
- package/src/chat/headless/transcript/index.ts +0 -41
- package/src/chat/headless/transcript/nesting.ts +0 -73
- package/src/chat/headless/transcript/pairing.ts +0 -124
- package/src/chat/headless/transcript/rows.ts +0 -367
- package/src/chat/headless/transcript/run-failures.ts +0 -72
- package/src/chat/headless/transcript/select-stops.ts +0 -151
- package/src/chat/headless/transcript/tool-media.ts +0 -42
- package/src/chat/headless/transcript-host.ts +0 -180
- package/src/chat/headless/transcript-labels.ts +0 -12
- package/src/chat/headless/turn-labels.ts +0 -28
- package/src/chat/headless/turn-prompt.ts +0 -32
- package/src/chat/index.ts +0 -29
- package/src/chat/interactions/HostInteractions.tsx +0 -76
- package/src/chat/interactions/InboxPanel.tsx +0 -226
- package/src/chat/interactions/InteractionCard.tsx +0 -111
- package/src/chat/interactions/PlanCard.tsx +0 -186
- package/src/chat/interactions/QuestionField.tsx +0 -336
- package/src/chat/interactions/QuestionForm.tsx +0 -283
- package/src/chat/interactions/card-ui.tsx +0 -86
- package/src/chat/interactions/hooks.ts +0 -49
- package/src/chat/interactions/index.ts +0 -8
- package/src/chat/provider-color.ts +0 -71
- package/src/chat/rich-composer/MentionList.tsx +0 -238
- package/src/chat/rich-composer/RichComposer.tsx +0 -1036
- package/src/chat/rich-composer/badge-decorations.ts +0 -157
- package/src/chat/rich-composer/composer-controls.tsx +0 -102
- package/src/chat/rich-composer/composer-extensions.ts +0 -388
- package/src/chat/rich-composer/composer-keys.ts +0 -416
- package/src/chat/rich-composer/ghost-plugin.ts +0 -89
- package/src/chat/rich-composer/index.ts +0 -3
- package/src/chat/rich-composer/mention-popover.ts +0 -336
- package/src/chat/rich-composer/slash-completion.ts +0 -143
- package/src/chat/rich-composer/use-composer-bus.ts +0 -57
- package/src/chat/rich-composer/use-composer-editor.ts +0 -216
- package/src/chat/rich-composer/use-composer-sources.ts +0 -90
- package/src/chat/rich-composer/use-draft-mirror.ts +0 -398
- package/src/chat/rich-composer/use-editor-handover.ts +0 -45
- package/src/chat/rich-composer/use-ghost-lifecycle.ts +0 -265
- package/src/chat/rich-composer/use-prompt-ghost.ts +0 -90
- package/src/chat/rich-composer/use-staged-attachments.ts +0 -65
- package/src/chat/sidebar/MainSessionRow.tsx +0 -102
- package/src/chat/sidebar/ProjectIcon.tsx +0 -336
- package/src/chat/sidebar/RowChips.tsx +0 -98
- package/src/chat/sidebar/SessionSidebar.tsx +0 -805
- package/src/chat/sidebar/SidebarFilterMenu.tsx +0 -41
- package/src/chat/sidebar/SidebarFooter.tsx +0 -234
- package/src/chat/sidebar/SidebarFrame.tsx +0 -154
- package/src/chat/sidebar/SidebarGroupHeader.tsx +0 -231
- package/src/chat/sidebar/SidebarHostProvider.tsx +0 -51
- package/src/chat/sidebar/SidebarSearchRow.tsx +0 -66
- package/src/chat/sidebar/SidebarSessionRow.tsx +0 -293
- package/src/chat/sidebar/SidebarToggleButton.tsx +0 -48
- package/src/chat/sidebar/SpaceSwitcher.tsx +0 -232
- package/src/chat/sidebar/SpacesSection.tsx +0 -256
- package/src/chat/sidebar/index.ts +0 -92
- package/src/chat/sidebar/session-menu.ts +0 -437
- package/src/chat/sidebar/sidebar-focus-hold.ts +0 -56
- package/src/chat/sidebar/sidebar-live.tsx +0 -605
- package/src/chat/sidebar/use-main-session.ts +0 -32
- package/src/chat/sidebar/useCompactionProgress.ts +0 -24
- package/src/chat/sidebar/usePinnedProjects.ts +0 -36
- package/src/chat/sidebar/useSessionActivity.ts +0 -24
- package/src/chat/sidebar/useSessionBadges.ts +0 -26
- package/src/chat/sidebar/useSessionDirectoryView.ts +0 -86
- package/src/chat/sidebar/useSessionSearch.ts +0 -94
- package/src/chat/sidebar/useSidebarKeyboardNav.ts +0 -165
- package/src/chat/sidebar/useSidebarLabels.ts +0 -10
- package/src/chat/testing/composer.contract.ts +0 -532
- package/src/chat/testing/contract.ts +0 -634
- package/src/chat/testing/fixture-composer-chrome.ts +0 -178
- package/src/chat/testing/fixture-composer-host.ts +0 -147
- package/src/chat/testing/fixture-sidebar-host.ts +0 -99
- package/src/chat/testing/index.ts +0 -12
- package/src/chat/testing/sidebar.contract.ts +0 -196
- package/src/chat/transcript/BadgeMenu.tsx +0 -223
- package/src/chat/transcript/CardMarkdown.tsx +0 -92
- package/src/chat/transcript/ChipCard.tsx +0 -176
- package/src/chat/transcript/ChipCards.tsx +0 -100
- package/src/chat/transcript/DiffLines.tsx +0 -122
- package/src/chat/transcript/EarlierHistory.tsx +0 -136
- package/src/chat/transcript/EditDiffBlock.tsx +0 -171
- package/src/chat/transcript/FileChip.tsx +0 -350
- package/src/chat/transcript/ImageGenerationBlock.tsx +0 -239
- package/src/chat/transcript/InlineChipText.tsx +0 -57
- package/src/chat/transcript/InteractionToolBody.tsx +0 -193
- package/src/chat/transcript/LazyRow.tsx +0 -311
- package/src/chat/transcript/PromptEcho.tsx +0 -171
- package/src/chat/transcript/PromptOriginLabel.tsx +0 -44
- package/src/chat/transcript/ProseMarkdown.tsx +0 -165
- package/src/chat/transcript/ReferenceText.tsx +0 -193
- package/src/chat/transcript/SelectCursor.tsx +0 -118
- package/src/chat/transcript/SelectTurnHint.tsx +0 -81
- package/src/chat/transcript/SelectTurnProvider.tsx +0 -150
- package/src/chat/transcript/SubagentBlock.tsx +0 -218
- package/src/chat/transcript/TranscriptRow.tsx +0 -356
- package/src/chat/transcript/TranscriptSearch.tsx +0 -171
- package/src/chat/transcript/TurnMenu.tsx +0 -217
- package/src/chat/transcript/actions.tsx +0 -77
- package/src/chat/transcript/badges.tsx +0 -152
- package/src/chat/transcript/chip-details.ts +0 -169
- package/src/chat/transcript/chip-resolve.ts +0 -56
- package/src/chat/transcript/fold-attachments.tsx +0 -221
- package/src/chat/transcript/fold-status.tsx +0 -112
- package/src/chat/transcript/fold-worker.tsx +0 -160
- package/src/chat/transcript/fold.tsx +0 -520
- package/src/chat/transcript/frame.tsx +0 -326
- package/src/chat/transcript/index.ts +0 -65
- package/src/chat/transcript/markdown-cache.ts +0 -70
- package/src/chat/transcript/markdown-context.ts +0 -52
- package/src/chat/transcript/markdown.tsx +0 -282
- package/src/chat/transcript/messages.tsx +0 -168
- package/src/chat/transcript/notices.tsx +0 -508
- package/src/chat/transcript/prompt-lines.tsx +0 -55
- package/src/chat/transcript/prompt.tsx +0 -258
- package/src/chat/transcript/prose.tsx +0 -171
- package/src/chat/transcript/references.ts +0 -104
- package/src/chat/transcript/remark-references.ts +0 -157
- package/src/chat/transcript/remark-refs.ts +0 -176
- package/src/chat/transcript/renderer-slots.tsx +0 -35
- package/src/chat/transcript/renderers.tsx +0 -241
- package/src/chat/transcript/row-estimate.ts +0 -158
- package/src/chat/transcript/run-rows.tsx +0 -291
- package/src/chat/transcript/site-icons.ts +0 -27
- package/src/chat/transcript/thumbnails.ts +0 -146
- package/src/chat/transcript/tool-batch.tsx +0 -111
- package/src/chat/transcript/tool-details.tsx +0 -77
- package/src/chat/transcript/tool-media.tsx +0 -132
- package/src/chat/transcript/tool-parts.tsx +0 -358
- package/src/chat/transcript/tool-row.tsx +0 -489
- package/src/chat/transcript/turn-commands.ts +0 -101
- package/src/chat/transcript/use-transcript-rows.ts +0 -195
- package/src/chat/transcript/useComposerSearch.ts +0 -106
- package/src/chat/transcript/useSelectTurnKeys.ts +0 -204
- package/src/chat/transcript/useSettledReveal.ts +0 -57
- package/src/chat/transcript/useStickToBottom.ts +0 -600
- package/src/chat/transcript/useTranscriptFind.ts +0 -70
- package/src/chat/transcript/useTranscriptFindKey.ts +0 -52
- package/src/chat/transcript/useTranscriptScroll.ts +0 -162
- package/src/chat/transcript/useTranscriptSearch.tsx +0 -382
- package/src/chat/transcript/useTranscriptSelectionCopy.ts +0 -63
- package/src/chat/transcript/useWheelHoverPause.ts +0 -79
- package/src/chat/transcript/user-bash.tsx +0 -134
- package/src/chat/useChatLabels.ts +0 -14
- package/src/code/CodeHighlightProvider.tsx +0 -87
- package/src/code/HighlightedCode.tsx +0 -150
- package/src/code/code-themes.ts +0 -34
- package/src/code/editor/CodeCompletion.tsx +0 -719
- package/src/code/editor/CodeEditor.tsx +0 -480
- package/src/code/editor/CodeHover.tsx +0 -428
- package/src/code/editor/DiagnosticAnnotation.tsx +0 -73
- package/src/code/editor/DiagnosticsChip.tsx +0 -85
- package/src/code/editor/DiffView.tsx +0 -197
- package/src/code/editor/EditorColumn.tsx +0 -256
- package/src/code/editor/FileIcon.tsx +0 -89
- package/src/code/editor/FileTabPill.tsx +0 -101
- package/src/code/editor/FileTree.tsx +0 -414
- package/src/code/editor/FileView.tsx +0 -462
- package/src/code/editor/HighlightWorkers.tsx +0 -84
- package/src/code/editor/LanguageEditor.tsx +0 -210
- package/src/code/editor/_vendor/tree-icon-colors.ts +0 -72
- package/src/code/editor/diagnostics.ts +0 -140
- package/src/code/editor/edit-session.ts +0 -28
- package/src/code/editor/environment.tsx +0 -88
- package/src/code/editor/find/FindBar.tsx +0 -126
- package/src/code/editor/find/find-highlight.ts +0 -138
- package/src/code/editor/find/find-model.ts +0 -123
- package/src/code/editor/find/settle-scroll.ts +0 -77
- package/src/code/editor/find/useFind.ts +0 -203
- package/src/code/editor/fs-adapter.ts +0 -37
- package/src/code/editor/index.ts +0 -36
- package/src/code/editor/language.ts +0 -31
- package/src/code/editor/patch-parse.ts +0 -176
- package/src/code/editor/patch-parse.worker.ts +0 -12
- package/src/code/editor/pierre-theme.ts +0 -154
- package/src/code/editor/prime-diff.ts +0 -37
- package/src/code/editor/reveal.ts +0 -58
- package/src/code/editor/scroll-reach.ts +0 -28
- package/src/code/editor/useCodeDocument.ts +0 -226
- package/src/code/editor/useDefinition.ts +0 -159
- package/src/code/editor/useDetachCleanup.ts +0 -36
- package/src/code/editor/useFileDocument.ts +0 -87
- package/src/code/editor/useRevealLine.ts +0 -92
- package/src/code/editor/word-at.ts +0 -145
- package/src/code/highlight.worker.ts +0 -19
- package/src/code/highlighter.ts +0 -185
- package/src/code/shiki-theme.ts +0 -47
- package/src/components/BrandMark.tsx +0 -107
- package/src/components/Breadcrumb.tsx +0 -105
- package/src/components/BrowserChrome.tsx +0 -189
- package/src/components/BrowserSignIn.tsx +0 -210
- package/src/components/ChoiceCards.tsx +0 -170
- package/src/components/CodeFrame.tsx +0 -209
- package/src/components/ConfirmDialog.tsx +0 -119
- package/src/components/CopyButton.tsx +0 -85
- package/src/components/EditableTitle.tsx +0 -199
- package/src/components/ErrorBoundary.tsx +0 -208
- package/src/components/Form.tsx +0 -589
- package/src/components/Highlighted.tsx +0 -68
- package/src/components/HowItWorks.tsx +0 -123
- package/src/components/IconButton.tsx +0 -101
- package/src/components/IconToggle.tsx +0 -71
- package/src/components/Keycap.tsx +0 -334
- package/src/components/Lightbox.tsx +0 -257
- package/src/components/LoadError.tsx +0 -45
- package/src/components/MediaNav.tsx +0 -85
- package/src/components/Menu.tsx +0 -435
- package/src/components/Overlay.tsx +0 -327
- package/src/components/PanelEmpty.tsx +0 -80
- package/src/components/PanelRows.tsx +0 -107
- package/src/components/PreviewWindow.tsx +0 -53
- package/src/components/ReorderTabs.tsx +0 -103
- package/src/components/RowActionsMenu.tsx +0 -383
- package/src/components/SegmentSpinner.tsx +0 -88
- package/src/components/Segmented.tsx +0 -126
- package/src/components/StepFrame.tsx +0 -151
- package/src/components/Stepper.tsx +0 -157
- package/src/components/Surface.tsx +0 -191
- package/src/components/SwatchPicker.tsx +0 -147
- package/src/components/SwitchGlyph.tsx +0 -56
- package/src/components/TabPill.tsx +0 -188
- package/src/components/ThemeThumb.tsx +0 -52
- package/src/components/ToggleCard.tsx +0 -120
- package/src/components/Tooltip.tsx +0 -288
- package/src/components/ZoomableImage.tsx +0 -322
- package/src/components/button.ts +0 -120
- package/src/components/floating/FloatingSurface.tsx +0 -158
- package/src/components/floating/HoverCard.tsx +0 -143
- package/src/components/floating/Popover.tsx +0 -166
- package/src/components/floating/useAnchoredPosition.ts +0 -186
- package/src/components/floating/usePopover.ts +0 -158
- package/src/components/image-clipboard.ts +0 -70
- package/src/components/keyboard-layout.ts +0 -115
- package/src/components/palette/PaletteList.tsx +0 -432
- package/src/components/palette/PalettePanel.tsx +0 -338
- package/src/components/palette/palette-layout.ts +0 -86
- package/src/components/report-error.ts +0 -142
- package/src/components/zoom.ts +0 -133
- package/src/files/CodeViewer.tsx +0 -289
- package/src/files/DiffFileViewer.tsx +0 -143
- package/src/files/DiffsTab.tsx +0 -590
- package/src/files/EditorColumn.tsx +0 -453
- package/src/files/FilesDiagnosticsChip.tsx +0 -32
- package/src/files/FilesProvider.tsx +0 -58
- package/src/files/FilesTab.tsx +0 -441
- package/src/files/MediaDiff.tsx +0 -61
- package/src/files/MediaView.tsx +0 -170
- package/src/files/ReviewDraft.tsx +0 -88
- package/src/files/ReviewableDiff.tsx +0 -72
- package/src/files/SearchPanel.tsx +0 -325
- package/src/files/TreeColumn.tsx +0 -229
- package/src/files/code-excerpt.ts +0 -265
- package/src/files/code-menu.ts +0 -53
- package/src/files/drafts-store.ts +0 -159
- package/src/files/file-actions.ts +0 -152
- package/src/files/headless/editor-prefs.ts +0 -230
- package/src/files/headless/entries.ts +0 -172
- package/src/files/headless/fixture-host.ts +0 -260
- package/src/files/headless/host.ts +0 -387
- package/src/files/headless/index.ts +0 -14
- package/src/files/headless/labels.ts +0 -123
- package/src/files/headless/lsp-edits.ts +0 -40
- package/src/files/headless/media.ts +0 -57
- package/src/files/headless/name-match.ts +0 -38
- package/src/files/headless/search.ts +0 -23
- package/src/files/headless/view.ts +0 -114
- package/src/files/headless/workspace-diff.ts +0 -82
- package/src/files/index.ts +0 -24
- package/src/files/lazy-tabs.tsx +0 -41
- package/src/files/tab-hooks.ts +0 -37
- package/src/files/testing/contract.ts +0 -279
- package/src/files/testing/demo.ts +0 -36
- package/src/files/testing/index.ts +0 -7
- package/src/files/useCodeReview.tsx +0 -177
- package/src/files/useDiagnostics.ts +0 -59
- package/src/files/useDiagnosticsRun.ts +0 -86
- package/src/files/useEntryActions.ts +0 -280
- package/src/files/useFilesDiagnostics.ts +0 -51
- package/src/files/useFilesLabels.ts +0 -14
- package/src/files/useFolderChanges.ts +0 -38
- package/src/files/useLsp.ts +0 -178
- package/src/files/useOpenFiles.ts +0 -402
- package/src/files/useWorkspace.ts +0 -148
- package/src/files/working-tree-diff.ts +0 -142
- package/src/git/BranchMenu.tsx +0 -981
- package/src/git/GitBar.tsx +0 -286
- package/src/git/GitProvider.tsx +0 -50
- package/src/git/ImportRepoDialog.tsx +0 -381
- package/src/git/MoveSessionDialog.tsx +0 -394
- package/src/git/RemoteFolderPicker.tsx +0 -475
- package/src/git/SyncChip.tsx +0 -275
- package/src/git/WherePicker.tsx +0 -358
- package/src/git/headless/environment.ts +0 -132
- package/src/git/headless/host.ts +0 -353
- package/src/git/headless/index.ts +0 -14
- package/src/git/headless/labels.ts +0 -230
- package/src/git/headless/move.ts +0 -101
- package/src/git/headless/remote-clone.ts +0 -44
- package/src/git/headless/status-reads.ts +0 -77
- package/src/git/headless/switcher.ts +0 -215
- package/src/git/headless/sync.ts +0 -71
- package/src/git/index.ts +0 -17
- package/src/git/testing/contract.ts +0 -551
- package/src/git/testing/index.ts +0 -537
- package/src/git/useEnvironmentChoices.ts +0 -50
- package/src/git/useGitBar.ts +0 -180
- package/src/hooks/keyed-store.ts +0 -65
- package/src/hooks/useHydrated.ts +0 -16
- package/src/hooks/useMinuteTick.ts +0 -49
- package/src/hooks/useNearViewport.ts +0 -111
- package/src/hooks/usePersistedState.ts +0 -98
- package/src/hooks/useResizeDrag.ts +0 -240
- package/src/hooks/useTabDrag.ts +0 -88
- package/src/index.ts +0 -118
- package/src/keybindings/KeyCommands.tsx +0 -123
- package/src/keybindings/KeyHint.tsx +0 -78
- package/src/keybindings/KeybindingsProvider.tsx +0 -231
- package/src/keybindings/headless/catalog.ts +0 -360
- package/src/keybindings/headless/commands.ts +0 -77
- package/src/keybindings/headless/fixture-host.ts +0 -51
- package/src/keybindings/headless/host.ts +0 -29
- package/src/keybindings/headless/index.ts +0 -13
- package/src/keybindings/headless/key-scope.ts +0 -91
- package/src/keybindings/headless/labels.ts +0 -14
- package/src/keybindings/headless/overrides.ts +0 -64
- package/src/keybindings/index.ts +0 -14
- package/src/keybindings/load-once.ts +0 -11
- package/src/keybindings/match.ts +0 -48
- package/src/keybindings/testing/contract.ts +0 -139
- package/src/keybindings/testing/index.ts +0 -6
- package/src/keybindings/useHelpKey.ts +0 -35
- package/src/keybindings/useKeybindingsLabels.ts +0 -14
- package/src/labels.tsx +0 -175
- package/src/machines/AddServerForm.tsx +0 -151
- package/src/machines/Banners.tsx +0 -172
- package/src/machines/DaemonMenu.tsx +0 -413
- package/src/machines/HostCapabilities.tsx +0 -245
- package/src/machines/HostSignIn.tsx +0 -63
- package/src/machines/HostSyncPanel.tsx +0 -275
- package/src/machines/HostsSection.tsx +0 -312
- package/src/machines/MachinesProvider.tsx +0 -164
- package/src/machines/ServerCard.tsx +0 -347
- package/src/machines/ServerMachinesPanel.tsx +0 -547
- package/src/machines/ServerUpdatePanel.tsx +0 -160
- package/src/machines/SyncAccounts.tsx +0 -148
- package/src/machines/SyncMarker.tsx +0 -87
- package/src/machines/SyncOutcomeBadge.tsx +0 -84
- package/src/machines/TokensPanel.tsx +0 -249
- package/src/machines/headless/fixture-host.ts +0 -519
- package/src/machines/headless/fixtures.ts +0 -164
- package/src/machines/headless/host.ts +0 -381
- package/src/machines/headless/index.ts +0 -13
- package/src/machines/headless/labels.ts +0 -356
- package/src/machines/headless/messages.ts +0 -197
- package/src/machines/headless/presence.ts +0 -110
- package/src/machines/headless/settings-focus.ts +0 -25
- package/src/machines/headless/stores.ts +0 -137
- package/src/machines/headless/sync.ts +0 -207
- package/src/machines/index.ts +0 -29
- package/src/machines/settings-section.tsx +0 -37
- package/src/machines/testing/contract.ts +0 -617
- package/src/machines/testing/index.ts +0 -7
- package/src/machines/testing/sync.contract.ts +0 -260
- package/src/motion/SwapIcon.tsx +0 -29
- package/src/motion/collapse.ts +0 -21
- package/src/motion/grow.tsx +0 -86
- package/src/motion/layout-animating.ts +0 -50
- package/src/motion/presence.ts +0 -191
- package/src/motion/provider.tsx +0 -63
- package/src/motion/reduced.ts +0 -36
- package/src/motion/roll.tsx +0 -131
- package/src/motion/shimmer.ts +0 -15
- package/src/motion/size.tsx +0 -192
- package/src/motion/springs.ts +0 -413
- package/src/motion/swap.tsx +0 -216
- package/src/motion/title-text.tsx +0 -74
- package/src/onboarding/ConnectProviderCard.tsx +0 -49
- package/src/onboarding/OnboardingFlow.tsx +0 -176
- package/src/onboarding/OnboardingProvider.tsx +0 -209
- package/src/onboarding/OnboardingStepFrame.tsx +0 -80
- package/src/onboarding/conversation.tsx +0 -179
- package/src/onboarding/demos/autonomy.tsx +0 -154
- package/src/onboarding/demos/extensions.tsx +0 -183
- package/src/onboarding/demos/features.tsx +0 -447
- package/src/onboarding/demos/how-it-works.tsx +0 -698
- package/src/onboarding/demos/index.ts +0 -11
- package/src/onboarding/demos/parts.tsx +0 -133
- package/src/onboarding/demos/tour.tsx +0 -217
- package/src/onboarding/headless/controller.ts +0 -110
- package/src/onboarding/headless/fixture-host.ts +0 -269
- package/src/onboarding/headless/fixtures.ts +0 -486
- package/src/onboarding/headless/host.ts +0 -176
- package/src/onboarding/headless/index.ts +0 -8
- package/src/onboarding/headless/labels.ts +0 -280
- package/src/onboarding/index.ts +0 -20
- package/src/onboarding/marks.tsx +0 -69
- package/src/onboarding/preview-attachments.ts +0 -39
- package/src/onboarding/skills/SkillSourceBrowser.tsx +0 -336
- package/src/onboarding/skills/parts.tsx +0 -440
- package/src/onboarding/steps/AutonomyStep.tsx +0 -128
- package/src/onboarding/steps/ConnectStep.tsx +0 -104
- package/src/onboarding/steps/ConnectorsStep.tsx +0 -226
- package/src/onboarding/steps/ConversationStep.tsx +0 -131
- package/src/onboarding/steps/ExtensionsStep.tsx +0 -113
- package/src/onboarding/steps/FeatureExample.tsx +0 -46
- package/src/onboarding/steps/FeaturesStep.tsx +0 -88
- package/src/onboarding/steps/ImportStep.tsx +0 -156
- package/src/onboarding/steps/LookStep.tsx +0 -276
- package/src/onboarding/steps/ReadyStep.tsx +0 -278
- package/src/onboarding/steps/SkillsStep.tsx +0 -45
- package/src/onboarding/steps/StepSection.tsx +0 -63
- package/src/onboarding/steps/Tradeoff.tsx +0 -45
- package/src/onboarding/steps/WelcomeStep.tsx +0 -147
- package/src/onboarding/steps/connect/KeyForm.tsx +0 -112
- package/src/onboarding/steps/connect/ProviderPanel.tsx +0 -149
- package/src/onboarding/steps/connect/ProviderReady.tsx +0 -171
- package/src/onboarding/steps/connect/ready-text.ts +0 -17
- package/src/onboarding/steps/index.ts +0 -12
- package/src/onboarding/steps/tasks.tsx +0 -84
- package/src/onboarding/testing/contract.ts +0 -472
- package/src/onboarding/testing/index.ts +0 -7
- package/src/onboarding/tutorials.tsx +0 -45
- package/src/onboarding/useSignIn.ts +0 -58
- package/src/palette/CommandPalette.tsx +0 -59
- package/src/palette/PaletteDialog.tsx +0 -186
- package/src/palette/PaletteProvider.tsx +0 -149
- package/src/palette/PaletteRows.tsx +0 -208
- package/src/palette/app-sources.ts +0 -62
- package/src/palette/headless/app-sources.ts +0 -515
- package/src/palette/headless/gather.ts +0 -50
- package/src/palette/headless/host.ts +0 -129
- package/src/palette/headless/index.ts +0 -15
- package/src/palette/headless/labels.ts +0 -124
- package/src/palette/headless/rank-protocol.ts +0 -23
- package/src/palette/headless/recents.ts +0 -35
- package/src/palette/headless/session-sources.ts +0 -218
- package/src/palette/headless/sources.ts +0 -313
- package/src/palette/headless/store.ts +0 -105
- package/src/palette/index.ts +0 -17
- package/src/palette/rank.worker.ts +0 -30
- package/src/palette/setup.ts +0 -19
- package/src/palette/testing/contract.ts +0 -250
- package/src/palette/testing/index.ts +0 -152
- package/src/palette/useConversationSearch.ts +0 -115
- package/src/palette/usePaletteController.ts +0 -229
- package/src/palette/useRankedItems.ts +0 -122
- package/src/path.ts +0 -165
- package/src/server/demo-tools.ts +0 -34
- package/src/server/environment.ts +0 -118
- package/src/server/index.ts +0 -7
- package/src/server/scripted-provider.ts +0 -174
- package/src/server/sse-handler.ts +0 -457
- package/src/server/testing/index.ts +0 -7
- package/src/session/ArtifactRowChips.tsx +0 -251
- package/src/session/ArtifactsPanel.tsx +0 -381
- package/src/session/DiffFileTree.tsx +0 -173
- package/src/session/PanelAttention.tsx +0 -131
- package/src/session/ProviderUsageProvider.tsx +0 -106
- package/src/session/QueueTab.tsx +0 -669
- package/src/session/RunningWorkDialog.tsx +0 -178
- package/src/session/SessionCacheFacts.tsx +0 -190
- package/src/session/SessionDetailsDialog.tsx +0 -621
- package/src/session/SessionHeader.tsx +0 -237
- package/src/session/SessionProvider.tsx +0 -98
- package/src/session/SessionShell.tsx +0 -77
- package/src/session/SideChat.tsx +0 -316
- package/src/session/TodoList.tsx +0 -123
- package/src/session/TodosPanel.tsx +0 -278
- package/src/session/TurnDetailsDialog.tsx +0 -299
- package/src/session/UsagePanel.tsx +0 -222
- package/src/session/WelcomeScreen.tsx +0 -578
- package/src/session/headless/artifacts.ts +0 -101
- package/src/session/headless/diff-tree.ts +0 -167
- package/src/session/headless/fixture-host.ts +0 -331
- package/src/session/headless/host.ts +0 -255
- package/src/session/headless/index.ts +0 -22
- package/src/session/headless/keyed.ts +0 -72
- package/src/session/headless/labels.ts +0 -321
- package/src/session/headless/queue-attachments.ts +0 -73
- package/src/session/headless/queue.ts +0 -122
- package/src/session/headless/running-work.ts +0 -85
- package/src/session/headless/session-actions.ts +0 -198
- package/src/session/headless/session-diffs.ts +0 -136
- package/src/session/headless/side.ts +0 -63
- package/src/session/headless/todos.ts +0 -62
- package/src/session/headless/usage-format.ts +0 -280
- package/src/session/headless/usage.ts +0 -380
- package/src/session/index.ts +0 -29
- package/src/session/testing/contract.ts +0 -579
- package/src/session/testing/demo.ts +0 -209
- package/src/session/testing/index.ts +0 -7
- package/src/session/useSessionLabels.ts +0 -14
- package/src/session/useUsageSummary.ts +0 -82
- package/src/settings/SettingsHeadingText.tsx +0 -54
- package/src/settings/SettingsHostSwitcher.tsx +0 -93
- package/src/settings/SettingsNav.tsx +0 -116
- package/src/settings/SettingsProvider.tsx +0 -127
- package/src/settings/SettingsRowsPage.tsx +0 -217
- package/src/settings/SettingsShell.tsx +0 -336
- package/src/settings/SettingsTutorial.tsx +0 -55
- package/src/settings/headless/catalog.ts +0 -553
- package/src/settings/headless/claude-import.ts +0 -61
- package/src/settings/headless/enabled.ts +0 -44
- package/src/settings/headless/fixture-accounts.ts +0 -260
- package/src/settings/headless/fixture-host.ts +0 -162
- package/src/settings/headless/fixture-models.ts +0 -51
- package/src/settings/headless/fixture-performance.ts +0 -350
- package/src/settings/headless/fixture-sections.ts +0 -323
- package/src/settings/headless/host.ts +0 -125
- package/src/settings/headless/index.ts +0 -22
- package/src/settings/headless/labels.ts +0 -63
- package/src/settings/headless/layout-sections.ts +0 -41
- package/src/settings/headless/layout.ts +0 -723
- package/src/settings/headless/mcp.ts +0 -319
- package/src/settings/headless/models.ts +0 -51
- package/src/settings/headless/page-counts.ts +0 -40
- package/src/settings/headless/performance.ts +0 -524
- package/src/settings/headless/providers.ts +0 -117
- package/src/settings/headless/registry.ts +0 -52
- package/src/settings/headless/resource.ts +0 -75
- package/src/settings/headless/search.ts +0 -142
- package/src/settings/headless/sections-host.ts +0 -307
- package/src/settings/index.ts +0 -32
- package/src/settings/rows.tsx +0 -152
- package/src/settings/section.tsx +0 -165
- package/src/settings/sections/appearance/AppearanceSection.tsx +0 -667
- package/src/settings/sections/appearance/labels.ts +0 -77
- package/src/settings/sections/claude-import/ClaudeImportDialog.tsx +0 -258
- package/src/settings/sections/claude-import/labels.ts +0 -42
- package/src/settings/sections/claude-import/use-claude-import-available.ts +0 -35
- package/src/settings/sections/descriptors.tsx +0 -261
- package/src/settings/sections/editor/EditorSection.tsx +0 -521
- package/src/settings/sections/editor/labels.ts +0 -84
- package/src/settings/sections/enabled-list/EnabledListSection.tsx +0 -112
- package/src/settings/sections/enabled-list/labels.ts +0 -37
- package/src/settings/sections/environments/EnvironmentsSection.tsx +0 -549
- package/src/settings/sections/environments/labels.ts +0 -31
- package/src/settings/sections/extensions/CreateExtensionDialog.tsx +0 -206
- package/src/settings/sections/extensions/ExtensionOptionsSection.tsx +0 -743
- package/src/settings/sections/extensions/ExtensionsSection.tsx +0 -480
- package/src/settings/sections/extensions/create-labels.ts +0 -31
- package/src/settings/sections/extensions/labels.ts +0 -38
- package/src/settings/sections/extensions/options-labels.ts +0 -31
- package/src/settings/sections/host-catalog/HostCatalogSection.tsx +0 -374
- package/src/settings/sections/host-catalog/labels.ts +0 -40
- package/src/settings/sections/index.ts +0 -58
- package/src/settings/sections/instructions/InstructionsSection.tsx +0 -381
- package/src/settings/sections/instructions/labels.ts +0 -33
- package/src/settings/sections/keybindings/KeybindingsSection.tsx +0 -124
- package/src/settings/sections/keybindings/labels.ts +0 -72
- package/src/settings/sections/keybindings/rows.ts +0 -103
- package/src/settings/sections/logs/LogsSection.tsx +0 -153
- package/src/settings/sections/logs/labels.ts +0 -20
- package/src/settings/sections/mcp/McpAddForm.tsx +0 -245
- package/src/settings/sections/mcp/McpSection.tsx +0 -358
- package/src/settings/sections/mcp/McpServerRow.tsx +0 -403
- package/src/settings/sections/mcp/labels.ts +0 -193
- package/src/settings/sections/models/AgentDefaults.tsx +0 -365
- package/src/settings/sections/models/ModelListPicker.tsx +0 -265
- package/src/settings/sections/models/ModelPickField.tsx +0 -220
- package/src/settings/sections/models/ModelRows.tsx +0 -381
- package/src/settings/sections/models/SpacesDefaultsSection.tsx +0 -102
- package/src/settings/sections/models/labels.ts +0 -119
- package/src/settings/sections/models/model-test.tsx +0 -125
- package/src/settings/sections/performance/PerfSparkline.tsx +0 -64
- package/src/settings/sections/performance/PerformanceHud.tsx +0 -110
- package/src/settings/sections/performance/PerformanceSection.tsx +0 -770
- package/src/settings/sections/performance/labels.ts +0 -114
- package/src/settings/sections/performance/use-perf-monitor.ts +0 -26
- package/src/settings/sections/plugins/PluginsSection.tsx +0 -148
- package/src/settings/sections/plugins/labels.ts +0 -23
- package/src/settings/sections/providers/CredentialSources.tsx +0 -237
- package/src/settings/sections/providers/ProvidersSection.tsx +0 -389
- package/src/settings/sections/providers/ServerProvidersSection.tsx +0 -244
- package/src/settings/sections/providers/ServerSignIn.tsx +0 -136
- package/src/settings/sections/providers/labels.ts +0 -160
- package/src/settings/sections/shared/catalog.tsx +0 -246
- package/src/settings/sections/shared/labels.ts +0 -31
- package/src/settings/sections/skills/SkillList.tsx +0 -494
- package/src/settings/sections/skills/SkillsSection.tsx +0 -249
- package/src/settings/sections/skills/labels.ts +0 -54
- package/src/settings/sections/use-section-labels.ts +0 -10
- package/src/settings/testing/accounts-demo.ts +0 -110
- package/src/settings/testing/accounts.contract.ts +0 -319
- package/src/settings/testing/claude-import.contract.ts +0 -93
- package/src/settings/testing/contract.ts +0 -192
- package/src/settings/testing/extension-options.contract.ts +0 -163
- package/src/settings/testing/index.ts +0 -11
- package/src/settings/testing/models.contract.ts +0 -135
- package/src/settings/testing/performance.contract.ts +0 -219
- package/src/settings/testing/sections.contract.ts +0 -306
- package/src/terminal/HostTerminalSurface.tsx +0 -911
- package/src/terminal/TerminalDrawer.tsx +0 -228
- package/src/terminal/TerminalPanel.tsx +0 -740
- package/src/terminal/TerminalProvider.tsx +0 -201
- package/src/terminal/TerminalSurface.tsx +0 -262
- package/src/terminal/box-glyphs.ts +0 -333
- package/src/terminal/ghostty.ts +0 -116
- package/src/terminal/grid-size.ts +0 -46
- package/src/terminal/headless/fixture-host.ts +0 -250
- package/src/terminal/headless/host.ts +0 -99
- package/src/terminal/headless/index.ts +0 -11
- package/src/terminal/headless/labels.ts +0 -69
- package/src/terminal/headless/layout.ts +0 -57
- package/src/terminal/headless/links.ts +0 -227
- package/src/terminal/headless/order.ts +0 -28
- package/src/terminal/headless/output-cursor.ts +0 -66
- package/src/terminal/headless/recent.ts +0 -20
- package/src/terminal/headless/replay.ts +0 -45
- package/src/terminal/headless/scope.ts +0 -60
- package/src/terminal/headless/store.ts +0 -621
- package/src/terminal/index.ts +0 -40
- package/src/terminal/keys.ts +0 -34
- package/src/terminal/testing/contract.ts +0 -274
- package/src/terminal/testing/demo.ts +0 -40
- package/src/terminal/testing/index.ts +0 -7
- package/src/terminal/theme.ts +0 -110
- package/src/terminal/useTerminalLabels.ts +0 -14
- package/src/theme/accents.ts +0 -46
- package/src/theme/color.ts +0 -450
- package/src/theme/css-vars.ts +0 -187
- package/src/theme/derive.ts +0 -700
- package/src/theme/from-theme.ts +0 -52
- package/src/theme/stylesheet.ts +0 -55
- package/src/theme/themes.ts +0 -767
- package/src/theme/without-transitions.ts +0 -18
- package/src/uno.ts +0 -167
- package/src/workspace/LayoutBudget.tsx +0 -143
- package/src/workspace/PanelContentView.tsx +0 -335
- package/src/workspace/PanelGroups.tsx +0 -249
- package/src/workspace/PanelStrip.tsx +0 -307
- package/src/workspace/SidePanel.tsx +0 -192
- package/src/workspace/TabParking.tsx +0 -111
- package/src/workspace/WorkspaceProvider.tsx +0 -554
- package/src/workspace/dnd/engine.ts +0 -371
- package/src/workspace/dnd/hooks.ts +0 -72
- package/src/workspace/dnd/index.ts +0 -57
- package/src/workspace/dnd/parking.tsx +0 -181
- package/src/workspace/frame-motion.ts +0 -160
- package/src/workspace/headless/contents.ts +0 -125
- package/src/workspace/headless/host.ts +0 -118
- package/src/workspace/headless/index.ts +0 -33
- package/src/workspace/headless/labels.ts +0 -34
- package/src/workspace/headless/layout-memory.ts +0 -649
- package/src/workspace/headless/layouts.ts +0 -224
- package/src/workspace/headless/open-target.ts +0 -125
- package/src/workspace/headless/ops.ts +0 -163
- package/src/workspace/headless/panel-focus.ts +0 -58
- package/src/workspace/headless/panel-tree.ts +0 -259
- package/src/workspace/headless/resolve.ts +0 -146
- package/src/workspace/headless/reveal-at.ts +0 -27
- package/src/workspace/headless/strip-drop.ts +0 -81
- package/src/workspace/headless/tree.ts +0 -480
- package/src/workspace/headless/view.ts +0 -159
- package/src/workspace/index.ts +0 -22
- package/src/workspace/panel-group-keys.ts +0 -36
- package/src/workspace/panel-visibility.ts +0 -28
- package/src/workspace/tab-scopes.ts +0 -245
- package/src/workspace/testing/contract.ts +0 -282
- package/src/workspace/testing/index.ts +0 -140
- package/src/workspace/use-split-drag.ts +0 -73
- package/src/workspace/useScopeLayout.ts +0 -26
- package/src/workspace/useViewport.ts +0 -22
- package/src/workspace/useWorkspaceLabels.ts +0 -14
- package/src/workspace/workspace-key-commands.ts +0 -108
- /package/dist/dist/{types-bDQagoiL.d.ts → types-2HrgolQz.d.ts} +0 -0
|
@@ -1,1036 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The desktop app's rich composer: a Tiptap editor set in the chatbox card,
|
|
3
|
-
* with `@` `/` `#` and extension completions, typed badges, inline ghost
|
|
4
|
-
* text and the next-prompt suggestion, shell (`!`) and transcript-search
|
|
5
|
-
* (`?`) modes, ↑/↓ prompt history, staged attachments, the shared
|
|
6
|
-
* per-session draft and the composer bus. Data comes from `ComposerHost`
|
|
7
|
-
* (`useComposerHost`); sending is the app's (`onSend`).
|
|
8
|
-
*
|
|
9
|
-
* Its modules: `use-composer-editor.ts` (the editor: `composer-extensions.ts`,
|
|
10
|
-
* `composer-keys.ts`), `use-ghost-lifecycle.ts`, `use-draft-mirror.ts`,
|
|
11
|
-
* `use-composer-sources.ts`, `use-composer-bus.ts`, `use-staged-attachments.ts`,
|
|
12
|
-
* `composer-controls.tsx`.
|
|
13
|
-
*/
|
|
14
|
-
import { EditorContent, useEditorState, type Editor } from '@tiptap/react';
|
|
15
|
-
import {
|
|
16
|
-
type ChangeEvent,
|
|
17
|
-
type ComponentType,
|
|
18
|
-
type CSSProperties,
|
|
19
|
-
type MouseEvent as ReactMouseEvent,
|
|
20
|
-
type ReactNode,
|
|
21
|
-
useEffect,
|
|
22
|
-
useLayoutEffect,
|
|
23
|
-
useMemo,
|
|
24
|
-
useRef,
|
|
25
|
-
useState,
|
|
26
|
-
} from 'react';
|
|
27
|
-
import { createSkillsCompletionProvider, type InlineGhost, uniqueSkillNamesFromReferences } from 'zidane/chat/pure';
|
|
28
|
-
|
|
29
|
-
import { useLightbox } from '../../components/Lightbox';
|
|
30
|
-
import { basename } from '../../path';
|
|
31
|
-
import { AttachmentNotices, attachmentLightboxItems } from '../composer/attachments';
|
|
32
|
-
import { type AttachmentLabelFn, AttachmentRow } from '../composer/AttachmentTiles';
|
|
33
|
-
import { useComposerHost, useComposerLabels } from '../composer/ComposerHostProvider';
|
|
34
|
-
import { usePromptHistory } from '../composer/PromptHistoryProvider';
|
|
35
|
-
import { plainTextToDocJson } from '../composer/prompt-history-nav';
|
|
36
|
-
import { composeSubmitText, type ComposerMode, unsentDraft } from '../headless/composer-modes';
|
|
37
|
-
import { findCommand } from '../headless/composer/commands';
|
|
38
|
-
import { draftTextToDocJson } from '../headless/composer/draft-sync';
|
|
39
|
-
import { editorJsonToMarkdown, type JsonNode } from '../headless/composer/editor-markdown';
|
|
40
|
-
import type { GhostController, PromptGhostOffer } from '../headless/composer/ghost-autocomplete';
|
|
41
|
-
import type { ComposerAttachment, ComposerCommandArgs } from '../headless/composer/host';
|
|
42
|
-
import type { ChatSiteIcons } from '../headless/transcript-host';
|
|
43
|
-
import type { TextPreviewSlotProps } from '../transcript/renderers';
|
|
44
|
-
import { badgeDecorationsKey, createBadgeDecorationsPlugin, refreshBadgeDecorations } from './badge-decorations';
|
|
45
|
-
import { MODE_CHIP, modeChipTone, PlusButton, SendStopButton } from './composer-controls';
|
|
46
|
-
import { ghostTextPluginKey } from './ghost-plugin';
|
|
47
|
-
import { createPopoverGate } from './mention-popover';
|
|
48
|
-
import { useComposerBus } from './use-composer-bus';
|
|
49
|
-
import { useComposerEditor } from './use-composer-editor';
|
|
50
|
-
import { useComposerSources } from './use-composer-sources';
|
|
51
|
-
import { serializeDraftText, useDraftMirror } from './use-draft-mirror';
|
|
52
|
-
import { type GhostLifecycle, useGhostLifecycle, useSharedGhost } from './use-ghost-lifecycle';
|
|
53
|
-
import { usePromptGhost } from './use-prompt-ghost';
|
|
54
|
-
import { useStagedAttachments } from './use-staged-attachments';
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Once-latch for the `useEditorState` selector's `getText()` catch —
|
|
58
|
-
* see the comment at the catch site. Module-level (not a ref) because
|
|
59
|
-
* the selector can run before any render commits, and one warning per
|
|
60
|
-
* app lifetime is the point.
|
|
61
|
-
*/
|
|
62
|
-
let warnedEditorGetText = false;
|
|
63
|
-
|
|
64
|
-
const NO_ARGS: ReadonlySet<string> = new Set();
|
|
65
|
-
|
|
66
|
-
/** Props for {@link RichComposer}. */
|
|
67
|
-
export interface RichComposerProps {
|
|
68
|
-
/** No folder picked: read-only, with its own placeholder. */
|
|
69
|
-
disabled: boolean;
|
|
70
|
-
/** The folder the session runs in (`''`: none; `null`: none picked yet). */
|
|
71
|
-
folderPath: string | null;
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Where `@` file mentions list from, when it isn't `folderPath`: a sandbox
|
|
75
|
-
* session's virtual root (`SidebarSession.workspace`).
|
|
76
|
-
*/
|
|
77
|
-
fileRoot?: string;
|
|
78
|
-
/** The session the composer writes to (`null`: a new chat). */
|
|
79
|
-
activeSessionId?: string | null;
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* The server the session (or the draft) runs on: `/` commands, their
|
|
83
|
-
* arguments and the ghost text come from it; this window's extension
|
|
84
|
-
* popups don't apply there. Absent = This computer.
|
|
85
|
-
*/
|
|
86
|
-
hostId?: string | null;
|
|
87
|
-
|
|
88
|
-
/** When true, the send button is replaced by a stop button that calls `onStop`. */
|
|
89
|
-
running?: boolean;
|
|
90
|
-
/** Stops the run. */
|
|
91
|
-
onStop?: () => void;
|
|
92
|
-
/** Sends a prompt. Rejecting puts the prompt back in an empty composer. */
|
|
93
|
-
onSend: (
|
|
94
|
-
text: string,
|
|
95
|
-
attachments: ComposerAttachment[],
|
|
96
|
-
skills: string[],
|
|
97
|
-
opts?: { keepDraft?: boolean },
|
|
98
|
-
) => void | Promise<void>;
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Rendered next to the `+` attachment button — typically the inline
|
|
102
|
-
* AgentPicker. Kept as a slot so the Chatbox doesn't need to know
|
|
103
|
-
* which app-level controls the user wants inline.
|
|
104
|
-
*/
|
|
105
|
-
leadingActions?: React.ReactNode;
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Rendered on the right side of the controls row, immediately before
|
|
109
|
-
* the Send / Stop button — the per-session context gauge + cost pill
|
|
110
|
-
* cluster lives here. Slot keeps Chatbox agnostic of the actual
|
|
111
|
-
* pills (App.tsx owns the state, Center.tsx threads the node in).
|
|
112
|
-
* Children are responsible for their own collapse behavior; the
|
|
113
|
-
* Chatbox surface declares a CSS container so container queries on
|
|
114
|
-
* descendants can react to the prompt's inline-size.
|
|
115
|
-
*/
|
|
116
|
-
trailingActions?: React.ReactNode;
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* The badge strip (`ConversationBadges`, the kit's `ComposerBadges`): the
|
|
120
|
-
* band at the top of the tray ring, above the card, the git bar's mirror.
|
|
121
|
-
* Built by `ConversationComposer`, so a keystroke here never re-renders it.
|
|
122
|
-
*/
|
|
123
|
-
badges?: React.ReactNode;
|
|
124
|
-
|
|
125
|
-
/*
|
|
126
|
-
* ---- `?` transcript-search mode (TUI parity) --------------------
|
|
127
|
-
* The Chatbox owns the MODE (entered by typing `?` into an empty
|
|
128
|
-
* composer, exited by Esc / Backspace-at-start); the host owns the
|
|
129
|
-
* search ENGINE (`useTranscriptSearch` needs the transcript's scroll
|
|
130
|
-
* container + events, which live in Center). Query changes stream
|
|
131
|
-
* out through `onSearchQueryChange` (`null` = mode exited), match
|
|
132
|
-
* hops go through `onSearchNavigate`, and the counter state comes
|
|
133
|
-
* back in as `searchStatus`.
|
|
134
|
-
*/
|
|
135
|
-
/** The search engine's counter while in search mode: matches, whether capped, the active one, whether a query is typed. */
|
|
136
|
-
searchStatus?: { count: number; capped: boolean; activeIndex: number; hasNeedle: boolean } | null;
|
|
137
|
-
/** The search query as typed (`null`: search mode exited). */
|
|
138
|
-
onSearchQueryChange?: (query: string | null) => void;
|
|
139
|
-
/** Hops to the next (`1`) or previous (`-1`) match. */
|
|
140
|
-
onSearchNavigate?: (direction: 1 | -1) => void;
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* True while the ⌘F overlay is open. The overlay and the composer
|
|
144
|
-
* mode drive the same document-wide highlight registry, so opening
|
|
145
|
-
* the overlay force-exits the composer's search mode.
|
|
146
|
-
*/
|
|
147
|
-
searchOverlayOpen?: boolean;
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Shared-search application (daemon mode) — Center threads the active
|
|
151
|
-
* session's `search:changed` signals here so the composer's `?` mode
|
|
152
|
-
* mirrors a search driven from another window. `seq` forces the apply
|
|
153
|
-
* effect to re-fire on every signal (values alone can repeat).
|
|
154
|
-
*/
|
|
155
|
-
remoteSearchApply?: { active: boolean; query: string; seq: number } | null;
|
|
156
|
-
/** Pasted and dropped files become attachments (off: images and long pastes stay inline, drops are ignored). Default true. */
|
|
157
|
-
attachmentsEnabled?: boolean;
|
|
158
|
-
/** Inline ghost-text autocomplete (`ComposerHost.autocomplete`). Default false. */
|
|
159
|
-
inlineAutocomplete?: boolean;
|
|
160
|
-
/** The next-prompt suggestion as a ghost while the composer is empty (`ComposerHost.suggestions`). Default false. */
|
|
161
|
-
promptSuggestions?: boolean;
|
|
162
|
-
/** The composer's scope on the composer bus (`composer-bus.ts`): pushes aimed at it land here. */
|
|
163
|
-
scopeKey?: string | null;
|
|
164
|
-
/** The commands' fixed argument values (the command badge, the `/` popover's arguments). */
|
|
165
|
-
commandArgs?: ComposerCommandArgs;
|
|
166
|
-
/** Site icons for link badges. Absent: links show the globe. */
|
|
167
|
-
siteIcons?: ChatSiteIcons;
|
|
168
|
-
/** The icon and name an attachment tile shows. */
|
|
169
|
-
attachmentLabel?: AttachmentLabelFn;
|
|
170
|
-
/** What a text attachment opens as in the lightbox. Default: the kit's `TextPreview`. */
|
|
171
|
-
textPreview?: ComponentType<TextPreviewSlotProps>;
|
|
172
|
-
/** Rendered in the tray under the card (the desktop app's git bar). */
|
|
173
|
-
footer?: ReactNode;
|
|
174
|
-
/** Classes merged on the root. */
|
|
175
|
-
className?: string;
|
|
176
|
-
/** Styles on the root. */
|
|
177
|
-
style?: CSSProperties;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* Search-mode tint — the TUI paints its search-mode prompt border with
|
|
182
|
-
* `COLOR.warn`; the GUI uses the themable `--zg-warn` token (tokens.css
|
|
183
|
-
* defaults it to amber, theme packs can override). Shell mode reuses the
|
|
184
|
-
* accent, exactly like the TUI.
|
|
185
|
-
*/
|
|
186
|
-
const SEARCH_MODE_COLOR = 'var(--zg-warn)';
|
|
187
|
-
|
|
188
|
-
/** What the composer's editor-state selector returns for a non-empty draft outside search mode. */
|
|
189
|
-
const DRAFT_HAS_TEXT = '\u0000draft';
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* The desktop app's composer card: the editor, its completions and modes, staged attachments and Send / Stop.
|
|
193
|
-
*
|
|
194
|
-
* @param props - What the composer edits and sends, and its slots.
|
|
195
|
-
*/
|
|
196
|
-
export function RichComposer({
|
|
197
|
-
disabled,
|
|
198
|
-
folderPath,
|
|
199
|
-
fileRoot,
|
|
200
|
-
activeSessionId = null,
|
|
201
|
-
hostId = null,
|
|
202
|
-
running = false,
|
|
203
|
-
onStop,
|
|
204
|
-
onSend,
|
|
205
|
-
leadingActions,
|
|
206
|
-
trailingActions,
|
|
207
|
-
badges,
|
|
208
|
-
searchStatus = null,
|
|
209
|
-
onSearchQueryChange,
|
|
210
|
-
onSearchNavigate,
|
|
211
|
-
searchOverlayOpen = false,
|
|
212
|
-
remoteSearchApply = null,
|
|
213
|
-
attachmentsEnabled = true,
|
|
214
|
-
inlineAutocomplete = false,
|
|
215
|
-
promptSuggestions = false,
|
|
216
|
-
scopeKey = null,
|
|
217
|
-
commandArgs,
|
|
218
|
-
siteIcons,
|
|
219
|
-
attachmentLabel,
|
|
220
|
-
textPreview,
|
|
221
|
-
footer,
|
|
222
|
-
className,
|
|
223
|
-
style,
|
|
224
|
-
}: RichComposerProps) {
|
|
225
|
-
const { completions, autocomplete } = useComposerHost();
|
|
226
|
-
const labels = useComposerLabels();
|
|
227
|
-
|
|
228
|
-
/*
|
|
229
|
-
* Prompt history — the provider owns the per-session ring (draft
|
|
230
|
-
* stash, cursor, persistence); the Chatbox owns the keyboard edge
|
|
231
|
-
* conditions and the "history N/M" indicator.
|
|
232
|
-
*/
|
|
233
|
-
const history = usePromptHistory();
|
|
234
|
-
const [historyStatus, setHistoryStatus] = useState<{ position: number; total: number } | null>(null);
|
|
235
|
-
|
|
236
|
-
/*
|
|
237
|
-
* `editorRef` exposes the live TipTap editor to closures captured by
|
|
238
|
-
* `editorProps.handleKeyDown` (which is evaluated when `useEditor`
|
|
239
|
-
* builds the editor — at that point the `editor` const itself is still
|
|
240
|
-
* undefined). The ref is wired below via `useEffect`.
|
|
241
|
-
*/
|
|
242
|
-
const editorRef = useRef<Editor | null>(null);
|
|
243
|
-
// TipTap's destroy() nulls the command manager while the ref still holds the
|
|
244
|
-
// editor: `editor.commands` then throws. Effects reach the editor through this.
|
|
245
|
-
const liveEditor = () => {
|
|
246
|
-
const ed = editorRef.current;
|
|
247
|
-
return ed && !ed.isDestroyed ? ed : null;
|
|
248
|
-
};
|
|
249
|
-
|
|
250
|
-
/*
|
|
251
|
-
* Completion catalogs (`chatbox/use-composer-sources.ts`): one stable handle
|
|
252
|
-
* the editor's callbacks read per call (the popover re-renders itself,
|
|
253
|
-
* `chatbox/mention-popover.ts`). A commands or skills change re-reads the
|
|
254
|
-
* typed `/name` badges.
|
|
255
|
-
*/
|
|
256
|
-
const [refreshBadges] = useState(() => () => {
|
|
257
|
-
const ed = editorRef.current;
|
|
258
|
-
if (ed && !ed.isDestroyed) refreshBadgeDecorations(ed.view);
|
|
259
|
-
});
|
|
260
|
-
const { sources, providers: extensionCompletionProviders } = useComposerSources(
|
|
261
|
-
folderPath,
|
|
262
|
-
fileRoot ?? null,
|
|
263
|
-
hostId,
|
|
264
|
-
refreshBadges,
|
|
265
|
-
);
|
|
266
|
-
const [mentionPopovers] = useState(createPopoverGate);
|
|
267
|
-
const staged = useStagedAttachments();
|
|
268
|
-
const {
|
|
269
|
-
attachments,
|
|
270
|
-
setAttachments,
|
|
271
|
-
addFiles: addAttachmentFiles,
|
|
272
|
-
replace: replaceAttachments,
|
|
273
|
-
notices: attachmentNotices,
|
|
274
|
-
exitingIds,
|
|
275
|
-
removeAttachment,
|
|
276
|
-
finalizeRemove,
|
|
277
|
-
} = staged;
|
|
278
|
-
// Synchronous re-entry guard: React state updates flush async, so two rapid
|
|
279
|
-
// Enter presses could both pass a state check across the submit-hook await.
|
|
280
|
-
// A ref claimed synchronously closes that window; `submitting` state only
|
|
281
|
-
// drives the button's disabled visual.
|
|
282
|
-
const submittingRef = useRef(false);
|
|
283
|
-
const [submitting, setSubmitting] = useState(false);
|
|
284
|
-
|
|
285
|
-
/*
|
|
286
|
-
* Composer prompt mode — TUI parity (src/tui/prompt/). `!` typed
|
|
287
|
-
* into an empty composer enters SHELL mode (the bang is consumed;
|
|
288
|
-
* submit re-attaches it), `?` enters transcript-SEARCH mode (the
|
|
289
|
-
* draft drives the host's match engine). Stateful — NOT derived from
|
|
290
|
-
* the draft text — so the sentinel never sits in the buffer and
|
|
291
|
-
* pasted/recalled `!cmd` stays literal.
|
|
292
|
-
*
|
|
293
|
-
* `modeRef` is the synchronous mirror for the `editorProps.handleKeyDown`
|
|
294
|
-
* closure (captured at `useEditor` build time) and for same-tick
|
|
295
|
-
* reads after a flip — the TUI's `setShellModeNow` pattern.
|
|
296
|
-
*/
|
|
297
|
-
const [composerMode, setComposerMode] = useState<ComposerMode>('normal');
|
|
298
|
-
const modeRef = useRef<ComposerMode>('normal');
|
|
299
|
-
|
|
300
|
-
/*
|
|
301
|
-
* Edit-less ghost-gate transitions (popover closed, prompt mode
|
|
302
|
-
* flipped, setting toggled) re-evaluate the ghost through here —
|
|
303
|
-
* assigned by the ghost lifecycle effect below, no-op until the
|
|
304
|
-
* editor mounts. The TUI gets this for free from its trigger effect's
|
|
305
|
-
* dependency list (`useInlineGhostQuery`, src/tui/prompt/use-inline-ghost-query.ts);
|
|
306
|
-
* the GUI's transaction listener
|
|
307
|
-
* only sees edits, so the gate-flag owners call this explicitly.
|
|
308
|
-
*/
|
|
309
|
-
const ghostGateChangedRef = useRef<() => void>(() => {});
|
|
310
|
-
|
|
311
|
-
const applyMode = (next: ComposerMode) => {
|
|
312
|
-
const prev = modeRef.current;
|
|
313
|
-
|
|
314
|
-
if (prev === next) {
|
|
315
|
-
return;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
modeRef.current = next;
|
|
319
|
-
setComposerMode(next);
|
|
320
|
-
|
|
321
|
-
/*
|
|
322
|
-
* Search mode is a live wire to the host's engine: entering opens
|
|
323
|
-
* the (empty) query, leaving sends `null` so the host clears the
|
|
324
|
-
* highlights + counter.
|
|
325
|
-
*/
|
|
326
|
-
if (next === 'search') {
|
|
327
|
-
live.current.onSearchQueryChange?.('');
|
|
328
|
-
} else if (prev === 'search') {
|
|
329
|
-
live.current.onSearchQueryChange?.(null);
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
/*
|
|
333
|
-
* The mode is a ghost-gate input that just flipped WITHOUT an edit
|
|
334
|
-
* — e.g. shell mode exiting on Backspace-at-start keeps the buffer.
|
|
335
|
-
* The TUI's trigger effect re-runs on `shellMode`/`searchMode`
|
|
336
|
-
* (`useInlineGhostQuery`, src/tui/prompt/use-inline-ghost-query.ts)
|
|
337
|
-
* and re-queries; mirror that here.
|
|
338
|
-
*/
|
|
339
|
-
ghostGateChangedRef.current();
|
|
340
|
-
};
|
|
341
|
-
|
|
342
|
-
/*
|
|
343
|
-
* ---- Inline ghost-text autocomplete (TUI parity) -----------------
|
|
344
|
-
* State is a ref + a ProseMirror plugin, not React state: the ghost
|
|
345
|
-
* changes per keystroke and is consumed by `editorProps.handleKeyDown`
|
|
346
|
-
* (captured at `useEditor` build time) and painted by the plugin's
|
|
347
|
-
* decoration — a re-render would buy nothing. `applyGhost` keeps the
|
|
348
|
-
* ref and the plugin's display string in lockstep. The canonical
|
|
349
|
-
* provider engine runs main-side behind `autocomplete:inline`; the
|
|
350
|
-
* snapshot/patch machinery is the canonical `patchInlineGhost`
|
|
351
|
-
* (core `zidane/chat/pure`, `inline-ghost.ts`).
|
|
352
|
-
*/
|
|
353
|
-
const ghostRef = useRef<InlineGhost | null>(null);
|
|
354
|
-
// Bumped per transaction — an IPC reply whose sequence is stale is
|
|
355
|
-
// dropped (latest-wins), the renderer half of the TUI's abort-on-edit
|
|
356
|
-
// (`useInlineGhostQuery`, src/tui/prompt/use-inline-ghost-query.ts).
|
|
357
|
-
const inlineAutocompleteEnabled = !disabled && inlineAutocomplete;
|
|
358
|
-
// True only while a prompt-history recall's own setContent/focus
|
|
359
|
-
// transactions run — browsing history must not pop ghosts, but editing
|
|
360
|
-
// the recalled text afterwards queries normally.
|
|
361
|
-
const historyRecallRef = useRef(false);
|
|
362
|
-
|
|
363
|
-
// The next-prompt suggestion rides the same ghost plugin while the doc is empty (`chatbox/use-prompt-ghost.ts`).
|
|
364
|
-
const promptGhost = usePromptGhost(activeSessionId, running, !disabled && promptSuggestions, () =>
|
|
365
|
-
ghostGateChangedRef.current(),
|
|
366
|
-
);
|
|
367
|
-
|
|
368
|
-
const applyGhost = (next: InlineGhost | null, prompt?: PromptGhostOffer) => {
|
|
369
|
-
ghostRef.current = next;
|
|
370
|
-
promptGhost.setPainted(next ? (prompt ?? null) : null);
|
|
371
|
-
|
|
372
|
-
const ed = editorRef.current;
|
|
373
|
-
|
|
374
|
-
if (!ed || ed.isDestroyed) {
|
|
375
|
-
return;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
const display = next ? next.suffixes[next.index] : null;
|
|
379
|
-
|
|
380
|
-
if (ghostTextPluginKey.getState(ed.state) !== display) {
|
|
381
|
-
ed.view.dispatch(ed.state.tr.setMeta(ghostTextPluginKey, display));
|
|
382
|
-
}
|
|
383
|
-
};
|
|
384
|
-
|
|
385
|
-
// Read by callbacks registered once (editor plugins, IPC listeners, mount-keyed effects): current as of the last commit.
|
|
386
|
-
const live = useRef({
|
|
387
|
-
activeSessionId,
|
|
388
|
-
folderPath,
|
|
389
|
-
hostId,
|
|
390
|
-
inlineAutocompleteEnabled,
|
|
391
|
-
onSearchQueryChange,
|
|
392
|
-
applyMode,
|
|
393
|
-
applyGhost,
|
|
394
|
-
});
|
|
395
|
-
useLayoutEffect(() => {
|
|
396
|
-
live.current = {
|
|
397
|
-
activeSessionId,
|
|
398
|
-
folderPath,
|
|
399
|
-
hostId,
|
|
400
|
-
inlineAutocompleteEnabled,
|
|
401
|
-
onSearchQueryChange,
|
|
402
|
-
applyMode,
|
|
403
|
-
applyGhost,
|
|
404
|
-
};
|
|
405
|
-
});
|
|
406
|
-
// Live controller handle for the remote-mirror path — its `hasPending()`
|
|
407
|
-
// is the "this window is the active typist" test.
|
|
408
|
-
const ghostControllerRef = useRef<GhostController | null>(null);
|
|
409
|
-
|
|
410
|
-
const [isDragOver, setIsDragOver] = useState(false);
|
|
411
|
-
const lightbox = useLightbox();
|
|
412
|
-
const openLightbox = (id: string, origin: HTMLElement) => {
|
|
413
|
-
const items = attachmentLightboxItems(attachments, textPreview);
|
|
414
|
-
lightbox.open(
|
|
415
|
-
items,
|
|
416
|
-
items.findIndex((item) => item.key === id),
|
|
417
|
-
origin,
|
|
418
|
-
);
|
|
419
|
-
};
|
|
420
|
-
const fileInputRef = useRef<HTMLInputElement>(null);
|
|
421
|
-
|
|
422
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps -- stable handles (refs, built-once sources and host); the effect keys on what it re-runs for
|
|
423
|
-
const skillsProvider = useMemo(() => createSkillsCompletionProvider({ getCatalog: () => sources.skills() }), []);
|
|
424
|
-
|
|
425
|
-
const editor = useComposerEditor({
|
|
426
|
-
disabled,
|
|
427
|
-
folderPath,
|
|
428
|
-
extensionCompletionProviders,
|
|
429
|
-
sources,
|
|
430
|
-
skillsProvider,
|
|
431
|
-
mentionPopovers,
|
|
432
|
-
promptGhost,
|
|
433
|
-
editorRef,
|
|
434
|
-
modeRef,
|
|
435
|
-
ghostRef,
|
|
436
|
-
historyRecallRef,
|
|
437
|
-
ghostGateChangedRef,
|
|
438
|
-
attachmentsEnabled,
|
|
439
|
-
history,
|
|
440
|
-
activeSessionId,
|
|
441
|
-
hostId,
|
|
442
|
-
// Declared below: it reads the editor.
|
|
443
|
-
send: () => send(),
|
|
444
|
-
onSearchNavigate,
|
|
445
|
-
applyMode,
|
|
446
|
-
applyGhost,
|
|
447
|
-
addFiles: addAttachmentFiles,
|
|
448
|
-
setHistoryStatus,
|
|
449
|
-
commandArgs,
|
|
450
|
-
});
|
|
451
|
-
|
|
452
|
-
/*
|
|
453
|
-
* Mirror `editor` into `editorRef` so the `editorProps.handleKeyDown`
|
|
454
|
-
* closure can reach the live TipTap commands API (e.g. for the
|
|
455
|
-
* history-cycle setContent). `useEditor` returns a fresh instance
|
|
456
|
-
* when its deps change, so we re-pin each render.
|
|
457
|
-
*/
|
|
458
|
-
useEffect(() => {
|
|
459
|
-
editorRef.current = editor;
|
|
460
|
-
}, [editor]);
|
|
461
|
-
|
|
462
|
-
// Links and a leading command's `/name` read as badges while typed (see badge-decorations.ts).
|
|
463
|
-
useEffect(() => {
|
|
464
|
-
if (!editor || editor.isDestroyed) {
|
|
465
|
-
return;
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
const scope = () => ({ cwd: live.current.folderPath ?? '', hostId: live.current.hostId });
|
|
469
|
-
editor.registerPlugin(
|
|
470
|
-
createBadgeDecorationsPlugin(
|
|
471
|
-
{
|
|
472
|
-
isCommand: (name) => findCommand(sources.commands.peek(), name) !== undefined,
|
|
473
|
-
args: (name) => commandArgs?.args(scope(), name) ?? NO_ARGS,
|
|
474
|
-
request: (name) => commandArgs?.request(scope(), name),
|
|
475
|
-
...(commandArgs ? { subscribe: (listener: () => void) => commandArgs.subscribe(listener) } : {}),
|
|
476
|
-
isSkill: (name) => sources.skills().some((skill) => skill.name === name),
|
|
477
|
-
},
|
|
478
|
-
siteIcons,
|
|
479
|
-
),
|
|
480
|
-
);
|
|
481
|
-
|
|
482
|
-
return () => {
|
|
483
|
-
if (!editor.isDestroyed) {
|
|
484
|
-
editor.unregisterPlugin(badgeDecorationsKey);
|
|
485
|
-
}
|
|
486
|
-
};
|
|
487
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps -- stable handles (refs, built-once sources and host); the effect keys on what it re-runs for
|
|
488
|
-
}, [editor]);
|
|
489
|
-
|
|
490
|
-
const ghost: GhostLifecycle = {
|
|
491
|
-
editor,
|
|
492
|
-
editorRef,
|
|
493
|
-
live,
|
|
494
|
-
autocomplete,
|
|
495
|
-
inlineAutocompleteEnabled,
|
|
496
|
-
mentionPopovers,
|
|
497
|
-
modeRef,
|
|
498
|
-
historyRecallRef,
|
|
499
|
-
ghostRef,
|
|
500
|
-
promptGhost,
|
|
501
|
-
ghostGateChangedRef,
|
|
502
|
-
ghostControllerRef,
|
|
503
|
-
};
|
|
504
|
-
useGhostLifecycle(ghost);
|
|
505
|
-
|
|
506
|
-
/*
|
|
507
|
-
* Fresh session, fresh navigation: a cursor parked by an earlier
|
|
508
|
-
* visit shouldn't make the first ↑ resume mid-ring, and the "history
|
|
509
|
-
* N/M" indicator belongs to the session it was navigating.
|
|
510
|
-
*/
|
|
511
|
-
useEffect(() => {
|
|
512
|
-
// eslint-disable-next-line react-hooks/set-state-in-effect -- resets with the scope it keys on
|
|
513
|
-
setHistoryStatus(null);
|
|
514
|
-
|
|
515
|
-
if (activeSessionId) {
|
|
516
|
-
history.reset(activeSessionId);
|
|
517
|
-
}
|
|
518
|
-
}, [activeSessionId, history]);
|
|
519
|
-
|
|
520
|
-
const send = () => {
|
|
521
|
-
if (!editor) {
|
|
522
|
-
return;
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
/*
|
|
526
|
-
* Serialize through the JSON walker rather than `getText()` (which drops
|
|
527
|
-
* the mention nodes' ids), with ONE newline per line
|
|
528
|
-
* break: the prompt is sent, stored, shown and recalled exactly as it
|
|
529
|
-
* looks in the composer. The markdown paragraph gap (`\n\n` per block)
|
|
530
|
-
* doubled every line break and tripled every blank line in the
|
|
531
|
-
* transcript, the TUI and ↑ history recall.
|
|
532
|
-
*/
|
|
533
|
-
const raw = editorJsonToMarkdown(editor.getJSON() as JsonNode, { blockGap: '\n' }).trim();
|
|
534
|
-
|
|
535
|
-
/*
|
|
536
|
-
* Shell mode re-attaches the consumed bang so the submit contract
|
|
537
|
-
* stays `!cmd` end to end (Center's handleSend + prompt history —
|
|
538
|
-
* TUI `submit` in src/tui/prompt/use-composer-actions.ts). A blank
|
|
539
|
-
* shell command never submits,
|
|
540
|
-
* even with attachments staged; search mode never submits at all.
|
|
541
|
-
*/
|
|
542
|
-
const text = composeSubmitText(modeRef.current, raw);
|
|
543
|
-
|
|
544
|
-
if (text === null || (!text && attachments.length === 0) || disabled || submittingRef.current) {
|
|
545
|
-
return;
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
// Submit leaves shell mode — the next prompt starts normal (TUI
|
|
549
|
-
// `submit` in src/tui/prompt/use-composer-actions.ts).
|
|
550
|
-
live.current.applyMode('normal');
|
|
551
|
-
|
|
552
|
-
const submitted = attachments;
|
|
553
|
-
|
|
554
|
-
// Clear the composer optimistically: the box empties on the same tick the
|
|
555
|
-
// user hits Enter, and a second Enter can't re-submit the same text while
|
|
556
|
-
// the submit-hook IPC is in flight.
|
|
557
|
-
editor.commands.clearContent();
|
|
558
|
-
replaceAttachments([]);
|
|
559
|
-
mirror.dropStash();
|
|
560
|
-
// Submitting exits history navigation (the host's `push` resets the
|
|
561
|
-
// provider cursor); drop the indicator on the same tick.
|
|
562
|
-
setHistoryStatus(null);
|
|
563
|
-
dispatch(text, submitted);
|
|
564
|
-
};
|
|
565
|
-
|
|
566
|
-
/*
|
|
567
|
-
* A prompt sent from elsewhere (Continue / Retry, the palette): the same
|
|
568
|
-
* dispatch as Enter, without reading or clearing the composer.
|
|
569
|
-
*/
|
|
570
|
-
const sendText = (raw: string) => {
|
|
571
|
-
const text = raw.trim();
|
|
572
|
-
if (!text || disabled || submittingRef.current) {
|
|
573
|
-
return;
|
|
574
|
-
}
|
|
575
|
-
dispatch(text, [], { keepDraft: true });
|
|
576
|
-
};
|
|
577
|
-
|
|
578
|
-
const dispatch = (text: string, submitted: typeof attachments, opts?: { keepDraft?: boolean }) => {
|
|
579
|
-
/*
|
|
580
|
-
* Submit-time skill activation. `parseReferences` runs against the
|
|
581
|
-
* editor's rendered plain text — TipTap mention nodes serialize back
|
|
582
|
-
* to `/<name>` / `@<path>` / `#<chat>`, matching the chat providers'
|
|
583
|
-
* reference grammars. Same code path the TUI calls before `agent.run()`.
|
|
584
|
-
*/
|
|
585
|
-
const references = skillsProvider.parseReferences(text, { text, cursor: text.length });
|
|
586
|
-
const skills = uniqueSkillNamesFromReferences(references);
|
|
587
|
-
mirror.promoteNewChat(live.current.activeSessionId === null);
|
|
588
|
-
submittingRef.current = true;
|
|
589
|
-
setSubmitting(true);
|
|
590
|
-
|
|
591
|
-
// Run extension submit hooks (resolveReferences/onSubmit) before the turn
|
|
592
|
-
// is dispatched so their side effects land first, then send.
|
|
593
|
-
void (async () => {
|
|
594
|
-
try {
|
|
595
|
-
if (folderPath !== null) {
|
|
596
|
-
await completions?.submit?.({ cwd: folderPath, hostId }, text, text.length).catch(() => undefined);
|
|
597
|
-
}
|
|
598
|
-
await onSend(text, submitted, skills, opts);
|
|
599
|
-
} catch {
|
|
600
|
-
/*
|
|
601
|
-
* Not sent (the host says why, e.g. a new chat's server went
|
|
602
|
-
* offline): the box was cleared on Enter, so put the prompt back,
|
|
603
|
-
* unless something was typed since or it came from elsewhere.
|
|
604
|
-
*/
|
|
605
|
-
mirror.promoteNewChat(false);
|
|
606
|
-
const ed = editorRef.current;
|
|
607
|
-
if (!opts?.keepDraft && ed && !ed.isDestroyed && serializeDraftText(ed) === '') {
|
|
608
|
-
const draft = unsentDraft(text);
|
|
609
|
-
mirror.applyDraft(draft.text, draft.shell);
|
|
610
|
-
setAttachments((current) => (current.length === 0 ? [...submitted] : current));
|
|
611
|
-
}
|
|
612
|
-
} finally {
|
|
613
|
-
submittingRef.current = false;
|
|
614
|
-
setSubmitting(false);
|
|
615
|
-
}
|
|
616
|
-
})();
|
|
617
|
-
};
|
|
618
|
-
|
|
619
|
-
/*
|
|
620
|
-
* Live plain-text mirror of the draft. TipTap v3's `useEditor` does
|
|
621
|
-
* NOT re-render the host component on transactions (its internal
|
|
622
|
-
* `shouldRerenderOnTransaction` selector short-circuits to `null`
|
|
623
|
-
* when the option is unset), so render-time `editor.getText()` reads
|
|
624
|
-
* — as a draft-derived `hasContent` or shell flag would do — only
|
|
625
|
-
* ever see the state from the LAST unrelated re-render, so the send
|
|
626
|
-
* button and the `!` affordance would look dead while typing.
|
|
627
|
-
* `useEditorState` subscribes to transactions and re-renders
|
|
628
|
-
* exactly when the selected string changes.
|
|
629
|
-
*
|
|
630
|
-
* Outside search mode only emptiness is selected (`DRAFT_HAS_TEXT`), so
|
|
631
|
-
* the composer does not re-render on every keystroke for a send button
|
|
632
|
-
* that only cares whether there is anything to send. Search mode selects
|
|
633
|
-
* the text itself (it drives the match engine per edit).
|
|
634
|
-
*/
|
|
635
|
-
const searchingDraft = composerMode === 'search';
|
|
636
|
-
const editorPlainText =
|
|
637
|
-
useEditorState({
|
|
638
|
-
editor,
|
|
639
|
-
/*
|
|
640
|
-
* Defensive beyond the null check: on the very first render the
|
|
641
|
-
* editor INSTANCE can exist while its state/schema is still being
|
|
642
|
-
* constructed — `getText()` then dereferences a null schema inside
|
|
643
|
-
* `getTextSerializersFromSchema` and the whole app white-screens
|
|
644
|
-
* (this exact crash shipped once; caught by the e2e launch test).
|
|
645
|
-
* A mid-construction snapshot is worthless anyway: the store
|
|
646
|
-
* notifies again the moment the editor is ready.
|
|
647
|
-
*/
|
|
648
|
-
selector: (ctx) => {
|
|
649
|
-
const ed = ctx.editor;
|
|
650
|
-
|
|
651
|
-
if (!ed || ed.isDestroyed) {
|
|
652
|
-
return '';
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
try {
|
|
656
|
-
const text = ed.getText({ blockSeparator: '\n' });
|
|
657
|
-
if (searchingDraft) return text;
|
|
658
|
-
return text.trim().length > 0 ? DRAFT_HAS_TEXT : '';
|
|
659
|
-
} catch (error) {
|
|
660
|
-
/*
|
|
661
|
-
* Once-latched: the selector runs per transaction, so an
|
|
662
|
-
* editor whose serialization is persistently broken would
|
|
663
|
-
* otherwise spam a warn per keystroke — but swallowing
|
|
664
|
-
* silently forever hides the breakage (send button dead with
|
|
665
|
-
* no trace). One warning is enough to diagnose.
|
|
666
|
-
*/
|
|
667
|
-
if (!warnedEditorGetText) {
|
|
668
|
-
warnedEditorGetText = true;
|
|
669
|
-
console.warn('[chatbox] editor.getText() threw; treating the draft as empty.', error);
|
|
670
|
-
}
|
|
671
|
-
|
|
672
|
-
return '';
|
|
673
|
-
}
|
|
674
|
-
},
|
|
675
|
-
}) ?? '';
|
|
676
|
-
|
|
677
|
-
const hasContent = editorPlainText.trim().length > 0 || attachments.length > 0;
|
|
678
|
-
const canSend = !disabled && !submitting && hasContent && composerMode !== 'search';
|
|
679
|
-
|
|
680
|
-
const shellMode = !disabled && composerMode === 'shell';
|
|
681
|
-
const searchMode = !disabled && composerMode === 'search';
|
|
682
|
-
|
|
683
|
-
/*
|
|
684
|
-
* Search mode is a live wire: every draft edit re-drives the host's
|
|
685
|
-
* match engine (TUI parity — `syncBuffer` pushes `onSearchQueryChange`
|
|
686
|
-
* per keystroke, src/tui/prompt/use-sync-buffer.ts).
|
|
687
|
-
*/
|
|
688
|
-
useEffect(() => {
|
|
689
|
-
if (composerMode === 'search') {
|
|
690
|
-
live.current.onSearchQueryChange?.(editorPlainText);
|
|
691
|
-
}
|
|
692
|
-
}, [composerMode, editorPlainText]);
|
|
693
|
-
|
|
694
|
-
/*
|
|
695
|
-
* Mode flips happen on consumed keystrokes (no transaction), so the
|
|
696
|
-
* Placeholder decoration — recomputed only per state update — would
|
|
697
|
-
* keep the previous copy. A no-op dispatch repaints it.
|
|
698
|
-
*/
|
|
699
|
-
useEffect(() => {
|
|
700
|
-
const ed = editorRef.current;
|
|
701
|
-
|
|
702
|
-
if (ed && !ed.isDestroyed) {
|
|
703
|
-
ed.view.dispatch(ed.state.tr);
|
|
704
|
-
}
|
|
705
|
-
}, [composerMode]);
|
|
706
|
-
|
|
707
|
-
/*
|
|
708
|
-
* Session switch tears the mode down: a shell/search mode armed on
|
|
709
|
-
* one conversation must not leak into the next (the TUI's modes are
|
|
710
|
-
* per-prompt-block state with the same lifetime). Search also drops
|
|
711
|
-
* its query text — it belongs to the previous transcript.
|
|
712
|
-
*/
|
|
713
|
-
useEffect(() => {
|
|
714
|
-
if (modeRef.current === 'search') {
|
|
715
|
-
liveEditor()?.commands.clearContent(true);
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
live.current.applyMode('normal');
|
|
719
|
-
}, [activeSessionId]);
|
|
720
|
-
|
|
721
|
-
/*
|
|
722
|
-
* The ⌘F overlay owns the same document-wide highlight registry —
|
|
723
|
-
* opening it while the composer is searching would leave two writers
|
|
724
|
-
* fighting per stream tick. The overlay wins; the composer exits.
|
|
725
|
-
*/
|
|
726
|
-
useEffect(() => {
|
|
727
|
-
if (searchOverlayOpen && modeRef.current === 'search') {
|
|
728
|
-
liveEditor()?.commands.clearContent(true);
|
|
729
|
-
live.current.applyMode('normal');
|
|
730
|
-
}
|
|
731
|
-
}, [searchOverlayOpen]);
|
|
732
|
-
|
|
733
|
-
// The shared per-session draft and the buffers kept across session switches (`chatbox/use-draft-mirror.ts`).
|
|
734
|
-
const mirror = useDraftMirror({
|
|
735
|
-
editor,
|
|
736
|
-
editorRef,
|
|
737
|
-
modeRef,
|
|
738
|
-
composerMode,
|
|
739
|
-
activeSessionId,
|
|
740
|
-
staged,
|
|
741
|
-
applyMode,
|
|
742
|
-
resetHistoryStatus: () => setHistoryStatus(null),
|
|
743
|
-
});
|
|
744
|
-
|
|
745
|
-
// Far-away producers (review comments, palette prompts, Edit message) push into this composer.
|
|
746
|
-
useComposerBus(scopeKey, {
|
|
747
|
-
attachment: staged.add,
|
|
748
|
-
mention: (path) => {
|
|
749
|
-
liveEditor()
|
|
750
|
-
?.chain()
|
|
751
|
-
.focus('end')
|
|
752
|
-
.insertContent([
|
|
753
|
-
{ type: 'mention', attrs: { id: path, label: basename(path) } },
|
|
754
|
-
{ type: 'text', text: ' ' },
|
|
755
|
-
])
|
|
756
|
-
.run();
|
|
757
|
-
},
|
|
758
|
-
insert: (text) => {
|
|
759
|
-
liveEditor()?.chain().focus('end').insertContent(text).run();
|
|
760
|
-
},
|
|
761
|
-
focus: () => {
|
|
762
|
-
liveEditor()?.commands.focus('end');
|
|
763
|
-
},
|
|
764
|
-
// Sent as is, beside the draft: whatever the user was typing stays put.
|
|
765
|
-
prompt: sendText,
|
|
766
|
-
// The draft is replaced, not merged.
|
|
767
|
-
draft: ({ text, attachments: next }) => {
|
|
768
|
-
const ed = liveEditor();
|
|
769
|
-
if (!ed) return;
|
|
770
|
-
live.current.applyMode('normal');
|
|
771
|
-
ed.chain().setContent(draftTextToDocJson(text), { emitUpdate: true }).focus('end').run();
|
|
772
|
-
replaceAttachments([...next]);
|
|
773
|
-
},
|
|
774
|
-
});
|
|
775
|
-
|
|
776
|
-
useSharedGhost(ghost);
|
|
777
|
-
|
|
778
|
-
/*
|
|
779
|
-
* Shared-search application (daemon mode). Mode + buffer are set
|
|
780
|
-
* directly (NOT via `applyMode`) so no `onSearchQueryChange` fires —
|
|
781
|
-
* Center already holds the remote value; re-emitting the transient ''
|
|
782
|
-
* from `applyMode('search')` would publish it back and clobber the
|
|
783
|
-
* remote query. The live-wire effect above re-emits the final query
|
|
784
|
-
* after `setContent`, which Center's echo guard absorbs.
|
|
785
|
-
*/
|
|
786
|
-
useEffect(() => {
|
|
787
|
-
if (!remoteSearchApply) {
|
|
788
|
-
return;
|
|
789
|
-
}
|
|
790
|
-
|
|
791
|
-
const ed = editorRef.current;
|
|
792
|
-
|
|
793
|
-
if (!ed || ed.isDestroyed) {
|
|
794
|
-
return;
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
if (remoteSearchApply.active) {
|
|
798
|
-
if (modeRef.current !== 'search') {
|
|
799
|
-
modeRef.current = 'search';
|
|
800
|
-
setComposerMode('search');
|
|
801
|
-
}
|
|
802
|
-
|
|
803
|
-
if (ed.getText({ blockSeparator: '\n' }) !== remoteSearchApply.query) {
|
|
804
|
-
ed.commands.setContent(plainTextToDocJson(remoteSearchApply.query), { emitUpdate: true });
|
|
805
|
-
}
|
|
806
|
-
} else if (modeRef.current === 'search') {
|
|
807
|
-
ed.commands.clearContent(true);
|
|
808
|
-
modeRef.current = 'normal';
|
|
809
|
-
setComposerMode('normal');
|
|
810
|
-
}
|
|
811
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps -- keyed by seq: values alone can repeat across signals.
|
|
812
|
-
}, [remoteSearchApply?.seq]);
|
|
813
|
-
|
|
814
|
-
const onPlusClick = () => fileInputRef.current?.click();
|
|
815
|
-
|
|
816
|
-
const onFilesPicked = (event: ChangeEvent<HTMLInputElement>) => {
|
|
817
|
-
/*
|
|
818
|
-
* The picker offers every file (no `accept`): what can attach is
|
|
819
|
-
* `readAttachment`'s call, the same for paste and drop, and a refused
|
|
820
|
-
* file says why in the card. Images become `PromptImagePart`s, PDFs
|
|
821
|
-
* and text `PromptDocumentPart`s (the engine's media-type branch).
|
|
822
|
-
*/
|
|
823
|
-
const picked = Array.from(event.target.files ?? []);
|
|
824
|
-
addAttachmentFiles(picked);
|
|
825
|
-
event.target.value = '';
|
|
826
|
-
};
|
|
827
|
-
|
|
828
|
-
/*
|
|
829
|
-
* A click on the chatbox's empty surface focuses the composer. Clicks
|
|
830
|
-
* that land on a control (a pill, a button, a popover's search field)
|
|
831
|
-
* belong to that control: focusing the composer from their bubbling click
|
|
832
|
-
* stole focus from, e.g., the model picker's search right after it opened.
|
|
833
|
-
*/
|
|
834
|
-
const focusEditor = (event: ReactMouseEvent) => {
|
|
835
|
-
const target = event.target as HTMLElement | null;
|
|
836
|
-
if (
|
|
837
|
-
target?.closest('button, a, input, textarea, select, [role="dialog"], [role="listbox"], [contenteditable="true"]')
|
|
838
|
-
)
|
|
839
|
-
return;
|
|
840
|
-
editor?.commands.focus();
|
|
841
|
-
};
|
|
842
|
-
|
|
843
|
-
return (
|
|
844
|
-
/*
|
|
845
|
-
* The composer is a raised card set in a tray (gui/CLAUDE.md "Surfaces").
|
|
846
|
-
* The tray's 4px ring comes out of the footer's budget (Center.tsx: px-5,
|
|
847
|
-
* pb-2), so the card keeps its size, its edges on the transcript column,
|
|
848
|
-
* and the + button's center on the sidebar footer separator (H − 37).
|
|
849
|
-
* Radius 28 = the card's 24 + the 4px ring: concentric.
|
|
850
|
-
*/
|
|
851
|
-
<div
|
|
852
|
-
className={`zg-chatbox-surface zg-tray relative rounded-[28px] p-1${className ? ` ${className}` : ''}`}
|
|
853
|
-
style={style}
|
|
854
|
-
>
|
|
855
|
-
{badges}
|
|
856
|
-
<input ref={fileInputRef} type="file" multiple onChange={onFilesPicked} className="hidden" />
|
|
857
|
-
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions -- a click on the card's empty surface focuses the editor, which has its own keyboard */}
|
|
858
|
-
<div
|
|
859
|
-
onClick={focusEditor}
|
|
860
|
-
onDragOver={(event) => {
|
|
861
|
-
event.preventDefault();
|
|
862
|
-
|
|
863
|
-
// Any file: the drop decides what attaches. A file's type is often empty mid-drag.
|
|
864
|
-
if (attachmentsEnabled && Array.from(event.dataTransfer.types).includes('Files')) {
|
|
865
|
-
setIsDragOver(true);
|
|
866
|
-
}
|
|
867
|
-
}}
|
|
868
|
-
onDragLeave={(event) => {
|
|
869
|
-
if (event.currentTarget === event.target) {
|
|
870
|
-
setIsDragOver(false);
|
|
871
|
-
}
|
|
872
|
-
}}
|
|
873
|
-
onDrop={(event) => {
|
|
874
|
-
event.preventDefault();
|
|
875
|
-
setIsDragOver(false);
|
|
876
|
-
|
|
877
|
-
if (!attachmentsEnabled) {
|
|
878
|
-
return;
|
|
879
|
-
}
|
|
880
|
-
|
|
881
|
-
addAttachmentFiles(Array.from(event.dataTransfer.files));
|
|
882
|
-
}}
|
|
883
|
-
/*
|
|
884
|
-
* Vertical padding is INTENTIONALLY asymmetric (pt-4/pb-2 = 16/8px):
|
|
885
|
-
* 1. The controls row mixes heights (24px pills, 30px scope toggle,
|
|
886
|
-
* 32px + / send circles) all centered on one axis via
|
|
887
|
-
* `items-center` on the row and both subgroups. The row's 32px
|
|
888
|
-
* box is set by the two circles, but its dominant visual mass —
|
|
889
|
-
* the 24px pills — floats 4px above the box bottom. A symmetric
|
|
890
|
-
* pb-3 stacked 12px under that built-in optical padding, so the
|
|
891
|
-
* bottom band read 13–17px against a crisp 13px above the
|
|
892
|
-
* cap-trimmed editor text (measured in an 800px window: text top
|
|
893
|
-
* at card+13, pill bottoms at card_bottom−17) — bottom-heavy.
|
|
894
|
-
* pb-2 puts the pill bottoms 13px from the border, matching the
|
|
895
|
-
* 13px the text then sat below the top (pt-3). pt-4 leaves
|
|
896
|
-
* ~17px above the text on purpose: a roomier prompt; the bottom
|
|
897
|
-
* band keeps its 13px.
|
|
898
|
-
* 2. Concentric corner nesting (send circle ⇄ card corner): the
|
|
899
|
-
* card radius is rounded-3xl (24px) so the corner arc's center
|
|
900
|
-
* lands 1.4px from the send circle's center — the circle inset
|
|
901
|
-
* is 8px content + 1px border = 9px on BOTH axes (pb-2 below;
|
|
902
|
-
* px-1 + the controls row's pr-1 on the right). Measured gaps
|
|
903
|
-
* button-edge → outer card border: right 9.0, bottom 9.0,
|
|
904
|
-
* 45° diagonal 9.4 — uniform within ±1px, so the circle reads
|
|
905
|
-
* as following the curve. At rounded-2xl (16px) the
|
|
906
|
-
* gaps would be 5 / 9 / 10.05 (the unnested look) and the only
|
|
907
|
-
* uniform inset is ≈2.4px — too cramped. Rule: concentric when
|
|
908
|
-
* R ≈ button inset(outer) + button radius (= 9 + 16 = 25 here;
|
|
909
|
-
* 24 is the nearest Tailwind step). Re-measure if either moves.
|
|
910
|
-
* 3. Cross-app alignment invariant: with the outer footer's pb-3
|
|
911
|
-
* (12px, Center.tsx) + 1px card border + 8px here + 16px half
|
|
912
|
-
* of the 32px + button, the + button's center lands at
|
|
913
|
-
* windowH − 37 — exactly the sidebar footer's top separator
|
|
914
|
-
* (28px h-7 row + 2×4px py-1 + 1px border-t = 37px,
|
|
915
|
-
* Footer.tsx). Both are bottom-anchored fixed heights, so the
|
|
916
|
-
* equality holds at every window size. If you change this
|
|
917
|
-
* padding, retune Footer.tsx's py to keep separator-y ==
|
|
918
|
-
* plus-center-y.
|
|
919
|
-
*/
|
|
920
|
-
className="zg-raised relative rounded-3xl border pt-4 pb-2 px-1 flex flex-col cursor-text"
|
|
921
|
-
// Lifts one step while a run streams; settles when it ends.
|
|
922
|
-
data-live={running ? '' : undefined}
|
|
923
|
-
style={
|
|
924
|
-
{
|
|
925
|
-
/*
|
|
926
|
-
* Mode border repaint — the TUI's visual contract for prompt
|
|
927
|
-
* modes (`PromptBlock`, src/tui/prompt/prompt-block.tsx):
|
|
928
|
-
* shell = accent, search = warn (`--zg-warn`). Drag-over keeps accent.
|
|
929
|
-
*/
|
|
930
|
-
borderColor:
|
|
931
|
-
isDragOver || shellMode ? 'var(--zg-accent)' : searchMode ? SEARCH_MODE_COLOR : 'var(--zg-hairline)',
|
|
932
|
-
// Transitions live on `.zg-raised` (primitives.css) so motion-off can stop them.
|
|
933
|
-
// ONE structural knob for the composer text column — consumed by
|
|
934
|
-
// .zg-editor-scroll's padding-inline (rich-composer.css). See the editor
|
|
935
|
-
// wrapper comment below for the alignment contract.
|
|
936
|
-
'--zg-composer-inset': '12px',
|
|
937
|
-
} as CSSProperties
|
|
938
|
-
}
|
|
939
|
-
>
|
|
940
|
-
{/*
|
|
941
|
-
* Always mounted — the collapse animation handles both the row's
|
|
942
|
-
* inner content (grid-template-rows) and its own outer spacing
|
|
943
|
-
* (margin-bottom), so unmounting on `attachments.length === 0`
|
|
944
|
-
* would yank the 12px gap and produce a visible jump on
|
|
945
|
-
* removing the LAST attachment. The CSS hides it at zero
|
|
946
|
-
* height + zero margin when empty.
|
|
947
|
-
*/}
|
|
948
|
-
<AttachmentNotices notices={attachmentNotices.notices} onDismiss={attachmentNotices.dismiss} />
|
|
949
|
-
<AttachmentRow
|
|
950
|
-
attachments={attachments}
|
|
951
|
-
exitingIds={exitingIds}
|
|
952
|
-
onRemove={removeAttachment}
|
|
953
|
-
onExited={finalizeRemove}
|
|
954
|
-
onOpenLightbox={openLightbox}
|
|
955
|
-
attachmentLabel={attachmentLabel}
|
|
956
|
-
/>
|
|
957
|
-
{/*
|
|
958
|
-
* Height-capped scroll region — the editor grows with content up
|
|
959
|
-
* to `.zg-editor-scroll`'s max-height, then scrolls internally
|
|
960
|
-
* (TUI parity: the textarea grows to MAX_CONTENT_LINES then
|
|
961
|
-
* scrolls, `PromptBlock` in src/tui/prompt/prompt-block.tsx). The
|
|
962
|
-
* cap lives on this wrapper
|
|
963
|
-
* (not `.ProseMirror`) so ProseMirror's own scrollIntoView finds
|
|
964
|
-
* a scrollable ANCESTOR and keeps the caret visible while typing
|
|
965
|
-
* at the cap. Attachment row + controls row are siblings outside
|
|
966
|
-
* the region, so the card's bottom-band geometry (separator ==
|
|
967
|
-
* plus-center == H−37, concentric corner nesting — see the card
|
|
968
|
-
* comment above) is unaffected by content height.
|
|
969
|
-
*/}
|
|
970
|
-
{/* Text inset comes from --zg-composer-inset (declared on the card,
|
|
971
|
-
consumed in rich-composer.css) — ONE structural knob placing the editor
|
|
972
|
-
text's left edge against the + button's glyph column (8px sat
|
|
973
|
-
exactly on the glyph; 12px sits 4px inside it, for room). The card's own
|
|
974
|
-
px-1 is dictated by the send-button corner nesting; changing that
|
|
975
|
-
or the button width means retuning the variable in ONE place. */}
|
|
976
|
-
{/* min-h-12 (two leading-6 lines even when empty) sits here, not on .ProseMirror: its
|
|
977
|
-
overflow-clip must hug the trimmed text so the line-tall caret Chrome draws after a
|
|
978
|
-
badge is clipped to the plain caret's height. */}
|
|
979
|
-
<div className="zg-editor-scroll min-w-0 min-h-12">
|
|
980
|
-
<EditorContent editor={editor} />
|
|
981
|
-
</div>
|
|
982
|
-
{/*
|
|
983
|
-
* One line at every width (`zg-chatbox` container tiers in
|
|
984
|
-
* composer.css): the left group shrinks, its names truncating; the
|
|
985
|
-
* right group (status, a draft's pickers, send) never shrinks, its
|
|
986
|
-
* parts fold instead.
|
|
987
|
-
*/}
|
|
988
|
-
<div className="zg-chatbox-controls flex items-center justify-between gap-2 mt-3 min-w-0">
|
|
989
|
-
<div className="flex items-center gap-1 flex-1 min-w-0">
|
|
990
|
-
<PlusButton onClick={onPlusClick} />
|
|
991
|
-
{leadingActions}
|
|
992
|
-
{shellMode && (
|
|
993
|
-
<span className={MODE_CHIP} style={modeChipTone('var(--zg-accent)')}>
|
|
994
|
-
<span className="i-ph-terminal-window text-zg-meta" />
|
|
995
|
-
{labels.modeShell}
|
|
996
|
-
</span>
|
|
997
|
-
)}
|
|
998
|
-
{searchMode && (
|
|
999
|
-
<span className={MODE_CHIP} style={modeChipTone(SEARCH_MODE_COLOR)}>
|
|
1000
|
-
<span className="i-ph-magnifying-glass text-zg-meta" />
|
|
1001
|
-
{labels.modeSearch}
|
|
1002
|
-
{searchStatus?.hasNeedle && (
|
|
1003
|
-
<span className="opacity-90">
|
|
1004
|
-
{searchStatus.count === 0
|
|
1005
|
-
? '0/0'
|
|
1006
|
-
: `${searchStatus.activeIndex + 1}/${searchStatus.capped ? `${searchStatus.count}+` : searchStatus.count}`}
|
|
1007
|
-
</span>
|
|
1008
|
-
)}
|
|
1009
|
-
</span>
|
|
1010
|
-
)}
|
|
1011
|
-
{historyStatus && (
|
|
1012
|
-
<span className={MODE_CHIP}>
|
|
1013
|
-
<span className="i-ph-clock text-zg-meta" />
|
|
1014
|
-
{labels.historyPosition(historyStatus.position, historyStatus.total)}
|
|
1015
|
-
</span>
|
|
1016
|
-
)}
|
|
1017
|
-
</div>
|
|
1018
|
-
{/*
|
|
1019
|
-
* pr-1 equalizes the send button's right inset with its bottom
|
|
1020
|
-
* one (4px px-1 + 4px here = 8px content, 9px to the outer
|
|
1021
|
-
* border) — the concentric-nesting invariant documented on the
|
|
1022
|
-
* card's padding comment above. Horizontal only: the row's
|
|
1023
|
-
* shared vertical center axis is untouched.
|
|
1024
|
-
*/}
|
|
1025
|
-
<div className="flex items-center gap-2 shrink-0 pr-1">
|
|
1026
|
-
{trailingActions}
|
|
1027
|
-
<SendStopButton running={running && Boolean(onStop)} canSend={canSend} onSend={send} onStop={onStop} />
|
|
1028
|
-
</div>
|
|
1029
|
-
</div>
|
|
1030
|
-
</div>
|
|
1031
|
-
{/* The tray showing under the card (the desktop app: where the checkout stands). */}
|
|
1032
|
-
{footer}
|
|
1033
|
-
{lightbox.element}
|
|
1034
|
-
</div>
|
|
1035
|
-
);
|
|
1036
|
-
}
|