agent-relay-sdk 0.1.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.
@@ -0,0 +1,128 @@
1
+ export interface BusFrame {
2
+ type: string;
3
+ id?: string;
4
+ payload: unknown;
5
+ }
6
+ export type BusRole = "provider" | "channel" | "orchestrator" | "integration";
7
+ export type BusAgentStatus = "idle" | "busy" | "online" | "offline";
8
+ export interface RegisterFrame extends BusFrame {
9
+ type: "register";
10
+ id: string;
11
+ payload: {
12
+ role: BusRole;
13
+ componentId: string;
14
+ agentId?: string;
15
+ instanceId: string;
16
+ capabilities: string[];
17
+ tags: string[];
18
+ machine: string;
19
+ meta: Record<string, unknown>;
20
+ };
21
+ }
22
+ export interface HeartbeatFrame extends BusFrame {
23
+ type: "heartbeat";
24
+ payload: {
25
+ status: Exclude<BusAgentStatus, "offline">;
26
+ meta?: Record<string, unknown>;
27
+ };
28
+ }
29
+ export interface CommandFrame extends BusFrame {
30
+ type: "command";
31
+ id: string;
32
+ payload: {
33
+ commandType: string;
34
+ target: string;
35
+ params: Record<string, unknown>;
36
+ };
37
+ }
38
+ export interface SubscribeFrame extends BusFrame {
39
+ type: "subscribe";
40
+ id: string;
41
+ payload: {
42
+ events: string[];
43
+ scopes?: string[];
44
+ };
45
+ }
46
+ export interface StatusFrame extends BusFrame {
47
+ type: "status";
48
+ payload: {
49
+ agentStatus: BusAgentStatus;
50
+ ready?: boolean;
51
+ meta?: Record<string, unknown>;
52
+ };
53
+ }
54
+ export interface AckFrame extends BusFrame {
55
+ type: "ack";
56
+ payload: {
57
+ frameId: string;
58
+ };
59
+ }
60
+ export interface ResumeFrame extends BusFrame {
61
+ type: "resume";
62
+ id: string;
63
+ payload: {
64
+ since: number;
65
+ };
66
+ }
67
+ export interface RegisteredFrame extends BusFrame {
68
+ type: "registered";
69
+ payload: {
70
+ epoch: number;
71
+ cursor: number;
72
+ sessionId: string;
73
+ };
74
+ }
75
+ export interface EventPayload {
76
+ seq: number;
77
+ eventType: string;
78
+ source: string;
79
+ subject?: string;
80
+ data: Record<string, unknown>;
81
+ timestamp: number;
82
+ }
83
+ export interface EventFrame extends BusFrame {
84
+ type: "event";
85
+ id?: string;
86
+ payload: EventPayload;
87
+ }
88
+ export interface CommandResultFrame extends BusFrame {
89
+ type: "command.result";
90
+ payload: {
91
+ commandId: string;
92
+ status: "succeeded" | "failed" | "rejected" | "timed_out";
93
+ result?: Record<string, unknown>;
94
+ error?: string;
95
+ };
96
+ }
97
+ export interface ResumedFrame extends BusFrame {
98
+ type: "resumed";
99
+ payload: {
100
+ events: EventPayload[];
101
+ fromSeq: number;
102
+ toSeq: number;
103
+ };
104
+ }
105
+ export interface ErrorFrame extends BusFrame {
106
+ type: "error";
107
+ payload: {
108
+ frameId?: string;
109
+ code: string;
110
+ message: string;
111
+ };
112
+ }
113
+ export type ClientBusFrame = RegisterFrame | HeartbeatFrame | CommandFrame | SubscribeFrame | StatusFrame | AckFrame | ResumeFrame;
114
+ export type ServerBusFrame = RegisteredFrame | EventFrame | CommandResultFrame | ResumedFrame | ErrorFrame;
115
+ export declare class BusProtocolError extends Error {
116
+ readonly code: string;
117
+ constructor(code: string, message: string);
118
+ }
119
+ export declare function isRegisterFrame(f: BusFrame): f is RegisterFrame;
120
+ export declare function isHeartbeatFrame(f: BusFrame): f is HeartbeatFrame;
121
+ export declare function isCommandFrame(f: BusFrame): f is CommandFrame;
122
+ export declare function isSubscribeFrame(f: BusFrame): f is SubscribeFrame;
123
+ export declare function isStatusFrame(f: BusFrame): f is StatusFrame;
124
+ export declare function isAckFrame(f: BusFrame): f is AckFrame;
125
+ export declare function isResumeFrame(f: BusFrame): f is ResumeFrame;
126
+ export declare function parseBusFrame(data: string | ArrayBuffer | Uint8Array): BusFrame;
127
+ export declare function validateClientFrame(frame: BusFrame): ClientBusFrame;
128
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ export class BusProtocolError extends Error {
2
+ code;
3
+ constructor(code, message) {
4
+ super(message);
5
+ this.code = code;
6
+ }
7
+ }
8
+ export function isRegisterFrame(f) { return f.type === "register"; }
9
+ export function isHeartbeatFrame(f) { return f.type === "heartbeat"; }
10
+ export function isCommandFrame(f) { return f.type === "command"; }
11
+ export function isSubscribeFrame(f) { return f.type === "subscribe"; }
12
+ export function isStatusFrame(f) { return f.type === "status"; }
13
+ export function isAckFrame(f) { return f.type === "ack"; }
14
+ export function isResumeFrame(f) { return f.type === "resume"; }
15
+ export function parseBusFrame(data) {
16
+ const text = typeof data === "string" ? data : new TextDecoder().decode(data);
17
+ let parsed;
18
+ try {
19
+ parsed = JSON.parse(text);
20
+ }
21
+ catch {
22
+ throw new BusProtocolError("INVALID_JSON", "frame must be valid JSON");
23
+ }
24
+ if (!isRecord(parsed) || typeof parsed.type !== "string") {
25
+ throw new BusProtocolError("INVALID_FRAME", "frame must be an object with a string type");
26
+ }
27
+ if (!("payload" in parsed)) {
28
+ throw new BusProtocolError("INVALID_FRAME", "frame payload is required");
29
+ }
30
+ if ("id" in parsed && parsed.id !== undefined && typeof parsed.id !== "string") {
31
+ throw new BusProtocolError("INVALID_FRAME", "frame id must be a string");
32
+ }
33
+ return parsed;
34
+ }
35
+ export function validateClientFrame(frame) {
36
+ switch (frame.type) {
37
+ case "register":
38
+ requireId(frame);
39
+ requireRegisterPayload(frame.payload);
40
+ return frame;
41
+ case "heartbeat":
42
+ requireHeartbeatPayload(frame.payload);
43
+ return frame;
44
+ case "command":
45
+ requireId(frame);
46
+ requireCommandPayload(frame.payload);
47
+ return frame;
48
+ case "subscribe":
49
+ requireId(frame);
50
+ requireSubscribePayload(frame.payload);
51
+ return frame;
52
+ case "status":
53
+ requireStatusPayload(frame.payload);
54
+ return frame;
55
+ case "ack":
56
+ requireAckPayload(frame.payload);
57
+ return frame;
58
+ case "resume":
59
+ requireId(frame);
60
+ requireResumePayload(frame.payload);
61
+ return frame;
62
+ default:
63
+ throw new BusProtocolError("UNKNOWN_FRAME", `unsupported frame type: ${frame.type}`);
64
+ }
65
+ }
66
+ function requireId(frame) {
67
+ if (!frame.id)
68
+ throw new BusProtocolError("MISSING_ID", `${frame.type} frame id is required`);
69
+ }
70
+ function requireRegisterPayload(payload) {
71
+ if (!isRecord(payload))
72
+ throw invalidPayload("register");
73
+ if (!isRole(payload.role))
74
+ throw invalidPayload("register.role");
75
+ requireString(payload.componentId, "register.componentId");
76
+ requireString(payload.instanceId, "register.instanceId");
77
+ if (payload.agentId !== undefined)
78
+ requireString(payload.agentId, "register.agentId");
79
+ requireStringArray(payload.capabilities, "register.capabilities");
80
+ requireStringArray(payload.tags, "register.tags");
81
+ requireString(payload.machine, "register.machine");
82
+ if (!isRecord(payload.meta))
83
+ throw invalidPayload("register.meta");
84
+ }
85
+ function requireHeartbeatPayload(payload) {
86
+ if (!isRecord(payload) || !["idle", "busy", "online"].includes(String(payload.status))) {
87
+ throw invalidPayload("heartbeat");
88
+ }
89
+ if (payload.meta !== undefined && !isRecord(payload.meta))
90
+ throw invalidPayload("heartbeat.meta");
91
+ }
92
+ function requireCommandPayload(payload) {
93
+ if (!isRecord(payload))
94
+ throw invalidPayload("command");
95
+ requireString(payload.commandType, "command.commandType");
96
+ requireString(payload.target, "command.target");
97
+ if (!isRecord(payload.params))
98
+ throw invalidPayload("command.params");
99
+ }
100
+ function requireSubscribePayload(payload) {
101
+ if (!isRecord(payload))
102
+ throw invalidPayload("subscribe");
103
+ requireStringArray(payload.events, "subscribe.events");
104
+ if (payload.scopes !== undefined)
105
+ requireStringArray(payload.scopes, "subscribe.scopes");
106
+ }
107
+ function requireStatusPayload(payload) {
108
+ if (!isRecord(payload) || !["idle", "busy", "online", "offline"].includes(String(payload.agentStatus))) {
109
+ throw invalidPayload("status");
110
+ }
111
+ if (payload.ready !== undefined && typeof payload.ready !== "boolean")
112
+ throw invalidPayload("status.ready");
113
+ if (payload.meta !== undefined && !isRecord(payload.meta))
114
+ throw invalidPayload("status.meta");
115
+ }
116
+ function requireAckPayload(payload) {
117
+ if (!isRecord(payload))
118
+ throw invalidPayload("ack");
119
+ requireString(payload.frameId, "ack.frameId");
120
+ }
121
+ function requireResumePayload(payload) {
122
+ if (!isRecord(payload) || typeof payload.since !== "number" || !Number.isSafeInteger(payload.since) || payload.since < 0) {
123
+ throw invalidPayload("resume.since");
124
+ }
125
+ }
126
+ function requireString(value, field) {
127
+ if (typeof value !== "string" || value.length === 0)
128
+ throw invalidPayload(field);
129
+ }
130
+ function requireStringArray(value, field) {
131
+ if (!Array.isArray(value) || value.some((item) => typeof item !== "string"))
132
+ throw invalidPayload(field);
133
+ }
134
+ function invalidPayload(field) {
135
+ return new BusProtocolError("INVALID_PAYLOAD", `invalid ${field} payload`);
136
+ }
137
+ function isRole(value) {
138
+ return value === "provider" || value === "channel" || value === "orchestrator" || value === "integration";
139
+ }
140
+ function isRecord(value) {
141
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
142
+ }
143
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { RelayBusClient } from "./bus-client.js";
2
+ import type { Message } from "./types.js";
3
+ export interface ProviderAdapter {
4
+ readonly providerName: string;
5
+ readonly capabilities: string[];
6
+ deliverMessage(agentId: string, messages: Message[]): Promise<void>;
7
+ getAgentStatus(agentId: string): Promise<"idle" | "busy">;
8
+ spawn?(config: SpawnConfig): Promise<SpawnResult>;
9
+ shutdown?(agentId: string): Promise<void>;
10
+ formatDelivery?(messages: Message[]): string;
11
+ }
12
+ export interface SpawnConfig {
13
+ cwd: string;
14
+ label?: string;
15
+ approvalMode?: string;
16
+ prompt?: string;
17
+ env?: Record<string, string>;
18
+ }
19
+ export interface SpawnResult {
20
+ agentId: string;
21
+ pid?: number;
22
+ sessionId?: string;
23
+ }
24
+ export interface ProviderBaseOptions {
25
+ relayUrl: string;
26
+ adapter: ProviderAdapter;
27
+ agentId: string;
28
+ instanceId: string;
29
+ machine: string;
30
+ tags?: string[];
31
+ meta?: Record<string, unknown>;
32
+ token?: string;
33
+ }
34
+ export declare class ProviderBase {
35
+ private readonly options;
36
+ readonly client: RelayBusClient;
37
+ private running;
38
+ private readonly pending;
39
+ private drain?;
40
+ constructor(options: ProviderBaseOptions);
41
+ run(): Promise<void>;
42
+ stop(): Promise<void>;
43
+ private queueMessage;
44
+ private drainMessages;
45
+ private startStatusLoop;
46
+ }
47
+ //# sourceMappingURL=provider-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-base.d.ts","sourceRoot":"","sources":["../src/provider-base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAChC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC1D,KAAK,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAClD,QAAQ,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,cAAc,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;CAC9C;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IAMX,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,KAAK,CAAC,CAAQ;gBAEO,OAAO,EAAE,mBAAmB;IAenD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAQpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,OAAO,CAAC,YAAY;YAQN,aAAa;IAO3B,OAAO,CAAC,eAAe;CAWxB"}
@@ -0,0 +1,66 @@
1
+ import { RelayBusClient } from "./bus-client.js";
2
+ export class ProviderBase {
3
+ options;
4
+ client;
5
+ running = false;
6
+ pending = new Map();
7
+ drain;
8
+ constructor(options) {
9
+ this.options = options;
10
+ this.client = new RelayBusClient({
11
+ url: options.relayUrl,
12
+ role: "provider",
13
+ componentId: `${options.adapter.providerName}:${options.agentId}`,
14
+ agentId: options.agentId,
15
+ instanceId: options.instanceId,
16
+ token: options.token,
17
+ capabilities: options.adapter.capabilities,
18
+ tags: options.tags ?? [options.adapter.providerName],
19
+ machine: options.machine,
20
+ meta: { provider: options.adapter.providerName, ...(options.meta ?? {}) },
21
+ });
22
+ }
23
+ async run() {
24
+ if (this.running)
25
+ return;
26
+ this.running = true;
27
+ this.client.on("message.new", (message) => this.queueMessage(message));
28
+ await this.client.connect();
29
+ this.startStatusLoop();
30
+ }
31
+ async stop() {
32
+ this.running = false;
33
+ if (this.drain)
34
+ clearInterval(this.drain);
35
+ this.drain = undefined;
36
+ await this.client.close();
37
+ }
38
+ queueMessage(message) {
39
+ if (message.to !== this.options.agentId && message.to !== "broadcast" && !message.to.startsWith("tag:") && !message.to.startsWith("cap:") && !message.to.startsWith("label:")) {
40
+ return;
41
+ }
42
+ this.pending.set(message.id, message);
43
+ void this.drainMessages();
44
+ }
45
+ async drainMessages() {
46
+ if (!this.running || this.pending.size === 0)
47
+ return;
48
+ const messages = [...this.pending.values()].sort((a, b) => a.id - b.id);
49
+ this.pending.clear();
50
+ await this.options.adapter.deliverMessage(this.options.agentId, messages);
51
+ }
52
+ startStatusLoop() {
53
+ this.drain = setInterval(async () => {
54
+ if (!this.running)
55
+ return;
56
+ try {
57
+ const status = await this.options.adapter.getAgentStatus(this.options.agentId);
58
+ this.client.status({ agentStatus: status, ready: true });
59
+ }
60
+ catch {
61
+ this.client.status({ agentStatus: "online", ready: false });
62
+ }
63
+ }, 30_000);
64
+ }
65
+ }
66
+ //# sourceMappingURL=provider-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-base.js","sourceRoot":"","sources":["../src/provider-base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface ReconnectOptions {
2
+ initialMs: number;
3
+ maxMs: number;
4
+ jitterMs: number;
5
+ }
6
+ export declare class ReconnectionManager {
7
+ private attempts;
8
+ private abort?;
9
+ private readonly options;
10
+ constructor(options?: Partial<ReconnectOptions>);
11
+ get attempt(): number;
12
+ nextDelay(): number;
13
+ reset(): void;
14
+ schedule(): Promise<void>;
15
+ cancel(): void;
16
+ }
17
+ //# sourceMappingURL=reconnect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconnect.d.ts","sourceRoot":"","sources":["../src/reconnect.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAQD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAAC,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;gBAE/B,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAQnD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,SAAS,IAAI,MAAM;IAYnB,KAAK,IAAI,IAAI;IAKP,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAS/B,MAAM,IAAI,IAAI;CAIf"}
@@ -0,0 +1,47 @@
1
+ import { setTimeout as delay } from "node:timers/promises";
2
+ const DEFAULTS = {
3
+ initialMs: 1000,
4
+ maxMs: 30_000,
5
+ jitterMs: 500,
6
+ };
7
+ export class ReconnectionManager {
8
+ attempts = 0;
9
+ abort;
10
+ options;
11
+ constructor(options = {}) {
12
+ this.options = {
13
+ initialMs: options.initialMs ?? DEFAULTS.initialMs,
14
+ maxMs: options.maxMs ?? DEFAULTS.maxMs,
15
+ jitterMs: options.jitterMs ?? DEFAULTS.jitterMs,
16
+ };
17
+ }
18
+ get attempt() {
19
+ return this.attempts;
20
+ }
21
+ nextDelay() {
22
+ const base = Math.min(this.options.maxMs, this.options.initialMs * 2 ** this.attempts);
23
+ this.attempts += 1;
24
+ const jitter = this.options.jitterMs > 0
25
+ ? Math.floor(Math.random() * (this.options.jitterMs + 1))
26
+ : 0;
27
+ return Math.min(this.options.maxMs, base + jitter);
28
+ }
29
+ reset() {
30
+ this.attempts = 0;
31
+ this.cancel();
32
+ }
33
+ async schedule() {
34
+ this.cancel();
35
+ this.abort = new AbortController();
36
+ const ms = this.nextDelay();
37
+ await delay(ms, undefined, { signal: this.abort.signal }).catch((error) => {
38
+ if (error.name !== "AbortError")
39
+ throw error;
40
+ });
41
+ }
42
+ cancel() {
43
+ this.abort?.abort();
44
+ this.abort = undefined;
45
+ }
46
+ }
47
+ //# sourceMappingURL=reconnect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconnect.js","sourceRoot":"","sources":["../src/reconnect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAQ3D,MAAM,QAAQ,GAAqB;IACjC,SAAS,EAAE,IAAI;IACf,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF,MAAM,OAAO,mBAAmB;IACtB,QAAQ,GAAG,CAAC,CAAC;IACb,KAAK,CAAmB;IACf,OAAO,CAAmB;IAE3C,YAAY,UAAqC,EAAE;QACjD,IAAI,CAAC,OAAO,GAAG;YACb,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS;YAClD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK;YACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ;SAChD,CAAC;IACJ,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,SAAS;QACP,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,IAAI,CAAC,OAAO,CAAC,KAAK,EAClB,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAC5C,CAAC;QACF,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC;YACtC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC,CAAC;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,CAAC,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5B,MAAM,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACxE,IAAK,KAA2B,CAAC,IAAI,KAAK,YAAY;gBAAE,MAAM,KAAK,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,CAAC;CACF"}