@workbench-kit/shell-react 0.0.2-prototype.0.2.6 → 0.0.2-prototype.0.2.8
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 +41 -0
- package/package.json +9 -9
- package/src/{chat-ai-mock-proposals.ts → chat/ai-mock-proposals.ts} +39 -39
- package/src/{chat-command-input.ts → chat/command-input.ts} +52 -52
- package/src/{chat-command-policy.ts → chat/command-policy.ts} +54 -54
- package/src/{chat-command-surface.tsx → chat/command-surface.tsx} +155 -155
- package/src/{use-workbench-chat-command-proposals.ts → chat/use-chat-command-proposals.ts} +194 -194
- package/src/{chat-view-data.ts → chat/view-data.ts} +20 -20
- package/src/{chat-view.tsx → chat/view.tsx} +220 -220
- package/src/{command-inspector-surface.tsx → commands/inspector-surface.tsx} +46 -46
- package/src/{use-workbench-command-descriptors.ts → commands/use-command-descriptors.ts} +41 -41
- package/src/{use-context-key-revision.ts → commands/use-context-key-revision.ts} +18 -18
- package/src/{commands-view-data.ts → commands/view-data.ts} +17 -17
- package/src/{commands-view.tsx → commands/view.tsx} +43 -43
- package/src/devtools/WorkbenchDevtoolsPanel.tsx +124 -124
- package/src/devtools/WorkbenchDevtoolsShell.tsx +17 -17
- package/src/devtools/index.ts +11 -11
- package/src/devtools/use-workbench-devtools-snapshot.ts +84 -84
- package/src/devtools/workbench-devtools-snapshot.ts +140 -140
- package/src/devtools/workbench-devtools.css +82 -82
- package/src/{editor-area-dnd.ts → editor/area-dnd.ts} +69 -69
- package/src/{editor-area-model.ts → editor/area-model.ts} +71 -71
- package/src/{editor-area.css → editor/area.css} +454 -454
- package/src/{editor-area.tsx → editor/area.tsx} +676 -676
- package/src/{editor-host-surface.tsx → editor/host-surface.tsx} +631 -634
- package/src/{editor-pane-visibility.ts → editor/pane-visibility.ts} +130 -130
- package/src/{editor-resource.ts → editor/resource.ts} +36 -36
- package/src/{editor-state-storage.ts → editor/state-storage.ts} +182 -193
- package/src/{editor-tab-context-menu.ts → editor/tab-context-menu.ts} +118 -118
- package/src/{use-editor.ts → editor/use-editor.ts} +114 -107
- package/src/{editor-view-providers.tsx → editor/view-providers.tsx} +552 -552
- package/src/{editor-workspace-file-availability.ts → editor/workspace-file-availability.ts} +15 -15
- package/src/{editor-workspace-reconcile.tsx → editor/workspace-reconcile.tsx} +31 -28
- package/src/{explorer-context-menu.ts → explorer/context-menu.ts} +114 -114
- package/src/{createCommandWorkspaceExplorerPort.ts → explorer/create-command-workspace-explorer-port.ts} +86 -86
- package/src/{explorer-reveal.ts → explorer/reveal.ts} +112 -112
- package/src/{search-view-data.ts → explorer/search-view-data.ts} +15 -15
- package/src/{search-view.tsx → explorer/search-view.tsx} +65 -62
- package/src/{use-active-workspace-path.ts → explorer/use-active-workspace-path.ts} +15 -15
- package/src/{explorer-view-data.ts → explorer/view-data.ts} +58 -58
- package/src/{explorer-view.tsx → explorer/view.tsx} +227 -224
- package/src/{extension-context-menu.ts → extensions/context-menu.ts} +52 -52
- package/src/{extension-management-model.ts → extensions/management-model.ts} +313 -313
- package/src/{use-extension-management.ts → extensions/use-extension-management.ts} +241 -193
- package/src/{extensions-view-data.ts → extensions/view-data.ts} +19 -19
- package/src/{extensions-view.tsx → extensions/view.tsx} +63 -38
- package/src/{field-remap-demo.tsx → field-remap/demo.tsx} +18 -18
- package/src/{field-remap-editor-surface.tsx → field-remap/editor-surface.tsx} +36 -36
- package/src/{field-remap-flow-adapter.ts → field-remap/flow-adapter.ts} +240 -240
- package/src/{field-remap-flow.tsx → field-remap/flow.tsx} +369 -369
- package/src/{field-remap-graph.tsx → field-remap/graph.tsx} +559 -559
- package/src/field-remap/jsonata-transform.ts +166 -0
- package/src/{field-remap-panel.tsx → field-remap/panel.tsx} +193 -175
- package/src/{field-remap-samples.ts → field-remap/samples.ts} +352 -352
- package/src/{table-mapping-adapter.ts → field-remap/table-mapping-adapter.ts} +59 -59
- package/src/{field-remap-tree.tsx → field-remap/tree.tsx} +404 -404
- package/src/{field-remap-view-data.ts → field-remap/view-data.ts} +16 -16
- package/src/{field-remap-view.css → field-remap/view.css} +676 -676
- package/src/{field-remap-view.tsx → field-remap/view.tsx} +86 -86
- package/src/index.ts +212 -199
- package/src/{json-form-source-patch.ts → jdw/json-form-source-patch.ts} +323 -323
- package/src/{jdw-lab-view-data.ts → jdw/lab-view-data.ts} +25 -25
- package/src/{jdw-lab-view.css → jdw/lab-view.css} +21 -21
- package/src/{jdw-lab-view.tsx → jdw/lab-view.tsx} +79 -79
- package/src/{jdw-widget-form-view.tsx → jdw/widget-form-view.tsx} +68 -65
- package/src/{jdw-widget-preview-view.tsx → jdw/widget-preview-view.tsx} +54 -51
- package/src/{keybinding-overrides-storage.ts → management/keybinding-overrides-storage.ts} +49 -57
- package/src/{keybinding-management-settings.tsx → management/keybinding-settings.tsx} +16 -16
- package/src/{management-palette-commands.ts → management/palette-commands.ts} +38 -38
- package/src/{preference-settings-storage.ts → management/preference-settings-storage.ts} +50 -58
- package/src/{management-settings-ids.ts → management/settings-ids.ts} +12 -12
- package/src/{management-settings.tsx → management/settings.tsx} +96 -75
- package/src/{use-command-management.ts → management/use-command-management.ts} +191 -191
- package/src/{use-keybinding-management.ts → management/use-keybinding-management.ts} +130 -130
- package/src/{shell-model.tsx → shell/model.tsx} +149 -149
- package/src/{provider.tsx → shell/provider.tsx} +603 -573
- package/src/{shell-secondary-actions.tsx → shell/secondary-actions.tsx} +59 -59
- package/src/{shell-settings-constants.ts → shell/settings-constants.ts} +9 -9
- package/src/{shell-settings.tsx → shell/settings.tsx} +599 -599
- package/src/{shell.tsx → shell/shell.tsx} +680 -649
- package/src/{shell-titlebar-layout-controls.tsx → shell/titlebar-layout-controls.tsx} +4 -4
- package/src/{shell-view-host.tsx → shell/view-host.tsx} +212 -199
- package/src/{workbench-appearance-storage.ts → workbench/appearance-storage.ts} +107 -115
- package/src/{workbench-command-host.tsx → workbench/command-host.tsx} +243 -243
- package/src/{workbench-command-palette.ts → workbench/command-palette.ts} +208 -208
- package/src/{workbench-keybinding-bridge.ts → workbench/keybinding-bridge.ts} +54 -54
- package/src/{workbench-layout-storage.ts → workbench/layout-storage.ts} +134 -145
- package/src/{workbench-profile-modal.tsx → workbench/profile-modal.tsx} +118 -118
- package/src/{workbench-shell-command-registration.ts → workbench/shell-command-registration.ts} +58 -58
- package/src/{workbench-startup-gate.tsx → workbench/startup-gate.tsx} +136 -136
- package/src/{workbench-status-sections.ts → workbench/status-sections.ts} +43 -43
- package/src/{use-persisted-workbench-appearance.ts → workbench/use-persisted-appearance.ts} +33 -33
- package/src/{workbench-user-commands.ts → workbench/user-commands.ts} +46 -46
- package/src/{workspace-view-state.ts → workbench/workspace-view-state.ts} +35 -35
- package/src/jsonata-transform.ts +0 -36
|
@@ -1,208 +1,208 @@
|
|
|
1
|
-
import type { CommandDefinition } from '@workbench-kit/platform';
|
|
2
|
-
import type { WorkbenchCommandDescriptor } from '@workbench-kit/react/workbench';
|
|
3
|
-
import type {
|
|
4
|
-
WorkbenchShellCommandActivity,
|
|
5
|
-
WorkbenchShellCommandContext,
|
|
6
|
-
} from '@workbench-kit/react/workbench';
|
|
7
|
-
import type { ExtensionCommandFeatureSpec, ExtensionRegistry } from '@workbench-kit/workbench-core';
|
|
8
|
-
|
|
9
|
-
export const WORKBENCH_COMMAND_PALETTE_SHORTCUT = 'Ctrl+Shift+P';
|
|
10
|
-
export const WORKBENCH_QUICK_ACCESS_SHORTCUT = 'Ctrl+P';
|
|
11
|
-
|
|
12
|
-
type ExtensionCommand = ReturnType<ExtensionRegistry['commands']['getCommands']>[number];
|
|
13
|
-
|
|
14
|
-
function resolveCommandValue<TContext, TValue>(
|
|
15
|
-
value: CommandDefinition<TContext>[keyof CommandDefinition<TContext>],
|
|
16
|
-
context: TContext,
|
|
17
|
-
): TValue | undefined {
|
|
18
|
-
if (value === undefined) {
|
|
19
|
-
return undefined;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
if (typeof value === 'function') {
|
|
23
|
-
return (value as (ctx: TContext) => TValue)(context);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return value as TValue;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function formatWorkbenchCommandIcon(icon: string | undefined): string | undefined {
|
|
30
|
-
if (!icon) {
|
|
31
|
-
return undefined;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return icon.startsWith('codicon-') ? icon : `codicon-${icon}`;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function resolveExtensionCommandIcon(icon: ExtensionCommand['icon']): string | undefined {
|
|
38
|
-
if (typeof icon === 'function') {
|
|
39
|
-
return formatWorkbenchCommandIcon(icon(undefined as void));
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return formatWorkbenchCommandIcon(icon);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export function resolveShellCommandActivities(
|
|
46
|
-
extensionRegistry: ExtensionRegistry,
|
|
47
|
-
): WorkbenchShellCommandActivity[] {
|
|
48
|
-
const activities = extensionRegistry.activities.getActivities();
|
|
49
|
-
if (activities.length > 0) {
|
|
50
|
-
return activities
|
|
51
|
-
.map((activity) => ({
|
|
52
|
-
icon: formatWorkbenchCommandIcon(activity.icon),
|
|
53
|
-
id: activity.viewContainerId,
|
|
54
|
-
label: `Show ${activity.title}`,
|
|
55
|
-
}))
|
|
56
|
-
.sort((left, right) => left.label.localeCompare(right.label));
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const viewContainerIds = new Set(
|
|
60
|
-
extensionRegistry.views.getViews().map((view) => view.containerId),
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
return [...viewContainerIds].map((containerId) => {
|
|
64
|
-
const container = extensionRegistry.views.getViewContainer(containerId);
|
|
65
|
-
const firstView = extensionRegistry.views.getViews(containerId)[0];
|
|
66
|
-
|
|
67
|
-
return {
|
|
68
|
-
icon: formatWorkbenchCommandIcon(container?.icon ?? 'files'),
|
|
69
|
-
id: containerId,
|
|
70
|
-
label: `Show ${container?.title ?? firstView?.name ?? containerId}`,
|
|
71
|
-
};
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export function shellCommandDefinitionToDescriptor<TContext>(
|
|
76
|
-
command: CommandDefinition<TContext>,
|
|
77
|
-
context: TContext,
|
|
78
|
-
): WorkbenchCommandDescriptor {
|
|
79
|
-
const label =
|
|
80
|
-
resolveCommandValue<TContext, string>(command.label, context) ?? command.title ?? command.id;
|
|
81
|
-
const disabled = command.isEnabled ? !command.isEnabled(context) : false;
|
|
82
|
-
|
|
83
|
-
return {
|
|
84
|
-
category: command.category ?? 'View',
|
|
85
|
-
icon: formatWorkbenchCommandIcon(resolveCommandValue(command.icon, context)),
|
|
86
|
-
id: command.id,
|
|
87
|
-
label,
|
|
88
|
-
shortcut: resolveCommandValue(command.shortcut, context),
|
|
89
|
-
disabled,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export function extensionCommandToDescriptor(
|
|
94
|
-
command: ExtensionCommand,
|
|
95
|
-
feature?: ExtensionCommandFeatureSpec | undefined,
|
|
96
|
-
): WorkbenchCommandDescriptor {
|
|
97
|
-
const metadata = {
|
|
98
|
-
argsSchema: feature?.argsSchema,
|
|
99
|
-
chat: feature?.chat,
|
|
100
|
-
requiresApproval: feature?.requiresApproval,
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
return {
|
|
104
|
-
category: command.category ?? feature?.category,
|
|
105
|
-
danger: feature?.danger,
|
|
106
|
-
description: feature?.description,
|
|
107
|
-
icon: resolveExtensionCommandIcon(command.icon),
|
|
108
|
-
id: command.id,
|
|
109
|
-
keywords: feature
|
|
110
|
-
? [feature.command, feature.title].filter((value) => value !== command.id)
|
|
111
|
-
: undefined,
|
|
112
|
-
label: command.title ?? feature?.title ?? command.id,
|
|
113
|
-
metadata:
|
|
114
|
-
metadata.argsSchema || metadata.chat || metadata.requiresApproval !== undefined
|
|
115
|
-
? metadata
|
|
116
|
-
: undefined,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
export function collectExtensionCommandFeaturesById(
|
|
121
|
-
extensionRegistry: ExtensionRegistry,
|
|
122
|
-
): ReadonlyMap<string, ExtensionCommandFeatureSpec> {
|
|
123
|
-
return new Map(
|
|
124
|
-
extensionRegistry
|
|
125
|
-
.getFeatureSpecs()
|
|
126
|
-
.flatMap((feature) => feature.commands.map((command) => [command.id, command] as const)),
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export function mergeWorkbenchCommandDescriptors(
|
|
131
|
-
...groups: readonly WorkbenchCommandDescriptor[][]
|
|
132
|
-
): WorkbenchCommandDescriptor[] {
|
|
133
|
-
const seen = new Set<string>();
|
|
134
|
-
|
|
135
|
-
return groups.flat().filter((command) => {
|
|
136
|
-
if (seen.has(command.id)) {
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
seen.add(command.id);
|
|
141
|
-
return true;
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
export function buildWorkbenchPaletteCommands({
|
|
146
|
-
additionalCommands = [],
|
|
147
|
-
extensionCommandFeaturesById,
|
|
148
|
-
extensionCommands,
|
|
149
|
-
shellCommands,
|
|
150
|
-
shellContext,
|
|
151
|
-
}: {
|
|
152
|
-
additionalCommands?: readonly WorkbenchCommandDescriptor[];
|
|
153
|
-
extensionCommandFeaturesById?: ReadonlyMap<string, ExtensionCommandFeatureSpec> | undefined;
|
|
154
|
-
extensionCommands: readonly ExtensionCommand[];
|
|
155
|
-
shellCommands: readonly CommandDefinition<WorkbenchShellCommandContext>[];
|
|
156
|
-
shellContext: WorkbenchShellCommandContext;
|
|
157
|
-
}): WorkbenchCommandDescriptor[] {
|
|
158
|
-
const shellDescriptors = shellCommands.map((command) =>
|
|
159
|
-
shellCommandDefinitionToDescriptor(command, shellContext),
|
|
160
|
-
);
|
|
161
|
-
const contributedDescriptors = extensionCommands.map((command) =>
|
|
162
|
-
extensionCommandToDescriptor(command, extensionCommandFeaturesById?.get(command.id)),
|
|
163
|
-
);
|
|
164
|
-
|
|
165
|
-
return mergeWorkbenchCommandDescriptors(shellDescriptors, contributedDescriptors, [
|
|
166
|
-
...additionalCommands,
|
|
167
|
-
]);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
export function matchesWorkbenchCommandPaletteShortcut(
|
|
171
|
-
event: Pick<KeyboardEvent, 'altKey' | 'ctrlKey' | 'key' | 'metaKey' | 'shiftKey'>,
|
|
172
|
-
) {
|
|
173
|
-
const key = event.key.toLowerCase();
|
|
174
|
-
|
|
175
|
-
if (key !== 'p') {
|
|
176
|
-
return false;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
if (!(event.ctrlKey || event.metaKey) || !event.shiftKey || event.altKey) {
|
|
180
|
-
return false;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
return true;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
export function matchesWorkbenchQuickAccessShortcut(
|
|
187
|
-
event: Pick<KeyboardEvent, 'altKey' | 'ctrlKey' | 'key' | 'metaKey' | 'shiftKey'>,
|
|
188
|
-
) {
|
|
189
|
-
const key = event.key.toLowerCase();
|
|
190
|
-
|
|
191
|
-
if (key !== 'p') {
|
|
192
|
-
return false;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
if (!(event.ctrlKey || event.metaKey) || event.shiftKey || event.altKey) {
|
|
196
|
-
return false;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
return true;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
export function getWorkbenchCommandPaletteShortcutLabel() {
|
|
203
|
-
return WORKBENCH_COMMAND_PALETTE_SHORTCUT;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
export function getWorkbenchQuickAccessShortcutLabel() {
|
|
207
|
-
return WORKBENCH_QUICK_ACCESS_SHORTCUT;
|
|
208
|
-
}
|
|
1
|
+
import type { CommandDefinition } from '@workbench-kit/platform';
|
|
2
|
+
import type { WorkbenchCommandDescriptor } from '@workbench-kit/react/workbench';
|
|
3
|
+
import type {
|
|
4
|
+
WorkbenchShellCommandActivity,
|
|
5
|
+
WorkbenchShellCommandContext,
|
|
6
|
+
} from '@workbench-kit/react/workbench';
|
|
7
|
+
import type { ExtensionCommandFeatureSpec, ExtensionRegistry } from '@workbench-kit/workbench-core';
|
|
8
|
+
|
|
9
|
+
export const WORKBENCH_COMMAND_PALETTE_SHORTCUT = 'Ctrl+Shift+P';
|
|
10
|
+
export const WORKBENCH_QUICK_ACCESS_SHORTCUT = 'Ctrl+P';
|
|
11
|
+
|
|
12
|
+
type ExtensionCommand = ReturnType<ExtensionRegistry['commands']['getCommands']>[number];
|
|
13
|
+
|
|
14
|
+
function resolveCommandValue<TContext, TValue>(
|
|
15
|
+
value: CommandDefinition<TContext>[keyof CommandDefinition<TContext>],
|
|
16
|
+
context: TContext,
|
|
17
|
+
): TValue | undefined {
|
|
18
|
+
if (value === undefined) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (typeof value === 'function') {
|
|
23
|
+
return (value as (ctx: TContext) => TValue)(context);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return value as TValue;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function formatWorkbenchCommandIcon(icon: string | undefined): string | undefined {
|
|
30
|
+
if (!icon) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return icon.startsWith('codicon-') ? icon : `codicon-${icon}`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function resolveExtensionCommandIcon(icon: ExtensionCommand['icon']): string | undefined {
|
|
38
|
+
if (typeof icon === 'function') {
|
|
39
|
+
return formatWorkbenchCommandIcon(icon(undefined as void));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return formatWorkbenchCommandIcon(icon);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function resolveShellCommandActivities(
|
|
46
|
+
extensionRegistry: ExtensionRegistry,
|
|
47
|
+
): WorkbenchShellCommandActivity[] {
|
|
48
|
+
const activities = extensionRegistry.activities.getActivities();
|
|
49
|
+
if (activities.length > 0) {
|
|
50
|
+
return activities
|
|
51
|
+
.map((activity) => ({
|
|
52
|
+
icon: formatWorkbenchCommandIcon(activity.icon),
|
|
53
|
+
id: activity.viewContainerId,
|
|
54
|
+
label: `Show ${activity.title}`,
|
|
55
|
+
}))
|
|
56
|
+
.sort((left, right) => left.label.localeCompare(right.label));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const viewContainerIds = new Set(
|
|
60
|
+
extensionRegistry.views.getViews().map((view) => view.containerId),
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
return [...viewContainerIds].map((containerId) => {
|
|
64
|
+
const container = extensionRegistry.views.getViewContainer(containerId);
|
|
65
|
+
const firstView = extensionRegistry.views.getViews(containerId)[0];
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
icon: formatWorkbenchCommandIcon(container?.icon ?? 'files'),
|
|
69
|
+
id: containerId,
|
|
70
|
+
label: `Show ${container?.title ?? firstView?.name ?? containerId}`,
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function shellCommandDefinitionToDescriptor<TContext>(
|
|
76
|
+
command: CommandDefinition<TContext>,
|
|
77
|
+
context: TContext,
|
|
78
|
+
): WorkbenchCommandDescriptor {
|
|
79
|
+
const label =
|
|
80
|
+
resolveCommandValue<TContext, string>(command.label, context) ?? command.title ?? command.id;
|
|
81
|
+
const disabled = command.isEnabled ? !command.isEnabled(context) : false;
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
category: command.category ?? 'View',
|
|
85
|
+
icon: formatWorkbenchCommandIcon(resolveCommandValue(command.icon, context)),
|
|
86
|
+
id: command.id,
|
|
87
|
+
label,
|
|
88
|
+
shortcut: resolveCommandValue(command.shortcut, context),
|
|
89
|
+
disabled,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function extensionCommandToDescriptor(
|
|
94
|
+
command: ExtensionCommand,
|
|
95
|
+
feature?: ExtensionCommandFeatureSpec | undefined,
|
|
96
|
+
): WorkbenchCommandDescriptor {
|
|
97
|
+
const metadata = {
|
|
98
|
+
argsSchema: feature?.argsSchema,
|
|
99
|
+
chat: feature?.chat,
|
|
100
|
+
requiresApproval: feature?.requiresApproval,
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
category: command.category ?? feature?.category,
|
|
105
|
+
danger: feature?.danger,
|
|
106
|
+
description: feature?.description,
|
|
107
|
+
icon: resolveExtensionCommandIcon(command.icon),
|
|
108
|
+
id: command.id,
|
|
109
|
+
keywords: feature
|
|
110
|
+
? [feature.command, feature.title].filter((value) => value !== command.id)
|
|
111
|
+
: undefined,
|
|
112
|
+
label: command.title ?? feature?.title ?? command.id,
|
|
113
|
+
metadata:
|
|
114
|
+
metadata.argsSchema || metadata.chat || metadata.requiresApproval !== undefined
|
|
115
|
+
? metadata
|
|
116
|
+
: undefined,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function collectExtensionCommandFeaturesById(
|
|
121
|
+
extensionRegistry: ExtensionRegistry,
|
|
122
|
+
): ReadonlyMap<string, ExtensionCommandFeatureSpec> {
|
|
123
|
+
return new Map(
|
|
124
|
+
extensionRegistry
|
|
125
|
+
.getFeatureSpecs()
|
|
126
|
+
.flatMap((feature) => feature.commands.map((command) => [command.id, command] as const)),
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function mergeWorkbenchCommandDescriptors(
|
|
131
|
+
...groups: readonly WorkbenchCommandDescriptor[][]
|
|
132
|
+
): WorkbenchCommandDescriptor[] {
|
|
133
|
+
const seen = new Set<string>();
|
|
134
|
+
|
|
135
|
+
return groups.flat().filter((command) => {
|
|
136
|
+
if (seen.has(command.id)) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
seen.add(command.id);
|
|
141
|
+
return true;
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function buildWorkbenchPaletteCommands({
|
|
146
|
+
additionalCommands = [],
|
|
147
|
+
extensionCommandFeaturesById,
|
|
148
|
+
extensionCommands,
|
|
149
|
+
shellCommands,
|
|
150
|
+
shellContext,
|
|
151
|
+
}: {
|
|
152
|
+
additionalCommands?: readonly WorkbenchCommandDescriptor[];
|
|
153
|
+
extensionCommandFeaturesById?: ReadonlyMap<string, ExtensionCommandFeatureSpec> | undefined;
|
|
154
|
+
extensionCommands: readonly ExtensionCommand[];
|
|
155
|
+
shellCommands: readonly CommandDefinition<WorkbenchShellCommandContext>[];
|
|
156
|
+
shellContext: WorkbenchShellCommandContext;
|
|
157
|
+
}): WorkbenchCommandDescriptor[] {
|
|
158
|
+
const shellDescriptors = shellCommands.map((command) =>
|
|
159
|
+
shellCommandDefinitionToDescriptor(command, shellContext),
|
|
160
|
+
);
|
|
161
|
+
const contributedDescriptors = extensionCommands.map((command) =>
|
|
162
|
+
extensionCommandToDescriptor(command, extensionCommandFeaturesById?.get(command.id)),
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
return mergeWorkbenchCommandDescriptors(shellDescriptors, contributedDescriptors, [
|
|
166
|
+
...additionalCommands,
|
|
167
|
+
]);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function matchesWorkbenchCommandPaletteShortcut(
|
|
171
|
+
event: Pick<KeyboardEvent, 'altKey' | 'ctrlKey' | 'key' | 'metaKey' | 'shiftKey'>,
|
|
172
|
+
) {
|
|
173
|
+
const key = event.key.toLowerCase();
|
|
174
|
+
|
|
175
|
+
if (key !== 'p') {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (!(event.ctrlKey || event.metaKey) || !event.shiftKey || event.altKey) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export function matchesWorkbenchQuickAccessShortcut(
|
|
187
|
+
event: Pick<KeyboardEvent, 'altKey' | 'ctrlKey' | 'key' | 'metaKey' | 'shiftKey'>,
|
|
188
|
+
) {
|
|
189
|
+
const key = event.key.toLowerCase();
|
|
190
|
+
|
|
191
|
+
if (key !== 'p') {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (!(event.ctrlKey || event.metaKey) || event.shiftKey || event.altKey) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export function getWorkbenchCommandPaletteShortcutLabel() {
|
|
203
|
+
return WORKBENCH_COMMAND_PALETTE_SHORTCUT;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export function getWorkbenchQuickAccessShortcutLabel() {
|
|
207
|
+
return WORKBENCH_QUICK_ACCESS_SHORTCUT;
|
|
208
|
+
}
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
import type { ContextKeyValue, KeybindingRegistry } from '@workbench-kit/platform';
|
|
2
|
-
import { resolveKeybindingWithOverrides, type KeybindingDefinition } from '@workbench-kit/platform';
|
|
3
|
-
|
|
4
|
-
function normalizeKeyToken(token: string): string {
|
|
5
|
-
const key = token.trim().toLowerCase();
|
|
6
|
-
if (key === 'del') return 'delete';
|
|
7
|
-
if (key === 'esc') return 'escape';
|
|
8
|
-
if (key === 'return') return 'enter';
|
|
9
|
-
if (key === 'spacebar' || key === 'space') return 'space';
|
|
10
|
-
return key.length === 1 ? key : key;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function normalizeKeybindingKeyFromEvent(
|
|
14
|
-
event: Pick<KeyboardEvent, 'altKey' | 'ctrlKey' | 'key' | 'metaKey' | 'shiftKey'>,
|
|
15
|
-
): string {
|
|
16
|
-
const parts: string[] = [];
|
|
17
|
-
|
|
18
|
-
if (event.ctrlKey || event.metaKey) {
|
|
19
|
-
parts.push('ctrl');
|
|
20
|
-
}
|
|
21
|
-
if (event.altKey) {
|
|
22
|
-
parts.push('alt');
|
|
23
|
-
}
|
|
24
|
-
if (event.shiftKey) {
|
|
25
|
-
parts.push('shift');
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
parts.push(normalizeKeyToken(event.key));
|
|
29
|
-
return parts.join('+');
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function resolveExtensionKeybindingCommand(
|
|
33
|
-
registry: KeybindingRegistry,
|
|
34
|
-
event: Pick<KeyboardEvent, 'altKey' | 'ctrlKey' | 'key' | 'metaKey' | 'shiftKey'>,
|
|
35
|
-
contextKeys: Readonly<Record<string, ContextKeyValue>> = {},
|
|
36
|
-
overrides: readonly KeybindingDefinition[] = [],
|
|
37
|
-
) {
|
|
38
|
-
const key = normalizeKeybindingKeyFromEvent(event);
|
|
39
|
-
|
|
40
|
-
if (overrides.length > 0) {
|
|
41
|
-
const match = resolveKeybindingWithOverrides(
|
|
42
|
-
registry.getKeybindings(),
|
|
43
|
-
overrides,
|
|
44
|
-
key,
|
|
45
|
-
contextKeys,
|
|
46
|
-
);
|
|
47
|
-
if (match) {
|
|
48
|
-
return match;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const matches = registry.resolveKeybindings(key, contextKeys);
|
|
53
|
-
return matches[0];
|
|
54
|
-
}
|
|
1
|
+
import type { ContextKeyValue, KeybindingRegistry } from '@workbench-kit/platform';
|
|
2
|
+
import { resolveKeybindingWithOverrides, type KeybindingDefinition } from '@workbench-kit/platform';
|
|
3
|
+
|
|
4
|
+
function normalizeKeyToken(token: string): string {
|
|
5
|
+
const key = token.trim().toLowerCase();
|
|
6
|
+
if (key === 'del') return 'delete';
|
|
7
|
+
if (key === 'esc') return 'escape';
|
|
8
|
+
if (key === 'return') return 'enter';
|
|
9
|
+
if (key === 'spacebar' || key === 'space') return 'space';
|
|
10
|
+
return key.length === 1 ? key : key;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function normalizeKeybindingKeyFromEvent(
|
|
14
|
+
event: Pick<KeyboardEvent, 'altKey' | 'ctrlKey' | 'key' | 'metaKey' | 'shiftKey'>,
|
|
15
|
+
): string {
|
|
16
|
+
const parts: string[] = [];
|
|
17
|
+
|
|
18
|
+
if (event.ctrlKey || event.metaKey) {
|
|
19
|
+
parts.push('ctrl');
|
|
20
|
+
}
|
|
21
|
+
if (event.altKey) {
|
|
22
|
+
parts.push('alt');
|
|
23
|
+
}
|
|
24
|
+
if (event.shiftKey) {
|
|
25
|
+
parts.push('shift');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
parts.push(normalizeKeyToken(event.key));
|
|
29
|
+
return parts.join('+');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function resolveExtensionKeybindingCommand(
|
|
33
|
+
registry: KeybindingRegistry,
|
|
34
|
+
event: Pick<KeyboardEvent, 'altKey' | 'ctrlKey' | 'key' | 'metaKey' | 'shiftKey'>,
|
|
35
|
+
contextKeys: Readonly<Record<string, ContextKeyValue>> = {},
|
|
36
|
+
overrides: readonly KeybindingDefinition[] = [],
|
|
37
|
+
) {
|
|
38
|
+
const key = normalizeKeybindingKeyFromEvent(event);
|
|
39
|
+
|
|
40
|
+
if (overrides.length > 0) {
|
|
41
|
+
const match = resolveKeybindingWithOverrides(
|
|
42
|
+
registry.getKeybindings(),
|
|
43
|
+
overrides,
|
|
44
|
+
key,
|
|
45
|
+
contextKeys,
|
|
46
|
+
);
|
|
47
|
+
if (match) {
|
|
48
|
+
return match;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const matches = registry.resolveKeybindings(key, contextKeys);
|
|
53
|
+
return matches[0];
|
|
54
|
+
}
|