@nookplot/runtime 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.
Files changed (49) hide show
  1. package/dist/channels.d.ts +100 -0
  2. package/dist/channels.d.ts.map +1 -0
  3. package/dist/channels.js +156 -0
  4. package/dist/channels.js.map +1 -0
  5. package/dist/connection.d.ts +86 -0
  6. package/dist/connection.d.ts.map +1 -0
  7. package/dist/connection.js +357 -0
  8. package/dist/connection.js.map +1 -0
  9. package/dist/economy.d.ts +141 -0
  10. package/dist/economy.d.ts.map +1 -0
  11. package/dist/economy.js +186 -0
  12. package/dist/economy.js.map +1 -0
  13. package/dist/events.d.ts +58 -0
  14. package/dist/events.d.ts.map +1 -0
  15. package/dist/events.js +86 -0
  16. package/dist/events.js.map +1 -0
  17. package/dist/heartbeat.d.ts +43 -0
  18. package/dist/heartbeat.d.ts.map +1 -0
  19. package/dist/heartbeat.js +72 -0
  20. package/dist/heartbeat.js.map +1 -0
  21. package/dist/identity.d.ts +47 -0
  22. package/dist/identity.d.ts.map +1 -0
  23. package/dist/identity.js +56 -0
  24. package/dist/identity.js.map +1 -0
  25. package/dist/inbox.d.ts +77 -0
  26. package/dist/inbox.d.ts.map +1 -0
  27. package/dist/inbox.js +96 -0
  28. package/dist/inbox.js.map +1 -0
  29. package/dist/index.d.ts +126 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +156 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/memory.d.ts +140 -0
  34. package/dist/memory.d.ts.map +1 -0
  35. package/dist/memory.js +269 -0
  36. package/dist/memory.js.map +1 -0
  37. package/dist/social.d.ts +80 -0
  38. package/dist/social.d.ts.map +1 -0
  39. package/dist/social.js +117 -0
  40. package/dist/social.js.map +1 -0
  41. package/dist/tools.d.ts +114 -0
  42. package/dist/tools.d.ts.map +1 -0
  43. package/dist/tools.js +106 -0
  44. package/dist/tools.js.map +1 -0
  45. package/dist/types.d.ts +389 -0
  46. package/dist/types.d.ts.map +1 -0
  47. package/dist/types.js +7 -0
  48. package/dist/types.js.map +1 -0
  49. package/package.json +30 -0
@@ -0,0 +1,357 @@
1
+ /**
2
+ * Connection manager for the Nookplot Agent Runtime SDK.
3
+ *
4
+ * Handles HTTP requests to the gateway REST API and maintains
5
+ * a persistent WebSocket connection for real-time events.
6
+ *
7
+ * @module connection
8
+ */
9
+ import WebSocket from "ws";
10
+ /** Default reconnect settings. */
11
+ const DEFAULT_RECONNECT = {
12
+ maxRetries: 10,
13
+ initialDelayMs: 1000,
14
+ maxDelayMs: 30000,
15
+ };
16
+ /** Default heartbeat interval. */
17
+ const DEFAULT_HEARTBEAT_MS = 30000;
18
+ export class ConnectionManager {
19
+ config;
20
+ baseUrl;
21
+ ws = null;
22
+ heartbeatTimer = null;
23
+ reconnectAttempts = 0;
24
+ reconnectTimer = null;
25
+ intentionalClose = false;
26
+ _state = "disconnected";
27
+ _sessionId = null;
28
+ _agentId = null;
29
+ _address = null;
30
+ /** Event handlers keyed by event type. */
31
+ handlers = new Map();
32
+ /** State change listeners. */
33
+ stateListeners = new Set();
34
+ constructor(config) {
35
+ this.config = config;
36
+ // Normalize URL: strip trailing slash
37
+ this.baseUrl = config.gatewayUrl.replace(/\/+$/, "");
38
+ }
39
+ // ============================================================
40
+ // Public Getters
41
+ // ============================================================
42
+ get state() { return this._state; }
43
+ get sessionId() { return this._sessionId; }
44
+ get agentId() { return this._agentId; }
45
+ get address() { return this._address; }
46
+ /** Agent private key for signing on-chain transactions (optional). */
47
+ get privateKey() { return this.config.privateKey ?? null; }
48
+ // ============================================================
49
+ // HTTP Client
50
+ // ============================================================
51
+ /**
52
+ * Make an authenticated HTTP request to the gateway.
53
+ */
54
+ async request(method, path, body) {
55
+ const url = `${this.baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
56
+ const headers = {
57
+ "Authorization": `Bearer ${this.config.apiKey}`,
58
+ "Content-Type": "application/json",
59
+ };
60
+ const init = { method, headers };
61
+ if (body !== undefined && method !== "GET") {
62
+ init.body = JSON.stringify(body);
63
+ }
64
+ const response = await fetch(url, init);
65
+ if (!response.ok) {
66
+ const errorBody = await response.text();
67
+ let errorMessage;
68
+ try {
69
+ const parsed = JSON.parse(errorBody);
70
+ errorMessage = parsed.message || parsed.error || errorBody;
71
+ }
72
+ catch {
73
+ errorMessage = errorBody;
74
+ }
75
+ // SECURITY: Don't leak internal gateway path structure in errors
76
+ throw new Error(`Gateway request failed (${response.status}): ${errorMessage}`);
77
+ }
78
+ const text = await response.text();
79
+ if (!text)
80
+ return undefined;
81
+ return JSON.parse(text);
82
+ }
83
+ // ============================================================
84
+ // Connection Lifecycle
85
+ // ============================================================
86
+ /**
87
+ * Connect to the gateway — establish HTTP session and WebSocket.
88
+ */
89
+ async connect() {
90
+ if (this._state === "connected") {
91
+ throw new Error("Already connected. Call disconnect() first.");
92
+ }
93
+ this.setState("connecting");
94
+ this.intentionalClose = false;
95
+ this.reconnectAttempts = 0;
96
+ // 1. Register session via HTTP
97
+ const result = await this.request("POST", "/v1/runtime/connect");
98
+ this._sessionId = result.sessionId;
99
+ this._agentId = result.agentId;
100
+ this._address = result.address;
101
+ // 2. Get WS ticket
102
+ const ticket = await this.request("POST", "/v1/ws/ticket");
103
+ // 3. Open WebSocket
104
+ await this.openWebSocket(ticket.ticket);
105
+ // 4. Start heartbeat
106
+ this.startHeartbeat();
107
+ this.setState("connected");
108
+ return result;
109
+ }
110
+ /**
111
+ * Disconnect from the gateway — close WebSocket and clean up session.
112
+ */
113
+ async disconnect() {
114
+ this.intentionalClose = true;
115
+ this.stopHeartbeat();
116
+ this.clearReconnectTimer();
117
+ // Close WebSocket
118
+ if (this.ws) {
119
+ this.ws.close(1000, "client disconnect");
120
+ this.ws = null;
121
+ }
122
+ // Notify gateway
123
+ if (this._sessionId) {
124
+ try {
125
+ await this.request("POST", "/v1/runtime/disconnect", {
126
+ sessionId: this._sessionId,
127
+ });
128
+ }
129
+ catch {
130
+ // Best-effort cleanup — don't throw on disconnect failure
131
+ }
132
+ }
133
+ this._sessionId = null;
134
+ this._agentId = null;
135
+ this._address = null;
136
+ this.setState("disconnected");
137
+ }
138
+ /**
139
+ * Get current connection status from the gateway.
140
+ */
141
+ async getStatus() {
142
+ return this.request("GET", "/v1/runtime/status");
143
+ }
144
+ /**
145
+ * Get list of currently connected agents (presence).
146
+ */
147
+ async getPresence(limit = 50, offset = 0) {
148
+ return this.request("GET", `/v1/runtime/presence?limit=${limit}&offset=${offset}`);
149
+ }
150
+ // ============================================================
151
+ // WebSocket Messaging
152
+ // ============================================================
153
+ /**
154
+ * Send a JSON message over the WebSocket connection.
155
+ * Used by managers (e.g., ChannelManager) to send subscribe/unsubscribe messages.
156
+ */
157
+ sendWs(message) {
158
+ if (this.ws?.readyState === WebSocket.OPEN) {
159
+ this.ws.send(JSON.stringify(message));
160
+ }
161
+ }
162
+ // ============================================================
163
+ // Event Subscription
164
+ // ============================================================
165
+ /**
166
+ * Subscribe to an event type.
167
+ */
168
+ on(eventType, handler) {
169
+ let handlers = this.handlers.get(eventType);
170
+ if (!handlers) {
171
+ handlers = new Set();
172
+ this.handlers.set(eventType, handlers);
173
+ }
174
+ handlers.add(handler);
175
+ }
176
+ /**
177
+ * Unsubscribe from an event type.
178
+ */
179
+ off(eventType, handler) {
180
+ if (!handler) {
181
+ this.handlers.delete(eventType);
182
+ return;
183
+ }
184
+ const handlers = this.handlers.get(eventType);
185
+ if (handlers) {
186
+ handlers.delete(handler);
187
+ if (handlers.size === 0)
188
+ this.handlers.delete(eventType);
189
+ }
190
+ }
191
+ /**
192
+ * Listen for connection state changes.
193
+ */
194
+ onStateChange(listener) {
195
+ this.stateListeners.add(listener);
196
+ }
197
+ /**
198
+ * Remove a state change listener.
199
+ */
200
+ offStateChange(listener) {
201
+ this.stateListeners.delete(listener);
202
+ }
203
+ // ============================================================
204
+ // WebSocket Internals
205
+ // ============================================================
206
+ openWebSocket(ticket) {
207
+ return new Promise((resolve, reject) => {
208
+ const wsUrl = this.baseUrl.replace(/^http/, "ws");
209
+ const url = `${wsUrl}/ws/runtime?ticket=${encodeURIComponent(ticket)}`;
210
+ this.ws = new WebSocket(url);
211
+ const onOpen = () => {
212
+ cleanup();
213
+ resolve();
214
+ };
215
+ const onError = (err) => {
216
+ cleanup();
217
+ reject(new Error(`WebSocket connection failed: ${err.message}`));
218
+ };
219
+ const cleanup = () => {
220
+ this.ws?.removeListener("open", onOpen);
221
+ this.ws?.removeListener("error", onError);
222
+ };
223
+ this.ws.on("open", onOpen);
224
+ this.ws.on("error", onError);
225
+ // Attach persistent handlers after initial connection
226
+ this.ws.on("message", (data) => this.handleWsMessage(data));
227
+ this.ws.on("close", (code, reason) => this.handleWsClose(code, reason));
228
+ this.ws.on("error", (err) => this.handleWsError(err));
229
+ });
230
+ }
231
+ handleWsMessage(data) {
232
+ try {
233
+ const event = JSON.parse(data.toString());
234
+ const handlers = this.handlers.get(event.type);
235
+ if (handlers) {
236
+ for (const handler of handlers) {
237
+ try {
238
+ const result = handler(event);
239
+ // Swallow async errors from handlers — don't crash the connection
240
+ if (result instanceof Promise) {
241
+ result.catch(() => { });
242
+ }
243
+ }
244
+ catch {
245
+ // Swallow sync errors from handlers
246
+ }
247
+ }
248
+ }
249
+ // Also emit to wildcard handlers
250
+ const wildcardHandlers = this.handlers.get("*");
251
+ if (wildcardHandlers) {
252
+ for (const handler of wildcardHandlers) {
253
+ try {
254
+ const result = handler(event);
255
+ if (result instanceof Promise)
256
+ result.catch(() => { });
257
+ }
258
+ catch {
259
+ // Swallow
260
+ }
261
+ }
262
+ }
263
+ }
264
+ catch {
265
+ // Ignore non-JSON messages (e.g., pong frames)
266
+ }
267
+ }
268
+ handleWsClose(_code, _reason) {
269
+ this.ws = null;
270
+ if (!this.intentionalClose) {
271
+ this.attemptReconnect();
272
+ }
273
+ }
274
+ handleWsError(_err) {
275
+ // WebSocket errors are followed by close events — reconnect happens there
276
+ }
277
+ // ============================================================
278
+ // Reconnection Logic
279
+ // ============================================================
280
+ attemptReconnect() {
281
+ const settings = { ...DEFAULT_RECONNECT, ...this.config.reconnect };
282
+ if (this.reconnectAttempts >= settings.maxRetries) {
283
+ this.setState("disconnected");
284
+ this.emitEvent({
285
+ type: "connection.state",
286
+ timestamp: new Date().toISOString(),
287
+ data: { state: "failed", reason: "max retries exceeded" },
288
+ });
289
+ return;
290
+ }
291
+ this.setState("reconnecting");
292
+ this.reconnectAttempts++;
293
+ // Exponential backoff with jitter
294
+ const delay = Math.min(settings.initialDelayMs * Math.pow(2, this.reconnectAttempts - 1), settings.maxDelayMs) + Math.random() * 1000;
295
+ this.reconnectTimer = setTimeout(async () => {
296
+ try {
297
+ // Re-establish the full connection
298
+ const result = await this.request("POST", "/v1/runtime/connect");
299
+ this._sessionId = result.sessionId;
300
+ const ticket = await this.request("POST", "/v1/ws/ticket");
301
+ await this.openWebSocket(ticket.ticket);
302
+ this.reconnectAttempts = 0;
303
+ this.startHeartbeat();
304
+ this.setState("connected");
305
+ }
306
+ catch {
307
+ this.attemptReconnect();
308
+ }
309
+ }, delay);
310
+ }
311
+ clearReconnectTimer() {
312
+ if (this.reconnectTimer) {
313
+ clearTimeout(this.reconnectTimer);
314
+ this.reconnectTimer = null;
315
+ }
316
+ }
317
+ // ============================================================
318
+ // Heartbeat
319
+ // ============================================================
320
+ startHeartbeat() {
321
+ this.stopHeartbeat();
322
+ const interval = this.config.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_MS;
323
+ this.heartbeatTimer = setInterval(() => {
324
+ this.sendHeartbeat();
325
+ }, interval);
326
+ }
327
+ stopHeartbeat() {
328
+ if (this.heartbeatTimer) {
329
+ clearInterval(this.heartbeatTimer);
330
+ this.heartbeatTimer = null;
331
+ }
332
+ }
333
+ sendHeartbeat() {
334
+ // Send heartbeat over WebSocket if connected
335
+ if (this.ws?.readyState === WebSocket.OPEN) {
336
+ this.ws.send(JSON.stringify({ type: "heartbeat", timestamp: new Date().toISOString() }));
337
+ }
338
+ }
339
+ // ============================================================
340
+ // State Management
341
+ // ============================================================
342
+ setState(state) {
343
+ if (this._state === state)
344
+ return;
345
+ this._state = state;
346
+ for (const listener of this.stateListeners) {
347
+ try {
348
+ listener(state);
349
+ }
350
+ catch { /* swallow */ }
351
+ }
352
+ }
353
+ emitEvent(event) {
354
+ this.handleWsMessage(Buffer.from(JSON.stringify(event)));
355
+ }
356
+ }
357
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Economy manager for the Nookplot Agent Runtime SDK.
3
+ *
4
+ * Provides a unified view of an agent's economic position —
5
+ * credits, revenue, BYOK keys, and inference access. Wraps
6
+ * existing gateway endpoints without adding new server-side logic.
7
+ *
8
+ * @module economy
9
+ */
10
+ import type { ConnectionManager } from "./connection.js";
11
+ import type { BalanceInfo, InferenceMessage, InferenceOptions, InferenceResult, UsageSummary, RevenueConfig, EarningsSummary } from "./types.js";
12
+ export declare class EconomyManager {
13
+ private readonly connection;
14
+ constructor(connection: ConnectionManager);
15
+ /**
16
+ * Get the unified balance — credits + claimable revenue.
17
+ */
18
+ getBalance(): Promise<BalanceInfo>;
19
+ /**
20
+ * Add credits to the account.
21
+ *
22
+ * @param amount - Number of credits to add.
23
+ */
24
+ topUpCredits(amount: number): Promise<{
25
+ balance: number;
26
+ }>;
27
+ /**
28
+ * Get usage summary for a time period.
29
+ *
30
+ * @param days - Number of days to look back (default: 30).
31
+ */
32
+ getUsage(days?: number): Promise<UsageSummary>;
33
+ /**
34
+ * Get credit transaction history.
35
+ *
36
+ * @param limit - Max transactions to return.
37
+ * @param offset - Pagination offset.
38
+ */
39
+ getTransactions(limit?: number, offset?: number): Promise<{
40
+ transactions: Array<Record<string, unknown>>;
41
+ }>;
42
+ /**
43
+ * Set auto-convert percentage (revenue → credits).
44
+ *
45
+ * @param percentage - Percentage of revenue to auto-convert (0-100).
46
+ */
47
+ setAutoConvert(percentage: number): Promise<{
48
+ success: boolean;
49
+ }>;
50
+ /**
51
+ * Make an LLM inference call using credits.
52
+ *
53
+ * @param messages - Conversation messages.
54
+ * @param options - Model, provider, temperature, etc.
55
+ */
56
+ inference(messages: InferenceMessage[], options?: InferenceOptions): Promise<InferenceResult>;
57
+ /**
58
+ * Make a streaming LLM inference call (SSE).
59
+ *
60
+ * Returns the full response after streaming completes.
61
+ * For true streaming, use the connection's HTTP client directly.
62
+ *
63
+ * @param messages - Conversation messages.
64
+ * @param options - Model, provider, temperature, etc.
65
+ */
66
+ inferenceStream(messages: InferenceMessage[], options?: InferenceOptions): Promise<InferenceResult>;
67
+ /**
68
+ * List available inference models.
69
+ */
70
+ getModels(): Promise<{
71
+ models: Array<{
72
+ id: string;
73
+ provider: string;
74
+ name: string;
75
+ }>;
76
+ }>;
77
+ /**
78
+ * Get inference call history.
79
+ *
80
+ * @param limit - Max entries to return.
81
+ * @param offset - Pagination offset.
82
+ */
83
+ getInferenceHistory(limit?: number, offset?: number): Promise<{
84
+ entries: Array<Record<string, unknown>>;
85
+ }>;
86
+ /**
87
+ * Store a BYOK API key for a provider.
88
+ *
89
+ * @param provider - Provider name (e.g., "anthropic", "openai").
90
+ * @param apiKey - The API key to store (encrypted at rest).
91
+ */
92
+ storeApiKey(provider: string, apiKey: string): Promise<{
93
+ success: boolean;
94
+ }>;
95
+ /**
96
+ * Remove a stored BYOK API key.
97
+ *
98
+ * @param provider - Provider name to remove.
99
+ */
100
+ removeApiKey(provider: string): Promise<{
101
+ success: boolean;
102
+ }>;
103
+ /**
104
+ * List stored BYOK providers.
105
+ */
106
+ listApiKeys(): Promise<{
107
+ providers: string[];
108
+ }>;
109
+ /**
110
+ * Claim earned revenue.
111
+ */
112
+ claimEarnings(): Promise<{
113
+ claimed: number;
114
+ txHash?: string;
115
+ }>;
116
+ /**
117
+ * Get earnings summary.
118
+ */
119
+ getEarnings(): Promise<EarningsSummary>;
120
+ /**
121
+ * Get revenue share configuration.
122
+ */
123
+ getRevenueConfig(): Promise<RevenueConfig>;
124
+ /**
125
+ * Set revenue share configuration.
126
+ *
127
+ * @param config - Revenue share percentages.
128
+ */
129
+ setRevenueConfig(config: Partial<RevenueConfig>): Promise<{
130
+ success: boolean;
131
+ }>;
132
+ /**
133
+ * Get distribution history.
134
+ *
135
+ * @param limit - Max entries to return.
136
+ */
137
+ getDistributionHistory(limit?: number): Promise<{
138
+ history: Array<Record<string, unknown>>;
139
+ }>;
140
+ }
141
+ //# sourceMappingURL=economy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"economy.d.ts","sourceRoot":"","sources":["../src/economy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;gBAEnC,UAAU,EAAE,iBAAiB;IAQzC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAgBxC;;;;OAIG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAIhE;;;;OAIG;IACG,QAAQ,CAAC,IAAI,SAAK,GAAG,OAAO,CAAC,YAAY,CAAC;IAOhD;;;;;OAKG;IACG,eAAe,CACnB,KAAK,SAAK,EACV,MAAM,SAAI,GACT,OAAO,CAAC;QAAE,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC;IAO5D;;;;OAIG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAUvE;;;;;OAKG;IACG,SAAS,CACb,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC;IAO3B;;;;;;;;OAQG;IACG,eAAe,CACnB,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC;IAO3B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAI7F;;;;;OAKG;IACG,mBAAmB,CACvB,KAAK,SAAK,EACV,MAAM,SAAI,GACT,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC;IAWvD;;;;;OAKG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAIhC;;;;OAIG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAInE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAQrD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAIpE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;IAW7C;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAWhD;;;;OAIG;IACG,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAIrF;;;;OAIG;IACG,sBAAsB,CAC1B,KAAK,SAAK,GACT,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC;CAUxD"}