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