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,911 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* One view of one terminal of a `TerminalHost`: a ghostty-web `Terminal`
|
|
3
|
-
* (`@tahul/ghostty-web`) on a canvas, attached to the host with its own
|
|
4
|
-
* client id. The library loads lazily through `loadGhostty` (the package
|
|
5
|
-
* inlines its 400 KB wasm, which stays out of the main chunk until a
|
|
6
|
-
* terminal is shown). `TerminalSurface` is the same canvas over any process
|
|
7
|
-
* (a `TerminalAdapter`); this one runs the host's attach, replay and size
|
|
8
|
-
* protocol.
|
|
9
|
-
*
|
|
10
|
-
* Output never touches React state: the store hands signals to the sink
|
|
11
|
-
* below, which writes into the terminal, keeps its cursor (`planChunk`)
|
|
12
|
-
* and acknowledges what was written (throttled). The same terminal may be
|
|
13
|
-
* shown in the drawer and the panel tab at once; each view attaches on
|
|
14
|
-
* its own and the last focused one owns the PTY size.
|
|
15
|
-
*
|
|
16
|
-
* Keys: the host carries `data-zg-keyscope="editor"`, so bare ctrl+letter
|
|
17
|
-
* chords belong to the shell. Cmd chords and app bindings skip the
|
|
18
|
-
* terminal (marked composing so ghostty ignores them without calling
|
|
19
|
-
* preventDefault) and reach the app / the menu; Cmd+C copies a selection,
|
|
20
|
-
* Cmd+V is the native paste, which the library brackets when asked.
|
|
21
|
-
*
|
|
22
|
-
* Links: the library finds OSC 8 hyperlinks and URLs and hands every click
|
|
23
|
-
* to `linkHandler` (`linkTarget` decides where it goes); our provider adds
|
|
24
|
-
* file paths and scheme-less local servers. Where they open is the app's
|
|
25
|
-
* (`TerminalAppActions.openUrl` / `openFile`).
|
|
26
|
-
*
|
|
27
|
-
* Mouse: while the program tracks the mouse (vim, htop, less --mouse) the
|
|
28
|
-
* library reports clicks, drags and the wheel to it and doesn't select;
|
|
29
|
-
* Shift gives them back to the terminal (select, scroll, our menu).
|
|
30
|
-
*/
|
|
31
|
-
import type { IBufferRange, ILink, ILinkHandler, Terminal } from '@tahul/ghostty-web';
|
|
32
|
-
import {
|
|
33
|
-
OutputHistory,
|
|
34
|
-
parseBindingSpecs,
|
|
35
|
-
TERMINAL_HISTORY_MAX_CHARS,
|
|
36
|
-
TERMINAL_VIEW_MAX_LINES,
|
|
37
|
-
TERMINAL_VIEW_SCROLLBACK,
|
|
38
|
-
} from 'zidane/chat/pure';
|
|
39
|
-
import { useEffect, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';
|
|
40
|
-
|
|
41
|
-
import { useAppearanceState, usePalette } from '../appearance/AppearanceProvider';
|
|
42
|
-
import { RowActionsMenu, type RowActionItem } from '../components/RowActionsMenu';
|
|
43
|
-
import { getMergedKeybindings, type KeyAction, type KeybindingsHost } from '../keybindings/headless';
|
|
44
|
-
import { bindingAllowedIn } from '../keybindings/headless/key-scope';
|
|
45
|
-
import { useKeybindingsHost } from '../keybindings/KeybindingsProvider';
|
|
46
|
-
import { matchesBinding } from '../keybindings/match';
|
|
47
|
-
import { loadGhostty, openTerminal } from './ghostty';
|
|
48
|
-
import { terminalFont } from './grid-size';
|
|
49
|
-
import { detectLinks, linkTarget, resolveTerminalPath, serverOnlyLink } from './headless/links';
|
|
50
|
-
import { ACK_EVERY_MS, planChunk, planReset, shouldAck } from './headless/output-cursor';
|
|
51
|
-
import { feedSlices, yieldToEventLoop } from './headless/replay';
|
|
52
|
-
import type { TerminalScope } from './headless/scope';
|
|
53
|
-
import { macTerminalKey } from './keys';
|
|
54
|
-
import { terminalTheme } from './theme';
|
|
55
|
-
import { useSymbolsFontUrl, useTerminalActions, useTerminalStore } from './TerminalProvider';
|
|
56
|
-
import { useTerminalLabels } from './useTerminalLabels';
|
|
57
|
-
|
|
58
|
-
const SCROLLBACK = TERMINAL_VIEW_SCROLLBACK;
|
|
59
|
-
const FIT_DEBOUNCE_MS = 40;
|
|
60
|
-
const CLAIM_EVERY_MS = 2_000;
|
|
61
|
-
/** A history replay parses this long per task before giving the event loop a turn. */
|
|
62
|
-
const REPLAY_BUDGET_MS = 8;
|
|
63
|
-
/** Replay writes are this big: small enough to check the budget often, big enough to keep per-write overhead low. */
|
|
64
|
-
const REPLAY_SLICE_CHARS = 16 * 1024;
|
|
65
|
-
/** Live output bigger than this (heavy output, one batch from the host) is fed in time-boxed slices too. */
|
|
66
|
-
const LIVE_SLICE_MIN = 64 * 1024;
|
|
67
|
-
const CLEAR = '\x1bc\x1b[3J';
|
|
68
|
-
|
|
69
|
-
/** ghostty-web keeps a render loop for as long as a terminal is open; these TS-private methods pause it. */
|
|
70
|
-
interface RenderLoop {
|
|
71
|
-
cancelRenderLoop?: () => void;
|
|
72
|
-
startRenderLoop?: () => void;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/** Props for {@link HostTerminalSurface}. */
|
|
76
|
-
export interface HostTerminalSurfaceProps {
|
|
77
|
-
/** Whose terminal (handed to the app's link and chat actions). */
|
|
78
|
-
scope: TerminalScope;
|
|
79
|
-
/** The terminal this view attaches to. */
|
|
80
|
-
terminalId: string;
|
|
81
|
-
/** The terminal's label, for "Add to chat" excerpts. */
|
|
82
|
-
label: string;
|
|
83
|
-
/** Where relative paths printed by the shell resolve; empty = don't link files. */
|
|
84
|
-
cwd: string;
|
|
85
|
-
/** Take keyboard focus on mount (the user opened or picked this terminal). */
|
|
86
|
-
autoFocus?: boolean;
|
|
87
|
-
/** A new value takes focus again while `autoFocus` stays on (the terminal shown on request a second time). */
|
|
88
|
-
focusSeq?: number;
|
|
89
|
-
/** The PTY's columns (from the host): the grid always has its size, whatever this view's container fits. */
|
|
90
|
-
ptyCols: number;
|
|
91
|
-
/** The PTY's rows. */
|
|
92
|
-
ptyRows: number;
|
|
93
|
-
/** `TerminalInfo.sizeSeq` of that size: a view keeps the newest, whichever route it came by. */
|
|
94
|
-
ptySeq: number;
|
|
95
|
-
/** The machine the terminal runs on when it is not this one: its loopback links are not this computer's. */
|
|
96
|
-
serverName?: string | null;
|
|
97
|
-
/** Extra classes on the root. */
|
|
98
|
-
className?: string;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/** Handlers the effect reads through a ref, so link clicks see fresh context without re-creating the terminal. */
|
|
102
|
-
interface LinkContext {
|
|
103
|
-
openUrl: (url: string, external: boolean) => void;
|
|
104
|
-
openFile: (path: string, event: MouseEvent, at?: { line: number; column?: number }) => void;
|
|
105
|
-
cwd: string;
|
|
106
|
-
/** Why a web link is not opened from here (`serverOnlyLink`), else `null`. */
|
|
107
|
-
unreachable: (url: string) => string | null;
|
|
108
|
-
/** Show (or clear) a hovered link's tooltip. */
|
|
109
|
-
tip: (text: string | null) => void;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* One view of one of the host's terminals, attached for as long as it is mounted.
|
|
114
|
-
*
|
|
115
|
-
* @param props - The terminal, its scope and label, where its paths resolve, focus and the PTY's size.
|
|
116
|
-
*/
|
|
117
|
-
export function HostTerminalSurface({
|
|
118
|
-
scope,
|
|
119
|
-
terminalId,
|
|
120
|
-
label,
|
|
121
|
-
cwd,
|
|
122
|
-
autoFocus = false,
|
|
123
|
-
focusSeq = 0,
|
|
124
|
-
ptyCols,
|
|
125
|
-
ptyRows,
|
|
126
|
-
ptySeq,
|
|
127
|
-
serverName = null,
|
|
128
|
-
className,
|
|
129
|
-
}: HostTerminalSurfaceProps) {
|
|
130
|
-
const hostRef = useRef<HTMLDivElement>(null);
|
|
131
|
-
const store = useTerminalStore();
|
|
132
|
-
const actions = useTerminalActions();
|
|
133
|
-
const symbolsFontUrl = useSymbolsFontUrl();
|
|
134
|
-
const keybindings = useKeybindingsHost();
|
|
135
|
-
const labels = useTerminalLabels();
|
|
136
|
-
const termRef = useRef<Terminal | null>(null);
|
|
137
|
-
// Focus claims the PTY size for this view (set by the effect, which owns the client id).
|
|
138
|
-
const claimRef = useRef<() => void>(() => undefined);
|
|
139
|
-
/*
|
|
140
|
-
* The grid's size is the PTY's. It arrives two ways (the attach reply, the
|
|
141
|
-
* terminals list), which can cross: the one with the higher `sizeSeq` wins,
|
|
142
|
-
* or a stale size sticks (a full-screen app then draws past the grid).
|
|
143
|
-
*/
|
|
144
|
-
const gridSeq = useRef(-1);
|
|
145
|
-
/** Told when the grid changed size (the view waits for its claimed size before showing). */
|
|
146
|
-
const gridChanged = useRef<(() => void) | null>(null);
|
|
147
|
-
/** Resizes a grid that has content by redrawing it (set by the effect; see `redrawAt`). */
|
|
148
|
-
const redraw = useRef<((cols: number, rows: number) => void) | null>(null);
|
|
149
|
-
const applyGrid = (term: Terminal | null, cols: number, rows: number, seq: number) => {
|
|
150
|
-
if (!term || seq < gridSeq.current || cols < 2 || rows < 2) return;
|
|
151
|
-
gridSeq.current = seq;
|
|
152
|
-
if (term.cols === cols && term.rows === rows) return;
|
|
153
|
-
if (redraw.current) redraw.current(cols, rows);
|
|
154
|
-
else term.resize(cols, rows);
|
|
155
|
-
gridChanged.current?.();
|
|
156
|
-
};
|
|
157
|
-
// The PTY's size when the terminal is created: it starts at that size, never at a default.
|
|
158
|
-
const ptySize = useRef({ cols: ptyCols, rows: ptyRows });
|
|
159
|
-
ptySize.current = { cols: ptyCols, rows: ptyRows };
|
|
160
|
-
const applyGridRef = useRef(applyGrid);
|
|
161
|
-
applyGridRef.current = applyGrid;
|
|
162
|
-
const [failed, setFailed] = useState<string | null>(null);
|
|
163
|
-
const [menu, setMenu] = useState<{ x: number; y: number; selection: string } | null>(null);
|
|
164
|
-
|
|
165
|
-
const palette = usePalette();
|
|
166
|
-
const theme = useMemo(() => terminalTheme(palette), [palette]);
|
|
167
|
-
const themeKey = useMemo(() => JSON.stringify(theme), [theme]);
|
|
168
|
-
const { fonts, fontSizes } = useAppearanceState();
|
|
169
|
-
const { family: fontFamily, size: fontSize } = terminalFont(fonts.mono, fontSizes.code);
|
|
170
|
-
|
|
171
|
-
const links = useRef<LinkContext | null>(null);
|
|
172
|
-
links.current = {
|
|
173
|
-
// Without the app's file opener, paths don't link.
|
|
174
|
-
cwd: actions.openFile ? cwd : '',
|
|
175
|
-
unreachable: (url) => serverOnlyLink(url, serverName, labels.terminalLinkOnServer),
|
|
176
|
-
tip: (text) => {
|
|
177
|
-
const mount = hostRef.current;
|
|
178
|
-
if (!mount) return;
|
|
179
|
-
if (text) mount.title = text;
|
|
180
|
-
else mount.removeAttribute('title');
|
|
181
|
-
},
|
|
182
|
-
openUrl: (url, external) => {
|
|
183
|
-
if (actions.openUrl) actions.openUrl(scope, url, external, cwd);
|
|
184
|
-
else window.open(url, '_blank');
|
|
185
|
-
},
|
|
186
|
-
openFile: (path, event, at) => {
|
|
187
|
-
const abs = resolveTerminalPath(path, cwd);
|
|
188
|
-
if (abs) actions.openFile?.(scope, abs, event, at);
|
|
189
|
-
},
|
|
190
|
-
};
|
|
191
|
-
const labelRef = useRef(label);
|
|
192
|
-
labelRef.current = label;
|
|
193
|
-
// Read when the terminal is created: `autoFocus` can turn on while ghostty loads (Show terminal).
|
|
194
|
-
const autoFocusRef = useRef(autoFocus);
|
|
195
|
-
autoFocusRef.current = autoFocus;
|
|
196
|
-
|
|
197
|
-
// Font changes apply live; theme changes re-create the terminal (ghostty-web
|
|
198
|
-
// does not repaint a new theme after open) and re-attach from history.
|
|
199
|
-
useEffect(() => {
|
|
200
|
-
const term = termRef.current;
|
|
201
|
-
if (!term) return;
|
|
202
|
-
if (term.options.fontFamily !== fontFamily) term.options.fontFamily = fontFamily;
|
|
203
|
-
if (term.options.fontSize !== fontSize) term.options.fontSize = fontSize;
|
|
204
|
-
}, [fontFamily, fontSize]);
|
|
205
|
-
|
|
206
|
-
// The grid follows the PTY (another view may own its size): output always matches the grid it is drawn in.
|
|
207
|
-
useEffect(() => {
|
|
208
|
-
applyGrid(termRef.current, ptyCols, ptyRows, ptySeq);
|
|
209
|
-
}, [ptyCols, ptyRows, ptySeq]);
|
|
210
|
-
|
|
211
|
-
// Kept mounted across tab switches: picking this tab again focuses it (creation handles the first time).
|
|
212
|
-
useEffect(() => {
|
|
213
|
-
if (autoFocus) termRef.current?.focus();
|
|
214
|
-
}, [autoFocus, focusSeq]);
|
|
215
|
-
|
|
216
|
-
useEffect(() => {
|
|
217
|
-
const host = hostRef.current;
|
|
218
|
-
if (!host) return undefined;
|
|
219
|
-
let disposed = false;
|
|
220
|
-
const clientId = crypto.randomUUID();
|
|
221
|
-
const api = store.host;
|
|
222
|
-
let term: Terminal | null = null;
|
|
223
|
-
let fitTimer = 0;
|
|
224
|
-
let ackTimer = 0;
|
|
225
|
-
let observer: ResizeObserver | null = null;
|
|
226
|
-
let unregister: (() => void) | null = null;
|
|
227
|
-
let onVisibility: (() => void) | null = null;
|
|
228
|
-
let onFocusChange: ((event: FocusEvent) => void) | null = null;
|
|
229
|
-
// What fits this view's container (null while hidden); set once the terminal exists.
|
|
230
|
-
let propose: () => { cols: number; rows: number } | null = () => null;
|
|
231
|
-
|
|
232
|
-
// Stream position (what has been handed to the terminal) and what was written + acked.
|
|
233
|
-
let pos = 0;
|
|
234
|
-
let written = 0;
|
|
235
|
-
const ack = { acked: 0, at: 0 };
|
|
236
|
-
let attached = false;
|
|
237
|
-
let attachSeq = 0;
|
|
238
|
-
let queued: { kind: 'output' | 'reset'; offset: number; data: string }[] = [];
|
|
239
|
-
let lastClaim = 0;
|
|
240
|
-
|
|
241
|
-
const sendAck = () => {
|
|
242
|
-
ackTimer = 0;
|
|
243
|
-
if (disposed || written <= ack.acked) return;
|
|
244
|
-
ack.acked = written;
|
|
245
|
-
ack.at = Date.now();
|
|
246
|
-
void api.ack(terminalId, clientId, written).catch(() => undefined);
|
|
247
|
-
};
|
|
248
|
-
const maybeAck = () => {
|
|
249
|
-
if (shouldAck(ack, written, Date.now())) sendAck();
|
|
250
|
-
else if (!ackTimer && written > ack.acked) ackTimer = window.setTimeout(sendAck, ACK_EVERY_MS);
|
|
251
|
-
};
|
|
252
|
-
/*
|
|
253
|
-
* ghostty-web parses synchronously inside `write` (its callback only
|
|
254
|
-
* waits for the next frame, which a hidden window may never paint), so
|
|
255
|
-
* what was written is known on return. Two quirks: an empty write throws
|
|
256
|
-
* (a zero-length wasm alloc), and `reset()` swaps the wasm terminal under
|
|
257
|
-
* the selection and link layers, so a reset goes through the parser as
|
|
258
|
-
* RIS instead.
|
|
259
|
-
*/
|
|
260
|
-
let fresh = true;
|
|
261
|
-
/*
|
|
262
|
-
* The emulator answers queries in the output (cursor position, device
|
|
263
|
-
* attributes) synchronously, from inside `term.write`, through `onData`.
|
|
264
|
-
* Those replies are not typing: dropped for replayed history (the program
|
|
265
|
-
* that asked is long gone, and the shell would read them as input:
|
|
266
|
-
* `;1R;1R…`), tagged as replies for live output (the host keeps only the
|
|
267
|
-
* size owner's, so two views never answer twice).
|
|
268
|
-
*/
|
|
269
|
-
let writing: 'history' | 'live' | null = null;
|
|
270
|
-
/*
|
|
271
|
-
* What this view drew, capped like the host's history and by the lines
|
|
272
|
-
* a replay can use (its scrollback and screen; all of a program still on
|
|
273
|
-
* the alternate screen). The library's
|
|
274
|
-
* resize reflows a grid with content badly (lines overlap instead of
|
|
275
|
-
* rewrapping, and stay that way), so a view never resizes one: it clears,
|
|
276
|
-
* resizes the empty grid and draws this again (see `rebuild`). Plain
|
|
277
|
-
* output wraps as in any terminal; full-screen programs repaint on the
|
|
278
|
-
* resize anyway.
|
|
279
|
-
*/
|
|
280
|
-
const drawn = new OutputHistory(TERMINAL_HISTORY_MAX_CHARS, { maxLines: TERMINAL_VIEW_MAX_LINES });
|
|
281
|
-
const feed = (data: string, kind: 'history' | 'live') => {
|
|
282
|
-
if (!term || !data) return;
|
|
283
|
-
writing = kind;
|
|
284
|
-
try {
|
|
285
|
-
term.write(data);
|
|
286
|
-
} finally {
|
|
287
|
-
writing = null;
|
|
288
|
-
}
|
|
289
|
-
};
|
|
290
|
-
|
|
291
|
-
/*
|
|
292
|
-
* Rendering pauses while nothing can be seen (a background tab, a closed
|
|
293
|
-
* panel, a hidden window, a replay in progress): the library's loop would
|
|
294
|
-
* otherwise run every frame for every mounted terminal. `resize` restarts
|
|
295
|
-
* the loop by itself, hence `resizeGrid`.
|
|
296
|
-
*/
|
|
297
|
-
let viewHidden = false;
|
|
298
|
-
let loopPaused = false;
|
|
299
|
-
// The cursor blinks only in the terminal being typed into: a blinking one redraws its row every frame.
|
|
300
|
-
let focused = false;
|
|
301
|
-
const updateRendering = () => {
|
|
302
|
-
if (!term) return;
|
|
303
|
-
const pause = viewHidden || replayHidden;
|
|
304
|
-
if (pause === loopPaused) return;
|
|
305
|
-
loopPaused = pause;
|
|
306
|
-
const loop = term as unknown as RenderLoop;
|
|
307
|
-
const canPause = typeof loop.cancelRenderLoop === 'function' && typeof loop.startRenderLoop === 'function';
|
|
308
|
-
term.options.cursorBlink = focused && !pause;
|
|
309
|
-
if (!canPause) return;
|
|
310
|
-
if (pause) {
|
|
311
|
-
loop.cancelRenderLoop!();
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
// Output written while paused left the canvas behind: repaint it all, then let the loop take over.
|
|
315
|
-
if (term.renderer && term.wasmTerm) term.renderer.render(term.wasmTerm, true, term.viewportY, term, 0);
|
|
316
|
-
loop.startRenderLoop!();
|
|
317
|
-
};
|
|
318
|
-
const resizeGrid = (cols: number, rows: number) => {
|
|
319
|
-
if (!term) return;
|
|
320
|
-
term.resize(cols, rows);
|
|
321
|
-
if (loopPaused) (term as unknown as RenderLoop).cancelRenderLoop?.();
|
|
322
|
-
};
|
|
323
|
-
|
|
324
|
-
/*
|
|
325
|
-
* Rebuilding the grid (an attach, a resize) replays what the terminal
|
|
326
|
-
* can keep (see `OutputHistory.replay`) in time-boxed slices, so a big
|
|
327
|
-
* history never blocks the renderer. A replay that outlasts its first
|
|
328
|
-
* slice hides the view until it is done: a half-drawn grid is never on
|
|
329
|
-
* screen. Output arriving meanwhile goes to `drawn` and is fed after the
|
|
330
|
-
* replay, in order, as live output (acked as it is fed); a newer rebuild
|
|
331
|
-
* supersedes a running one. Started from a microtask so rebuilds asked
|
|
332
|
-
* for in the same task (attach resizes, then replaces) replay once.
|
|
333
|
-
* A big batch of live output goes through the same loop (`catchUp`),
|
|
334
|
-
* without a history to replay first and without hiding the view.
|
|
335
|
-
*/
|
|
336
|
-
let replayGen = 0;
|
|
337
|
-
let replaying = false;
|
|
338
|
-
let replayHidden = false;
|
|
339
|
-
// Stream offset of the output fed to the terminal.
|
|
340
|
-
let fed = 0;
|
|
341
|
-
const rebuild = (upTo: number) => {
|
|
342
|
-
const gen = ++replayGen;
|
|
343
|
-
replaying = true;
|
|
344
|
-
queueMicrotask(() => void runReplay(gen, upTo));
|
|
345
|
-
};
|
|
346
|
-
const catchUp = () => {
|
|
347
|
-
const gen = ++replayGen;
|
|
348
|
-
replaying = true;
|
|
349
|
-
void runReplay(gen, null);
|
|
350
|
-
};
|
|
351
|
-
/** `upTo`: replay the history up to there first; `null`: only feed the live output from `fed` on. */
|
|
352
|
-
const runReplay = async (gen: number, upTo: number | null) => {
|
|
353
|
-
const current = () => gen === replayGen && !disposed && term !== null;
|
|
354
|
-
if (!current()) return;
|
|
355
|
-
let kind: 'history' | 'live' = upTo === null ? 'live' : 'history';
|
|
356
|
-
let buf = upTo === null ? drawn.text(fed) : drawn.replay(SCROLLBACK + term!.rows, upTo);
|
|
357
|
-
let i = 0;
|
|
358
|
-
let deadline = performance.now() + REPLAY_BUDGET_MS;
|
|
359
|
-
for (;;) {
|
|
360
|
-
const from = i;
|
|
361
|
-
i = feedSlices(buf, i, REPLAY_SLICE_CHARS, deadline, (slice) => feed(slice, kind));
|
|
362
|
-
if (kind === 'live' && i > from) {
|
|
363
|
-
fed += i - from;
|
|
364
|
-
if (fed > written) written = fed;
|
|
365
|
-
maybeAck();
|
|
366
|
-
}
|
|
367
|
-
if (i >= buf.length) {
|
|
368
|
-
if (kind === 'history' && upTo !== null) {
|
|
369
|
-
kind = 'live';
|
|
370
|
-
fed = upTo;
|
|
371
|
-
if (upTo > written) written = upTo;
|
|
372
|
-
maybeAck();
|
|
373
|
-
}
|
|
374
|
-
if (fed < drawn.start) {
|
|
375
|
-
// More output arrived during the replay than the history keeps: start over from what it has.
|
|
376
|
-
feed(CLEAR, 'history');
|
|
377
|
-
rebuild(drawn.end);
|
|
378
|
-
return;
|
|
379
|
-
}
|
|
380
|
-
buf = drawn.text(fed);
|
|
381
|
-
i = 0;
|
|
382
|
-
if (!buf) break;
|
|
383
|
-
if (performance.now() < deadline) continue;
|
|
384
|
-
}
|
|
385
|
-
if (!replayHidden && upTo !== null) {
|
|
386
|
-
replayHidden = true;
|
|
387
|
-
if (mountEl) mountEl.style.opacity = '0';
|
|
388
|
-
updateRendering();
|
|
389
|
-
}
|
|
390
|
-
await yieldToEventLoop();
|
|
391
|
-
if (!current()) return;
|
|
392
|
-
deadline = performance.now() + REPLAY_BUDGET_MS;
|
|
393
|
-
}
|
|
394
|
-
replaying = false;
|
|
395
|
-
if (replayHidden) {
|
|
396
|
-
replayHidden = false;
|
|
397
|
-
updateRendering();
|
|
398
|
-
showSoon();
|
|
399
|
-
}
|
|
400
|
-
};
|
|
401
|
-
|
|
402
|
-
const redrawAt = (cols: number, rows: number) => {
|
|
403
|
-
if (!term) return;
|
|
404
|
-
if (fresh || drawn.size === 0) {
|
|
405
|
-
resizeGrid(cols, rows);
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
feed(CLEAR, 'history');
|
|
409
|
-
resizeGrid(cols, rows);
|
|
410
|
-
rebuild(drawn.end);
|
|
411
|
-
};
|
|
412
|
-
redraw.current = redrawAt;
|
|
413
|
-
|
|
414
|
-
const replace = (offset: number, data: string) => {
|
|
415
|
-
if (!term) return;
|
|
416
|
-
if (!fresh) feed(CLEAR, 'history');
|
|
417
|
-
fresh = false;
|
|
418
|
-
pos = offset;
|
|
419
|
-
written = Math.min(written, offset);
|
|
420
|
-
drawn.reset(offset, data);
|
|
421
|
-
rebuild(offset);
|
|
422
|
-
};
|
|
423
|
-
|
|
424
|
-
const apply = (offset: number, data: string) => {
|
|
425
|
-
if (!term) return;
|
|
426
|
-
const plan = planChunk(pos, offset, data);
|
|
427
|
-
if (plan.kind === 'drop') return;
|
|
428
|
-
if (plan.kind === 'gap') {
|
|
429
|
-
void attach();
|
|
430
|
-
return;
|
|
431
|
-
}
|
|
432
|
-
pos = plan.next;
|
|
433
|
-
drawn.push(plan.data);
|
|
434
|
-
// A replay in progress feeds it once it has caught up.
|
|
435
|
-
if (replaying) return;
|
|
436
|
-
if (plan.data.length > LIVE_SLICE_MIN) {
|
|
437
|
-
catchUp();
|
|
438
|
-
return;
|
|
439
|
-
}
|
|
440
|
-
feed(plan.data, 'live');
|
|
441
|
-
fed = pos;
|
|
442
|
-
if (pos > written) written = pos;
|
|
443
|
-
maybeAck();
|
|
444
|
-
};
|
|
445
|
-
|
|
446
|
-
// A reset that overlaps what this view has appends the rest (no clear, scrollback kept); see `planReset`.
|
|
447
|
-
const reset = (offset: number, data: string) => {
|
|
448
|
-
const plan = planReset(fresh, pos, offset, data);
|
|
449
|
-
if (plan.kind === 'append') apply(plan.offset, plan.data);
|
|
450
|
-
else replace(offset, data);
|
|
451
|
-
};
|
|
452
|
-
|
|
453
|
-
/*
|
|
454
|
-
* Sizing, tmux-style: this view never resizes its own grid. It asks for
|
|
455
|
-
* what fits its container, and the grid follows the PTY's size (the
|
|
456
|
-
* `ptyCols` / `ptyRows` props) in lockstep with the program's redraw, so
|
|
457
|
-
* output is always laid out for the grid it is drawn in. `claim`: this
|
|
458
|
-
* view is the one being looked at (shown, focused, typed into) and takes
|
|
459
|
-
* the size; otherwise the request only applies when nobody owns it.
|
|
460
|
-
*/
|
|
461
|
-
const resize = (claim: boolean) => {
|
|
462
|
-
if (!term || !attached) return;
|
|
463
|
-
const size = propose();
|
|
464
|
-
if (!size) return;
|
|
465
|
-
if (claim) lastClaim = Date.now();
|
|
466
|
-
void api.resize(terminalId, clientId, size.cols, size.rows, claim).catch(() => undefined);
|
|
467
|
-
};
|
|
468
|
-
|
|
469
|
-
async function attach(): Promise<void> {
|
|
470
|
-
const seq = ++attachSeq;
|
|
471
|
-
attached = false;
|
|
472
|
-
queued = [];
|
|
473
|
-
try {
|
|
474
|
-
const result = await api.attach(terminalId, clientId);
|
|
475
|
-
// Unmounted mid-attach: the cleanup's detach may have landed first, so detach again.
|
|
476
|
-
if (disposed) void api.detach(terminalId, clientId).catch(() => undefined);
|
|
477
|
-
if (disposed || seq !== attachSeq) return;
|
|
478
|
-
// History was produced at the PTY's size: the grid takes that size (never reflowed here).
|
|
479
|
-
applyGridRef.current(term, result.terminal.cols, result.terminal.rows, result.terminal.sizeSeq);
|
|
480
|
-
replace(result.offset, result.data);
|
|
481
|
-
ack.acked = result.offset;
|
|
482
|
-
attached = true;
|
|
483
|
-
setFailed(null);
|
|
484
|
-
const pending = queued;
|
|
485
|
-
queued = [];
|
|
486
|
-
for (const q of pending) (q.kind === 'reset' ? reset : apply)(q.offset, q.data);
|
|
487
|
-
// Being shown means being looked at: take the size (no-op while hidden), then show it at that size.
|
|
488
|
-
settle(true);
|
|
489
|
-
} catch (err) {
|
|
490
|
-
if (!disposed && seq === attachSeq) setFailed(err instanceof Error ? err.message : String(err));
|
|
491
|
-
reveal();
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
/*
|
|
496
|
-
* Nothing half-drawn is ever on screen: the mount stays transparent (opacity,
|
|
497
|
-
* which no child can override) until
|
|
498
|
-
* the terminal has its history and the size this view asked for (a new
|
|
499
|
-
* size only arrives after the host resized the PTY, so for a moment the
|
|
500
|
-
* grid still has the old one). Capped, so a lost reply never keeps it
|
|
501
|
-
* blank. Shown two frames later: ghostty paints on the next frame.
|
|
502
|
-
*/
|
|
503
|
-
let mountEl: HTMLElement | null = null;
|
|
504
|
-
let revealTimer = 0;
|
|
505
|
-
// Hidden until sized (`hide` / `reveal`); a long replay holds it hidden on its own (`replayHidden`).
|
|
506
|
-
let settling = false;
|
|
507
|
-
const hide = () => {
|
|
508
|
-
settling = true;
|
|
509
|
-
if (mountEl) mountEl.style.opacity = '0';
|
|
510
|
-
};
|
|
511
|
-
const showSoon = () =>
|
|
512
|
-
requestAnimationFrame(() =>
|
|
513
|
-
requestAnimationFrame(() => {
|
|
514
|
-
if (!disposed && mountEl && !settling && !replayHidden) mountEl.style.opacity = '';
|
|
515
|
-
}),
|
|
516
|
-
);
|
|
517
|
-
const reveal = () => {
|
|
518
|
-
window.clearTimeout(revealTimer);
|
|
519
|
-
gridChanged.current = null;
|
|
520
|
-
settling = false;
|
|
521
|
-
showSoon();
|
|
522
|
-
};
|
|
523
|
-
const settle = (claim: boolean) => {
|
|
524
|
-
const target = propose();
|
|
525
|
-
resize(claim);
|
|
526
|
-
// Not laid out yet (a panel sliding in, a background tab): shown once it is, from the observer.
|
|
527
|
-
if (!target) {
|
|
528
|
-
hide();
|
|
529
|
-
return;
|
|
530
|
-
}
|
|
531
|
-
if (!term || (target.cols === term.cols && target.rows === term.rows)) {
|
|
532
|
-
reveal();
|
|
533
|
-
return;
|
|
534
|
-
}
|
|
535
|
-
hide();
|
|
536
|
-
gridChanged.current = () => {
|
|
537
|
-
if (term && term.cols === target.cols && term.rows === target.rows) reveal();
|
|
538
|
-
};
|
|
539
|
-
window.clearTimeout(revealTimer);
|
|
540
|
-
revealTimer = window.setTimeout(reveal, 400);
|
|
541
|
-
};
|
|
542
|
-
|
|
543
|
-
claimRef.current = () => resize(true);
|
|
544
|
-
unregister = store.addView(terminalId, {
|
|
545
|
-
output: (offset, data) => (attached ? apply(offset, data) : queued.push({ kind: 'output', offset, data })),
|
|
546
|
-
reset: (offset, data) => (attached ? reset(offset, data) : queued.push({ kind: 'reset', offset, data })),
|
|
547
|
-
reattach: () => void attach(),
|
|
548
|
-
});
|
|
549
|
-
|
|
550
|
-
// The fonts first: cells are measured once, from the font the canvas has when it opens.
|
|
551
|
-
void Promise.all([
|
|
552
|
-
loadGhostty(symbolsFontUrl),
|
|
553
|
-
document.fonts.load(`${fontSize}px ${fontFamily}`).catch(() => []),
|
|
554
|
-
]).then(
|
|
555
|
-
([{ Terminal: GhosttyTerminal, FitAddon }]) => {
|
|
556
|
-
if (disposed) return;
|
|
557
|
-
const mount = host.querySelector<HTMLElement>('[data-terminal-mount]');
|
|
558
|
-
if (!mount) return;
|
|
559
|
-
mountEl = mount;
|
|
560
|
-
hide();
|
|
561
|
-
term = new GhosttyTerminal({
|
|
562
|
-
...(ptySize.current.cols >= 2 && ptySize.current.rows >= 2 ? ptySize.current : {}),
|
|
563
|
-
fontFamily,
|
|
564
|
-
fontSize,
|
|
565
|
-
theme,
|
|
566
|
-
scrollback: SCROLLBACK,
|
|
567
|
-
cursorBlink: false,
|
|
568
|
-
cursorStyle: 'block',
|
|
569
|
-
linkHandler: libraryLinkHandler(links),
|
|
570
|
-
});
|
|
571
|
-
termRef.current = term;
|
|
572
|
-
openTerminal(term, mount);
|
|
573
|
-
// The wasm grid starts on unzeroed memory (cells of a terminal freed earlier):
|
|
574
|
-
// rows no output reaches show them until a clear. Nothing answers RIS, so no replies.
|
|
575
|
-
term.write(CLEAR);
|
|
576
|
-
onFocusChange = (event) => {
|
|
577
|
-
const inside = event.type === 'focusin' || mount.contains(event.relatedTarget as Node | null);
|
|
578
|
-
if (inside === focused) return;
|
|
579
|
-
focused = inside;
|
|
580
|
-
if (term) term.options.cursorBlink = focused && !loopPaused;
|
|
581
|
-
};
|
|
582
|
-
mount.addEventListener('focusin', onFocusChange);
|
|
583
|
-
mount.addEventListener('focusout', onFocusChange);
|
|
584
|
-
const fit = new FitAddon();
|
|
585
|
-
term.loadAddon(fit);
|
|
586
|
-
// Hidden (panel closed, drawer animating shut, a background tab): nothing to propose.
|
|
587
|
-
propose = () => {
|
|
588
|
-
if (disposed || mount.clientWidth === 0 || mount.clientHeight === 0) return null;
|
|
589
|
-
const size = fit.proposeDimensions();
|
|
590
|
-
return size && size.cols >= 2 && size.rows >= 2 ? { cols: size.cols, rows: size.rows } : null;
|
|
591
|
-
};
|
|
592
|
-
term.onData((data) => {
|
|
593
|
-
if (writing === 'history') return;
|
|
594
|
-
if (writing === 'live') {
|
|
595
|
-
void api.write(terminalId, data, { clientId, response: true }).catch(() => undefined);
|
|
596
|
-
return;
|
|
597
|
-
}
|
|
598
|
-
if (Date.now() - lastClaim > CLAIM_EVERY_MS) resize(true);
|
|
599
|
-
void api.write(terminalId, data, { clientId }).catch(() => undefined);
|
|
600
|
-
});
|
|
601
|
-
term.registerLinkProvider({
|
|
602
|
-
provideLinks: (y, callback) => callback(linksOnRow(term, y, links)),
|
|
603
|
-
});
|
|
604
|
-
// Container changes propose a new size; coming back into view (a tab or panel shown again) claims it.
|
|
605
|
-
let wasHidden = mount.clientWidth === 0 || mount.clientHeight === 0;
|
|
606
|
-
onVisibility = () => {
|
|
607
|
-
viewHidden = wasHidden || document.hidden;
|
|
608
|
-
updateRendering();
|
|
609
|
-
};
|
|
610
|
-
onVisibility();
|
|
611
|
-
document.addEventListener('visibilitychange', onVisibility);
|
|
612
|
-
let claimNext = false;
|
|
613
|
-
observer = new ResizeObserver(() => {
|
|
614
|
-
const hidden = mount.clientWidth === 0 || mount.clientHeight === 0;
|
|
615
|
-
const shown = wasHidden && !hidden;
|
|
616
|
-
wasHidden = hidden;
|
|
617
|
-
onVisibility?.();
|
|
618
|
-
claimNext ||= shown;
|
|
619
|
-
window.clearTimeout(fitTimer);
|
|
620
|
-
// Shown again at another size: hidden until the new size is in, like on open.
|
|
621
|
-
fitTimer = window.setTimeout(
|
|
622
|
-
() => {
|
|
623
|
-
const claim = claimNext;
|
|
624
|
-
claimNext = false;
|
|
625
|
-
if (claim && attached) settle(true);
|
|
626
|
-
else resize(claim);
|
|
627
|
-
},
|
|
628
|
-
shown ? 0 : FIT_DEBOUNCE_MS,
|
|
629
|
-
);
|
|
630
|
-
});
|
|
631
|
-
observer.observe(mount);
|
|
632
|
-
// Test hooks (ghostty paints to a canvas): buffer text, where some text is on screen, selection.
|
|
633
|
-
Object.defineProperty(host, 'zgBufferText', {
|
|
634
|
-
configurable: true,
|
|
635
|
-
value: () => bufferText(term),
|
|
636
|
-
});
|
|
637
|
-
Object.defineProperty(host, 'zgCellCenter', {
|
|
638
|
-
configurable: true,
|
|
639
|
-
value: (needle: string) => cellCenter(term, mount, needle),
|
|
640
|
-
});
|
|
641
|
-
Object.defineProperty(host, 'zgHasSelection', {
|
|
642
|
-
configurable: true,
|
|
643
|
-
value: () => term?.hasSelection() ?? false,
|
|
644
|
-
});
|
|
645
|
-
Object.defineProperty(host, 'zgGrid', {
|
|
646
|
-
configurable: true,
|
|
647
|
-
value: () => (term ? { cols: term.cols, rows: term.rows } : null),
|
|
648
|
-
});
|
|
649
|
-
void attach();
|
|
650
|
-
if (autoFocusRef.current) term.focus();
|
|
651
|
-
},
|
|
652
|
-
(err: unknown) => {
|
|
653
|
-
if (!disposed) setFailed(labels.terminalCouldNotLoad(err instanceof Error ? err.message : String(err)));
|
|
654
|
-
},
|
|
655
|
-
);
|
|
656
|
-
|
|
657
|
-
return () => {
|
|
658
|
-
disposed = true;
|
|
659
|
-
claimRef.current = () => undefined;
|
|
660
|
-
redraw.current = null;
|
|
661
|
-
gridChanged.current = null;
|
|
662
|
-
window.clearTimeout(revealTimer);
|
|
663
|
-
window.clearTimeout(fitTimer);
|
|
664
|
-
window.clearTimeout(ackTimer);
|
|
665
|
-
observer?.disconnect();
|
|
666
|
-
if (onVisibility) document.removeEventListener('visibilitychange', onVisibility);
|
|
667
|
-
if (onFocusChange) {
|
|
668
|
-
mountEl?.removeEventListener('focusin', onFocusChange);
|
|
669
|
-
mountEl?.removeEventListener('focusout', onFocusChange);
|
|
670
|
-
}
|
|
671
|
-
unregister?.();
|
|
672
|
-
void api.detach(terminalId, clientId).catch(() => undefined);
|
|
673
|
-
termRef.current = null;
|
|
674
|
-
term?.dispose();
|
|
675
|
-
};
|
|
676
|
-
// Fonts are applied live above; everything else re-creates the view.
|
|
677
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
678
|
-
}, [terminalId, themeKey]);
|
|
679
|
-
|
|
680
|
-
const onKeyDownCapture = (e: ReactKeyboardEvent<HTMLDivElement>) => {
|
|
681
|
-
const term = termRef.current;
|
|
682
|
-
// The context menu is portaled but its events bubble through React here.
|
|
683
|
-
if (!term || !hostRef.current?.contains(e.target as Node)) return;
|
|
684
|
-
const native = e.nativeEvent;
|
|
685
|
-
// macOS editing keys (⌘⌫, ⌥←, …) as Terminal.app sends them; stopped here, before ghostty and app bindings.
|
|
686
|
-
const edit = macTerminalKey(native);
|
|
687
|
-
if (edit) {
|
|
688
|
-
e.preventDefault();
|
|
689
|
-
e.stopPropagation();
|
|
690
|
-
term.input(edit, true);
|
|
691
|
-
return;
|
|
692
|
-
}
|
|
693
|
-
const skip = () => Object.defineProperty(native, 'isComposing', { value: true });
|
|
694
|
-
if (native.metaKey && !native.ctrlKey && !native.altKey) {
|
|
695
|
-
const key = native.key.toLowerCase();
|
|
696
|
-
// Cmd+C copies a selection; Cmd+V is left to the native paste event, which the library brackets.
|
|
697
|
-
if (key === 'c' && term.copySelection()) e.preventDefault();
|
|
698
|
-
skip();
|
|
699
|
-
return;
|
|
700
|
-
}
|
|
701
|
-
if ((native.ctrlKey || native.altKey) && isAppChord(native, keybindings)) skip();
|
|
702
|
-
};
|
|
703
|
-
|
|
704
|
-
// Keys the terminal took stop here, so window-level bindings (shift+tab, …) never see them.
|
|
705
|
-
const onKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {
|
|
706
|
-
if (hostRef.current?.contains(e.target as Node) && !e.nativeEvent.isComposing) e.stopPropagation();
|
|
707
|
-
};
|
|
708
|
-
|
|
709
|
-
const onContextMenu = (e: React.MouseEvent) => {
|
|
710
|
-
const term = termRef.current;
|
|
711
|
-
if (!term || !hostRef.current?.contains(e.target as Node)) return;
|
|
712
|
-
e.preventDefault();
|
|
713
|
-
// The program tracks the mouse: its right-click was reported to it. Shift+right-click is ours.
|
|
714
|
-
if (term.hasMouseTracking() && !e.shiftKey) return;
|
|
715
|
-
setMenu({ x: e.clientX, y: e.clientY, selection: term.hasSelection() ? term.getSelection() : '' });
|
|
716
|
-
};
|
|
717
|
-
|
|
718
|
-
// Read when the menu renders: no chat for this scope (a panels window, a project page), nowhere to add to.
|
|
719
|
-
const chat = actions.addToChat !== undefined && menu !== null && (actions.canAddToChat?.(scope) ?? true);
|
|
720
|
-
const addToChat = () => {
|
|
721
|
-
if (!chat) return;
|
|
722
|
-
const term = termRef.current;
|
|
723
|
-
if (!term || !menu?.selection) return;
|
|
724
|
-
const range = selectionLines(term);
|
|
725
|
-
actions.addToChat?.(scope, {
|
|
726
|
-
label: labelRef.current,
|
|
727
|
-
startLine: range?.start ?? 1,
|
|
728
|
-
endLine: range?.end ?? 1,
|
|
729
|
-
text: menu.selection,
|
|
730
|
-
});
|
|
731
|
-
};
|
|
732
|
-
|
|
733
|
-
const items: RowActionItem[] = [
|
|
734
|
-
...(actions.addToChat
|
|
735
|
-
? [
|
|
736
|
-
{
|
|
737
|
-
id: 'chat',
|
|
738
|
-
label: chat ? labels.terminalAddToChat : labels.terminalAddToChatNowhere,
|
|
739
|
-
shortcut: 'a',
|
|
740
|
-
disabled: !menu?.selection || !chat,
|
|
741
|
-
onSelect: addToChat,
|
|
742
|
-
},
|
|
743
|
-
]
|
|
744
|
-
: []),
|
|
745
|
-
{
|
|
746
|
-
id: 'copy',
|
|
747
|
-
label: labels.terminalCopy,
|
|
748
|
-
shortcut: 'c',
|
|
749
|
-
disabled: !menu?.selection,
|
|
750
|
-
onSelect: () => void navigator.clipboard.writeText(menu?.selection ?? ''),
|
|
751
|
-
},
|
|
752
|
-
{
|
|
753
|
-
id: 'paste',
|
|
754
|
-
label: labels.terminalPaste,
|
|
755
|
-
shortcut: 'v',
|
|
756
|
-
onSelect: () => {
|
|
757
|
-
const term = termRef.current;
|
|
758
|
-
if (term) void paste(term).then(() => term.focus());
|
|
759
|
-
},
|
|
760
|
-
},
|
|
761
|
-
{ id: 'clear', label: labels.terminalClear, shortcut: 'k', onSelect: () => termRef.current?.clear() },
|
|
762
|
-
];
|
|
763
|
-
|
|
764
|
-
return (
|
|
765
|
-
// The canvas's own input handles the keys; this root only filters them on the way.
|
|
766
|
-
// eslint-disable-next-line jsx-a11y/no-static-element-interactions
|
|
767
|
-
<div
|
|
768
|
-
ref={hostRef}
|
|
769
|
-
className={`relative flex-1 min-h-0 min-w-0 flex overflow-hidden${className ? ` ${className}` : ''}`}
|
|
770
|
-
data-testid="terminal-surface"
|
|
771
|
-
data-terminal-id={terminalId}
|
|
772
|
-
data-zg-keyscope="editor"
|
|
773
|
-
onKeyDownCapture={onKeyDownCapture}
|
|
774
|
-
onKeyDown={onKeyDown}
|
|
775
|
-
onFocusCapture={() => claimRef.current()}
|
|
776
|
-
onContextMenu={onContextMenu}
|
|
777
|
-
>
|
|
778
|
-
{/* ghostty-web makes the mount contenteditable: hide the browser's caret, the canvas draws the real one. */}
|
|
779
|
-
<div data-terminal-mount className="absolute inset-0 pl-2 pt-1" style={{ caretColor: 'transparent' }} />
|
|
780
|
-
{failed && (
|
|
781
|
-
<div className="absolute inset-x-0 top-0 m-2 px-2.5 py-1.5 rounded-md bg-zg-danger/10 text-zg-label text-[var(--zg-danger)]">
|
|
782
|
-
{failed}
|
|
783
|
-
</div>
|
|
784
|
-
)}
|
|
785
|
-
<RowActionsMenu
|
|
786
|
-
open={menu !== null}
|
|
787
|
-
position={menu ? { x: menu.x, y: menu.y } : null}
|
|
788
|
-
onClose={() => setMenu(null)}
|
|
789
|
-
items={items}
|
|
790
|
-
/>
|
|
791
|
-
</div>
|
|
792
|
-
);
|
|
793
|
-
}
|
|
794
|
-
|
|
795
|
-
/** The menu's Paste (no native paste event there): bracketed when the program enabled it. */
|
|
796
|
-
async function paste(term: Terminal): Promise<void> {
|
|
797
|
-
const text = await navigator.clipboard.readText().catch(() => '');
|
|
798
|
-
if (text) term.paste(text);
|
|
799
|
-
}
|
|
800
|
-
|
|
801
|
-
/** App bindings that are app intents even inside a terminal (same rule as the editor). */
|
|
802
|
-
function isAppChord(event: KeyboardEvent, host: KeybindingsHost | null): boolean {
|
|
803
|
-
const merged = getMergedKeybindings(host);
|
|
804
|
-
for (const action of Object.keys(merged) as KeyAction[]) {
|
|
805
|
-
for (const spec of parseBindingSpecs(merged[action])) {
|
|
806
|
-
if (matchesBinding(event, spec) && bindingAllowedIn('editor', spec, action)) return true;
|
|
807
|
-
}
|
|
808
|
-
}
|
|
809
|
-
return false;
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
/** Buffer lines of the selection (1-based), from the viewport rows ghostty reports. */
|
|
813
|
-
function selectionLines(term: Terminal): { start: number; end: number } | null {
|
|
814
|
-
const range: IBufferRange | undefined = term.getSelectionPosition();
|
|
815
|
-
if (!range) return null;
|
|
816
|
-
const top = term.getScrollbackLength() - Math.floor(term.getViewportY());
|
|
817
|
-
return { start: top + range.start.y + 1, end: top + range.end.y + 1 };
|
|
818
|
-
}
|
|
819
|
-
|
|
820
|
-
/** Plain text of the whole buffer (tests read it through the host's `zgBufferText`). */
|
|
821
|
-
function bufferText(term: Terminal | null): string {
|
|
822
|
-
if (!term) return '';
|
|
823
|
-
const buf = term.buffer.active;
|
|
824
|
-
const out: string[] = [];
|
|
825
|
-
for (let y = 0; y < buf.length; y++) out.push(buf.getLine(y)?.translateToString(true) ?? '');
|
|
826
|
-
return out.join('\n').replace(/\n+$/, '');
|
|
827
|
-
}
|
|
828
|
-
|
|
829
|
-
/**
|
|
830
|
-
* Clicks on links the library found (OSC 8 hyperlinks, URLs with a scheme).
|
|
831
|
-
* A plain click opens web pages in the Browser tab, Cmd/Ctrl in the system
|
|
832
|
-
* browser; file hyperlinks open in Files (only when the terminal's paths are
|
|
833
|
-
* this machine's); mailto only on Cmd/Ctrl-click.
|
|
834
|
-
*/
|
|
835
|
-
function libraryLinkHandler(ctx: { current: LinkContext | null }): ILinkHandler {
|
|
836
|
-
return {
|
|
837
|
-
activate: (event, uri) => {
|
|
838
|
-
const c = ctx.current;
|
|
839
|
-
const target = linkTarget(uri);
|
|
840
|
-
if (!c || !target) return;
|
|
841
|
-
const modified = event.metaKey || event.ctrlKey;
|
|
842
|
-
// A server's loopback address: nothing on this computer to open.
|
|
843
|
-
if (target.kind === 'web' && c.unreachable(target.url)) return;
|
|
844
|
-
if (target.kind === 'web') c.openUrl(target.url, modified);
|
|
845
|
-
else if (target.kind === 'file') {
|
|
846
|
-
if (c.cwd)
|
|
847
|
-
c.openFile(
|
|
848
|
-
target.path,
|
|
849
|
-
event,
|
|
850
|
-
target.line !== undefined ? { line: target.line, column: target.column } : undefined,
|
|
851
|
-
);
|
|
852
|
-
} else if (modified) window.open(target.url, '_blank', 'noopener,noreferrer');
|
|
853
|
-
},
|
|
854
|
-
hover: (_event, uri) => {
|
|
855
|
-
const target = linkTarget(uri);
|
|
856
|
-
ctx.current?.tip(target?.kind === 'web' ? ctx.current.unreachable(target.url) : null);
|
|
857
|
-
},
|
|
858
|
-
leave: () => ctx.current?.tip(null),
|
|
859
|
-
};
|
|
860
|
-
}
|
|
861
|
-
|
|
862
|
-
/** Viewport point of the last on-screen occurrence of `needle` (ASCII), for tests. */
|
|
863
|
-
function cellCenter(term: Terminal | null, mount: HTMLElement, needle: string): { x: number; y: number } | null {
|
|
864
|
-
const canvas = mount.querySelector('canvas');
|
|
865
|
-
if (!term || !canvas) return null;
|
|
866
|
-
const rect = canvas.getBoundingClientRect();
|
|
867
|
-
const width = rect.width / term.cols;
|
|
868
|
-
const height = rect.height / term.rows;
|
|
869
|
-
const top = term.getScrollbackLength() - Math.floor(term.getViewportY());
|
|
870
|
-
for (let row = term.rows - 1; row >= 0; row--) {
|
|
871
|
-
const col =
|
|
872
|
-
term.buffer.active
|
|
873
|
-
.getLine(top + row)
|
|
874
|
-
?.translateToString(true)
|
|
875
|
-
.indexOf(needle) ?? -1;
|
|
876
|
-
if (col >= 0) return { x: rect.left + (col + 0.5) * width, y: rect.top + (row + 0.5) * height };
|
|
877
|
-
}
|
|
878
|
-
return null;
|
|
879
|
-
}
|
|
880
|
-
|
|
881
|
-
/** Our links: file paths and scheme-less local servers (see `detectLinks`). */
|
|
882
|
-
function linksOnRow(term: Terminal | null, y: number, ctx: { current: LinkContext | null }): ILink[] | undefined {
|
|
883
|
-
const line = term?.buffer.active.getLine(y);
|
|
884
|
-
if (!line) return undefined;
|
|
885
|
-
let text = '';
|
|
886
|
-
const cols: number[] = [];
|
|
887
|
-
for (let x = 0; x < line.length; x++) {
|
|
888
|
-
const cell = line.getCell(x);
|
|
889
|
-
if (!cell) break;
|
|
890
|
-
if (cell.getWidth() === 0) continue;
|
|
891
|
-
const chars = cell.getChars() || ' ';
|
|
892
|
-
for (let i = 0; i < chars.length; i++) cols.push(x);
|
|
893
|
-
text += chars;
|
|
894
|
-
}
|
|
895
|
-
const found = detectLinks(text).filter((l) => l.kind === 'url' || ctx.current?.cwd);
|
|
896
|
-
if (found.length === 0) return undefined;
|
|
897
|
-
return found.map((l) => ({
|
|
898
|
-
text: l.text,
|
|
899
|
-
range: { start: { x: cols[l.start] ?? 0, y }, end: { x: cols[l.end - 1] ?? 0, y } },
|
|
900
|
-
hover: (isHovered: boolean) =>
|
|
901
|
-
ctx.current?.tip(isHovered && l.kind === 'url' ? ctx.current.unreachable(l.url) : null),
|
|
902
|
-
activate: (event: MouseEvent) => {
|
|
903
|
-
const c = ctx.current;
|
|
904
|
-
if (!c) return;
|
|
905
|
-
// A server's loopback address: nothing on this computer to open.
|
|
906
|
-
if (l.kind === 'url' && c.unreachable(l.url)) return;
|
|
907
|
-
if (l.kind === 'url') c.openUrl(l.url, event.metaKey || event.ctrlKey);
|
|
908
|
-
else c.openFile(l.path, event, l.line !== undefined ? { line: l.line, column: l.column } : undefined);
|
|
909
|
-
},
|
|
910
|
-
}));
|
|
911
|
-
}
|