zidane-ui 9.1.1 → 9.1.4
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 +11 -10
- 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/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/demos/index.js +1 -1
- package/dist/onboarding/index.js +5 -5
- package/dist/onboarding/steps/ConnectStep.js +1 -1
- package/dist/onboarding/steps/ConnectorsStep.js +1 -1
- package/dist/onboarding/steps/ExtensionsStep.js +1 -1
- package/dist/onboarding/steps/ReadyStep.js +2 -2
- package/dist/onboarding/steps/SkillsStep.js +1 -1
- package/dist/onboarding/steps/connect/ProviderPanel.js +1 -1
- package/dist/session/headless/index.js +1 -1
- 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 +2 -2
- package/dist/settings/sections/models/model-test.js +1 -1
- package/dist/settings/sections/skills/SkillsSection.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,979 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* An `ExtensionsHost` on a running zidane-server, over the same client as the chat host
|
|
3
|
-
* (`createServerClient`, or `createServerHost(...).client`), spoken through zidane's typed extensions client
|
|
4
|
-
* (`createExtensionsClient` from `zidane/ipc/browser`): what the extensions of one folder
|
|
5
|
-
* contribute to the UI, and the way back to them.
|
|
6
|
-
*
|
|
7
|
-
* - items and `ui` bundles: `extensions.ui.list`, kept current by `extensions:ui` (listed again on
|
|
8
|
-
* `reset`, a reconnect and a folder change)
|
|
9
|
-
* - callbacks: `extensions.ui.invoke` (panel load and actions, references, badge menus, settings
|
|
10
|
-
* actions)
|
|
11
|
-
* - dialogs and toasts routed to this window into a `createDialogQueue`, answered with
|
|
12
|
-
* `ui.dialog.answer`, withdrawn on `ui:dialog:close`. A form's fields are checked with
|
|
13
|
-
* `ui.dialog.validate` (`dialogs.validate`), and a form is answered only once every field passes
|
|
14
|
-
* - `ctx.ui` panels, navigation, composer edits, notifications and `ctx.keymap.dispatch` chords into a
|
|
15
|
-
* `createUiEffectChannel`, answered with `ui.client.reply`
|
|
16
|
-
* - links: `openLink` offers a link to the folder's link handlers (`extensions.links.open`)
|
|
17
|
-
* - the token's scope (`scope`, from the handshake): action settings above it show disabled
|
|
18
|
-
* - RPC: `rpc.call` (aborts send `rpc.cancel`); the server checks each method's `scope` against
|
|
19
|
-
* this window's token (`rpc.forbidden` below it)
|
|
20
|
-
* - stores: `extensions.storage.load` / `.set`, kept current by `extensions:storage`; a write shows at
|
|
21
|
-
* once and settles to what the server holds (a refused one is put back)
|
|
22
|
-
* - settings (`extensions.settings`, the catalog provenance), integrations, commands (with their
|
|
23
|
-
* key scope, `editable` flag and mode, and the keymap mode on top)
|
|
24
|
-
* - webviews (with `assets`): a `file` source's URL minted by the server, minted again after a
|
|
25
|
-
* reconnect, a rebuild or a folder change
|
|
26
|
-
*
|
|
27
|
-
* The host announces the window on every connect (`ui.client.announce`): the server routes
|
|
28
|
-
* dialogs only to windows that did. Call `announce` again when the shown session changes or the
|
|
29
|
-
* user acts in the window. Sign-in steps of an OAuth or command integration go to `onFlowStep`;
|
|
30
|
-
* by default a link opens in a new tab and a question shows as one of this host's dialogs.
|
|
31
|
-
*
|
|
32
|
-
* A reconnect may be a restarted server, whose bundle URLs and webview tickets are gone: the host
|
|
33
|
-
* lists everything again and tells `onReset` listeners, as after a rebuild.
|
|
34
|
-
*
|
|
35
|
-
* `invoke` takes each callback's folder; the items, settings, commands and integrations are the
|
|
36
|
-
* folder given by `cwd` / `setFolder`.
|
|
37
|
-
*/
|
|
38
|
-
import {
|
|
39
|
-
createExtensionsClient,
|
|
40
|
-
IpcErrorCode,
|
|
41
|
-
ServerCallError,
|
|
42
|
-
ServerConnectionError,
|
|
43
|
-
type ExtensionsClient,
|
|
44
|
-
type HostSignal,
|
|
45
|
-
type IpcResult,
|
|
46
|
-
type ServerClient,
|
|
47
|
-
} from 'zidane/ipc/browser';
|
|
48
|
-
|
|
49
|
-
import { writable, type Readable, type Writable } from '../chat/headless/store';
|
|
50
|
-
import { createDialogQueue } from '../extensions/headless/dialog-queue';
|
|
51
|
-
import { createUiEffectChannel } from '../extensions/headless/effect-channel';
|
|
52
|
-
import {
|
|
53
|
-
ExtensionsHostError,
|
|
54
|
-
type ExtensionCallbackId,
|
|
55
|
-
type ExtensionCallbacks,
|
|
56
|
-
type ExtensionCommands,
|
|
57
|
-
type ExtensionCommandWire,
|
|
58
|
-
type ExtensionComposerFile,
|
|
59
|
-
type ExtensionDialogs,
|
|
60
|
-
type ExtensionIntegrationConnectionWire,
|
|
61
|
-
type ExtensionIntegrations,
|
|
62
|
-
type ExtensionIntegrationWire,
|
|
63
|
-
type ExtensionItemStores,
|
|
64
|
-
type ExtensionPanelChange,
|
|
65
|
-
type ExtensionProvenanceWire,
|
|
66
|
-
type ExtensionSettings,
|
|
67
|
-
type ExtensionSettingsWire,
|
|
68
|
-
type ExtensionStorage,
|
|
69
|
-
type ExtensionStoreRef,
|
|
70
|
-
type ExtensionsHost,
|
|
71
|
-
type ExtensionUiEffect,
|
|
72
|
-
type ExtensionWebviews,
|
|
73
|
-
type ExtensionAccessScope,
|
|
74
|
-
} from '../extensions/headless/host';
|
|
75
|
-
import {
|
|
76
|
-
EXTENSION_TOKENS,
|
|
77
|
-
type DialogRequestWire,
|
|
78
|
-
type ExtensionItem,
|
|
79
|
-
type ExtensionTokenName,
|
|
80
|
-
} from '../extensions/headless/wire';
|
|
81
|
-
import {
|
|
82
|
-
createServerWebviewSources,
|
|
83
|
-
type ServerExtensionBundleLookup,
|
|
84
|
-
type ServerWebviewSources,
|
|
85
|
-
} from './extension-modules';
|
|
86
|
-
|
|
87
|
-
type SignalOf<K extends HostSignal['kind']> = Extract<HostSignal, { kind: K }>;
|
|
88
|
-
type UiSnapshotWire = IpcResult<'extensions.ui.list'>;
|
|
89
|
-
type FlowStep = SignalOf<'extensions:integration-flow'>['step'];
|
|
90
|
-
type UiClientRequestWire = SignalOf<'ui:client'>['request'];
|
|
91
|
-
type IntegrationWire = IpcResult<'extensions.integrations.list'>[number];
|
|
92
|
-
type ConnectionWire = NonNullable<IntegrationWire['connection']>;
|
|
93
|
-
type CommandWire = IpcResult<'extensions.commands'>['commands'][number];
|
|
94
|
-
|
|
95
|
-
/** What the window says about itself (`ui.client.announce`). */
|
|
96
|
-
export interface ExtensionsClientAnnounce {
|
|
97
|
-
/** Sessions it shows now. */
|
|
98
|
-
viewing?: string[];
|
|
99
|
-
/** The user just acted in it: it becomes the last active window. */
|
|
100
|
-
active?: boolean;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/** Answers one sign-in step of an integration flow: the value for a step that asks (`undefined` cancels). */
|
|
104
|
-
export type ExtensionFlowStepHandler = (step: FlowStep, reply: (value: string | undefined) => void) => void;
|
|
105
|
-
|
|
106
|
-
/** Where the server serves the extensions' assets (webview pages), and the token they are fetched with. */
|
|
107
|
-
export interface ServerExtensionAssetsAccess {
|
|
108
|
-
/** The server's HTTP origin (`https://zidane.example.com`). */
|
|
109
|
-
origin: string;
|
|
110
|
-
/** The client token. Absent: a server without auth. */
|
|
111
|
-
token?: string;
|
|
112
|
-
/** `fetch`. Default: the global one. */
|
|
113
|
-
fetch?: typeof fetch;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/** Options for {@link createServerExtensionsHost}. */
|
|
117
|
-
export interface ServerExtensionsHostOptions {
|
|
118
|
-
/** The client to speak through, shared with the chat host. */
|
|
119
|
-
client: ServerClient;
|
|
120
|
-
/** The folder whose extensions show. `null`: none until {@link ServerExtensionsHost.setFolder}. */
|
|
121
|
-
cwd?: string | null;
|
|
122
|
-
/** Shows one sign-in step. Default: links open in a new tab; questions show as dialogs of this host. */
|
|
123
|
-
onFlowStep?: ExtensionFlowStepHandler;
|
|
124
|
-
/** Called with errors no caller can receive (a failed listing). Default: a console warning. */
|
|
125
|
-
onError?: (error: unknown) => void;
|
|
126
|
-
/** Where webview pages are minted. Absent: no `webviews` (a `file` source shows nothing). */
|
|
127
|
-
assets?: ServerExtensionAssetsAccess;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/** A command as this host lists it: the kit's wire, plus where its keybinding fires. */
|
|
131
|
-
export interface ServerExtensionCommandWire extends ExtensionCommandWire {
|
|
132
|
-
/** Where focus must be for its keybinding: `global`, `composer`, `transcript`, `sidebar`, `modal`, `panel:<id>`, `screen:<id>`. */
|
|
133
|
-
scope: string;
|
|
134
|
-
/** Its keybinding also fires while a text field has focus. */
|
|
135
|
-
editable: boolean;
|
|
136
|
-
/** Its keybinding fires only while this keymap mode is on top. */
|
|
137
|
-
mode?: string;
|
|
138
|
-
/** Shown in key hints. */
|
|
139
|
-
hint: boolean;
|
|
140
|
-
/** `session`: needs a session; `idle`: also no run in flight. */
|
|
141
|
-
when: 'always' | 'session' | 'idle';
|
|
142
|
-
/** Turned off by its extension. */
|
|
143
|
-
enabled: boolean;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/** The commands, with the keymap mode on top for the session the window shows. */
|
|
147
|
-
export interface ServerExtensionCommands extends ExtensionCommands {
|
|
148
|
-
list: Readable<readonly ServerExtensionCommandWire[]>;
|
|
149
|
-
/** The keymap mode on top (`undefined`: none). */
|
|
150
|
-
mode: Readable<string | undefined>;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/** Dialogs, with the form field check. */
|
|
154
|
-
export interface ServerExtensionDialogs extends ExtensionDialogs {
|
|
155
|
-
/**
|
|
156
|
-
* Checks one field of a form dialog as the user edits it (`ui.dialog.validate`): the message to
|
|
157
|
-
* show under it, or `null` when it is valid (or the dialog is gone).
|
|
158
|
-
*/
|
|
159
|
-
validate(dialogId: string, key: string, value: unknown): Promise<string | null>;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/** The {@link ExtensionsHost} {@link createServerExtensionsHost} returns. */
|
|
163
|
-
export interface ServerExtensionsHost extends ExtensionsHost {
|
|
164
|
-
invoke: NonNullable<ExtensionsHost['invoke']>;
|
|
165
|
-
dialogs: ServerExtensionDialogs;
|
|
166
|
-
effects: NonNullable<ExtensionsHost['effects']>;
|
|
167
|
-
rpc: NonNullable<ExtensionsHost['rpc']>;
|
|
168
|
-
storage: NonNullable<ExtensionsHost['storage']>;
|
|
169
|
-
settings: NonNullable<ExtensionsHost['settings']>;
|
|
170
|
-
integrations: NonNullable<ExtensionsHost['integrations']>;
|
|
171
|
-
commands: ServerExtensionCommands;
|
|
172
|
-
panelChanged: NonNullable<ExtensionsHost['panelChanged']>;
|
|
173
|
-
openLink: NonNullable<ExtensionsHost['openLink']>;
|
|
174
|
-
scope: NonNullable<ExtensionsHost['scope']>;
|
|
175
|
-
/** With `assets`: the webview URLs the server mints. */
|
|
176
|
-
webviews?: ExtensionWebviews & ServerWebviewSources;
|
|
177
|
-
/** Settles once the first listing of the folder's items, settings, commands and integrations is in. */
|
|
178
|
-
ready: Promise<void>;
|
|
179
|
-
/**
|
|
180
|
-
* An extension's `ui` bundle in the folder's current listing (`url` relative to the server's
|
|
181
|
-
* origin), why it did not bundle, or `undefined`: it has none. `fresh`: list again first.
|
|
182
|
-
*/
|
|
183
|
-
bundle: ServerExtensionBundleLookup;
|
|
184
|
-
/** Shows another folder's extensions (`null`: none). */
|
|
185
|
-
setFolder(cwd: string | null): void;
|
|
186
|
-
/** The folder shown now. */
|
|
187
|
-
folder(): string | null;
|
|
188
|
-
/** Tells the server what this window shows (kept and sent again on every reconnect). */
|
|
189
|
-
announce(info: ExtensionsClientAnnounce): Promise<void>;
|
|
190
|
-
/**
|
|
191
|
-
* The folder's extensions were rebuilt, or the connection came back (maybe to a restarted server):
|
|
192
|
-
* their `ui` modules may have changed. Returns the unsubscribe.
|
|
193
|
-
*/
|
|
194
|
-
onReset(listener: () => void): () => void;
|
|
195
|
-
/** Stops listening to the client (the client stays open). Pending dialogs close unanswered. */
|
|
196
|
-
close(): void;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
const CATALOG_KINDS = ['tools', 'agents', 'subagents', 'models', 'providers', 'mcp', 'skills'] as const;
|
|
200
|
-
|
|
201
|
-
/** Any rejection as the host's typed error. */
|
|
202
|
-
function hostError(err: unknown): ExtensionsHostError {
|
|
203
|
-
if (err instanceof ExtensionsHostError) return err;
|
|
204
|
-
if (err instanceof ServerConnectionError) return new ExtensionsHostError({ code: 'unavailable' });
|
|
205
|
-
if (err instanceof ServerCallError && err.code === IpcErrorCode.Forbidden)
|
|
206
|
-
return new ExtensionsHostError({ code: 'refused', reason: 'not-allowed', message: err.message });
|
|
207
|
-
// zidane's RpcCallError (a method's declared error, or a reserved rpc.* type).
|
|
208
|
-
if (err instanceof Error && err.name === 'RpcCallError' && typeof (err as { type?: unknown }).type === 'string') {
|
|
209
|
-
const { type, data } = err as Error & { type: string; data?: unknown };
|
|
210
|
-
return new ExtensionsHostError({
|
|
211
|
-
code: 'rpc',
|
|
212
|
-
type,
|
|
213
|
-
message: err.message,
|
|
214
|
-
...(data !== undefined ? { data } : {}),
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
return new ExtensionsHostError({ code: 'failed', message: err instanceof Error ? err.message : String(err) });
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
const rethrow = (err: unknown): never => {
|
|
221
|
-
throw hostError(err);
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
/** A refusal for invalid params as `refused` / `invalid`, anything else as {@link hostError}. */
|
|
225
|
-
const rethrowInvalid = (err: unknown): never => {
|
|
226
|
-
if (err instanceof ServerCallError && err.code === -32602)
|
|
227
|
-
throw new ExtensionsHostError({ code: 'refused', reason: 'invalid', message: err.message });
|
|
228
|
-
return rethrow(err);
|
|
229
|
-
};
|
|
230
|
-
|
|
231
|
-
/** The invoke request a callback travels as. */
|
|
232
|
-
function invokeRequest<K extends ExtensionCallbackId>(
|
|
233
|
-
id: K,
|
|
234
|
-
args: ExtensionCallbacks[K]['args'],
|
|
235
|
-
): Record<string, unknown> {
|
|
236
|
-
const a = args as Record<string, unknown>;
|
|
237
|
-
switch (id) {
|
|
238
|
-
case 'panel.load':
|
|
239
|
-
return { op: id, panelId: a.panelId, ...(a.context !== undefined ? { ctx: a.context } : {}) };
|
|
240
|
-
case 'panel.action':
|
|
241
|
-
return {
|
|
242
|
-
op: id,
|
|
243
|
-
panelId: a.panelId,
|
|
244
|
-
actionId: a.actionId,
|
|
245
|
-
...(a.payload !== undefined ? { payload: a.payload } : {}),
|
|
246
|
-
...(a.context !== undefined ? { ctx: a.context } : {}),
|
|
247
|
-
};
|
|
248
|
-
case 'badge.run':
|
|
249
|
-
return {
|
|
250
|
-
op: id,
|
|
251
|
-
source: a.source,
|
|
252
|
-
actionId: a.actionId,
|
|
253
|
-
target: a.target,
|
|
254
|
-
...(a.sessionId ? { sessionId: a.sessionId } : {}),
|
|
255
|
-
};
|
|
256
|
-
default: {
|
|
257
|
-
const { cwd: _cwd, ...rest } = a;
|
|
258
|
-
return { op: id, ...rest };
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/** `ui:client`'s request as the effect the app applies. */
|
|
264
|
-
function effectOf(request: UiClientRequestWire): ExtensionUiEffect {
|
|
265
|
-
switch (request.op) {
|
|
266
|
-
case 'keymap.dispatch':
|
|
267
|
-
return { kind: 'keymap', chord: request.chord, ...(request.sessionId ? { sessionId: request.sessionId } : {}) };
|
|
268
|
-
case 'panel':
|
|
269
|
-
return {
|
|
270
|
-
kind: 'panel',
|
|
271
|
-
action: request.action,
|
|
272
|
-
panelId: request.panelId,
|
|
273
|
-
...(request.sessionId ? { sessionId: request.sessionId } : {}),
|
|
274
|
-
...(request.focus ? { focus: request.focus } : {}),
|
|
275
|
-
};
|
|
276
|
-
case 'panelState':
|
|
277
|
-
return { kind: 'panel-state', ...(request.sessionId ? { sessionId: request.sessionId } : {}) };
|
|
278
|
-
case 'navigate':
|
|
279
|
-
return { kind: 'navigate', to: request.to };
|
|
280
|
-
case 'composer':
|
|
281
|
-
return { kind: 'composer', op: request.edit, ...(request.sessionId ? { sessionId: request.sessionId } : {}) };
|
|
282
|
-
case 'notify': {
|
|
283
|
-
const { op: _op, ...rest } = request;
|
|
284
|
-
return { kind: 'notify', ...rest };
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
const TEXT_TYPES: Readonly<Record<string, string>> = {
|
|
290
|
-
md: 'text/markdown',
|
|
291
|
-
json: 'application/json',
|
|
292
|
-
html: 'text/html',
|
|
293
|
-
css: 'text/css',
|
|
294
|
-
csv: 'text/csv',
|
|
295
|
-
xml: 'application/xml',
|
|
296
|
-
svg: 'image/svg+xml',
|
|
297
|
-
js: 'text/javascript',
|
|
298
|
-
mjs: 'text/javascript',
|
|
299
|
-
ts: 'text/typescript',
|
|
300
|
-
tsx: 'text/typescript',
|
|
301
|
-
yaml: 'application/yaml',
|
|
302
|
-
yml: 'application/yaml',
|
|
303
|
-
};
|
|
304
|
-
|
|
305
|
-
/** UTF-8 text as base64. */
|
|
306
|
-
function base64Text(text: string): string {
|
|
307
|
-
const bytes = new TextEncoder().encode(text);
|
|
308
|
-
let binary = '';
|
|
309
|
-
for (let i = 0; i < bytes.length; i += 0x8000) binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));
|
|
310
|
-
return btoa(binary);
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
/**
|
|
314
|
-
* The files of a `ctx.composer.attach` with each server path read into bytes through the session's
|
|
315
|
-
* workspace (`sessions.workspaceReadFile`): a browser can't read a server path itself. Text only (the
|
|
316
|
-
* read answers text); a path that doesn't read, or reads as binary, stays a path, which the composer
|
|
317
|
-
* does not stage.
|
|
318
|
-
*/
|
|
319
|
-
async function readAttachPaths(
|
|
320
|
-
client: ServerClient,
|
|
321
|
-
files: readonly ExtensionComposerFile[],
|
|
322
|
-
sessionId: string | undefined,
|
|
323
|
-
): Promise<ExtensionComposerFile[]> {
|
|
324
|
-
if (!sessionId || !client.can('sessions.workspaceReadFile')) return [...files];
|
|
325
|
-
return Promise.all(
|
|
326
|
-
files.map(async (file) => {
|
|
327
|
-
if (!('path' in file)) return file;
|
|
328
|
-
try {
|
|
329
|
-
const text = await client.call('sessions.workspaceReadFile', { sessionId, path: file.path });
|
|
330
|
-
if (typeof text !== 'string' || /[\u0000\uFFFD]/.test(text)) return file;
|
|
331
|
-
const name = file.path.split(/[\\/]/).pop() || file.path;
|
|
332
|
-
const ext = name.includes('.') ? name.split('.').pop()!.toLowerCase() : '';
|
|
333
|
-
return { name, mimeType: TEXT_TYPES[ext] ?? 'text/plain', data: base64Text(text) };
|
|
334
|
-
} catch {
|
|
335
|
-
return file;
|
|
336
|
-
}
|
|
337
|
-
}),
|
|
338
|
-
);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
function integrationOf(wire: IntegrationWire): ExtensionIntegrationWire {
|
|
342
|
-
// An older host sends only the default connection.
|
|
343
|
-
const raw = wire.connections ?? (wire.connection ? [wire.connection] : []);
|
|
344
|
-
const defaultAccount = wire.connection?.account ?? raw.find((c) => c.isDefault)?.account ?? raw[0]?.account;
|
|
345
|
-
const connections = raw.map((c) => connectionOf(c, c.account === defaultAccount));
|
|
346
|
-
const connection = connections.find((c) => c.isDefault);
|
|
347
|
-
return {
|
|
348
|
-
id: wire.id,
|
|
349
|
-
name: wire.name,
|
|
350
|
-
...(wire.description ? { description: wire.description } : {}),
|
|
351
|
-
extensionId: wire.extensionId,
|
|
352
|
-
methods: wire.methods.map((m) => {
|
|
353
|
-
const extra = m as { placeholder?: string; help?: string };
|
|
354
|
-
return {
|
|
355
|
-
type: m.type,
|
|
356
|
-
id: m.id,
|
|
357
|
-
label: m.label,
|
|
358
|
-
...(extra.placeholder ? { placeholder: extra.placeholder } : {}),
|
|
359
|
-
...(extra.help ? { help: extra.help } : {}),
|
|
360
|
-
};
|
|
361
|
-
}),
|
|
362
|
-
...(connection ? { connection } : {}),
|
|
363
|
-
...(connections.length > 0 ? { connections } : {}),
|
|
364
|
-
};
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
function connectionOf(wire: ConnectionWire, isDefault: boolean): ExtensionIntegrationConnectionWire {
|
|
368
|
-
return {
|
|
369
|
-
methodId: wire.methodId,
|
|
370
|
-
// An older host may name no account: its one connection is the default one.
|
|
371
|
-
account: wire.account || 'default',
|
|
372
|
-
...(wire.label ? { label: wire.label } : {}),
|
|
373
|
-
...(isDefault ? { isDefault: true } : {}),
|
|
374
|
-
connectedAt: wire.connectedAt,
|
|
375
|
-
};
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
const EMPTY_SETTINGS: ExtensionSettingsWire = {
|
|
379
|
-
schema: { categories: [], items: [] },
|
|
380
|
-
actions: [],
|
|
381
|
-
values: {},
|
|
382
|
-
locked: [],
|
|
383
|
-
};
|
|
384
|
-
|
|
385
|
-
/** A form dialog's request with what the user entered as its values and each field's error as its description. */
|
|
386
|
-
function formWithErrors(
|
|
387
|
-
request: Extract<DialogRequestWire, { kind: 'form' }>,
|
|
388
|
-
extensionId: string,
|
|
389
|
-
entered: Readonly<Record<string, unknown>>,
|
|
390
|
-
errors: Readonly<Record<string, string>>,
|
|
391
|
-
): DialogRequestWire {
|
|
392
|
-
const settings = request.settings;
|
|
393
|
-
return {
|
|
394
|
-
...request,
|
|
395
|
-
settings: {
|
|
396
|
-
...settings,
|
|
397
|
-
schema: {
|
|
398
|
-
...settings.schema,
|
|
399
|
-
items: settings.schema.items.map((item) =>
|
|
400
|
-
errors[item.key] !== undefined ? { ...item, description: errors[item.key] } : item,
|
|
401
|
-
),
|
|
402
|
-
},
|
|
403
|
-
values: { ...settings.values, [extensionId]: { ...settings.values[extensionId], ...entered } as never },
|
|
404
|
-
},
|
|
405
|
-
};
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
/**
|
|
409
|
-
* Creates an {@link ExtensionsHost} over a zidane-server client.
|
|
410
|
-
*
|
|
411
|
-
* @param options - The client, the folder, the sign-in step handler, the error sink and where assets are.
|
|
412
|
-
*/
|
|
413
|
-
export function createServerExtensionsHost(options: ServerExtensionsHostOptions): ServerExtensionsHost {
|
|
414
|
-
const { client, onError = (error) => console.warn('[zidane-ui] extensions host:', error) } = options;
|
|
415
|
-
const ext = createExtensionsClient({ request: client.call, onSignal: (listener) => client.onSignal(listener) });
|
|
416
|
-
let cwd = options.cwd ?? null;
|
|
417
|
-
let announced: ExtensionsClientAnnounce = {};
|
|
418
|
-
const offs: (() => void)[] = [];
|
|
419
|
-
const on = <K extends HostSignal['kind']>(kind: K, fn: (signal: SignalOf<K>) => void): void => {
|
|
420
|
-
offs.push(
|
|
421
|
-
client.onSignal((signal) => {
|
|
422
|
-
if (signal.kind === kind) fn(signal as SignalOf<K>);
|
|
423
|
-
}),
|
|
424
|
-
);
|
|
425
|
-
};
|
|
426
|
-
const panelListeners = new Set<(change: ExtensionPanelChange) => void>();
|
|
427
|
-
const resetListeners = new Set<() => void>();
|
|
428
|
-
const webviews = options.assets
|
|
429
|
-
? createServerWebviewSources({ ...options.assets, cwd: () => cwd, onError })
|
|
430
|
-
: undefined;
|
|
431
|
-
|
|
432
|
-
// Items, per token, and the bundles of the same listing.
|
|
433
|
-
const stores = Object.fromEntries(
|
|
434
|
-
EXTENSION_TOKENS.map((token) => [token, writable<readonly ExtensionItem[]>([])]),
|
|
435
|
-
) as Record<ExtensionTokenName, Writable<readonly ExtensionItem[]>>;
|
|
436
|
-
const items = stores as unknown as ExtensionItemStores;
|
|
437
|
-
let listSeq = 0;
|
|
438
|
-
let listing: Promise<{ cwd: string; bundles: UiSnapshotWire['bundles'] } | null> = Promise.resolve(null);
|
|
439
|
-
const listItems = (): Promise<void> => {
|
|
440
|
-
const mine = ++listSeq;
|
|
441
|
-
const folder = cwd;
|
|
442
|
-
if (!folder) {
|
|
443
|
-
for (const token of EXTENSION_TOKENS) stores[token].set([]);
|
|
444
|
-
listing = Promise.resolve(null);
|
|
445
|
-
return Promise.resolve();
|
|
446
|
-
}
|
|
447
|
-
const snapshot = ext.ui.list(folder);
|
|
448
|
-
listing = snapshot.then(
|
|
449
|
-
(s) => ({ cwd: folder, bundles: s.bundles ?? {} }),
|
|
450
|
-
() => null,
|
|
451
|
-
);
|
|
452
|
-
return snapshot.then((s) => {
|
|
453
|
-
if (mine !== listSeq) return;
|
|
454
|
-
const byToken = s as unknown as Partial<Record<string, readonly ExtensionItem[]>>;
|
|
455
|
-
for (const token of EXTENSION_TOKENS) stores[token].set(byToken[token] ?? []);
|
|
456
|
-
}, onError);
|
|
457
|
-
};
|
|
458
|
-
const upsert = (entry: ExtensionItem): void => {
|
|
459
|
-
const store = stores[entry.token] as Writable<readonly ExtensionItem[]> | undefined;
|
|
460
|
-
if (!store) return;
|
|
461
|
-
store.set((prev) => {
|
|
462
|
-
const index = prev.findIndex((e) => e.key === entry.key);
|
|
463
|
-
return index < 0 ? [...prev, entry] : prev.map((e, i) => (i === index ? entry : e));
|
|
464
|
-
});
|
|
465
|
-
};
|
|
466
|
-
const remove = (key: string, token: string): void => {
|
|
467
|
-
const store = (stores as Partial<Record<string, Writable<readonly ExtensionItem[]>>>)[token];
|
|
468
|
-
store?.set((prev) => (prev.some((e) => e.key === key) ? prev.filter((e) => e.key !== key) : prev));
|
|
469
|
-
};
|
|
470
|
-
const reset = (): void => {
|
|
471
|
-
webviews?.reset();
|
|
472
|
-
void refreshAll();
|
|
473
|
-
for (const listener of [...resetListeners]) listener();
|
|
474
|
-
};
|
|
475
|
-
offs.push(
|
|
476
|
-
ext.ui.onChange((signalCwd, change) => {
|
|
477
|
-
if (change.type === 'reset') {
|
|
478
|
-
reset();
|
|
479
|
-
return;
|
|
480
|
-
}
|
|
481
|
-
// Signals name the folder the server resolved: one that is not ours word for word may still be ours.
|
|
482
|
-
if (signalCwd !== cwd) {
|
|
483
|
-
if (change.type === 'upsert' || change.type === 'remove') void listItems();
|
|
484
|
-
return;
|
|
485
|
-
}
|
|
486
|
-
if (change.type === 'upsert') upsert(change.entry as unknown as ExtensionItem);
|
|
487
|
-
else if (change.type === 'remove') remove(change.key, change.token);
|
|
488
|
-
// A settings page joins the settings wire's pages: read it again.
|
|
489
|
-
const token = change.type === 'upsert' ? change.entry.token : change.type === 'remove' ? change.token : null;
|
|
490
|
-
if (token === 'settings-page') void settings.refresh();
|
|
491
|
-
}),
|
|
492
|
-
// Panel changes come on their own signal (`extensions:panel`), for the folder shown.
|
|
493
|
-
ext.ui.onPanelChanged(({ cwd: signalCwd, ...change }) => {
|
|
494
|
-
if (signalCwd !== cwd) return;
|
|
495
|
-
for (const listener of [...panelListeners]) listener(change);
|
|
496
|
-
}),
|
|
497
|
-
);
|
|
498
|
-
|
|
499
|
-
const bundle: ServerExtensionBundleLookup = async (extensionId, opts = {}) => {
|
|
500
|
-
if (opts.fresh) await listItems();
|
|
501
|
-
const listed = await listing;
|
|
502
|
-
const found = listed?.bundles[extensionId];
|
|
503
|
-
if (found) return { hash: found.hash, url: found.url };
|
|
504
|
-
if (!listed) return undefined;
|
|
505
|
-
// Not bundled: the folder's entries say why, if its ui entry failed to compile.
|
|
506
|
-
const entry = (await ext.entries.list(listed.cwd).catch(() => [])).find((e) => e.id === extensionId);
|
|
507
|
-
return entry?.uiErrors?.length ? { errors: entry.uiErrors } : undefined;
|
|
508
|
-
};
|
|
509
|
-
|
|
510
|
-
const invoke = <K extends ExtensionCallbackId>(id: K, args: ExtensionCallbacks[K]['args']) => {
|
|
511
|
-
const folder = (args as { cwd?: string }).cwd ?? cwd;
|
|
512
|
-
if (!folder) return Promise.reject(new ExtensionsHostError({ code: 'unavailable' }));
|
|
513
|
-
return ext.ui
|
|
514
|
-
.invoke(folder, invokeRequest(id, args) as never)
|
|
515
|
-
.then((result) => (result ?? undefined) as ExtensionCallbacks[K]['result'], rethrow);
|
|
516
|
-
};
|
|
517
|
-
|
|
518
|
-
// Dialogs and ctx.ui calls routed to this window.
|
|
519
|
-
const queue = createDialogQueue();
|
|
520
|
-
const validators = new Map<string, (key: string, value: unknown) => Promise<string | null>>();
|
|
521
|
-
const channel = createUiEffectChannel();
|
|
522
|
-
offs.push(
|
|
523
|
-
ext.serve({
|
|
524
|
-
async dialog(request, ctx) {
|
|
525
|
-
const show = (req: DialogRequestWire) =>
|
|
526
|
-
queue.show(req, {
|
|
527
|
-
id: ctx.dialogId,
|
|
528
|
-
extensionId: ctx.extensionId,
|
|
529
|
-
...(ctx.sessionId ? { sessionId: ctx.sessionId } : {}),
|
|
530
|
-
signal: ctx.signal,
|
|
531
|
-
});
|
|
532
|
-
validators.set(ctx.dialogId, ctx.validate);
|
|
533
|
-
try {
|
|
534
|
-
const original = request as DialogRequestWire;
|
|
535
|
-
let answer = await show(original);
|
|
536
|
-
// A form goes back only once every field passes: the host refuses an invalid answer.
|
|
537
|
-
while (original.kind === 'form' && answer !== null && typeof answer === 'object') {
|
|
538
|
-
const entered = answer as Record<string, unknown>;
|
|
539
|
-
const keys = new Set([...original.settings.schema.items.map((item) => item.key), ...Object.keys(entered)]);
|
|
540
|
-
const checked = await Promise.all(
|
|
541
|
-
[...keys].map(async (key) => [key, await ctx.validate(key, entered[key])] as const),
|
|
542
|
-
);
|
|
543
|
-
const errors = Object.fromEntries(checked.filter(([, error]) => error !== null)) as Record<string, string>;
|
|
544
|
-
if (Object.keys(errors).length === 0) break;
|
|
545
|
-
answer = await show(formWithErrors(original, ctx.extensionId, entered, errors));
|
|
546
|
-
}
|
|
547
|
-
return answer;
|
|
548
|
-
} finally {
|
|
549
|
-
validators.delete(ctx.dialogId);
|
|
550
|
-
}
|
|
551
|
-
},
|
|
552
|
-
async client(request) {
|
|
553
|
-
let effect = effectOf(request);
|
|
554
|
-
if (effect.kind === 'composer' && effect.op.op === 'attach') {
|
|
555
|
-
const files = await readAttachPaths(client, effect.op.files, effect.sessionId ?? announced.viewing?.[0]);
|
|
556
|
-
effect = { ...effect, op: { op: 'attach', files } };
|
|
557
|
-
}
|
|
558
|
-
return channel.apply(effect);
|
|
559
|
-
},
|
|
560
|
-
}),
|
|
561
|
-
);
|
|
562
|
-
const dialogs: ServerExtensionDialogs = {
|
|
563
|
-
...queue.dialogs,
|
|
564
|
-
validate(dialogId, key, value) {
|
|
565
|
-
const validate = validators.get(dialogId);
|
|
566
|
-
return validate ? validate(key, value).catch(() => null) : Promise.resolve(null);
|
|
567
|
-
},
|
|
568
|
-
};
|
|
569
|
-
|
|
570
|
-
const storage = serverStorage(ext, () => cwd, onError);
|
|
571
|
-
offs.push(storage.off);
|
|
572
|
-
const settings = serverSettings(client, () => cwd, onError);
|
|
573
|
-
const integrations = serverIntegrations(
|
|
574
|
-
client,
|
|
575
|
-
() => cwd,
|
|
576
|
-
onError,
|
|
577
|
-
options.onFlowStep ?? defaultFlowStep(queue.show),
|
|
578
|
-
);
|
|
579
|
-
const commands = serverCommands(
|
|
580
|
-
ext,
|
|
581
|
-
() => cwd,
|
|
582
|
-
() => announced.viewing?.[0],
|
|
583
|
-
onError,
|
|
584
|
-
);
|
|
585
|
-
on('extensions:integrations', () => integrations.refresh());
|
|
586
|
-
offs.push(ext.commands.onChange(() => commands.refresh()));
|
|
587
|
-
on('settings:changed', () => settings.refresh());
|
|
588
|
-
|
|
589
|
-
const refreshAll = (): Promise<void> => {
|
|
590
|
-
storage.reload();
|
|
591
|
-
return Promise.all([listItems(), settings.refresh(), integrations.refresh(), commands.refresh()]).then(
|
|
592
|
-
() => undefined,
|
|
593
|
-
);
|
|
594
|
-
};
|
|
595
|
-
const sendAnnounce = (): Promise<void> => ext.announce({ ...announced, dialogs: true, ui: true });
|
|
596
|
-
offs.push(
|
|
597
|
-
client.onOpen((_hello, reconnected) => {
|
|
598
|
-
void sendAnnounce().catch(onError);
|
|
599
|
-
// Maybe a restarted server: its bundle URLs and webview tickets are gone.
|
|
600
|
-
if (reconnected) reset();
|
|
601
|
-
}),
|
|
602
|
-
);
|
|
603
|
-
if (client.hello()) void sendAnnounce().catch(onError);
|
|
604
|
-
const ready = refreshAll();
|
|
605
|
-
|
|
606
|
-
// The token's scope, from the handshake (`null`: not limited, as a server without auth).
|
|
607
|
-
const scope = writable<ExtensionAccessScope | null>(client.hello()?.scope ?? null);
|
|
608
|
-
offs.push(client.onOpen((hello) => scope.set(hello.scope ?? null)));
|
|
609
|
-
|
|
610
|
-
return {
|
|
611
|
-
ready,
|
|
612
|
-
items,
|
|
613
|
-
invoke,
|
|
614
|
-
dialogs,
|
|
615
|
-
effects: channel.effects,
|
|
616
|
-
async rpc(contract, method, input, opts = {}) {
|
|
617
|
-
return ext
|
|
618
|
-
.rpc(contract, method, input, {
|
|
619
|
-
...(cwd ? { cwd } : {}),
|
|
620
|
-
...(opts.signal ? { signal: opts.signal } : {}),
|
|
621
|
-
})
|
|
622
|
-
.catch(rethrow);
|
|
623
|
-
},
|
|
624
|
-
async openLink(link) {
|
|
625
|
-
if (!cwd || !client.can('extensions.links.open')) return false;
|
|
626
|
-
const { handled } = await ext.links.open(cwd, link).catch(rethrow);
|
|
627
|
-
return handled;
|
|
628
|
-
},
|
|
629
|
-
scope,
|
|
630
|
-
storage: storage.storage,
|
|
631
|
-
settings: settings.settings,
|
|
632
|
-
integrations: integrations.integrations,
|
|
633
|
-
commands: commands.commands,
|
|
634
|
-
...(webviews ? { webviews } : {}),
|
|
635
|
-
bundle,
|
|
636
|
-
setFolder(next) {
|
|
637
|
-
if (next === cwd) return;
|
|
638
|
-
cwd = next;
|
|
639
|
-
webviews?.reset();
|
|
640
|
-
void refreshAll();
|
|
641
|
-
},
|
|
642
|
-
folder: () => cwd,
|
|
643
|
-
announce(info) {
|
|
644
|
-
const session = announced.viewing?.[0];
|
|
645
|
-
announced = info;
|
|
646
|
-
// The keymap mode on top is per session.
|
|
647
|
-
if (info.viewing?.[0] !== session) void commands.refresh();
|
|
648
|
-
return sendAnnounce().catch(rethrow);
|
|
649
|
-
},
|
|
650
|
-
panelChanged(listener) {
|
|
651
|
-
panelListeners.add(listener);
|
|
652
|
-
return () => panelListeners.delete(listener);
|
|
653
|
-
},
|
|
654
|
-
onReset(listener) {
|
|
655
|
-
resetListeners.add(listener);
|
|
656
|
-
return () => resetListeners.delete(listener);
|
|
657
|
-
},
|
|
658
|
-
close() {
|
|
659
|
-
for (const off of offs.splice(0)) off();
|
|
660
|
-
queue.clear();
|
|
661
|
-
},
|
|
662
|
-
};
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
interface StoreSlot {
|
|
666
|
-
ref: ExtensionStoreRef;
|
|
667
|
-
value: Writable<unknown>;
|
|
668
|
-
/** The store's schema version, as its record carries it (`v`). */
|
|
669
|
-
schema?: number;
|
|
670
|
-
/** The entry's write count on the server: a signal below it is older than what the slot holds. */
|
|
671
|
-
version: number;
|
|
672
|
-
projectRoot?: string;
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
const storeKey = (ref: ExtensionStoreRef): string =>
|
|
676
|
-
[ref.extensionId, ref.scope, ref.sessionId ?? '', ref.name].join('\u0000');
|
|
677
|
-
|
|
678
|
-
type StoreRecord = { v?: number; value?: unknown } | undefined;
|
|
679
|
-
|
|
680
|
-
/**
|
|
681
|
-
* The typed stores: loaded per ref, written as store records, followed through `extensions:storage`.
|
|
682
|
-
* A write shows at once and settles to what the server answers it holds; a refused one is put back.
|
|
683
|
-
*/
|
|
684
|
-
function serverStorage(ext: ExtensionsClient, folder: () => string | null, onError: (error: unknown) => void) {
|
|
685
|
-
const slots = new Map<string, StoreSlot>();
|
|
686
|
-
const location = (ref: ExtensionStoreRef) => ({
|
|
687
|
-
extensionId: ref.extensionId,
|
|
688
|
-
scope: ref.scope,
|
|
689
|
-
...(ref.sessionId ? { sessionId: ref.sessionId } : {}),
|
|
690
|
-
});
|
|
691
|
-
const hold = (slot: StoreSlot, record: StoreRecord): void => {
|
|
692
|
-
if (typeof record?.v === 'number') slot.schema = record.v;
|
|
693
|
-
slot.value.set(record && typeof record === 'object' && 'value' in record ? record.value : undefined);
|
|
694
|
-
};
|
|
695
|
-
const load = (slot: StoreSlot): void => {
|
|
696
|
-
const cwd = folder();
|
|
697
|
-
if (!cwd) return;
|
|
698
|
-
ext.storage.load(cwd, location(slot.ref)).then((snapshot) => {
|
|
699
|
-
slot.projectRoot = snapshot.projectRoot;
|
|
700
|
-
hold(slot, snapshot.stores[slot.ref.name] as StoreRecord);
|
|
701
|
-
}, onError);
|
|
702
|
-
};
|
|
703
|
-
const off = ext.storage.onChange((signal) => {
|
|
704
|
-
if (signal.area !== 'stores') return;
|
|
705
|
-
const slot = slots.get(
|
|
706
|
-
storeKey({
|
|
707
|
-
extensionId: signal.extensionId,
|
|
708
|
-
scope: signal.scope,
|
|
709
|
-
name: signal.key,
|
|
710
|
-
...(signal.sessionId ? { sessionId: signal.sessionId } : {}),
|
|
711
|
-
}),
|
|
712
|
-
);
|
|
713
|
-
if (!slot) return;
|
|
714
|
-
if (signal.scope !== 'user' && slot.projectRoot !== signal.projectRoot) return;
|
|
715
|
-
if (typeof signal.version === 'number') {
|
|
716
|
-
if (signal.version < slot.version) return;
|
|
717
|
-
slot.version = signal.version;
|
|
718
|
-
}
|
|
719
|
-
hold(slot, signal.value as StoreRecord);
|
|
720
|
-
});
|
|
721
|
-
const slotOf = (ref: ExtensionStoreRef): StoreSlot => {
|
|
722
|
-
const key = storeKey(ref);
|
|
723
|
-
let slot = slots.get(key);
|
|
724
|
-
if (!slot) {
|
|
725
|
-
slot = { ref, value: writable<unknown>(undefined), version: 0 };
|
|
726
|
-
slots.set(key, slot);
|
|
727
|
-
load(slot);
|
|
728
|
-
}
|
|
729
|
-
return slot;
|
|
730
|
-
};
|
|
731
|
-
const storage: ExtensionStorage = {
|
|
732
|
-
store: (ref): Readable<unknown> => slotOf(ref).value,
|
|
733
|
-
async set(ref, value) {
|
|
734
|
-
const cwd = folder();
|
|
735
|
-
if (!cwd) throw new ExtensionsHostError({ code: 'unavailable' });
|
|
736
|
-
const slot = slotOf(ref);
|
|
737
|
-
const before = slot.value.get();
|
|
738
|
-
slot.value.set(value);
|
|
739
|
-
const record = { v: slot.schema ?? 1, value } as never;
|
|
740
|
-
const result = await ext.storage.set(cwd, location(ref), 'stores', ref.name, record).catch((err: unknown) => {
|
|
741
|
-
slot.value.set(before);
|
|
742
|
-
return rethrowInvalid(err);
|
|
743
|
-
});
|
|
744
|
-
if (result.version >= slot.version) {
|
|
745
|
-
slot.version = result.version;
|
|
746
|
-
if (result.accepted) {
|
|
747
|
-
if (typeof (result.value as StoreRecord)?.v === 'number') slot.schema = (result.value as { v: number }).v;
|
|
748
|
-
} else hold(slot, result.value as StoreRecord);
|
|
749
|
-
} else if (!result.accepted) slot.value.set(before);
|
|
750
|
-
if (!result.accepted)
|
|
751
|
-
throw new ExtensionsHostError({ code: 'refused', reason: 'invalid', message: result.reason });
|
|
752
|
-
},
|
|
753
|
-
};
|
|
754
|
-
return { storage, reload: () => slots.forEach(load), off };
|
|
755
|
-
}
|
|
756
|
-
|
|
757
|
-
/** Every extension's settings, with the catalog items extensions changed. */
|
|
758
|
-
function serverSettings(client: ServerClient, folder: () => string | null, onError: (error: unknown) => void) {
|
|
759
|
-
const wire = writable<ExtensionSettingsWire>(EMPTY_SETTINGS);
|
|
760
|
-
let seq = 0;
|
|
761
|
-
let loading: Promise<void> = Promise.resolve();
|
|
762
|
-
const refresh = (): Promise<void> => {
|
|
763
|
-
loading = load();
|
|
764
|
-
return loading;
|
|
765
|
-
};
|
|
766
|
-
const load = (): Promise<void> => {
|
|
767
|
-
const mine = ++seq;
|
|
768
|
-
const cwd = folder();
|
|
769
|
-
if (!cwd) return Promise.resolve(wire.set(EMPTY_SETTINGS));
|
|
770
|
-
const provenance = Promise.all(
|
|
771
|
-
CATALOG_KINDS.map((kind) =>
|
|
772
|
-
client.call('extensions.catalogs.provenance', { cwd, kind }).then(
|
|
773
|
-
(items) => items.map((item) => ({ ...item, kind })),
|
|
774
|
-
() => [],
|
|
775
|
-
),
|
|
776
|
-
),
|
|
777
|
-
).then((lists) => lists.flat() as unknown as ExtensionProvenanceWire[]);
|
|
778
|
-
// The wire names each extension (`extensions`: display name and icon): the server fills it.
|
|
779
|
-
return Promise.all([client.call('extensions.settings', { cwd }), provenance]).then(([settings, changed]) => {
|
|
780
|
-
if (mine !== seq) return;
|
|
781
|
-
const { sources: _sources, ...rest } = settings;
|
|
782
|
-
wire.set({ ...(rest as unknown as ExtensionSettingsWire), provenance: changed });
|
|
783
|
-
}, onError);
|
|
784
|
-
};
|
|
785
|
-
const settings: ExtensionSettings = {
|
|
786
|
-
wire,
|
|
787
|
-
async set(extensionId, key, value) {
|
|
788
|
-
const cwd = folder();
|
|
789
|
-
if (!cwd) throw new ExtensionsHostError({ code: 'unavailable' });
|
|
790
|
-
await loading;
|
|
791
|
-
if (wire.get().locked.includes(`${extensionId}:${key}`))
|
|
792
|
-
throw new ExtensionsHostError({ code: 'refused', reason: 'locked' });
|
|
793
|
-
await client
|
|
794
|
-
.call('extensions.settings.set', { cwd, extension: extensionId, key, value, scope: 'user' })
|
|
795
|
-
.catch((err: unknown) => {
|
|
796
|
-
if (err instanceof ServerCallError && err.code === -32602)
|
|
797
|
-
throw new ExtensionsHostError({ code: 'refused', reason: 'invalid', message: err.message });
|
|
798
|
-
return rethrow(err);
|
|
799
|
-
});
|
|
800
|
-
wire.set((prev) => ({
|
|
801
|
-
...prev,
|
|
802
|
-
values: { ...prev.values, [extensionId]: { ...prev.values[extensionId], [key]: value as never } },
|
|
803
|
-
}));
|
|
804
|
-
void refresh();
|
|
805
|
-
},
|
|
806
|
-
};
|
|
807
|
-
return { settings, refresh };
|
|
808
|
-
}
|
|
809
|
-
|
|
810
|
-
/** Steps shown the default way: a link in a new tab, a question as a dialog of this host. */
|
|
811
|
-
function defaultFlowStep(show: ReturnType<typeof createDialogQueue>['show']): ExtensionFlowStepHandler {
|
|
812
|
-
const ask = (
|
|
813
|
-
request: DialogRequestWire,
|
|
814
|
-
reply: (value: string | undefined) => void,
|
|
815
|
-
pick?: (answer: unknown) => string | undefined,
|
|
816
|
-
) =>
|
|
817
|
-
void show(request, { extensionId: 'zidane' }).then(
|
|
818
|
-
(answer) => reply(pick ? pick(answer) : typeof answer === 'string' ? answer : undefined),
|
|
819
|
-
() => reply(undefined),
|
|
820
|
-
);
|
|
821
|
-
return (step, reply) => {
|
|
822
|
-
switch (step.type) {
|
|
823
|
-
case 'auth':
|
|
824
|
-
globalThis.open?.(step.url, '_blank', 'noopener');
|
|
825
|
-
return;
|
|
826
|
-
case 'device':
|
|
827
|
-
void show(
|
|
828
|
-
{ kind: 'toast', text: `${step.userCode} · ${step.verificationUri}`, tone: 'info' },
|
|
829
|
-
{ extensionId: 'zidane' },
|
|
830
|
-
);
|
|
831
|
-
return;
|
|
832
|
-
case 'prompt':
|
|
833
|
-
return ask(
|
|
834
|
-
{ kind: 'prompt', title: step.message, ...(step.placeholder ? { placeholder: step.placeholder } : {}) },
|
|
835
|
-
reply,
|
|
836
|
-
);
|
|
837
|
-
case 'manual-code':
|
|
838
|
-
return ask({ kind: 'prompt', title: 'Paste the address the browser ended on' }, reply);
|
|
839
|
-
case 'select':
|
|
840
|
-
return ask(
|
|
841
|
-
{ kind: 'select', title: step.message, options: step.options },
|
|
842
|
-
reply,
|
|
843
|
-
(answer) => (answer as { ids?: string[] } | undefined)?.ids?.[0],
|
|
844
|
-
);
|
|
845
|
-
default:
|
|
846
|
-
return;
|
|
847
|
-
}
|
|
848
|
-
};
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
/** Integrations: Connect (a key, or a sign-in flow whose steps `onStep` shows) and Disconnect. */
|
|
852
|
-
function serverIntegrations(
|
|
853
|
-
client: ServerClient,
|
|
854
|
-
folder: () => string | null,
|
|
855
|
-
onError: (error: unknown) => void,
|
|
856
|
-
onStep: ExtensionFlowStepHandler,
|
|
857
|
-
) {
|
|
858
|
-
const list = writable<readonly ExtensionIntegrationWire[]>([]);
|
|
859
|
-
let seq = 0;
|
|
860
|
-
const refresh = (): Promise<void> => {
|
|
861
|
-
const mine = ++seq;
|
|
862
|
-
const cwd = folder();
|
|
863
|
-
if (!cwd) return Promise.resolve(list.set([]));
|
|
864
|
-
return client.call('extensions.integrations.list', { cwd }).then((wires) => {
|
|
865
|
-
if (mine === seq) list.set(wires.map(integrationOf));
|
|
866
|
-
}, onError);
|
|
867
|
-
};
|
|
868
|
-
const need = (): string => {
|
|
869
|
-
const cwd = folder();
|
|
870
|
-
if (!cwd) throw new ExtensionsHostError({ code: 'unavailable' });
|
|
871
|
-
return cwd;
|
|
872
|
-
};
|
|
873
|
-
const integrations: ExtensionIntegrations = {
|
|
874
|
-
list,
|
|
875
|
-
async connect(integrationId, { methodId, key }) {
|
|
876
|
-
const cwd = need();
|
|
877
|
-
const method = list
|
|
878
|
-
.get()
|
|
879
|
-
.find((i) => i.id === integrationId)
|
|
880
|
-
?.methods.find((m) => m.id === methodId);
|
|
881
|
-
if (key !== undefined || method?.type === 'apiKey') {
|
|
882
|
-
await client
|
|
883
|
-
.call('extensions.integrations.connectKey', { cwd, integrationId, key: key ?? '', methodId })
|
|
884
|
-
.catch((err: unknown) => {
|
|
885
|
-
if (err instanceof ServerCallError && err.code !== IpcErrorCode.Forbidden)
|
|
886
|
-
throw new ExtensionsHostError({ code: 'refused', reason: 'invalid', message: err.message });
|
|
887
|
-
return rethrow(err);
|
|
888
|
-
});
|
|
889
|
-
} else {
|
|
890
|
-
const flowId = `flow-ui-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
891
|
-
const off = client.onSignal((signal) => {
|
|
892
|
-
if (signal.kind !== 'extensions:integration-flow' || signal.flowId !== flowId) return;
|
|
893
|
-
const step = signal.step;
|
|
894
|
-
onStep(step, (value) => {
|
|
895
|
-
if ('inputId' in step)
|
|
896
|
-
void client
|
|
897
|
-
.call('extensions.integrations.flowInput', {
|
|
898
|
-
flowId,
|
|
899
|
-
inputId: step.inputId,
|
|
900
|
-
...(value !== undefined ? { value } : {}),
|
|
901
|
-
})
|
|
902
|
-
.catch(onError);
|
|
903
|
-
});
|
|
904
|
-
});
|
|
905
|
-
try {
|
|
906
|
-
await client.call('extensions.integrations.start', { cwd, integrationId, methodId, flowId }).catch(rethrow);
|
|
907
|
-
} finally {
|
|
908
|
-
off();
|
|
909
|
-
}
|
|
910
|
-
}
|
|
911
|
-
await refresh();
|
|
912
|
-
},
|
|
913
|
-
async disconnect(integrationId, opts) {
|
|
914
|
-
await client
|
|
915
|
-
.call('extensions.integrations.disconnect', {
|
|
916
|
-
cwd: need(),
|
|
917
|
-
integrationId,
|
|
918
|
-
...(opts?.account !== undefined ? { account: opts.account } : {}),
|
|
919
|
-
})
|
|
920
|
-
.catch(rethrow);
|
|
921
|
-
await refresh();
|
|
922
|
-
},
|
|
923
|
-
async setDefault(integrationId, account) {
|
|
924
|
-
await client.call('extensions.integrations.setDefault', { cwd: need(), integrationId, account }).catch(rethrow);
|
|
925
|
-
await refresh();
|
|
926
|
-
},
|
|
927
|
-
};
|
|
928
|
-
return { integrations, refresh };
|
|
929
|
-
}
|
|
930
|
-
|
|
931
|
-
/** The unified commands of the folder, and the keymap mode on top for the session on screen. */
|
|
932
|
-
function serverCommands(
|
|
933
|
-
ext: ExtensionsClient,
|
|
934
|
-
folder: () => string | null,
|
|
935
|
-
session: () => string | undefined,
|
|
936
|
-
onError: (error: unknown) => void,
|
|
937
|
-
) {
|
|
938
|
-
const list = writable<readonly ServerExtensionCommandWire[]>([]);
|
|
939
|
-
const mode = writable<string | undefined>(undefined);
|
|
940
|
-
let seq = 0;
|
|
941
|
-
const commandOf = (c: CommandWire): ServerExtensionCommandWire => ({
|
|
942
|
-
id: c.id,
|
|
943
|
-
title: c.title,
|
|
944
|
-
...(c.description ? { description: c.description } : {}),
|
|
945
|
-
...(c.slash ? { slash: c.slash.name } : {}),
|
|
946
|
-
...(c.bind.length > 0 ? { bind: c.bind } : {}),
|
|
947
|
-
...(c.extensionId ? { extensionId: c.extensionId } : {}),
|
|
948
|
-
scope: c.scope ?? 'global',
|
|
949
|
-
editable: c.editable === true,
|
|
950
|
-
...(c.mode ? { mode: c.mode } : {}),
|
|
951
|
-
hint: c.hint === true,
|
|
952
|
-
when: c.when ?? 'always',
|
|
953
|
-
enabled: c.enabled !== false,
|
|
954
|
-
});
|
|
955
|
-
const refresh = (): Promise<void> => {
|
|
956
|
-
const mine = ++seq;
|
|
957
|
-
const cwd = folder();
|
|
958
|
-
if (!cwd) {
|
|
959
|
-
list.set([]);
|
|
960
|
-
mode.set(undefined);
|
|
961
|
-
return Promise.resolve();
|
|
962
|
-
}
|
|
963
|
-
return ext.commands.list(cwd, session()).then((result) => {
|
|
964
|
-
if (mine !== seq) return;
|
|
965
|
-
list.set(result.commands.map(commandOf));
|
|
966
|
-
if (mode.get() !== result.mode) mode.set(result.mode);
|
|
967
|
-
}, onError);
|
|
968
|
-
};
|
|
969
|
-
const commands: ServerExtensionCommands = {
|
|
970
|
-
list,
|
|
971
|
-
mode,
|
|
972
|
-
async run(id, opts = {}) {
|
|
973
|
-
const cwd = folder();
|
|
974
|
-
if (!cwd) throw new ExtensionsHostError({ code: 'unavailable' });
|
|
975
|
-
return ext.commands.run(cwd, id, opts).catch(rethrow);
|
|
976
|
-
},
|
|
977
|
-
};
|
|
978
|
-
return { commands, refresh };
|
|
979
|
-
}
|