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.
- package/README.md +272 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/src/constants.d.ts +118 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +174 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/plugin/auth.d.ts +71 -0
- package/dist/src/plugin/auth.d.ts.map +1 -0
- package/dist/src/plugin/auth.js +242 -0
- package/dist/src/plugin/auth.js.map +1 -0
- package/dist/src/plugin/cloud-client.d.ts +24 -0
- package/dist/src/plugin/cloud-client.d.ts.map +1 -0
- package/dist/src/plugin/cloud-client.js +359 -0
- package/dist/src/plugin/cloud-client.js.map +1 -0
- package/dist/src/plugin/grpc-client.d.ts +37 -0
- package/dist/src/plugin/grpc-client.d.ts.map +1 -0
- package/dist/src/plugin/grpc-client.js +521 -0
- package/dist/src/plugin/grpc-client.js.map +1 -0
- package/dist/src/plugin/models.d.ts +50 -0
- package/dist/src/plugin/models.d.ts.map +1 -0
- package/dist/src/plugin/models.js +390 -0
- package/dist/src/plugin/models.js.map +1 -0
- package/dist/src/plugin/types.d.ts +414 -0
- package/dist/src/plugin/types.d.ts.map +1 -0
- package/dist/src/plugin/types.js +177 -0
- package/dist/src/plugin/types.js.map +1 -0
- package/dist/src/plugin.d.ts +25 -0
- package/dist/src/plugin.d.ts.map +1 -0
- package/dist/src/plugin.js +242 -0
- package/dist/src/plugin.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,521 @@
|
|
|
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 * as http2 from 'http2';
|
|
8
|
+
import * as crypto from 'crypto';
|
|
9
|
+
import { ChatMessageSource } from './types.js';
|
|
10
|
+
import { modelNameToEnum } from './models.js';
|
|
11
|
+
import { WindsurfError, WindsurfErrorCode } from './auth.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Protobuf Encoding Helpers
|
|
14
|
+
// ============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Encode a number as a varint (variable-length integer)
|
|
17
|
+
*/
|
|
18
|
+
function encodeVarint(value) {
|
|
19
|
+
const bytes = [];
|
|
20
|
+
let v = BigInt(value);
|
|
21
|
+
while (v > 127n) {
|
|
22
|
+
bytes.push(Number(v & 0x7fn) | 0x80);
|
|
23
|
+
v >>= 7n;
|
|
24
|
+
}
|
|
25
|
+
bytes.push(Number(v));
|
|
26
|
+
return bytes;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Encode a string field (wire type 2: length-delimited)
|
|
30
|
+
*/
|
|
31
|
+
function encodeString(fieldNum, str) {
|
|
32
|
+
const strBytes = Buffer.from(str, 'utf8');
|
|
33
|
+
return [(fieldNum << 3) | 2, ...encodeVarint(strBytes.length), ...strBytes];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Encode a nested message field (wire type 2: length-delimited)
|
|
37
|
+
*/
|
|
38
|
+
function encodeMessage(fieldNum, data) {
|
|
39
|
+
return [(fieldNum << 3) | 2, ...encodeVarint(data.length), ...data];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Encode a varint field (wire type 0)
|
|
43
|
+
*/
|
|
44
|
+
function encodeVarintField(fieldNum, value) {
|
|
45
|
+
return [(fieldNum << 3) | 0, ...encodeVarint(value)];
|
|
46
|
+
}
|
|
47
|
+
// ============================================================================
|
|
48
|
+
// Request Building
|
|
49
|
+
// ============================================================================
|
|
50
|
+
/**
|
|
51
|
+
* Generate a UUID for message and conversation IDs
|
|
52
|
+
*/
|
|
53
|
+
function generateUUID() {
|
|
54
|
+
return crypto.randomUUID();
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Encode a google.protobuf.Timestamp
|
|
58
|
+
* Field 1: seconds (int64)
|
|
59
|
+
* Field 2: nanos (int32)
|
|
60
|
+
*/
|
|
61
|
+
function encodeTimestamp() {
|
|
62
|
+
const now = Date.now();
|
|
63
|
+
const seconds = Math.floor(now / 1000);
|
|
64
|
+
const nanos = (now % 1000) * 1_000_000;
|
|
65
|
+
const bytes = [];
|
|
66
|
+
bytes.push(...encodeVarintField(1, seconds));
|
|
67
|
+
if (nanos > 0) {
|
|
68
|
+
bytes.push(...encodeVarintField(2, nanos));
|
|
69
|
+
}
|
|
70
|
+
return bytes;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Encode IntentGeneric message
|
|
74
|
+
* Field 1: text (string)
|
|
75
|
+
*/
|
|
76
|
+
function encodeIntentGeneric(text) {
|
|
77
|
+
return encodeString(1, text);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Encode ChatMessageIntent message
|
|
81
|
+
* Field 1: generic (IntentGeneric, oneof)
|
|
82
|
+
* Field 12: num_tokens (int32)
|
|
83
|
+
*/
|
|
84
|
+
function encodeChatMessageIntent(text) {
|
|
85
|
+
const generic = encodeIntentGeneric(text);
|
|
86
|
+
return encodeMessage(1, generic);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Encode a ChatMessage for the RawGetChatMessageRequest
|
|
90
|
+
*
|
|
91
|
+
* ChatMessage structure (from reverse engineering):
|
|
92
|
+
* Field 1: message_id (string, required)
|
|
93
|
+
* Field 2: source (enum: 1=USER, 2=SYSTEM)
|
|
94
|
+
* Field 3: timestamp (google.protobuf.Timestamp, required)
|
|
95
|
+
* Field 4: conversation_id (string, required)
|
|
96
|
+
* Field 5: intent (ChatMessageIntent, oneof content)
|
|
97
|
+
*/
|
|
98
|
+
function encodeChatMessage(content, source, conversationId) {
|
|
99
|
+
const messageId = generateUUID();
|
|
100
|
+
const bytes = [];
|
|
101
|
+
// Field 1: message_id (required)
|
|
102
|
+
bytes.push(...encodeString(1, messageId));
|
|
103
|
+
// Field 2: source
|
|
104
|
+
bytes.push(...encodeVarintField(2, source));
|
|
105
|
+
// Field 3: timestamp (required)
|
|
106
|
+
const timestamp = encodeTimestamp();
|
|
107
|
+
bytes.push(...encodeMessage(3, timestamp));
|
|
108
|
+
// Field 4: conversation_id (required)
|
|
109
|
+
bytes.push(...encodeString(4, conversationId));
|
|
110
|
+
// Field 5: intent (ChatMessageIntent)
|
|
111
|
+
const intent = encodeChatMessageIntent(content);
|
|
112
|
+
bytes.push(...encodeMessage(5, intent));
|
|
113
|
+
return bytes;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Build the metadata message for the request
|
|
117
|
+
*
|
|
118
|
+
* Metadata structure:
|
|
119
|
+
* Field 1: ide_name (string)
|
|
120
|
+
* Field 2: extension_version (string)
|
|
121
|
+
* Field 3: api_key (string, required)
|
|
122
|
+
* Field 4: locale (string)
|
|
123
|
+
* Field 7: ide_version (string)
|
|
124
|
+
* Field 12: extension_name (string)
|
|
125
|
+
*/
|
|
126
|
+
function encodeMetadata(apiKey, version) {
|
|
127
|
+
return [
|
|
128
|
+
...encodeString(1, 'windsurf'), // ide_name
|
|
129
|
+
...encodeString(2, version), // extension_version
|
|
130
|
+
...encodeString(3, apiKey), // api_key (required)
|
|
131
|
+
...encodeString(4, 'en'), // locale
|
|
132
|
+
...encodeString(7, version), // ide_version
|
|
133
|
+
...encodeString(12, 'windsurf'), // extension_name
|
|
134
|
+
];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Map role string to ChatMessageSource enum value
|
|
138
|
+
*/
|
|
139
|
+
function roleToSource(role) {
|
|
140
|
+
switch (role) {
|
|
141
|
+
case 'user':
|
|
142
|
+
return ChatMessageSource.USER;
|
|
143
|
+
case 'assistant':
|
|
144
|
+
return ChatMessageSource.ASSISTANT;
|
|
145
|
+
case 'system':
|
|
146
|
+
return ChatMessageSource.SYSTEM;
|
|
147
|
+
case 'tool':
|
|
148
|
+
return ChatMessageSource.TOOL;
|
|
149
|
+
default:
|
|
150
|
+
return ChatMessageSource.USER;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Build the complete chat request buffer using RawGetChatMessageRequest format
|
|
155
|
+
*
|
|
156
|
+
* RawGetChatMessageRequest structure:
|
|
157
|
+
* Field 1: metadata (Metadata message)
|
|
158
|
+
* Field 2: chat_messages (repeated ChatMessage)
|
|
159
|
+
* Field 3: system_prompt_override (string) - optional
|
|
160
|
+
* Field 4: chat_model (enum: Model)
|
|
161
|
+
* Field 5: chat_model_name (string) - optional
|
|
162
|
+
*/
|
|
163
|
+
function buildChatRequest(apiKey, version, modelEnum, messages) {
|
|
164
|
+
const metadata = encodeMetadata(apiKey, version);
|
|
165
|
+
const conversationId = generateUUID();
|
|
166
|
+
// Build the request with all messages
|
|
167
|
+
const request = [];
|
|
168
|
+
// Field 1: metadata
|
|
169
|
+
request.push(...encodeMessage(1, metadata));
|
|
170
|
+
// Field 2: chat_messages (repeated ChatMessage)
|
|
171
|
+
// Extract system message if present and handle separately
|
|
172
|
+
let systemPrompt = '';
|
|
173
|
+
for (const msg of messages) {
|
|
174
|
+
if (msg.role === 'system') {
|
|
175
|
+
systemPrompt = msg.content;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// Encode each message as ChatMessage with ChatMessageIntent
|
|
179
|
+
const source = roleToSource(msg.role);
|
|
180
|
+
const chatMsg = encodeChatMessage(msg.content, source, conversationId);
|
|
181
|
+
request.push(...encodeMessage(2, chatMsg));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Field 3: system_prompt_override (if we have a system message)
|
|
185
|
+
if (systemPrompt) {
|
|
186
|
+
request.push(...encodeString(3, systemPrompt));
|
|
187
|
+
}
|
|
188
|
+
// Field 4: model enum
|
|
189
|
+
request.push(...encodeVarintField(4, modelEnum));
|
|
190
|
+
const payload = Buffer.from(request);
|
|
191
|
+
// gRPC framing: 1 byte compression flag (0) + 4 bytes length + payload
|
|
192
|
+
const frame = Buffer.alloc(5 + payload.length);
|
|
193
|
+
frame[0] = 0; // No compression
|
|
194
|
+
frame.writeUInt32BE(payload.length, 1);
|
|
195
|
+
payload.copy(frame, 5);
|
|
196
|
+
return frame;
|
|
197
|
+
}
|
|
198
|
+
// ============================================================================
|
|
199
|
+
// Response Parsing (Protobuf Decoding)
|
|
200
|
+
// ============================================================================
|
|
201
|
+
/**
|
|
202
|
+
* Decode a varint from a buffer starting at offset
|
|
203
|
+
* @returns [value, bytesRead]
|
|
204
|
+
*/
|
|
205
|
+
function decodeVarint(buffer, offset) {
|
|
206
|
+
let result = 0n;
|
|
207
|
+
let shift = 0n;
|
|
208
|
+
let bytesRead = 0;
|
|
209
|
+
while (offset + bytesRead < buffer.length) {
|
|
210
|
+
const byte = buffer[offset + bytesRead];
|
|
211
|
+
bytesRead++;
|
|
212
|
+
result |= BigInt(byte & 0x7f) << shift;
|
|
213
|
+
if ((byte & 0x80) === 0) {
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
shift += 7n;
|
|
217
|
+
}
|
|
218
|
+
return [result, bytesRead];
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Parse a protobuf field from buffer
|
|
222
|
+
* @returns { fieldNum, wireType, value, bytesConsumed } or null if can't parse
|
|
223
|
+
*/
|
|
224
|
+
function parseProtobufField(buffer, offset) {
|
|
225
|
+
if (offset >= buffer.length)
|
|
226
|
+
return null;
|
|
227
|
+
const [tag, tagBytes] = decodeVarint(buffer, offset);
|
|
228
|
+
const fieldNum = Number(tag >> 3n);
|
|
229
|
+
const wireType = Number(tag & 0x7n);
|
|
230
|
+
let bytesConsumed = tagBytes;
|
|
231
|
+
let value;
|
|
232
|
+
switch (wireType) {
|
|
233
|
+
case 0: // Varint
|
|
234
|
+
const [varintValue, varintBytes] = decodeVarint(buffer, offset + bytesConsumed);
|
|
235
|
+
value = varintValue;
|
|
236
|
+
bytesConsumed += varintBytes;
|
|
237
|
+
break;
|
|
238
|
+
case 2: // Length-delimited (string, bytes, embedded message)
|
|
239
|
+
const [length, lengthBytes] = decodeVarint(buffer, offset + bytesConsumed);
|
|
240
|
+
bytesConsumed += lengthBytes;
|
|
241
|
+
const len = Number(length);
|
|
242
|
+
if (offset + bytesConsumed + len > buffer.length) {
|
|
243
|
+
// Not enough data
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
value = buffer.subarray(offset + bytesConsumed, offset + bytesConsumed + len);
|
|
247
|
+
bytesConsumed += len;
|
|
248
|
+
break;
|
|
249
|
+
case 1: // 64-bit (fixed64, sfixed64, double)
|
|
250
|
+
if (offset + bytesConsumed + 8 > buffer.length)
|
|
251
|
+
return null;
|
|
252
|
+
value = buffer.subarray(offset + bytesConsumed, offset + bytesConsumed + 8);
|
|
253
|
+
bytesConsumed += 8;
|
|
254
|
+
break;
|
|
255
|
+
case 5: // 32-bit (fixed32, sfixed32, float)
|
|
256
|
+
if (offset + bytesConsumed + 4 > buffer.length)
|
|
257
|
+
return null;
|
|
258
|
+
value = buffer.subarray(offset + bytesConsumed, offset + bytesConsumed + 4);
|
|
259
|
+
bytesConsumed += 4;
|
|
260
|
+
break;
|
|
261
|
+
default:
|
|
262
|
+
// Unknown wire type, can't parse
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
return { fieldNum, wireType, value, bytesConsumed };
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Extract text from RawChatMessage protobuf
|
|
269
|
+
*
|
|
270
|
+
* RawChatMessage structure:
|
|
271
|
+
* Field 1: message_id (string)
|
|
272
|
+
* Field 2: source (enum)
|
|
273
|
+
* Field 3: timestamp (message)
|
|
274
|
+
* Field 4: conversation_id (string)
|
|
275
|
+
* Field 5: text (string) ← What we want
|
|
276
|
+
* Field 6: in_progress (bool)
|
|
277
|
+
* Field 7: is_error (bool)
|
|
278
|
+
*/
|
|
279
|
+
function extractTextFromRawChatMessage(buffer) {
|
|
280
|
+
let offset = 0;
|
|
281
|
+
while (offset < buffer.length) {
|
|
282
|
+
const field = parseProtobufField(buffer, offset);
|
|
283
|
+
if (!field)
|
|
284
|
+
break;
|
|
285
|
+
offset += field.bytesConsumed;
|
|
286
|
+
// Field 5 is the text content
|
|
287
|
+
if (field.fieldNum === 5 && field.wireType === 2 && Buffer.isBuffer(field.value)) {
|
|
288
|
+
return field.value.toString('utf8');
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return '';
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Extract text from RawGetChatMessageResponse protobuf
|
|
295
|
+
*
|
|
296
|
+
* RawGetChatMessageResponse structure:
|
|
297
|
+
* Field 1: delta_message (RawChatMessage)
|
|
298
|
+
*/
|
|
299
|
+
function extractTextFromResponse(buffer) {
|
|
300
|
+
let offset = 0;
|
|
301
|
+
while (offset < buffer.length) {
|
|
302
|
+
const field = parseProtobufField(buffer, offset);
|
|
303
|
+
if (!field)
|
|
304
|
+
break;
|
|
305
|
+
offset += field.bytesConsumed;
|
|
306
|
+
// Field 1 is delta_message (RawChatMessage)
|
|
307
|
+
if (field.fieldNum === 1 && field.wireType === 2 && Buffer.isBuffer(field.value)) {
|
|
308
|
+
const text = extractTextFromRawChatMessage(field.value);
|
|
309
|
+
if (text)
|
|
310
|
+
return text;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return '';
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Extract readable text from a gRPC response chunk
|
|
317
|
+
*
|
|
318
|
+
* The response is gRPC-framed: 1 byte compression + 4 bytes length + protobuf payload
|
|
319
|
+
* We parse the protobuf to extract the text field from RawChatMessage.
|
|
320
|
+
*/
|
|
321
|
+
function extractTextFromChunk(chunk) {
|
|
322
|
+
// gRPC frame: 1 byte compression flag + 4 bytes message length + message
|
|
323
|
+
// Multiple messages may be concatenated in a single chunk
|
|
324
|
+
const results = [];
|
|
325
|
+
let offset = 0;
|
|
326
|
+
while (offset + 5 <= chunk.length) {
|
|
327
|
+
const compressed = chunk[offset];
|
|
328
|
+
const messageLength = chunk.readUInt32BE(offset + 1);
|
|
329
|
+
if (compressed !== 0) {
|
|
330
|
+
// Compressed data not supported, skip
|
|
331
|
+
offset += 5 + messageLength;
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
if (offset + 5 + messageLength > chunk.length) {
|
|
335
|
+
// Not enough data for the full message, try as raw protobuf
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
const messageData = chunk.subarray(offset + 5, offset + 5 + messageLength);
|
|
339
|
+
const text = extractTextFromResponse(messageData);
|
|
340
|
+
if (text) {
|
|
341
|
+
results.push(text);
|
|
342
|
+
}
|
|
343
|
+
offset += 5 + messageLength;
|
|
344
|
+
}
|
|
345
|
+
// If we extracted text from proper protobuf parsing, return it
|
|
346
|
+
if (results.length > 0) {
|
|
347
|
+
return results.join('');
|
|
348
|
+
}
|
|
349
|
+
// Fallback: try parsing the entire chunk as protobuf (in case framing was already stripped)
|
|
350
|
+
const fallbackText = extractTextFromResponse(chunk);
|
|
351
|
+
if (fallbackText) {
|
|
352
|
+
return fallbackText;
|
|
353
|
+
}
|
|
354
|
+
// Last resort: heuristic extraction for edge cases
|
|
355
|
+
return extractTextHeuristic(chunk);
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Fallback heuristic text extraction for edge cases
|
|
359
|
+
*/
|
|
360
|
+
function extractTextHeuristic(chunk) {
|
|
361
|
+
// Convert to string, filtering out non-printable characters
|
|
362
|
+
const readable = chunk
|
|
363
|
+
.toString('utf8')
|
|
364
|
+
.replace(/[^\x20-\x7E\n\r\t]/g, ' ')
|
|
365
|
+
.replace(/\s+/g, ' ')
|
|
366
|
+
.trim();
|
|
367
|
+
// Look for text content that doesn't look like UUIDs or binary artifacts
|
|
368
|
+
const parts = readable.split(/\s{2,}/);
|
|
369
|
+
for (const part of parts) {
|
|
370
|
+
const cleaned = part.trim();
|
|
371
|
+
if (cleaned.length > 2 &&
|
|
372
|
+
!cleaned.match(/^[a-f0-9-]{8,}$/i) && // Not a UUID
|
|
373
|
+
!cleaned.match(/^[\x00-\x1f\x7f-\xff]+$/) // Not binary
|
|
374
|
+
) {
|
|
375
|
+
return cleaned;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return '';
|
|
379
|
+
}
|
|
380
|
+
// ============================================================================
|
|
381
|
+
// Streaming API
|
|
382
|
+
// ============================================================================
|
|
383
|
+
/**
|
|
384
|
+
* Stream chat completion using Promise-based API
|
|
385
|
+
*
|
|
386
|
+
* @param credentials - Windsurf credentials (csrf, port, apiKey, version)
|
|
387
|
+
* @param options - Chat options including model, messages, and callbacks
|
|
388
|
+
* @returns Promise that resolves to the full response text
|
|
389
|
+
*/
|
|
390
|
+
export function streamChat(credentials, options) {
|
|
391
|
+
const { csrfToken, port, apiKey, version } = credentials;
|
|
392
|
+
const modelEnum = modelNameToEnum(options.model);
|
|
393
|
+
const body = buildChatRequest(apiKey, version, modelEnum, options.messages);
|
|
394
|
+
return new Promise((resolve, reject) => {
|
|
395
|
+
const client = http2.connect(`http://localhost:${port}`);
|
|
396
|
+
const chunks = [];
|
|
397
|
+
client.on('error', (err) => {
|
|
398
|
+
options.onError?.(err);
|
|
399
|
+
reject(new WindsurfError(`Connection failed: ${err.message}`, WindsurfErrorCode.CONNECTION_FAILED, err));
|
|
400
|
+
});
|
|
401
|
+
client.on('connect', () => {
|
|
402
|
+
const req = client.request({
|
|
403
|
+
':method': 'POST',
|
|
404
|
+
':path': '/exa.language_server_pb.LanguageServerService/RawGetChatMessage',
|
|
405
|
+
'content-type': 'application/grpc',
|
|
406
|
+
'te': 'trailers',
|
|
407
|
+
'x-codeium-csrf-token': csrfToken,
|
|
408
|
+
});
|
|
409
|
+
req.on('data', (chunk) => {
|
|
410
|
+
const text = extractTextFromChunk(chunk);
|
|
411
|
+
if (text) {
|
|
412
|
+
chunks.push(text);
|
|
413
|
+
options.onChunk?.(text);
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
req.on('trailers', (trailers) => {
|
|
417
|
+
const status = trailers['grpc-status'];
|
|
418
|
+
if (status !== '0') {
|
|
419
|
+
const message = trailers['grpc-message'];
|
|
420
|
+
const err = new WindsurfError(`gRPC error ${status}: ${message ? decodeURIComponent(message) : 'Unknown error'}`, WindsurfErrorCode.STREAM_ERROR);
|
|
421
|
+
options.onError?.(err);
|
|
422
|
+
reject(err);
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
req.on('end', () => {
|
|
426
|
+
client.close();
|
|
427
|
+
const fullText = chunks.join('');
|
|
428
|
+
options.onComplete?.(fullText);
|
|
429
|
+
resolve(fullText);
|
|
430
|
+
});
|
|
431
|
+
req.on('error', (err) => {
|
|
432
|
+
client.close();
|
|
433
|
+
options.onError?.(err);
|
|
434
|
+
reject(new WindsurfError(`Request failed: ${err.message}`, WindsurfErrorCode.STREAM_ERROR, err));
|
|
435
|
+
});
|
|
436
|
+
req.write(body);
|
|
437
|
+
req.end();
|
|
438
|
+
});
|
|
439
|
+
// Timeout after 2 minutes
|
|
440
|
+
setTimeout(() => {
|
|
441
|
+
client.close();
|
|
442
|
+
const fullText = chunks.join('');
|
|
443
|
+
options.onComplete?.(fullText);
|
|
444
|
+
resolve(fullText);
|
|
445
|
+
}, 120000);
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Stream chat completion using async generator
|
|
450
|
+
*
|
|
451
|
+
* Yields text chunks as they arrive, for use with SSE streaming.
|
|
452
|
+
*
|
|
453
|
+
* @param credentials - Windsurf credentials
|
|
454
|
+
* @param options - Chat options (model and messages)
|
|
455
|
+
* @yields Text chunks as they arrive
|
|
456
|
+
*/
|
|
457
|
+
export async function* streamChatGenerator(credentials, options) {
|
|
458
|
+
const { csrfToken, port, apiKey, version } = credentials;
|
|
459
|
+
const modelEnum = modelNameToEnum(options.model);
|
|
460
|
+
const body = buildChatRequest(apiKey, version, modelEnum, options.messages);
|
|
461
|
+
const client = http2.connect(`http://localhost:${port}`);
|
|
462
|
+
const chunkQueue = [];
|
|
463
|
+
let done = false;
|
|
464
|
+
let error = null;
|
|
465
|
+
let resolveWait = null;
|
|
466
|
+
client.on('error', (err) => {
|
|
467
|
+
error = new WindsurfError(`Connection failed: ${err.message}`, WindsurfErrorCode.CONNECTION_FAILED, err);
|
|
468
|
+
done = true;
|
|
469
|
+
resolveWait?.();
|
|
470
|
+
});
|
|
471
|
+
const req = client.request({
|
|
472
|
+
':method': 'POST',
|
|
473
|
+
':path': '/exa.language_server_pb.LanguageServerService/RawGetChatMessage',
|
|
474
|
+
'content-type': 'application/grpc',
|
|
475
|
+
'te': 'trailers',
|
|
476
|
+
'x-codeium-csrf-token': csrfToken,
|
|
477
|
+
});
|
|
478
|
+
req.on('data', (chunk) => {
|
|
479
|
+
const text = extractTextFromChunk(chunk);
|
|
480
|
+
if (text) {
|
|
481
|
+
chunkQueue.push(text);
|
|
482
|
+
resolveWait?.();
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
req.on('trailers', (trailers) => {
|
|
486
|
+
const status = trailers['grpc-status'];
|
|
487
|
+
if (status !== '0') {
|
|
488
|
+
const message = trailers['grpc-message'];
|
|
489
|
+
error = new WindsurfError(`gRPC error ${status}: ${message ? decodeURIComponent(message) : 'Unknown error'}`, WindsurfErrorCode.STREAM_ERROR);
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
req.on('end', () => {
|
|
493
|
+
done = true;
|
|
494
|
+
client.close();
|
|
495
|
+
resolveWait?.();
|
|
496
|
+
});
|
|
497
|
+
req.on('error', (err) => {
|
|
498
|
+
error = new WindsurfError(`Request failed: ${err.message}`, WindsurfErrorCode.STREAM_ERROR, err);
|
|
499
|
+
done = true;
|
|
500
|
+
client.close();
|
|
501
|
+
resolveWait?.();
|
|
502
|
+
});
|
|
503
|
+
req.write(body);
|
|
504
|
+
req.end();
|
|
505
|
+
// Yield chunks as they arrive
|
|
506
|
+
while (!done || chunkQueue.length > 0) {
|
|
507
|
+
if (chunkQueue.length > 0) {
|
|
508
|
+
yield chunkQueue.shift();
|
|
509
|
+
}
|
|
510
|
+
else if (!done) {
|
|
511
|
+
await new Promise((resolve) => {
|
|
512
|
+
resolveWait = resolve;
|
|
513
|
+
});
|
|
514
|
+
resolveWait = null;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
if (error) {
|
|
518
|
+
throw error;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
//# sourceMappingURL=grpc-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grpc-client.js","sourceRoot":"","sources":["../../../src/plugin/grpc-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model name to enum mappings for Windsurf gRPC protocol
|
|
3
|
+
*
|
|
4
|
+
* Maps OpenAI-compatible model names to Windsurf protobuf enum values.
|
|
5
|
+
* These values were extracted from Windsurf's extension.js.
|
|
6
|
+
*
|
|
7
|
+
* To discover/verify these values:
|
|
8
|
+
* 1. Find: /Applications/Windsurf.app/Contents/Resources/app/extensions/windsurf/dist/extension.js
|
|
9
|
+
* 2. Search: grep -oE 'CLAUDE[A-Z0-9_]+\s*=\s*[0-9]+' extension.js
|
|
10
|
+
*/
|
|
11
|
+
import { type ModelEnumValue } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Convert a model name string to its protobuf enum value
|
|
14
|
+
* @param modelName - Model name (e.g., "claude-4-sonnet", "gpt-4o")
|
|
15
|
+
* @returns The corresponding enum value, defaults to CLAUDE_3_5_SONNET if unknown
|
|
16
|
+
*/
|
|
17
|
+
export declare function modelNameToEnum(modelName: string): ModelEnumValue;
|
|
18
|
+
/**
|
|
19
|
+
* Convert a protobuf enum value to a canonical model name
|
|
20
|
+
* @param enumValue - The enum value
|
|
21
|
+
* @returns The canonical model name string
|
|
22
|
+
*/
|
|
23
|
+
export declare function enumToModelName(enumValue: ModelEnumValue): string;
|
|
24
|
+
/**
|
|
25
|
+
* Get all supported model names
|
|
26
|
+
* @returns Array of all supported model name strings
|
|
27
|
+
*/
|
|
28
|
+
export declare function getSupportedModels(): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Check if a model name is supported
|
|
31
|
+
* @param modelName - Model name to check
|
|
32
|
+
* @returns True if the model is supported
|
|
33
|
+
*/
|
|
34
|
+
export declare function isModelSupported(modelName: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Get the default model name
|
|
37
|
+
* @returns The default model name
|
|
38
|
+
*/
|
|
39
|
+
export declare function getDefaultModel(): string;
|
|
40
|
+
/**
|
|
41
|
+
* Get the default model enum value
|
|
42
|
+
* @returns The default model enum value
|
|
43
|
+
*/
|
|
44
|
+
export declare function getDefaultModelEnum(): ModelEnumValue;
|
|
45
|
+
/**
|
|
46
|
+
* Get canonical model names (one per enum value, no aliases)
|
|
47
|
+
* @returns Array of canonical model names
|
|
48
|
+
*/
|
|
49
|
+
export declare function getCanonicalModels(): string[];
|
|
50
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/plugin/models.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AA4W5D;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAGjE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,CAEjE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,CAEpD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
|