@pstdio/workbench 0.5.0 → 0.7.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.
Files changed (33) hide show
  1. package/README.md +66 -72
  2. package/dist/composition-resolver-types-CWykPyEK.js +241 -0
  3. package/dist/composition-resolver-types-CWykPyEK.js.map +1 -0
  4. package/dist/extensions.d.ts +380 -29
  5. package/dist/extensions.js +1366 -883
  6. package/dist/extensions.js.map +1 -1
  7. package/dist/file-renderer-view-B6_iR4EN.js +496 -0
  8. package/dist/file-renderer-view-B6_iR4EN.js.map +1 -0
  9. package/dist/file-section-navigation-CfYqVObc.js +30 -0
  10. package/dist/file-section-navigation-CfYqVObc.js.map +1 -0
  11. package/dist/index.d.ts +305 -17
  12. package/dist/index.js +2343 -2083
  13. package/dist/index.js.map +1 -1
  14. package/dist/layout-types-DMoZz38-.js.map +1 -1
  15. package/dist/react.d.ts +190 -16
  16. package/dist/react.js +2473 -2374
  17. package/dist/react.js.map +1 -1
  18. package/dist/storage.js +132 -155
  19. package/dist/storage.js.map +1 -1
  20. package/dist/testing.d.ts +177 -14
  21. package/dist/webview-runtime.js +1 -1
  22. package/dist/webview-runtime.js.map +1 -1
  23. package/dist/workbench-built-ins-BncLJfQA.js +1175 -0
  24. package/dist/workbench-built-ins-BncLJfQA.js.map +1 -0
  25. package/dist/workbench-menu-paths-Bb0ICxeG.js +20 -0
  26. package/dist/workbench-menu-paths-Bb0ICxeG.js.map +1 -0
  27. package/package.json +4 -4
  28. package/dist/context-key-service-B2K9LAec.js +0 -1034
  29. package/dist/context-key-service-B2K9LAec.js.map +0 -1
  30. package/dist/file-renderer-view-DrrhYnb_.js +0 -171
  31. package/dist/file-renderer-view-DrrhYnb_.js.map +0 -1
  32. package/dist/workbench-menu-paths-B_QJzcNU.js +0 -12
  33. package/dist/workbench-menu-paths-B_QJzcNU.js.map +0 -1
package/dist/testing.d.ts CHANGED
@@ -91,6 +91,7 @@ declare interface Command {
91
91
  }
92
92
 
93
93
  declare interface CommandHandler<TArgs = unknown, TResult = unknown> {
94
+ prepareArgs?(args: TArgs, context?: WorkbenchCommandExecutionContext, onArgsChange?: (args: TArgs) => void): TArgs | Promise<TArgs>;
94
95
  execute(args: TArgs, context?: WorkbenchCommandExecutionContext): TResult | Promise<TResult>;
95
96
  isEnabled?(args: TArgs): boolean;
96
97
  isVisible?(args: TArgs): boolean;
@@ -147,6 +148,8 @@ declare interface CommandParamDescriptor {
147
148
  options?: CommandParamOption[];
148
149
  templateType?: string;
149
150
  resourceType?: string;
151
+ accept?: string;
152
+ multiple?: boolean;
150
153
  metadata?: Record<string, unknown>;
151
154
  }
152
155
 
@@ -166,6 +169,7 @@ declare interface CommandRegistry {
166
169
  isCommandEnabled(id: string, args?: unknown): boolean;
167
170
  isCommandVisible(id: string, args?: unknown): boolean;
168
171
  isCommandToggled(id: string, args?: unknown): boolean;
172
+ prepareCommandArgs(id: string, args: unknown, context?: WorkbenchCommandExecutionContext, onArgsChange?: (args: unknown) => void): Promise<unknown>;
169
173
  executeCommand(id: string, args?: unknown, context?: WorkbenchCommandExecutionContext): Promise<unknown>;
170
174
  onDidExecuteError(listener: WorkbenchCommandExecutionErrorListener): Disposable_2;
171
175
  }
@@ -343,7 +347,7 @@ declare interface DataTableRendererContribution {
343
347
  emptyDescription?: string;
344
348
  executeQuery(context: DataTableRendererQueryContext): Promise<DataTableRendererQueryResult> | DataTableRendererQueryResult;
345
349
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
346
- onRowClick?: (row: DataTableRendererRow) => void;
350
+ onRowActivate?: (row: DataTableRendererRow) => Promise<void> | void;
347
351
  }
348
352
 
349
353
  declare type DataTableRendererImplementation = (input: WorkbenchPanelRenderInput & {
@@ -470,10 +474,23 @@ declare interface FileIconThemeRegistry {
470
474
 
471
475
  declare interface FileRendererContent {
472
476
  fileName?: string;
477
+ /** Workspace-relative path shown above the file preview. */
478
+ filePath?: string;
473
479
  mimeType?: string;
474
480
  content?: string;
475
481
  dataUrl?: string;
476
482
  placeholder?: string;
483
+ /** Override contribution-level save support for one loaded file. */
484
+ editable?: boolean;
485
+ /** Request Monaco for text that automatic dispatch would open as markdown. */
486
+ textRenderer?: "automatic" | "monaco";
487
+ /** Represent a deliberate no-file selection without an editable blank document. */
488
+ emptyState?: {
489
+ title: string;
490
+ description?: string;
491
+ };
492
+ /** Ordered backing-store revision when one is available. */
493
+ revision?: string;
477
494
  }
478
495
 
479
496
  declare interface FileRendererContribution {
@@ -483,35 +500,53 @@ declare interface FileRendererContribution {
483
500
  /** Resolve the file's content (and identity) for the bound resource. */
484
501
  load(resource: ResourceRef | undefined): Promise<FileRendererContent> | FileRendererContent;
485
502
  /** Persist edited text. Absent ⇒ read-only. Never called for images. */
486
- save?(resource: ResourceRef | undefined, content: string): Promise<void> | void;
503
+ save?(resource: ResourceRef | undefined, content: string, origin?: FileRendererRefreshOrigin): Promise<FileRendererSaveResult | undefined> | FileRendererSaveResult | void;
487
504
  }
488
505
 
489
506
  declare type FileRendererImplementation = (input: WorkbenchPanelRenderInput & {
490
507
  fileRendererId: string;
491
508
  }) => unknown;
492
509
 
493
- declare interface FileRendererRefreshEvent {
510
+ declare interface FileRendererRefreshEnvelope {
511
+ resourceUri?: string;
512
+ origin?: FileRendererRefreshOrigin;
513
+ revision?: string;
514
+ }
515
+
516
+ declare interface FileRendererRefreshEvent extends FileRendererRefreshEnvelope {
494
517
  fileRendererId: string;
495
518
  }
496
519
 
497
520
  declare type FileRendererRefreshListener = (event: FileRendererRefreshEvent) => void;
498
521
 
522
+ declare interface FileRendererRefreshOrigin {
523
+ rendererId: string;
524
+ instanceId: string;
525
+ operationId: string;
526
+ }
527
+
499
528
  declare interface FileRendererRegistry {
500
529
  fileRendererStore: WorkbenchStore<FileRendererStoreState>;
501
530
  registerFileRenderer(contribution: FileRendererContribution, metadata?: ContributionMetadata): Disposable_2;
502
531
  setFileRendererImplementation(impl: FileRendererImplementation): void;
503
532
  getFileRenderer(id: string): RegisteredFileRendererContribution | undefined;
504
533
  listFileRenderers(): RegisteredFileRendererContribution[];
505
- refreshFileRenderer(id: string): void;
534
+ refreshFileRenderer(id: string, event?: FileRendererRefreshEnvelope): void;
506
535
  onDidRefreshFileRenderer(listener: FileRendererRefreshListener): Disposable_2;
507
536
  }
508
537
 
538
+ declare interface FileRendererSaveResult {
539
+ revision?: string;
540
+ }
541
+
509
542
  declare interface FileRendererStoreState {
510
543
  renderers: Record<string, RegisteredFileRendererContribution>;
511
544
  }
512
545
 
513
546
  declare interface HistoryController {
514
547
  store: WorkbenchStore<HistoryStoreState>;
548
+ /** Snapshot the history for a compound navigation; the returned function restores it. */
549
+ createCheckpoint(): () => void;
515
550
  goBack(): HistoryEntry | undefined;
516
551
  goForward(): HistoryEntry | undefined;
517
552
  goPrevious(): HistoryEntry | undefined;
@@ -537,6 +572,8 @@ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = Ka
537
572
  id: string;
538
573
  title: string;
539
574
  resourceKind?: string;
575
+ /** Host-owned scope for persisted display settings. */
576
+ storageScope?: string;
540
577
  /**
541
578
  * Declarative attribute schema. The renderer dispatches filter / group /
542
579
  * sort / display / inline-edit behavior on each descriptor's `type.kind`.
@@ -564,8 +601,8 @@ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = Ka
564
601
  */
565
602
  executeQuery(state: KanbanRendererQueryState): Promise<TRow[]> | TRow[];
566
603
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
567
- /** Row interactions surfaced by the renderer (mirrored from <KanbanRenderer>). */
568
- onRowClick?: (row: TRow) => void;
604
+ /** Row activation surfaced by the renderer (mirrored from <KanbanRenderer>). */
605
+ onRowActivate?: (row: TRow) => Promise<void> | void;
569
606
  /** Per-row right-click context menu actions (mirrored from <KanbanRenderer>). */
570
607
  getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];
571
608
  /**
@@ -659,7 +696,7 @@ declare interface KanbanRendererRow {
659
696
  title: string;
660
697
  /**
661
698
  * Optional navigation handle. When set, the renderer's default click handler
662
- * routes through the contribution's onRowClick (which typically opens the
699
+ * routes through the contribution's onRowActivate (which typically opens the
663
700
  * resource via the workbench).
664
701
  */
665
702
  resource?: unknown;
@@ -764,6 +801,16 @@ declare interface LayoutModel {
764
801
  carryRegionState?: readonly WorkbenchRegion[];
765
802
  }): void;
766
803
  getPersistenceScope(): LayoutScope | undefined;
804
+ /** True when the current persistence scope already stores a layout. A new scope returns false. */
805
+ /** Whether anything is stored for the active scope right now. */
806
+ hasPersistedLayout(): boolean;
807
+ /**
808
+ * Whether the active scope was entered with a layout the user already had. Unlike
809
+ * `hasPersistedLayout`, writes made while entering a mode do not change the answer.
810
+ */
811
+ enteredWithPersistedLayout(): boolean;
812
+ /** Moves owned panel menus beside their owner's current region and removes orphan menus. */
813
+ reconcilePanelMenus(): void;
767
814
  onWillChangePersistenceScope(listener: (scope: LayoutScope | undefined) => void): {
768
815
  dispose(): void;
769
816
  };
@@ -876,6 +923,7 @@ declare interface OpenWidgetInput {
876
923
  resource?: ResourceRef;
877
924
  title?: string;
878
925
  region?: WorkbenchRegion;
926
+ role?: WorkbenchWidgetRole;
879
927
  ownerId?: string;
880
928
  source?: ContributionSource;
881
929
  pinned?: boolean;
@@ -893,7 +941,9 @@ declare interface OpenWorkbenchPanelInput {
893
941
  resource?: ResourceRef;
894
942
  title?: string;
895
943
  region?: WorkbenchRegion;
944
+ role?: WorkbenchWidgetRole;
896
945
  pinned?: boolean;
946
+ closable?: boolean;
897
947
  mountStrategy?: WorkbenchPanelMountStrategy;
898
948
  hiddenByDefault?: boolean;
899
949
  tab?: WorkbenchPanelTab;
@@ -1007,7 +1057,6 @@ declare type RegisteredWidgetContribution = Omit<WidgetContribution, "priority"
1007
1057
  ownedPanelMenuIds?: readonly string[];
1008
1058
  singleton: boolean;
1009
1059
  reuse: WidgetReusePolicy;
1010
- role: WorkbenchWidgetRole;
1011
1060
  } & RegisteredContributionMetadata;
1012
1061
 
1013
1062
  declare interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {
@@ -1023,7 +1072,9 @@ declare interface RegisteredWorkbenchNotification extends RegisteredContribution
1023
1072
 
1024
1073
  declare type ResolvedResourceHierarchyProvider = Required<ResourceHierarchyProvider>;
1025
1074
 
1026
- declare type ResolvedResourcePresenter = Required<ResourcePresenter>;
1075
+ declare type ResolvedResourcePresenter = Omit<ResourcePresenter, "priority"> & {
1076
+ priority: number;
1077
+ };
1027
1078
 
1028
1079
  declare interface ResourceBrowseEntry {
1029
1080
  resource: ResourceRef;
@@ -1045,6 +1096,14 @@ declare interface ResourceContextAction {
1045
1096
  separatorBefore?: boolean;
1046
1097
  }
1047
1098
 
1099
+ declare interface ResourceHierarchyCycle {
1100
+ code: typeof resourceHierarchyCycleCode;
1101
+ path: ResourceRef[];
1102
+ repeatedUri: string;
1103
+ }
1104
+
1105
+ declare const resourceHierarchyCycleCode = "resource_hierarchy_cycle";
1106
+
1048
1107
  declare interface ResourceHierarchyProvider {
1049
1108
  id: string;
1050
1109
  priority?: number;
@@ -1077,6 +1136,7 @@ declare interface ResourcePresenter {
1077
1136
  priority?: number;
1078
1137
  canOpen(resource: ResourceRef): boolean;
1079
1138
  open(resource: ResourceRef, input: OpenResourceInput): WorkbenchPanelInstance | Promise<WorkbenchPanelInstance>;
1139
+ afterOpen?(resource: ResourceRef, instance: WorkbenchPanelInstance, input: OpenResourceInput): void;
1080
1140
  }
1081
1141
 
1082
1142
  declare interface ResourceProvider {
@@ -1117,6 +1177,7 @@ declare interface ResourceRegistry {
1117
1177
  registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable_2;
1118
1178
  listHierarchyProviders(): ResolvedResourceHierarchyProvider[];
1119
1179
  walkHierarchy(resource: ResourceRef | undefined): ResourceRef[];
1180
+ onDidDetectHierarchyCycle(listener: (cycle: ResourceHierarchyCycle) => void): Disposable_2;
1120
1181
  isOpeningResource(): boolean;
1121
1182
  openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<WorkbenchPanelInstance>;
1122
1183
  onDidOpenResource(listener: (resource: ResourceRef) => void): Disposable_2;
@@ -1281,11 +1342,13 @@ declare interface TreeNode {
1281
1342
  target?: NavigationTarget;
1282
1343
  /** Visual row variant for non-data rows such as placeholders. */
1283
1344
  rowVariant?: TreeNodeRowVariant;
1345
+ inlineInput?: TreeNodeInlineInput;
1284
1346
  actions?: TreeAction[];
1285
1347
  contextMenuActions?: TreeAction[];
1286
1348
  contextMenuPath?: MenuPath;
1287
1349
  menuPath?: MenuPath;
1288
1350
  menuPlacement?: "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "left-start";
1351
+ showContextMenuTrigger?: boolean;
1289
1352
  collapsible?: boolean;
1290
1353
  disabled?: boolean;
1291
1354
  children?: TreeNode[];
@@ -1296,6 +1359,18 @@ declare interface TreeNode {
1296
1359
  canHide?: boolean;
1297
1360
  /** When false, the node stays fixed within its Sidenav group. */
1298
1361
  canReorder?: boolean;
1362
+ /** Allow this node to be moved to another tree location. */
1363
+ canDrag?: boolean;
1364
+ /** Allow movable nodes to be dropped on this node. */
1365
+ canDrop?: boolean;
1366
+ }
1367
+
1368
+ declare interface TreeNodeInlineInput {
1369
+ ariaLabel: string;
1370
+ defaultValue?: string;
1371
+ placeholder?: string;
1372
+ onCommit(value: string): Promise<void> | void;
1373
+ onCancel?(): void;
1299
1374
  }
1300
1375
 
1301
1376
  declare type TreeNodeRowVariant = "empty-state";
@@ -1304,6 +1379,8 @@ declare interface TreeRendererContribution {
1304
1379
  id: string;
1305
1380
  title: string;
1306
1381
  icon?: string;
1382
+ searchable?: boolean;
1383
+ searchPlaceholder?: string;
1307
1384
  when?: string;
1308
1385
  defaultExpandedSectionIds?: string[];
1309
1386
  defaultExpandedNodeIds?: string[];
@@ -1311,6 +1388,7 @@ declare interface TreeRendererContribution {
1311
1388
  getHeader?(ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1312
1389
  getFooter?(ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1313
1390
  getChildren(node: TreeNode, ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1391
+ moveNode?(source: TreeNode, target: TreeNode | undefined, ctx: TreeContext): Promise<void> | void;
1314
1392
  }
1315
1393
 
1316
1394
  declare type TreeRendererImplementation = (input: WorkbenchPanelRenderInput & {
@@ -1405,7 +1483,6 @@ declare interface WidgetContribution {
1405
1483
  priority?: number;
1406
1484
  rendererId: string;
1407
1485
  openCommandId?: string;
1408
- role?: WorkbenchWidgetRole;
1409
1486
  eligibleLocations?: WorkbenchLocationEligibility;
1410
1487
  panelMenuOwner?: WorkbenchPanelMenuOwner;
1411
1488
  tab?: WorkbenchWidgetTab;
@@ -1505,6 +1582,20 @@ declare interface WorkbenchCommandParamsRequest {
1505
1582
  context?: WorkbenchCommandExecutionContext;
1506
1583
  }
1507
1584
 
1585
+ declare interface WorkbenchCompositionAddablePanel extends WorkbenchModeAddablePanel {
1586
+ contribution: RegisteredWidgetContribution;
1587
+ }
1588
+
1589
+ declare interface WorkbenchCompositionController {
1590
+ panelsFor(region: WorkbenchPanelRegion): WorkbenchCompositionRegionPanels;
1591
+ }
1592
+
1593
+ declare interface WorkbenchCompositionRegionPanels {
1594
+ open: readonly WorkbenchWidgetPlacement[];
1595
+ addable: readonly WorkbenchCompositionAddablePanel[];
1596
+ closable: readonly string[];
1597
+ }
1598
+
1508
1599
  declare interface WorkbenchCore extends WorkbenchCoreContributionContext {
1509
1600
  host: WorkbenchHost;
1510
1601
  registerModule(module: WorkbenchModuleContribution): Disposable_2;
@@ -1516,6 +1607,7 @@ declare interface WorkbenchCoreContributionContext {
1516
1607
  commandPalette: WorkbenchCommandPaletteController;
1517
1608
  commandPaletteResources: CommandPaletteResourceRegistry;
1518
1609
  commands: CommandRegistry;
1610
+ composition: WorkbenchCompositionController;
1519
1611
  context: ContextKeyService;
1520
1612
  focus: WorkbenchFocusController;
1521
1613
  history: HistoryController;
@@ -1524,6 +1616,7 @@ declare interface WorkbenchCoreContributionContext {
1524
1616
  layout: WorkbenchLayoutModel;
1525
1617
  modes: WorkbenchModeRegistry;
1526
1618
  navigation: NavigationRegistry;
1619
+ navigator: WorkbenchNavigator;
1527
1620
  notifications: NotificationRegistry;
1528
1621
  panels: WorkbenchPanelsController;
1529
1622
  preferences: PreferenceRegistry;
@@ -1596,7 +1689,7 @@ declare interface WorkbenchLayoutStoreState {
1596
1689
  placeholders: Partial<Record<WorkbenchRegion, RegisteredPlaceholderContribution>>;
1597
1690
  }
1598
1691
 
1599
- declare type WorkbenchLocationContribution = Omit<WidgetContribution, "role"> & WorkbenchPanelMenusContribution;
1692
+ declare type WorkbenchLocationContribution = WidgetContribution & WorkbenchPanelMenusContribution;
1600
1693
 
1601
1694
  declare interface WorkbenchLocationEligibility {
1602
1695
  modeIds?: string[];
@@ -1618,15 +1711,31 @@ declare type WorkbenchModeActivationContext = WorkbenchCoreContributionContext;
1618
1711
 
1619
1712
  declare type WorkbenchModeActivationResult = Disposable_2 | readonly Disposable_2[] | undefined;
1620
1713
 
1714
+ declare interface WorkbenchModeAddablePanel {
1715
+ panelId: string;
1716
+ region: WorkbenchPanelRegion;
1717
+ allowedRegions?: readonly WorkbenchRegion[];
1718
+ pinned?: boolean;
1719
+ }
1720
+
1721
+ declare interface WorkbenchModeAddablePanelContext {
1722
+ layout: WorkbenchLayout;
1723
+ resource?: ResourceRef;
1724
+ }
1725
+
1621
1726
  declare type WorkbenchModeChangeListener = () => void;
1622
1727
 
1623
1728
  declare interface WorkbenchModeContribution {
1624
1729
  id: string;
1625
1730
  label?: string;
1626
1731
  panels?: readonly WorkbenchPanelRegion[];
1732
+ resourceKinds?: readonly string[];
1733
+ defaultResource?: ResourceRef | (() => Promise<ResourceRef | undefined> | ResourceRef | undefined);
1734
+ listAddablePanels?(context: WorkbenchModeAddablePanelContext): readonly WorkbenchModeAddablePanel[];
1627
1735
  activate(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1628
1736
  seed?(ctx: WorkbenchModeActivationContext): void;
1629
1737
  enter?(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1738
+ reconcile?(ctx: WorkbenchModeActivationContext): void;
1630
1739
  }
1631
1740
 
1632
1741
  declare interface WorkbenchModeRegistry {
@@ -1662,6 +1771,14 @@ declare interface WorkbenchModuleContribution {
1662
1771
 
1663
1772
  declare type WorkbenchModuleContributionContext = WorkbenchModuleContext;
1664
1773
 
1774
+ declare interface WorkbenchNavigationCommit {
1775
+ modeId: string | undefined;
1776
+ resource: ResourceRef | undefined;
1777
+ replaceActive: boolean;
1778
+ }
1779
+
1780
+ declare type WorkbenchNavigationDiagnosticCode = "navigation_mode_missing" | "navigation_resource_missing" | "navigation_resource_incompatible" | "navigation_default_missing" | "navigation_target_stale";
1781
+
1665
1782
  declare interface WorkbenchNavigationEntry {
1666
1783
  entryId: string;
1667
1784
  recordedAt: number;
@@ -1676,6 +1793,53 @@ declare interface WorkbenchNavigationEntry {
1676
1793
  closedSubPanel?: WorkbenchClosedSubPanel;
1677
1794
  }
1678
1795
 
1796
+ declare type WorkbenchNavigationResult = {
1797
+ ok: true;
1798
+ modeId: string | undefined;
1799
+ resource: ResourceRef | undefined;
1800
+ } | {
1801
+ ok: false;
1802
+ code: WorkbenchNavigationDiagnosticCode;
1803
+ message: string;
1804
+ };
1805
+
1806
+ declare interface WorkbenchNavigationTarget {
1807
+ modeId?: string;
1808
+ resource?: ResourceRef;
1809
+ replaceActive?: boolean;
1810
+ }
1811
+
1812
+ declare interface WorkbenchNavigator {
1813
+ configure(hooks: WorkbenchNavigatorHostHooks): void;
1814
+ getSelectedResource(): ResourceRef | undefined;
1815
+ open(target: WorkbenchNavigationTarget): Promise<WorkbenchNavigationResult>;
1816
+ commitContext(input: WorkbenchNavigatorCommitInput): WorkbenchNavigationResult;
1817
+ getLastResource(projectId: string | undefined, modeId: string): ResourceRef | undefined;
1818
+ forgetResource(uri: string): void;
1819
+ onDidCommit(listener: (commit: WorkbenchNavigationCommit) => void): {
1820
+ dispose(): void;
1821
+ };
1822
+ }
1823
+
1824
+ declare interface WorkbenchNavigatorCommitInput {
1825
+ modeId?: string | null;
1826
+ resource?: ResourceRef | null;
1827
+ replaceActive?: boolean;
1828
+ present?: boolean;
1829
+ }
1830
+
1831
+ declare interface WorkbenchNavigatorHostHooks {
1832
+ getProjectId?(): string | undefined;
1833
+ getSelectedResource?(): ResourceRef | undefined;
1834
+ interpretSelection?(resource: ResourceRef): ResourceRef | undefined;
1835
+ applySelection?(resource: ResourceRef | undefined): void;
1836
+ applyScope?(commit: WorkbenchNavigationCommit): void;
1837
+ applyBreadcrumb?(resource: ResourceRef | undefined): void;
1838
+ presentResource?(resource: ResourceRef, input: {
1839
+ replaceActive: boolean;
1840
+ }): Promise<unknown> | unknown;
1841
+ }
1842
+
1679
1843
  declare interface WorkbenchNotification {
1680
1844
  id?: string;
1681
1845
  level: WorkbenchNotificationLevel;
@@ -1717,7 +1881,6 @@ declare interface WorkbenchPanelContribution {
1717
1881
  region: WorkbenchRegion;
1718
1882
  fallbackRegion?: WorkbenchRegion;
1719
1883
  rendererId: string;
1720
- closable: boolean;
1721
1884
  singleton?: boolean;
1722
1885
  reuse?: WorkbenchPanelReusePolicy;
1723
1886
  mountStrategy?: WorkbenchPanelMountStrategy;
@@ -1773,7 +1936,7 @@ declare interface WorkbenchPanelInstance_2 {
1773
1936
  tab?: WorkbenchPanelTab_2;
1774
1937
  }
1775
1938
 
1776
- declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
1939
+ declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
1777
1940
  region: WorkbenchPanelMenuRegion;
1778
1941
  fallbackRegion?: WorkbenchPanelMenuRegion;
1779
1942
  };
@@ -1979,7 +2142,7 @@ declare type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;
1979
2142
 
1980
2143
  declare type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;
1981
2144
 
1982
- declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
2145
+ declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
1983
2146
  region: WorkbenchPanelRegion;
1984
2147
  fallbackRegion?: WorkbenchPanelRegion;
1985
2148
  } & WorkbenchPanelMenusContribution;
@@ -1,4 +1,4 @@
1
- const r = '// Generated by packages/pstdio-extensions/scripts/build-runtime.ts\nfunction d(){let P=globalThis;if(P.window!==void 0&&P.document!==void 0)return"browser";if(P.WorkerGlobalScope!==void 0&&P.self!==void 0&&P.self instanceof P.WorkerGlobalScope||P.window===void 0&&P.self!==void 0&&typeof P.importScripts=="function")return"worker";let G=P.process;if(G&&typeof G=="object"){let R=G.versions??{},J=G.release?.name;if(R.bun||J==="bun"||P.Bun!==void 0)return"bun";if(R.node&&J==="node")return"node"}return P.Bun===void 0?"browser":"bun"}function V(){return d()}function b(){return V()==="worker"}function x(){let P=V();return P==="node"||P==="bun"}function u(){return window.self!==window.top}function p(P){let G={};return function R(J,X=""){Object.keys(J).forEach((Q)=>{let K=X?`${X}.${Q}`:Q;J[Q]===Object(J[Q])&&R(J[Q],K),typeof J[Q]=="function"&&(G[K]=J[Q],delete J[Q])})}(P),G}function i(P){return!P||P==="null"?"*":P}function l(P,G,R){if(!P||typeof P!="object")return P;let J=Array.isArray(G)?G:G.split(".").map((Q)=>Q.match(/^\\d+$/)?Number(Q):Q),X=P;for(let Q=0;Q<J.length;Q++){let K=J[Q];Q===J.length-1?X[K]=R:((!X[K]||typeof X[K]!="object")&&(X[K]=typeof J[Q+1]=="number"?[]:{}),X=X[K])}return P}function r(P=10){let G="";for(let R=0;R<P;R++)G+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(Math.random()*62));return G}var E=V(),_=null;if(E==="node"||E==="bun")try{let P=globalThis.require;_=P?.("node:worker_threads")?.parentPort??null}catch{}function s(){if(x())return _;if(b())return self;if(u())return window.parent;throw Error("No valid target found for postMessage")}function D(P,G,R,J){if(!P)throw Error("Rimless Error: No target specified for postMessage");if(x()&&P===_){P.postMessage(G,{transfer:J});return}if(b()){P.postMessage(G,{transfer:J});return}if(P.postMessage){P.postMessage(G,{targetOrigin:i(R),transfer:J});return}throw Error("Rimless Error: Invalid target for postMessage")}function S(P){return _!==null&&P===_}function j(P,G,R){S(P)?P.on(G,R):("addEventListener"in P)&&P.addEventListener(G,R)}function H(P,G,R){S(P)?P.off(G,R):("removeEventListener"in P)&&P.removeEventListener(G,R)}function w(P){return P.data||P}var N=function(P){return P.MESSAGE="message",P}({}),M=function(P){return P.HANDSHAKE_REQUEST="RIMLESS/HANDSHAKE_REQUEST",P.HANDSHAKE_REPLY="RIMLESS/HANDSHAKE_REPLY",P.RPC_REQUEST="RIMLESS/RPC_REQUEST",P.RPC_RESOLVE="RIMLESS/RPC_RESOLVE",P.RPC_REJECT="RIMLESS/RPC_REJECT",P}({}),L=Symbol();function o(P={},G,R,J,X){let Q=[];for(let[K,Z]of Object.entries(P)){async function Y(B){let{action:O,callID:q,connectionID:$,callName:U,args:A=[]}=w(B);if(O!==M.RPC_REQUEST||!q||!U||U!==K||$!==G)return;let F={action:M.RPC_RESOLVE,callID:q,callName:U,connectionID:$,error:null,result:null},T;try{F.result=await Z(...A,X),F.result?.[L]&&(T=F.result[L]??[],delete F.result[L])}catch(C){F.action=M.RPC_REJECT,F.error=JSON.parse(JSON.stringify(C,Object.getOwnPropertyNames(C)))}D(J,F,B?.origin,T)}j(R,N.MESSAGE,Y),Q.push(()=>H(R,N.MESSAGE,Y))}return()=>Q.forEach((K)=>K())}function t(P,G,R,J=[],X,Q){return(...K)=>new Promise((Z,Y)=>{let B=r();function O(U){let{callID:A,connectionID:F,callName:T,result:C,error:v,action:I}=w(U);if(!(!A||!T)&&T===P&&A===B&&F===G){if(I===M.RPC_RESOLVE)return Z(C);if(I===M.RPC_REJECT)return Y(v)}}let q={action:M.RPC_REQUEST,args:K,callID:B,callName:P,connectionID:G},$=K.reduce((U,A)=>A[L]?.length?U.concat(A[L]):U,K[L]??[]);j(X,N.MESSAGE,O),J.push(()=>H(X,N.MESSAGE,O)),D(Q,q,R?.origin,$)})}function a(P={},G=[],R,J,X,Q){let K={...P},Z=[];for(let Y of G)l(K,Y,t(Y,R,J,Z,X,Q));return{remote:K,unregisterRemote:()=>Z.forEach((Y)=>Y())}}function n(P={},G){return new Promise(async(R)=>{let J=p(P),X=s(),Q=self||window;async function K(Z){let Y=w(Z);if(Y?.action!==M.HANDSHAKE_REPLY)return;let{remote:B,unregisterRemote:O}=a(Y.schema,Y.methodNames,Y.connectionID,Z,Q,X),q=o(J,Y.connectionID,Q,X,B);return await G?.onConnectionSetup?.(B),D(X,{action:M.HANDSHAKE_REPLY,connectionID:Y.connectionID},Z?.origin),R({remote:B,close:()=>{H(Q,N.MESSAGE,K),O(),q()},id:Y.connectionID})}j(Q,N.MESSAGE,K),D(X,{action:M.HANDSHAKE_REQUEST,methodNames:Object.keys(J),schema:P})})}var f={connect:n};var e=(P)=>typeof P==="object"&&P!==null,y=(P)=>{try{let G=JSON.stringify(P);if(typeof G==="string"&&G.length>0)return G}catch{}try{return String(P)}catch{return"Unknown error"}},k=(P)=>{if(P instanceof Error)return{message:P.message,stack:P.stack};if(typeof P==="string")return{message:P};if(e(P)){let G=typeof P.message==="string"?P.message:null,R=typeof P.stack==="string"?P.stack:void 0;if(G)return R?{message:G,stack:R}:{message:G};return{message:y(P)}}if(P===null||P===void 0)return{message:"Unknown error"};return{message:y(P)}};var z=(P)=>({id:P}),W=(P,G)=>({id:P,kind:G.kind,label:G.label,description:G.description,metadata:G.metadata}),zP={sidenav:W("project.sidenav",{kind:"panel"}),headerPrimary:W("project.headerPrimary",{kind:"menu"}),headerOverflow:W("project.headerOverflow",{kind:"menu"}),settingsPanels:W("project.settingsPanels",{kind:"settings"})},BP={headerPrimary:W("session.headerPrimary",{kind:"menu"}),headerOverflow:W("session.headerOverflow",{kind:"menu"}),transcriptActions:W("session.transcriptActions",{kind:"menu"})},WP={headerPrimary:W("workspace.headerPrimary",{kind:"menu"}),headerOverflow:W("workspace.headerOverflow",{kind:"menu"}),sidenav:W("workspace.sidenav",{kind:"panel"})},qP={opened:z("project.opened")},FP={started:z("session.started"),resumed:z("session.resumed"),awaitingInput:z("session.awaitingInput"),succeeded:z("session.succeeded"),failed:z("session.failed"),completed:z("session.completed")},MP={created:z("workspace.created"),provision:z("workspace.provision"),ready:z("workspace.ready"),archived:z("workspace.archived"),deleted:z("workspace.deleted")},OP={removed:z("worktree.removed")},UP={committed:z("git.committed"),rebased:z("git.rebased"),merged:z("git.merged"),conflicted:z("git.conflicted")};var PP=["commands.execute","resource.open","notification.show","notification.action","notification.resolve","notification.dismiss","preferences.get","preferences.set","extension.settings.all","extension.settings.get","extension.settings.set","extension.settings.delete","terminal.session","files.upload","files.list","files.delete"],GP=["host.dispatchKeyboardEvent"],AP=[...PP,...GP];var c=(P,G)=>({call:async(R,J)=>await P({method:R,params:J}),onEvent:G}),h=(P)=>{let G=P,R=new Set;return{get:()=>G,subscribe:(J)=>{return R.add(J),()=>R.delete(J)},set:(J)=>{G=J;for(let X of R)X(G)}}};var g="pstdio-extension-mount",RP=()=>{let P=new Map;return{get length(){return P.size},clear:()=>P.clear(),getItem:(G)=>P.get(G)??null,key:(G)=>Array.from(P.keys())[G]??null,removeItem:(G)=>P.delete(G),setItem:(G,R)=>P.set(G,R)}},JP=()=>{for(let P of["localStorage","sessionStorage"])try{window[P]}catch{Object.defineProperty(window,P,{configurable:!0,value:RP()})}},m=(P,G)=>{let R=document.documentElement,J=P==="dark"?"light":"dark";R.classList.remove(J),R.classList.add(P),R.setAttribute("data-theme",P),R.style.colorScheme=P;for(let[X,Q]of Object.entries(G))if(X.startsWith("--"))R.style.setProperty(X,Q)},KP=(P)=>{for(let G of P){let R=document.createElement("link");R.rel="stylesheet",R.href=G,document.head.appendChild(R)}},QP=()=>{let P=document.getElementById(g);if(!P)P=document.createElement("div"),P.id=g,P.style.height="100%",P.style.width="100%",document.body.appendChild(P);return P},XP=(P)=>P instanceof HTMLInputElement||P instanceof HTMLTextAreaElement||P instanceof HTMLSelectElement||P instanceof HTMLElement&&P.isContentEditable,YP=async()=>{JP();let P=h(void 0),G=new Map,R=(K,Z)=>{let Y=G.get(K)??new Set;return Y.add(Z),G.set(K,Y),()=>{Y.delete(Z)}},J,X=!1,Q=await f.connect({init:async(K)=>{try{m(K.theme,K.themeVariables),KP(K.styles),P.set(K.props);let Z=QP(),Y=await import(K.moduleUrl),B=Y.default??(Y.mount?Y:void 0);if(!B?.mount)throw Error("Extension module does not export a default view (defineExtensionView).");let O=c(($)=>Q.remote.call($),R),q=await B.mount(Z,O,P);if(J=typeof q==="function"?q:void 0,!X)X=!0,document.addEventListener("keydown",($)=>{if(!$.ctrlKey&&!$.metaKey&&!$.altKey)return;if(XP($.target)&&!$.shiftKey)return;Q.remote.call({method:"host.dispatchKeyboardEvent",params:{key:$.key,code:$.code,ctrlKey:$.ctrlKey,metaKey:$.metaKey,altKey:$.altKey,shiftKey:$.shiftKey,repeat:$.repeat}}).catch(()=>{})},!0)}catch(Z){let Y=k(Z);throw Q.remote.runtimeError(Y),Z instanceof Error?Z:Error(Y.message)}},themeUpdate:(K)=>{m(K.theme,K.variables)},propsUpdate:(K)=>{P.set(K.props)},hostEvent:(K)=>{for(let Z of G.get(K.scope)??[])Z(K.payload)}});Q.remote.ready({}),window.addEventListener("beforeunload",()=>{J?.()})};YP();\n', t = "pstdio-extension-mount", o = (e) => e.replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("<", "&lt;"), i = (e) => e.replaceAll("<\/script", "<\\/script").replaceAll("<!--", "<\\!--"), n = (e) => `<!doctype html>
1
+ const r = '// Generated by packages/pstdio-extensions/scripts/build-runtime.ts\nfunction d(){let P=globalThis;if(P.window!==void 0&&P.document!==void 0)return"browser";if(P.WorkerGlobalScope!==void 0&&P.self!==void 0&&P.self instanceof P.WorkerGlobalScope||P.window===void 0&&P.self!==void 0&&typeof P.importScripts=="function")return"worker";let G=P.process;if(G&&typeof G=="object"){let R=G.versions??{},J=G.release?.name;if(R.bun||J==="bun"||P.Bun!==void 0)return"bun";if(R.node&&J==="node")return"node"}return P.Bun===void 0?"browser":"bun"}function V(){return d()}function b(){return V()==="worker"}function x(){let P=V();return P==="node"||P==="bun"}function u(){return window.self!==window.top}function p(P){let G={};return function R(J,X=""){Object.keys(J).forEach((Q)=>{let K=X?`${X}.${Q}`:Q;J[Q]===Object(J[Q])&&R(J[Q],K),typeof J[Q]=="function"&&(G[K]=J[Q],delete J[Q])})}(P),G}function i(P){return!P||P==="null"?"*":P}function l(P,G,R){if(!P||typeof P!="object")return P;let J=Array.isArray(G)?G:G.split(".").map((Q)=>Q.match(/^\\d+$/)?Number(Q):Q),X=P;for(let Q=0;Q<J.length;Q++){let K=J[Q];Q===J.length-1?X[K]=R:((!X[K]||typeof X[K]!="object")&&(X[K]=typeof J[Q+1]=="number"?[]:{}),X=X[K])}return P}function r(P=10){let G="";for(let R=0;R<P;R++)G+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(Math.random()*62));return G}var E=V(),_=null;if(E==="node"||E==="bun")try{let P=globalThis.require;_=P?.("node:worker_threads")?.parentPort??null}catch{}function s(){if(x())return _;if(b())return self;if(u())return window.parent;throw Error("No valid target found for postMessage")}function D(P,G,R,J){if(!P)throw Error("Rimless Error: No target specified for postMessage");if(x()&&P===_){P.postMessage(G,{transfer:J});return}if(b()){P.postMessage(G,{transfer:J});return}if(P.postMessage){P.postMessage(G,{targetOrigin:i(R),transfer:J});return}throw Error("Rimless Error: Invalid target for postMessage")}function S(P){return _!==null&&P===_}function j(P,G,R){S(P)?P.on(G,R):("addEventListener"in P)&&P.addEventListener(G,R)}function H(P,G,R){S(P)?P.off(G,R):("removeEventListener"in P)&&P.removeEventListener(G,R)}function w(P){return P.data||P}var L=function(P){return P.MESSAGE="message",P}({}),M=function(P){return P.HANDSHAKE_REQUEST="RIMLESS/HANDSHAKE_REQUEST",P.HANDSHAKE_REPLY="RIMLESS/HANDSHAKE_REPLY",P.RPC_REQUEST="RIMLESS/RPC_REQUEST",P.RPC_RESOLVE="RIMLESS/RPC_RESOLVE",P.RPC_REJECT="RIMLESS/RPC_REJECT",P}({}),A=Symbol();function o(P={},G,R,J,X){let Q=[];for(let[K,Z]of Object.entries(P)){async function Y(B){let{action:N,callID:q,connectionID:$,callName:O,args:U=[]}=w(B);if(N!==M.RPC_REQUEST||!q||!O||O!==K||$!==G)return;let F={action:M.RPC_RESOLVE,callID:q,callName:O,connectionID:$,error:null,result:null},T;try{F.result=await Z(...U,X),F.result?.[A]&&(T=F.result[A]??[],delete F.result[A])}catch(C){F.action=M.RPC_REJECT,F.error=JSON.parse(JSON.stringify(C,Object.getOwnPropertyNames(C)))}D(J,F,B?.origin,T)}j(R,L.MESSAGE,Y),Q.push(()=>H(R,L.MESSAGE,Y))}return()=>Q.forEach((K)=>K())}function t(P,G,R,J=[],X,Q){return(...K)=>new Promise((Z,Y)=>{let B=r();function N(O){let{callID:U,connectionID:F,callName:T,result:C,error:v,action:I}=w(O);if(!(!U||!T)&&T===P&&U===B&&F===G){if(I===M.RPC_RESOLVE)return Z(C);if(I===M.RPC_REJECT)return Y(v)}}let q={action:M.RPC_REQUEST,args:K,callID:B,callName:P,connectionID:G},$=K.reduce((O,U)=>U[A]?.length?O.concat(U[A]):O,K[A]??[]);j(X,L.MESSAGE,N),J.push(()=>H(X,L.MESSAGE,N)),D(Q,q,R?.origin,$)})}function a(P={},G=[],R,J,X,Q){let K={...P},Z=[];for(let Y of G)l(K,Y,t(Y,R,J,Z,X,Q));return{remote:K,unregisterRemote:()=>Z.forEach((Y)=>Y())}}function n(P={},G){return new Promise(async(R)=>{let J=p(P),X=s(),Q=self||window;async function K(Z){let Y=w(Z);if(Y?.action!==M.HANDSHAKE_REPLY)return;let{remote:B,unregisterRemote:N}=a(Y.schema,Y.methodNames,Y.connectionID,Z,Q,X),q=o(J,Y.connectionID,Q,X,B);return await G?.onConnectionSetup?.(B),D(X,{action:M.HANDSHAKE_REPLY,connectionID:Y.connectionID},Z?.origin),R({remote:B,close:()=>{H(Q,L.MESSAGE,K),N(),q()},id:Y.connectionID})}j(Q,L.MESSAGE,K),D(X,{action:M.HANDSHAKE_REQUEST,methodNames:Object.keys(J),schema:P})})}var f={connect:n};var e=(P)=>typeof P==="object"&&P!==null,y=(P)=>{try{let G=JSON.stringify(P);if(typeof G==="string"&&G.length>0)return G}catch{}try{return String(P)}catch{return"Unknown error"}},k=(P)=>{if(P instanceof Error)return{message:P.message,stack:P.stack};if(typeof P==="string")return{message:P};if(e(P)){let G=typeof P.message==="string"?P.message:null,R=typeof P.stack==="string"?P.stack:void 0;if(G)return R?{message:G,stack:R}:{message:G};return{message:y(P)}}if(P===null||P===void 0)return{message:"Unknown error"};return{message:y(P)}};var z=(P)=>({id:P}),W=(P,G)=>({id:P,kind:G.kind,label:G.label,description:G.description,metadata:G.metadata}),zP={sidenav:W("project.sidenav",{kind:"panel"}),headerPrimary:W("project.headerPrimary",{kind:"menu"}),headerOverflow:W("project.headerOverflow",{kind:"menu"}),settingsPanels:W("project.settingsPanels",{kind:"settings"})},BP={headerPrimary:W("session.headerPrimary",{kind:"menu"}),headerOverflow:W("session.headerOverflow",{kind:"menu"}),transcriptActions:W("session.transcriptActions",{kind:"menu"})},WP={headerPrimary:W("workspace.headerPrimary",{kind:"menu"}),headerOverflow:W("workspace.headerOverflow",{kind:"menu"}),sidenav:W("workspace.sidenav",{kind:"panel"})},qP={opened:z("project.opened")},FP={started:z("session.started"),resumed:z("session.resumed"),awaitingInput:z("session.awaitingInput"),succeeded:z("session.succeeded"),failed:z("session.failed"),completed:z("session.completed")},MP={created:z("workspace.created"),provision:z("workspace.provision"),ready:z("workspace.ready"),archived:z("workspace.archived"),deleted:z("workspace.deleted")},NP={removed:z("worktree.removed")},OP={committed:z("git.committed"),rebased:z("git.rebased"),merged:z("git.merged"),conflicted:z("git.conflicted")};var PP=["commands.execute","resource.open","notification.show","notification.action","notification.resolve","notification.dismiss","preferences.get","preferences.set","extension.settings.all","extension.settings.get","extension.settings.set","extension.settings.delete","terminal.session","files.upload","files.list","files.delete"],GP=["host.dispatchKeyboardEvent"],UP=[...PP,...GP];var c=(P,G)=>({call:async(R,J)=>await P({method:R,params:J}),onEvent:G}),g=(P)=>{let G=P,R=new Set;return{get:()=>G,subscribe:(J)=>{return R.add(J),()=>R.delete(J)},set:(J)=>{G=J;for(let X of R)X(G)}}};var h="pstdio-extension-mount",RP=()=>{let P=new Map;return{get length(){return P.size},clear:()=>P.clear(),getItem:(G)=>P.get(G)??null,key:(G)=>Array.from(P.keys())[G]??null,removeItem:(G)=>P.delete(G),setItem:(G,R)=>P.set(G,R)}},JP=()=>{for(let P of["localStorage","sessionStorage"])try{window[P]}catch{Object.defineProperty(window,P,{configurable:!0,value:RP()})}},m=(P,G)=>{let R=document.documentElement,J=P==="dark"?"light":"dark";R.classList.remove(J),R.classList.add(P),R.setAttribute("data-theme",P),R.style.colorScheme=P;for(let[X,Q]of Object.entries(G))if(X.startsWith("--"))R.style.setProperty(X,Q)},KP=(P)=>{for(let G of P){let R=document.createElement("link");R.rel="stylesheet",R.href=G,document.head.appendChild(R)}},QP=()=>{let P=document.getElementById(h);if(!P)P=document.createElement("div"),P.id=h,P.style.height="100%",P.style.width="100%",document.body.appendChild(P);return P},XP=(P)=>P instanceof HTMLInputElement||P instanceof HTMLTextAreaElement||P instanceof HTMLSelectElement||P instanceof HTMLElement&&P.isContentEditable,YP=async()=>{JP();let P=g(void 0),G=new Map,R=(K,Z)=>{let Y=G.get(K)??new Set;return Y.add(Z),G.set(K,Y),()=>{Y.delete(Z)}},J,X=!1,Q=await f.connect({init:async(K)=>{try{m(K.theme,K.themeVariables),KP(K.styles),P.set(K.props);let Z=QP(),Y=await import(K.moduleUrl),B=Y.default??(Y.mount?Y:void 0);if(!B?.mount)throw Error("Extension module does not export a default view (defineExtensionView).");let N=c(($)=>Q.remote.call($),R),q=await B.mount(Z,N,P);if(J=typeof q==="function"?q:void 0,!X)X=!0,document.addEventListener("keydown",($)=>{if(!$.ctrlKey&&!$.metaKey&&!$.altKey)return;if(XP($.target)&&!$.shiftKey)return;Q.remote.call({method:"host.dispatchKeyboardEvent",params:{key:$.key,code:$.code,ctrlKey:$.ctrlKey,metaKey:$.metaKey,altKey:$.altKey,shiftKey:$.shiftKey,repeat:$.repeat}}).catch(()=>{})},!0)}catch(Z){let Y=k(Z);throw Q.remote.runtimeError(Y),Z instanceof Error?Z:Error(Y.message)}},themeUpdate:(K)=>{m(K.theme,K.variables)},propsUpdate:(K)=>{P.set(K.props)},hostEvent:(K)=>{for(let Z of G.get(K.scope)??[])Z(K.payload)}});Q.remote.ready({}),window.addEventListener("beforeunload",()=>{J?.()})};YP();\n', t = "pstdio-extension-mount", o = (e) => e.replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("<", "&lt;"), i = (e) => e.replaceAll("<\/script", "<\\/script").replaceAll("<!--", "<\\!--"), n = (e) => `<!doctype html>
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="utf-8" />
@@ -1 +1 @@
1
- {"version":3,"file":"webview-runtime.js","sources":["../../pstdio-extensions/src/bridge/webview-runtime/runtime.bundle.js?raw","../../pstdio-extensions/src/bridge/webview-runtime/runtime-html.ts","../src/webview-runtime/index.ts"],"sourcesContent":["export default \"// Generated by packages/pstdio-extensions/scripts/build-runtime.ts\\nfunction d(){let P=globalThis;if(P.window!==void 0&&P.document!==void 0)return\\\"browser\\\";if(P.WorkerGlobalScope!==void 0&&P.self!==void 0&&P.self instanceof P.WorkerGlobalScope||P.window===void 0&&P.self!==void 0&&typeof P.importScripts==\\\"function\\\")return\\\"worker\\\";let G=P.process;if(G&&typeof G==\\\"object\\\"){let R=G.versions??{},J=G.release?.name;if(R.bun||J===\\\"bun\\\"||P.Bun!==void 0)return\\\"bun\\\";if(R.node&&J===\\\"node\\\")return\\\"node\\\"}return P.Bun===void 0?\\\"browser\\\":\\\"bun\\\"}function V(){return d()}function b(){return V()===\\\"worker\\\"}function x(){let P=V();return P===\\\"node\\\"||P===\\\"bun\\\"}function u(){return window.self!==window.top}function p(P){let G={};return function R(J,X=\\\"\\\"){Object.keys(J).forEach((Q)=>{let K=X?`${X}.${Q}`:Q;J[Q]===Object(J[Q])&&R(J[Q],K),typeof J[Q]==\\\"function\\\"&&(G[K]=J[Q],delete J[Q])})}(P),G}function i(P){return!P||P===\\\"null\\\"?\\\"*\\\":P}function l(P,G,R){if(!P||typeof P!=\\\"object\\\")return P;let J=Array.isArray(G)?G:G.split(\\\".\\\").map((Q)=>Q.match(/^\\\\d+$/)?Number(Q):Q),X=P;for(let Q=0;Q<J.length;Q++){let K=J[Q];Q===J.length-1?X[K]=R:((!X[K]||typeof X[K]!=\\\"object\\\")&&(X[K]=typeof J[Q+1]==\\\"number\\\"?[]:{}),X=X[K])}return P}function r(P=10){let G=\\\"\\\";for(let R=0;R<P;R++)G+=\\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\\\".charAt(Math.floor(Math.random()*62));return G}var E=V(),_=null;if(E===\\\"node\\\"||E===\\\"bun\\\")try{let P=globalThis.require;_=P?.(\\\"node:worker_threads\\\")?.parentPort??null}catch{}function s(){if(x())return _;if(b())return self;if(u())return window.parent;throw Error(\\\"No valid target found for postMessage\\\")}function D(P,G,R,J){if(!P)throw Error(\\\"Rimless Error: No target specified for postMessage\\\");if(x()&&P===_){P.postMessage(G,{transfer:J});return}if(b()){P.postMessage(G,{transfer:J});return}if(P.postMessage){P.postMessage(G,{targetOrigin:i(R),transfer:J});return}throw Error(\\\"Rimless Error: Invalid target for postMessage\\\")}function S(P){return _!==null&&P===_}function j(P,G,R){S(P)?P.on(G,R):(\\\"addEventListener\\\"in P)&&P.addEventListener(G,R)}function H(P,G,R){S(P)?P.off(G,R):(\\\"removeEventListener\\\"in P)&&P.removeEventListener(G,R)}function w(P){return P.data||P}var N=function(P){return P.MESSAGE=\\\"message\\\",P}({}),M=function(P){return P.HANDSHAKE_REQUEST=\\\"RIMLESS/HANDSHAKE_REQUEST\\\",P.HANDSHAKE_REPLY=\\\"RIMLESS/HANDSHAKE_REPLY\\\",P.RPC_REQUEST=\\\"RIMLESS/RPC_REQUEST\\\",P.RPC_RESOLVE=\\\"RIMLESS/RPC_RESOLVE\\\",P.RPC_REJECT=\\\"RIMLESS/RPC_REJECT\\\",P}({}),L=Symbol();function o(P={},G,R,J,X){let Q=[];for(let[K,Z]of Object.entries(P)){async function Y(B){let{action:O,callID:q,connectionID:$,callName:U,args:A=[]}=w(B);if(O!==M.RPC_REQUEST||!q||!U||U!==K||$!==G)return;let F={action:M.RPC_RESOLVE,callID:q,callName:U,connectionID:$,error:null,result:null},T;try{F.result=await Z(...A,X),F.result?.[L]&&(T=F.result[L]??[],delete F.result[L])}catch(C){F.action=M.RPC_REJECT,F.error=JSON.parse(JSON.stringify(C,Object.getOwnPropertyNames(C)))}D(J,F,B?.origin,T)}j(R,N.MESSAGE,Y),Q.push(()=>H(R,N.MESSAGE,Y))}return()=>Q.forEach((K)=>K())}function t(P,G,R,J=[],X,Q){return(...K)=>new Promise((Z,Y)=>{let B=r();function O(U){let{callID:A,connectionID:F,callName:T,result:C,error:v,action:I}=w(U);if(!(!A||!T)&&T===P&&A===B&&F===G){if(I===M.RPC_RESOLVE)return Z(C);if(I===M.RPC_REJECT)return Y(v)}}let q={action:M.RPC_REQUEST,args:K,callID:B,callName:P,connectionID:G},$=K.reduce((U,A)=>A[L]?.length?U.concat(A[L]):U,K[L]??[]);j(X,N.MESSAGE,O),J.push(()=>H(X,N.MESSAGE,O)),D(Q,q,R?.origin,$)})}function a(P={},G=[],R,J,X,Q){let K={...P},Z=[];for(let Y of G)l(K,Y,t(Y,R,J,Z,X,Q));return{remote:K,unregisterRemote:()=>Z.forEach((Y)=>Y())}}function n(P={},G){return new Promise(async(R)=>{let J=p(P),X=s(),Q=self||window;async function K(Z){let Y=w(Z);if(Y?.action!==M.HANDSHAKE_REPLY)return;let{remote:B,unregisterRemote:O}=a(Y.schema,Y.methodNames,Y.connectionID,Z,Q,X),q=o(J,Y.connectionID,Q,X,B);return await G?.onConnectionSetup?.(B),D(X,{action:M.HANDSHAKE_REPLY,connectionID:Y.connectionID},Z?.origin),R({remote:B,close:()=>{H(Q,N.MESSAGE,K),O(),q()},id:Y.connectionID})}j(Q,N.MESSAGE,K),D(X,{action:M.HANDSHAKE_REQUEST,methodNames:Object.keys(J),schema:P})})}var f={connect:n};var e=(P)=>typeof P===\\\"object\\\"&&P!==null,y=(P)=>{try{let G=JSON.stringify(P);if(typeof G===\\\"string\\\"&&G.length>0)return G}catch{}try{return String(P)}catch{return\\\"Unknown error\\\"}},k=(P)=>{if(P instanceof Error)return{message:P.message,stack:P.stack};if(typeof P===\\\"string\\\")return{message:P};if(e(P)){let G=typeof P.message===\\\"string\\\"?P.message:null,R=typeof P.stack===\\\"string\\\"?P.stack:void 0;if(G)return R?{message:G,stack:R}:{message:G};return{message:y(P)}}if(P===null||P===void 0)return{message:\\\"Unknown error\\\"};return{message:y(P)}};var z=(P)=>({id:P}),W=(P,G)=>({id:P,kind:G.kind,label:G.label,description:G.description,metadata:G.metadata}),zP={sidenav:W(\\\"project.sidenav\\\",{kind:\\\"panel\\\"}),headerPrimary:W(\\\"project.headerPrimary\\\",{kind:\\\"menu\\\"}),headerOverflow:W(\\\"project.headerOverflow\\\",{kind:\\\"menu\\\"}),settingsPanels:W(\\\"project.settingsPanels\\\",{kind:\\\"settings\\\"})},BP={headerPrimary:W(\\\"session.headerPrimary\\\",{kind:\\\"menu\\\"}),headerOverflow:W(\\\"session.headerOverflow\\\",{kind:\\\"menu\\\"}),transcriptActions:W(\\\"session.transcriptActions\\\",{kind:\\\"menu\\\"})},WP={headerPrimary:W(\\\"workspace.headerPrimary\\\",{kind:\\\"menu\\\"}),headerOverflow:W(\\\"workspace.headerOverflow\\\",{kind:\\\"menu\\\"}),sidenav:W(\\\"workspace.sidenav\\\",{kind:\\\"panel\\\"})},qP={opened:z(\\\"project.opened\\\")},FP={started:z(\\\"session.started\\\"),resumed:z(\\\"session.resumed\\\"),awaitingInput:z(\\\"session.awaitingInput\\\"),succeeded:z(\\\"session.succeeded\\\"),failed:z(\\\"session.failed\\\"),completed:z(\\\"session.completed\\\")},MP={created:z(\\\"workspace.created\\\"),provision:z(\\\"workspace.provision\\\"),ready:z(\\\"workspace.ready\\\"),archived:z(\\\"workspace.archived\\\"),deleted:z(\\\"workspace.deleted\\\")},OP={removed:z(\\\"worktree.removed\\\")},UP={committed:z(\\\"git.committed\\\"),rebased:z(\\\"git.rebased\\\"),merged:z(\\\"git.merged\\\"),conflicted:z(\\\"git.conflicted\\\")};var PP=[\\\"commands.execute\\\",\\\"resource.open\\\",\\\"notification.show\\\",\\\"notification.action\\\",\\\"notification.resolve\\\",\\\"notification.dismiss\\\",\\\"preferences.get\\\",\\\"preferences.set\\\",\\\"extension.settings.all\\\",\\\"extension.settings.get\\\",\\\"extension.settings.set\\\",\\\"extension.settings.delete\\\",\\\"terminal.session\\\",\\\"files.upload\\\",\\\"files.list\\\",\\\"files.delete\\\"],GP=[\\\"host.dispatchKeyboardEvent\\\"],AP=[...PP,...GP];var c=(P,G)=>({call:async(R,J)=>await P({method:R,params:J}),onEvent:G}),h=(P)=>{let G=P,R=new Set;return{get:()=>G,subscribe:(J)=>{return R.add(J),()=>R.delete(J)},set:(J)=>{G=J;for(let X of R)X(G)}}};var g=\\\"pstdio-extension-mount\\\",RP=()=>{let P=new Map;return{get length(){return P.size},clear:()=>P.clear(),getItem:(G)=>P.get(G)??null,key:(G)=>Array.from(P.keys())[G]??null,removeItem:(G)=>P.delete(G),setItem:(G,R)=>P.set(G,R)}},JP=()=>{for(let P of[\\\"localStorage\\\",\\\"sessionStorage\\\"])try{window[P]}catch{Object.defineProperty(window,P,{configurable:!0,value:RP()})}},m=(P,G)=>{let R=document.documentElement,J=P===\\\"dark\\\"?\\\"light\\\":\\\"dark\\\";R.classList.remove(J),R.classList.add(P),R.setAttribute(\\\"data-theme\\\",P),R.style.colorScheme=P;for(let[X,Q]of Object.entries(G))if(X.startsWith(\\\"--\\\"))R.style.setProperty(X,Q)},KP=(P)=>{for(let G of P){let R=document.createElement(\\\"link\\\");R.rel=\\\"stylesheet\\\",R.href=G,document.head.appendChild(R)}},QP=()=>{let P=document.getElementById(g);if(!P)P=document.createElement(\\\"div\\\"),P.id=g,P.style.height=\\\"100%\\\",P.style.width=\\\"100%\\\",document.body.appendChild(P);return P},XP=(P)=>P instanceof HTMLInputElement||P instanceof HTMLTextAreaElement||P instanceof HTMLSelectElement||P instanceof HTMLElement&&P.isContentEditable,YP=async()=>{JP();let P=h(void 0),G=new Map,R=(K,Z)=>{let Y=G.get(K)??new Set;return Y.add(Z),G.set(K,Y),()=>{Y.delete(Z)}},J,X=!1,Q=await f.connect({init:async(K)=>{try{m(K.theme,K.themeVariables),KP(K.styles),P.set(K.props);let Z=QP(),Y=await import(K.moduleUrl),B=Y.default??(Y.mount?Y:void 0);if(!B?.mount)throw Error(\\\"Extension module does not export a default view (defineExtensionView).\\\");let O=c(($)=>Q.remote.call($),R),q=await B.mount(Z,O,P);if(J=typeof q===\\\"function\\\"?q:void 0,!X)X=!0,document.addEventListener(\\\"keydown\\\",($)=>{if(!$.ctrlKey&&!$.metaKey&&!$.altKey)return;if(XP($.target)&&!$.shiftKey)return;Q.remote.call({method:\\\"host.dispatchKeyboardEvent\\\",params:{key:$.key,code:$.code,ctrlKey:$.ctrlKey,metaKey:$.metaKey,altKey:$.altKey,shiftKey:$.shiftKey,repeat:$.repeat}}).catch(()=>{})},!0)}catch(Z){let Y=k(Z);throw Q.remote.runtimeError(Y),Z instanceof Error?Z:Error(Y.message)}},themeUpdate:(K)=>{m(K.theme,K.variables)},propsUpdate:(K)=>{P.set(K.props)},hostEvent:(K)=>{for(let Z of G.get(K.scope)??[])Z(K.payload)}});Q.remote.ready({}),window.addEventListener(\\\"beforeunload\\\",()=>{J?.()})};YP();\\n\"","const MOUNT_ID = \"pstdio-extension-mount\";\n\nconst escapeAttribute = (value: string) =>\n value.replaceAll(\"&\", \"&amp;\").replaceAll('\"', \"&quot;\").replaceAll(\"<\", \"&lt;\");\n\nconst escapeScriptContent = (value: string) => value.replaceAll(\"</script\", \"<\\\\/script\").replaceAll(\"<!--\", \"<\\\\!--\");\n\nconst renderRuntimeHostDocument = (scriptTag: string) => `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>\n html, body {\n height: 100%;\n margin: 0;\n background: transparent;\n }\n body {\n overflow-x: hidden !important;\n overflow-y: auto !important;\n }\n #${MOUNT_ID} {\n height: 100%;\n width: 100%;\n display: block;\n min-height: 0;\n }\n </style>\n </head>\n <body>\n <div id=\"${MOUNT_ID}\"></div>\n ${scriptTag}\n </body>\n</html>\n`;\n\nexport const getExtensionRuntimeScriptUrl = () => new URL(\"./runtime.bundle.js\", import.meta.url).href;\n\nexport const renderExtensionRuntimeHtml = (scriptUrl: string) =>\n renderRuntimeHostDocument(`<script src=\"${escapeAttribute(scriptUrl)}\"></script>`);\n\nexport const renderInlineExtensionRuntimeHtml = (runtimeScript: string) =>\n renderRuntimeHostDocument(`<script>${escapeScriptContent(runtimeScript)}</script>`);\n","import runtimeScript from \"pstdio-extensions/bridge/webview-runtime.bundle.js?raw\";\n\nexport {\n renderExtensionRuntimeHtml,\n renderInlineExtensionRuntimeHtml,\n} from \"pstdio-extensions/bridge/webview-runtime-html\";\n\n// The guest runtime bundle is inlined here so a host app can serve it without\n// depending on the private pstdio-extensions package.\nexport const getExtensionRuntimeScript = () => runtimeScript;\n"],"names":["runtimeScript","MOUNT_ID","escapeAttribute","value","replaceAll","escapeScriptContent","renderRuntimeHostDocument","scriptTag","renderExtensionRuntimeHtml","scriptUrl","renderInlineExtensionRuntimeHtml","getExtensionRuntimeScript"],"mappings":"AAAA,MAAAA,IAAe,q/QCATC,IAAW,0BAEXC,IAAkBA,CAACC,MACvBA,EAAMC,WAAW,KAAK,OAAO,EAAEA,WAAW,KAAK,QAAQ,EAAEA,WAAW,KAAK,MAAM,GAE3EC,IAAsBA,CAACF,MAAkBA,EAAMC,WAAW,aAAY,YAAY,EAAEA,WAAW,QAAQ,QAAQ,GAE/GE,IAA4BA,CAACC,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAehDN,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eASFA,CAAQ;AAAA,MACjBM,CAAS;AAAA;AAAA;AAAA,GAOFC,IAA6BA,CAACC,MACzCH,EAA0B,gBAAgBJ,EAAgBO,CAAS,CAAC,cAAa,GAEtEC,IAAmCA,CAACV,MAC/CM,EAA0B,WAAWD,EAAoBL,CAAa,CAAC,YAAW,GClCvEW,IAA4BA,MAAMX;"}
1
+ {"version":3,"file":"webview-runtime.js","sources":["../../pstdio-extensions/src/bridge/webview-runtime/runtime.bundle.js?raw","../../pstdio-extensions/src/bridge/webview-runtime/runtime-html.ts","../src/webview-runtime/index.ts"],"sourcesContent":["export default \"// Generated by packages/pstdio-extensions/scripts/build-runtime.ts\\nfunction d(){let P=globalThis;if(P.window!==void 0&&P.document!==void 0)return\\\"browser\\\";if(P.WorkerGlobalScope!==void 0&&P.self!==void 0&&P.self instanceof P.WorkerGlobalScope||P.window===void 0&&P.self!==void 0&&typeof P.importScripts==\\\"function\\\")return\\\"worker\\\";let G=P.process;if(G&&typeof G==\\\"object\\\"){let R=G.versions??{},J=G.release?.name;if(R.bun||J===\\\"bun\\\"||P.Bun!==void 0)return\\\"bun\\\";if(R.node&&J===\\\"node\\\")return\\\"node\\\"}return P.Bun===void 0?\\\"browser\\\":\\\"bun\\\"}function V(){return d()}function b(){return V()===\\\"worker\\\"}function x(){let P=V();return P===\\\"node\\\"||P===\\\"bun\\\"}function u(){return window.self!==window.top}function p(P){let G={};return function R(J,X=\\\"\\\"){Object.keys(J).forEach((Q)=>{let K=X?`${X}.${Q}`:Q;J[Q]===Object(J[Q])&&R(J[Q],K),typeof J[Q]==\\\"function\\\"&&(G[K]=J[Q],delete J[Q])})}(P),G}function i(P){return!P||P===\\\"null\\\"?\\\"*\\\":P}function l(P,G,R){if(!P||typeof P!=\\\"object\\\")return P;let J=Array.isArray(G)?G:G.split(\\\".\\\").map((Q)=>Q.match(/^\\\\d+$/)?Number(Q):Q),X=P;for(let Q=0;Q<J.length;Q++){let K=J[Q];Q===J.length-1?X[K]=R:((!X[K]||typeof X[K]!=\\\"object\\\")&&(X[K]=typeof J[Q+1]==\\\"number\\\"?[]:{}),X=X[K])}return P}function r(P=10){let G=\\\"\\\";for(let R=0;R<P;R++)G+=\\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\\\".charAt(Math.floor(Math.random()*62));return G}var E=V(),_=null;if(E===\\\"node\\\"||E===\\\"bun\\\")try{let P=globalThis.require;_=P?.(\\\"node:worker_threads\\\")?.parentPort??null}catch{}function s(){if(x())return _;if(b())return self;if(u())return window.parent;throw Error(\\\"No valid target found for postMessage\\\")}function D(P,G,R,J){if(!P)throw Error(\\\"Rimless Error: No target specified for postMessage\\\");if(x()&&P===_){P.postMessage(G,{transfer:J});return}if(b()){P.postMessage(G,{transfer:J});return}if(P.postMessage){P.postMessage(G,{targetOrigin:i(R),transfer:J});return}throw Error(\\\"Rimless Error: Invalid target for postMessage\\\")}function S(P){return _!==null&&P===_}function j(P,G,R){S(P)?P.on(G,R):(\\\"addEventListener\\\"in P)&&P.addEventListener(G,R)}function H(P,G,R){S(P)?P.off(G,R):(\\\"removeEventListener\\\"in P)&&P.removeEventListener(G,R)}function w(P){return P.data||P}var L=function(P){return P.MESSAGE=\\\"message\\\",P}({}),M=function(P){return P.HANDSHAKE_REQUEST=\\\"RIMLESS/HANDSHAKE_REQUEST\\\",P.HANDSHAKE_REPLY=\\\"RIMLESS/HANDSHAKE_REPLY\\\",P.RPC_REQUEST=\\\"RIMLESS/RPC_REQUEST\\\",P.RPC_RESOLVE=\\\"RIMLESS/RPC_RESOLVE\\\",P.RPC_REJECT=\\\"RIMLESS/RPC_REJECT\\\",P}({}),A=Symbol();function o(P={},G,R,J,X){let Q=[];for(let[K,Z]of Object.entries(P)){async function Y(B){let{action:N,callID:q,connectionID:$,callName:O,args:U=[]}=w(B);if(N!==M.RPC_REQUEST||!q||!O||O!==K||$!==G)return;let F={action:M.RPC_RESOLVE,callID:q,callName:O,connectionID:$,error:null,result:null},T;try{F.result=await Z(...U,X),F.result?.[A]&&(T=F.result[A]??[],delete F.result[A])}catch(C){F.action=M.RPC_REJECT,F.error=JSON.parse(JSON.stringify(C,Object.getOwnPropertyNames(C)))}D(J,F,B?.origin,T)}j(R,L.MESSAGE,Y),Q.push(()=>H(R,L.MESSAGE,Y))}return()=>Q.forEach((K)=>K())}function t(P,G,R,J=[],X,Q){return(...K)=>new Promise((Z,Y)=>{let B=r();function N(O){let{callID:U,connectionID:F,callName:T,result:C,error:v,action:I}=w(O);if(!(!U||!T)&&T===P&&U===B&&F===G){if(I===M.RPC_RESOLVE)return Z(C);if(I===M.RPC_REJECT)return Y(v)}}let q={action:M.RPC_REQUEST,args:K,callID:B,callName:P,connectionID:G},$=K.reduce((O,U)=>U[A]?.length?O.concat(U[A]):O,K[A]??[]);j(X,L.MESSAGE,N),J.push(()=>H(X,L.MESSAGE,N)),D(Q,q,R?.origin,$)})}function a(P={},G=[],R,J,X,Q){let K={...P},Z=[];for(let Y of G)l(K,Y,t(Y,R,J,Z,X,Q));return{remote:K,unregisterRemote:()=>Z.forEach((Y)=>Y())}}function n(P={},G){return new Promise(async(R)=>{let J=p(P),X=s(),Q=self||window;async function K(Z){let Y=w(Z);if(Y?.action!==M.HANDSHAKE_REPLY)return;let{remote:B,unregisterRemote:N}=a(Y.schema,Y.methodNames,Y.connectionID,Z,Q,X),q=o(J,Y.connectionID,Q,X,B);return await G?.onConnectionSetup?.(B),D(X,{action:M.HANDSHAKE_REPLY,connectionID:Y.connectionID},Z?.origin),R({remote:B,close:()=>{H(Q,L.MESSAGE,K),N(),q()},id:Y.connectionID})}j(Q,L.MESSAGE,K),D(X,{action:M.HANDSHAKE_REQUEST,methodNames:Object.keys(J),schema:P})})}var f={connect:n};var e=(P)=>typeof P===\\\"object\\\"&&P!==null,y=(P)=>{try{let G=JSON.stringify(P);if(typeof G===\\\"string\\\"&&G.length>0)return G}catch{}try{return String(P)}catch{return\\\"Unknown error\\\"}},k=(P)=>{if(P instanceof Error)return{message:P.message,stack:P.stack};if(typeof P===\\\"string\\\")return{message:P};if(e(P)){let G=typeof P.message===\\\"string\\\"?P.message:null,R=typeof P.stack===\\\"string\\\"?P.stack:void 0;if(G)return R?{message:G,stack:R}:{message:G};return{message:y(P)}}if(P===null||P===void 0)return{message:\\\"Unknown error\\\"};return{message:y(P)}};var z=(P)=>({id:P}),W=(P,G)=>({id:P,kind:G.kind,label:G.label,description:G.description,metadata:G.metadata}),zP={sidenav:W(\\\"project.sidenav\\\",{kind:\\\"panel\\\"}),headerPrimary:W(\\\"project.headerPrimary\\\",{kind:\\\"menu\\\"}),headerOverflow:W(\\\"project.headerOverflow\\\",{kind:\\\"menu\\\"}),settingsPanels:W(\\\"project.settingsPanels\\\",{kind:\\\"settings\\\"})},BP={headerPrimary:W(\\\"session.headerPrimary\\\",{kind:\\\"menu\\\"}),headerOverflow:W(\\\"session.headerOverflow\\\",{kind:\\\"menu\\\"}),transcriptActions:W(\\\"session.transcriptActions\\\",{kind:\\\"menu\\\"})},WP={headerPrimary:W(\\\"workspace.headerPrimary\\\",{kind:\\\"menu\\\"}),headerOverflow:W(\\\"workspace.headerOverflow\\\",{kind:\\\"menu\\\"}),sidenav:W(\\\"workspace.sidenav\\\",{kind:\\\"panel\\\"})},qP={opened:z(\\\"project.opened\\\")},FP={started:z(\\\"session.started\\\"),resumed:z(\\\"session.resumed\\\"),awaitingInput:z(\\\"session.awaitingInput\\\"),succeeded:z(\\\"session.succeeded\\\"),failed:z(\\\"session.failed\\\"),completed:z(\\\"session.completed\\\")},MP={created:z(\\\"workspace.created\\\"),provision:z(\\\"workspace.provision\\\"),ready:z(\\\"workspace.ready\\\"),archived:z(\\\"workspace.archived\\\"),deleted:z(\\\"workspace.deleted\\\")},NP={removed:z(\\\"worktree.removed\\\")},OP={committed:z(\\\"git.committed\\\"),rebased:z(\\\"git.rebased\\\"),merged:z(\\\"git.merged\\\"),conflicted:z(\\\"git.conflicted\\\")};var PP=[\\\"commands.execute\\\",\\\"resource.open\\\",\\\"notification.show\\\",\\\"notification.action\\\",\\\"notification.resolve\\\",\\\"notification.dismiss\\\",\\\"preferences.get\\\",\\\"preferences.set\\\",\\\"extension.settings.all\\\",\\\"extension.settings.get\\\",\\\"extension.settings.set\\\",\\\"extension.settings.delete\\\",\\\"terminal.session\\\",\\\"files.upload\\\",\\\"files.list\\\",\\\"files.delete\\\"],GP=[\\\"host.dispatchKeyboardEvent\\\"],UP=[...PP,...GP];var c=(P,G)=>({call:async(R,J)=>await P({method:R,params:J}),onEvent:G}),g=(P)=>{let G=P,R=new Set;return{get:()=>G,subscribe:(J)=>{return R.add(J),()=>R.delete(J)},set:(J)=>{G=J;for(let X of R)X(G)}}};var h=\\\"pstdio-extension-mount\\\",RP=()=>{let P=new Map;return{get length(){return P.size},clear:()=>P.clear(),getItem:(G)=>P.get(G)??null,key:(G)=>Array.from(P.keys())[G]??null,removeItem:(G)=>P.delete(G),setItem:(G,R)=>P.set(G,R)}},JP=()=>{for(let P of[\\\"localStorage\\\",\\\"sessionStorage\\\"])try{window[P]}catch{Object.defineProperty(window,P,{configurable:!0,value:RP()})}},m=(P,G)=>{let R=document.documentElement,J=P===\\\"dark\\\"?\\\"light\\\":\\\"dark\\\";R.classList.remove(J),R.classList.add(P),R.setAttribute(\\\"data-theme\\\",P),R.style.colorScheme=P;for(let[X,Q]of Object.entries(G))if(X.startsWith(\\\"--\\\"))R.style.setProperty(X,Q)},KP=(P)=>{for(let G of P){let R=document.createElement(\\\"link\\\");R.rel=\\\"stylesheet\\\",R.href=G,document.head.appendChild(R)}},QP=()=>{let P=document.getElementById(h);if(!P)P=document.createElement(\\\"div\\\"),P.id=h,P.style.height=\\\"100%\\\",P.style.width=\\\"100%\\\",document.body.appendChild(P);return P},XP=(P)=>P instanceof HTMLInputElement||P instanceof HTMLTextAreaElement||P instanceof HTMLSelectElement||P instanceof HTMLElement&&P.isContentEditable,YP=async()=>{JP();let P=g(void 0),G=new Map,R=(K,Z)=>{let Y=G.get(K)??new Set;return Y.add(Z),G.set(K,Y),()=>{Y.delete(Z)}},J,X=!1,Q=await f.connect({init:async(K)=>{try{m(K.theme,K.themeVariables),KP(K.styles),P.set(K.props);let Z=QP(),Y=await import(K.moduleUrl),B=Y.default??(Y.mount?Y:void 0);if(!B?.mount)throw Error(\\\"Extension module does not export a default view (defineExtensionView).\\\");let N=c(($)=>Q.remote.call($),R),q=await B.mount(Z,N,P);if(J=typeof q===\\\"function\\\"?q:void 0,!X)X=!0,document.addEventListener(\\\"keydown\\\",($)=>{if(!$.ctrlKey&&!$.metaKey&&!$.altKey)return;if(XP($.target)&&!$.shiftKey)return;Q.remote.call({method:\\\"host.dispatchKeyboardEvent\\\",params:{key:$.key,code:$.code,ctrlKey:$.ctrlKey,metaKey:$.metaKey,altKey:$.altKey,shiftKey:$.shiftKey,repeat:$.repeat}}).catch(()=>{})},!0)}catch(Z){let Y=k(Z);throw Q.remote.runtimeError(Y),Z instanceof Error?Z:Error(Y.message)}},themeUpdate:(K)=>{m(K.theme,K.variables)},propsUpdate:(K)=>{P.set(K.props)},hostEvent:(K)=>{for(let Z of G.get(K.scope)??[])Z(K.payload)}});Q.remote.ready({}),window.addEventListener(\\\"beforeunload\\\",()=>{J?.()})};YP();\\n\"","const MOUNT_ID = \"pstdio-extension-mount\";\n\nconst escapeAttribute = (value: string) =>\n value.replaceAll(\"&\", \"&amp;\").replaceAll('\"', \"&quot;\").replaceAll(\"<\", \"&lt;\");\n\nconst escapeScriptContent = (value: string) => value.replaceAll(\"</script\", \"<\\\\/script\").replaceAll(\"<!--\", \"<\\\\!--\");\n\nconst renderRuntimeHostDocument = (scriptTag: string) => `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>\n html, body {\n height: 100%;\n margin: 0;\n background: transparent;\n }\n body {\n overflow-x: hidden !important;\n overflow-y: auto !important;\n }\n #${MOUNT_ID} {\n height: 100%;\n width: 100%;\n display: block;\n min-height: 0;\n }\n </style>\n </head>\n <body>\n <div id=\"${MOUNT_ID}\"></div>\n ${scriptTag}\n </body>\n</html>\n`;\n\nexport const getExtensionRuntimeScriptUrl = () => new URL(\"./runtime.bundle.js\", import.meta.url).href;\n\nexport const renderExtensionRuntimeHtml = (scriptUrl: string) =>\n renderRuntimeHostDocument(`<script src=\"${escapeAttribute(scriptUrl)}\"></script>`);\n\nexport const renderInlineExtensionRuntimeHtml = (runtimeScript: string) =>\n renderRuntimeHostDocument(`<script>${escapeScriptContent(runtimeScript)}</script>`);\n","import runtimeScript from \"pstdio-extensions/bridge/webview-runtime.bundle.js?raw\";\n\nexport {\n renderExtensionRuntimeHtml,\n renderInlineExtensionRuntimeHtml,\n} from \"pstdio-extensions/bridge/webview-runtime-html\";\n\n// The guest runtime bundle is inlined here so a host app can serve it without\n// depending on the private pstdio-extensions package.\nexport const getExtensionRuntimeScript = () => runtimeScript;\n"],"names":["runtimeScript","MOUNT_ID","escapeAttribute","value","replaceAll","escapeScriptContent","renderRuntimeHostDocument","scriptTag","renderExtensionRuntimeHtml","scriptUrl","renderInlineExtensionRuntimeHtml","getExtensionRuntimeScript"],"mappings":"AAAA,MAAAA,IAAe,q/QCATC,IAAW,0BAEXC,IAAkBA,CAACC,MACvBA,EAAMC,WAAW,KAAK,OAAO,EAAEA,WAAW,KAAK,QAAQ,EAAEA,WAAW,KAAK,MAAM,GAE3EC,IAAsBA,CAACF,MAAkBA,EAAMC,WAAW,aAAY,YAAY,EAAEA,WAAW,QAAQ,QAAQ,GAE/GE,IAA4BA,CAACC,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAehDN,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eASFA,CAAQ;AAAA,MACjBM,CAAS;AAAA;AAAA;AAAA,GAOFC,IAA6BA,CAACC,MACzCH,EAA0B,gBAAgBJ,EAAgBO,CAAS,CAAC,cAAa,GAEtEC,IAAmCA,CAACV,MAC/CM,EAA0B,WAAWD,EAAoBL,CAAa,CAAC,YAAW,GClCvEW,IAA4BA,MAAMX;"}