@pstdio/workbench 0.4.0 → 0.6.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 (34) 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 +359 -43
  5. package/dist/extensions.js +1595 -1044
  6. package/dist/extensions.js.map +1 -1
  7. package/dist/file-renderer-view-zpunbE4I.js +432 -0
  8. package/dist/file-renderer-view-zpunbE4I.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 +287 -19
  12. package/dist/index.js +2323 -2011
  13. package/dist/index.js.map +1 -1
  14. package/dist/layout-types-DMoZz38-.js.map +1 -1
  15. package/dist/react.d.ts +157 -16
  16. package/dist/react.js +2675 -2736
  17. package/dist/react.js.map +1 -1
  18. package/dist/storage.d.ts +96 -2
  19. package/dist/storage.js +173 -115
  20. package/dist/storage.js.map +1 -1
  21. package/dist/testing.d.ts +146 -14
  22. package/dist/webview-runtime.js +1 -1
  23. package/dist/webview-runtime.js.map +1 -1
  24. package/dist/workbench-built-ins-BtgeB274.js +1171 -0
  25. package/dist/workbench-built-ins-BtgeB274.js.map +1 -0
  26. package/dist/workbench-menu-paths-Bb0ICxeG.js +20 -0
  27. package/dist/workbench-menu-paths-Bb0ICxeG.js.map +1 -0
  28. package/package.json +3 -3
  29. package/dist/context-key-service-W4QEfVdN.js +0 -1031
  30. package/dist/context-key-service-W4QEfVdN.js.map +0 -1
  31. package/dist/file-renderer-view-DrrhYnb_.js +0 -171
  32. package/dist/file-renderer-view-DrrhYnb_.js.map +0 -1
  33. package/dist/workbench-menu-paths-B_QJzcNU.js +0 -12
  34. package/dist/workbench-menu-paths-B_QJzcNU.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sources":["../src/storage/local-storage-persistence.ts"],"sourcesContent":["import type {\n LastResourcePersistenceAdapter,\n LayoutPersistenceAdapter,\n PersistedTreeRendererStates,\n PersistedWorkbenchHistory,\n PersistedWorkbenchPanels,\n ResourceRef,\n TreeRendererPersistenceAdapter,\n WorkbenchHistoryPersistence,\n WorkbenchLayout,\n WorkbenchPanelsPersistenceAdapter,\n WorkbenchPersistenceAdapter,\n} from \"../core\";\nimport { workbenchRegions } from \"../core\";\n\nexport interface WorkbenchStorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem?(key: string): void;\n}\n\nexport type WorkbenchStoragePersistenceKind =\n | \"history\"\n | \"layout\"\n | \"layout-resource-index\"\n | \"panels\"\n | \"tree\"\n | \"last-resource\";\n\ninterface PersistedWorkbenchLayoutV1 {\n version: 1;\n layout: WorkbenchLayout;\n}\n\ninterface PersistedWorkbenchLayoutV2 {\n version: 2;\n layout: WorkbenchLayout;\n}\n\ntype PersistedWorkbenchLayout = PersistedWorkbenchLayoutV1 | PersistedWorkbenchLayoutV2;\n\nconst WORKBENCH_LAYOUT_VERSION = 2 as const;\nconst WORKBENCH_LAYOUT_RESOURCE_INDEX_VERSION = 1 as const;\nconst WORKBENCH_LAYOUT_RESOURCE_LIMIT = 50;\n\ninterface PersistedWorkbenchLayoutResourceIndex {\n version: 1;\n scopes: string[];\n}\n\ninterface CreateWorkbenchStoragePersistenceInput {\n debounceMs?: number;\n eventTarget?: {\n addEventListener(type: \"pagehide\", listener: () => void): void;\n removeEventListener(type: \"pagehide\", listener: () => void): void;\n };\n namespace: string;\n storage?: WorkbenchStorageLike;\n}\n\nexport interface CreateLocalStoragePanelsPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope: string;\n}\n\nexport interface CreateLocalStorageTreePersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport interface CreateLocalStorageWorkbenchPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport const workbenchStoragePersistenceKey = (\n namespace: string,\n kind: WorkbenchStoragePersistenceKind,\n scope: string | undefined,\n) => `${namespace}:${kind}:${scope ?? \"global\"}`;\n\nconst createMemoryStorage = (): WorkbenchStorageLike => {\n const map = new Map<string, string>();\n return {\n getItem: (key) => map.get(key) ?? null,\n setItem: (key, value) => {\n map.set(key, value);\n },\n removeItem: (key) => {\n map.delete(key);\n },\n };\n};\n\nconst resolveStorage = (storage?: WorkbenchStorageLike): WorkbenchStorageLike => {\n if (storage) return storage;\n if (typeof localStorage !== \"undefined\") return localStorage;\n return createMemoryStorage();\n};\n\nconst readJson = <T>(storage: WorkbenchStorageLike, key: string): T | undefined => {\n const raw = storage.getItem(key);\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return undefined;\n }\n};\n\nexport const createLocalStorageLayoutPersistence = (\n input: CreateWorkbenchStoragePersistenceInput,\n): LayoutPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const pending = new Map<string, { legacyPanelsKey?: string; raw: string; scope: string | undefined }>();\n const debounceMs = input.debounceMs ?? 250;\n const eventTarget =\n input.eventTarget ??\n (typeof window !== \"undefined\"\n ? {\n addEventListener: (type: \"pagehide\", listener: () => void) => window.addEventListener(type, listener),\n removeEventListener: (type: \"pagehide\", listener: () => void) => window.removeEventListener(type, listener),\n }\n : undefined);\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const resourceProjectId = (scope: string | undefined) =>\n scope?.match(/^project\\/([^/]+)\\/mode\\/[^/]+\\/resource\\//)?.[1];\n\n const touchResourceScope = (scope: string | undefined) => {\n const projectId = resourceProjectId(scope);\n if (!projectId || !scope) return;\n\n const indexKey = workbenchStoragePersistenceKey(input.namespace, \"layout-resource-index\", projectId);\n const persisted = readJson<unknown>(storage, indexKey);\n const scopes =\n typeof persisted === \"object\" &&\n persisted !== null &&\n \"version\" in persisted &&\n persisted.version === WORKBENCH_LAYOUT_RESOURCE_INDEX_VERSION &&\n \"scopes\" in persisted &&\n Array.isArray(persisted.scopes)\n ? persisted.scopes.filter(\n (candidate): candidate is string =>\n typeof candidate === \"string\" &&\n candidate !== scope &&\n storage.getItem(workbenchStoragePersistenceKey(input.namespace, \"layout\", candidate)) !== null,\n )\n : [];\n scopes.push(scope);\n\n for (const evictedScope of scopes.splice(0, Math.max(0, scopes.length - WORKBENCH_LAYOUT_RESOURCE_LIMIT))) {\n storage.removeItem?.(workbenchStoragePersistenceKey(input.namespace, \"layout\", evictedScope));\n storage.removeItem?.(workbenchStoragePersistenceKey(input.namespace, \"panels\", evictedScope));\n }\n\n const next: PersistedWorkbenchLayoutResourceIndex = {\n version: WORKBENCH_LAYOUT_RESOURCE_INDEX_VERSION,\n scopes,\n };\n storage.setItem(indexKey, JSON.stringify(next));\n };\n\n const flush = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n const writes = [...pending.values()];\n pending.clear();\n for (const write of writes) {\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, \"layout\", write.scope), write.raw);\n touchResourceScope(write.scope);\n if (write.legacyPanelsKey) storage.removeItem?.(write.legacyPanelsKey);\n }\n };\n\n const scheduleFlush = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(flush, debounceMs);\n };\n\n eventTarget?.addEventListener(\"pagehide\", flush);\n\n return {\n getLayout: (scope) => {\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const persisted = pending.has(key)\n ? (JSON.parse(pending.get(key)!.raw) as PersistedWorkbenchLayout)\n : readJson<PersistedWorkbenchLayout>(storage, key);\n if (persisted?.version === WORKBENCH_LAYOUT_VERSION) return persisted.layout;\n if (persisted?.version !== 1) return undefined;\n\n const legacyPanelsKey = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope);\n const panels = readJson<unknown>(storage, legacyPanelsKey);\n const openByRegionId =\n typeof panels === \"object\" &&\n panels !== null &&\n \"openByRegionId\" in panels &&\n typeof panels.openByRegionId === \"object\" &&\n panels.openByRegionId !== null\n ? panels.openByRegionId\n : {};\n const regions = { ...persisted.layout.regions };\n for (const region of workbenchRegions) {\n const open = (openByRegionId as Record<string, unknown>)[region];\n if (typeof open === \"boolean\" && regions[region]) {\n regions[region] = { ...regions[region], visible: open };\n }\n }\n const layout = { ...persisted.layout, regions };\n const migrated: PersistedWorkbenchLayoutV2 = { version: WORKBENCH_LAYOUT_VERSION, layout };\n pending.set(key, {\n legacyPanelsKey: storage.getItem(legacyPanelsKey) === null ? undefined : legacyPanelsKey,\n raw: JSON.stringify(migrated),\n scope,\n });\n scheduleFlush();\n return layout;\n },\n setLayout: (layout, scope) => {\n const persisted: PersistedWorkbenchLayoutV2 = { version: WORKBENCH_LAYOUT_VERSION, layout };\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const legacyPanelsKey = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope);\n pending.delete(key);\n pending.set(key, {\n legacyPanelsKey: storage.getItem(legacyPanelsKey) === null ? undefined : legacyPanelsKey,\n raw: JSON.stringify(persisted),\n scope,\n });\n scheduleFlush();\n },\n flush,\n dispose() {\n flush();\n eventTarget?.removeEventListener(\"pagehide\", flush);\n },\n };\n};\n\nexport const createLocalStorageHistoryPersistence = (\n input: CreateWorkbenchStoragePersistenceInput,\n): WorkbenchHistoryPersistence => {\n const storage = resolveStorage(input.storage);\n return {\n getHistory: (scope) =>\n readJson<PersistedWorkbenchHistory>(storage, workbenchStoragePersistenceKey(input.namespace, \"history\", scope)),\n setHistory: (history, scope) => {\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, \"history\", scope), JSON.stringify(history));\n },\n };\n};\n\nexport const createLocalStoragePanelsPersistence = (\n input: CreateLocalStoragePanelsPersistenceInput,\n): WorkbenchPanelsPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n return {\n getPanelStates: (scope) =>\n readJson<PersistedWorkbenchPanels>(\n storage,\n workbenchStoragePersistenceKey(input.namespace, \"panels\", scope ?? input.scope),\n ),\n setPanelStates: (state, scope) => {\n const key = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope ?? input.scope);\n storage.setItem(key, JSON.stringify(state));\n },\n };\n};\n\nexport const createLocalStorageTreePersistence = (\n input: CreateLocalStorageTreePersistenceInput,\n): TreeRendererPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"tree\", input.scope);\n return {\n getTreeStates: () => readJson<PersistedTreeRendererStates>(storage, key),\n setTreeStates: (state) => {\n storage.setItem(key, JSON.stringify(state));\n },\n };\n};\n\nexport interface CreateLocalStorageLastResourcePersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nconst isResourceRef = (value: unknown): value is ResourceRef =>\n Boolean(value) && typeof (value as ResourceRef).kind === \"string\" && typeof (value as ResourceRef).uri === \"string\";\n\nexport const createLocalStorageLastResourcePersistence = (\n input: CreateLocalStorageLastResourcePersistenceInput,\n): LastResourcePersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"last-resource\", input.scope);\n return {\n getLastResource: () => {\n const parsed = readJson<unknown>(storage, key);\n return isResourceRef(parsed) ? parsed : undefined;\n },\n setLastResource: (resource) => {\n if (!resource) {\n storage.removeItem?.(key);\n return;\n }\n storage.setItem(key, JSON.stringify(resource));\n },\n };\n};\n\nexport const createLocalStorageWorkbenchPersistence = (input: CreateLocalStorageWorkbenchPersistenceInput) => {\n const storage = resolveStorage(input.storage);\n const layoutPersistence = createLocalStorageLayoutPersistence({\n debounceMs: input.debounceMs,\n eventTarget: input.eventTarget,\n namespace: input.namespace,\n storage,\n });\n const snapshotPersistence: WorkbenchPersistenceAdapter = {\n getSnapshot: (scope) => {\n const layout = layoutPersistence.getLayout(scope);\n return layout ? { layout } : undefined;\n },\n setSnapshot: (snapshot, scope) => layoutPersistence.setLayout(snapshot.layout, scope),\n flush: layoutPersistence.flush,\n dispose: layoutPersistence.dispose,\n };\n\n return {\n snapshotPersistence,\n historyPersistence: createLocalStorageHistoryPersistence({\n namespace: input.namespace,\n storage,\n }),\n layoutPersistence,\n panelsPersistence: createLocalStoragePanelsPersistence({\n namespace: input.namespace,\n scope: input.scope ?? \"global\",\n storage,\n }),\n treePersistence: createLocalStorageTreePersistence({\n namespace: input.namespace,\n scope: input.scope,\n storage,\n }),\n lastResourcePersistence: createLocalStorageLastResourcePersistence({\n namespace: input.namespace,\n scope: input.scope,\n storage,\n }),\n };\n};\n"],"names":["WORKBENCH_LAYOUT_VERSION","WORKBENCH_LAYOUT_RESOURCE_INDEX_VERSION","WORKBENCH_LAYOUT_RESOURCE_LIMIT","workbenchStoragePersistenceKey","namespace","kind","scope","createMemoryStorage","map","Map","getItem","key","get","setItem","value","set","removeItem","delete","resolveStorage","storage","localStorage","readJson","raw","JSON","parse","createLocalStorageLayoutPersistence","input","pending","debounceMs","eventTarget","window","addEventListener","type","listener","removeEventListener","undefined","timer","resourceProjectId","match","touchResourceScope","projectId","indexKey","persisted","scopes","version","Array","isArray","filter","candidate","push","evictedScope","splice","Math","max","length","next","stringify","flush","writes","values","clear","write","legacyPanelsKey","scheduleFlush","setTimeout","getLayout","has","layout","panels","openByRegionId","regions","region","workbenchRegions","open","visible","migrated","setLayout","dispose","createLocalStorageHistoryPersistence","getHistory","setHistory","history","createLocalStoragePanelsPersistence","getPanelStates","setPanelStates","state","createLocalStorageTreePersistence","getTreeStates","setTreeStates","isResourceRef","Boolean","uri","createLocalStorageLastResourcePersistence","getLastResource","parsed","setLastResource","resource","createLocalStorageWorkbenchPersistence","layoutPersistence","snapshotPersistence","getSnapshot","setSnapshot","snapshot","historyPersistence","panelsPersistence","treePersistence","lastResourcePersistence"],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sources":["../src/storage/local-storage-persistence-helpers.ts","../src/storage/local-storage-layout-persistence.ts","../src/storage/local-storage-persistence.ts"],"sourcesContent":["export interface WorkbenchStorageLike {\n readonly length?: number;\n getItem(key: string): string | null;\n key?(index: number): string | null;\n setItem(key: string, value: string): void;\n removeItem?(key: string): void;\n}\n\nexport type WorkbenchStoragePersistenceKind =\n | \"history\"\n | \"layout\"\n | \"layout-compatibility\"\n | \"layout-generation\"\n | \"layout-resource-index\"\n | \"layout-scope-index\"\n | \"panels\"\n | \"side-panel\"\n | \"tree\"\n | \"last-resource\";\n\nexport interface CreateWorkbenchStoragePersistenceInput {\n debounceMs?: number;\n eventTarget?: {\n addEventListener(type: \"pagehide\", listener: () => void): void;\n removeEventListener(type: \"pagehide\", listener: () => void): void;\n };\n namespace: string;\n storage?: WorkbenchStorageLike;\n}\n\nexport const workbenchStoragePersistenceKey = (\n namespace: string,\n kind: WorkbenchStoragePersistenceKind,\n scope: string | undefined,\n) => `${namespace}:${kind}:${scope ?? \"global\"}`;\n\nconst createMemoryStorage = (): WorkbenchStorageLike => {\n const map = new Map<string, string>();\n return {\n get length() {\n return map.size;\n },\n getItem: (key) => map.get(key) ?? null,\n key: (index) => [...map.keys()][index] ?? null,\n setItem: (key, value) => {\n map.set(key, value);\n },\n removeItem: (key) => {\n map.delete(key);\n },\n };\n};\n\nexport const resolveStorage = (storage?: WorkbenchStorageLike): WorkbenchStorageLike => {\n if (storage) return storage;\n if (typeof localStorage !== \"undefined\") return localStorage;\n return createMemoryStorage();\n};\n\nexport const readJson = <T>(storage: WorkbenchStorageLike, key: string): T | undefined => {\n const raw = storage.getItem(key);\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return undefined;\n }\n};\n","import type { LayoutPersistenceAdapter, WorkbenchLayout } from \"../core\";\nimport {\n type CreateWorkbenchStoragePersistenceInput,\n readJson,\n resolveStorage,\n workbenchStoragePersistenceKey,\n} from \"./local-storage-persistence-helpers\";\n\ninterface PersistedWorkbenchLayoutV3 {\n version: 3;\n layout: WorkbenchLayout;\n}\n\ntype PersistedWorkbenchLayout = PersistedWorkbenchLayoutV3;\n\n// Version 3 is the composition-resolver layout model (PS-267). Layouts persisted by\n// earlier versions carry replaced panel roles and bindings, so they are discarded\n// rather than interpreted.\nconst WORKBENCH_LAYOUT_VERSION = 3 as const;\nconst WORKBENCH_LAYOUT_INDEX_VERSION = 1 as const;\nconst WORKBENCH_LAYOUT_RESOURCE_LIMIT = 50;\n\ninterface PersistedWorkbenchLayoutScopeIndex {\n version: 1;\n scopes: string[];\n}\n\ninterface PersistedWorkbenchLayoutGeneration {\n version: 1;\n generation: number;\n}\n\nexport const createLocalStorageLayoutPersistence = (\n input: CreateWorkbenchStoragePersistenceInput,\n): LayoutPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const pending = new Map<\n string,\n { generation: number; legacyPanelsKey?: string; raw: string; scope: string | undefined }\n >();\n const debounceMs = input.debounceMs ?? 250;\n const eventTarget =\n input.eventTarget ??\n (typeof window !== \"undefined\"\n ? {\n addEventListener: (type: \"pagehide\", listener: () => void) => window.addEventListener(type, listener),\n removeEventListener: (type: \"pagehide\", listener: () => void) => window.removeEventListener(type, listener),\n }\n : undefined);\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const generationKey = workbenchStoragePersistenceKey(input.namespace, \"layout-generation\", undefined);\n const getGeneration = () => {\n const persisted = readJson<unknown>(storage, generationKey);\n return typeof persisted === \"object\" &&\n persisted !== null &&\n \"version\" in persisted &&\n persisted.version === 1 &&\n \"generation\" in persisted &&\n typeof persisted.generation === \"number\"\n ? persisted.generation\n : 0;\n };\n\n const advanceGeneration = () => {\n const generation = getGeneration() + 1;\n const persisted: PersistedWorkbenchLayoutGeneration = { version: 1, generation };\n storage.setItem(generationKey, JSON.stringify(persisted));\n return generation;\n };\n\n const resourceProjectId = (scope: string | undefined) =>\n scope?.match(/^project\\/([^/]+)\\/mode\\/[^/]+\\/resource\\//)?.[1];\n const scopeProjectId = (scope: string | undefined) => scope?.match(/^project\\/([^/]+)/)?.[1];\n\n const storedProjectScopes = (projectId: string) => {\n if (!storage.key) return [];\n const prefix = `${input.namespace}:layout:`;\n const scopes: string[] = [];\n for (let index = 0; index < (storage.length ?? 0); index += 1) {\n const key = storage.key(index);\n if (!key?.startsWith(prefix)) continue;\n const scope = key.slice(prefix.length);\n if (scopeProjectId(scope) === projectId) scopes.push(scope);\n }\n return scopes;\n };\n\n const readScopes = (kind: \"layout-resource-index\" | \"layout-scope-index\", projectId: string) => {\n const persisted = readJson<unknown>(storage, workbenchStoragePersistenceKey(input.namespace, kind, projectId));\n return typeof persisted === \"object\" &&\n persisted !== null &&\n \"version\" in persisted &&\n persisted.version === WORKBENCH_LAYOUT_INDEX_VERSION &&\n \"scopes\" in persisted &&\n Array.isArray(persisted.scopes)\n ? persisted.scopes.filter(\n (scope): scope is string =>\n typeof scope === \"string\" &&\n storage.getItem(workbenchStoragePersistenceKey(input.namespace, \"layout\", scope)) !== null,\n )\n : [];\n };\n\n const writeScopes = (kind: \"layout-resource-index\" | \"layout-scope-index\", projectId: string, scopes: string[]) => {\n const next: PersistedWorkbenchLayoutScopeIndex = { version: WORKBENCH_LAYOUT_INDEX_VERSION, scopes };\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, kind, projectId), JSON.stringify(next));\n };\n\n const touchProjectScope = (scope: string | undefined) => {\n const projectId = scopeProjectId(scope);\n if (!projectId || !scope) return;\n const scopes = readScopes(\"layout-scope-index\", projectId).filter((candidate) => candidate !== scope);\n scopes.push(scope);\n writeScopes(\"layout-scope-index\", projectId, scopes);\n };\n\n const touchResourceScope = (scope: string | undefined) => {\n const projectId = resourceProjectId(scope);\n if (!projectId || !scope) return;\n const scopes = readScopes(\"layout-resource-index\", projectId).filter((candidate) => candidate !== scope);\n scopes.push(scope);\n for (const evictedScope of scopes.splice(0, Math.max(0, scopes.length - WORKBENCH_LAYOUT_RESOURCE_LIMIT))) {\n storage.removeItem?.(workbenchStoragePersistenceKey(input.namespace, \"layout\", evictedScope));\n storage.removeItem?.(workbenchStoragePersistenceKey(input.namespace, \"panels\", evictedScope));\n }\n writeScopes(\"layout-resource-index\", projectId, scopes);\n };\n\n const flush = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n const writes = [...pending.values()];\n pending.clear();\n const generation = getGeneration();\n for (const write of writes) {\n if (write.generation !== generation) continue;\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, \"layout\", write.scope), write.raw);\n touchProjectScope(write.scope);\n touchResourceScope(write.scope);\n if (write.legacyPanelsKey) storage.removeItem?.(write.legacyPanelsKey);\n }\n };\n\n const scheduleFlush = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(flush, debounceMs);\n };\n\n eventTarget?.addEventListener(\"pagehide\", flush);\n\n return {\n getLayout: (scope) => {\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const pendingWrite = pending.get(key);\n const persisted =\n pendingWrite && pendingWrite.generation === getGeneration()\n ? (JSON.parse(pendingWrite.raw) as PersistedWorkbenchLayout)\n : readJson<PersistedWorkbenchLayout>(storage, key);\n if (persisted?.version === WORKBENCH_LAYOUT_VERSION) return persisted.layout;\n return undefined;\n },\n setLayout: (layout, scope) => {\n const persisted: PersistedWorkbenchLayoutV3 = { version: WORKBENCH_LAYOUT_VERSION, layout };\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const legacyPanelsKey = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope);\n pending.delete(key);\n pending.set(key, {\n generation: getGeneration(),\n legacyPanelsKey: storage.getItem(legacyPanelsKey) === null ? undefined : legacyPanelsKey,\n raw: JSON.stringify(persisted),\n scope,\n });\n scheduleFlush();\n },\n flush,\n listScopes(projectId) {\n return [\n ...new Set([\n ...readScopes(\"layout-scope-index\", projectId),\n ...readScopes(\"layout-resource-index\", projectId),\n ...storedProjectScopes(projectId),\n ]),\n ];\n },\n transformLayouts(projectId, transform) {\n flush();\n advanceGeneration();\n for (const scope of this.listScopes?.(projectId) ?? []) {\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const persisted = readJson<PersistedWorkbenchLayout>(storage, key);\n if (persisted?.version !== WORKBENCH_LAYOUT_VERSION) continue;\n const layout = transform(persisted.layout, scope);\n if (!layout) {\n storage.removeItem?.(key);\n continue;\n }\n storage.setItem(\n key,\n JSON.stringify({ version: WORKBENCH_LAYOUT_VERSION, layout } satisfies PersistedWorkbenchLayoutV3),\n );\n }\n },\n getCompatibilityMarker: (key) =>\n readJson<string>(storage, workbenchStoragePersistenceKey(input.namespace, \"layout-compatibility\", key)),\n setCompatibilityMarker: (key, value) => {\n advanceGeneration();\n storage.setItem(\n workbenchStoragePersistenceKey(input.namespace, \"layout-compatibility\", key),\n JSON.stringify(value),\n );\n },\n advanceWriteGeneration: advanceGeneration,\n dispose() {\n flush();\n eventTarget?.removeEventListener(\"pagehide\", flush);\n },\n };\n};\n","import type {\n LastResourcePersistenceAdapter,\n PersistedTreeRendererStates,\n PersistedWorkbenchHistory,\n PersistedWorkbenchPanels,\n ResourceRef,\n TreeRendererPersistenceAdapter,\n WorkbenchHistoryPersistence,\n WorkbenchPanelsPersistenceAdapter,\n WorkbenchPersistenceAdapter,\n WorkbenchSidePanelMode,\n WorkbenchSidePanelPersistenceAdapter,\n} from \"../core\";\nimport { createLocalStorageLayoutPersistence } from \"./local-storage-layout-persistence\";\nimport {\n type CreateWorkbenchStoragePersistenceInput,\n readJson,\n resolveStorage,\n workbenchStoragePersistenceKey,\n} from \"./local-storage-persistence-helpers\";\n\nexport type {\n WorkbenchStorageLike,\n WorkbenchStoragePersistenceKind,\n} from \"./local-storage-persistence-helpers\";\nexport { createLocalStorageLayoutPersistence, workbenchStoragePersistenceKey };\n\nexport interface CreateLocalStoragePanelsPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope: string;\n}\n\nexport interface CreateLocalStorageTreePersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport interface CreateLocalStorageWorkbenchPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport const createLocalStorageHistoryPersistence = (\n input: CreateWorkbenchStoragePersistenceInput,\n): WorkbenchHistoryPersistence => {\n const storage = resolveStorage(input.storage);\n return {\n getHistory: (scope) =>\n readJson<PersistedWorkbenchHistory>(storage, workbenchStoragePersistenceKey(input.namespace, \"history\", scope)),\n setHistory: (history, scope) => {\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, \"history\", scope), JSON.stringify(history));\n },\n };\n};\n\nexport const createLocalStoragePanelsPersistence = (\n input: CreateLocalStoragePanelsPersistenceInput,\n): WorkbenchPanelsPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n return {\n getPanelStates: (scope) =>\n readJson<PersistedWorkbenchPanels>(\n storage,\n workbenchStoragePersistenceKey(input.namespace, \"panels\", scope ?? input.scope),\n ),\n setPanelStates: (state, scope) => {\n const key = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope ?? input.scope);\n storage.setItem(key, JSON.stringify(state));\n },\n };\n};\n\nexport const createLocalStorageTreePersistence = (\n input: CreateLocalStorageTreePersistenceInput,\n): TreeRendererPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"tree\", input.scope);\n return {\n getTreeStates: () => readJson<PersistedTreeRendererStates>(storage, key),\n setTreeStates: (state) => {\n storage.setItem(key, JSON.stringify(state));\n },\n };\n};\n\nexport interface CreateLocalStorageLastResourcePersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nconst isResourceRef = (value: unknown): value is ResourceRef =>\n Boolean(value) && typeof (value as ResourceRef).kind === \"string\" && typeof (value as ResourceRef).uri === \"string\";\n\nexport const createLocalStorageLastResourcePersistence = (\n input: CreateLocalStorageLastResourcePersistenceInput,\n): LastResourcePersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"last-resource\", input.scope);\n return {\n getLastResource: () => {\n const parsed = readJson<unknown>(storage, key);\n return isResourceRef(parsed) ? parsed : undefined;\n },\n setLastResource: (resource) => {\n if (!resource) {\n storage.removeItem?.(key);\n return;\n }\n storage.setItem(key, JSON.stringify(resource));\n },\n };\n};\n\ninterface PersistedWorkbenchSidePanel {\n version: 1;\n mode: WorkbenchSidePanelMode;\n}\n\nconst WORKBENCH_SIDE_PANEL_VERSION = 1 as const;\nconst sidePanelModes: readonly WorkbenchSidePanelMode[] = [\"attached\", \"closed\", \"floating\"];\n\nexport interface CreateLocalStorageSidePanelPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport const createLocalStorageSidePanelPersistence = (\n input: CreateLocalStorageSidePanelPersistenceInput,\n): WorkbenchSidePanelPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"side-panel\", input.scope);\n return {\n getMode: () => {\n const persisted = readJson<PersistedWorkbenchSidePanel>(storage, key);\n if (persisted?.version !== WORKBENCH_SIDE_PANEL_VERSION) return undefined;\n return sidePanelModes.includes(persisted.mode) ? persisted.mode : undefined;\n },\n setMode: (mode) => {\n const persisted: PersistedWorkbenchSidePanel = { version: WORKBENCH_SIDE_PANEL_VERSION, mode };\n storage.setItem(key, JSON.stringify(persisted));\n },\n };\n};\n\nexport const createLocalStorageWorkbenchPersistence = (input: CreateLocalStorageWorkbenchPersistenceInput) => {\n const storage = resolveStorage(input.storage);\n const layoutPersistence = createLocalStorageLayoutPersistence({\n debounceMs: input.debounceMs,\n eventTarget: input.eventTarget,\n namespace: input.namespace,\n storage,\n });\n const snapshotPersistence: WorkbenchPersistenceAdapter = {\n getSnapshot: (scope) => {\n const layout = layoutPersistence.getLayout(scope);\n return layout ? { layout } : undefined;\n },\n setSnapshot: (snapshot, scope) => layoutPersistence.setLayout(snapshot.layout, scope),\n flush: layoutPersistence.flush,\n dispose: layoutPersistence.dispose,\n };\n\n return {\n snapshotPersistence,\n historyPersistence: createLocalStorageHistoryPersistence({ namespace: input.namespace, storage }),\n layoutPersistence,\n panelsPersistence: createLocalStoragePanelsPersistence({\n namespace: input.namespace,\n scope: input.scope ?? \"global\",\n storage,\n }),\n treePersistence: createLocalStorageTreePersistence({ namespace: input.namespace, scope: input.scope, storage }),\n lastResourcePersistence: createLocalStorageLastResourcePersistence({\n namespace: input.namespace,\n scope: input.scope,\n storage,\n }),\n sidePanelPersistence: createLocalStorageSidePanelPersistence({\n namespace: input.namespace,\n scope: input.scope,\n storage,\n }),\n };\n};\n"],"names":["workbenchStoragePersistenceKey","namespace","kind","scope","createMemoryStorage","map","Map","length","size","getItem","key","get","index","keys","setItem","value","set","removeItem","delete","resolveStorage","storage","localStorage","readJson","raw","JSON","parse","createLocalStorageLayoutPersistence","input","pending","debounceMs","eventTarget","window","addEventListener","type","listener","removeEventListener","undefined","timer","generationKey","getGeneration","persisted","version","generation","advanceGeneration","stringify","resourceProjectId","match","scopeProjectId","storedProjectScopes","projectId","prefix","scopes","startsWith","slice","push","readScopes","WORKBENCH_LAYOUT_INDEX_VERSION","Array","isArray","filter","writeScopes","next","touchProjectScope","candidate","touchResourceScope","evictedScope","splice","Math","max","WORKBENCH_LAYOUT_RESOURCE_LIMIT","flush","writes","values","clear","write","legacyPanelsKey","scheduleFlush","setTimeout","getLayout","pendingWrite","WORKBENCH_LAYOUT_VERSION","layout","setLayout","listScopes","Set","transformLayouts","transform","getCompatibilityMarker","setCompatibilityMarker","advanceWriteGeneration","dispose","createLocalStorageHistoryPersistence","getHistory","setHistory","history","createLocalStoragePanelsPersistence","getPanelStates","setPanelStates","state","createLocalStorageTreePersistence","getTreeStates","setTreeStates","isResourceRef","Boolean","uri","createLocalStorageLastResourcePersistence","getLastResource","parsed","setLastResource","resource","sidePanelModes","createLocalStorageSidePanelPersistence","getMode","WORKBENCH_SIDE_PANEL_VERSION","includes","mode","setMode","createLocalStorageWorkbenchPersistence","layoutPersistence","snapshotPersistence","getSnapshot","setSnapshot","snapshot","historyPersistence","panelsPersistence","treePersistence","lastResourcePersistence","sidePanelPersistence"],"mappings":"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"}
package/dist/testing.d.ts CHANGED
@@ -153,6 +153,7 @@ declare interface CommandParamDescriptor {
153
153
  declare interface CommandParamOption {
154
154
  label: string;
155
155
  value: string;
156
+ icon?: string;
156
157
  }
157
158
 
158
159
  declare type CommandParamSchema = Record<string, CommandParamDescriptor>;
@@ -342,7 +343,7 @@ declare interface DataTableRendererContribution {
342
343
  emptyDescription?: string;
343
344
  executeQuery(context: DataTableRendererQueryContext): Promise<DataTableRendererQueryResult> | DataTableRendererQueryResult;
344
345
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
345
- onRowClick?: (row: DataTableRendererRow) => void;
346
+ onRowActivate?: (row: DataTableRendererRow) => Promise<void> | void;
346
347
  }
347
348
 
348
349
  declare type DataTableRendererImplementation = (input: WorkbenchPanelRenderInput & {
@@ -473,6 +474,8 @@ declare interface FileRendererContent {
473
474
  content?: string;
474
475
  dataUrl?: string;
475
476
  placeholder?: string;
477
+ /** Ordered backing-store revision when one is available. */
478
+ revision?: string;
476
479
  }
477
480
 
478
481
  declare interface FileRendererContribution {
@@ -482,35 +485,53 @@ declare interface FileRendererContribution {
482
485
  /** Resolve the file's content (and identity) for the bound resource. */
483
486
  load(resource: ResourceRef | undefined): Promise<FileRendererContent> | FileRendererContent;
484
487
  /** Persist edited text. Absent ⇒ read-only. Never called for images. */
485
- save?(resource: ResourceRef | undefined, content: string): Promise<void> | void;
488
+ save?(resource: ResourceRef | undefined, content: string, origin?: FileRendererRefreshOrigin): Promise<FileRendererSaveResult | undefined> | FileRendererSaveResult | void;
486
489
  }
487
490
 
488
491
  declare type FileRendererImplementation = (input: WorkbenchPanelRenderInput & {
489
492
  fileRendererId: string;
490
493
  }) => unknown;
491
494
 
492
- declare interface FileRendererRefreshEvent {
495
+ declare interface FileRendererRefreshEnvelope {
496
+ resourceUri?: string;
497
+ origin?: FileRendererRefreshOrigin;
498
+ revision?: string;
499
+ }
500
+
501
+ declare interface FileRendererRefreshEvent extends FileRendererRefreshEnvelope {
493
502
  fileRendererId: string;
494
503
  }
495
504
 
496
505
  declare type FileRendererRefreshListener = (event: FileRendererRefreshEvent) => void;
497
506
 
507
+ declare interface FileRendererRefreshOrigin {
508
+ rendererId: string;
509
+ instanceId: string;
510
+ operationId: string;
511
+ }
512
+
498
513
  declare interface FileRendererRegistry {
499
514
  fileRendererStore: WorkbenchStore<FileRendererStoreState>;
500
515
  registerFileRenderer(contribution: FileRendererContribution, metadata?: ContributionMetadata): Disposable_2;
501
516
  setFileRendererImplementation(impl: FileRendererImplementation): void;
502
517
  getFileRenderer(id: string): RegisteredFileRendererContribution | undefined;
503
518
  listFileRenderers(): RegisteredFileRendererContribution[];
504
- refreshFileRenderer(id: string): void;
519
+ refreshFileRenderer(id: string, event?: FileRendererRefreshEnvelope): void;
505
520
  onDidRefreshFileRenderer(listener: FileRendererRefreshListener): Disposable_2;
506
521
  }
507
522
 
523
+ declare interface FileRendererSaveResult {
524
+ revision?: string;
525
+ }
526
+
508
527
  declare interface FileRendererStoreState {
509
528
  renderers: Record<string, RegisteredFileRendererContribution>;
510
529
  }
511
530
 
512
531
  declare interface HistoryController {
513
532
  store: WorkbenchStore<HistoryStoreState>;
533
+ /** Snapshot the history for a compound navigation; the returned function restores it. */
534
+ createCheckpoint(): () => void;
514
535
  goBack(): HistoryEntry | undefined;
515
536
  goForward(): HistoryEntry | undefined;
516
537
  goPrevious(): HistoryEntry | undefined;
@@ -536,6 +557,8 @@ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = Ka
536
557
  id: string;
537
558
  title: string;
538
559
  resourceKind?: string;
560
+ /** Host-owned scope for persisted display settings. */
561
+ storageScope?: string;
539
562
  /**
540
563
  * Declarative attribute schema. The renderer dispatches filter / group /
541
564
  * sort / display / inline-edit behavior on each descriptor's `type.kind`.
@@ -563,8 +586,8 @@ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = Ka
563
586
  */
564
587
  executeQuery(state: KanbanRendererQueryState): Promise<TRow[]> | TRow[];
565
588
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
566
- /** Row interactions surfaced by the renderer (mirrored from <KanbanRenderer>). */
567
- onRowClick?: (row: TRow) => void;
589
+ /** Row activation surfaced by the renderer (mirrored from <KanbanRenderer>). */
590
+ onRowActivate?: (row: TRow) => Promise<void> | void;
568
591
  /** Per-row right-click context menu actions (mirrored from <KanbanRenderer>). */
569
592
  getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];
570
593
  /**
@@ -658,7 +681,7 @@ declare interface KanbanRendererRow {
658
681
  title: string;
659
682
  /**
660
683
  * Optional navigation handle. When set, the renderer's default click handler
661
- * routes through the contribution's onRowClick (which typically opens the
684
+ * routes through the contribution's onRowActivate (which typically opens the
662
685
  * resource via the workbench).
663
686
  */
664
687
  resource?: unknown;
@@ -763,6 +786,16 @@ declare interface LayoutModel {
763
786
  carryRegionState?: readonly WorkbenchRegion[];
764
787
  }): void;
765
788
  getPersistenceScope(): LayoutScope | undefined;
789
+ /** True when the current persistence scope already stores a layout. A new scope returns false. */
790
+ /** Whether anything is stored for the active scope right now. */
791
+ hasPersistedLayout(): boolean;
792
+ /**
793
+ * Whether the active scope was entered with a layout the user already had. Unlike
794
+ * `hasPersistedLayout`, writes made while entering a mode do not change the answer.
795
+ */
796
+ enteredWithPersistedLayout(): boolean;
797
+ /** Moves owned panel menus beside their owner's current region and removes orphan menus. */
798
+ reconcilePanelMenus(): void;
766
799
  onWillChangePersistenceScope(listener: (scope: LayoutScope | undefined) => void): {
767
800
  dispose(): void;
768
801
  };
@@ -875,6 +908,7 @@ declare interface OpenWidgetInput {
875
908
  resource?: ResourceRef;
876
909
  title?: string;
877
910
  region?: WorkbenchRegion;
911
+ role?: WorkbenchWidgetRole;
878
912
  ownerId?: string;
879
913
  source?: ContributionSource;
880
914
  pinned?: boolean;
@@ -892,7 +926,9 @@ declare interface OpenWorkbenchPanelInput {
892
926
  resource?: ResourceRef;
893
927
  title?: string;
894
928
  region?: WorkbenchRegion;
929
+ role?: WorkbenchWidgetRole;
895
930
  pinned?: boolean;
931
+ closable?: boolean;
896
932
  mountStrategy?: WorkbenchPanelMountStrategy;
897
933
  hiddenByDefault?: boolean;
898
934
  tab?: WorkbenchPanelTab;
@@ -1006,7 +1042,6 @@ declare type RegisteredWidgetContribution = Omit<WidgetContribution, "priority"
1006
1042
  ownedPanelMenuIds?: readonly string[];
1007
1043
  singleton: boolean;
1008
1044
  reuse: WidgetReusePolicy;
1009
- role: WorkbenchWidgetRole;
1010
1045
  } & RegisteredContributionMetadata;
1011
1046
 
1012
1047
  declare interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {
@@ -1044,6 +1079,14 @@ declare interface ResourceContextAction {
1044
1079
  separatorBefore?: boolean;
1045
1080
  }
1046
1081
 
1082
+ declare interface ResourceHierarchyCycle {
1083
+ code: typeof resourceHierarchyCycleCode;
1084
+ path: ResourceRef[];
1085
+ repeatedUri: string;
1086
+ }
1087
+
1088
+ declare const resourceHierarchyCycleCode = "resource_hierarchy_cycle";
1089
+
1047
1090
  declare interface ResourceHierarchyProvider {
1048
1091
  id: string;
1049
1092
  priority?: number;
@@ -1116,6 +1159,7 @@ declare interface ResourceRegistry {
1116
1159
  registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable_2;
1117
1160
  listHierarchyProviders(): ResolvedResourceHierarchyProvider[];
1118
1161
  walkHierarchy(resource: ResourceRef | undefined): ResourceRef[];
1162
+ onDidDetectHierarchyCycle(listener: (cycle: ResourceHierarchyCycle) => void): Disposable_2;
1119
1163
  isOpeningResource(): boolean;
1120
1164
  openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<WorkbenchPanelInstance>;
1121
1165
  onDidOpenResource(listener: (resource: ResourceRef) => void): Disposable_2;
@@ -1395,6 +1439,7 @@ declare interface WidgetContribution {
1395
1439
  mountStrategy?: WidgetMountStrategy;
1396
1440
  closable?: boolean;
1397
1441
  hiddenByDefault?: boolean;
1442
+ subPanelsOnly?: boolean;
1398
1443
  regionSize?: WorkbenchRegionSize;
1399
1444
  regionCollapsible?: boolean;
1400
1445
  headerBorderBottom?: boolean;
@@ -1403,7 +1448,6 @@ declare interface WidgetContribution {
1403
1448
  priority?: number;
1404
1449
  rendererId: string;
1405
1450
  openCommandId?: string;
1406
- role?: WorkbenchWidgetRole;
1407
1451
  eligibleLocations?: WorkbenchLocationEligibility;
1408
1452
  panelMenuOwner?: WorkbenchPanelMenuOwner;
1409
1453
  tab?: WorkbenchWidgetTab;
@@ -1503,6 +1547,20 @@ declare interface WorkbenchCommandParamsRequest {
1503
1547
  context?: WorkbenchCommandExecutionContext;
1504
1548
  }
1505
1549
 
1550
+ declare interface WorkbenchCompositionAddablePanel extends WorkbenchModeAddablePanel {
1551
+ contribution: RegisteredWidgetContribution;
1552
+ }
1553
+
1554
+ declare interface WorkbenchCompositionController {
1555
+ panelsFor(region: WorkbenchPanelRegion): WorkbenchCompositionRegionPanels;
1556
+ }
1557
+
1558
+ declare interface WorkbenchCompositionRegionPanels {
1559
+ open: readonly WorkbenchWidgetPlacement[];
1560
+ addable: readonly WorkbenchCompositionAddablePanel[];
1561
+ closable: readonly string[];
1562
+ }
1563
+
1506
1564
  declare interface WorkbenchCore extends WorkbenchCoreContributionContext {
1507
1565
  host: WorkbenchHost;
1508
1566
  registerModule(module: WorkbenchModuleContribution): Disposable_2;
@@ -1514,6 +1572,7 @@ declare interface WorkbenchCoreContributionContext {
1514
1572
  commandPalette: WorkbenchCommandPaletteController;
1515
1573
  commandPaletteResources: CommandPaletteResourceRegistry;
1516
1574
  commands: CommandRegistry;
1575
+ composition: WorkbenchCompositionController;
1517
1576
  context: ContextKeyService;
1518
1577
  focus: WorkbenchFocusController;
1519
1578
  history: HistoryController;
@@ -1522,6 +1581,7 @@ declare interface WorkbenchCoreContributionContext {
1522
1581
  layout: WorkbenchLayoutModel;
1523
1582
  modes: WorkbenchModeRegistry;
1524
1583
  navigation: NavigationRegistry;
1584
+ navigator: WorkbenchNavigator;
1525
1585
  notifications: NotificationRegistry;
1526
1586
  panels: WorkbenchPanelsController;
1527
1587
  preferences: PreferenceRegistry;
@@ -1594,7 +1654,7 @@ declare interface WorkbenchLayoutStoreState {
1594
1654
  placeholders: Partial<Record<WorkbenchRegion, RegisteredPlaceholderContribution>>;
1595
1655
  }
1596
1656
 
1597
- declare type WorkbenchLocationContribution = Omit<WidgetContribution, "role"> & WorkbenchPanelMenusContribution;
1657
+ declare type WorkbenchLocationContribution = WidgetContribution & WorkbenchPanelMenusContribution;
1598
1658
 
1599
1659
  declare interface WorkbenchLocationEligibility {
1600
1660
  modeIds?: string[];
@@ -1616,15 +1676,31 @@ declare type WorkbenchModeActivationContext = WorkbenchCoreContributionContext;
1616
1676
 
1617
1677
  declare type WorkbenchModeActivationResult = Disposable_2 | readonly Disposable_2[] | undefined;
1618
1678
 
1679
+ declare interface WorkbenchModeAddablePanel {
1680
+ panelId: string;
1681
+ region: WorkbenchPanelRegion;
1682
+ allowedRegions?: readonly WorkbenchRegion[];
1683
+ pinned?: boolean;
1684
+ }
1685
+
1686
+ declare interface WorkbenchModeAddablePanelContext {
1687
+ layout: WorkbenchLayout;
1688
+ resource?: ResourceRef;
1689
+ }
1690
+
1619
1691
  declare type WorkbenchModeChangeListener = () => void;
1620
1692
 
1621
1693
  declare interface WorkbenchModeContribution {
1622
1694
  id: string;
1623
1695
  label?: string;
1624
1696
  panels?: readonly WorkbenchPanelRegion[];
1697
+ resourceKinds?: readonly string[];
1698
+ defaultResource?: ResourceRef | (() => Promise<ResourceRef | undefined> | ResourceRef | undefined);
1699
+ listAddablePanels?(context: WorkbenchModeAddablePanelContext): readonly WorkbenchModeAddablePanel[];
1625
1700
  activate(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1626
1701
  seed?(ctx: WorkbenchModeActivationContext): void;
1627
1702
  enter?(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1703
+ reconcile?(ctx: WorkbenchModeActivationContext): void;
1628
1704
  }
1629
1705
 
1630
1706
  declare interface WorkbenchModeRegistry {
@@ -1660,6 +1736,14 @@ declare interface WorkbenchModuleContribution {
1660
1736
 
1661
1737
  declare type WorkbenchModuleContributionContext = WorkbenchModuleContext;
1662
1738
 
1739
+ declare interface WorkbenchNavigationCommit {
1740
+ modeId: string | undefined;
1741
+ resource: ResourceRef | undefined;
1742
+ replaceActive: boolean;
1743
+ }
1744
+
1745
+ declare type WorkbenchNavigationDiagnosticCode = "navigation_mode_missing" | "navigation_resource_missing" | "navigation_resource_incompatible" | "navigation_default_missing" | "navigation_target_stale";
1746
+
1663
1747
  declare interface WorkbenchNavigationEntry {
1664
1748
  entryId: string;
1665
1749
  recordedAt: number;
@@ -1674,6 +1758,53 @@ declare interface WorkbenchNavigationEntry {
1674
1758
  closedSubPanel?: WorkbenchClosedSubPanel;
1675
1759
  }
1676
1760
 
1761
+ declare type WorkbenchNavigationResult = {
1762
+ ok: true;
1763
+ modeId: string | undefined;
1764
+ resource: ResourceRef | undefined;
1765
+ } | {
1766
+ ok: false;
1767
+ code: WorkbenchNavigationDiagnosticCode;
1768
+ message: string;
1769
+ };
1770
+
1771
+ declare interface WorkbenchNavigationTarget {
1772
+ modeId?: string;
1773
+ resource?: ResourceRef;
1774
+ replaceActive?: boolean;
1775
+ }
1776
+
1777
+ declare interface WorkbenchNavigator {
1778
+ configure(hooks: WorkbenchNavigatorHostHooks): void;
1779
+ getSelectedResource(): ResourceRef | undefined;
1780
+ open(target: WorkbenchNavigationTarget): Promise<WorkbenchNavigationResult>;
1781
+ commitContext(input: WorkbenchNavigatorCommitInput): WorkbenchNavigationResult;
1782
+ getLastResource(projectId: string | undefined, modeId: string): ResourceRef | undefined;
1783
+ forgetResource(uri: string): void;
1784
+ onDidCommit(listener: (commit: WorkbenchNavigationCommit) => void): {
1785
+ dispose(): void;
1786
+ };
1787
+ }
1788
+
1789
+ declare interface WorkbenchNavigatorCommitInput {
1790
+ modeId?: string | null;
1791
+ resource?: ResourceRef | null;
1792
+ replaceActive?: boolean;
1793
+ present?: boolean;
1794
+ }
1795
+
1796
+ declare interface WorkbenchNavigatorHostHooks {
1797
+ getProjectId?(): string | undefined;
1798
+ getSelectedResource?(): ResourceRef | undefined;
1799
+ interpretSelection?(resource: ResourceRef): ResourceRef | undefined;
1800
+ applySelection?(resource: ResourceRef | undefined): void;
1801
+ applyScope?(commit: WorkbenchNavigationCommit): void;
1802
+ applyBreadcrumb?(resource: ResourceRef | undefined): void;
1803
+ presentResource?(resource: ResourceRef, input: {
1804
+ replaceActive: boolean;
1805
+ }): Promise<unknown> | unknown;
1806
+ }
1807
+
1677
1808
  declare interface WorkbenchNotification {
1678
1809
  id?: string;
1679
1810
  level: WorkbenchNotificationLevel;
@@ -1715,11 +1846,11 @@ declare interface WorkbenchPanelContribution {
1715
1846
  region: WorkbenchRegion;
1716
1847
  fallbackRegion?: WorkbenchRegion;
1717
1848
  rendererId: string;
1718
- closable: boolean;
1719
1849
  singleton?: boolean;
1720
1850
  reuse?: WorkbenchPanelReusePolicy;
1721
1851
  mountStrategy?: WorkbenchPanelMountStrategy;
1722
1852
  hiddenByDefault?: boolean;
1853
+ subPanelsOnly?: boolean;
1723
1854
  regionSize?: WorkbenchRegionSize;
1724
1855
  regionCollapsible?: boolean;
1725
1856
  headerBorderBottom?: boolean;
@@ -1770,7 +1901,7 @@ declare interface WorkbenchPanelInstance_2 {
1770
1901
  tab?: WorkbenchPanelTab_2;
1771
1902
  }
1772
1903
 
1773
- declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
1904
+ declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
1774
1905
  region: WorkbenchPanelMenuRegion;
1775
1906
  fallbackRegion?: WorkbenchPanelMenuRegion;
1776
1907
  };
@@ -1828,13 +1959,14 @@ declare type WorkbenchPanelMountStrategy = WidgetMountStrategy;
1828
1959
  declare type WorkbenchPanelMountStrategy_2 = WidgetMountStrategy_2;
1829
1960
 
1830
1961
  declare type WorkbenchPanelOpenStrategy = {
1831
- kind: "activate-or-open";
1962
+ kind: "persistent";
1832
1963
  position?: WorkbenchTabPosition;
1833
1964
  } | {
1834
1965
  kind: "replace-active";
1835
1966
  } | {
1836
1967
  kind: "replace-panel";
1837
1968
  instanceId: string;
1969
+ retention?: WorkbenchTabRetention;
1838
1970
  } | {
1839
1971
  kind: "preview";
1840
1972
  position?: WorkbenchTabPosition;
@@ -1975,7 +2107,7 @@ declare type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;
1975
2107
 
1976
2108
  declare type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;
1977
2109
 
1978
- declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
2110
+ declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
1979
2111
  region: WorkbenchPanelRegion;
1980
2112
  fallbackRegion?: WorkbenchPanelRegion;
1981
2113
  } & 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;"}