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,65 @@
|
|
|
1
|
+
import { type ProtoDriftMetadata } from "./fields";
|
|
2
|
+
import { type ToolUpdate } from "./interaction-tool-update";
|
|
3
|
+
import { decodeTurnEndedUpdate } from "./interaction-turn-ended";
|
|
4
|
+
export { decodeInteractionQuery, decodeInteractionResponse, encodeInteractionQuery, encodeInteractionResponse, type InteractionKind, type InteractionQuery, type InteractionResponse, } from "./interaction-query";
|
|
5
|
+
type SemanticInteractionUpdateBody = {
|
|
6
|
+
readonly kind: "text-delta";
|
|
7
|
+
readonly text: string;
|
|
8
|
+
} | ({
|
|
9
|
+
readonly kind: "tool-call-started";
|
|
10
|
+
} & ToolUpdate) | ({
|
|
11
|
+
readonly kind: "tool-call-completed";
|
|
12
|
+
} & ToolUpdate) | {
|
|
13
|
+
readonly kind: "thinking-delta";
|
|
14
|
+
readonly text: string;
|
|
15
|
+
} | {
|
|
16
|
+
readonly kind: "thinking-completed";
|
|
17
|
+
readonly payload: Uint8Array;
|
|
18
|
+
} | {
|
|
19
|
+
readonly kind: "user-message-appended";
|
|
20
|
+
readonly payload: Uint8Array;
|
|
21
|
+
} | {
|
|
22
|
+
readonly kind: "partial-tool-call";
|
|
23
|
+
readonly payload: Uint8Array;
|
|
24
|
+
} | {
|
|
25
|
+
readonly kind: "token-delta";
|
|
26
|
+
readonly tokens: number;
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: "summary";
|
|
29
|
+
readonly payload: Uint8Array;
|
|
30
|
+
} | {
|
|
31
|
+
readonly kind: "summary-started";
|
|
32
|
+
readonly payload: Uint8Array;
|
|
33
|
+
} | {
|
|
34
|
+
readonly kind: "summary-completed";
|
|
35
|
+
readonly payload: Uint8Array;
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: "shell-output-delta";
|
|
38
|
+
readonly payload: Uint8Array;
|
|
39
|
+
} | {
|
|
40
|
+
readonly kind: "heartbeat";
|
|
41
|
+
} | ReturnType<typeof decodeTurnEndedUpdate> | {
|
|
42
|
+
readonly kind: "tool-call-delta";
|
|
43
|
+
readonly payload: Uint8Array;
|
|
44
|
+
} | {
|
|
45
|
+
readonly kind: "step-started";
|
|
46
|
+
readonly payload: Uint8Array;
|
|
47
|
+
} | {
|
|
48
|
+
readonly kind: "step-completed";
|
|
49
|
+
readonly payload: Uint8Array;
|
|
50
|
+
};
|
|
51
|
+
export type Field25Telemetry = {
|
|
52
|
+
readonly placement: "before-semantic" | "after-semantic";
|
|
53
|
+
readonly payload: Uint8Array;
|
|
54
|
+
};
|
|
55
|
+
type SemanticInteractionUpdate = SemanticInteractionUpdateBody & {
|
|
56
|
+
readonly drift?: ProtoDriftMetadata;
|
|
57
|
+
readonly field25Telemetry?: Field25Telemetry;
|
|
58
|
+
};
|
|
59
|
+
export type InteractionUpdate = SemanticInteractionUpdate | {
|
|
60
|
+
readonly kind: "field-25";
|
|
61
|
+
readonly payload: Uint8Array;
|
|
62
|
+
readonly drift?: ProtoDriftMetadata;
|
|
63
|
+
};
|
|
64
|
+
export declare function decodeInteractionUpdate(bytes: Uint8Array): InteractionUpdate;
|
|
65
|
+
export declare function encodeInteractionUpdate(update: InteractionUpdate): Uint8Array;
|
|
@@ -0,0 +1,185 @@
|
|
|
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, encodeInt32Field, encodeStringField, } from "../proto-wire";
|
|
4
|
+
import { CursorProtocolDriftError, unreachableVariant } from "./errors";
|
|
5
|
+
import { assertKnownFields, collectDriftMetadata, encodeDriftFields, oneofField, optionalField, optionalString, optionalUint32, } from "./fields";
|
|
6
|
+
import { decodeToolUpdate, encodeToolUpdate } from "./interaction-tool-update";
|
|
7
|
+
import { decodeTurnEndedUpdate, encodeTurnEndedUpdate } from "./interaction-turn-ended";
|
|
8
|
+
import { encodeUnknownField } from "./unknown-field";
|
|
9
|
+
export { decodeInteractionQuery, decodeInteractionResponse, encodeInteractionQuery, encodeInteractionResponse, } from "./interaction-query";
|
|
10
|
+
const SEMANTIC_FIELDS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17];
|
|
11
|
+
const KNOWN_FIELDS = [...SEMANTIC_FIELDS, 25];
|
|
12
|
+
function decodeTextUpdate(bytes, context) {
|
|
13
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
14
|
+
const drift = collectDriftMetadata(fields, [1]);
|
|
15
|
+
return {
|
|
16
|
+
text: optionalString(fields, { context, field: 1, wire: 2 }) ?? "",
|
|
17
|
+
...(drift === undefined ? {} : { drift }),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function encodeTextUpdate(field, update) {
|
|
21
|
+
return encodeBytesField(field, concatBytes([
|
|
22
|
+
...(update.text === "" ? [] : [encodeStringField(1, update.text)]),
|
|
23
|
+
encodeDriftFields(update.drift),
|
|
24
|
+
]));
|
|
25
|
+
}
|
|
26
|
+
function assertEmptyUpdate(bytes, context) {
|
|
27
|
+
assertKnownFields(decodeFieldsStrict(bytes, { context }), [], context);
|
|
28
|
+
}
|
|
29
|
+
function decodeSemanticInteractionUpdate(update) {
|
|
30
|
+
switch (update.field) {
|
|
31
|
+
case 1:
|
|
32
|
+
return { kind: "text-delta", ...decodeTextUpdate(update.bytes, "TextDeltaUpdate") };
|
|
33
|
+
case 2:
|
|
34
|
+
return {
|
|
35
|
+
kind: "tool-call-started",
|
|
36
|
+
...decodeToolUpdate(update.bytes, "ToolCallStartedUpdate"),
|
|
37
|
+
};
|
|
38
|
+
case 3:
|
|
39
|
+
return {
|
|
40
|
+
kind: "tool-call-completed",
|
|
41
|
+
...decodeToolUpdate(update.bytes, "ToolCallCompletedUpdate"),
|
|
42
|
+
};
|
|
43
|
+
case 4:
|
|
44
|
+
return { kind: "thinking-delta", ...decodeTextUpdate(update.bytes, "ThinkingDeltaUpdate") };
|
|
45
|
+
case 5:
|
|
46
|
+
return { kind: "thinking-completed", payload: update.bytes };
|
|
47
|
+
case 6:
|
|
48
|
+
return { kind: "user-message-appended", payload: update.bytes };
|
|
49
|
+
case 7:
|
|
50
|
+
return { kind: "partial-tool-call", payload: update.bytes };
|
|
51
|
+
case 8: {
|
|
52
|
+
const tokenContext = "TokenDeltaUpdate";
|
|
53
|
+
const tokenFields = decodeFieldsStrict(update.bytes, { context: tokenContext });
|
|
54
|
+
assertKnownFields(tokenFields, [1], tokenContext);
|
|
55
|
+
return {
|
|
56
|
+
kind: "token-delta",
|
|
57
|
+
tokens: optionalUint32(tokenFields, { context: tokenContext, field: 1, wire: 0 }) ?? 0,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
case 9:
|
|
61
|
+
return { kind: "summary", payload: update.bytes };
|
|
62
|
+
case 10:
|
|
63
|
+
return { kind: "summary-started", payload: update.bytes };
|
|
64
|
+
case 11:
|
|
65
|
+
return { kind: "summary-completed", payload: update.bytes };
|
|
66
|
+
case 12:
|
|
67
|
+
return { kind: "shell-output-delta", payload: update.bytes };
|
|
68
|
+
case 13:
|
|
69
|
+
assertEmptyUpdate(update.bytes, "HeartbeatUpdate");
|
|
70
|
+
return { kind: "heartbeat" };
|
|
71
|
+
case 14:
|
|
72
|
+
return decodeTurnEndedUpdate(update.bytes);
|
|
73
|
+
case 15:
|
|
74
|
+
return { kind: "tool-call-delta", payload: update.bytes };
|
|
75
|
+
case 16:
|
|
76
|
+
return { kind: "step-started", payload: update.bytes };
|
|
77
|
+
case 17:
|
|
78
|
+
return { kind: "step-completed", payload: update.bytes };
|
|
79
|
+
default:
|
|
80
|
+
throw new CursorProtocolDriftError("InteractionUpdate", update.field);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function decodeInteractionUpdate(bytes) {
|
|
84
|
+
const context = "InteractionUpdate";
|
|
85
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
86
|
+
assertKnownFields(fields, KNOWN_FIELDS, context);
|
|
87
|
+
const field25 = optionalField(fields, { context, field: 25, wire: 0 });
|
|
88
|
+
if (field25 !== undefined && fields.length === 1) {
|
|
89
|
+
return { kind: "field-25", payload: field25.bytes };
|
|
90
|
+
}
|
|
91
|
+
const update = oneofField(fields, SEMANTIC_FIELDS, context);
|
|
92
|
+
const semantic = decodeSemanticInteractionUpdate(update);
|
|
93
|
+
if (field25 === undefined) {
|
|
94
|
+
return semantic;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
...semantic,
|
|
98
|
+
field25Telemetry: {
|
|
99
|
+
placement: fields.indexOf(field25) < fields.indexOf(update) ? "before-semantic" : "after-semantic",
|
|
100
|
+
payload: field25.bytes,
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function encodeSemanticInteractionUpdate(update) {
|
|
105
|
+
switch (update.kind) {
|
|
106
|
+
case "text-delta":
|
|
107
|
+
return encodeTextUpdate(1, update);
|
|
108
|
+
case "tool-call-started":
|
|
109
|
+
return encodeBytesField(2, encodeToolUpdate(update));
|
|
110
|
+
case "tool-call-completed":
|
|
111
|
+
return encodeBytesField(3, encodeToolUpdate(update));
|
|
112
|
+
case "thinking-delta":
|
|
113
|
+
return encodeTextUpdate(4, update);
|
|
114
|
+
case "thinking-completed":
|
|
115
|
+
return encodeBytesField(5, update.payload);
|
|
116
|
+
case "user-message-appended":
|
|
117
|
+
return encodeBytesField(6, update.payload);
|
|
118
|
+
case "partial-tool-call":
|
|
119
|
+
return encodeBytesField(7, update.payload);
|
|
120
|
+
case "token-delta":
|
|
121
|
+
return encodeBytesField(8, update.tokens === 0 ? new Uint8Array() : encodeInt32Field(1, update.tokens));
|
|
122
|
+
case "summary":
|
|
123
|
+
return encodeBytesField(9, update.payload);
|
|
124
|
+
case "summary-started":
|
|
125
|
+
return encodeBytesField(10, update.payload);
|
|
126
|
+
case "summary-completed":
|
|
127
|
+
return encodeBytesField(11, update.payload);
|
|
128
|
+
case "shell-output-delta":
|
|
129
|
+
return encodeBytesField(12, update.payload);
|
|
130
|
+
case "heartbeat":
|
|
131
|
+
return encodeBytesField(13, new Uint8Array());
|
|
132
|
+
case "turn-ended":
|
|
133
|
+
return encodeBytesField(14, encodeTurnEndedUpdate(update));
|
|
134
|
+
case "tool-call-delta":
|
|
135
|
+
return encodeBytesField(15, update.payload);
|
|
136
|
+
case "step-started":
|
|
137
|
+
return encodeBytesField(16, update.payload);
|
|
138
|
+
case "step-completed":
|
|
139
|
+
return encodeBytesField(17, update.payload);
|
|
140
|
+
default:
|
|
141
|
+
return unreachableVariant(update, "SemanticInteractionUpdate");
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function encodeSemanticWithTelemetry(update) {
|
|
145
|
+
const semantic = encodeSemanticInteractionUpdate(update);
|
|
146
|
+
const telemetry = update.field25Telemetry;
|
|
147
|
+
if (telemetry === undefined) {
|
|
148
|
+
return semantic;
|
|
149
|
+
}
|
|
150
|
+
const field25 = encodeUnknownField(25, 0, telemetry.payload);
|
|
151
|
+
switch (telemetry.placement) {
|
|
152
|
+
case "before-semantic":
|
|
153
|
+
return concatBytes([field25, semantic]);
|
|
154
|
+
case "after-semantic":
|
|
155
|
+
return concatBytes([semantic, field25]);
|
|
156
|
+
default:
|
|
157
|
+
return unreachableVariant(telemetry.placement, "Field25TelemetryPlacement");
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
export function encodeInteractionUpdate(update) {
|
|
161
|
+
switch (update.kind) {
|
|
162
|
+
case "field-25":
|
|
163
|
+
return encodeUnknownField(25, 0, update.payload);
|
|
164
|
+
case "text-delta":
|
|
165
|
+
case "tool-call-started":
|
|
166
|
+
case "tool-call-completed":
|
|
167
|
+
case "thinking-delta":
|
|
168
|
+
case "thinking-completed":
|
|
169
|
+
case "user-message-appended":
|
|
170
|
+
case "partial-tool-call":
|
|
171
|
+
case "token-delta":
|
|
172
|
+
case "summary":
|
|
173
|
+
case "summary-started":
|
|
174
|
+
case "summary-completed":
|
|
175
|
+
case "shell-output-delta":
|
|
176
|
+
case "heartbeat":
|
|
177
|
+
case "turn-ended":
|
|
178
|
+
case "tool-call-delta":
|
|
179
|
+
case "step-started":
|
|
180
|
+
case "step-completed":
|
|
181
|
+
return encodeSemanticWithTelemetry(update);
|
|
182
|
+
default:
|
|
183
|
+
return unreachableVariant(update, "InteractionUpdate");
|
|
184
|
+
}
|
|
185
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type KvServerMessage = {
|
|
2
|
+
readonly kind: "get-blob";
|
|
3
|
+
readonly id: number;
|
|
4
|
+
readonly blobId: Uint8Array;
|
|
5
|
+
readonly spanContext?: Uint8Array;
|
|
6
|
+
} | {
|
|
7
|
+
readonly kind: "set-blob";
|
|
8
|
+
readonly id: number;
|
|
9
|
+
readonly blobId: Uint8Array;
|
|
10
|
+
readonly blobData: Uint8Array;
|
|
11
|
+
readonly spanContext?: Uint8Array;
|
|
12
|
+
};
|
|
13
|
+
export type KvClientMessage = {
|
|
14
|
+
readonly kind: "get-blob-result";
|
|
15
|
+
readonly id: number;
|
|
16
|
+
readonly blobData?: Uint8Array;
|
|
17
|
+
} | {
|
|
18
|
+
readonly kind: "set-blob-result";
|
|
19
|
+
readonly id: number;
|
|
20
|
+
readonly error?: string;
|
|
21
|
+
};
|
|
22
|
+
export declare function decodeKvServerMessage(bytes: Uint8Array): KvServerMessage;
|
|
23
|
+
export declare function encodeKvServerMessage(message: KvServerMessage): Uint8Array;
|
|
24
|
+
export declare function decodeKvClientMessage(bytes: Uint8Array): KvClientMessage;
|
|
25
|
+
export declare function encodeKvClientMessage(message: KvClientMessage): Uint8Array;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Derived from Rahularya01/pi-cursor proto/agent.proto KV blob messages. 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 { assertKnownFields, oneofField, optionalField, optionalUint32, requiredField, requiredString, requiredUint32, } from "./fields";
|
|
6
|
+
export function decodeKvServerMessage(bytes) {
|
|
7
|
+
const context = "KvServerMessage";
|
|
8
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
9
|
+
assertKnownFields(fields, [1, 2, 3, 4], context);
|
|
10
|
+
const id = optionalUint32(fields, { context, field: 1, wire: 0 }) ?? 0;
|
|
11
|
+
const span = optionalField(fields, { context, field: 4, wire: 2 });
|
|
12
|
+
const message = oneofField(fields, [2, 3], context);
|
|
13
|
+
const nestedContext = message.field === 2 ? "GetBlobArgs" : "SetBlobArgs";
|
|
14
|
+
const nested = decodeFieldsStrict(message.bytes, { context: nestedContext });
|
|
15
|
+
switch (message.field) {
|
|
16
|
+
case 2:
|
|
17
|
+
assertKnownFields(nested, [1], nestedContext);
|
|
18
|
+
return {
|
|
19
|
+
kind: "get-blob",
|
|
20
|
+
id,
|
|
21
|
+
blobId: requiredField(nested, { context: nestedContext, field: 1, wire: 2 }).bytes,
|
|
22
|
+
...(span === undefined ? {} : { spanContext: span.bytes }),
|
|
23
|
+
};
|
|
24
|
+
case 3:
|
|
25
|
+
assertKnownFields(nested, [1, 2], nestedContext);
|
|
26
|
+
return {
|
|
27
|
+
kind: "set-blob",
|
|
28
|
+
id,
|
|
29
|
+
blobId: requiredField(nested, { context: nestedContext, field: 1, wire: 2 }).bytes,
|
|
30
|
+
blobData: requiredField(nested, { context: nestedContext, field: 2, wire: 2 }).bytes,
|
|
31
|
+
...(span === undefined ? {} : { spanContext: span.bytes }),
|
|
32
|
+
};
|
|
33
|
+
default:
|
|
34
|
+
throw new CursorProtocolDriftError(context, message.field);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function encodeKvServerMessage(message) {
|
|
38
|
+
switch (message.kind) {
|
|
39
|
+
case "get-blob":
|
|
40
|
+
return concatBytes([
|
|
41
|
+
encodeInt32Field(1, message.id),
|
|
42
|
+
encodeBytesField(2, encodeBytesField(1, message.blobId)),
|
|
43
|
+
...(message.spanContext === undefined ? [] : [encodeBytesField(4, message.spanContext)]),
|
|
44
|
+
]);
|
|
45
|
+
case "set-blob":
|
|
46
|
+
return concatBytes([
|
|
47
|
+
encodeInt32Field(1, message.id),
|
|
48
|
+
encodeBytesField(3, concatBytes([encodeBytesField(1, message.blobId), encodeBytesField(2, message.blobData)])),
|
|
49
|
+
...(message.spanContext === undefined ? [] : [encodeBytesField(4, message.spanContext)]),
|
|
50
|
+
]);
|
|
51
|
+
default:
|
|
52
|
+
return unreachableVariant(message, "KvServerMessage");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function decodeKvClientMessage(bytes) {
|
|
56
|
+
const context = "KvClientMessage";
|
|
57
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
58
|
+
assertKnownFields(fields, [1, 2, 3], context);
|
|
59
|
+
const id = requiredUint32(fields, { context, field: 1, wire: 0 });
|
|
60
|
+
const message = oneofField(fields, [2, 3], context);
|
|
61
|
+
const nestedContext = message.field === 2 ? "GetBlobResult" : "SetBlobResult";
|
|
62
|
+
const nested = decodeFieldsStrict(message.bytes, { context: nestedContext });
|
|
63
|
+
switch (message.field) {
|
|
64
|
+
case 2: {
|
|
65
|
+
assertKnownFields(nested, [1], nestedContext);
|
|
66
|
+
const blobData = optionalField(nested, { context: nestedContext, field: 1, wire: 2 });
|
|
67
|
+
return {
|
|
68
|
+
kind: "get-blob-result",
|
|
69
|
+
id,
|
|
70
|
+
...(blobData === undefined ? {} : { blobData: blobData.bytes }),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
case 3: {
|
|
74
|
+
assertKnownFields(nested, [1], nestedContext);
|
|
75
|
+
const error = optionalField(nested, { context: nestedContext, field: 1, wire: 2 });
|
|
76
|
+
if (error === undefined) {
|
|
77
|
+
return { kind: "set-blob-result", id };
|
|
78
|
+
}
|
|
79
|
+
const errorContext = "Error";
|
|
80
|
+
const errorFields = decodeFieldsStrict(error.bytes, { context: errorContext });
|
|
81
|
+
assertKnownFields(errorFields, [1], errorContext);
|
|
82
|
+
return {
|
|
83
|
+
kind: "set-blob-result",
|
|
84
|
+
id,
|
|
85
|
+
error: requiredString(errorFields, { context: errorContext, field: 1, wire: 2 }),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
default:
|
|
89
|
+
throw new CursorProtocolDriftError(context, message.field);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export function encodeKvClientMessage(message) {
|
|
93
|
+
switch (message.kind) {
|
|
94
|
+
case "get-blob-result":
|
|
95
|
+
return concatBytes([
|
|
96
|
+
encodeInt32Field(1, message.id),
|
|
97
|
+
encodeBytesField(2, message.blobData === undefined ? new Uint8Array() : encodeBytesField(1, message.blobData)),
|
|
98
|
+
]);
|
|
99
|
+
case "set-blob-result":
|
|
100
|
+
return concatBytes([
|
|
101
|
+
encodeInt32Field(1, message.id),
|
|
102
|
+
encodeBytesField(3, message.error === undefined
|
|
103
|
+
? new Uint8Array()
|
|
104
|
+
: encodeBytesField(1, encodeStringField(1, message.error))),
|
|
105
|
+
]);
|
|
106
|
+
default:
|
|
107
|
+
return unreachableVariant(message, "KvClientMessage");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type OutputLocation } from "./output-location";
|
|
2
|
+
export type { OutputLocation } from "./output-location";
|
|
3
|
+
export type McpResultContent = {
|
|
4
|
+
readonly kind: "text";
|
|
5
|
+
readonly text: string;
|
|
6
|
+
readonly outputLocation?: OutputLocation;
|
|
7
|
+
} | {
|
|
8
|
+
readonly kind: "image";
|
|
9
|
+
readonly data: Uint8Array;
|
|
10
|
+
readonly mimeType: string;
|
|
11
|
+
};
|
|
12
|
+
export type McpResult = {
|
|
13
|
+
readonly kind: "success";
|
|
14
|
+
readonly content: readonly McpResultContent[];
|
|
15
|
+
readonly isError: boolean;
|
|
16
|
+
} | {
|
|
17
|
+
readonly kind: "error";
|
|
18
|
+
readonly error: string;
|
|
19
|
+
} | {
|
|
20
|
+
readonly kind: "rejected";
|
|
21
|
+
readonly reason: string;
|
|
22
|
+
readonly isReadonly: boolean;
|
|
23
|
+
} | {
|
|
24
|
+
readonly kind: "permission-denied";
|
|
25
|
+
readonly error: string;
|
|
26
|
+
readonly isReadonly: boolean;
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: "tool-not-found";
|
|
29
|
+
readonly name: string;
|
|
30
|
+
readonly availableTools: readonly string[];
|
|
31
|
+
};
|
|
32
|
+
export type McpToolResult = McpResult | {
|
|
33
|
+
readonly kind: "unknown-oneof";
|
|
34
|
+
readonly field: number;
|
|
35
|
+
readonly payload: Uint8Array;
|
|
36
|
+
};
|
|
37
|
+
export declare function decodeMcpResult(bytes: Uint8Array): McpResult;
|
|
38
|
+
export declare function encodeMcpResult(result: McpResult): Uint8Array;
|
|
39
|
+
export declare function decodeMcpToolResult(bytes: Uint8Array): McpToolResult;
|
|
40
|
+
export declare function encodeMcpToolResult(result: McpToolResult): Uint8Array;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// Derived from Rahularya01/pi-cursor proto/agent.proto McpResult fields. Licensed under MIT.
|
|
2
|
+
// See THIRD_PARTY_NOTICES.md.
|
|
3
|
+
import { concatBytes, decodeFieldsStrict, decodeUtf8Strict, encodeBoolField, encodeBytesField, encodeStringField, } from "../proto-wire";
|
|
4
|
+
import { CursorProtocolDriftError, unreachableVariant } from "./errors";
|
|
5
|
+
import { assertKnownFields, oneofField, optionalBool, optionalField, repeatedFields, requiredField, requiredString, } from "./fields";
|
|
6
|
+
import { decodeOutputLocation, encodeOutputLocation } from "./output-location";
|
|
7
|
+
import { encodeUnknownField } from "./unknown-field";
|
|
8
|
+
function decodeContent(bytes) {
|
|
9
|
+
const context = "McpToolResultContentItem";
|
|
10
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
11
|
+
assertKnownFields(fields, [1, 2], context);
|
|
12
|
+
const content = oneofField(fields, [1, 2], context);
|
|
13
|
+
switch (content.field) {
|
|
14
|
+
case 1: {
|
|
15
|
+
const textContext = "McpTextContent";
|
|
16
|
+
const textFields = decodeFieldsStrict(content.bytes, { context: textContext });
|
|
17
|
+
assertKnownFields(textFields, [1, 2], textContext);
|
|
18
|
+
const outputLocation = optionalField(textFields, { context: textContext, field: 2, wire: 2 });
|
|
19
|
+
return {
|
|
20
|
+
kind: "text",
|
|
21
|
+
text: requiredString(textFields, { context: textContext, field: 1, wire: 2 }),
|
|
22
|
+
...(outputLocation === undefined
|
|
23
|
+
? {}
|
|
24
|
+
: { outputLocation: decodeOutputLocation(outputLocation.bytes) }),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
case 2: {
|
|
28
|
+
const imageContext = "McpImageContent";
|
|
29
|
+
const imageFields = decodeFieldsStrict(content.bytes, { context: imageContext });
|
|
30
|
+
assertKnownFields(imageFields, [1, 2], imageContext);
|
|
31
|
+
return {
|
|
32
|
+
kind: "image",
|
|
33
|
+
data: requiredField(imageFields, { context: imageContext, field: 1, wire: 2 }).bytes,
|
|
34
|
+
mimeType: requiredString(imageFields, { context: imageContext, field: 2, wire: 2 }),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
default:
|
|
38
|
+
throw new CursorProtocolDriftError(context, content.field);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function encodeContent(content) {
|
|
42
|
+
switch (content.kind) {
|
|
43
|
+
case "text":
|
|
44
|
+
return encodeBytesField(1, concatBytes([
|
|
45
|
+
encodeStringField(1, content.text),
|
|
46
|
+
...(content.outputLocation === undefined
|
|
47
|
+
? []
|
|
48
|
+
: [encodeBytesField(2, encodeOutputLocation(content.outputLocation))]),
|
|
49
|
+
]));
|
|
50
|
+
case "image":
|
|
51
|
+
return encodeBytesField(2, concatBytes([encodeBytesField(1, content.data), encodeStringField(2, content.mimeType)]));
|
|
52
|
+
default:
|
|
53
|
+
return unreachableVariant(content, "McpToolResultContentItem");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function decodeSuccess(bytes) {
|
|
57
|
+
const context = "McpSuccess";
|
|
58
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
59
|
+
assertKnownFields(fields, [1, 2], context);
|
|
60
|
+
return {
|
|
61
|
+
kind: "success",
|
|
62
|
+
content: repeatedFields(fields, { context, field: 1, wire: 2 }).map((entry) => decodeContent(entry.bytes)),
|
|
63
|
+
isError: optionalBool(fields, { context, field: 2, wire: 0 }) ?? false,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function decodeMessage(bytes, context) {
|
|
67
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
68
|
+
assertKnownFields(fields, [1], context);
|
|
69
|
+
return requiredString(fields, { context, field: 1, wire: 2 });
|
|
70
|
+
}
|
|
71
|
+
function decodeReadonlyMessage(bytes, context) {
|
|
72
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
73
|
+
assertKnownFields(fields, [1, 2], context);
|
|
74
|
+
return {
|
|
75
|
+
message: requiredString(fields, { context, field: 1, wire: 2 }),
|
|
76
|
+
isReadonly: optionalBool(fields, { context, field: 2, wire: 0 }) ?? false,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export function decodeMcpResult(bytes) {
|
|
80
|
+
const context = "McpResult";
|
|
81
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
82
|
+
assertKnownFields(fields, [1, 2, 3, 4, 5], context);
|
|
83
|
+
const result = oneofField(fields, [1, 2, 3, 4, 5], context);
|
|
84
|
+
switch (result.field) {
|
|
85
|
+
case 1:
|
|
86
|
+
return decodeSuccess(result.bytes);
|
|
87
|
+
case 2:
|
|
88
|
+
return { kind: "error", error: decodeMessage(result.bytes, "McpError") };
|
|
89
|
+
case 3: {
|
|
90
|
+
const rejected = decodeReadonlyMessage(result.bytes, "McpRejected");
|
|
91
|
+
return { kind: "rejected", reason: rejected.message, isReadonly: rejected.isReadonly };
|
|
92
|
+
}
|
|
93
|
+
case 4: {
|
|
94
|
+
const denied = decodeReadonlyMessage(result.bytes, "McpPermissionDenied");
|
|
95
|
+
return { kind: "permission-denied", error: denied.message, isReadonly: denied.isReadonly };
|
|
96
|
+
}
|
|
97
|
+
case 5: {
|
|
98
|
+
const itemContext = "McpToolNotFound";
|
|
99
|
+
const itemFields = decodeFieldsStrict(result.bytes, { context: itemContext });
|
|
100
|
+
assertKnownFields(itemFields, [1, 2], itemContext);
|
|
101
|
+
return {
|
|
102
|
+
kind: "tool-not-found",
|
|
103
|
+
name: requiredString(itemFields, { context: itemContext, field: 1, wire: 2 }),
|
|
104
|
+
availableTools: repeatedFields(itemFields, { context: itemContext, field: 2, wire: 2 }).map((entry) => decodeUtf8Strict(entry.bytes, `${itemContext} field 2`)),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
default:
|
|
108
|
+
throw new CursorProtocolDriftError(context, result.field);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export function encodeMcpResult(result) {
|
|
112
|
+
switch (result.kind) {
|
|
113
|
+
case "success":
|
|
114
|
+
return encodeBytesField(1, concatBytes([
|
|
115
|
+
...result.content.map((content) => encodeBytesField(1, encodeContent(content))),
|
|
116
|
+
encodeBoolField(2, result.isError),
|
|
117
|
+
]));
|
|
118
|
+
case "error":
|
|
119
|
+
return encodeBytesField(2, encodeStringField(1, result.error));
|
|
120
|
+
case "rejected":
|
|
121
|
+
return encodeBytesField(3, concatBytes([encodeStringField(1, result.reason), encodeBoolField(2, result.isReadonly)]));
|
|
122
|
+
case "permission-denied":
|
|
123
|
+
return encodeBytesField(4, concatBytes([encodeStringField(1, result.error), encodeBoolField(2, result.isReadonly)]));
|
|
124
|
+
case "tool-not-found":
|
|
125
|
+
return encodeBytesField(5, concatBytes([
|
|
126
|
+
encodeStringField(1, result.name),
|
|
127
|
+
...result.availableTools.map((name) => encodeStringField(2, name)),
|
|
128
|
+
]));
|
|
129
|
+
default:
|
|
130
|
+
return unreachableVariant(result, "McpResult");
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export function decodeMcpToolResult(bytes) {
|
|
134
|
+
const context = "McpToolResult";
|
|
135
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
136
|
+
const result = oneofField(fields, fields.map((field) => field.field), context);
|
|
137
|
+
if (result.field > 4) {
|
|
138
|
+
return { kind: "unknown-oneof", field: result.field, payload: result.bytes };
|
|
139
|
+
}
|
|
140
|
+
return decodeMcpResult(encodeUnknownField(result.field, 2, result.bytes));
|
|
141
|
+
}
|
|
142
|
+
export function encodeMcpToolResult(result) {
|
|
143
|
+
if (result.kind === "unknown-oneof") {
|
|
144
|
+
return encodeBytesField(result.field, result.payload);
|
|
145
|
+
}
|
|
146
|
+
if (result.kind === "tool-not-found") {
|
|
147
|
+
throw new CursorProtocolDriftError("McpToolResult", 5);
|
|
148
|
+
}
|
|
149
|
+
return encodeMcpResult(result);
|
|
150
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { decodeMcpResult, decodeMcpToolResult, encodeMcpResult, encodeMcpToolResult, type McpResult, type McpResultContent, type McpToolResult, type OutputLocation, } from "./mcp-result";
|
|
2
|
+
export type McpToolDefinition = {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly description: string;
|
|
5
|
+
readonly inputSchema: unknown;
|
|
6
|
+
readonly providerIdentifier: string;
|
|
7
|
+
readonly toolName: string;
|
|
8
|
+
};
|
|
9
|
+
export type McpArgs = {
|
|
10
|
+
readonly name: string;
|
|
11
|
+
readonly args: Readonly<Record<string, unknown>>;
|
|
12
|
+
readonly toolCallId: string;
|
|
13
|
+
readonly providerIdentifier: string;
|
|
14
|
+
readonly toolName: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function decodeMcpToolDefinition(bytes: Uint8Array): McpToolDefinition;
|
|
17
|
+
export declare function encodeMcpToolDefinition(definition: McpToolDefinition): Uint8Array;
|
|
18
|
+
export declare function decodeMcpArgs(bytes: Uint8Array): McpArgs;
|
|
19
|
+
export declare function encodeMcpArgs(args: McpArgs): Uint8Array;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Derived from Rahularya01/pi-cursor proto/agent.proto MCP fields. Licensed under MIT.
|
|
2
|
+
// See THIRD_PARTY_NOTICES.md.
|
|
3
|
+
import { decodeProtobufValueStrict, encodeProtobufValue } from "../proto-value";
|
|
4
|
+
import { concatBytes, decodeFieldsStrict, decodeUtf8Strict, encodeBytesField, encodeStringField, } from "../proto-wire";
|
|
5
|
+
import { CursorProtocolError } from "./errors";
|
|
6
|
+
import { assertKnownFields, optionalField, optionalString, repeatedFields, requiredField, requiredString, } from "./fields";
|
|
7
|
+
export { decodeMcpResult, decodeMcpToolResult, encodeMcpResult, encodeMcpToolResult, } from "./mcp-result";
|
|
8
|
+
export function decodeMcpToolDefinition(bytes) {
|
|
9
|
+
const context = "McpToolDefinition";
|
|
10
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
11
|
+
assertKnownFields(fields, [1, 2, 3, 4, 5], context);
|
|
12
|
+
return {
|
|
13
|
+
name: requiredString(fields, { context, field: 1, wire: 2 }),
|
|
14
|
+
description: requiredString(fields, { context, field: 2, wire: 2 }),
|
|
15
|
+
inputSchema: decodeProtobufValueStrict(requiredField(fields, { context, field: 3, wire: 2 }).bytes),
|
|
16
|
+
providerIdentifier: requiredString(fields, { context, field: 4, wire: 2 }),
|
|
17
|
+
toolName: requiredString(fields, { context, field: 5, wire: 2 }),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function encodeMcpToolDefinition(definition) {
|
|
21
|
+
return concatBytes([
|
|
22
|
+
encodeStringField(1, definition.name),
|
|
23
|
+
encodeStringField(2, definition.description),
|
|
24
|
+
encodeBytesField(3, encodeProtobufValue(definition.inputSchema)),
|
|
25
|
+
encodeStringField(4, definition.providerIdentifier),
|
|
26
|
+
encodeStringField(5, definition.toolName),
|
|
27
|
+
]);
|
|
28
|
+
}
|
|
29
|
+
function decodeArgEntry(bytes) {
|
|
30
|
+
const context = "McpArgs.ArgsEntry";
|
|
31
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
32
|
+
assertKnownFields(fields, [1, 2], context);
|
|
33
|
+
const value = optionalField(fields, { context, field: 2, wire: 2 });
|
|
34
|
+
return {
|
|
35
|
+
key: optionalString(fields, { context, field: 1, wire: 2 }) ?? "",
|
|
36
|
+
value: decodeArgValue(value?.bytes ?? new Uint8Array()),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function decodeArgValue(bytes) {
|
|
40
|
+
const first = bytes.at(0);
|
|
41
|
+
const valueTags = [0x08, 0x11, 0x1a, 0x20, 0x2a, 0x32];
|
|
42
|
+
return first !== undefined && valueTags.includes(first)
|
|
43
|
+
? decodeProtobufValueStrict(bytes)
|
|
44
|
+
: decodeUtf8Strict(bytes, "McpArgs.ArgsEntry value");
|
|
45
|
+
}
|
|
46
|
+
export function decodeMcpArgs(bytes) {
|
|
47
|
+
const context = "McpArgs";
|
|
48
|
+
const fields = decodeFieldsStrict(bytes, { context });
|
|
49
|
+
assertKnownFields(fields, [1, 2, 3, 4, 5], context);
|
|
50
|
+
const args = {};
|
|
51
|
+
for (const field of repeatedFields(fields, { context, field: 2, wire: 2 })) {
|
|
52
|
+
const entry = decodeArgEntry(field.bytes);
|
|
53
|
+
if (Object.hasOwn(args, entry.key)) {
|
|
54
|
+
throw new CursorProtocolError("malformed", context, `duplicate argument ${entry.key}`);
|
|
55
|
+
}
|
|
56
|
+
args[entry.key] = entry.value;
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
name: optionalString(fields, { context, field: 1, wire: 2 }) ?? "",
|
|
60
|
+
args,
|
|
61
|
+
toolCallId: optionalString(fields, { context, field: 3, wire: 2 }) ?? "",
|
|
62
|
+
providerIdentifier: optionalString(fields, { context, field: 4, wire: 2 }) ?? "",
|
|
63
|
+
toolName: optionalString(fields, { context, field: 5, wire: 2 }) ?? "",
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function encodeMcpArgs(args) {
|
|
67
|
+
const entries = Object.keys(args.args).map((key) => encodeBytesField(2, concatBytes([
|
|
68
|
+
...(key === "" ? [] : [encodeStringField(1, key)]),
|
|
69
|
+
encodeBytesField(2, encodeProtobufValue(args.args[key])),
|
|
70
|
+
])));
|
|
71
|
+
return concatBytes([
|
|
72
|
+
...(args.name === "" ? [] : [encodeStringField(1, args.name)]),
|
|
73
|
+
...entries,
|
|
74
|
+
...(args.toolCallId === "" ? [] : [encodeStringField(3, args.toolCallId)]),
|
|
75
|
+
...(args.providerIdentifier === "" ? [] : [encodeStringField(4, args.providerIdentifier)]),
|
|
76
|
+
...(args.toolName === "" ? [] : [encodeStringField(5, args.toolName)]),
|
|
77
|
+
]);
|
|
78
|
+
}
|