Files
ccs/src/cursor/cursor-protobuf-schema.ts
T

223 lines
4.8 KiB
TypeScript

/**
* Cursor Protobuf Schema Constants
* Field definitions and wire types for ConnectRPC protocol
*/
/** Wire types for protobuf encoding */
export const WIRE_TYPE = {
VARINT: 0,
FIXED64: 1,
LEN: 2,
FIXED32: 5,
} as const;
/** Message role constants */
export const ROLE = {
USER: 1,
ASSISTANT: 2,
} as const;
/** Unified mode constants */
export const UNIFIED_MODE = {
CHAT: 1,
AGENT: 2,
} as const;
/** Thinking level constants */
export const THINKING_LEVEL = {
UNSPECIFIED: 0,
MEDIUM: 1,
HIGH: 2,
} as const;
/** Field numbers namespaced by protobuf message type */
export const FIELD = {
/** StreamUnifiedChatRequestWithTools (top level) */
Request: { REQUEST: 1 },
/** StreamUnifiedChatRequest */
Chat: {
MESSAGES: 1,
UNKNOWN_2: 2,
INSTRUCTION: 3,
UNKNOWN_4: 4,
MODEL: 5,
WEB_TOOL: 8,
UNKNOWN_13: 13,
CURSOR_SETTING: 15,
UNKNOWN_19: 19,
CONVERSATION_ID: 23,
METADATA: 26,
IS_AGENTIC: 27,
SUPPORTED_TOOLS: 29,
MESSAGE_IDS: 30,
MCP_TOOLS: 34,
LARGE_CONTEXT: 35,
UNKNOWN_38: 38,
UNIFIED_MODE: 46,
UNKNOWN_47: 47,
SHOULD_DISABLE_TOOLS: 48,
THINKING_LEVEL: 49,
UNKNOWN_51: 51,
UNKNOWN_53: 53,
UNIFIED_MODE_NAME: 54,
},
/** ConversationMessage */
Message: {
CONTENT: 1,
ROLE: 2,
ID: 13,
TOOL_RESULTS: 18,
IS_AGENTIC: 29,
UNIFIED_MODE: 47,
SUPPORTED_TOOLS: 51,
},
/** ConversationMessage.ToolResult */
ToolResult: {
CALL_ID: 1,
NAME: 2,
INDEX: 3,
RAW_ARGS: 5,
RESULT: 8,
},
/** Model */
Model: { NAME: 1, EMPTY: 4 },
/** Instruction */
Instruction: { TEXT: 1 },
/** CursorSetting (U6_FIELD_* are sub-fields of Unknown6 nested message) */
Setting: {
PATH: 1,
UNKNOWN_3: 3,
UNKNOWN_6: 6,
UNKNOWN_8: 8,
UNKNOWN_9: 9,
U6_FIELD_1: 1,
U6_FIELD_2: 2,
},
/** Metadata */
Metadata: { PLATFORM: 1, ARCH: 2, VERSION: 3, CWD: 4, TIMESTAMP: 5 },
/** MessageId */
MessageId: { ID: 1, SUMMARY: 2, ROLE: 3 },
/** MCPTool */
McpTool: { NAME: 1, DESC: 2, PARAMS: 3, SERVER: 4 },
/** StreamUnifiedChatResponseWithTools (response top-level) */
Response: { TOOL_CALL: 1, RESPONSE: 2 },
/** ClientSideToolV2Call */
ToolCall: { ID: 3, NAME: 9, RAW_ARGS: 10, IS_LAST: 11, MCP_PARAMS: 27 },
/** MCPParams */
McpParams: { TOOLS_LIST: 1 },
/** MCPParams.Tool (nested) */
McpNested: { NAME: 1, PARAMS: 3 },
/** StreamUnifiedChatResponse */
ChatResponse: { TEXT: 1, THINKING: 25 },
/** Thinking */
Thinking: { TEXT: 1 },
} as const;
/** Type definitions */
export type WireType = (typeof WIRE_TYPE)[keyof typeof WIRE_TYPE];
export type RoleType = (typeof ROLE)[keyof typeof ROLE];
export type UnifiedModeType = (typeof UNIFIED_MODE)[keyof typeof UNIFIED_MODE];
export type ThinkingLevelType = (typeof THINKING_LEVEL)[keyof typeof THINKING_LEVEL];
/** Cursor credentials structure */
export interface CursorApiCredentials {
accessToken: string;
machineId: string;
ghostMode?: boolean;
}
/** Cursor tool definition */
export interface CursorTool {
function?: {
name?: string;
description?: string;
parameters?: Record<string, unknown>;
};
name?: string;
description?: string;
input_schema?: Record<string, unknown>;
}
/** Cursor tool result */
export interface CursorToolResult {
tool_call_id?: string;
name?: string;
index?: number;
raw_args?: string;
}
/** Cursor message format */
export interface CursorMessage {
role: string;
content: string;
tool_results?: CursorToolResult[];
tool_calls?: Array<{
id: string;
type: string;
function: {
name: string;
arguments: string;
};
}>;
}
/** Formatted message for encoding */
export interface FormattedMessage {
content: string;
role: RoleType;
messageId: string;
isLast: boolean;
hasTools: boolean;
toolResults: CursorToolResult[];
}
/** Message ID structure */
export interface MessageId {
messageId: string;
role: RoleType;
}
/** Bit flags for ConnectRPC envelopes. */
export const CONNECT_FRAME_FLAG = {
COMPRESSED: 0x01,
END_STREAM: 0x02,
} as const;
/** ConnectRPC frame flag presets. */
export const COMPRESS_FLAG = {
NONE: 0x00,
GZIP: CONNECT_FRAME_FLAG.COMPRESSED,
END_STREAM: CONNECT_FRAME_FLAG.END_STREAM,
GZIP_END_STREAM: CONNECT_FRAME_FLAG.COMPRESSED | CONNECT_FRAME_FLAG.END_STREAM,
} as const;
export const CONNECT_FRAME_FLAG_MASK =
CONNECT_FRAME_FLAG.COMPRESSED | CONNECT_FRAME_FLAG.END_STREAM;
export function isCompressedConnectFrame(flags: number): boolean {
return (flags & CONNECT_FRAME_FLAG.COMPRESSED) === CONNECT_FRAME_FLAG.COMPRESSED;
}
export function isEndStreamConnectFrame(flags: number): boolean {
return (flags & CONNECT_FRAME_FLAG.END_STREAM) === CONNECT_FRAME_FLAG.END_STREAM;
}
export function hasUnknownConnectFrameFlags(flags: number): boolean {
return (flags & ~CONNECT_FRAME_FLAG_MASK) !== 0;
}