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