@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.
- package/README.md +88 -88
- package/dist/opencode-anthropic-auth-cli.mjs +804 -507
- package/dist/opencode-anthropic-auth-plugin.js +4751 -4109
- package/package.json +67 -59
- package/src/__tests__/billing-edge-cases.test.ts +59 -59
- package/src/__tests__/bun-proxy.parallel.test.ts +388 -382
- package/src/__tests__/cc-comparison.test.ts +87 -87
- package/src/__tests__/cc-credentials.test.ts +254 -250
- package/src/__tests__/cch-drift-checker.test.ts +51 -51
- package/src/__tests__/cch-native-style.test.ts +56 -56
- package/src/__tests__/debug-gating.test.ts +42 -42
- package/src/__tests__/decomposition-smoke.test.ts +68 -68
- package/src/__tests__/fingerprint-regression.test.ts +575 -566
- package/src/__tests__/helpers/conversation-history.smoke.test.ts +271 -271
- package/src/__tests__/helpers/conversation-history.ts +119 -119
- package/src/__tests__/helpers/deferred.smoke.test.ts +103 -103
- package/src/__tests__/helpers/deferred.ts +69 -69
- package/src/__tests__/helpers/in-memory-storage.smoke.test.ts +155 -155
- package/src/__tests__/helpers/in-memory-storage.ts +88 -88
- package/src/__tests__/helpers/mock-bun-proxy.smoke.test.ts +68 -68
- package/src/__tests__/helpers/mock-bun-proxy.ts +189 -189
- package/src/__tests__/helpers/plugin-fetch-harness.smoke.test.ts +273 -273
- package/src/__tests__/helpers/plugin-fetch-harness.ts +288 -288
- package/src/__tests__/helpers/sse.smoke.test.ts +236 -236
- package/src/__tests__/helpers/sse.ts +209 -209
- package/src/__tests__/index.parallel.test.ts +605 -595
- package/src/__tests__/sanitization-regex.test.ts +112 -112
- package/src/__tests__/state-bounds.test.ts +90 -90
- package/src/account-identity.test.ts +197 -192
- package/src/account-identity.ts +69 -67
- package/src/account-state.test.ts +86 -86
- package/src/account-state.ts +25 -25
- package/src/accounts/matching.test.ts +335 -0
- package/src/accounts/matching.ts +167 -0
- package/src/accounts/persistence.test.ts +345 -0
- package/src/accounts/persistence.ts +432 -0
- package/src/accounts/repair.test.ts +276 -0
- package/src/accounts/repair.ts +407 -0
- package/src/accounts.dedup.test.ts +621 -621
- package/src/accounts.test.ts +933 -929
- package/src/accounts.ts +633 -989
- package/src/backoff.test.ts +345 -345
- package/src/backoff.ts +219 -219
- package/src/betas.ts +124 -124
- package/src/bun-fetch.test.ts +345 -342
- package/src/bun-fetch.ts +424 -424
- package/src/bun-proxy.test.ts +25 -25
- package/src/bun-proxy.ts +209 -209
- package/src/cc-credentials.ts +111 -111
- package/src/circuit-breaker.test.ts +184 -184
- package/src/circuit-breaker.ts +169 -169
- package/src/cli/commands/auth.ts +963 -0
- package/src/cli/commands/config.ts +547 -0
- package/src/cli/formatting.test.ts +406 -0
- package/src/cli/formatting.ts +219 -0
- package/src/cli.ts +255 -2022
- package/src/commands/handlers/betas.ts +100 -0
- package/src/commands/handlers/config.ts +99 -0
- package/src/commands/handlers/files.ts +375 -0
- package/src/commands/oauth-flow.ts +181 -166
- package/src/commands/prompts.ts +61 -61
- package/src/commands/router.test.ts +421 -0
- package/src/commands/router.ts +143 -635
- package/src/config.test.ts +482 -482
- package/src/config.ts +412 -404
- package/src/constants.ts +48 -48
- package/src/drift/cch-constants.ts +95 -95
- package/src/env.ts +111 -105
- package/src/headers/billing.ts +33 -33
- package/src/headers/builder.ts +130 -130
- package/src/headers/cch.ts +75 -75
- package/src/headers/stainless.ts +25 -25
- package/src/headers/user-agent.ts +23 -23
- package/src/index.ts +436 -828
- package/src/models.ts +27 -27
- package/src/oauth.test.ts +102 -102
- package/src/oauth.ts +178 -178
- package/src/parent-pid-watcher.test.ts +148 -148
- package/src/parent-pid-watcher.ts +69 -69
- package/src/plugin-helpers.ts +82 -82
- package/src/refresh-helpers.ts +145 -139
- package/src/refresh-lock.test.ts +94 -94
- package/src/refresh-lock.ts +93 -93
- package/src/request/body.history.test.ts +579 -571
- package/src/request/body.ts +255 -255
- package/src/request/metadata.ts +65 -65
- package/src/request/retry.test.ts +156 -156
- package/src/request/retry.ts +67 -67
- package/src/request/url.ts +21 -21
- package/src/request-orchestration-helpers.ts +648 -0
- package/src/response/index.ts +5 -5
- package/src/response/mcp.ts +58 -58
- package/src/response/streaming.test.ts +313 -311
- package/src/response/streaming.ts +412 -410
- package/src/rotation.test.ts +304 -301
- package/src/rotation.ts +205 -205
- package/src/storage.test.ts +547 -547
- package/src/storage.ts +315 -291
- package/src/system-prompt/builder.ts +38 -38
- package/src/system-prompt/index.ts +5 -5
- package/src/system-prompt/normalize.ts +60 -60
- package/src/system-prompt/sanitize.ts +30 -30
- package/src/thinking.ts +21 -20
- package/src/token-refresh.test.ts +265 -265
- package/src/token-refresh.ts +219 -214
- package/src/types.ts +30 -30
- package/dist/bun-proxy.mjs +0 -291
|
@@ -1,287 +1,287 @@
|
|
|
1
1
|
export interface SSEEvent {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
event?: string;
|
|
3
|
+
data: string;
|
|
4
|
+
id?: string;
|
|
5
|
+
retry?: number;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export interface MessageStartEvent {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
49
|
-
|
|
48
|
+
type: "content_block_stop";
|
|
49
|
+
index: number;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
export interface MessageDeltaEvent {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
64
|
+
type: "message_stop";
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
export interface ErrorEvent {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
76
|
+
const lines: string[] = [];
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
if (event.event) {
|
|
79
|
+
lines.push(`event: ${event.event}`);
|
|
80
|
+
}
|
|
81
81
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
82
|
+
const dataLines = event.data.split("\n");
|
|
83
|
+
for (const line of dataLines) {
|
|
84
|
+
lines.push(`data: ${line}`);
|
|
85
|
+
}
|
|
86
86
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
if (event.id !== undefined) {
|
|
88
|
+
lines.push(`id: ${event.id}`);
|
|
89
|
+
}
|
|
90
90
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
if (event.retry !== undefined) {
|
|
92
|
+
lines.push(`retry: ${event.retry}`);
|
|
93
|
+
}
|
|
94
94
|
|
|
95
|
-
|
|
95
|
+
lines.push("", "");
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
return lines.join("\n");
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
export function encodeSSEStream(events: SSEEvent[]): string {
|
|
101
|
-
|
|
101
|
+
return events.map(encodeSSEEvent).join("");
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
export function chunkUtf8AtOffsets(text: string, byteOffsets: number[]): Uint8Array[] {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
|
|
119
|
-
|
|
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
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
168
|
+
const encoder = new TextEncoder();
|
|
169
169
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
177
|
+
return makeSSEResponse(stream, init);
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
export function messageStartEvent(overrides: Partial<MessageStartEvent> = {}): SSEEvent {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
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
|
-
|
|
220
|
-
|
|
221
|
-
|
|
219
|
+
index: number,
|
|
220
|
+
text: string,
|
|
221
|
+
overrides: Partial<ContentBlockDeltaEvent> = {},
|
|
222
222
|
): SSEEvent {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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
|
-
|
|
261
|
-
|
|
262
|
-
|
|
260
|
+
return {
|
|
261
|
+
data: JSON.stringify({ ...defaultEvent, ...overrides }),
|
|
262
|
+
};
|
|
263
263
|
}
|
|
264
264
|
|
|
265
265
|
export function messageStopEvent(overrides: Partial<MessageStopEvent> = {}): SSEEvent {
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
266
|
+
const defaultEvent: MessageStopEvent = {
|
|
267
|
+
type: "message_stop",
|
|
268
|
+
};
|
|
269
269
|
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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
|
}
|