agent-relay 10.6.6 → 11.0.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 (33) hide show
  1. package/README.md +8 -0
  2. package/dist/cli/bootstrap.d.ts.map +1 -1
  3. package/dist/cli/bootstrap.js +2 -0
  4. package/dist/cli/bootstrap.js.map +1 -1
  5. package/dist/cli/commands/local-agent.d.ts +3 -10
  6. package/dist/cli/commands/local-agent.d.ts.map +1 -1
  7. package/dist/cli/commands/local-agent.js +104 -35
  8. package/dist/cli/commands/local-agent.js.map +1 -1
  9. package/dist/cli/index.d.ts.map +1 -1
  10. package/dist/cli/index.js +3 -1
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/cli/lib/attach-native.d.ts +27 -0
  13. package/dist/cli/lib/attach-native.d.ts.map +1 -0
  14. package/dist/cli/lib/attach-native.js +266 -0
  15. package/dist/cli/lib/attach-native.js.map +1 -0
  16. package/dist/cli/lib/client-factory.d.ts +9 -0
  17. package/dist/cli/lib/client-factory.d.ts.map +1 -1
  18. package/dist/cli/lib/client-factory.js +35 -1
  19. package/dist/cli/lib/client-factory.js.map +1 -1
  20. package/dist/cli/lib/node-version.d.ts +4 -0
  21. package/dist/cli/lib/node-version.d.ts.map +1 -0
  22. package/dist/cli/lib/node-version.js +9 -0
  23. package/dist/cli/lib/node-version.js.map +1 -0
  24. package/dist/cli/lib/project-workspace-key.d.ts +1 -21
  25. package/dist/cli/lib/project-workspace-key.d.ts.map +1 -1
  26. package/dist/cli/lib/project-workspace-key.js +3 -83
  27. package/dist/cli/lib/project-workspace-key.js.map +1 -1
  28. package/dist/cli/lib/sdk-client.d.ts +2 -1
  29. package/dist/cli/lib/sdk-client.d.ts.map +1 -1
  30. package/dist/cli/lib/sdk-client.js +7 -29
  31. package/dist/cli/lib/sdk-client.js.map +1 -1
  32. package/dist/index.cjs +339 -1
  33. package/package.json +9 -8
@@ -0,0 +1,266 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { defaultStateDir, readConnectionFileFromDisk, resolveBrokerConnection, } from './broker-connection.js';
4
+ import { createBrokerClient } from './attach-broker.js';
5
+ export function renderAgentEvent(envelope, options = {}) {
6
+ if (envelope.event.kind.startsWith('reasoning.') && !options.reasoning)
7
+ return null;
8
+ if (options.json)
9
+ return `${JSON.stringify({ kind: 'agent_event', ...envelope })}\n`;
10
+ const event = envelope.event;
11
+ switch (event.kind) {
12
+ case 'text.delta':
13
+ return typeof event.delta === 'string' ? event.delta : null;
14
+ case 'text.finished':
15
+ return '\n';
16
+ case 'reasoning.delta':
17
+ return options.reasoning && typeof event.delta === 'string' ? event.delta : null;
18
+ case 'activity.changed': {
19
+ const reason = typeof event.reason === 'string' && event.reason ? ` (${event.reason})` : '';
20
+ return `\n[activity] ${String(event.activity ?? 'unknown')}${reason}\n`;
21
+ }
22
+ case 'tool.called':
23
+ return `\n[tool] ${String(event.tool ?? event.name ?? 'tool')} started\n`;
24
+ case 'tool.completed':
25
+ return `[tool] ${String(event.tool ?? event.name ?? 'tool')} finished\n`;
26
+ case 'tool.failed':
27
+ return `[tool] ${String(event.tool ?? event.name ?? 'tool')} failed: ${String(event.error ?? 'unknown error')}\n`;
28
+ case 'tool.approval.requested':
29
+ return `[waiting] approval required for ${String(event.tool ?? 'tool')} (${String(event.approvalId ?? '')})\n`;
30
+ case 'tool.approval.resolved':
31
+ return `[approval] ${event.approved === true ? 'approved' : 'rejected'}\n`;
32
+ case 'file.changed':
33
+ return `[file] ${String(event.operation ?? 'updated')} ${String(event.path ?? '')}\n`;
34
+ case 'usage.updated':
35
+ return `[usage] ${JSON.stringify(event.usage ?? {})}\n`;
36
+ case 'warning':
37
+ return `[warning] ${String(event.message ?? '')}\n`;
38
+ case 'error':
39
+ case 'session.failed':
40
+ return `[error] ${String(event.message ?? event.error ?? 'native harness failed')}\n`;
41
+ default:
42
+ if (event.kind.startsWith('session.'))
43
+ return `[session] ${event.kind.slice('session.'.length)}\n`;
44
+ if (event.kind === 'context.compacted')
45
+ return '[context] compacted\n';
46
+ return null;
47
+ }
48
+ }
49
+ export function renderNativeHarnessDiagnostic(envelope, options = {}) {
50
+ if (!options.diagnostics)
51
+ return null;
52
+ if (options.json)
53
+ return `${JSON.stringify({ kind: 'native_harness_diagnostic', ...envelope })}\n`;
54
+ return `[diagnostic:${envelope.diagnostic.level}] ${envelope.diagnostic.message}\n`;
55
+ }
56
+ function defaultDependencies(options) {
57
+ void options;
58
+ return {
59
+ connect: (resolved) => createBrokerClient(resolved),
60
+ output: {
61
+ stdout: (text) => process.stdout.write(text),
62
+ stderr: (text) => process.stderr.write(text),
63
+ },
64
+ createReadline: () => createInterface({
65
+ input: process.stdin,
66
+ output: process.stdout,
67
+ terminal: Boolean(process.stdin.isTTY),
68
+ }),
69
+ onSignal: (handler) => {
70
+ process.once('SIGINT', handler);
71
+ return () => process.off('SIGINT', handler);
72
+ },
73
+ };
74
+ }
75
+ export async function attachNative(name, mode, options, overrides = {}) {
76
+ if (mode === 'passthrough') {
77
+ (overrides.output?.stderr ?? ((text) => process.stderr.write(text)))('Error: native harnesses do not expose a terminal byte stream; use --mode view or --mode drive.\n');
78
+ return 1;
79
+ }
80
+ const connection = resolveBrokerConnection(options, {
81
+ readConnectionFile: readConnectionFileFromDisk,
82
+ getDefaultStateDir: defaultStateDir,
83
+ env: process.env,
84
+ });
85
+ if (!connection) {
86
+ (overrides.output?.stderr ?? ((text) => process.stderr.write(text)))('Error: could not locate broker connection.\n');
87
+ return 1;
88
+ }
89
+ const deps = { ...defaultDependencies(options), ...overrides };
90
+ const client = deps.connect(connection);
91
+ // Capture a global broker cursor before subscribing. The broker replays
92
+ // everything after this cursor while the agent-event history request runs,
93
+ // closing the history/live race even when the WebSocket opens slowly.
94
+ let brokerCursor;
95
+ try {
96
+ brokerCursor = await client.currentEventSeq();
97
+ }
98
+ catch (error) {
99
+ deps.output.stderr(`Error: ${error instanceof Error ? error.message : String(error)}\n`);
100
+ client.disconnect();
101
+ return 1;
102
+ }
103
+ const stream = client.subscribeAgentEvents(name, { sinceSequence: 0, sinceBrokerSeq: brokerCursor });
104
+ const iterator = stream[Symbol.asyncIterator]();
105
+ let highWater = 0;
106
+ let stopped = false;
107
+ let disconnected = false;
108
+ let iteratorClosed = false;
109
+ let resolveStop;
110
+ const stopSignal = new Promise((resolve) => {
111
+ resolveStop = resolve;
112
+ });
113
+ let readline;
114
+ const pendingCommands = new Set();
115
+ let commandChain = Promise.resolve();
116
+ const render = (event) => {
117
+ if (event.sequence <= highWater)
118
+ return;
119
+ highWater = event.sequence;
120
+ const text = renderAgentEvent(event, options);
121
+ if (text !== null)
122
+ deps.output.stdout(text);
123
+ };
124
+ const unsubscribeDiagnostics = client.onEvent((event) => {
125
+ if (event.kind !== 'native_harness_diagnostic' || event.name !== name)
126
+ return;
127
+ const text = renderNativeHarnessDiagnostic(event, options);
128
+ if (text !== null)
129
+ deps.output.stdout(text);
130
+ });
131
+ const disconnect = () => {
132
+ if (disconnected)
133
+ return;
134
+ disconnected = true;
135
+ client.disconnect();
136
+ };
137
+ const closeIterator = () => {
138
+ if (iteratorClosed)
139
+ return;
140
+ iteratorClosed = true;
141
+ void Promise.resolve(iterator.return?.()).catch(() => undefined);
142
+ };
143
+ const stop = () => {
144
+ if (stopped)
145
+ return;
146
+ stopped = true;
147
+ readline?.close();
148
+ // Close the broker before iterator cleanup and resolve our own stop signal.
149
+ // An idle adapter stream is not required to unblock iterator.next()/return().
150
+ disconnect();
151
+ closeIterator();
152
+ resolveStop();
153
+ };
154
+ const removeSignal = deps.onSignal(stop);
155
+ try {
156
+ const history = await client.getAgentEventHistory(name, 0);
157
+ if (history.gap) {
158
+ const gap = {
159
+ kind: 'agent_event_replay_gap',
160
+ name,
161
+ oldest_available_sequence: history.oldest_available_sequence,
162
+ };
163
+ if (options.json)
164
+ deps.output.stdout(`${JSON.stringify(gap)}\n`);
165
+ else
166
+ deps.output.stderr('[attach] agent-event history was truncated; showing retained events.\n');
167
+ }
168
+ for (const event of history.events)
169
+ render(event);
170
+ if (mode === 'drive') {
171
+ readline = deps.createReadline();
172
+ const showPrompt = () => {
173
+ if (stopped || options.json || !readline?.terminal)
174
+ return;
175
+ readline.setPrompt('> ');
176
+ readline.prompt();
177
+ };
178
+ readline.on('line', (line) => {
179
+ const text = line.trim();
180
+ if (!text)
181
+ return;
182
+ if (text === '/detach') {
183
+ stop();
184
+ return;
185
+ }
186
+ const approval = text.match(/^\/(approve|reject)\s+(.+)$/);
187
+ const kind = approval
188
+ ? approval[1] === 'approve'
189
+ ? 'approve_tool'
190
+ : 'reject_tool'
191
+ : text === '/interrupt'
192
+ ? 'interrupt'
193
+ : 'submit_user_message';
194
+ const commandText = kind === 'submit_user_message' ? line : undefined;
195
+ const approvalId = approval?.[2]?.trim();
196
+ const pendingCommand = commandChain
197
+ .then(() => client.sendNativeHarnessCommand(name, {
198
+ kind,
199
+ idempotency_key: randomUUID(),
200
+ ...(commandText === undefined ? {} : { text: commandText }),
201
+ ...(commandText === undefined ? {} : { mode: 'auto' }),
202
+ ...(approvalId ? { approval_id: approvalId } : {}),
203
+ }))
204
+ .then((ack) => {
205
+ if (!ack.accepted) {
206
+ deps.output.stderr(`Input rejected: ${ack.error?.message ?? 'native harness rejected input'}\n`);
207
+ }
208
+ else if (options.json) {
209
+ deps.output.stdout(`${JSON.stringify({ kind: 'native_harness_command_ack', name, ...ack })}\n`);
210
+ }
211
+ else {
212
+ deps.output.stderr(ack.duplicate ? '[input] already accepted\n' : '[input] accepted\n');
213
+ }
214
+ })
215
+ .catch((error) => {
216
+ deps.output.stderr(`Input failed: ${error instanceof Error ? error.message : String(error)}\n`);
217
+ })
218
+ .then(() => undefined);
219
+ commandChain = pendingCommand.catch(() => undefined);
220
+ pendingCommands.add(pendingCommand);
221
+ void pendingCommand.finally(() => {
222
+ pendingCommands.delete(pendingCommand);
223
+ showPrompt();
224
+ });
225
+ });
226
+ showPrompt();
227
+ }
228
+ while (!stopped) {
229
+ const next = await Promise.race([
230
+ iterator.next(),
231
+ stopSignal.then(() => ({ done: true, value: undefined })),
232
+ ]);
233
+ if (next.done)
234
+ break;
235
+ render(next.value);
236
+ }
237
+ await Promise.allSettled(pendingCommands);
238
+ return 0;
239
+ }
240
+ catch (error) {
241
+ deps.output.stderr(`Error: ${error instanceof Error ? error.message : String(error)}\n`);
242
+ return 1;
243
+ }
244
+ finally {
245
+ stopped = true;
246
+ removeSignal();
247
+ unsubscribeDiagnostics();
248
+ readline?.close();
249
+ disconnect();
250
+ closeIterator();
251
+ resolveStop();
252
+ }
253
+ }
254
+ export async function isNativeHarness(name, options, fetchFn = globalThis.fetch) {
255
+ const connection = resolveBrokerConnection(options, {
256
+ readConnectionFile: readConnectionFileFromDisk,
257
+ getDefaultStateDir: defaultStateDir,
258
+ env: process.env,
259
+ });
260
+ if (!connection)
261
+ return false;
262
+ const client = createBrokerClient(connection, fetchFn);
263
+ const agent = (await client.listAgents()).find((candidate) => candidate.name === name);
264
+ return agent?.runtime_kind === 'native';
265
+ }
266
+ //# sourceMappingURL=attach-native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach-native.js","sourceRoot":"","sources":["../../../src/cli/lib/attach-native.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { HarnessDriverClient, type BrokerInitArgs } from '@agent-relay/harness-driver';
2
+ import { type HarnessRuntime, type SelectedHarnessRuntime } from '@agent-relay/harnesses';
2
3
  export interface CreateRuntimeClientOptions {
3
4
  cwd: string;
4
5
  channels?: string[];
@@ -25,7 +26,15 @@ export interface ClientSpawnOptions {
25
26
  shadowMode?: 'subagent' | 'process';
26
27
  spawnMode?: 'interactive' | 'task_exit' | 'task-exit' | 'single_shot' | 'single-shot';
27
28
  exitAfterTask?: boolean;
29
+ /** Harness execution runtime. `auto` preserves each adapter's rollout default. */
30
+ runtime?: HarnessRuntime;
28
31
  }
32
+ /** Bun standalone executables must re-enter the bundled CLI to run embedded sidecar code. */
33
+ export declare function nativeSidecarLaunch(argv?: readonly string[], execPath?: string): {
34
+ command: string;
35
+ args: string[];
36
+ } | undefined;
37
+ export declare function resolvedSpawnRuntime(options: Pick<ClientSpawnOptions, 'cli' | 'runtime'>): SelectedHarnessRuntime;
29
38
  export declare function createRuntimeClient(options: CreateRuntimeClientOptions): Promise<HarnessDriverClient>;
30
39
  export declare function spawnAgentWithClient(client: HarnessDriverClient, options: ClientSpawnOptions): Promise<void>;
31
40
  //# sourceMappingURL=client-factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-factory.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/client-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAEvF,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,2FAA2F;IAC3F,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACpC,SAAS,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,aAAa,CAAC;IACtF,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiC3G;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAEf"}
1
+ {"version":3,"file":"client-factory.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/client-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC5B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,2FAA2F;IAC3F,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACpC,SAAS,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,aAAa,CAAC;IACtF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kFAAkF;IAClF,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAID,6FAA6F;AAC7F,wBAAgB,mBAAmB,CACjC,IAAI,GAAE,SAAS,MAAM,EAAiB,EACtC,QAAQ,SAAmB,GAC1B;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAMjD;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,GAAG,SAAS,CAAC,GACnD,sBAAsB,CAExB;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiC3G;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -1,4 +1,17 @@
1
1
  import { HarnessDriverClient } from '@agent-relay/harness-driver';
2
+ import { createNativeHarnessLaunch, resolveHarnessRuntime, } from '@agent-relay/harnesses';
3
+ const NATIVE_SIDECAR_COMMAND = '__ai-sdk-sidecar';
4
+ /** Bun standalone executables must re-enter the bundled CLI to run embedded sidecar code. */
5
+ export function nativeSidecarLaunch(argv = process.argv, execPath = process.execPath) {
6
+ const bundledEntrypoint = argv[1] ?? '';
7
+ if (argv[0] === 'bun' && bundledEntrypoint.startsWith('/$bunfs/root/')) {
8
+ return { command: execPath, args: [NATIVE_SIDECAR_COMMAND] };
9
+ }
10
+ return undefined;
11
+ }
12
+ export function resolvedSpawnRuntime(options) {
13
+ return resolveHarnessRuntime(options.cli, options.runtime);
14
+ }
2
15
  export async function createRuntimeClient(options) {
3
16
  const { cwd, channels = ['general'], binaryPath = process.env.AGENT_RELAY_BIN, binaryArgs, brokerName, env = process.env, preferConnect = false, onStderr, onStep, } = options;
4
17
  if (preferConnect) {
@@ -23,6 +36,27 @@ export async function createRuntimeClient(options) {
23
36
  });
24
37
  }
25
38
  export async function spawnAgentWithClient(client, options) {
26
- await client.spawnPty(options);
39
+ const runtime = resolvedSpawnRuntime(options);
40
+ if (runtime === 'pty') {
41
+ const { runtime: _runtime, ...ptyOptions } = options;
42
+ await client.spawnPty(ptyOptions);
43
+ return;
44
+ }
45
+ if (options.spawnMode && options.spawnMode !== 'interactive') {
46
+ throw new Error('Native harnesses currently support only interactive spawn mode');
47
+ }
48
+ if (options.exitAfterTask) {
49
+ throw new Error('Native harnesses do not currently support --exit-after-task');
50
+ }
51
+ const launch = createNativeHarnessLaunch(options.cli, {
52
+ runtime: 'native',
53
+ name: options.name,
54
+ channels: options.channels,
55
+ task: options.task,
56
+ model: options.model,
57
+ cwd: options.cwd,
58
+ }, nativeSidecarLaunch());
59
+ const { transport: _transport, ...headlessInput } = launch;
60
+ await client.spawnHeadless(headlessInput);
27
61
  }
28
62
  //# sourceMappingURL=client-factory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-factory.js","sourceRoot":"","sources":["../../../src/cli/lib/client-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAuB,MAAM,6BAA6B,CAAC;AA+BvF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAmC;IAC3E,MAAM,EACJ,GAAG,EACH,QAAQ,GAAG,CAAC,SAAS,CAAC,EACtB,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EACxC,UAAU,EACV,UAAU,EACV,GAAG,GAAG,OAAO,CAAC,GAAG,EACjB,aAAa,GAAG,KAAK,EACrB,QAAQ,EACR,MAAM,GACP,GAAG,OAAO,CAAC;IAEZ,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,wEAAwE;YACxE,0DAA0D;YAC1D,OAAO,MAAM,mBAAmB,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC,KAAK,CAAC;QAC/B,UAAU,EAAE,UAAU,IAAI,SAAS;QACnC,UAAU;QACV,UAAU;QACV,QAAQ;QACR,GAAG;QACH,GAAG,EAAE,GAA6B;QAClC,QAAQ;QACR,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAA2B,EAC3B,OAA2B;IAE3B,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"client-factory.js","sourceRoot":"","sources":["../../../src/cli/lib/client-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const MINIMUM_NODE_MAJOR = 22;
2
+ /** Fail before CLI initialization when Relay is run on an unsupported Node release. */
3
+ export declare function assertSupportedNodeVersion(version?: string): void;
4
+ //# sourceMappingURL=node-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-version.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/node-version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,uFAAuF;AACvF,wBAAgB,0BAA0B,CAAC,OAAO,SAAwB,GAAG,IAAI,CAOhF"}
@@ -0,0 +1,9 @@
1
+ export const MINIMUM_NODE_MAJOR = 22;
2
+ /** Fail before CLI initialization when Relay is run on an unsupported Node release. */
3
+ export function assertSupportedNodeVersion(version = process.versions.node) {
4
+ const major = Number.parseInt(version.split('.')[0] ?? '', 10);
5
+ if (!Number.isInteger(major) || major < MINIMUM_NODE_MAJOR) {
6
+ throw new Error(`Agent Relay requires Node.js ${MINIMUM_NODE_MAJOR} or newer (found ${version}). Upgrade Node.js before running agent-relay.`);
7
+ }
8
+ }
9
+ //# sourceMappingURL=node-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-version.js","sourceRoot":"","sources":["../../../src/cli/lib/node-version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,uFAAuF;AACvF,MAAM,UAAU,0BAA0B,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI;IACxE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,kBAAkB,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,gCAAgC,kBAAkB,oBAAoB,OAAO,gDAAgD,CAC9H,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,22 +1,2 @@
1
- /** Absolute path to the project-local workspace-key file within `dataDir`. */
2
- export declare function projectWorkspaceKeyPath(dataDir: string): string;
3
- /**
4
- * Read the workspace key recorded for this project's data dir. A missing or
5
- * malformed file (or a blank key) reads as `undefined` — the caller falls
6
- * through to the next resolution source rather than failing.
7
- */
8
- export declare function readProjectWorkspaceKey(dataDir: string): string | undefined;
9
- /**
10
- * Persist the workspace key for this project's data dir with owner-only
11
- * permissions (matching `connection.json`). A blank key is ignored so a broker
12
- * that never resolved a key does not clobber a previously recorded one.
13
- *
14
- * The write is atomic and symlink-safe: the payload is written to a fresh,
15
- * exclusively-created temp file (so a pre-planted symlink at the temp path
16
- * cannot redirect it) and then `rename`d over the destination. `rename` never
17
- * follows a symlink at the destination and is atomic on POSIX, so a concurrent
18
- * reader sees either the old or the new complete file — never a truncated one,
19
- * and never an attacker-chosen target.
20
- */
21
- export declare function writeProjectWorkspaceKey(dataDir: string, workspaceKey: string | undefined): void;
1
+ export { projectWorkspaceKeyPath, readProjectWorkspaceKey, writeProjectWorkspaceKey, } from '@agent-relay/cloud/workspace-key';
22
2
  //# sourceMappingURL=project-workspace-key.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-workspace-key.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/project-workspace-key.ts"],"names":[],"mappings":"AAkBA,8EAA8E;AAC9E,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAkChG"}
1
+ {"version":3,"file":"project-workspace-key.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/project-workspace-key.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC"}
@@ -1,84 +1,4 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- /**
4
- * Project-local record of the workspace key the broker in this directory was
5
- * started with. `agent-relay up` writes it into the project data dir
6
- * (`.agentworkforce/relay/`, the same git-excluded directory that holds
7
- * `connection.json`) so that later SDK-backed commands run in the same CWD
8
- * (`fleet nodes`, `node …`, etc.) resolve the workspace the local broker
9
- * actually joined — rather than falling through to the machine-global active
10
- * workspace, which may point at a different workspace.
11
- */
12
- const PROJECT_WORKSPACE_KEY_FILENAME = 'workspace-key.json';
13
- /** Absolute path to the project-local workspace-key file within `dataDir`. */
14
- export function projectWorkspaceKeyPath(dataDir) {
15
- return path.join(dataDir, PROJECT_WORKSPACE_KEY_FILENAME);
16
- }
17
- /**
18
- * Read the workspace key recorded for this project's data dir. A missing or
19
- * malformed file (or a blank key) reads as `undefined` — the caller falls
20
- * through to the next resolution source rather than failing.
21
- */
22
- export function readProjectWorkspaceKey(dataDir) {
23
- try {
24
- const raw = fs.readFileSync(projectWorkspaceKeyPath(dataDir), 'utf-8');
25
- const parsed = JSON.parse(raw);
26
- const key = typeof parsed.workspaceKey === 'string' ? parsed.workspaceKey.trim() : '';
27
- return key || undefined;
28
- }
29
- catch {
30
- return undefined;
31
- }
32
- }
33
- /**
34
- * Persist the workspace key for this project's data dir with owner-only
35
- * permissions (matching `connection.json`). A blank key is ignored so a broker
36
- * that never resolved a key does not clobber a previously recorded one.
37
- *
38
- * The write is atomic and symlink-safe: the payload is written to a fresh,
39
- * exclusively-created temp file (so a pre-planted symlink at the temp path
40
- * cannot redirect it) and then `rename`d over the destination. `rename` never
41
- * follows a symlink at the destination and is atomic on POSIX, so a concurrent
42
- * reader sees either the old or the new complete file — never a truncated one,
43
- * and never an attacker-chosen target.
44
- */
45
- export function writeProjectWorkspaceKey(dataDir, workspaceKey) {
46
- const key = workspaceKey?.trim();
47
- if (!key)
48
- return;
49
- fs.mkdirSync(dataDir, { recursive: true, mode: 0o700 });
50
- const file = projectWorkspaceKeyPath(dataDir);
51
- const tmp = `${file}.tmp.${process.pid}`;
52
- const payload = { workspaceKey: key };
53
- const data = `${JSON.stringify(payload, null, 2)}\n`;
54
- // 'wx' == O_CREAT | O_EXCL: create a brand-new regular file, failing (rather
55
- // than following a symlink or truncating an existing file) if anything is
56
- // already at the temp path. A stale temp from a crashed run is removed first.
57
- let fd;
58
- try {
59
- fd = fs.openSync(tmp, 'wx', 0o600);
60
- }
61
- catch (err) {
62
- if (err.code !== 'EEXIST')
63
- throw err;
64
- fs.rmSync(tmp, { force: true });
65
- fd = fs.openSync(tmp, 'wx', 0o600);
66
- }
67
- try {
68
- try {
69
- fs.writeSync(fd, data);
70
- }
71
- finally {
72
- fs.closeSync(fd);
73
- }
74
- // openSync's mode is masked by umask; enforce owner-only before publishing.
75
- fs.chmodSync(tmp, 0o600);
76
- fs.renameSync(tmp, file);
77
- }
78
- catch (err) {
79
- // Never leave a partial temp file behind, whichever step failed.
80
- fs.rmSync(tmp, { force: true });
81
- throw err;
82
- }
83
- }
1
+ // Compatibility re-export for existing CLI-local imports. The public cloud
2
+ // package owns this contract so SDK consumers and the CLI cannot drift.
3
+ export { projectWorkspaceKeyPath, readProjectWorkspaceKey, writeProjectWorkspaceKey, } from '@agent-relay/cloud/workspace-key';
84
4
  //# sourceMappingURL=project-workspace-key.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-workspace-key.js","sourceRoot":"","sources":["../../../src/cli/lib/project-workspace-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;GAQG;AACH,MAAM,8BAA8B,GAAG,oBAAoB,CAAC;AAM5D,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqC,CAAC;QACnE,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,OAAO,GAAG,IAAI,SAAS,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAe,EAAE,YAAgC;IACxF,MAAM,GAAG,GAAG,YAAY,EAAE,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,GAAG,IAAI,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,OAAO,GAA4B,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;IAC/D,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAErD,6EAA6E;IAC7E,0EAA0E;IAC1E,8EAA8E;IAC9E,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QACH,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,GAAG,CAAC;QAChE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,CAAC;QACH,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;QACD,4EAA4E;QAC5E,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,iEAAiE;QACjE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"project-workspace-key.js","sourceRoot":"","sources":["../../../src/cli/lib/project-workspace-key.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,wEAAwE;AACxE,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { AgentRelay, type AgentRelayAgent } from '@agent-relay/sdk';
2
+ import { type WorkspaceKeySource } from '@agent-relay/cloud/workspace-key';
2
3
  /** Options shared by the SDK-backed (Relaycast) CLI command groups. */
3
4
  export interface SdkClientOptions {
4
5
  workspaceKey?: string;
@@ -7,7 +8,7 @@ export interface SdkClientOptions {
7
8
  env?: NodeJS.ProcessEnv;
8
9
  }
9
10
  /** Where a resolved workspace key came from, in precedence order. */
10
- export type WorkspaceKeySource = 'flag' | 'env' | 'project' | 'store';
11
+ export type { WorkspaceKeySource };
11
12
  /**
12
13
  * Resolve the workspace key and report which source it came from. Precedence:
13
14
  * explicit flag → `RELAY_WORKSPACE_KEY`/`RELAY_API_KEY` env → the key the local
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-client.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/sdk-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAMpE,uEAAuE;AACvE,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAWD,qEAAqE;AACrE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtE;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,GAAE,gBAAqB,GAAG;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,kBAAkB,CAAC;CAC5B,CAaA;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAE1E;AAeD,wBAAgB,cAAc,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,GAAG,SAAS,CAEjF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,GAAG,SAAS,CAEpF;AAED,gDAAgD;AAChD,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,gBAAqB,GAAG,UAAU,CAE/E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CAOhF"}
1
+ {"version":3,"file":"sdk-client.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/sdk-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,kCAAkC,CAAC;AAE1C,uEAAuE;AACvE,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAWD,qEAAqE;AACrE,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,GAAE,gBAAqB,GAAG;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,kBAAkB,CAAC;CAC5B,CASA;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAE1E;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,GAAG,SAAS,CAEjF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,GAAG,SAAS,CAEpF;AAED,gDAAgD;AAChD,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,gBAAqB,GAAG,UAAU,CAE/E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CAOhF"}
@@ -1,7 +1,5 @@
1
1
  import { AgentRelay } from '@agent-relay/sdk';
2
- import { getProjectPaths } from '@agent-relay/config';
3
- import { activeWorkspaceKey } from './workspace-store.js';
4
- import { readProjectWorkspaceKey } from './project-workspace-key.js';
2
+ import { resolveWorkspaceKeyWithSource as resolveCloudWorkspaceKeyWithSource, } from '@agent-relay/cloud/workspace-key';
5
3
  function env(options) {
6
4
  return options.env ?? process.env;
7
5
  }
@@ -17,37 +15,17 @@ function trimOrUndefined(value) {
17
15
  * project broker rather than named explicitly.
18
16
  */
19
17
  export function resolveWorkspaceKeyWithSource(options = {}) {
20
- const e = env(options);
21
- const flag = trimOrUndefined(options.workspaceKey);
22
- if (flag)
23
- return { key: flag, source: 'flag' };
24
- const envKey = trimOrUndefined(e.RELAY_WORKSPACE_KEY) ?? trimOrUndefined(e.RELAY_API_KEY);
25
- if (envKey)
26
- return { key: envKey, source: 'env' };
27
- const project = trimOrUndefined(projectWorkspaceKey());
28
- if (project)
29
- return { key: project, source: 'project' };
30
- const store = trimOrUndefined(activeWorkspaceKey(e));
31
- if (store)
32
- return { key: store, source: 'store' };
18
+ const resolved = resolveCloudWorkspaceKeyWithSource({
19
+ workspaceKey: options.workspaceKey,
20
+ env: env(options),
21
+ });
22
+ if (resolved)
23
+ return resolved;
33
24
  throw new Error('No workspace key found. Pass --workspace-key, set RELAY_WORKSPACE_KEY, or run `relay workspace set_key <name> <key>`.');
34
25
  }
35
26
  export function resolveWorkspaceKey(options = {}) {
36
27
  return resolveWorkspaceKeyWithSource(options).key;
37
28
  }
38
- /**
39
- * Read the workspace key recorded by `relay up` for the current project
40
- * directory, or `undefined` when there is none / the project root cannot be
41
- * resolved. Never throws — a resolution failure just falls through.
42
- */
43
- function projectWorkspaceKey() {
44
- try {
45
- return readProjectWorkspaceKey(getProjectPaths().dataDir);
46
- }
47
- catch {
48
- return undefined;
49
- }
50
- }
51
29
  export function resolveBaseUrl(options = {}) {
52
30
  return trimOrUndefined(options.baseUrl) ?? trimOrUndefined(env(options).RELAY_BASE_URL);
53
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-client.js","sourceRoot":"","sources":["../../../src/cli/lib/sdk-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdk-client.js","sourceRoot":"","sources":["../../../src/cli/lib/sdk-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAwB,MAAM,kBAAkB,CAAC;AACpE,OAAO,EACL,6BAA6B,IAAI,kCAAkC,GAEpE,MAAM,kCAAkC,CAAC;AAU1C,SAAS,GAAG,CAAC,OAAyB;IACpC,OAAO,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;AACpC,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB;IAChD,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACvC,CAAC;AAKD;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAAC,UAA4B,EAAE;IAI1E,MAAM,QAAQ,GAAG,kCAAkC,CAAC;QAClD,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;KAClB,CAAC,CAAC;IACH,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,IAAI,KAAK,CACb,uHAAuH,CACxH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAA4B,EAAE;IAChE,OAAO,6BAA6B,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAA4B,EAAE;IAC3D,OAAO,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAA4B,EAAE;IAC9D,OAAO,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,iBAAiB,CAAC,CAAC;AAC3F,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,oBAAoB,CAAC,UAA4B,EAAE;IACjE,OAAO,IAAI,UAAU,CAAC,EAAE,YAAY,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC1G,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAA4B,EAAE;IAC7D,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,IAAI,UAAU,CAAC;QACpB,YAAY,EAAE,mBAAmB,CAAC,OAAO,CAAC;QAC1C,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC,CAAC;AACL,CAAC"}