@shpitdev/convex-cliproxy-observability 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 (129) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +201 -0
  3. package/README.md +40 -0
  4. package/dist/capture/index.d.ts +79 -0
  5. package/dist/capture/index.d.ts.map +1 -0
  6. package/dist/capture/index.js +182 -0
  7. package/dist/capture/index.js.map +1 -0
  8. package/dist/client.d.ts +129 -0
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +232 -0
  11. package/dist/client.js.map +1 -0
  12. package/dist/component/_generated/api.d.ts +12 -0
  13. package/dist/component/_generated/api.d.ts.map +1 -0
  14. package/dist/component/_generated/api.js +7 -0
  15. package/dist/component/_generated/api.js.map +1 -0
  16. package/dist/component/_generated/component.d.ts +17 -0
  17. package/dist/component/_generated/component.d.ts.map +1 -0
  18. package/dist/component/_generated/component.js +3 -0
  19. package/dist/component/_generated/component.js.map +1 -0
  20. package/dist/component/_generated/dataModel.d.ts +8 -0
  21. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  22. package/dist/component/_generated/dataModel.js +3 -0
  23. package/dist/component/_generated/dataModel.js.map +1 -0
  24. package/dist/component/_generated/server.d.ts +21 -0
  25. package/dist/component/_generated/server.d.ts.map +1 -0
  26. package/dist/component/_generated/server.js +11 -0
  27. package/dist/component/_generated/server.js.map +1 -0
  28. package/dist/component/convex.config.d.ts +4 -0
  29. package/dist/component/convex.config.d.ts.map +1 -0
  30. package/dist/component/convex.config.js +4 -0
  31. package/dist/component/convex.config.js.map +1 -0
  32. package/dist/component/ingest.d.ts +64 -0
  33. package/dist/component/ingest.d.ts.map +1 -0
  34. package/dist/component/ingest.js +309 -0
  35. package/dist/component/ingest.js.map +1 -0
  36. package/dist/component/queries.d.ts +136 -0
  37. package/dist/component/queries.d.ts.map +1 -0
  38. package/dist/component/queries.js +219 -0
  39. package/dist/component/queries.js.map +1 -0
  40. package/dist/component/schema.d.ts +159 -0
  41. package/dist/component/schema.d.ts.map +1 -0
  42. package/dist/component/schema.js +74 -0
  43. package/dist/component/schema.js.map +1 -0
  44. package/dist/content/index.d.ts +8 -0
  45. package/dist/content/index.d.ts.map +1 -0
  46. package/dist/content/index.js +41 -0
  47. package/dist/content/index.js.map +1 -0
  48. package/dist/model-call/index.d.ts +120 -0
  49. package/dist/model-call/index.d.ts.map +1 -0
  50. package/dist/model-call/index.js +96 -0
  51. package/dist/model-call/index.js.map +1 -0
  52. package/dist/projection.d.ts +19 -0
  53. package/dist/projection.d.ts.map +1 -0
  54. package/dist/projection.js +83 -0
  55. package/dist/projection.js.map +1 -0
  56. package/dist/protocols/anthropic-messages.d.ts +11 -0
  57. package/dist/protocols/anthropic-messages.d.ts.map +1 -0
  58. package/dist/protocols/anthropic-messages.js +114 -0
  59. package/dist/protocols/anthropic-messages.js.map +1 -0
  60. package/dist/protocols/chat-completions.d.ts +10 -0
  61. package/dist/protocols/chat-completions.d.ts.map +1 -0
  62. package/dist/protocols/chat-completions.js +89 -0
  63. package/dist/protocols/chat-completions.js.map +1 -0
  64. package/dist/protocols/checkpoint.d.ts +20 -0
  65. package/dist/protocols/checkpoint.d.ts.map +1 -0
  66. package/dist/protocols/checkpoint.js +318 -0
  67. package/dist/protocols/checkpoint.js.map +1 -0
  68. package/dist/protocols/content.d.ts +34 -0
  69. package/dist/protocols/content.d.ts.map +1 -0
  70. package/dist/protocols/content.js +40 -0
  71. package/dist/protocols/content.js.map +1 -0
  72. package/dist/protocols/framing.d.ts +20 -0
  73. package/dist/protocols/framing.d.ts.map +1 -0
  74. package/dist/protocols/framing.js +67 -0
  75. package/dist/protocols/framing.js.map +1 -0
  76. package/dist/protocols/index.d.ts +20 -0
  77. package/dist/protocols/index.d.ts.map +1 -0
  78. package/dist/protocols/index.js +139 -0
  79. package/dist/protocols/index.js.map +1 -0
  80. package/dist/protocols/output.d.ts +4 -0
  81. package/dist/protocols/output.d.ts.map +1 -0
  82. package/dist/protocols/output.js +81 -0
  83. package/dist/protocols/output.js.map +1 -0
  84. package/dist/protocols/responses.d.ts +12 -0
  85. package/dist/protocols/responses.d.ts.map +1 -0
  86. package/dist/protocols/responses.js +189 -0
  87. package/dist/protocols/responses.js.map +1 -0
  88. package/dist/protocols/types.d.ts +27 -0
  89. package/dist/protocols/types.d.ts.map +1 -0
  90. package/dist/protocols/types.js +2 -0
  91. package/dist/protocols/types.js.map +1 -0
  92. package/dist/protocols/usage.d.ts +3 -0
  93. package/dist/protocols/usage.d.ts.map +1 -0
  94. package/dist/protocols/usage.js +27 -0
  95. package/dist/protocols/usage.js.map +1 -0
  96. package/dist/protocols/values.d.ts +10 -0
  97. package/dist/protocols/values.d.ts.map +1 -0
  98. package/dist/protocols/values.js +32 -0
  99. package/dist/protocols/values.js.map +1 -0
  100. package/dist/test.d.ts +155 -0
  101. package/dist/test.d.ts.map +1 -0
  102. package/dist/test.js +8 -0
  103. package/dist/test.js.map +1 -0
  104. package/package.json +90 -0
  105. package/src/capture/index.ts +277 -0
  106. package/src/client.ts +286 -0
  107. package/src/component/_generated/api.ts +19 -0
  108. package/src/component/_generated/component.ts +32 -0
  109. package/src/component/_generated/dataModel.ts +15 -0
  110. package/src/component/_generated/server.ts +43 -0
  111. package/src/component/convex.config.ts +3 -0
  112. package/src/component/ingest.ts +328 -0
  113. package/src/component/queries.ts +248 -0
  114. package/src/component/schema.ts +73 -0
  115. package/src/content/index.ts +53 -0
  116. package/src/model-call/index.ts +224 -0
  117. package/src/projection.ts +99 -0
  118. package/src/protocols/anthropic-messages.ts +115 -0
  119. package/src/protocols/chat-completions.ts +94 -0
  120. package/src/protocols/checkpoint.ts +342 -0
  121. package/src/protocols/content.ts +41 -0
  122. package/src/protocols/framing.ts +62 -0
  123. package/src/protocols/index.ts +140 -0
  124. package/src/protocols/output.ts +78 -0
  125. package/src/protocols/responses.ts +188 -0
  126. package/src/protocols/types.ts +26 -0
  127. package/src/protocols/usage.ts +36 -0
  128. package/src/protocols/values.ts +35 -0
  129. package/src/test.ts +16 -0
@@ -0,0 +1,318 @@
1
+ import { decodeBody } from "../capture/index.js";
2
+ import { assembleResponsesStream } from "./responses.js";
3
+ import { SSEReader } from "./framing.js";
4
+ import { count, list, nanoTime, object, parseObject } from "./values.js";
5
+ import { extractUsage } from "./usage.js";
6
+ const usageFields = [
7
+ "input_tokens",
8
+ "output_tokens",
9
+ "total_tokens",
10
+ "prompt_tokens",
11
+ "completion_tokens",
12
+ "cache_read_input_tokens",
13
+ "cache_creation_input_tokens",
14
+ ];
15
+ function boundedUsage(value) {
16
+ const raw = object(value);
17
+ const out = {};
18
+ for (const field of usageFields) {
19
+ if (count(raw[field]) !== undefined)
20
+ out[field] = raw[field];
21
+ }
22
+ for (const field of [
23
+ "input_tokens_details",
24
+ "output_tokens_details",
25
+ "prompt_tokens_details",
26
+ "completion_tokens_details",
27
+ "cache_creation",
28
+ ]) {
29
+ const detail = object(raw[field]);
30
+ const safe = {};
31
+ for (const name of [
32
+ "cached_tokens",
33
+ "reasoning_tokens",
34
+ "thinking_tokens",
35
+ "ephemeral_5m_input_tokens",
36
+ "ephemeral_1h_input_tokens",
37
+ ]) {
38
+ if (count(detail[name]) !== undefined)
39
+ safe[name] = detail[name];
40
+ }
41
+ if (Object.keys(safe).length)
42
+ out[field] = safe;
43
+ }
44
+ return out;
45
+ }
46
+ function semantic(event) {
47
+ const delta = object(event.delta);
48
+ return ([delta.text, delta.thinking, delta.partial_json].some((x) => typeof x === "string" && x.length > 0) ||
49
+ (typeof event.delta === "string" && event.delta.length > 0) ||
50
+ list(event.choices).some((c) => {
51
+ const d = object(object(c).delta);
52
+ return ([d.content, d.reasoning_content, d.reasoning].some((x) => typeof x === "string" && x.length > 0) || list(d.tool_calls).length > 0);
53
+ }));
54
+ }
55
+ function observeProtocol(call, state, event, stream) {
56
+ const protocol = call.clientProtocol;
57
+ const type = event.type;
58
+ if (stream && protocol === "responses") {
59
+ // Shared assembler determines whether the event vocabulary is supported; sequence
60
+ // validation belongs to selected-call content replay, not this scalar checkpoint.
61
+ if (assembleResponsesStream([event]).unsupported)
62
+ state.unsupported = true;
63
+ }
64
+ if (typeof event.model === "string")
65
+ call.responseModel = event.model.slice(0, 256);
66
+ if (protocol === "responses") {
67
+ const response = stream ? object(event.response) : event;
68
+ if (!stream ||
69
+ ["response.completed", "response.failed", "response.incomplete"].includes(String(type))) {
70
+ const status = String(response.status);
71
+ if (response.object !== "response" ||
72
+ typeof response.id !== "string" ||
73
+ !Array.isArray(response.output) ||
74
+ !["completed", "failed", "incomplete"].includes(status) ||
75
+ (stream && type !== `response.${status}`)) {
76
+ state.invalid = true;
77
+ return;
78
+ }
79
+ if (typeof response.model === "string")
80
+ call.responseModel = response.model.slice(0, 256);
81
+ state.terminal = status;
82
+ state.usage = response.usage === undefined ? undefined : boundedUsage(response.usage);
83
+ state.usageFinal = response.usage !== undefined;
84
+ call.finishReason = status;
85
+ }
86
+ else if (["response.created", "response.queued", "response.in_progress"].includes(String(type))) {
87
+ if (response.object !== "response" || typeof response.id !== "string")
88
+ state.invalid = true;
89
+ else if (typeof response.model === "string")
90
+ call.responseModel = response.model.slice(0, 256);
91
+ }
92
+ else if (type === "error") {
93
+ state.terminal = "failed";
94
+ state.usageFinal = false;
95
+ }
96
+ }
97
+ else if (protocol === "anthropic_messages") {
98
+ if (!stream || type === "message_start") {
99
+ const message = stream ? object(event.message) : event;
100
+ if (message.type !== "message" ||
101
+ typeof message.id !== "string" ||
102
+ !Array.isArray(message.content)) {
103
+ state.invalid = true;
104
+ return;
105
+ }
106
+ if (typeof message.model === "string")
107
+ call.responseModel = message.model.slice(0, 256);
108
+ state.usage = boundedUsage(message.usage);
109
+ if (!stream) {
110
+ state.terminal = "completed";
111
+ state.usageFinal = message.usage !== undefined;
112
+ call.finishReason =
113
+ typeof message.stop_reason === "string" ? message.stop_reason : undefined;
114
+ }
115
+ }
116
+ if (type === "message_delta") {
117
+ state.usage = { ...state.usage, ...boundedUsage(event.usage) };
118
+ const reason = object(event.delta).stop_reason;
119
+ state.usageFinal =
120
+ typeof reason === "string" && count(object(event.usage).output_tokens) !== undefined;
121
+ if (typeof reason === "string")
122
+ call.finishReason = reason;
123
+ }
124
+ if (type === "message_stop")
125
+ state.terminal = "completed";
126
+ if (type === "error") {
127
+ state.terminal = "failed";
128
+ state.usageFinal = false;
129
+ }
130
+ }
131
+ else if (protocol === "chat_completions") {
132
+ const choices = list(event.choices);
133
+ const finished = choices.every((x) => typeof object(x).finish_reason === "string");
134
+ if (choices.length) {
135
+ state.chatFinished = finished;
136
+ const reason = object(choices[0]).finish_reason;
137
+ if (typeof reason === "string")
138
+ call.finishReason = reason;
139
+ }
140
+ if (event.usage !== undefined) {
141
+ state.usage = boundedUsage(event.usage);
142
+ state.usageFinal = Array.isArray(event.choices) && finished;
143
+ }
144
+ if (!stream) {
145
+ state.terminal = event.error ? "failed" : finished ? "completed" : undefined;
146
+ state.usageFinal = state.terminal === "completed" && event.usage !== undefined;
147
+ }
148
+ if (event.error) {
149
+ state.terminal = "failed";
150
+ state.usageFinal = false;
151
+ }
152
+ }
153
+ }
154
+ export function applyObservation(call, state, o) {
155
+ if (o.sequence !== call.capture.projectedThroughSequence + 1)
156
+ throw new Error("projection sequence gap");
157
+ if (o.gap) {
158
+ state.rawGap = true;
159
+ if (!call.capture.gaps.includes(o.gap) && call.capture.gaps.length < 8)
160
+ call.capture.gaps.push(o.gap.slice(0, 128));
161
+ }
162
+ const body = decodeBody(o);
163
+ const decoder = new TextDecoder("utf-8", { fatal: true });
164
+ if (o.kind === "request") {
165
+ state.inputSeen = true;
166
+ if (o.requestedModel)
167
+ call.requestModel = o.requestedModel.slice(0, 256);
168
+ call.correlation = o.correlation ?? {};
169
+ call.correlationConflicts = o.correlationConflicts ?? [];
170
+ call.traceId = o.correlation?.traceId;
171
+ call.sourceTraceId = o.sourceTraceId;
172
+ try {
173
+ const input = parseObject(decoder.decode(body));
174
+ state.streamed = input.stream === true;
175
+ call.streamed = state.streamed;
176
+ }
177
+ catch {
178
+ state.invalid = true;
179
+ }
180
+ }
181
+ if (o.kind === "response" || o.kind === "stream_chunk" || o.kind === "completion") {
182
+ if (call.timeToFirstByteMs === undefined && (o.observedBodyBytes ?? body.length) > 0)
183
+ call.timeToFirstByteMs = o.offsetNs / 1e6;
184
+ try {
185
+ if (o.kind === "response" && body.length) {
186
+ const event = parseObject(decoder.decode(body));
187
+ if (call.operation === "generation")
188
+ observeProtocol(call, state, event, false);
189
+ else {
190
+ state.terminal = "completed";
191
+ if (call.operation === "token_count")
192
+ call.tokenCount = count(event.input_tokens);
193
+ }
194
+ }
195
+ if ((o.kind === "stream_chunk" || o.kind === "completion") && body.length) {
196
+ const reader = new SSEReader(state.sse);
197
+ for (const frame of reader.feed(body, o.observedAt)) {
198
+ if (frame.data === "[DONE]") {
199
+ if (call.clientProtocol === "chat_completions" && state.chatFinished)
200
+ state.terminal = "completed";
201
+ continue;
202
+ }
203
+ const event = parseObject(frame.data);
204
+ if (call.timeToFirstContentMs === undefined && semantic(event))
205
+ call.timeToFirstContentMs = o.offsetNs / 1e6;
206
+ observeProtocol(call, state, event, true);
207
+ }
208
+ state.sse = reader.checkpoint();
209
+ }
210
+ }
211
+ catch {
212
+ state.invalid = true;
213
+ }
214
+ }
215
+ if (o.kind === "completion") {
216
+ try {
217
+ if (new SSEReader(state.sse).finish().truncated)
218
+ state.invalid = true;
219
+ }
220
+ catch {
221
+ state.invalid = true;
222
+ }
223
+ delete state.sse;
224
+ delete state.sseBlob;
225
+ if (call.clientProtocol === "chat_completions" &&
226
+ state.chatFinished &&
227
+ o.completionOutcome === "succeeded")
228
+ state.terminal = "completed";
229
+ call.completionOutcome = o.completionOutcome;
230
+ call.executionStatusCode = o.executionStatusCode;
231
+ call.endTimeUnixNano = nanoTime(o.executionCompletedAt);
232
+ const start = nanoTime(o.executionStartedAt);
233
+ if (start)
234
+ call.startTimeUnixNano = start;
235
+ if (start && call.endTimeUnixNano)
236
+ call.latencyMs = Number(BigInt(call.endTimeUnixNano) - BigInt(start)) / 1e6;
237
+ call.capture.terminalSequence = o.sequence;
238
+ call.state =
239
+ o.completionOutcome === "canceled"
240
+ ? "aborted"
241
+ : o.completionOutcome === "failed"
242
+ ? "failed"
243
+ : o.completionOutcome === "rejected"
244
+ ? "rejected"
245
+ : state.terminal === "completed"
246
+ ? "succeeded"
247
+ : state.terminal === "failed" || state.terminal === "incomplete"
248
+ ? "failed"
249
+ : "unknown";
250
+ }
251
+ call.protocolTerminal = state.terminal;
252
+ const final = !!state.terminal && state.usageFinal && !state.invalid && !state.unsupported && !state.rawGap;
253
+ const projection = {
254
+ version: 1,
255
+ protocol: call.clientProtocol ?? "unknown",
256
+ requestState: "absent",
257
+ responseState: final ? "decoded" : "truncated",
258
+ scalars: {},
259
+ metadata: {},
260
+ };
261
+ if (state.usage && call.operation === "generation") {
262
+ extractUsage(projection, state.usage);
263
+ const measurements = [];
264
+ for (const field of usageFields) {
265
+ const value = count(state.usage[field]);
266
+ if (value !== undefined)
267
+ measurements.push({
268
+ value,
269
+ nativeField: field,
270
+ source: "client_protocol",
271
+ scope: "call",
272
+ unit: "tokens",
273
+ finality: final ? "final" : "partial",
274
+ semanticsVersion: String(projection.metadata.tokenSemantics),
275
+ });
276
+ }
277
+ for (const [key, detail] of Object.entries(state.usage)) {
278
+ if (!detail || typeof detail !== "object")
279
+ continue;
280
+ for (const [field, raw] of Object.entries(detail)) {
281
+ const value = count(raw);
282
+ if (value !== undefined)
283
+ measurements.push({
284
+ value,
285
+ nativeField: `${key}.${field}`,
286
+ source: "client_protocol",
287
+ scope: "call",
288
+ unit: "tokens",
289
+ finality: final ? "final" : "partial",
290
+ semanticsVersion: String(projection.metadata.tokenSemantics),
291
+ });
292
+ }
293
+ }
294
+ call.usage = measurements;
295
+ for (const field of [
296
+ "inputTokens",
297
+ "outputTokens",
298
+ "totalTokens",
299
+ "reasoningTokens",
300
+ "cachedInputTokens",
301
+ ])
302
+ call[field] = final ? projection.scalars[field] : undefined;
303
+ }
304
+ call.capture.lastObservedAt = o.observedAt;
305
+ call.capture.projectedThroughSequence = o.sequence;
306
+ call.capture.persistedThroughSequence = o.sequence;
307
+ call.capture.raw =
308
+ call.capture.terminalSequence === o.sequence && !state.rawGap ? "complete" : "partial";
309
+ call.capture.projection = state.invalid
310
+ ? "invalid"
311
+ : state.unsupported
312
+ ? "unsupported"
313
+ : state.terminal
314
+ ? "complete"
315
+ : "partial";
316
+ call.capture.usage = call.usage.length ? (final ? "complete" : "partial") : "unavailable";
317
+ }
318
+ //# sourceMappingURL=checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/protocols/checkpoint.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAsB,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAgB1C,MAAM,WAAW,GAAG;IAClB,cAAc;IACd,eAAe;IACf,cAAc;IACd,eAAe;IACf,mBAAmB;IACnB,yBAAyB;IACzB,6BAA6B;CACrB,CAAC;AACX,SAAS,YAAY,CAAC,KAAc;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IACD,KAAK,MAAM,KAAK,IAAI;QAClB,sBAAsB;QACtB,uBAAuB;QACvB,uBAAuB;QACvB,2BAA2B;QAC3B,gBAAgB;KACjB,EAAE,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAClC,MAAM,IAAI,GAAgB,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI;YACjB,eAAe;YACf,kBAAkB;YAClB,iBAAiB;YACjB,2BAA2B;YAC3B,2BAA2B;SAC5B,EAAE,CAAC;YACF,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,SAAS;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;YAAE,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AACD,SAAS,QAAQ,CAAC,KAAkB;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,CACL,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CACnD,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAC7C;QACD,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,CACL,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAC7C,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CACnC,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AACD,SAAS,eAAe,CACtB,IAAiB,EACjB,KAA2B,EAC3B,KAAkB,EAClB,MAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,MAAM,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QACvC,kFAAkF;QAClF,kFAAkF;QAClF,IAAI,uBAAuB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW;YAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAAE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpF,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACzD,IACE,CAAC,MAAM;YACP,CAAC,oBAAoB,EAAE,iBAAiB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EACvF,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvC,IACE,QAAQ,CAAC,MAAM,KAAK,UAAU;gBAC9B,OAAO,QAAQ,CAAC,EAAE,KAAK,QAAQ;gBAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC/B,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACvD,CAAC,MAAM,IAAI,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC,EACzC,CAAC;gBACD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;gBAAE,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC1F,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC;YACxB,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtF,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC;YAChD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC7B,CAAC;aAAM,IACL,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EACtF,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,QAAQ,CAAC,EAAE,KAAK,QAAQ;gBAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;iBACvF,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;gBACzC,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC1B,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,oBAAoB,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACvD,IACE,OAAO,CAAC,IAAI,KAAK,SAAS;gBAC1B,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;gBAC9B,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAC/B,CAAC;gBACD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;gBAAE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACxF,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAC;gBAC7B,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC;gBAC/C,IAAI,CAAC,YAAY;oBACf,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9E,CAAC;QACH,CAAC;QACD,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAC7B,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC;YAC/C,KAAK,CAAC,UAAU;gBACd,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,KAAK,SAAS,CAAC;YACvF,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC7D,CAAC;QACD,IAAI,IAAI,KAAK,cAAc;YAAE,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAC;QAC1D,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC1B,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,kBAAkB,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC;QACnF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,CAAC,YAAY,GAAG,QAAQ,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAChD,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC7D,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACxC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7E,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,QAAQ,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC;QACjF,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC1B,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AACD,MAAM,UAAU,gBAAgB,CAC9B,IAAiB,EACjB,KAA2B,EAC3B,CAAuB;IAEvB,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,CAAC,wBAAwB,GAAG,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QACV,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YACpE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACzB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,CAAC,cAAc;YAAE,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACzE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC,oBAAoB,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC;QACtC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC;YACvC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAClF,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAClF,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC;QAC5C,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChD,IAAI,IAAI,CAAC,SAAS,KAAK,YAAY;oBAAE,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;qBAC3E,CAAC;oBACJ,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAC;oBAC7B,IAAI,IAAI,CAAC,SAAS,KAAK,aAAa;wBAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACpF,CAAC;YACH,CAAC;YACD,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC1E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;oBACpD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC5B,IAAI,IAAI,CAAC,cAAc,KAAK,kBAAkB,IAAI,KAAK,CAAC,YAAY;4BAClE,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAC;wBAC/B,SAAS;oBACX,CAAC;oBACD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACtC,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC;wBAC5D,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC;oBAC/C,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC5C,CAAC;gBACD,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS;gBAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC;QACjB,OAAO,KAAK,CAAC,OAAO,CAAC;QACrB,IACE,IAAI,CAAC,cAAc,KAAK,kBAAkB;YAC1C,KAAK,CAAC,YAAY;YAClB,CAAC,CAAC,iBAAiB,KAAK,WAAW;YAEnC,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,iBAAiB,CAAC;QAC7C,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC,mBAAmB,CAAC;QACjD,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC7C,IAAI,KAAK;YAAE,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC1C,IAAI,KAAK,IAAI,IAAI,CAAC,eAAe;YAC/B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC;QAC9E,IAAI,CAAC,OAAO,CAAC,gBAAgB,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC3C,IAAI,CAAC,KAAK;YACR,CAAC,CAAC,iBAAiB,KAAK,UAAU;gBAChC,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,CAAC,CAAC,iBAAiB,KAAK,QAAQ;oBAChC,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,CAAC,CAAC,iBAAiB,KAAK,UAAU;wBAClC,CAAC,CAAC,UAAU;wBACZ,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,WAAW;4BAC9B,CAAC,CAAC,WAAW;4BACb,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,YAAY;gCAC9D,CAAC,CAAC,QAAQ;gCACV,CAAC,CAAC,SAAS,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAAC;IACvC,MAAM,KAAK,GACT,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAChG,MAAM,UAAU,GAAuB;QACrC,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;QAC1C,YAAY,EAAE,QAAQ;QACtB,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;QAC9C,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;KACb,CAAC;IACF,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,YAAY,EAAE,CAAC;QACnD,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,YAAY,GAAuB,EAAE,CAAC;QAC5C,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,IAAI,KAAK,KAAK,SAAS;gBACrB,YAAY,CAAC,IAAI,CAAC;oBAChB,KAAK;oBACL,WAAW,EAAE,KAAK;oBAClB,MAAM,EAAE,iBAAiB;oBACzB,KAAK,EAAE,MAAM;oBACb,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;oBACrC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC;iBAC7D,CAAC,CAAC;QACP,CAAC;QACD,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,SAAS;YACpD,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBACzB,IAAI,KAAK,KAAK,SAAS;oBACrB,YAAY,CAAC,IAAI,CAAC;wBAChB,KAAK;wBACL,WAAW,EAAE,GAAG,GAAG,IAAI,KAAK,EAAE;wBAC9B,MAAM,EAAE,iBAAiB;wBACzB,KAAK,EAAE,MAAM;wBACb,IAAI,EAAE,QAAQ;wBACd,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;wBACrC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC;qBAC7D,CAAC,CAAC;YACP,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;QAC1B,KAAK,MAAM,KAAK,IAAI;YAClB,aAAa;YACb,cAAc;YACd,aAAa;YACb,iBAAiB;YACjB,mBAAmB;SACX;YACR,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC,UAAU,CAAC;IAC3C,IAAI,CAAC,OAAO,CAAC,wBAAwB,GAAG,CAAC,CAAC,QAAQ,CAAC;IACnD,IAAI,CAAC,OAAO,CAAC,wBAAwB,GAAG,CAAC,CAAC,QAAQ,CAAC;IACnD,IAAI,CAAC,OAAO,CAAC,GAAG;QACd,IAAI,CAAC,OAAO,CAAC,gBAAgB,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO;QACrC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,KAAK,CAAC,WAAW;YACjB,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,KAAK,CAAC,QAAQ;gBACd,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,SAAS,CAAC;IAClB,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AAC5F,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { z } from "zod";
2
+ declare const output: z.ZodObject<{
3
+ format: z.ZodLiteral<"cliproxy_response_v1">;
4
+ protocol: z.ZodEnum<{
5
+ anthropic_messages: "anthropic_messages";
6
+ responses: "responses";
7
+ chat_completions: "chat_completions";
8
+ }>;
9
+ completion: z.ZodString;
10
+ reasoning: z.ZodString;
11
+ messages: z.ZodArray<z.ZodObject<{
12
+ role: z.ZodOptional<z.ZodString>;
13
+ content: z.ZodOptional<z.ZodUnknown>;
14
+ tool_call_id: z.ZodOptional<z.ZodString>;
15
+ tool_calls: z.ZodOptional<z.ZodArray<z.ZodObject<{
16
+ id: z.ZodString;
17
+ type: z.ZodLiteral<"function">;
18
+ function: z.ZodObject<{
19
+ name: z.ZodString;
20
+ arguments: z.ZodString;
21
+ }, z.core.$strip>;
22
+ }, z.core.$strip>>>;
23
+ }, z.core.$loose>>;
24
+ native: z.ZodRecord<z.ZodString, z.ZodUnknown>;
25
+ }, z.core.$strip>;
26
+ export type CliproxyOutput = z.infer<typeof output>;
27
+ export declare function decodeCliproxyOutput(raw?: string): {
28
+ state: "absent" | "invalid" | "unsupported" | "truncated";
29
+ } | {
30
+ state: "decoded";
31
+ content: CliproxyOutput;
32
+ };
33
+ export {};
34
+ //# sourceMappingURL=content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/protocols/content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;iBAOV,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;AACpD,wBAAgB,oBAAoB,CAClC,GAAG,CAAC,EAAE,MAAM,GAEV;IAAE,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAA;CAAE,GAC7D;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,CAahD"}
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ const toolCall = z.object({
3
+ id: z.string(),
4
+ type: z.literal("function"),
5
+ function: z.object({ name: z.string(), arguments: z.string() }),
6
+ });
7
+ const message = z
8
+ .object({
9
+ role: z.string().optional(),
10
+ content: z.unknown().optional(),
11
+ tool_call_id: z.string().optional(),
12
+ tool_calls: z.array(toolCall).optional(),
13
+ })
14
+ .loose();
15
+ const output = z.object({
16
+ format: z.literal("cliproxy_response_v1"),
17
+ protocol: z.enum(["chat_completions", "anthropic_messages", "responses"]),
18
+ completion: z.string(),
19
+ reasoning: z.string(),
20
+ messages: z.array(message),
21
+ native: z.record(z.string(), z.unknown()),
22
+ });
23
+ export function decodeCliproxyOutput(raw) {
24
+ if (raw === undefined)
25
+ return { state: "absent" };
26
+ let value;
27
+ try {
28
+ value = JSON.parse(raw);
29
+ }
30
+ catch {
31
+ return { state: "invalid" };
32
+ }
33
+ if (!value || typeof value !== "object" || Array.isArray(value))
34
+ return { state: "unsupported" };
35
+ if (!("format" in value) || value.format !== "cliproxy_response_v1")
36
+ return { state: "unsupported" };
37
+ const parsed = output.safeParse(value);
38
+ return parsed.success ? { state: "decoded", content: parsed.data } : { state: "invalid" };
39
+ }
40
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/protocols/content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC;IACxB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;CAChE,CAAC,CAAC;AACH,MAAM,OAAO,GAAG,CAAC;KACd,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;CACzC,CAAC;KACD,KAAK,EAAE,CAAC;AACX,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,WAAW,CAAC,CAAC;IACzE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;CAC1C,CAAC,CAAC;AAEH,MAAM,UAAU,oBAAoB,CAClC,GAAY;IAIZ,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClD,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IACjG,IAAI,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,sBAAsB;QACjE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC5F,CAAC"}
@@ -0,0 +1,20 @@
1
+ /** Incremental SSE framing. Times belong to the observation containing the final byte. */
2
+ export type SSEFrame = {
3
+ data: string;
4
+ event?: string;
5
+ observedAt?: string;
6
+ };
7
+ export type SSECheckpoint = {
8
+ pendingBase64: string;
9
+ };
10
+ export declare class SSEReader {
11
+ private maxBytes;
12
+ private pending;
13
+ constructor(checkpoint?: SSECheckpoint, maxBytes?: number);
14
+ feed(bytes: Uint8Array, observedAt?: string): SSEFrame[];
15
+ finish(): {
16
+ truncated: boolean;
17
+ };
18
+ checkpoint(): SSECheckpoint;
19
+ }
20
+ //# sourceMappingURL=framing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framing.d.ts","sourceRoot":"","sources":["../../src/protocols/framing.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC7E,MAAM,MAAM,aAAa,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AACtD,qBAAa,SAAS;IAIlB,OAAO,CAAC,QAAQ;IAHlB,OAAO,CAAC,OAAO,CAAa;gBAE1B,UAAU,GAAE,aAAqC,EACzC,QAAQ,SAAc;IAKhC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE;IAuCxD,MAAM,IAAI;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE;IAKhC,UAAU,IAAI,aAAa;CAK5B"}
@@ -0,0 +1,67 @@
1
+ export class SSEReader {
2
+ maxBytes;
3
+ pending;
4
+ constructor(checkpoint = { pendingBase64: "" }, maxBytes = 1024 * 1024) {
5
+ this.maxBytes = maxBytes;
6
+ this.pending = Uint8Array.from(atob(checkpoint.pendingBase64), (c) => c.charCodeAt(0));
7
+ if (this.pending.length > maxBytes)
8
+ throw new Error("SSE frame limit");
9
+ }
10
+ feed(bytes, observedAt) {
11
+ const combined = new Uint8Array(this.pending.length + bytes.length);
12
+ combined.set(this.pending);
13
+ combined.set(bytes, this.pending.length);
14
+ const frames = [];
15
+ let start = 0;
16
+ for (let i = 0; i < combined.length; i++) {
17
+ const delimiter = combined[i] === 13 &&
18
+ combined[i + 1] === 10 &&
19
+ combined[i + 2] === 13 &&
20
+ combined[i + 3] === 10
21
+ ? 4
22
+ : combined[i] === 10 && combined[i + 1] === 10
23
+ ? 2
24
+ : combined[i] === 13 && combined[i + 1] === 13
25
+ ? 2
26
+ : 0;
27
+ if (i - start > this.maxBytes)
28
+ throw new Error("SSE frame limit");
29
+ if (!delimiter)
30
+ continue;
31
+ const block = new TextDecoder("utf-8", { fatal: true }).decode(combined.subarray(start, i));
32
+ const data = [];
33
+ let event;
34
+ for (const line of block.split(/\r\n|\r|\n/)) {
35
+ if (line.startsWith(":"))
36
+ continue;
37
+ const colon = line.indexOf(":");
38
+ const field = colon < 0 ? line : line.slice(0, colon);
39
+ const value = (colon < 0 ? "" : line.slice(colon + 1)).replace(/^ /, "");
40
+ if (field === "data")
41
+ data.push(value);
42
+ else if (field === "event")
43
+ event = value;
44
+ }
45
+ if (data.length)
46
+ frames.push({ data: data.join("\n"), event, observedAt });
47
+ i += delimiter - 1;
48
+ start = i + 1;
49
+ }
50
+ this.pending = combined.slice(start);
51
+ if (this.pending.length > this.maxBytes)
52
+ throw new Error("SSE frame limit");
53
+ return frames;
54
+ }
55
+ finish() {
56
+ return {
57
+ truncated: new TextDecoder("utf-8", { fatal: true }).decode(this.pending).trim().length > 0,
58
+ };
59
+ }
60
+ checkpoint() {
61
+ let raw = "";
62
+ for (const byte of this.pending)
63
+ raw += String.fromCharCode(byte);
64
+ return { pendingBase64: btoa(raw) };
65
+ }
66
+ }
67
+ //# sourceMappingURL=framing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framing.js","sourceRoot":"","sources":["../../src/protocols/framing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { assembleResponsesStream } from "./responses.js";
2
+ import { assembleChatStream } from "./chat-completions.js";
3
+ import { assembleAnthropicStream } from "./anthropic-messages.js";
4
+ import type { CliproxyProjection } from "./types.js";
5
+ export { SSEReader } from "./framing.js";
6
+ export type { SSEFrame, SSECheckpoint } from "./framing.js";
7
+ export type { CliproxyProjection, ProjectionState } from "./types.js";
8
+ export { assembleResponsesStream, assembleChatStream, assembleAnthropicStream };
9
+ export { nanoTime } from "./values.js";
10
+ export declare const PARSER_VERSION = "client-protocol-v1";
11
+ export declare function protocolForRoute(route: string): CliproxyProjection["protocol"];
12
+ /** Bounded replay helper for fixtures and selected-call export; never fetches data itself. */
13
+ export declare function projectCapturedPayloads(args: {
14
+ route: string;
15
+ request?: Uint8Array;
16
+ response?: Uint8Array;
17
+ chunks?: readonly Uint8Array[];
18
+ complete?: boolean;
19
+ }): CliproxyProjection;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protocols/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAIlE,OAAO,KAAK,EAAE,kBAAkB,EAAe,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5D,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,eAAO,MAAM,cAAc,uBAAuB,CAAC;AACnD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAM9E;AACD,8FAA8F;AAC9F,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,MAAM,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,kBAAkB,CAgHrB"}