opencode-ext-connector 0.3.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/CHANGELOG.md +39 -0
- package/LICENSE +29 -0
- package/README.md +207 -0
- package/THIRD_PARTY_NOTICES.md +201 -0
- package/dist/catalog/parse-ids.d.ts +2 -0
- package/dist/catalog/parse-ids.js +49 -0
- package/dist/core/adapter.d.ts +16 -0
- package/dist/core/adapter.js +20 -0
- package/dist/core/clock.d.ts +7 -0
- package/dist/core/clock.js +1 -0
- package/dist/core/deadline.d.ts +13 -0
- package/dist/core/deadline.js +54 -0
- package/dist/core/errors.d.ts +57 -0
- package/dist/core/errors.js +81 -0
- package/dist/core/health.d.ts +22 -0
- package/dist/core/health.js +30 -0
- package/dist/core/http.d.ts +28 -0
- package/dist/core/http.js +1 -0
- package/dist/core/ids.d.ts +7 -0
- package/dist/core/ids.js +23 -0
- package/dist/core/lifecycle.d.ts +4 -0
- package/dist/core/lifecycle.js +16 -0
- package/dist/core/logger.d.ts +21 -0
- package/dist/core/logger.js +61 -0
- package/dist/core/models.d.ts +41 -0
- package/dist/core/models.js +59 -0
- package/dist/core/options.d.ts +31 -0
- package/dist/core/options.js +62 -0
- package/dist/core/process.d.ts +20 -0
- package/dist/core/process.js +1 -0
- package/dist/http/fetch-transport.d.ts +2 -0
- package/dist/http/fetch-transport.js +75 -0
- package/dist/http/package-version.d.ts +7 -0
- package/dist/http/package-version.js +46 -0
- package/dist/http/read-body.d.ts +9 -0
- package/dist/http/read-body.js +22 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +5 -0
- package/dist/logging/logger.d.ts +4 -0
- package/dist/logging/logger.js +11 -0
- package/dist/opencode/auth-store.d.ts +19 -0
- package/dist/opencode/auth-store.js +107 -0
- package/dist/opencode/beta-api.d.ts +3 -0
- package/dist/opencode/beta-api.js +1 -0
- package/dist/opencode/catalog-bridge.d.ts +3 -0
- package/dist/opencode/catalog-bridge.js +85 -0
- package/dist/opencode/health-refresh.d.ts +16 -0
- package/dist/opencode/health-refresh.js +49 -0
- package/dist/opencode/host-options.d.ts +2 -0
- package/dist/opencode/host-options.js +49 -0
- package/dist/opencode/language-factory.d.ts +13 -0
- package/dist/opencode/language-factory.js +37 -0
- package/dist/opencode/ollama-probe.d.ts +2 -0
- package/dist/opencode/ollama-probe.js +15 -0
- package/dist/opencode/ollama-production.d.ts +4 -0
- package/dist/opencode/ollama-production.js +10 -0
- package/dist/opencode/plugin.d.ts +33 -0
- package/dist/opencode/plugin.js +40 -0
- package/dist/opencode/process-exit.d.ts +4 -0
- package/dist/opencode/process-exit.js +22 -0
- package/dist/opencode/provider-entry.d.ts +25 -0
- package/dist/opencode/provider-entry.js +1 -0
- package/dist/opencode/providers.d.ts +16 -0
- package/dist/opencode/providers.js +140 -0
- package/dist/opencode/register-integrations.d.ts +3 -0
- package/dist/opencode/register-integrations.js +8 -0
- package/dist/opencode/reload.d.ts +9 -0
- package/dist/opencode/reload.js +30 -0
- package/dist/opencode/v1-anthropic-auth.d.ts +9 -0
- package/dist/opencode/v1-anthropic-auth.js +55 -0
- package/dist/opencode/v1-catalog.d.ts +13 -0
- package/dist/opencode/v1-catalog.js +80 -0
- package/dist/opencode/v1-language.d.ts +3 -0
- package/dist/opencode/v1-language.js +64 -0
- package/dist/opencode/v1-module.d.ts +23 -0
- package/dist/opencode/v1-module.js +74 -0
- package/dist/opencode/v1-session-auth.d.ts +5 -0
- package/dist/opencode/v1-session-auth.js +98 -0
- package/dist/providers/claude/adapter.d.ts +7 -0
- package/dist/providers/claude/adapter.js +37 -0
- package/dist/providers/claude/atomic-private-file.d.ts +13 -0
- package/dist/providers/claude/atomic-private-file.js +94 -0
- package/dist/providers/claude/auth-json.d.ts +2 -0
- package/dist/providers/claude/auth-json.js +14 -0
- package/dist/providers/claude/auth.d.ts +24 -0
- package/dist/providers/claude/auth.js +200 -0
- package/dist/providers/claude/cli-version.d.ts +10 -0
- package/dist/providers/claude/cli-version.js +36 -0
- package/dist/providers/claude/compat-betas.d.ts +5 -0
- package/dist/providers/claude/compat-betas.js +54 -0
- package/dist/providers/claude/compat-config.d.ts +8 -0
- package/dist/providers/claude/compat-config.js +31 -0
- package/dist/providers/claude/compat-request.d.ts +12 -0
- package/dist/providers/claude/compat-request.js +151 -0
- package/dist/providers/claude/compat-response.d.ts +1 -0
- package/dist/providers/claude/compat-response.js +54 -0
- package/dist/providers/claude/compat-signing.d.ts +9 -0
- package/dist/providers/claude/compat-signing.js +24 -0
- package/dist/providers/claude/compat-transform.d.ts +3 -0
- package/dist/providers/claude/compat-transform.js +224 -0
- package/dist/providers/claude/credentials.d.ts +7 -0
- package/dist/providers/claude/credentials.js +37 -0
- package/dist/providers/claude/emit-stream.d.ts +2 -0
- package/dist/providers/claude/emit-stream.js +62 -0
- package/dist/providers/claude/keychain-account.d.ts +1 -0
- package/dist/providers/claude/keychain-account.js +14 -0
- package/dist/providers/claude/language-model.d.ts +8 -0
- package/dist/providers/claude/language-model.js +109 -0
- package/dist/providers/claude/models.d.ts +9 -0
- package/dist/providers/claude/models.js +24 -0
- package/dist/providers/claude/prompt.d.ts +42 -0
- package/dist/providers/claude/prompt.js +134 -0
- package/dist/providers/claude/refresh.d.ts +19 -0
- package/dist/providers/claude/refresh.js +85 -0
- package/dist/providers/claude/sse-convert.d.ts +6 -0
- package/dist/providers/claude/sse-convert.js +74 -0
- package/dist/providers/claude/sse.d.ts +71 -0
- package/dist/providers/claude/sse.js +123 -0
- package/dist/providers/claude/transform.d.ts +32 -0
- package/dist/providers/claude/transform.js +52 -0
- package/dist/providers/claude/writeback.d.ts +18 -0
- package/dist/providers/claude/writeback.js +140 -0
- package/dist/providers/command-code/adapter.d.ts +7 -0
- package/dist/providers/command-code/adapter.js +37 -0
- package/dist/providers/command-code/auth.d.ts +5 -0
- package/dist/providers/command-code/auth.js +88 -0
- package/dist/providers/command-code/cli-version.d.ts +10 -0
- package/dist/providers/command-code/cli-version.js +36 -0
- package/dist/providers/command-code/emit-stream.d.ts +2 -0
- package/dist/providers/command-code/emit-stream.js +226 -0
- package/dist/providers/command-code/errors.d.ts +33 -0
- package/dist/providers/command-code/errors.js +105 -0
- package/dist/providers/command-code/language-model.d.ts +15 -0
- package/dist/providers/command-code/language-model.js +203 -0
- package/dist/providers/command-code/models.d.ts +3 -0
- package/dist/providers/command-code/models.js +18 -0
- package/dist/providers/command-code/record-stream.d.ts +1 -0
- package/dist/providers/command-code/record-stream.js +61 -0
- package/dist/providers/command-code/request-lifecycle.d.ts +8 -0
- package/dist/providers/command-code/request-lifecycle.js +33 -0
- package/dist/providers/command-code/request.d.ts +14 -0
- package/dist/providers/command-code/request.js +167 -0
- package/dist/providers/command-code/session.d.ts +5 -0
- package/dist/providers/command-code/session.js +9 -0
- package/dist/providers/cursor/adapter.d.ts +7 -0
- package/dist/providers/cursor/adapter.js +37 -0
- package/dist/providers/cursor/auth.d.ts +6 -0
- package/dist/providers/cursor/auth.js +56 -0
- package/dist/providers/cursor/blob-store.d.ts +26 -0
- package/dist/providers/cursor/blob-store.js +119 -0
- package/dist/providers/cursor/bridge-client.d.ts +33 -0
- package/dist/providers/cursor/bridge-client.js +200 -0
- package/dist/providers/cursor/bridge-event-sanitize.d.ts +3 -0
- package/dist/providers/cursor/bridge-event-sanitize.js +49 -0
- package/dist/providers/cursor/bridge-limits.d.ts +3 -0
- package/dist/providers/cursor/bridge-limits.js +10 -0
- package/dist/providers/cursor/bridge-process.d.ts +45 -0
- package/dist/providers/cursor/bridge-process.js +211 -0
- package/dist/providers/cursor/bridge-protocol.d.ts +68 -0
- package/dist/providers/cursor/bridge-protocol.js +49 -0
- package/dist/providers/cursor/bridge-serialize.d.ts +3 -0
- package/dist/providers/cursor/bridge-serialize.js +53 -0
- package/dist/providers/cursor/bridge-wire.d.ts +3 -0
- package/dist/providers/cursor/bridge-wire.js +163 -0
- package/dist/providers/cursor/checkpoint-store.d.ts +28 -0
- package/dist/providers/cursor/checkpoint-store.js +94 -0
- package/dist/providers/cursor/connect-frame-stream.d.ts +19 -0
- package/dist/providers/cursor/connect-frame-stream.js +160 -0
- package/dist/providers/cursor/connect-frame.d.ts +31 -0
- package/dist/providers/cursor/connect-frame.js +121 -0
- package/dist/providers/cursor/credentials.d.ts +5 -0
- package/dist/providers/cursor/credentials.js +22 -0
- package/dist/providers/cursor/direct-run-types.d.ts +33 -0
- package/dist/providers/cursor/direct-run-types.js +1 -0
- package/dist/providers/cursor/direct-run.d.ts +5 -0
- package/dist/providers/cursor/direct-run.js +213 -0
- package/dist/providers/cursor/direct-runtime.d.ts +23 -0
- package/dist/providers/cursor/direct-runtime.js +111 -0
- package/dist/providers/cursor/direct-stream.d.ts +28 -0
- package/dist/providers/cursor/direct-stream.js +190 -0
- package/dist/providers/cursor/exec-reply.d.ts +13 -0
- package/dist/providers/cursor/exec-reply.js +102 -0
- package/dist/providers/cursor/h2-bridge-response.d.ts +9 -0
- package/dist/providers/cursor/h2-bridge-response.js +51 -0
- package/dist/providers/cursor/h2-bridge-session.d.ts +24 -0
- package/dist/providers/cursor/h2-bridge-session.js +197 -0
- package/dist/providers/cursor/h2-bridge.d.ts +2 -0
- package/dist/providers/cursor/h2-bridge.js +12865 -0
- package/dist/providers/cursor/http2.d.ts +18 -0
- package/dist/providers/cursor/http2.js +144 -0
- package/dist/providers/cursor/interaction-reply.d.ts +6 -0
- package/dist/providers/cursor/interaction-reply.js +52 -0
- package/dist/providers/cursor/language-generate.d.ts +2 -0
- package/dist/providers/cursor/language-generate.js +35 -0
- package/dist/providers/cursor/language-model.d.ts +13 -0
- package/dist/providers/cursor/language-model.js +77 -0
- package/dist/providers/cursor/legacy-stream.d.ts +11 -0
- package/dist/providers/cursor/legacy-stream.js +115 -0
- package/dist/providers/cursor/mcp-tools.d.ts +7 -0
- package/dist/providers/cursor/mcp-tools.js +15 -0
- package/dist/providers/cursor/models.d.ts +14 -0
- package/dist/providers/cursor/models.js +116 -0
- package/dist/providers/cursor/ndjson.d.ts +3 -0
- package/dist/providers/cursor/ndjson.js +100 -0
- package/dist/providers/cursor/prompt.d.ts +4 -0
- package/dist/providers/cursor/prompt.js +142 -0
- package/dist/providers/cursor/proto/checkpoint.d.ts +35 -0
- package/dist/providers/cursor/proto/checkpoint.js +114 -0
- package/dist/providers/cursor/proto/context.d.ts +64 -0
- package/dist/providers/cursor/proto/context.js +178 -0
- package/dist/providers/cursor/proto/errors.d.ts +16 -0
- package/dist/providers/cursor/proto/errors.js +26 -0
- package/dist/providers/cursor/proto/exec-control.d.ts +20 -0
- package/dist/providers/cursor/proto/exec-control.js +54 -0
- package/dist/providers/cursor/proto/exec.d.ts +47 -0
- package/dist/providers/cursor/proto/exec.js +154 -0
- package/dist/providers/cursor/proto/fields.d.ts +22 -0
- package/dist/providers/cursor/proto/fields.js +97 -0
- package/dist/providers/cursor/proto/interaction-query.d.ts +15 -0
- package/dist/providers/cursor/proto/interaction-query.js +79 -0
- package/dist/providers/cursor/proto/interaction-tool-update.d.ts +10 -0
- package/dist/providers/cursor/proto/interaction-tool-update.js +58 -0
- package/dist/providers/cursor/proto/interaction-turn-ended.d.ts +6 -0
- package/dist/providers/cursor/proto/interaction-turn-ended.js +18 -0
- package/dist/providers/cursor/proto/interaction.d.ts +65 -0
- package/dist/providers/cursor/proto/interaction.js +185 -0
- package/dist/providers/cursor/proto/kv.d.ts +25 -0
- package/dist/providers/cursor/proto/kv.js +109 -0
- package/dist/providers/cursor/proto/mcp-result.d.ts +40 -0
- package/dist/providers/cursor/proto/mcp-result.js +150 -0
- package/dist/providers/cursor/proto/mcp.d.ts +19 -0
- package/dist/providers/cursor/proto/mcp.js +78 -0
- package/dist/providers/cursor/proto/model.d.ts +11 -0
- package/dist/providers/cursor/proto/model.js +36 -0
- package/dist/providers/cursor/proto/output-location.d.ts +7 -0
- package/dist/providers/cursor/proto/output-location.js +53 -0
- package/dist/providers/cursor/proto/prewarm.d.ts +16 -0
- package/dist/providers/cursor/proto/prewarm.js +68 -0
- package/dist/providers/cursor/proto/request-context.d.ts +16 -0
- package/dist/providers/cursor/proto/request-context.js +58 -0
- package/dist/providers/cursor/proto/request.d.ts +44 -0
- package/dist/providers/cursor/proto/request.js +111 -0
- package/dist/providers/cursor/proto/run-request.d.ts +19 -0
- package/dist/providers/cursor/proto/run-request.js +68 -0
- package/dist/providers/cursor/proto/server.d.ts +35 -0
- package/dist/providers/cursor/proto/server.js +93 -0
- package/dist/providers/cursor/proto/unknown-field.d.ts +1 -0
- package/dist/providers/cursor/proto/unknown-field.js +22 -0
- package/dist/providers/cursor/proto-value.d.ts +3 -0
- package/dist/providers/cursor/proto-value.js +170 -0
- package/dist/providers/cursor/proto-wire.d.ts +22 -0
- package/dist/providers/cursor/proto-wire.js +224 -0
- package/dist/providers/cursor/protocol-failure.d.ts +18 -0
- package/dist/providers/cursor/protocol-failure.js +45 -0
- package/dist/providers/cursor/recovery.d.ts +48 -0
- package/dist/providers/cursor/recovery.js +102 -0
- package/dist/providers/cursor/request-blob-ownership.d.ts +15 -0
- package/dist/providers/cursor/request-blob-ownership.js +39 -0
- package/dist/providers/cursor/request-build.d.ts +18 -0
- package/dist/providers/cursor/request-build.js +123 -0
- package/dist/providers/cursor/request-history.d.ts +32 -0
- package/dist/providers/cursor/request-history.js +163 -0
- package/dist/providers/cursor/request-input.d.ts +75 -0
- package/dist/providers/cursor/request-input.js +123 -0
- package/dist/providers/cursor/run-events.d.ts +15 -0
- package/dist/providers/cursor/run-events.js +43 -0
- package/dist/providers/cursor/run-session-expiry.d.ts +15 -0
- package/dist/providers/cursor/run-session-expiry.js +21 -0
- package/dist/providers/cursor/run-session.d.ts +50 -0
- package/dist/providers/cursor/run-session.js +205 -0
- package/dist/providers/cursor/run.d.ts +9 -0
- package/dist/providers/cursor/run.js +151 -0
- package/dist/providers/cursor/runner.d.ts +1 -0
- package/dist/providers/cursor/runner.js +55 -0
- package/dist/providers/cursor/server-dispatch-types.d.ts +83 -0
- package/dist/providers/cursor/server-dispatch-types.js +1 -0
- package/dist/providers/cursor/server-dispatch.d.ts +3 -0
- package/dist/providers/cursor/server-dispatch.js +178 -0
- package/dist/providers/cursor/session-state.d.ts +21 -0
- package/dist/providers/cursor/session-state.js +118 -0
- package/dist/providers/cursor/session.d.ts +1 -0
- package/dist/providers/cursor/session.js +26 -0
- package/dist/providers/cursor/settle-cleanup.d.ts +1 -0
- package/dist/providers/cursor/settle-cleanup.js +11 -0
- package/dist/providers/cursor/stream-adapter.d.ts +17 -0
- package/dist/providers/cursor/stream-adapter.js +99 -0
- package/dist/providers/cursor/tool-continuation.d.ts +14 -0
- package/dist/providers/cursor/tool-continuation.js +134 -0
- package/dist/providers/cursor/tool-stream.d.ts +2 -0
- package/dist/providers/cursor/tool-stream.js +220 -0
- package/dist/providers/cursor/usage.d.ts +3 -0
- package/dist/providers/cursor/usage.js +35 -0
- package/dist/providers/ollama/adapter.d.ts +8 -0
- package/dist/providers/ollama/adapter.js +65 -0
- package/dist/providers/ollama/catalog-state.d.ts +17 -0
- package/dist/providers/ollama/catalog-state.js +40 -0
- package/dist/providers/ollama/cloud-catalog.d.ts +3 -0
- package/dist/providers/ollama/cloud-catalog.js +82 -0
- package/dist/providers/ollama/errors.d.ts +14 -0
- package/dist/providers/ollama/errors.js +19 -0
- package/dist/providers/ollama/generate.d.ts +2 -0
- package/dist/providers/ollama/generate.js +49 -0
- package/dist/providers/ollama/html-links.d.ts +1 -0
- package/dist/providers/ollama/html-links.js +30 -0
- package/dist/providers/ollama/http.d.ts +12 -0
- package/dist/providers/ollama/http.js +67 -0
- package/dist/providers/ollama/index.d.ts +8 -0
- package/dist/providers/ollama/index.js +8 -0
- package/dist/providers/ollama/language-model.d.ts +11 -0
- package/dist/providers/ollama/language-model.js +62 -0
- package/dist/providers/ollama/local-catalog.d.ts +3 -0
- package/dist/providers/ollama/local-catalog.js +38 -0
- package/dist/providers/ollama/ndjson.d.ts +3 -0
- package/dist/providers/ollama/ndjson.js +51 -0
- package/dist/providers/ollama/prompt.d.ts +8 -0
- package/dist/providers/ollama/prompt.js +141 -0
- package/dist/providers/ollama/protocol.d.ts +56 -0
- package/dist/providers/ollama/protocol.js +26 -0
- package/dist/providers/ollama/runtime.d.ts +11 -0
- package/dist/providers/ollama/runtime.js +128 -0
- package/dist/providers/ollama/stream.d.ts +8 -0
- package/dist/providers/ollama/stream.js +110 -0
- package/dist/sdk/command-code.d.ts +5 -0
- package/dist/sdk/command-code.js +6 -0
- package/dist/sdk/cursor.d.ts +5 -0
- package/dist/sdk/cursor.js +6 -0
- package/dist/sdk/ollama.d.ts +5 -0
- package/dist/sdk/ollama.js +6 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.js +94 -0
- package/docs/README.ko.md +189 -0
- package/package.json +75 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export class CursorProtocolError extends Error {
|
|
2
|
+
reason;
|
|
3
|
+
context;
|
|
4
|
+
name = "CursorProtocolError";
|
|
5
|
+
code = "CURSOR_PROTOCOL_ERROR";
|
|
6
|
+
constructor(reason, context, detail) {
|
|
7
|
+
super(`${context}: ${reason}: ${detail}`);
|
|
8
|
+
this.reason = reason;
|
|
9
|
+
this.context = context;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class CursorProtocolDriftError extends Error {
|
|
13
|
+
context;
|
|
14
|
+
field;
|
|
15
|
+
name = "CursorProtocolDriftError";
|
|
16
|
+
code = "CURSOR_PROTOCOL_DRIFT";
|
|
17
|
+
constructor(context, field, detail = "unsupported protobuf field or variant") {
|
|
18
|
+
super(`${context}: field ${field}: ${detail}`);
|
|
19
|
+
this.context = context;
|
|
20
|
+
this.field = field;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function unreachableVariant(value, context) {
|
|
24
|
+
void value;
|
|
25
|
+
throw new CursorProtocolDriftError(context, 0, "unsupported internal variant");
|
|
26
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type ExecClientControl = {
|
|
2
|
+
readonly kind: "stream-close";
|
|
3
|
+
readonly id: number;
|
|
4
|
+
} | {
|
|
5
|
+
readonly kind: "throw";
|
|
6
|
+
readonly id: number;
|
|
7
|
+
readonly error: string;
|
|
8
|
+
readonly stackTrace?: string;
|
|
9
|
+
} | {
|
|
10
|
+
readonly kind: "heartbeat";
|
|
11
|
+
readonly id: number;
|
|
12
|
+
};
|
|
13
|
+
export type ExecServerControl = {
|
|
14
|
+
readonly kind: "abort";
|
|
15
|
+
readonly id: number;
|
|
16
|
+
};
|
|
17
|
+
export declare function decodeExecClientControl(bytes: Uint8Array): ExecClientControl;
|
|
18
|
+
export declare function encodeExecClientControl(control: ExecClientControl): Uint8Array;
|
|
19
|
+
export declare function decodeExecServerControl(bytes: Uint8Array): ExecServerControl;
|
|
20
|
+
export declare function encodeExecServerControl(control: ExecServerControl): Uint8Array;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Derived from Rahularya01/pi-cursor proto/agent.proto exec control fields. Licensed under MIT.
|
|
2
|
+
// See THIRD_PARTY_NOTICES.md.
|
|
3
|
+
import { concatBytes, decodeFieldsStrict, encodeBytesField, encodeInt32Field, encodeStringField, } from "../proto-wire";
|
|
4
|
+
import { CursorProtocolDriftError, unreachableVariant } from "./errors";
|
|
5
|
+
import { oneofField, optionalString, optionalUint32 } from "./fields";
|
|
6
|
+
function controlId(bytes, context) {
|
|
7
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
8
|
+
return optionalUint32(fields, { context, field: 1, wire: 0 }) ?? 0;
|
|
9
|
+
}
|
|
10
|
+
export function decodeExecClientControl(bytes) {
|
|
11
|
+
const context = "ExecClientControlMessage";
|
|
12
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
13
|
+
const message = oneofField(fields, [1, 2, 3], context);
|
|
14
|
+
if (message.field === 1)
|
|
15
|
+
return { kind: "stream-close", id: controlId(message.bytes, "ExecClientStreamClose") };
|
|
16
|
+
if (message.field === 3)
|
|
17
|
+
return { kind: "heartbeat", id: controlId(message.bytes, "ExecClientHeartbeat") };
|
|
18
|
+
if (message.field === 2) {
|
|
19
|
+
const itemContext = "ExecClientThrow";
|
|
20
|
+
const item = decodeFieldsStrict(message.bytes, { context: itemContext });
|
|
21
|
+
const stackTrace = optionalString(item, { context: itemContext, field: 3, wire: 2 });
|
|
22
|
+
return {
|
|
23
|
+
kind: "throw",
|
|
24
|
+
id: optionalUint32(item, { context: itemContext, field: 1, wire: 0 }) ?? 0,
|
|
25
|
+
error: optionalString(item, { context: itemContext, field: 2, wire: 2 }) ?? "",
|
|
26
|
+
...(stackTrace === undefined ? {} : { stackTrace }),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
throw new CursorProtocolDriftError(context, message.field);
|
|
30
|
+
}
|
|
31
|
+
export function encodeExecClientControl(control) {
|
|
32
|
+
switch (control.kind) {
|
|
33
|
+
case "stream-close":
|
|
34
|
+
return encodeBytesField(1, encodeInt32Field(1, control.id));
|
|
35
|
+
case "throw":
|
|
36
|
+
return encodeBytesField(2, concatBytes([
|
|
37
|
+
encodeInt32Field(1, control.id),
|
|
38
|
+
encodeStringField(2, control.error),
|
|
39
|
+
...(control.stackTrace === undefined ? [] : [encodeStringField(3, control.stackTrace)]),
|
|
40
|
+
]));
|
|
41
|
+
case "heartbeat":
|
|
42
|
+
return encodeBytesField(3, encodeInt32Field(1, control.id));
|
|
43
|
+
default:
|
|
44
|
+
return unreachableVariant(control, "ExecClientControlMessage");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function decodeExecServerControl(bytes) {
|
|
48
|
+
const context = "ExecServerControlMessage";
|
|
49
|
+
const message = oneofField(decodeFieldsStrict(bytes, { context }), [1], context);
|
|
50
|
+
return { kind: "abort", id: controlId(message.bytes, "ExecServerAbort") };
|
|
51
|
+
}
|
|
52
|
+
export function encodeExecServerControl(control) {
|
|
53
|
+
return encodeBytesField(1, encodeInt32Field(1, control.id));
|
|
54
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type McpArgs, type McpResult } from "./mcp";
|
|
2
|
+
import { type RequestContextResult } from "./request-context";
|
|
3
|
+
export type { RequestContext, RequestContextResult } from "./request-context";
|
|
4
|
+
type ExecIdentity = {
|
|
5
|
+
readonly id: number;
|
|
6
|
+
readonly execId: string;
|
|
7
|
+
};
|
|
8
|
+
export type ExecServerMessage = ExecIdentity & ({
|
|
9
|
+
readonly kind: "metadata";
|
|
10
|
+
readonly acceptHookAdditionalContexts: boolean;
|
|
11
|
+
} | {
|
|
12
|
+
readonly kind: "request-context-args";
|
|
13
|
+
readonly notesSessionId?: string;
|
|
14
|
+
readonly workspaceId?: string;
|
|
15
|
+
} | {
|
|
16
|
+
readonly kind: "mcp-args";
|
|
17
|
+
readonly args: McpArgs;
|
|
18
|
+
} | {
|
|
19
|
+
readonly kind: "native";
|
|
20
|
+
readonly operation: ExecNativeOperation;
|
|
21
|
+
readonly field: number;
|
|
22
|
+
readonly payload: Uint8Array;
|
|
23
|
+
readonly spanContext?: Uint8Array;
|
|
24
|
+
});
|
|
25
|
+
export type ExecClientMessage = {
|
|
26
|
+
readonly kind: "request-context-result";
|
|
27
|
+
readonly id: number;
|
|
28
|
+
readonly execId: string;
|
|
29
|
+
readonly result: RequestContextResult;
|
|
30
|
+
} | {
|
|
31
|
+
readonly kind: "mcp-result";
|
|
32
|
+
readonly id: number;
|
|
33
|
+
readonly execId: string;
|
|
34
|
+
readonly result: McpResult;
|
|
35
|
+
} | {
|
|
36
|
+
readonly kind: "native";
|
|
37
|
+
readonly operation: ExecNativeOperation;
|
|
38
|
+
readonly field: number;
|
|
39
|
+
readonly id: number;
|
|
40
|
+
readonly execId: string;
|
|
41
|
+
readonly payload: Uint8Array;
|
|
42
|
+
};
|
|
43
|
+
export type ExecNativeOperation = "shell" | "write" | "delete" | "grep" | "read" | "ls" | "diagnostics" | "shell-stream" | "background-shell-spawn" | "list-mcp-resources" | "read-mcp-resource" | "fetch" | "record-screen" | "computer-use" | "write-shell-stdin";
|
|
44
|
+
export declare function decodeExecServerMessage(bytes: Uint8Array): ExecServerMessage;
|
|
45
|
+
export declare function encodeExecServerMessage(message: ExecServerMessage): Uint8Array;
|
|
46
|
+
export declare function decodeExecClientMessage(bytes: Uint8Array): ExecClientMessage;
|
|
47
|
+
export declare function encodeExecClientMessage(message: ExecClientMessage): Uint8Array;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// Derived from Rahularya01/pi-cursor proto/agent.proto exec/request-context fields. Licensed under MIT.
|
|
2
|
+
// See THIRD_PARTY_NOTICES.md.
|
|
3
|
+
import { concatBytes, decodeFieldsStrict, encodeBoolField, encodeBytesField, encodeInt32Field, encodeStringField, } from "../proto-wire";
|
|
4
|
+
import { CursorProtocolDriftError, unreachableVariant } from "./errors";
|
|
5
|
+
import { assertKnownFields, oneofField, optionalBool, optionalField, optionalString, optionalUint32, } from "./fields";
|
|
6
|
+
import { decodeMcpArgs, decodeMcpResult, encodeMcpArgs, encodeMcpResult, } from "./mcp";
|
|
7
|
+
import { decodeRequestContextResult, encodeRequestContextResult, } from "./request-context";
|
|
8
|
+
const NATIVE_EXEC_FIELDS = {
|
|
9
|
+
2: "shell",
|
|
10
|
+
3: "write",
|
|
11
|
+
4: "delete",
|
|
12
|
+
5: "grep",
|
|
13
|
+
7: "read",
|
|
14
|
+
8: "ls",
|
|
15
|
+
9: "diagnostics",
|
|
16
|
+
14: "shell-stream",
|
|
17
|
+
16: "background-shell-spawn",
|
|
18
|
+
17: "list-mcp-resources",
|
|
19
|
+
18: "read-mcp-resource",
|
|
20
|
+
20: "fetch",
|
|
21
|
+
21: "record-screen",
|
|
22
|
+
22: "computer-use",
|
|
23
|
+
23: "write-shell-stdin",
|
|
24
|
+
};
|
|
25
|
+
const EXEC_MESSAGE_FIELDS = [2, 3, 4, 5, 7, 8, 9, 10, 11, 14, 16, 17, 18, 20, 21, 22, 23];
|
|
26
|
+
function execIdentity(fields, context) {
|
|
27
|
+
const id = optionalUint32(fields, { context, field: 1, wire: 0 }) ?? 0;
|
|
28
|
+
const execId = optionalString(fields, { context, field: 15, wire: 2 }) ?? "";
|
|
29
|
+
return { id, execId };
|
|
30
|
+
}
|
|
31
|
+
export function decodeExecServerMessage(bytes) {
|
|
32
|
+
const context = "ExecServerMessage";
|
|
33
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
34
|
+
assertKnownFields(fields, [1, ...EXEC_MESSAGE_FIELDS, 15, 19, 55], context);
|
|
35
|
+
const identity = execIdentity(fields, context);
|
|
36
|
+
const acceptHookAdditionalContexts = optionalBool(fields, { context, field: 55, wire: 0 });
|
|
37
|
+
const span = optionalField(fields, { context, field: 19, wire: 2 });
|
|
38
|
+
const variantCount = fields.filter((field) => EXEC_MESSAGE_FIELDS.includes(field.field)).length;
|
|
39
|
+
if (variantCount === 0 && acceptHookAdditionalContexts !== undefined) {
|
|
40
|
+
return { kind: "metadata", ...identity, acceptHookAdditionalContexts };
|
|
41
|
+
}
|
|
42
|
+
const message = oneofField(fields, EXEC_MESSAGE_FIELDS, context);
|
|
43
|
+
switch (message.field) {
|
|
44
|
+
case 10: {
|
|
45
|
+
const argsContext = "RequestContextArgs";
|
|
46
|
+
const args = decodeFieldsStrict(message.bytes, { context: argsContext });
|
|
47
|
+
assertKnownFields(args, [2, 3], argsContext);
|
|
48
|
+
const notesSessionId = optionalString(args, { context: argsContext, field: 2, wire: 2 });
|
|
49
|
+
const workspaceId = optionalString(args, { context: argsContext, field: 3, wire: 2 });
|
|
50
|
+
return {
|
|
51
|
+
kind: "request-context-args",
|
|
52
|
+
...identity,
|
|
53
|
+
...(notesSessionId === undefined ? {} : { notesSessionId }),
|
|
54
|
+
...(workspaceId === undefined ? {} : { workspaceId }),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
case 11:
|
|
58
|
+
return { kind: "mcp-args", ...identity, args: decodeMcpArgs(message.bytes) };
|
|
59
|
+
default: {
|
|
60
|
+
const operation = NATIVE_EXEC_FIELDS[message.field];
|
|
61
|
+
if (operation === undefined)
|
|
62
|
+
throw new CursorProtocolDriftError(context, message.field);
|
|
63
|
+
return {
|
|
64
|
+
kind: "native",
|
|
65
|
+
operation,
|
|
66
|
+
field: message.field,
|
|
67
|
+
...identity,
|
|
68
|
+
payload: message.bytes,
|
|
69
|
+
...(span === undefined ? {} : { spanContext: span.bytes }),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function encodeExecServerMessage(message) {
|
|
75
|
+
const id = encodeInt32Field(1, message.id);
|
|
76
|
+
const execId = encodeStringField(15, message.execId);
|
|
77
|
+
switch (message.kind) {
|
|
78
|
+
case "metadata":
|
|
79
|
+
return concatBytes([id, execId, encodeBoolField(55, message.acceptHookAdditionalContexts)]);
|
|
80
|
+
case "request-context-args":
|
|
81
|
+
return concatBytes([
|
|
82
|
+
id,
|
|
83
|
+
encodeBytesField(10, concatBytes([
|
|
84
|
+
...(message.notesSessionId === undefined
|
|
85
|
+
? []
|
|
86
|
+
: [encodeStringField(2, message.notesSessionId)]),
|
|
87
|
+
...(message.workspaceId === undefined
|
|
88
|
+
? []
|
|
89
|
+
: [encodeStringField(3, message.workspaceId)]),
|
|
90
|
+
])),
|
|
91
|
+
execId,
|
|
92
|
+
]);
|
|
93
|
+
case "mcp-args": {
|
|
94
|
+
const payload = encodeBytesField(11, encodeMcpArgs(message.args));
|
|
95
|
+
return concatBytes([id, payload, execId]);
|
|
96
|
+
}
|
|
97
|
+
case "native":
|
|
98
|
+
return concatBytes([
|
|
99
|
+
id,
|
|
100
|
+
encodeBytesField(message.field, message.payload),
|
|
101
|
+
execId,
|
|
102
|
+
...(message.spanContext === undefined ? [] : [encodeBytesField(19, message.spanContext)]),
|
|
103
|
+
]);
|
|
104
|
+
default:
|
|
105
|
+
return unreachableVariant(message, "ExecServerMessage");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export function decodeExecClientMessage(bytes) {
|
|
109
|
+
const context = "ExecClientMessage";
|
|
110
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
111
|
+
assertKnownFields(fields, [1, ...EXEC_MESSAGE_FIELDS, 15], context);
|
|
112
|
+
const identity = execIdentity(fields, context);
|
|
113
|
+
const message = oneofField(fields, EXEC_MESSAGE_FIELDS, context);
|
|
114
|
+
switch (message.field) {
|
|
115
|
+
case 10:
|
|
116
|
+
return {
|
|
117
|
+
kind: "request-context-result",
|
|
118
|
+
...identity,
|
|
119
|
+
result: decodeRequestContextResult(message.bytes),
|
|
120
|
+
};
|
|
121
|
+
case 11:
|
|
122
|
+
return { kind: "mcp-result", ...identity, result: decodeMcpResult(message.bytes) };
|
|
123
|
+
default: {
|
|
124
|
+
const operation = NATIVE_EXEC_FIELDS[message.field];
|
|
125
|
+
if (operation === undefined)
|
|
126
|
+
throw new CursorProtocolDriftError(context, message.field);
|
|
127
|
+
return {
|
|
128
|
+
kind: "native",
|
|
129
|
+
operation,
|
|
130
|
+
field: message.field,
|
|
131
|
+
...identity,
|
|
132
|
+
payload: message.bytes,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
export function encodeExecClientMessage(message) {
|
|
138
|
+
const id = encodeInt32Field(1, message.id);
|
|
139
|
+
const execId = encodeStringField(15, message.execId);
|
|
140
|
+
switch (message.kind) {
|
|
141
|
+
case "request-context-result":
|
|
142
|
+
return concatBytes([
|
|
143
|
+
id,
|
|
144
|
+
encodeBytesField(10, encodeRequestContextResult(message.result)),
|
|
145
|
+
execId,
|
|
146
|
+
]);
|
|
147
|
+
case "mcp-result":
|
|
148
|
+
return concatBytes([id, encodeBytesField(11, encodeMcpResult(message.result)), execId]);
|
|
149
|
+
case "native":
|
|
150
|
+
return concatBytes([id, encodeBytesField(message.field, message.payload), execId]);
|
|
151
|
+
default:
|
|
152
|
+
return unreachableVariant(message, "ExecClientMessage");
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ProtoField } from "../proto-wire";
|
|
2
|
+
export type FieldSpec = {
|
|
3
|
+
readonly context: string;
|
|
4
|
+
readonly field: number;
|
|
5
|
+
readonly wire: number;
|
|
6
|
+
};
|
|
7
|
+
export type ProtoDriftMetadata = {
|
|
8
|
+
readonly unknownFields: readonly ProtoField[];
|
|
9
|
+
readonly stranding: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare function assertKnownFields(fields: readonly ProtoField[], allowed: readonly number[], context: string): void;
|
|
12
|
+
export declare function collectDriftMetadata(fields: readonly ProtoField[], allowed: readonly number[], stranding?: boolean): ProtoDriftMetadata | undefined;
|
|
13
|
+
export declare function encodeDriftFields(drift: ProtoDriftMetadata | undefined): Uint8Array;
|
|
14
|
+
export declare function repeatedFields(fields: readonly ProtoField[], spec: FieldSpec): readonly ProtoField[];
|
|
15
|
+
export declare function optionalField(fields: readonly ProtoField[], spec: FieldSpec): ProtoField | undefined;
|
|
16
|
+
export declare function requiredField(fields: readonly ProtoField[], spec: FieldSpec): ProtoField;
|
|
17
|
+
export declare function oneofField(fields: readonly ProtoField[], allowed: readonly number[], context: string): ProtoField;
|
|
18
|
+
export declare function requiredString(fields: readonly ProtoField[], spec: FieldSpec): string;
|
|
19
|
+
export declare function optionalString(fields: readonly ProtoField[], spec: FieldSpec): string | undefined;
|
|
20
|
+
export declare function requiredUint32(fields: readonly ProtoField[], spec: FieldSpec): number;
|
|
21
|
+
export declare function optionalUint32(fields: readonly ProtoField[], spec: FieldSpec): number | undefined;
|
|
22
|
+
export declare function optionalBool(fields: readonly ProtoField[], spec: FieldSpec): boolean | undefined;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { decodeUtf8Strict, decodeVarintNumberStrict } from "../proto-wire";
|
|
2
|
+
import { CursorProtocolDriftError, CursorProtocolError } from "./errors";
|
|
3
|
+
import { encodeUnknownField } from "./unknown-field";
|
|
4
|
+
function verifyWire(entry, spec) {
|
|
5
|
+
if (entry.wire !== spec.wire) {
|
|
6
|
+
throw new CursorProtocolError("wrong-wire", spec.context, `field ${spec.field} expected wire ${spec.wire}, received ${entry.wire}`);
|
|
7
|
+
}
|
|
8
|
+
return entry;
|
|
9
|
+
}
|
|
10
|
+
export function assertKnownFields(fields, allowed, context) {
|
|
11
|
+
const unknown = fields.find((entry) => !allowed.includes(entry.field));
|
|
12
|
+
if (unknown !== undefined) {
|
|
13
|
+
throw new CursorProtocolDriftError(context, unknown.field);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function collectDriftMetadata(fields, allowed, stranding = false) {
|
|
17
|
+
const unknownFields = fields.filter((entry) => !allowed.includes(entry.field));
|
|
18
|
+
return unknownFields.length === 0 ? undefined : { unknownFields, stranding };
|
|
19
|
+
}
|
|
20
|
+
export function encodeDriftFields(drift) {
|
|
21
|
+
if (drift === undefined) {
|
|
22
|
+
return new Uint8Array();
|
|
23
|
+
}
|
|
24
|
+
const encoded = drift.unknownFields.map((entry) => encodeUnknownField(entry.field, entry.wire, entry.bytes));
|
|
25
|
+
let length = 0;
|
|
26
|
+
for (const field of encoded)
|
|
27
|
+
length += field.length;
|
|
28
|
+
const output = new Uint8Array(length);
|
|
29
|
+
let offset = 0;
|
|
30
|
+
for (const field of encoded) {
|
|
31
|
+
output.set(field, offset);
|
|
32
|
+
offset += field.length;
|
|
33
|
+
}
|
|
34
|
+
return output;
|
|
35
|
+
}
|
|
36
|
+
export function repeatedFields(fields, spec) {
|
|
37
|
+
const matches = [];
|
|
38
|
+
for (const entry of fields) {
|
|
39
|
+
if (entry.field === spec.field) {
|
|
40
|
+
matches.push(verifyWire(entry, spec));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return matches;
|
|
44
|
+
}
|
|
45
|
+
export function optionalField(fields, spec) {
|
|
46
|
+
const matches = repeatedFields(fields, spec);
|
|
47
|
+
if (matches.length > 1) {
|
|
48
|
+
throw new CursorProtocolError("malformed", spec.context, `field ${spec.field} appears more than once`);
|
|
49
|
+
}
|
|
50
|
+
return matches.at(0);
|
|
51
|
+
}
|
|
52
|
+
export function requiredField(fields, spec) {
|
|
53
|
+
const entry = optionalField(fields, spec);
|
|
54
|
+
if (entry === undefined) {
|
|
55
|
+
throw new CursorProtocolError("malformed", spec.context, `required field ${spec.field} is absent`);
|
|
56
|
+
}
|
|
57
|
+
return entry;
|
|
58
|
+
}
|
|
59
|
+
export function oneofField(fields, allowed, context) {
|
|
60
|
+
const matches = fields.filter((entry) => allowed.includes(entry.field));
|
|
61
|
+
if (matches.length !== 1) {
|
|
62
|
+
throw new CursorProtocolError("malformed", context, `expected one variant, received ${matches.length}`);
|
|
63
|
+
}
|
|
64
|
+
const entry = matches.at(0);
|
|
65
|
+
if (entry === undefined) {
|
|
66
|
+
throw new CursorProtocolError("malformed", context, "oneof variant is absent");
|
|
67
|
+
}
|
|
68
|
+
return verifyWire(entry, { context, field: entry.field, wire: 2 });
|
|
69
|
+
}
|
|
70
|
+
export function requiredString(fields, spec) {
|
|
71
|
+
return decodeUtf8Strict(requiredField(fields, spec).bytes, `${spec.context} field ${spec.field}`);
|
|
72
|
+
}
|
|
73
|
+
export function optionalString(fields, spec) {
|
|
74
|
+
const entry = optionalField(fields, spec);
|
|
75
|
+
return entry === undefined
|
|
76
|
+
? undefined
|
|
77
|
+
: decodeUtf8Strict(entry.bytes, `${spec.context} field ${spec.field}`);
|
|
78
|
+
}
|
|
79
|
+
export function requiredUint32(fields, spec) {
|
|
80
|
+
return decodeVarintNumberStrict(requiredField(fields, spec).bytes, `${spec.context} field ${spec.field}`);
|
|
81
|
+
}
|
|
82
|
+
export function optionalUint32(fields, spec) {
|
|
83
|
+
const entry = optionalField(fields, spec);
|
|
84
|
+
return entry === undefined
|
|
85
|
+
? undefined
|
|
86
|
+
: decodeVarintNumberStrict(entry.bytes, `${spec.context} field ${spec.field}`);
|
|
87
|
+
}
|
|
88
|
+
export function optionalBool(fields, spec) {
|
|
89
|
+
const value = optionalUint32(fields, spec);
|
|
90
|
+
if (value === undefined) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
if (value !== 0 && value !== 1) {
|
|
94
|
+
throw new CursorProtocolError("malformed", spec.context, `field ${spec.field} is not boolean`);
|
|
95
|
+
}
|
|
96
|
+
return value === 1;
|
|
97
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type InteractionKind = "web-search" | "ask-question" | "switch-mode" | "exa-search" | "exa-fetch" | "create-plan" | "setup-vm" | "field-9";
|
|
2
|
+
export type InteractionQuery = {
|
|
3
|
+
readonly kind: InteractionKind;
|
|
4
|
+
readonly id: number;
|
|
5
|
+
readonly payload: Uint8Array;
|
|
6
|
+
};
|
|
7
|
+
export type InteractionResponse = {
|
|
8
|
+
readonly kind: InteractionKind;
|
|
9
|
+
readonly id: number;
|
|
10
|
+
readonly payload: Uint8Array;
|
|
11
|
+
};
|
|
12
|
+
export declare function decodeInteractionQuery(bytes: Uint8Array): InteractionQuery;
|
|
13
|
+
export declare function encodeInteractionQuery(query: InteractionQuery): Uint8Array;
|
|
14
|
+
export declare function decodeInteractionResponse(bytes: Uint8Array): InteractionResponse;
|
|
15
|
+
export declare function encodeInteractionResponse(response: InteractionResponse): Uint8Array;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Derived from Rahularya01/pi-cursor proto/agent.proto InteractionQuery/Response. Licensed under MIT.
|
|
2
|
+
// See THIRD_PARTY_NOTICES.md.
|
|
3
|
+
import { concatBytes, decodeFieldsStrict, encodeBytesField, encodeInt32Field } from "../proto-wire";
|
|
4
|
+
import { CursorProtocolDriftError, unreachableVariant } from "./errors";
|
|
5
|
+
import { assertKnownFields, oneofField, requiredUint32 } from "./fields";
|
|
6
|
+
function kindForField(field, context) {
|
|
7
|
+
switch (field) {
|
|
8
|
+
case 2:
|
|
9
|
+
return "web-search";
|
|
10
|
+
case 3:
|
|
11
|
+
return "ask-question";
|
|
12
|
+
case 4:
|
|
13
|
+
return "switch-mode";
|
|
14
|
+
case 5:
|
|
15
|
+
return "exa-search";
|
|
16
|
+
case 6:
|
|
17
|
+
return "exa-fetch";
|
|
18
|
+
case 7:
|
|
19
|
+
return "create-plan";
|
|
20
|
+
case 8:
|
|
21
|
+
return "setup-vm";
|
|
22
|
+
case 9:
|
|
23
|
+
return "field-9";
|
|
24
|
+
default:
|
|
25
|
+
throw new CursorProtocolDriftError(context, field);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function fieldForKind(kind) {
|
|
29
|
+
switch (kind) {
|
|
30
|
+
case "web-search":
|
|
31
|
+
return 2;
|
|
32
|
+
case "ask-question":
|
|
33
|
+
return 3;
|
|
34
|
+
case "switch-mode":
|
|
35
|
+
return 4;
|
|
36
|
+
case "exa-search":
|
|
37
|
+
return 5;
|
|
38
|
+
case "exa-fetch":
|
|
39
|
+
return 6;
|
|
40
|
+
case "create-plan":
|
|
41
|
+
return 7;
|
|
42
|
+
case "setup-vm":
|
|
43
|
+
return 8;
|
|
44
|
+
case "field-9":
|
|
45
|
+
return 9;
|
|
46
|
+
default:
|
|
47
|
+
return unreachableVariant(kind, "InteractionKind");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function decodeInteraction(bytes, context) {
|
|
51
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
52
|
+
assertKnownFields(fields, [1, 2, 3, 4, 5, 6, 7, 8, 9], context);
|
|
53
|
+
const message = oneofField(fields, [2, 3, 4, 5, 6, 7, 8, 9], context);
|
|
54
|
+
const kind = kindForField(message.field, context);
|
|
55
|
+
decodeFieldsStrict(message.bytes, { context: `${context}.${kind}` });
|
|
56
|
+
return {
|
|
57
|
+
kind,
|
|
58
|
+
id: requiredUint32(fields, { context, field: 1, wire: 0 }),
|
|
59
|
+
payload: message.bytes,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function encodeInteraction(message) {
|
|
63
|
+
return concatBytes([
|
|
64
|
+
encodeInt32Field(1, message.id),
|
|
65
|
+
encodeBytesField(fieldForKind(message.kind), message.payload),
|
|
66
|
+
]);
|
|
67
|
+
}
|
|
68
|
+
export function decodeInteractionQuery(bytes) {
|
|
69
|
+
return decodeInteraction(bytes, "InteractionQuery");
|
|
70
|
+
}
|
|
71
|
+
export function encodeInteractionQuery(query) {
|
|
72
|
+
return encodeInteraction(query);
|
|
73
|
+
}
|
|
74
|
+
export function decodeInteractionResponse(bytes) {
|
|
75
|
+
return decodeInteraction(bytes, "InteractionResponse");
|
|
76
|
+
}
|
|
77
|
+
export function encodeInteractionResponse(response) {
|
|
78
|
+
return encodeInteraction(response);
|
|
79
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type McpArgs, type McpToolResult } from "./mcp";
|
|
2
|
+
export type ToolUpdate = {
|
|
3
|
+
readonly callId: string;
|
|
4
|
+
readonly modelCallId: string;
|
|
5
|
+
readonly args: McpArgs;
|
|
6
|
+
readonly result?: McpToolResult;
|
|
7
|
+
readonly rawPayload?: Uint8Array;
|
|
8
|
+
};
|
|
9
|
+
export declare function decodeToolUpdate(bytes: Uint8Array, context: string): ToolUpdate;
|
|
10
|
+
export declare function encodeToolUpdate(update: ToolUpdate): Uint8Array;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Derived from Rahularya01/pi-cursor proto/agent.proto InteractionUpdate fields. Licensed under MIT.
|
|
2
|
+
// See THIRD_PARTY_NOTICES.md.
|
|
3
|
+
import { concatBytes, decodeFieldsStrict, encodeBytesField, encodeStringField } from "../proto-wire";
|
|
4
|
+
import { assertKnownFields, oneofField, optionalField, requiredField, requiredString, } from "./fields";
|
|
5
|
+
import { decodeMcpArgs, decodeMcpToolResult, encodeMcpArgs, encodeMcpToolResult, } from "./mcp";
|
|
6
|
+
function opaqueToolUpdate(bytes) {
|
|
7
|
+
return {
|
|
8
|
+
callId: "",
|
|
9
|
+
modelCallId: "",
|
|
10
|
+
args: { name: "", args: {}, toolCallId: "", providerIdentifier: "", toolName: "" },
|
|
11
|
+
rawPayload: bytes,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function decodeToolUpdate(bytes, context) {
|
|
15
|
+
if (bytes.length === 0) {
|
|
16
|
+
return opaqueToolUpdate(bytes);
|
|
17
|
+
}
|
|
18
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
19
|
+
assertKnownFields(fields, [1, 2, 3], context);
|
|
20
|
+
const callIdField = optionalField(fields, { context, field: 1, wire: 2 });
|
|
21
|
+
const modelCallIdField = optionalField(fields, { context, field: 3, wire: 2 });
|
|
22
|
+
if (callIdField === undefined || modelCallIdField === undefined) {
|
|
23
|
+
return opaqueToolUpdate(bytes);
|
|
24
|
+
}
|
|
25
|
+
const toolCallContext = "ToolCall";
|
|
26
|
+
const toolCall = decodeFieldsStrict(requiredField(fields, { context, field: 2, wire: 2 }).bytes, {
|
|
27
|
+
context: toolCallContext,
|
|
28
|
+
});
|
|
29
|
+
assertKnownFields(toolCall, [15], toolCallContext);
|
|
30
|
+
const mcpContext = "McpToolCall";
|
|
31
|
+
const mcp = decodeFieldsStrict(oneofField(toolCall, [15], toolCallContext).bytes, {
|
|
32
|
+
context: mcpContext,
|
|
33
|
+
});
|
|
34
|
+
assertKnownFields(mcp, [1, 2], mcpContext);
|
|
35
|
+
const result = optionalField(mcp, { context: mcpContext, field: 2, wire: 2 });
|
|
36
|
+
return {
|
|
37
|
+
callId: requiredString(fields, { context, field: 1, wire: 2 }),
|
|
38
|
+
modelCallId: requiredString(fields, { context, field: 3, wire: 2 }),
|
|
39
|
+
args: decodeMcpArgs(requiredField(mcp, { context: mcpContext, field: 1, wire: 2 }).bytes),
|
|
40
|
+
...(result === undefined ? {} : { result: decodeMcpToolResult(result.bytes) }),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function encodeToolUpdate(update) {
|
|
44
|
+
if (update.rawPayload !== undefined) {
|
|
45
|
+
return update.rawPayload;
|
|
46
|
+
}
|
|
47
|
+
const mcp = concatBytes([
|
|
48
|
+
encodeBytesField(1, encodeMcpArgs(update.args)),
|
|
49
|
+
...(update.result === undefined
|
|
50
|
+
? []
|
|
51
|
+
: [encodeBytesField(2, encodeMcpToolResult(update.result))]),
|
|
52
|
+
]);
|
|
53
|
+
return concatBytes([
|
|
54
|
+
encodeStringField(1, update.callId),
|
|
55
|
+
encodeBytesField(2, encodeBytesField(15, mcp)),
|
|
56
|
+
encodeStringField(3, update.modelCallId),
|
|
57
|
+
]);
|
|
58
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type TurnEndedUpdate = {
|
|
2
|
+
readonly kind: "turn-ended";
|
|
3
|
+
readonly payload?: Uint8Array;
|
|
4
|
+
};
|
|
5
|
+
export declare function decodeTurnEndedUpdate(bytes: Uint8Array): TurnEndedUpdate;
|
|
6
|
+
export declare function encodeTurnEndedUpdate(update: TurnEndedUpdate): Uint8Array;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Derived from Rahularya01/pi-cursor proto/agent.proto TurnEndedUpdate. Licensed under MIT.
|
|
2
|
+
// See THIRD_PARTY_NOTICES.md.
|
|
3
|
+
import { decodeFieldsStrict } from "../proto-wire";
|
|
4
|
+
import { assertKnownFields, optionalField } from "./fields";
|
|
5
|
+
export function decodeTurnEndedUpdate(bytes) {
|
|
6
|
+
const context = "TurnEndedUpdate";
|
|
7
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
8
|
+
assertKnownFields(fields, [1, 2, 3, 4, 5], context);
|
|
9
|
+
optionalField(fields, { context, field: 1, wire: 0 });
|
|
10
|
+
optionalField(fields, { context, field: 2, wire: 0 });
|
|
11
|
+
optionalField(fields, { context, field: 3, wire: 0 });
|
|
12
|
+
optionalField(fields, { context, field: 4, wire: 0 });
|
|
13
|
+
optionalField(fields, { context, field: 5, wire: 0 });
|
|
14
|
+
return { kind: "turn-ended", payload: bytes };
|
|
15
|
+
}
|
|
16
|
+
export function encodeTurnEndedUpdate(update) {
|
|
17
|
+
return update.payload ?? new Uint8Array();
|
|
18
|
+
}
|