@vacbo/opencode-anthropic-fix 0.1.7 → 0.1.9

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 (107) hide show
  1. package/README.md +88 -88
  2. package/dist/opencode-anthropic-auth-cli.mjs +804 -507
  3. package/dist/opencode-anthropic-auth-plugin.js +4751 -4109
  4. package/package.json +67 -59
  5. package/src/__tests__/billing-edge-cases.test.ts +59 -59
  6. package/src/__tests__/bun-proxy.parallel.test.ts +388 -382
  7. package/src/__tests__/cc-comparison.test.ts +87 -87
  8. package/src/__tests__/cc-credentials.test.ts +254 -250
  9. package/src/__tests__/cch-drift-checker.test.ts +51 -51
  10. package/src/__tests__/cch-native-style.test.ts +56 -56
  11. package/src/__tests__/debug-gating.test.ts +42 -42
  12. package/src/__tests__/decomposition-smoke.test.ts +68 -68
  13. package/src/__tests__/fingerprint-regression.test.ts +575 -566
  14. package/src/__tests__/helpers/conversation-history.smoke.test.ts +271 -271
  15. package/src/__tests__/helpers/conversation-history.ts +119 -119
  16. package/src/__tests__/helpers/deferred.smoke.test.ts +103 -103
  17. package/src/__tests__/helpers/deferred.ts +69 -69
  18. package/src/__tests__/helpers/in-memory-storage.smoke.test.ts +155 -155
  19. package/src/__tests__/helpers/in-memory-storage.ts +88 -88
  20. package/src/__tests__/helpers/mock-bun-proxy.smoke.test.ts +68 -68
  21. package/src/__tests__/helpers/mock-bun-proxy.ts +189 -189
  22. package/src/__tests__/helpers/plugin-fetch-harness.smoke.test.ts +273 -273
  23. package/src/__tests__/helpers/plugin-fetch-harness.ts +288 -288
  24. package/src/__tests__/helpers/sse.smoke.test.ts +236 -236
  25. package/src/__tests__/helpers/sse.ts +209 -209
  26. package/src/__tests__/index.parallel.test.ts +605 -595
  27. package/src/__tests__/sanitization-regex.test.ts +112 -112
  28. package/src/__tests__/state-bounds.test.ts +90 -90
  29. package/src/account-identity.test.ts +197 -192
  30. package/src/account-identity.ts +69 -67
  31. package/src/account-state.test.ts +86 -86
  32. package/src/account-state.ts +25 -25
  33. package/src/accounts/matching.test.ts +335 -0
  34. package/src/accounts/matching.ts +167 -0
  35. package/src/accounts/persistence.test.ts +345 -0
  36. package/src/accounts/persistence.ts +432 -0
  37. package/src/accounts/repair.test.ts +276 -0
  38. package/src/accounts/repair.ts +407 -0
  39. package/src/accounts.dedup.test.ts +621 -621
  40. package/src/accounts.test.ts +933 -929
  41. package/src/accounts.ts +633 -989
  42. package/src/backoff.test.ts +345 -345
  43. package/src/backoff.ts +219 -219
  44. package/src/betas.ts +124 -124
  45. package/src/bun-fetch.test.ts +345 -342
  46. package/src/bun-fetch.ts +424 -424
  47. package/src/bun-proxy.test.ts +25 -25
  48. package/src/bun-proxy.ts +209 -209
  49. package/src/cc-credentials.ts +111 -111
  50. package/src/circuit-breaker.test.ts +184 -184
  51. package/src/circuit-breaker.ts +169 -169
  52. package/src/cli/commands/auth.ts +963 -0
  53. package/src/cli/commands/config.ts +547 -0
  54. package/src/cli/formatting.test.ts +406 -0
  55. package/src/cli/formatting.ts +219 -0
  56. package/src/cli.ts +255 -2022
  57. package/src/commands/handlers/betas.ts +100 -0
  58. package/src/commands/handlers/config.ts +99 -0
  59. package/src/commands/handlers/files.ts +375 -0
  60. package/src/commands/oauth-flow.ts +181 -166
  61. package/src/commands/prompts.ts +61 -61
  62. package/src/commands/router.test.ts +421 -0
  63. package/src/commands/router.ts +143 -635
  64. package/src/config.test.ts +482 -482
  65. package/src/config.ts +412 -404
  66. package/src/constants.ts +48 -48
  67. package/src/drift/cch-constants.ts +95 -95
  68. package/src/env.ts +111 -105
  69. package/src/headers/billing.ts +33 -33
  70. package/src/headers/builder.ts +130 -130
  71. package/src/headers/cch.ts +75 -75
  72. package/src/headers/stainless.ts +25 -25
  73. package/src/headers/user-agent.ts +23 -23
  74. package/src/index.ts +436 -828
  75. package/src/models.ts +27 -27
  76. package/src/oauth.test.ts +102 -102
  77. package/src/oauth.ts +178 -178
  78. package/src/parent-pid-watcher.test.ts +148 -148
  79. package/src/parent-pid-watcher.ts +69 -69
  80. package/src/plugin-helpers.ts +82 -82
  81. package/src/refresh-helpers.ts +145 -139
  82. package/src/refresh-lock.test.ts +94 -94
  83. package/src/refresh-lock.ts +93 -93
  84. package/src/request/body.history.test.ts +579 -571
  85. package/src/request/body.ts +255 -255
  86. package/src/request/metadata.ts +65 -65
  87. package/src/request/retry.test.ts +156 -156
  88. package/src/request/retry.ts +67 -67
  89. package/src/request/url.ts +21 -21
  90. package/src/request-orchestration-helpers.ts +648 -0
  91. package/src/response/index.ts +5 -5
  92. package/src/response/mcp.ts +58 -58
  93. package/src/response/streaming.test.ts +313 -311
  94. package/src/response/streaming.ts +412 -410
  95. package/src/rotation.test.ts +304 -301
  96. package/src/rotation.ts +205 -205
  97. package/src/storage.test.ts +547 -547
  98. package/src/storage.ts +315 -291
  99. package/src/system-prompt/builder.ts +38 -38
  100. package/src/system-prompt/index.ts +5 -5
  101. package/src/system-prompt/normalize.ts +60 -60
  102. package/src/system-prompt/sanitize.ts +30 -30
  103. package/src/thinking.ts +21 -20
  104. package/src/token-refresh.test.ts +265 -265
  105. package/src/token-refresh.ts +219 -214
  106. package/src/types.ts +30 -30
  107. package/dist/bun-proxy.mjs +0 -291
@@ -1,287 +1,287 @@
1
1
  export interface SSEEvent {
2
- event?: string;
3
- data: string;
4
- id?: string;
5
- retry?: number;
2
+ event?: string;
3
+ data: string;
4
+ id?: string;
5
+ retry?: number;
6
6
  }
7
7
 
8
8
  export interface MessageStartEvent {
9
- type: "message_start";
10
- message: {
11
- id: string;
12
- type: "message";
13
- role: "assistant";
14
- content: unknown[];
15
- model: string;
16
- stop_reason: null;
17
- stop_sequence: null;
18
- usage: {
19
- input_tokens: number;
20
- output_tokens: number;
9
+ type: "message_start";
10
+ message: {
11
+ id: string;
12
+ type: "message";
13
+ role: "assistant";
14
+ content: unknown[];
15
+ model: string;
16
+ stop_reason: null;
17
+ stop_sequence: null;
18
+ usage: {
19
+ input_tokens: number;
20
+ output_tokens: number;
21
+ };
21
22
  };
22
- };
23
23
  }
24
24
 
25
25
  export interface ContentBlockStartEvent {
26
- type: "content_block_start";
27
- index: number;
28
- content_block: {
29
- type: "text" | "tool_use";
30
- text?: string;
31
- id?: string;
32
- name?: string;
33
- input?: Record<string, unknown>;
34
- };
26
+ type: "content_block_start";
27
+ index: number;
28
+ content_block: {
29
+ type: "text" | "tool_use";
30
+ text?: string;
31
+ id?: string;
32
+ name?: string;
33
+ input?: Record<string, unknown>;
34
+ };
35
35
  }
36
36
 
37
37
  export interface ContentBlockDeltaEvent {
38
- type: "content_block_delta";
39
- index: number;
40
- delta: {
41
- type: "text_delta" | "input_json_delta";
42
- text?: string;
43
- partial_json?: string;
44
- };
38
+ type: "content_block_delta";
39
+ index: number;
40
+ delta: {
41
+ type: "text_delta" | "input_json_delta";
42
+ text?: string;
43
+ partial_json?: string;
44
+ };
45
45
  }
46
46
 
47
47
  export interface ContentBlockStopEvent {
48
- type: "content_block_stop";
49
- index: number;
48
+ type: "content_block_stop";
49
+ index: number;
50
50
  }
51
51
 
52
52
  export interface MessageDeltaEvent {
53
- type: "message_delta";
54
- delta: {
55
- stop_reason: string | null;
56
- stop_sequence: string | null;
57
- };
58
- usage: {
59
- output_tokens: number;
60
- };
53
+ type: "message_delta";
54
+ delta: {
55
+ stop_reason: string | null;
56
+ stop_sequence: string | null;
57
+ };
58
+ usage: {
59
+ output_tokens: number;
60
+ };
61
61
  }
62
62
 
63
63
  export interface MessageStopEvent {
64
- type: "message_stop";
64
+ type: "message_stop";
65
65
  }
66
66
 
67
67
  export interface ErrorEvent {
68
- type: "error";
69
- error: {
70
- type: string;
71
- message: string;
72
- };
68
+ type: "error";
69
+ error: {
70
+ type: string;
71
+ message: string;
72
+ };
73
73
  }
74
74
 
75
75
  export function encodeSSEEvent(event: SSEEvent): string {
76
- const lines: string[] = [];
76
+ const lines: string[] = [];
77
77
 
78
- if (event.event) {
79
- lines.push(`event: ${event.event}`);
80
- }
78
+ if (event.event) {
79
+ lines.push(`event: ${event.event}`);
80
+ }
81
81
 
82
- const dataLines = event.data.split("\n");
83
- for (const line of dataLines) {
84
- lines.push(`data: ${line}`);
85
- }
82
+ const dataLines = event.data.split("\n");
83
+ for (const line of dataLines) {
84
+ lines.push(`data: ${line}`);
85
+ }
86
86
 
87
- if (event.id !== undefined) {
88
- lines.push(`id: ${event.id}`);
89
- }
87
+ if (event.id !== undefined) {
88
+ lines.push(`id: ${event.id}`);
89
+ }
90
90
 
91
- if (event.retry !== undefined) {
92
- lines.push(`retry: ${event.retry}`);
93
- }
91
+ if (event.retry !== undefined) {
92
+ lines.push(`retry: ${event.retry}`);
93
+ }
94
94
 
95
- lines.push("", "");
95
+ lines.push("", "");
96
96
 
97
- return lines.join("\n");
97
+ return lines.join("\n");
98
98
  }
99
99
 
100
100
  export function encodeSSEStream(events: SSEEvent[]): string {
101
- return events.map(encodeSSEEvent).join("");
101
+ return events.map(encodeSSEEvent).join("");
102
102
  }
103
103
 
104
104
  export function chunkUtf8AtOffsets(text: string, byteOffsets: number[]): Uint8Array[] {
105
- const encoder = new TextEncoder();
106
- const fullBytes = encoder.encode(text);
107
- const chunks: Uint8Array[] = [];
108
-
109
- const sortedOffsets = [...new Set(byteOffsets)].sort((a, b) => a - b);
110
-
111
- let currentByte = 0;
112
-
113
- for (const offset of sortedOffsets) {
114
- if (offset <= currentByte || offset > fullBytes.length) {
115
- continue;
105
+ const encoder = new TextEncoder();
106
+ const fullBytes = encoder.encode(text);
107
+ const chunks: Uint8Array[] = [];
108
+
109
+ const sortedOffsets = [...new Set(byteOffsets)].sort((a, b) => a - b);
110
+
111
+ let currentByte = 0;
112
+
113
+ for (const offset of sortedOffsets) {
114
+ if (offset <= currentByte || offset > fullBytes.length) {
115
+ continue;
116
+ }
117
+
118
+ let endByte = offset;
119
+ while (endByte < fullBytes.length) {
120
+ const byte = fullBytes[endByte];
121
+ if ((byte & 0xc0) !== 0x80) {
122
+ break;
123
+ }
124
+ endByte++;
125
+ }
126
+
127
+ const chunk = fullBytes.slice(currentByte, endByte);
128
+ chunks.push(chunk);
129
+ currentByte = endByte;
116
130
  }
117
131
 
118
- let endByte = offset;
119
- while (endByte < fullBytes.length) {
120
- const byte = fullBytes[endByte];
121
- if ((byte & 0xc0) !== 0x80) {
122
- break;
123
- }
124
- endByte++;
132
+ if (currentByte < fullBytes.length) {
133
+ chunks.push(fullBytes.slice(currentByte));
125
134
  }
126
135
 
127
- const chunk = fullBytes.slice(currentByte, endByte);
128
- chunks.push(chunk);
129
- currentByte = endByte;
130
- }
131
-
132
- if (currentByte < fullBytes.length) {
133
- chunks.push(fullBytes.slice(currentByte));
134
- }
135
-
136
- return chunks;
136
+ return chunks;
137
137
  }
138
138
 
139
139
  export function makeSSEResponse(body: ReadableStream<Uint8Array> | string, init?: ResponseInit): Response {
140
- const headers = new Headers(init?.headers as unknown as string[][] | Record<string, string> | undefined);
141
- headers.set("content-type", "text/event-stream");
142
-
143
- return new Response(body, {
144
- ...init,
145
- status: init?.status ?? 200,
146
- headers,
147
- });
140
+ const headers = new Headers(init?.headers as unknown as string[][] | Record<string, string> | undefined);
141
+ headers.set("content-type", "text/event-stream");
142
+
143
+ return new Response(body, {
144
+ ...init,
145
+ status: init?.status ?? 200,
146
+ headers,
147
+ });
148
148
  }
149
149
 
150
150
  export function makeTruncatedSSEResponse(events: SSEEvent[], emitCount: number, init?: ResponseInit): Response {
151
- const eventsToEmit = events.slice(0, emitCount);
152
- const streamBody = encodeSSEStream(eventsToEmit);
153
-
154
- const stream = new ReadableStream<Uint8Array>({
155
- start(controller) {
156
- const chunks = chunkUtf8AtOffsets(streamBody, [1024, 2048, 4096]);
157
- for (const chunk of chunks) {
158
- controller.enqueue(chunk);
159
- }
160
- controller.close();
161
- },
162
- });
163
-
164
- return makeSSEResponse(stream, init);
151
+ const eventsToEmit = events.slice(0, emitCount);
152
+ const streamBody = encodeSSEStream(eventsToEmit);
153
+
154
+ const stream = new ReadableStream<Uint8Array>({
155
+ start(controller) {
156
+ const chunks = chunkUtf8AtOffsets(streamBody, [1024, 2048, 4096]);
157
+ for (const chunk of chunks) {
158
+ controller.enqueue(chunk);
159
+ }
160
+ controller.close();
161
+ },
162
+ });
163
+
164
+ return makeSSEResponse(stream, init);
165
165
  }
166
166
 
167
167
  export function makeMalformedSSEResponse(malformedContent: string, init?: ResponseInit): Response {
168
- const encoder = new TextEncoder();
168
+ const encoder = new TextEncoder();
169
169
 
170
- const stream = new ReadableStream<Uint8Array>({
171
- start(controller) {
172
- controller.enqueue(encoder.encode(malformedContent));
173
- controller.close();
174
- },
175
- });
170
+ const stream = new ReadableStream<Uint8Array>({
171
+ start(controller) {
172
+ controller.enqueue(encoder.encode(malformedContent));
173
+ controller.close();
174
+ },
175
+ });
176
176
 
177
- return makeSSEResponse(stream, init);
177
+ return makeSSEResponse(stream, init);
178
178
  }
179
179
 
180
180
  export function messageStartEvent(overrides: Partial<MessageStartEvent> = {}): SSEEvent {
181
- const defaultEvent: MessageStartEvent = {
182
- type: "message_start",
183
- message: {
184
- id: "msg_123",
185
- type: "message",
186
- role: "assistant",
187
- content: [],
188
- model: "claude-3-opus-20240229",
189
- stop_reason: null,
190
- stop_sequence: null,
191
- usage: {
192
- input_tokens: 10,
193
- output_tokens: 0,
194
- },
195
- },
196
- };
197
-
198
- return {
199
- data: JSON.stringify({ ...defaultEvent, ...overrides }),
200
- };
181
+ const defaultEvent: MessageStartEvent = {
182
+ type: "message_start",
183
+ message: {
184
+ id: "msg_123",
185
+ type: "message",
186
+ role: "assistant",
187
+ content: [],
188
+ model: "claude-3-opus-20240229",
189
+ stop_reason: null,
190
+ stop_sequence: null,
191
+ usage: {
192
+ input_tokens: 10,
193
+ output_tokens: 0,
194
+ },
195
+ },
196
+ };
197
+
198
+ return {
199
+ data: JSON.stringify({ ...defaultEvent, ...overrides }),
200
+ };
201
201
  }
202
202
 
203
203
  export function contentBlockStartEvent(index: number, overrides: Partial<ContentBlockStartEvent> = {}): SSEEvent {
204
- const defaultEvent: ContentBlockStartEvent = {
205
- type: "content_block_start",
206
- index,
207
- content_block: {
208
- type: "text",
209
- text: "",
210
- },
211
- };
212
-
213
- return {
214
- data: JSON.stringify({ ...defaultEvent, ...overrides }),
215
- };
204
+ const defaultEvent: ContentBlockStartEvent = {
205
+ type: "content_block_start",
206
+ index,
207
+ content_block: {
208
+ type: "text",
209
+ text: "",
210
+ },
211
+ };
212
+
213
+ return {
214
+ data: JSON.stringify({ ...defaultEvent, ...overrides }),
215
+ };
216
216
  }
217
217
 
218
218
  export function contentBlockDeltaEvent(
219
- index: number,
220
- text: string,
221
- overrides: Partial<ContentBlockDeltaEvent> = {},
219
+ index: number,
220
+ text: string,
221
+ overrides: Partial<ContentBlockDeltaEvent> = {},
222
222
  ): SSEEvent {
223
- const defaultEvent: ContentBlockDeltaEvent = {
224
- type: "content_block_delta",
225
- index,
226
- delta: {
227
- type: "text_delta",
228
- text,
229
- },
230
- };
231
-
232
- return {
233
- data: JSON.stringify({ ...defaultEvent, ...overrides }),
234
- };
223
+ const defaultEvent: ContentBlockDeltaEvent = {
224
+ type: "content_block_delta",
225
+ index,
226
+ delta: {
227
+ type: "text_delta",
228
+ text,
229
+ },
230
+ };
231
+
232
+ return {
233
+ data: JSON.stringify({ ...defaultEvent, ...overrides }),
234
+ };
235
235
  }
236
236
 
237
237
  export function contentBlockStopEvent(index: number, overrides: Partial<ContentBlockStopEvent> = {}): SSEEvent {
238
- const defaultEvent: ContentBlockStopEvent = {
239
- type: "content_block_stop",
240
- index,
241
- };
242
-
243
- return {
244
- data: JSON.stringify({ ...defaultEvent, ...overrides }),
245
- };
238
+ const defaultEvent: ContentBlockStopEvent = {
239
+ type: "content_block_stop",
240
+ index,
241
+ };
242
+
243
+ return {
244
+ data: JSON.stringify({ ...defaultEvent, ...overrides }),
245
+ };
246
246
  }
247
247
 
248
248
  export function messageDeltaEvent(overrides: Partial<MessageDeltaEvent> = {}): SSEEvent {
249
- const defaultEvent: MessageDeltaEvent = {
250
- type: "message_delta",
251
- delta: {
252
- stop_reason: "end_turn",
253
- stop_sequence: null,
254
- },
255
- usage: {
256
- output_tokens: 100,
257
- },
258
- };
249
+ const defaultEvent: MessageDeltaEvent = {
250
+ type: "message_delta",
251
+ delta: {
252
+ stop_reason: "end_turn",
253
+ stop_sequence: null,
254
+ },
255
+ usage: {
256
+ output_tokens: 100,
257
+ },
258
+ };
259
259
 
260
- return {
261
- data: JSON.stringify({ ...defaultEvent, ...overrides }),
262
- };
260
+ return {
261
+ data: JSON.stringify({ ...defaultEvent, ...overrides }),
262
+ };
263
263
  }
264
264
 
265
265
  export function messageStopEvent(overrides: Partial<MessageStopEvent> = {}): SSEEvent {
266
- const defaultEvent: MessageStopEvent = {
267
- type: "message_stop",
268
- };
266
+ const defaultEvent: MessageStopEvent = {
267
+ type: "message_stop",
268
+ };
269
269
 
270
- return {
271
- data: JSON.stringify({ ...defaultEvent, ...overrides }),
272
- };
270
+ return {
271
+ data: JSON.stringify({ ...defaultEvent, ...overrides }),
272
+ };
273
273
  }
274
274
 
275
275
  export function errorEvent(errorType: string, message: string, overrides: Partial<ErrorEvent> = {}): SSEEvent {
276
- const defaultEvent: ErrorEvent = {
277
- type: "error",
278
- error: {
279
- type: errorType,
280
- message,
281
- },
282
- };
283
-
284
- return {
285
- data: JSON.stringify({ ...defaultEvent, ...overrides }),
286
- };
276
+ const defaultEvent: ErrorEvent = {
277
+ type: "error",
278
+ error: {
279
+ type: errorType,
280
+ message,
281
+ },
282
+ };
283
+
284
+ return {
285
+ data: JSON.stringify({ ...defaultEvent, ...overrides }),
286
+ };
287
287
  }