@velum-labs/cursorkit 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.
Files changed (142) hide show
  1. package/DISCLAIMER.md +12 -0
  2. package/README.md +157 -0
  3. package/dist/src/agentTools/diff.d.ts +11 -0
  4. package/dist/src/agentTools/diff.js +88 -0
  5. package/dist/src/agentTools/policy.d.ts +3 -0
  6. package/dist/src/agentTools/policy.js +12 -0
  7. package/dist/src/agentTools/registry.d.ts +114 -0
  8. package/dist/src/agentTools/registry.js +663 -0
  9. package/dist/src/agentTools/results.d.ts +14 -0
  10. package/dist/src/agentTools/results.js +117 -0
  11. package/dist/src/agentTools/schemas.d.ts +3 -0
  12. package/dist/src/agentTools/schemas.js +89 -0
  13. package/dist/src/agentTools/surface.d.ts +11 -0
  14. package/dist/src/agentTools/surface.js +251 -0
  15. package/dist/src/certs.d.ts +8 -0
  16. package/dist/src/certs.js +34 -0
  17. package/dist/src/ck.d.ts +2 -0
  18. package/dist/src/ck.js +6 -0
  19. package/dist/src/ckLauncher.d.ts +150 -0
  20. package/dist/src/ckLauncher.js +1496 -0
  21. package/dist/src/cli.d.ts +2 -0
  22. package/dist/src/cli.js +265 -0
  23. package/dist/src/config.d.ts +52 -0
  24. package/dist/src/config.js +210 -0
  25. package/dist/src/connectEnvelope.d.ts +16 -0
  26. package/dist/src/connectEnvelope.js +70 -0
  27. package/dist/src/desktop.d.ts +19 -0
  28. package/dist/src/desktop.js +167 -0
  29. package/dist/src/desktopConnectProxy.d.ts +26 -0
  30. package/dist/src/desktopConnectProxy.js +175 -0
  31. package/dist/src/extensions/index.d.ts +2 -0
  32. package/dist/src/extensions/index.js +1 -0
  33. package/dist/src/extensions/registry.d.ts +8 -0
  34. package/dist/src/extensions/registry.js +52 -0
  35. package/dist/src/extensions/types.d.ts +42 -0
  36. package/dist/src/extensions/types.js +1 -0
  37. package/dist/src/fixtures/modelFusion.d.ts +103 -0
  38. package/dist/src/fixtures/modelFusion.js +404 -0
  39. package/dist/src/fixtures/replay.d.ts +9 -0
  40. package/dist/src/fixtures/replay.js +41 -0
  41. package/dist/src/fixtures/sanitizer.d.ts +9 -0
  42. package/dist/src/fixtures/sanitizer.js +43 -0
  43. package/dist/src/fixtures/schema.d.ts +38 -0
  44. package/dist/src/fixtures/schema.js +33 -0
  45. package/dist/src/gen/agent/v1/agent_pb.d.ts +21577 -0
  46. package/dist/src/gen/agent/v1/agent_pb.js +5325 -0
  47. package/dist/src/gen/aiserver/v1/aiserver_pb.d.ts +135242 -0
  48. package/dist/src/gen/aiserver/v1/aiserver_pb.js +34430 -0
  49. package/dist/src/gen/anyrun/v1/anyrun_pb.d.ts +1163 -0
  50. package/dist/src/gen/anyrun/v1/anyrun_pb.js +374 -0
  51. package/dist/src/gen/google/protobuf/google_pb.d.ts +142 -0
  52. package/dist/src/gen/google/protobuf/google_pb.js +54 -0
  53. package/dist/src/gen/internapi/v1/internapi_pb.d.ts +121 -0
  54. package/dist/src/gen/internapi/v1/internapi_pb.js +79 -0
  55. package/dist/src/logger.d.ts +8 -0
  56. package/dist/src/logger.js +37 -0
  57. package/dist/src/modelFusion/cursorHarness.d.ts +146 -0
  58. package/dist/src/modelFusion/cursorHarness.js +647 -0
  59. package/dist/src/modelFusion/index.d.ts +4 -0
  60. package/dist/src/modelFusion/index.js +2 -0
  61. package/dist/src/models/registry.d.ts +22 -0
  62. package/dist/src/models/registry.js +30 -0
  63. package/dist/src/proto.d.ts +13 -0
  64. package/dist/src/proto.js +61 -0
  65. package/dist/src/providers/openai.d.ts +64 -0
  66. package/dist/src/providers/openai.js +355 -0
  67. package/dist/src/redaction.d.ts +4 -0
  68. package/dist/src/redaction.js +65 -0
  69. package/dist/src/routeInventory.d.ts +16 -0
  70. package/dist/src/routeInventory.js +39 -0
  71. package/dist/src/routes.d.ts +37 -0
  72. package/dist/src/routes.js +227 -0
  73. package/dist/src/server.d.ts +50 -0
  74. package/dist/src/server.js +1353 -0
  75. package/dist/src/services/agent.d.ts +1 -0
  76. package/dist/src/services/agent.js +7 -0
  77. package/dist/src/services/agentRun.d.ts +60 -0
  78. package/dist/src/services/agentRun.js +391 -0
  79. package/dist/src/services/chat.d.ts +11 -0
  80. package/dist/src/services/chat.js +47 -0
  81. package/dist/src/services/models.d.ts +10 -0
  82. package/dist/src/services/models.js +216 -0
  83. package/dist/src/services/serverConfig.d.ts +2 -0
  84. package/dist/src/services/serverConfig.js +19 -0
  85. package/dist/src/testing/artifacts.d.ts +14 -0
  86. package/dist/src/testing/artifacts.js +92 -0
  87. package/dist/src/testing/cli.d.ts +4 -0
  88. package/dist/src/testing/cli.js +192 -0
  89. package/dist/src/testing/localBackend.d.ts +24 -0
  90. package/dist/src/testing/localBackend.js +310 -0
  91. package/dist/src/testing/processRunner.d.ts +7 -0
  92. package/dist/src/testing/processRunner.js +74 -0
  93. package/dist/src/testing/runner.d.ts +9 -0
  94. package/dist/src/testing/runner.js +85 -0
  95. package/dist/src/testing/scenarios.d.ts +3 -0
  96. package/dist/src/testing/scenarios.js +2535 -0
  97. package/dist/src/testing/types.d.ts +66 -0
  98. package/dist/src/testing/types.js +1 -0
  99. package/dist/src/tools/baselineInventory.d.ts +12 -0
  100. package/dist/src/tools/baselineInventory.js +680 -0
  101. package/dist/src/tools/checkModelFusionProtocol.d.ts +1 -0
  102. package/dist/src/tools/checkModelFusionProtocol.js +274 -0
  103. package/dist/src/tools/checkReleasePublishConfig.d.ts +1 -0
  104. package/dist/src/tools/checkReleasePublishConfig.js +99 -0
  105. package/dist/src/tools/generateProtoInventory.d.ts +1 -0
  106. package/dist/src/tools/generateProtoInventory.js +89 -0
  107. package/dist/src/tools/normalizeGeneratedCode.d.ts +1 -0
  108. package/dist/src/tools/normalizeGeneratedCode.js +18 -0
  109. package/dist/src/tools/releaseCheck.d.ts +26 -0
  110. package/dist/src/tools/releaseCheck.js +367 -0
  111. package/dist/src/trace.d.ts +39 -0
  112. package/dist/src/trace.js +106 -0
  113. package/dist/src/translation.d.ts +6 -0
  114. package/dist/src/translation.js +22 -0
  115. package/dist/src/upstream.d.ts +20 -0
  116. package/dist/src/upstream.js +270 -0
  117. package/docs/configuration.md +55 -0
  118. package/docs/cursor-app.md +263 -0
  119. package/docs/implementation-inventory.json +609 -0
  120. package/docs/learnings.md +363 -0
  121. package/docs/model-fusion-protocol-origin.json +126 -0
  122. package/docs/model-fusion-protocol.md +110 -0
  123. package/docs/plugin-authoring.md +24 -0
  124. package/docs/proto-inventory.md +1477 -0
  125. package/docs/protocol-surface-audit.md +92 -0
  126. package/docs/protocol.md +52 -0
  127. package/docs/refreshing-protos.md +78 -0
  128. package/docs/release-gates.md +110 -0
  129. package/docs/release-summary.json +86 -0
  130. package/docs/route-contract-manifest.json +288 -0
  131. package/docs/route-policy.json +133 -0
  132. package/docs/service-manifest.json +9490 -0
  133. package/docs/test-manifest.json +155 -0
  134. package/docs/testing-harness.md +204 -0
  135. package/docs/troubleshooting.md +36 -0
  136. package/docs/type-manifest-summary.json +28927 -0
  137. package/package.json +93 -0
  138. package/proto/agent/v1/agent.proto +5371 -0
  139. package/proto/aiserver/v1/aiserver.proto +32944 -0
  140. package/proto/anyrun/v1/anyrun.proto +294 -0
  141. package/proto/google/protobuf/google.proto +37 -0
  142. package/proto/internapi/v1/internapi.proto +32 -0
@@ -0,0 +1,227 @@
1
+ export const AVAILABLE_MODELS_PATH = "/aiserver.v1.AiService/AvailableModels";
2
+ export const GET_USABLE_MODELS_PATH = "/aiserver.v1.AiService/GetUsableModels";
3
+ export const GET_DEFAULT_MODEL_FOR_CLI_PATH = "/aiserver.v1.AiService/GetDefaultModelForCli";
4
+ export const GET_DEFAULT_MODEL_PATH = "/aiserver.v1.AiService/GetDefaultModel";
5
+ export const NAME_AGENT_PATH = "/aiserver.v1.AiService/NameAgent";
6
+ export const GET_SERVER_CONFIG_PATH = "/aiserver.v1.ServerConfigService/GetServerConfig";
7
+ export const AGENT_RUN_PATH = "/agent.v1.AgentService/Run";
8
+ export const AGENT_RUN_SSE_PATH = "/agent.v1.AgentService/RunSSE";
9
+ export const BIDI_APPEND_PATH = "/aiserver.v1.BidiService/BidiAppend";
10
+ export const STREAM_CHAT_WITH_TOOLS_PATH = "/aiserver.v1.ChatService/StreamUnifiedChatWithTools";
11
+ export const UPLOAD_ISSUE_TRACE_PATH = "/aiserver.v1.AnalyticsService/UploadIssueTrace";
12
+ export const AUTH_FULL_STRIPE_PROFILE_PATH = "/auth/full_stripe_profile";
13
+ export const AUTH_STRIPE_PROFILE_PATH = "/auth/stripe_profile";
14
+ export const ROUTE_CONTRACT_SEEDS = [
15
+ {
16
+ path: AVAILABLE_MODELS_PATH,
17
+ packageName: "aiserver.v1",
18
+ service: "AiService",
19
+ method: "AvailableModels",
20
+ policy: "intercept",
21
+ supportLevel: "implemented",
22
+ owner: "bridge-core",
23
+ expectedMethods: ["POST"],
24
+ expectedContentTypes: ["application/proto", "application/connect+proto"],
25
+ reason: "Merge conservative local model entries with upstream models.",
26
+ uncertainty: "Model metadata fields beyond local id/display/context remain fixture-gated.",
27
+ },
28
+ {
29
+ path: GET_USABLE_MODELS_PATH,
30
+ packageName: "aiserver.v1",
31
+ service: "AiService",
32
+ method: "GetUsableModels",
33
+ policy: "intercept",
34
+ supportLevel: "implemented",
35
+ owner: "bridge-core",
36
+ expectedMethods: ["POST"],
37
+ expectedContentTypes: ["application/proto", "application/connect+proto"],
38
+ reason: "Cursor Agent CLI reads this route for its model picker; merge local model entries with upstream usable models.",
39
+ uncertainty: "Desktop model picker usage must be confirmed by route inventory before adding desktop-specific assumptions.",
40
+ },
41
+ {
42
+ path: GET_DEFAULT_MODEL_FOR_CLI_PATH,
43
+ packageName: "aiserver.v1",
44
+ service: "AiService",
45
+ method: "GetDefaultModelForCli",
46
+ policy: "intercept",
47
+ supportLevel: "implemented",
48
+ owner: "bridge-core",
49
+ expectedMethods: ["POST"],
50
+ expectedContentTypes: ["application/proto", "application/connect+proto"],
51
+ reason: "Preserve upstream's CLI default model when present; otherwise provide the first registered local model.",
52
+ uncertainty: "Client-specific default selection remains gated by observed CLI/ACP traffic.",
53
+ },
54
+ {
55
+ path: GET_DEFAULT_MODEL_PATH,
56
+ packageName: "aiserver.v1",
57
+ service: "AiService",
58
+ method: "GetDefaultModel",
59
+ policy: "intercept",
60
+ supportLevel: "implemented",
61
+ owner: "bridge-core",
62
+ expectedMethods: ["POST"],
63
+ expectedContentTypes: ["application/proto", "application/connect+proto"],
64
+ reason: "Return the first registered local model as a fallback default for non-CLI callers.",
65
+ uncertainty: "Desktop reliance on this route is not yet proven by captured traffic.",
66
+ },
67
+ {
68
+ path: NAME_AGENT_PATH,
69
+ packageName: "aiserver.v1",
70
+ service: "AiService",
71
+ method: "NameAgent",
72
+ policy: "intercept",
73
+ supportLevel: "implemented",
74
+ owner: "bridge-core",
75
+ expectedMethods: ["POST"],
76
+ expectedContentTypes: ["application/proto", "application/connect+proto"],
77
+ reason: "Provide a local fallback name for Cursor Agent sessions.",
78
+ uncertainty: "Exact naming behavior can be refined once real client naming fixtures are replayed.",
79
+ },
80
+ {
81
+ path: GET_SERVER_CONFIG_PATH,
82
+ packageName: "aiserver.v1",
83
+ service: "ServerConfigService",
84
+ method: "GetServerConfig",
85
+ policy: "intercept",
86
+ supportLevel: "implemented",
87
+ owner: "bridge-core",
88
+ expectedMethods: ["POST"],
89
+ expectedContentTypes: ["application/proto", "application/connect+proto"],
90
+ reason: "Rewrite agent URLs to the bridge origin and force HTTP/2 off for local bridge compatibility.",
91
+ uncertainty: "Additional desktop server-config fields stay pass-through until captured fixtures prove they are needed.",
92
+ },
93
+ {
94
+ path: AUTH_FULL_STRIPE_PROFILE_PATH,
95
+ policy: "intercept",
96
+ supportLevel: "implemented",
97
+ owner: "bridge-core",
98
+ expectedMethods: ["GET", "POST"],
99
+ expectedContentTypes: ["application/json", "none"],
100
+ reason: "Provide a local desktop auth-profile shim for Cursor desktop experiments.",
101
+ uncertainty: "HTTP auth profile routes are not proto-backed; exact desktop expectations remain traffic-gated.",
102
+ },
103
+ {
104
+ path: AUTH_STRIPE_PROFILE_PATH,
105
+ policy: "intercept",
106
+ supportLevel: "implemented",
107
+ owner: "bridge-core",
108
+ expectedMethods: ["GET", "POST"],
109
+ expectedContentTypes: ["application/json", "none"],
110
+ reason: "Provide a local desktop auth-profile shim for Cursor desktop experiments.",
111
+ uncertainty: "HTTP auth profile routes are not proto-backed; exact desktop expectations remain traffic-gated.",
112
+ },
113
+ {
114
+ path: AGENT_RUN_PATH,
115
+ packageName: "agent.v1",
116
+ service: "AgentService",
117
+ method: "Run",
118
+ policy: "intercept",
119
+ supportLevel: "conditional",
120
+ owner: "bridge-core",
121
+ expectedMethods: ["POST"],
122
+ expectedContentTypes: ["application/proto", "application/connect+proto"],
123
+ reason: "Handle local Agent Run requests when the selected model is registered locally; otherwise preserve upstream behavior.",
124
+ uncertainty: "Connect/native streaming shape needs broader fixture replay before this becomes fully fixture-backed.",
125
+ },
126
+ {
127
+ path: AGENT_RUN_SSE_PATH,
128
+ packageName: "agent.v1",
129
+ service: "AgentService",
130
+ method: "RunSSE",
131
+ policy: "intercept",
132
+ supportLevel: "conditional",
133
+ owner: "bridge-core",
134
+ expectedMethods: ["POST"],
135
+ expectedContentTypes: ["application/proto", "application/connect+proto"],
136
+ reason: "Serve Cursor Agent local-model runs when paired with a matching BidiAppend payload.",
137
+ uncertainty: "Bidi request-id flow and payload framing need captured fixture replay across CLI and ACP.",
138
+ },
139
+ {
140
+ path: BIDI_APPEND_PATH,
141
+ packageName: "aiserver.v1",
142
+ service: "BidiService",
143
+ method: "BidiAppend",
144
+ policy: "intercept",
145
+ supportLevel: "conditional",
146
+ owner: "bridge-core",
147
+ expectedMethods: ["POST"],
148
+ expectedContentTypes: ["application/proto", "application/connect+proto"],
149
+ reason: "Decode Cursor Agent client messages and register pending local-model runs.",
150
+ uncertainty: "Observed payload encodings include surprising nested forms; unsupported forms must pass through.",
151
+ },
152
+ {
153
+ path: STREAM_CHAT_WITH_TOOLS_PATH,
154
+ packageName: "aiserver.v1",
155
+ service: "ChatService",
156
+ method: "StreamUnifiedChatWithTools",
157
+ policy: "intercept",
158
+ supportLevel: "conditional",
159
+ owner: "bridge-core",
160
+ expectedMethods: ["POST"],
161
+ expectedContentTypes: ["application/proto", "application/connect+proto"],
162
+ reason: "Handle requests only when selected model is registered locally; otherwise pass upstream.",
163
+ uncertainty: "SSE, Poll, and idempotent chat variants stay pass-through until observed and decoded.",
164
+ },
165
+ {
166
+ path: UPLOAD_ISSUE_TRACE_PATH,
167
+ packageName: "aiserver.v1",
168
+ service: "AnalyticsService",
169
+ method: "UploadIssueTrace",
170
+ policy: "intercept",
171
+ supportLevel: "implemented",
172
+ owner: "bridge-core",
173
+ expectedMethods: ["POST"],
174
+ expectedContentTypes: ["application/proto", "application/connect+proto"],
175
+ reason: "Acknowledge issue-trace uploads locally to avoid forwarding sensitive diagnostic blobs during local experiments.",
176
+ uncertainty: "Full payload redaction and fixture coverage remain part of the reliability/security workstream.",
177
+ },
178
+ ];
179
+ export const INTERCEPTABLE_ROUTE_PATHS = ROUTE_CONTRACT_SEEDS.filter((route) => route.policy === "intercept").map((route) => route.path);
180
+ const INTERCEPTABLE_ROUTES = new Map(ROUTE_CONTRACT_SEEDS.filter((route) => route.policy === "intercept").map((route) => [route.path, route]));
181
+ export function classifyRoute(request) {
182
+ const path = new URL(request.url ?? "/", "http://localhost").pathname;
183
+ const route = INTERCEPTABLE_ROUTES.get(path);
184
+ if (route === undefined) {
185
+ return { path, policy: "pass-through", reason: "default proxy policy" };
186
+ }
187
+ const method = request.method?.toUpperCase() ?? "GET";
188
+ if (!route.expectedMethods.includes(method)) {
189
+ return {
190
+ path,
191
+ policy: "pass-through",
192
+ reason: `method ${method} not in route contract`,
193
+ };
194
+ }
195
+ const contentType = requestContentType(request);
196
+ if (!routeAllowsContentType(route, contentType)) {
197
+ return {
198
+ path,
199
+ policy: "pass-through",
200
+ reason: contentType === undefined
201
+ ? "missing content-type not in route contract"
202
+ : `content-type ${contentType} not in route contract`,
203
+ };
204
+ }
205
+ if (route.policy === "intercept") {
206
+ return {
207
+ path,
208
+ policy: "intercept",
209
+ reason: "fixture-backed route allowlist",
210
+ };
211
+ }
212
+ return { path, policy: "pass-through", reason: "default proxy policy" };
213
+ }
214
+ function requestContentType(request) {
215
+ const header = request.headers["content-type"];
216
+ const value = Array.isArray(header) ? header[0] : header;
217
+ const mediaType = value?.split(";")[0]?.trim().toLowerCase();
218
+ return mediaType === undefined || mediaType.length === 0
219
+ ? undefined
220
+ : mediaType;
221
+ }
222
+ function routeAllowsContentType(route, contentType) {
223
+ if (contentType === undefined) {
224
+ return route.expectedContentTypes.includes("none");
225
+ }
226
+ return route.expectedContentTypes.includes(contentType);
227
+ }
@@ -0,0 +1,50 @@
1
+ import { type Server } from "node:http";
2
+ import type { BridgeConfig } from "./config.js";
3
+ import { type ExtensionManager } from "./extensions/registry.js";
4
+ import type { Logger } from "./logger.js";
5
+ import { ModelRegistry } from "./models/registry.js";
6
+ import { type CursorProto } from "./proto.js";
7
+ import { type LocalAgentRunDecision } from "./services/agentRun.js";
8
+ export interface BridgeRuntime {
9
+ config: BridgeConfig;
10
+ logger: Logger;
11
+ proto: CursorProto;
12
+ models: ModelRegistry;
13
+ extensions: ExtensionManager;
14
+ pendingAgentRuns: Map<string, PendingAgentRun>;
15
+ pendingAgentContextRuns: Map<string, PendingAgentContextRun>;
16
+ /**
17
+ * Tool-result mailboxes for the SSE + BidiAppend Agent Run transport (used by
18
+ * the real cursor-agent CLI). The streaming Connect path reads ExecClientMessage
19
+ * tool results inline from the duplex request body; over SSE the results arrive
20
+ * on separate BidiAppend POSTs, so the SSE tool loop awaits them here, keyed by
21
+ * the Bidi request id.
22
+ */
23
+ toolResultMailboxes: Map<string, ToolResultMailbox>;
24
+ nextAgentExecId: number;
25
+ }
26
+ /**
27
+ * A single-consumer queue of ExecClientMessage payload buffers (each a binary
28
+ * AgentClientMessage) delivered out-of-band via BidiAppend. Exposes an
29
+ * AsyncIterator so the shared Cursor tool loop can await tool results exactly as
30
+ * it does on the inline duplex stream.
31
+ */
32
+ export declare class ToolResultMailbox {
33
+ #private;
34
+ push(payload: Buffer): void;
35
+ close(): void;
36
+ iterator(): AsyncIterator<Buffer>;
37
+ }
38
+ interface PendingAgentRun {
39
+ decision: LocalAgentRunDecision;
40
+ createdAt: number;
41
+ }
42
+ interface PendingAgentContextRun {
43
+ execId: string;
44
+ id: number;
45
+ decision: LocalAgentRunDecision;
46
+ createdAt: number;
47
+ }
48
+ export declare function createBridgeRuntime(config: BridgeConfig, logger: Logger): Promise<BridgeRuntime>;
49
+ export declare function startServer(runtime: BridgeRuntime): Promise<Server>;
50
+ export {};