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,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Diagnostics for a set of files at once (the Diffs tab's file list): one
|
|
3
|
-
* runner call, counts per path. Re-runs when the list changes, and when
|
|
4
|
-
* `version` does once a burst of new versions settles. Off when the Editor
|
|
5
|
-
* setting is off.
|
|
6
|
-
*/
|
|
7
|
-
import { useMemo, useRef } from 'react';
|
|
8
|
-
|
|
9
|
-
import { countBySeverity } from '../code/editor/diagnostics';
|
|
10
|
-
import type { Diagnostic } from './headless/host';
|
|
11
|
-
import { useDiagnosticsRun } from './useDiagnosticsRun';
|
|
12
|
-
|
|
13
|
-
export type SeverityCounts = ReturnType<typeof countBySeverity>;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* `version` is a number or string. Arrays (and other objects) are accepted
|
|
17
|
-
* for robustness: each new identity counts as a new version, so an array
|
|
18
|
-
* never stringifies to "[object Object]" and pins the key.
|
|
19
|
-
*/
|
|
20
|
-
export type DiagnosticsVersion = number | string | null | undefined | readonly unknown[] | object;
|
|
21
|
-
|
|
22
|
-
export function useFilesDiagnostics(
|
|
23
|
-
cwd: string | null,
|
|
24
|
-
paths: readonly string[],
|
|
25
|
-
version: DiagnosticsVersion,
|
|
26
|
-
): ReadonlyMap<string, SeverityCounts> | null {
|
|
27
|
-
const { result } = useDiagnosticsRun(cwd, paths, {
|
|
28
|
-
version: useVersionKey(version),
|
|
29
|
-
settle: true,
|
|
30
|
-
// These files are not open in a language server: the project-wide checks run for them.
|
|
31
|
-
lsp: false,
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
return useMemo(() => {
|
|
35
|
-
if (!result) return null;
|
|
36
|
-
const byPath = new Map<string, Diagnostic[]>();
|
|
37
|
-
for (const d of result.diagnostics) byPath.set(d.path, [...(byPath.get(d.path) ?? []), d]);
|
|
38
|
-
return new Map([...byPath].map(([p, items]) => [p, countBySeverity(items)]));
|
|
39
|
-
}, [result]);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/** Primitive versions pass through; an object version becomes `length:counter`, bumped per new identity. */
|
|
43
|
-
export function useVersionKey(version: DiagnosticsVersion): string {
|
|
44
|
-
const last = useRef<{ value: unknown; counter: number }>({ value: version, counter: 0 });
|
|
45
|
-
if (version === null || version === undefined || typeof version !== 'object') return String(version);
|
|
46
|
-
// eslint-disable-next-line react-hooks/refs -- a latest-value ref: written in render, read by callbacks and effects
|
|
47
|
-
if (last.current.value !== version) last.current = { value: version, counter: last.current.counter + 1 };
|
|
48
|
-
const length = Array.isArray(version) ? version.length : 0;
|
|
49
|
-
// eslint-disable-next-line react-hooks/refs -- a latest-value ref: written in render, read by callbacks and effects
|
|
50
|
-
return `${length}:${last.current.counter}`;
|
|
51
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The Files and Diffs tabs' labels: the defaults, overridable through
|
|
3
|
-
* `<LabelsProvider>` or `FilesProvider`'s `labels`.
|
|
4
|
-
*/
|
|
5
|
-
import { useMemo } from 'react';
|
|
6
|
-
|
|
7
|
-
import { useLabels } from '../labels';
|
|
8
|
-
import { DEFAULT_FILES_LABELS, type FilesLabels } from './headless/labels';
|
|
9
|
-
|
|
10
|
-
/** Returns the Files and Diffs tabs' strings: the defaults merged with any overrides given to `FilesProvider` or `LabelsProvider`. */
|
|
11
|
-
export function useFilesLabels(): FilesLabels {
|
|
12
|
-
const overrides = useLabels() as Partial<FilesLabels>;
|
|
13
|
-
return useMemo(() => ({ ...DEFAULT_FILES_LABELS, ...overrides }), [overrides]);
|
|
14
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* When a folder's files may have moved, for views that work from a folder
|
|
3
|
-
* rather than a session (Files, Diffs): the host's `watch` (a tool result
|
|
4
|
-
* from any session working in that folder, the repository moving). The
|
|
5
|
-
* subscription fires raw; callers settle bursts themselves.
|
|
6
|
-
*/
|
|
7
|
-
import { useCallback, useRef } from 'react';
|
|
8
|
-
|
|
9
|
-
import { useFilesHost } from './FilesProvider';
|
|
10
|
-
import type { FilesScope, FolderChange } from './headless/host';
|
|
11
|
-
import { filesRootOf } from './headless/view';
|
|
12
|
-
|
|
13
|
-
export type OnFolderChange = (handler: (why: FolderChange) => void) => () => void;
|
|
14
|
-
|
|
15
|
-
const NOTHING = () => {};
|
|
16
|
-
|
|
17
|
-
/** Subscribe to `scope`'s folder changing. Stable per folder. */
|
|
18
|
-
export function useFolderChanges(scope: FilesScope | null): OnFolderChange {
|
|
19
|
-
const watch = useFilesHost().watch;
|
|
20
|
-
const scopeRef = useRef(scope);
|
|
21
|
-
// eslint-disable-next-line react-hooks/refs -- a latest-value ref: written in render, read by callbacks and effects
|
|
22
|
-
scopeRef.current = scope;
|
|
23
|
-
const root = scope ? filesRootOf(scope) : '';
|
|
24
|
-
const cwd = scope?.cwd ?? '';
|
|
25
|
-
const project = scope?.root ?? '';
|
|
26
|
-
const bound = scope?.session ?? null;
|
|
27
|
-
|
|
28
|
-
return useCallback<OnFolderChange>(
|
|
29
|
-
(handler) => {
|
|
30
|
-
const current = scopeRef.current;
|
|
31
|
-
if (!root || !current || !watch) return NOTHING;
|
|
32
|
-
return watch(current, handler);
|
|
33
|
-
},
|
|
34
|
-
// The scope's identity, not its object (callers rebuild it per render).
|
|
35
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
36
|
-
[watch, root, cwd, project, bound],
|
|
37
|
-
);
|
|
38
|
-
}
|
package/src/files/useLsp.ts
DELETED
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Language-server diagnostics for the viewed file. The document is opened
|
|
3
|
-
* on the server while a view shows it and closed when the last one goes;
|
|
4
|
-
* `text` updates (typing) are pushed after a short debounce so findings
|
|
5
|
-
* track the draft. Results arrive through the host's `lsp.onDiagnostics`.
|
|
6
|
-
*
|
|
7
|
-
* Documents are counted per (cwd, path) in this window ({@link attachLspDoc}):
|
|
8
|
-
* the first view sends the open, the last one the close, and the text is
|
|
9
|
-
* synced once per document, not per view. Every view of a folder reads the
|
|
10
|
-
* same draft (`folderBuffers`), so they all push the same text: a second
|
|
11
|
-
* view adds nothing to send, and never replays the open with a text the
|
|
12
|
-
* server has moved past. The desktop app's main process counts windows the
|
|
13
|
-
* same way (`DocOwners`).
|
|
14
|
-
*/
|
|
15
|
-
import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react';
|
|
16
|
-
|
|
17
|
-
import { useEditorPrefs, useFilesHost } from './FilesProvider';
|
|
18
|
-
import type { Diagnostic, FilesLsp, LspTextChange } from './headless/host';
|
|
19
|
-
import { forgetEdits, resetEdits, takeEdits } from './headless/lsp-edits';
|
|
20
|
-
|
|
21
|
-
const CHANGE_DEBOUNCE_MS = 300;
|
|
22
|
-
|
|
23
|
-
/** One document open on the language server for this window. */
|
|
24
|
-
export interface LspDoc {
|
|
25
|
-
/** The language servers it is open on. */
|
|
26
|
-
readonly lsp: FilesLsp;
|
|
27
|
-
readonly cwd: string;
|
|
28
|
-
readonly path: string;
|
|
29
|
-
/** Latest findings (null until the open answers). */
|
|
30
|
-
items: Diagnostic[] | null;
|
|
31
|
-
/** Views showing it. */
|
|
32
|
-
views: number;
|
|
33
|
-
/** The text the server has, or will have once the pending change goes out. */
|
|
34
|
-
synced: string;
|
|
35
|
-
timer: ReturnType<typeof setTimeout> | null;
|
|
36
|
-
listeners: Set<() => void>;
|
|
37
|
-
off: () => void;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const docs = new Map<string, LspDoc>();
|
|
41
|
-
const docKey = (cwd: string, path: string) => `${cwd}\0${path}`;
|
|
42
|
-
|
|
43
|
-
function setItems(doc: LspDoc, items: Diagnostic[]): void {
|
|
44
|
-
doc.items = items;
|
|
45
|
-
for (const l of doc.listeners) l();
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/** A view starts showing `path`: open it on the server, or join the open document. */
|
|
49
|
-
export function attachLspDoc(lsp: FilesLsp, cwd: string, path: string, text: string): LspDoc {
|
|
50
|
-
const key = docKey(cwd, path);
|
|
51
|
-
const existing = docs.get(key);
|
|
52
|
-
if (existing) {
|
|
53
|
-
existing.views++;
|
|
54
|
-
// Same draft as the other views: if it moved meanwhile, the next change syncs it.
|
|
55
|
-
if (text !== existing.synced) updateLspDoc(existing, text);
|
|
56
|
-
return existing;
|
|
57
|
-
}
|
|
58
|
-
const doc: LspDoc = {
|
|
59
|
-
lsp,
|
|
60
|
-
cwd,
|
|
61
|
-
path,
|
|
62
|
-
items: null,
|
|
63
|
-
views: 1,
|
|
64
|
-
synced: text,
|
|
65
|
-
timer: null,
|
|
66
|
-
listeners: new Set(),
|
|
67
|
-
off: () => {},
|
|
68
|
-
};
|
|
69
|
-
docs.set(key, doc);
|
|
70
|
-
// A fresh open establishes the baseline: whatever was buffered before is stale.
|
|
71
|
-
resetEdits(cwd, path);
|
|
72
|
-
takeEdits(cwd, path);
|
|
73
|
-
void lsp
|
|
74
|
-
.open(cwd, path, text)
|
|
75
|
-
.then((known) => docs.get(key) === doc && doc.items === null && setItems(doc, known))
|
|
76
|
-
.catch(() => undefined);
|
|
77
|
-
doc.off = lsp.onDiagnostics((atCwd, atPath, diagnostics) => {
|
|
78
|
-
if (atCwd === cwd && atPath === path) setItems(doc, diagnostics);
|
|
79
|
-
});
|
|
80
|
-
return doc;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/** The text moved (typing, a reload): one debounced `didChange` per document. */
|
|
84
|
-
export function updateLspDoc(doc: LspDoc, text: string): void {
|
|
85
|
-
if (text === doc.synced) return;
|
|
86
|
-
doc.synced = text;
|
|
87
|
-
if (doc.timer) clearTimeout(doc.timer);
|
|
88
|
-
doc.timer = setTimeout(() => {
|
|
89
|
-
doc.timer = null;
|
|
90
|
-
if (docs.get(docKey(doc.cwd, doc.path)) !== doc) return;
|
|
91
|
-
// Incremental when the editor recorded every edit since the last sync; full text otherwise.
|
|
92
|
-
doc.lsp.open(doc.cwd, doc.path, doc.synced, takeEdits(doc.cwd, doc.path)).catch(() => undefined);
|
|
93
|
-
}, CHANGE_DEBOUNCE_MS);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Completion is about to ask: the server must have `text` first, so the
|
|
98
|
-
* pending debounced change goes now, inside the completion request. Returns
|
|
99
|
-
* the edits to send with it (`undefined`: send the full text), or `null`
|
|
100
|
-
* when no view has the document open here.
|
|
101
|
-
*/
|
|
102
|
-
export function syncLspDocNow(
|
|
103
|
-
cwd: string,
|
|
104
|
-
path: string,
|
|
105
|
-
text: string,
|
|
106
|
-
): { changes: LspTextChange[] | undefined } | null {
|
|
107
|
-
const doc = docs.get(docKey(cwd, path));
|
|
108
|
-
if (!doc) return null;
|
|
109
|
-
if (doc.timer) clearTimeout(doc.timer);
|
|
110
|
-
doc.timer = null;
|
|
111
|
-
doc.synced = text;
|
|
112
|
-
return { changes: takeEdits(cwd, path) };
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/** A view stops showing the document; the last one closes it on the server. */
|
|
116
|
-
export function detachLspDoc(doc: LspDoc): void {
|
|
117
|
-
if (--doc.views > 0) return;
|
|
118
|
-
if (doc.timer) clearTimeout(doc.timer);
|
|
119
|
-
doc.timer = null;
|
|
120
|
-
doc.off();
|
|
121
|
-
const key = docKey(doc.cwd, doc.path);
|
|
122
|
-
if (docs.get(key) === doc) {
|
|
123
|
-
docs.delete(key);
|
|
124
|
-
forgetEdits(doc.cwd, doc.path);
|
|
125
|
-
}
|
|
126
|
-
doc.lsp.close(doc.cwd, doc.path).catch(() => undefined);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export function __lspDocsForTests(): ReadonlyMap<string, LspDoc> {
|
|
130
|
-
return docs;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const noSubscribe = () => () => {};
|
|
134
|
-
|
|
135
|
-
export function useLsp(cwd: string | null, path: string | null, text: string | null): Diagnostic[] | null {
|
|
136
|
-
const ed = useEditorPrefs();
|
|
137
|
-
const lsp = useFilesHost().lsp;
|
|
138
|
-
const enabled = ed.diagnostics === 'lsp' && lsp !== undefined && cwd !== null && path !== null && text !== null;
|
|
139
|
-
const [doc, setDoc] = useState<LspDoc | null>(null);
|
|
140
|
-
|
|
141
|
-
// Attach / detach follows the (cwd, path) identity; the text at that moment is the opening one.
|
|
142
|
-
const opening = useRef(text);
|
|
143
|
-
// eslint-disable-next-line react-hooks/refs -- a latest-value ref: written in render, read by callbacks and effects
|
|
144
|
-
opening.current = text;
|
|
145
|
-
useEffect(() => {
|
|
146
|
-
if (!enabled || !lsp || !cwd || !path) return;
|
|
147
|
-
const d = attachLspDoc(lsp, cwd, path, opening.current ?? '');
|
|
148
|
-
setDoc(d);
|
|
149
|
-
return () => {
|
|
150
|
-
setDoc((cur) => (cur === d ? null : cur));
|
|
151
|
-
detachLspDoc(d);
|
|
152
|
-
};
|
|
153
|
-
}, [enabled, lsp, cwd, path]);
|
|
154
|
-
|
|
155
|
-
// Text changes: debounced didChange (deduplicated across views).
|
|
156
|
-
useEffect(() => {
|
|
157
|
-
if (doc && text !== null) updateLspDoc(doc, text);
|
|
158
|
-
}, [doc, text]);
|
|
159
|
-
|
|
160
|
-
const subscribe = useCallback(
|
|
161
|
-
(fn: () => void) => {
|
|
162
|
-
if (!doc) return noSubscribe();
|
|
163
|
-
doc.listeners.add(fn);
|
|
164
|
-
return () => doc.listeners.delete(fn);
|
|
165
|
-
},
|
|
166
|
-
[doc],
|
|
167
|
-
);
|
|
168
|
-
const read = () => doc?.items ?? null;
|
|
169
|
-
const items = useSyncExternalStore(subscribe, read, read);
|
|
170
|
-
const live = doc && doc.cwd === cwd && doc.path === path;
|
|
171
|
-
return enabled && live ? items : null;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
/** Push the LSP settings to the host whenever they change. Mount once (FilesTab). */
|
|
175
|
-
export function useLspConfigSync(): void {
|
|
176
|
-
const ed = useEditorPrefs();
|
|
177
|
-
const lsp = useFilesHost().lsp;
|
|
178
|
-
useEffect(() => {
|
|
179
|
-
lsp?.configure({ idleMs: ed.lspIdleMin * 60_000, overrides: { ...ed.lspOverrides } }).catch(() => undefined);
|
|
180
|
-
}, [lsp, ed.lspIdleMin, ed.lspOverrides]);
|
|
181
|
-
}
|
|
@@ -1,402 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The editor side of the Files tab: which files are open as tabs, which is
|
|
3
|
-
* active, their contents, plus the per-scope persistence of all of it
|
|
4
|
-
* (open tabs, active file, tree toggles). Restored tabs start unloaded and
|
|
5
|
-
* are read once the cwd is known.
|
|
6
|
-
*
|
|
7
|
-
* The tab list is this view's; the unsaved text is the folder's
|
|
8
|
-
* (`folderBuffers`): every view of the same files root shares it, so a
|
|
9
|
-
* draft survives a remount (session switch, the new-chat draft becoming a
|
|
10
|
-
* session) and two views of a file show the same dirty state.
|
|
11
|
-
*
|
|
12
|
-
* After a tool burst only files that may have moved are re-read: the
|
|
13
|
-
* active one, the ones the new edit events touched, and (when git status
|
|
14
|
-
* lands) the ones whose status changed. Every other open tab is marked
|
|
15
|
-
* stale and re-read when it becomes active, so a change made behind the
|
|
16
|
-
* agent's edit tool (a shell `sed`) still shows before anyone looks at it.
|
|
17
|
-
*/
|
|
18
|
-
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
19
|
-
|
|
20
|
-
import type { SessionEditEvent } from '../session/headless/session-diffs';
|
|
21
|
-
import { DraftStore, folderBuffers, type EditSlot, type FolderBuffers } from './drafts-store';
|
|
22
|
-
import { useFilesHost } from './FilesProvider';
|
|
23
|
-
import type { FilesScope, GitStatusEntry, WorkspaceFile } from './headless/host';
|
|
24
|
-
import { filesRootOf, type FilesLayout, type FilesLayoutStore } from './headless/view';
|
|
25
|
-
import { isUnder, movedPath } from './headless/entries';
|
|
26
|
-
import { editedPath, sameFile, statusDelta } from './headless/workspace-diff';
|
|
27
|
-
|
|
28
|
-
export interface OpenFile {
|
|
29
|
-
path: string;
|
|
30
|
-
/** null while loading; 'missing' when the read failed (moved, deleted, outside cwd). */
|
|
31
|
-
file: WorkspaceFile | null | 'missing';
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface OpenFiles {
|
|
35
|
-
open: OpenFile[];
|
|
36
|
-
/** Unsaved editor contents per path (panel editing); subscribe per path with `useDraft` / `useIsDirty`. */
|
|
37
|
-
drafts: DraftStore;
|
|
38
|
-
/** `base`: the file the draft was typed against (kept with it for the save-conflict check). */
|
|
39
|
-
setDraft: (path: string, contents: string | null, base?: WorkspaceFile) => void;
|
|
40
|
-
/** pierre edit-session key for `path`; changes when the draft is reset. */
|
|
41
|
-
editKey: (path: string) => string;
|
|
42
|
-
/** Adopt `file` as the on-disk truth (after a save or a reload) and drop the draft. */
|
|
43
|
-
adoptFile: (path: string, file: WorkspaceFile, resetEditor?: boolean) => void;
|
|
44
|
-
/** Timestamp of our last save per path (diagnostics `save` trigger). */
|
|
45
|
-
savedAt: ReadonlyMap<string, number>;
|
|
46
|
-
activePath: string | null;
|
|
47
|
-
active: OpenFile | null;
|
|
48
|
-
setActivePath: (path: string | null) => void;
|
|
49
|
-
/** Open (or focus) `path` as a tab and load it. */
|
|
50
|
-
show: (path: string) => void;
|
|
51
|
-
/**
|
|
52
|
-
* Show `to` in `from`'s tab, in its place (stepping through a folder's media):
|
|
53
|
-
* no new tab piles up. When `to` is open already its tab is focused and
|
|
54
|
-
* `from`'s closes. A `from` with unsaved text keeps its tab: `to` opens as `show` does.
|
|
55
|
-
*/
|
|
56
|
-
replace: (from: string, to: string) => void;
|
|
57
|
-
close: (path: string) => void;
|
|
58
|
-
/** Re-read every open file (the explicit Refresh). */
|
|
59
|
-
reloadAll: () => void;
|
|
60
|
-
/** `from` moved to `to` (a rename, a folder moved): its tabs follow, unsaved text included. */
|
|
61
|
-
moved: (from: string, to: string) => void;
|
|
62
|
-
/** `path` was removed (a folder whole): clean tabs close; a tab with unsaved text stays, shown missing. */
|
|
63
|
-
removed: (path: string) => void;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
type TreePrefs = Pick<FilesLayout, 'filesShowIgnored' | 'filesTreeOpen' | 'filesChangedOnly'>;
|
|
67
|
-
|
|
68
|
-
/** What the workspace hook knows about the latest changes. */
|
|
69
|
-
export interface OpenFilesSource {
|
|
70
|
-
onToolResult: (handler: () => void) => () => void;
|
|
71
|
-
edits: readonly SessionEditEvent[];
|
|
72
|
-
status: readonly GitStatusEntry[];
|
|
73
|
-
/** The tab is on screen; while hidden a burst only marks files stale. */
|
|
74
|
-
visible: boolean;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/** A view with no folder: nothing to share, nothing to keep. */
|
|
78
|
-
const NO_FOLDER = folderBuffers('');
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* The open files of a Files tab view.
|
|
82
|
-
*
|
|
83
|
-
* @param scope - The view's scope.
|
|
84
|
-
* @param layout - The scope's layout as read now (only the mount reads it).
|
|
85
|
-
* @param layoutStore - Where the open tabs, the active file and `prefs` are written back.
|
|
86
|
-
* @param prefs - The tree toggles, written with the tabs.
|
|
87
|
-
* @param source - What the workspace hook knows about the latest changes.
|
|
88
|
-
*/
|
|
89
|
-
export function useOpenFiles(
|
|
90
|
-
scope: FilesScope,
|
|
91
|
-
layout: FilesLayout,
|
|
92
|
-
layoutStore: FilesLayoutStore,
|
|
93
|
-
prefs: TreePrefs,
|
|
94
|
-
source: OpenFilesSource,
|
|
95
|
-
): OpenFiles {
|
|
96
|
-
const read = useFilesHost().read;
|
|
97
|
-
const cwd = filesRootOf(scope) || null;
|
|
98
|
-
const [open, setOpen] = useState<OpenFile[]>(() => layout.filesOpen.map((path) => ({ path, file: null })));
|
|
99
|
-
const [activePath, setActivePath] = useState<string | null>(layout.filesActive);
|
|
100
|
-
const buffers = cwd ? folderBuffers(cwd) : NO_FOLDER;
|
|
101
|
-
const drafts = buffers.drafts;
|
|
102
|
-
// Paths moved away from (`moved`): their viewer's unmount flush lands here after the move,
|
|
103
|
-
// whenever React commits it, and is dropped. A path leaves the set once a tab shows it again.
|
|
104
|
-
const retired = useRef(new Set<string>());
|
|
105
|
-
const setDraft = useCallback(
|
|
106
|
-
(path: string, contents: string | null, base?: WorkspaceFile) => {
|
|
107
|
-
if (contents !== null && retired.current.has(path)) return;
|
|
108
|
-
drafts.set(path, contents, base);
|
|
109
|
-
},
|
|
110
|
-
[drafts],
|
|
111
|
-
);
|
|
112
|
-
useEffect(() => {
|
|
113
|
-
for (const f of open) retired.current.delete(f.path);
|
|
114
|
-
}, [open]);
|
|
115
|
-
// The editor slots this view holds, per path (`FolderBuffers.claim`). Taken
|
|
116
|
-
// on first render of a path's key, given back when the tab closes or the view goes.
|
|
117
|
-
const holding = useRef<{ buffers: FolderBuffers; slots: Map<string, EditSlot> }>({ buffers, slots: new Map() });
|
|
118
|
-
// Another folder: start a new set (the old one is given back by the effect below).
|
|
119
|
-
// eslint-disable-next-line react-hooks/refs -- a latest-value ref: written in render, read by callbacks and effects
|
|
120
|
-
if (holding.current.buffers !== buffers) holding.current = { buffers, slots: new Map() };
|
|
121
|
-
const slots = holding.current.slots;
|
|
122
|
-
const editKey = useCallback(
|
|
123
|
-
(path: string) => {
|
|
124
|
-
let held = slots.get(path);
|
|
125
|
-
if (!held) slots.set(path, (held = buffers.claim(path)));
|
|
126
|
-
return buffers.key(path, held);
|
|
127
|
-
},
|
|
128
|
-
[buffers, slots],
|
|
129
|
-
);
|
|
130
|
-
useEffect(() => {
|
|
131
|
-
const h = holding.current;
|
|
132
|
-
return () => {
|
|
133
|
-
for (const [p, s] of h.slots) h.buffers.release(p, s);
|
|
134
|
-
h.slots.clear();
|
|
135
|
-
};
|
|
136
|
-
}, [buffers]);
|
|
137
|
-
const resetEditSession = useCallback(
|
|
138
|
-
(path: string) => {
|
|
139
|
-
const held = slots.get(path);
|
|
140
|
-
if (held) slots.set(path, buffers.reset(path, held));
|
|
141
|
-
},
|
|
142
|
-
[buffers, slots],
|
|
143
|
-
);
|
|
144
|
-
const [savedAt, setSavedAt] = useState<ReadonlyMap<string, number>>(new Map());
|
|
145
|
-
const adoptFile = useCallback(
|
|
146
|
-
// eslint-disable-next-line react-hooks/preserve-manual-memoization -- the deps are the hook's stable inputs (setters, refs' owners)
|
|
147
|
-
(path: string, file: WorkspaceFile, resetEditor = false) => {
|
|
148
|
-
if (resetEditor) resetEditSession(path);
|
|
149
|
-
else setSavedAt((m) => new Map(m).set(path, Date.now()));
|
|
150
|
-
setOpen((current) => current.map((f) => (f.path === path && f.file !== file ? { path, file } : f)));
|
|
151
|
-
setDraft(path, null);
|
|
152
|
-
},
|
|
153
|
-
[setDraft, resetEditSession],
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
// Written on change only: a remount (the scope rebinding) must not re-stamp the layout.
|
|
157
|
-
const layoutRef = useRef(layoutStore);
|
|
158
|
-
// eslint-disable-next-line react-hooks/refs -- a latest-value ref: written in render, read by callbacks and effects
|
|
159
|
-
layoutRef.current = layoutStore;
|
|
160
|
-
useEffect(() => {
|
|
161
|
-
layoutRef.current.update({ filesOpen: open.map((f) => f.path), filesActive: activePath, ...prefs });
|
|
162
|
-
}, [open, activePath, prefs]);
|
|
163
|
-
|
|
164
|
-
// Open files that may be out of date (a burst passed while they were in the background).
|
|
165
|
-
const stale = useRef(new Set<string>());
|
|
166
|
-
const openRef = useRef(open);
|
|
167
|
-
// eslint-disable-next-line react-hooks/refs -- a latest-value ref: written in render, read by callbacks and effects
|
|
168
|
-
openRef.current = open;
|
|
169
|
-
const activeRef = useRef(activePath);
|
|
170
|
-
// eslint-disable-next-line react-hooks/refs -- a latest-value ref: written in render, read by callbacks and effects
|
|
171
|
-
activeRef.current = activePath;
|
|
172
|
-
|
|
173
|
-
// Newest read per path wins: a burst, a status move and a pick can each
|
|
174
|
-
// re-read the same file, and the answers may land out of order.
|
|
175
|
-
const reads = useRef(new Map<string, number>());
|
|
176
|
-
const reload = useCallback(
|
|
177
|
-
// eslint-disable-next-line react-hooks/preserve-manual-memoization -- the deps are the hook's stable inputs (setters, refs' owners)
|
|
178
|
-
async (path: string) => {
|
|
179
|
-
if (!cwd) return;
|
|
180
|
-
stale.current.delete(path);
|
|
181
|
-
const mine = (reads.current.get(path) ?? 0) + 1;
|
|
182
|
-
reads.current.set(path, mine);
|
|
183
|
-
const file = (read ? await read(cwd, path).catch(() => null) : null) ?? 'missing';
|
|
184
|
-
if (reads.current.get(path) !== mine) return;
|
|
185
|
-
reads.current.delete(path);
|
|
186
|
-
setOpen((current) => {
|
|
187
|
-
const idx = current.findIndex((f) => f.path === path);
|
|
188
|
-
// Same bytes at the same mtime: keep the object so the viewer and its diff skip the update.
|
|
189
|
-
if (idx === -1 || sameFile(current[idx].file, file)) return current;
|
|
190
|
-
const next = current.slice();
|
|
191
|
-
next[idx] = { path, file };
|
|
192
|
-
return next;
|
|
193
|
-
});
|
|
194
|
-
},
|
|
195
|
-
[read, cwd],
|
|
196
|
-
);
|
|
197
|
-
|
|
198
|
-
const reloadAll = useCallback(() => {
|
|
199
|
-
for (const f of openRef.current) void reload(f.path);
|
|
200
|
-
}, [reload]);
|
|
201
|
-
|
|
202
|
-
// A stale file is re-read when it comes on screen (picked, or the tab shown again).
|
|
203
|
-
const { visible } = source;
|
|
204
|
-
const visibleRef = useRef(visible);
|
|
205
|
-
// eslint-disable-next-line react-hooks/refs -- a latest-value ref: written in render, read by callbacks and effects
|
|
206
|
-
visibleRef.current = visible;
|
|
207
|
-
useEffect(() => {
|
|
208
|
-
if (visible && activePath && stale.current.has(activePath)) void reload(activePath);
|
|
209
|
-
}, [visible, activePath, reload]);
|
|
210
|
-
|
|
211
|
-
// Restored tabs start unloaded; fetch them once cwd is known.
|
|
212
|
-
useEffect(() => {
|
|
213
|
-
for (const f of openRef.current) if (f.file === null) void reload(f.path);
|
|
214
|
-
}, [cwd, reload]);
|
|
215
|
-
|
|
216
|
-
// Tool burst: re-read the active file and what the new edit events touched; the rest goes stale.
|
|
217
|
-
const seenEdits = useRef(new WeakSet<SessionEditEvent>());
|
|
218
|
-
const editsRef = useRef(source.edits);
|
|
219
|
-
// eslint-disable-next-line react-hooks/refs -- a latest-value ref: written in render, read by callbacks and effects
|
|
220
|
-
editsRef.current = source.edits;
|
|
221
|
-
const { onToolResult } = source;
|
|
222
|
-
useEffect(
|
|
223
|
-
() =>
|
|
224
|
-
onToolResult(() => {
|
|
225
|
-
const touched = new Set<string>();
|
|
226
|
-
for (const ev of editsRef.current) {
|
|
227
|
-
if (seenEdits.current.has(ev)) continue;
|
|
228
|
-
seenEdits.current.add(ev);
|
|
229
|
-
const p = editedPath(ev);
|
|
230
|
-
if (p !== null) touched.add(p);
|
|
231
|
-
}
|
|
232
|
-
for (const f of openRef.current) {
|
|
233
|
-
if (visibleRef.current && (f.path === activeRef.current || touched.has(f.path))) void reload(f.path);
|
|
234
|
-
else stale.current.add(f.path);
|
|
235
|
-
}
|
|
236
|
-
}),
|
|
237
|
-
[onToolResult, reload],
|
|
238
|
-
);
|
|
239
|
-
// Edits that landed before this tab mounted are already reflected in the first read.
|
|
240
|
-
useEffect(() => {
|
|
241
|
-
for (const ev of editsRef.current) seenEdits.current.add(ev);
|
|
242
|
-
}, []);
|
|
243
|
-
|
|
244
|
-
// Git status moved (after a burst, or a checkout): re-read open files whose status changed.
|
|
245
|
-
const lastStatus = useRef(source.status);
|
|
246
|
-
useEffect(() => {
|
|
247
|
-
const prev = lastStatus.current;
|
|
248
|
-
lastStatus.current = source.status;
|
|
249
|
-
if (prev === source.status) return;
|
|
250
|
-
const moved = statusDelta(prev, source.status);
|
|
251
|
-
if (moved.size === 0) return;
|
|
252
|
-
for (const f of openRef.current) if (moved.has(f.path) && f.path !== activeRef.current) void reload(f.path);
|
|
253
|
-
}, [source.status, reload]);
|
|
254
|
-
|
|
255
|
-
const show = useCallback(
|
|
256
|
-
// eslint-disable-next-line react-hooks/preserve-manual-memoization -- the deps are the hook's stable inputs (setters, refs' owners)
|
|
257
|
-
(path: string) => {
|
|
258
|
-
setOpen((current) => (current.some((f) => f.path === path) ? current : [...current, { path, file: null }]));
|
|
259
|
-
setActivePath(path);
|
|
260
|
-
void reload(path);
|
|
261
|
-
},
|
|
262
|
-
[reload],
|
|
263
|
-
);
|
|
264
|
-
|
|
265
|
-
const close = useCallback(
|
|
266
|
-
// eslint-disable-next-line react-hooks/preserve-manual-memoization -- the deps are the hook's stable inputs (setters, refs' owners)
|
|
267
|
-
(path: string) => {
|
|
268
|
-
const held = slots.get(path);
|
|
269
|
-
slots.delete(path);
|
|
270
|
-
// The last view of the file: closing discards its draft. Another
|
|
271
|
-
// view still showing it keeps the shared text.
|
|
272
|
-
const shared = buffers.holders(path) > (held ? 1 : 0);
|
|
273
|
-
if (held) buffers.release(path, held);
|
|
274
|
-
if (!shared) {
|
|
275
|
-
if (held) buffers.reset(path, held);
|
|
276
|
-
setDraft(path, null);
|
|
277
|
-
// The closing viewer flushes its draft as it unmounts (after this): drop that too,
|
|
278
|
-
// unless a view took the file again meanwhile.
|
|
279
|
-
setTimeout(() => {
|
|
280
|
-
if (buffers.holders(path) === 0) setDraft(path, null);
|
|
281
|
-
}, 0);
|
|
282
|
-
}
|
|
283
|
-
stale.current.delete(path);
|
|
284
|
-
setOpen((current) => {
|
|
285
|
-
const idx = current.findIndex((f) => f.path === path);
|
|
286
|
-
const next = current.filter((f) => f.path !== path);
|
|
287
|
-
setActivePath((active) =>
|
|
288
|
-
active === path ? (next[Math.max(0, Math.min(idx, next.length - 1))]?.path ?? null) : active,
|
|
289
|
-
);
|
|
290
|
-
return next;
|
|
291
|
-
});
|
|
292
|
-
},
|
|
293
|
-
[setDraft, buffers, slots],
|
|
294
|
-
);
|
|
295
|
-
|
|
296
|
-
const moved = useCallback(
|
|
297
|
-
// eslint-disable-next-line react-hooks/preserve-manual-memoization -- the deps are the hook's stable inputs (setters, refs' owners)
|
|
298
|
-
(from: string, to: string) => {
|
|
299
|
-
if (from === to) return;
|
|
300
|
-
const renames = openRef.current.flatMap((f) => {
|
|
301
|
-
const next = movedPath(f.path, from, to);
|
|
302
|
-
return next === null || next === f.path ? [] : [{ old: f.path, next }];
|
|
303
|
-
});
|
|
304
|
-
if (renames.length === 0) return;
|
|
305
|
-
for (const { old, next } of renames) {
|
|
306
|
-
// The unsaved text goes with the file; the old path's editor slot is given back.
|
|
307
|
-
const text = drafts.get(old);
|
|
308
|
-
const base = drafts.baseOf(old);
|
|
309
|
-
if (text !== undefined) drafts.set(next, text, base ? { ...base, path: next } : undefined);
|
|
310
|
-
const held = slots.get(old);
|
|
311
|
-
slots.delete(old);
|
|
312
|
-
if (held) buffers.release(old, held);
|
|
313
|
-
drafts.set(old, null);
|
|
314
|
-
// The old path's viewer flushes its draft as it unmounts (after this): `setDraft` drops it.
|
|
315
|
-
retired.current.add(old);
|
|
316
|
-
stale.current.delete(old);
|
|
317
|
-
}
|
|
318
|
-
const map = new Map(renames.map((r) => [r.old, r.next]));
|
|
319
|
-
setOpen((current) => current.map((f) => (map.has(f.path) ? { path: map.get(f.path)!, file: null } : f)));
|
|
320
|
-
setActivePath((current) => (current && map.has(current) ? map.get(current)! : current));
|
|
321
|
-
for (const { next } of renames) void reload(next);
|
|
322
|
-
},
|
|
323
|
-
[drafts, buffers, slots, reload],
|
|
324
|
-
);
|
|
325
|
-
|
|
326
|
-
const replace = useCallback(
|
|
327
|
-
// eslint-disable-next-line react-hooks/preserve-manual-memoization -- the deps are the hook's stable inputs (setters, refs' owners)
|
|
328
|
-
(from: string, to: string) => {
|
|
329
|
-
if (from === to) return;
|
|
330
|
-
if (drafts.has(from)) {
|
|
331
|
-
show(to);
|
|
332
|
-
return;
|
|
333
|
-
}
|
|
334
|
-
// `from`'s editor slot goes back, as on close.
|
|
335
|
-
const held = slots.get(from);
|
|
336
|
-
slots.delete(from);
|
|
337
|
-
if (held) buffers.release(from, held);
|
|
338
|
-
stale.current.delete(from);
|
|
339
|
-
setOpen((current) => {
|
|
340
|
-
if (current.some((f) => f.path === to)) return current.filter((f) => f.path !== from);
|
|
341
|
-
const at = current.findIndex((f) => f.path === from);
|
|
342
|
-
if (at === -1) return [...current, { path: to, file: null }];
|
|
343
|
-
return current.map((f, i) => (i === at ? { path: to, file: null } : f));
|
|
344
|
-
});
|
|
345
|
-
setActivePath(to);
|
|
346
|
-
void reload(to);
|
|
347
|
-
},
|
|
348
|
-
[drafts, show, slots, buffers, reload],
|
|
349
|
-
);
|
|
350
|
-
|
|
351
|
-
const removed = useCallback(
|
|
352
|
-
// eslint-disable-next-line react-hooks/preserve-manual-memoization -- the deps are the hook's stable inputs (setters, refs' owners)
|
|
353
|
-
(path: string) => {
|
|
354
|
-
for (const f of openRef.current) {
|
|
355
|
-
if (!isUnder(f.path, path)) continue;
|
|
356
|
-
if (drafts.has(f.path)) {
|
|
357
|
-
// Unsaved text is never dropped silently: the tab stays, its file shown gone.
|
|
358
|
-
setOpen((current) => current.map((o) => (o.path === f.path ? { path: o.path, file: 'missing' } : o)));
|
|
359
|
-
} else close(f.path);
|
|
360
|
-
}
|
|
361
|
-
},
|
|
362
|
-
[drafts, close],
|
|
363
|
-
);
|
|
364
|
-
|
|
365
|
-
const active = useMemo(() => open.find((f) => f.path === activePath) ?? null, [open, activePath]);
|
|
366
|
-
return useMemo(
|
|
367
|
-
() => ({
|
|
368
|
-
open,
|
|
369
|
-
drafts,
|
|
370
|
-
setDraft,
|
|
371
|
-
editKey,
|
|
372
|
-
adoptFile,
|
|
373
|
-
savedAt,
|
|
374
|
-
activePath,
|
|
375
|
-
active,
|
|
376
|
-
setActivePath,
|
|
377
|
-
show,
|
|
378
|
-
replace,
|
|
379
|
-
close,
|
|
380
|
-
reloadAll,
|
|
381
|
-
moved,
|
|
382
|
-
removed,
|
|
383
|
-
}),
|
|
384
|
-
[
|
|
385
|
-
open,
|
|
386
|
-
drafts,
|
|
387
|
-
setDraft,
|
|
388
|
-
editKey,
|
|
389
|
-
adoptFile,
|
|
390
|
-
savedAt,
|
|
391
|
-
activePath,
|
|
392
|
-
active,
|
|
393
|
-
setActivePath,
|
|
394
|
-
show,
|
|
395
|
-
replace,
|
|
396
|
-
close,
|
|
397
|
-
reloadAll,
|
|
398
|
-
moved,
|
|
399
|
-
removed,
|
|
400
|
-
],
|
|
401
|
-
);
|
|
402
|
-
}
|