stitchkit 0.107.0 → 0.108.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.
Files changed (102) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/README.md +2 -0
  3. package/darwin-native.cjs +1 -0
  4. package/dist/agent-runtime/sandbox-process-owner.d.ts +3 -3
  5. package/dist/agent-runtime/sandbox-process-owner.d.ts.map +1 -1
  6. package/dist/agent-runtime/sandbox-process.d.ts +2 -2
  7. package/dist/agent-runtime/sandbox-process.d.ts.map +1 -1
  8. package/dist/agent-runtime/store-conformance-support.d.ts +5 -5
  9. package/dist/browser/stream.d.ts +38 -12
  10. package/dist/browser/stream.d.ts.map +1 -1
  11. package/dist/entrypoints/agent-runtime/coding-tools.js +2 -2
  12. package/dist/entrypoints/agent-runtime/sandbox.js +2 -2
  13. package/dist/entrypoints/application/diagnostic-journal.js +2 -2
  14. package/dist/entrypoints/application/directory-inbox.js +4 -4
  15. package/dist/entrypoints/bin/upgrade-cli.d.ts +32 -0
  16. package/dist/entrypoints/bin/upgrade-cli.d.ts.map +1 -1
  17. package/dist/entrypoints/bin/upgrade-cli.js +451 -8
  18. package/dist/entrypoints/cli/publish.js +3 -3
  19. package/dist/entrypoints/files/packaging.d.ts +3 -1
  20. package/dist/entrypoints/files/packaging.d.ts.map +1 -1
  21. package/dist/entrypoints/files/packaging.js +105 -41
  22. package/dist/entrypoints/files.js +3 -3
  23. package/dist/entrypoints/index.d.ts +1 -1
  24. package/dist/entrypoints/index.d.ts.map +1 -1
  25. package/dist/entrypoints/index.js +7 -1
  26. package/dist/entrypoints/process.js +2 -2
  27. package/dist/entrypoints/remote.js +1 -1
  28. package/dist/entrypoints/server.js +4 -4
  29. package/dist/entrypoints/telegram/screens.js +1 -1
  30. package/dist/entrypoints/telegram.d.ts +2 -0
  31. package/dist/entrypoints/telegram.d.ts.map +1 -1
  32. package/dist/entrypoints/telegram.js +337 -3
  33. package/dist/entrypoints/testing.d.ts +1 -0
  34. package/dist/entrypoints/testing.d.ts.map +1 -1
  35. package/dist/entrypoints/testing.js +131 -1
  36. package/dist/files/native-artifact.d.ts +14 -0
  37. package/dist/files/native-artifact.d.ts.map +1 -0
  38. package/dist/files/native-packaging-layout.d.ts +5 -0
  39. package/dist/files/native-packaging-layout.d.ts.map +1 -1
  40. package/dist/files/native-packaging-plugin.d.ts +53 -0
  41. package/dist/files/native-packaging-plugin.d.ts.map +1 -0
  42. package/dist/files/native-packaging.d.ts +1 -35
  43. package/dist/files/native-packaging.d.ts.map +1 -1
  44. package/dist/index-a5qr2rj6.js +26 -0
  45. package/dist/{index-7r74re56.js → index-bh2ht9y5.js} +12 -6
  46. package/dist/{index-dwf0gymy.js → index-e35py42g.js} +1 -1
  47. package/dist/{index-4q9jvqg7.js → index-epg514ys.js} +182 -13
  48. package/dist/{index-mbf4h8kp.js → index-nx49x0tw.js} +1 -1
  49. package/dist/{index-zsqt5q98.js → index-p5kx5vqd.js} +209 -54
  50. package/dist/{index-bnf8s6v3.js → index-t2bsd0hm.js} +1 -1
  51. package/dist/{index-4f37d3bg.js → index-w9mqgnz9.js} +1 -1
  52. package/dist/{index-e05cjgtf.js → index-xvj9h8yh.js} +28 -1
  53. package/dist/internal/bounded-lines.d.ts +46 -2
  54. package/dist/internal/bounded-lines.d.ts.map +1 -1
  55. package/dist/internal/process-identity.d.ts.map +1 -1
  56. package/dist/internal/until-aborted.d.ts +9 -0
  57. package/dist/internal/until-aborted.d.ts.map +1 -0
  58. package/dist/internal/upgrade-affects.d.ts +58 -0
  59. package/dist/internal/upgrade-affects.d.ts.map +1 -0
  60. package/dist/internal/upgrade-plan.d.ts +20 -0
  61. package/dist/internal/upgrade-plan.d.ts.map +1 -1
  62. package/dist/internal/upgrade-usage.d.ts +61 -0
  63. package/dist/internal/upgrade-usage.d.ts.map +1 -0
  64. package/dist/process/bun-child.d.ts +38 -0
  65. package/dist/process/bun-child.d.ts.map +1 -0
  66. package/dist/process/command-owner.d.ts +2 -2
  67. package/dist/process/command-owner.d.ts.map +1 -1
  68. package/dist/process/launch.d.ts +2 -2
  69. package/dist/process/launch.d.ts.map +1 -1
  70. package/dist/process/owned-child.d.ts +2 -1
  71. package/dist/process/owned-child.d.ts.map +1 -1
  72. package/dist/telegram/bot-api.d.ts +10 -4
  73. package/dist/telegram/bot-api.d.ts.map +1 -1
  74. package/dist/telegram/broadcast.d.ts +2 -1
  75. package/dist/telegram/broadcast.d.ts.map +1 -1
  76. package/dist/telegram/not-dispatched.d.ts +26 -0
  77. package/dist/telegram/not-dispatched.d.ts.map +1 -0
  78. package/dist/telegram/operator-channel.d.ts +2 -1
  79. package/dist/telegram/operator-channel.d.ts.map +1 -1
  80. package/dist/telegram/send-failure.d.ts +4 -3
  81. package/dist/telegram/send-failure.d.ts.map +1 -1
  82. package/dist/telegram/transport-connect.d.ts +38 -0
  83. package/dist/telegram/transport-connect.d.ts.map +1 -0
  84. package/dist/telegram/transport.d.ts +43 -0
  85. package/dist/telegram/transport.d.ts.map +1 -0
  86. package/dist/telegram/webhook.d.ts +2 -1
  87. package/dist/telegram/webhook.d.ts.map +1 -1
  88. package/dist/testing/manual-clock.d.ts +82 -0
  89. package/dist/testing/manual-clock.d.ts.map +1 -0
  90. package/llms/files-packaging.txt +4 -1
  91. package/llms/process.txt +19 -5
  92. package/llms/stitchkit.2.txt +211 -628
  93. package/llms/stitchkit.txt +635 -10
  94. package/llms/telegram.txt +36 -3
  95. package/llms/testing.txt +47 -0
  96. package/llms/{upgrading-0.98.0-0.107.0.txt → upgrading-0.100.0-0.108.0.txt} +59 -64
  97. package/llms/{upgrading-0.72.0-0.97.0.txt → upgrading-0.72.0-0.99.0.txt} +64 -3
  98. package/llms/upgrading.txt +34 -2
  99. package/llms-full.txt +246 -17
  100. package/llms.txt +8 -8
  101. package/package.json +1 -1
  102. package/llms/stitchkit.3.txt +0 -177
@@ -14,6 +14,10 @@ import {
14
14
  withUploadProgress,
15
15
  parseApiErrorBody
16
16
  } from "./index-7jvwrjqa.js";
17
+ import {
18
+ abortReason,
19
+ untilAborted
20
+ } from "./index-a5qr2rj6.js";
17
21
  import {
18
22
  inputIsQuery
19
23
  } from "./index-xhzq2qvj.js";
@@ -32,108 +36,259 @@ import {
32
36
 
33
37
  // src/internal/bounded-lines.ts
34
38
  var DEFAULT_STREAM_LINE_BYTES = 1024 * 1024;
39
+
40
+ class StreamLineLimitError2 extends RangeError {
41
+ limitBytes;
42
+ lineBytes;
43
+ name = "StreamLineLimitError";
44
+ constructor(limitBytes, lineBytes) {
45
+ super(`Stream line exceeds the ${limitBytes} byte limit (${lineBytes} bytes so far)`);
46
+ this.limitBytes = limitBytes;
47
+ this.lineBytes = lineBytes;
48
+ }
49
+ }
50
+
51
+ class StreamTruncatedLineError2 extends SyntaxError {
52
+ lineBytes;
53
+ name = "StreamTruncatedLineError";
54
+ constructor(lineBytes) {
55
+ super(`Stream ended with an unterminated final line (${lineBytes} bytes)`);
56
+ this.lineBytes = lineBytes;
57
+ }
58
+ }
35
59
  function lineLimit(value) {
36
60
  const resolved = value ?? DEFAULT_STREAM_LINE_BYTES;
37
61
  assertPositiveSafeInteger("maxLineBytes", resolved);
38
62
  return resolved;
39
63
  }
40
- function joinBytes(left, right) {
41
- if (left.byteLength === 0)
42
- return right.slice();
43
- const result = new Uint8Array(left.byteLength + right.byteLength);
44
- result.set(left);
45
- result.set(right, left.byteLength);
46
- return result;
47
- }
48
- async function* readBoundedUtf8Lines(response, maxLineBytes, requireFinalNewline = false) {
49
- const reader = response.body?.getReader();
50
- if (!reader)
51
- return;
64
+ function createLineSplitter(maxLineBytes, requireFinalNewline = false) {
52
65
  const limit = lineLimit(maxLineBytes);
53
66
  const decoder = new TextDecoder("utf-8", { fatal: true });
54
- let pending = new Uint8Array;
55
- try {
56
- for (;; ) {
57
- const chunk = await reader.read();
58
- if (chunk.done)
59
- break;
67
+ let parts = [];
68
+ let pendingBytes = 0;
69
+ let ended = false;
70
+ let failed = false;
71
+ const drop = () => {
72
+ parts = [];
73
+ pendingBytes = 0;
74
+ };
75
+ const retain = (bytes) => {
76
+ if (bytes.byteLength === 0)
77
+ return;
78
+ pendingBytes += bytes.byteLength;
79
+ if (pendingBytes > limit) {
80
+ const seen = pendingBytes;
81
+ drop();
82
+ throw new StreamLineLimitError2(limit, seen);
83
+ }
84
+ parts.push(new Uint8Array(bytes));
85
+ };
86
+ const take = () => {
87
+ const line = new Uint8Array(pendingBytes);
88
+ let at = 0;
89
+ for (const part of parts) {
90
+ line.set(part, at);
91
+ at += part.byteLength;
92
+ }
93
+ drop();
94
+ return decoder.decode(line);
95
+ };
96
+ function* lines(chunk) {
97
+ if (ended)
98
+ throw new Error("Line decoder received bytes after end()");
99
+ if (failed)
100
+ throw new Error("Line decoder stopped at an earlier error; read the source again");
101
+ try {
60
102
  let start = 0;
61
- for (let index = 0;index < chunk.value.byteLength; index += 1) {
62
- if (chunk.value[index] !== 10)
63
- continue;
64
- const lineBytes = joinBytes(pending, chunk.value.slice(start, index));
65
- if (lineBytes.byteLength > limit) {
66
- throw new RangeError(`Stream line exceeds the ${limit} byte limit`);
67
- }
68
- yield decoder.decode(lineBytes);
69
- pending = new Uint8Array;
103
+ for (let index = chunk.indexOf(10);index !== -1; index = chunk.indexOf(10, start)) {
104
+ retain(chunk.subarray(start, index));
105
+ yield take();
70
106
  start = index + 1;
71
107
  }
72
- pending = joinBytes(pending, chunk.value.slice(start));
73
- if (pending.byteLength > limit) {
74
- throw new RangeError(`Stream line exceeds the ${limit} byte limit`);
75
- }
108
+ retain(chunk.subarray(start));
109
+ } catch (error) {
110
+ failed = true;
111
+ throw error;
76
112
  }
77
- if (pending.byteLength > 0) {
113
+ }
114
+ return {
115
+ lines,
116
+ push: (chunk) => [...lines(chunk)],
117
+ end() {
118
+ ended = true;
119
+ if (pendingBytes === 0)
120
+ return [];
78
121
  if (requireFinalNewline) {
79
- throw new SyntaxError("Stream ended with an unterminated final line");
122
+ const seen = pendingBytes;
123
+ drop();
124
+ throw new StreamTruncatedLineError2(seen);
125
+ }
126
+ return [take()];
127
+ }
128
+ };
129
+ }
130
+ function createBoundedLineDecoder(maxLineBytes, requireFinalNewline = false) {
131
+ const { push, end } = createLineSplitter(maxLineBytes, requireFinalNewline);
132
+ return { push, end };
133
+ }
134
+ async function* chunksOf(source, signal) {
135
+ signal?.throwIfAborted();
136
+ const stream = source instanceof Response ? source.body : source;
137
+ if (stream === null)
138
+ return;
139
+ if (stream instanceof ReadableStream) {
140
+ const reader = stream.getReader();
141
+ const abort = () => {
142
+ if (signal)
143
+ reader.cancel(abortReason(signal)).catch(() => {
144
+ return;
145
+ });
146
+ };
147
+ signal?.addEventListener("abort", abort, { once: true });
148
+ try {
149
+ for (;; ) {
150
+ const chunk = await reader.read();
151
+ signal?.throwIfAborted();
152
+ if (chunk.done)
153
+ return;
154
+ yield chunk.value;
155
+ }
156
+ } finally {
157
+ signal?.removeEventListener("abort", abort);
158
+ await reader.cancel().catch(() => {
159
+ return;
160
+ });
161
+ reader.releaseLock();
162
+ }
163
+ }
164
+ const iterator = stream[Symbol.asyncIterator]();
165
+ let finished = false;
166
+ try {
167
+ for (;; ) {
168
+ const pending = iterator.next();
169
+ const next = await (signal ? untilAborted(pending, signal) : pending);
170
+ if (next.done) {
171
+ finished = true;
172
+ return;
80
173
  }
81
- yield decoder.decode(pending);
174
+ yield next.value;
82
175
  }
83
176
  } finally {
84
- await reader.cancel().catch(() => {
85
- return;
86
- });
87
- reader.releaseLock();
177
+ if (!finished && signal?.aborted)
178
+ iterator.return?.().catch(() => {
179
+ return;
180
+ });
181
+ else if (!finished)
182
+ await iterator.return?.().catch(() => {
183
+ return;
184
+ });
185
+ }
186
+ }
187
+ async function* readBoundedUtf8Lines(source, maxLineBytes, requireFinalNewline = false, signal) {
188
+ const splitter = createLineSplitter(maxLineBytes, requireFinalNewline);
189
+ for await (const chunk of chunksOf(source, signal)) {
190
+ for (const line of splitter.lines(chunk)) {
191
+ signal?.throwIfAborted();
192
+ yield line;
193
+ }
194
+ }
195
+ for (const line of splitter.end()) {
196
+ signal?.throwIfAborted();
197
+ yield line;
88
198
  }
89
199
  }
90
200
 
91
201
  // src/browser/stream.ts
202
+ function ndjsonLine(rawLine) {
203
+ return (rawLine.endsWith("\r") ? rawLine.slice(0, -1) : rawLine).trim();
204
+ }
92
205
  function parseFailure(raw, error, onParseError) {
93
206
  const failure = error instanceof Error ? error : new Error(String(error));
94
207
  if (!onParseError)
95
208
  throw failure;
96
209
  onParseError(raw, failure);
97
210
  }
98
- async function* parseNDJSON2(response, options) {
211
+ async function* parseNDJSON2(source, options) {
212
+ let reporting = false;
99
213
  try {
100
- for await (const rawLine of readBoundedUtf8Lines(response, options?.maxLineBytes ?? DEFAULT_STREAM_LINE_BYTES, options?.finalLine === "require-newline")) {
101
- const line = (rawLine.endsWith("\r") ? rawLine.slice(0, -1) : rawLine).trim();
214
+ for await (const rawLine of readBoundedUtf8Lines(source, options?.maxLineBytes ?? DEFAULT_STREAM_LINE_BYTES, options?.finalLine === "require-newline", options?.signal)) {
215
+ const line = ndjsonLine(rawLine);
102
216
  if (line === "")
103
217
  continue;
218
+ let value;
104
219
  try {
105
- yield JSON.parse(line);
220
+ value = JSON.parse(line);
106
221
  } catch (error) {
222
+ reporting = true;
107
223
  parseFailure(line, error, options?.onParseError);
224
+ reporting = false;
225
+ continue;
108
226
  }
227
+ yield value;
109
228
  }
110
229
  } catch (error) {
230
+ if (reporting || options?.signal?.aborted)
231
+ throw error;
111
232
  parseFailure("", error, options?.onParseError);
112
233
  }
113
234
  }
114
- async function* parseSSE2(response, options) {
235
+ function createNDJSONDecoder2(options) {
236
+ const lines = createBoundedLineDecoder(options?.maxLineBytes ?? DEFAULT_STREAM_LINE_BYTES, options?.finalLine === "require-newline");
237
+ let failed = false;
238
+ const values = (rawLines) => {
239
+ const parsed = [];
240
+ for (const rawLine of rawLines) {
241
+ const line = ndjsonLine(rawLine);
242
+ if (line === "")
243
+ continue;
244
+ try {
245
+ parsed.push(JSON.parse(line));
246
+ } catch (error) {
247
+ parseFailure(line, error, options?.onParseError);
248
+ }
249
+ }
250
+ return parsed;
251
+ };
252
+ const guarded = (step) => {
253
+ if (failed)
254
+ throw new Error("NDJSON decoder stopped at an earlier error; read the source again");
255
+ try {
256
+ return values(step());
257
+ } catch (error) {
258
+ failed = true;
259
+ throw error;
260
+ }
261
+ };
262
+ return {
263
+ push: (chunk) => guarded(() => lines.push(chunk)),
264
+ end: () => guarded(() => lines.end())
265
+ };
266
+ }
267
+ async function* parseSSE2(source, options) {
268
+ let reporting = false;
115
269
  try {
116
- for await (const rawLine of readBoundedUtf8Lines(response, options?.maxLineBytes ?? DEFAULT_STREAM_LINE_BYTES)) {
270
+ for await (const rawLine of readBoundedUtf8Lines(source, options?.maxLineBytes ?? DEFAULT_STREAM_LINE_BYTES, false, options?.signal)) {
117
271
  const line = rawLine.endsWith("\r") ? rawLine.slice(0, -1) : rawLine;
118
272
  if (!line.startsWith("data:"))
119
273
  continue;
120
274
  const data = line.slice(5).replace(/^ /, "");
121
275
  if (data === "[DONE]")
122
276
  return;
277
+ let value;
123
278
  try {
124
- yield JSON.parse(data);
279
+ value = JSON.parse(data);
125
280
  } catch (error) {
126
- const failure = error instanceof Error ? error : new Error(String(error));
127
- if (!options?.onParseError)
128
- throw failure;
129
- options.onParseError(data, failure);
281
+ reporting = true;
282
+ parseFailure(data, error, options?.onParseError);
283
+ reporting = false;
284
+ continue;
130
285
  }
286
+ yield value;
131
287
  }
132
288
  } catch (error) {
133
- const failure = error instanceof Error ? error : new Error(String(error));
134
- if (!options?.onParseError)
135
- throw failure;
136
- options.onParseError("", failure);
289
+ if (reporting || options?.signal?.aborted)
290
+ throw error;
291
+ parseFailure("", error, options?.onParseError);
137
292
  }
138
293
  }
139
294
 
@@ -797,4 +952,4 @@ function createScopedUrlBuilders2(contracts, source, scopeConfigs) {
797
952
  return buildScopedRegistry(contracts, scopeConfigs, "URL builder", (contract, config) => createUrlBuilder2(contract, source, config));
798
953
  }
799
954
 
800
- export { endpointHasArguments, parseNDJSON2, parseSSE2, contractEndpointMatchers2, createClient2, createClients2, createScopedClients2, createUrlBuilder2, createUrlBuilders2, createScopedUrlBuilders2 };
955
+ export { endpointHasArguments, StreamLineLimitError2, StreamTruncatedLineError2, parseNDJSON2, createNDJSONDecoder2, parseSSE2, contractEndpointMatchers2, createClient2, createClients2, createScopedClients2, createUrlBuilder2, createUrlBuilders2, createScopedUrlBuilders2 };
@@ -3,7 +3,7 @@ import {
3
3
  ProcessInstanceSchema2,
4
4
  readProcessInstance,
5
5
  probeProcessOwner2
6
- } from "./index-7r74re56.js";
6
+ } from "./index-bh2ht9y5.js";
7
7
  import {
8
8
  BoundedFileReadError,
9
9
  readBoundedFile
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  attemptExclusiveLock
3
- } from "./index-bnf8s6v3.js";
3
+ } from "./index-t2bsd0hm.js";
4
4
  import {
5
5
  sleep
6
6
  } from "./index-eemvahkc.js";
@@ -2,6 +2,30 @@ import {
2
2
  isRecord
3
3
  } from "./index-9jfdm5tg.js";
4
4
 
5
+ // src/telegram/not-dispatched.ts
6
+ class TelegramNotDispatchedError2 extends Error {
7
+ stage;
8
+ name = "TelegramNotDispatchedError";
9
+ code = "TELEGRAM_NOT_DISPATCHED";
10
+ constructor(stage, message, options) {
11
+ super(message, options);
12
+ this.stage = stage;
13
+ }
14
+ }
15
+ function isTelegramNotDispatchedError(error) {
16
+ return error instanceof TelegramNotDispatchedError2 || error instanceof Error && error.name === "TelegramNotDispatchedError" && Reflect.get(error, "code") === "TELEGRAM_NOT_DISPATCHED";
17
+ }
18
+ function isTelegramNotDispatched(error, depth = 0) {
19
+ if (error instanceof TelegramNotDispatchedError2)
20
+ return true;
21
+ if (typeof error !== "object" || error === null || depth > 4)
22
+ return false;
23
+ if (Reflect.get(error, "code") === "TELEGRAM_NOT_DISPATCHED")
24
+ return true;
25
+ const nested = Reflect.get(error, "cause") ?? Reflect.get(error, "error");
26
+ return nested !== error && isTelegramNotDispatched(nested, depth + 1);
27
+ }
28
+
5
29
  // src/telegram/send-failure.ts
6
30
  var BY_DESCRIPTION = [
7
31
  [/bot was blocked by the user|bot was kicked/i, "blocked-by-user"],
@@ -22,6 +46,7 @@ var TRAITS = {
22
46
  "rate-limited": { retryable: true, recipientUnreachable: false },
23
47
  "message-invalid": { retryable: false, recipientUnreachable: false },
24
48
  "server-error": { retryable: true, recipientUnreachable: false },
49
+ "not-dispatched": { retryable: true, recipientUnreachable: false },
25
50
  unknown: { retryable: false, recipientUnreachable: false }
26
51
  };
27
52
  function isSendFailureReason(value) {
@@ -71,6 +96,8 @@ function descriptionOf(value, depth = 0) {
71
96
  return [own, message, nested].filter(Boolean).join(" ");
72
97
  }
73
98
  function classifyTelegramSendFailure2(error) {
99
+ if (isTelegramNotDispatched(error))
100
+ return { reason: "not-dispatched", ...TRAITS["not-dispatched"], evidence: "transport" };
74
101
  const status = statusOf(error);
75
102
  const retryAfterSeconds = retryAfterOf(error);
76
103
  const description = descriptionOf(error);
@@ -141,4 +168,4 @@ function classifyTelegramEditRefusal(error) {
141
168
  return "other";
142
169
  }
143
170
 
144
- export { TELEGRAM_SEND_FAILURE_REASONS2, classifyTelegramSendFailure2, classifyTelegramEditRefusal };
171
+ export { TelegramNotDispatchedError2, isTelegramNotDispatchedError, TELEGRAM_SEND_FAILURE_REASONS2, classifyTelegramSendFailure2, classifyTelegramEditRefusal };
@@ -1,4 +1,48 @@
1
1
  export declare const DEFAULT_STREAM_LINE_BYTES: number;
2
- /** Bounded, fatal-UTF-8 line reader shared by NDJSON and SSE parsers. */
3
- export declare function readBoundedUtf8Lines(response: Response, maxLineBytes?: number, requireFinalNewline?: boolean): AsyncGenerator<string>;
2
+ /**
3
+ * A line grew past its byte limit. The reader throws as soon as the retained bytes cross the
4
+ * limit, so memory stays bounded by the limit plus the chunk being read.
5
+ */
6
+ export declare class StreamLineLimitError extends RangeError {
7
+ /** The configured `maxLineBytes`. */
8
+ readonly limitBytes: number;
9
+ /** Bytes of the line seen when it crossed the limit; the line itself is longer still. */
10
+ readonly lineBytes: number;
11
+ readonly name = "StreamLineLimitError";
12
+ constructor(
13
+ /** The configured `maxLineBytes`. */
14
+ limitBytes: number,
15
+ /** Bytes of the line seen when it crossed the limit; the line itself is longer still. */
16
+ lineBytes: number);
17
+ }
18
+ /** The source ended inside a line while `finalLine: 'require-newline'` asked for a delimiter. */
19
+ export declare class StreamTruncatedLineError extends SyntaxError {
20
+ /** Bytes of the unterminated final line. */
21
+ readonly lineBytes: number;
22
+ readonly name = "StreamTruncatedLineError";
23
+ constructor(
24
+ /** Bytes of the unterminated final line. */
25
+ lineBytes: number);
26
+ }
27
+ /** Bytes a line reader accepts: a `Response` body, a web stream, or any async byte iterable. */
28
+ export type StreamByteSource = Response | ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>;
29
+ /**
30
+ * Push-driven bounded line splitter for sources that deliver bytes through a callback, such as
31
+ * a `Bun.listen`/`Bun.connect` socket's `data` handler. Lines are split on `\n` in bytes and
32
+ * decoded as fatal UTF-8 only once complete, so a character split across chunks is never torn.
33
+ * An error (a line past the limit, invalid UTF-8) fails the whole `push` and stops the decoder:
34
+ * the bytes after it belong to the failed line, so every later `push` throws.
35
+ */
36
+ export interface BoundedLineDecoder {
37
+ /** Feed one chunk; returns the lines it completed, without their `\n`. */
38
+ push(chunk: Uint8Array): string[];
39
+ /**
40
+ * The source ended. Returns the unterminated final line, if any, as one more line, or throws
41
+ * `StreamTruncatedLineError` when a final newline is required.
42
+ */
43
+ end(): string[];
44
+ }
45
+ export declare function createBoundedLineDecoder(maxLineBytes?: number, requireFinalNewline?: boolean): BoundedLineDecoder;
46
+ /** Bounded, fatal-UTF-8 line reader shared by the NDJSON and SSE parsers. */
47
+ export declare function readBoundedUtf8Lines(source: StreamByteSource, maxLineBytes?: number, requireFinalNewline?: boolean, signal?: AbortSignal): AsyncGenerator<string>;
4
48
  //# sourceMappingURL=bounded-lines.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bounded-lines.d.ts","sourceRoot":"","sources":["../../src/internal/bounded-lines.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,yBAAyB,QAAc,CAAC;AAgBrD,yEAAyE;AACzE,wBAAuB,oBAAoB,CACzC,QAAQ,EAAE,QAAQ,EAClB,YAAY,CAAC,EAAE,MAAM,EACrB,mBAAmB,UAAQ,GAC1B,cAAc,CAAC,MAAM,CAAC,CAqCxB"}
1
+ {"version":3,"file":"bounded-lines.d.ts","sourceRoot":"","sources":["../../src/internal/bounded-lines.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,yBAAyB,QAAc,CAAC;AAErD;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,UAAU;IAGhD,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,yFAAyF;IACzF,QAAQ,CAAC,SAAS,EAAE,MAAM;IAL5B,SAAkB,IAAI,0BAA0B;IAChD;IACE,qCAAqC;IAC5B,UAAU,EAAE,MAAM;IAC3B,yFAAyF;IAChF,SAAS,EAAE,MAAM,EAG3B;CACF;AAED,iGAAiG;AACjG,qBAAa,wBAAyB,SAAQ,WAAW;IAGrD,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM;IAH5B,SAAkB,IAAI,8BAA8B;IACpD;IACE,4CAA4C;IACnC,SAAS,EAAE,MAAM,EAG3B;CACF;AAED,gGAAgG;AAChG,MAAM,MAAM,gBAAgB,GACxB,QAAQ,GACR,cAAc,CAAC,UAAU,CAAC,GAC1B,aAAa,CAAC,UAAU,CAAC,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,CAAC;IAClC;;;OAGG;IACH,GAAG,IAAI,MAAM,EAAE,CAAC;CACjB;AAiFD,wBAAgB,wBAAwB,CACtC,YAAY,CAAC,EAAE,MAAM,EACrB,mBAAmB,UAAQ,GAC1B,kBAAkB,CAGpB;AAkDD,6EAA6E;AAC7E,wBAAuB,oBAAoB,CACzC,MAAM,EAAE,gBAAgB,EACxB,YAAY,CAAC,EAAE,MAAM,EACrB,mBAAmB,UAAQ,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,MAAM,CAAC,CAcxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"process-identity.d.ts","sourceRoot":"","sources":["../../src/internal/process-identity.ts"],"names":[],"mappings":"AA8CA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE7D;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,SAAU,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBtF;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW1F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,KAAK,YAAY,MAAM,SAA4B,GAClD,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAY3B;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,OAAO,CAAC,OAAO,CAAC,CAuBlB"}
1
+ {"version":3,"file":"process-identity.d.ts","sourceRoot":"","sources":["../../src/internal/process-identity.ts"],"names":[],"mappings":"AA6DA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE7D;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,SAAU,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBtF;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW1F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,KAAK,YAAY,MAAM,SAA4B,GAClD,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAY3B;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,OAAO,CAAC,OAAO,CAAC,CAsBlB"}
@@ -0,0 +1,9 @@
1
+ /** The signal's reason, or the `AbortError` a signal aborted without one stands for. */
2
+ export declare function abortReason(signal: AbortSignal): unknown;
3
+ /**
4
+ * `pending`, or the signal's reason as soon as it aborts. Each call owns its listener and removes
5
+ * it when `pending` settles: one promise shared by every call would retain each result for as long
6
+ * as the signal lives. `pending` itself is not cancelled, only no longer waited for.
7
+ */
8
+ export declare function untilAborted<T>(pending: Promise<T>, signal: AbortSignal): Promise<T>;
9
+ //# sourceMappingURL=until-aborted.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"until-aborted.d.ts","sourceRoot":"","sources":["../../src/internal/until-aborted.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAExD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAoBpF"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * The machine line of a breaking changelog item: what it touches, in a form a
3
+ * consumer's tooling reads without guessing from prose.
4
+ *
5
+ * **Affects:** `stitchkit/files/packaging` createNativePackaging(delivery: 'embedded')
6
+ * **Affects:** `stitchkit/contract`, `stitchkit/server` AppError; `stitchkit` ApiError
7
+ * **Affects:** `stitchkit/process` behaviour
8
+ * **Affects:** `stitchkit/agent-runtime/harness-tools` *
9
+ *
10
+ * Targets are separated by `; `. A target is one or more backticked entrypoints
11
+ * (`, ` between them) and then either export names (`, ` between them, each with
12
+ * an optional parenthesised qualifier naming the option or member), `behaviour`
13
+ * for a change of semantics no import name reveals, or `*` for every import of
14
+ * the entrypoint (a removed leaf). The whole line stays on one line.
15
+ *
16
+ * Pure: shared by the release gate, which refuses a breaking item without it,
17
+ * and by `stitchkit upgrade`, which matches it against a project's imports.
18
+ */
19
+ /** One export a breaking item changes, with what about it changed. */
20
+ export interface UpgradeAffectedSymbol {
21
+ readonly name: string;
22
+ /** The option or member the change is about, as written, e.g. `delivery: 'embedded'`. */
23
+ readonly qualifier?: string;
24
+ }
25
+ /** What one target of an `**Affects:**` line touches in one entrypoint. */
26
+ export type UpgradeAffectsTarget = {
27
+ readonly entrypoint: string;
28
+ readonly kind: 'symbols';
29
+ readonly symbols: readonly UpgradeAffectedSymbol[];
30
+ } | {
31
+ readonly entrypoint: string;
32
+ readonly kind: 'behaviour';
33
+ } | {
34
+ readonly entrypoint: string;
35
+ readonly kind: 'any-import';
36
+ };
37
+ /** One top-level `- ` item of a breaking section, with its lines as written. */
38
+ export interface UpgradeBreakingItemText {
39
+ readonly markdown: string;
40
+ }
41
+ /** The line could not be read; `reason` says which part is malformed. */
42
+ export declare class UpgradeAffectsError extends Error {
43
+ readonly name = "UpgradeAffectsError";
44
+ }
45
+ /**
46
+ * The top-level items of a breaking section. An item opens with a `- `, `* ` or
47
+ * `+ ` bullet at column zero outside a fence; indented and blank lines continue
48
+ * it, and the next unindented line closes it.
49
+ */
50
+ export declare function breakingItems(section: string): UpgradeBreakingItemText[];
51
+ /**
52
+ * The text after `**Affects:**` in an item, or undefined when it declares none.
53
+ * An item carries at most one such line; a second is refused, never dropped.
54
+ */
55
+ export declare function affectsLineOf(itemMarkdown: string): string | undefined;
56
+ /** Every target of an `**Affects:**` line; throws `UpgradeAffectsError` on a malformed one. */
57
+ export declare function parseAffectsLine(line: string): UpgradeAffectsTarget[];
58
+ //# sourceMappingURL=upgrade-affects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-affects.d.ts","sourceRoot":"","sources":["../../src/internal/upgrade-affects.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,sEAAsE;AACtE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,2EAA2E;AAC3E,MAAM,MAAM,oBAAoB,GAC5B;IACE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACpD,GACD;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAEjE,gFAAgF;AAChF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAOD,yEAAyE;AACzE,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,SAAkB,IAAI,yBAAyB;CAChD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,EAAE,CA6BxE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiBtE;AAyDD,+FAA+F;AAC/F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAGrE"}
@@ -7,11 +7,31 @@
7
7
  * consumer recovers the plan without cloning the repository or being told the
8
8
  * range by whoever cut the release.
9
9
  */
10
+ import { type UpgradeAffectsTarget } from './upgrade-affects.js';
11
+ /** One breaking item of a release, with its machine line when it declares one. */
12
+ export interface UpgradeBreakingItem {
13
+ version: string;
14
+ /** The backticked entrypoints the item leads with. */
15
+ entrypoints: string[];
16
+ /** The item's bold title, or its first line. */
17
+ title: string;
18
+ /** What the item touches; `undefined` for an item written before the `**Affects:**` line. */
19
+ affects: UpgradeAffectsTarget[] | undefined;
20
+ /** The item's own `**Who must act:**`, or its section's. */
21
+ whoMustAct: string;
22
+ markdown: string;
23
+ }
10
24
  export interface UpgradeBreakingChange {
11
25
  version: string;
12
26
  whoMustAct: string;
13
27
  markdown: string;
28
+ items: UpgradeBreakingItem[];
14
29
  }
30
+ /**
31
+ * The heading that marks a changelog section as breaking. The release gate and `stitchkit upgrade`
32
+ * read it through this one expression, so a heading one accepts is a heading the other finds.
33
+ */
34
+ export declare const BREAKING_HEADING: RegExp;
15
35
  /** Extract every breaking section crossed by an exact `from` (exclusive) → `to` (inclusive) upgrade. */
16
36
  export declare function planUpgrade(changelog: string, from: string, to: string): UpgradeBreakingChange[];
17
37
  export declare function renderUpgradePlan(changes: readonly UpgradeBreakingChange[], from: string, to: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade-plan.d.ts","sourceRoot":"","sources":["../../src/internal/upgrade-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAsBD,wGAAwG;AACxG,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,qBAAqB,EAAE,CAgCzB;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,qBAAqB,EAAE,EACzC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,MAAM,CASR"}
1
+ {"version":3,"file":"upgrade-plan.d.ts","sourceRoot":"","sources":["../../src/internal/upgrade-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,kFAAkF;AAClF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,OAAO,EAAE,oBAAoB,EAAE,GAAG,SAAS,CAAC;IAC5C,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,mBAAmB,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,QAA2C,CAAC;AA2EzE,wGAAwG;AACxG,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,qBAAqB,EAAE,CAgCzB;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,qBAAqB,EAAE,EACzC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,MAAM,CASR"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Whether a breaking item touches one project: the plan's `**Affects:**` lines
3
+ * against the names the project imports from `stitchkit`.
4
+ *
5
+ * Pure over source text. The scanner reads static `import`/`export … from`
6
+ * declarations at a statement start (named, aliased, `type`, default, namespace,
7
+ * `export *`), bare imports, and `import()` / `require()` of a literal specifier,
8
+ * and the script blocks of `.vue` and `.svelte` files. Comments and the contents
9
+ * of strings and templates are blanked first, so a commented-out import or one
10
+ * written inside a string is not a use; it does not evaluate code, so a
11
+ * specifier built at run time is invisible to it, and a regular-expression literal that holds a
12
+ * quote or a comment marker can hide what follows it.
13
+ */
14
+ import type { UpgradeAffectsTarget } from './upgrade-affects.js';
15
+ import type { UpgradeBreakingItem } from './upgrade-plan.js';
16
+ /** One project file, by a path relative to the project root. */
17
+ export interface ProjectSource {
18
+ readonly path: string;
19
+ readonly text: string;
20
+ }
21
+ /** One name a file imports from one stitchkit entrypoint; `*` for a namespace, star or dynamic import. */
22
+ export interface StitchkitImport {
23
+ readonly path: string;
24
+ readonly line: number;
25
+ readonly entrypoint: string;
26
+ readonly name: string;
27
+ }
28
+ export type UpgradeVerdict = {
29
+ readonly kind: 'affects';
30
+ readonly uses: readonly StitchkitImport[];
31
+ } | {
32
+ readonly kind: 'not-used';
33
+ } | {
34
+ readonly kind: 'behavioural';
35
+ readonly files: readonly string[];
36
+ } | {
37
+ readonly kind: 'not-declared';
38
+ readonly files: readonly string[];
39
+ };
40
+ export interface UpgradeItemVerdict {
41
+ readonly item: UpgradeBreakingItem;
42
+ readonly verdict: UpgradeVerdict;
43
+ }
44
+ /** Every name the given sources import from a `stitchkit` entrypoint. */
45
+ export declare function scanStitchkitImports(sources: readonly ProjectSource[]): StitchkitImport[];
46
+ /** One verdict per item, in plan order. */
47
+ export declare function upgradeVerdicts(items: readonly UpgradeBreakingItem[], imports: readonly StitchkitImport[]): UpgradeItemVerdict[];
48
+ /** The verdicts as the Markdown section `stitchkit upgrade` prints after the plan. */
49
+ export declare function renderUpgradeVerdicts(verdicts: readonly UpgradeItemVerdict[]): string;
50
+ /** The verdicts as the `--json` document's items. */
51
+ export declare function upgradeVerdictsJson(verdicts: readonly UpgradeItemVerdict[]): {
52
+ version: string;
53
+ entrypoints: string[];
54
+ title: string;
55
+ whoMustAct: string;
56
+ affects: UpgradeAffectsTarget[] | null;
57
+ verdict: "affects" | "behavioural" | "not-declared" | "not-used";
58
+ uses?: readonly StitchkitImport[] | undefined;
59
+ files?: readonly string[] | undefined;
60
+ }[];
61
+ //# sourceMappingURL=upgrade-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-usage.d.ts","sourceRoot":"","sources":["../../src/internal/upgrade-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,gEAAgE;AAChE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,0GAA0G;AAC1G,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,eAAe,EAAE,CAAA;CAAE,GACvE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CAClC;AAsHD,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,eAAe,EAAE,CA+BzF;AAyBD,2CAA2C;AAC3C,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,mBAAmB,EAAE,EACrC,OAAO,EAAE,SAAS,eAAe,EAAE,GAClC,kBAAkB,EAAE,CAiBtB;AASD,sFAAsF;AACtF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,GAAG,MAAM,CAoBrF;AAED,qDAAqD;AACrD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE;;;;;;;;;IAa1E"}