@pstdio/workbench 0.2.1 → 0.3.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 (39) hide show
  1. package/README.md +100 -88
  2. package/dist/context-key-service-W4QEfVdN.js +1031 -0
  3. package/dist/context-key-service-W4QEfVdN.js.map +1 -0
  4. package/dist/extensions.d.ts +739 -275
  5. package/dist/extensions.js +891 -699
  6. package/dist/extensions.js.map +1 -1
  7. package/dist/file-renderer-view-DrrhYnb_.js.map +1 -1
  8. package/dist/index.d.ts +746 -448
  9. package/dist/index.js +2974 -60
  10. package/dist/index.js.map +1 -1
  11. package/dist/layout-types-DMoZz38-.js +100 -0
  12. package/dist/layout-types-DMoZz38-.js.map +1 -0
  13. package/dist/react.d.ts +735 -231
  14. package/dist/react.js +3562 -2584
  15. package/dist/react.js.map +1 -1
  16. package/dist/storage.d.ts +109 -14
  17. package/dist/storage.js +142 -47
  18. package/dist/storage.js.map +1 -1
  19. package/dist/surface-map-C1pOTUmF.js +52 -0
  20. package/dist/surface-map-C1pOTUmF.js.map +1 -0
  21. package/dist/testing.d.ts +685 -198
  22. package/dist/testing.js +46 -34
  23. package/dist/testing.js.map +1 -1
  24. package/dist/webview-runtime.js +5 -1
  25. package/dist/webview-runtime.js.map +1 -1
  26. package/dist/workbench-menu-paths-B_QJzcNU.js +12 -0
  27. package/dist/workbench-menu-paths-B_QJzcNU.js.map +1 -0
  28. package/package.json +6 -7
  29. package/dist/context-key-service-C--cHa0B.js +0 -447
  30. package/dist/context-key-service-C--cHa0B.js.map +0 -1
  31. package/dist/core.d.ts +0 -1885
  32. package/dist/core.js +0 -64
  33. package/dist/core.js.map +0 -1
  34. package/dist/surface-reconcile-DkRf01ro.js +0 -260
  35. package/dist/surface-reconcile-DkRf01ro.js.map +0 -1
  36. package/dist/workbench-core-DFpwi8Lo.js +0 -2264
  37. package/dist/workbench-core-DFpwi8Lo.js.map +0 -1
  38. package/dist/workbench-menu-paths-CQVH6z4_.js +0 -11
  39. package/dist/workbench-menu-paths-CQVH6z4_.js.map +0 -1
@@ -1,447 +0,0 @@
1
- import { devtools as k } from "zustand/middleware";
2
- import { createStore as v } from "zustand/vanilla";
3
- const l = (r) => {
4
- let n = !1;
5
- return {
6
- dispose() {
7
- n || (n = !0, r());
8
- }
9
- };
10
- }, w = (r, n) => Object.is(r, n), p = (r) => {
11
- const n = v()(k(() => r.initialState, {
12
- name: r.name ?? "workbench.store"
13
- })), t = (s, c, e = {}) => {
14
- const o = e.equalityFn ?? w;
15
- let i = s(n.getState());
16
- return e.fireImmediately && c(i, i), n.subscribe((a) => {
17
- const d = s(a);
18
- if (o(i, d)) return;
19
- const u = i;
20
- i = d, c(d, u);
21
- });
22
- };
23
- return {
24
- getState: n.getState,
25
- getInitialState: n.getInitialState,
26
- subscribe: n.subscribe,
27
- subscribeSelector: t,
28
- setState: n.setState,
29
- api: n
30
- };
31
- }, R = "workbench.core", b = (r = {}) => ({
32
- source: r.source ?? "module",
33
- ownerId: r.ownerId ?? R,
34
- priority: r.priority ?? 0
35
- }), S = (r, n) => n.priority - r.priority || r.ownerId.localeCompare(n.ownerId), C = (r) => Array.isArray(r) ? r : r.trim().split(/\s+/).filter(Boolean), K = (r) => {
36
- const n = C(r);
37
- return n.length === 1 ? n[0] ?? "" : n;
38
- }, W = (r) => {
39
- const n = p({
40
- name: "workbench.keybindings",
41
- initialState: {
42
- keybindings: []
43
- }
44
- });
45
- return {
46
- store: n,
47
- registerKeybinding(t, s) {
48
- if (!r.commands.getCommand(t.commandId)) throw new Error(`Keybinding command not registered: ${t.commandId}`);
49
- const c = {
50
- ...b(s),
51
- ...t,
52
- keybinding: K(t.keybinding)
53
- }, e = n.getState();
54
- return n.setState({
55
- keybindings: [...e.keybindings, c]
56
- }, !1, "registerKeybinding"), l(() => {
57
- const o = n.getState(), i = o.keybindings.filter((a) => a !== c);
58
- i.length !== o.keybindings.length && n.setState({
59
- keybindings: i
60
- }, !1, "unregisterKeybinding");
61
- });
62
- },
63
- listKeybindings() {
64
- return [...n.getState().keybindings].sort(S);
65
- },
66
- listActiveKeybindings() {
67
- return n.getState().keybindings.filter((t) => r.context.matches(t.when)).sort(S);
68
- }
69
- };
70
- }, f = (r, n) => {
71
- const {
72
- [n]: t,
73
- ...s
74
- } = r;
75
- return s;
76
- }, x = () => {
77
- if (typeof document > "u")
78
- throw new Error("workbench.renderers.registerRenderer({ keepAlive: true }): no DOM available. The default host factory uses document.createElement. In a non-browser environment (Bun tests, SSR), pass a custom factory via createWorkbenchCore({ renderers: { createHost: () => myHost } }).");
79
- const r = document.createElement("div");
80
- return r.style.display = "contents", r.dataset.workbenchKeepAliveHost = "", r;
81
- }, _ = (r = {}) => {
82
- const n = r.createHost ?? x, t = p({
83
- name: "workbench.renderers",
84
- initialState: {
85
- renderers: {},
86
- hosts: {},
87
- claims: {}
88
- }
89
- }), s = (e) => {
90
- const o = t.getState(), i = o.hosts[e], a = i?.attachedTo;
91
- !i || !a || (a.contains(i.host) && a.removeChild(i.host), t.setState({
92
- ...o,
93
- hosts: {
94
- ...o.hosts,
95
- [e]: {
96
- ...i,
97
- attachedTo: void 0
98
- }
99
- },
100
- claims: f(o.claims, e)
101
- }, !1, "renderers.detach"));
102
- }, c = {
103
- store: t,
104
- registerRenderer(e) {
105
- const o = t.getState();
106
- if (o.renderers[e.id]) throw new Error(`Renderer already registered: ${e.id}`);
107
- const i = e.keepAlive ? n() : void 0, a = i ? {
108
- ...o.hosts,
109
- [e.id]: {
110
- rendererId: e.id,
111
- host: i
112
- }
113
- } : o.hosts;
114
- return t.setState({
115
- ...o,
116
- renderers: {
117
- ...o.renderers,
118
- [e.id]: e
119
- },
120
- hosts: a
121
- }, !1, "registerRenderer"), l(() => {
122
- if (t.getState().renderers[e.id] !== e) return;
123
- e.keepAlive && s(e.id);
124
- const u = t.getState();
125
- t.setState({
126
- ...u,
127
- renderers: f(u.renderers, e.id),
128
- hosts: f(u.hosts, e.id),
129
- claims: f(u.claims, e.id)
130
- }, !1, "unregisterRenderer");
131
- });
132
- },
133
- getRenderer(e) {
134
- return t.getState().renderers[e];
135
- },
136
- listRenderers() {
137
- return Object.values(t.getState().renderers);
138
- },
139
- onDidChange(e) {
140
- const o = t.subscribeSelector((i) => i.renderers, () => e());
141
- return l(o);
142
- },
143
- claim(e, o, i) {
144
- const a = t.getState(), d = a.renderers[e];
145
- if (!d) throw new Error(`Renderer is not registered: ${e}`);
146
- if (!d.keepAlive) throw new Error(`Renderer ${e} is not keep-alive; cannot claim`);
147
- const u = a.hosts[e];
148
- if (!u) throw new Error(`Renderer ${e} has no host`);
149
- if (u.attachedTo === o)
150
- t.setState({
151
- ...a,
152
- claims: {
153
- ...a.claims,
154
- [e]: i
155
- }
156
- }, !1, "renderers.updateClaim");
157
- else {
158
- s(e);
159
- const g = t.getState(), h = g.hosts[e];
160
- o.appendChild(h.host), t.setState({
161
- ...g,
162
- hosts: {
163
- ...g.hosts,
164
- [e]: {
165
- ...h,
166
- attachedTo: o
167
- }
168
- },
169
- claims: {
170
- ...g.claims,
171
- [e]: i
172
- }
173
- }, !1, "renderers.attach");
174
- }
175
- return l(() => {
176
- const h = t.getState().hosts[e];
177
- !h || h.attachedTo !== o || s(e);
178
- });
179
- },
180
- getHost(e) {
181
- return t.getState().hosts[e]?.host;
182
- },
183
- getClaim(e) {
184
- return t.getState().claims[e];
185
- }
186
- };
187
- for (const e of r.initialRenderers ?? []) c.registerRenderer(e);
188
- return c;
189
- }, M = {
190
- project: "folder-root",
191
- workspace: "computer",
192
- worktree: "git-pull-request-draft",
193
- settings: "settings",
194
- dataRenderer: "table-properties"
195
- }, O = "workbench.resource.kind", E = "workbench.resource.id", $ = (r) => `workbench.resource.metadata.${r}`, y = "workbench.selectionResourceUri", j = (r) => typeof r == "string" || typeof r == "number" || typeof r == "boolean", q = (r) => {
196
- if (!r) return {};
197
- const n = {
198
- [O]: r.kind,
199
- [E]: r.id ?? r.uri
200
- };
201
- for (const [t, s] of Object.entries(r.metadata ?? {}))
202
- j(s) && (n[$(t)] = s);
203
- return n;
204
- }, U = (r) => ({
205
- [y]: r.uri
206
- }), D = (r) => {
207
- if (!r) return [];
208
- const n = r.metadata?.[y];
209
- return typeof n != "string" || n === r.uri ? [r.uri] : [r.uri, n];
210
- }, m = (r) => [...r].sort((n, t) => t.priority - n.priority || n.id.localeCompare(t.id)), z = (r = {}) => {
211
- const n = /* @__PURE__ */ new Set(), t = p({
212
- name: "workbench.resources",
213
- initialState: {
214
- kinds: {},
215
- openers: {},
216
- providers: {}
217
- }
218
- });
219
- return {
220
- store: t,
221
- registerKind(s, c) {
222
- const e = t.getState();
223
- if (e.kinds[s.kind]) throw new Error(`Resource kind already registered: ${s.kind}`);
224
- const o = {
225
- ...b(c),
226
- ...s
227
- };
228
- return t.setState({
229
- ...e,
230
- kinds: {
231
- ...e.kinds,
232
- [s.kind]: o
233
- }
234
- }, !1, "registerKind"), l(() => {
235
- const i = t.getState();
236
- if (i.kinds[s.kind] !== o) return;
237
- const {
238
- [s.kind]: a,
239
- ...d
240
- } = i.kinds;
241
- t.setState({
242
- ...i,
243
- kinds: d
244
- }, !1, "unregisterKind");
245
- });
246
- },
247
- getKind(s) {
248
- return t.getState().kinds[s];
249
- },
250
- getSurface(s) {
251
- return t.getState().kinds[s.kind]?.surface;
252
- },
253
- listKinds() {
254
- return Object.values(t.getState().kinds).sort(S);
255
- },
256
- registerOpener(s) {
257
- const c = t.getState();
258
- if (c.openers[s.id]) throw new Error(`Resource opener already registered: ${s.id}`);
259
- const e = {
260
- ...s,
261
- priority: s.priority ?? 0
262
- };
263
- return t.setState({
264
- ...c,
265
- openers: {
266
- ...c.openers,
267
- [s.id]: e
268
- }
269
- }, !1, "registerOpener"), l(() => {
270
- const o = t.getState();
271
- if (o.openers[s.id] !== e) return;
272
- const {
273
- [s.id]: i,
274
- ...a
275
- } = o.openers;
276
- t.setState({
277
- ...o,
278
- openers: a
279
- }, !1, "unregisterOpener");
280
- });
281
- },
282
- listOpeners() {
283
- return m(Object.values(t.getState().openers));
284
- },
285
- registerProvider(s) {
286
- const c = t.getState();
287
- if (c.providers[s.id]) throw new Error(`Resource provider already registered: ${s.id}`);
288
- return t.setState({
289
- ...c,
290
- providers: {
291
- ...c.providers,
292
- [s.id]: s
293
- }
294
- }, !1, "registerProvider"), l(() => {
295
- const e = t.getState();
296
- if (e.providers[s.id] !== s) return;
297
- const {
298
- [s.id]: o,
299
- ...i
300
- } = e.providers;
301
- t.setState({
302
- ...e,
303
- providers: i
304
- }, !1, "unregisterProvider");
305
- });
306
- },
307
- listProviders() {
308
- return Object.values(t.getState().providers);
309
- },
310
- listResources(s) {
311
- const c = {
312
- primary: r.getPrimary?.()
313
- }, e = [];
314
- for (const o of Object.values(t.getState().providers))
315
- e.push(...o.list(s, c));
316
- return e;
317
- },
318
- async openResource(s, c = {}) {
319
- const e = t.getState();
320
- if (!e.kinds[s.kind]) throw new Error(`Unknown resource kind: ${s.kind}`);
321
- const o = m(Object.values(e.openers)).find((a) => a.canOpen(s));
322
- if (!o) throw new Error(`No opener registered for resource kind: ${s.kind}`);
323
- const i = await o.open(s, c);
324
- for (const a of n) a(s);
325
- return i;
326
- },
327
- onDidOpenResource(s) {
328
- return n.add(s), l(() => {
329
- n.delete(s);
330
- });
331
- }
332
- };
333
- }, H = (r) => r.replace(/^['"]|['"]$/g, ""), A = (r, n) => {
334
- const t = n.trim();
335
- if (t.length === 0) return !0;
336
- const s = t.match(/^([A-Za-z0-9_.-]+)\s*(==|!=)\s*(.+)$/);
337
- if (s) {
338
- const [, c, e, o] = s, i = r[c ?? ""], a = H(o ?? "");
339
- return e === "==" ? String(i) === a : String(i) !== a;
340
- }
341
- return t.startsWith("!") ? !r[t.slice(1)] : !!r[t];
342
- }, V = (r, n) => n ? n.split("||").some((t) => t.split("&&").every((s) => A(r, s))) : !0, B = () => {
343
- const r = p({
344
- name: "workbench.context",
345
- initialState: {
346
- values: {}
347
- }
348
- });
349
- let n = {};
350
- const t = /* @__PURE__ */ new Map(), s = () => {
351
- const e = {
352
- ...n
353
- };
354
- for (const o of t.values()) Object.assign(e, o);
355
- return e;
356
- }, c = (e) => {
357
- r.setState({
358
- values: s()
359
- }, !1, e);
360
- };
361
- return {
362
- store: r,
363
- set(e, o) {
364
- n[e] !== o && (n = {
365
- ...n,
366
- [e]: o
367
- }, c("setContextKey"));
368
- },
369
- get(e) {
370
- return r.getState().values[e];
371
- },
372
- delete(e) {
373
- if (!(e in n)) return;
374
- const {
375
- [e]: o,
376
- ...i
377
- } = n;
378
- n = i, c("deleteContextKey");
379
- },
380
- createScope(e) {
381
- t.set(e, t.get(e) ?? {});
382
- let o = !1;
383
- const i = () => {
384
- if (o) throw new Error(`Context key scope disposed: ${e}`);
385
- };
386
- return {
387
- ownerId: e,
388
- set(a, d) {
389
- i();
390
- const u = t.get(e) ?? {};
391
- u[a] !== d && (t.set(e, {
392
- ...u,
393
- [a]: d
394
- }), c("setScopedContextKey"));
395
- },
396
- get(a) {
397
- return i(), t.get(e)?.[a];
398
- },
399
- delete(a) {
400
- i();
401
- const d = t.get(e);
402
- if (!d || !(a in d)) return;
403
- const {
404
- [a]: u,
405
- ...g
406
- } = d;
407
- t.set(e, g), c("deleteScopedContextKey");
408
- },
409
- dispose() {
410
- o || (o = !0, t.delete(e) && c("disposeContextKeyScope"));
411
- }
412
- };
413
- },
414
- deleteOwner(e) {
415
- t.delete(e) && c("deleteContextKeyOwner");
416
- },
417
- snapshot() {
418
- return {
419
- ...r.getState().values
420
- };
421
- },
422
- matches(e) {
423
- return V(r.getState().values, e);
424
- }
425
- };
426
- };
427
- export {
428
- W as a,
429
- z as b,
430
- B as c,
431
- _ as d,
432
- q as e,
433
- U as f,
434
- p as g,
435
- C as h,
436
- D as i,
437
- O as j,
438
- $ as k,
439
- y as l,
440
- V as m,
441
- l as n,
442
- S as o,
443
- b as p,
444
- M as s,
445
- E as w
446
- };
447
- //# sourceMappingURL=context-key-service-C--cHa0B.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-key-service-C--cHa0B.js","sources":["../src/core/shared/disposable.ts","../src/core/shared/store/workbench-store.ts","../src/core/shared/contributions/metadata.ts","../src/core/registries/keybindings/keybinding-registry.ts","../src/core/registries/renderers/renderer-registry.ts","../src/core/registries/resources/resource-icons.ts","../src/core/registries/resources/resource-registry.ts","../src/core/shared/context/context-key-service.ts"],"sourcesContent":["export interface Disposable {\n dispose(): void;\n}\n\nexport const createDisposable = (onDispose: () => void): Disposable => {\n let disposed = false;\n\n return {\n dispose() {\n if (disposed) return;\n disposed = true;\n onDispose();\n },\n };\n};\n","import { devtools, type NamedSet } from \"zustand/middleware\";\nimport { createStore, type StoreApi } from \"zustand/vanilla\";\n\nexport type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;\n\nexport type WorkbenchStoreListener<TState> = (state: TState, previousState: TState) => void;\n\nexport type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;\n\nexport interface WorkbenchStore<TState> {\n getState(): TState;\n getInitialState(): TState;\n subscribe(listener: WorkbenchStoreListener<TState>): () => void;\n subscribeSelector<TValue>(\n selector: WorkbenchStoreSelector<TState, TValue>,\n listener: WorkbenchStoreSelectorListener<TValue>,\n options?: { equalityFn?: (left: TValue, right: TValue) => boolean; fireImmediately?: boolean },\n ): () => void;\n}\n\nexport interface InternalWorkbenchStore<TState> extends WorkbenchStore<TState> {\n setState: NamedSet<TState>;\n api: StoreApi<TState>;\n}\n\nexport interface CreateWorkbenchStoreInput<TState> {\n name?: string;\n initialState: TState;\n}\n\nconst defaultEquality = <TValue>(left: TValue, right: TValue) => Object.is(left, right);\n\nexport const createWorkbenchStore = <TState>(\n input: CreateWorkbenchStoreInput<TState>,\n): InternalWorkbenchStore<TState> => {\n const api = createStore<TState>()(devtools(() => input.initialState, { name: input.name ?? \"workbench.store\" }));\n\n const subscribeSelector: WorkbenchStore<TState>[\"subscribeSelector\"] = (selector, listener, options = {}) => {\n const equalityFn = options.equalityFn ?? defaultEquality;\n let previousValue = selector(api.getState());\n\n if (options.fireImmediately) listener(previousValue, previousValue);\n\n return api.subscribe((state) => {\n const nextValue = selector(state);\n if (equalityFn(previousValue, nextValue)) return;\n const previous = previousValue;\n previousValue = nextValue;\n listener(nextValue, previous);\n });\n };\n\n return {\n getState: api.getState,\n getInitialState: api.getInitialState,\n subscribe: api.subscribe,\n subscribeSelector,\n setState: api.setState,\n api,\n };\n};\n","export type ContributionSource = \"module\" | \"extension\";\n\nexport interface ContributionMetadata {\n source?: ContributionSource;\n ownerId?: string;\n priority?: number;\n}\n\nexport interface RegisteredContributionMetadata {\n source: ContributionSource;\n ownerId: string;\n priority: number;\n}\n\nconst defaultContributionOwnerId = \"workbench.core\";\n\nexport const normalizeContributionMetadata = (metadata: ContributionMetadata = {}) => ({\n source: metadata.source ?? \"module\",\n ownerId: metadata.ownerId ?? defaultContributionOwnerId,\n priority: metadata.priority ?? 0,\n});\n\nexport const byContributionPriority = (left: RegisteredContributionMetadata, right: RegisteredContributionMetadata) =>\n right.priority - left.priority || left.ownerId.localeCompare(right.ownerId);\n","import type { ContextKeyService } from \"../../shared/context/context-key-service\";\nimport {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { CommandRegistry } from \"../commands/command-registry\";\n\nexport interface Keybinding {\n commandId: string;\n keybinding: KeybindingSequence;\n when?: string;\n args?: unknown;\n}\n\nexport type KeybindingSequence = string | string[];\n\nexport interface RegisteredKeybinding extends Keybinding, RegisteredContributionMetadata {}\n\ninterface KeybindingRegistryDeps {\n commands: CommandRegistry;\n context: ContextKeyService;\n}\n\nexport interface KeybindingRegistryStoreState {\n keybindings: RegisteredKeybinding[];\n}\n\nexport interface KeybindingRegistry {\n store: WorkbenchStore<KeybindingRegistryStoreState>;\n registerKeybinding(keybinding: Keybinding, metadata?: ContributionMetadata): Disposable;\n listKeybindings(): RegisteredKeybinding[];\n listActiveKeybindings(): RegisteredKeybinding[];\n}\n\nexport const getKeybindingSteps = (keybinding: KeybindingSequence) => {\n if (Array.isArray(keybinding)) return keybinding;\n\n return keybinding.trim().split(/\\s+/).filter(Boolean);\n};\n\nconst normalizeKeybindingSequence = (keybinding: KeybindingSequence): KeybindingSequence => {\n const steps = getKeybindingSteps(keybinding);\n return steps.length === 1 ? (steps[0] ?? \"\") : steps;\n};\n\nexport const createKeybindingRegistry = (deps: KeybindingRegistryDeps): KeybindingRegistry => {\n const store = createWorkbenchStore<KeybindingRegistryStoreState>({\n name: \"workbench.keybindings\",\n initialState: { keybindings: [] },\n });\n\n return {\n store,\n\n registerKeybinding(keybinding, metadata) {\n if (!deps.commands.getCommand(keybinding.commandId))\n throw new Error(`Keybinding command not registered: ${keybinding.commandId}`);\n\n const record: RegisteredKeybinding = {\n ...normalizeContributionMetadata(metadata),\n ...keybinding,\n keybinding: normalizeKeybindingSequence(keybinding.keybinding),\n };\n\n const snapshot = store.getState();\n store.setState({ keybindings: [...snapshot.keybindings, record] }, false, \"registerKeybinding\");\n\n return createDisposable(() => {\n const current = store.getState();\n const next = current.keybindings.filter((candidate) => candidate !== record);\n if (next.length === current.keybindings.length) return;\n store.setState({ keybindings: next }, false, \"unregisterKeybinding\");\n });\n },\n\n listKeybindings() {\n return [...store.getState().keybindings].sort(byContributionPriority);\n },\n\n listActiveKeybindings() {\n return store\n .getState()\n .keybindings.filter((keybinding) => deps.context.matches(keybinding.when))\n .sort(byContributionPriority);\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { WorkbenchCore } from \"../../workbench-core\";\nimport type {\n RegisteredPlaceholderContribution,\n RegisteredWidgetContribution,\n WorkbenchWidgetPlacement,\n} from \"../layout/layout-model\";\n\nexport interface WorkbenchWidgetRenderInput {\n workbench: WorkbenchCore;\n widget: RegisteredWidgetContribution | RegisteredPlaceholderContribution;\n placement: WorkbenchWidgetPlacement;\n refresh: () => void;\n}\n\n// Keep-alive renderers are invoked exactly once into a persistent host and\n// reparented across widget mounts via DOM moves. They cannot read the per-widget\n// `WorkbenchWidgetRenderInput` from their render args — the subtree subscribes\n// to the current claim through `useWorkbenchClaim()` (React layer) instead.\nexport type WorkbenchRendererRegistration =\n | {\n id: string;\n keepAlive?: false;\n render: (input: WorkbenchWidgetRenderInput) => unknown;\n }\n | {\n id: string;\n keepAlive: true;\n render: () => unknown;\n };\n\nexport type WorkbenchRendererChangeListener = () => void;\n\nexport interface RegisteredKeepAliveHost {\n rendererId: string;\n host: HTMLElement;\n attachedTo?: HTMLElement;\n}\n\nexport interface WorkbenchRendererStoreState {\n renderers: Record<string, WorkbenchRendererRegistration>;\n hosts: Record<string, RegisteredKeepAliveHost>;\n claims: Record<string, WorkbenchWidgetRenderInput>;\n}\n\nexport interface WorkbenchRendererRegistry {\n store: WorkbenchStore<WorkbenchRendererStoreState>;\n registerRenderer(renderer: WorkbenchRendererRegistration): Disposable;\n getRenderer(id: string): WorkbenchRendererRegistration | undefined;\n listRenderers(): WorkbenchRendererRegistration[];\n onDidChange(listener: WorkbenchRendererChangeListener): Disposable;\n claim(rendererId: string, slot: HTMLElement, input: WorkbenchWidgetRenderInput): Disposable;\n getHost(rendererId: string): HTMLElement | undefined;\n getClaim(rendererId: string): WorkbenchWidgetRenderInput | undefined;\n}\n\nexport interface CreateWorkbenchRendererRegistryInput {\n initialRenderers?: WorkbenchRendererRegistration[];\n // Override for environments without a real DOM (Bun tests). Default reads\n // `document`; SSR callers without DOM should provide their own factory.\n createHost?: () => HTMLElement;\n}\n\nconst removeKey = <T>(record: Record<string, T>, key: string): Record<string, T> => {\n const { [key]: _removed, ...rest } = record;\n return rest;\n};\n\nconst defaultCreateHost = () => {\n if (typeof document === \"undefined\") {\n throw new Error(\n \"workbench.renderers.registerRenderer({ keepAlive: true }): no DOM available. \" +\n \"The default host factory uses document.createElement. In a non-browser environment \" +\n \"(Bun tests, SSR), pass a custom factory via \" +\n \"createWorkbenchCore({ renderers: { createHost: () => myHost } }).\",\n );\n }\n const host = document.createElement(\"div\");\n host.style.display = \"contents\";\n host.dataset.workbenchKeepAliveHost = \"\";\n return host;\n};\n\nexport const createWorkbenchRendererRegistry = (\n input: CreateWorkbenchRendererRegistryInput = {},\n): WorkbenchRendererRegistry => {\n const createHost = input.createHost ?? defaultCreateHost;\n\n const store = createWorkbenchStore<WorkbenchRendererStoreState>({\n name: \"workbench.renderers\",\n initialState: { renderers: {}, hosts: {}, claims: {} },\n });\n\n // Detach the host of `rendererId` from its current slot (if any) and clear\n // the matching claim. Used before reparenting and before unregistering.\n const detachHost = (rendererId: string) => {\n const snapshot = store.getState();\n const hostState = snapshot.hosts[rendererId];\n const previousSlot = hostState?.attachedTo;\n if (!hostState || !previousSlot) return;\n\n if (previousSlot.contains(hostState.host)) previousSlot.removeChild(hostState.host);\n\n store.setState(\n {\n ...snapshot,\n hosts: { ...snapshot.hosts, [rendererId]: { ...hostState, attachedTo: undefined } },\n claims: removeKey(snapshot.claims, rendererId),\n },\n false,\n \"renderers.detach\",\n );\n };\n\n const registry: WorkbenchRendererRegistry = {\n store,\n\n registerRenderer(renderer) {\n const snapshot = store.getState();\n if (snapshot.renderers[renderer.id]) throw new Error(`Renderer already registered: ${renderer.id}`);\n\n const host = renderer.keepAlive ? createHost() : undefined;\n const nextHosts = host ? { ...snapshot.hosts, [renderer.id]: { rendererId: renderer.id, host } } : snapshot.hosts;\n\n store.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [renderer.id]: renderer }, hosts: nextHosts },\n false,\n \"registerRenderer\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.renderers[renderer.id] !== renderer) return;\n\n if (renderer.keepAlive) detachHost(renderer.id);\n\n const after = store.getState();\n store.setState(\n {\n ...after,\n renderers: removeKey(after.renderers, renderer.id),\n hosts: removeKey(after.hosts, renderer.id),\n claims: removeKey(after.claims, renderer.id),\n },\n false,\n \"unregisterRenderer\",\n );\n });\n },\n\n getRenderer(id) {\n return store.getState().renderers[id];\n },\n\n listRenderers() {\n return Object.values(store.getState().renderers);\n },\n\n onDidChange(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.renderers,\n () => listener(),\n );\n return createDisposable(unsubscribe);\n },\n\n claim(rendererId, slot, claimInput) {\n const snapshot = store.getState();\n const renderer = snapshot.renderers[rendererId];\n if (!renderer) throw new Error(`Renderer is not registered: ${rendererId}`);\n if (!renderer.keepAlive) throw new Error(`Renderer ${rendererId} is not keep-alive; cannot claim`);\n\n const hostState = snapshot.hosts[rendererId];\n if (!hostState) throw new Error(`Renderer ${rendererId} has no host`);\n\n // If already attached to this slot, only update the claim input and\n // skip the DOM move so re-renders with the same slot stay quiet.\n if (hostState.attachedTo === slot) {\n store.setState(\n { ...snapshot, claims: { ...snapshot.claims, [rendererId]: claimInput } },\n false,\n \"renderers.updateClaim\",\n );\n } else {\n detachHost(rendererId);\n const next = store.getState();\n const refreshedHostState = next.hosts[rendererId]!;\n slot.appendChild(refreshedHostState.host);\n store.setState(\n {\n ...next,\n hosts: { ...next.hosts, [rendererId]: { ...refreshedHostState, attachedTo: slot } },\n claims: { ...next.claims, [rendererId]: claimInput },\n },\n false,\n \"renderers.attach\",\n );\n }\n\n return createDisposable(() => {\n const current = store.getState();\n const currentHostState = current.hosts[rendererId];\n if (!currentHostState || currentHostState.attachedTo !== slot) return;\n detachHost(rendererId);\n });\n },\n\n getHost(rendererId) {\n return store.getState().hosts[rendererId]?.host;\n },\n\n getClaim(rendererId) {\n return store.getState().claims[rendererId];\n },\n };\n\n for (const renderer of input.initialRenderers ?? []) registry.registerRenderer(renderer);\n\n return registry;\n};\n","export const standardResourceIcons = {\n project: \"folder-root\",\n workspace: \"computer\",\n worktree: \"git-pull-request-draft\",\n settings: \"settings\",\n dataRenderer: \"table-properties\",\n} as const;\n\nexport type StandardResourceIcon = (typeof standardResourceIcons)[keyof typeof standardResourceIcons];\n","import type { ContextKeyValue } from \"../../shared/context/context-key-service\";\nimport {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport interface ResourceRef {\n kind: string;\n uri: string;\n id?: string;\n label?: string;\n icon?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport const workbenchResourceKindContextKey = \"workbench.resource.kind\";\nexport const workbenchResourceIdContextKey = \"workbench.resource.id\";\nexport const workbenchResourceMetadataContextKey = (key: string) => `workbench.resource.metadata.${key}`;\nexport const workbenchSelectionResourceUriMetadataKey = \"workbench.selectionResourceUri\";\n\nconst isContextPrimitive = (value: unknown): value is Exclude<ContextKeyValue, undefined> =>\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n\nexport const createWorkbenchResourceContextValues = (resource: ResourceRef | undefined) => {\n if (!resource) return {};\n\n const values: Record<string, ContextKeyValue> = {\n [workbenchResourceKindContextKey]: resource.kind,\n [workbenchResourceIdContextKey]: resource.id ?? resource.uri,\n };\n\n for (const [key, value] of Object.entries(resource.metadata ?? {})) {\n if (isContextPrimitive(value)) values[workbenchResourceMetadataContextKey(key)] = value;\n }\n\n return values;\n};\n\nexport const createWorkbenchSelectionResourceMetadata = (resource: Pick<ResourceRef, \"uri\">) => ({\n [workbenchSelectionResourceUriMetadataKey]: resource.uri,\n});\n\nexport const getWorkbenchSelectionResourceUris = (resource: ResourceRef | undefined) => {\n if (!resource) return [];\n\n const selectionResourceUri = resource.metadata?.[workbenchSelectionResourceUriMetadataKey];\n if (typeof selectionResourceUri !== \"string\" || selectionResourceUri === resource.uri) return [resource.uri];\n\n return [resource.uri, selectionResourceUri];\n};\n\nexport interface OpenResourceInput {\n replaceActive?: boolean;\n}\n\n// The anchor a resource kind routes to. `primary` is the main subject; `secondary` and\n// `attached` are the side anchors (derived terminals, detached sessions). Independent of\n// the area id that currently hosts each anchor.\nexport type ResourceSurface = \"primary\" | \"secondary\" | \"attached\";\n\nexport interface ResourceKindContribution {\n kind: string;\n label: string;\n icon?: string;\n surface?: ResourceSurface;\n paletteOpenInput?: OpenResourceInput;\n}\n\nexport interface RegisteredResourceKind extends ResourceKindContribution, RegisteredContributionMetadata {}\n\nexport interface ResourceOpener<TResult = unknown> {\n id: string;\n priority?: number;\n canOpen(resource: ResourceRef): boolean;\n open(resource: ResourceRef, input: OpenResourceInput): TResult | Promise<TResult>;\n}\n\ntype ResolvedResourceOpener = Required<ResourceOpener>;\n\nexport interface ResourceBrowseEntry {\n resource: ResourceRef;\n searchText?: string;\n description?: string;\n group?: string;\n order?: number;\n activate?: (resource: ResourceRef) => unknown | Promise<unknown>;\n}\n\n// Context handed to providers so candidate lists can be scoped to the current surface\n// hierarchy — e.g. only the sessions/terminals belonging to the active primary resource.\nexport interface ResourceListContext {\n primary?: ResourceRef;\n}\n\nexport interface ResourceProvider {\n id: string;\n kind: string;\n list(query: string, context: ResourceListContext): readonly ResourceBrowseEntry[];\n}\n\nexport interface ResourceRegistryStoreState {\n kinds: Record<string, RegisteredResourceKind>;\n openers: Record<string, ResolvedResourceOpener>;\n providers: Record<string, ResourceProvider>;\n}\n\nexport interface ResourceRegistry {\n store: WorkbenchStore<ResourceRegistryStoreState>;\n registerKind(kind: ResourceKindContribution, metadata?: ContributionMetadata): Disposable;\n getKind(kind: string): RegisteredResourceKind | undefined;\n // The anchor a resource routes to, declared by its kind (undefined → not surface-routed).\n getSurface(resource: ResourceRef): ResourceSurface | undefined;\n listKinds(): RegisteredResourceKind[];\n registerOpener(opener: ResourceOpener): Disposable;\n listOpeners(): ResolvedResourceOpener[];\n registerProvider(provider: ResourceProvider): Disposable;\n listProviders(): ResourceProvider[];\n listResources(query: string): readonly ResourceBrowseEntry[];\n openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<unknown>;\n onDidOpenResource(listener: (resource: ResourceRef) => void): Disposable;\n}\n\nconst sortOpeners = (openers: ResolvedResourceOpener[]) =>\n [...openers].sort((left, right) => right.priority - left.priority || left.id.localeCompare(right.id));\n\nexport interface CreateResourceRegistryInput {\n // Resolves the active primary resource so listResources can scope provider candidates.\n getPrimary?: () => ResourceRef | undefined;\n}\n\nexport const createResourceRegistry = (input: CreateResourceRegistryInput = {}): ResourceRegistry => {\n const openListeners = new Set<(resource: ResourceRef) => void>();\n const store = createWorkbenchStore<ResourceRegistryStoreState>({\n name: \"workbench.resources\",\n initialState: { kinds: {}, openers: {}, providers: {} },\n });\n\n return {\n store,\n\n registerKind(kind, metadata) {\n const snapshot = store.getState();\n if (snapshot.kinds[kind.kind]) throw new Error(`Resource kind already registered: ${kind.kind}`);\n\n const record: RegisteredResourceKind = {\n ...normalizeContributionMetadata(metadata),\n ...kind,\n };\n\n store.setState({ ...snapshot, kinds: { ...snapshot.kinds, [kind.kind]: record } }, false, \"registerKind\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.kinds[kind.kind] !== record) return;\n const { [kind.kind]: _removed, ...rest } = current.kinds;\n store.setState({ ...current, kinds: rest }, false, \"unregisterKind\");\n });\n },\n\n getKind(kind) {\n return store.getState().kinds[kind];\n },\n\n getSurface(resource) {\n return store.getState().kinds[resource.kind]?.surface;\n },\n\n listKinds() {\n return Object.values(store.getState().kinds).sort(byContributionPriority);\n },\n\n registerOpener(opener) {\n const snapshot = store.getState();\n if (snapshot.openers[opener.id]) throw new Error(`Resource opener already registered: ${opener.id}`);\n\n const record: ResolvedResourceOpener = { ...opener, priority: opener.priority ?? 0 };\n store.setState({ ...snapshot, openers: { ...snapshot.openers, [opener.id]: record } }, false, \"registerOpener\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.openers[opener.id] !== record) return;\n const { [opener.id]: _removed, ...rest } = current.openers;\n store.setState({ ...current, openers: rest }, false, \"unregisterOpener\");\n });\n },\n\n listOpeners() {\n return sortOpeners(Object.values(store.getState().openers));\n },\n\n registerProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.providers[provider.id]) throw new Error(`Resource provider already registered: ${provider.id}`);\n\n store.setState(\n { ...snapshot, providers: { ...snapshot.providers, [provider.id]: provider } },\n false,\n \"registerProvider\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.providers[provider.id] !== provider) return;\n const { [provider.id]: _removed, ...rest } = current.providers;\n store.setState({ ...current, providers: rest }, false, \"unregisterProvider\");\n });\n },\n\n listProviders() {\n return Object.values(store.getState().providers);\n },\n\n listResources(query) {\n const context: ResourceListContext = { primary: input.getPrimary?.() };\n const entries: ResourceBrowseEntry[] = [];\n for (const provider of Object.values(store.getState().providers)) {\n entries.push(...provider.list(query, context));\n }\n return entries;\n },\n\n async openResource(resource, input = {}) {\n const snapshot = store.getState();\n if (!snapshot.kinds[resource.kind]) throw new Error(`Unknown resource kind: ${resource.kind}`);\n\n const opener = sortOpeners(Object.values(snapshot.openers)).find((candidate) => candidate.canOpen(resource));\n if (!opener) throw new Error(`No opener registered for resource kind: ${resource.kind}`);\n\n const result = await opener.open(resource, input);\n for (const listener of openListeners) listener(resource);\n return result;\n },\n\n onDidOpenResource(listener) {\n openListeners.add(listener);\n return createDisposable(() => {\n openListeners.delete(listener);\n });\n },\n };\n};\n","import type { Disposable } from \"../disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../store/workbench-store\";\n\nexport type ContextKeyValue = boolean | number | string | undefined;\n\nexport interface ContextKeyStoreState {\n values: Record<string, ContextKeyValue>;\n}\n\nexport interface ContextKeyScope extends Disposable {\n ownerId: string;\n set(key: string, value: ContextKeyValue): void;\n get(key: string): ContextKeyValue;\n delete(key: string): void;\n}\n\nexport interface ContextKeyService {\n store: WorkbenchStore<ContextKeyStoreState>;\n set(key: string, value: ContextKeyValue): void;\n get(key: string): ContextKeyValue;\n delete(key: string): void;\n createScope(ownerId: string): ContextKeyScope;\n deleteOwner(ownerId: string): void;\n snapshot(): Record<string, ContextKeyValue>;\n matches(expression?: string): boolean;\n}\n\nconst readComparisonValue = (value: string) => value.replace(/^['\"]|['\"]$/g, \"\");\n\nconst matchesTerm = (values: Record<string, ContextKeyValue>, term: string) => {\n const trimmed = term.trim();\n if (trimmed.length === 0) return true;\n\n const comparison = trimmed.match(/^([A-Za-z0-9_.-]+)\\s*(==|!=)\\s*(.+)$/);\n if (comparison) {\n const [, key, operator, rawValue] = comparison;\n const actual = values[key ?? \"\"];\n const expected = readComparisonValue(rawValue ?? \"\");\n return operator === \"==\" ? String(actual) === expected : String(actual) !== expected;\n }\n\n if (trimmed.startsWith(\"!\")) return !values[trimmed.slice(1)];\n\n return Boolean(values[trimmed]);\n};\n\nexport const matchesContextExpression = (values: Record<string, ContextKeyValue>, expression?: string) => {\n if (!expression) return true;\n return expression.split(\"||\").some((orClause) => orClause.split(\"&&\").every((term) => matchesTerm(values, term)));\n};\n\nexport const createContextKeyService = (): ContextKeyService => {\n const store = createWorkbenchStore<ContextKeyStoreState>({\n name: \"workbench.context\",\n initialState: { values: {} },\n });\n\n let globalValues: Record<string, ContextKeyValue> = {};\n const ownerValues = new Map<string, Record<string, ContextKeyValue>>();\n\n const buildValues = () => {\n const values = { ...globalValues };\n for (const scopedValues of ownerValues.values()) Object.assign(values, scopedValues);\n return values;\n };\n\n const publish = (action: string) => {\n store.setState({ values: buildValues() }, false, action);\n };\n\n return {\n store,\n\n set(key, value) {\n if (globalValues[key] === value) return;\n globalValues = { ...globalValues, [key]: value };\n publish(\"setContextKey\");\n },\n\n get(key) {\n return store.getState().values[key];\n },\n\n delete(key) {\n if (!(key in globalValues)) return;\n const { [key]: _removed, ...rest } = globalValues;\n globalValues = rest;\n publish(\"deleteContextKey\");\n },\n\n createScope(ownerId) {\n ownerValues.set(ownerId, ownerValues.get(ownerId) ?? {});\n let disposed = false;\n\n const assertActive = () => {\n if (disposed) throw new Error(`Context key scope disposed: ${ownerId}`);\n };\n\n return {\n ownerId,\n\n set(key, value) {\n assertActive();\n const values = ownerValues.get(ownerId) ?? {};\n if (values[key] === value) return;\n ownerValues.set(ownerId, { ...values, [key]: value });\n publish(\"setScopedContextKey\");\n },\n\n get(key) {\n assertActive();\n return ownerValues.get(ownerId)?.[key];\n },\n\n delete(key) {\n assertActive();\n const values = ownerValues.get(ownerId);\n if (!values || !(key in values)) return;\n const { [key]: _removed, ...rest } = values;\n ownerValues.set(ownerId, rest);\n publish(\"deleteScopedContextKey\");\n },\n\n dispose() {\n if (disposed) return;\n disposed = true;\n if (!ownerValues.delete(ownerId)) return;\n publish(\"disposeContextKeyScope\");\n },\n };\n },\n\n deleteOwner(ownerId) {\n if (!ownerValues.delete(ownerId)) return;\n publish(\"deleteContextKeyOwner\");\n },\n\n snapshot() {\n return { ...store.getState().values };\n },\n\n matches(expression) {\n return matchesContextExpression(store.getState().values, expression);\n },\n };\n};\n"],"names":["createDisposable","onDispose","disposed","dispose","defaultEquality","left","right","Object","is","createWorkbenchStore","input","api","createStore","devtools","initialState","name","subscribeSelector","selector","listener","options","equalityFn","previousValue","getState","fireImmediately","subscribe","state","nextValue","previous","getInitialState","setState","defaultContributionOwnerId","normalizeContributionMetadata","metadata","source","ownerId","priority","byContributionPriority","localeCompare","getKeybindingSteps","keybinding","Array","isArray","trim","split","filter","Boolean","normalizeKeybindingSequence","steps","length","createKeybindingRegistry","deps","store","keybindings","registerKeybinding","commands","getCommand","commandId","Error","record","snapshot","current","next","candidate","listKeybindings","sort","listActiveKeybindings","context","matches","when","removeKey","key","_removed","rest","defaultCreateHost","document","host","createElement","style","display","dataset","workbenchKeepAliveHost","createWorkbenchRendererRegistry","createHost","renderers","hosts","claims","detachHost","rendererId","hostState","previousSlot","attachedTo","contains","removeChild","undefined","registry","registerRenderer","renderer","id","keepAlive","nextHosts","after","getRenderer","listRenderers","values","onDidChange","unsubscribe","claim","slot","claimInput","refreshedHostState","appendChild","currentHostState","getHost","getClaim","initialRenderers","standardResourceIcons","project","workspace","worktree","settings","dataRenderer","workbenchResourceKindContextKey","workbenchResourceIdContextKey","workbenchResourceMetadataContextKey","workbenchSelectionResourceUriMetadataKey","isContextPrimitive","value","createWorkbenchResourceContextValues","resource","kind","uri","entries","createWorkbenchSelectionResourceMetadata","getWorkbenchSelectionResourceUris","selectionResourceUri","sortOpeners","openers","createResourceRegistry","openListeners","Set","kinds","providers","registerKind","getKind","getSurface","surface","listKinds","registerOpener","opener","listOpeners","registerProvider","provider","listProviders","listResources","query","primary","getPrimary","push","list","openResource","find","canOpen","result","open","onDidOpenResource","add","delete","readComparisonValue","replace","matchesTerm","term","trimmed","comparison","match","operator","rawValue","actual","expected","String","startsWith","slice","matchesContextExpression","expression","some","orClause","every","createContextKeyService","globalValues","ownerValues","Map","buildValues","scopedValues","assign","publish","action","set","get","createScope","assertActive","deleteOwner"],"mappings":"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"}