@pstdio/workbench 0.8.0 → 0.9.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 (44) hide show
  1. package/README.md +39 -317
  2. package/dist/extensions.d.ts +1283 -774
  3. package/dist/extensions.js +1454 -1924
  4. package/dist/extensions.js.map +1 -1
  5. package/dist/file-renderer-view-kfJRY3yR.js +515 -0
  6. package/dist/file-renderer-view-kfJRY3yR.js.map +1 -0
  7. package/dist/index.d.ts +589 -644
  8. package/dist/index.js +5011 -2644
  9. package/dist/index.js.map +1 -1
  10. package/dist/react.d.ts +540 -585
  11. package/dist/react.js +3583 -3424
  12. package/dist/react.js.map +1 -1
  13. package/dist/storage.d.ts +118 -157
  14. package/dist/storage.js +135 -149
  15. package/dist/storage.js.map +1 -1
  16. package/dist/webview-runtime.d.ts +2 -5
  17. package/dist/webview-runtime.js +3 -3
  18. package/dist/webview-runtime.js.map +1 -1
  19. package/dist/workbench-menu-paths-B_QJzcNU.js +12 -0
  20. package/dist/workbench-menu-paths-B_QJzcNU.js.map +1 -0
  21. package/dist/workbench-renderers-DmsrBGC7.js +960 -0
  22. package/dist/workbench-renderers-DmsrBGC7.js.map +1 -0
  23. package/dist/workspaces-DJwFj8uq.js +1872 -0
  24. package/dist/workspaces-DJwFj8uq.js.map +1 -0
  25. package/package.json +6 -41
  26. package/dist/composition-resolver-types-CWykPyEK.js +0 -241
  27. package/dist/composition-resolver-types-CWykPyEK.js.map +0 -1
  28. package/dist/file-renderer-view-B6_iR4EN.js +0 -496
  29. package/dist/file-renderer-view-B6_iR4EN.js.map +0 -1
  30. package/dist/file-section-navigation-CfYqVObc.js +0 -30
  31. package/dist/file-section-navigation-CfYqVObc.js.map +0 -1
  32. package/dist/layout-types-DMoZz38-.js +0 -100
  33. package/dist/layout-types-DMoZz38-.js.map +0 -1
  34. package/dist/surface-map-C1pOTUmF.js +0 -52
  35. package/dist/surface-map-C1pOTUmF.js.map +0 -1
  36. package/dist/testing.d.ts +0 -2443
  37. package/dist/testing.js +0 -58
  38. package/dist/testing.js.map +0 -1
  39. package/dist/workbench-built-ins-BCJ6-fIM.js +0 -1173
  40. package/dist/workbench-built-ins-BCJ6-fIM.js.map +0 -1
  41. package/dist/workbench-menu-paths-D-e7iscN.js +0 -43
  42. package/dist/workbench-menu-paths-D-e7iscN.js.map +0 -1
  43. package/dist/workflow-status-settings-DLiu9FZ0.js +0 -144
  44. package/dist/workflow-status-settings-DLiu9FZ0.js.map +0 -1
package/dist/storage.js CHANGED
@@ -1,20 +1,20 @@
1
- const i = (e, t, n) => `${e}:${t}:${n ?? "global"}`, h = () => {
1
+ const c = (e, s, n) => `${e}:${s}:${n ?? "global"}`, P = () => {
2
2
  const e = /* @__PURE__ */ new Map();
3
3
  return {
4
4
  get length() {
5
5
  return e.size;
6
6
  },
7
- getItem: (t) => e.get(t) ?? null,
8
- key: (t) => [...e.keys()][t] ?? null,
9
- setItem: (t, n) => {
10
- e.set(t, n);
7
+ getItem: (s) => e.get(s) ?? null,
8
+ key: (s) => [...e.keys()][s] ?? null,
9
+ setItem: (s, n) => {
10
+ e.set(s, n);
11
11
  },
12
- removeItem: (t) => {
13
- e.delete(t);
12
+ removeItem: (s) => {
13
+ e.delete(s);
14
14
  }
15
15
  };
16
- }, d = (e) => e || (typeof localStorage < "u" ? localStorage : h()), y = (e, t) => {
17
- const n = e.getItem(t);
16
+ }, p = (e) => e || (typeof localStorage < "u" ? localStorage : P()), g = (e, s) => {
17
+ const n = e.getItem(s);
18
18
  if (n)
19
19
  try {
20
20
  return JSON.parse(n);
@@ -23,218 +23,204 @@ const i = (e, t, n) => `${e}:${t}:${n ?? "global"}`, h = () => {
23
23
  }
24
24
  };
25
25
  const T = (e) => {
26
- const t = d(e.storage), n = /* @__PURE__ */ new Map(), c = e.debounceMs ?? 250, g = e.eventTarget ?? (typeof window < "u" ? {
27
- addEventListener: (s, r) => window.addEventListener(s, r),
28
- removeEventListener: (s, r) => window.removeEventListener(s, r)
26
+ const s = p(e.storage), n = /* @__PURE__ */ new Map(), i = e.debounceMs ?? 250, l = e.eventTarget ?? (typeof window < "u" ? {
27
+ addEventListener: (t, r) => window.addEventListener(t, r),
28
+ removeEventListener: (t, r) => window.removeEventListener(t, r)
29
29
  } : void 0);
30
- let l;
31
- const v = i(e.namespace, "layout-generation", void 0), S = () => {
32
- const s = y(t, v);
33
- return typeof s == "object" && s !== null && "version" in s && s.version === 1 && "generation" in s && typeof s.generation == "number" ? s.generation : 0;
34
- }, O = () => {
35
- const s = S() + 1, r = {
30
+ let d;
31
+ const N = c(e.namespace, "layout-generation", void 0), O = () => {
32
+ const t = g(s, N);
33
+ return typeof t == "object" && t !== null && "version" in t && t.version === 1 && "generation" in t && typeof t.generation == "number" ? t.generation : 0;
34
+ }, E = () => {
35
+ const t = O() + 1, r = {
36
36
  version: 1,
37
- generation: s
37
+ generation: t
38
38
  };
39
- return t.setItem(v, JSON.stringify(r)), s;
40
- }, N = (s) => s?.match(/^project\/([^/]+)\/mode\/[^/]+\/resource\//)?.[1], I = (s) => s?.match(/^project\/([^/]+)/)?.[1], L = (s) => {
41
- if (!t.key) return [];
39
+ return s.setItem(N, JSON.stringify(r)), t;
40
+ }, I = (t) => t?.match(/^project\/([^/]+)\/mode\/[^/]+\/resource\//)?.[1], f = (t) => t?.match(/^project\/([^/]+)/)?.[1], _ = (t) => {
41
+ if (!s.key) return [];
42
42
  const r = `${e.namespace}:layout:`, o = [];
43
- for (let a = 0; a < (t.length ?? 0); a += 1) {
44
- const m = t.key(a);
45
- if (!m?.startsWith(r)) continue;
46
- const u = m.slice(r.length);
47
- I(u) === s && o.push(u);
43
+ for (let a = 0; a < (s.length ?? 0); a += 1) {
44
+ const u = s.key(a);
45
+ if (!u?.startsWith(r)) continue;
46
+ const y = u.slice(r.length);
47
+ f(y) === t && o.push(y);
48
48
  }
49
49
  return o;
50
- }, f = (s, r) => {
51
- const o = y(t, i(e.namespace, s, r));
52
- return typeof o == "object" && o !== null && "version" in o && o.version === 1 && "scopes" in o && Array.isArray(o.scopes) ? o.scopes.filter((a) => typeof a == "string" && t.getItem(i(e.namespace, "layout", a)) !== null) : [];
53
- }, E = (s, r, o) => {
50
+ }, S = (t, r) => {
51
+ const o = g(s, c(e.namespace, t, r));
52
+ return typeof o == "object" && o !== null && "version" in o && o.version === 1 && "scopes" in o && Array.isArray(o.scopes) ? o.scopes.filter((a) => typeof a == "string" && s.getItem(c(e.namespace, "layout", a)) !== null) : [];
53
+ }, v = (t, r, o) => {
54
54
  const a = {
55
55
  version: 1,
56
56
  scopes: o
57
57
  };
58
- t.setItem(i(e.namespace, s, r), JSON.stringify(a));
59
- }, R = (s) => {
60
- const r = I(s);
61
- if (!r || !s) return;
62
- const o = f("layout-scope-index", r).filter((a) => a !== s);
63
- o.push(s), E("layout-scope-index", r, o);
64
- }, _ = (s) => {
65
- const r = N(s);
66
- if (!r || !s) return;
67
- const o = f("layout-resource-index", r).filter((a) => a !== s);
68
- o.push(s);
58
+ s.setItem(c(e.namespace, t, r), JSON.stringify(a));
59
+ }, L = (t) => {
60
+ const r = f(t);
61
+ if (!r || !t) return;
62
+ const o = S("layout-scope-index", r).filter((a) => a !== t);
63
+ o.push(t), v("layout-scope-index", r, o);
64
+ }, R = (t) => {
65
+ const r = I(t);
66
+ if (!r || !t) return;
67
+ const o = S("layout-resource-index", r).filter((a) => a !== t);
68
+ o.push(t);
69
69
  for (const a of o.splice(0, Math.max(0, o.length - 50)))
70
- t.removeItem?.(i(e.namespace, "layout", a)), t.removeItem?.(i(e.namespace, "panels", a));
71
- E("layout-resource-index", r, o);
72
- }, p = () => {
73
- l && clearTimeout(l), l = void 0;
74
- const s = [...n.values()];
70
+ s.removeItem?.(c(e.namespace, "layout", a)), s.removeItem?.(c(e.namespace, "panel-menus", a));
71
+ v("layout-resource-index", r, o);
72
+ }, m = () => {
73
+ d && clearTimeout(d), d = void 0;
74
+ const t = [...n.values()];
75
75
  n.clear();
76
- const r = S();
77
- for (const o of s)
78
- o.generation === r && (t.setItem(i(e.namespace, "layout", o.scope), o.raw), R(o.scope), _(o.scope), o.legacyPanelsKey && t.removeItem?.(o.legacyPanelsKey));
79
- }, P = () => {
80
- l && clearTimeout(l), l = setTimeout(p, c);
76
+ const r = O();
77
+ for (const o of t)
78
+ o.generation === r && (s.setItem(c(e.namespace, "layout", o.scope), o.raw), L(o.scope), R(o.scope));
79
+ }, h = () => {
80
+ d && clearTimeout(d), d = setTimeout(m, i);
81
81
  };
82
- return g?.addEventListener("pagehide", p), {
83
- getLayout: (s) => {
84
- const r = i(e.namespace, "layout", s), o = n.get(r), a = o && o.generation === S() ? JSON.parse(o.raw) : y(t, r);
85
- if (a?.version === 3) return a.layout;
82
+ return l?.addEventListener("pagehide", m), {
83
+ getLayout: (t) => {
84
+ const r = c(e.namespace, "layout", t), o = n.get(r), a = o && o.generation === O() ? JSON.parse(o.raw) : g(s, r);
85
+ if (a?.version === 4) return a.layout;
86
86
  },
87
- setLayout: (s, r) => {
87
+ setLayout: (t, r) => {
88
88
  const o = {
89
- version: 3,
90
- layout: s
91
- }, a = i(e.namespace, "layout", r), m = i(e.namespace, "panels", r);
89
+ version: 4,
90
+ layout: t
91
+ }, a = c(e.namespace, "layout", r);
92
92
  n.delete(a), n.set(a, {
93
- generation: S(),
94
- legacyPanelsKey: t.getItem(m) === null ? void 0 : m,
93
+ generation: O(),
95
94
  raw: JSON.stringify(o),
96
95
  scope: r
97
- }), P();
96
+ }), h();
98
97
  },
99
- flush: p,
100
- listScopes(s) {
101
- return [.../* @__PURE__ */ new Set([...f("layout-scope-index", s), ...f("layout-resource-index", s), ...L(s)])];
98
+ flush: m,
99
+ listScopes(t) {
100
+ return [.../* @__PURE__ */ new Set([...S("layout-scope-index", t), ...S("layout-resource-index", t), ..._(t)])];
102
101
  },
103
- transformLayouts(s, r) {
104
- p(), O();
105
- for (const o of this.listScopes?.(s) ?? []) {
106
- const a = i(e.namespace, "layout", o), m = y(t, a);
107
- if (m?.version !== 3) continue;
108
- const u = r(m.layout, o);
109
- if (!u) {
110
- t.removeItem?.(a);
102
+ transformLayouts(t, r) {
103
+ m(), E();
104
+ for (const o of this.listScopes?.(t) ?? []) {
105
+ const a = c(e.namespace, "layout", o), u = g(s, a);
106
+ if (u?.version !== 4) continue;
107
+ const y = r(u.layout, o);
108
+ if (!y) {
109
+ s.removeItem?.(a);
111
110
  continue;
112
111
  }
113
- t.setItem(a, JSON.stringify({
114
- version: 3,
115
- layout: u
112
+ s.setItem(a, JSON.stringify({
113
+ version: 4,
114
+ layout: y
116
115
  }));
117
116
  }
118
117
  },
119
- getCompatibilityMarker: (s) => y(t, i(e.namespace, "layout-compatibility", s)),
120
- setCompatibilityMarker: (s, r) => {
121
- O(), t.setItem(i(e.namespace, "layout-compatibility", s), JSON.stringify(r));
118
+ getCompatibilityMarker: (t) => g(s, c(e.namespace, "layout-compatibility", t)),
119
+ setCompatibilityMarker: (t, r) => {
120
+ E(), s.setItem(c(e.namespace, "layout-compatibility", t), JSON.stringify(r));
122
121
  },
123
- advanceWriteGeneration: O,
122
+ advanceWriteGeneration: E,
124
123
  dispose() {
125
- p(), g?.removeEventListener("pagehide", p);
124
+ m(), l?.removeEventListener("pagehide", m);
126
125
  }
127
126
  };
128
- }, K = (e) => {
129
- const t = d(e.storage);
130
- return {
131
- getHistory: (n) => y(t, i(e.namespace, "history", n)),
132
- setHistory: (n, c) => {
133
- t.setItem(i(e.namespace, "history", c), JSON.stringify(n));
134
- }
135
- };
136
- }, k = (e) => {
137
- const t = d(e.storage);
127
+ };
128
+ const C = (e) => {
129
+ const s = p(e.storage);
138
130
  return {
139
- getPanelStates: (n) => y(t, i(e.namespace, "panels", n ?? e.scope)),
140
- setPanelStates: (n, c) => {
141
- const g = i(e.namespace, "panels", c ?? e.scope);
142
- t.setItem(g, JSON.stringify(n));
131
+ load: (n) => {
132
+ const i = g(s, c(e.namespace, "page-location", n));
133
+ return i?.version === 1 ? i.location : void 0;
134
+ },
135
+ save: (n, i) => {
136
+ const l = {
137
+ version: 1,
138
+ location: i
139
+ };
140
+ s.setItem(c(e.namespace, "page-location", n), JSON.stringify(l));
143
141
  }
144
142
  };
145
- }, w = (e) => {
146
- const t = d(e.storage), n = i(e.namespace, "tree", e.scope);
143
+ }, A = (e) => {
144
+ const s = p(e.storage);
147
145
  return {
148
- getTreeStates: () => y(t, n),
149
- setTreeStates: (c) => {
150
- t.setItem(n, JSON.stringify(c));
146
+ getMenuStates: (n) => g(s, c(e.namespace, "panel-menus", n ?? e.scope)),
147
+ setMenuStates: (n, i) => {
148
+ const l = c(e.namespace, "panel-menus", i ?? e.scope);
149
+ s.setItem(l, JSON.stringify(n));
151
150
  }
152
151
  };
153
- }, C = (e) => !!e && typeof e.kind == "string" && typeof e.uri == "string", W = (e) => {
154
- const t = d(e.storage), n = i(e.namespace, "last-resource", e.scope);
152
+ }, W = (e) => {
153
+ const s = p(e.storage), n = c(e.namespace, "tree", e.scope);
155
154
  return {
156
- getLastResource: () => {
157
- const c = y(t, n);
158
- return C(c) ? c : void 0;
159
- },
160
- setLastResource: (c) => {
161
- if (!c) {
162
- t.removeItem?.(n);
163
- return;
164
- }
165
- t.setItem(n, JSON.stringify(c));
155
+ getTreeStates: () => g(s, n),
156
+ setTreeStates: (i) => {
157
+ s.setItem(n, JSON.stringify(i));
166
158
  }
167
159
  };
168
160
  };
169
- const H = ["attached", "closed", "floating"], b = (e) => {
170
- const t = d(e.storage), n = i(e.namespace, "side-panel", e.scope);
161
+ const M = ["attached", "closed", "floating"], K = (e) => {
162
+ const s = p(e.storage), n = c(e.namespace, "side-panel", e.scope);
171
163
  return {
172
164
  getMode: () => {
173
- const c = y(t, n);
174
- if (c?.version === 1)
175
- return H.includes(c.mode) ? c.mode : void 0;
165
+ const i = g(s, n);
166
+ if (i?.version === 1)
167
+ return M.includes(i.mode) ? i.mode : void 0;
176
168
  },
177
- setMode: (c) => {
178
- const g = {
169
+ setMode: (i) => {
170
+ const l = {
179
171
  version: 1,
180
- mode: c
172
+ mode: i
181
173
  };
182
- t.setItem(n, JSON.stringify(g));
174
+ s.setItem(n, JSON.stringify(l));
183
175
  }
184
176
  };
185
- }, A = (e) => {
186
- const t = d(e.storage), n = T({
177
+ }, w = (e) => {
178
+ const s = p(e.storage), n = T({
187
179
  debounceMs: e.debounceMs,
188
180
  eventTarget: e.eventTarget,
189
181
  namespace: e.namespace,
190
- storage: t
182
+ storage: s
191
183
  });
192
184
  return {
193
185
  snapshotPersistence: {
194
- getSnapshot: (g) => {
195
- const l = n.getLayout(g);
196
- return l ? {
197
- layout: l
186
+ getSnapshot: (l) => {
187
+ const d = n.getLayout(l);
188
+ return d ? {
189
+ layout: d
198
190
  } : void 0;
199
191
  },
200
- setSnapshot: (g, l) => n.setLayout(g.layout, l),
192
+ setSnapshot: (l, d) => n.setLayout(l.layout, d),
201
193
  flush: n.flush,
202
194
  dispose: n.dispose
203
195
  },
204
- historyPersistence: K({
205
- namespace: e.namespace,
206
- storage: t
207
- }),
208
196
  layoutPersistence: n,
209
- panelsPersistence: k({
197
+ panelMenuStatePersistence: A({
210
198
  namespace: e.namespace,
211
199
  scope: e.scope ?? "global",
212
- storage: t
200
+ storage: s
213
201
  }),
214
- treePersistence: w({
202
+ pageLocationPersistence: C({
215
203
  namespace: e.namespace,
216
- scope: e.scope,
217
- storage: t
204
+ storage: s
218
205
  }),
219
- lastResourcePersistence: W({
206
+ treePersistence: W({
220
207
  namespace: e.namespace,
221
208
  scope: e.scope,
222
- storage: t
209
+ storage: s
223
210
  }),
224
- sidePanelPersistence: b({
211
+ sidePanelPersistence: K({
225
212
  namespace: e.namespace,
226
213
  scope: e.scope,
227
- storage: t
214
+ storage: s
228
215
  })
229
216
  };
230
217
  };
231
218
  export {
232
- K as createLocalStorageHistoryPersistence,
233
- W as createLocalStorageLastResourcePersistence,
234
219
  T as createLocalStorageLayoutPersistence,
235
- k as createLocalStoragePanelsPersistence,
236
- w as createLocalStorageTreePersistence,
237
- A as createLocalStorageWorkbenchPersistence,
238
- i as workbenchStoragePersistenceKey
220
+ C as createLocalStoragePageLocationPersistence,
221
+ A as createLocalStoragePanelMenuStatePersistence,
222
+ W as createLocalStorageTreePersistence,
223
+ w as createLocalStorageWorkbenchPersistence,
224
+ c as workbenchStoragePersistenceKey
239
225
  };
240
226
  //# sourceMappingURL=storage.js.map
@@ -1 +1 @@
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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"}
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 | \"layout\"\n | \"layout-compatibility\"\n | \"layout-generation\"\n | \"layout-resource-index\"\n | \"layout-scope-index\"\n | \"panel-menus\"\n | \"page-location\"\n | \"side-panel\"\n | \"tree\";\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 PersistedWorkbenchLayoutV4 {\n version: 4;\n layout: WorkbenchLayout;\n}\n\ntype PersistedWorkbenchLayout = PersistedWorkbenchLayoutV4;\n\n// Version 4 stores ResourceRef identity keys and page Main collections. Only the\n// layout cache changes; routed locations and independent preferences stay valid.\nconst WORKBENCH_LAYOUT_VERSION = 4 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<string, { generation: number; 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 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, \"panel-menus\", 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 }\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: PersistedWorkbenchLayoutV4 = { version: WORKBENCH_LAYOUT_VERSION, layout };\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n pending.delete(key);\n pending.set(key, {\n generation: getGeneration(),\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 PersistedWorkbenchLayoutV4),\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 { PageLocation } from \"@pstdio/sdk/extensions\";\nimport type {\n PersistedTreeRendererStates,\n PersistedWorkbenchPanelMenuState,\n TreeRendererPersistenceAdapter,\n WorkbenchPageLocationPersistence,\n WorkbenchPanelMenuStatePersistenceAdapter,\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 CreateLocalStoragePanelMenuStatePersistenceInput 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\ninterface PersistedWorkbenchPageLocation {\n version: 1;\n location: PageLocation;\n}\n\nconst WORKBENCH_PAGE_LOCATION_VERSION = 1 as const;\n\nexport const createLocalStoragePageLocationPersistence = (\n input: CreateWorkbenchStoragePersistenceInput,\n): WorkbenchPageLocationPersistence => {\n const storage = resolveStorage(input.storage);\n return {\n load: (projectId) => {\n const persisted = readJson<PersistedWorkbenchPageLocation>(\n storage,\n workbenchStoragePersistenceKey(input.namespace, \"page-location\", projectId),\n );\n return persisted?.version === WORKBENCH_PAGE_LOCATION_VERSION ? persisted.location : undefined;\n },\n save: (projectId, location) => {\n const persisted: PersistedWorkbenchPageLocation = {\n version: WORKBENCH_PAGE_LOCATION_VERSION,\n location,\n };\n storage.setItem(\n workbenchStoragePersistenceKey(input.namespace, \"page-location\", projectId),\n JSON.stringify(persisted),\n );\n },\n };\n};\nexport const createLocalStoragePanelMenuStatePersistence = (\n input: CreateLocalStoragePanelMenuStatePersistenceInput,\n): WorkbenchPanelMenuStatePersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n return {\n getMenuStates: (scope) =>\n readJson<PersistedWorkbenchPanelMenuState>(\n storage,\n workbenchStoragePersistenceKey(input.namespace, \"panel-menus\", scope ?? input.scope),\n ),\n setMenuStates: (state, scope) => {\n const key = workbenchStoragePersistenceKey(input.namespace, \"panel-menus\", 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\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 layoutPersistence,\n panelMenuStatePersistence: createLocalStoragePanelMenuStatePersistence({\n namespace: input.namespace,\n scope: input.scope ?? \"global\",\n storage,\n }),\n pageLocationPersistence: createLocalStoragePageLocationPersistence({ namespace: input.namespace, storage }),\n treePersistence: createLocalStorageTreePersistence({ namespace: input.namespace, scope: input.scope, storage }),\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","scheduleFlush","setTimeout","getLayout","pendingWrite","WORKBENCH_LAYOUT_VERSION","layout","setLayout","listScopes","Set","transformLayouts","transform","getCompatibilityMarker","setCompatibilityMarker","advanceWriteGeneration","dispose","createLocalStoragePageLocationPersistence","load","WORKBENCH_PAGE_LOCATION_VERSION","location","save","createLocalStoragePanelMenuStatePersistence","getMenuStates","setMenuStates","state","createLocalStorageTreePersistence","getTreeStates","setTreeStates","sidePanelModes","createLocalStorageSidePanelPersistence","getMode","WORKBENCH_SIDE_PANEL_VERSION","includes","mode","setMode","createLocalStorageWorkbenchPersistence","layoutPersistence","snapshotPersistence","getSnapshot","setSnapshot","snapshot","panelMenuStatePersistence","pageLocationPersistence","treePersistence","sidePanelPersistence"],"mappings":"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"}
@@ -1,10 +1,7 @@
1
- import { renderExtensionRuntimeHtml } from 'pstdio-extensions/bridge/webview-runtime-html';
2
- import { renderInlineExtensionRuntimeHtml } from 'pstdio-extensions/bridge/webview-runtime-html';
3
-
4
1
  export declare const getExtensionRuntimeScript: () => string;
5
2
 
6
- export { renderExtensionRuntimeHtml }
3
+ export declare const renderExtensionRuntimeHtml: (scriptUrl: string) => string;
7
4
 
8
- export { renderInlineExtensionRuntimeHtml }
5
+ export declare const renderInlineExtensionRuntimeHtml: (runtimeScript: string) => string;
9
6
 
10
7
  export { }
@@ -1,4 +1,4 @@
1
- const r = '// Generated by packages/pstdio-extensions/scripts/build-runtime.ts\nfunction a(){let G=globalThis;if(G.window!==void 0&&G.document!==void 0)return"browser";if(G.WorkerGlobalScope!==void 0&&G.self!==void 0&&G.self instanceof G.WorkerGlobalScope||G.window===void 0&&G.self!==void 0&&typeof G.importScripts=="function")return"worker";let J=G.process;if(J&&typeof J=="object"){let P=J.versions??{},Q=J.release?.name;if(P.bun||Q==="bun"||G.Bun!==void 0)return"bun";if(P.node&&Q==="node")return"node"}return G.Bun===void 0?"browser":"bun"}function K(){return a()}function h(){return K()==="worker"}function m(){let G=K();return G==="node"||G==="bun"}function t(){return window.self!==window.top}function n(G){let J={};return function P(Q,$=""){Object.keys(Q).forEach((Z)=>{let Y=$?`${$}.${Z}`:Z;Q[Z]===Object(Q[Z])&&P(Q[Z],Y),typeof Q[Z]=="function"&&(J[Y]=Q[Z],delete Q[Z])})}(G),J}function e(G){return!G||G==="null"?"*":G}function GG(G,J,P){if(!G||typeof G!="object")return G;let Q=Array.isArray(J)?J:J.split(".").map((Z)=>Z.match(/^\\d+$/)?Number(Z):Z),$=G;for(let Z=0;Z<Q.length;Z++){let Y=Q[Z];Z===Q.length-1?$[Y]=P:((!$[Y]||typeof $[Y]!="object")&&($[Y]=typeof Q[Z+1]=="number"?[]:{}),$=$[Y])}return G}function JG(G=10){let J="";for(let P=0;P<G;P++)J+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(Math.random()*62));return J}var g=K(),A=null;if(g==="node"||g==="bun")try{let G=globalThis.require;A=G?.("node:worker_threads")?.parentPort??null}catch{}function PG(){if(m())return A;if(h())return self;if(t())return window.parent;throw Error("No valid target found for postMessage")}function x(G,J,P,Q){if(!G)throw Error("Rimless Error: No target specified for postMessage");if(m()&&G===A){G.postMessage(J,{transfer:Q});return}if(h()){G.postMessage(J,{transfer:Q});return}if(G.postMessage){G.postMessage(J,{targetOrigin:e(P),transfer:Q});return}throw Error("Rimless Error: Invalid target for postMessage")}function v(G){return A!==null&&G===A}function w(G,J,P){v(G)?G.on(J,P):("addEventListener"in G)&&G.addEventListener(J,P)}function E(G,J,P){v(G)?G.off(J,P):("removeEventListener"in G)&&G.removeEventListener(J,P)}function b(G){return G.data||G}var V=function(G){return G.MESSAGE="message",G}({}),B=function(G){return G.HANDSHAKE_REQUEST="RIMLESS/HANDSHAKE_REQUEST",G.HANDSHAKE_REPLY="RIMLESS/HANDSHAKE_REPLY",G.RPC_REQUEST="RIMLESS/RPC_REQUEST",G.RPC_RESOLVE="RIMLESS/RPC_RESOLVE",G.RPC_REJECT="RIMLESS/RPC_REJECT",G}({}),T=Symbol();function QG(G={},J,P,Q,$){let Z=[];for(let[Y,q]of Object.entries(G)){async function z(M){let{action:H,callID:O,connectionID:U,callName:W,args:L=[]}=b(M);if(H!==B.RPC_REQUEST||!O||!W||W!==Y||U!==J)return;let N={action:B.RPC_RESOLVE,callID:O,callName:W,connectionID:U,error:null,result:null},_;try{N.result=await q(...L,$),N.result?.[T]&&(_=N.result[T]??[],delete N.result[T])}catch(R){N.action=B.RPC_REJECT,N.error=JSON.parse(JSON.stringify(R,Object.getOwnPropertyNames(R)))}x(Q,N,M?.origin,_)}w(P,V.MESSAGE,z),Z.push(()=>E(P,V.MESSAGE,z))}return()=>Z.forEach((Y)=>Y())}function YG(G,J,P,Q=[],$,Z){return(...Y)=>new Promise((q,z)=>{let M=JG();function H(W){let{callID:L,connectionID:N,callName:_,result:R,error:o,action:f}=b(W);if(!(!L||!_)&&_===G&&L===M&&N===J){if(f===B.RPC_RESOLVE)return q(R);if(f===B.RPC_REJECT)return z(o)}}let O={action:B.RPC_REQUEST,args:Y,callID:M,callName:G,connectionID:J},U=Y.reduce((W,L)=>L[T]?.length?W.concat(L[T]):W,Y[T]??[]);w($,V.MESSAGE,H),Q.push(()=>E($,V.MESSAGE,H)),x(Z,O,P?.origin,U)})}function ZG(G={},J=[],P,Q,$,Z){let Y={...G},q=[];for(let z of J)GG(Y,z,YG(z,P,Q,q,$,Z));return{remote:Y,unregisterRemote:()=>q.forEach((z)=>z())}}function $G(G={},J){return new Promise(async(P)=>{let Q=n(G),$=PG(),Z=self||window;async function Y(q){let z=b(q);if(z?.action!==B.HANDSHAKE_REPLY)return;let{remote:M,unregisterRemote:H}=ZG(z.schema,z.methodNames,z.connectionID,q,Z,$),O=QG(Q,z.connectionID,Z,$,M);return await J?.onConnectionSetup?.(M),x($,{action:B.HANDSHAKE_REPLY,connectionID:z.connectionID},q?.origin),P({remote:M,close:()=>{E(Z,V.MESSAGE,Y),H(),O()},id:z.connectionID})}w(Z,V.MESSAGE,Y),x($,{action:B.HANDSHAKE_REQUEST,methodNames:Object.keys(Q),schema:G})})}var c={connect:$G};var zG=(G)=>typeof G==="object"&&G!==null,p=(G)=>{try{let J=JSON.stringify(G);if(typeof J==="string"&&J.length>0)return J}catch{}try{return String(G)}catch{return"Unknown error"}},u=(G)=>{if(G instanceof Error)return{message:G.message,stack:G.stack};if(typeof G==="string")return{message:G};if(zG(G)){let J=typeof G.message==="string"?G.message:null,P=typeof G.stack==="string"?G.stack:void 0;if(J)return P?{message:J,stack:P}:{message:J};return{message:p(G)}}if(G===null||G===void 0)return{message:"Unknown error"};return{message:p(G)}};var j=(G,J)=>({extensionId:"pstdio",kind:G,id:J}),LG={switchMode:j("command","workbench.action.switchMode")},TG={project:j("mode","project"),settings:j("mode","settings")},y=(G,J,P)=>({id:G,ref:j("resource-kind",G),surface:"primary",label:J,menuSlots:P}),S=[{id:"headerPrimary",placement:"header-primary",access:"public"},{id:"headerOverflow",placement:"header-overflow",access:"public"}],k={project:y("project","Extension",S),session:y("session","Session",S),workspace:y("workspace","Workspace",S)},D={project:k.project.ref,session:k.session.ref,workspace:k.workspace.ref},VG={projectNavigation:j("navigation-item","project.navigation"),projectSettings:j("settings-panel","project.settings"),statusBarLeading:j("status-bar-item","status-bar.leading"),statusBarTrailing:j("status-bar-item","status-bar.trailing")},d=(G)=>({...G,kind:"command"}),DG=Object.assign(d,{forExtension:(G)=>(J)=>d({extensionId:`${G.publisher}.${G.name}`,id:J})}),XG=(G)=>({...G,kind:"event"}),I=(G,J)=>({id:G,kind:J.kind,label:J.label,description:J.description,metadata:J.metadata}),F=(G)=>XG({extensionId:"pstdio",id:G}),C=(G,J)=>I(`${G.id}.${J}`,{kind:"menu"}),CG={sidenav:I("project.sidenav",{kind:"panel"}),headerPrimary:C(D.project,"headerPrimary"),headerOverflow:C(D.project,"headerOverflow"),settingsPanels:I("project.settingsPanels",{kind:"settings"})},_G={headerPrimary:C(D.session,"headerPrimary"),headerOverflow:C(D.session,"headerOverflow")},AG={headerPrimary:C(D.workspace,"headerPrimary"),headerOverflow:C(D.workspace,"headerOverflow"),sidenav:I("workspace.sidenav",{kind:"panel"})},RG={opened:F("project.opened")},xG={started:F("session.started"),resumed:F("session.resumed"),awaitingInput:F("session.awaitingInput"),succeeded:F("session.succeeded"),failed:F("session.failed"),completed:F("session.completed")},IG={created:F("workspace.created"),provision:F("workspace.provision"),ready:F("workspace.ready"),archived:F("workspace.archived"),deleted:F("workspace.deleted")},KG={removed:F("worktree.removed")},wG={committed:F("git.committed"),rebased:F("git.rebased"),merged:F("git.merged"),conflicted:F("git.conflicted")};var qG=["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"],UG=["host.dispatchKeyboardEvent"],EG=[...qG,...UG];var X=(G)=>(J)=>({...J,ref:{kind:G,id:J.id}}),bG=X("view"),yG=X("view-menu"),SG=X("placement"),kG=X("resource-kind");var fG=X("resource-view"),gG=X("navigation-item"),hG=X("mode"),mG=X("status-bar-item"),vG=X("status"),cG=X("settings-panel"),pG=X("activity-item"),uG=X("settings-section"),dG=X("command-palette-resource"),lG=X("keybinding"),rG=X("schedule"),sG=X("artifact-mount"),iG=X("template-type"),oG=X("template"),aG=X("skill"),tG=X("theme"),nG=X("file-icon-theme"),eG=X("workspace-type"),GJ=X("harness"),JJ=X("connection");var l=(G,J,P)=>({call:async(Q,$)=>await G({method:Q,params:$}),onEvent:J,extensionId:P}),r=(G)=>{let J=G,P=new Set;return{get:()=>J,subscribe:(Q)=>{return P.add(Q),()=>P.delete(Q)},set:(Q)=>{J=Q;for(let $ of P)$(J)}}};var s="pstdio-extension-mount",FG=()=>{let G=new Map;return{get length(){return G.size},clear:()=>G.clear(),getItem:(J)=>G.get(J)??null,key:(J)=>Array.from(G.keys())[J]??null,removeItem:(J)=>G.delete(J),setItem:(J,P)=>G.set(J,P)}},MG=()=>{for(let G of["localStorage","sessionStorage"])try{window[G]}catch{Object.defineProperty(window,G,{configurable:!0,value:FG()})}},i=(G,J)=>{let P=document.documentElement,Q=G==="dark"?"light":"dark";P.classList.remove(Q),P.classList.add(G),P.setAttribute("data-theme",G),P.style.colorScheme=G;for(let[$,Z]of Object.entries(J))if($.startsWith("--"))P.style.setProperty($,Z)},OG=(G)=>{for(let J of G){let P=document.createElement("link");P.rel="stylesheet",P.href=J,document.head.appendChild(P)}},NG=()=>{let G=document.getElementById(s);if(!G)G=document.createElement("div"),G.id=s,G.style.height="100%",G.style.width="100%",document.body.appendChild(G);return G},BG=(G)=>G instanceof HTMLInputElement||G instanceof HTMLTextAreaElement||G instanceof HTMLSelectElement||G instanceof HTMLElement&&G.isContentEditable,HG=async()=>{MG();let G=r(void 0),J=new Map,P=(Y,q)=>{let z=J.get(Y)??new Set;return z.add(q),J.set(Y,z),()=>{z.delete(q)}},Q,$=!1,Z=await c.connect({init:async(Y)=>{try{i(Y.theme,Y.themeVariables),OG(Y.styles),G.set(Y.props);let q=NG(),z=await import(Y.moduleUrl),M=z.default??(z.mount?z:void 0);if(!M?.mount)throw Error("Extension module does not export a default view (defineExtensionView).");let H=l((U)=>Z.remote.call(U),P,Y.extensionId),O=await M.mount(q,H,G);if(Q=typeof O==="function"?O:void 0,!$)$=!0,document.addEventListener("keydown",(U)=>{if(!U.ctrlKey&&!U.metaKey&&!U.altKey)return;if(BG(U.target)&&!U.shiftKey)return;Z.remote.call({method:"host.dispatchKeyboardEvent",params:{key:U.key,code:U.code,ctrlKey:U.ctrlKey,metaKey:U.metaKey,altKey:U.altKey,shiftKey:U.shiftKey,repeat:U.repeat}}).catch(()=>{})},!0)}catch(q){let z=u(q);throw Z.remote.runtimeError(z),q instanceof Error?q:Error(z.message)}},themeUpdate:(Y)=>{i(Y.theme,Y.variables)},propsUpdate:(Y)=>{G.set(Y.props)},hostEvent:(Y)=>{for(let q of J.get(Y.scope)??[])q(Y.payload)}});Z.remote.ready({}),window.addEventListener("beforeunload",()=>{Q?.()})};HG();\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 n = '// Generated by packages/pstdio-extensions/scripts/build-runtime.ts\nfunction e(){let J=globalThis;if(J.window!==void 0&&J.document!==void 0)return"browser";if(J.WorkerGlobalScope!==void 0&&J.self!==void 0&&J.self instanceof J.WorkerGlobalScope||J.window===void 0&&J.self!==void 0&&typeof J.importScripts=="function")return"worker";let Q=J.process;if(Q&&typeof Q=="object"){let Y=Q.versions??{},$=Q.release?.name;if(Y.bun||$==="bun"||J.Bun!==void 0)return"bun";if(Y.node&&$==="node")return"node"}return J.Bun===void 0?"browser":"bun"}function S(){return e()}function p(){return S()==="worker"}function u(){let J=S();return J==="node"||J==="bun"}function JJ(){return window.self!==window.top}function QJ(J){let Q={};return function Y($,X=""){Object.keys($).forEach((Z)=>{let G=X?`${X}.${Z}`:Z;$[Z]===Object($[Z])&&Y($[Z],G),typeof $[Z]=="function"&&(Q[G]=$[Z],delete $[Z])})}(J),Q}function YJ(J){return!J||J==="null"?"*":J}function ZJ(J,Q,Y){if(!J||typeof J!="object")return J;let $=Array.isArray(Q)?Q:Q.split(".").map((Z)=>Z.match(/^\\d+$/)?Number(Z):Z),X=J;for(let Z=0;Z<$.length;Z++){let G=$[Z];Z===$.length-1?X[G]=Y:((!X[G]||typeof X[G]!="object")&&(X[G]=typeof $[Z+1]=="number"?[]:{}),X=X[G])}return J}function $J(J=10){let Q="";for(let Y=0;Y<J;Y++)Q+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(Math.random()*62));return Q}var c=S(),K=null;if(c==="node"||c==="bun")try{let J=globalThis.require;K=J?.("node:worker_threads")?.parentPort??null}catch{}function GJ(){if(u())return K;if(p())return self;if(JJ())return window.parent;throw Error("No valid target found for postMessage")}function E(J,Q,Y,$){if(!J)throw Error("Rimless Error: No target specified for postMessage");if(u()&&J===K){J.postMessage(Q,{transfer:$});return}if(p()){J.postMessage(Q,{transfer:$});return}if(J.postMessage){J.postMessage(Q,{targetOrigin:YJ(Y),transfer:$});return}throw Error("Rimless Error: Invalid target for postMessage")}function d(J){return K!==null&&J===K}function b(J,Q,Y){d(J)?J.on(Q,Y):("addEventListener"in J)&&J.addEventListener(Q,Y)}function y(J,Q,Y){d(J)?J.off(Q,Y):("removeEventListener"in J)&&J.removeEventListener(Q,Y)}function k(J){return J.data||J}var H=function(J){return J.MESSAGE="message",J}({}),W=function(J){return J.HANDSHAKE_REQUEST="RIMLESS/HANDSHAKE_REQUEST",J.HANDSHAKE_REPLY="RIMLESS/HANDSHAKE_REPLY",J.RPC_REQUEST="RIMLESS/RPC_REQUEST",J.RPC_RESOLVE="RIMLESS/RPC_RESOLVE",J.RPC_REJECT="RIMLESS/RPC_REJECT",J}({}),A=Symbol();function XJ(J={},Q,Y,$,X){let Z=[];for(let[G,U]of Object.entries(J)){async function z(N){let{action:_,callID:j,connectionID:q,callName:V,args:D=[]}=k(N);if(_!==W.RPC_REQUEST||!j||!V||V!==G||q!==Q)return;let M={action:W.RPC_RESOLVE,callID:j,callName:V,connectionID:q,error:null,result:null},C;try{M.result=await U(...D,X),M.result?.[A]&&(C=M.result[A]??[],delete M.result[A])}catch(I){M.action=W.RPC_REJECT,M.error=JSON.parse(JSON.stringify(I,Object.getOwnPropertyNames(I)))}E($,M,N?.origin,C)}b(Y,H.MESSAGE,z),Z.push(()=>y(Y,H.MESSAGE,z))}return()=>Z.forEach((G)=>G())}function zJ(J,Q,Y,$=[],X,Z){return(...G)=>new Promise((U,z)=>{let N=$J();function _(V){let{callID:D,connectionID:M,callName:C,result:I,error:n,action:m}=k(V);if(!(!D||!C)&&C===J&&D===N&&M===Q){if(m===W.RPC_RESOLVE)return U(I);if(m===W.RPC_REJECT)return z(n)}}let j={action:W.RPC_REQUEST,args:G,callID:N,callName:J,connectionID:Q},q=G.reduce((V,D)=>D[A]?.length?V.concat(D[A]):V,G[A]??[]);b(X,H.MESSAGE,_),$.push(()=>y(X,H.MESSAGE,_)),E(Z,j,Y?.origin,q)})}function FJ(J={},Q=[],Y,$,X,Z){let G={...J},U=[];for(let z of Q)ZJ(G,z,zJ(z,Y,$,U,X,Z));return{remote:G,unregisterRemote:()=>U.forEach((z)=>z())}}function UJ(J={},Q){return new Promise(async(Y)=>{let $=QJ(J),X=GJ(),Z=self||window;async function G(U){let z=k(U);if(z?.action!==W.HANDSHAKE_REPLY)return;let{remote:N,unregisterRemote:_}=FJ(z.schema,z.methodNames,z.connectionID,U,Z,X),j=XJ($,z.connectionID,Z,X,N);return await Q?.onConnectionSetup?.(N),E(X,{action:W.HANDSHAKE_REPLY,connectionID:z.connectionID},U?.origin),Y({remote:N,close:()=>{y(Z,H.MESSAGE,G),_(),j()},id:z.connectionID})}b(Z,H.MESSAGE,G),E(X,{action:W.HANDSHAKE_REQUEST,methodNames:Object.keys($),schema:J})})}var l={connect:UJ};var qJ=(J)=>typeof J==="object"&&J!==null,r=(J)=>{try{let Q=JSON.stringify(J);if(typeof Q==="string"&&Q.length>0)return Q}catch{}try{return String(J)}catch{return"Unknown error"}},w=(J)=>{if(J instanceof Error)return{message:J.message,stack:J.stack};if(typeof J==="string")return{message:J};if(qJ(J)){let Q=typeof J.message==="string"?J.message:null,Y=typeof J.stack==="string"?J.stack:void 0;if(Q)return Y?{message:Q,stack:Y}:{message:Q};return{message:r(J)}}if(J===null||J===void 0)return{message:"Unknown error"};return{message:r(J)}};var f=["sidenav","main","secondary","side"];var B=(J,Q)=>({extensionId:"pstdio",kind:J,id:Q}),L={project:B("mode","project"),sessions:B("mode","sessions"),settings:B("mode","settings")},TJ={project:{ref:L.project,regions:f},sessions:{ref:L.sessions,regions:f},settings:{ref:L.settings,regions:f}},g=(J,Q,Y)=>({id:J,ref:B("resource-kind",J),label:Q,menuSlots:Y}),h=[{id:"headerPrimary",placement:"header-primary",access:"public"},{id:"headerOverflow",placement:"header-overflow",access:"public"}],v={project:g("project","Extension",h),session:g("session","Session",h),workspace:g("workspace","Workspace",h)},P={project:v.project.ref,session:v.session.ref,workspace:v.workspace.ref},R={start:B("page","start"),sessions:B("page","sessions"),session:B("page","session"),workspaces:B("page","workspaces"),workspace:B("page","workspace")},CJ={start:{ref:R.start,mode:L.project,path:"",primary:{cardinality:"one",resourceKinds:[]}},sessions:{ref:R.sessions,mode:L.sessions,path:"sessions",primary:{cardinality:"one",resourceKinds:[]}},session:{ref:R.session,mode:L.sessions,path:"session",primary:{cardinality:"one",resourceKinds:["session","session-draft"]}},workspaces:{ref:R.workspaces,mode:L.project,path:"workspaces",primary:{cardinality:"one",resourceKinds:[]}},workspace:{ref:R.workspace,mode:L.project,path:"workspace",primary:{cardinality:"many",resourceKinds:["workspace"]}}},OJ={projectSession:B("placement","project-session")},KJ={projectSession:{ref:OJ.projectSession,mode:L.project,cardinality:"many",resourceKinds:["session","session-draft"]}},RJ={projectSettings:B("settings-panel","project.settings"),statusBarLeading:B("status-bar-item","status-bar.leading"),statusBarTrailing:B("status-bar-item","status-bar.trailing")};var i=(J)=>({...J,kind:"command"}),IJ=Object.assign(i,{forExtension:(J)=>(Q)=>i({extensionId:`${J.publisher}.${J.name}`,id:Q})}),BJ=(J)=>({...J,kind:"event"}),x=(J,Q)=>({id:J,kind:Q.kind,label:Q.label,description:Q.description,metadata:Q.metadata}),O=(J)=>BJ({extensionId:"pstdio",id:J}),T=(J,Q)=>x(`${J.id}.${Q}`,{kind:"menu"}),EJ={sidenav:x("project.sidenav",{kind:"panel"}),headerPrimary:T(P.project,"headerPrimary"),headerOverflow:T(P.project,"headerOverflow"),settingsPanels:x("project.settingsPanels",{kind:"settings"})},wJ={headerPrimary:T(P.session,"headerPrimary"),headerOverflow:T(P.session,"headerOverflow")},xJ={headerPrimary:T(P.workspace,"headerPrimary"),headerOverflow:T(P.workspace,"headerOverflow"),sidenav:x("workspace.sidenav",{kind:"panel"})},SJ={opened:O("project.opened")},bJ={started:O("session.started"),resumed:O("session.resumed"),awaitingInput:O("session.awaitingInput"),succeeded:O("session.succeeded"),failed:O("session.failed"),completed:O("session.completed")},yJ={created:O("workspace.created"),provision:O("workspace.provision"),ready:O("workspace.ready"),archived:O("workspace.archived"),deleted:O("workspace.deleted")},kJ={removed:O("worktree.removed")},fJ={committed:O("git.committed"),rebased:O("git.rebased"),merged:O("git.merged"),conflicted:O("git.conflicted")};var NJ=["commands.execute","navigation.open","placement.close","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"],jJ=["artifacts.read"],MJ=["host.dispatchKeyboardEvent"],gJ=[...NJ,...jJ,...MJ];var F=(J)=>(Q)=>({...Q,ref:{kind:J,id:Q.id}}),hJ=F("view"),vJ=F("view-menu"),mJ=F("placement"),cJ=F("resource-kind");var pJ=F("navigation-item"),uJ=F("navigation-tree"),dJ=F("mode");var lJ=F("status-bar-item"),rJ=F("status"),iJ=F("settings-panel"),aJ=F("activity-item"),sJ=F("settings-section"),oJ=F("command-palette-resource"),tJ=F("keybinding"),nJ=F("schedule"),eJ=F("artifact-mount"),JQ=F("template-type"),QQ=F("template"),YQ=F("skill"),ZQ=F("theme"),$Q=F("file-icon-theme"),GQ=F("workspace-type"),XQ=F("harness"),zQ=F("connection");var a=(J,Q,Y)=>({call:async($,...X)=>{try{return await J({method:$,params:X[0]})}catch(Z){if(Z instanceof Error)throw Z;throw Error(w(Z).message)}},onEvent:Q,extensionId:Y}),s=(J)=>{let Q=J,Y=new Set;return{get:()=>Q,subscribe:($)=>{return Y.add($),()=>Y.delete($)},set:($)=>{Q=$;for(let X of Y)X(Q)}}};var o="pstdio-extension-mount",WJ=()=>{let J=new Map;return{get length(){return J.size},clear:()=>J.clear(),getItem:(Q)=>J.get(Q)??null,key:(Q)=>Array.from(J.keys())[Q]??null,removeItem:(Q)=>J.delete(Q),setItem:(Q,Y)=>J.set(Q,Y)}},LJ=()=>{for(let J of["localStorage","sessionStorage"])try{window[J]}catch{Object.defineProperty(window,J,{configurable:!0,value:WJ()})}},t=(J,Q)=>{let Y=document.documentElement,$=J==="dark"?"light":"dark";Y.classList.remove($),Y.classList.add(J),Y.setAttribute("data-theme",J),Y.style.colorScheme=J;for(let[X,Z]of Object.entries(Q))if(X.startsWith("--"))Y.style.setProperty(X,Z)},_J=(J)=>{for(let Q of J){let Y=document.createElement("link");Y.rel="stylesheet",Y.href=Q,document.head.appendChild(Y)}},VJ=()=>{let J=document.getElementById(o);if(!J)J=document.createElement("div"),J.id=o,J.style.height="100%",J.style.width="100%",document.body.appendChild(J);return J},DJ=(J)=>J instanceof HTMLInputElement||J instanceof HTMLTextAreaElement||J instanceof HTMLSelectElement||J instanceof HTMLElement&&J.isContentEditable,AJ=async()=>{LJ();let J=s(void 0),Q=new Map,Y=(G,U)=>{let z=Q.get(G)??new Set;return z.add(U),Q.set(G,z),()=>{z.delete(U)}},$,X=!1,Z=await l.connect({init:async(G)=>{try{t(G.theme,G.themeVariables),_J(G.styles),J.set(G.props);let U=VJ(),z=await import(G.moduleUrl),N=z.default??(z.mount?z:void 0);if(!N?.mount)throw Error("Extension module does not export a default view (defineExtensionView).");let _=a((q)=>Z.remote.call(q),Y,G.extensionId),j=await N.mount(U,_,J);if($=typeof j==="function"?j:void 0,!X)X=!0,document.addEventListener("keydown",(q)=>{if(!q.ctrlKey&&!q.metaKey&&!q.altKey)return;if(DJ(q.target)&&!q.shiftKey)return;Z.remote.call({method:"host.dispatchKeyboardEvent",params:{key:q.key,code:q.code,ctrlKey:q.ctrlKey,metaKey:q.metaKey,altKey:q.altKey,shiftKey:q.shiftKey,repeat:q.repeat}}).catch(()=>{})},!0)}catch(U){let z=w(U);throw Z.remote.runtimeError(z),U instanceof Error?U:Error(z.message)}},themeUpdate:(G)=>{t(G.theme,G.variables)},propsUpdate:(G)=>{J.set(G.props)},hostEvent:(G)=>{for(let U of Q.get(G.scope)??[])U(G.payload)}});Z.remote.ready({}),window.addEventListener("beforeunload",()=>{$?.()})};AJ();\n', t = "pstdio-extension-mount", s = (e) => e.replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("<", "&lt;"), o = (e) => e.replaceAll("<\/script", "<\\/script").replaceAll("<!--", "<\\!--"), r = (e) => `<!doctype html>
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="utf-8" />
@@ -26,10 +26,10 @@ const r = '// Generated by packages/pstdio-extensions/scripts/build-runtime.ts\n
26
26
  ${e}
27
27
  </body>
28
28
  </html>
29
- `, s = (e) => n(`<script src="${o(e)}"><\/script>`), a = (e) => n(`<script>${i(e)}<\/script>`), c = () => r;
29
+ `, i = (e) => r(`<script src="${s(e)}"><\/script>`), a = (e) => r(`<script>${o(e)}<\/script>`), c = () => n;
30
30
  export {
31
31
  c as getExtensionRuntimeScript,
32
- s as renderExtensionRuntimeHtml,
32
+ i as renderExtensionRuntimeHtml,
33
33
  a as renderInlineExtensionRuntimeHtml
34
34
  };
35
35
  //# sourceMappingURL=webview-runtime.js.map