@clipboard-health/groundcrew 4.0.3 → 4.2.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 (64) hide show
  1. package/README.md +37 -13
  2. package/crew.config.example.ts +5 -18
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +27 -49
  5. package/dist/commands/resumeWorkspace.d.ts.map +1 -1
  6. package/dist/commands/resumeWorkspace.js +1 -2
  7. package/dist/commands/setupWorkspace.d.ts.map +1 -1
  8. package/dist/commands/setupWorkspace.js +1 -7
  9. package/dist/commands/upgrade.d.ts +0 -11
  10. package/dist/commands/upgrade.d.ts.map +1 -1
  11. package/dist/commands/upgrade.js +14 -100
  12. package/dist/lib/agentLaunch.d.ts +0 -6
  13. package/dist/lib/agentLaunch.d.ts.map +1 -1
  14. package/dist/lib/agentLaunch.js +1 -12
  15. package/dist/lib/cmuxAdapter.d.ts +8 -0
  16. package/dist/lib/cmuxAdapter.d.ts.map +1 -0
  17. package/dist/lib/cmuxAdapter.js +163 -0
  18. package/dist/lib/config.d.ts +2 -76
  19. package/dist/lib/config.d.ts.map +1 -1
  20. package/dist/lib/config.js +29 -102
  21. package/dist/lib/launchCommand.d.ts +3 -3
  22. package/dist/lib/sandboxName.d.ts +9 -0
  23. package/dist/lib/sandboxName.d.ts.map +1 -0
  24. package/dist/lib/sandboxName.js +12 -0
  25. package/dist/lib/tmuxAdapter.d.ts +9 -0
  26. package/dist/lib/tmuxAdapter.d.ts.map +1 -0
  27. package/dist/lib/tmuxAdapter.js +156 -0
  28. package/dist/lib/workspaceAdapter.d.ts +79 -0
  29. package/dist/lib/workspaceAdapter.d.ts.map +1 -0
  30. package/dist/lib/workspaceAdapter.js +17 -0
  31. package/dist/lib/workspaces.d.ts +7 -55
  32. package/dist/lib/workspaces.d.ts.map +1 -1
  33. package/dist/lib/workspaces.js +8 -404
  34. package/package.json +1 -2
  35. package/dist/commands/sandbox/auth.d.ts +0 -3
  36. package/dist/commands/sandbox/auth.d.ts.map +0 -1
  37. package/dist/commands/sandbox/auth.js +0 -227
  38. package/dist/commands/sandbox/index.d.ts +0 -2
  39. package/dist/commands/sandbox/index.d.ts.map +0 -1
  40. package/dist/commands/sandbox/index.js +0 -47
  41. package/dist/commands/sandbox/inspect.d.ts +0 -2
  42. package/dist/commands/sandbox/inspect.d.ts.map +0 -1
  43. package/dist/commands/sandbox/inspect.js +0 -18
  44. package/dist/commands/sandbox/lifecycle.d.ts +0 -7
  45. package/dist/commands/sandbox/lifecycle.d.ts.map +0 -1
  46. package/dist/commands/sandbox/lifecycle.js +0 -68
  47. package/dist/commands/sandbox/model.d.ts +0 -10
  48. package/dist/commands/sandbox/model.d.ts.map +0 -1
  49. package/dist/commands/sandbox/model.js +0 -37
  50. package/dist/commands/sandbox/picker.d.ts +0 -20
  51. package/dist/commands/sandbox/picker.d.ts.map +0 -1
  52. package/dist/commands/sandbox/picker.js +0 -23
  53. package/dist/commands/setupRepos.d.ts +0 -44
  54. package/dist/commands/setupRepos.d.ts.map +0 -1
  55. package/dist/commands/setupRepos.js +0 -212
  56. package/dist/lib/dockerSandbox.d.ts +0 -43
  57. package/dist/lib/dockerSandbox.d.ts.map +0 -1
  58. package/dist/lib/dockerSandbox.js +0 -69
  59. package/dist/lib/sandboxGitDefaults.d.ts +0 -10
  60. package/dist/lib/sandboxGitDefaults.d.ts.map +0 -1
  61. package/dist/lib/sandboxGitDefaults.js +0 -31
  62. package/dist/lib/upgrade.d.ts +0 -66
  63. package/dist/lib/upgrade.d.ts.map +0 -1
  64. package/dist/lib/upgrade.js +0 -178
@@ -0,0 +1,156 @@
1
+ /**
2
+ * tmux Workspace backend. Workspaces live as windows inside one dedicated
3
+ * `groundcrew` tmux session; the window name is the ticket id. tmux can't
4
+ * paint status pills, so `open` silently drops `spec.status`. This is the
5
+ * Linux/WSL path where cmux is unavailable.
6
+ */
7
+ import { isSignalAborted, runWorkspaceCommand, } from "./workspaceAdapter.js";
8
+ import { errorMessage, log, readEnvironmentVariable } from "./util.js";
9
+ const TMUX_SESSION = "groundcrew";
10
+ // `tmux new-session -d -s …` always creates one initial window. Without
11
+ // `-n`, that window is named after the running shell (e.g. "0" / "zsh") and
12
+ // would surface from `list()` as a phantom workspace. We name it with this
13
+ // sentinel and filter it out — it stays around as a placeholder so the
14
+ // session doesn't collapse when the last ticket window closes.
15
+ const TMUX_IDLE_WINDOW = "_groundcrew_idle";
16
+ export const tmuxAdapter = {
17
+ async open(spec, signal) {
18
+ await ensureTmuxSession(signal);
19
+ const target = tmuxTarget(spec.name);
20
+ const keepDeadWindowsEnv = readEnvironmentVariable("GROUNDCREW_KEEP_DEAD_WINDOWS");
21
+ const keepDeadWindows = keepDeadWindowsEnv !== undefined && keepDeadWindowsEnv.length > 0;
22
+ await runWorkspaceCommand("tmux", [
23
+ "new-window",
24
+ "-d",
25
+ "-t",
26
+ TMUX_SESSION,
27
+ "-n",
28
+ spec.name,
29
+ "-c",
30
+ spec.cwd,
31
+ spec.command,
32
+ ";",
33
+ "set-window-option",
34
+ "-t",
35
+ target,
36
+ "remain-on-exit",
37
+ keepDeadWindows ? "on" : "off",
38
+ ";",
39
+ "set-window-option",
40
+ "-t",
41
+ target,
42
+ "allow-rename",
43
+ "off",
44
+ ], signal);
45
+ // tmux can't paint status pills; spec.status is silently dropped.
46
+ },
47
+ async list(signal) {
48
+ const probe = await probeTmuxList("#{window_name}\t#{pane_dead}", signal);
49
+ if (probe.status === "missing") {
50
+ return [];
51
+ }
52
+ if (probe.status === "failed") {
53
+ log(`tmux list-windows failed: ${probe.reason}`);
54
+ // oxlint-disable-next-line unicorn/no-useless-undefined -- undefined marks the workspace backend as unavailable.
55
+ return undefined;
56
+ }
57
+ return parseTmuxWindows(probe.output);
58
+ },
59
+ async close(name, signal) {
60
+ try {
61
+ await runWorkspaceCommand("tmux", ["kill-window", "-t", tmuxTarget(name)], signal);
62
+ return { kind: "closed" };
63
+ }
64
+ catch (error) {
65
+ if (isSignalAborted(signal)) {
66
+ throw error;
67
+ }
68
+ if (isTmuxNotFoundError(error)) {
69
+ return { kind: "missing" };
70
+ }
71
+ throw error;
72
+ }
73
+ },
74
+ accessHint(name) {
75
+ return { kind: "attachCommand", command: `tmux attach -t ${tmuxTarget(name)}` };
76
+ },
77
+ };
78
+ function tmuxTarget(name) {
79
+ return `${TMUX_SESSION}:${name}`;
80
+ }
81
+ function isTmuxNotFoundError(error) {
82
+ // runCommand surfaces the child's stderr in error.message, so the "no
83
+ // server" / "missing session" / "can't find window" signatures are visible
84
+ // without a separate stderr probe.
85
+ const message = errorMessage(error);
86
+ return (message.includes("no server running") ||
87
+ message.includes("can't find session") ||
88
+ message.includes("can't find window"));
89
+ }
90
+ async function probeTmuxList(format, signal) {
91
+ try {
92
+ return {
93
+ status: "ok",
94
+ output: await runWorkspaceCommand("tmux", ["list-windows", "-t", TMUX_SESSION, "-F", format], signal),
95
+ };
96
+ }
97
+ catch (error) {
98
+ if (isSignalAborted(signal)) {
99
+ throw error;
100
+ }
101
+ if (isTmuxNotFoundError(error)) {
102
+ return { status: "missing" };
103
+ }
104
+ return { status: "failed", reason: errorMessage(error) };
105
+ }
106
+ }
107
+ async function ensureTmuxSession(signal) {
108
+ try {
109
+ await runWorkspaceCommand("tmux", ["has-session", "-t", TMUX_SESSION], signal);
110
+ return;
111
+ }
112
+ catch (error) {
113
+ if (isSignalAborted(signal)) {
114
+ throw error;
115
+ }
116
+ /* session missing or server down; create it */
117
+ }
118
+ try {
119
+ await runWorkspaceCommand("tmux", ["new-session", "-d", "-s", TMUX_SESSION, "-n", TMUX_IDLE_WINDOW], signal);
120
+ }
121
+ catch (error) {
122
+ if (isSignalAborted(signal)) {
123
+ throw error;
124
+ }
125
+ try {
126
+ await runWorkspaceCommand("tmux", ["has-session", "-t", TMUX_SESSION], signal);
127
+ }
128
+ catch {
129
+ throw error;
130
+ }
131
+ }
132
+ }
133
+ function parseTmuxWindows(output) {
134
+ const items = [];
135
+ for (const line of output.split("\n")) {
136
+ if (line.length === 0) {
137
+ continue;
138
+ }
139
+ const [name, deadFlag] = line.split("\t");
140
+ /* v8 ignore next 3 @preserve -- split on a non-empty string always yields a non-empty first element */
141
+ if (name === undefined || name.length === 0) {
142
+ continue;
143
+ }
144
+ if (name === TMUX_IDLE_WINDOW) {
145
+ continue;
146
+ }
147
+ // pane_dead != 0 means the command exited and the window is a zombie
148
+ // (only happens when remain-on-exit is on; defense in depth in case a
149
+ // user-globally-set value beats our per-window override).
150
+ if (deadFlag !== undefined && deadFlag !== "0") {
151
+ continue;
152
+ }
153
+ items.push({ name });
154
+ }
155
+ return items;
156
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Shared contract for Workspace backends. A Workspace is the host-side
3
+ * terminal session that runs an agent for one ticket; `Workspace.name` is
4
+ * the ticket id callers key on. The cmux and tmux adapters implement this
5
+ * interface in their own files (`cmuxAdapter.ts`, `tmuxAdapter.ts`);
6
+ * `workspaces.ts` resolves and fronts them. This is internal cleanup, not a
7
+ * plugin contract — nothing here is a published extension point.
8
+ */
9
+ export type WorkspaceKind = "cmux" | "tmux";
10
+ export interface Workspace {
11
+ /** Ticket id; the join key callers use. */
12
+ name: string;
13
+ }
14
+ export interface WorkspaceStatus {
15
+ text: string;
16
+ color?: string;
17
+ icon?: string;
18
+ }
19
+ export interface WorkspaceAccessHint {
20
+ kind: "attachCommand";
21
+ command: string;
22
+ }
23
+ export interface OpenSpec {
24
+ /** Ticket id; becomes the workspace's name. */
25
+ name: string;
26
+ /** Working directory the workspace runs in. */
27
+ cwd: string;
28
+ /** Shell string the workspace executes (host setup + agent exec). */
29
+ command: string;
30
+ /** Optional status painting. Adapters that can't paint silently drop it. */
31
+ status?: WorkspaceStatus;
32
+ }
33
+ /**
34
+ * `unavailable` is "we don't know" — never treat it as "empty," or callers
35
+ * would close every live workspace by deduction.
36
+ */
37
+ export type WorkspaceProbe = {
38
+ kind: "ok";
39
+ names: Set<string>;
40
+ } | {
41
+ kind: "unavailable";
42
+ error?: unknown;
43
+ };
44
+ export type WorkspaceInterruptResult = {
45
+ kind: "interrupted";
46
+ } | {
47
+ kind: "missing";
48
+ } | {
49
+ kind: "unavailable";
50
+ error?: unknown;
51
+ };
52
+ export type WorkspaceCloseResult = {
53
+ kind: "closed";
54
+ } | {
55
+ kind: "missing";
56
+ } | {
57
+ kind: "unavailable";
58
+ error?: unknown;
59
+ };
60
+ export interface Adapter {
61
+ open(spec: OpenSpec, signal?: AbortSignal): Promise<void>;
62
+ /**
63
+ * Live workspaces only. Returns:
64
+ * - `Workspace[]` when the adapter probe succeeded (may be empty).
65
+ * - `undefined` when the adapter binary failed in a way that doesn't
66
+ * distinguish "no live workspaces" from "couldn't ask".
67
+ */
68
+ list(signal?: AbortSignal): Promise<Workspace[] | undefined>;
69
+ /** Closes the workspace or confirms it is not present. */
70
+ close(name: string, signal?: AbortSignal): Promise<WorkspaceCloseResult>;
71
+ /**
72
+ * User-facing way to reach the workspace, or `undefined` when the backend
73
+ * has no concise external hint.
74
+ */
75
+ accessHint(name: string): WorkspaceAccessHint | undefined;
76
+ }
77
+ export declare function runWorkspaceCommand(command: string, arguments_: readonly string[], signal?: AbortSignal): Promise<string>;
78
+ export declare function isSignalAborted(signal?: AbortSignal): boolean;
79
+ //# sourceMappingURL=workspaceAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceAdapter.d.ts","sourceRoot":"","sources":["../../src/lib/workspaceAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C,MAAM,WAAW,SAAS;IACxB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE7C,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE7C,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE7C,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D;;;;;OAKG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC;IAC7D,0DAA0D;IAC1D,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzE;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAAC;CAC3D;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAE7D"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Shared contract for Workspace backends. A Workspace is the host-side
3
+ * terminal session that runs an agent for one ticket; `Workspace.name` is
4
+ * the ticket id callers key on. The cmux and tmux adapters implement this
5
+ * interface in their own files (`cmuxAdapter.ts`, `tmuxAdapter.ts`);
6
+ * `workspaces.ts` resolves and fronts them. This is internal cleanup, not a
7
+ * plugin contract — nothing here is a published extension point.
8
+ */
9
+ import { runCommandAsync } from "./commandRunner.js";
10
+ export async function runWorkspaceCommand(command, arguments_, signal) {
11
+ return signal === undefined
12
+ ? await runCommandAsync(command, arguments_)
13
+ : await runCommandAsync(command, arguments_, { signal });
14
+ }
15
+ export function isSignalAborted(signal) {
16
+ return signal?.aborted === true;
17
+ }
@@ -1,62 +1,15 @@
1
1
  /**
2
- * Workspace adapter — opens/lists/closes the host-side terminal session
2
+ * Workspace facade — opens/lists/closes the host-side terminal session
3
3
  * that runs an agent for one ticket. `Workspace.name` is the ticket id;
4
- * callers key on it. Adapters do their own internal lookup when their
5
- * backend uses opaque refs.
4
+ * callers key on it. The cmux and tmux backends live in their own files
5
+ * (`cmuxAdapter.ts`, `tmuxAdapter.ts`) behind the shared `Adapter`
6
+ * interface in `workspaceAdapter.ts`; this module resolves which one to
7
+ * use, caches it per config, and exposes the `workspaces` API.
6
8
  */
7
9
  import type { ResolvedConfig, WorkspaceKindSetting } from "./config.ts";
8
10
  import { type HostCapabilities } from "./host.ts";
9
- export type WorkspaceKind = "cmux" | "tmux";
10
- export interface Workspace {
11
- /** Ticket id; the join key callers use. */
12
- name: string;
13
- }
14
- export interface WorkspaceStatus {
15
- text: string;
16
- color?: string;
17
- icon?: string;
18
- }
19
- export interface WorkspaceAccessHint {
20
- kind: "attachCommand";
21
- command: string;
22
- }
23
- export interface OpenSpec {
24
- /** Ticket id; becomes the workspace's name. */
25
- name: string;
26
- /** Working directory the workspace runs in. */
27
- cwd: string;
28
- /** Shell string the workspace executes (host setup + agent exec). */
29
- command: string;
30
- /** Optional status painting. Adapters that can't paint silently drop it. */
31
- status?: WorkspaceStatus;
32
- }
33
- /**
34
- * `unavailable` is "we don't know" — never treat it as "empty," or callers
35
- * would close every live workspace by deduction.
36
- */
37
- export type WorkspaceProbe = {
38
- kind: "ok";
39
- names: Set<string>;
40
- } | {
41
- kind: "unavailable";
42
- error?: unknown;
43
- };
44
- export type WorkspaceInterruptResult = {
45
- kind: "interrupted";
46
- } | {
47
- kind: "missing";
48
- } | {
49
- kind: "unavailable";
50
- error?: unknown;
51
- };
52
- export type WorkspaceCloseResult = {
53
- kind: "closed";
54
- } | {
55
- kind: "missing";
56
- } | {
57
- kind: "unavailable";
58
- error?: unknown;
59
- };
11
+ import { type OpenSpec, type WorkspaceAccessHint, type WorkspaceCloseResult, type WorkspaceInterruptResult, type WorkspaceKind, type WorkspaceProbe } from "./workspaceAdapter.ts";
12
+ export type { OpenSpec, Workspace, WorkspaceAccessHint, WorkspaceCloseResult, WorkspaceInterruptResult, WorkspaceKind, WorkspaceProbe, WorkspaceStatus, } from "./workspaceAdapter.ts";
60
13
  export interface WorkspaceResolution {
61
14
  requested: WorkspaceKindSetting;
62
15
  resolved: WorkspaceKind;
@@ -77,5 +30,4 @@ export declare const workspaces: {
77
30
  interrupt: typeof interruptWorkspace;
78
31
  accessHint(config: ResolvedConfig, name: string, signal?: AbortSignal): Promise<WorkspaceAccessHint | undefined>;
79
32
  };
80
- export {};
81
33
  //# sourceMappingURL=workspaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../src/lib/workspaces.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAI1E,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C,MAAM,WAAW,SAAS;IACxB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE7C,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE7C,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAwU7C,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,oBAAoB,CAAC;IAChC,QAAQ,EAAE,aAAa,CAAC;IACxB,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,gBAAgB;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,gBAAgB,GAAG,mBAAmB,CAUtF;AAgOD,iBAAe,eAAe,CAC5B,MAAM,EAAE,cAAc,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAezB;AAED,iBAAe,kBAAkB,CAC/B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,wBAAwB,CAAC,CAenC;AAED,eAAO,MAAM,UAAU;IACf,IAAI,SAAS,cAAc,QAAQ,QAAQ,WAAW,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvF,KAAK;IACC,KAAK,SACD,cAAc,QAChB,MAAM,WACH,WAAW,GACnB,OAAO,CAAC,oBAAoB,CAAC;IAIhC,SAAS;IACH,UAAU,SACN,cAAc,QAChB,MAAM,WACH,WAAW,GACnB,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;CAI5C,CAAC"}
1
+ {"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../src/lib/workspaces.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE1E,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,QAAQ,EACR,SAAS,EACT,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,oBAAoB,CAAC;IAChC,QAAQ,EAAE,aAAa,CAAC;IACxB,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,gBAAgB;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,gBAAgB,GAAG,mBAAmB,CAUtF;AAsDD,iBAAe,eAAe,CAC5B,MAAM,EAAE,cAAc,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAezB;AAED,iBAAe,kBAAkB,CAC/B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,wBAAwB,CAAC,CAenC;AAED,eAAO,MAAM,UAAU;IACf,IAAI,SAAS,cAAc,QAAQ,QAAQ,WAAW,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvF,KAAK;IACC,KAAK,SACD,cAAc,QAChB,MAAM,WACH,WAAW,GACnB,OAAO,CAAC,oBAAoB,CAAC;IAIhC,SAAS;IACH,UAAU,SACN,cAAc,QAChB,MAAM,WACH,WAAW,GACnB,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;CAI5C,CAAC"}