@yolk-sdk/agent 0.1.0-canary.115 → 0.1.0-canary.117

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 (76) hide show
  1. package/README.md +10 -5
  2. package/dist/client/state.d.mts +82 -82
  3. package/dist/client/state.d.mts.map +1 -1
  4. package/dist/protocol/content.d.mts +7 -1
  5. package/dist/protocol/content.d.mts.map +1 -1
  6. package/dist/protocol/content.mjs +13 -6
  7. package/dist/protocol/content.mjs.map +1 -1
  8. package/dist/protocol/event.d.mts +6 -0
  9. package/dist/protocol/event.d.mts.map +1 -1
  10. package/dist/protocol/event.mjs +6 -0
  11. package/dist/protocol/event.mjs.map +1 -1
  12. package/dist/protocol/index.d.mts +2 -2
  13. package/dist/protocol/index.d.mts.map +1 -1
  14. package/dist/protocol/index.mjs +2 -2
  15. package/dist/providers/anthropic/conformance/claude-usage-cases.d.mts.map +1 -1
  16. package/dist/providers/anthropic/conformance/claude-usage-cases.mjs +30 -5
  17. package/dist/providers/anthropic/conformance/claude-usage-cases.mjs.map +1 -1
  18. package/dist/providers/anthropic/conformance/claude-usage-snapshot.d.mts +2 -1
  19. package/dist/providers/anthropic/conformance/claude-usage-snapshot.d.mts.map +1 -1
  20. package/dist/providers/anthropic/conformance/claude-usage-snapshot.mjs +3 -2
  21. package/dist/providers/anthropic/conformance/claude-usage-snapshot.mjs.map +1 -1
  22. package/dist/providers/anthropic/usage.d.mts +3 -1
  23. package/dist/providers/anthropic/usage.d.mts.map +1 -1
  24. package/dist/providers/anthropic/usage.mjs +70 -16
  25. package/dist/providers/anthropic/usage.mjs.map +1 -1
  26. package/dist/providers/anthropic-provider-internal.d.mts.map +1 -1
  27. package/dist/providers/anthropic-provider-internal.mjs +8 -1
  28. package/dist/providers/anthropic-provider-internal.mjs.map +1 -1
  29. package/dist/providers/openai/conformance/codex-usage-cases.mjs +1 -1
  30. package/dist/providers/openai/conformance/subscription-usage-cases-internal.d.mts +7 -1
  31. package/dist/providers/openai/conformance/subscription-usage-cases-internal.d.mts.map +1 -1
  32. package/dist/providers/openai/conformance/subscription-usage-cases-internal.mjs +8 -5
  33. package/dist/providers/openai/conformance/subscription-usage-cases-internal.mjs.map +1 -1
  34. package/dist/providers/openai-responses-provider-internal.d.mts.map +1 -1
  35. package/dist/providers/openai-responses-provider-internal.mjs +15 -2
  36. package/dist/providers/openai-responses-provider-internal.mjs.map +1 -1
  37. package/dist/providers/opencode/usage.d.mts.map +1 -1
  38. package/dist/providers/opencode/usage.mjs +13 -4
  39. package/dist/providers/opencode/usage.mjs.map +1 -1
  40. package/dist/providers/provider-error.d.mts +3 -1
  41. package/dist/providers/provider-error.d.mts.map +1 -1
  42. package/dist/providers/provider-error.mjs +2 -0
  43. package/dist/providers/provider-error.mjs.map +1 -1
  44. package/dist/providers/quota-reset-internal.d.mts +29 -0
  45. package/dist/providers/quota-reset-internal.d.mts.map +1 -0
  46. package/dist/providers/quota-reset-internal.mjs +98 -0
  47. package/dist/providers/quota-reset-internal.mjs.map +1 -0
  48. package/dist/providers/subscription-usage.d.mts +5 -0
  49. package/dist/providers/subscription-usage.d.mts.map +1 -1
  50. package/dist/providers/subscription-usage.mjs +6 -1
  51. package/dist/providers/subscription-usage.mjs.map +1 -1
  52. package/dist/react/chat-actions.d.mts +20 -20
  53. package/dist/react/chat-actions.d.mts.map +1 -1
  54. package/dist/react/chat-items.d.mts +97 -97
  55. package/dist/react/chat-items.d.mts.map +1 -1
  56. package/dist/react/chat-messages.d.mts +133 -133
  57. package/dist/react/chat-messages.d.mts.map +1 -1
  58. package/dist/skillset/merge.d.mts +1 -1
  59. package/dist/tools/files.d.mts.map +1 -1
  60. package/dist/tools/files.mjs +2 -2
  61. package/dist/tools/files.mjs.map +1 -1
  62. package/package.json +3 -3
  63. package/src/protocol/content.ts +16 -6
  64. package/src/protocol/event.ts +6 -0
  65. package/src/protocol/index.ts +1 -0
  66. package/src/providers/anthropic/conformance/claude-usage-cases.ts +60 -5
  67. package/src/providers/anthropic/conformance/claude-usage-snapshot.ts +3 -2
  68. package/src/providers/anthropic/usage.ts +122 -27
  69. package/src/providers/anthropic-provider-internal.ts +13 -1
  70. package/src/providers/openai/conformance/subscription-usage-cases-internal.ts +32 -6
  71. package/src/providers/openai-responses-provider-internal.ts +23 -4
  72. package/src/providers/opencode/usage.ts +19 -5
  73. package/src/providers/provider-error.ts +12 -0
  74. package/src/providers/quota-reset-internal.ts +227 -0
  75. package/src/providers/subscription-usage.ts +6 -1
  76. package/src/tools/files.ts +2 -1
package/README.md CHANGED
@@ -7,7 +7,7 @@ Root export is intentionally empty. Import feature APIs from explicit subpaths.
7
7
  ## Install
8
8
 
9
9
  ```bash
10
- pnpm add @yolk-sdk/agent@canary effect@4.0.0
10
+ pnpm add @yolk-sdk/agent@canary effect@4.0.5
11
11
  ```
12
12
 
13
13
  Add `react` if you use `@yolk-sdk/agent/react` or `@yolk-sdk/agent/voice/react`.
@@ -15,7 +15,7 @@ Add `react` if you use `@yolk-sdk/agent/react` or `@yolk-sdk/agent/voice/react`.
15
15
  Running the experimental `@yolk-sdk/agent/providers/*/conformance` cases? Also add `@yolk-sdk/conformance@canary` (usually as a dev dependency); the cases run through `@yolk-sdk/conformance/runner`.
16
16
 
17
17
  Canary APIs are unstable. Keep all `@yolk-sdk/*` packages on the same version.
18
- Use the SDK's matching Effect version (`4.0.0`) in host code.
18
+ Use the SDK's matching Effect version (`4.0.5`) in host code.
19
19
  Published package metadata requires Node.js 22+.
20
20
 
21
21
  ## Subpaths
@@ -443,7 +443,9 @@ Provider adapters classify safe failure metadata at the boundary. The loop owns
443
443
  policy and emits protocol-visible retry/error state:
444
444
 
445
445
  - `ProviderErrorInfo` carries safe provider id, failure kind, HTTP status, provider code, optional
446
- `retryAfterMs`, and optional `stream` diagnostics (`ProviderStreamDiagnostics`) on chat
446
+ `retryAfterMs`, optional `quotaResetsAtMs` (epoch milliseconds when a spent account-wide
447
+ subscription quota resets; on `rate_limit` only, when Claude or a Responses provider such as
448
+ ChatGPT Codex reports a trusted reset), and optional `stream` diagnostics (`ProviderStreamDiagnostics`) on chat
447
449
  `unexpected_content_type` / `incomplete_stream` failures. Diagnostics contain counters and
448
450
  milestones, never transcript content, raw headers, or body fragments. See the
449
451
  [stream diagnostics guide](https://github.com/magoz/yolk-sdk/blob/main/apps/docs/content/docs/troubleshooting.mdx#diagnose-chat-stream-failures-with-stream-diagnostics).
@@ -471,7 +473,8 @@ typed retry/error state.
471
473
  ## Subscription allowance snapshots
472
474
 
473
475
  The Claude, Codex, and Grok usage adapters read best-effort consumer subscription allowance
474
- percentages and reset windows. Claude normalizes its aggregate five-hour and seven-day windows;
476
+ percentages and reset windows. Claude normalizes its aggregate five-hour and seven-day windows plus model-scoped weekly limits
477
+ (`seven-day-<model>`);
475
478
  Codex normalizes primary and secondary rate-limit windows; Grok normalizes its aggregate shared
476
479
  credit allowance. Additional provider-specific buckets are ignored. These private provider
477
480
  endpoints may change without notice. Pass a fresh host-owned `OAuthAccessToken` and provide an
@@ -497,7 +500,9 @@ adapter sends it with `x-grok-client-mode: headless` and never claims an officia
497
500
  version.
498
501
 
499
502
  Provider adapters return an immutable Effect `Chunk` of semantic window ids, percentages, and
500
- optional reset/duration fields; hosts own labels, polling, persistence, stale-data policy, alert
503
+ optional reset/duration fields. A model-scoped window (Claude's `seven-day-<model>`) carries
504
+ `models`, the lowercase model id substrings it limits; absent means every model of the account.
505
+ Hosts own labels, polling, persistence, stale-data policy, alert
501
506
  thresholds, billing interpretation, and UI. Configure `requestTimeoutMs` at the server integration
502
507
  boundary. Each fetcher defaults to its exported URL constant; the optional `url` override is only
503
508
  for a trusted proxy or local emulator, because the credential is sent to it. `FetchHttpClient.layer` is configured for manual
@@ -79,26 +79,6 @@ type AgentToolRun = {
79
79
  readonly result: ToolResult;
80
80
  };
81
81
  declare const AgentToolRun: {
82
- readonly InputStreaming: Data.TaggedEnum.ConstructorFrom<{
83
- readonly _tag: "InputStreaming";
84
- readonly id: string;
85
- readonly name?: string;
86
- readonly input: string;
87
- }, "_tag">;
88
- readonly InputReady: Data.TaggedEnum.ConstructorFrom<{
89
- readonly _tag: "InputReady";
90
- readonly call: ToolCall;
91
- }, "_tag">;
92
- readonly ApprovalRequested: Data.TaggedEnum.ConstructorFrom<{
93
- readonly _tag: "ApprovalRequested";
94
- readonly call: ToolCall;
95
- readonly request?: ToolApprovalRequest;
96
- }, "_tag">;
97
- readonly Denied: Data.TaggedEnum.ConstructorFrom<{
98
- readonly _tag: "Denied";
99
- readonly toolCallId: string;
100
- readonly reason: string;
101
- }, "_tag">;
102
82
  readonly QuestionRequested: Data.TaggedEnum.ConstructorFrom<{
103
83
  readonly _tag: "QuestionRequested";
104
84
  readonly request: QuestionRequest;
@@ -141,21 +121,31 @@ declare const AgentToolRun: {
141
121
  readonly response: InteractionResponse;
142
122
  readonly request?: InteractionRequest;
143
123
  }, "_tag">;
144
- readonly Executing: Data.TaggedEnum.ConstructorFrom<{
145
- readonly _tag: "Executing";
124
+ readonly Denied: Data.TaggedEnum.ConstructorFrom<{
125
+ readonly _tag: "Denied";
126
+ readonly toolCallId: string;
127
+ readonly reason: string;
128
+ }, "_tag">;
129
+ readonly InputStreaming: Data.TaggedEnum.ConstructorFrom<{
130
+ readonly _tag: "InputStreaming";
131
+ readonly id: string;
132
+ readonly name?: string;
133
+ readonly input: string;
134
+ }, "_tag">;
135
+ readonly ApprovalRequested: Data.TaggedEnum.ConstructorFrom<{
136
+ readonly _tag: "ApprovalRequested";
146
137
  readonly call: ToolCall;
147
- readonly startedAtMs: number; /** Preserve witnessed interaction acceptance across transport interruptions. */
148
- readonly interaction?: true;
138
+ readonly request?: ToolApprovalRequest;
149
139
  }, "_tag">;
150
- readonly Completed: Data.TaggedEnum.ConstructorFrom<{
151
- readonly _tag: "Completed";
140
+ readonly Accepted: Data.TaggedEnum.ConstructorFrom<{
141
+ readonly _tag: "Accepted";
152
142
  readonly call: ToolCall;
153
143
  readonly result: ToolResult;
154
144
  readonly startedAtMs: number;
155
145
  readonly endedAtMs: number;
156
146
  }, "_tag">;
157
- readonly Accepted: Data.TaggedEnum.ConstructorFrom<{
158
- readonly _tag: "Accepted";
147
+ readonly Completed: Data.TaggedEnum.ConstructorFrom<{
148
+ readonly _tag: "Completed";
159
149
  readonly call: ToolCall;
160
150
  readonly result: ToolResult;
161
151
  readonly startedAtMs: number;
@@ -172,7 +162,17 @@ declare const AgentToolRun: {
172
162
  readonly call: ToolCall;
173
163
  readonly result: ToolResult;
174
164
  }, "_tag">;
175
- readonly $is: <Tag extends "InputStreaming" | "InputReady" | "ApprovalRequested" | "Denied" | "QuestionRequested" | "QuestionAnswered" | "QuestionCancelled" | "InputRequested" | "InputSubmitted" | "InputCancelled" | "InteractionRequested" | "InteractionSubmitted" | "InteractionCancelled" | "Executing" | "Completed" | "Accepted" | "Errored" | "ProviderCompleted">(tag: Tag) => (u: unknown) => u is Extract<{
165
+ readonly InputReady: Data.TaggedEnum.ConstructorFrom<{
166
+ readonly _tag: "InputReady";
167
+ readonly call: ToolCall;
168
+ }, "_tag">;
169
+ readonly Executing: Data.TaggedEnum.ConstructorFrom<{
170
+ readonly _tag: "Executing";
171
+ readonly call: ToolCall;
172
+ readonly startedAtMs: number; /** Preserve witnessed interaction acceptance across transport interruptions. */
173
+ readonly interaction?: true;
174
+ }, "_tag">;
175
+ readonly $is: <Tag extends "QuestionRequested" | "QuestionAnswered" | "QuestionCancelled" | "InputRequested" | "InputSubmitted" | "InputCancelled" | "InteractionRequested" | "InteractionSubmitted" | "InteractionCancelled" | "Denied" | "InputStreaming" | "ApprovalRequested" | "Accepted" | "Completed" | "Errored" | "ProviderCompleted" | "InputReady" | "Executing">(tag: Tag) => (u: unknown) => u is Extract<{
176
176
  readonly _tag: "InputStreaming";
177
177
  readonly id: string;
178
178
  readonly name?: string;
@@ -286,26 +286,6 @@ declare const AgentToolRun: {
286
286
  }>;
287
287
  readonly $match: {
288
288
  <Cases extends {
289
- readonly InputStreaming: (args: {
290
- readonly _tag: "InputStreaming";
291
- readonly id: string;
292
- readonly name?: string;
293
- readonly input: string;
294
- }) => any;
295
- readonly InputReady: (args: {
296
- readonly _tag: "InputReady";
297
- readonly call: ToolCall;
298
- }) => any;
299
- readonly ApprovalRequested: (args: {
300
- readonly _tag: "ApprovalRequested";
301
- readonly call: ToolCall;
302
- readonly request?: ToolApprovalRequest;
303
- }) => any;
304
- readonly Denied: (args: {
305
- readonly _tag: "Denied";
306
- readonly toolCallId: string;
307
- readonly reason: string;
308
- }) => any;
309
289
  readonly QuestionRequested: (args: {
310
290
  readonly _tag: "QuestionRequested";
311
291
  readonly request: QuestionRequest;
@@ -348,21 +328,31 @@ declare const AgentToolRun: {
348
328
  readonly response: InteractionResponse;
349
329
  readonly request?: InteractionRequest;
350
330
  }) => any;
351
- readonly Executing: (args: {
352
- readonly _tag: "Executing";
331
+ readonly Denied: (args: {
332
+ readonly _tag: "Denied";
333
+ readonly toolCallId: string;
334
+ readonly reason: string;
335
+ }) => any;
336
+ readonly InputStreaming: (args: {
337
+ readonly _tag: "InputStreaming";
338
+ readonly id: string;
339
+ readonly name?: string;
340
+ readonly input: string;
341
+ }) => any;
342
+ readonly ApprovalRequested: (args: {
343
+ readonly _tag: "ApprovalRequested";
353
344
  readonly call: ToolCall;
354
- readonly startedAtMs: number; /** Preserve witnessed interaction acceptance across transport interruptions. */
355
- readonly interaction?: true;
345
+ readonly request?: ToolApprovalRequest;
356
346
  }) => any;
357
- readonly Completed: (args: {
358
- readonly _tag: "Completed";
347
+ readonly Accepted: (args: {
348
+ readonly _tag: "Accepted";
359
349
  readonly call: ToolCall;
360
350
  readonly result: ToolResult;
361
351
  readonly startedAtMs: number;
362
352
  readonly endedAtMs: number;
363
353
  }) => any;
364
- readonly Accepted: (args: {
365
- readonly _tag: "Accepted";
354
+ readonly Completed: (args: {
355
+ readonly _tag: "Completed";
366
356
  readonly call: ToolCall;
367
357
  readonly result: ToolResult;
368
358
  readonly startedAtMs: number;
@@ -379,28 +369,18 @@ declare const AgentToolRun: {
379
369
  readonly call: ToolCall;
380
370
  readonly result: ToolResult;
381
371
  }) => any;
382
- }>(cases: Cases): (value: AgentToolRun) => import("effect/Unify").Unify<ReturnType<Cases["InputStreaming" | "InputReady" | "ApprovalRequested" | "Denied" | "QuestionRequested" | "QuestionAnswered" | "QuestionCancelled" | "InputRequested" | "InputSubmitted" | "InputCancelled" | "InteractionRequested" | "InteractionSubmitted" | "InteractionCancelled" | "Executing" | "Completed" | "Accepted" | "Errored" | "ProviderCompleted"]>>;
383
- <Cases extends {
384
- readonly InputStreaming: (args: {
385
- readonly _tag: "InputStreaming";
386
- readonly id: string;
387
- readonly name?: string;
388
- readonly input: string;
389
- }) => any;
390
372
  readonly InputReady: (args: {
391
373
  readonly _tag: "InputReady";
392
374
  readonly call: ToolCall;
393
375
  }) => any;
394
- readonly ApprovalRequested: (args: {
395
- readonly _tag: "ApprovalRequested";
376
+ readonly Executing: (args: {
377
+ readonly _tag: "Executing";
396
378
  readonly call: ToolCall;
397
- readonly request?: ToolApprovalRequest;
398
- }) => any;
399
- readonly Denied: (args: {
400
- readonly _tag: "Denied";
401
- readonly toolCallId: string;
402
- readonly reason: string;
379
+ readonly startedAtMs: number; /** Preserve witnessed interaction acceptance across transport interruptions. */
380
+ readonly interaction?: true;
403
381
  }) => any;
382
+ }>(cases: Cases): (value: AgentToolRun) => import("effect/Unify").Unify<ReturnType<Cases["QuestionRequested" | "QuestionAnswered" | "QuestionCancelled" | "InputRequested" | "InputSubmitted" | "InputCancelled" | "InteractionRequested" | "InteractionSubmitted" | "InteractionCancelled" | "Denied" | "InputStreaming" | "ApprovalRequested" | "Accepted" | "Completed" | "Errored" | "ProviderCompleted" | "InputReady" | "Executing"]>>;
383
+ <Cases extends {
404
384
  readonly QuestionRequested: (args: {
405
385
  readonly _tag: "QuestionRequested";
406
386
  readonly request: QuestionRequest;
@@ -443,21 +423,31 @@ declare const AgentToolRun: {
443
423
  readonly response: InteractionResponse;
444
424
  readonly request?: InteractionRequest;
445
425
  }) => any;
446
- readonly Executing: (args: {
447
- readonly _tag: "Executing";
426
+ readonly Denied: (args: {
427
+ readonly _tag: "Denied";
428
+ readonly toolCallId: string;
429
+ readonly reason: string;
430
+ }) => any;
431
+ readonly InputStreaming: (args: {
432
+ readonly _tag: "InputStreaming";
433
+ readonly id: string;
434
+ readonly name?: string;
435
+ readonly input: string;
436
+ }) => any;
437
+ readonly ApprovalRequested: (args: {
438
+ readonly _tag: "ApprovalRequested";
448
439
  readonly call: ToolCall;
449
- readonly startedAtMs: number; /** Preserve witnessed interaction acceptance across transport interruptions. */
450
- readonly interaction?: true;
440
+ readonly request?: ToolApprovalRequest;
451
441
  }) => any;
452
- readonly Completed: (args: {
453
- readonly _tag: "Completed";
442
+ readonly Accepted: (args: {
443
+ readonly _tag: "Accepted";
454
444
  readonly call: ToolCall;
455
445
  readonly result: ToolResult;
456
446
  readonly startedAtMs: number;
457
447
  readonly endedAtMs: number;
458
448
  }) => any;
459
- readonly Accepted: (args: {
460
- readonly _tag: "Accepted";
449
+ readonly Completed: (args: {
450
+ readonly _tag: "Completed";
461
451
  readonly call: ToolCall;
462
452
  readonly result: ToolResult;
463
453
  readonly startedAtMs: number;
@@ -474,7 +464,17 @@ declare const AgentToolRun: {
474
464
  readonly call: ToolCall;
475
465
  readonly result: ToolResult;
476
466
  }) => any;
477
- }>(value: AgentToolRun, cases: Cases): import("effect/Unify").Unify<ReturnType<Cases["InputStreaming" | "InputReady" | "ApprovalRequested" | "Denied" | "QuestionRequested" | "QuestionAnswered" | "QuestionCancelled" | "InputRequested" | "InputSubmitted" | "InputCancelled" | "InteractionRequested" | "InteractionSubmitted" | "InteractionCancelled" | "Executing" | "Completed" | "Accepted" | "Errored" | "ProviderCompleted"]>>;
467
+ readonly InputReady: (args: {
468
+ readonly _tag: "InputReady";
469
+ readonly call: ToolCall;
470
+ }) => any;
471
+ readonly Executing: (args: {
472
+ readonly _tag: "Executing";
473
+ readonly call: ToolCall;
474
+ readonly startedAtMs: number; /** Preserve witnessed interaction acceptance across transport interruptions. */
475
+ readonly interaction?: true;
476
+ }) => any;
477
+ }>(value: AgentToolRun, cases: Cases): import("effect/Unify").Unify<ReturnType<Cases["QuestionRequested" | "QuestionAnswered" | "QuestionCancelled" | "InputRequested" | "InputSubmitted" | "InputCancelled" | "InteractionRequested" | "InteractionSubmitted" | "InteractionCancelled" | "Denied" | "InputStreaming" | "ApprovalRequested" | "Accepted" | "Completed" | "Errored" | "ProviderCompleted" | "InputReady" | "Executing"]>>;
478
478
  };
479
479
  };
480
480
  type AgentClientState = {
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.mts","names":[],"sources":["../../src/client/state.ts"],"mappings":"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"}
1
+ {"version":3,"file":"state.d.mts","names":[],"sources":["../../src/client/state.ts"],"mappings":"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"}
@@ -93,6 +93,12 @@ declare const refAttachmentSource: (id: string) => RefAttachmentSource;
93
93
  declare const inlineBase64Source: (data: string) => InlineBase64AttachmentSource;
94
94
  /** Standard base64 of `bytes`, chunked so large files do not exceed argument limits. */
95
95
  declare const bytesToBase64: (bytes: Uint8Array) => string;
96
+ /**
97
+ * Bytes of standard base64 (throws on invalid input, like `atob`). Copies into one preallocated
98
+ * array: `Uint8Array.from(binary, mapFn)` first collects every character into a list, which
99
+ * costs tens of bytes per decoded byte (~0.7 GB for 20 MiB).
100
+ */
101
+ declare const base64ToBytes: (data: string) => Uint8Array<ArrayBuffer>;
96
102
  /** A `FilePart` carrying `bytes` inline, for tools that yield files (ADR 0009). */
97
103
  declare const filePartFromBytes: (input: {
98
104
  readonly bytes: Uint8Array;
@@ -118,5 +124,5 @@ declare const documentPartFromText: (input: {
118
124
  declare const attachmentSourceText: (source: AttachmentSource) => Effect.Effect<Option.Option<string>, unknown, never>;
119
125
  declare const attachmentSourceBase64: (source: AttachmentSource) => Option.Option<string>;
120
126
  //#endregion
121
- export { AttachmentContentPart, AttachmentSource, AttachmentSourceResolver, AudioPart, Content, ContentPart, DocumentPart, FilePart, ImagePart, InlineBase64AttachmentSource, RefAttachmentSource, TextPart, UrlAttachmentSource, appendTextToContent, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, attachmentSourceUrl, bytesToBase64, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, filePartFromBytes, filePartText, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, refAttachmentSource, replaceLoneSurrogates, replaceLoneSurrogatesDeep, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textToBase64Utf8, urlAttachmentSource };
127
+ export { AttachmentContentPart, AttachmentSource, AttachmentSourceResolver, AudioPart, Content, ContentPart, DocumentPart, FilePart, ImagePart, InlineBase64AttachmentSource, RefAttachmentSource, TextPart, UrlAttachmentSource, appendTextToContent, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, attachmentSourceUrl, base64ToBytes, bytesToBase64, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, filePartFromBytes, filePartText, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, refAttachmentSource, replaceLoneSurrogates, replaceLoneSurrogatesDeep, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textToBase64Utf8, urlAttachmentSource };
122
128
  //# sourceMappingURL=content.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content.d.mts","names":[],"sources":["../../src/protocol/content.ts"],"mappings":"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"}
1
+ {"version":3,"file":"content.d.mts","names":[],"sources":["../../src/protocol/content.ts"],"mappings":";;;;cACuC,aAAA;;;cAG1B,QAAA,SAAiB,aAE5B;AAAA,cAAG,iCAAA;;;cAEQ,4BAAA,SAAqC,iCAKjD;AAAA,cAAG,wBAAA;;;cAES,mBAAA,SAA4B,wBAEvC;AAAA,cAAG,wBAAA;;;cAEQ,mBAAA,SAA4B,wBAEvC;AAAA,cAEW,gBAAA,EAAgB,QAAA,CAAA,KAAA,kBAAA,4BAAA,SAAA,mBAAA,SAAA,mBAAA;AAAA,KAMjB,gBAAA,UAA0B,gBAAA,CAAiB,IAAI;AAAA,cAAA,cAAA;;;;;;;;cAE9C,SAAA,SAAkB,cAO7B;AAAA,cAAG,iBAAA;;;;;;cAEQ,YAAA,SAAqB,iBAKhC;AAAA,cAAG,cAAA;;;;;;cAEQ,SAAA,SAAkB,cAK7B;AAAA,cAAG,aAAA;;;;;;;;;;;cAOQ,QAAA,SAAiB,aAK5B;AAAA,cAEW,WAAA,EAAW,QAAA,CAAA,KAAA,kBAAA,QAAA,SAAA,SAAA,SAAA,YAAA,SAAA,SAAA,SAAA,QAAA;AAAA,KAEZ,WAAA,UAAqB,WAAA,CAAY,IAAI;AAAA,cAEpC,OAAA,EAAO,QAAA,CAAA,KAAA,WAAA,QAAA,CAAA,MAAA,EAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,KAAA,kBAAA,QAAA,SAAA,SAAA,SAAA,YAAA,SAAA,SAAA,SAAA,QAAA;AAAA,KAER,OAAA,UAAiB,OAAA,CAAQ,IAAI;AAAA,KAE7B,qBAAA,GAAwB,SAAA,GAAY,YAAA,GAAe,SAAA;AAAA,KAEnD,wBAAA,0BACV,IAAA,EAAM,qBAAA,KACH,MAAA,CAAO,MAAA,CAAO,gBAAA,EAAkB,CAAA,EAAG,CAAA;AAAA,cAmD3B,+BAAA,SACX,OAAA,EAAS,OAAA,EACT,QAAA,EAAU,wBAAA,CAAyB,CAAA,EAAG,CAAA,MACrC,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,CAAA,EAAG,CAAA;;AArH7B;;;cA8Ha,YAAA,GAAgB,IAAc,EAAR,QAAQ;AAAA,cAY9B,eAAA,GAAmB,IAAiB,EAAX,WAAW;AAAA,cAQpC,kBAAA,GAAsB,IAAiB,EAAX,WAAW;;;;;;cAiBvC,qBAAA,GAAyB,IAAY;;;;;;;cAQrC,yBAAA,GAA6B,KAAc;AAAA,cAiB3C,WAAA,GAAe,OAAgB,EAAP,OAAO;AAAA,cAG/B,cAAA,GAAkB,OAAgB,EAAP,OAAO;AAAA,cAGlC,YAAA,GAAgB,OAAA,EAAS,OAAA,KAAU,aAAA,CAAc,WAAA;AAAA,cAGjD,cAAA,GAAkB,OAAgB,EAAP,OAAO;AAAA,cAMlC,mBAAA,GAAuB,OAAA,EAAS,OAAA,EAAS,IAAA,aAAe,OAgBpE;AAAA,cAEY,4BAAA,GAAgC,IAAA,aAAY,4BACZ;AAAA,cAEhC,mBAAA,GAAuB,GAAA,aAAW,mBAAsC;AAAA,cAExE,mBAAA,GAAuB,EAAA,aAAU,mBAAqC;AAAA,cAEtE,kBAAA,GAAkB,IAAA,aAP0B,4BAOK;AA9N5D;AAAA,cAmOW,aAAA,GAAiB,KAAiB,EAAV,UAAU;;;;;;cAelC,aAAA,GAAiB,IAAA,aAAY,UAAA,CAAA,WAAA;;cAU7B,iBAAA,GAAqB,KAAA;EAAA,SACvB,KAAA,EAAO,UAAA;EAAA,SACP,QAAA;EAAA,SACA,QAAA;AAAA,MACV,QAYO;AAAA,cAEK,uBAAA,GAA2B,MAAwB,EAAhB,gBAAgB;AAAA,cAQnD,uBAAA,GAA2B,MAAA,EAAQ,gBAAA,EAAkB,QAAA,aAAgB,MAAA,CAAA,MAAA;AAAA,cAOrE,mBAAA,GAAuB,MAAA,EAAQ,gBAAA,EAAkB,QAAA,aAAgB,MAAA,CAAA,MAAA;AAAA,cAsCjE,sBAAA,GAA0B,QAAgB;AAAA,cAyB1C,gCAAA,GAAoC,QAAgB;AAAA,cAUpD,yBAAA,GAA6B,KAAA;EAAA,SAC/B,QAAA;EAAA,SACA,QAAA;AAAA;AAAA,cAWE,gBAAA,GAAoB,IAAY;AAAA,cAWhC,oBAAA,GAAwB,KAAA;EAAA,SAC1B,IAAA;EAAA,SACA,QAAA;EAAA,SACA,QAAA;EAAA,SACA,KAAA;AAAA,MACV,YAAA;AAAA,cAyBY,oBAAA,GAAwB,MAAA,EAAQ,gBAAA,KAAgB,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA;AAAA,cAYhD,sBAAA,GAA0B,MAAA,EAAQ,gBAAA,KAAgB,MAAA,CAAA,MAAA"}
@@ -134,6 +134,17 @@ const bytesToBase64 = (bytes) => {
134
134
  for (let offset = 0; offset < bytes.length; offset += base64ChunkBytes) binary += String.fromCharCode(...bytes.subarray(offset, offset + base64ChunkBytes));
135
135
  return globalThis.btoa(binary);
136
136
  };
137
+ /**
138
+ * Bytes of standard base64 (throws on invalid input, like `atob`). Copies into one preallocated
139
+ * array: `Uint8Array.from(binary, mapFn)` first collects every character into a list, which
140
+ * costs tens of bytes per decoded byte (~0.7 GB for 20 MiB).
141
+ */
142
+ const base64ToBytes = (data) => {
143
+ const binary = globalThis.atob(data);
144
+ const bytes = new Uint8Array(binary.length);
145
+ for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);
146
+ return bytes;
147
+ };
137
148
  /** A `FilePart` carrying `bytes` inline, for tools that yield files (ADR 0009). */
138
149
  const filePartFromBytes = (input) => input.filename === void 0 ? FilePart.make({
139
150
  source: inlineBase64AttachmentSource(bytesToBase64(input.bytes)),
@@ -208,17 +219,13 @@ const documentPartFromText = (input) => {
208
219
  title: input.title
209
220
  });
210
221
  };
211
- const decodeBase64Utf8 = (data) => {
212
- const binary = globalThis.atob(data);
213
- const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));
214
- return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
215
- };
222
+ const decodeBase64Utf8 = (data) => new TextDecoder("utf-8", { fatal: true }).decode(base64ToBytes(data));
216
223
  const attachmentSourceText = (source) => Match.value(source).pipe(Match.tag("InlineBase64", (current) => Effect.try({
217
224
  try: () => Option.some(decodeBase64Utf8(current.data)),
218
225
  catch: (error) => error
219
226
  })), Match.tag("Url", "Ref", () => Effect.succeed(Option.none())), Match.exhaustive);
220
227
  const attachmentSourceBase64 = (source) => Match.value(source).pipe(Match.tag("InlineBase64", (current) => Option.some(current.data)), Match.tag("Url", "Ref", () => Option.none()), Match.exhaustive);
221
228
  //#endregion
222
- export { AttachmentSource, AudioPart, Content, ContentPart, DocumentPart, FilePart, ImagePart, InlineBase64AttachmentSource, RefAttachmentSource, TextPart, UrlAttachmentSource, appendTextToContent, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, attachmentSourceUrl, bytesToBase64, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, filePartFromBytes, filePartText, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, refAttachmentSource, replaceLoneSurrogates, replaceLoneSurrogatesDeep, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textToBase64Utf8, urlAttachmentSource };
229
+ export { AttachmentSource, AudioPart, Content, ContentPart, DocumentPart, FilePart, ImagePart, InlineBase64AttachmentSource, RefAttachmentSource, TextPart, UrlAttachmentSource, appendTextToContent, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, attachmentSourceUrl, base64ToBytes, bytesToBase64, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, filePartFromBytes, filePartText, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, refAttachmentSource, replaceLoneSurrogates, replaceLoneSurrogatesDeep, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textToBase64Utf8, urlAttachmentSource };
223
230
 
224
231
  //# sourceMappingURL=content.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"content.mjs","names":["Schema","Arr"],"sources":["../../src/protocol/content.ts"],"sourcesContent":["import { Array as Arr, Effect, Match, Option, Predicate } from 'effect'\nimport * as Schema from 'effect/Schema'\nimport { fileLabel, fileNotCapturedLabel, isFileId } from './file.ts'\n\nexport class TextPart extends Schema.TaggedClass<TextPart>()('Text', {\n text: Schema.String\n}) {}\n\nexport class InlineBase64AttachmentSource extends Schema.TaggedClass<InlineBase64AttachmentSource>()(\n 'InlineBase64',\n {\n data: Schema.String\n }\n) {}\n\nexport class UrlAttachmentSource extends Schema.TaggedClass<UrlAttachmentSource>()('Url', {\n url: Schema.String\n}) {}\n\nexport class RefAttachmentSource extends Schema.TaggedClass<RefAttachmentSource>()('Ref', {\n id: Schema.String\n}) {}\n\nexport const AttachmentSource = Schema.Union([\n InlineBase64AttachmentSource,\n UrlAttachmentSource,\n RefAttachmentSource\n])\n\nexport type AttachmentSource = typeof AttachmentSource.Type\n\nexport class ImagePart extends Schema.TaggedClass<ImagePart>()('Image', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.optional(Schema.String),\n title: Schema.optional(Schema.String),\n width: Schema.optional(Schema.Number),\n height: Schema.optional(Schema.Number)\n}) {}\n\nexport class DocumentPart extends Schema.TaggedClass<DocumentPart>()('Document', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.String,\n title: Schema.optional(Schema.String)\n}) {}\n\nexport class AudioPart extends Schema.TaggedClass<AudioPart>()('Audio', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.optional(Schema.String),\n durationMs: Schema.optional(Schema.Number)\n}) {}\n\n/**\n * Bytes the agent can move between tools, not content for the model to view (ADR 0009). Producers\n * emit an `InlineBase64` source; tool resolution captures it into the host file store and rewrites\n * it to `Ref { id: fileId }`. Providers lower it to its text label only, never as an attachment.\n */\nexport class FilePart extends Schema.TaggedClass<FilePart>()('File', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.optional(Schema.String),\n size: Schema.optional(Schema.Number)\n}) {}\n\nexport const ContentPart = Schema.Union([TextPart, ImagePart, DocumentPart, AudioPart, FilePart])\n\nexport type ContentPart = typeof ContentPart.Type\n\nexport const Content = Schema.Union([Schema.String, Schema.Array(ContentPart)])\n\nexport type Content = typeof Content.Type\n\nexport type AttachmentContentPart = ImagePart | DocumentPart | AudioPart\n\nexport type AttachmentSourceResolver<E = never, R = never> = (\n part: AttachmentContentPart\n) => Effect.Effect<AttachmentSource, E, R>\n\nconst resolveContentPartAttachmentSource = <E, R>(\n part: ContentPart,\n resolver: AttachmentSourceResolver<E, R>\n): Effect.Effect<ContentPart, E, R> =>\n Match.value(part).pipe(\n Match.tag('Text', current => Effect.succeed(current)),\n Match.tag('Image', current =>\n resolver(current).pipe(\n Effect.map(source =>\n ImagePart.make({\n source,\n mimeType: current.mimeType,\n filename: current.filename,\n title: current.title,\n width: current.width,\n height: current.height\n })\n )\n )\n ),\n Match.tag('Document', current =>\n resolver(current).pipe(\n Effect.map(source =>\n DocumentPart.make({\n source,\n mimeType: current.mimeType,\n filename: current.filename,\n title: current.title\n })\n )\n )\n ),\n Match.tag('Audio', current =>\n resolver(current).pipe(\n Effect.map(source =>\n AudioPart.make({\n source,\n mimeType: current.mimeType,\n filename: current.filename,\n durationMs: current.durationMs\n })\n )\n )\n ),\n // Files are never provider attachments: they lower to their label, so nothing to resolve.\n Match.tag('File', current => Effect.succeed(current)),\n Match.exhaustive\n )\n\nexport const resolveContentAttachmentSources = <E, R>(\n content: Content,\n resolver: AttachmentSourceResolver<E, R>\n): Effect.Effect<Content, E, R> =>\n Predicate.isString(content)\n ? Effect.succeed(content)\n : Effect.forEach(content, part => resolveContentPartAttachmentSource(part, resolver))\n\n/**\n * The model-visible text of a file part: its label when captured (`Ref` to a file id), otherwise a\n * \"not captured\" line. Inline bytes are never rendered.\n */\nexport const filePartText = (part: FilePart) => {\n const name = part.filename ?? 'file'\n\n if (Predicate.isTagged(part.source, 'Ref') && isFileId(part.source.id)) {\n return part.size === undefined\n ? fileLabel({ fileId: part.source.id, name, mimeType: part.mimeType })\n : fileLabel({ fileId: part.source.id, name, mimeType: part.mimeType, size: part.size })\n }\n\n return fileNotCapturedLabel({ name, mimeType: part.mimeType, reason: 'no file store' })\n}\n\nexport const contentPartText = (part: ContentPart) =>\n Match.value(part).pipe(\n Match.tag('Text', current => current.text),\n Match.tag('Image', 'Document', 'Audio', () => ''),\n Match.tag('File', filePartText),\n Match.exhaustive\n )\n\nexport const contentPartPreview = (part: ContentPart) =>\n Match.value(part).pipe(\n Match.tag('Text', current => current.text),\n Match.tag('Image', () => 'Image'),\n Match.tag('Document', current => `Document: ${current.title ?? current.filename}`),\n Match.tag('Audio', () => 'Audio'),\n Match.tag('File', current => `File: ${current.filename ?? current.mimeType}`),\n Match.exhaustive\n )\n\nconst loneSurrogates = /[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/g\n\n/**\n * Replace lone UTF-16 surrogates with U+FFFD. Models emit them in transcripts\n * and tool arguments; they are valid JS strings but unencodable as UTF-8, so\n * provider APIs and storage backends can reject payloads containing them.\n */\nexport const replaceLoneSurrogates = (text: string) => text.replace(loneSurrogates, '\\uFFFD')\n\n/**\n * Deep-apply `replaceLoneSurrogates` to every string (keys included) in a\n * JSON-shaped value. Providers harden lowered request bodies with this before\n * serialization so junk in replayed transcripts cannot poison model calls;\n * hosts may also use it when persisting model-produced JSON.\n */\nexport const replaceLoneSurrogatesDeep = (value: unknown): unknown => {\n if (Predicate.isString(value)) return replaceLoneSurrogates(value)\n\n if (Array.isArray(value)) return value.map(replaceLoneSurrogatesDeep)\n\n if (Predicate.isObjectOrArray(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n replaceLoneSurrogates(key),\n replaceLoneSurrogatesDeep(entry)\n ])\n )\n }\n\n return value\n}\n\nexport const contentText = (content: Content) =>\n Predicate.isString(content) ? content : Arr.map(content, contentPartText).join('')\n\nexport const contentPreview = (content: Content) =>\n Predicate.isString(content) ? content : Arr.map(content, contentPartPreview).join(', ')\n\nexport const contentParts = (content: Content): ReadonlyArray<ContentPart> =>\n Predicate.isString(content) ? [TextPart.make({ text: content })] : content\n\nexport const isContentEmpty = (content: Content) =>\n Predicate.isString(content)\n ? content.length === 0\n : content.length === 0 ||\n Arr.every(content, part => Predicate.isTagged(part, 'Text') && part.text.length === 0)\n\nexport const appendTextToContent = (content: Content, text: string): Content => {\n if (Predicate.isString(content)) {\n return `${content}${text}`\n }\n\n return Option.match(Arr.last(content), {\n onNone: () => [TextPart.make({ text })],\n onSome: last =>\n !Predicate.isTagged(last, 'Text')\n ? [...content, TextPart.make({ text })]\n : Arr.map(content, (part, index) =>\n index === content.length - 1 && Predicate.isTagged(part, 'Text')\n ? TextPart.make({ text: `${part.text}${text}` })\n : part\n )\n })\n}\n\nexport const inlineBase64AttachmentSource = (data: string) =>\n InlineBase64AttachmentSource.make({ data })\n\nexport const urlAttachmentSource = (url: string) => UrlAttachmentSource.make({ url })\n\nexport const refAttachmentSource = (id: string) => RefAttachmentSource.make({ id })\n\nexport const inlineBase64Source = inlineBase64AttachmentSource\n\nconst base64ChunkBytes = 0x8000\n\n/** Standard base64 of `bytes`, chunked so large files do not exceed argument limits. */\nexport const bytesToBase64 = (bytes: Uint8Array) => {\n let binary = ''\n\n for (let offset = 0; offset < bytes.length; offset += base64ChunkBytes) {\n binary += String.fromCharCode(...bytes.subarray(offset, offset + base64ChunkBytes))\n }\n\n return globalThis.btoa(binary)\n}\n\n/** A `FilePart` carrying `bytes` inline, for tools that yield files (ADR 0009). */\nexport const filePartFromBytes = (input: {\n readonly bytes: Uint8Array\n readonly mimeType: string\n readonly filename?: string\n}) =>\n input.filename === undefined\n ? FilePart.make({\n source: inlineBase64AttachmentSource(bytesToBase64(input.bytes)),\n mimeType: input.mimeType,\n size: input.bytes.byteLength\n })\n : FilePart.make({\n source: inlineBase64AttachmentSource(bytesToBase64(input.bytes)),\n mimeType: input.mimeType,\n filename: input.filename,\n size: input.bytes.byteLength\n })\n\nexport const attachmentSourcePreview = (source: AttachmentSource) =>\n Match.value(source).pipe(\n Match.tag('InlineBase64', () => 'inline'),\n Match.tag('Url', current => current.url),\n Match.tag('Ref', current => current.id),\n Match.exhaustive\n )\n\nexport const attachmentSourceDataUrl = (source: AttachmentSource, mimeType: string) =>\n Match.value(source).pipe(\n Match.tag('InlineBase64', current => Option.some(`data:${mimeType};base64,${current.data}`)),\n Match.tag('Url', 'Ref', () => Option.none<string>()),\n Match.exhaustive\n )\n\nexport const attachmentSourceUrl = (source: AttachmentSource, mimeType: string) =>\n Match.value(source).pipe(\n Match.tag('InlineBase64', current => Option.some(`data:${mimeType};base64,${current.data}`)),\n Match.tag('Url', current => Option.some(current.url)),\n Match.tag('Ref', () => Option.none<string>()),\n Match.exhaustive\n )\n\nconst normalizeMimeType = (mimeType: string) =>\n mimeType.split(';', 1)[0]?.trim().toLowerCase() ?? ''\n\nconst textDocumentMimeTypeByExtension = {\n '.csv': 'text/csv',\n '.css': 'text/css',\n '.gql': 'application/graphql',\n '.graphql': 'application/graphql',\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.jsx': 'application/javascript',\n '.json': 'application/json',\n '.jsonl': 'application/x-ndjson',\n '.md': 'text/markdown',\n '.markdown': 'text/markdown',\n '.sql': 'application/sql',\n '.toml': 'application/toml',\n '.ts': 'application/typescript',\n '.tsx': 'application/typescript',\n '.txt': 'text/plain',\n '.xml': 'application/xml',\n '.yaml': 'application/yaml',\n '.yml': 'application/yaml'\n}\n\nconst isUnknownDocumentMimeType = (mimeType: string) =>\n mimeType.length === 0 ||\n mimeType === 'application/octet-stream' ||\n mimeType === 'binary/octet-stream'\n\nexport const isTextDocumentMimeType = (mimeType: string) => {\n const normalized = normalizeMimeType(mimeType)\n\n return (\n normalized.startsWith('text/') ||\n normalized === 'application/json' ||\n normalized === 'application/ld+json' ||\n normalized === 'application/jsonl' ||\n normalized === 'application/x-ndjson' ||\n normalized === 'application/javascript' ||\n normalized === 'application/x-javascript' ||\n normalized === 'application/typescript' ||\n normalized === 'application/x-typescript' ||\n normalized === 'application/xml' ||\n normalized === 'application/yaml' ||\n normalized === 'application/x-yaml' ||\n normalized === 'application/toml' ||\n normalized === 'application/markdown' ||\n normalized === 'application/sql' ||\n normalized === 'application/graphql' ||\n normalized.endsWith('+json') ||\n normalized.endsWith('+xml')\n )\n}\n\nexport const textDocumentMimeTypeFromFilename = (filename: string) => {\n const normalized = filename.trim().toLowerCase()\n\n const entry = Object.entries(textDocumentMimeTypeByExtension).find(([extension]) =>\n normalized.endsWith(extension)\n )\n\n return entry?.[1]\n}\n\nexport const inferTextDocumentMimeType = (input: {\n readonly filename: string\n readonly mimeType: string\n}) => {\n const normalized = normalizeMimeType(input.mimeType)\n\n if (isTextDocumentMimeType(normalized)) return normalized\n\n if (!isUnknownDocumentMimeType(normalized)) return undefined\n\n return textDocumentMimeTypeFromFilename(input.filename)\n}\n\nexport const textToBase64Utf8 = (text: string) => {\n const bytes = new TextEncoder().encode(text)\n let binary = ''\n\n for (const byte of bytes) {\n binary += String.fromCharCode(byte)\n }\n\n return globalThis.btoa(binary)\n}\n\nexport const documentPartFromText = (input: {\n readonly text: string\n readonly filename: string\n readonly mimeType: string\n readonly title?: string\n}) => {\n const normalized = normalizeMimeType(input.mimeType)\n\n const mimeType =\n inferTextDocumentMimeType({\n filename: input.filename,\n mimeType: input.mimeType\n }) ?? (isUnknownDocumentMimeType(normalized) ? 'text/plain' : undefined)\n\n if (mimeType === undefined) return undefined\n\n const base = {\n source: inlineBase64AttachmentSource(textToBase64Utf8(input.text)),\n mimeType,\n filename: input.filename\n }\n\n return input.title === undefined\n ? DocumentPart.make(base)\n : DocumentPart.make({ ...base, title: input.title })\n}\n\nconst decodeBase64Utf8 = (data: string) => {\n const binary = globalThis.atob(data)\n const bytes = Uint8Array.from(binary, character => character.charCodeAt(0))\n\n return new TextDecoder('utf-8', { fatal: true }).decode(bytes)\n}\n\nexport const attachmentSourceText = (source: AttachmentSource) =>\n Match.value(source).pipe(\n Match.tag('InlineBase64', current =>\n Effect.try({\n try: () => Option.some(decodeBase64Utf8(current.data)),\n catch: error => error\n })\n ),\n Match.tag('Url', 'Ref', () => Effect.succeed(Option.none<string>())),\n Match.exhaustive\n )\n\nexport const attachmentSourceBase64 = (source: AttachmentSource) =>\n Match.value(source).pipe(\n Match.tag('InlineBase64', current => Option.some(current.data)),\n Match.tag('Url', 'Ref', () => Option.none<string>()),\n Match.exhaustive\n )\n"],"mappings":"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"}
1
+ {"version":3,"file":"content.mjs","names":["Schema","Arr"],"sources":["../../src/protocol/content.ts"],"sourcesContent":["import { Array as Arr, Effect, Match, Option, Predicate } from 'effect'\nimport * as Schema from 'effect/Schema'\nimport { fileLabel, fileNotCapturedLabel, isFileId } from './file.ts'\n\nexport class TextPart extends Schema.TaggedClass<TextPart>()('Text', {\n text: Schema.String\n}) {}\n\nexport class InlineBase64AttachmentSource extends Schema.TaggedClass<InlineBase64AttachmentSource>()(\n 'InlineBase64',\n {\n data: Schema.String\n }\n) {}\n\nexport class UrlAttachmentSource extends Schema.TaggedClass<UrlAttachmentSource>()('Url', {\n url: Schema.String\n}) {}\n\nexport class RefAttachmentSource extends Schema.TaggedClass<RefAttachmentSource>()('Ref', {\n id: Schema.String\n}) {}\n\nexport const AttachmentSource = Schema.Union([\n InlineBase64AttachmentSource,\n UrlAttachmentSource,\n RefAttachmentSource\n])\n\nexport type AttachmentSource = typeof AttachmentSource.Type\n\nexport class ImagePart extends Schema.TaggedClass<ImagePart>()('Image', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.optional(Schema.String),\n title: Schema.optional(Schema.String),\n width: Schema.optional(Schema.Number),\n height: Schema.optional(Schema.Number)\n}) {}\n\nexport class DocumentPart extends Schema.TaggedClass<DocumentPart>()('Document', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.String,\n title: Schema.optional(Schema.String)\n}) {}\n\nexport class AudioPart extends Schema.TaggedClass<AudioPart>()('Audio', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.optional(Schema.String),\n durationMs: Schema.optional(Schema.Number)\n}) {}\n\n/**\n * Bytes the agent can move between tools, not content for the model to view (ADR 0009). Producers\n * emit an `InlineBase64` source; tool resolution captures it into the host file store and rewrites\n * it to `Ref { id: fileId }`. Providers lower it to its text label only, never as an attachment.\n */\nexport class FilePart extends Schema.TaggedClass<FilePart>()('File', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.optional(Schema.String),\n size: Schema.optional(Schema.Number)\n}) {}\n\nexport const ContentPart = Schema.Union([TextPart, ImagePart, DocumentPart, AudioPart, FilePart])\n\nexport type ContentPart = typeof ContentPart.Type\n\nexport const Content = Schema.Union([Schema.String, Schema.Array(ContentPart)])\n\nexport type Content = typeof Content.Type\n\nexport type AttachmentContentPart = ImagePart | DocumentPart | AudioPart\n\nexport type AttachmentSourceResolver<E = never, R = never> = (\n part: AttachmentContentPart\n) => Effect.Effect<AttachmentSource, E, R>\n\nconst resolveContentPartAttachmentSource = <E, R>(\n part: ContentPart,\n resolver: AttachmentSourceResolver<E, R>\n): Effect.Effect<ContentPart, E, R> =>\n Match.value(part).pipe(\n Match.tag('Text', current => Effect.succeed(current)),\n Match.tag('Image', current =>\n resolver(current).pipe(\n Effect.map(source =>\n ImagePart.make({\n source,\n mimeType: current.mimeType,\n filename: current.filename,\n title: current.title,\n width: current.width,\n height: current.height\n })\n )\n )\n ),\n Match.tag('Document', current =>\n resolver(current).pipe(\n Effect.map(source =>\n DocumentPart.make({\n source,\n mimeType: current.mimeType,\n filename: current.filename,\n title: current.title\n })\n )\n )\n ),\n Match.tag('Audio', current =>\n resolver(current).pipe(\n Effect.map(source =>\n AudioPart.make({\n source,\n mimeType: current.mimeType,\n filename: current.filename,\n durationMs: current.durationMs\n })\n )\n )\n ),\n // Files are never provider attachments: they lower to their label, so nothing to resolve.\n Match.tag('File', current => Effect.succeed(current)),\n Match.exhaustive\n )\n\nexport const resolveContentAttachmentSources = <E, R>(\n content: Content,\n resolver: AttachmentSourceResolver<E, R>\n): Effect.Effect<Content, E, R> =>\n Predicate.isString(content)\n ? Effect.succeed(content)\n : Effect.forEach(content, part => resolveContentPartAttachmentSource(part, resolver))\n\n/**\n * The model-visible text of a file part: its label when captured (`Ref` to a file id), otherwise a\n * \"not captured\" line. Inline bytes are never rendered.\n */\nexport const filePartText = (part: FilePart) => {\n const name = part.filename ?? 'file'\n\n if (Predicate.isTagged(part.source, 'Ref') && isFileId(part.source.id)) {\n return part.size === undefined\n ? fileLabel({ fileId: part.source.id, name, mimeType: part.mimeType })\n : fileLabel({ fileId: part.source.id, name, mimeType: part.mimeType, size: part.size })\n }\n\n return fileNotCapturedLabel({ name, mimeType: part.mimeType, reason: 'no file store' })\n}\n\nexport const contentPartText = (part: ContentPart) =>\n Match.value(part).pipe(\n Match.tag('Text', current => current.text),\n Match.tag('Image', 'Document', 'Audio', () => ''),\n Match.tag('File', filePartText),\n Match.exhaustive\n )\n\nexport const contentPartPreview = (part: ContentPart) =>\n Match.value(part).pipe(\n Match.tag('Text', current => current.text),\n Match.tag('Image', () => 'Image'),\n Match.tag('Document', current => `Document: ${current.title ?? current.filename}`),\n Match.tag('Audio', () => 'Audio'),\n Match.tag('File', current => `File: ${current.filename ?? current.mimeType}`),\n Match.exhaustive\n )\n\nconst loneSurrogates = /[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/g\n\n/**\n * Replace lone UTF-16 surrogates with U+FFFD. Models emit them in transcripts\n * and tool arguments; they are valid JS strings but unencodable as UTF-8, so\n * provider APIs and storage backends can reject payloads containing them.\n */\nexport const replaceLoneSurrogates = (text: string) => text.replace(loneSurrogates, '\\uFFFD')\n\n/**\n * Deep-apply `replaceLoneSurrogates` to every string (keys included) in a\n * JSON-shaped value. Providers harden lowered request bodies with this before\n * serialization so junk in replayed transcripts cannot poison model calls;\n * hosts may also use it when persisting model-produced JSON.\n */\nexport const replaceLoneSurrogatesDeep = (value: unknown): unknown => {\n if (Predicate.isString(value)) return replaceLoneSurrogates(value)\n\n if (Array.isArray(value)) return value.map(replaceLoneSurrogatesDeep)\n\n if (Predicate.isObjectOrArray(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n replaceLoneSurrogates(key),\n replaceLoneSurrogatesDeep(entry)\n ])\n )\n }\n\n return value\n}\n\nexport const contentText = (content: Content) =>\n Predicate.isString(content) ? content : Arr.map(content, contentPartText).join('')\n\nexport const contentPreview = (content: Content) =>\n Predicate.isString(content) ? content : Arr.map(content, contentPartPreview).join(', ')\n\nexport const contentParts = (content: Content): ReadonlyArray<ContentPart> =>\n Predicate.isString(content) ? [TextPart.make({ text: content })] : content\n\nexport const isContentEmpty = (content: Content) =>\n Predicate.isString(content)\n ? content.length === 0\n : content.length === 0 ||\n Arr.every(content, part => Predicate.isTagged(part, 'Text') && part.text.length === 0)\n\nexport const appendTextToContent = (content: Content, text: string): Content => {\n if (Predicate.isString(content)) {\n return `${content}${text}`\n }\n\n return Option.match(Arr.last(content), {\n onNone: () => [TextPart.make({ text })],\n onSome: last =>\n !Predicate.isTagged(last, 'Text')\n ? [...content, TextPart.make({ text })]\n : Arr.map(content, (part, index) =>\n index === content.length - 1 && Predicate.isTagged(part, 'Text')\n ? TextPart.make({ text: `${part.text}${text}` })\n : part\n )\n })\n}\n\nexport const inlineBase64AttachmentSource = (data: string) =>\n InlineBase64AttachmentSource.make({ data })\n\nexport const urlAttachmentSource = (url: string) => UrlAttachmentSource.make({ url })\n\nexport const refAttachmentSource = (id: string) => RefAttachmentSource.make({ id })\n\nexport const inlineBase64Source = inlineBase64AttachmentSource\n\nconst base64ChunkBytes = 0x8000\n\n/** Standard base64 of `bytes`, chunked so large files do not exceed argument limits. */\nexport const bytesToBase64 = (bytes: Uint8Array) => {\n let binary = ''\n\n for (let offset = 0; offset < bytes.length; offset += base64ChunkBytes) {\n binary += String.fromCharCode(...bytes.subarray(offset, offset + base64ChunkBytes))\n }\n\n return globalThis.btoa(binary)\n}\n\n/**\n * Bytes of standard base64 (throws on invalid input, like `atob`). Copies into one preallocated\n * array: `Uint8Array.from(binary, mapFn)` first collects every character into a list, which\n * costs tens of bytes per decoded byte (~0.7 GB for 20 MiB).\n */\nexport const base64ToBytes = (data: string) => {\n const binary = globalThis.atob(data)\n const bytes = new Uint8Array(binary.length)\n\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index)\n\n return bytes\n}\n\n/** A `FilePart` carrying `bytes` inline, for tools that yield files (ADR 0009). */\nexport const filePartFromBytes = (input: {\n readonly bytes: Uint8Array\n readonly mimeType: string\n readonly filename?: string\n}) =>\n input.filename === undefined\n ? FilePart.make({\n source: inlineBase64AttachmentSource(bytesToBase64(input.bytes)),\n mimeType: input.mimeType,\n size: input.bytes.byteLength\n })\n : FilePart.make({\n source: inlineBase64AttachmentSource(bytesToBase64(input.bytes)),\n mimeType: input.mimeType,\n filename: input.filename,\n size: input.bytes.byteLength\n })\n\nexport const attachmentSourcePreview = (source: AttachmentSource) =>\n Match.value(source).pipe(\n Match.tag('InlineBase64', () => 'inline'),\n Match.tag('Url', current => current.url),\n Match.tag('Ref', current => current.id),\n Match.exhaustive\n )\n\nexport const attachmentSourceDataUrl = (source: AttachmentSource, mimeType: string) =>\n Match.value(source).pipe(\n Match.tag('InlineBase64', current => Option.some(`data:${mimeType};base64,${current.data}`)),\n Match.tag('Url', 'Ref', () => Option.none<string>()),\n Match.exhaustive\n )\n\nexport const attachmentSourceUrl = (source: AttachmentSource, mimeType: string) =>\n Match.value(source).pipe(\n Match.tag('InlineBase64', current => Option.some(`data:${mimeType};base64,${current.data}`)),\n Match.tag('Url', current => Option.some(current.url)),\n Match.tag('Ref', () => Option.none<string>()),\n Match.exhaustive\n )\n\nconst normalizeMimeType = (mimeType: string) =>\n mimeType.split(';', 1)[0]?.trim().toLowerCase() ?? ''\n\nconst textDocumentMimeTypeByExtension = {\n '.csv': 'text/csv',\n '.css': 'text/css',\n '.gql': 'application/graphql',\n '.graphql': 'application/graphql',\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.jsx': 'application/javascript',\n '.json': 'application/json',\n '.jsonl': 'application/x-ndjson',\n '.md': 'text/markdown',\n '.markdown': 'text/markdown',\n '.sql': 'application/sql',\n '.toml': 'application/toml',\n '.ts': 'application/typescript',\n '.tsx': 'application/typescript',\n '.txt': 'text/plain',\n '.xml': 'application/xml',\n '.yaml': 'application/yaml',\n '.yml': 'application/yaml'\n}\n\nconst isUnknownDocumentMimeType = (mimeType: string) =>\n mimeType.length === 0 ||\n mimeType === 'application/octet-stream' ||\n mimeType === 'binary/octet-stream'\n\nexport const isTextDocumentMimeType = (mimeType: string) => {\n const normalized = normalizeMimeType(mimeType)\n\n return (\n normalized.startsWith('text/') ||\n normalized === 'application/json' ||\n normalized === 'application/ld+json' ||\n normalized === 'application/jsonl' ||\n normalized === 'application/x-ndjson' ||\n normalized === 'application/javascript' ||\n normalized === 'application/x-javascript' ||\n normalized === 'application/typescript' ||\n normalized === 'application/x-typescript' ||\n normalized === 'application/xml' ||\n normalized === 'application/yaml' ||\n normalized === 'application/x-yaml' ||\n normalized === 'application/toml' ||\n normalized === 'application/markdown' ||\n normalized === 'application/sql' ||\n normalized === 'application/graphql' ||\n normalized.endsWith('+json') ||\n normalized.endsWith('+xml')\n )\n}\n\nexport const textDocumentMimeTypeFromFilename = (filename: string) => {\n const normalized = filename.trim().toLowerCase()\n\n const entry = Object.entries(textDocumentMimeTypeByExtension).find(([extension]) =>\n normalized.endsWith(extension)\n )\n\n return entry?.[1]\n}\n\nexport const inferTextDocumentMimeType = (input: {\n readonly filename: string\n readonly mimeType: string\n}) => {\n const normalized = normalizeMimeType(input.mimeType)\n\n if (isTextDocumentMimeType(normalized)) return normalized\n\n if (!isUnknownDocumentMimeType(normalized)) return undefined\n\n return textDocumentMimeTypeFromFilename(input.filename)\n}\n\nexport const textToBase64Utf8 = (text: string) => {\n const bytes = new TextEncoder().encode(text)\n let binary = ''\n\n for (const byte of bytes) {\n binary += String.fromCharCode(byte)\n }\n\n return globalThis.btoa(binary)\n}\n\nexport const documentPartFromText = (input: {\n readonly text: string\n readonly filename: string\n readonly mimeType: string\n readonly title?: string\n}) => {\n const normalized = normalizeMimeType(input.mimeType)\n\n const mimeType =\n inferTextDocumentMimeType({\n filename: input.filename,\n mimeType: input.mimeType\n }) ?? (isUnknownDocumentMimeType(normalized) ? 'text/plain' : undefined)\n\n if (mimeType === undefined) return undefined\n\n const base = {\n source: inlineBase64AttachmentSource(textToBase64Utf8(input.text)),\n mimeType,\n filename: input.filename\n }\n\n return input.title === undefined\n ? DocumentPart.make(base)\n : DocumentPart.make({ ...base, title: input.title })\n}\n\nconst decodeBase64Utf8 = (data: string) =>\n new TextDecoder('utf-8', { fatal: true }).decode(base64ToBytes(data))\n\nexport const attachmentSourceText = (source: AttachmentSource) =>\n Match.value(source).pipe(\n Match.tag('InlineBase64', current =>\n Effect.try({\n try: () => Option.some(decodeBase64Utf8(current.data)),\n catch: error => error\n })\n ),\n Match.tag('Url', 'Ref', () => Effect.succeed(Option.none<string>())),\n Match.exhaustive\n )\n\nexport const attachmentSourceBase64 = (source: AttachmentSource) =>\n Match.value(source).pipe(\n Match.tag('InlineBase64', current => Option.some(current.data)),\n Match.tag('Url', 'Ref', () => Option.none<string>()),\n Match.exhaustive\n )\n"],"mappings":"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"}
@@ -34,6 +34,12 @@ declare const ProviderErrorInfo_base: Schema.Class<ProviderErrorInfo, Schema.Str
34
34
  readonly status: Schema.optional<Schema.Number>;
35
35
  readonly providerCode: Schema.optional<Schema.String>;
36
36
  readonly retryAfterMs: Schema.optional<Schema.Number>;
37
+ /**
38
+ * When an exhausted subscription quota resets (epoch milliseconds), read from the provider's
39
+ * quota signal (Claude unified rate-limit headers, Codex `usage_limit_reached`). Present only on
40
+ * quota exhaustion, never on transient rate limits; account pools cool the account down until it.
41
+ */
42
+ readonly quotaResetsAtMs: Schema.optional<Schema.Number>;
37
43
  readonly stream: Schema.optional<typeof ProviderStreamDiagnostics>;
38
44
  }>, {}>;
39
45
  declare class ProviderErrorInfo extends ProviderErrorInfo_base {}
@@ -1 +1 @@
1
- {"version":3,"file":"event.d.mts","names":[],"sources":["../../src/protocol/event.ts"],"mappings":";;;;;;cAgCa,cAAA,EAAc,MAAA,CAAA,QAAA;AAAA,KAEf,cAAA,UAAwB,cAAA,CAAe,IAAI;AAAA,cAE1C,cAAA,EAAc,MAAA,CAAA,QAAA;AAAA,KAiBf,cAAA,UAAwB,cAAA,CAAe,IAAI;;cAG1C,gBAAA,EAAgB,MAAA,CAAA,QAAA;AAAA,KAEjB,gBAAA,UAA0B,gBAAA,CAAiB,IAAI;AAAA,cAE9C,mBAAA,EAAmB,MAAA,CAAA,QAAA;AAAA,KAYpB,mBAAA,UAA6B,mBAAA,CAAoB,IAAI;AAAA,cAEpD,sBAAA,EAAsB,MAAA,CAAA,QAAA;AAAA,KAEvB,sBAAA,UAAgC,sBAAA,CAAuB,IAAI;AA1ChB;AAAA,cA6C1C,4BAAA,EAA4B,MAAA,CAAA,QAAA;AAAA,KAE7B,4BAAA,UAAsC,4BAAA,CAA6B,IAAI;AAAA,cAAA,8BAAA;;0FA5BvE;EAAA;0CAA2C;EAAA,wCAGyB;EAAA;;AAAnD;AAAA,cA4BhB,yBAAA,SAAkC,8BAa7C;AAAA,cAAG,sBAAA;;;;;;;;cAEQ,iBAAA,SAA0B,sBAOrC;AAAA,cAAG,eAAA;;;;cAEQ,UAAA,SAAmB,eAE9B;AAAA,cAAG,eAAA;;;;gEAlCuC;EAAA;;;;cAoC/B,UAAA,SAAmB,eAQ9B;AAAA,cAAG,aAAA;;;;;;;cAEQ,QAAA,SAAiB,aAK5B;AAAA,cAAG,uBAAA;;;;;;;;cAEQ,kBAAA,SAA2B,uBASvC;AAAA,cAAG,gBAAA;;;;;cAES,WAAA,SAAoB,gBAG/B;AAAA,cAAG,eAAA;;;;;;;;;cAEQ,UAAA,SAAmB,eAO9B;AAAA,cAAG,oBAAA;;;;;cAEQ,eAAA,SAAwB,oBAGnC;AAAA,cAAG,kBAAA;;;;;;;cAEQ,aAAA,SAAsB,kBAKjC;AAAA,cAAG,cAAA;;;;;cAEQ,SAAA,SAAkB,cAG7B;AAAA,cAAG,YAAA;;;;;;cAEQ,OAAA,SAAgB,YAI3B;AAAA,cAAG,mBAAA;;;;;cAEQ,cAAA,SAAuB,mBAGlC;AAAA,cAAG,iBAAA;;;;;;cAEQ,YAAA,SAAqB,iBAIhC;AAAA,cAAG,sBAAA;;;;;;cAEQ,iBAAA,SAA0B,sBAOtC;AAAA,cAAG,uBAAA;;;;;;;;;;;;AAzFF;AAAG;;;cAgGQ,kBAAA,SAA2B,uBAMvC;AAAA,cAAG,mBAAA;;;;;;cAES,cAAA,SAAuB,mBAIlC;AAAA,cAAG,mBAAA;;;;;;cAEQ,cAAA,SAAuB,mBAIlC;AAAA,cAAG,iBAAA;;;;;cAEQ,YAAA,SAAqB,iBAGhC;AAAA,cAAG,0BAAA;;;;;;cAEQ,qBAAA,SAA8B,0BAO1C;AAAA,cAAG,wBAAA;;;;;;cAES,mBAAA,SAA4B,wBAOxC;AAAA,cAAG,uBAAA;;;;;;;cAES,kBAAA,SAA2B,uBAQvC;AAAA,cAAG,sBAAA;;;;;cAES,iBAAA,SAA0B,sBAMtC;AAAA,cAAG,qBAAA;;;;;cAES,gBAAA,SAAyB,qBAGpC;AAAA,cAAG,sBAAA;;;;;cAEQ,iBAAA,SAA0B,sBAMtC;AAAA,cAAG,mBAAA;;;;;cAES,cAAA,SAAuB,mBAGlC;AAAA,cAAG,mBAAA;;;;;cAEQ,cAAA,SAAuB,mBAGlC;AAAA,cAAG,mBAAA;;;;;cAEQ,cAAA,SAAuB,mBAGlC;AAAA,cAAG,yBAAA;;;;;cAEQ,oBAAA,SAA6B,yBAMzC;AAAA,cAAG,yBAAA;;;;;;;;;cAMS,oBAAA,SAA6B,yBAMzC;AAAA,cAAG,yBAAA;;;;;cAES,oBAAA,SAA6B,yBAMzC;AAAA,cAAG,iBAAA;;;;;cAES,YAAA,SAAqB,iBAGhC;AAAA,cAAG,qBAAA;;;;;cAEQ,gBAAA,SAAyB,qBAGpC;AAAA,cAAG,0BAAA;;;;;cAEQ,qBAAA,SAA8B,0BAM1C;AAAA,cAAG,yBAAA;;;;;cAES,oBAAA,SAA6B,yBAMzC;AAAA,cAAG,0BAAA;;;;;;;cAGS,qBAAA,SAA8B,0BAO1C;AAAA,cAAG,2BAAA;;;;;;cAES,sBAAA,SAA+B,2BAO3C;AAAA,cAAG,uBAAA;;;;;;;cAES,kBAAA,SAA2B,uBAQvC;AAAA,cAAG,uBAAA;;;;;;cAES,kBAAA,SAA2B,uBAOvC;AAAA,cAAG,oBAAA;;;;;;;;;cAES,eAAA,SAAwB,oBAOnC;AAAA,cAAG,sBAAA;;;;;;;;;;;;cAEQ,iBAAA,SAA0B,sBAatC;AAAA,cAEY,iBAAA,GAAqB,gBAAwB;;;;AAtR1D;cA0Sa,4BAAA,GAAgC,MAAA,UAAgB,MAAA,EAAQ,UAAU;;cAKlE,+BAAA,GAAmC,MAAA,UAAgB,MAAA,EAAQ,UAAU;AAAA,cAwJrE,iBAAA,GAAqB,QAAA,EAAU,YAAA,KAAe,UAmCxD;AAAA,cAEU,UAAA,EAAU,MAAA,CAAA,KAAA,kBAAA,UAAA,SAAA,UAAA,SAAA,QAAA,SAAA,kBAAA,SAAA,WAAA,SAAA,UAAA,SAAA,eAAA,SAAA,aAAA,SAAA,SAAA,SAAA,OAAA,SAAA,cAAA,SAAA,YAAA,SAAA,iBAAA,SAAA,kBAAA,SAAA,cAAA,SAAA,cAAA,SAAA,YAAA,SAAA,YAAA,SAAA,gBAAA,SAAA,qBAAA,SAAA,qBAAA,SAAA,mBAAA,SAAA,kBAAA,SAAA,iBAAA,SAAA,gBAAA,SAAA,iBAAA,SAAA,cAAA,SAAA,cAAA,SAAA,cAAA,SAAA,oBAAA,SAAA,oBAAA,SAAA,oBAAA,SAAA,oBAAA,SAAA,qBAAA,SAAA,sBAAA,SAAA,kBAAA,SAAA,kBAAA,SAAA,eAAA,SAAA,iBAAA;AAAA,KA0CX,UAAA,UAAoB,UAAA,CAAW,IAAI;AAAA,KAEnC,kBAAA,GAAqB,OAAO,CACtC,UAAA;EAAA,SACW,IAAA;AAAA;AAAA,cAGA,oBAAA,GAAwB,KAAA,EAAO,UAAA,KAAa,KAAA,IAAS,kBAGjB"}
1
+ {"version":3,"file":"event.d.mts","names":[],"sources":["../../src/protocol/event.ts"],"mappings":";;;;;;cAgCa,cAAA,EAAc,MAAA,CAAA,QAAA;AAAA,KAEf,cAAA,UAAwB,cAAA,CAAe,IAAI;AAAA,cAE1C,cAAA,EAAc,MAAA,CAAA,QAAA;AAAA,KAiBf,cAAA,UAAwB,cAAA,CAAe,IAAI;;cAG1C,gBAAA,EAAgB,MAAA,CAAA,QAAA;AAAA,KAEjB,gBAAA,UAA0B,gBAAA,CAAiB,IAAI;AAAA,cAE9C,mBAAA,EAAmB,MAAA,CAAA,QAAA;AAAA,KAYpB,mBAAA,UAA6B,mBAAA,CAAoB,IAAI;AAAA,cAEpD,sBAAA,EAAsB,MAAA,CAAA,QAAA;AAAA,KAEvB,sBAAA,UAAgC,sBAAA,CAAuB,IAAI;AA1ChB;AAAA,cA6C1C,4BAAA,EAA4B,MAAA,CAAA,QAAA;AAAA,KAE7B,4BAAA,UAAsC,4BAAA,CAA6B,IAAI;AAAA,cAAA,8BAAA;;0FA5BvE;EAAA;0CAA2C;EAAA,wCAGyB;EAAA;;AAAnD;AAAA,cA4BhB,yBAAA,SAAkC,8BAa7C;AAAA,cAAG,sBAAA;;;;;;EArC2B;AAAA;AAYhC;;;EAZgC;;;cAuCnB,iBAAA,SAA0B,sBAarC;AAAA,cAAG,eAAA;;;;cAEQ,UAAA,SAAmB,eAE9B;AAAA,cAAG,eAAA;;;;gEArCoC;EAAA;;;;cAuC5B,UAAA,SAAmB,eAQ9B;AAAA,cAAG,aAAA;;;;;;;cAEQ,QAAA,SAAiB,aAK5B;AAAA,cAAG,uBAAA;;;;;;;;cAEQ,kBAAA,SAA2B,uBASvC;AAAA,cAAG,gBAAA;;;;;cAES,WAAA,SAAoB,gBAG/B;AAAA,cAAG,eAAA;;;;;;;;;cAEQ,UAAA,SAAmB,eAO9B;AAAA,cAAG,oBAAA;;;;;cAEQ,eAAA,SAAwB,oBAGnC;AAAA,cAAG,kBAAA;;;;;;;cAEQ,aAAA,SAAsB,kBAKjC;AAAA,cAAG,cAAA;;;;;cAEQ,SAAA,SAAkB,cAG7B;AAAA,cAAG,YAAA;;;;;;cAEQ,OAAA,SAAgB,YAI3B;AAAA,cAAG,mBAAA;;;;;cAEQ,cAAA,SAAuB,mBAGlC;AAAA,cAAG,iBAAA;;;;;;cAEQ,YAAA,SAAqB,iBAIhC;AAAA,cAAG,sBAAA;;;;;;cAEQ,iBAAA,SAA0B,sBAOtC;AAAA,cAAG,uBAAA;;;;;;;;;;;;;AAzFF;AAAG;;cAgGQ,kBAAA,SAA2B,uBAMvC;AAAA,cAAG,mBAAA;;;;;;cAES,cAAA,SAAuB,mBAIlC;AAAA,cAAG,mBAAA;;;;;;cAEQ,cAAA,SAAuB,mBAIlC;AAAA,cAAG,iBAAA;;;;;cAEQ,YAAA,SAAqB,iBAGhC;AAAA,cAAG,0BAAA;;;;;;cAEQ,qBAAA,SAA8B,0BAO1C;AAAA,cAAG,wBAAA;;;;;;cAES,mBAAA,SAA4B,wBAOxC;AAAA,cAAG,uBAAA;;;;;;;cAES,kBAAA,SAA2B,uBAQvC;AAAA,cAAG,sBAAA;;;;;cAES,iBAAA,SAA0B,sBAMtC;AAAA,cAAG,qBAAA;;;;;cAES,gBAAA,SAAyB,qBAGpC;AAAA,cAAG,sBAAA;;;;;cAEQ,iBAAA,SAA0B,sBAMtC;AAAA,cAAG,mBAAA;;;;;cAES,cAAA,SAAuB,mBAGlC;AAAA,cAAG,mBAAA;;;;;cAEQ,cAAA,SAAuB,mBAGlC;AAAA,cAAG,mBAAA;;;;;cAEQ,cAAA,SAAuB,mBAGlC;AAAA,cAAG,yBAAA;;;;;cAEQ,oBAAA,SAA6B,yBAMzC;AAAA,cAAG,yBAAA;;;;;;;;;cAMS,oBAAA,SAA6B,yBAMzC;AAAA,cAAG,yBAAA;;;;;cAES,oBAAA,SAA6B,yBAMzC;AAAA,cAAG,iBAAA;;;;;cAES,YAAA,SAAqB,iBAGhC;AAAA,cAAG,qBAAA;;;;;cAEQ,gBAAA,SAAyB,qBAGpC;AAAA,cAAG,0BAAA;;;;;cAEQ,qBAAA,SAA8B,0BAM1C;AAAA,cAAG,yBAAA;;;;;cAES,oBAAA,SAA6B,yBAMzC;AAAA,cAAG,0BAAA;;;;;;;cAGS,qBAAA,SAA8B,0BAO1C;AAAA,cAAG,2BAAA;;;;;;cAES,sBAAA,SAA+B,2BAO3C;AAAA,cAAG,uBAAA;;;;;;;cAES,kBAAA,SAA2B,uBAQvC;AAAA,cAAG,uBAAA;;;;;;cAES,kBAAA,SAA2B,uBAOvC;AAAA,cAAG,oBAAA;;;;;;;;;cAES,eAAA,SAAwB,oBAOnC;AAAA,cAAG,sBAAA;;;;;;;;;;;;cAEQ,iBAAA,SAA0B,sBAatC;AAAA,cAEY,iBAAA,GAAqB,gBAAwB;;;;;cAoB7C,4BAAA,GAAgC,MAAA,UAAgB,MAAA,EAAQ,UAAU;;cAKlE,+BAAA,GAAmC,MAAA,UAAgB,MAAA,EAAQ,UAAU;AAAA,cAwJrE,iBAAA,GAAqB,QAAA,EAAU,YAAA,KAAe,UAmCxD;AAAA,cAEU,UAAA,EAAU,MAAA,CAAA,KAAA,kBAAA,UAAA,SAAA,UAAA,SAAA,QAAA,SAAA,kBAAA,SAAA,WAAA,SAAA,UAAA,SAAA,eAAA,SAAA,aAAA,SAAA,SAAA,SAAA,OAAA,SAAA,cAAA,SAAA,YAAA,SAAA,iBAAA,SAAA,kBAAA,SAAA,cAAA,SAAA,cAAA,SAAA,YAAA,SAAA,YAAA,SAAA,gBAAA,SAAA,qBAAA,SAAA,qBAAA,SAAA,mBAAA,SAAA,kBAAA,SAAA,iBAAA,SAAA,gBAAA,SAAA,iBAAA,SAAA,cAAA,SAAA,cAAA,SAAA,cAAA,SAAA,oBAAA,SAAA,oBAAA,SAAA,oBAAA,SAAA,oBAAA,SAAA,qBAAA,SAAA,sBAAA,SAAA,kBAAA,SAAA,kBAAA,SAAA,eAAA,SAAA,iBAAA;AAAA,KA0CX,UAAA,UAAoB,UAAA,CAAW,IAAI;AAAA,KAEnC,kBAAA,GAAqB,OAAO,CACtC,UAAA;EAAA,SACW,IAAA;AAAA;AAAA,cAGA,oBAAA,GAAwB,KAAA,EAAO,UAAA,KAAa,KAAA,IAAS,kBAGjB"}
@@ -78,6 +78,12 @@ var ProviderErrorInfo = class extends Schema$1.Class("ProviderErrorInfo")({
78
78
  status: Schema$1.optional(Schema$1.Number),
79
79
  providerCode: Schema$1.optional(Schema$1.String),
80
80
  retryAfterMs: Schema$1.optional(Schema$1.Number),
81
+ /**
82
+ * When an exhausted subscription quota resets (epoch milliseconds), read from the provider's
83
+ * quota signal (Claude unified rate-limit headers, Codex `usage_limit_reached`). Present only on
84
+ * quota exhaustion, never on transient rate limits; account pools cool the account down until it.
85
+ */
86
+ quotaResetsAtMs: Schema$1.optional(Schema$1.Number),
81
87
  stream: Schema$1.optional(ProviderStreamDiagnostics)
82
88
  }) {};
83
89
  var AgentStart = class extends Schema$1.TaggedClass()("AgentStart", { ...EventIdentity }) {};