@pstdio/workbench 0.1.0

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.
@@ -0,0 +1,1934 @@
1
+ import { CommandExecuteRequest } from '@pstdio/sdk/api';
2
+ import { ComponentType } from 'react';
3
+ import { ExtensionCommandPaletteContribution } from '@pstdio/sdk/api';
4
+ import { ExtensionMenuContribution } from '@pstdio/sdk/api';
5
+ import { HostCapability } from 'pstdio-extensions/bridge/contract';
6
+ import { HostCapabilityRegistry } from 'pstdio-extensions/bridge/contract';
7
+ import { HostEventPublisher } from 'pstdio-extensions/bridge/host';
8
+ import { JSX } from 'react/jsx-runtime';
9
+ import { Localizable } from '@pstdio/sdk/extensions';
10
+ import { ReactNode } from 'react';
11
+ import { ThemePreference as ThemePreference_2 } from 'pstdio-extensions/bridge/contract';
12
+ import { WorkbenchExtensionCommandPaletteResourceRecord } from '@pstdio/sdk/api';
13
+ import { WorkbenchExtensionControlsRendererRecord } from '@pstdio/sdk/api';
14
+ import { WorkbenchExtensionDataRendererRecord } from '@pstdio/sdk/api';
15
+ import { WorkbenchExtensionMetadata } from '@pstdio/sdk/api';
16
+
17
+ declare interface AttributeDescriptor {
18
+ id: string;
19
+ label: string;
20
+ type: AttributeType;
21
+ filterable?: boolean;
22
+ groupable?: boolean;
23
+ sortable?: boolean;
24
+ displayable?: boolean;
25
+ editable?: boolean;
26
+ display?: AttributeDisplayDescriptor;
27
+ render?: (value: unknown, row: DataRendererRow) => ReactNode;
28
+ compare?: (a: unknown, b: unknown) => number;
29
+ }
30
+
31
+ declare type AttributeDisplayDescriptor = {
32
+ kind: "workspace-badge";
33
+ itemsAttributeId: string;
34
+ };
35
+
36
+ /**
37
+ * Reactive source for an entire attribute schema. Lets a contribution
38
+ * add/remove/edit attributes at runtime without re-registering.
39
+ */
40
+ declare interface AttributesSource {
41
+ subscribe: (listener: () => void) => () => void;
42
+ getSnapshot: () => AttributeDescriptor[];
43
+ }
44
+
45
+ declare type AttributeType = {
46
+ kind: "enum";
47
+ options: EnumOptions;
48
+ } | {
49
+ kind: "enum-multi";
50
+ options: EnumOptions;
51
+ } | {
52
+ kind: "string";
53
+ } | {
54
+ kind: "date";
55
+ } | {
56
+ kind: "number";
57
+ } | {
58
+ kind: "user";
59
+ };
60
+
61
+ declare interface BoardColumnAction {
62
+ id: string;
63
+ label: string;
64
+ icon: ComponentType<{
65
+ size?: number | string;
66
+ }>;
67
+ }
68
+
69
+ /** Board-column behavior and menu configuration for a resolved column group. */
70
+ declare interface BoardColumnConfig {
71
+ /** Color palette token used for the column header and group badges. */
72
+ color?: string;
73
+ canDragIn?: boolean;
74
+ canDragOut?: boolean;
75
+ canCreate?: boolean;
76
+ actions?: BoardColumnAction[];
77
+ }
78
+
79
+ export declare const BRIDGE_WEBVIEW_RENDERER_ID = "webview:bridge";
80
+
81
+ export declare interface BridgeWebviewConfig {
82
+ title?: string;
83
+ runtimeUrl: string;
84
+ moduleUrl: string;
85
+ styles?: string[];
86
+ capabilities?: string[];
87
+ }
88
+
89
+ export declare interface BridgeWebviewRenderContext {
90
+ workbench: WorkbenchCore;
91
+ webviewId: string;
92
+ placement: WorkbenchWidgetPlacement;
93
+ /** Channel for pushing host events (e.g. terminal output) into this webview. */
94
+ hostEvents: HostEventPublisher;
95
+ }
96
+
97
+ export declare const buildWorkbenchExtensionCommandPaletteRegistrations: (input: {
98
+ metadata: WorkbenchExtensionMetadata;
99
+ createCommandId?: (contribution: ExtensionCommandPaletteContribution) => string;
100
+ resolveString?: WorkbenchExtensionStringResolver;
101
+ }) => WorkbenchExtensionCommandPaletteRegistration[];
102
+
103
+ export declare const buildWorkbenchExtensionMenuRegistrations: (input: {
104
+ metadata: WorkbenchExtensionMetadata;
105
+ menuSlotsById: ReadonlyMap<string, WorkbenchExtensionMenuSlotConfig>;
106
+ menuTargetsById?: ReadonlyMap<string, WorkbenchExtensionMenuSlotConfig>;
107
+ createCommandId?: (contribution: ExtensionMenuContribution) => string;
108
+ createWhenExpression?: WorkbenchExtensionMenuWhenBuilder;
109
+ resolveString?: WorkbenchExtensionStringResolver;
110
+ }) => WorkbenchExtensionMenuRegistration[];
111
+
112
+ export declare const buildWorkbenchExtensionRouteEntries: (input: {
113
+ metadata: WorkbenchExtensionMetadata | undefined;
114
+ createResource: (resourceInput: WorkbenchExtensionRouteResourceInput) => ResourceRef;
115
+ }) => {
116
+ resource: ResourceRef;
117
+ }[];
118
+
119
+ /**
120
+ * A data-driven list of items, each opening a contributor-supplied editor. The
121
+ * framework knows nothing about what an item is — it only calls these hooks.
122
+ */
123
+ declare interface CollectionSettingsPanel<TItem = unknown> extends SettingsPanelBase {
124
+ kind: "collection";
125
+ items(): TItem[] | Promise<TItem[]>;
126
+ itemId(item: TItem): string;
127
+ itemLabel(item: TItem): string;
128
+ itemIcon?(item: TItem): string | undefined;
129
+ groupBy?: SettingsCollectionGroupBy<TItem>;
130
+ renderItem(item: TItem, input: WorkbenchWidgetRenderInput): unknown;
131
+ actions?: SettingsAction[];
132
+ }
133
+
134
+ declare interface Command {
135
+ id: string;
136
+ label: string;
137
+ category?: string;
138
+ description?: string;
139
+ icon?: string;
140
+ when?: string;
141
+ params?: CommandParamSchema;
142
+ }
143
+
144
+ declare interface CommandHandler<TArgs = unknown, TResult = unknown> {
145
+ execute(args: TArgs, context?: WorkbenchCommandExecutionContext): TResult | Promise<TResult>;
146
+ isEnabled?(args: TArgs): boolean;
147
+ isVisible?(args: TArgs): boolean;
148
+ isToggled?(args: TArgs): boolean;
149
+ }
150
+
151
+ declare interface CommandPaletteResourceProvider {
152
+ id: string;
153
+ title: string;
154
+ refreshEventIds?: string[];
155
+ query(context: CommandPaletteResourceQueryContext): Promise<readonly CommandPaletteResourceResult[]>;
156
+ }
157
+
158
+ declare interface CommandPaletteResourceProviderResult {
159
+ providerId: string;
160
+ title: string;
161
+ results: readonly CommandPaletteResourceResult[];
162
+ }
163
+
164
+ declare interface CommandPaletteResourceQueryContext {
165
+ query: string;
166
+ limit: number;
167
+ }
168
+
169
+ declare interface CommandPaletteResourceRegistry {
170
+ store: WorkbenchStore<CommandPaletteResourceRegistryStoreState>;
171
+ registerProvider(provider: CommandPaletteResourceProvider): Disposable_2;
172
+ listProviders(): CommandPaletteResourceProvider[];
173
+ queryProviders(context: CommandPaletteResourceQueryContext): Promise<CommandPaletteResourceProviderResult[]>;
174
+ refresh(): void;
175
+ }
176
+
177
+ declare interface CommandPaletteResourceRegistryStoreState {
178
+ providers: Record<string, CommandPaletteResourceProvider>;
179
+ refreshToken: number;
180
+ }
181
+
182
+ declare interface CommandPaletteResourceResult {
183
+ id: string;
184
+ label: string;
185
+ description?: string;
186
+ icon?: string;
187
+ keywords?: string[];
188
+ group?: string;
189
+ activate(): void | Promise<void>;
190
+ }
191
+
192
+ declare interface CommandParamDescriptor {
193
+ type: string;
194
+ label?: string;
195
+ description?: string;
196
+ required?: boolean;
197
+ defaultValue?: unknown;
198
+ options?: CommandParamOption[];
199
+ templateType?: string;
200
+ resourceType?: string;
201
+ metadata?: Record<string, unknown>;
202
+ }
203
+
204
+ declare interface CommandParamOption {
205
+ label: string;
206
+ value: string;
207
+ }
208
+
209
+ declare type CommandParamSchema = Record<string, CommandParamDescriptor>;
210
+
211
+ declare interface CommandRegistry {
212
+ store: WorkbenchStore<CommandRegistryStoreState>;
213
+ registerCommand<TArgs = unknown, TResult = unknown>(command: Command, handler: CommandHandler<TArgs, TResult>, metadata?: ContributionMetadata): Disposable_2;
214
+ getCommand(id: string): RegisteredCommand | undefined;
215
+ listCommands(): RegisteredCommand[];
216
+ isCommandEnabled(id: string, args?: unknown): boolean;
217
+ isCommandVisible(id: string, args?: unknown): boolean;
218
+ isCommandToggled(id: string, args?: unknown): boolean;
219
+ executeCommand(id: string, args?: unknown, context?: WorkbenchCommandExecutionContext): Promise<unknown>;
220
+ onDidExecuteError(listener: WorkbenchCommandExecutionErrorListener): Disposable_2;
221
+ }
222
+
223
+ declare interface CommandRegistryStoreState {
224
+ commands: Record<string, RegisteredCommand>;
225
+ }
226
+
227
+ declare interface ContextKeyScope extends Disposable_2 {
228
+ ownerId: string;
229
+ set(key: string, value: ContextKeyValue): void;
230
+ get(key: string): ContextKeyValue;
231
+ delete(key: string): void;
232
+ }
233
+
234
+ declare interface ContextKeyService {
235
+ store: WorkbenchStore<ContextKeyStoreState>;
236
+ set(key: string, value: ContextKeyValue): void;
237
+ get(key: string): ContextKeyValue;
238
+ delete(key: string): void;
239
+ createScope(ownerId: string): ContextKeyScope;
240
+ deleteOwner(ownerId: string): void;
241
+ snapshot(): Record<string, ContextKeyValue>;
242
+ matches(expression?: string): boolean;
243
+ }
244
+
245
+ declare interface ContextKeyStoreState {
246
+ values: Record<string, ContextKeyValue>;
247
+ }
248
+
249
+ declare type ContextKeyValue = boolean | number | string | undefined;
250
+
251
+ declare interface ContributionMetadata {
252
+ source?: ContributionSource;
253
+ ownerId?: string;
254
+ priority?: number;
255
+ }
256
+
257
+ declare type ContributionSource = "module" | "extension";
258
+
259
+ declare type ContributionSource_2 = "module" | "extension";
260
+
261
+ declare interface ControlsApplyInput {
262
+ values: Record<string, unknown>;
263
+ resource?: ResourceRef;
264
+ }
265
+
266
+ declare interface ControlsQueryResult {
267
+ params?: unknown[];
268
+ groups?: unknown[];
269
+ values?: Record<string, unknown>;
270
+ readOnly?: boolean;
271
+ }
272
+
273
+ declare type ControlsRendererArea = "main-right" | "secondary" | "overlay";
274
+
275
+ declare interface ControlsRendererContribution {
276
+ id: string;
277
+ title: string;
278
+ resourceKind?: string;
279
+ emptyTitle?: string;
280
+ emptyDescription?: string;
281
+ layout?: ControlsRendererLayout;
282
+ defaultValues?: Record<string, unknown>;
283
+ /** Load the control declarations + current values for the active resource. */
284
+ executeQuery(resource?: ResourceRef): Promise<ControlsQueryResult> | ControlsQueryResult;
285
+ /** Live-save a single control edit. Omit for explicit-apply or read-only panels. */
286
+ updateValue?(input: ControlsUpdateValueInput): Promise<void> | void;
287
+ /** Commit the full value map from a sticky footer. */
288
+ apply?(input: ControlsApplyInput): Promise<void> | void;
289
+ /** Reset some or all controls to their defaults. */
290
+ reset?(input: ControlsResetInput): Promise<void> | void;
291
+ subscribe?: (listener: () => void) => Disposable_2 | (() => void);
292
+ }
293
+
294
+ declare type ControlsRendererImplementation = (input: WorkbenchWidgetRenderInput & {
295
+ controlsRendererId: string;
296
+ }) => unknown;
297
+
298
+ declare interface ControlsRendererLayout {
299
+ area?: ControlsRendererArea;
300
+ defaultPx?: number;
301
+ minPx?: number;
302
+ maxPx?: number;
303
+ }
304
+
305
+ declare interface ControlsRendererRefreshEvent {
306
+ controlsRendererId: string;
307
+ }
308
+
309
+ declare type ControlsRendererRefreshListener = (event: ControlsRendererRefreshEvent) => void;
310
+
311
+ declare interface ControlsRendererRegistry {
312
+ controlsStore: WorkbenchStore<ControlsRendererStoreState>;
313
+ registerControlsRenderer(contribution: ControlsRendererContribution, metadata?: ContributionMetadata): Disposable_2;
314
+ setControlsRendererImplementation(impl: ControlsRendererImplementation): void;
315
+ getControlsRenderer(id: string): RegisteredControlsRendererContribution | undefined;
316
+ listControlsRenderers(): RegisteredControlsRendererContribution[];
317
+ refreshControlsRenderer(id: string): void;
318
+ onDidRefreshControlsRenderer(listener: ControlsRendererRefreshListener): Disposable_2;
319
+ }
320
+
321
+ declare interface ControlsRendererStoreState {
322
+ renderers: Record<string, RegisteredControlsRendererContribution>;
323
+ }
324
+
325
+ declare interface ControlsResetInput {
326
+ controlIds?: string[];
327
+ resource?: ResourceRef;
328
+ }
329
+
330
+ declare interface ControlsUpdateValueInput {
331
+ controlId: string;
332
+ value: unknown;
333
+ values: Record<string, unknown>;
334
+ resource?: ResourceRef;
335
+ }
336
+
337
+ declare type ControlsViewRecord = WorkbenchExtensionMetadata["views"][number];
338
+
339
+ export declare type CreateBridgeWebviewHostCapabilities = (context: BridgeWebviewRenderContext) => HostCapabilityRegistry;
340
+
341
+ export declare type CreateBridgeWebviewProps = (context: BridgeWebviewRenderContext) => unknown;
342
+
343
+ export declare const createBridgeWebviewRenderer: (input?: CreateBridgeWebviewRendererInput) => {
344
+ id: string;
345
+ render: (renderInput: WorkbenchWidgetRenderInput) => JSX.Element | null;
346
+ };
347
+
348
+ declare interface CreateBridgeWebviewRendererInput {
349
+ createHostCapabilities?: CreateBridgeWebviewHostCapabilities;
350
+ createProps?: CreateBridgeWebviewProps;
351
+ createTheme?: CreateBridgeWebviewTheme;
352
+ }
353
+
354
+ export declare type CreateBridgeWebviewTheme = (context: BridgeWebviewRenderContext) => ThemePreference_2;
355
+
356
+ /**
357
+ * Host side of the `terminal.session` webview capability. Sessions live in the
358
+ * workbench terminal controller; only serializable operation payloads and session
359
+ * ids cross the webview boundary. Output/exit events flow through the host event
360
+ * publisher under the `terminal.session` scope.
361
+ */
362
+ export declare const createTerminalSessionCapability: (input: CreateTerminalSessionCapabilityInput) => HostCapability;
363
+
364
+ declare interface CreateTerminalSessionCapabilityInput {
365
+ terminal: WorkbenchTerminalController;
366
+ hostEvents: HostEventPublisher;
367
+ }
368
+
369
+ export declare const createWorkbenchWebviewHostCapabilities: (input: CreateWorkbenchWebviewHostCapabilitiesInput) => {
370
+ "terminal.session"?: HostCapability | undefined;
371
+ "commands.execute": (params: unknown) => Promise<unknown>;
372
+ "resource.open": (params: unknown) => Promise<unknown>;
373
+ "notification.show": (params: unknown) => RegisteredWorkbenchNotification_2;
374
+ "preferences.get": (params: unknown) => PreferenceValue | undefined;
375
+ "preferences.set": (params: unknown) => {
376
+ name: string;
377
+ value: PreferenceValue;
378
+ };
379
+ "host.dispatchKeyboardEvent": (params: unknown) => void;
380
+ };
381
+
382
+ declare interface CreateWorkbenchWebviewHostCapabilitiesInput {
383
+ dispatchKeyboardEvent?: (event: KeyboardEventInit) => void;
384
+ workbench: WorkbenchCore;
385
+ /** Event channel into the guest; terminal.session is only offered when present. */
386
+ hostEvents?: HostEventPublisher;
387
+ }
388
+
389
+ /**
390
+ * Renders its own page. `render` returns `unknown` so core stays React-free — the
391
+ * React layer treats the result as a node, exactly like WorkbenchRendererRegistration.
392
+ */
393
+ declare interface CustomSettingsPanel extends SettingsPanelBase {
394
+ kind: "custom";
395
+ render(input: WorkbenchWidgetRenderInput): unknown;
396
+ }
397
+
398
+ declare interface DataRendererContribution<TRow extends DataRendererRow = DataRendererRow> {
399
+ id: string;
400
+ title: string;
401
+ resourceKind?: string;
402
+ /**
403
+ * Declarative attribute schema. The renderer dispatches filter / group /
404
+ * sort / display / inline-edit behavior on each descriptor's `type.kind`.
405
+ *
406
+ * Pass an `AttributesSource` ({ subscribe, getSnapshot }) instead of a
407
+ * static array to let the contribution mutate its schema at runtime —
408
+ * `WorkbenchDataView` subscribes so additions / removals / kind changes
409
+ * propagate live without re-registering the renderer.
410
+ */
411
+ attributes: AttributeDescriptor[] | AttributesSource;
412
+ /** Per-board-column overrides (color, drag/create rules, custom actions). */
413
+ getBoardColumnConfig?: (groupKey: string) => BoardColumnConfig;
414
+ hideToolbar?: boolean;
415
+ emptyTitle?: string;
416
+ emptyDescription?: string;
417
+ /** Initial settings/filters applied when the data renderer mounts. */
418
+ defaultSettings?: Partial<DataRendererSettings>;
419
+ defaultFilters?: DataRendererFilterState;
420
+ /**
421
+ * Data source. Receives the current display state so backends can paginate
422
+ * / filter / sort. The renderer re-applies filter / sort / group locally,
423
+ * so this can return unfiltered rows in simple cases.
424
+ */
425
+ executeQuery(state: DataRendererQueryState): Promise<TRow[]> | TRow[];
426
+ subscribe?: (listener: () => void) => Disposable_2 | (() => void);
427
+ /** Row interactions surfaced by the renderer (mirrored from <DataRenderer>). */
428
+ onRowClick?: (row: TRow) => void;
429
+ /** Per-row right-click context menu actions (mirrored from <DataRenderer>). */
430
+ getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];
431
+ /**
432
+ * Fires for inline attribute edits AND for cross-column drag-to-reorder on
433
+ * the board (the renderer passes the grouping attribute id + the target
434
+ * column value).
435
+ */
436
+ onAttributeChange?: (rowId: string, attributeId: string, value: unknown) => Promise<void> | void;
437
+ /** Manual within-column reorder (only fires when ordering is manual). */
438
+ onReorder?: (rowId: string, beforeRowId?: string) => Promise<void> | void;
439
+ onCreateRow?: (columnId: string) => void;
440
+ onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;
441
+ }
442
+
443
+ declare type DataRendererFilterState = Record<string, string[]>;
444
+
445
+ declare type DataRendererImplementation = (input: WorkbenchWidgetRenderInput & {
446
+ dataRendererId: string;
447
+ }) => unknown;
448
+
449
+ declare interface DataRendererOrdering {
450
+ attributeId: string | typeof MANUAL_ORDERING;
451
+ direction: SortDirection;
452
+ }
453
+
454
+ declare interface DataRendererQueryState {
455
+ settings: DataRendererSettings;
456
+ filters: DataRendererFilterState;
457
+ }
458
+
459
+ declare interface DataRendererRefreshEvent {
460
+ dataRendererId: string;
461
+ }
462
+
463
+ declare type DataRendererRefreshListener = (event: DataRendererRefreshEvent) => void;
464
+
465
+ declare interface DataRendererRegistry {
466
+ dataStore: WorkbenchStore<DataRendererStoreState>;
467
+ registerDataRenderer<TRow extends DataRendererRow = DataRendererRow>(contribution: DataRendererContribution<TRow>, metadata?: ContributionMetadata): Disposable_2;
468
+ setDataRendererImplementation(impl: DataRendererImplementation): void;
469
+ getDataRenderer(id: string): RegisteredDataRendererContribution | undefined;
470
+ listDataRenderers(): RegisteredDataRendererContribution[];
471
+ refreshDataRenderer(id: string): void;
472
+ onDidRefreshDataRenderer(listener: DataRendererRefreshListener): Disposable_2;
473
+ }
474
+
475
+ declare interface DataRendererRow {
476
+ id: string;
477
+ title: string;
478
+ /**
479
+ * Optional navigation handle. When set, the renderer's default click handler
480
+ * routes through the contribution's onRowClick (which typically opens the
481
+ * resource via the workbench).
482
+ */
483
+ resource?: unknown;
484
+ attributes: Record<string, unknown>;
485
+ }
486
+
487
+ declare type DataRendererRow_2 = Awaited<ReturnType<DataRendererContribution["executeQuery"]>>[number];
488
+
489
+ declare interface DataRendererSettings {
490
+ viewMode: ViewMode;
491
+ columnGrouping: string | typeof NO_GROUPING;
492
+ rowGrouping: string | typeof NO_GROUPING;
493
+ ordering: DataRendererOrdering;
494
+ displayProperties: string[];
495
+ }
496
+
497
+ declare interface DataRendererStoreState {
498
+ renderers: Record<string, RegisteredDataRendererContribution>;
499
+ }
500
+
501
+ declare interface Disposable_2 {
502
+ dispose(): void;
503
+ }
504
+
505
+ export declare const emptyWorkbenchExtensionMetadata: {
506
+ commands: never[];
507
+ commandPaletteContributions: never[];
508
+ diagnostics: never[];
509
+ extensions: never[];
510
+ menuContributions: never[];
511
+ modes: never[];
512
+ navigation: never[];
513
+ routes: never[];
514
+ dataRenderers: never[];
515
+ treeRenderers: never[];
516
+ fileRenderers: never[];
517
+ settingsPanels: never[];
518
+ settingsDefinitions: never[];
519
+ treeItems: never[];
520
+ views: never[];
521
+ };
522
+
523
+ declare interface EnumOption {
524
+ value: string;
525
+ label: string;
526
+ color?: string;
527
+ icon?: string | null;
528
+ }
529
+
530
+ declare type EnumOptions = EnumOption[] | EnumOptionsSource;
531
+
532
+ /**
533
+ * Reactive options source for enum / enum-multi attributes. Mirrors React's
534
+ * useSyncExternalStore contract so a contribution can hand its options off as
535
+ * a live collection instead of a frozen array.
536
+ */
537
+ declare interface EnumOptionsSource {
538
+ subscribe: (listener: () => void) => () => void;
539
+ getSnapshot: () => EnumOption[];
540
+ }
541
+
542
+ declare type ExtensionTreeRendererRecord = NonNullable<WorkbenchExtensionMetadata["treeRenderers"]>[number];
543
+
544
+ declare type ExtensionTreeViewRecord = WorkbenchExtensionMetadata["views"][number];
545
+
546
+ export declare interface ExtensionWebviewFileCapabilities {
547
+ delete(params: unknown): Promise<unknown> | unknown;
548
+ list(params: unknown): Promise<unknown> | unknown;
549
+ upload(params: unknown): Promise<unknown> | unknown;
550
+ }
551
+
552
+ /**
553
+ * Core-owned contract for file icon theme registrations. Structurally identical
554
+ * to @pstdio/ui's FileIconThemePreferenceOption; the React layer bridges the two
555
+ * so core does not depend on UI package ownership.
556
+ */
557
+ declare interface FileIconThemeFont {
558
+ fontFamily: string;
559
+ src: {
560
+ url: string;
561
+ format?: string;
562
+ }[];
563
+ weight?: string;
564
+ style?: string;
565
+ }
566
+
567
+ declare interface FileIconThemePreferenceOption {
568
+ id: string;
569
+ title?: string;
570
+ definitions: Record<string, unknown>;
571
+ fileExtensions: Record<string, string>;
572
+ fileNames: Record<string, string>;
573
+ defaults: {
574
+ file?: string;
575
+ folder?: string;
576
+ };
577
+ fonts: FileIconThemeFont[];
578
+ }
579
+
580
+ declare interface FileIconThemeRegistry {
581
+ store: WorkbenchStore<WorkbenchFileIconThemeStoreState>;
582
+ register(themes: readonly FileIconThemePreferenceOption[]): Disposable_2;
583
+ listThemes(): readonly FileIconThemePreferenceOption[];
584
+ }
585
+
586
+ declare interface FileRendererContent {
587
+ fileName?: string;
588
+ mimeType?: string;
589
+ content?: string;
590
+ dataUrl?: string;
591
+ placeholder?: string;
592
+ }
593
+
594
+ declare interface FileRendererContribution {
595
+ id: string;
596
+ title: string;
597
+ resourceKind?: string;
598
+ /** Resolve the file's content (and identity) for the bound resource. */
599
+ load(resource: ResourceRef | undefined): Promise<FileRendererContent> | FileRendererContent;
600
+ /** Persist edited text. Absent ⇒ read-only. Never called for images. */
601
+ save?(resource: ResourceRef | undefined, content: string): Promise<void> | void;
602
+ }
603
+
604
+ declare type FileRendererImplementation = (input: WorkbenchWidgetRenderInput & {
605
+ fileRendererId: string;
606
+ }) => unknown;
607
+
608
+ declare interface FileRendererRefreshEvent {
609
+ fileRendererId: string;
610
+ }
611
+
612
+ declare type FileRendererRefreshListener = (event: FileRendererRefreshEvent) => void;
613
+
614
+ declare interface FileRendererRegistry {
615
+ fileRendererStore: WorkbenchStore<FileRendererStoreState>;
616
+ registerFileRenderer(contribution: FileRendererContribution, metadata?: ContributionMetadata): Disposable_2;
617
+ setFileRendererImplementation(impl: FileRendererImplementation): void;
618
+ getFileRenderer(id: string): RegisteredFileRendererContribution | undefined;
619
+ listFileRenderers(): RegisteredFileRendererContribution[];
620
+ refreshFileRenderer(id: string): void;
621
+ onDidRefreshFileRenderer(listener: FileRendererRefreshListener): Disposable_2;
622
+ }
623
+
624
+ declare interface FileRendererStoreState {
625
+ renderers: Record<string, RegisteredFileRendererContribution>;
626
+ }
627
+
628
+ declare interface HistoryController {
629
+ store: WorkbenchStore<HistoryStoreState>;
630
+ goBack(): HistoryEntry | undefined;
631
+ goForward(): HistoryEntry | undefined;
632
+ goPrevious(): HistoryEntry | undefined;
633
+ recentlyClosed(): readonly HistoryEntry[];
634
+ reopenLastClosed(): HistoryEntry | undefined;
635
+ clear(): void;
636
+ }
637
+
638
+ declare interface HistoryEntry {
639
+ entryId: string;
640
+ recordedAt: number;
641
+ kind: "resource" | "widget" | "mode";
642
+ modeId?: string;
643
+ resource?: ResourceRef;
644
+ widgetId?: string;
645
+ contributionId?: string;
646
+ title?: string;
647
+ }
648
+
649
+ declare interface HistoryStoreState {
650
+ entries: readonly HistoryEntry[];
651
+ cursor: number;
652
+ recentlyClosed: readonly HistoryEntry[];
653
+ }
654
+
655
+ declare interface HostTreeDefaultNodesInput {
656
+ ctx: TreeContext;
657
+ record: ExtensionTreeRendererRecord;
658
+ view: ExtensionTreeViewRecord;
659
+ }
660
+
661
+ declare type HostTreeDefaultNodesResolver = (input: HostTreeDefaultNodesInput) => Promise<TreeNode[]> | TreeNode[];
662
+
663
+ declare interface Keybinding {
664
+ commandId: string;
665
+ keybinding: KeybindingSequence;
666
+ when?: string;
667
+ args?: unknown;
668
+ }
669
+
670
+ declare interface KeybindingRegistry {
671
+ store: WorkbenchStore<KeybindingRegistryStoreState>;
672
+ registerKeybinding(keybinding: Keybinding, metadata?: ContributionMetadata): Disposable_2;
673
+ listKeybindings(): RegisteredKeybinding[];
674
+ listActiveKeybindings(): RegisteredKeybinding[];
675
+ }
676
+
677
+ declare interface KeybindingRegistryStoreState {
678
+ keybindings: RegisteredKeybinding[];
679
+ }
680
+
681
+ declare type KeybindingSequence = string | string[];
682
+
683
+ declare interface LayoutModel {
684
+ store: WorkbenchStore<WorkbenchLayoutStoreState>;
685
+ registerPlaceholder(placeholder: PlaceholderContribution, metadata?: ContributionMetadata): {
686
+ dispose(): void;
687
+ };
688
+ registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata): {
689
+ dispose(): void;
690
+ };
691
+ unregisterWidget(id: string, options?: {
692
+ removePlacements?: boolean;
693
+ persist?: boolean;
694
+ }): void;
695
+ getPlaceholder(areaId: WorkbenchArea): RegisteredPlaceholderContribution | undefined;
696
+ getWidget(id: string): RegisteredWidgetContribution | undefined;
697
+ getAreaSize(areaId: WorkbenchArea): WorkbenchAreaSize | undefined;
698
+ getAreaCollapsible(areaId: WorkbenchArea): boolean;
699
+ getAreaHeaderBorderBottom(areaId: WorkbenchArea): boolean;
700
+ setAreaVisible(areaId: WorkbenchArea, visible: boolean): void;
701
+ setAreaSize(areaId: WorkbenchArea, size: number): void;
702
+ listPlaceholders(): RegisteredPlaceholderContribution[];
703
+ listWidgets(): RegisteredWidgetContribution[];
704
+ openWidget(id: string, input?: OpenWidgetInput): WorkbenchWidgetPlacement;
705
+ updateWidgetPlacement(widgetId: string, input: OpenWidgetInput): WorkbenchWidgetPlacement;
706
+ activateWidget(widgetId: string): WorkbenchWidgetPlacement;
707
+ closeWidget(widgetId: string): WorkbenchWidgetPlacement | undefined;
708
+ removeWidgetPlacement(widgetId: string): WorkbenchWidgetPlacement | undefined;
709
+ clearArea(areaId: WorkbenchArea): void;
710
+ resetAreas(): void;
711
+ getLayout(): WorkbenchLayout;
712
+ restoreLayout(layout: WorkbenchLayout): void;
713
+ setPersistenceScope(scope: LayoutScope | undefined): void;
714
+ getPersistenceScope(): LayoutScope | undefined;
715
+ onDidChangePersistenceScope(listener: (scope: LayoutScope | undefined) => void): {
716
+ dispose(): void;
717
+ };
718
+ }
719
+
720
+ declare type LayoutScope = string;
721
+
722
+ declare type Localizer = (value: unknown, fallback?: string) => string;
723
+
724
+ declare const MANUAL_ORDERING = "manual";
725
+
726
+ declare interface MenuItem {
727
+ commandId: string;
728
+ label?: string;
729
+ description?: string;
730
+ icon?: string;
731
+ iconSrc?: string;
732
+ overflowLabel?: string;
733
+ when?: string;
734
+ group?: string;
735
+ order?: number;
736
+ args?: unknown;
737
+ readOnly?: boolean;
738
+ /** Marks a menu action that navigates outside the app, rendered with a trailing external-link icon. */
739
+ external?: boolean;
740
+ }
741
+
742
+ declare type MenuPath = readonly string[];
743
+
744
+ declare interface MenuRegistry {
745
+ menuStore: WorkbenchStore<MenuRegistryStoreState>;
746
+ registerMenuItem(path: MenuPath, item: MenuItem, metadata?: ContributionMetadata): Disposable_2;
747
+ listMenuItems(path: MenuPath): RegisteredMenuItem[];
748
+ }
749
+
750
+ declare interface MenuRegistryStoreState {
751
+ itemsByPath: Record<string, RegisteredMenuItem[]>;
752
+ }
753
+
754
+ declare interface NavigationParser {
755
+ id: string;
756
+ priority?: number;
757
+ canParse(location: string): boolean;
758
+ parse(location: string): NavigationTarget;
759
+ }
760
+
761
+ declare interface NavigationRegistry {
762
+ store: WorkbenchStore<NavigationRegistryStoreState>;
763
+ registerParser(parser: NavigationParser, metadata?: ContributionMetadata): Disposable_2;
764
+ listParsers(): RegisteredNavigationParser[];
765
+ resolveLocation(location: string): NavigationTarget;
766
+ openTarget(target: NavigationTarget): Promise<readonly unknown[]>;
767
+ navigate(location: string): Promise<readonly unknown[]>;
768
+ registerNavigator(navigator: ResourceNavigator, metadata?: ContributionMetadata): Disposable_2;
769
+ listNavigators(): RegisteredResourceNavigator[];
770
+ createHref(resource: ResourceRef): string;
771
+ navigateResource(resource: ResourceRef): Promise<unknown>;
772
+ }
773
+
774
+ declare interface NavigationRegistryStoreState {
775
+ parsers: Record<string, RegisteredNavigationParser>;
776
+ navigators: Record<string, RegisteredResourceNavigator>;
777
+ }
778
+
779
+ declare type NavigationTarget = NavigationTargetItem | NavigationTargetCompound;
780
+
781
+ declare interface NavigationTargetCommand {
782
+ kind: "command";
783
+ commandId: string;
784
+ args?: unknown;
785
+ }
786
+
787
+ declare interface NavigationTargetCompound {
788
+ kind: "compound";
789
+ targets: readonly NavigationTargetItem[];
790
+ }
791
+
792
+ declare type NavigationTargetItem = NavigationTargetResource | NavigationTargetView | NavigationTargetCommand;
793
+
794
+ declare interface NavigationTargetResource {
795
+ kind: "resource";
796
+ resource: ResourceRef;
797
+ input?: OpenResourceInput;
798
+ }
799
+
800
+ declare interface NavigationTargetView {
801
+ kind: "view";
802
+ widgetId: string;
803
+ input?: OpenWidgetInput;
804
+ }
805
+
806
+ declare const NO_GROUPING = "none";
807
+
808
+ declare interface NotificationRegistry {
809
+ store: WorkbenchStore<WorkbenchNotificationStoreState>;
810
+ show(notification: WorkbenchNotification, metadata?: ContributionMetadata): RegisteredWorkbenchNotification;
811
+ dismiss(id: string): boolean;
812
+ clear(): void;
813
+ listNotifications(): RegisteredWorkbenchNotification[];
814
+ subscribe(listener: WorkbenchNotificationListener): Disposable_2;
815
+ }
816
+
817
+ declare interface OpenResourceInput {
818
+ replaceActive?: boolean;
819
+ }
820
+
821
+ declare interface OpenWidgetInput {
822
+ resource?: ResourceRef;
823
+ title?: string;
824
+ area?: WorkbenchArea;
825
+ ownerId?: string;
826
+ source?: ContributionSource;
827
+ pinned?: boolean;
828
+ closable?: boolean;
829
+ mountStrategy?: WidgetMountStrategy;
830
+ hiddenByDefault?: boolean;
831
+ replaceActive?: boolean;
832
+ }
833
+
834
+ declare interface PlaceholderContribution {
835
+ id: string;
836
+ title: string;
837
+ area: WorkbenchArea;
838
+ rendererId: string;
839
+ areaSize?: WorkbenchAreaSize;
840
+ areaCollapsible?: boolean;
841
+ config?: unknown;
842
+ priority?: number;
843
+ }
844
+
845
+ declare interface PreferencePropertySchema {
846
+ type: "boolean" | "number" | "string" | "array" | "object";
847
+ enum?: PreferenceValue[];
848
+ default?: PreferenceValue;
849
+ scope: PreferenceScope;
850
+ description?: string;
851
+ }
852
+
853
+ declare interface PreferenceRegistry {
854
+ store: WorkbenchStore<PreferenceRegistryStoreState>;
855
+ registerSchema(schema: PreferenceSchemaContribution, metadata?: ContributionMetadata): Disposable_2;
856
+ getSchema(name: string): RegisteredPreferenceSchema | undefined;
857
+ setValue(name: string, value: PreferenceValue, scope: PreferenceScopeRef): void;
858
+ getValue(name: string, scope?: PreferenceScopeRef): PreferenceValue | undefined;
859
+ }
860
+
861
+ declare interface PreferenceRegistryStoreState {
862
+ schemas: Record<string, RegisteredPreferenceSchema>;
863
+ }
864
+
865
+ declare interface PreferenceSchemaContribution {
866
+ properties: Record<string, PreferencePropertySchema>;
867
+ }
868
+
869
+ declare type PreferenceScope = "default" | "user" | "project" | "repo" | "workspace" | "extension" | "session";
870
+
871
+ declare interface PreferenceScopeRef {
872
+ scope: PreferenceScope;
873
+ scopeId?: string;
874
+ }
875
+
876
+ declare type PreferenceValue = boolean | number | string | string[] | number[] | boolean[] | Record<string, unknown>;
877
+
878
+ export declare const refreshOpenWorkbenchExtensionWebviews: (workbench: WorkbenchModuleContributionContext, metadata: WorkbenchExtensionMetadata) => void;
879
+
880
+ export declare const refreshWorkbenchExtensionContributions: (workbench: WorkbenchModuleContributionContext, metadata: WorkbenchExtensionMetadata, commandId: string) => void;
881
+
882
+ declare interface RegisteredCommand extends RegisteredContributionMetadata {
883
+ command: Command;
884
+ handler: CommandHandler;
885
+ }
886
+
887
+ declare interface RegisteredContributionMetadata {
888
+ source: ContributionSource;
889
+ ownerId: string;
890
+ priority: number;
891
+ }
892
+
893
+ declare interface RegisteredContributionMetadata_2 {
894
+ source: ContributionSource_2;
895
+ ownerId: string;
896
+ priority: number;
897
+ }
898
+
899
+ declare interface RegisteredControlsRendererContribution extends ControlsRendererContribution, RegisteredContributionMetadata {
900
+ }
901
+
902
+ declare interface RegisteredDataRendererContribution<TRow extends DataRendererRow = DataRendererRow> extends DataRendererContribution<TRow>, RegisteredContributionMetadata {
903
+ }
904
+
905
+ declare interface RegisteredFileRendererContribution extends FileRendererContribution, RegisteredContributionMetadata {
906
+ }
907
+
908
+ declare interface RegisteredKeepAliveHost {
909
+ rendererId: string;
910
+ host: HTMLElement;
911
+ attachedTo?: HTMLElement;
912
+ }
913
+
914
+ declare interface RegisteredKeybinding extends Keybinding, RegisteredContributionMetadata {
915
+ }
916
+
917
+ declare interface RegisteredMenuItem extends MenuItem, RegisteredContributionMetadata {
918
+ path: MenuPath;
919
+ }
920
+
921
+ declare type RegisteredNavigationParser = Omit<NavigationParser, "priority"> & RegisteredContributionMetadata;
922
+
923
+ declare type RegisteredPlaceholderContribution = Omit<PlaceholderContribution, "priority"> & RegisteredContributionMetadata;
924
+
925
+ declare type RegisteredPreferenceSchema = PreferencePropertySchema & {
926
+ ownerId: string;
927
+ source: string;
928
+ };
929
+
930
+ declare interface RegisteredResourceKind extends ResourceKindContribution, RegisteredContributionMetadata {
931
+ }
932
+
933
+ declare type RegisteredResourceNavigator = Omit<ResourceNavigator, "priority"> & RegisteredContributionMetadata;
934
+
935
+ declare type RegisteredSettingsPanel = SettingsPanelContribution & RegisteredContributionMetadata;
936
+
937
+ declare type RegisteredSettingsSection = SettingsSectionContribution & RegisteredContributionMetadata;
938
+
939
+ declare interface RegisteredTreeRendererContribution extends TreeRendererContribution, RegisteredContributionMetadata {
940
+ }
941
+
942
+ declare type RegisteredWidgetContribution = Omit<WidgetContribution, "priority" | "singleton" | "reuse"> & {
943
+ singleton: boolean;
944
+ reuse: WidgetReusePolicy;
945
+ } & RegisteredContributionMetadata;
946
+
947
+ declare interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {
948
+ id: string;
949
+ level: WorkbenchNotificationLevel;
950
+ title: string;
951
+ message?: string;
952
+ createdAt: string;
953
+ resource?: ResourceRef;
954
+ actions?: WorkbenchNotificationAction[];
955
+ metadata?: Record<string, unknown>;
956
+ }
957
+
958
+ declare interface RegisteredWorkbenchNotification_2 extends RegisteredContributionMetadata_2 {
959
+ id: string;
960
+ level: WorkbenchNotificationLevel_2;
961
+ title: string;
962
+ message?: string;
963
+ createdAt: string;
964
+ resource?: ResourceRef_2;
965
+ actions?: WorkbenchNotificationAction_2[];
966
+ metadata?: Record<string, unknown>;
967
+ }
968
+
969
+ export declare const registerWorkbenchExtensionCommandPaletteResources: (context: WorkbenchExtensionCommandContext, records: readonly WorkbenchExtensionCommandPaletteResourceRecord[]) => {
970
+ dispose(): void;
971
+ };
972
+
973
+ export declare const registerWorkbenchExtensionContributions: (input: RegisterWorkbenchExtensionContributionsInput) => {
974
+ dispose(): void;
975
+ };
976
+
977
+ export declare interface RegisterWorkbenchExtensionContributionsInput {
978
+ createMenuWhenExpression?: WorkbenchExtensionMenuWhenBuilder;
979
+ createWebviewHostCapabilities?: CreateBridgeWebviewHostCapabilities;
980
+ createWebviewHostCapabilityOverrides?: CreateBridgeWebviewHostCapabilities;
981
+ createWebviewProps?: CreateBridgeWebviewProps;
982
+ createWebviewTheme?: CreateBridgeWebviewTheme;
983
+ executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;
984
+ menuSlotsById?: ReadonlyMap<string, WorkbenchExtensionMenuSlotConfig>;
985
+ menuTargetsById?: ReadonlyMap<string, WorkbenchExtensionMenuSlotConfig>;
986
+ metadata: WorkbenchExtensionMetadata;
987
+ openHref?: (href: string) => unknown;
988
+ projectId: string;
989
+ routeResourceKind?: string;
990
+ settingsSectionId?: string;
991
+ settingsSectionTitle?: string;
992
+ webviewFiles?: ExtensionWebviewFileCapabilities;
993
+ workbench: WorkbenchModuleContributionContext;
994
+ }
995
+
996
+ export declare const registerWorkbenchExtensionControlsRenderers: (context: WorkbenchExtensionCommandContext, records: WorkbenchExtensionControlsRendererRecord[], views: ControlsViewRecord[], adapter?: WorkbenchExtensionControlsAdapter) => Disposable_2;
997
+
998
+ export declare const registerWorkbenchExtensionDataRenderers: (context: WorkbenchExtensionCommandContext, records: readonly WorkbenchExtensionDataRendererRecord[], adapter?: WorkbenchExtensionDataRendererAdapter) => {
999
+ dispose(): void;
1000
+ };
1001
+
1002
+ export declare const registerWorkbenchExtensionFileRenderers: (input: RegisterWorkbenchExtensionFileRenderersInput) => {
1003
+ dispose(): void;
1004
+ };
1005
+
1006
+ export declare interface RegisterWorkbenchExtensionFileRenderersInput {
1007
+ executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;
1008
+ metadata: WorkbenchExtensionMetadata;
1009
+ projectId: string;
1010
+ workbench: WorkbenchModuleContributionContext;
1011
+ }
1012
+
1013
+ export declare const registerWorkbenchExtensionTreeRenderers: (input: RegisterWorkbenchExtensionTreeRenderersInput) => {
1014
+ dispose(): void;
1015
+ };
1016
+
1017
+ export declare interface RegisterWorkbenchExtensionTreeRenderersInput {
1018
+ executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;
1019
+ getHostTreeFooterNodes?: HostTreeDefaultNodesResolver;
1020
+ getHostTreeHeaderNodes?: HostTreeDefaultNodesResolver;
1021
+ metadata: WorkbenchExtensionMetadata;
1022
+ projectId: string;
1023
+ workbench: WorkbenchModuleContributionContext;
1024
+ }
1025
+
1026
+ export declare const renderBridgeWebviewFrame: (input: {
1027
+ context: BridgeWebviewRenderContext;
1028
+ createHostCapabilities: CreateBridgeWebviewHostCapabilities;
1029
+ createProps: CreateBridgeWebviewProps;
1030
+ createTheme?: CreateBridgeWebviewTheme;
1031
+ ownerId?: string;
1032
+ title: string;
1033
+ webview: BridgeWebviewConfig;
1034
+ }) => JSX.Element;
1035
+
1036
+ declare type ResolvedResourceOpener = Required<ResourceOpener>;
1037
+
1038
+ declare interface ResourceBrowseEntry {
1039
+ resource: ResourceRef;
1040
+ searchText?: string;
1041
+ description?: string;
1042
+ group?: string;
1043
+ order?: number;
1044
+ activate?: (resource: ResourceRef) => unknown | Promise<unknown>;
1045
+ }
1046
+
1047
+ /** Row-level context menu action surfaced by the renderer. */
1048
+ declare interface ResourceContextAction {
1049
+ key: string;
1050
+ label: string;
1051
+ onClick: () => Promise<void> | void;
1052
+ isDisabled?: boolean;
1053
+ icon?: ReactNode;
1054
+ endContent?: ReactNode;
1055
+ separatorBefore?: boolean;
1056
+ }
1057
+
1058
+ declare interface ResourceKindContribution {
1059
+ kind: string;
1060
+ label: string;
1061
+ icon?: string;
1062
+ surface?: ResourceSurface;
1063
+ paletteOpenInput?: OpenResourceInput;
1064
+ }
1065
+
1066
+ declare interface ResourceListContext {
1067
+ primary?: ResourceRef;
1068
+ }
1069
+
1070
+ declare interface ResourceNavigator<TResult = unknown> {
1071
+ id: string;
1072
+ priority?: number;
1073
+ canNavigate(resource: ResourceRef): boolean;
1074
+ createHref?(resource: ResourceRef): string;
1075
+ navigate(resource: ResourceRef): TResult | Promise<TResult>;
1076
+ }
1077
+
1078
+ declare interface ResourceOpener<TResult = unknown> {
1079
+ id: string;
1080
+ priority?: number;
1081
+ canOpen(resource: ResourceRef): boolean;
1082
+ open(resource: ResourceRef, input: OpenResourceInput): TResult | Promise<TResult>;
1083
+ }
1084
+
1085
+ declare interface ResourceProvider {
1086
+ id: string;
1087
+ kind: string;
1088
+ list(query: string, context: ResourceListContext): readonly ResourceBrowseEntry[];
1089
+ }
1090
+
1091
+ declare interface ResourceRef {
1092
+ kind: string;
1093
+ uri: string;
1094
+ id?: string;
1095
+ label?: string;
1096
+ icon?: string;
1097
+ metadata?: Record<string, unknown>;
1098
+ }
1099
+
1100
+ declare interface ResourceRef_2 {
1101
+ kind: string;
1102
+ uri: string;
1103
+ id?: string;
1104
+ label?: string;
1105
+ icon?: string;
1106
+ metadata?: Record<string, unknown>;
1107
+ }
1108
+
1109
+ declare interface ResourceRegistry {
1110
+ store: WorkbenchStore<ResourceRegistryStoreState>;
1111
+ registerKind(kind: ResourceKindContribution, metadata?: ContributionMetadata): Disposable_2;
1112
+ getKind(kind: string): RegisteredResourceKind | undefined;
1113
+ getSurface(resource: ResourceRef): ResourceSurface | undefined;
1114
+ listKinds(): RegisteredResourceKind[];
1115
+ registerOpener(opener: ResourceOpener): Disposable_2;
1116
+ listOpeners(): ResolvedResourceOpener[];
1117
+ registerProvider(provider: ResourceProvider): Disposable_2;
1118
+ listProviders(): ResourceProvider[];
1119
+ listResources(query: string): readonly ResourceBrowseEntry[];
1120
+ openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<unknown>;
1121
+ onDidOpenResource(listener: (resource: ResourceRef) => void): Disposable_2;
1122
+ }
1123
+
1124
+ declare interface ResourceRegistryStoreState {
1125
+ kinds: Record<string, RegisteredResourceKind>;
1126
+ openers: Record<string, ResolvedResourceOpener>;
1127
+ providers: Record<string, ResourceProvider>;
1128
+ }
1129
+
1130
+ declare type ResourceSurface = "primary" | "secondary" | "attached";
1131
+
1132
+ declare type RowAction = NonNullable<WorkbenchExtensionDataRendererRecord["rowActions"]>[number];
1133
+
1134
+ /** Auto-rendered as a param editor from the registered preference schema. */
1135
+ declare interface SchemaSettingsPanel extends SettingsPanelBase {
1136
+ kind: "schema";
1137
+ preferences: SettingsPanelPreference[];
1138
+ /** "live" persists on change (default); "apply" stages edits behind Save/Discard. */
1139
+ save?: "live" | "apply";
1140
+ }
1141
+
1142
+ /** A "+ create"-style action surfaced on a section or a collection's parent node. */
1143
+ declare interface SettingsAction {
1144
+ id: string;
1145
+ label: string;
1146
+ icon?: string;
1147
+ run(): void | Promise<void>;
1148
+ }
1149
+
1150
+ declare interface SettingsCollectionGroupBy<TItem> {
1151
+ key(item: TItem): string;
1152
+ order?: string[];
1153
+ label(key: string): string;
1154
+ icon?(key: string): string | undefined;
1155
+ }
1156
+
1157
+ declare interface SettingsPanelBase {
1158
+ id: string;
1159
+ title: string;
1160
+ description?: string;
1161
+ /** Section id this panel belongs to. */
1162
+ section?: string;
1163
+ icon?: string;
1164
+ /** Lower sorts first; ties fall back to contribution priority then registration order. */
1165
+ order?: number;
1166
+ scope?: SettingsScope;
1167
+ when?: string;
1168
+ }
1169
+
1170
+ declare type SettingsPanelContribution = SchemaSettingsPanel | CustomSettingsPanel | CollectionSettingsPanel;
1171
+
1172
+ /** A preference this panel edits; a bare string uses the preference name as its label. */
1173
+ declare type SettingsPanelPreference = string | {
1174
+ name: string;
1175
+ label?: string;
1176
+ };
1177
+
1178
+ declare interface SettingsRegistry {
1179
+ store: WorkbenchStore<SettingsRegistryStoreState>;
1180
+ registerSection(section: SettingsSectionContribution, metadata?: ContributionMetadata): Disposable_2;
1181
+ registerPanel<TItem = unknown>(panel: SchemaSettingsPanel | CustomSettingsPanel | CollectionSettingsPanel<TItem>, metadata?: ContributionMetadata): Disposable_2;
1182
+ getSection(id: string): RegisteredSettingsSection | undefined;
1183
+ getPanel(id: string): RegisteredSettingsPanel | undefined;
1184
+ listSections(): RegisteredSettingsSection[];
1185
+ listPanels(): RegisteredSettingsPanel[];
1186
+ /** Signal that a collection's backing data changed so the surface refreshes. */
1187
+ refresh(): void;
1188
+ }
1189
+
1190
+ declare interface SettingsRegistryStoreState {
1191
+ sections: Record<string, RegisteredSettingsSection>;
1192
+ panels: Record<string, RegisteredSettingsPanel>;
1193
+ /** Bumped by refresh() so the surface re-reads collection items() after backing data changes. */
1194
+ revision: number;
1195
+ }
1196
+
1197
+ /** Settings are stored either per-user (global) or per-project. Projectless surfaces show only global entries. */
1198
+ declare type SettingsScope = "global" | "project";
1199
+
1200
+ /** An ordered sidebar container. Headerless when `title` is omitted. */
1201
+ declare interface SettingsSectionContribution {
1202
+ id: string;
1203
+ title?: string;
1204
+ order?: number;
1205
+ scope?: SettingsScope;
1206
+ actions?: SettingsAction[];
1207
+ }
1208
+
1209
+ export declare const shouldRefreshWorkbenchExtensionTrees: (metadata: WorkbenchExtensionMetadata, commandId: string) => boolean;
1210
+
1211
+ declare type SortDirection = "asc" | "desc";
1212
+
1213
+ /**
1214
+ * Core-owned contract for theme registrations. Structurally identical to
1215
+ * @pstdio/ui's ThemePreferenceOption; the React layer bridges the two so core
1216
+ * does not depend on UI package ownership.
1217
+ */
1218
+ declare type ThemePreference = string;
1219
+
1220
+ declare type ThemePreferenceMode = "light" | "dark";
1221
+
1222
+ declare interface ThemePreferenceOption {
1223
+ id: ThemePreference;
1224
+ title?: string;
1225
+ mode: ThemePreferenceMode;
1226
+ tokens?: ThemePreferenceTokens;
1227
+ monacoTheme?: unknown;
1228
+ }
1229
+
1230
+ declare type ThemePreferenceTokens = Record<string, string>;
1231
+
1232
+ declare interface ThemeRegistry {
1233
+ store: WorkbenchStore<WorkbenchThemeStoreState>;
1234
+ register(themes: readonly ThemePreferenceOption[]): Disposable_2;
1235
+ listThemes(): readonly ThemePreferenceOption[];
1236
+ }
1237
+
1238
+ declare interface TreeAction {
1239
+ id: string;
1240
+ label?: string;
1241
+ icon?: string;
1242
+ commandId?: string;
1243
+ args?: unknown;
1244
+ params?: CommandParamSchema;
1245
+ submitLabel?: string;
1246
+ when?: string;
1247
+ disabled?: boolean;
1248
+ run?(args?: unknown): Promise<void> | void;
1249
+ }
1250
+
1251
+ declare interface TreeContext {
1252
+ filter?: string;
1253
+ resource?: ResourceRef;
1254
+ /** Widget/view contribution id for trees rendered through a view-backed widget. */
1255
+ viewId?: string;
1256
+ }
1257
+
1258
+ declare interface TreeNode {
1259
+ id: string;
1260
+ label: string;
1261
+ icon?: string;
1262
+ iconElement?: unknown;
1263
+ iconColor?: string;
1264
+ iconTooltip?: string;
1265
+ endContent?: unknown;
1266
+ commandId?: string;
1267
+ resource?: ResourceRef;
1268
+ target?: NavigationTarget;
1269
+ /** Visual row variant for non-data rows such as placeholders. */
1270
+ rowVariant?: TreeNodeRowVariant;
1271
+ actions?: TreeAction[];
1272
+ contextMenuActions?: TreeAction[];
1273
+ contextMenuPath?: MenuPath;
1274
+ menuPath?: MenuPath;
1275
+ menuPlacement?: "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "left-start";
1276
+ collapsible?: boolean;
1277
+ disabled?: boolean;
1278
+ children?: TreeNode[];
1279
+ description?: string;
1280
+ contextValue?: string;
1281
+ hiddenByDefault?: boolean;
1282
+ /** When true, the node (e.g. a header/footer row) opts in to the tree's hide/show customization menu. */
1283
+ canHide?: boolean;
1284
+ }
1285
+
1286
+ declare type TreeNodeRowVariant = "empty-state";
1287
+
1288
+ declare interface TreeRendererContribution {
1289
+ id: string;
1290
+ title: string;
1291
+ icon?: string;
1292
+ when?: string;
1293
+ defaultExpandedSectionIds?: string[];
1294
+ defaultExpandedNodeIds?: string[];
1295
+ getBody(ctx: TreeContext): Promise<TreeViewSection[]> | TreeViewSection[];
1296
+ getHeader?(ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1297
+ getFooter?(ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1298
+ getChildren(node: TreeNode, ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1299
+ }
1300
+
1301
+ declare type TreeRendererImplementation = (input: WorkbenchWidgetRenderInput & {
1302
+ treeId: string;
1303
+ }) => unknown;
1304
+
1305
+ declare interface TreeRendererRefreshEvent {
1306
+ treeId: string;
1307
+ }
1308
+
1309
+ declare type TreeRendererRefreshListener = (event: TreeRendererRefreshEvent) => void;
1310
+
1311
+ declare interface TreeRendererRegistry {
1312
+ treeStore: WorkbenchStore<TreeRendererStoreState>;
1313
+ registerTreeRenderer(view: TreeRendererContribution, metadata?: ContributionMetadata): Disposable_2;
1314
+ setTreeRendererImplementation(impl: TreeRendererImplementation): void;
1315
+ getTreeRenderer(id: string): RegisteredTreeRendererContribution | undefined;
1316
+ listTreeRenderers(): RegisteredTreeRendererContribution[];
1317
+ getBody(id: string, ctx?: TreeContext): Promise<TreeViewSection[]>;
1318
+ getHeader(id: string, ctx?: TreeContext): Promise<TreeNode[]>;
1319
+ getFooter(id: string, ctx?: TreeContext): Promise<TreeNode[]>;
1320
+ getChildren(id: string, node: TreeNode, ctx?: TreeContext): Promise<TreeNode[]>;
1321
+ getTreeState(id: string): TreeRendererState;
1322
+ setNodeExpanded(id: string, nodeId: string, expanded: boolean): void;
1323
+ setSectionExpanded(id: string, sectionId: string, expanded: boolean): void;
1324
+ setSelectedNode(id: string, nodeId: string | undefined): void;
1325
+ setLoading(id: string, loading: boolean): void;
1326
+ refresh(id: string): void;
1327
+ onDidRefresh(listener: TreeRendererRefreshListener): Disposable_2;
1328
+ }
1329
+
1330
+ declare interface TreeRendererState {
1331
+ expandedNodeIds: string[];
1332
+ expandedSectionIds: string[];
1333
+ selectedNodeId?: string;
1334
+ loading?: boolean;
1335
+ }
1336
+
1337
+ declare interface TreeRendererStoreState {
1338
+ trees: Record<string, RegisteredTreeRendererContribution>;
1339
+ statesByTreeId: Record<string, TreeRendererState>;
1340
+ refreshKeysByTreeId: Record<string, number>;
1341
+ }
1342
+
1343
+ declare interface TreeSectionEmptyState {
1344
+ title: string;
1345
+ description?: string;
1346
+ icon?: string;
1347
+ }
1348
+
1349
+ declare interface TreeViewSection {
1350
+ id: string;
1351
+ label?: string;
1352
+ actions?: TreeAction[];
1353
+ collapsible?: boolean;
1354
+ emptyState?: TreeSectionEmptyState;
1355
+ nodes: TreeNode[];
1356
+ hiddenByDefault?: boolean;
1357
+ /** When true, the section (category) opts in to the tree's hide/show customization menu. */
1358
+ canHide?: boolean;
1359
+ }
1360
+
1361
+ /**
1362
+ * Core-owned contracts for data renderer contributions. @pstdio/ui's
1363
+ * DataRenderer props are structurally identical; the React layer bridges the
1364
+ * two, so drift surfaces as a compile error there instead of coupling core's
1365
+ * API shape to UI package ownership.
1366
+ */
1367
+ declare type ViewMode = "board" | "list";
1368
+
1369
+ declare interface WidgetContribution {
1370
+ id: string;
1371
+ title: string;
1372
+ area: WorkbenchArea;
1373
+ fallbackArea?: WorkbenchArea;
1374
+ singleton?: boolean;
1375
+ reuse?: WidgetReusePolicy;
1376
+ mountStrategy?: WidgetMountStrategy;
1377
+ closable?: boolean;
1378
+ hiddenByDefault?: boolean;
1379
+ areaSize?: WorkbenchAreaSize;
1380
+ areaCollapsible?: boolean;
1381
+ headerBorderBottom?: boolean;
1382
+ resourceKinds?: string[];
1383
+ priority?: number;
1384
+ rendererId: string;
1385
+ config?: unknown;
1386
+ canOpen?(resource: ResourceRef): boolean;
1387
+ }
1388
+
1389
+ declare type WidgetMountStrategy = "active" | "keep-mounted";
1390
+
1391
+ declare type WidgetReusePolicy = "resource" | "none";
1392
+
1393
+ declare type WorkbenchArea = (typeof workbenchAreas)[number];
1394
+
1395
+ declare const workbenchAreas: readonly ["nav", "activity", "left-header", "left", "main-header", "main-left", "main", "main-right", "secondary-header", "secondary", "status", "overlay", "floating-header", "floating"];
1396
+
1397
+ declare interface WorkbenchAreaSize {
1398
+ defaultPx?: number;
1399
+ minPx?: number;
1400
+ maxPx?: number;
1401
+ }
1402
+
1403
+ declare interface WorkbenchAreaState {
1404
+ id: WorkbenchArea;
1405
+ visible: boolean;
1406
+ size?: number;
1407
+ widgets: WorkbenchWidgetPlacement[];
1408
+ activeWidgetId?: string;
1409
+ }
1410
+
1411
+ declare type WorkbenchBreadcrumbChangeListener = () => void;
1412
+
1413
+ declare interface WorkbenchBreadcrumbController {
1414
+ store: WorkbenchStore<WorkbenchBreadcrumbState>;
1415
+ setItems(items: WorkbenchBreadcrumbItem[]): Disposable_2;
1416
+ clearItems(): void;
1417
+ getItems(): WorkbenchBreadcrumbItem[] | undefined;
1418
+ onDidChange(listener: WorkbenchBreadcrumbChangeListener): Disposable_2;
1419
+ }
1420
+
1421
+ declare interface WorkbenchBreadcrumbItem {
1422
+ title: unknown;
1423
+ icon?: string;
1424
+ url?: string;
1425
+ onClick?: () => void;
1426
+ resource?: ResourceRef;
1427
+ }
1428
+
1429
+ declare interface WorkbenchBreadcrumbState {
1430
+ items: WorkbenchBreadcrumbItem[] | undefined;
1431
+ }
1432
+
1433
+ declare interface WorkbenchCommandExecutionContext {
1434
+ resource?: ResourceRef;
1435
+ }
1436
+
1437
+ declare interface WorkbenchCommandExecutionError {
1438
+ commandId: string;
1439
+ args: unknown;
1440
+ error: unknown;
1441
+ }
1442
+
1443
+ declare type WorkbenchCommandExecutionErrorListener = (event: WorkbenchCommandExecutionError) => void;
1444
+
1445
+ declare type WorkbenchCommandPaletteChangeListener = (open: boolean) => void;
1446
+
1447
+ declare interface WorkbenchCommandPaletteController {
1448
+ store: WorkbenchStore<WorkbenchCommandPaletteState>;
1449
+ isOpen(): boolean;
1450
+ getView(): WorkbenchCommandPaletteView;
1451
+ getInitialQuery(): string;
1452
+ getParamsRequest(): WorkbenchCommandParamsRequest | null;
1453
+ open(input?: WorkbenchCommandPaletteOpenInput): void;
1454
+ close(): void;
1455
+ toggle(): void;
1456
+ requestParams(request: WorkbenchCommandParamsRequest): void;
1457
+ clearParams(): void;
1458
+ onDidChange(listener: WorkbenchCommandPaletteChangeListener): Disposable_2;
1459
+ }
1460
+
1461
+ declare interface WorkbenchCommandPaletteOpenInput {
1462
+ view?: WorkbenchCommandPaletteView;
1463
+ initialQuery?: string;
1464
+ }
1465
+
1466
+ declare interface WorkbenchCommandPaletteState {
1467
+ open: boolean;
1468
+ view: WorkbenchCommandPaletteView;
1469
+ initialQuery: string;
1470
+ paramsRequest: WorkbenchCommandParamsRequest | null;
1471
+ }
1472
+
1473
+ declare type WorkbenchCommandPaletteView = "main" | "theme" | "mode";
1474
+
1475
+ declare interface WorkbenchCommandParamsRequest {
1476
+ record: {
1477
+ command: {
1478
+ id: string;
1479
+ label: string;
1480
+ params?: CommandParamSchema;
1481
+ };
1482
+ };
1483
+ label: string;
1484
+ args?: unknown;
1485
+ context?: WorkbenchCommandExecutionContext;
1486
+ }
1487
+
1488
+ declare interface WorkbenchCore extends WorkbenchCoreContributionContext {
1489
+ registerModule(module: WorkbenchModuleContribution): Disposable_2;
1490
+ unregisterModule(moduleId: string): void;
1491
+ }
1492
+
1493
+ declare interface WorkbenchCoreContributionContext {
1494
+ breadcrumbs: WorkbenchBreadcrumbController;
1495
+ commandPalette: WorkbenchCommandPaletteController;
1496
+ commandPaletteResources: CommandPaletteResourceRegistry;
1497
+ commands: CommandRegistry;
1498
+ context: ContextKeyService;
1499
+ focus: WorkbenchFocusController;
1500
+ history: HistoryController;
1501
+ keybindings: KeybindingRegistry;
1502
+ lastResource: WorkbenchLastResourceController;
1503
+ layout: WorkbenchLayoutModel;
1504
+ modes: WorkbenchModeRegistry;
1505
+ navigation: NavigationRegistry;
1506
+ notifications: NotificationRegistry;
1507
+ panels: WorkbenchPanelsController;
1508
+ preferences: PreferenceRegistry;
1509
+ renderers: WorkbenchRenderers;
1510
+ resources: ResourceRegistry;
1511
+ settings: SettingsRegistry;
1512
+ sessionPanel: WorkbenchSessionPanelController;
1513
+ terminal: WorkbenchTerminalController;
1514
+ themes: ThemeRegistry;
1515
+ fileIconThemes: FileIconThemeRegistry;
1516
+ getPrimaryResource(): ResourceRef | undefined;
1517
+ onDidChangePrimaryResource(listener: (resource: ResourceRef | undefined) => void): Disposable_2;
1518
+ getActiveResource(): ResourceRef | undefined;
1519
+ onDidChangeActiveResource(listener: (resource: ResourceRef | undefined) => void): Disposable_2;
1520
+ }
1521
+
1522
+ export declare interface WorkbenchExtensionCommandContext {
1523
+ executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;
1524
+ projectId: string;
1525
+ workbench: WorkbenchModuleContributionContext;
1526
+ }
1527
+
1528
+ export declare interface WorkbenchExtensionCommandPaletteRegistration {
1529
+ command: Command;
1530
+ contribution: ExtensionCommandPaletteContribution;
1531
+ menuItem: MenuItem;
1532
+ targetCommandId: string;
1533
+ }
1534
+
1535
+ export declare interface WorkbenchExtensionControlsAdapter {
1536
+ /** Supply a fallback resource when the widget placement carries none. */
1537
+ resolveResource?: (record: WorkbenchExtensionControlsRendererRecord) => ResourceRef | undefined;
1538
+ }
1539
+
1540
+ export declare interface WorkbenchExtensionDataRendererAdapter {
1541
+ /** Override label resolution. Defaults to workbench's `text(value, fallback)`. */
1542
+ resolveLabel?: Localizer;
1543
+ /** Post-process an attribute descriptor (after localization). Defaults to identity. */
1544
+ decorateAttribute?: (record: WorkbenchExtensionDataRendererRecord, attribute: AttributeDescriptor) => AttributeDescriptor;
1545
+ /**
1546
+ * Translate a row's transport-shaped resource (`{ type, id }`) into a workbench
1547
+ * `ResourceRef`. Defaults to the workbench `pstdio://extension-resource/...`
1548
+ * scheme — dashboard supplies its own. Returns `undefined` for rows that do not
1549
+ * carry an explicit resource.
1550
+ */
1551
+ resolveRowResource?: (record: WorkbenchExtensionDataRendererRecord, row: DataRendererRow_2) => ResourceRef | undefined;
1552
+ /**
1553
+ * Synthesize a `ResourceRef` for row-action execution context when the row does
1554
+ * not carry an explicit resource. Defaults to a `pstdio://extension-resource/`
1555
+ * fallback built from `record.resourceKind` and `row.id`.
1556
+ */
1557
+ resolveRowActionResource?: (record: WorkbenchExtensionDataRendererRecord, row: DataRendererRow_2) => ResourceRef | undefined;
1558
+ /**
1559
+ * Override the row-action runner. `runDefault` performs the workbench's standard
1560
+ * flow (look up the row-action command, request params if needed, execute it).
1561
+ */
1562
+ executeRowAction?: (input: {
1563
+ record: WorkbenchExtensionDataRendererRecord;
1564
+ action: RowAction;
1565
+ row: DataRendererRow_2;
1566
+ resource: ResourceRef | undefined;
1567
+ runDefault: () => Promise<void>;
1568
+ }) => void | Promise<void>;
1569
+ /**
1570
+ * Override the row click handler. When unset the view layer falls back to
1571
+ * opening the row's resource via `ctx.resources.openResource` — set this to
1572
+ * intercept the click (e.g. swallow rejections when no opener exists yet).
1573
+ */
1574
+ onRowClick?: (input: {
1575
+ record: WorkbenchExtensionDataRendererRecord;
1576
+ row: DataRendererRow_2;
1577
+ resource: ResourceRef | undefined;
1578
+ }) => void;
1579
+ /**
1580
+ * Override the inline-create handler. `executeDefault` runs the record's create
1581
+ * command with the column param. When omitted, the default executes and any
1582
+ * configured `onAfterCreate` runs with the returned value.
1583
+ */
1584
+ onCreateRow?: (input: {
1585
+ record: WorkbenchExtensionDataRendererRecord;
1586
+ columnId: string;
1587
+ executeDefault: () => Promise<unknown>;
1588
+ }) => void;
1589
+ /** Called after a successful default create (when `onCreateRow` is not provided). */
1590
+ onAfterCreate?: (input: {
1591
+ record: WorkbenchExtensionDataRendererRecord;
1592
+ created: unknown;
1593
+ }) => void;
1594
+ /**
1595
+ * Called after any mutation (attribute change, reorder, column action, default
1596
+ * create) resolves successfully. Hosts that drive refresh via the outer command
1597
+ * pipeline (testbench / workbench) leave this unset; dashboard supplies
1598
+ * `ctx.renderers.refreshDataRenderer(id)`.
1599
+ */
1600
+ onAfterMutation?: (record: WorkbenchExtensionDataRendererRecord) => void;
1601
+ }
1602
+
1603
+ export declare interface WorkbenchExtensionMenuRegistration {
1604
+ command: Command;
1605
+ contribution: ExtensionMenuContribution;
1606
+ menuItem: MenuItem;
1607
+ menuPath: MenuPath;
1608
+ targetCommandId: string;
1609
+ }
1610
+
1611
+ export declare interface WorkbenchExtensionMenuSlotConfig {
1612
+ menuPath: MenuPath;
1613
+ group?: string;
1614
+ overflowLabel?: string;
1615
+ }
1616
+
1617
+ export declare type WorkbenchExtensionMenuWhenBuilder = (contribution: ExtensionMenuContribution) => string | undefined;
1618
+
1619
+ export { WorkbenchExtensionMetadata }
1620
+
1621
+ export declare type WorkbenchExtensionRoute = WorkbenchExtensionMetadata["routes"][number];
1622
+
1623
+ export declare interface WorkbenchExtensionRouteResourceInput {
1624
+ route: WorkbenchExtensionRoute;
1625
+ }
1626
+
1627
+ declare type WorkbenchExtensionStringResolver = (value: Localizable<string> | undefined, extensionId: string) => string;
1628
+
1629
+ declare interface WorkbenchFileIconThemeStoreState {
1630
+ themes: readonly FileIconThemePreferenceOption[];
1631
+ }
1632
+
1633
+ declare type WorkbenchFocusArea = (typeof workbenchFocusAreas)[number];
1634
+
1635
+ declare const workbenchFocusAreas: readonly ["activityBar", "sideBar", "main", "panel", "statusBar"];
1636
+
1637
+ declare type WorkbenchFocusChangeListener = (area: WorkbenchFocusArea | undefined) => void;
1638
+
1639
+ declare interface WorkbenchFocusController {
1640
+ store: WorkbenchStore<WorkbenchFocusState>;
1641
+ setActiveArea(area: WorkbenchFocusArea): void;
1642
+ clearFocus(): void;
1643
+ getActiveArea(): WorkbenchFocusArea | undefined;
1644
+ onDidChange(listener: WorkbenchFocusChangeListener): Disposable_2;
1645
+ }
1646
+
1647
+ declare interface WorkbenchFocusState {
1648
+ activeArea: WorkbenchFocusArea | undefined;
1649
+ }
1650
+
1651
+ declare interface WorkbenchLastResourceController {
1652
+ get(): ResourceRef | undefined;
1653
+ set(resource: ResourceRef | undefined): void;
1654
+ restore(): Promise<boolean>;
1655
+ }
1656
+
1657
+ declare interface WorkbenchLayout {
1658
+ areas: Record<WorkbenchArea, WorkbenchAreaState>;
1659
+ activeWidgetId?: string;
1660
+ activeResourceUri?: string;
1661
+ }
1662
+
1663
+ declare type WorkbenchLayoutModel = LayoutModel & MenuRegistry;
1664
+
1665
+ declare interface WorkbenchLayoutStoreState {
1666
+ layout: WorkbenchLayout;
1667
+ widgets: Record<string, RegisteredWidgetContribution>;
1668
+ placeholders: Partial<Record<WorkbenchArea, RegisteredPlaceholderContribution>>;
1669
+ }
1670
+
1671
+ declare type WorkbenchModeActivationContext = WorkbenchCoreContributionContext;
1672
+
1673
+ declare type WorkbenchModeActivationResult = Disposable_2 | readonly Disposable_2[] | undefined;
1674
+
1675
+ declare type WorkbenchModeChangeListener = () => void;
1676
+
1677
+ declare interface WorkbenchModeContribution {
1678
+ id: string;
1679
+ label?: string;
1680
+ activate(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1681
+ }
1682
+
1683
+ declare interface WorkbenchModeRegistry {
1684
+ store: WorkbenchStore<WorkbenchModeStoreState>;
1685
+ registerMode(mode: WorkbenchModeContribution): Disposable_2;
1686
+ getMode(id: string): WorkbenchModeContribution | undefined;
1687
+ listModes(): WorkbenchModeContribution[];
1688
+ getActiveModeId(): string | undefined;
1689
+ setActiveMode(id: string | undefined): void;
1690
+ onDidChangeActive(listener: WorkbenchModeChangeListener): Disposable_2;
1691
+ }
1692
+
1693
+ declare interface WorkbenchModeStoreState {
1694
+ modes: Record<string, WorkbenchModeContribution>;
1695
+ activeModeId: string | undefined;
1696
+ }
1697
+
1698
+ declare type WorkbenchModuleActivationResult = Disposable_2 | readonly Disposable_2[] | undefined;
1699
+
1700
+ declare interface WorkbenchModuleContribution {
1701
+ id: string;
1702
+ source?: ContributionSource;
1703
+ ownerId?: string;
1704
+ activate(ctx: WorkbenchModuleContributionContext): WorkbenchModuleActivationResult;
1705
+ }
1706
+
1707
+ declare type WorkbenchModuleContributionContext = WorkbenchCoreContributionContext;
1708
+
1709
+ declare interface WorkbenchNotification {
1710
+ id?: string;
1711
+ level: WorkbenchNotificationLevel;
1712
+ title: string;
1713
+ message?: string;
1714
+ createdAt?: string;
1715
+ resource?: ResourceRef;
1716
+ actions?: WorkbenchNotificationAction[];
1717
+ metadata?: Record<string, unknown>;
1718
+ }
1719
+
1720
+ declare interface WorkbenchNotificationAction {
1721
+ commandId: string;
1722
+ title: string;
1723
+ args?: unknown;
1724
+ }
1725
+
1726
+ declare interface WorkbenchNotificationAction_2 {
1727
+ commandId: string;
1728
+ title: string;
1729
+ args?: unknown;
1730
+ }
1731
+
1732
+ declare type WorkbenchNotificationEvent = {
1733
+ type: "show";
1734
+ id: string;
1735
+ notification: RegisteredWorkbenchNotification;
1736
+ } | {
1737
+ type: "dismiss";
1738
+ id: string;
1739
+ };
1740
+
1741
+ declare type WorkbenchNotificationLevel = "info" | "success" | "warning" | "error";
1742
+
1743
+ declare type WorkbenchNotificationLevel_2 = "info" | "success" | "warning" | "error";
1744
+
1745
+ declare type WorkbenchNotificationListener = (event: WorkbenchNotificationEvent) => void;
1746
+
1747
+ declare interface WorkbenchNotificationStoreState {
1748
+ notifications: Record<string, RegisteredWorkbenchNotification>;
1749
+ }
1750
+
1751
+ declare type WorkbenchPanelsChangeListener = (state: WorkbenchPanelsState) => void;
1752
+
1753
+ declare interface WorkbenchPanelsController {
1754
+ store: WorkbenchStore<WorkbenchPanelsState>;
1755
+ isOpen(areaId: string): boolean;
1756
+ setOpen(areaId: string, open: boolean): void;
1757
+ toggle(areaId: string): void;
1758
+ onDidChange(listener: WorkbenchPanelsChangeListener): Disposable_2;
1759
+ }
1760
+
1761
+ declare interface WorkbenchPanelsState {
1762
+ openByAreaId: Record<string, boolean>;
1763
+ }
1764
+
1765
+ declare type WorkbenchRendererChangeListener = () => void;
1766
+
1767
+ declare type WorkbenchRendererRegistration = {
1768
+ id: string;
1769
+ keepAlive?: false;
1770
+ render: (input: WorkbenchWidgetRenderInput) => unknown;
1771
+ } | {
1772
+ id: string;
1773
+ keepAlive: true;
1774
+ render: () => unknown;
1775
+ };
1776
+
1777
+ declare interface WorkbenchRendererRegistry {
1778
+ store: WorkbenchStore<WorkbenchRendererStoreState>;
1779
+ registerRenderer(renderer: WorkbenchRendererRegistration): Disposable_2;
1780
+ getRenderer(id: string): WorkbenchRendererRegistration | undefined;
1781
+ listRenderers(): WorkbenchRendererRegistration[];
1782
+ onDidChange(listener: WorkbenchRendererChangeListener): Disposable_2;
1783
+ claim(rendererId: string, slot: HTMLElement, input: WorkbenchWidgetRenderInput): Disposable_2;
1784
+ getHost(rendererId: string): HTMLElement | undefined;
1785
+ getClaim(rendererId: string): WorkbenchWidgetRenderInput | undefined;
1786
+ }
1787
+
1788
+ declare type WorkbenchRenderers = WorkbenchRendererRegistry & TreeRendererRegistry & DataRendererRegistry & FileRendererRegistry & ControlsRendererRegistry;
1789
+
1790
+ declare interface WorkbenchRendererStoreState {
1791
+ renderers: Record<string, WorkbenchRendererRegistration>;
1792
+ hosts: Record<string, RegisteredKeepAliveHost>;
1793
+ claims: Record<string, WorkbenchWidgetRenderInput>;
1794
+ }
1795
+
1796
+ declare type WorkbenchSessionPanelChangeListener = (mode: WorkbenchSessionPanelMode) => void;
1797
+
1798
+ declare interface WorkbenchSessionPanelController {
1799
+ store: WorkbenchStore<WorkbenchSessionPanelState>;
1800
+ getMode(): WorkbenchSessionPanelMode;
1801
+ setMode(mode: WorkbenchSessionPanelMode): void;
1802
+ onDidChange(listener: WorkbenchSessionPanelChangeListener): Disposable_2;
1803
+ }
1804
+
1805
+ declare type WorkbenchSessionPanelMode = "bubble" | "closed" | "attached";
1806
+
1807
+ declare interface WorkbenchSessionPanelState {
1808
+ mode: WorkbenchSessionPanelMode;
1809
+ }
1810
+
1811
+ declare interface WorkbenchStore<TState> {
1812
+ getState(): TState;
1813
+ getInitialState(): TState;
1814
+ subscribe(listener: WorkbenchStoreListener<TState>): () => void;
1815
+ subscribeSelector<TValue>(selector: WorkbenchStoreSelector<TState, TValue>, listener: WorkbenchStoreSelectorListener<TValue>, options?: {
1816
+ equalityFn?: (left: TValue, right: TValue) => boolean;
1817
+ fireImmediately?: boolean;
1818
+ }): () => void;
1819
+ }
1820
+
1821
+ declare type WorkbenchStoreListener<TState> = (state: TState, previousState: TState) => void;
1822
+
1823
+ declare type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;
1824
+
1825
+ declare type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;
1826
+
1827
+ declare interface WorkbenchTerminalController {
1828
+ store: WorkbenchStore<WorkbenchTerminalState>;
1829
+ /** True once the host injected a session opener. */
1830
+ isAvailable(): boolean;
1831
+ setSessionOpener(opener: WorkbenchTerminalSessionOpener | null): void;
1832
+ /** Opens a session; the live adapter stays host-side and only the id is returned. */
1833
+ open(input: {
1834
+ request: WorkbenchTerminalSessionRequest;
1835
+ title?: string;
1836
+ }): Promise<{
1837
+ sessionId: string;
1838
+ }>;
1839
+ write(input: {
1840
+ sessionId: string;
1841
+ data: string | Uint8Array;
1842
+ }): void;
1843
+ resize(input: {
1844
+ sessionId: string;
1845
+ cols: number;
1846
+ rows: number;
1847
+ }): void;
1848
+ kill(input: {
1849
+ sessionId: string;
1850
+ signal?: string;
1851
+ }): Promise<void>;
1852
+ subscribe(sessionId: string, sink: WorkbenchTerminalSessionSink): () => void;
1853
+ getSession(sessionId: string): WorkbenchTerminalSessionModel | undefined;
1854
+ listSessions(): WorkbenchTerminalSessionModel[];
1855
+ /** Kills every live session. Called when the owning workbench is torn down. */
1856
+ dispose(): Promise<void>;
1857
+ }
1858
+
1859
+ declare interface WorkbenchTerminalSessionAdapter {
1860
+ readonly id: string;
1861
+ write(data: string | Uint8Array): void;
1862
+ resize(cols: number, rows: number): void;
1863
+ kill(signal?: string): Promise<void> | void;
1864
+ onData(handler: (chunk: Uint8Array) => void): () => void;
1865
+ /** Foreground process name updates, when the opener can report them (real PTYs). */
1866
+ onTitle?(handler: (title: string) => void): () => void;
1867
+ onExit(handler: (exit: WorkbenchTerminalSessionExit) => void): () => void;
1868
+ onError(handler: (error: WorkbenchTerminalSessionError) => void): () => void;
1869
+ }
1870
+
1871
+ declare interface WorkbenchTerminalSessionError {
1872
+ message: string;
1873
+ }
1874
+
1875
+ declare interface WorkbenchTerminalSessionExit {
1876
+ code: number | null;
1877
+ signal: string | null;
1878
+ }
1879
+
1880
+ declare interface WorkbenchTerminalSessionModel {
1881
+ id: string;
1882
+ title: string;
1883
+ status: WorkbenchTerminalSessionStatus;
1884
+ exit?: WorkbenchTerminalSessionExit;
1885
+ }
1886
+
1887
+ declare type WorkbenchTerminalSessionOpener = (request: WorkbenchTerminalSessionRequest) => Promise<WorkbenchTerminalSessionAdapter>;
1888
+
1889
+ declare interface WorkbenchTerminalSessionRequest {
1890
+ command?: string[];
1891
+ cwd?: string;
1892
+ env?: Record<string, string>;
1893
+ cols: number;
1894
+ rows: number;
1895
+ }
1896
+
1897
+ declare interface WorkbenchTerminalSessionSink {
1898
+ onData?(chunk: Uint8Array): void;
1899
+ onExit?(exit: WorkbenchTerminalSessionExit): void;
1900
+ onError?(error: WorkbenchTerminalSessionError): void;
1901
+ }
1902
+
1903
+ declare type WorkbenchTerminalSessionStatus = "running" | "exited" | "killed";
1904
+
1905
+ declare interface WorkbenchTerminalState {
1906
+ sessionsById: Record<string, WorkbenchTerminalSessionModel>;
1907
+ }
1908
+
1909
+ declare interface WorkbenchThemeStoreState {
1910
+ themes: readonly ThemePreferenceOption[];
1911
+ }
1912
+
1913
+ declare interface WorkbenchWidgetPlacement {
1914
+ widgetId: string;
1915
+ contributionId: string;
1916
+ ownerId?: string;
1917
+ source?: ContributionSource;
1918
+ resource?: ResourceRef;
1919
+ resourceUri?: string;
1920
+ title?: string;
1921
+ pinned?: boolean;
1922
+ closable?: boolean;
1923
+ mountStrategy?: WidgetMountStrategy;
1924
+ hiddenByDefault?: boolean;
1925
+ }
1926
+
1927
+ declare interface WorkbenchWidgetRenderInput {
1928
+ workbench: WorkbenchCore;
1929
+ widget: RegisteredWidgetContribution | RegisteredPlaceholderContribution;
1930
+ placement: WorkbenchWidgetPlacement;
1931
+ refresh: () => void;
1932
+ }
1933
+
1934
+ export { }