@polpo-ai/server 0.15.76 → 0.15.78

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 (47) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/routes/completions/chat-handler.d.ts +10 -0
  6. package/dist/routes/completions/chat-handler.d.ts.map +1 -1
  7. package/dist/routes/completions/chat-handler.js +436 -436
  8. package/dist/routes/completions/chat-handler.js.map +1 -1
  9. package/dist/routes/completions/chat-via-run-handler.d.ts +2 -1
  10. package/dist/routes/completions/chat-via-run-handler.d.ts.map +1 -1
  11. package/dist/routes/completions/chat-via-run-handler.js +102 -91
  12. package/dist/routes/completions/chat-via-run-handler.js.map +1 -1
  13. package/dist/routes/completions/durable-stream.d.ts +41 -0
  14. package/dist/routes/completions/durable-stream.d.ts.map +1 -0
  15. package/dist/routes/completions/durable-stream.js +141 -0
  16. package/dist/routes/completions/durable-stream.js.map +1 -0
  17. package/dist/routes/completions/durable-stream.test.d.ts +2 -0
  18. package/dist/routes/completions/durable-stream.test.d.ts.map +1 -0
  19. package/dist/routes/completions/durable-stream.test.js +202 -0
  20. package/dist/routes/completions/durable-stream.test.js.map +1 -0
  21. package/dist/routes/completions/project-loop-runner.d.ts +6 -2
  22. package/dist/routes/completions/project-loop-runner.d.ts.map +1 -1
  23. package/dist/routes/completions/project-loop-runner.js +121 -113
  24. package/dist/routes/completions/project-loop-runner.js.map +1 -1
  25. package/dist/routes/completions/schemas.d.ts +12 -0
  26. package/dist/routes/completions/schemas.d.ts.map +1 -1
  27. package/dist/routes/completions/schemas.js +5 -0
  28. package/dist/routes/completions/schemas.js.map +1 -1
  29. package/dist/routes/completions/schemas.test.js +20 -0
  30. package/dist/routes/completions/schemas.test.js.map +1 -1
  31. package/dist/routes/completions-durable-delivery.test.d.ts +2 -0
  32. package/dist/routes/completions-durable-delivery.test.d.ts.map +1 -0
  33. package/dist/routes/completions-durable-delivery.test.js +154 -0
  34. package/dist/routes/completions-durable-delivery.test.js.map +1 -0
  35. package/dist/routes/completions.d.ts +13 -0
  36. package/dist/routes/completions.d.ts.map +1 -1
  37. package/dist/routes/completions.js +107 -5
  38. package/dist/routes/completions.js.map +1 -1
  39. package/dist/routes/run-delivery.d.ts +15 -0
  40. package/dist/routes/run-delivery.d.ts.map +1 -0
  41. package/dist/routes/run-delivery.js +202 -0
  42. package/dist/routes/run-delivery.js.map +1 -0
  43. package/dist/routes/run-delivery.test.d.ts +2 -0
  44. package/dist/routes/run-delivery.test.d.ts.map +1 -0
  45. package/dist/routes/run-delivery.test.js +124 -0
  46. package/dist/routes/run-delivery.test.js.map +1 -0
  47. package/package.json +7 -7
@@ -0,0 +1,141 @@
1
+ import { RunEventJournal, followRunEvents, } from "@polpo-ai/core/run-delivery-follower";
2
+ import { executeOwnedRun, } from "@polpo-ai/core/run-delivery-owner";
3
+ const DURABLE_WRITE_BATCH_SIZE = 128;
4
+ const DURABLE_WRITE_FLUSH_MS = 25;
5
+ export function createDurableCompletionWriter(runId, scope) {
6
+ const journal = new RunEventJournal(scope.eventStore, scope.notifier);
7
+ const pending = [];
8
+ let flushTimer;
9
+ let drainPromise;
10
+ let drainError;
11
+ const drain = () => {
12
+ if (drainError)
13
+ return Promise.reject(drainError);
14
+ if (drainPromise)
15
+ return drainPromise;
16
+ if (flushTimer)
17
+ clearTimeout(flushTimer);
18
+ flushTimer = undefined;
19
+ drainPromise = (async () => {
20
+ while (pending.length > 0) {
21
+ const batch = pending.splice(0, DURABLE_WRITE_BATCH_SIZE);
22
+ await journal.appendMany(runId, batch);
23
+ }
24
+ })().catch((error) => {
25
+ drainError = error;
26
+ throw error;
27
+ }).finally(() => {
28
+ drainPromise = undefined;
29
+ // A write can arrive after the drain observes an empty queue but before
30
+ // its promise settles. Make sure that tail is not left until finalization.
31
+ if (pending.length > 0 && !drainError)
32
+ scheduleDrain();
33
+ });
34
+ return drainPromise;
35
+ };
36
+ const scheduleDrain = () => {
37
+ if (flushTimer || drainPromise || drainError)
38
+ return;
39
+ flushTimer = setTimeout(() => {
40
+ flushTimer = undefined;
41
+ void drain().catch(() => undefined);
42
+ }, DURABLE_WRITE_FLUSH_MS);
43
+ };
44
+ const writer = {
45
+ write: async () => undefined,
46
+ writeSSE: (message) => {
47
+ if (drainError)
48
+ return Promise.reject(drainError);
49
+ pending.push({
50
+ type: message.data === "[DONE]" ? "response.done" : "response.chunk",
51
+ data: {
52
+ data: message.data,
53
+ ...(message.event === undefined ? {} : { event: message.event }),
54
+ ...(message.id === undefined ? {} : { id: message.id }),
55
+ },
56
+ });
57
+ if (message.data === "[DONE]"
58
+ || pending.length >= DURABLE_WRITE_BATCH_SIZE) {
59
+ return drain();
60
+ }
61
+ scheduleDrain();
62
+ return Promise.resolve();
63
+ },
64
+ async flush() {
65
+ if (flushTimer)
66
+ clearTimeout(flushTimer);
67
+ flushTimer = undefined;
68
+ while (pending.length > 0 || drainPromise)
69
+ await drain();
70
+ if (drainError)
71
+ throw drainError;
72
+ },
73
+ };
74
+ return writer;
75
+ }
76
+ export function startDurableCompletion(options) {
77
+ const journal = new RunEventJournal(options.scope.eventStore, options.scope.notifier);
78
+ return executeOwnedRun({
79
+ runId: options.runId,
80
+ owner: options.scope.owner,
81
+ token: options.scope.token,
82
+ journal,
83
+ leaseStore: options.scope.leaseStore,
84
+ cancellationStore: options.scope.cancellationStore,
85
+ producer: async ({ signal }) => {
86
+ const writer = createDurableCompletionWriter(options.runId, options.scope);
87
+ try {
88
+ await options.producer({ signal, writer });
89
+ }
90
+ finally {
91
+ await writer.flush();
92
+ }
93
+ },
94
+ });
95
+ }
96
+ export async function streamDurableCompletionFrames(options) {
97
+ let responseDone = false;
98
+ for await (const event of followRunEvents({
99
+ runId: options.runId,
100
+ store: options.scope.eventStore,
101
+ notifier: options.scope.notifier,
102
+ cursor: options.cursor,
103
+ signal: options.signal,
104
+ })) {
105
+ if (event.type === "response.chunk" || event.type === "response.done") {
106
+ const data = typeof event.data.data === "string" ? event.data.data : undefined;
107
+ if (data === undefined)
108
+ continue;
109
+ responseDone ||= event.type === "response.done";
110
+ await options.write({
111
+ data,
112
+ cursor: String(event.sequence),
113
+ ...(typeof event.data.event === "string" ? { event: event.data.event } : {}),
114
+ ...(typeof event.data.id === "string" ? { id: event.data.id } : {}),
115
+ });
116
+ continue;
117
+ }
118
+ if (event.type === "run.failed") {
119
+ const message = typeof event.data.message === "string"
120
+ ? event.data.message
121
+ : "Run execution failed";
122
+ await options.write({
123
+ event: "error",
124
+ cursor: String(event.sequence),
125
+ data: JSON.stringify({
126
+ error: {
127
+ message,
128
+ type: "model_error",
129
+ code: "model_request_failed",
130
+ },
131
+ }),
132
+ });
133
+ continue;
134
+ }
135
+ if (!responseDone && (event.type === "run.completed" || event.type === "run.cancelled")) {
136
+ responseDone = true;
137
+ await options.write({ data: "[DONE]", cursor: String(event.sequence) });
138
+ }
139
+ }
140
+ }
141
+ //# sourceMappingURL=durable-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-stream.js","sourceRoot":"","sources":["../../../src/routes/completions/durable-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=durable-stream.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-stream.test.d.ts","sourceRoot":"","sources":["../../../src/routes/completions/durable-stream.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,202 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { InMemoryRunCancellationStore, InMemoryRunEventStore, InMemoryRunExecutionLeaseStore, } from "@polpo-ai/core/run-delivery";
3
+ import { InMemoryRunEventNotifier } from "@polpo-ai/core/run-delivery-follower";
4
+ import { createDurableCompletionWriter, startDurableCompletion, streamDurableCompletionFrames, } from "./durable-stream.js";
5
+ function scope() {
6
+ return {
7
+ eventStore: new InMemoryRunEventStore(),
8
+ leaseStore: new InMemoryRunExecutionLeaseStore(),
9
+ cancellationStore: new InMemoryRunCancellationStore(),
10
+ notifier: new InMemoryRunEventNotifier(),
11
+ owner: "worker-a",
12
+ token: "token-a",
13
+ };
14
+ }
15
+ describe("durable completion stream", () => {
16
+ it("persists OpenAI frames and replays them without lifecycle internals", async () => {
17
+ const delivery = scope();
18
+ const execution = startDurableCompletion({
19
+ runId: "run-a",
20
+ scope: delivery,
21
+ producer: async ({ writer }) => {
22
+ await writer.writeSSE({ data: '{"choices":[{"delta":{"content":"hello"}}]}' });
23
+ await writer.writeSSE({ data: "[DONE]" });
24
+ },
25
+ });
26
+ const frames = [];
27
+ await streamDurableCompletionFrames({
28
+ runId: "run-a",
29
+ scope: delivery,
30
+ write: async (frame) => { frames.push(frame.data); },
31
+ });
32
+ await expect(execution).resolves.toEqual({ status: "completed" });
33
+ expect(frames).toEqual([
34
+ '{"choices":[{"delta":{"content":"hello"}}]}',
35
+ "[DONE]",
36
+ ]);
37
+ expect((await delivery.eventStore.listAfter("run-a")).events.map((event) => event.type)).toEqual([
38
+ "run.started",
39
+ "response.chunk",
40
+ "response.done",
41
+ "run.completed",
42
+ ]);
43
+ });
44
+ it("subscriber disconnect aborts only the follower while the producer completes", async () => {
45
+ const delivery = scope();
46
+ let releaseProducer;
47
+ const producerGate = new Promise((resolve) => { releaseProducer = resolve; });
48
+ let producerSignal;
49
+ const execution = startDurableCompletion({
50
+ runId: "run-a",
51
+ scope: delivery,
52
+ producer: async ({ writer, signal }) => {
53
+ producerSignal = signal;
54
+ await writer.writeSSE({ data: '{"chunk":1}' });
55
+ await producerGate;
56
+ await writer.writeSSE({ data: "[DONE]" });
57
+ },
58
+ });
59
+ const follower = new AbortController();
60
+ const frames = [];
61
+ const streaming = streamDurableCompletionFrames({
62
+ runId: "run-a",
63
+ scope: delivery,
64
+ signal: follower.signal,
65
+ write: async (frame) => {
66
+ frames.push(frame.data);
67
+ follower.abort();
68
+ },
69
+ });
70
+ await streaming;
71
+ expect(producerSignal?.aborted).toBe(false);
72
+ releaseProducer();
73
+ await expect(execution).resolves.toEqual({ status: "completed" });
74
+ expect(producerSignal?.aborted).toBe(false);
75
+ expect(frames).toEqual(['{"chunk":1}']);
76
+ });
77
+ it("serializes concurrent writer calls in invocation order", async () => {
78
+ const delivery = scope();
79
+ const appendMany = vi.spyOn(delivery.eventStore, "appendMany");
80
+ const writer = createDurableCompletionWriter("run-a", delivery);
81
+ await Promise.all([
82
+ writer.writeSSE({ data: "one" }),
83
+ writer.writeSSE({ data: "two" }),
84
+ writer.writeSSE({ data: "[DONE]" }),
85
+ ]);
86
+ const events = (await delivery.eventStore.listAfter("run-a")).events;
87
+ expect(events.map((event) => event.data.data)).toEqual(["one", "two", "[DONE]"]);
88
+ expect(appendMany).toHaveBeenCalledTimes(1);
89
+ });
90
+ it("persists large streams in bounded batches without losing frame order", async () => {
91
+ const delivery = scope();
92
+ const appendMany = vi.spyOn(delivery.eventStore, "appendMany");
93
+ const writer = createDurableCompletionWriter("run-a", delivery);
94
+ const writes = Array.from({ length: 300 }, (_, index) => writer.writeSSE({ data: `chunk-${index}` }));
95
+ await Promise.all(writes);
96
+ await writer.flush();
97
+ const events = [];
98
+ let cursor;
99
+ do {
100
+ const page = await delivery.eventStore.listAfter("run-a", cursor, 100);
101
+ events.push(...page.events);
102
+ cursor = page.hasMore ? page.nextCursor : undefined;
103
+ if (!page.hasMore)
104
+ break;
105
+ } while (cursor);
106
+ expect(events).toHaveLength(300);
107
+ expect(events.map((event) => event.data.data)).toEqual(Array.from({ length: 300 }, (_, index) => `chunk-${index}`));
108
+ expect(appendMany.mock.calls.length).toBeGreaterThanOrEqual(3);
109
+ expect(appendMany.mock.calls.length).toBeLessThanOrEqual(4);
110
+ expect(appendMany.mock.calls.every(([events]) => events.length <= 128)).toBe(true);
111
+ });
112
+ it("flushes a producer batch before appending the terminal lifecycle event", async () => {
113
+ const delivery = scope();
114
+ const appendMany = vi.spyOn(delivery.eventStore, "appendMany");
115
+ const execution = startDurableCompletion({
116
+ runId: "run-a",
117
+ scope: delivery,
118
+ producer: async ({ writer }) => {
119
+ await writer.writeSSE({ data: "one" });
120
+ await writer.writeSSE({ data: "two" });
121
+ },
122
+ });
123
+ await expect(execution).resolves.toEqual({ status: "completed" });
124
+ expect(appendMany).toHaveBeenCalledTimes(1);
125
+ expect((await delivery.eventStore.listAfter("run-a")).events.map((event) => event.type)).toEqual([
126
+ "run.started",
127
+ "response.chunk",
128
+ "response.chunk",
129
+ "run.completed",
130
+ ]);
131
+ });
132
+ it("surfaces a scheduled background flush failure at producer finalization", async () => {
133
+ const delivery = scope();
134
+ vi.spyOn(delivery.eventStore, "appendMany")
135
+ .mockRejectedValueOnce(new Error("event store unavailable"));
136
+ const execution = startDurableCompletion({
137
+ runId: "run-a",
138
+ scope: delivery,
139
+ producer: async ({ writer }) => {
140
+ await writer.writeSSE({ data: "one" });
141
+ await new Promise((resolve) => setTimeout(resolve, 40));
142
+ },
143
+ });
144
+ await expect(execution).resolves.toEqual({
145
+ status: "failed",
146
+ error: "event store unavailable",
147
+ });
148
+ expect((await delivery.eventStore.listAfter("run-a")).events.map((event) => event.type)).toEqual(["run.started", "run.failed"]);
149
+ });
150
+ it("projects unexpected producer failures to the initial subscriber", async () => {
151
+ const delivery = scope();
152
+ const execution = startDurableCompletion({
153
+ runId: "run-a",
154
+ scope: delivery,
155
+ producer: async () => { throw new Error("provider unavailable"); },
156
+ });
157
+ const frames = [];
158
+ await streamDurableCompletionFrames({
159
+ runId: "run-a",
160
+ scope: delivery,
161
+ write: async (frame) => {
162
+ frames.push({
163
+ data: frame.data,
164
+ ...(frame.event === undefined ? {} : { event: frame.event }),
165
+ });
166
+ },
167
+ });
168
+ await expect(execution).resolves.toEqual({
169
+ status: "failed",
170
+ error: "provider unavailable",
171
+ });
172
+ expect(frames).toEqual([{
173
+ event: "error",
174
+ data: JSON.stringify({
175
+ error: {
176
+ message: "provider unavailable",
177
+ type: "model_error",
178
+ code: "model_request_failed",
179
+ },
180
+ }),
181
+ }]);
182
+ });
183
+ it("emits a terminal frame when a producer completes without writing DONE", async () => {
184
+ const delivery = scope();
185
+ const execution = startDurableCompletion({
186
+ runId: "run-a",
187
+ scope: delivery,
188
+ producer: async ({ writer }) => {
189
+ await writer.writeSSE({ data: '{"choices":[]}' });
190
+ },
191
+ });
192
+ const frames = [];
193
+ await streamDurableCompletionFrames({
194
+ runId: "run-a",
195
+ scope: delivery,
196
+ write: async (frame) => { frames.push(frame.data); },
197
+ });
198
+ await expect(execution).resolves.toEqual({ status: "completed" });
199
+ expect(frames).toEqual(['{"choices":[]}', "[DONE]"]);
200
+ });
201
+ });
202
+ //# sourceMappingURL=durable-stream.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-stream.test.js","sourceRoot":"","sources":["../../../src/routes/completions/durable-stream.test.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ import type { LanguageModelUsage } from "ai";
11
11
  import type { CompletionRouteDeps, CompletionRuntimeInvocation } from "../completions.js";
12
12
  import { type CompletionResolvedModelInfo } from "./agent-step-runner.js";
13
13
  import { type LoopRuntimeToolCall } from "./tool-mapping.js";
14
+ import type { CompletionSseWriter } from "./chat-handler.js";
14
15
  export interface ProjectLoopRunResult {
15
16
  text: string;
16
17
  usage: LanguageModelUsage;
@@ -63,7 +64,7 @@ export declare function resumeProjectLoopRun(options: {
63
64
  * pipeline and adapts it to the OpenAI response surface (SSE stream with
64
65
  * tool_call / loop_trace chunks, or a single JSON body).
65
66
  */
66
- export declare function handleProjectLoopCompletion(c: any, options: {
67
+ export interface ProjectLoopCompletionOptions {
67
68
  deps: CompletionRouteDeps;
68
69
  body: {
69
70
  stream?: boolean;
@@ -84,5 +85,8 @@ export declare function handleProjectLoopCompletion(c: any, options: {
84
85
  runtimePlan?: RuntimePlan;
85
86
  executionRoute?: ResolvedExecutionRoute;
86
87
  activatedSkills?: readonly string[];
87
- }): Promise<any>;
88
+ }
89
+ export declare function handleProjectLoopCompletion(c: any, options: ProjectLoopCompletionOptions): Promise<any>;
90
+ /** Transport-independent loop producer used by attached and durable followers. */
91
+ export declare function executeStreamingProjectLoopCompletion(stream: CompletionSseWriter, options: ProjectLoopCompletionOptions, signal: AbortSignal): Promise<void>;
88
92
  //# sourceMappingURL=project-loop-runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-loop-runner.d.ts","sourceRoot":"","sources":["../../../src/routes/completions/project-loop-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-loop-runner.d.ts","sourceRoot":"","sources":["../../../src/routes/completions/project-loop-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAcL,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAE3B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,KAAK,EACV,mBAAmB,EACnB,2BAA2B,EAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,wBAAwB,CAAC;AAQhC,OAAO,EAA4C,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAMvG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,2BAA2B,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,SAAS,EAAE,GAAG,EAAE,CAAC;IACjB,OAAO,EAAE,UAAU,CAAC;IACpB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsHD;;;GAGG;AACH,wBAAsB,sCAAsC,CAC1D,IAAI,EAAE,mBAAmB,EACzB,GAAG,EAAE,aAAa,EAClB,UAAU,QAEJ,GACL,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAqB/C;AAED,wBAAsB,wBAAwB,CAAC,OAAO,EAAE;IACtD,IAAI,EAAE,mBAAmB,CAAC;IAC1B,WAAW,EAAE,GAAG,CAAC;IACjB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,uBAAuB,CAAC;IACvC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;IAChD,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoahC;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,GAAG,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EACtF,UAAU,EAAE,GAAG,EAAE,EACjB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,aAAa,EAAE,gBAAgB,EAAE,GAAG,SAAS,EAC7C,YAAY,GAAE,uBAA+B,EAC7C,eAAe,GAAE,SAAS,MAAM,EAAO,GACtC,eAAe,GAAG,SAAS,CAkB7B;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,aAAa,CAAC,CAiGzB;AAED;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE;QACJ,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,GAAG,CAAC;IACjB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,uBAAuB,CAAC;IACvC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;IAChD,YAAY,EAAE,GAAG,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,wBAAsB,2BAA2B,CAC/C,CAAC,EAAE,GAAG,EACN,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,CA2Bd;AAED,kFAAkF;AAClF,wBAAsB,qCAAqC,CACzD,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,4BAA4B,EACrC,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CAmIf"}