zidane-ui 9.1.1 → 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 +2 -0
- package/dist/adapters/index.js +1 -1
- package/dist/adapters/server-transcript-members.d.ts +1 -1
- package/dist/adapters/server-transcript-members.js +19 -1
- package/dist/app/ModalProvider.d.ts +3 -1
- package/dist/app/ModalProvider.js +15 -9
- package/dist/approvals/headless/index.js +1 -1
- package/dist/chat/HostTranscript.d.ts +3 -1
- package/dist/chat/HostTranscript.js +5 -3
- package/dist/chat/Transcript.js +1 -1
- package/dist/chat/composer/ComposerEditor.js +1 -1
- package/dist/chat/composer/index.js +1 -1
- package/dist/chat/composer/use-composer-stores.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/composer/index.js +2 -2
- 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 +3 -0
- package/dist/chat/headless/index.d.ts +2 -1
- package/dist/chat/headless/index.js +12 -11
- package/dist/chat/headless/labels.d.ts +42 -0
- package/dist/chat/headless/labels.js +42 -0
- package/dist/chat/headless/session-list.d.ts +27 -0
- package/dist/chat/headless/sidebar/index.js +1 -1
- package/dist/chat/headless/sidebar/labels.d.ts +27 -0
- package/dist/chat/headless/streams/index.js +1 -1
- package/dist/chat/headless/streams/live-events.js +2 -1
- package/dist/chat/headless/streams/session-streams.js +2 -2
- package/dist/chat/headless/streams/store.js +2 -2
- 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 +18 -3
- package/dist/chat/headless/transcript/fold.js +26 -10
- package/dist/chat/headless/transcript/index.js +1 -1
- package/dist/chat/headless/transcript/rows.d.ts +7 -1
- package/dist/chat/index.d.ts +6 -1
- package/dist/chat/index.js +7 -2
- package/dist/chat/testing/contract.d.ts +6 -1
- package/dist/chat/testing/contract.js +30 -3
- package/dist/chat/transcript/AnsiText.d.ts +27 -0
- package/dist/chat/transcript/AnsiText.js +73 -0
- package/dist/chat/transcript/CodemodeScript.d.ts +33 -0
- package/dist/chat/transcript/CodemodeScript.js +212 -0
- package/dist/chat/transcript/LiveOutput.d.ts +21 -0
- package/dist/chat/transcript/LiveOutput.js +42 -0
- package/dist/chat/transcript/TranscriptRow.js +19 -2
- package/dist/chat/transcript/actions.d.ts +6 -0
- package/dist/chat/transcript/index.d.ts +6 -1
- package/dist/chat/transcript/index.js +6 -1
- package/dist/chat/transcript/markdown.js +9 -0
- package/dist/chat/transcript/renderers.d.ts +7 -0
- 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-parts.d.ts +18 -6
- package/dist/chat/transcript/tool-parts.js +15 -5
- package/dist/chat/transcript/tool-payload.js +6 -3
- package/dist/chat/transcript/tool-row.js +155 -96
- package/dist/chat/transcript/user-bash.js +3 -2
- package/dist/code/HighlightedCode.js +3 -69
- package/dist/code/highlight-lines.d.ts +24 -0
- package/dist/code/highlight-lines.js +41 -0
- package/dist/code/use-highlighted-html.d.ts +5 -0
- package/dist/code/use-highlighted-html.js +75 -0
- package/dist/core.css +6 -2
- package/dist/dist/{index-CGbOWa7y.d.ts → index-WlE93Q6d.d.ts} +101 -3
- package/dist/extensions/ExtensionSettingsSidebar.js +19 -3
- package/dist/extensions/kit.d.ts +1 -1
- package/dist/git/BranchMenu.d.ts +1 -7
- package/dist/git/BranchMenu.js +17 -40
- package/dist/git/headless/labels.d.ts +0 -2
- package/dist/git/headless/labels.js +0 -2
- package/dist/index.d.ts +4 -3
- package/dist/index.js +2 -1
- package/dist/onboarding/index.js +1 -1
- package/dist/onboarding/steps/ConnectStep.js +1 -1
- package/dist/onboarding/steps/ExtensionsStep.js +1 -1
- package/dist/onboarding/steps/ReadyStep.js +1 -1
- package/dist/onboarding/steps/connect/ProviderPanel.js +1 -1
- package/dist/session/headless/index.js +2 -2
- package/dist/settings/SettingsShell.d.ts +3 -1
- package/dist/settings/SettingsShell.js +15 -8
- package/dist/settings/headless/catalog.js +5 -0
- package/dist/settings/headless/layout.js +2 -1
- package/dist/settings/headless/registry.d.ts +2 -0
- package/dist/settings/headless/search.d.ts +1 -1
- package/dist/settings/sections/environments/EnvironmentsSection.js +1 -1
- package/dist/settings/sections/extensions/ExtensionsSection.js +2 -2
- package/dist/settings/sections/models/ModelRows.js +1 -1
- package/dist/settings/sections/models/model-test.js +1 -1
- package/dist/styles.css +291 -2
- package/dist/terminal/TerminalProvider.d.ts +3 -1
- package/dist/terminal/TerminalProvider.js +5 -1
- package/dist/terminal/headless/store.d.ts +10 -0
- package/dist/terminal/headless/store.js +16 -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/package.json +3 -6
- package/src/styles/primitives.css +5 -2
- package/src/styles/transcript.css +281 -0
- 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/extension-modules.ts +0 -360
- package/src/adapters/index.ts +0 -35
- package/src/adapters/live-events.ts +0 -6
- package/src/adapters/live.ts +0 -270
- 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 -459
- package/src/adapters/server-extensions-host.ts +0 -979
- 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 -489
- 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 -222
- 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 -135
- package/src/app/ModalProvider.tsx +0 -731
- package/src/app/headless/app-host.ts +0 -61
- 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 -383
- 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 -234
- 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 -310
- 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/RunEstimateChip.tsx +0 -168
- package/src/chat/SessionFilterMenu.tsx +0 -397
- package/src/chat/SessionGroupHeader.tsx +0 -177
- package/src/chat/SessionHostHeader.tsx +0 -66
- package/src/chat/SessionList.tsx +0 -413
- package/src/chat/SessionListRow.tsx +0 -296
- 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 -270
- package/src/chat/Transcript.tsx +0 -523
- 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 -168
- 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 -187
- 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/SelectTurnHint.tsx +0 -40
- package/src/chat/composer/SendButton.tsx +0 -89
- package/src/chat/composer/ServerScopeToggle.tsx +0 -188
- 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 -317
- 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 -317
- 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 -40
- 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 -227
- 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 -197
- package/src/chat/headless/composer/host.ts +0 -250
- package/src/chat/headless/composer/index.ts +0 -17
- 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/extension-sources.ts +0 -64
- 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 -264
- package/src/chat/headless/hosts.ts +0 -55
- package/src/chat/headless/index.ts +0 -31
- package/src/chat/headless/labels.ts +0 -373
- 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 -400
- package/src/chat/headless/sidebar/activity.ts +0 -179
- package/src/chat/headless/sidebar/badges.ts +0 -190
- package/src/chat/headless/sidebar/compaction.ts +0 -98
- package/src/chat/headless/sidebar/directory.ts +0 -1046
- package/src/chat/headless/sidebar/dot-state.ts +0 -36
- package/src/chat/headless/sidebar/environment.ts +0 -70
- package/src/chat/headless/sidebar/estimates.ts +0 -146
- package/src/chat/headless/sidebar/host.ts +0 -41
- package/src/chat/headless/sidebar/index.ts +0 -18
- package/src/chat/headless/sidebar/labels.ts +0 -161
- 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/query.ts +0 -621
- package/src/chat/headless/sidebar/rows.ts +0 -427
- package/src/chat/headless/sidebar/types.ts +0 -96
- package/src/chat/headless/sidebar/view.ts +0 -367
- 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 -407
- 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 -789
- 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 -377
- 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 -31
- 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 -1071
- 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-extension-composer.ts +0 -80
- 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 -399
- package/src/chat/sidebar/RowChips.tsx +0 -98
- package/src/chat/sidebar/SessionSidebar.tsx +0 -1039
- package/src/chat/sidebar/SidebarDecoration.tsx +0 -93
- package/src/chat/sidebar/SidebarFilterMenu.tsx +0 -270
- package/src/chat/sidebar/SidebarFooter.tsx +0 -244
- package/src/chat/sidebar/SidebarFrame.tsx +0 -154
- package/src/chat/sidebar/SidebarGroupHeader.tsx +0 -263
- package/src/chat/sidebar/SidebarHostProvider.tsx +0 -51
- package/src/chat/sidebar/SidebarRowView.tsx +0 -151
- package/src/chat/sidebar/SidebarSearchRow.tsx +0 -66
- package/src/chat/sidebar/SidebarSessionRow.tsx +0 -317
- package/src/chat/sidebar/SidebarToggleButton.tsx +0 -48
- package/src/chat/sidebar/SpaceSwitcher.tsx +0 -341
- package/src/chat/sidebar/SpacesSection.tsx +0 -259
- package/src/chat/sidebar/collapsed.ts +0 -61
- package/src/chat/sidebar/index.ts +0 -109
- package/src/chat/sidebar/session-menu.ts +0 -441
- package/src/chat/sidebar/sidebar-focus-hold.ts +0 -56
- package/src/chat/sidebar/sidebar-live.tsx +0 -666
- package/src/chat/sidebar/use-main-session.ts +0 -32
- package/src/chat/sidebar/useAgentNames.ts +0 -12
- package/src/chat/sidebar/useCompactionProgress.ts +0 -24
- package/src/chat/sidebar/usePinnedProjects.ts +0 -36
- package/src/chat/sidebar/useSaveViewAsSpace.ts +0 -42
- package/src/chat/sidebar/useSessionActivity.ts +0 -24
- package/src/chat/sidebar/useSessionBadges.ts +0 -26
- package/src/chat/sidebar/useSessionDirectoryView.ts +0 -128
- package/src/chat/sidebar/useSessionSearch.ts +0 -94
- package/src/chat/sidebar/useSidebarKeyboardNav.ts +0 -167
- package/src/chat/sidebar/useSidebarLabels.ts +0 -10
- package/src/chat/testing/composer.contract.ts +0 -508
- package/src/chat/testing/contract.ts +0 -634
- package/src/chat/testing/fixture-composer-chrome.ts +0 -159
- 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 -241
- package/src/chat/transcript/CardMarkdown.tsx +0 -102
- package/src/chat/transcript/ChipCard.tsx +0 -187
- 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 -176
- package/src/chat/transcript/FileChip.tsx +0 -361
- package/src/chat/transcript/ImageGenerationBlock.tsx +0 -239
- package/src/chat/transcript/InlineChipText.tsx +0 -57
- package/src/chat/transcript/InteractionToolBody.tsx +0 -211
- package/src/chat/transcript/LazyRow.tsx +0 -311
- package/src/chat/transcript/MermaidDiagram.tsx +0 -484
- package/src/chat/transcript/PromptEcho.tsx +0 -171
- package/src/chat/transcript/PromptOriginLabel.tsx +0 -44
- package/src/chat/transcript/ProseMarkdown.tsx +0 -168
- package/src/chat/transcript/ReferenceText.tsx +0 -198
- 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 -224
- package/src/chat/transcript/TranscriptRow.tsx +0 -362
- 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 -155
- package/src/chat/transcript/chip-details.ts +0 -169
- package/src/chat/transcript/chip-resolve.ts +0 -56
- package/src/chat/transcript/extension-renderers.tsx +0 -148
- 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 -522
- package/src/chat/transcript/frame.tsx +0 -326
- package/src/chat/transcript/index.ts +0 -66
- package/src/chat/transcript/markdown-cache.ts +0 -84
- package/src/chat/transcript/markdown-context.ts +0 -52
- package/src/chat/transcript/markdown.tsx +0 -351
- package/src/chat/transcript/messages.tsx +0 -169
- 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/recent-map.ts +0 -32
- package/src/chat/transcript/references.ts +0 -108
- 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 -251
- 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 -102
- package/src/chat/transcript/tool-details.tsx +0 -31
- package/src/chat/transcript/tool-media.tsx +0 -132
- package/src/chat/transcript/tool-parts.tsx +0 -358
- package/src/chat/transcript/tool-payload.tsx +0 -76
- package/src/chat/transcript/tool-row.tsx +0 -496
- 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 -163
- 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/transcript-options.ts +0 -51
- package/src/chat/useChatLabels.ts +0 -14
- package/src/code/CodeHighlightProvider.tsx +0 -87
- package/src/code/HighlightedCode.tsx +0 -156
- package/src/code/code-themes.ts +0 -187
- package/src/code/editor/CodeCompletion.tsx +0 -719
- package/src/code/editor/CodeEditor.tsx +0 -480
- package/src/code/editor/CodeHover.tsx +0 -429
- 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 -32
- 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 -155
- 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 -16
- package/src/code/highlighter.ts +0 -181
- package/src/code/highlights.ts +0 -51
- package/src/code/mermaid-lexer.ts +0 -331
- package/src/code/shiki-theme.ts +0 -46
- package/src/components/BrandMark.tsx +0 -118
- 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 -225
- 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 -593
- 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/extensions/ExtensionComponent.tsx +0 -167
- package/src/extensions/ExtensionDialogHost.tsx +0 -445
- package/src/extensions/ExtensionRenderer.tsx +0 -100
- package/src/extensions/ExtensionScreen.tsx +0 -122
- package/src/extensions/ExtensionSettingsPage.tsx +0 -112
- package/src/extensions/ExtensionSettingsPages.tsx +0 -44
- package/src/extensions/ExtensionSettingsSidebar.tsx +0 -373
- package/src/extensions/ExtensionSlot.tsx +0 -213
- package/src/extensions/ExtensionWebview.tsx +0 -104
- package/src/extensions/ExtensionsProvider.tsx +0 -124
- package/src/extensions/SettingsWireForm.tsx +0 -182
- package/src/extensions/headless/dialog-queue.ts +0 -92
- package/src/extensions/headless/effect-channel.ts +0 -50
- package/src/extensions/headless/effect-router.ts +0 -107
- package/src/extensions/headless/fixture-host.ts +0 -381
- package/src/extensions/headless/host.ts +0 -398
- package/src/extensions/headless/index.ts +0 -17
- package/src/extensions/headless/labels.ts +0 -64
- package/src/extensions/headless/links.ts +0 -56
- package/src/extensions/headless/select.ts +0 -249
- package/src/extensions/headless/webview-bridge.ts +0 -127
- package/src/extensions/headless/wire.ts +0 -175
- package/src/extensions/hooks.ts +0 -209
- package/src/extensions/index.ts +0 -25
- package/src/extensions/kit.ts +0 -79
- package/src/extensions/links.tsx +0 -165
- package/src/extensions/testing/contract.ts +0 -382
- package/src/extensions/testing/index.ts +0 -6
- package/src/extensions/useExtensionsLabels.ts +0 -14
- package/src/files/CodeViewer.tsx +0 -289
- package/src/files/DiffFileViewer.tsx +0 -143
- package/src/files/DiffsTab.tsx +0 -581
- package/src/files/EditorColumn.tsx +0 -453
- package/src/files/EditorEnvironmentRoot.tsx +0 -63
- 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 -192
- 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 -58
- 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 -25
- package/src/files/lazy-tabs.tsx +0 -41
- package/src/files/session-patch.ts +0 -45
- 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 -181
- 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 -988
- package/src/git/GitBar.tsx +0 -297
- package/src/git/GitProvider.tsx +0 -50
- package/src/git/ImportRepoDialog.tsx +0 -390
- package/src/git/MoveSessionDialog.tsx +0 -396
- 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/useDisplayPath.tsx +0 -93
- 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 -119
- 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 -15
- package/src/keybindings/load-once.ts +0 -11
- package/src/keybindings/match.ts +0 -48
- package/src/keybindings/press.ts +0 -80
- 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 -364
- package/src/machines/headless/messages.ts +0 -209
- 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 -196
- package/src/onboarding/demos/autonomy.tsx +0 -154
- package/src/onboarding/demos/extensions.tsx +0 -183
- package/src/onboarding/demos/features.tsx +0 -488
- 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 -282
- package/src/onboarding/index.ts +0 -21
- package/src/onboarding/marks.tsx +0 -107
- package/src/onboarding/preview-attachments.ts +0 -39
- package/src/onboarding/skills/SkillSourceBrowser.tsx +0 -128
- package/src/onboarding/skills/parts.tsx +0 -464
- package/src/onboarding/sources/SourceBrowser.tsx +0 -400
- package/src/onboarding/steps/AutonomyStep.tsx +0 -128
- package/src/onboarding/steps/ConnectStep.tsx +0 -104
- package/src/onboarding/steps/ConnectorsStep.tsx +0 -222
- package/src/onboarding/steps/ConversationStep.tsx +0 -132
- 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 -199
- 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 -260
- package/src/session/ArtifactsPanel.tsx +0 -426
- package/src/session/DiffFileTree.tsx +0 -173
- package/src/session/PanelAttention.tsx +0 -131
- package/src/session/ProjectHome.tsx +0 -733
- package/src/session/ProviderUsageProvider.tsx +0 -113
- 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 -627
- package/src/session/SessionHeader.tsx +0 -242
- package/src/session/SessionProvider.tsx +0 -98
- package/src/session/SessionShell.tsx +0 -77
- package/src/session/SideChat.tsx +0 -320
- package/src/session/TodoList.tsx +0 -123
- package/src/session/TodosPanel.tsx +0 -279
- package/src/session/TurnDetailsDialog.tsx +0 -299
- package/src/session/UsagePanel.tsx +0 -358
- package/src/session/WelcomeScreen.tsx +0 -88
- 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 -362
- package/src/session/headless/home-layout.ts +0 -276
- package/src/session/headless/host.ts +0 -263
- package/src/session/headless/index.ts +0 -23
- package/src/session/headless/keyed.ts +0 -72
- package/src/session/headless/labels.ts +0 -337
- 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 -19
- package/src/session/headless/usage.ts +0 -407
- package/src/session/index.ts +0 -31
- package/src/session/modal-shell.tsx +0 -24
- package/src/session/testing/contract.ts +0 -588
- package/src/session/testing/demo.ts +0 -224
- 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 -198
- package/src/settings/SettingsProvider.tsx +0 -127
- package/src/settings/SettingsRowsPage.tsx +0 -218
- package/src/settings/SettingsShell.tsx +0 -337
- package/src/settings/SettingsTutorial.tsx +0 -55
- package/src/settings/headless/catalog.ts +0 -570
- 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 -391
- package/src/settings/headless/host.ts +0 -127
- 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 -732
- 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 -62
- package/src/settings/headless/resource.ts +0 -75
- package/src/settings/headless/search.ts +0 -142
- package/src/settings/headless/sections-host.ts +0 -340
- 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/ChangeOriginDialog.tsx +0 -218
- package/src/settings/sections/extensions/CreateExtensionDialog.tsx +0 -210
- package/src/settings/sections/extensions/ExtensionConfigRows.tsx +0 -508
- package/src/settings/sections/extensions/ExtensionOptionsSection.tsx +0 -356
- package/src/settings/sections/extensions/ExtensionPicksBar.tsx +0 -112
- package/src/settings/sections/extensions/ExtensionSourceBrowser.tsx +0 -244
- package/src/settings/sections/extensions/ExtensionsSection.tsx +0 -665
- package/src/settings/sections/extensions/create-labels.ts +0 -31
- package/src/settings/sections/extensions/labels.ts +0 -64
- package/src/settings/sections/extensions/options-labels.ts +0 -34
- package/src/settings/sections/host-catalog/HostCatalogSection.tsx +0 -457
- package/src/settings/sections/host-catalog/labels.ts +0 -44
- package/src/settings/sections/index.ts +0 -60
- package/src/settings/sections/instructions/InstructionsSection.tsx +0 -385
- 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 -404
- 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 -151
- 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 -137
- package/src/settings/sections/providers/labels.ts +0 -160
- package/src/settings/sections/shared/catalog.tsx +0 -265
- 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 -917
- 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 -637
- 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 -523
- package/src/workspace/PanelCorner.tsx +0 -111
- package/src/workspace/PanelGroups.tsx +0 -264
- package/src/workspace/PanelHome.tsx +0 -71
- package/src/workspace/PanelItems.tsx +0 -368
- package/src/workspace/PanelStrip.tsx +0 -316
- package/src/workspace/SidePanel.tsx +0 -240
- package/src/workspace/TabParking.tsx +0 -120
- package/src/workspace/WorkspaceProvider.tsx +0 -558
- 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/extension-tabs.tsx +0 -174
- package/src/workspace/frame-motion.ts +0 -160
- package/src/workspace/headless/contents.ts +0 -125
- package/src/workspace/headless/host.ts +0 -129
- package/src/workspace/headless/index.ts +0 -33
- package/src/workspace/headless/labels.ts +0 -44
- 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 -164
- package/src/workspace/index.ts +0 -23
- 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,1039 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The session sidebar, whole: its frame (`SidebarFrame`), the top band (the
|
|
3
|
-
* orchestration Main, New session, the search well with the filter menu),
|
|
4
|
-
* the list (grouped sections whose headers stick, the search results, one
|
|
5
|
-
* list per space that slides on a user switch), the extensions' `sidebar.top`
|
|
6
|
-
* and `sidebar.bottom` blocks pinned right above and below the list (they
|
|
7
|
-
* never scroll with it) and the footer the app puts under it. The keyboard walks the list (`useSidebarKeyboardNav`): ↑ / ↓ go
|
|
8
|
-
* from session to session and skip extension item rows (landing on one would
|
|
9
|
-
* open its target, which may run an extension command); Tab reaches them.
|
|
10
|
-
* An empty list says why: no chats yet, or none matching the view's filters,
|
|
11
|
-
* with a reset when the app passes `onViewChange`.
|
|
12
|
-
*
|
|
13
|
-
* The data comes in as props, the session directory's view
|
|
14
|
-
* (`useSessionDirectoryView`) with the app's actions; the live parts of the
|
|
15
|
-
* rows from the app's {@link SidebarLive}; the platform rows of the menus
|
|
16
|
-
* from the `SidebarHost` in context.
|
|
17
|
-
*/
|
|
18
|
-
import {
|
|
19
|
-
forwardRef,
|
|
20
|
-
useCallback,
|
|
21
|
-
useEffect,
|
|
22
|
-
useLayoutEffect,
|
|
23
|
-
useMemo,
|
|
24
|
-
useRef,
|
|
25
|
-
useState,
|
|
26
|
-
type CSSProperties,
|
|
27
|
-
type ReactNode,
|
|
28
|
-
} from 'react';
|
|
29
|
-
import {
|
|
30
|
-
AnimatePresence,
|
|
31
|
-
domAnimation,
|
|
32
|
-
LazyMotion,
|
|
33
|
-
m,
|
|
34
|
-
useIsPresent,
|
|
35
|
-
type HTMLMotionProps,
|
|
36
|
-
type Variants,
|
|
37
|
-
} from 'motion/react';
|
|
38
|
-
import type { SessionEnvironmentSummary } from 'zidane/chat';
|
|
39
|
-
import { sortRows, type SessionQueryRow, type Space } from 'zidane/chat/pure';
|
|
40
|
-
|
|
41
|
-
import { useExtensionsHost } from '../../extensions/ExtensionsProvider';
|
|
42
|
-
import { useExtensionScreen } from '../../extensions/ExtensionScreen';
|
|
43
|
-
import { ExtensionSlot } from '../../extensions/ExtensionSlot';
|
|
44
|
-
import type { ExtensionItem, SidebarRowActionWire } from '../../extensions/headless/wire';
|
|
45
|
-
import { useOptionalWorkspaceActions } from '../../workspace/WorkspaceProvider';
|
|
46
|
-
|
|
47
|
-
import { KeyHint } from '../../keybindings/KeyHint';
|
|
48
|
-
import { useWithFade } from '../../motion/springs';
|
|
49
|
-
import { basename } from '../../path';
|
|
50
|
-
import { SessionHostHeader } from '../SessionHostHeader';
|
|
51
|
-
import { ShowMoreRow } from '../SessionGroupHeader';
|
|
52
|
-
import type { HostView } from '../headless/hosts';
|
|
53
|
-
import { compareSessions } from '../headless/session-list';
|
|
54
|
-
import { MAIN_SESSION_ICON_KEY } from '../headless/sidebar/project-icons';
|
|
55
|
-
import {
|
|
56
|
-
AGENT_GROUPING,
|
|
57
|
-
claimChildSessions,
|
|
58
|
-
clearedViewFilters,
|
|
59
|
-
createDecorator,
|
|
60
|
-
viewFiltersOn,
|
|
61
|
-
type SidebarGrouping,
|
|
62
|
-
type SidebarQueryLayer,
|
|
63
|
-
type SidebarRowDecoration,
|
|
64
|
-
} from '../headless/sidebar/query';
|
|
65
|
-
import {
|
|
66
|
-
buildHostSidebarRows,
|
|
67
|
-
buildQuerySidebarRows,
|
|
68
|
-
groupsByFolder,
|
|
69
|
-
itemRows,
|
|
70
|
-
nestSidebarRows,
|
|
71
|
-
partitionMainSession,
|
|
72
|
-
type SidebarNode,
|
|
73
|
-
type SidebarListRow,
|
|
74
|
-
} from '../headless/sidebar/rows';
|
|
75
|
-
import type {
|
|
76
|
-
SessionArchiveFilter,
|
|
77
|
-
SidebarGroupBy,
|
|
78
|
-
SidebarListSession,
|
|
79
|
-
SidebarSortBy,
|
|
80
|
-
SidebarView,
|
|
81
|
-
} from '../headless/sidebar/types';
|
|
82
|
-
import { MainSessionRow } from './MainSessionRow';
|
|
83
|
-
import { useProjectIcons } from './ProjectIcon';
|
|
84
|
-
import type { RowProject } from './RowChips';
|
|
85
|
-
import { useEnvironmentCommands, type SidebarProject } from './session-menu';
|
|
86
|
-
import { holdFocusIn } from './sidebar-focus-hold';
|
|
87
|
-
import { SidebarFrame, useSidebarFrame, type SidebarChromeInset } from './SidebarFrame';
|
|
88
|
-
import { SidebarGroupHeader, type SidebarProjectRef } from './SidebarGroupHeader';
|
|
89
|
-
import { SidebarRowView } from './SidebarRowView';
|
|
90
|
-
import { useAgentNames } from './useAgentNames';
|
|
91
|
-
import type { SidebarLive } from './sidebar-live';
|
|
92
|
-
import { useSidebarNotice } from './SidebarHostProvider';
|
|
93
|
-
import { SidebarSearchRow } from './SidebarSearchRow';
|
|
94
|
-
import { SidebarSessionRow } from './SidebarSessionRow';
|
|
95
|
-
import { usePinnedProjects } from './usePinnedProjects';
|
|
96
|
-
import { useSessionSearch, type SessionContentSearch } from './useSessionSearch';
|
|
97
|
-
import { useSidebarKeyboardNav } from './useSidebarKeyboardNav';
|
|
98
|
-
import { useSidebarLabels } from './useSidebarLabels';
|
|
99
|
-
|
|
100
|
-
/** A session as the sidebar's rows read it: the list's session plus where it runs when not here. */
|
|
101
|
-
export interface SidebarRowSession extends SidebarListSession {
|
|
102
|
-
/** Its environment, when it runs somewhere else than this machine's folder. */
|
|
103
|
-
environment?: SessionEnvironmentSummary;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/** The space switch that showed the list's space: the list slides that way. */
|
|
107
|
-
export interface SidebarSpaceSlide {
|
|
108
|
-
/** The space switched to. */
|
|
109
|
-
spaceId: string;
|
|
110
|
-
/** Toward a later space, or an earlier one. */
|
|
111
|
-
direction: 'next' | 'prev';
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/** Props of {@link SessionSidebar}. */
|
|
115
|
-
export interface SessionSidebarProps<S extends SidebarRowSession> {
|
|
116
|
-
/** The sessions the list shows (the shown space's filters applied). */
|
|
117
|
-
sessions: readonly S[];
|
|
118
|
-
/** This machine and the remote hosts (their sections and chips). */
|
|
119
|
-
hosts: readonly HostView[];
|
|
120
|
-
/** How the rows group. */
|
|
121
|
-
groupBy: SidebarGroupBy;
|
|
122
|
-
/** How the rows sort inside a group. */
|
|
123
|
-
sortBy: SidebarSortBy;
|
|
124
|
-
/** The archive axis, for the content search. */
|
|
125
|
-
archiveFilter: SessionArchiveFilter;
|
|
126
|
-
/** The open session. */
|
|
127
|
-
activeSessionId: S['id'] | null;
|
|
128
|
-
/** Opens a session (`null`: the new-session surface). */
|
|
129
|
-
onActivate: (sessionId: S['id'] | null) => void;
|
|
130
|
-
/** The orchestration Main is on: its session is pinned above the groups. Off: it is hidden. */
|
|
131
|
-
orchestration: boolean;
|
|
132
|
-
/** Spaces are on. */
|
|
133
|
-
spacesOn: boolean;
|
|
134
|
-
/** The spaces. */
|
|
135
|
-
spaces: readonly Space[];
|
|
136
|
-
/** The space the list shows (`listSpaceId`). */
|
|
137
|
-
listSpaceId: string;
|
|
138
|
-
/** The last user switch of space; the list slides when it showed `listSpaceId`. */
|
|
139
|
-
spaceSlide: SidebarSpaceSlide | null;
|
|
140
|
-
/** Content search. Absent: titles only. */
|
|
141
|
-
search?: SessionContentSearch;
|
|
142
|
-
/** The rows' live parts (`createSidebarLive`, built once). */
|
|
143
|
-
live: SidebarLive;
|
|
144
|
-
/** What runs are doing in the trailing slot. Default: true. */
|
|
145
|
-
runDetails?: boolean;
|
|
146
|
-
/** Artifacts on a second line. Default: true. */
|
|
147
|
-
artifactBadges?: boolean;
|
|
148
|
-
/** Starts a new session. */
|
|
149
|
-
onNewSession: () => void;
|
|
150
|
-
/** Starts a new session in a project's folder. */
|
|
151
|
-
onNewSessionIn: (path: string) => void;
|
|
152
|
-
/**
|
|
153
|
-
* Opens a project's home (its name clicked; a server's project too). Present: project names open it and
|
|
154
|
-
* their collapse moves to a chevron after their buttons. Absent: names toggle collapse.
|
|
155
|
-
*/
|
|
156
|
-
onOpenProject?: (project: SidebarProjectRef) => void;
|
|
157
|
-
/** The project whose home shows: its header wears the active chip. */
|
|
158
|
-
openProject?: SidebarProjectRef | null;
|
|
159
|
-
/** Starts a new chat with no folder (the Chats name clicked). Present: the Chats collapse moves to a chevron. */
|
|
160
|
-
onOpenChats?: () => void;
|
|
161
|
-
/** A new chat with no folder shows: the Chats header wears the active chip. */
|
|
162
|
-
chatsOpen?: boolean;
|
|
163
|
-
/** Renames a session. */
|
|
164
|
-
onRename: (sessionId: S['id'], title: string) => Promise<void>;
|
|
165
|
-
/** Archives or restores a session. */
|
|
166
|
-
onSetArchived: (sessionId: S['id'], archived: boolean) => Promise<void>;
|
|
167
|
-
/** Stars or unstars a session. */
|
|
168
|
-
onSetFavorite: (sessionId: S['id'], favorite: boolean) => Promise<void>;
|
|
169
|
-
/** Deletes a session (ask first: `useConfirmDeleteSession`). */
|
|
170
|
-
onDelete: (session: { id: S['id']; title: string; environment?: SessionEnvironmentSummary }) => void;
|
|
171
|
-
/** Moves a session to a space. Absent: no move rows. */
|
|
172
|
-
onMoveToSpace?: (sessionId: S['id'], spaceId: string) => Promise<unknown>;
|
|
173
|
-
/** Moves a session to another environment of its host (`useMoveSession`, `zidane-ui/git`). Absent: no "Move to…". */
|
|
174
|
-
onMoveSession?: (sessionId: S['id']) => void;
|
|
175
|
-
/** Moves a project to a space. Absent: no move rows on the headers. */
|
|
176
|
-
onMoveProjectToSpace?: (project: SidebarProject, spaceId: string) => Promise<unknown>;
|
|
177
|
-
/** Archives a project's conversations (`useProjectSessionActions`). */
|
|
178
|
-
onArchiveProject: (project: SidebarProject, label: string) => void;
|
|
179
|
-
/** Deletes a project's conversations; `onRemoved` unpins it once they are gone. */
|
|
180
|
-
onDeleteProject: (project: SidebarProject, label: string, onRemoved: () => void) => void;
|
|
181
|
-
/** The keys belong elsewhere now (a modal is open). */
|
|
182
|
-
keyboardBlocked?: () => boolean;
|
|
183
|
-
/**
|
|
184
|
-
* The shown space's query layer (`SessionDirectoryView.query`): the grouping and sort that apply
|
|
185
|
-
* (a space's, an extension's, the agents'), the row decorations and the extension items. Absent:
|
|
186
|
-
* the built-in grouping and sort, no decorations, no items.
|
|
187
|
-
*/
|
|
188
|
-
query?: SidebarQueryLayer;
|
|
189
|
-
/**
|
|
190
|
-
* Changes the shown space's view: the empty list's reset turns its filters off with it, when
|
|
191
|
-
* filters hid every session (needs `query`). Absent: the empty list offers no reset.
|
|
192
|
-
*/
|
|
193
|
-
onViewChange?: (patch: Partial<SidebarView>) => void;
|
|
194
|
-
/** Agent names by id: the agent grouping's headers. Default: the composer host's agent catalog. An agent left out shows its id. */
|
|
195
|
-
agentNames?: Readonly<Record<string, string>>;
|
|
196
|
-
/**
|
|
197
|
-
* Opens an extension item's target. Default: a session opens, a command runs through the extensions
|
|
198
|
-
* host with the item's `args`, a panel focuses in the workspace, a screen opens on the modal layer.
|
|
199
|
-
* The wire's ids are already full (`SidebarRowWire`): they are used as they are.
|
|
200
|
-
*/
|
|
201
|
-
onOpenItem?: (
|
|
202
|
-
open: NonNullable<ExtensionItem<'sidebar-row'>['item']['open']>,
|
|
203
|
-
item: ExtensionItem<'sidebar-row'>,
|
|
204
|
-
) => void;
|
|
205
|
-
/** Beside the search well: the filter menu. */
|
|
206
|
-
filter?: ReactNode;
|
|
207
|
-
/** Under the list: the footer strip. */
|
|
208
|
-
footer?: ReactNode;
|
|
209
|
-
/** The user collapsed the sidebar. */
|
|
210
|
-
collapsed: boolean;
|
|
211
|
-
/** The width the user wants (px). */
|
|
212
|
-
width: number;
|
|
213
|
-
/** A resize ended at this width. */
|
|
214
|
-
onWidthCommit: (width: number) => void;
|
|
215
|
-
/** A drag strip clearing the window's native controls. */
|
|
216
|
-
chromeInset?: SidebarChromeInset;
|
|
217
|
-
/** Names the aside's landmark (several sidebars on one page each need their own). */
|
|
218
|
-
ariaLabel?: string;
|
|
219
|
-
/** Extra classes on the aside. */
|
|
220
|
-
className?: string;
|
|
221
|
-
/** Inline styles on the aside. */
|
|
222
|
-
style?: CSSProperties;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/** The list's top and bottom fades (rows dissolve into the search row and the footer, never cut). */
|
|
226
|
-
const LIST_MASK = 'linear-gradient(to bottom, transparent, black 8px, black calc(100% - 12px), transparent)';
|
|
227
|
-
const LIST_STYLE: CSSProperties = { maskImage: LIST_MASK, WebkitMaskImage: LIST_MASK };
|
|
228
|
-
/**
|
|
229
|
-
* The `sidebar.top` and `sidebar.bottom` blocks: pinned (the list scrolls, they don't), each at most 30% of the
|
|
230
|
-
* sidebar so the list keeps most of it, scrolling on their own past that. An empty one draws nothing.
|
|
231
|
-
*/
|
|
232
|
-
const PINNED_SLOT = 'shrink-0 max-h-[30%] overflow-y-auto px-2 py-1';
|
|
233
|
-
|
|
234
|
-
/*
|
|
235
|
-
* The spaces list slide: `custom` is the direction (1 = to a later space, -1
|
|
236
|
-
* earlier, 0 = cut). The new list travels a quarter of its width; the leaving
|
|
237
|
-
* one goes the other way (`popLayout` pulls it out of flow so both share the slot).
|
|
238
|
-
*/
|
|
239
|
-
/** The space list slide's duration (s). */
|
|
240
|
-
const SPACE_SLIDE_S = 0.22;
|
|
241
|
-
|
|
242
|
-
const SPACE_LIST_VARIANTS: Variants = {
|
|
243
|
-
enter: (dir: number) => (dir === 0 ? { x: 0, opacity: 1 } : { x: `${dir * 24}%`, opacity: 0 }),
|
|
244
|
-
center: { x: 0, opacity: 1 },
|
|
245
|
-
leave: (dir: number) =>
|
|
246
|
-
dir === 0 ? { opacity: 0, transition: { duration: 0 } } : { x: `${dir * -24}%`, opacity: 0 },
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* One space's list. While it slides out it is inert, hidden from assistive tech and marked `data-leaving`:
|
|
251
|
-
* the incoming list (which may hold the same rows) is the only one to act on.
|
|
252
|
-
*/
|
|
253
|
-
const SpaceList = forwardRef<HTMLUListElement, HTMLMotionProps<'ul'>>(function SpaceList(props, ref) {
|
|
254
|
-
const leaving = !useIsPresent();
|
|
255
|
-
return (
|
|
256
|
-
<m.ul
|
|
257
|
-
ref={ref}
|
|
258
|
-
{...props}
|
|
259
|
-
{...(leaving ? { inert: true, 'aria-hidden': true, 'data-leaving': '' } : { 'data-live-list': '' })}
|
|
260
|
-
/>
|
|
261
|
-
);
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
/** Props of {@link NewSessionButton}. */
|
|
265
|
-
export interface NewSessionButtonProps {
|
|
266
|
-
/** Starts a new session. */
|
|
267
|
-
onNewSession: () => void;
|
|
268
|
-
/** No session is open: the button is the current selection (the raised chip). */
|
|
269
|
-
isActive: boolean;
|
|
270
|
-
/** Extra classes on the wrapper. */
|
|
271
|
-
className?: string;
|
|
272
|
-
/** Inline styles on the wrapper. */
|
|
273
|
-
style?: CSSProperties;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* The New session row: the same grid as a session row (an 18px glyph column, `text-sm`), raised while no
|
|
278
|
-
* session is open, its ⌘N hint fading in on hover or focus.
|
|
279
|
-
*
|
|
280
|
-
* @param props - What it starts, whether it is the current selection, `className` and `style`.
|
|
281
|
-
*/
|
|
282
|
-
export function NewSessionButton({ onNewSession, isActive, className = '', style }: NewSessionButtonProps) {
|
|
283
|
-
const labels = useSidebarLabels();
|
|
284
|
-
return (
|
|
285
|
-
<div className={`shrink-0${className ? ` ${className}` : ''}`} style={style}>
|
|
286
|
-
<button
|
|
287
|
-
type="button"
|
|
288
|
-
onClick={onNewSession}
|
|
289
|
-
title={labels.newSessionTitle}
|
|
290
|
-
data-active={isActive ? 'true' : undefined}
|
|
291
|
-
// pl-1 + the band's px-2 puts the 18px glyph slot at x=12 and the label
|
|
292
|
-
// at x=36: the same columns as the session rows.
|
|
293
|
-
className="zg-press-subtle group w-full inline-flex items-center gap-1.5 pl-1 pr-2 py-1 rounded-zg-md bg-transparent hover:before:bg-[var(--zg-row-hover)] data-[active=true]:before:bg-[var(--zg-raised)] data-[active=true]:hover:before:bg-[var(--zg-raised)] data-[active=true]:before:[box-shadow:var(--zg-shadow-raised)] text-[var(--zg-text)] cursor-pointer border-0 transition-[background-color,box-shadow] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--zg-ring)]"
|
|
294
|
-
>
|
|
295
|
-
<span aria-hidden className="inline-flex items-center justify-center w-[18px] shrink-0">
|
|
296
|
-
<span className="i-ph-plus text-sm text-[var(--zg-text-muted)] group-data-[active=true]:text-[var(--zg-text)]" />
|
|
297
|
-
</span>
|
|
298
|
-
<span className="text-sm text-[var(--zg-text-muted)] group-data-[active=true]:text-[var(--zg-text)]">
|
|
299
|
-
{labels.newSession}
|
|
300
|
-
</span>
|
|
301
|
-
<span className="flex-1" />
|
|
302
|
-
<KeyHint
|
|
303
|
-
spec="cmd+n"
|
|
304
|
-
className="opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100 transition-opacity"
|
|
305
|
-
/>
|
|
306
|
-
</button>
|
|
307
|
-
</div>
|
|
308
|
-
);
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
const messageOf = (err: unknown): string => (err as Error)?.message ?? String(err);
|
|
312
|
-
|
|
313
|
-
const NO_ITEMS: readonly ExtensionItem<'sidebar-row'>[] = [];
|
|
314
|
-
|
|
315
|
-
const NO_DECORATIONS: readonly ExtensionItem<'sidebar-decoration'>[] = [];
|
|
316
|
-
|
|
317
|
-
/**
|
|
318
|
-
* Renders the session sidebar.
|
|
319
|
-
*
|
|
320
|
-
* @param props - The directory's view, the app's actions, the live row parts, the footer and the frame.
|
|
321
|
-
*/
|
|
322
|
-
export function SessionSidebar<S extends SidebarRowSession>(props: SessionSidebarProps<S>) {
|
|
323
|
-
const {
|
|
324
|
-
sessions: allSessions,
|
|
325
|
-
hosts,
|
|
326
|
-
groupBy,
|
|
327
|
-
sortBy,
|
|
328
|
-
archiveFilter,
|
|
329
|
-
activeSessionId,
|
|
330
|
-
onActivate,
|
|
331
|
-
orchestration,
|
|
332
|
-
spacesOn,
|
|
333
|
-
spaces,
|
|
334
|
-
listSpaceId,
|
|
335
|
-
spaceSlide: lastSpaceSwitch,
|
|
336
|
-
search,
|
|
337
|
-
live,
|
|
338
|
-
runDetails = true,
|
|
339
|
-
artifactBadges = true,
|
|
340
|
-
onNewSession,
|
|
341
|
-
onNewSessionIn: newSessionIn,
|
|
342
|
-
onOpenProject,
|
|
343
|
-
openProject,
|
|
344
|
-
onOpenChats,
|
|
345
|
-
chatsOpen = false,
|
|
346
|
-
onRename,
|
|
347
|
-
onSetArchived,
|
|
348
|
-
onSetFavorite,
|
|
349
|
-
onDelete,
|
|
350
|
-
onMoveToSpace,
|
|
351
|
-
onMoveSession,
|
|
352
|
-
onMoveProjectToSpace,
|
|
353
|
-
onArchiveProject,
|
|
354
|
-
onDeleteProject: deleteProject,
|
|
355
|
-
keyboardBlocked,
|
|
356
|
-
query,
|
|
357
|
-
onViewChange,
|
|
358
|
-
agentNames: agentNamesProp,
|
|
359
|
-
onOpenItem,
|
|
360
|
-
filter,
|
|
361
|
-
footer,
|
|
362
|
-
collapsed,
|
|
363
|
-
width,
|
|
364
|
-
onWidthCommit,
|
|
365
|
-
chromeInset,
|
|
366
|
-
ariaLabel,
|
|
367
|
-
className,
|
|
368
|
-
style,
|
|
369
|
-
} = props;
|
|
370
|
-
type K = S['id'];
|
|
371
|
-
const labels = useSidebarLabels();
|
|
372
|
-
const notify = useSidebarNotice();
|
|
373
|
-
const environment = useEnvironmentCommands();
|
|
374
|
-
|
|
375
|
-
/*
|
|
376
|
-
* The slide of the user switch that showed this space (switcher, keys,
|
|
377
|
-
* palette); anything else cuts. Keyed on the list's space, so the list swaps
|
|
378
|
-
* and slides with the rows it was keyed for.
|
|
379
|
-
*/
|
|
380
|
-
const slideDirection = lastSpaceSwitch?.spaceId === listSpaceId ? lastSpaceSwitch.direction : null;
|
|
381
|
-
const slideOffset = slideDirection === 'next' ? 1 : slideDirection === 'prev' ? -1 : 0;
|
|
382
|
-
/*
|
|
383
|
-
* The list's identity: it changes only when the user switched spaces, so only
|
|
384
|
-
* that slides (old list out, new in). Following the open chat, turning Spaces
|
|
385
|
-
* off, filters: the same list re-renders, nothing doubles.
|
|
386
|
-
*/
|
|
387
|
-
const lastSlideKey = useRef('list');
|
|
388
|
-
// eslint-disable-next-line react-hooks/refs -- the key holds across renders until the next user switch
|
|
389
|
-
if (spacesOn && lastSpaceSwitch?.spaceId === listSpaceId) lastSlideKey.current = lastSpaceSwitch.spaceId;
|
|
390
|
-
// eslint-disable-next-line react-hooks/refs -- read with the switch above, in the same render
|
|
391
|
-
const listKey = lastSlideKey.current;
|
|
392
|
-
// The lists move on `slide`; their opacity fades (`withFade`), never on the spring.
|
|
393
|
-
// Shorter than `slide`: the new space's rows read as soon as the switcher answers.
|
|
394
|
-
const slideTransition = useWithFade('slide', SPACE_SLIDE_S);
|
|
395
|
-
|
|
396
|
-
/*
|
|
397
|
-
* The orchestration Main is HIDDEN while the feature is off: showing it as an
|
|
398
|
-
* ordinary chat while nothing can serve it would invite the user into a
|
|
399
|
-
* session whose whole purpose is switched off. Applied once, at the source,
|
|
400
|
-
* so the groups, the search results and the pin all see the same list.
|
|
401
|
-
*/
|
|
402
|
-
const sessions = useMemo(
|
|
403
|
-
() => (orchestration ? allSessions : allSessions.filter((s) => s.isMain !== true)),
|
|
404
|
-
[allSessions, orchestration],
|
|
405
|
-
);
|
|
406
|
-
|
|
407
|
-
const { searchQuery, setSearchQuery, trimmedQuery, searchMode, searching, titleMatches, contentMatches } =
|
|
408
|
-
useSessionSearch(sessions, archiveFilter, search);
|
|
409
|
-
|
|
410
|
-
const [renamingId, setRenamingId] = useState<K | null>(null);
|
|
411
|
-
const [renameValue, setRenameValue] = useState('');
|
|
412
|
-
const [menuForId, setMenuForId] = useState<K | null>(null);
|
|
413
|
-
|
|
414
|
-
/**
|
|
415
|
-
* Collapsed group headers. Re-grouping produces fresh ids, so stale entries no longer match and the new
|
|
416
|
-
* buckets start expanded. Not persisted: collapse is a transient view tweak.
|
|
417
|
-
*/
|
|
418
|
-
const [collapsedGroups, setCollapsedGroups] = useState<Set<string>>(() => new Set());
|
|
419
|
-
const toggleGroup = useCallback((id: string) => {
|
|
420
|
-
setCollapsedGroups((current) => {
|
|
421
|
-
const next = new Set(current);
|
|
422
|
-
if (next.has(id)) next.delete(id);
|
|
423
|
-
else next.add(id);
|
|
424
|
-
return next;
|
|
425
|
-
});
|
|
426
|
-
}, []);
|
|
427
|
-
|
|
428
|
-
/** Groups whose "Show more" row was clicked: they render past the per-project cap. */
|
|
429
|
-
const [showMoreExpanded, setShowMoreExpanded] = useState<Set<string>>(() => new Set());
|
|
430
|
-
const expandGroup = useCallback((id: string) => {
|
|
431
|
-
setShowMoreExpanded((current) => new Set(current).add(id));
|
|
432
|
-
}, []);
|
|
433
|
-
|
|
434
|
-
const { icons: projectIcons, setIcon: setProjectIcon } = useProjectIcons();
|
|
435
|
-
/** The listed space's projects pinned at the top of the project grouping, in pin order. */
|
|
436
|
-
const { pinned: pinnedProjects, setPinned: setProjectPinned } = usePinnedProjects(listSpaceId);
|
|
437
|
-
|
|
438
|
-
/** The pinned Main renders once, above every group, instead of also in its own bucket. */
|
|
439
|
-
const { main: mainSession, rest: groupableSessions } = useMemo(
|
|
440
|
-
() => partitionMainSession(sessions, orchestration),
|
|
441
|
-
[sessions, orchestration],
|
|
442
|
-
);
|
|
443
|
-
|
|
444
|
-
const catalogNames = useAgentNames();
|
|
445
|
-
const agentNames = agentNamesProp ?? catalogNames;
|
|
446
|
-
/** The grouping that applies: the query layer's, else the view's ('agent' as a query grouping). */
|
|
447
|
-
const grouping = useMemo<SidebarGrouping>(
|
|
448
|
-
() =>
|
|
449
|
-
query?.grouping ??
|
|
450
|
-
(groupBy === 'agent'
|
|
451
|
-
? { kind: 'query', groupBy: AGENT_GROUPING, source: 'agent' }
|
|
452
|
-
: { kind: 'builtin', groupBy }),
|
|
453
|
-
[query?.grouping, groupBy],
|
|
454
|
-
);
|
|
455
|
-
/** The grouping the headers and chips read: a query grouping's groups are no folders. */
|
|
456
|
-
const listGroupBy = grouping.kind === 'builtin' ? grouping.groupBy : 'none';
|
|
457
|
-
/** The view narrows the space's sessions: an empty list then says so, not "no chats yet". */
|
|
458
|
-
const filtersOn = useMemo(() => (query ? viewFiltersOn(query.view, query.filters) : false), [query]);
|
|
459
|
-
const querySort = query?.sort ?? null;
|
|
460
|
-
|
|
461
|
-
/** The extension items of this space, each with the sessions its query lists under it (taken out of the list). */
|
|
462
|
-
const claimed = useMemo(
|
|
463
|
-
() => claimChildSessions(query?.items ?? NO_ITEMS, groupableSessions),
|
|
464
|
-
[query?.items, groupableSessions],
|
|
465
|
-
);
|
|
466
|
-
|
|
467
|
-
/** What decorations put on each row (`null` for every row while no extension decorates, so the rows' memo holds). */
|
|
468
|
-
const decorate = useMemo(() => createDecorator<S>(query?.decorations ?? NO_DECORATIONS), [query?.decorations]);
|
|
469
|
-
const decorations = useMemo(
|
|
470
|
-
() => new Map<string, SidebarRowDecoration | null>(sessions.map((s) => [s.id, decorate(s)])),
|
|
471
|
-
[sessions, decorate],
|
|
472
|
-
);
|
|
473
|
-
const decorationOf = (session: S): SidebarRowDecoration | null => decorations.get(session.id) ?? null;
|
|
474
|
-
|
|
475
|
-
/**
|
|
476
|
-
* Sorted + grouped rows. Collapse and the per-project cap are applied inside the builder, so arrow-key nav
|
|
477
|
-
* (which walks the session rows) can never land on a hidden row.
|
|
478
|
-
*/
|
|
479
|
-
const rows = useMemo<SidebarListRow<S>[]>(() => {
|
|
480
|
-
const rest = claimed.rest;
|
|
481
|
-
const sorted = querySort
|
|
482
|
-
? (sortRows(rest as unknown as readonly (S & SessionQueryRow)[], querySort) as unknown as S[])
|
|
483
|
-
: null;
|
|
484
|
-
if (grouping.kind === 'query') {
|
|
485
|
-
return buildQuerySidebarRows(
|
|
486
|
-
sorted ?? rest.slice().sort((a, b) => compareSessions(a, b, sortBy)),
|
|
487
|
-
grouping.groupBy,
|
|
488
|
-
{
|
|
489
|
-
collapsedGroups,
|
|
490
|
-
...(grouping.source === 'agent' ? { labels: agentNames } : {}),
|
|
491
|
-
missingLabel: grouping.source === 'agent' ? labels.agentGroupDefault : labels.queryGroupOther,
|
|
492
|
-
favoritesLabel: labels.favorites,
|
|
493
|
-
isFavorite: (s) => s.favorite === true,
|
|
494
|
-
items: claimed.items,
|
|
495
|
-
},
|
|
496
|
-
);
|
|
497
|
-
}
|
|
498
|
-
const order = sorted ? new Map(sorted.map((s, i) => [s.id, i])) : null;
|
|
499
|
-
return [
|
|
500
|
-
...claimed.items.flatMap((item) => itemRows(item, collapsedGroups)),
|
|
501
|
-
...buildHostSidebarRows(rest, hosts, grouping.groupBy, sortBy, {
|
|
502
|
-
collapsedGroups,
|
|
503
|
-
showMoreExpanded,
|
|
504
|
-
pinnedProjects,
|
|
505
|
-
...(order ? { compare: (a, b) => (order.get(a.id) ?? 0) - (order.get(b.id) ?? 0) } : {}),
|
|
506
|
-
}),
|
|
507
|
-
];
|
|
508
|
-
}, [
|
|
509
|
-
claimed,
|
|
510
|
-
querySort,
|
|
511
|
-
grouping,
|
|
512
|
-
hosts,
|
|
513
|
-
sortBy,
|
|
514
|
-
collapsedGroups,
|
|
515
|
-
showMoreExpanded,
|
|
516
|
-
pinnedProjects,
|
|
517
|
-
agentNames,
|
|
518
|
-
labels,
|
|
519
|
-
]);
|
|
520
|
-
/** The rows as the list draws them: each header with the rows under it, a section whose header sticks. */
|
|
521
|
-
const sections = useMemo(() => nestSidebarRows(rows), [rows]);
|
|
522
|
-
const hostById = useMemo(() => new Map(hosts.map((h) => [h.id, h])), [hosts]);
|
|
523
|
-
|
|
524
|
-
/** This machine's project folders with a listed conversation not archived yet. */
|
|
525
|
-
/* Local folders, and repositories (`repoKey`) with sessions on servers, that still list an open session. */
|
|
526
|
-
const archivableProjects = useMemo(() => {
|
|
527
|
-
const folders = new Set<string>();
|
|
528
|
-
const repos = new Set<string>();
|
|
529
|
-
for (const s of groupableSessions) {
|
|
530
|
-
if (s.archived) continue;
|
|
531
|
-
if (!s.hostId) folders.add((s.projectRoot || s.cwd).replace(/\/+$/, '') || '/');
|
|
532
|
-
else if (s.repoKey) repos.add(s.repoKey);
|
|
533
|
-
}
|
|
534
|
-
return { folders, repos };
|
|
535
|
-
}, [groupableSessions]);
|
|
536
|
-
|
|
537
|
-
/* A favorite has left its project group: its row names the project, with the group's icon. One object per session, so the rows' memo holds. */
|
|
538
|
-
const favoriteProjects = useMemo(() => {
|
|
539
|
-
const out = new Map<K, RowProject>();
|
|
540
|
-
for (const row of rows) {
|
|
541
|
-
if (row.kind !== 'session' || !row.favorites) continue;
|
|
542
|
-
const path = (row.session.projectRoot || row.session.cwd).replace(/\/+$/, '');
|
|
543
|
-
if (!path) continue;
|
|
544
|
-
out.set(row.session.id, {
|
|
545
|
-
label: basename(path) || path,
|
|
546
|
-
path,
|
|
547
|
-
isGitRepo: row.session.isGitRepo === true,
|
|
548
|
-
...(row.session.hostId ? {} : projectIcons[path] ? { icon: projectIcons[path] } : {}),
|
|
549
|
-
});
|
|
550
|
-
}
|
|
551
|
-
return out;
|
|
552
|
-
}, [rows, projectIcons]);
|
|
553
|
-
|
|
554
|
-
const listRef = useRef<HTMLUListElement | null>(null);
|
|
555
|
-
/* During a space slide two lists exist: the leaving one unmounts AFTER the new one mounted, and must not null the ref the new one just set. */
|
|
556
|
-
const setListRef = useCallback((node: HTMLUListElement | null) => {
|
|
557
|
-
if (node) listRef.current = node;
|
|
558
|
-
else if (listRef.current && !listRef.current.isConnected) listRef.current = null;
|
|
559
|
-
}, []);
|
|
560
|
-
|
|
561
|
-
/*
|
|
562
|
-
* Focus in the sidebar stays there across a space switch, so ⌥⌘←/→ and ↑/↓ keep working from it.
|
|
563
|
-
* The leaving list turns inert, so a row focused there drops focus to the page: it lands on the
|
|
564
|
-
* new list's open row, else its first, else the list itself, after the switch has painted
|
|
565
|
-
* (`focus()` lays the page out, which in the switch's frame would cost the whole new conversation's
|
|
566
|
-
* layout twice). Until the user acts, the reopened conversation's tools mounting can't take it
|
|
567
|
-
* (`holdFocusIn`).
|
|
568
|
-
*/
|
|
569
|
-
const listBox = useRef<HTMLDivElement>(null);
|
|
570
|
-
const releaseFocus = useRef<(() => void) | null>(null);
|
|
571
|
-
useLayoutEffect(() => {
|
|
572
|
-
const box = listBox.current;
|
|
573
|
-
// Not `listRef`: the new list's ref lands after this effect (the presence wrapper attaches it).
|
|
574
|
-
const list = box?.querySelector<HTMLElement>('[data-live-list]');
|
|
575
|
-
const sidebar = box?.closest('aside');
|
|
576
|
-
const focused = document.activeElement;
|
|
577
|
-
if (!box || !list || !sidebar || !(focused instanceof HTMLElement) || !sidebar.contains(focused)) return undefined;
|
|
578
|
-
const moving = box.contains(focused) && !list.contains(focused);
|
|
579
|
-
const home = moving
|
|
580
|
-
? (list.querySelector<HTMLElement>('[data-active="true"] [data-row-select]') ??
|
|
581
|
-
list.querySelector<HTMLElement>('[data-row-select]') ??
|
|
582
|
-
list)
|
|
583
|
-
: focused;
|
|
584
|
-
releaseFocus.current?.();
|
|
585
|
-
releaseFocus.current = holdFocusIn(sidebar, () => (home.isConnected ? home : list));
|
|
586
|
-
if (!moving) return undefined;
|
|
587
|
-
let timer = 0;
|
|
588
|
-
const frame = requestAnimationFrame(() => {
|
|
589
|
-
timer = window.setTimeout(() => {
|
|
590
|
-
// Still where the switch left it (the page, or the leaving list): the user hasn't moved it.
|
|
591
|
-
const now = document.activeElement;
|
|
592
|
-
if (!now || now === document.body || now === focused || now.closest('[inert]')) {
|
|
593
|
-
home.focus({ preventScroll: true });
|
|
594
|
-
}
|
|
595
|
-
}, 0);
|
|
596
|
-
});
|
|
597
|
-
return () => {
|
|
598
|
-
cancelAnimationFrame(frame);
|
|
599
|
-
clearTimeout(timer);
|
|
600
|
-
};
|
|
601
|
-
}, [listKey]);
|
|
602
|
-
useEffect(() => () => releaseFocus.current?.(), []);
|
|
603
|
-
|
|
604
|
-
/** Arrow-nav walks the order the user sees on screen. */
|
|
605
|
-
const displaySessions = useMemo<S[]>(() => {
|
|
606
|
-
if (searchMode) return [...titleMatches, ...contentMatches.map((m) => m.session)];
|
|
607
|
-
return rows
|
|
608
|
-
.filter((row): row is Extract<SidebarListRow<S>, { kind: 'session' }> => row.kind === 'session')
|
|
609
|
-
.map((r) => r.session);
|
|
610
|
-
}, [rows, searchMode, titleMatches, contentMatches]);
|
|
611
|
-
|
|
612
|
-
const { commitImmediate } = useSidebarKeyboardNav<K>({
|
|
613
|
-
listRef,
|
|
614
|
-
sessions: displaySessions,
|
|
615
|
-
activeSessionId,
|
|
616
|
-
onActivate,
|
|
617
|
-
onNewSession,
|
|
618
|
-
...(keyboardBlocked ? { blocked: keyboardBlocked } : {}),
|
|
619
|
-
});
|
|
620
|
-
|
|
621
|
-
/* Row callbacks keep a stable identity so the rows' memo short-circuits: the row passes its own id. */
|
|
622
|
-
const onRowSelect = useCallback(
|
|
623
|
-
(sessionId: string) => {
|
|
624
|
-
if (renamingId === sessionId) return;
|
|
625
|
-
commitImmediate(sessionId as K);
|
|
626
|
-
},
|
|
627
|
-
[renamingId, commitImmediate],
|
|
628
|
-
);
|
|
629
|
-
|
|
630
|
-
const onRowStartRename = useCallback((sessionId: string, currentTitle: string) => {
|
|
631
|
-
setMenuForId(null);
|
|
632
|
-
setRenamingId(sessionId as K);
|
|
633
|
-
setRenameValue(currentTitle);
|
|
634
|
-
}, []);
|
|
635
|
-
|
|
636
|
-
const onRowSetArchived = useCallback(
|
|
637
|
-
(sessionId: string, archived: boolean) => {
|
|
638
|
-
void onSetArchived(sessionId as K, archived);
|
|
639
|
-
},
|
|
640
|
-
[onSetArchived],
|
|
641
|
-
);
|
|
642
|
-
|
|
643
|
-
const onRowSetFavorite = useCallback(
|
|
644
|
-
(sessionId: string, favorite: boolean) => {
|
|
645
|
-
onSetFavorite(sessionId as K, favorite).catch((err) => console.error('[zidane-ui] favorite failed', err));
|
|
646
|
-
},
|
|
647
|
-
[onSetFavorite],
|
|
648
|
-
);
|
|
649
|
-
|
|
650
|
-
const onRowDelete = useCallback(
|
|
651
|
-
(sessionId: string, title: string, env?: SessionEnvironmentSummary) => {
|
|
652
|
-
onDelete({ id: sessionId as K, title, ...(env ? { environment: env } : {}) });
|
|
653
|
-
},
|
|
654
|
-
[onDelete],
|
|
655
|
-
);
|
|
656
|
-
|
|
657
|
-
const onRowMoveToSpace = useCallback(
|
|
658
|
-
(sessionId: string, spaceId: string) => {
|
|
659
|
-
onMoveToSpace?.(sessionId as K, spaceId).catch((err: unknown) =>
|
|
660
|
-
notify(labels.moveSessionFailed(messageOf(err))),
|
|
661
|
-
);
|
|
662
|
-
},
|
|
663
|
-
[onMoveToSpace, notify, labels],
|
|
664
|
-
);
|
|
665
|
-
|
|
666
|
-
const onRowMoveProjectToSpace = useCallback(
|
|
667
|
-
(project: SidebarProject, spaceId: string) => {
|
|
668
|
-
onMoveProjectToSpace?.(project, spaceId).catch((err: unknown) =>
|
|
669
|
-
notify(labels.moveProjectFailed(messageOf(err))),
|
|
670
|
-
);
|
|
671
|
-
},
|
|
672
|
-
[onMoveProjectToSpace, notify, labels],
|
|
673
|
-
);
|
|
674
|
-
|
|
675
|
-
const onDeleteProject = useCallback(
|
|
676
|
-
(project: SidebarProject, label: string) =>
|
|
677
|
-
deleteProject(project, label, () => setProjectPinned(project.path, false)),
|
|
678
|
-
[deleteProject, setProjectPinned],
|
|
679
|
-
);
|
|
680
|
-
|
|
681
|
-
/* Extension items: their targets and actions, through the extensions host and the workspace when the app has them. */
|
|
682
|
-
const extensions = useExtensionsHost();
|
|
683
|
-
const runCommand = extensions?.commands?.run;
|
|
684
|
-
const workspace = useOptionalWorkspaceActions();
|
|
685
|
-
const openScreen = useExtensionScreen();
|
|
686
|
-
const onOpenItemTarget = useCallback(
|
|
687
|
-
(entry: ExtensionItem<'sidebar-row'>) => {
|
|
688
|
-
const open = entry.item.open;
|
|
689
|
-
if (!open) return;
|
|
690
|
-
if (onOpenItem) return onOpenItem(open, entry);
|
|
691
|
-
if ('session' in open) commitImmediate(open.session as K);
|
|
692
|
-
else if ('command' in open) {
|
|
693
|
-
runCommand?.(open.command, { args: entry.item.args }).catch((err: unknown) =>
|
|
694
|
-
notify(labels.itemOpenFailed(messageOf(err))),
|
|
695
|
-
);
|
|
696
|
-
} else if ('panel' in open) workspace?.focusTab(open.panel);
|
|
697
|
-
else openScreen(open.screen);
|
|
698
|
-
},
|
|
699
|
-
[onOpenItem, commitImmediate, runCommand, notify, labels, workspace, openScreen],
|
|
700
|
-
);
|
|
701
|
-
const onRunItemAction = useCallback(
|
|
702
|
-
(entry: ExtensionItem<'sidebar-row'>, action: SidebarRowActionWire) => {
|
|
703
|
-
if (!action.command || !runCommand) return;
|
|
704
|
-
runCommand(action.command, { args: entry.item.args }).catch((err: unknown) =>
|
|
705
|
-
notify(labels.itemOpenFailed(messageOf(err))),
|
|
706
|
-
);
|
|
707
|
-
},
|
|
708
|
-
[runCommand, notify, labels],
|
|
709
|
-
);
|
|
710
|
-
|
|
711
|
-
const onRowOpenMenu = useCallback((sessionId: string) => setMenuForId(sessionId as K), []);
|
|
712
|
-
const onRowCloseMenu = useCallback((sessionId: string) => {
|
|
713
|
-
setMenuForId((current) => (current === sessionId ? null : current));
|
|
714
|
-
}, []);
|
|
715
|
-
|
|
716
|
-
const onRenameCommitRef = useRef<{ id: K | null; value: string }>({ id: null, value: '' });
|
|
717
|
-
// eslint-disable-next-line react-hooks/refs -- the commit keeps its identity (the rows' memo) and reads the field
|
|
718
|
-
onRenameCommitRef.current = { id: renamingId, value: renameValue };
|
|
719
|
-
|
|
720
|
-
const onRowRenameCommit = useCallback(async () => {
|
|
721
|
-
const { id, value } = onRenameCommitRef.current;
|
|
722
|
-
if (!id) return;
|
|
723
|
-
if (value.trim()) await onRename(id, value.trim());
|
|
724
|
-
setRenamingId(null);
|
|
725
|
-
}, [onRename]);
|
|
726
|
-
|
|
727
|
-
const onRowRenameCancel = useCallback(() => setRenamingId(null), []);
|
|
728
|
-
|
|
729
|
-
// What rows say beyond their title; primitives, so the rows' memo holds.
|
|
730
|
-
const rowDetails = {
|
|
731
|
-
runDetails,
|
|
732
|
-
artifactBadges: runDetails && artifactBadges,
|
|
733
|
-
spaces: spacesOn ? spaces : null,
|
|
734
|
-
};
|
|
735
|
-
const spaceList = onMoveToSpace ? rowDetails.spaces : null;
|
|
736
|
-
|
|
737
|
-
// One stable bag for every row: identities only change with their deps, so the rows' memo holds.
|
|
738
|
-
const rowHandlers = useMemo(
|
|
739
|
-
() => ({
|
|
740
|
-
onSelect: onRowSelect,
|
|
741
|
-
onRenameValueChange: setRenameValue,
|
|
742
|
-
onRenameCommit: onRowRenameCommit,
|
|
743
|
-
onRenameCancel: onRowRenameCancel,
|
|
744
|
-
onStartRename: onRowStartRename,
|
|
745
|
-
onDelete: onRowDelete,
|
|
746
|
-
onSetArchived: onRowSetArchived,
|
|
747
|
-
onSetFavorite: onRowSetFavorite,
|
|
748
|
-
onRetryEnvironment: environment.retry,
|
|
749
|
-
onRunEnvironmentAction: environment.run,
|
|
750
|
-
onMoveToSpace: onRowMoveToSpace,
|
|
751
|
-
...(onMoveSession ? { onMoveSession: onMoveSession as (sessionId: string) => void } : {}),
|
|
752
|
-
onOpenMenu: onRowOpenMenu,
|
|
753
|
-
onCloseMenu: onRowCloseMenu,
|
|
754
|
-
live,
|
|
755
|
-
}),
|
|
756
|
-
[
|
|
757
|
-
onRowSelect,
|
|
758
|
-
onRowRenameCommit,
|
|
759
|
-
onRowRenameCancel,
|
|
760
|
-
onRowStartRename,
|
|
761
|
-
onRowDelete,
|
|
762
|
-
onRowSetArchived,
|
|
763
|
-
onRowSetFavorite,
|
|
764
|
-
environment,
|
|
765
|
-
onRowMoveToSpace,
|
|
766
|
-
onMoveSession,
|
|
767
|
-
onRowOpenMenu,
|
|
768
|
-
onRowCloseMenu,
|
|
769
|
-
live,
|
|
770
|
-
],
|
|
771
|
-
);
|
|
772
|
-
|
|
773
|
-
// A row menu left open goes when the open session flips (keyboard navigation).
|
|
774
|
-
useEffect(() => {
|
|
775
|
-
// eslint-disable-next-line react-hooks/set-state-in-effect -- a switch from anywhere closes the stale menu
|
|
776
|
-
setMenuForId(null);
|
|
777
|
-
}, [activeSessionId]);
|
|
778
|
-
|
|
779
|
-
// A collapsed sidebar is unmounted: an open rename would be orphaned mid-edit.
|
|
780
|
-
useEffect(() => {
|
|
781
|
-
// eslint-disable-next-line react-hooks/set-state-in-effect -- collapsing drops the orphaned rename
|
|
782
|
-
if (collapsed) setRenamingId(null);
|
|
783
|
-
}, [collapsed]);
|
|
784
|
-
|
|
785
|
-
// Same draft as "New session", with this project's folder.
|
|
786
|
-
const onNewSessionIn = useCallback((fullPath: string) => newSessionIn(fullPath), [newSessionIn]);
|
|
787
|
-
|
|
788
|
-
const handleNewSession = useCallback(() => {
|
|
789
|
-
commitImmediate(null);
|
|
790
|
-
onNewSession();
|
|
791
|
-
}, [commitImmediate, onNewSession]);
|
|
792
|
-
|
|
793
|
-
const frame = useSidebarFrame({ collapsed, width, onWidthCommit });
|
|
794
|
-
// Rows always render their expanded form while mounted: the aside is a sliding sheet at full width.
|
|
795
|
-
if (!frame.mounted) return null;
|
|
796
|
-
|
|
797
|
-
// Collapse and the per-group caps are already applied in the builder: each row maps 1:1.
|
|
798
|
-
// `serverOfGroup`: the server the enclosing group header names (its rows need no chip of their own).
|
|
799
|
-
const renderNode = (node: SidebarNode<S>, serverOfGroup?: string): ReactNode => {
|
|
800
|
-
if (node.kind === 'section') {
|
|
801
|
-
const { header } = node;
|
|
802
|
-
return (
|
|
803
|
-
<li key={node.id} className={header.kind === 'host' ? 'zg-host-section' : undefined}>
|
|
804
|
-
<ul className="list-none m-0 p-0">
|
|
805
|
-
{header.kind === 'host' ? (
|
|
806
|
-
<SessionHostHeader
|
|
807
|
-
id={header.id}
|
|
808
|
-
host={header.host}
|
|
809
|
-
collapsed={header.collapsed}
|
|
810
|
-
onToggle={toggleGroup}
|
|
811
|
-
className="zg-sticky-head"
|
|
812
|
-
/>
|
|
813
|
-
) : (
|
|
814
|
-
<SidebarGroupHeader
|
|
815
|
-
row={header}
|
|
816
|
-
groupBy={listGroupBy}
|
|
817
|
-
icon={header.fullPath ? projectIcons[header.fullPath] : undefined}
|
|
818
|
-
onAssignIcon={setProjectIcon}
|
|
819
|
-
onToggle={toggleGroup}
|
|
820
|
-
onNewSessionIn={onNewSessionIn}
|
|
821
|
-
spaces={onMoveProjectToSpace ? rowDetails.spaces : null}
|
|
822
|
-
spaceId={listSpaceId}
|
|
823
|
-
onMoveProject={onRowMoveProjectToSpace}
|
|
824
|
-
pinned={header.pinned === true}
|
|
825
|
-
onSetPinned={setProjectPinned}
|
|
826
|
-
canArchive={
|
|
827
|
-
(header.fullPath !== undefined && archivableProjects.folders.has(header.fullPath)) ||
|
|
828
|
-
(header.repoKey !== undefined && archivableProjects.repos.has(header.repoKey))
|
|
829
|
-
}
|
|
830
|
-
onArchiveProject={onArchiveProject}
|
|
831
|
-
onDeleteProject={onDeleteProject}
|
|
832
|
-
{...(header.hostId && hostById.get(header.hostId) ? { server: hostById.get(header.hostId)! } : {})}
|
|
833
|
-
{...(onOpenProject
|
|
834
|
-
? {
|
|
835
|
-
onOpenProject,
|
|
836
|
-
open:
|
|
837
|
-
activeSessionId == null &&
|
|
838
|
-
openProject != null &&
|
|
839
|
-
openProject.path === header.fullPath &&
|
|
840
|
-
openProject.hostId === header.hostId,
|
|
841
|
-
}
|
|
842
|
-
: {})}
|
|
843
|
-
{...(onOpenChats && header.chats ? { onOpenChats, open: activeSessionId == null && chatsOpen } : {})}
|
|
844
|
-
/>
|
|
845
|
-
)}
|
|
846
|
-
{node.children.map((child) => renderNode(child, header.kind === 'host' ? header.host.id : header.hostId))}
|
|
847
|
-
</ul>
|
|
848
|
-
</li>
|
|
849
|
-
);
|
|
850
|
-
}
|
|
851
|
-
|
|
852
|
-
if (node.kind === 'showMore') {
|
|
853
|
-
return <ShowMoreRow key={node.id} hiddenCount={node.hiddenCount} onExpand={() => expandGroup(node.groupId)} />;
|
|
854
|
-
}
|
|
855
|
-
|
|
856
|
-
if (node.kind === 'item') {
|
|
857
|
-
return (
|
|
858
|
-
<SidebarRowView
|
|
859
|
-
key={node.id}
|
|
860
|
-
rowId={node.id}
|
|
861
|
-
entry={node.row.entry}
|
|
862
|
-
collapsed={node.row.collapsed}
|
|
863
|
-
childCount={node.row.childCount}
|
|
864
|
-
onOpen={onOpenItemTarget}
|
|
865
|
-
{...(runCommand ? { onRunAction: onRunItemAction } : {})}
|
|
866
|
-
onToggle={toggleGroup}
|
|
867
|
-
>
|
|
868
|
-
{node.children.map((child) => renderNode(child, serverOfGroup))}
|
|
869
|
-
</SidebarRowView>
|
|
870
|
-
);
|
|
871
|
-
}
|
|
872
|
-
|
|
873
|
-
const session = node.session;
|
|
874
|
-
const isRenaming = session.id === renamingId;
|
|
875
|
-
return (
|
|
876
|
-
<SidebarSessionRow
|
|
877
|
-
key={session.id}
|
|
878
|
-
sessionId={session.id}
|
|
879
|
-
title={session.title}
|
|
880
|
-
cwd={session.cwd}
|
|
881
|
-
hostId={session.hostId}
|
|
882
|
-
// A folder or host header above already names the server (not in Favorites). A repository's group
|
|
883
|
-
// lists sessions from several machines: each server session names its own.
|
|
884
|
-
hostBadge={node.favorites === true || !groupsByFolder(listGroupBy) || session.hostId !== serverOfGroup}
|
|
885
|
-
spaceId={session.spaceId}
|
|
886
|
-
isMain={session.isMain}
|
|
887
|
-
updatedAt={session.updatedAt}
|
|
888
|
-
isActive={session.id === activeSessionId}
|
|
889
|
-
isRenaming={isRenaming}
|
|
890
|
-
archived={session.archived === true}
|
|
891
|
-
favorite={session.favorite}
|
|
892
|
-
renameValue={isRenaming ? renameValue : ''}
|
|
893
|
-
menuOpen={menuForId === session.id}
|
|
894
|
-
{...rowHandlers}
|
|
895
|
-
{...rowDetails}
|
|
896
|
-
spaces={spaceList}
|
|
897
|
-
environment={session.environment}
|
|
898
|
-
project={favoriteProjects.get(session.id)}
|
|
899
|
-
decoration={decorationOf(session)}
|
|
900
|
-
/>
|
|
901
|
-
);
|
|
902
|
-
};
|
|
903
|
-
|
|
904
|
-
/** The pinned blocks show the open session's items with the unscoped ones. */
|
|
905
|
-
const slotScope = activeSessionId != null ? { sessionId: activeSessionId } : {};
|
|
906
|
-
|
|
907
|
-
const searchRow = (session: S, excerpt?: string) => (
|
|
908
|
-
<SidebarSessionRow
|
|
909
|
-
key={session.id}
|
|
910
|
-
sessionId={session.id}
|
|
911
|
-
title={session.title}
|
|
912
|
-
cwd={session.cwd}
|
|
913
|
-
hostId={session.hostId}
|
|
914
|
-
spaceId={session.spaceId}
|
|
915
|
-
isMain={session.isMain}
|
|
916
|
-
isActive={session.id === activeSessionId}
|
|
917
|
-
isRenaming={session.id === renamingId}
|
|
918
|
-
archived={session.archived === true}
|
|
919
|
-
favorite={session.favorite}
|
|
920
|
-
renameValue={session.id === renamingId ? renameValue : ''}
|
|
921
|
-
menuOpen={menuForId === session.id}
|
|
922
|
-
{...rowHandlers}
|
|
923
|
-
{...rowDetails}
|
|
924
|
-
spaces={spaceList}
|
|
925
|
-
environment={session.environment}
|
|
926
|
-
decoration={decorationOf(session)}
|
|
927
|
-
{...(excerpt !== undefined ? { excerpt, excerptQuery: trimmedQuery } : {})}
|
|
928
|
-
/>
|
|
929
|
-
);
|
|
930
|
-
|
|
931
|
-
return (
|
|
932
|
-
<SidebarFrame
|
|
933
|
-
frame={frame}
|
|
934
|
-
{...(chromeInset ? { chromeInset } : {})}
|
|
935
|
-
{...(ariaLabel ? { ariaLabel } : {})}
|
|
936
|
-
{...(className ? { className } : {})}
|
|
937
|
-
{...(style ? { style } : {})}
|
|
938
|
-
>
|
|
939
|
-
{/*
|
|
940
|
-
* Top band. ONE vertical rhythm for everything above the list: every item
|
|
941
|
-
* is a row on the same grid as the session rows, and the band spaces them
|
|
942
|
-
* with the same 4px the list uses between rows. Order is by reach: the
|
|
943
|
-
* Main session, New session, then the search right on top of the list.
|
|
944
|
-
*/}
|
|
945
|
-
<div className="shrink-0 flex flex-col gap-1 px-2 pt-1">
|
|
946
|
-
{!searchMode && mainSession && (
|
|
947
|
-
<ul className="list-none m-0 p-0">
|
|
948
|
-
<MainSessionRow
|
|
949
|
-
sessionId={mainSession.id}
|
|
950
|
-
isActive={mainSession.id === activeSessionId}
|
|
951
|
-
icon={projectIcons[MAIN_SESSION_ICON_KEY]}
|
|
952
|
-
onAssignIcon={setProjectIcon}
|
|
953
|
-
onSelect={onRowSelect}
|
|
954
|
-
/>
|
|
955
|
-
</ul>
|
|
956
|
-
)}
|
|
957
|
-
{/* A highlighted header (a project home, Chats) is the selection then: the row stays flat. */}
|
|
958
|
-
<NewSessionButton
|
|
959
|
-
onNewSession={handleNewSession}
|
|
960
|
-
isActive={activeSessionId == null && openProject == null && !chatsOpen}
|
|
961
|
-
/>
|
|
962
|
-
<SidebarSearchRow value={searchQuery} onChange={setSearchQuery} filter={filter} />
|
|
963
|
-
</div>
|
|
964
|
-
<ExtensionSlot at="sidebar.top" {...slotScope} className={PINNED_SLOT} />
|
|
965
|
-
|
|
966
|
-
{/*
|
|
967
|
-
* The list is the ONLY flexible child (`flex-1 min-h-0`): it absorbs all
|
|
968
|
-
* height pressure by scrolling, so nothing pushes past the footer. Its
|
|
969
|
-
* edges fade (`LIST_MASK`): a stuck header pushed out dissolves below the
|
|
970
|
-
* search row, and a part-scrolled row into the footer; `pb-3` keeps a
|
|
971
|
-
* fully scrolled last row out of the 12px fade.
|
|
972
|
-
*
|
|
973
|
-
* One list per space: the leaving list slides out one way while the new
|
|
974
|
-
* one slides in from the other, on the `slide` spring. The key moves only
|
|
975
|
-
* on a user switch (`listKey`).
|
|
976
|
-
*/}
|
|
977
|
-
<div ref={listBox} className="relative flex-1 min-h-0 overflow-hidden flex flex-col">
|
|
978
|
-
<LazyMotion features={domAnimation}>
|
|
979
|
-
<AnimatePresence initial={false} custom={slideOffset} mode="popLayout">
|
|
980
|
-
<SpaceList
|
|
981
|
-
key={listKey}
|
|
982
|
-
ref={setListRef}
|
|
983
|
-
custom={slideOffset}
|
|
984
|
-
variants={SPACE_LIST_VARIANTS}
|
|
985
|
-
initial="enter"
|
|
986
|
-
animate="center"
|
|
987
|
-
exit="leave"
|
|
988
|
-
transition={slideTransition}
|
|
989
|
-
data-space={spacesOn ? listSpaceId : undefined}
|
|
990
|
-
tabIndex={-1}
|
|
991
|
-
className="zg-sidebar-list outline-none flex-1 min-h-0 w-full overflow-y-auto px-2 pt-1 pb-3 list-none m-0"
|
|
992
|
-
style={LIST_STYLE}
|
|
993
|
-
>
|
|
994
|
-
{searchMode ? (
|
|
995
|
-
<>
|
|
996
|
-
{titleMatches.map((session) => searchRow(session))}
|
|
997
|
-
{contentMatches.map(({ session, hit }) => searchRow(session, hit.excerpt))}
|
|
998
|
-
{searching && (
|
|
999
|
-
<li aria-live="polite" className="text-xs text-[var(--zg-text-muted)] px-3 pt-1 select-none">
|
|
1000
|
-
{labels.searchingSessions}
|
|
1001
|
-
</li>
|
|
1002
|
-
)}
|
|
1003
|
-
{!searching && titleMatches.length === 0 && contentMatches.length === 0 && (
|
|
1004
|
-
<li className="text-xs text-[var(--zg-text-muted)] px-3 pt-1 select-none">
|
|
1005
|
-
{labels.sidebarNoMatches}
|
|
1006
|
-
</li>
|
|
1007
|
-
)}
|
|
1008
|
-
</>
|
|
1009
|
-
) : (
|
|
1010
|
-
sections.map((node) => renderNode(node))
|
|
1011
|
-
)}
|
|
1012
|
-
{!searchMode &&
|
|
1013
|
-
sessions.length === 0 &&
|
|
1014
|
-
claimed.items.length === 0 &&
|
|
1015
|
-
(filtersOn && query ? (
|
|
1016
|
-
<li className="text-xs text-[var(--zg-text-muted)] px-3 pt-1 flex flex-col items-start gap-1">
|
|
1017
|
-
<span>{labels.noChatsMatchFilters}</span>
|
|
1018
|
-
{onViewChange && (
|
|
1019
|
-
<button
|
|
1020
|
-
type="button"
|
|
1021
|
-
className="p-0 bg-transparent border-0 text-xs text-[var(--zg-text)] hover:underline cursor-pointer"
|
|
1022
|
-
onClick={() => onViewChange(clearedViewFilters(query.view))}
|
|
1023
|
-
>
|
|
1024
|
-
{labels.resetFilters}
|
|
1025
|
-
</button>
|
|
1026
|
-
)}
|
|
1027
|
-
</li>
|
|
1028
|
-
) : (
|
|
1029
|
-
<li className="text-xs text-[var(--zg-text-muted)] px-3 pt-1">{labels.noChatsYet}</li>
|
|
1030
|
-
))}
|
|
1031
|
-
</SpaceList>
|
|
1032
|
-
</AnimatePresence>
|
|
1033
|
-
</LazyMotion>
|
|
1034
|
-
</div>
|
|
1035
|
-
<ExtensionSlot at="sidebar.bottom" {...slotScope} className={PINNED_SLOT} />
|
|
1036
|
-
{footer}
|
|
1037
|
-
</SidebarFrame>
|
|
1038
|
-
);
|
|
1039
|
-
}
|