opencode-windsurf-codeium 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,359 @@
1
+ /**
2
+ * Cloud API Client for Windsurf/Codeium
3
+ *
4
+ * Communicates directly with server.self-serve.windsurf.com using Connect-RPC protocol.
5
+ * This allows standalone operation without requiring Windsurf IDE to be running.
6
+ */
7
+ import * as http2 from 'http2';
8
+ import * as crypto from 'crypto';
9
+ import { ChatMessageSource } from './types.js';
10
+ import { modelNameToEnum } from './models.js';
11
+ // ============================================================================
12
+ // Protobuf Encoding (same as grpc-client.ts)
13
+ // ============================================================================
14
+ function encodeVarint(value) {
15
+ const bytes = [];
16
+ let v = BigInt(value);
17
+ while (v > 127n) {
18
+ bytes.push(Number(v & 0x7fn) | 0x80);
19
+ v >>= 7n;
20
+ }
21
+ bytes.push(Number(v));
22
+ return bytes;
23
+ }
24
+ function encodeString(fieldNum, str) {
25
+ const strBytes = Buffer.from(str, 'utf8');
26
+ return [(fieldNum << 3) | 2, ...encodeVarint(strBytes.length), ...strBytes];
27
+ }
28
+ function encodeMessage(fieldNum, data) {
29
+ return [(fieldNum << 3) | 2, ...encodeVarint(data.length), ...data];
30
+ }
31
+ function encodeVarintField(fieldNum, value) {
32
+ return [(fieldNum << 3) | 0, ...encodeVarint(value)];
33
+ }
34
+ function generateUUID() {
35
+ return crypto.randomUUID();
36
+ }
37
+ function encodeTimestamp() {
38
+ const now = Date.now();
39
+ const seconds = Math.floor(now / 1000);
40
+ const nanos = (now % 1000) * 1_000_000;
41
+ const bytes = [];
42
+ bytes.push(...encodeVarintField(1, seconds));
43
+ if (nanos > 0) {
44
+ bytes.push(...encodeVarintField(2, nanos));
45
+ }
46
+ return bytes;
47
+ }
48
+ function encodeIntentGeneric(text) {
49
+ return encodeString(1, text);
50
+ }
51
+ function encodeChatMessageIntent(text) {
52
+ const generic = encodeIntentGeneric(text);
53
+ return encodeMessage(1, generic);
54
+ }
55
+ function encodeChatMessage(content, source, conversationId) {
56
+ const messageId = generateUUID();
57
+ const bytes = [];
58
+ bytes.push(...encodeString(1, messageId));
59
+ bytes.push(...encodeVarintField(2, source));
60
+ const timestamp = encodeTimestamp();
61
+ bytes.push(...encodeMessage(3, timestamp));
62
+ bytes.push(...encodeString(4, conversationId));
63
+ const intent = encodeChatMessageIntent(content);
64
+ bytes.push(...encodeMessage(5, intent));
65
+ return bytes;
66
+ }
67
+ function encodeMetadata(apiKey, version) {
68
+ return [
69
+ ...encodeString(1, 'windsurf'),
70
+ ...encodeString(2, version),
71
+ ...encodeString(3, apiKey),
72
+ ...encodeString(4, 'en'),
73
+ ...encodeString(7, version),
74
+ ...encodeString(12, 'windsurf'),
75
+ ];
76
+ }
77
+ function roleToSource(role) {
78
+ switch (role) {
79
+ case 'user': return ChatMessageSource.USER;
80
+ case 'assistant': return ChatMessageSource.ASSISTANT;
81
+ case 'system': return ChatMessageSource.SYSTEM;
82
+ case 'tool': return ChatMessageSource.TOOL;
83
+ default: return ChatMessageSource.USER;
84
+ }
85
+ }
86
+ function buildCloudChatRequest(apiKey, version, modelEnum, messages) {
87
+ const metadata = encodeMetadata(apiKey, version);
88
+ const conversationId = generateUUID();
89
+ const request = [];
90
+ request.push(...encodeMessage(1, metadata));
91
+ let systemPrompt = '';
92
+ for (const msg of messages) {
93
+ if (msg.role === 'system') {
94
+ systemPrompt = msg.content;
95
+ }
96
+ else {
97
+ const source = roleToSource(msg.role);
98
+ const chatMsg = encodeChatMessage(msg.content, source, conversationId);
99
+ request.push(...encodeMessage(2, chatMsg));
100
+ }
101
+ }
102
+ if (systemPrompt) {
103
+ request.push(...encodeString(3, systemPrompt));
104
+ }
105
+ request.push(...encodeVarintField(4, modelEnum));
106
+ const payload = Buffer.from(request);
107
+ return payload;
108
+ }
109
+ // ============================================================================
110
+ // Connect-RPC Framing
111
+ // ============================================================================
112
+ function encodeConnectRequest(path, data) {
113
+ const jsonMeta = JSON.stringify({
114
+ path,
115
+ headers: {
116
+ 'content-type': 'application/connect+proto'
117
+ }
118
+ });
119
+ const metaBytes = Buffer.from(jsonMeta, 'utf8');
120
+ const metaLength = encodeVarint(metaBytes.length);
121
+ const dataLength = encodeVarint(data.length);
122
+ const frame = Buffer.concat([
123
+ Buffer.from([0x00]),
124
+ Buffer.from(metaLength),
125
+ metaBytes,
126
+ Buffer.from(dataLength),
127
+ data
128
+ ]);
129
+ return frame;
130
+ }
131
+ function decodeVarint(buffer, offset) {
132
+ let result = 0n;
133
+ let shift = 0n;
134
+ let bytesRead = 0;
135
+ while (offset + bytesRead < buffer.length) {
136
+ const byte = buffer[offset + bytesRead];
137
+ bytesRead++;
138
+ result |= BigInt(byte & 0x7f) << shift;
139
+ if ((byte & 0x80) === 0) {
140
+ break;
141
+ }
142
+ shift += 7n;
143
+ }
144
+ return [result, bytesRead];
145
+ }
146
+ function parseProtobufField(buffer, offset) {
147
+ if (offset >= buffer.length)
148
+ return null;
149
+ const [tag, tagBytes] = decodeVarint(buffer, offset);
150
+ const fieldNum = Number(tag >> 3n);
151
+ const wireType = Number(tag & 0x7n);
152
+ let bytesConsumed = tagBytes;
153
+ let value;
154
+ switch (wireType) {
155
+ case 0:
156
+ const [varintValue, varintBytes] = decodeVarint(buffer, offset + bytesConsumed);
157
+ value = varintValue;
158
+ bytesConsumed += varintBytes;
159
+ break;
160
+ case 2:
161
+ const [length, lengthBytes] = decodeVarint(buffer, offset + bytesConsumed);
162
+ bytesConsumed += lengthBytes;
163
+ const len = Number(length);
164
+ if (offset + bytesConsumed + len > buffer.length)
165
+ return null;
166
+ value = buffer.subarray(offset + bytesConsumed, offset + bytesConsumed + len);
167
+ bytesConsumed += len;
168
+ break;
169
+ default:
170
+ return null;
171
+ }
172
+ return { fieldNum, wireType, value, bytesConsumed };
173
+ }
174
+ function decodeConnectResponse(buffer) {
175
+ let offset = 0;
176
+ offset += 1; // Skip flag byte
177
+ const [metaLength, metaBytesRead] = decodeVarint(buffer, offset);
178
+ offset += metaBytesRead;
179
+ offset += Number(metaLength);
180
+ const [dataLength, dataBytesRead] = decodeVarint(buffer, offset);
181
+ offset += dataBytesRead;
182
+ const data = buffer.subarray(offset, offset + Number(dataLength));
183
+ return { data, trailers: {} };
184
+ }
185
+ // ============================================================================
186
+ // Response Parsing (same as grpc-client.ts)
187
+ // ============================================================================
188
+ function extractTextFromRawChatMessage(buffer) {
189
+ let offset = 0;
190
+ while (offset < buffer.length) {
191
+ const field = parseProtobufField(buffer, offset);
192
+ if (!field)
193
+ break;
194
+ offset += field.bytesConsumed;
195
+ // Field 5 is the text content in RawChatMessage
196
+ if (field.fieldNum === 5 && field.wireType === 2 && Buffer.isBuffer(field.value)) {
197
+ return field.value.toString('utf8');
198
+ }
199
+ }
200
+ return '';
201
+ }
202
+ function extractTextFromResponse(buffer) {
203
+ let offset = 0;
204
+ while (offset < buffer.length) {
205
+ const field = parseProtobufField(buffer, offset);
206
+ if (!field)
207
+ break;
208
+ offset += field.bytesConsumed;
209
+ // Field 1 is delta_message (RawChatMessage)
210
+ if (field.fieldNum === 1 && field.wireType === 2 && Buffer.isBuffer(field.value)) {
211
+ const text = extractTextFromRawChatMessage(field.value);
212
+ if (text)
213
+ return text;
214
+ }
215
+ }
216
+ return '';
217
+ }
218
+ // ============================================================================
219
+ // Cloud API Client
220
+ // ============================================================================
221
+ const CLOUD_API_URL = 'https://server.self-serve.windsurf.com';
222
+ export async function streamChatCloud(credentials, options) {
223
+ const { apiKey, version } = credentials;
224
+ const modelEnum = modelNameToEnum(options.model);
225
+ const body = buildCloudChatRequest(apiKey, version, modelEnum, options.messages);
226
+ const connectFrame = encodeConnectRequest('/exa.api_server_pb.ApiServerService/GetChatMessage', body);
227
+ return new Promise((resolve, reject) => {
228
+ const client = http2.connect(CLOUD_API_URL, {
229
+ rejectUnauthorized: true,
230
+ });
231
+ const chunks = [];
232
+ client.on('error', (err) => {
233
+ options.onError?.(err);
234
+ reject(new Error(`Connection failed: ${err.message}`));
235
+ });
236
+ client.on('connect', () => {
237
+ const req = client.request({
238
+ ':method': 'POST',
239
+ ':path': '/exa.api_server_pb.ApiServerService/GetChatMessage',
240
+ 'content-type': 'application/connect+proto',
241
+ 'te': 'trailers',
242
+ 'x-codeium-api-key': apiKey,
243
+ });
244
+ req.on('data', (chunk) => {
245
+ console.error('[cloud-client] Raw chunk length:', chunk.length);
246
+ console.error('[cloud-client] Raw chunk hex (first 100 bytes):', chunk.subarray(0, 100).toString('hex'));
247
+ try {
248
+ const { data } = decodeConnectResponse(chunk);
249
+ console.error('[cloud-client] Decoded data length:', data.length);
250
+ console.error('[cloud-client] Decoded data hex (first 100 bytes):', data.subarray(0, 100).toString('hex'));
251
+ const text = extractTextFromResponse(data);
252
+ console.error('[cloud-client] Extracted text:', text.substring(0, 100));
253
+ if (text) {
254
+ chunks.push(text);
255
+ options.onChunk?.(text);
256
+ }
257
+ }
258
+ catch (e) {
259
+ console.error('[cloud-client] Error parsing chunk:', e);
260
+ }
261
+ });
262
+ req.on('trailers', (trailers) => {
263
+ const status = trailers[':status'];
264
+ if (status && status !== '200') {
265
+ const message = trailers['grpc-message'] || 'Unknown error';
266
+ const err = new Error(`API error ${status}: ${message}`);
267
+ options.onError?.(err);
268
+ reject(err);
269
+ return;
270
+ }
271
+ });
272
+ req.on('end', () => {
273
+ client.close();
274
+ const fullText = chunks.join('');
275
+ options.onComplete?.(fullText);
276
+ resolve(fullText);
277
+ });
278
+ req.on('error', (err) => {
279
+ client.close();
280
+ options.onError?.(err);
281
+ reject(new Error(`Request failed: ${err.message}`));
282
+ });
283
+ req.write(connectFrame);
284
+ req.end();
285
+ });
286
+ setTimeout(() => {
287
+ client.close();
288
+ const fullText = chunks.join('');
289
+ options.onComplete?.(fullText);
290
+ resolve(fullText);
291
+ }, 120000);
292
+ });
293
+ }
294
+ export async function* streamChatCloudGenerator(credentials, options) {
295
+ const { apiKey, version } = credentials;
296
+ const modelEnum = modelNameToEnum(options.model);
297
+ const body = buildCloudChatRequest(apiKey, version, modelEnum, options.messages);
298
+ const connectFrame = encodeConnectRequest('/exa.api_server_pb.ApiServerService/GetChatMessage', body);
299
+ const client = http2.connect(CLOUD_API_URL, {
300
+ rejectUnauthorized: true,
301
+ });
302
+ const chunkQueue = [];
303
+ let done = false;
304
+ let error = null;
305
+ let resolveWait = null;
306
+ client.on('error', (err) => {
307
+ error = new Error(`Connection failed: ${err.message}`);
308
+ done = true;
309
+ resolveWait?.();
310
+ });
311
+ const req = client.request({
312
+ ':method': 'POST',
313
+ ':path': '/exa.api_server_pb.ApiServerService/GetChatMessage',
314
+ 'content-type': 'application/connect+proto',
315
+ 'te': 'trailers',
316
+ 'x-codeium-api-key': apiKey,
317
+ });
318
+ req.on('data', (chunk) => {
319
+ try {
320
+ const { data } = decodeConnectResponse(chunk);
321
+ const text = extractTextFromResponse(data);
322
+ if (text) {
323
+ chunkQueue.push(text);
324
+ resolveWait?.();
325
+ }
326
+ }
327
+ catch (e) {
328
+ // Skip parsing errors
329
+ }
330
+ });
331
+ req.on('end', () => {
332
+ done = true;
333
+ client.close();
334
+ resolveWait?.();
335
+ });
336
+ req.on('error', (err) => {
337
+ error = new Error(`Request failed: ${err.message}`);
338
+ done = true;
339
+ client.close();
340
+ resolveWait?.();
341
+ });
342
+ req.write(connectFrame);
343
+ req.end();
344
+ while (!done || chunkQueue.length > 0) {
345
+ if (chunkQueue.length > 0) {
346
+ yield chunkQueue.shift();
347
+ }
348
+ else if (!done) {
349
+ await new Promise((resolve) => {
350
+ resolveWait = resolve;
351
+ });
352
+ resolveWait = null;
353
+ }
354
+ }
355
+ if (error) {
356
+ throw error;
357
+ }
358
+ }
359
+ //# sourceMappingURL=cloud-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-client.js","sourceRoot":"","sources":["../../../src/plugin/cloud-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * gRPC Client for Windsurf Language Server
3
+ *
4
+ * Implements HTTP/2-based gRPC communication with the local Windsurf language server.
5
+ * Uses manual protobuf encoding (no external protobuf library needed).
6
+ */
7
+ import { WindsurfCredentials } from './auth.js';
8
+ export interface ChatMessage {
9
+ role: 'user' | 'assistant' | 'system' | 'tool';
10
+ content: string;
11
+ }
12
+ export interface StreamChatOptions {
13
+ model: string;
14
+ messages: ChatMessage[];
15
+ onChunk?: (text: string) => void;
16
+ onComplete?: (fullText: string) => void;
17
+ onError?: (error: Error) => void;
18
+ }
19
+ /**
20
+ * Stream chat completion using Promise-based API
21
+ *
22
+ * @param credentials - Windsurf credentials (csrf, port, apiKey, version)
23
+ * @param options - Chat options including model, messages, and callbacks
24
+ * @returns Promise that resolves to the full response text
25
+ */
26
+ export declare function streamChat(credentials: WindsurfCredentials, options: StreamChatOptions): Promise<string>;
27
+ /**
28
+ * Stream chat completion using async generator
29
+ *
30
+ * Yields text chunks as they arrive, for use with SSE streaming.
31
+ *
32
+ * @param credentials - Windsurf credentials
33
+ * @param options - Chat options (model and messages)
34
+ * @yields Text chunks as they arrive
35
+ */
36
+ export declare function streamChatGenerator(credentials: WindsurfCredentials, options: Pick<StreamChatOptions, 'model' | 'messages'>): AsyncGenerator<string, void, unknown>;
37
+ //# sourceMappingURL=grpc-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grpc-client.d.ts","sourceRoot":"","sources":["../../../src/plugin/grpc-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,mBAAmB,EAAoC,MAAM,WAAW,CAAC;AAMlF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AA4bD;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,WAAW,EAAE,mBAAmB,EAChC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,CA6EjB;AAED;;;;;;;;GAQG;AACH,wBAAuB,mBAAmB,CACxC,WAAW,EAAE,mBAAmB,EAChC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,UAAU,CAAC,GACrD,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAoFvC"}