@cotal-ai/pi 0.11.1

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.
package/dist/driver.js ADDED
@@ -0,0 +1,347 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { formatInjection } from "@cotal-ai/connector-core";
3
+ import { InboxTurn } from "./inbox-turn.js";
4
+ const CUSTOM_TYPE = "cotal-inbox";
5
+ const BATCH_LIMIT = 32;
6
+ const DEFAULT_START_TIMEOUT_MS = 5_000;
7
+ function detailsOf(message) {
8
+ if (!message || typeof message !== "object")
9
+ return undefined;
10
+ const value = message;
11
+ if (value.role !== "custom" || value.customType !== CUSTOM_TYPE || !value.details || typeof value.details !== "object")
12
+ return undefined;
13
+ const details = value.details;
14
+ if (details.version !== 1 || typeof details.batchId !== "string" || !Array.isArray(details.ids))
15
+ return undefined;
16
+ if (!details.ids.every((id) => typeof id === "string"))
17
+ return undefined;
18
+ return details;
19
+ }
20
+ function ownChannelEcho(mesh, item) {
21
+ return item.kind === "channel" && item.fromId === mesh.id;
22
+ }
23
+ function wakeable(mesh, item) {
24
+ if (ownChannelEcho(mesh, item))
25
+ return false;
26
+ if (item.kind !== "channel" || item.mentionsMe)
27
+ return true;
28
+ if (mesh.channelMode(item.channel) === "quiet")
29
+ return false;
30
+ return mesh.attention === "open";
31
+ }
32
+ /** Serialized Pi-owned delivery driver. No event callback calls the host send API outside this class. */
33
+ export class PiDriver {
34
+ mesh;
35
+ startTimeoutMs;
36
+ inbox;
37
+ host;
38
+ context;
39
+ batches = [];
40
+ contextBatchIds = new Set();
41
+ requestBatchIds = new Set();
42
+ terminalEvidenceBatchIds = new Set();
43
+ nudges = [];
44
+ presence = Promise.resolve();
45
+ activeSignal;
46
+ pendingContinuation = false;
47
+ overflowRetry = false;
48
+ _state = "idle";
49
+ heldReason;
50
+ constructor(mesh, startTimeoutMs = DEFAULT_START_TIMEOUT_MS) {
51
+ this.mesh = mesh;
52
+ this.startTimeoutMs = startTimeoutMs;
53
+ this.inbox = new InboxTurn(mesh);
54
+ }
55
+ get state() {
56
+ return this._state;
57
+ }
58
+ get reason() {
59
+ return this.heldReason;
60
+ }
61
+ bind(host) {
62
+ this.host = host;
63
+ }
64
+ onSessionStart(context) {
65
+ this.context = context;
66
+ if (this._state === "shuttingDown") {
67
+ context.shutdown();
68
+ return;
69
+ }
70
+ this.pump();
71
+ }
72
+ onSessionShutdown() {
73
+ this.context = undefined;
74
+ }
75
+ onIncoming() {
76
+ this.pump();
77
+ }
78
+ onWake() {
79
+ this.pump();
80
+ }
81
+ onMentionWake(item) {
82
+ if (this._state === "shuttingDown")
83
+ return;
84
+ const who = item.fromRole ? `${item.fromName}/${item.fromRole}` : item.fromName;
85
+ this.nudges.push(`Cotal: you were @mentioned on #${item.channel} by ${who} while focused. ` +
86
+ "The body is held; read it with cotal_inbox and reply with cotal_send if warranted.");
87
+ if (this.nudges.length > BATCH_LIMIT)
88
+ this.nudges.splice(0, this.nudges.length - BATCH_LIMIT);
89
+ this.pump();
90
+ }
91
+ onAgentStart(context) {
92
+ this.context = context;
93
+ if (this._state === "shuttingDown") {
94
+ context.shutdown();
95
+ return;
96
+ }
97
+ this.activeSignal = context.signal;
98
+ this.overflowRetry = false;
99
+ if (this.pendingContinuation) {
100
+ this.pendingContinuation = false;
101
+ this.heldReason = undefined;
102
+ this._state = this.batches.some((batch) => !batch.confirmed) ? "dispatching" : "streaming";
103
+ }
104
+ else if (this._state === "held" && this.batches.length === 0) {
105
+ this.heldReason = undefined;
106
+ this._state = "streaming";
107
+ }
108
+ else if (this._state !== "held") {
109
+ this._state = this.batches.some((batch) => !batch.confirmed) ? "dispatching" : "streaming";
110
+ }
111
+ this.enqueuePresence("working", "thinking");
112
+ if (this._state !== "held")
113
+ this.pump(true);
114
+ }
115
+ onMessageStart(message) {
116
+ if (this._state === "shuttingDown")
117
+ return;
118
+ const details = detailsOf(message);
119
+ if (!details)
120
+ return;
121
+ const batch = this.batches.find((candidate) => candidate.id === details.batchId);
122
+ if (!batch || batch.ids.length !== details.ids.length || !batch.ids.every((id, i) => id === details.ids[i]))
123
+ return;
124
+ batch.started = true;
125
+ if (this.contextBatchIds.has(batch.id)) {
126
+ this.requestBatchIds.add(batch.id);
127
+ this.terminalEvidenceBatchIds.add(batch.id);
128
+ }
129
+ if (batch.watchdog)
130
+ clearTimeout(batch.watchdog);
131
+ batch.watchdog = undefined;
132
+ }
133
+ onContext(messages) {
134
+ if (this._state === "shuttingDown")
135
+ return;
136
+ const visible = new Set(messages.map(detailsOf).filter((details) => Boolean(details)).map((d) => d.batchId));
137
+ const candidates = this.batches.filter((batch) => !batch.confirmed && visible.has(batch.id));
138
+ this.contextBatchIds = new Set(candidates.map((batch) => batch.id));
139
+ this.requestBatchIds = new Set(candidates.filter((batch) => batch.started).map((batch) => batch.id));
140
+ for (const id of this.requestBatchIds)
141
+ this.terminalEvidenceBatchIds.add(id);
142
+ }
143
+ onProviderResponse(status) {
144
+ if (this._state === "shuttingDown")
145
+ return;
146
+ if (status >= 200 && status < 300) {
147
+ for (const id of this.requestBatchIds) {
148
+ const batch = this.batches.find((candidate) => candidate.id === id);
149
+ if (batch)
150
+ batch.confirmed = true;
151
+ }
152
+ }
153
+ else {
154
+ for (const id of this.requestBatchIds)
155
+ this.terminalEvidenceBatchIds.delete(id);
156
+ }
157
+ this.contextBatchIds.clear();
158
+ this.requestBatchIds.clear();
159
+ if (this._state !== "held") {
160
+ this._state = "streaming";
161
+ this.pump();
162
+ }
163
+ }
164
+ onToolStart(name) {
165
+ if (this._state === "shuttingDown")
166
+ return;
167
+ this.enqueuePresence("working", `running ${name || "tool"}`);
168
+ }
169
+ onToolEnd() {
170
+ if (this._state === "shuttingDown")
171
+ return;
172
+ this.enqueuePresence("working", "thinking");
173
+ }
174
+ onAgentEnd(messages, context) {
175
+ if (this._state === "shuttingDown")
176
+ return;
177
+ const lastAssistant = [...messages]
178
+ .reverse()
179
+ .find((message) => message && typeof message === "object" && message.role === "assistant");
180
+ const aborted = this.activeSignal?.aborted === true;
181
+ this.activeSignal = undefined;
182
+ this.contextBatchIds.clear();
183
+ this.requestBatchIds.clear();
184
+ const terminal = !aborted &&
185
+ (lastAssistant?.stopReason === "stop" ||
186
+ lastAssistant?.stopReason === "toolUse" ||
187
+ (lastAssistant?.stopReason === "length" && (lastAssistant.usage?.output ?? 0) > 0));
188
+ if (!terminal) {
189
+ this.terminalEvidenceBatchIds.clear();
190
+ if (this.batches.length === 0) {
191
+ this._state = "idle";
192
+ this.publishIdleWhenSettled(context);
193
+ return;
194
+ }
195
+ this.pendingContinuation = true;
196
+ this.hold(aborted || lastAssistant?.stopReason === "aborted"
197
+ ? "Pi turn was aborted; Cotal delivery is retained until a proven clean continuation completes"
198
+ : `Pi turn ended with ${lastAssistant?.stopReason ?? "an unknown stop reason"}; ` +
199
+ "Cotal delivery is retained until a proven clean continuation completes");
200
+ return;
201
+ }
202
+ for (const id of this.terminalEvidenceBatchIds) {
203
+ const batch = this.batches.find((candidate) => candidate.id === id);
204
+ if (batch)
205
+ batch.confirmed = true;
206
+ }
207
+ this.terminalEvidenceBatchIds.clear();
208
+ this.pendingContinuation = false;
209
+ this.finalizeEnd(context);
210
+ }
211
+ onBeforeCompact(reason, willRetry) {
212
+ if (this._state === "shuttingDown")
213
+ return;
214
+ if (reason !== "overflow" || !willRetry)
215
+ return;
216
+ this.overflowRetry = true;
217
+ }
218
+ requestShutdown() {
219
+ if (this._state === "shuttingDown")
220
+ return;
221
+ this._state = "shuttingDown";
222
+ this.clearTimers();
223
+ if (this.context)
224
+ this.context.shutdown();
225
+ }
226
+ async quit() {
227
+ this._state = "shuttingDown";
228
+ this.clearTimers();
229
+ await this.presence.catch(() => { });
230
+ }
231
+ async flushPresence() {
232
+ await this.presence.catch(() => { });
233
+ }
234
+ pump(force = false) {
235
+ if (!this.host || !this.context || this._state === "held" || this._state === "shuttingDown")
236
+ return;
237
+ if (this.batches.some((batch) => !batch.confirmed))
238
+ return;
239
+ this.inbox.discardTombstonedFront();
240
+ this.inbox.discardFront((item) => ownChannelEcho(this.mesh, item));
241
+ const reserved = new Set(this.batches.flatMap((batch) => batch.ids));
242
+ const available = this.inbox.peek().filter((item) => !reserved.has(item.id));
243
+ if (!force && this.nudges.length === 0 && !available.some((item) => wakeable(this.mesh, item))) {
244
+ if (this.batches.length === 0)
245
+ this.publishIdleWhenSettled(this.context);
246
+ return;
247
+ }
248
+ let ids = [];
249
+ let content;
250
+ if (this.nudges.length > 0) {
251
+ content = this.nudges.splice(0).join("\n");
252
+ }
253
+ else {
254
+ const items = this.inbox.select(reserved, (item) => ownChannelEcho(this.mesh, item), BATCH_LIMIT);
255
+ if (items.length === 0)
256
+ return;
257
+ ids = items.map((item) => item.id);
258
+ content = formatInjection(items);
259
+ }
260
+ if (!content)
261
+ return;
262
+ const batch = { id: randomUUID(), ids, content, started: false, confirmed: false };
263
+ this.batches.push(batch);
264
+ this._state = "dispatching";
265
+ try {
266
+ this.host.sendMessage({
267
+ customType: CUSTOM_TYPE,
268
+ content,
269
+ display: true,
270
+ details: { version: 1, batchId: batch.id, ids: [...ids] },
271
+ }, { triggerTurn: true, deliverAs: "steer" });
272
+ if (!batch.started) {
273
+ batch.watchdog = setTimeout(() => {
274
+ if (!batch.started)
275
+ this.hold(`Pi did not start dispatched Cotal batch ${batch.id}`);
276
+ }, this.startTimeoutMs);
277
+ batch.watchdog.unref?.();
278
+ }
279
+ }
280
+ catch (error) {
281
+ this.hold(`Pi rejected Cotal dispatch: ${error instanceof Error ? error.message : String(error)}`);
282
+ }
283
+ }
284
+ finalizeEnd(context) {
285
+ if (this._state === "shuttingDown")
286
+ return;
287
+ if (this.overflowRetry)
288
+ return;
289
+ const confirmed = this.batches.filter((batch) => batch.confirmed);
290
+ const ids = confirmed.flatMap((batch) => batch.ids);
291
+ const committed = this.inbox.commitConfirmed(ids);
292
+ this.batches = this.batches.filter((batch) => !batch.confirmed);
293
+ if (committed.error) {
294
+ this.hold(committed.error);
295
+ return;
296
+ }
297
+ if (this.batches.length > 0) {
298
+ this.hold("Pi ended before confirming a queued Cotal steer");
299
+ return;
300
+ }
301
+ this._state = "idle";
302
+ this.heldReason = undefined;
303
+ this.pump();
304
+ if (this._state === "idle")
305
+ this.publishIdleWhenSettled(context);
306
+ }
307
+ hold(reason) {
308
+ if (this._state === "shuttingDown")
309
+ return;
310
+ this._state = "held";
311
+ this.heldReason = reason;
312
+ this.clearWatchdogs();
313
+ this.enqueuePresence("waiting", reason);
314
+ if (this.context?.hasUI)
315
+ this.context.ui.notify(`Cotal delivery held: ${reason}`, "warning");
316
+ }
317
+ publishIdleWhenSettled(context) {
318
+ const check = () => {
319
+ if (this._state !== "idle")
320
+ return;
321
+ if (this.context !== context)
322
+ return;
323
+ if (!context.isIdle()) {
324
+ setTimeout(check, 10).unref?.();
325
+ return;
326
+ }
327
+ this.enqueuePresence("idle");
328
+ };
329
+ check();
330
+ }
331
+ enqueuePresence(status, activity) {
332
+ this.presence = this.presence
333
+ .then(() => this.mesh.setStatus(status, activity))
334
+ .catch(() => { });
335
+ }
336
+ clearWatchdogs() {
337
+ for (const batch of this.batches) {
338
+ if (batch.watchdog)
339
+ clearTimeout(batch.watchdog);
340
+ batch.watchdog = undefined;
341
+ }
342
+ }
343
+ clearTimers() {
344
+ this.clearWatchdogs();
345
+ }
346
+ }
347
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ /** Load Cotal into the operator's Pi. With no mesh identity this extension is completely inert. */
3
+ export default function cotalMesh(pi: ExtensionAPI): Promise<void>;
4
+ //# sourceMappingURL=extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,iCAAiC,CAAC;AA2GtF,mGAAmG;AACnG,wBAA8B,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CvE"}
@@ -0,0 +1,135 @@
1
+ import { basename, dirname } from "node:path";
2
+ import { rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { MeshAgent, configFromEnv, hasIdentity, startControlServer, } from "@cotal-ai/connector-core";
5
+ import { PiDriver } from "./driver.js";
6
+ import { registerCotalTools } from "./tools.js";
7
+ const CUSTOM_TYPE = "cotal-inbox";
8
+ const RUNTIMES = Symbol.for("cotal.pi.runtimes");
9
+ function runtimeMap() {
10
+ const root = globalThis;
11
+ return (root[RUNTIMES] ??= new Map());
12
+ }
13
+ function runtimeKey(config) {
14
+ return `${config.space}\0${config.id ?? config.name}`;
15
+ }
16
+ function asContext(context) {
17
+ return context;
18
+ }
19
+ function messageText(content) {
20
+ if (typeof content === "string")
21
+ return content;
22
+ if (!Array.isArray(content))
23
+ return String(content ?? "");
24
+ return content
25
+ .map((part) => (part && typeof part === "object" && "text" in part ? String(part.text ?? "") : ""))
26
+ .filter(Boolean)
27
+ .join("\n");
28
+ }
29
+ function wrapped(line) {
30
+ return {
31
+ invalidate() { },
32
+ render(width) {
33
+ const size = Math.max(16, width);
34
+ const out = [];
35
+ for (const source of line.split("\n")) {
36
+ let rest = source;
37
+ while (rest.length > size) {
38
+ const whitespace = rest.lastIndexOf(" ", size);
39
+ const cut = whitespace > size / 2 ? whitespace : size;
40
+ out.push(rest.slice(0, cut));
41
+ rest = rest.slice(cut).trimStart();
42
+ }
43
+ out.push(rest);
44
+ }
45
+ return out;
46
+ },
47
+ };
48
+ }
49
+ function cleanPersonaFile(runtime) {
50
+ if (runtime.personaCleaned)
51
+ return;
52
+ runtime.personaCleaned = true;
53
+ const file = process.env.COTAL_PI_PERSONA_FILE;
54
+ if (!file)
55
+ return;
56
+ const dir = dirname(file);
57
+ if (basename(file) !== "persona.md" || !basename(dir).startsWith("cotal-persona-") || dirname(dir) !== tmpdir())
58
+ return;
59
+ try {
60
+ rmSync(dir, { recursive: true, force: true });
61
+ }
62
+ catch {
63
+ // A pre-start crash can leave the OS-temp file behind; normal cleanup remains best-effort.
64
+ }
65
+ }
66
+ function createRuntime(config) {
67
+ const path = process.env.COTAL_CONTROL_SOCKET?.trim();
68
+ const token = process.env.COTAL_CONTROL_TOKEN?.trim();
69
+ if (Boolean(path) !== Boolean(token)) {
70
+ throw new Error("pi connector: COTAL_CONTROL_SOCKET and COTAL_CONTROL_TOKEN must be provided together");
71
+ }
72
+ const mesh = new MeshAgent(config);
73
+ const driver = new PiDriver(mesh);
74
+ const runtime = {
75
+ config,
76
+ mesh,
77
+ driver,
78
+ personaCleaned: false,
79
+ };
80
+ mesh.on("incoming", () => driver.onIncoming());
81
+ mesh.on("wake", () => driver.onWake());
82
+ mesh.on("mention-wake", (item) => driver.onMentionWake(item));
83
+ mesh.start();
84
+ if (path && token) {
85
+ runtime.controlServer = startControlServer(mesh, { path, token }, async () => ({ ok: false, error: "pi uses in-process lifecycle events; only shutdown is supported" }), { fatalBind: true, onShutdown: () => driver.requestShutdown() });
86
+ }
87
+ return runtime;
88
+ }
89
+ /** Load Cotal into the operator's Pi. With no mesh identity this extension is completely inert. */
90
+ export default async function cotalMesh(pi) {
91
+ if (!hasIdentity())
92
+ return;
93
+ if (typeof pi.sendMessage !== "function" || typeof pi.registerMessageRenderer !== "function" || typeof pi.on !== "function") {
94
+ throw new Error("pi connector: this Pi version lacks the required custom-message lifecycle API (requires Pi 0.79.10)");
95
+ }
96
+ const config = configFromEnv();
97
+ config.connector = "pi";
98
+ const key = runtimeKey(config);
99
+ const runtimes = runtimeMap();
100
+ let runtime = runtimes.get(key);
101
+ if (!runtime) {
102
+ runtime = createRuntime(config);
103
+ runtimes.set(key, runtime);
104
+ }
105
+ runtime.driver.bind(pi);
106
+ registerCotalTools(pi, runtime.mesh, runtime.config);
107
+ pi.registerMessageRenderer(CUSTOM_TYPE, (message) => wrapped(messageText(message.content)));
108
+ pi.on("session_start", (_event, context) => {
109
+ cleanPersonaFile(runtime);
110
+ runtime.driver.onSessionStart(asContext(context));
111
+ });
112
+ pi.on("agent_start", (_event, context) => runtime.driver.onAgentStart(asContext(context)));
113
+ pi.on("message_start", (event) => runtime.driver.onMessageStart(event.message));
114
+ pi.on("context", (event) => runtime.driver.onContext(event.messages));
115
+ pi.on("after_provider_response", (event) => runtime.driver.onProviderResponse(event.status));
116
+ pi.on("tool_execution_start", (event) => runtime.driver.onToolStart(event.toolName));
117
+ pi.on("tool_execution_end", () => runtime.driver.onToolEnd());
118
+ pi.on("session_before_compact", (event) => runtime.driver.onBeforeCompact(event.reason, event.willRetry));
119
+ pi.on("agent_end", (event, context) => runtime.driver.onAgentEnd(event.messages, asContext(context)));
120
+ pi.on("session_shutdown", async (event) => {
121
+ runtime.driver.onSessionShutdown();
122
+ if (event.reason !== "quit")
123
+ return;
124
+ await runtime.driver.quit();
125
+ try {
126
+ runtime.controlServer?.close();
127
+ }
128
+ catch {
129
+ // The server may already be closing after the manager's shutdown request.
130
+ }
131
+ await runtime.mesh.stop().catch(() => { });
132
+ runtimes.delete(key);
133
+ });
134
+ }
135
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { InboxItem } from "@cotal-ai/connector-core";
2
+ export interface InboxSource {
3
+ peekInbox(): InboxItem[];
4
+ drainInbox(limit?: number): InboxItem[];
5
+ }
6
+ export interface CommitResult {
7
+ drained: number;
8
+ tombstoned: number;
9
+ error?: string;
10
+ }
11
+ /**
12
+ * Pi-local acknowledgement ledger over MeshAgent's public prefix-drain API.
13
+ *
14
+ * A provider-confirmed batch is drained only when its still-buffered ids are the current front
15
+ * prefix. Missing ids are allowed only at the older edge, where MeshAgent's bounded inbox may have
16
+ * force-evicted them. Anything else is tombstoned and left unacked rather than risking a positional
17
+ * drain of unrelated traffic. A late duplicate is discarded only when it reaches the front.
18
+ */
19
+ export declare class InboxTurn {
20
+ private readonly source;
21
+ private tombstones;
22
+ private previousTombstones;
23
+ constructor(source: InboxSource);
24
+ peek(): InboxItem[];
25
+ /** Remove already-confirmed late duplicates from the front, one exact item at a time. */
26
+ discardTombstonedFront(): number;
27
+ /** Prefix-only discard for adapter-local traffic such as own channel echoes. */
28
+ discardFront(match: (item: InboxItem) => boolean): number;
29
+ /**
30
+ * Select the next FIFO batch after already-reserved ids. `boundary` is never skipped: a buried
31
+ * echo or other local boundary waits until older reserved work reaches a terminal decision.
32
+ */
33
+ select(reserved: ReadonlySet<string>, boundary: (item: InboxItem) => boolean, limit: number): InboxItem[];
34
+ /**
35
+ * Commit provider-confirmed ids without ever calling drainInbox(0), which means "drain all" in
36
+ * MeshAgent. On an invariant mismatch, acknowledge nothing and retain tombstones for exact later
37
+ * discard.
38
+ */
39
+ commitConfirmed(ids: readonly string[]): CommitResult;
40
+ private hasTombstone;
41
+ private addTombstone;
42
+ }
43
+ //# sourceMappingURL=inbox-turn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox-turn.d.ts","sourceRoot":"","sources":["../src/inbox-turn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,SAAS,IAAI,SAAS,EAAE,CAAC;IACzB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;;;;;GAOG;AACH,qBAAa,SAAS;IAIR,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,kBAAkB,CAAqB;gBAElB,MAAM,EAAE,WAAW;IAEhD,IAAI,IAAI,SAAS,EAAE;IAInB,yFAAyF;IACzF,sBAAsB,IAAI,MAAM;IAUhC,gFAAgF;IAChF,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,GAAG,MAAM;IAUzD;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE;IAWzG;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,YAAY;IAmCrD,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;CAOrB"}