opencode-cursor-proxy 1.0.1

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 (121) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +139 -0
  3. package/README.zh-CN.md +136 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.js +2 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/api/agent-service.d.ts +136 -0
  8. package/dist/lib/api/agent-service.js +938 -0
  9. package/dist/lib/api/agent-service.js.map +1 -0
  10. package/dist/lib/api/ai-service.d.ts +26 -0
  11. package/dist/lib/api/ai-service.js +38 -0
  12. package/dist/lib/api/ai-service.js.map +1 -0
  13. package/dist/lib/api/cursor-client.d.ts +119 -0
  14. package/dist/lib/api/cursor-client.js +511 -0
  15. package/dist/lib/api/cursor-client.js.map +1 -0
  16. package/dist/lib/api/cursor-models.d.ts +13 -0
  17. package/dist/lib/api/cursor-models.js +34 -0
  18. package/dist/lib/api/cursor-models.js.map +1 -0
  19. package/dist/lib/api/openai-compat.d.ts +10 -0
  20. package/dist/lib/api/openai-compat.js +262 -0
  21. package/dist/lib/api/openai-compat.js.map +1 -0
  22. package/dist/lib/api/proto/agent-messages.d.ts +25 -0
  23. package/dist/lib/api/proto/agent-messages.js +132 -0
  24. package/dist/lib/api/proto/agent-messages.js.map +1 -0
  25. package/dist/lib/api/proto/bidi.d.ts +17 -0
  26. package/dist/lib/api/proto/bidi.js +24 -0
  27. package/dist/lib/api/proto/bidi.js.map +1 -0
  28. package/dist/lib/api/proto/decoding.d.ts +19 -0
  29. package/dist/lib/api/proto/decoding.js +118 -0
  30. package/dist/lib/api/proto/decoding.js.map +1 -0
  31. package/dist/lib/api/proto/encoding.d.ts +64 -0
  32. package/dist/lib/api/proto/encoding.js +180 -0
  33. package/dist/lib/api/proto/encoding.js.map +1 -0
  34. package/dist/lib/api/proto/exec.d.ts +12 -0
  35. package/dist/lib/api/proto/exec.js +383 -0
  36. package/dist/lib/api/proto/exec.js.map +1 -0
  37. package/dist/lib/api/proto/index.d.ts +13 -0
  38. package/dist/lib/api/proto/index.js +10 -0
  39. package/dist/lib/api/proto/index.js.map +1 -0
  40. package/dist/lib/api/proto/interaction.d.ts +15 -0
  41. package/dist/lib/api/proto/interaction.js +99 -0
  42. package/dist/lib/api/proto/interaction.js.map +1 -0
  43. package/dist/lib/api/proto/kv.d.ts +52 -0
  44. package/dist/lib/api/proto/kv.js +156 -0
  45. package/dist/lib/api/proto/kv.js.map +1 -0
  46. package/dist/lib/api/proto/tool-calls.d.ts +9 -0
  47. package/dist/lib/api/proto/tool-calls.js +144 -0
  48. package/dist/lib/api/proto/tool-calls.js.map +1 -0
  49. package/dist/lib/api/proto/types.d.ts +201 -0
  50. package/dist/lib/api/proto/types.js +10 -0
  51. package/dist/lib/api/proto/types.js.map +1 -0
  52. package/dist/lib/auth/helpers.d.ts +40 -0
  53. package/dist/lib/auth/helpers.js +103 -0
  54. package/dist/lib/auth/helpers.js.map +1 -0
  55. package/dist/lib/auth/index.d.ts +7 -0
  56. package/dist/lib/auth/index.js +10 -0
  57. package/dist/lib/auth/index.js.map +1 -0
  58. package/dist/lib/auth/login.d.ts +55 -0
  59. package/dist/lib/auth/login.js +184 -0
  60. package/dist/lib/auth/login.js.map +1 -0
  61. package/dist/lib/config.d.ts +153 -0
  62. package/dist/lib/config.js +182 -0
  63. package/dist/lib/config.js.map +1 -0
  64. package/dist/lib/openai-compat/handler.d.ts +40 -0
  65. package/dist/lib/openai-compat/handler.js +808 -0
  66. package/dist/lib/openai-compat/handler.js.map +1 -0
  67. package/dist/lib/openai-compat/index.d.ts +9 -0
  68. package/dist/lib/openai-compat/index.js +13 -0
  69. package/dist/lib/openai-compat/index.js.map +1 -0
  70. package/dist/lib/openai-compat/types.d.ts +127 -0
  71. package/dist/lib/openai-compat/types.js +6 -0
  72. package/dist/lib/openai-compat/types.js.map +1 -0
  73. package/dist/lib/openai-compat/utils.d.ts +143 -0
  74. package/dist/lib/openai-compat/utils.js +348 -0
  75. package/dist/lib/openai-compat/utils.js.map +1 -0
  76. package/dist/lib/session-reuse.d.ts +88 -0
  77. package/dist/lib/session-reuse.js +198 -0
  78. package/dist/lib/session-reuse.js.map +1 -0
  79. package/dist/lib/storage.d.ts +55 -0
  80. package/dist/lib/storage.js +159 -0
  81. package/dist/lib/storage.js.map +1 -0
  82. package/dist/lib/utils/cache.d.ts +131 -0
  83. package/dist/lib/utils/cache.js +297 -0
  84. package/dist/lib/utils/cache.js.map +1 -0
  85. package/dist/lib/utils/fetch.d.ts +84 -0
  86. package/dist/lib/utils/fetch.js +261 -0
  87. package/dist/lib/utils/fetch.js.map +1 -0
  88. package/dist/lib/utils/index.d.ts +13 -0
  89. package/dist/lib/utils/index.js +22 -0
  90. package/dist/lib/utils/index.js.map +1 -0
  91. package/dist/lib/utils/jwt.d.ts +40 -0
  92. package/dist/lib/utils/jwt.js +102 -0
  93. package/dist/lib/utils/jwt.js.map +1 -0
  94. package/dist/lib/utils/logger.d.ts +107 -0
  95. package/dist/lib/utils/logger.js +227 -0
  96. package/dist/lib/utils/logger.js.map +1 -0
  97. package/dist/lib/utils/model-resolver.d.ts +49 -0
  98. package/dist/lib/utils/model-resolver.js +503 -0
  99. package/dist/lib/utils/model-resolver.js.map +1 -0
  100. package/dist/lib/utils/request-pool.d.ts +38 -0
  101. package/dist/lib/utils/request-pool.js +105 -0
  102. package/dist/lib/utils/request-pool.js.map +1 -0
  103. package/dist/lib/utils/request-transformer.d.ts +87 -0
  104. package/dist/lib/utils/request-transformer.js +154 -0
  105. package/dist/lib/utils/request-transformer.js.map +1 -0
  106. package/dist/lib/utils/tokenizer.d.ts +14 -0
  107. package/dist/lib/utils/tokenizer.js +76 -0
  108. package/dist/lib/utils/tokenizer.js.map +1 -0
  109. package/dist/plugin/index.d.ts +8 -0
  110. package/dist/plugin/index.js +9 -0
  111. package/dist/plugin/index.js.map +1 -0
  112. package/dist/plugin/plugin.d.ts +21 -0
  113. package/dist/plugin/plugin.js +309 -0
  114. package/dist/plugin/plugin.js.map +1 -0
  115. package/dist/plugin/types.d.ts +120 -0
  116. package/dist/plugin/types.js +7 -0
  117. package/dist/plugin/types.js.map +1 -0
  118. package/dist/server.d.ts +15 -0
  119. package/dist/server.js +95 -0
  120. package/dist/server.js.map +1 -0
  121. package/package.json +79 -0
@@ -0,0 +1,262 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { ReadableStream } from "node:stream/web";
3
+ import { CursorClient, } from "./cursor-client";
4
+ import { calculateTokenUsage } from "../utils/tokenizer";
5
+ // Simple alias map to translate common OpenAI model identifiers to Cursor equivalents.
6
+ const MODEL_ALIASES = {
7
+ "gpt-4o": "gpt-4o",
8
+ "gpt-4o-mini": "gpt-4o-mini",
9
+ "gpt-4": "gpt-4o", // fallback to 4o if older name is provided
10
+ "gpt-3.5-turbo": "gpt-4o-mini", // lightweight fallback
11
+ };
12
+ function resolveModelName(model) {
13
+ if (typeof model !== "string" || !model) {
14
+ return "gpt-4o";
15
+ }
16
+ return MODEL_ALIASES[model] ?? model;
17
+ }
18
+ /**
19
+ * Detects OpenAI-style chat completion requests.
20
+ */
21
+ export function isOpenAIChatCompletionsRequest(input) {
22
+ const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
23
+ return /\/v1\/chat\/completions/.test(url);
24
+ }
25
+ /**
26
+ * Extracts textual content from an OpenAI message content payload.
27
+ * Supports both string and array-of-blocks formats; non-text blocks are ignored.
28
+ */
29
+ function normalizeOpenAIContent(content) {
30
+ if (typeof content === "string") {
31
+ return content;
32
+ }
33
+ if (Array.isArray(content)) {
34
+ return content
35
+ .map((part) => {
36
+ if (part &&
37
+ typeof part === "object" &&
38
+ "type" in part &&
39
+ part.type === "text" &&
40
+ typeof part.text === "string") {
41
+ return part.text;
42
+ }
43
+ return "";
44
+ })
45
+ .filter(Boolean)
46
+ .join("");
47
+ }
48
+ return "";
49
+ }
50
+ /**
51
+ * Converts an OpenAI chat request body into the Cursor ChatRequest shape.
52
+ */
53
+ function mapOpenAIRequestToCursor(body) {
54
+ if (!body || typeof body !== "object" || !Array.isArray(body.messages)) {
55
+ return { request: null, unsupported: false };
56
+ }
57
+ const messages = [];
58
+ let systemMessage;
59
+ let unsupported = false;
60
+ for (const message of body.messages) {
61
+ if (!message || typeof message !== "object" || typeof message.role !== "string") {
62
+ continue;
63
+ }
64
+ // Tool/function calls are not supported yet; surface a clear error.
65
+ if ("tool_calls" in message || "function_call" in message) {
66
+ unsupported = true;
67
+ continue;
68
+ }
69
+ const content = normalizeOpenAIContent(message.content);
70
+ if (!content) {
71
+ continue;
72
+ }
73
+ if (message.role === "system" && !systemMessage) {
74
+ systemMessage = { role: "system", content };
75
+ }
76
+ else if (message.role === "assistant" || message.role === "user") {
77
+ messages.push({ role: message.role, content });
78
+ }
79
+ }
80
+ if (systemMessage) {
81
+ messages.unshift(systemMessage);
82
+ }
83
+ return {
84
+ request: {
85
+ model: resolveModelName(body.model),
86
+ messages,
87
+ stream: !!body.stream,
88
+ temperature: typeof body.temperature === "number" ? body.temperature : undefined,
89
+ maxTokens: typeof body.max_tokens === "number" ? body.max_tokens : undefined,
90
+ },
91
+ unsupported,
92
+ };
93
+ }
94
+ /**
95
+ * Formats a Cursor stream chunk as an OpenAI SSE data line.
96
+ */
97
+ function formatSseChunk(payload) {
98
+ return `data: ${JSON.stringify(payload)}\n\n`;
99
+ }
100
+ /**
101
+ * Wraps Cursor streaming output as OpenAI-compatible SSE.
102
+ */
103
+ async function streamCursorAsOpenAI(client, chatRequest) {
104
+ const encoder = new TextEncoder();
105
+ const streamId = randomUUID();
106
+ const created = Math.floor(Date.now() / 1000);
107
+ const stream = new ReadableStream({
108
+ async start(controller) {
109
+ try {
110
+ for await (const chunk of client.chatStream(chatRequest)) {
111
+ if (chunk.type === "delta" && chunk.content) {
112
+ const payload = {
113
+ id: `cursor-${streamId}`,
114
+ object: "chat.completion.chunk",
115
+ created,
116
+ model: chatRequest.model,
117
+ choices: [
118
+ {
119
+ index: 0,
120
+ delta: { content: chunk.content },
121
+ finish_reason: null,
122
+ },
123
+ ],
124
+ };
125
+ controller.enqueue(encoder.encode(formatSseChunk(payload)));
126
+ }
127
+ else if (chunk.type === "error") {
128
+ const payload = {
129
+ error: {
130
+ message: chunk.error ?? "Unknown Cursor streaming error",
131
+ type: "cursor_error",
132
+ },
133
+ };
134
+ controller.enqueue(encoder.encode(formatSseChunk(payload)));
135
+ controller.enqueue(encoder.encode("data: [DONE]\n\n"));
136
+ controller.close();
137
+ return;
138
+ }
139
+ }
140
+ const donePayload = {
141
+ id: `cursor-${streamId}`,
142
+ object: "chat.completion.chunk",
143
+ created,
144
+ model: chatRequest.model,
145
+ choices: [
146
+ {
147
+ index: 0,
148
+ delta: {},
149
+ finish_reason: "stop",
150
+ },
151
+ ],
152
+ };
153
+ controller.enqueue(encoder.encode(formatSseChunk(donePayload)));
154
+ controller.enqueue(encoder.encode("data: [DONE]\n\n"));
155
+ controller.close();
156
+ }
157
+ catch (error) {
158
+ controller.error(error);
159
+ }
160
+ },
161
+ });
162
+ return new Response(stream, {
163
+ status: 200,
164
+ headers: {
165
+ "Content-Type": "text/event-stream",
166
+ "Cache-Control": "no-cache",
167
+ Connection: "keep-alive",
168
+ },
169
+ });
170
+ }
171
+ /**
172
+ * Handles OpenAI-compatible chat completion requests by routing them to Cursor.
173
+ * Returns a Response when the request is handled; otherwise returns null.
174
+ */
175
+ export async function handleOpenAIChatCompletions(input, init, client) {
176
+ const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
177
+ if (!isOpenAIChatCompletionsRequest(url)) {
178
+ return null;
179
+ }
180
+ if (!init || !init.body) {
181
+ return null;
182
+ }
183
+ let bodyText = null;
184
+ if (typeof init.body === "string") {
185
+ bodyText = init.body;
186
+ }
187
+ else if (init.body instanceof Uint8Array) {
188
+ bodyText = Buffer.from(init.body).toString("utf8");
189
+ }
190
+ else if (init.body instanceof ArrayBuffer) {
191
+ bodyText = Buffer.from(init.body).toString("utf8");
192
+ }
193
+ if (bodyText === null) {
194
+ return null;
195
+ }
196
+ let parsedBody;
197
+ try {
198
+ parsedBody = JSON.parse(bodyText);
199
+ }
200
+ catch {
201
+ return null;
202
+ }
203
+ const { request: chatRequest, unsupported } = mapOpenAIRequestToCursor(parsedBody);
204
+ if (unsupported) {
205
+ const errorBody = {
206
+ error: {
207
+ message: "tool_calls/function_call are not supported by the Cursor OpenAI shim yet.",
208
+ type: "unsupported_operation",
209
+ },
210
+ };
211
+ return new Response(JSON.stringify(errorBody), {
212
+ status: 400,
213
+ headers: { "Content-Type": "application/json" },
214
+ });
215
+ }
216
+ if (!chatRequest) {
217
+ return null;
218
+ }
219
+ try {
220
+ if (chatRequest.stream) {
221
+ return await streamCursorAsOpenAI(client, chatRequest);
222
+ }
223
+ const content = await client.chat(chatRequest);
224
+ const promptText = chatRequest.messages.map(m => m.content).join("\n");
225
+ const usage = calculateTokenUsage(promptText, content, chatRequest.model);
226
+ const responsePayload = {
227
+ id: `cursor-${randomUUID()}`,
228
+ object: "chat.completion",
229
+ created: Math.floor(Date.now() / 1000),
230
+ model: chatRequest.model,
231
+ choices: [
232
+ {
233
+ index: 0,
234
+ message: {
235
+ role: "assistant",
236
+ content,
237
+ },
238
+ finish_reason: "stop",
239
+ },
240
+ ],
241
+ usage,
242
+ };
243
+ return new Response(JSON.stringify(responsePayload), {
244
+ status: 200,
245
+ headers: { "Content-Type": "application/json" },
246
+ });
247
+ }
248
+ catch (error) {
249
+ const message = error instanceof Error ? error.message : typeof error === "string" ? error : "Unknown error";
250
+ const errorBody = {
251
+ error: {
252
+ message,
253
+ type: "cursor_error",
254
+ },
255
+ };
256
+ return new Response(JSON.stringify(errorBody), {
257
+ status: 500,
258
+ headers: { "Content-Type": "application/json" },
259
+ });
260
+ }
261
+ }
262
+ //# sourceMappingURL=openai-compat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compat.js","sourceRoot":"","sources":["../../../src/lib/api/openai-compat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { AgentMode } from "./types";
2
+ import type { OpenAIToolDefinition } from "./types";
3
+ export declare function encodeMcpToolDefinition(tool: OpenAIToolDefinition, providerIdentifier?: string): Uint8Array;
4
+ export declare function buildRequestContextEnv(workspacePath?: string): Uint8Array;
5
+ export declare function encodeMcpInstructions(serverName: string, instructions: string): Uint8Array;
6
+ export declare function buildRequestContext(workspacePath?: string, tools?: OpenAIToolDefinition[]): Uint8Array;
7
+ export declare function encodeUserMessage(text: string, messageId: string, mode?: AgentMode): Uint8Array;
8
+ export declare function encodeUserMessageAction(userMessage: Uint8Array, requestContext: Uint8Array): Uint8Array;
9
+ export declare function encodeConversationAction(userMessageAction: Uint8Array): Uint8Array;
10
+ export declare function encodeResumeAction(): Uint8Array;
11
+ export declare function encodeConversationActionWithResume(): Uint8Array;
12
+ export declare function encodeAgentClientMessageWithConversationAction(conversationAction: Uint8Array): Uint8Array;
13
+ export declare function encodeModelDetails(modelId: string): Uint8Array;
14
+ export declare function encodeEmptyConversationState(): Uint8Array;
15
+ export declare function encodeMcpTools(tools: OpenAIToolDefinition[]): Uint8Array;
16
+ export declare function encodeMcpDescriptor(serverName: string, serverIdentifier: string, folderPath?: string, serverUseInstructions?: string): Uint8Array;
17
+ export interface McpDescriptorInput {
18
+ serverName: string;
19
+ serverIdentifier: string;
20
+ folderPath?: string;
21
+ serverUseInstructions?: string;
22
+ }
23
+ export declare function encodeMcpFileSystemOptions(enabled: boolean, workspaceProjectDir: string, mcpDescriptors: McpDescriptorInput[]): Uint8Array;
24
+ export declare function encodeAgentRunRequest(action: Uint8Array, modelDetails: Uint8Array, conversationId?: string, tools?: OpenAIToolDefinition[], workspacePath?: string): Uint8Array;
25
+ export declare function encodeAgentClientMessage(runRequest: Uint8Array): Uint8Array;
@@ -0,0 +1,132 @@
1
+ import { encodeStringField, encodeInt32Field, encodeMessageField, encodeBoolField, concatBytes, encodeProtobufValue, } from "./encoding";
2
+ import { AgentMode } from "./types";
3
+ const MCP_PROVIDER = "cursor-tools";
4
+ export function encodeMcpToolDefinition(tool, providerIdentifier = MCP_PROVIDER) {
5
+ const toolName = tool.function.name;
6
+ const combinedName = `${providerIdentifier}-${toolName}`;
7
+ const description = tool.function.description ?? "";
8
+ const inputSchema = tool.function.parameters ?? { type: "object", properties: {} };
9
+ const parts = [
10
+ encodeStringField(1, combinedName),
11
+ encodeStringField(2, description),
12
+ ];
13
+ if (inputSchema) {
14
+ const schemaValue = encodeProtobufValue(inputSchema);
15
+ parts.push(encodeMessageField(3, schemaValue));
16
+ }
17
+ parts.push(encodeStringField(4, providerIdentifier));
18
+ parts.push(encodeStringField(5, toolName));
19
+ return concatBytes(...parts);
20
+ }
21
+ export function buildRequestContextEnv(workspacePath = process.cwd()) {
22
+ return concatBytes(encodeStringField(1, "darwin 24.0.0"), encodeStringField(2, workspacePath), encodeStringField(3, '/bin/zsh'), encodeStringField(10, Intl.DateTimeFormat().resolvedOptions().timeZone), encodeStringField(11, workspacePath));
23
+ }
24
+ export function encodeMcpInstructions(serverName, instructions) {
25
+ return concatBytes(encodeStringField(1, serverName), encodeStringField(2, instructions));
26
+ }
27
+ export function buildRequestContext(workspacePath, tools) {
28
+ const parts = [];
29
+ const env = buildRequestContextEnv(workspacePath);
30
+ parts.push(encodeMessageField(4, env));
31
+ if (tools && tools.length > 0) {
32
+ for (const tool of tools) {
33
+ const mcpTool = encodeMcpToolDefinition(tool, MCP_PROVIDER);
34
+ parts.push(encodeMessageField(7, mcpTool));
35
+ }
36
+ const toolDescriptions = tools.map(t => `- ${t.function.name}: ${t.function.description || 'No description'}`).join('\n');
37
+ const instructions = `You have access to the following tools:\n${toolDescriptions}\n\nUse these tools when appropriate to help the user.`;
38
+ const mcpInstr = encodeMcpInstructions(MCP_PROVIDER, instructions);
39
+ parts.push(encodeMessageField(14, mcpInstr));
40
+ }
41
+ return concatBytes(...parts);
42
+ }
43
+ export function encodeUserMessage(text, messageId, mode = AgentMode.ASK) {
44
+ return concatBytes(encodeStringField(1, text), encodeStringField(2, messageId), encodeInt32Field(4, mode));
45
+ }
46
+ export function encodeUserMessageAction(userMessage, requestContext) {
47
+ return concatBytes(encodeMessageField(1, userMessage), encodeMessageField(2, requestContext));
48
+ }
49
+ export function encodeConversationAction(userMessageAction) {
50
+ return encodeMessageField(1, userMessageAction);
51
+ }
52
+ export function encodeResumeAction() {
53
+ return new Uint8Array(0);
54
+ }
55
+ export function encodeConversationActionWithResume() {
56
+ const resumeAction = encodeResumeAction();
57
+ return encodeMessageField(2, resumeAction);
58
+ }
59
+ export function encodeAgentClientMessageWithConversationAction(conversationAction) {
60
+ return encodeMessageField(4, conversationAction);
61
+ }
62
+ export function encodeModelDetails(modelId) {
63
+ return encodeStringField(1, modelId);
64
+ }
65
+ export function encodeEmptyConversationState() {
66
+ return new Uint8Array(0);
67
+ }
68
+ export function encodeMcpTools(tools) {
69
+ const parts = [];
70
+ for (const tool of tools) {
71
+ const mcpTool = encodeMcpToolDefinition(tool, MCP_PROVIDER);
72
+ parts.push(encodeMessageField(1, mcpTool));
73
+ }
74
+ return concatBytes(...parts);
75
+ }
76
+ export function encodeMcpDescriptor(serverName, serverIdentifier, folderPath, serverUseInstructions) {
77
+ const parts = [
78
+ encodeStringField(1, serverName),
79
+ encodeStringField(2, serverIdentifier),
80
+ ];
81
+ if (folderPath) {
82
+ parts.push(encodeStringField(3, folderPath));
83
+ }
84
+ if (serverUseInstructions) {
85
+ parts.push(encodeStringField(4, serverUseInstructions));
86
+ }
87
+ return concatBytes(...parts);
88
+ }
89
+ export function encodeMcpFileSystemOptions(enabled, workspaceProjectDir, mcpDescriptors) {
90
+ const parts = [];
91
+ if (enabled) {
92
+ parts.push(encodeBoolField(1, true));
93
+ }
94
+ if (workspaceProjectDir) {
95
+ parts.push(encodeStringField(2, workspaceProjectDir));
96
+ }
97
+ for (const descriptor of mcpDescriptors) {
98
+ const encodedDescriptor = encodeMcpDescriptor(descriptor.serverName, descriptor.serverIdentifier, descriptor.folderPath, descriptor.serverUseInstructions);
99
+ parts.push(encodeMessageField(3, encodedDescriptor));
100
+ }
101
+ return concatBytes(...parts);
102
+ }
103
+ export function encodeAgentRunRequest(action, modelDetails, conversationId, tools, workspacePath) {
104
+ const conversationState = encodeEmptyConversationState();
105
+ const parts = [
106
+ encodeMessageField(1, conversationState),
107
+ encodeMessageField(2, action),
108
+ encodeMessageField(3, modelDetails),
109
+ ];
110
+ if (tools && tools.length > 0) {
111
+ const mcpToolsWrapper = encodeMcpTools(tools);
112
+ parts.push(encodeMessageField(4, mcpToolsWrapper));
113
+ }
114
+ if (conversationId) {
115
+ parts.push(encodeStringField(5, conversationId));
116
+ }
117
+ if (tools && tools.length > 0 && workspacePath) {
118
+ const mcpDescriptors = [{
119
+ serverName: "Cursor Tools",
120
+ serverIdentifier: MCP_PROVIDER,
121
+ folderPath: workspacePath,
122
+ serverUseInstructions: "Use these tools to assist the user with their coding tasks."
123
+ }];
124
+ const mcpFsOptions = encodeMcpFileSystemOptions(true, workspacePath, mcpDescriptors);
125
+ parts.push(encodeMessageField(6, mcpFsOptions));
126
+ }
127
+ return concatBytes(...parts);
128
+ }
129
+ export function encodeAgentClientMessage(runRequest) {
130
+ return encodeMessageField(1, runRequest);
131
+ }
132
+ //# sourceMappingURL=agent-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-messages.js","sourceRoot":"","sources":["../../../../src/lib/api/proto/agent-messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * BidiSse Protocol Encoding
3
+ *
4
+ * Handles encoding of Bidi stream messages for Cursor's SSE-based protocol.
5
+ */
6
+ /**
7
+ * Encode BidiRequestId
8
+ * - request_id: field 1 (string)
9
+ */
10
+ export declare function encodeBidiRequestId(requestId: string): Uint8Array;
11
+ /**
12
+ * Encode BidiAppendRequest
13
+ * - data: field 1 (string, hex-encoded)
14
+ * - request_id: field 2 (BidiRequestId message)
15
+ * - append_seqno: field 3 (int64)
16
+ */
17
+ export declare function encodeBidiAppendRequest(data: string, requestId: string, appendSeqno: bigint): Uint8Array;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * BidiSse Protocol Encoding
3
+ *
4
+ * Handles encoding of Bidi stream messages for Cursor's SSE-based protocol.
5
+ */
6
+ import { encodeStringField, encodeMessageField, encodeInt64Field, concatBytes, } from "./encoding";
7
+ /**
8
+ * Encode BidiRequestId
9
+ * - request_id: field 1 (string)
10
+ */
11
+ export function encodeBidiRequestId(requestId) {
12
+ return encodeStringField(1, requestId);
13
+ }
14
+ /**
15
+ * Encode BidiAppendRequest
16
+ * - data: field 1 (string, hex-encoded)
17
+ * - request_id: field 2 (BidiRequestId message)
18
+ * - append_seqno: field 3 (int64)
19
+ */
20
+ export function encodeBidiAppendRequest(data, requestId, appendSeqno) {
21
+ const requestIdMsg = encodeBidiRequestId(requestId);
22
+ return concatBytes(encodeStringField(1, data), encodeMessageField(2, requestIdMsg), encodeInt64Field(3, appendSeqno));
23
+ }
24
+ //# sourceMappingURL=bidi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bidi.js","sourceRoot":"","sources":["../../../../src/lib/api/proto/bidi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,OAAO,iBAAiB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY,EAAE,SAAiB,EAAE,WAAmB;IAC1F,MAAM,YAAY,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACpD,OAAO,WAAW,CAChB,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,EAC1B,kBAAkB,CAAC,CAAC,EAAE,YAAY,CAAC,EACnC,gBAAgB,CAAC,CAAC,EAAE,WAAW,CAAC,CACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Protobuf Decoding Helpers
3
+ *
4
+ * Low-level utilities for decoding protobuf wire format.
5
+ * Includes varint decoding, field parsing, and google.protobuf.Value decoding.
6
+ */
7
+ export interface ParsedField {
8
+ fieldNumber: number;
9
+ wireType: number;
10
+ value: Uint8Array | number | bigint;
11
+ }
12
+ export declare function decodeVarint(data: Uint8Array, offset: number): {
13
+ value: number;
14
+ bytesRead: number;
15
+ };
16
+ export declare function parseProtoFields(data: Uint8Array): ParsedField[];
17
+ export declare function parseProtobufValue(data: Uint8Array): unknown;
18
+ export declare function parseProtobufStruct(data: Uint8Array): Record<string, unknown>;
19
+ export declare function parseProtobufListValue(data: Uint8Array): unknown[];
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Protobuf Decoding Helpers
3
+ *
4
+ * Low-level utilities for decoding protobuf wire format.
5
+ * Includes varint decoding, field parsing, and google.protobuf.Value decoding.
6
+ */
7
+ export function decodeVarint(data, offset) {
8
+ let value = 0;
9
+ let shift = 0;
10
+ let bytesRead = 0;
11
+ while (offset + bytesRead < data.length) {
12
+ const byte = data[offset + bytesRead];
13
+ if (byte === undefined)
14
+ break;
15
+ value |= (byte & 0x7f) << shift;
16
+ bytesRead++;
17
+ if ((byte & 0x80) === 0) {
18
+ break;
19
+ }
20
+ shift += 7;
21
+ }
22
+ return { value, bytesRead };
23
+ }
24
+ export function parseProtoFields(data) {
25
+ const fields = [];
26
+ let offset = 0;
27
+ while (offset < data.length) {
28
+ const tagInfo = decodeVarint(data, offset);
29
+ offset += tagInfo.bytesRead;
30
+ const fieldNumber = tagInfo.value >> 3;
31
+ const wireType = tagInfo.value & 0x7;
32
+ if (wireType === 2) {
33
+ const lengthInfo = decodeVarint(data, offset);
34
+ offset += lengthInfo.bytesRead;
35
+ const value = data.slice(offset, offset + lengthInfo.value);
36
+ offset += lengthInfo.value;
37
+ fields.push({ fieldNumber, wireType, value });
38
+ }
39
+ else if (wireType === 0) {
40
+ const valueInfo = decodeVarint(data, offset);
41
+ offset += valueInfo.bytesRead;
42
+ fields.push({ fieldNumber, wireType, value: valueInfo.value });
43
+ }
44
+ else if (wireType === 1) {
45
+ const value = data.slice(offset, offset + 8);
46
+ offset += 8;
47
+ fields.push({ fieldNumber, wireType, value });
48
+ }
49
+ else if (wireType === 5) {
50
+ const value = data.slice(offset, offset + 4);
51
+ offset += 4;
52
+ fields.push({ fieldNumber, wireType, value });
53
+ }
54
+ else {
55
+ break;
56
+ }
57
+ }
58
+ return fields;
59
+ }
60
+ export function parseProtobufValue(data) {
61
+ const fields = parseProtoFields(data);
62
+ for (const field of fields) {
63
+ if (field.fieldNumber === 1 && field.wireType === 0) {
64
+ return null;
65
+ }
66
+ if (field.fieldNumber === 2 && field.wireType === 1 && field.value instanceof Uint8Array) {
67
+ const view = new DataView(field.value.buffer, field.value.byteOffset, 8);
68
+ return view.getFloat64(0, true);
69
+ }
70
+ if (field.fieldNumber === 3 && field.wireType === 2 && field.value instanceof Uint8Array) {
71
+ return new TextDecoder().decode(field.value);
72
+ }
73
+ if (field.fieldNumber === 4 && field.wireType === 0) {
74
+ return field.value === 1;
75
+ }
76
+ if (field.fieldNumber === 5 && field.wireType === 2 && field.value instanceof Uint8Array) {
77
+ return parseProtobufStruct(field.value);
78
+ }
79
+ if (field.fieldNumber === 6 && field.wireType === 2 && field.value instanceof Uint8Array) {
80
+ return parseProtobufListValue(field.value);
81
+ }
82
+ }
83
+ return undefined;
84
+ }
85
+ export function parseProtobufStruct(data) {
86
+ const fields = parseProtoFields(data);
87
+ const result = {};
88
+ for (const field of fields) {
89
+ if (field.fieldNumber === 1 && field.wireType === 2 && field.value instanceof Uint8Array) {
90
+ const entryFields = parseProtoFields(field.value);
91
+ let key = "";
92
+ let value = undefined;
93
+ for (const ef of entryFields) {
94
+ if (ef.fieldNumber === 1 && ef.wireType === 2 && ef.value instanceof Uint8Array) {
95
+ key = new TextDecoder().decode(ef.value);
96
+ }
97
+ if (ef.fieldNumber === 2 && ef.wireType === 2 && ef.value instanceof Uint8Array) {
98
+ value = parseProtobufValue(ef.value);
99
+ }
100
+ }
101
+ if (key) {
102
+ result[key] = value;
103
+ }
104
+ }
105
+ }
106
+ return result;
107
+ }
108
+ export function parseProtobufListValue(data) {
109
+ const fields = parseProtoFields(data);
110
+ const result = [];
111
+ for (const field of fields) {
112
+ if (field.fieldNumber === 1 && field.wireType === 2 && field.value instanceof Uint8Array) {
113
+ result.push(parseProtobufValue(field.value));
114
+ }
115
+ }
116
+ return result;
117
+ }
118
+ //# sourceMappingURL=decoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoding.js","sourceRoot":"","sources":["../../../../src/lib/api/proto/decoding.ts"],"names":[],"mappings":"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"}