@pstdio/workbench 0.2.0 → 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 +737 -255
  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
package/dist/core.js DELETED
@@ -1,64 +0,0 @@
1
- import { c as a, a as t, b as s, d as o, e as c, f as n, g as i, h, i as l, j as R, k as g, l as b, m as d, n as u, o as y, p as k, q as C, r as m, s as P, t as W, u as w, v as M, w as x, x as f, y as p } from "./workbench-core-DFpwi8Lo.js";
2
- import { c as S, a as T, b as K, d as L, e as j, f as v, g as F, h as H, i as I, m as D, s as N, w as U, j as q, k as B, l as E } from "./context-key-service-C--cHa0B.js";
3
- import { c as z, g as G, a as J, l as O, b as Q, d as X, r as Y, e as Z, s as _, w as $ } from "./surface-reconcile-DkRf01ro.js";
4
- import { h as re, a as ae, r as te, w as se, b as oe, c as ce, d as ne } from "./workbench-menu-paths-CQVH6z4_.js";
5
- export {
6
- a as createCommandPaletteResourceRegistry,
7
- t as createCommandRegistry,
8
- S as createContextKeyService,
9
- s as createControlsRendererRegistry,
10
- o as createDataRendererRegistry,
11
- z as createDefaultWorkbenchLayout,
12
- c as createFileIconThemeRegistry,
13
- n as createFileRendererRegistry,
14
- i as createHistoryController,
15
- T as createKeybindingRegistry,
16
- h as createLayoutModel,
17
- l as createMenuRegistry,
18
- R as createNavigationRegistry,
19
- g as createNotificationRegistry,
20
- b as createPreferenceRegistry,
21
- K as createResourceRegistry,
22
- d as createSettingsRegistry,
23
- u as createThemeRegistry,
24
- y as createTreeRendererRegistry,
25
- k as createWorkbenchBreadcrumbController,
26
- C as createWorkbenchCommandPaletteController,
27
- m as createWorkbenchCore,
28
- P as createWorkbenchFocusController,
29
- W as createWorkbenchLastResourceController,
30
- w as createWorkbenchModeRegistry,
31
- M as createWorkbenchPanelsController,
32
- L as createWorkbenchRendererRegistry,
33
- j as createWorkbenchResourceContextValues,
34
- v as createWorkbenchSelectionResourceMetadata,
35
- x as createWorkbenchSessionPanelController,
36
- F as createWorkbenchStore,
37
- f as createWorkbenchTerminalController,
38
- G as getAnchorResource,
39
- H as getKeybindingSteps,
40
- J as getSurface,
41
- I as getWorkbenchSelectionResourceUris,
42
- re as headerLeadingMenuPath,
43
- ae as headerTrailingMenuPath,
44
- O as listAnchorAreas,
45
- Q as listProjectionAreas,
46
- X as listProjectionsReading,
47
- D as matchesContextExpression,
48
- Y as reconcileAnchors,
49
- Z as resolveAnchorArea,
50
- te as resourceContextMenuPath,
51
- N as standardResourceIcons,
52
- _ as surfaceMap,
53
- se as workbenchAreaTabLeadingMenuPath,
54
- $ as workbenchAreas,
55
- oe as workbenchCommandPaletteMenuPath,
56
- p as workbenchFocusAreas,
57
- U as workbenchResourceIdContextKey,
58
- q as workbenchResourceKindContextKey,
59
- B as workbenchResourceMetadataContextKey,
60
- E as workbenchSelectionResourceUriMetadataKey,
61
- ce as workbenchTopHeaderLeadingMenuPath,
62
- ne as workbenchTopHeaderTrailingMenuPath
63
- };
64
- //# sourceMappingURL=core.js.map
package/dist/core.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"core.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,260 +0,0 @@
1
- const S = (t, r) => {
2
- for (const e of Object.values(t.areas)) {
3
- const a = e.widgets.findIndex((i) => i.contributionId === r);
4
- if (a >= 0) return {
5
- areaId: e.id,
6
- index: a,
7
- placement: e.widgets[a]
8
- };
9
- }
10
- }, R = (t, r, e) => {
11
- for (const a of Object.values(t.areas)) {
12
- const i = a.widgets.findIndex((n) => n.contributionId === r && n.resourceUri === e);
13
- if (i >= 0) return {
14
- areaId: a.id,
15
- index: i,
16
- placement: a.widgets[i]
17
- };
18
- }
19
- }, I = (t, r) => {
20
- for (const e of Object.values(t.areas)) {
21
- const a = e.widgets.findIndex((i) => i.widgetId === r);
22
- if (a >= 0) return {
23
- areaId: e.id,
24
- index: a,
25
- placement: e.widgets[a]
26
- };
27
- }
28
- }, u = (t) => t.widgets.find((r) => r.widgetId === t.activeWidgetId) ?? t.widgets[0], U = (t, r, e) => {
29
- const a = {
30
- ...t
31
- };
32
- return e.resource ? (a.resource = e.resource, a.resourceUri = e.resource.uri, a.title = e.title ?? e.resource.label ?? r.title) : e.title !== void 0 && (a.title = e.title), e.pinned !== void 0 && (a.pinned = e.pinned), e.closable !== void 0 && (a.closable = e.closable), e.mountStrategy !== void 0 && (a.mountStrategy = e.mountStrategy), e.hiddenByDefault !== void 0 && (a.hiddenByDefault = e.hiddenByDefault), e.ownerId !== void 0 && (a.ownerId = e.ownerId), e.source !== void 0 && (a.source = e.source), a;
33
- }, B = (t, r, e) => ({
34
- widgetId: t,
35
- contributionId: r.id,
36
- ownerId: e.ownerId ?? r.ownerId,
37
- source: e.source ?? r.source,
38
- resource: e.resource,
39
- resourceUri: e.resource?.uri,
40
- title: e.title ?? e.resource?.label ?? r.title,
41
- pinned: e.pinned,
42
- // Tabbed (non-singleton) widgets are closable unless they opt out; singleton
43
- // panels stay non-closable by default.
44
- closable: e.closable ?? r.closable ?? !r.singleton,
45
- mountStrategy: e.mountStrategy ?? r.mountStrategy,
46
- hiddenByDefault: e.hiddenByDefault ?? r.hiddenByDefault
47
- }), E = (t, r, e, a = {}) => {
48
- const i = t.areas[r], n = e(i.widgets), c = a.activeWidgetId !== void 0 ? a.activeWidgetId : a.clearActiveWidget ? void 0 : i.activeWidgetId;
49
- return {
50
- ...t,
51
- areas: {
52
- ...t.areas,
53
- [r]: {
54
- ...i,
55
- widgets: n,
56
- activeWidgetId: c
57
- }
58
- }
59
- };
60
- }, p = (t, r) => {
61
- let e = t;
62
- for (const i of Object.values(t.areas)) {
63
- const n = i.widgets.filter((d) => d.contributionId !== r);
64
- if (n.length === i.widgets.length) continue;
65
- const c = i.activeWidgetId && !n.some((d) => d.widgetId === i.activeWidgetId) ? void 0 : i.activeWidgetId;
66
- e = {
67
- ...e,
68
- areas: {
69
- ...e.areas,
70
- [i.id]: {
71
- ...i,
72
- widgets: n,
73
- activeWidgetId: c
74
- }
75
- }
76
- };
77
- }
78
- const a = Object.values(e.areas).some((i) => i.widgets.some((n) => n.widgetId === e.activeWidgetId));
79
- return e.activeWidgetId && (!a || e.activeWidgetId.startsWith(`${r}:`) || e.activeWidgetId === r) && (e = {
80
- ...e,
81
- activeWidgetId: void 0,
82
- activeResourceUri: void 0
83
- }), e;
84
- }, O = (t, r) => {
85
- const e = I(t, r);
86
- if (!e) return;
87
- const a = t.areas[e.areaId], i = a.widgets.filter((m) => m.widgetId !== r), n = a.activeWidgetId === r || !a.activeWidgetId && e.index === 0, c = i[e.index] ?? i[e.index - 1], d = n ? c?.widgetId : a.activeWidgetId, h = {
88
- ...a,
89
- widgets: i,
90
- activeWidgetId: d
91
- };
92
- let g = {
93
- ...t,
94
- areas: {
95
- ...t.areas,
96
- [a.id]: h
97
- }
98
- };
99
- return t.activeWidgetId === r && (g = {
100
- ...g,
101
- activeWidgetId: c?.widgetId,
102
- activeResourceUri: c?.resourceUri
103
- }), {
104
- areaId: e.areaId,
105
- closedPlacement: e.placement,
106
- activePlacement: u(h),
107
- layout: g
108
- };
109
- }, L = (t, r, e) => {
110
- const a = t.areas[r];
111
- return {
112
- ...t,
113
- activeWidgetId: e.widgetId,
114
- activeResourceUri: e.resourceUri,
115
- areas: {
116
- ...t.areas,
117
- [r]: {
118
- ...a,
119
- activeWidgetId: e.widgetId
120
- }
121
- }
122
- };
123
- }, f = ["nav", "activity", "left-header", "left", "main-header", "main-left", "main", "main-right", "secondary-header", "secondary", "status", "overlay", "floating-header", "floating"], o = (t) => ({
124
- id: t,
125
- visible: !0,
126
- widgets: []
127
- }), y = () => ({
128
- areas: {
129
- nav: o("nav"),
130
- activity: o("activity"),
131
- "left-header": o("left-header"),
132
- left: o("left"),
133
- "main-header": o("main-header"),
134
- "main-left": o("main-left"),
135
- main: o("main"),
136
- "main-right": o("main-right"),
137
- "secondary-header": o("secondary-header"),
138
- secondary: o("secondary"),
139
- status: o("status"),
140
- overlay: o("overlay"),
141
- "floating-header": o("floating-header"),
142
- floating: o("floating")
143
- }
144
- }), W = {
145
- top: "nav",
146
- activityBar: "activity",
147
- "main-bottom": "secondary",
148
- "main-bottom-header": "secondary-header"
149
- }, w = /* @__PURE__ */ new Set(["main-left-header", "main-right-header"]), b = (t) => {
150
- const r = {};
151
- for (const [e, a] of Object.entries(t)) {
152
- if (w.has(e)) continue;
153
- const i = W[e] ?? e;
154
- r[i] = a.id === i ? a : {
155
- ...a,
156
- id: i
157
- };
158
- }
159
- return r;
160
- }, k = (t) => {
161
- const r = y();
162
- return {
163
- ...t,
164
- areas: {
165
- ...r.areas,
166
- ...b(t.areas)
167
- }
168
- };
169
- }, v = (t, r, e) => ({
170
- role: "anchor",
171
- anchor: t,
172
- persistence: r,
173
- candidates: e
174
- }), s = (t, r = !1) => r ? {
175
- role: "projection",
176
- reads: t,
177
- navigator: r
178
- } : {
179
- role: "projection",
180
- reads: t
181
- }, A = {
182
- role: "chrome"
183
- }, x = {
184
- role: "transient"
185
- }, l = {
186
- // The top bar hosts breadcrumbs (primary trail) and session status (attached), so it
187
- // reads both anchors — it is a projection, not inert chrome.
188
- nav: s(["primary", "attached"]),
189
- activity: A,
190
- "left-header": s(["primary"]),
191
- left: s(["primary"], !0),
192
- "main-header": s(["primary"]),
193
- "main-left": s(["primary"]),
194
- main: v("primary", "primary", "global"),
195
- "main-right": s(["primary"]),
196
- "secondary-header": s(["primary"]),
197
- secondary: v("secondary", "derived", "scoped"),
198
- status: s(["primary", "attached"]),
199
- overlay: x,
200
- "floating-header": s(["attached"]),
201
- floating: v("attached", "detached", "scoped")
202
- }, j = (t) => l[t], D = () => f.filter((t) => l[t].role === "anchor"), _ = () => f.filter((t) => l[t].role === "projection"), M = (t) => f.filter((r) => {
203
- const e = l[r];
204
- return e.role === "projection" && e.reads.includes(t);
205
- }), P = (t) => {
206
- const r = f.find((e) => {
207
- const a = l[e];
208
- return a.role === "anchor" && a.anchor === t;
209
- });
210
- if (!r) throw new Error(`No area hosts anchor: ${t}`);
211
- return r;
212
- }, N = (t, r) => u(t.areas[P(r)])?.resource, $ = ({
213
- layout: t,
214
- primary: r,
215
- isInScope: e
216
- }) => {
217
- const a = [];
218
- for (const i of D()) {
219
- const n = j(i);
220
- if (n.role !== "anchor" || n.persistence === "primary") continue;
221
- const c = u(t.areas[i]);
222
- if (c?.resource) {
223
- if (n.persistence === "derived") {
224
- a.push({
225
- area: i,
226
- action: "clear"
227
- });
228
- continue;
229
- }
230
- a.push({
231
- area: i,
232
- action: e(c.resource, r) ? "keep" : "clear"
233
- });
234
- }
235
- }
236
- return a;
237
- };
238
- export {
239
- j as a,
240
- _ as b,
241
- y as c,
242
- M as d,
243
- P as e,
244
- u as f,
245
- N as g,
246
- O as h,
247
- U as i,
248
- E as j,
249
- p as k,
250
- D as l,
251
- k as m,
252
- L as n,
253
- S as o,
254
- R as p,
255
- B as q,
256
- $ as r,
257
- l as s,
258
- f as w
259
- };
260
- //# sourceMappingURL=surface-reconcile-DkRf01ro.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"surface-reconcile-DkRf01ro.js","sources":["../src/core/registries/layout/layout-operations.ts","../src/core/registries/layout/layout-types.ts","../src/core/registries/layout/surface-map.ts","../src/core/registries/layout/surface-reconcile.ts"],"sourcesContent":["import type {\n OpenWidgetInput,\n RegisteredWidgetContribution,\n WorkbenchArea,\n WorkbenchAreaState,\n WorkbenchLayout,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\nexport const findPlacement = (layout: WorkbenchLayout, contributionId: string) => {\n for (const area of Object.values(layout.areas)) {\n const index = area.widgets.findIndex((candidate) => candidate.contributionId === contributionId);\n if (index >= 0) return { areaId: area.id, index, placement: area.widgets[index] };\n }\n return undefined;\n};\n\nexport const findResourcePlacement = (layout: WorkbenchLayout, contributionId: string, resourceUri: string) => {\n for (const area of Object.values(layout.areas)) {\n const index = area.widgets.findIndex(\n (candidate) => candidate.contributionId === contributionId && candidate.resourceUri === resourceUri,\n );\n if (index >= 0) return { areaId: area.id, index, placement: area.widgets[index] };\n }\n return undefined;\n};\n\nexport const findPlacementByWidgetId = (layout: WorkbenchLayout, widgetId: string) => {\n for (const area of Object.values(layout.areas)) {\n const index = area.widgets.findIndex((candidate) => candidate.widgetId === widgetId);\n if (index >= 0) return { areaId: area.id, index, placement: area.widgets[index] };\n }\n return undefined;\n};\n\nexport const getActivePlacement = (area: WorkbenchAreaState) =>\n area.widgets.find((placement) => placement.widgetId === area.activeWidgetId) ?? area.widgets[0];\n\nexport const buildUpdatedPlacement = (\n placement: WorkbenchWidgetPlacement,\n widget: RegisteredWidgetContribution,\n update: OpenWidgetInput,\n): WorkbenchWidgetPlacement => {\n const next: WorkbenchWidgetPlacement = { ...placement };\n if (update.resource) {\n next.resource = update.resource;\n next.resourceUri = update.resource.uri;\n next.title = update.title ?? update.resource.label ?? widget.title;\n } else if (update.title !== undefined) {\n next.title = update.title;\n }\n if (update.pinned !== undefined) next.pinned = update.pinned;\n if (update.closable !== undefined) next.closable = update.closable;\n if (update.mountStrategy !== undefined) next.mountStrategy = update.mountStrategy;\n if (update.hiddenByDefault !== undefined) next.hiddenByDefault = update.hiddenByDefault;\n if (update.ownerId !== undefined) next.ownerId = update.ownerId;\n if (update.source !== undefined) next.source = update.source;\n return next;\n};\n\nexport const createPlacement = (\n widgetId: string,\n widget: RegisteredWidgetContribution,\n spec: OpenWidgetInput,\n): WorkbenchWidgetPlacement => ({\n widgetId,\n contributionId: widget.id,\n ownerId: spec.ownerId ?? widget.ownerId,\n source: spec.source ?? widget.source,\n resource: spec.resource,\n resourceUri: spec.resource?.uri,\n title: spec.title ?? spec.resource?.label ?? widget.title,\n pinned: spec.pinned,\n // Tabbed (non-singleton) widgets are closable unless they opt out; singleton\n // panels stay non-closable by default.\n closable: spec.closable ?? widget.closable ?? !widget.singleton,\n mountStrategy: spec.mountStrategy ?? widget.mountStrategy,\n hiddenByDefault: spec.hiddenByDefault ?? widget.hiddenByDefault,\n});\n\ninterface ReplaceAreaWidgetsOptions {\n activeWidgetId?: string;\n clearActiveWidget?: boolean;\n}\n\nexport const replaceAreaWidgets = (\n layout: WorkbenchLayout,\n areaId: WorkbenchArea,\n update: (widgets: WorkbenchWidgetPlacement[]) => WorkbenchWidgetPlacement[],\n options: ReplaceAreaWidgetsOptions = {},\n): WorkbenchLayout => {\n const area = layout.areas[areaId];\n const widgets = update(area.widgets);\n const activeWidgetId =\n options.activeWidgetId !== undefined\n ? options.activeWidgetId\n : options.clearActiveWidget\n ? undefined\n : area.activeWidgetId;\n\n return {\n ...layout,\n areas: {\n ...layout.areas,\n [areaId]: { ...area, widgets, activeWidgetId },\n },\n };\n};\n\nexport const removePlacementsForContribution = (layout: WorkbenchLayout, contributionId: string): WorkbenchLayout => {\n let nextLayout = layout;\n\n for (const area of Object.values(layout.areas)) {\n const filtered = area.widgets.filter((placement) => placement.contributionId !== contributionId);\n if (filtered.length === area.widgets.length) continue;\n const activeWidgetId =\n area.activeWidgetId && !filtered.some((placement) => placement.widgetId === area.activeWidgetId)\n ? undefined\n : area.activeWidgetId;\n nextLayout = {\n ...nextLayout,\n areas: {\n ...nextLayout.areas,\n [area.id]: { ...area, widgets: filtered, activeWidgetId },\n },\n };\n }\n\n const hasActiveWidget = Object.values(nextLayout.areas).some((area) =>\n area.widgets.some((placement) => placement.widgetId === nextLayout.activeWidgetId),\n );\n\n if (\n nextLayout.activeWidgetId &&\n (!hasActiveWidget ||\n nextLayout.activeWidgetId.startsWith(`${contributionId}:`) ||\n nextLayout.activeWidgetId === contributionId)\n ) {\n nextLayout = { ...nextLayout, activeWidgetId: undefined, activeResourceUri: undefined };\n }\n\n return nextLayout;\n};\n\nexport const closeWidgetInLayout = (layout: WorkbenchLayout, widgetId: string) => {\n const found = findPlacementByWidgetId(layout, widgetId);\n if (!found) return undefined;\n\n const area = layout.areas[found.areaId];\n const widgets = area.widgets.filter((placement) => placement.widgetId !== widgetId);\n const closingEffectiveActive = area.activeWidgetId === widgetId || (!area.activeWidgetId && found.index === 0);\n const nextActivePlacement = widgets[found.index] ?? widgets[found.index - 1];\n const activeWidgetId = closingEffectiveActive ? nextActivePlacement?.widgetId : area.activeWidgetId;\n const nextArea = { ...area, widgets, activeWidgetId };\n let nextLayout: WorkbenchLayout = {\n ...layout,\n areas: {\n ...layout.areas,\n [area.id]: nextArea,\n },\n };\n\n if (layout.activeWidgetId === widgetId) {\n nextLayout = {\n ...nextLayout,\n activeWidgetId: nextActivePlacement?.widgetId,\n activeResourceUri: nextActivePlacement?.resourceUri,\n };\n }\n\n return {\n areaId: found.areaId,\n closedPlacement: found.placement,\n activePlacement: getActivePlacement(nextArea),\n layout: nextLayout,\n };\n};\n\nexport const activateInLayout = (\n layout: WorkbenchLayout,\n areaId: WorkbenchArea,\n placement: WorkbenchWidgetPlacement,\n): WorkbenchLayout => {\n const area = layout.areas[areaId];\n return {\n ...layout,\n activeWidgetId: placement.widgetId,\n activeResourceUri: placement.resourceUri,\n areas: {\n ...layout.areas,\n [areaId]: { ...area, activeWidgetId: placement.widgetId },\n },\n };\n};\n","import type { ContributionSource, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\n\nexport const workbenchAreas = [\n \"nav\",\n \"activity\",\n \"left-header\",\n \"left\",\n \"main-header\",\n \"main-left\",\n \"main\",\n \"main-right\",\n \"secondary-header\",\n \"secondary\",\n \"status\",\n \"overlay\",\n \"floating-header\",\n \"floating\",\n] as const;\n\nexport type WorkbenchArea = (typeof workbenchAreas)[number];\n\nexport interface WorkbenchAreaSize {\n defaultPx?: number;\n minPx?: number;\n maxPx?: number;\n}\n\nexport type WidgetReusePolicy = \"resource\" | \"none\";\n\nexport type WidgetMountStrategy = \"active\" | \"keep-mounted\";\n\nexport interface WidgetContribution {\n id: string;\n title: string;\n area: WorkbenchArea;\n fallbackArea?: WorkbenchArea;\n singleton?: boolean;\n reuse?: WidgetReusePolicy;\n mountStrategy?: WidgetMountStrategy;\n closable?: boolean;\n // Non-closeable widgets opt into the tab visibility menu; closeable widgets\n // ignore this and use the X button for dismissal.\n hiddenByDefault?: boolean;\n areaSize?: WorkbenchAreaSize;\n areaCollapsible?: boolean;\n headerBorderBottom?: boolean;\n resourceKinds?: string[];\n priority?: number;\n rendererId: string;\n config?: unknown;\n canOpen?(resource: ResourceRef): boolean;\n}\n\nexport type RegisteredWidgetContribution = Omit<WidgetContribution, \"priority\" | \"singleton\" | \"reuse\"> & {\n singleton: boolean;\n reuse: WidgetReusePolicy;\n} & RegisteredContributionMetadata;\n\nexport interface PlaceholderContribution {\n id: string;\n title: string;\n area: WorkbenchArea;\n rendererId: string;\n areaSize?: WorkbenchAreaSize;\n areaCollapsible?: boolean;\n config?: unknown;\n priority?: number;\n}\n\nexport type RegisteredPlaceholderContribution = Omit<PlaceholderContribution, \"priority\"> &\n RegisteredContributionMetadata;\n\nexport interface WorkbenchWidgetPlacement {\n widgetId: string;\n contributionId: string;\n ownerId?: string;\n source?: ContributionSource;\n resource?: ResourceRef;\n resourceUri?: string;\n title?: string;\n pinned?: boolean;\n closable?: boolean;\n mountStrategy?: WidgetMountStrategy;\n hiddenByDefault?: boolean;\n}\n\nexport interface WorkbenchAreaState {\n id: WorkbenchArea;\n visible: boolean;\n size?: number;\n widgets: WorkbenchWidgetPlacement[];\n activeWidgetId?: string;\n}\n\nexport interface WorkbenchLayout {\n areas: Record<WorkbenchArea, WorkbenchAreaState>;\n activeWidgetId?: string;\n activeResourceUri?: string;\n}\n\nexport interface WorkbenchLayoutStoreState {\n layout: WorkbenchLayout;\n widgets: Record<string, RegisteredWidgetContribution>;\n placeholders: Partial<Record<WorkbenchArea, RegisteredPlaceholderContribution>>;\n}\n\nexport interface OpenWidgetInput {\n resource?: ResourceRef;\n title?: string;\n area?: WorkbenchArea;\n ownerId?: string;\n source?: ContributionSource;\n pinned?: boolean;\n closable?: boolean;\n mountStrategy?: WidgetMountStrategy;\n hiddenByDefault?: boolean;\n replaceActive?: boolean;\n}\n\nconst createAreaState = (id: WorkbenchArea): WorkbenchAreaState => ({\n id,\n visible: true,\n widgets: [],\n});\n\nexport const createDefaultWorkbenchLayout = (): WorkbenchLayout => ({\n areas: {\n nav: createAreaState(\"nav\"),\n activity: createAreaState(\"activity\"),\n \"left-header\": createAreaState(\"left-header\"),\n left: createAreaState(\"left\"),\n \"main-header\": createAreaState(\"main-header\"),\n \"main-left\": createAreaState(\"main-left\"),\n main: createAreaState(\"main\"),\n \"main-right\": createAreaState(\"main-right\"),\n \"secondary-header\": createAreaState(\"secondary-header\"),\n secondary: createAreaState(\"secondary\"),\n status: createAreaState(\"status\"),\n overlay: createAreaState(\"overlay\"),\n \"floating-header\": createAreaState(\"floating-header\"),\n floating: createAreaState(\"floating\"),\n },\n});\n\n// Persisted layouts from before the area rename carry the old keys. Remap them (key and\n// the area's own `id`) so a stored layout still merges into the current schema instead of\n// silently orphaning those areas.\nconst RENAMED_AREA_IDS: Record<string, WorkbenchArea> = {\n top: \"nav\",\n activityBar: \"activity\",\n \"main-bottom\": \"secondary\",\n \"main-bottom-header\": \"secondary-header\",\n};\n\n// The side regions (main-left / main-right) are headerless, so these header areas no\n// longer exist. They were always empty, so a stored layout loses nothing by dropping them.\nconst REMOVED_AREA_IDS = new Set([\"main-left-header\", \"main-right-header\"]);\n\nconst migrateAreaIds = (areas: WorkbenchLayout[\"areas\"]): WorkbenchLayout[\"areas\"] => {\n const migrated = {} as WorkbenchLayout[\"areas\"];\n for (const [id, area] of Object.entries(areas) as [string, WorkbenchAreaState][]) {\n if (REMOVED_AREA_IDS.has(id)) continue;\n const nextId = RENAMED_AREA_IDS[id] ?? (id as WorkbenchArea);\n migrated[nextId] = area.id === nextId ? area : { ...area, id: nextId };\n }\n return migrated;\n};\n\nexport const mergeWithDefaultAreas = (persisted: WorkbenchLayout): WorkbenchLayout => {\n const defaults = createDefaultWorkbenchLayout();\n return {\n ...persisted,\n areas: { ...defaults.areas, ...migrateAreaIds(persisted.areas) },\n };\n};\n","import { type WorkbenchArea, workbenchAreas } from \"./layout-types\";\n\n// The surface map describes the *behavioural* role of each workbench area: which\n// areas host a resource (anchors), which render an anchor's resource (projections),\n// and which are frame chrome or the transient overlay layer. It is additive metadata\n// over the existing area ids — the cosmetic rename (main-bottom → secondary, etc.) and\n// the region collapse happen in a later phase. The project scope root is NOT a surface;\n// it is handled by the layout persistence scope.\n\n// Logical anchor identity, independent of the area id that currently hosts it.\nexport type AnchorId = \"primary\" | \"secondary\" | \"attached\";\n\n// Does an anchor's active selection survive a primary change?\n// - primary: the subject itself.\n// - derived: re-scopes/clears on primary change (terminals follow the workspace).\n// - detached: persists across primary navigation, but disconnects when the new\n// primary's scoped candidates no longer list it (scope wins).\nexport type AnchorPersistence = \"primary\" | \"derived\" | \"detached\";\n\n// What the anchor's quick-pick offers: everything, or filtered by primary.\nexport type AnchorCandidates = \"global\" | \"scoped\";\n\n// Which anchor(s) a projection renders.\nexport type AnchorReadId = \"primary\" | \"attached\";\n\nexport interface AnchorSurface {\n role: \"anchor\";\n anchor: AnchorId;\n persistence: AnchorPersistence;\n candidates: AnchorCandidates;\n}\n\nexport interface ProjectionSurface {\n role: \"projection\";\n reads: AnchorReadId[];\n // The left navigator both reads primary (highlight) and selects it (the picker).\n navigator?: boolean;\n}\n\nexport interface ChromeSurface {\n role: \"chrome\";\n}\n\nexport interface TransientSurface {\n role: \"transient\";\n}\n\nexport type SurfaceDescriptor = AnchorSurface | ProjectionSurface | ChromeSurface | TransientSurface;\n\nconst anchor = (anchor: AnchorId, persistence: AnchorPersistence, candidates: AnchorCandidates): AnchorSurface => ({\n role: \"anchor\",\n anchor,\n persistence,\n candidates,\n});\n\nconst projection = (reads: AnchorReadId[], navigator = false): ProjectionSurface =>\n navigator ? { role: \"projection\", reads, navigator } : { role: \"projection\", reads };\n\nconst chrome: ChromeSurface = { role: \"chrome\" };\nconst transient: TransientSurface = { role: \"transient\" };\n\nexport const surfaceMap: Record<WorkbenchArea, SurfaceDescriptor> = {\n // The top bar hosts breadcrumbs (primary trail) and session status (attached), so it\n // reads both anchors — it is a projection, not inert chrome.\n nav: projection([\"primary\", \"attached\"]),\n activity: chrome,\n \"left-header\": projection([\"primary\"]),\n left: projection([\"primary\"], true),\n \"main-header\": projection([\"primary\"]),\n \"main-left\": projection([\"primary\"]),\n main: anchor(\"primary\", \"primary\", \"global\"),\n \"main-right\": projection([\"primary\"]),\n \"secondary-header\": projection([\"primary\"]),\n secondary: anchor(\"secondary\", \"derived\", \"scoped\"),\n status: projection([\"primary\", \"attached\"]),\n overlay: transient,\n \"floating-header\": projection([\"attached\"]),\n floating: anchor(\"attached\", \"detached\", \"scoped\"),\n};\n\nexport const getSurface = (area: WorkbenchArea) => surfaceMap[area];\n\nexport const listAnchorAreas = () =>\n workbenchAreas.filter((area): area is WorkbenchArea => surfaceMap[area].role === \"anchor\");\n\nexport const listProjectionAreas = () =>\n workbenchAreas.filter((area): area is WorkbenchArea => surfaceMap[area].role === \"projection\");\n\nexport const listProjectionsReading = (anchorId: AnchorReadId) =>\n workbenchAreas.filter((area) => {\n const surface = surfaceMap[area];\n return surface.role === \"projection\" && surface.reads.includes(anchorId);\n });\n\n// Reverse lookup: which area currently hosts a given logical anchor.\nexport const resolveAnchorArea = (anchorId: AnchorId) => {\n const area = workbenchAreas.find((candidate) => {\n const surface = surfaceMap[candidate];\n return surface.role === \"anchor\" && surface.anchor === anchorId;\n });\n if (!area) throw new Error(`No area hosts anchor: ${anchorId}`);\n return area;\n};\n","import type { ResourceRef } from \"../resources/resource-registry\";\nimport { getActivePlacement } from \"./layout-operations\";\nimport type { WorkbenchArea, WorkbenchLayout } from \"./layout-types\";\nimport { type AnchorId, getSurface, listAnchorAreas, resolveAnchorArea } from \"./surface-map\";\n\n// The resource an anchor currently hosts, read from its area's active placement. This\n// is the primary-scoped signal the coordinator keys off — `getAnchorResource(layout,\n// \"primary\")` is the main resource, free of the global active-resource pollution that\n// any side-area activation otherwise introduces.\nexport const getAnchorResource = (layout: WorkbenchLayout, anchorId: AnchorId) =>\n getActivePlacement(layout.areas[resolveAnchorArea(anchorId)])?.resource;\n\n// What the coordinator should do with a secondary anchor when the primary resource\n// changes. Projections re-render off their anchor (a render concern), so the reconciler\n// only decides the lifecycle of the derived/detached anchor placements.\nexport type AnchorReconcileAction = { area: WorkbenchArea; action: \"keep\" | \"clear\" };\n\nexport interface ReconcileAnchorsInput {\n layout: WorkbenchLayout;\n primary: ResourceRef | undefined;\n // Whether a detached anchor's current resource still belongs to the new primary's\n // scoped candidates. Backed by scoped resource providers once wired.\n isInScope: (resource: ResourceRef, primary: ResourceRef | undefined) => boolean;\n}\n\n// On a primary change: derived anchors re-scope (clear, then repopulate from the new\n// scope); detached anchors stay while their resource is still in scope, else disconnect\n// (scope wins). The primary anchor is the subject and is never reconciled.\nexport const reconcileAnchors = ({ layout, primary, isInScope }: ReconcileAnchorsInput): AnchorReconcileAction[] => {\n const actions: AnchorReconcileAction[] = [];\n\n for (const area of listAnchorAreas()) {\n const surface = getSurface(area);\n if (surface.role !== \"anchor\" || surface.persistence === \"primary\") continue;\n\n // Only resource-bearing anchor placements are scoped content. A plain (resourceless)\n // widget parked in a side anchor is not a scoped resource and is left untouched.\n const placement = getActivePlacement(layout.areas[area]);\n if (!placement?.resource) continue;\n\n if (surface.persistence === \"derived\") {\n actions.push({ area, action: \"clear\" });\n continue;\n }\n\n actions.push({ area, action: isInScope(placement.resource, primary) ? \"keep\" : \"clear\" });\n }\n\n return actions;\n};\n"],"names":["findPlacement","layout","contributionId","area","Object","values","areas","index","widgets","findIndex","candidate","areaId","id","placement","findResourcePlacement","resourceUri","findPlacementByWidgetId","widgetId","getActivePlacement","find","activeWidgetId","buildUpdatedPlacement","widget","update","next","resource","uri","title","label","undefined","pinned","closable","mountStrategy","hiddenByDefault","ownerId","source","createPlacement","spec","singleton","replaceAreaWidgets","options","clearActiveWidget","removePlacementsForContribution","nextLayout","filtered","filter","length","some","hasActiveWidget","startsWith","activeResourceUri","closeWidgetInLayout","found","closingEffectiveActive","nextActivePlacement","nextArea","closedPlacement","activePlacement","activateInLayout","workbenchAreas","createAreaState","visible","createDefaultWorkbenchLayout","nav","activity","left","main","secondary","status","overlay","floating","RENAMED_AREA_IDS","top","activityBar","REMOVED_AREA_IDS","Set","migrateAreaIds","migrated","entries","has","nextId","mergeWithDefaultAreas","persisted","defaults","anchor","persistence","candidates","role","projection","reads","navigator","chrome","transient","surfaceMap","getSurface","listAnchorAreas","listProjectionAreas","listProjectionsReading","anchorId","surface","includes","resolveAnchorArea","Error","getAnchorResource","reconcileAnchors","primary","isInScope","actions","push","action"],"mappings":"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"}