From baa4926a6040c6c2736ae753dc312c99e9319e9d Mon Sep 17 00:00:00 2001 From: Eleanor Berger Date: Wed, 12 Aug 2026 10:27:10 +0200 Subject: [PATCH 1/4] fix: run on Node runtime (Desktop sidecar) and export module format The OpenCode Desktop app loads plugins in a Node sidecar, which broke the plugin in three ways: - dist used extensionless relative ESM imports, which Node rejects with ERR_MODULE_NOT_FOUND (Bun tolerates them) - Bun.serve, Bun.spawn and Bun.sleep are undefined in Node - the bare function default export was silently ignored by newer loaders that require the { id, server } module shape Changes: - proxy: use node:http createServer instead of Bun.serve, with a small adapter that preserves the fetch-style Response handler - proxy: spawn the h2-bridge via child_process.spawn(process.execPath) instead of Bun.spawn so it runs under the same runtime (Bun or Node) - auth: replace Bun.sleep with setTimeout - emit explicit .js extensions (module NodeNext) so dist loads in Node - export { id, server } module format alongside the named plugin fn - add prepare script so git/branch installs build dist - add node test/smoke.mjs manual smoke test --- bun.lock | 9 ++- package.json | 2 + src/auth.ts | 4 +- src/index.ts | 18 +++-- src/models.ts | 4 +- src/native-tools.ts | 2 +- src/proxy.ts | 162 +++++++++++++++++++++++++++----------------- test/node-smoke.mjs | 62 +++++++++++++++++ tsconfig.json | 6 +- 9 files changed, 194 insertions(+), 75 deletions(-) create mode 100644 test/node-smoke.mjs diff --git a/bun.lock b/bun.lock index 724e8ec..bdd65b4 100644 --- a/bun.lock +++ b/bun.lock @@ -12,6 +12,7 @@ }, "devDependencies": { "@types/bun": "^1.3.11", + "@types/node": "^26.0.0", "typescript": "^5.9.3", }, }, @@ -41,7 +42,7 @@ "@types/bun": ["@types/bun@1.3.11", "", { "dependencies": { "bun-types": "1.3.11" } }, "sha512-5vPne5QvtpjGpsGYXiFyycfpDF2ECyPcTSsFBMa0fraoxiQyMJ3SmuQIGhzPg2WJuWxVBoxWJ2kClYTcw/4fAg=="], - "@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="], + "@types/node": ["@types/node@26.2.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg=="], "bun-types": ["bun-types@1.3.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-1KGPpoxQWl9f6wcZh57LvrPIInQMn2TQ7jsgxqpRzg+l0QPOFvJVH7HmvHo/AiPgwXy+/Thf6Ov3EdVn1vOabg=="], @@ -83,7 +84,7 @@ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], "uuid": ["uuid@14.0.1", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew=="], @@ -94,5 +95,9 @@ "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "@opencode-ai/plugin/zod": ["zod@4.1.8", "", {}, "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ=="], + + "bun-types/@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="], + + "bun-types/@types/node/undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], } } diff --git a/package.json b/package.json index 0ed5863..451b4c9 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "scripts": { "build": "tsc -p tsconfig.json && node scripts/copy-runtime.mjs", "test": "bun test/smoke.ts", + "prepare": "bun run build", "prepublishOnly": "npm run build" }, "repository": { @@ -51,6 +52,7 @@ }, "devDependencies": { "@types/bun": "^1.3.11", + "@types/node": "^26.0.0", "typescript": "^5.9.3" } } diff --git a/src/auth.ts b/src/auth.ts index 330233f..adf9f5f 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -1,4 +1,4 @@ -import { generatePKCE } from "./pkce"; +import { generatePKCE } from "./pkce.js"; const CURSOR_LOGIN_URL = "https://cursor.com/loginDeepControl"; const CURSOR_POLL_URL = "https://api2.cursor.sh/auth/poll"; @@ -48,7 +48,7 @@ export async function pollCursorAuth( let consecutiveErrors = 0; for (let attempt = 0; attempt < POLL_MAX_ATTEMPTS; attempt++) { - await Bun.sleep(delay); + await new Promise((resolve) => setTimeout(resolve, delay)); try { const response = await fetch( diff --git a/src/index.ts b/src/index.ts index 368500b..c724e4b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,9 +15,9 @@ import { getTokenExpiry, pollCursorAuth, refreshCursorToken, -} from "./auth"; -import { getCursorModels, type CursorModel } from "./models"; -import { startProxy } from "./proxy"; +} from "./auth.js"; +import { getCursorModels, type CursorModel } from "./models.js"; +import { startProxy } from "./proxy.js"; const CURSOR_PROVIDER_ID = "cursor"; @@ -448,4 +448,14 @@ function estimateModelCost(modelId: string): ModelCost { return MODEL_COST_PATTERNS.find((p) => p.match(normalized))?.cost ?? DEFAULT_COST; } -export default CursorAuthPlugin; +/** + * Modern plugin module format: `{ id, server }`. Newer opencode loaders + * (including the Desktop app's sidecar) require this shape; the bare + * function default export was silently ignored there. + */ +export const CursorAuthPluginModule = { + id: "opencode-cursor-oauth", + server: CursorAuthPlugin, +}; + +export default CursorAuthPluginModule; diff --git a/src/models.ts b/src/models.ts index 6926693..7e17a9d 100644 --- a/src/models.ts +++ b/src/models.ts @@ -5,11 +5,11 @@ */ import { create, fromBinary, toBinary } from "@bufbuild/protobuf"; import { z } from "zod"; -import { callCursorUnaryRpc } from "./proxy"; +import { callCursorUnaryRpc } from "./proxy.js"; import { GetUsableModelsRequestSchema, GetUsableModelsResponseSchema, -} from "./proto/agent_pb"; +} from "./proto/agent_pb.js"; const GET_USABLE_MODELS_PATH = "/agent.v1.AgentService/GetUsableModels"; diff --git a/src/native-tools.ts b/src/native-tools.ts index 7ab2cca..a2558e0 100644 --- a/src/native-tools.ts +++ b/src/native-tools.ts @@ -42,7 +42,7 @@ import { type ExecServerMessage, type LsDirectoryTreeNode, type McpToolDefinition, -} from "./proto/agent_pb"; +} from "./proto/agent_pb.js"; export type NativeResultType = | "readResult" diff --git a/src/proxy.ts b/src/proxy.ts index 93c44ec..c8fc2f5 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -67,21 +67,24 @@ import { type ExecServerMessage, type KvServerMessage, type McpToolDefinition, -} from "./proto/agent_pb"; +} from "./proto/agent_pb.js"; import { redirectNativeExec, sendNativeExecResult, type NativeExecBinding, -} from "./native-tools"; +} from "./native-tools.js"; import { createHash } from "node:crypto"; +import { spawn as spawnProcess, type ChildProcess } from "node:child_process"; import { mkdir, readFile, readdir, stat, unlink, writeFile } from "node:fs/promises"; +import { createServer, type IncomingMessage, type Server, type ServerResponse } from "node:http"; import { homedir } from "node:os"; -import { resolve as pathResolve } from "node:path"; +import { dirname, resolve as pathResolve } from "node:path"; +import { Readable } from "node:stream"; +import { fileURLToPath } from "node:url"; import { z } from "zod"; - const CURSOR_API_URL = process.env.CURSOR_API_URL ?? "https://api2.cursor.sh"; const CONNECT_END_STREAM_FLAG = 0b00000010; -const BRIDGE_PATH = pathResolve(import.meta.dir, "h2-bridge.mjs"); +const BRIDGE_PATH = pathResolve(dirname(fileURLToPath(import.meta.url)), "h2-bridge.mjs"); const SSE_HEADERS = { "Content-Type": "text/event-stream", "Cache-Control": "no-cache", @@ -297,7 +300,7 @@ interface SpawnBridgeOptions { } function spawnBridge(options: SpawnBridgeOptions): { - proc: ReturnType; + proc: ChildProcess; write: (data: Uint8Array) => void; end: () => void; onData: (cb: (chunk: Buffer) => void) => void; @@ -305,10 +308,10 @@ function spawnBridge(options: SpawnBridgeOptions): { /** True while the bridge subprocess is still running. */ get alive(): boolean; } { - const proc = Bun.spawn(["node", BRIDGE_PATH], { - stdin: "pipe", - stdout: "pipe", - stderr: "ignore", + // Use process.execPath so the bridge runs under the same runtime that loads + // this plugin: Bun on the CLI, Node in the Desktop sidecar. Both can run .mjs. + const proc = spawnProcess(process.execPath, [BRIDGE_PATH], { + stdio: ["pipe", "pipe", "ignore"], }); const config = JSON.stringify({ @@ -317,7 +320,7 @@ function spawnBridge(options: SpawnBridgeOptions): { path: options.rpcPath, unary: options.unary ?? false, }); - proc.stdin.write(lpEncode(new TextEncoder().encode(config))); + proc.stdin!.write(lpEncode(new TextEncoder().encode(config))); const cbs = { data: null as ((chunk: Buffer) => void) | null, @@ -327,16 +330,17 @@ function spawnBridge(options: SpawnBridgeOptions): { // Track exit state so late onClose registrations fire immediately. let exited = false; let exitCode = 1; + const exitedPromise = new Promise((resolve) => { + proc.once("exit", (code) => resolve(code ?? 1)); + proc.once("error", () => resolve(1)); + }); (async () => { - const reader = proc.stdout.getReader(); let pending = Buffer.alloc(0); try { - while (true) { - const { done, value } = await reader.read(); - if (done) break; - pending = Buffer.concat([pending, Buffer.from(value)]); + for await (const chunk of proc.stdout!) { + pending = Buffer.concat([pending, Buffer.from(chunk)]); while (pending.length >= 4) { const len = pending.readUInt32BE(0); @@ -350,7 +354,7 @@ function spawnBridge(options: SpawnBridgeOptions): { // Stream ended } - const code = await proc.exited ?? 1; + const code = await exitedPromise; exited = true; exitCode = code; cbs.close?.(code); @@ -360,12 +364,12 @@ function spawnBridge(options: SpawnBridgeOptions): { proc, get alive() { return !exited; }, write(data) { - try { proc.stdin.write(lpEncode(data)); } catch {} + try { proc.stdin!.write(lpEncode(data)); } catch {} }, end() { try { - proc.stdin.write(lpEncode(new Uint8Array(0))); - proc.stdin.end(); + proc.stdin!.write(lpEncode(new Uint8Array(0))); + proc.stdin!.end(); } catch {} }, onData(cb) { cbs.data = cb; }, @@ -431,7 +435,7 @@ export async function callCursorUnaryRpc( return promise; } -let proxyServer: ReturnType | undefined; +let proxyServer: Server | undefined; let proxyPort: number | undefined; let proxyAccessTokenProvider: (() => Promise) | undefined; let proxyModels: Array<{ id: string; name: string }> = []; @@ -450,6 +454,66 @@ function buildOpenAIModelList(models: ReadonlyArray<{ id: string; name: string } })); } +/** + * Bridge between node:http and the fetch-style handler below so the request + * handling logic is identical on Bun (CLI) and Node (Desktop sidecar). + */ +async function handleProxyRequest(req: IncomingMessage, res: ServerResponse): Promise { + const url = new URL(req.url ?? "/", "http://127.0.0.1"); + + try { + if (req.method === "GET" && url.pathname === "/v1/models") { + await sendResponse( + res, + new Response( + JSON.stringify({ + object: "list", + data: buildOpenAIModelList(proxyModels), + }), + { headers: { "Content-Type": "application/json" } }, + ), + ); + return; + } + + if (req.method === "POST" && url.pathname === "/v1/chat/completions") { + const chunks: Buffer[] = []; + for await (const chunk of req) chunks.push(Buffer.from(chunk)); + const body = JSON.parse(Buffer.concat(chunks).toString("utf8")) as ChatCompletionRequest; + if (!proxyAccessTokenProvider) { + throw new Error("Cursor proxy access token provider not configured"); + } + const accessToken = await proxyAccessTokenProvider(); + await sendResponse(res, await handleChatCompletion(body, accessToken)); + return; + } + + await sendResponse(res, new Response("Not Found", { status: 404 })); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + await sendResponse( + res, + new Response( + JSON.stringify({ + error: { message, type: "server_error", code: "internal_error" }, + }), + { status: 500, headers: { "Content-Type": "application/json" } }, + ), + ); + } +} + +async function sendResponse(res: ServerResponse, rs: Response): Promise { + res.writeHead(rs.status, Object.fromEntries(rs.headers.entries())); + if (rs.body) { + const stream = Readable.fromWeb(rs.body as unknown as import("node:stream/web").ReadableStream); + stream.on("error", () => res.destroy()); + stream.pipe(res); + } else { + res.end(); + } +} + export function getProxyPort(): number | undefined { return proxyPort; } @@ -467,53 +531,29 @@ export async function startProxy( pruneStaleConversationFiles(); - proxyServer = Bun.serve({ - port: 0, - idleTimeout: 255, // max — Cursor responses can take 30s+ - async fetch(req) { - const url = new URL(req.url); - - if (req.method === "GET" && url.pathname === "/v1/models") { - return new Response( - JSON.stringify({ - object: "list", - data: buildOpenAIModelList(proxyModels), - }), - { headers: { "Content-Type": "application/json" } }, - ); - } - - if (req.method === "POST" && url.pathname === "/v1/chat/completions") { - try { - const body = (await req.json()) as ChatCompletionRequest; - if (!proxyAccessTokenProvider) { - throw new Error("Cursor proxy access token provider not configured"); - } - const accessToken = await proxyAccessTokenProvider(); - return handleChatCompletion(body, accessToken); - } catch (err) { - const message = err instanceof Error ? err.message : String(err); - return new Response( - JSON.stringify({ - error: { message, type: "server_error", code: "internal_error" }, - }), - { status: 500, headers: { "Content-Type": "application/json" } }, - ); - } - } - - return new Response("Not Found", { status: 404 }); - }, + proxyServer = createServer((req, res) => { + handleProxyRequest(req, res).catch(() => { + if (!res.headersSent) res.writeHead(500, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ error: { message: "internal_error", type: "server_error" } })); + }); + }); + proxyServer.keepAliveTimeout = 255_000; // max — Cursor responses can take 30s+ + await new Promise((resolve, reject) => { + proxyServer!.once("error", reject); + proxyServer!.listen(0, "127.0.0.1", () => resolve()); }); - proxyPort = proxyServer.port; - if (!proxyPort) throw new Error("Failed to bind proxy to a port"); + const address = proxyServer.address(); + if (!address || typeof address === "string") { + throw new Error("Failed to bind proxy to a port"); + } + proxyPort = address.port; return proxyPort; } export function stopProxy(): void { if (proxyServer) { - proxyServer.stop(); + proxyServer.close(); proxyServer = undefined; proxyPort = undefined; proxyAccessTokenProvider = undefined; diff --git a/test/node-smoke.mjs b/test/node-smoke.mjs new file mode 100644 index 0000000..d5ae866 --- /dev/null +++ b/test/node-smoke.mjs @@ -0,0 +1,62 @@ +/** + * Manual smoke test proving the plugin runs in a plain Node runtime + * (as used by the OpenCode Desktop sidecar), not just Bun. + * + * Usage: bun run build && node test/node-smoke.mjs + * Requires a valid Cursor OAuth entry in ~/.local/share/opencode/auth.json. + */ +import { readFile } from "node:fs/promises" +import { homedir } from "node:os" +import { join } from "node:path" +import plugin from "../dist/index.js" + +console.log("default export:", Object.keys(plugin), "server type:", typeof plugin.server) + +const hooks = await plugin.server({ + client: { auth: { set: async () => {} } }, + project: {}, + directory: "/", + worktree: "/", + experimental_workspace: { register() {} }, + serverUrl: new URL("http://127.0.0.1"), + $: null, +}) + +// 1. config hook (model discovery into config) +const cfg = { provider: {} } +await hooks.config(cfg) +console.log("models in config:", Object.keys(cfg.provider.cursor?.models ?? {}).length) + +// 2. auth.loader (returns baseURL/apiKey/fetch — what opencode calls at request time) +const getAuth = async () => { + const all = JSON.parse(await readFile(join(homedir(), ".local", "share", "opencode", "auth.json"), "utf8")) + return all.cursor +} +const loaded = await hooks.auth.loader(getAuth, {}) +console.log("baseURL from auth.loader:", loaded?.baseURL) + +if (!loaded?.baseURL) { + console.error("FAIL: no baseURL") + process.exit(1) +} + +const controller = new AbortController() +const timeout = setTimeout(() => controller.abort(), 60_000) +const res = await fetch(loaded.baseURL + "/chat/completions", { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ + model: "cursor-grok-4.5-high", + messages: [{ role: "user", content: "Reply with exactly: node-works" }], + stream: false, + max_tokens: 10, + }), + signal: controller.signal, +}) +clearTimeout(timeout) +const text = await res.text() +console.log("completion status:", res.status) +console.log("body:", text.slice(0, 300)) +if (res.status !== 200) process.exit(1) +console.log("PASS") +process.exit(0) diff --git a/tsconfig.json b/tsconfig.json index a39525f..6617691 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,15 @@ { "compilerOptions": { "target": "ES2022", - "module": "ES2022", - "moduleResolution": "bundler", + "module": "NodeNext", + "moduleResolution": "NodeNext", "esModuleInterop": true, "strict": true, "skipLibCheck": true, "declaration": true, "outDir": "dist", "rootDir": "src", - "types": ["bun"] + "types": ["bun", "node"] }, "include": ["src"] } From 4eaf39cf218bb8f34f7f61a8285896c58ccc66a4 Mon Sep 17 00:00:00 2001 From: Eleanor Berger Date: Wed, 12 Aug 2026 10:37:04 +0200 Subject: [PATCH 2/4] chore: commit dist for branch installs (opencode plugin installer skips prepare for git deps) --- dist/auth.d.ts | 22 + dist/auth.js | 92 + dist/h2-bridge.mjs | 173 + dist/index.d.ts | 23 + dist/index.js | 372 ++ dist/models.d.ts | 10 + dist/models.js | 170 + dist/native-tools.d.ts | 31 + dist/native-tools.js | 537 ++ dist/pkce.d.ts | 4 + dist/pkce.js | 9 + dist/proto/agent_pb.d.ts | 13022 +++++++++++++++++++++++++++++++++++++ dist/proto/agent_pb.js | 3250 +++++++++ dist/proxy.d.ts | 19 + dist/proxy.js | 1349 ++++ 15 files changed, 19083 insertions(+) create mode 100644 dist/auth.d.ts create mode 100644 dist/auth.js create mode 100644 dist/h2-bridge.mjs create mode 100644 dist/index.d.ts create mode 100644 dist/index.js create mode 100644 dist/models.d.ts create mode 100644 dist/models.js create mode 100644 dist/native-tools.d.ts create mode 100644 dist/native-tools.js create mode 100644 dist/pkce.d.ts create mode 100644 dist/pkce.js create mode 100644 dist/proto/agent_pb.d.ts create mode 100644 dist/proto/agent_pb.js create mode 100644 dist/proxy.d.ts create mode 100644 dist/proxy.js diff --git a/dist/auth.d.ts b/dist/auth.d.ts new file mode 100644 index 0000000..c0dac34 --- /dev/null +++ b/dist/auth.d.ts @@ -0,0 +1,22 @@ +export interface CursorAuthParams { + verifier: string; + challenge: string; + uuid: string; + loginUrl: string; +} +export interface CursorCredentials { + access: string; + refresh: string; + expires: number; +} +export declare function generateCursorAuthParams(): Promise; +export declare function pollCursorAuth(uuid: string, verifier: string): Promise<{ + accessToken: string; + refreshToken: string; +}>; +export declare function refreshCursorToken(refreshToken: string): Promise; +/** + * Extract JWT expiry with 5-minute safety margin. + * Falls back to 1 hour from now if token can't be parsed. + */ +export declare function getTokenExpiry(token: string): number; diff --git a/dist/auth.js b/dist/auth.js new file mode 100644 index 0000000..7dcf02c --- /dev/null +++ b/dist/auth.js @@ -0,0 +1,92 @@ +import { generatePKCE } from "./pkce.js"; +const CURSOR_LOGIN_URL = "https://cursor.com/loginDeepControl"; +const CURSOR_POLL_URL = "https://api2.cursor.sh/auth/poll"; +const CURSOR_REFRESH_URL = process.env.CURSOR_REFRESH_URL ?? + "https://api2.cursor.sh/auth/exchange_user_api_key"; +const POLL_MAX_ATTEMPTS = 150; +const POLL_BASE_DELAY = 1000; +const POLL_MAX_DELAY = 10_000; +const POLL_BACKOFF_MULTIPLIER = 1.2; +export async function generateCursorAuthParams() { + const { verifier, challenge } = await generatePKCE(); + const uuid = crypto.randomUUID(); + const params = new URLSearchParams({ + challenge, + uuid, + mode: "login", + redirectTarget: "cli", + }); + const loginUrl = `${CURSOR_LOGIN_URL}?${params.toString()}`; + return { verifier, challenge, uuid, loginUrl }; +} +export async function pollCursorAuth(uuid, verifier) { + let delay = POLL_BASE_DELAY; + let consecutiveErrors = 0; + for (let attempt = 0; attempt < POLL_MAX_ATTEMPTS; attempt++) { + await new Promise((resolve) => setTimeout(resolve, delay)); + try { + const response = await fetch(`${CURSOR_POLL_URL}?uuid=${uuid}&verifier=${verifier}`); + if (response.status === 404) { + consecutiveErrors = 0; + delay = Math.min(delay * POLL_BACKOFF_MULTIPLIER, POLL_MAX_DELAY); + continue; + } + if (response.ok) { + const data = (await response.json()); + return { + accessToken: data.accessToken, + refreshToken: data.refreshToken, + }; + } + throw new Error(`Poll failed: ${response.status}`); + } + catch { + consecutiveErrors++; + if (consecutiveErrors >= 3) { + throw new Error("Too many consecutive errors during Cursor auth polling"); + } + } + } + throw new Error("Cursor authentication polling timeout"); +} +export async function refreshCursorToken(refreshToken) { + const response = await fetch(CURSOR_REFRESH_URL, { + method: "POST", + headers: { + Authorization: `Bearer ${refreshToken}`, + "Content-Type": "application/json", + }, + body: "{}", + }); + if (!response.ok) { + const error = await response.text(); + throw new Error(`Cursor token refresh failed: ${error}`); + } + const data = (await response.json()); + return { + access: data.accessToken, + refresh: data.refreshToken || refreshToken, + expires: getTokenExpiry(data.accessToken), + }; +} +/** + * Extract JWT expiry with 5-minute safety margin. + * Falls back to 1 hour from now if token can't be parsed. + */ +export function getTokenExpiry(token) { + try { + const parts = token.split("."); + if (parts.length !== 3 || !parts[1]) { + return Date.now() + 3600 * 1000; + } + const decoded = JSON.parse(atob(parts[1].replace(/-/g, "+").replace(/_/g, "/"))); + if (decoded && + typeof decoded === "object" && + typeof decoded.exp === "number") { + return decoded.exp * 1000 - 5 * 60 * 1000; + } + } + catch { + } + return Date.now() + 3600 * 1000; +} diff --git a/dist/h2-bridge.mjs b/dist/h2-bridge.mjs new file mode 100644 index 0000000..e86132e --- /dev/null +++ b/dist/h2-bridge.mjs @@ -0,0 +1,173 @@ +#!/usr/bin/env node +/** + * Dumb HTTP/2 bidirectional pipe for Cursor gRPC. + * + * Bun's node:http2 is broken. This Node script acts as a transparent + * HTTP/2 proxy: it opens a single bidirectional stream and ferries + * raw bytes between the parent process (via stdin/stdout) and Cursor. + * + * Protocol (length-prefixed framing over stdin/stdout): + * [4 bytes big-endian length][payload] + * + * First message on stdin is JSON config: + * { "accessToken": "...", "url": "...", "path": "...", "unary": false } + * + * When unary=true, the bridge uses application/proto (raw protobuf) instead + * of application/connect+proto (Connect streaming). The single stdin message + * is written as the request body and the stream is ended immediately. + * After config, subsequent stdin messages are raw bytes to write to the H2 stream. + * H2 response data is written to stdout using the same length-prefixed framing. + */ +import http2 from "node:http2"; +import crypto from "node:crypto"; + +const CURSOR_CLIENT_VERSION = "cli-2026.01.09-231024f"; + +/** Write one length-prefixed message to stdout. */ +function writeMessage(data) { + const lenBuf = Buffer.alloc(4); + lenBuf.writeUInt32BE(data.length, 0); + process.stdout.write(lenBuf); + process.stdout.write(data); +} + +// --- Buffered stdin reader --- + +let stdinBuf = Buffer.alloc(0); +let stdinResolve = null; +let stdinEnded = false; + +process.stdin.on("data", (chunk) => { + stdinBuf = Buffer.concat([stdinBuf, chunk]); + if (stdinResolve) { + const r = stdinResolve; + stdinResolve = null; + r(); + } +}); + +process.stdin.on("end", () => { + stdinEnded = true; + if (stdinResolve) { + const r = stdinResolve; + stdinResolve = null; + r(); + } +}); + +function waitForData() { + return new Promise((resolve) => { stdinResolve = resolve; }); +} + +async function readExact(n) { + while (stdinBuf.length < n) { + if (stdinEnded) return null; + await waitForData(); + } + const result = stdinBuf.subarray(0, n); + stdinBuf = stdinBuf.subarray(n); + return Buffer.from(result); +} + +async function readMessage() { + const lenBuf = await readExact(4); + if (!lenBuf) return null; + const len = lenBuf.readUInt32BE(0); + if (len === 0) return Buffer.alloc(0); + return readExact(len); +} + +// --- Main --- + +const configBuf = await readMessage(); +if (!configBuf) process.exit(1); + +const config = JSON.parse(configBuf.toString("utf8")); +const { accessToken, url, path: rpcPath, unary } = config; + +const client = http2.connect(url || "https://api2.cursor.sh"); + +// Guard against initial connection failure. Reset on any h2 activity +// so long-running agent conversations (with tool call round-trips) survive. +let timeout = setTimeout(killBridge, 30_000); + +function resetTimeout() { + clearTimeout(timeout); + timeout = setTimeout(killBridge, 120_000); +} + +function killBridge() { + clearTimeout(timeout); + client.destroy(); + process.exit(1); +} + +client.on("error", () => { + clearTimeout(timeout); + process.exit(1); +}); + +const headers = { + ":method": "POST", + ":path": rpcPath || "/agent.v1.AgentService/Run", + "content-type": unary ? "application/proto" : "application/connect+proto", + te: "trailers", + authorization: `Bearer ${accessToken}`, + "x-ghost-mode": "true", + "x-cursor-client-version": CURSOR_CLIENT_VERSION, + "x-cursor-client-type": "cli", + "x-request-id": crypto.randomUUID(), +}; +if (!unary) { + headers["connect-protocol-version"] = "1"; +} +const h2Stream = client.request(headers); + +// Forward H2 response data → stdout (length-prefixed) +h2Stream.on("data", (chunk) => { + resetTimeout(); + writeMessage(chunk); +}); + +h2Stream.on("end", () => { + clearTimeout(timeout); + client.close(); + // Give stdout time to flush + setTimeout(() => process.exit(0), 100); +}); + +h2Stream.on("error", () => { + clearTimeout(timeout); + client.close(); + process.exit(1); +}); + +// Forward stdin → H2 stream (after config message) +if (unary) { + // Unary mode: read a single body message, write it, and end the stream. + const body = await readMessage(); + if (body && body.length > 0 && !h2Stream.closed && !h2Stream.destroyed) { + h2Stream.end(body); + } else { + h2Stream.end(); + } +} else { + // Streaming mode: forward all stdin messages as Connect frames. + (async () => { + while (true) { + const msg = await readMessage(); + if (!msg || msg.length === 0) { + // EOF or zero-length = done writing + break; + } + if (!h2Stream.closed && !h2Stream.destroyed) { + resetTimeout(); + h2Stream.write(msg); + } + } + + if (!h2Stream.closed && !h2Stream.destroyed) { + h2Stream.end(); + } + })(); +} diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..45eaef9 --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,23 @@ +/** + * OpenCode Cursor Auth Plugin + * + * Enables using Cursor models (Claude, GPT, etc.) inside OpenCode via: + * 1. Browser-based OAuth login to Cursor + * 2. Local proxy translating OpenAI format → Cursor gRPC protocol + */ +import type { Plugin } from "@opencode-ai/plugin"; +/** + * OpenCode plugin that provides Cursor authentication and model access. + * Register in opencode.json: { "plugin": ["opencode-cursor-oauth"] } + */ +export declare const CursorAuthPlugin: Plugin; +/** + * Modern plugin module format: `{ id, server }`. Newer opencode loaders + * (including the Desktop app's sidecar) require this shape; the bare + * function default export was silently ignored there. + */ +export declare const CursorAuthPluginModule: { + id: string; + server: Plugin; +}; +export default CursorAuthPluginModule; diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..5549b44 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,372 @@ +import { readFile } from "node:fs/promises"; +import { homedir } from "node:os"; +import { join } from "node:path"; +import { generateCursorAuthParams, getTokenExpiry, pollCursorAuth, refreshCursorToken, } from "./auth.js"; +import { getCursorModels } from "./models.js"; +import { startProxy } from "./proxy.js"; +const CURSOR_PROVIDER_ID = "cursor"; +/** Read the stored cursor OAuth record directly from disk (mirrors core's Auth.all). */ +async function readStoredCursorAuth() { + try { + const dataDir = process.env.XDG_DATA_HOME + ? join(process.env.XDG_DATA_HOME, "opencode") + : join(homedir(), ".local", "share", "opencode"); + const content = process.env.OPENCODE_AUTH_CONTENT ?? + (await readFile(join(dataDir, "auth.json"), "utf8")); + const entry = JSON.parse(content)?.[CURSOR_PROVIDER_ID]; + if (entry?.type === "oauth" && typeof entry.refresh === "string") { + return entry; + } + } + catch { } + return undefined; +} +/** Persist refreshed credentials via the opencode server so rotated refresh tokens are not lost. */ +async function persistCursorAuth(input, creds) { + await input.client.auth.set({ + path: { id: CURSOR_PROVIDER_ID }, + body: { + type: "oauth", + refresh: creds.refresh, + access: creds.access, + expires: creds.expires, + }, + }); +} +/** + * Get a usable access token from the on-disk auth store, refreshing when + * expired. Used by hooks that run before opencode exposes auth state + * (the `config` hook) and by the standalone proxy token provider. + */ +async function resolveDiskAccessToken(input) { + const stored = await readStoredCursorAuth(); + if (!stored) + return undefined; + if (stored.access && (stored.expires ?? 0) > Date.now()) + return stored.access; + try { + const refreshed = await refreshCursorToken(stored.refresh); + // Best-effort: rotated refresh tokens must be saved, but a persistence + // failure should not block model discovery for this run. + await persistCursorAuth(input, refreshed).catch(() => { }); + return refreshed.access; + } + catch { + return undefined; + } +} +/** + * Model entries in opencode's *config* schema (snake_case cost fields). + * Injected via the `config` hook so opencode >= 1.18 merges them into its + * provider catalog; the v2 catalog no longer picks up models mutated inside + * `auth.loader` (issue #30). + */ +function buildConfigModels(models) { + return Object.fromEntries(models.map((model) => { + const cost = estimateModelCost(model.id); + return [ + model.id, + { + name: model.name, + temperature: true, + reasoning: model.reasoning, + attachment: false, + tool_call: true, + limit: { context: model.contextWindow, output: model.maxTokens }, + cost: { + input: cost.input, + output: cost.output, + cache_read: cost.cache.read, + cache_write: cost.cache.write, + }, + }, + ]; + })); +} +/** + * OpenCode plugin that provides Cursor authentication and model access. + * Register in opencode.json: { "plugin": ["opencode-cursor-oauth"] } + */ +export const CursorAuthPlugin = async (input) => { + return { + /** + * opencode >= 1.18 builds its provider catalog from config + models.dev + * before auth loaders run, and `auth.loader` only receives a deep copy of + * the provider. Injecting the provider stub and discovered models into the + * config here is the only path that reaches the v2 catalog (issue #30). + */ + async config(cfg) { + try { + const providers = (cfg.provider ??= {}); + const cursor = (providers[CURSOR_PROVIDER_ID] ??= {}); + cursor.name ??= "Cursor"; + const accessToken = await resolveDiskAccessToken(input); + if (!accessToken) + return; + const models = await getCursorModels(accessToken); + const configModels = (cursor.models ??= {}); + for (const [id, model] of Object.entries(buildConfigModels(models))) { + // User-defined model entries win over discovered ones. + configModels[id] ??= model; + } + } + catch { + // Never block opencode startup on discovery problems; the auth + // loader still provides baseURL/fetch for any configured models. + } + }, + /** + * v2 catalog hook (opencode >= 1.18). Only invoked when the `cursor` + * provider already exists in opencode's catalog; returns the full + * discovered model set backed by the local proxy. + */ + provider: { + id: CURSOR_PROVIDER_ID, + async models(_provider, ctx) { + const auth = ctx.auth; + if (!auth || auth.type !== "oauth") + return {}; + let accessToken = auth.access; + if (!accessToken || auth.expires < Date.now()) { + const refreshed = await refreshCursorToken(auth.refresh); + await persistCursorAuth(input, refreshed).catch(() => { }); + accessToken = refreshed.access; + } + const models = await getCursorModels(accessToken); + const port = await startProxy(async () => { + const token = await resolveDiskAccessToken(input); + if (!token) + throw new Error("Cursor auth not configured"); + return token; + }, models); + return buildCursorProviderModels(models, port); + }, + }, + auth: { + provider: CURSOR_PROVIDER_ID, + async loader(getAuth, provider) { + const auth = await getAuth(); + if (!auth || auth.type !== "oauth") + return {}; + // Ensure we have a valid access token, refreshing if expired + let accessToken = auth.access; + if (!accessToken || auth.expires < Date.now()) { + const refreshed = await refreshCursorToken(auth.refresh); + await input.client.auth.set({ + path: { id: CURSOR_PROVIDER_ID }, + body: { + type: "oauth", + refresh: refreshed.refresh, + access: refreshed.access, + expires: refreshed.expires, + }, + }); + accessToken = refreshed.access; + } + const models = await getCursorModels(accessToken); + const port = await startProxy(async () => { + const currentAuth = await getAuth(); + if (currentAuth.type !== "oauth") { + throw new Error("Cursor auth not configured"); + } + if (!currentAuth.access || currentAuth.expires < Date.now()) { + const refreshed = await refreshCursorToken(currentAuth.refresh); + await input.client.auth.set({ + path: { id: CURSOR_PROVIDER_ID }, + body: { + type: "oauth", + refresh: refreshed.refresh, + access: refreshed.access, + expires: refreshed.expires, + }, + }); + return refreshed.access; + } + return currentAuth.access; + }, models); + if (provider) { + provider.models = buildCursorProviderModels(models, port); + } + return { + baseURL: `http://localhost:${port}/v1`, + apiKey: "cursor-proxy", + async fetch(requestInput, init) { + if (init?.headers) { + if (init.headers instanceof Headers) { + init.headers.delete("authorization"); + } + else if (Array.isArray(init.headers)) { + init.headers = init.headers.filter(([key]) => key.toLowerCase() !== "authorization"); + } + else { + delete init.headers["authorization"]; + delete init.headers["Authorization"]; + } + } + return fetch(requestInput, init); + }, + }; + }, + methods: [ + { + type: "oauth", + label: "Login with Cursor", + async authorize() { + const { verifier, uuid, loginUrl } = await generateCursorAuthParams(); + return { + url: loginUrl, + instructions: "Complete login in your browser. This window will close automatically.", + method: "auto", + async callback() { + const { accessToken, refreshToken } = await pollCursorAuth(uuid, verifier); + return { + type: "success", + refresh: refreshToken, + access: accessToken, + expires: getTokenExpiry(accessToken), + }; + }, + }; + }, + }, + ], + }, + }; +}; +function buildCursorProviderModels(models, port) { + return Object.fromEntries(models.map((model) => [ + model.id, + { + id: model.id, + providerID: CURSOR_PROVIDER_ID, + api: { + id: model.id, + url: `http://localhost:${port}/v1`, + npm: "@ai-sdk/openai-compatible", + }, + name: model.name, + capabilities: { + temperature: true, + reasoning: model.reasoning, + attachment: false, + toolcall: true, + input: { + text: true, + audio: false, + image: false, + video: false, + pdf: false, + }, + output: { + text: true, + audio: false, + image: false, + video: false, + pdf: false, + }, + interleaved: false, + }, + cost: estimateModelCost(model.id), + limit: { + context: model.contextWindow, + output: model.maxTokens, + }, + status: "active", + options: {}, + headers: {}, + release_date: "", + variants: {}, + }, + ])); +} +// $/M token rates from cursor.com/docs/models-and-pricing +const MODEL_COST_TABLE = { + // Anthropic + "claude-4-sonnet": { input: 3, output: 15, cache: { read: 0.3, write: 3.75 } }, + "claude-4-sonnet-1m": { input: 6, output: 22.5, cache: { read: 0.6, write: 7.5 } }, + "claude-4.5-haiku": { input: 1, output: 5, cache: { read: 0.1, write: 1.25 } }, + "claude-4.5-opus": { input: 5, output: 25, cache: { read: 0.5, write: 6.25 } }, + "claude-4.5-sonnet": { input: 3, output: 15, cache: { read: 0.3, write: 3.75 } }, + "claude-4.6-opus": { input: 5, output: 25, cache: { read: 0.5, write: 6.25 } }, + "claude-4.6-opus-fast": { input: 30, output: 150, cache: { read: 3, write: 37.5 } }, + "claude-4.6-sonnet": { input: 3, output: 15, cache: { read: 0.3, write: 3.75 } }, + // Cursor + "composer-1": { input: 1.25, output: 10, cache: { read: 0.125, write: 0 } }, + "composer-1.5": { input: 3.5, output: 17.5, cache: { read: 0.35, write: 0 } }, + "composer-2": { input: 0.5, output: 2.5, cache: { read: 0.2, write: 0 } }, + "composer-2-fast": { input: 1.5, output: 7.5, cache: { read: 0.2, write: 0 } }, + // Google + "gemini-2.5-flash": { input: 0.3, output: 2.5, cache: { read: 0.03, write: 0 } }, + "gemini-3-flash": { input: 0.5, output: 3, cache: { read: 0.05, write: 0 } }, + "gemini-3-pro": { input: 2, output: 12, cache: { read: 0.2, write: 0 } }, + "gemini-3-pro-image": { input: 2, output: 12, cache: { read: 0.2, write: 0 } }, + "gemini-3.1-pro": { input: 2, output: 12, cache: { read: 0.2, write: 0 } }, + // OpenAI + "gpt-5": { input: 1.25, output: 10, cache: { read: 0.125, write: 0 } }, + "gpt-5-fast": { input: 2.5, output: 20, cache: { read: 0.25, write: 0 } }, + "gpt-5-mini": { input: 0.25, output: 2, cache: { read: 0.025, write: 0 } }, + "gpt-5-codex": { input: 1.25, output: 10, cache: { read: 0.125, write: 0 } }, + "gpt-5.1-codex": { input: 1.25, output: 10, cache: { read: 0.125, write: 0 } }, + "gpt-5.1-codex-max": { input: 1.25, output: 10, cache: { read: 0.125, write: 0 } }, + "gpt-5.1-codex-mini": { input: 0.25, output: 2, cache: { read: 0.025, write: 0 } }, + "gpt-5.2": { input: 1.75, output: 14, cache: { read: 0.175, write: 0 } }, + "gpt-5.2-codex": { input: 1.75, output: 14, cache: { read: 0.175, write: 0 } }, + "gpt-5.3-codex": { input: 1.75, output: 14, cache: { read: 0.175, write: 0 } }, + "gpt-5.4": { input: 2.5, output: 15, cache: { read: 0.25, write: 0 } }, + "gpt-5.4-mini": { input: 0.75, output: 4.5, cache: { read: 0.075, write: 0 } }, + "gpt-5.4-nano": { input: 0.2, output: 1.25, cache: { read: 0.02, write: 0 } }, + // xAI + "grok-4.20": { input: 2, output: 6, cache: { read: 0.2, write: 0 } }, + // Moonshot + "kimi-k2.5": { input: 0.6, output: 3, cache: { read: 0.1, write: 0 } }, +}; +// Most-specific first +const MODEL_COST_PATTERNS = [ + { match: (id) => /claude.*opus.*fast/i.test(id), cost: MODEL_COST_TABLE["claude-4.6-opus-fast"] }, + { match: (id) => /claude.*opus/i.test(id), cost: MODEL_COST_TABLE["claude-4.6-opus"] }, + { match: (id) => /claude.*haiku/i.test(id), cost: MODEL_COST_TABLE["claude-4.5-haiku"] }, + { match: (id) => /claude.*sonnet/i.test(id), cost: MODEL_COST_TABLE["claude-4.6-sonnet"] }, + { match: (id) => /claude/i.test(id), cost: MODEL_COST_TABLE["claude-4.6-sonnet"] }, + { match: (id) => /composer-?2/i.test(id), cost: MODEL_COST_TABLE["composer-2"] }, + { match: (id) => /composer-?1\.5/i.test(id), cost: MODEL_COST_TABLE["composer-1.5"] }, + { match: (id) => /composer/i.test(id), cost: MODEL_COST_TABLE["composer-1"] }, + { match: (id) => /gpt-5\.4.*nano/i.test(id), cost: MODEL_COST_TABLE["gpt-5.4-nano"] }, + { match: (id) => /gpt-5\.4.*mini/i.test(id), cost: MODEL_COST_TABLE["gpt-5.4-mini"] }, + { match: (id) => /gpt-5\.4/i.test(id), cost: MODEL_COST_TABLE["gpt-5.4"] }, + { match: (id) => /gpt-5\.3/i.test(id), cost: MODEL_COST_TABLE["gpt-5.3-codex"] }, + { match: (id) => /gpt-5\.2/i.test(id), cost: MODEL_COST_TABLE["gpt-5.2"] }, + { match: (id) => /gpt-5\.1.*mini/i.test(id), cost: MODEL_COST_TABLE["gpt-5.1-codex-mini"] }, + { match: (id) => /gpt-5\.1/i.test(id), cost: MODEL_COST_TABLE["gpt-5.1-codex"] }, + { match: (id) => /gpt-5.*mini/i.test(id), cost: MODEL_COST_TABLE["gpt-5-mini"] }, + { match: (id) => /gpt-5.*fast/i.test(id), cost: MODEL_COST_TABLE["gpt-5-fast"] }, + { match: (id) => /gpt-5/i.test(id), cost: MODEL_COST_TABLE["gpt-5"] }, + { match: (id) => /gemini.*3\.1/i.test(id), cost: MODEL_COST_TABLE["gemini-3.1-pro"] }, + { match: (id) => /gemini.*3.*flash/i.test(id), cost: MODEL_COST_TABLE["gemini-3-flash"] }, + { match: (id) => /gemini.*3/i.test(id), cost: MODEL_COST_TABLE["gemini-3-pro"] }, + { match: (id) => /gemini.*flash/i.test(id), cost: MODEL_COST_TABLE["gemini-2.5-flash"] }, + { match: (id) => /gemini/i.test(id), cost: MODEL_COST_TABLE["gemini-3.1-pro"] }, + { match: (id) => /grok/i.test(id), cost: MODEL_COST_TABLE["grok-4.20"] }, + { match: (id) => /kimi/i.test(id), cost: MODEL_COST_TABLE["kimi-k2.5"] }, +]; +const DEFAULT_COST = { input: 3, output: 15, cache: { read: 0.3, write: 0 } }; +function estimateModelCost(modelId) { + const normalized = modelId.toLowerCase(); + const exact = MODEL_COST_TABLE[normalized]; + if (exact) + return exact; + const stripped = normalized.replace(/-(high|medium|low|preview|thinking|spark-preview)$/g, ""); + const strippedMatch = MODEL_COST_TABLE[stripped]; + if (strippedMatch) + return strippedMatch; + return MODEL_COST_PATTERNS.find((p) => p.match(normalized))?.cost ?? DEFAULT_COST; +} +/** + * Modern plugin module format: `{ id, server }`. Newer opencode loaders + * (including the Desktop app's sidecar) require this shape; the bare + * function default export was silently ignored there. + */ +export const CursorAuthPluginModule = { + id: "opencode-cursor-oauth", + server: CursorAuthPlugin, +}; +export default CursorAuthPluginModule; diff --git a/dist/models.d.ts b/dist/models.d.ts new file mode 100644 index 0000000..8dd3958 --- /dev/null +++ b/dist/models.d.ts @@ -0,0 +1,10 @@ +export interface CursorModel { + id: string; + name: string; + reasoning: boolean; + contextWindow: number; + maxTokens: number; +} +export declare function getCursorModels(apiKey: string): Promise; +/** @internal Test-only. */ +export declare function clearModelCache(): void; diff --git a/dist/models.js b/dist/models.js new file mode 100644 index 0000000..8ba8fee --- /dev/null +++ b/dist/models.js @@ -0,0 +1,170 @@ +/** + * Cursor model discovery via GetUsableModels. + * Uses the H2 bridge for transport. Falls back to a hardcoded list + * when discovery fails. + */ +import { create, fromBinary, toBinary } from "@bufbuild/protobuf"; +import { z } from "zod"; +import { callCursorUnaryRpc } from "./proxy.js"; +import { GetUsableModelsRequestSchema, GetUsableModelsResponseSchema, } from "./proto/agent_pb.js"; +const GET_USABLE_MODELS_PATH = "/agent.v1.AgentService/GetUsableModels"; +const DEFAULT_CONTEXT_WINDOW = 200_000; +const DEFAULT_MAX_TOKENS = 64_000; +const CursorModelDetailsSchema = z.object({ + modelId: z.string(), + displayName: z.string().optional().catch(undefined), + displayNameShort: z.string().optional().catch(undefined), + displayModelId: z.string().optional().catch(undefined), + aliases: z + .array(z.unknown()) + .optional() + .catch([]) + .transform((aliases) => (aliases ?? []).filter((alias) => typeof alias === "string")), + thinkingDetails: z.unknown().optional(), +}); +const FALLBACK_MODELS = [ + // Composer models + { id: "composer-1", name: "Composer 1", reasoning: true, contextWindow: 200_000, maxTokens: 64_000 }, + { id: "composer-1.5", name: "Composer 1.5", reasoning: true, contextWindow: 200_000, maxTokens: 64_000 }, + // Claude models + { id: "claude-4.6-opus-high", name: "Claude 4.6 Opus", reasoning: true, contextWindow: 200_000, maxTokens: 128_000 }, + { id: "claude-4.6-sonnet-medium", name: "Claude 4.6 Sonnet", reasoning: true, contextWindow: 200_000, maxTokens: 64_000 }, + { id: "claude-4.5-sonnet", name: "Claude 4.5 Sonnet", reasoning: true, contextWindow: 200_000, maxTokens: 64_000 }, + // GPT models + { id: "gpt-5.4-medium", name: "GPT-5.4", reasoning: true, contextWindow: 272_000, maxTokens: 128_000 }, + { id: "gpt-5.2", name: "GPT-5.2", reasoning: true, contextWindow: 400_000, maxTokens: 128_000 }, + { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", reasoning: true, contextWindow: 400_000, maxTokens: 128_000 }, + { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", reasoning: true, contextWindow: 400_000, maxTokens: 128_000 }, + { id: "gpt-5.3-codex-spark-preview", name: "GPT-5.3 Codex Spark", reasoning: true, contextWindow: 128_000, maxTokens: 128_000 }, + // Other models + { id: "gemini-3.1-pro", name: "Gemini 3.1 Pro", reasoning: true, contextWindow: 1_000_000, maxTokens: 64_000 }, + { id: "grok-code-fast-1", name: "Grok Code Fast 1", reasoning: false, contextWindow: 128_000, maxTokens: 64_000 }, +]; +/** + * Pseudo-model for Cursor's server-side Auto routing. Always exposed + * alongside discovered models; the proxy maps it to Run modelId "default". + */ +const AUTO_MODEL = { + id: "auto", + name: "Auto", + reasoning: false, + contextWindow: DEFAULT_CONTEXT_WINDOW, + maxTokens: DEFAULT_MAX_TOKENS, +}; +async function fetchCursorUsableModels(apiKey) { + try { + const requestPayload = create(GetUsableModelsRequestSchema, {}); + const requestBody = toBinary(GetUsableModelsRequestSchema, requestPayload); + const response = await callCursorUnaryRpc({ + accessToken: apiKey, + rpcPath: GET_USABLE_MODELS_PATH, + requestBody, + }); + if (response.timedOut || response.exitCode !== 0 || response.body.length === 0) { + return null; + } + const decoded = decodeGetUsableModelsResponse(response.body); + if (!decoded) + return null; + const models = normalizeCursorModels(decoded.models); + return models.length > 0 ? models : null; + } + catch { + return null; + } +} +let cachedModels = null; +export async function getCursorModels(apiKey) { + if (cachedModels) + return cachedModels; + const discovered = await fetchCursorUsableModels(apiKey); + const models = discovered && discovered.length > 0 ? discovered : FALLBACK_MODELS; + cachedModels = models.some((m) => m.id === AUTO_MODEL.id) ? models : [AUTO_MODEL, ...models]; + return cachedModels; +} +/** @internal Test-only. */ +export function clearModelCache() { + cachedModels = null; +} +function decodeGetUsableModelsResponse(payload) { + try { + return fromBinary(GetUsableModelsResponseSchema, payload); + } + catch { + const framedBody = decodeConnectUnaryBody(payload); + if (!framedBody) + return null; + try { + return fromBinary(GetUsableModelsResponseSchema, framedBody); + } + catch { + return null; + } + } +} +function decodeConnectUnaryBody(payload) { + if (payload.length < 5) + return null; + let offset = 0; + while (offset + 5 <= payload.length) { + const flags = payload[offset]; + const view = new DataView(payload.buffer, payload.byteOffset + offset, payload.byteLength - offset); + const messageLength = view.getUint32(1, false); + const frameEnd = offset + 5 + messageLength; + if (frameEnd > payload.length) + return null; + // Compression flag + if ((flags & 0b0000_0001) !== 0) + return null; + // End-of-stream flag — skip trailer frames + if ((flags & 0b0000_0010) === 0) { + return payload.subarray(offset + 5, frameEnd); + } + offset = frameEnd; + } + return null; +} +function normalizeCursorModels(models) { + if (models.length === 0) + return []; + const byId = new Map(); + for (const model of models) { + const normalized = normalizeSingleModel(model); + if (normalized) + byId.set(normalized.id, normalized); + } + return [...byId.values()].sort((a, b) => a.id.localeCompare(b.id)); +} +function normalizeSingleModel(model) { + const parsed = CursorModelDetailsSchema.safeParse(model); + if (!parsed.success) + return null; + const details = parsed.data; + const id = details.modelId.trim(); + if (!id) + return null; + return { + id, + name: pickDisplayName(details, id), + reasoning: Boolean(details.thinkingDetails), + contextWindow: DEFAULT_CONTEXT_WINDOW, + maxTokens: DEFAULT_MAX_TOKENS, + }; +} +function pickDisplayName(model, fallbackId) { + const candidates = [ + model.displayName, + model.displayNameShort, + model.displayModelId, + ...model.aliases, + fallbackId, + ]; + for (const candidate of candidates) { + if (typeof candidate !== "string") + continue; + const trimmed = candidate.trim(); + if (trimmed) + return trimmed; + } + return fallbackId; +} diff --git a/dist/native-tools.d.ts b/dist/native-tools.d.ts new file mode 100644 index 0000000..9add0df --- /dev/null +++ b/dist/native-tools.d.ts @@ -0,0 +1,31 @@ +import { type ExecServerMessage, type McpToolDefinition } from "./proto/agent_pb.js"; +export type NativeResultType = "readResult" | "writeResult" | "fetchResult" | "shellResult" | "shellStreamResult" | "lsResult" | "grepResult"; +/** How to answer the paused native exec once the redirected tool result arrives. */ +export interface NativeExecBinding { + resultType: NativeResultType; + /** Native arg values needed to shape the typed result frame. */ + args: Record; +} +export interface NativeRedirect { + toolCallId: string; + toolName: string; + decodedArgs: string; + binding: NativeExecBinding; +} +/** + * Map a native exec request onto a client-provided OpenAI tool. + * Returns null when no equivalent tool is available (caller rejects as before). + */ +export declare function redirectNativeExec(execMsg: ExecServerMessage, mcpTools: McpToolDefinition[]): NativeRedirect | null; +interface PendingNativeExec { + execId: string; + execMsgId: number; +} +/** + * Convert the redirected tool's text result into the typed native result the + * paused exec expects. Returns false when no faithful conversion exists + * (caller falls back to an mcpResult). + * `sendMessage` receives an unframed AgentClientMessage binary. + */ +export declare function sendNativeExecResult(exec: PendingNativeExec, binding: NativeExecBinding, text: string, sendMessage: (bytes: Uint8Array) => void): boolean; +export {}; diff --git a/dist/native-tools.js b/dist/native-tools.js new file mode 100644 index 0000000..4a79ec9 --- /dev/null +++ b/dist/native-tools.js @@ -0,0 +1,537 @@ +/** + * Native tool redirection. + * + * Cursor models aggressively call their built-in tools (read, shell, grep, + * ls, write, fetch) before falling back to MCP tools. Rejecting those calls + * burns model round-trips and confuses the model ("Tool not available in + * this environment", issues #21/#29). When the client provides an equivalent + * OpenAI tool, redirect the native call to it and convert the tool result + * back into Cursor's typed native result frame. + */ +import { create, toBinary } from "@bufbuild/protobuf"; +import { AgentClientMessageSchema, ExecClientMessageSchema, FetchResultSchema, FetchSuccessSchema, GrepContentMatchSchema, GrepContentResultSchema, GrepCountResultSchema, GrepFileCountSchema, GrepFileMatchSchema, GrepFilesResultSchema, GrepResultSchema, GrepSuccessSchema, GrepUnionResultSchema, LsDirectoryTreeNodeSchema, LsDirectoryTreeNode_FileSchema, LsResultSchema, LsSuccessSchema, ReadResultSchema, ReadSuccessSchema, ShellResultSchema, ShellStreamExitSchema, ShellStreamSchema, ShellStreamStartSchema, ShellStreamStdoutSchema, ShellSuccessSchema, WriteResultSchema, WriteSuccessSchema, ExecClientControlMessageSchema, ExecClientStreamCloseSchema, } from "./proto/agent_pb.js"; +/** + * Map a native exec request onto a client-provided OpenAI tool. + * Returns null when no equivalent tool is available (caller rejects as before). + */ +export function redirectNativeExec(execMsg, mcpTools) { + const execCase = execMsg.message.case; + const available = new Set(mcpTools.map((tool) => tool.name || tool.toolName).filter(Boolean)); + const pick = (candidates) => candidates.find((name) => available.has(name)); + if (execCase === "readArgs") { + const args = execMsg.message.value; + const toolName = pick(["read"]); + if (!toolName) + return null; + return { + toolCallId: args.toolCallId || crypto.randomUUID(), + toolName, + decodedArgs: JSON.stringify({ filePath: args.path ?? "" }), + binding: { resultType: "readResult", args: { path: args.path ?? "" } }, + }; + } + if (execCase === "writeArgs") { + const args = execMsg.message.value; + const toolName = pick(["write"]); + if (!toolName) + return null; + const content = args.fileBytes && args.fileBytes.length > 0 + ? new TextDecoder().decode(args.fileBytes) + : (args.fileText ?? ""); + return { + toolCallId: args.toolCallId || crypto.randomUUID(), + toolName, + decodedArgs: JSON.stringify({ filePath: args.path ?? "", content }), + binding: { + resultType: "writeResult", + args: { + path: args.path ?? "", + fileSize: String(new TextEncoder().encode(content).byteLength), + linesCreated: String(content.split("\n").length), + }, + }, + }; + } + if (execCase === "fetchArgs") { + const args = execMsg.message.value; + const toolName = pick(["webfetch", "fetch", "web_fetch"]); + if (!toolName) + return null; + return { + toolCallId: args.toolCallId || crypto.randomUUID(), + toolName, + decodedArgs: JSON.stringify({ url: args.url ?? "", format: "markdown" }), + binding: { resultType: "fetchResult", args: { url: args.url ?? "" } }, + }; + } + if (execCase === "shellArgs" || execCase === "shellStreamArgs") { + const args = execMsg.message.value; + const toolName = pick(["bash"]); + if (!toolName) + return null; + const decodedArgs = { + command: args.command ?? "", + description: "Runs shell command", + }; + if (args.workingDirectory) + decodedArgs.workdir = args.workingDirectory; + if (args.timeout > 0) + decodedArgs.timeout = args.timeout; + return { + toolCallId: args.toolCallId || crypto.randomUUID(), + toolName, + decodedArgs: JSON.stringify(decodedArgs), + binding: { + resultType: execCase === "shellStreamArgs" ? "shellStreamResult" : "shellResult", + args: { + command: args.command ?? "", + workingDirectory: args.workingDirectory ?? "", + }, + }, + }; + } + if (execCase === "lsArgs") { + const args = execMsg.message.value; + const toolName = pick(["glob"]); + if (!toolName) + return null; + return { + toolCallId: args.toolCallId || crypto.randomUUID(), + toolName, + decodedArgs: JSON.stringify({ pattern: "*", path: args.path ?? "" }), + binding: { resultType: "lsResult", args: { path: args.path ?? "" } }, + }; + } + if (execCase === "grepArgs") { + const args = execMsg.message.value; + if (!args.pattern && args.glob) { + const globTool = pick(["glob"]); + if (!globTool) + return null; + return { + toolCallId: args.toolCallId || crypto.randomUUID(), + toolName: globTool, + decodedArgs: JSON.stringify({ + pattern: args.glob, + path: args.path ?? "", + }), + binding: { + resultType: "grepResult", + args: { + pattern: args.glob, + path: args.path ?? "", + outputMode: "files_with_matches", + }, + }, + }; + } + const toolName = pick(["grep"]); + if (!toolName) + return null; + const decodedArgs = { pattern: args.pattern || "." }; + if (args.path) + decodedArgs.path = args.path; + if (args.glob) + decodedArgs.include = args.glob; + return { + toolCallId: args.toolCallId || crypto.randomUUID(), + toolName, + decodedArgs: JSON.stringify(decodedArgs), + binding: { + resultType: "grepResult", + args: { + pattern: args.pattern || ".", + path: args.path ?? "", + outputMode: args.outputMode || "content", + ...(args.multiline ? { multiline: "true" } : undefined), + ...(args.headLimit != null ? { headLimit: String(args.headLimit) } : undefined), + }, + }, + }; + } + return null; +} +/** + * Convert the redirected tool's text result into the typed native result the + * paused exec expects. Returns false when no faithful conversion exists + * (caller falls back to an mcpResult). + * `sendMessage` receives an unframed AgentClientMessage binary. + */ +export function sendNativeExecResult(exec, binding, text, sendMessage) { + const args = binding.args; + const sendExec = (messageCase, value) => { + const execClientMessage = create(ExecClientMessageSchema, { + id: exec.execMsgId, + execId: exec.execId, + message: { + case: messageCase, + value: value, + }, + }); + const clientMessage = create(AgentClientMessageSchema, { + message: { case: "execClientMessage", value: execClientMessage }, + }); + sendMessage(toBinary(AgentClientMessageSchema, clientMessage)); + }; + switch (binding.resultType) { + case "readResult": { + sendExec("readResult", create(ReadResultSchema, { + result: { + case: "success", + value: create(ReadSuccessSchema, { + path: args.path ?? "", + totalLines: text.split("\n").length, + fileSize: BigInt(new TextEncoder().encode(text).byteLength), + truncated: false, + output: { case: "content", value: text }, + }), + }, + })); + return true; + } + case "writeResult": { + sendExec("writeResult", create(WriteResultSchema, { + result: { + case: "success", + value: create(WriteSuccessSchema, { + path: args.path ?? "", + fileSize: Number(args.fileSize ?? 0), + linesCreated: Number(args.linesCreated ?? 0), + }), + }, + })); + return true; + } + case "fetchResult": { + sendExec("fetchResult", create(FetchResultSchema, { + result: { + case: "success", + value: create(FetchSuccessSchema, { + url: args.url ?? "", + content: text, + statusCode: 200, + }), + }, + })); + return true; + } + case "shellResult": { + sendExec("shellResult", create(ShellResultSchema, { + result: { + case: "success", + value: create(ShellSuccessSchema, { + command: args.command ?? "", + workingDirectory: args.workingDirectory ?? "", + exitCode: 0, + signal: "", + stdout: text, + stderr: "", + }), + }, + })); + return true; + } + case "shellStreamResult": { + sendExec("shellStream", create(ShellStreamSchema, { + event: { case: "start", value: create(ShellStreamStartSchema, {}) }, + })); + if (text) { + sendExec("shellStream", create(ShellStreamSchema, { + event: { + case: "stdout", + value: create(ShellStreamStdoutSchema, { data: text }), + }, + })); + } + sendExec("shellStream", create(ShellStreamSchema, { + event: { case: "exit", value: create(ShellStreamExitSchema, { code: 0 }) }, + })); + const controlMessage = create(ExecClientControlMessageSchema, { + message: { + case: "streamClose", + value: create(ExecClientStreamCloseSchema, { id: exec.execMsgId }), + }, + }); + const clientMessage = create(AgentClientMessageSchema, { + message: { case: "execClientControlMessage", value: controlMessage }, + }); + sendMessage(toBinary(AgentClientMessageSchema, clientMessage)); + return true; + } + case "lsResult": { + const built = buildLsResult(text, args.path ?? ""); + if (!built) + return false; + sendExec("lsResult", built); + return true; + } + case "grepResult": { + const built = buildGrepResult(text, args); + if (!built) + return false; + sendExec("grepResult", built); + return true; + } + } +} +/** Reconstruct Cursor's directory tree from glob output (one path per line). */ +function buildLsResult(content, rootPath) { + const normalizedRoot = rootPath || "."; + const rawLines = content + .split("\n") + .map((line) => line.trim()) + .filter(Boolean); + const root = create(LsDirectoryTreeNodeSchema, { + absPath: normalizedRoot, + childrenDirs: [], + childrenFiles: [], + childrenWereProcessed: true, + fullSubtreeExtensionCounts: {}, + numFiles: 0, + }); + const dirMap = new Map([[normalizedRoot, root]]); + for (const rawLine of rawLines) { + const normalized = normalizeListedPath(rawLine, normalizedRoot); + if (!normalized || normalized === normalizedRoot) + continue; + const relative = normalizedRoot !== "." && normalized.startsWith(`${normalizedRoot}/`) + ? normalized.slice(normalizedRoot.length + 1) + : normalized; + const parts = relative.split("/").filter(Boolean); + if (parts.length === 0) + continue; + let currentPath = normalizedRoot; + let currentNode = dirMap.get(normalizedRoot); + for (const segment of parts.slice(0, -1)) { + const nextPath = joinPath(currentPath, segment); + let nextNode = dirMap.get(nextPath); + if (!nextNode) { + nextNode = create(LsDirectoryTreeNodeSchema, { + absPath: nextPath, + childrenDirs: [], + childrenFiles: [], + childrenWereProcessed: true, + fullSubtreeExtensionCounts: {}, + numFiles: 0, + }); + currentNode.childrenDirs.push(nextNode); + dirMap.set(nextPath, nextNode); + } + currentPath = nextPath; + currentNode = nextNode; + } + const leaf = parts.at(-1); + currentNode.childrenFiles.push(create(LsDirectoryTreeNode_FileSchema, { name: leaf })); + } + computeLsStats(root); + return create(LsResultSchema, { + result: { + case: "success", + value: create(LsSuccessSchema, { directoryTreeRoot: root }), + }, + }); +} +function normalizeListedPath(path, rootPath) { + const cleaned = path.replace(/\/$/, ""); + if (!cleaned) + return ""; + if (cleaned === ".") + return rootPath || "."; + if (cleaned.startsWith("/")) + return cleaned; + if (rootPath && rootPath !== ".") + return joinPath(rootPath, cleaned); + return cleaned; +} +function joinPath(base, segment) { + if (!base || base === ".") + return segment; + return `${base}/${segment}`; +} +function computeLsStats(node) { + const extensionCounts = {}; + let numFiles = node.childrenFiles.length; + for (const file of node.childrenFiles) { + const dot = file.name.lastIndexOf("."); + if (dot > 0 && dot < file.name.length - 1) { + const ext = file.name.slice(dot + 1); + extensionCounts[ext] = (extensionCounts[ext] ?? 0) + 1; + } + } + for (const child of node.childrenDirs) { + computeLsStats(child); + numFiles += child.numFiles; + for (const [ext, count] of Object.entries(child.fullSubtreeExtensionCounts)) { + extensionCounts[ext] = (extensionCounts[ext] ?? 0) + count; + } + } + node.numFiles = numFiles; + node.fullSubtreeExtensionCounts = extensionCounts; +} +/** Parse the client grep tool's text output back into Cursor's structured result. */ +function buildGrepResult(content, args) { + const pattern = args.pattern ?? ""; + const path = args.path ?? ""; + const outputMode = args.outputMode || "content"; + if (args.multiline === "true") + return null; + if (!["content", "files_with_matches", "count"].includes(outputMode)) { + return null; + } + const unionResult = outputMode === "count" + ? buildGrepCountResult(content, Boolean(args.headLimit)) + : outputMode === "files_with_matches" + ? buildGrepFilesResult(content, Boolean(args.headLimit)) + : buildGrepContentResult(content, Boolean(args.headLimit)); + // Non-empty tool output that we failed to parse: better to hand the raw + // text back as an mcpResult than to claim "no matches". + if (content.trim() && isEmptyGrepUnion(unionResult)) + return null; + return create(GrepResultSchema, { + result: { + case: "success", + value: create(GrepSuccessSchema, { + pattern, + path, + outputMode, + workspaceResults: { + [path || "."]: create(GrepUnionResultSchema, { result: unionResult }), + }, + }), + }, + }); +} +function buildGrepCountResult(content, clientTruncated) { + const counts = []; + let totalMatches = 0; + for (const rawLine of content.split("\n")) { + const line = rawLine.replace(/\r$/, ""); + if (!line) + continue; + const separator = line.lastIndexOf(":"); + if (separator === -1) + continue; + const tail = line.slice(separator + 1); + if (!/^\d+$/.test(tail)) + continue; + const file = line.slice(0, separator); + const count = Number.parseInt(tail, 10); + counts.push(create(GrepFileCountSchema, { file, count })); + totalMatches += count; + } + return { + case: "count", + value: create(GrepCountResultSchema, { + counts, + totalFiles: counts.length, + totalMatches, + clientTruncated, + ripgrepTruncated: false, + }), + }; +} +function buildGrepFilesResult(content, clientTruncated) { + const files = content + .split("\n") + .map((line) => line.replace(/\r$/, "").trim()) + .filter(Boolean); + return { + case: "files", + value: create(GrepFilesResultSchema, { + files, + totalFiles: files.length, + clientTruncated, + ripgrepTruncated: false, + }), + }; +} +function buildGrepContentResult(content, clientTruncated) { + const fileMatches = []; + let currentFile = ""; + let currentMatches = []; + let totalLines = 0; + let totalMatchedLines = 0; + const flushFile = () => { + if (currentFile && currentMatches.length > 0) { + fileMatches.push(create(GrepFileMatchSchema, { file: currentFile, matches: currentMatches })); + } + currentMatches = []; + }; + for (const rawLine of content.split("\n")) { + const line = rawLine.replace(/\r$/, ""); + if (line === "--" || line === "") + continue; + const matchLine = line.match(/^(.+?):(\d+):(.*)/); + if (matchLine) { + const file = matchLine[1]; + if (file !== currentFile) { + flushFile(); + currentFile = file; + } + totalLines += 1; + totalMatchedLines += 1; + currentMatches.push(create(GrepContentMatchSchema, { + lineNumber: Number.parseInt(matchLine[2], 10), + content: matchLine[3], + contentTruncated: false, + isContextLine: false, + })); + continue; + } + const contextLine = parseGrepContextLine(line, currentFile); + if (!contextLine) + continue; + if (contextLine.file !== currentFile) { + flushFile(); + currentFile = contextLine.file; + } + totalLines += 1; + currentMatches.push(create(GrepContentMatchSchema, { + lineNumber: contextLine.lineNumber, + content: contextLine.content, + contentTruncated: false, + isContextLine: true, + })); + } + flushFile(); + return { + case: "content", + value: create(GrepContentResultSchema, { + matches: fileMatches, + totalLines, + totalMatchedLines, + clientTruncated, + ripgrepTruncated: false, + }), + }; +} +function parseGrepContextLine(line, currentFile) { + if (currentFile) { + const prefix = `${currentFile}-`; + if (line.startsWith(prefix)) { + const match = line.slice(prefix.length).match(/^(\d+)-(.*)$/s); + if (match) { + return { + file: currentFile, + lineNumber: Number.parseInt(match[1], 10), + content: match[2], + }; + } + } + } + const fallback = line.match(/^(.+?)-(\d+)-(.*)$/); + if (!fallback) + return null; + return { + file: fallback[1], + lineNumber: Number.parseInt(fallback[2], 10), + content: fallback[3], + }; +} +function isEmptyGrepUnion(result) { + if (result.case === "count") + return result.value.counts.length === 0; + if (result.case === "files") + return result.value.files.length === 0; + return result.value.matches.length === 0; +} diff --git a/dist/pkce.d.ts b/dist/pkce.d.ts new file mode 100644 index 0000000..0d656da --- /dev/null +++ b/dist/pkce.d.ts @@ -0,0 +1,4 @@ +export declare function generatePKCE(): Promise<{ + verifier: string; + challenge: string; +}>; diff --git a/dist/pkce.js b/dist/pkce.js new file mode 100644 index 0000000..9576640 --- /dev/null +++ b/dist/pkce.js @@ -0,0 +1,9 @@ +export async function generatePKCE() { + const verifierBytes = new Uint8Array(96); + crypto.getRandomValues(verifierBytes); + const verifier = Buffer.from(verifierBytes).toString("base64url"); + const data = new TextEncoder().encode(verifier); + const hashBuffer = await crypto.subtle.digest("SHA-256", data); + const challenge = Buffer.from(hashBuffer).toString("base64url"); + return { verifier, challenge }; +} diff --git a/dist/proto/agent_pb.d.ts b/dist/proto/agent_pb.d.ts new file mode 100644 index 0000000..f241c30 --- /dev/null +++ b/dist/proto/agent_pb.d.ts @@ -0,0 +1,13022 @@ +import type { Message } from "@bufbuild/protobuf"; +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; +/** + * Describes the file agent.proto. + */ +export declare const file_agent: GenFile; +/** + * @generated from message agent.v1.GlobToolResult + */ +export type GlobToolResult = Message<"agent.v1.GlobToolResult"> & { + /** + * @generated from oneof agent.v1.GlobToolResult.result + */ + result: { + /** + * @generated from field: agent.v1.GlobToolSuccess success = 1; + */ + value: GlobToolSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.GlobToolError error = 2; + */ + value: GlobToolError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.GlobToolResult. + * Use `create(GlobToolResultSchema)` to create a new message. + */ +export declare const GlobToolResultSchema: GenMessage; +/** + * @generated from message agent.v1.GlobToolError + */ +export type GlobToolError = Message<"agent.v1.GlobToolError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.GlobToolError. + * Use `create(GlobToolErrorSchema)` to create a new message. + */ +export declare const GlobToolErrorSchema: GenMessage; +/** + * Only file results are needed for this tool + * + * @generated from message agent.v1.GlobToolSuccess + */ +export type GlobToolSuccess = Message<"agent.v1.GlobToolSuccess"> & { + /** + * @generated from field: string pattern = 1; + */ + pattern: string; + /** + * @generated from field: string path = 2; + */ + path: string; + /** + * @generated from field: repeated string files = 3; + */ + files: string[]; + /** + * @generated from field: int32 total_files = 4; + */ + totalFiles: number; + /** + * @generated from field: bool client_truncated = 5; + */ + clientTruncated: boolean; + /** + * @generated from field: bool ripgrep_truncated = 6; + */ + ripgrepTruncated: boolean; +}; +/** + * Describes the message agent.v1.GlobToolSuccess. + * Use `create(GlobToolSuccessSchema)` to create a new message. + */ +export declare const GlobToolSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.GlobToolCall + */ +export type GlobToolCall = Message<"agent.v1.GlobToolCall"> & { + /** + * @generated from field: bytes args = 1; + */ + args: Uint8Array; + /** + * @generated from field: agent.v1.GlobToolResult result = 2; + */ + result?: GlobToolResult; +}; +/** + * Describes the message agent.v1.GlobToolCall. + * Use `create(GlobToolCallSchema)` to create a new message. + */ +export declare const GlobToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.ReadLintsToolCall + */ +export type ReadLintsToolCall = Message<"agent.v1.ReadLintsToolCall"> & { + /** + * @generated from field: agent.v1.ReadLintsToolArgs args = 1; + */ + args?: ReadLintsToolArgs; + /** + * @generated from field: agent.v1.ReadLintsToolResult result = 2; + */ + result?: ReadLintsToolResult; +}; +/** + * Describes the message agent.v1.ReadLintsToolCall. + * Use `create(ReadLintsToolCallSchema)` to create a new message. + */ +export declare const ReadLintsToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.ReadLintsToolArgs + */ +export type ReadLintsToolArgs = Message<"agent.v1.ReadLintsToolArgs"> & { + /** + * @generated from field: repeated string paths = 1; + */ + paths: string[]; +}; +/** + * Describes the message agent.v1.ReadLintsToolArgs. + * Use `create(ReadLintsToolArgsSchema)` to create a new message. + */ +export declare const ReadLintsToolArgsSchema: GenMessage; +/** + * @generated from message agent.v1.ReadLintsToolResult + */ +export type ReadLintsToolResult = Message<"agent.v1.ReadLintsToolResult"> & { + /** + * @generated from oneof agent.v1.ReadLintsToolResult.result + */ + result: { + /** + * @generated from field: agent.v1.ReadLintsToolSuccess success = 1; + */ + value: ReadLintsToolSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.ReadLintsToolError error = 2; + */ + value: ReadLintsToolError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ReadLintsToolResult. + * Use `create(ReadLintsToolResultSchema)` to create a new message. + */ +export declare const ReadLintsToolResultSchema: GenMessage; +/** + * @generated from message agent.v1.ReadLintsToolSuccess + */ +export type ReadLintsToolSuccess = Message<"agent.v1.ReadLintsToolSuccess"> & { + /** + * @generated from field: repeated agent.v1.FileDiagnostics file_diagnostics = 1; + */ + fileDiagnostics: FileDiagnostics[]; + /** + * @generated from field: int32 total_files = 2; + */ + totalFiles: number; + /** + * @generated from field: int32 total_diagnostics = 3; + */ + totalDiagnostics: number; +}; +/** + * Describes the message agent.v1.ReadLintsToolSuccess. + * Use `create(ReadLintsToolSuccessSchema)` to create a new message. + */ +export declare const ReadLintsToolSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.FileDiagnostics + */ +export type FileDiagnostics = Message<"agent.v1.FileDiagnostics"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: repeated agent.v1.DiagnosticItem diagnostics = 2; + */ + diagnostics: DiagnosticItem[]; + /** + * @generated from field: int32 diagnostics_count = 3; + */ + diagnosticsCount: number; +}; +/** + * Describes the message agent.v1.FileDiagnostics. + * Use `create(FileDiagnosticsSchema)` to create a new message. + */ +export declare const FileDiagnosticsSchema: GenMessage; +/** + * @generated from message agent.v1.DiagnosticItem + */ +export type DiagnosticItem = Message<"agent.v1.DiagnosticItem"> & { + /** + * @generated from field: agent.v1.DiagnosticSeverity severity = 1; + */ + severity: DiagnosticSeverity; + /** + * @generated from field: agent.v1.DiagnosticRange range = 2; + */ + range?: DiagnosticRange; + /** + * @generated from field: string message = 3; + */ + message: string; + /** + * @generated from field: string source = 4; + */ + source: string; + /** + * @generated from field: string code = 5; + */ + code: string; + /** + * @generated from field: bool is_stale = 6; + */ + isStale: boolean; +}; +/** + * Describes the message agent.v1.DiagnosticItem. + * Use `create(DiagnosticItemSchema)` to create a new message. + */ +export declare const DiagnosticItemSchema: GenMessage; +/** + * @generated from message agent.v1.DiagnosticRange + */ +export type DiagnosticRange = Message<"agent.v1.DiagnosticRange"> & { + /** + * @generated from field: agent.v1.Position start = 1; + */ + start?: Position; + /** + * @generated from field: agent.v1.Position end = 2; + */ + end?: Position; +}; +/** + * Describes the message agent.v1.DiagnosticRange. + * Use `create(DiagnosticRangeSchema)` to create a new message. + */ +export declare const DiagnosticRangeSchema: GenMessage; +/** + * @generated from message agent.v1.ReadLintsToolError + */ +export type ReadLintsToolError = Message<"agent.v1.ReadLintsToolError"> & { + /** + * @generated from field: string error_message = 1; + */ + errorMessage: string; +}; +/** + * Describes the message agent.v1.ReadLintsToolError. + * Use `create(ReadLintsToolErrorSchema)` to create a new message. + */ +export declare const ReadLintsToolErrorSchema: GenMessage; +/** + * @generated from message agent.v1.McpToolError + */ +export type McpToolError = Message<"agent.v1.McpToolError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.McpToolError. + * Use `create(McpToolErrorSchema)` to create a new message. + */ +export declare const McpToolErrorSchema: GenMessage; +/** + * Result for MCP tool calls (separate from exec results) + * + * @generated from message agent.v1.McpToolResult + */ +export type McpToolResult = Message<"agent.v1.McpToolResult"> & { + /** + * @generated from oneof agent.v1.McpToolResult.result + */ + result: { + /** + * @generated from field: agent.v1.McpSuccess success = 1; + */ + value: McpSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.McpToolError error = 2; + */ + value: McpToolError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.McpRejected rejected = 3; + */ + value: McpRejected; + case: "rejected"; + } | { + /** + * @generated from field: agent.v1.McpPermissionDenied permission_denied = 4; + */ + value: McpPermissionDenied; + case: "permissionDenied"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.McpToolResult. + * Use `create(McpToolResultSchema)` to create a new message. + */ +export declare const McpToolResultSchema: GenMessage; +/** + * @generated from message agent.v1.McpToolCall + */ +export type McpToolCall = Message<"agent.v1.McpToolCall"> & { + /** + * @generated from field: agent.v1.McpArgs args = 1; + */ + args?: McpArgs; + /** + * @generated from field: agent.v1.McpToolResult result = 2; + */ + result?: McpToolResult; +}; +/** + * Describes the message agent.v1.McpToolCall. + * Use `create(McpToolCallSchema)` to create a new message. + */ +export declare const McpToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.SemSearchToolCall + */ +export type SemSearchToolCall = Message<"agent.v1.SemSearchToolCall"> & { + /** + * @generated from field: agent.v1.SemSearchToolArgs args = 1; + */ + args?: SemSearchToolArgs; + /** + * @generated from field: agent.v1.SemSearchToolResult result = 2; + */ + result?: SemSearchToolResult; +}; +/** + * Describes the message agent.v1.SemSearchToolCall. + * Use `create(SemSearchToolCallSchema)` to create a new message. + */ +export declare const SemSearchToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.SemSearchToolArgs + */ +export type SemSearchToolArgs = Message<"agent.v1.SemSearchToolArgs"> & { + /** + * @generated from field: string query = 1; + */ + query: string; + /** + * @generated from field: repeated string target_directories = 2; + */ + targetDirectories: string[]; + /** + * @generated from field: string explanation = 3; + */ + explanation: string; +}; +/** + * Describes the message agent.v1.SemSearchToolArgs. + * Use `create(SemSearchToolArgsSchema)` to create a new message. + */ +export declare const SemSearchToolArgsSchema: GenMessage; +/** + * @generated from message agent.v1.SemSearchToolResult + */ +export type SemSearchToolResult = Message<"agent.v1.SemSearchToolResult"> & { + /** + * @generated from oneof agent.v1.SemSearchToolResult.result + */ + result: { + /** + * @generated from field: agent.v1.SemSearchToolSuccess success = 1; + */ + value: SemSearchToolSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.SemSearchToolError error = 2; + */ + value: SemSearchToolError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.SemSearchToolResult. + * Use `create(SemSearchToolResultSchema)` to create a new message. + */ +export declare const SemSearchToolResultSchema: GenMessage; +/** + * @generated from message agent.v1.SemSearchToolSuccess + */ +export type SemSearchToolSuccess = Message<"agent.v1.SemSearchToolSuccess"> & { + /** + * @generated from field: string results = 1; + */ + results: string; + /** + * @generated from field: repeated bytes code_results = 2; + */ + codeResults: Uint8Array[]; +}; +/** + * Describes the message agent.v1.SemSearchToolSuccess. + * Use `create(SemSearchToolSuccessSchema)` to create a new message. + */ +export declare const SemSearchToolSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.SemSearchToolError + */ +export type SemSearchToolError = Message<"agent.v1.SemSearchToolError"> & { + /** + * @generated from field: string error_message = 1; + */ + errorMessage: string; +}; +/** + * Describes the message agent.v1.SemSearchToolError. + * Use `create(SemSearchToolErrorSchema)` to create a new message. + */ +export declare const SemSearchToolErrorSchema: GenMessage; +/** + * @generated from message agent.v1.ListMcpResourcesToolCall + */ +export type ListMcpResourcesToolCall = Message<"agent.v1.ListMcpResourcesToolCall"> & { + /** + * @generated from field: agent.v1.ListMcpResourcesExecArgs args = 1; + */ + args?: ListMcpResourcesExecArgs; + /** + * @generated from field: agent.v1.ListMcpResourcesExecResult result = 2; + */ + result?: ListMcpResourcesExecResult; +}; +/** + * Describes the message agent.v1.ListMcpResourcesToolCall. + * Use `create(ListMcpResourcesToolCallSchema)` to create a new message. + */ +export declare const ListMcpResourcesToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.ReadMcpResourceToolCall + */ +export type ReadMcpResourceToolCall = Message<"agent.v1.ReadMcpResourceToolCall"> & { + /** + * @generated from field: agent.v1.ReadMcpResourceExecArgs args = 1; + */ + args?: ReadMcpResourceExecArgs; + /** + * @generated from field: agent.v1.ReadMcpResourceExecResult result = 2; + */ + result?: ReadMcpResourceExecResult; +}; +/** + * Describes the message agent.v1.ReadMcpResourceToolCall. + * Use `create(ReadMcpResourceToolCallSchema)` to create a new message. + */ +export declare const ReadMcpResourceToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.FetchToolCall + */ +export type FetchToolCall = Message<"agent.v1.FetchToolCall"> & { + /** + * @generated from field: agent.v1.FetchArgs args = 1; + */ + args?: FetchArgs; + /** + * @generated from field: agent.v1.FetchResult result = 2; + */ + result?: FetchResult; +}; +/** + * Describes the message agent.v1.FetchToolCall. + * Use `create(FetchToolCallSchema)` to create a new message. + */ +export declare const FetchToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.RecordScreenToolCall + */ +export type RecordScreenToolCall = Message<"agent.v1.RecordScreenToolCall"> & { + /** + * @generated from field: agent.v1.RecordScreenArgs args = 1; + */ + args?: RecordScreenArgs; + /** + * @generated from field: agent.v1.RecordScreenResult result = 2; + */ + result?: RecordScreenResult; +}; +/** + * Describes the message agent.v1.RecordScreenToolCall. + * Use `create(RecordScreenToolCallSchema)` to create a new message. + */ +export declare const RecordScreenToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.WriteShellStdinToolCall + */ +export type WriteShellStdinToolCall = Message<"agent.v1.WriteShellStdinToolCall"> & { + /** + * @generated from field: agent.v1.WriteShellStdinArgs args = 1; + */ + args?: WriteShellStdinArgs; + /** + * @generated from field: agent.v1.WriteShellStdinResult result = 2; + */ + result?: WriteShellStdinResult; +}; +/** + * Describes the message agent.v1.WriteShellStdinToolCall. + * Use `create(WriteShellStdinToolCallSchema)` to create a new message. + */ +export declare const WriteShellStdinToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.ReflectArgs + */ +export type ReflectArgs = Message<"agent.v1.ReflectArgs"> & { + /** + * @generated from field: string unexpected_action_outcomes = 1; + */ + unexpectedActionOutcomes: string; + /** + * @generated from field: string relevant_instructions = 2; + */ + relevantInstructions: string; + /** + * @generated from field: string scenario_analysis = 3; + */ + scenarioAnalysis: string; + /** + * @generated from field: string critical_synthesis = 4; + */ + criticalSynthesis: string; + /** + * @generated from field: string next_steps = 5; + */ + nextSteps: string; + /** + * @generated from field: string tool_call_id = 6; + */ + toolCallId: string; +}; +/** + * Describes the message agent.v1.ReflectArgs. + * Use `create(ReflectArgsSchema)` to create a new message. + */ +export declare const ReflectArgsSchema: GenMessage; +/** + * @generated from message agent.v1.ReflectResult + */ +export type ReflectResult = Message<"agent.v1.ReflectResult"> & { + /** + * @generated from oneof agent.v1.ReflectResult.result + */ + result: { + /** + * @generated from field: agent.v1.ReflectSuccess success = 1; + */ + value: ReflectSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.ReflectError error = 2; + */ + value: ReflectError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ReflectResult. + * Use `create(ReflectResultSchema)` to create a new message. + */ +export declare const ReflectResultSchema: GenMessage; +/** + * @generated from message agent.v1.ReflectSuccess + */ +export type ReflectSuccess = Message<"agent.v1.ReflectSuccess"> & {}; +/** + * Describes the message agent.v1.ReflectSuccess. + * Use `create(ReflectSuccessSchema)` to create a new message. + */ +export declare const ReflectSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.ReflectError + */ +export type ReflectError = Message<"agent.v1.ReflectError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.ReflectError. + * Use `create(ReflectErrorSchema)` to create a new message. + */ +export declare const ReflectErrorSchema: GenMessage; +/** + * @generated from message agent.v1.ReflectToolCall + */ +export type ReflectToolCall = Message<"agent.v1.ReflectToolCall"> & { + /** + * @generated from field: agent.v1.ReflectArgs args = 1; + */ + args?: ReflectArgs; + /** + * @generated from field: agent.v1.ReflectResult result = 2; + */ + result?: ReflectResult; +}; +/** + * Describes the message agent.v1.ReflectToolCall. + * Use `create(ReflectToolCallSchema)` to create a new message. + */ +export declare const ReflectToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.StartGrindExecutionArgs + */ +export type StartGrindExecutionArgs = Message<"agent.v1.StartGrindExecutionArgs"> & { + /** + * Optional explanation for why the agent is requesting to begin executing. + * + * @generated from field: optional string explanation = 1; + */ + explanation?: string; + /** + * @generated from field: string tool_call_id = 2; + */ + toolCallId: string; +}; +/** + * Describes the message agent.v1.StartGrindExecutionArgs. + * Use `create(StartGrindExecutionArgsSchema)` to create a new message. + */ +export declare const StartGrindExecutionArgsSchema: GenMessage; +/** + * @generated from message agent.v1.StartGrindExecutionResult + */ +export type StartGrindExecutionResult = Message<"agent.v1.StartGrindExecutionResult"> & { + /** + * @generated from oneof agent.v1.StartGrindExecutionResult.result + */ + result: { + /** + * @generated from field: agent.v1.StartGrindExecutionSuccess success = 1; + */ + value: StartGrindExecutionSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.StartGrindExecutionError error = 2; + */ + value: StartGrindExecutionError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.StartGrindExecutionResult. + * Use `create(StartGrindExecutionResultSchema)` to create a new message. + */ +export declare const StartGrindExecutionResultSchema: GenMessage; +/** + * @generated from message agent.v1.StartGrindExecutionSuccess + */ +export type StartGrindExecutionSuccess = Message<"agent.v1.StartGrindExecutionSuccess"> & {}; +/** + * Describes the message agent.v1.StartGrindExecutionSuccess. + * Use `create(StartGrindExecutionSuccessSchema)` to create a new message. + */ +export declare const StartGrindExecutionSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.StartGrindExecutionError + */ +export type StartGrindExecutionError = Message<"agent.v1.StartGrindExecutionError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.StartGrindExecutionError. + * Use `create(StartGrindExecutionErrorSchema)` to create a new message. + */ +export declare const StartGrindExecutionErrorSchema: GenMessage; +/** + * @generated from message agent.v1.StartGrindExecutionToolCall + */ +export type StartGrindExecutionToolCall = Message<"agent.v1.StartGrindExecutionToolCall"> & { + /** + * @generated from field: agent.v1.StartGrindExecutionArgs args = 1; + */ + args?: StartGrindExecutionArgs; + /** + * @generated from field: agent.v1.StartGrindExecutionResult result = 2; + */ + result?: StartGrindExecutionResult; +}; +/** + * Describes the message agent.v1.StartGrindExecutionToolCall. + * Use `create(StartGrindExecutionToolCallSchema)` to create a new message. + */ +export declare const StartGrindExecutionToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.StartGrindPlanningArgs + */ +export type StartGrindPlanningArgs = Message<"agent.v1.StartGrindPlanningArgs"> & { + /** + * Optional explanation for why the agent is requesting to return to planning. + * + * @generated from field: optional string explanation = 1; + */ + explanation?: string; + /** + * @generated from field: string tool_call_id = 2; + */ + toolCallId: string; +}; +/** + * Describes the message agent.v1.StartGrindPlanningArgs. + * Use `create(StartGrindPlanningArgsSchema)` to create a new message. + */ +export declare const StartGrindPlanningArgsSchema: GenMessage; +/** + * @generated from message agent.v1.StartGrindPlanningResult + */ +export type StartGrindPlanningResult = Message<"agent.v1.StartGrindPlanningResult"> & { + /** + * @generated from oneof agent.v1.StartGrindPlanningResult.result + */ + result: { + /** + * @generated from field: agent.v1.StartGrindPlanningSuccess success = 1; + */ + value: StartGrindPlanningSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.StartGrindPlanningError error = 2; + */ + value: StartGrindPlanningError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.StartGrindPlanningResult. + * Use `create(StartGrindPlanningResultSchema)` to create a new message. + */ +export declare const StartGrindPlanningResultSchema: GenMessage; +/** + * @generated from message agent.v1.StartGrindPlanningSuccess + */ +export type StartGrindPlanningSuccess = Message<"agent.v1.StartGrindPlanningSuccess"> & {}; +/** + * Describes the message agent.v1.StartGrindPlanningSuccess. + * Use `create(StartGrindPlanningSuccessSchema)` to create a new message. + */ +export declare const StartGrindPlanningSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.StartGrindPlanningError + */ +export type StartGrindPlanningError = Message<"agent.v1.StartGrindPlanningError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.StartGrindPlanningError. + * Use `create(StartGrindPlanningErrorSchema)` to create a new message. + */ +export declare const StartGrindPlanningErrorSchema: GenMessage; +/** + * @generated from message agent.v1.StartGrindPlanningToolCall + */ +export type StartGrindPlanningToolCall = Message<"agent.v1.StartGrindPlanningToolCall"> & { + /** + * @generated from field: agent.v1.StartGrindPlanningArgs args = 1; + */ + args?: StartGrindPlanningArgs; + /** + * @generated from field: agent.v1.StartGrindPlanningResult result = 2; + */ + result?: StartGrindPlanningResult; +}; +/** + * Describes the message agent.v1.StartGrindPlanningToolCall. + * Use `create(StartGrindPlanningToolCallSchema)` to create a new message. + */ +export declare const StartGrindPlanningToolCallSchema: GenMessage; +/** + * var AgentMode; (function (AgentMode) { AgentMode[AgentMode["UNSPECIFIED"] = 0] = "UNSPECIFIED"; AgentMode[AgentMode["AGENT"] = 1] = "AGENT"; AgentMode[AgentMode["ASK"] = 2] = "ASK"; AgentMode[AgentMode["PLAN"] = 3] = "PLAN"; AgentMode[AgentMode["DEBUG"] = 4] = "DEBUG"; AgentMode[AgentMode["TRIAGE"] = 5] = "TRIAGE"; AgentMode[AgentMode["PROJECT"] = 6] = "PROJECT"; })(AgentMode || (AgentMode = {})); // Retrieve enum metadata with: proto3.getEnumType(AgentMode) proto3/* int32 *\/.C.util.setEnumType(AgentMode, "agent.v1.AgentMode", [ { no: 0, name: "AGENT_MODE_UNSPECIFIED" }, { no: 1, name: "AGENT_MODE_AGENT" }, { no: 2, name: "AGENT_MODE_ASK" }, { no: 3, name: "AGENT_MODE_PLAN" }, { no: 4, name: "AGENT_MODE_DEBUG" }, { no: 5, name: "AGENT_MODE_TRIAGE" }, { no: 6, name: "AGENT_MODE_PROJECT" }, ]); + * + * @generated from message agent.v1.TaskArgs + */ +export type TaskArgs = Message<"agent.v1.TaskArgs"> & { + /** + * @generated from field: string description = 1; + */ + description: string; + /** + * @generated from field: string prompt = 2; + */ + prompt: string; + /** + * @generated from field: agent.v1.SubagentType subagent_type = 3; + */ + subagentType?: SubagentType; + /** + * @generated from field: optional string model = 4; + */ + model?: string; + /** + * @generated from field: optional string resume = 5; + */ + resume?: string; +}; +/** + * Describes the message agent.v1.TaskArgs. + * Use `create(TaskArgsSchema)` to create a new message. + */ +export declare const TaskArgsSchema: GenMessage; +/** + * @generated from message agent.v1.TaskSuccess + */ +export type TaskSuccess = Message<"agent.v1.TaskSuccess"> & { + /** + * @generated from field: repeated agent.v1.ConversationStep conversation_steps = 1; + */ + conversationSteps: ConversationStep[]; + /** + * @generated from field: optional string agent_id = 2; + */ + agentId?: string; + /** + * @generated from field: bool is_background = 3; + */ + isBackground: boolean; + /** + * @generated from field: optional uint64 duration_ms = 4; + */ + durationMs?: bigint; +}; +/** + * Describes the message agent.v1.TaskSuccess. + * Use `create(TaskSuccessSchema)` to create a new message. + */ +export declare const TaskSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.TaskError + */ +export type TaskError = Message<"agent.v1.TaskError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.TaskError. + * Use `create(TaskErrorSchema)` to create a new message. + */ +export declare const TaskErrorSchema: GenMessage; +/** + * @generated from message agent.v1.TaskResult + */ +export type TaskResult = Message<"agent.v1.TaskResult"> & { + /** + * @generated from oneof agent.v1.TaskResult.result + */ + result: { + /** + * @generated from field: agent.v1.TaskSuccess success = 1; + */ + value: TaskSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.TaskError error = 2; + */ + value: TaskError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.TaskResult. + * Use `create(TaskResultSchema)` to create a new message. + */ +export declare const TaskResultSchema: GenMessage; +/** + * @generated from message agent.v1.TaskToolCall + */ +export type TaskToolCall = Message<"agent.v1.TaskToolCall"> & { + /** + * @generated from field: agent.v1.TaskArgs args = 1; + */ + args?: TaskArgs; + /** + * @generated from field: agent.v1.TaskResult result = 2; + */ + result?: TaskResult; +}; +/** + * Describes the message agent.v1.TaskToolCall. + * Use `create(TaskToolCallSchema)` to create a new message. + */ +export declare const TaskToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.TaskToolCallDelta + */ +export type TaskToolCallDelta = Message<"agent.v1.TaskToolCallDelta"> & { + /** + * @generated from field: agent.v1.InteractionUpdate interaction_update = 1; + */ + interactionUpdate?: InteractionUpdate; +}; +/** + * Describes the message agent.v1.TaskToolCallDelta. + * Use `create(TaskToolCallDeltaSchema)` to create a new message. + */ +export declare const TaskToolCallDeltaSchema: GenMessage; +/** + * Tool messages (from tool.proto) + * + * @generated from message agent.v1.ToolCall + */ +export type ToolCall = Message<"agent.v1.ToolCall"> & { + /** + * @generated from oneof agent.v1.ToolCall.tool + */ + tool: { + /** + * @generated from field: agent.v1.ShellToolCall shell_tool_call = 1; + */ + value: ShellToolCall; + case: "shellToolCall"; + } | { + /** + * @generated from field: agent.v1.DeleteToolCall delete_tool_call = 3; + */ + value: DeleteToolCall; + case: "deleteToolCall"; + } | { + /** + * @generated from field: agent.v1.GlobToolCall glob_tool_call = 4; + */ + value: GlobToolCall; + case: "globToolCall"; + } | { + /** + * @generated from field: agent.v1.GrepToolCall grep_tool_call = 5; + */ + value: GrepToolCall; + case: "grepToolCall"; + } | { + /** + * @generated from field: agent.v1.ReadToolCall read_tool_call = 8; + */ + value: ReadToolCall; + case: "readToolCall"; + } | { + /** + * @generated from field: agent.v1.UpdateTodosToolCall update_todos_tool_call = 9; + */ + value: UpdateTodosToolCall; + case: "updateTodosToolCall"; + } | { + /** + * @generated from field: agent.v1.ReadTodosToolCall read_todos_tool_call = 10; + */ + value: ReadTodosToolCall; + case: "readTodosToolCall"; + } | { + /** + * @generated from field: agent.v1.EditToolCall edit_tool_call = 12; + */ + value: EditToolCall; + case: "editToolCall"; + } | { + /** + * @generated from field: agent.v1.LsToolCall ls_tool_call = 13; + */ + value: LsToolCall; + case: "lsToolCall"; + } | { + /** + * @generated from field: agent.v1.ReadLintsToolCall read_lints_tool_call = 14; + */ + value: ReadLintsToolCall; + case: "readLintsToolCall"; + } | { + /** + * @generated from field: agent.v1.McpToolCall mcp_tool_call = 15; + */ + value: McpToolCall; + case: "mcpToolCall"; + } | { + /** + * @generated from field: agent.v1.SemSearchToolCall sem_search_tool_call = 16; + */ + value: SemSearchToolCall; + case: "semSearchToolCall"; + } | { + /** + * @generated from field: agent.v1.CreatePlanToolCall create_plan_tool_call = 17; + */ + value: CreatePlanToolCall; + case: "createPlanToolCall"; + } | { + /** + * @generated from field: agent.v1.WebSearchToolCall web_search_tool_call = 18; + */ + value: WebSearchToolCall; + case: "webSearchToolCall"; + } | { + /** + * @generated from field: agent.v1.TaskToolCall task_tool_call = 19; + */ + value: TaskToolCall; + case: "taskToolCall"; + } | { + /** + * @generated from field: agent.v1.ListMcpResourcesToolCall list_mcp_resources_tool_call = 20; + */ + value: ListMcpResourcesToolCall; + case: "listMcpResourcesToolCall"; + } | { + /** + * @generated from field: agent.v1.ReadMcpResourceToolCall read_mcp_resource_tool_call = 21; + */ + value: ReadMcpResourceToolCall; + case: "readMcpResourceToolCall"; + } | { + /** + * @generated from field: agent.v1.ApplyAgentDiffToolCall apply_agent_diff_tool_call = 22; + */ + value: ApplyAgentDiffToolCall; + case: "applyAgentDiffToolCall"; + } | { + /** + * @generated from field: agent.v1.AskQuestionToolCall ask_question_tool_call = 23; + */ + value: AskQuestionToolCall; + case: "askQuestionToolCall"; + } | { + /** + * @generated from field: agent.v1.FetchToolCall fetch_tool_call = 24; + */ + value: FetchToolCall; + case: "fetchToolCall"; + } | { + /** + * @generated from field: agent.v1.SwitchModeToolCall switch_mode_tool_call = 25; + */ + value: SwitchModeToolCall; + case: "switchModeToolCall"; + } | { + /** + * @generated from field: agent.v1.ExaSearchToolCall exa_search_tool_call = 26; + */ + value: ExaSearchToolCall; + case: "exaSearchToolCall"; + } | { + /** + * @generated from field: agent.v1.ExaFetchToolCall exa_fetch_tool_call = 27; + */ + value: ExaFetchToolCall; + case: "exaFetchToolCall"; + } | { + /** + * @generated from field: agent.v1.GenerateImageToolCall generate_image_tool_call = 28; + */ + value: GenerateImageToolCall; + case: "generateImageToolCall"; + } | { + /** + * @generated from field: agent.v1.RecordScreenToolCall record_screen_tool_call = 29; + */ + value: RecordScreenToolCall; + case: "recordScreenToolCall"; + } | { + /** + * @generated from field: agent.v1.ComputerUseToolCall computer_use_tool_call = 30; + */ + value: ComputerUseToolCall; + case: "computerUseToolCall"; + } | { + /** + * @generated from field: agent.v1.WriteShellStdinToolCall write_shell_stdin_tool_call = 31; + */ + value: WriteShellStdinToolCall; + case: "writeShellStdinToolCall"; + } | { + /** + * @generated from field: agent.v1.ReflectToolCall reflect_tool_call = 32; + */ + value: ReflectToolCall; + case: "reflectToolCall"; + } | { + /** + * @generated from field: agent.v1.SetupVmEnvironmentToolCall setup_vm_environment_tool_call = 33; + */ + value: SetupVmEnvironmentToolCall; + case: "setupVmEnvironmentToolCall"; + } | { + /** + * @generated from field: agent.v1.TruncatedToolCall truncated_tool_call = 34; + */ + value: TruncatedToolCall; + case: "truncatedToolCall"; + } | { + /** + * @generated from field: agent.v1.StartGrindExecutionToolCall start_grind_execution_tool_call = 35; + */ + value: StartGrindExecutionToolCall; + case: "startGrindExecutionToolCall"; + } | { + /** + * @generated from field: agent.v1.StartGrindPlanningToolCall start_grind_planning_tool_call = 36; + */ + value: StartGrindPlanningToolCall; + case: "startGrindPlanningToolCall"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ToolCall. + * Use `create(ToolCallSchema)` to create a new message. + */ +export declare const ToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.TruncatedToolCallArgs + */ +export type TruncatedToolCallArgs = Message<"agent.v1.TruncatedToolCallArgs"> & {}; +/** + * Describes the message agent.v1.TruncatedToolCallArgs. + * Use `create(TruncatedToolCallArgsSchema)` to create a new message. + */ +export declare const TruncatedToolCallArgsSchema: GenMessage; +/** + * @generated from message agent.v1.TruncatedToolCallSuccess + */ +export type TruncatedToolCallSuccess = Message<"agent.v1.TruncatedToolCallSuccess"> & {}; +/** + * Describes the message agent.v1.TruncatedToolCallSuccess. + * Use `create(TruncatedToolCallSuccessSchema)` to create a new message. + */ +export declare const TruncatedToolCallSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.TruncatedToolCallError + */ +export type TruncatedToolCallError = Message<"agent.v1.TruncatedToolCallError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.TruncatedToolCallError. + * Use `create(TruncatedToolCallErrorSchema)` to create a new message. + */ +export declare const TruncatedToolCallErrorSchema: GenMessage; +/** + * @generated from message agent.v1.TruncatedToolCallResult + */ +export type TruncatedToolCallResult = Message<"agent.v1.TruncatedToolCallResult"> & { + /** + * @generated from oneof agent.v1.TruncatedToolCallResult.result + */ + result: { + /** + * @generated from field: agent.v1.TruncatedToolCallSuccess success = 1; + */ + value: TruncatedToolCallSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.TruncatedToolCallError error = 2; + */ + value: TruncatedToolCallError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.TruncatedToolCallResult. + * Use `create(TruncatedToolCallResultSchema)` to create a new message. + */ +export declare const TruncatedToolCallResultSchema: GenMessage; +/** + * Placeholder for tool calls that were truncated due to size limits. + * + * @generated from message agent.v1.TruncatedToolCall + */ +export type TruncatedToolCall = Message<"agent.v1.TruncatedToolCall"> & { + /** + * @generated from field: bytes original_step_blob_id = 1; + */ + originalStepBlobId: Uint8Array; + /** + * unused, just matches the discriminated union for other tool calls + * + * @generated from field: agent.v1.TruncatedToolCallArgs args = 2; + */ + args?: TruncatedToolCallArgs; + /** + * @generated from field: agent.v1.TruncatedToolCallResult result = 3; + */ + result?: TruncatedToolCallResult; +}; +/** + * Describes the message agent.v1.TruncatedToolCall. + * Use `create(TruncatedToolCallSchema)` to create a new message. + */ +export declare const TruncatedToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.ToolCallDelta + */ +export type ToolCallDelta = Message<"agent.v1.ToolCallDelta"> & { + /** + * @generated from oneof agent.v1.ToolCallDelta.delta + */ + delta: { + /** + * @generated from field: agent.v1.ShellToolCallDelta shell_tool_call_delta = 1; + */ + value: ShellToolCallDelta; + case: "shellToolCallDelta"; + } | { + /** + * @generated from field: agent.v1.TaskToolCallDelta task_tool_call_delta = 2; + */ + value: TaskToolCallDelta; + case: "taskToolCallDelta"; + } | { + /** + * @generated from field: agent.v1.EditToolCallDelta edit_tool_call_delta = 3; + */ + value: EditToolCallDelta; + case: "editToolCallDelta"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ToolCallDelta. + * Use `create(ToolCallDeltaSchema)` to create a new message. + */ +export declare const ToolCallDeltaSchema: GenMessage; +/** + * @generated from message agent.v1.ConversationStep + */ +export type ConversationStep = Message<"agent.v1.ConversationStep"> & { + /** + * @generated from oneof agent.v1.ConversationStep.message + */ + message: { + /** + * @generated from field: agent.v1.AssistantMessage assistant_message = 1; + */ + value: AssistantMessage; + case: "assistantMessage"; + } | { + /** + * @generated from field: agent.v1.ToolCall tool_call = 2; + */ + value: ToolCall; + case: "toolCall"; + } | { + /** + * @generated from field: agent.v1.ThinkingMessage thinking_message = 3; + */ + value: ThinkingMessage; + case: "thinkingMessage"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ConversationStep. + * Use `create(ConversationStepSchema)` to create a new message. + */ +export declare const ConversationStepSchema: GenMessage; +/** + * @generated from message agent.v1.ConversationAction + */ +export type ConversationAction = Message<"agent.v1.ConversationAction"> & { + /** + * @generated from oneof agent.v1.ConversationAction.action + */ + action: { + /** + * @generated from field: agent.v1.UserMessageAction user_message_action = 1; + */ + value: UserMessageAction; + case: "userMessageAction"; + } | { + /** + * @generated from field: agent.v1.ResumeAction resume_action = 2; + */ + value: ResumeAction; + case: "resumeAction"; + } | { + /** + * @generated from field: agent.v1.CancelAction cancel_action = 3; + */ + value: CancelAction; + case: "cancelAction"; + } | { + /** + * @generated from field: agent.v1.SummarizeAction summarize_action = 4; + */ + value: SummarizeAction; + case: "summarizeAction"; + } | { + /** + * @generated from field: agent.v1.ShellCommandAction shell_command_action = 5; + */ + value: ShellCommandAction; + case: "shellCommandAction"; + } | { + /** + * @generated from field: agent.v1.StartPlanAction start_plan_action = 6; + */ + value: StartPlanAction; + case: "startPlanAction"; + } | { + /** + * @generated from field: agent.v1.ExecutePlanAction execute_plan_action = 7; + */ + value: ExecutePlanAction; + case: "executePlanAction"; + } | { + /** + * @generated from field: agent.v1.AsyncAskQuestionCompletionAction async_ask_question_completion_action = 8; + */ + value: AsyncAskQuestionCompletionAction; + case: "asyncAskQuestionCompletionAction"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ConversationAction. + * Use `create(ConversationActionSchema)` to create a new message. + */ +export declare const ConversationActionSchema: GenMessage; +/** + * @generated from message agent.v1.UserMessageAction + */ +export type UserMessageAction = Message<"agent.v1.UserMessageAction"> & { + /** + * @generated from field: agent.v1.UserMessage user_message = 1; + */ + userMessage?: UserMessage; + /** + * @generated from field: agent.v1.RequestContext request_context = 2; + */ + requestContext?: RequestContext; + /** + * @generated from field: optional bool send_to_interaction_listener = 3; + */ + sendToInteractionListener?: boolean; +}; +/** + * Describes the message agent.v1.UserMessageAction. + * Use `create(UserMessageActionSchema)` to create a new message. + */ +export declare const UserMessageActionSchema: GenMessage; +/** + * @generated from message agent.v1.CancelAction + */ +export type CancelAction = Message<"agent.v1.CancelAction"> & {}; +/** + * Describes the message agent.v1.CancelAction. + * Use `create(CancelActionSchema)` to create a new message. + */ +export declare const CancelActionSchema: GenMessage; +/** + * @generated from message agent.v1.ResumeAction + */ +export type ResumeAction = Message<"agent.v1.ResumeAction"> & { + /** + * @generated from field: agent.v1.RequestContext request_context = 2; + */ + requestContext?: RequestContext; +}; +/** + * Describes the message agent.v1.ResumeAction. + * Use `create(ResumeActionSchema)` to create a new message. + */ +export declare const ResumeActionSchema: GenMessage; +/** + * @generated from message agent.v1.AsyncAskQuestionCompletionAction + */ +export type AsyncAskQuestionCompletionAction = Message<"agent.v1.AsyncAskQuestionCompletionAction"> & { + /** + * Contains the original tool call ID and the result from the user + * + * @generated from field: string original_tool_call_id = 1; + */ + originalToolCallId: string; + /** + * @generated from field: agent.v1.AskQuestionArgs original_args = 2; + */ + originalArgs?: AskQuestionArgs; + /** + * @generated from field: agent.v1.AskQuestionResult result = 3; + */ + result?: AskQuestionResult; +}; +/** + * Describes the message agent.v1.AsyncAskQuestionCompletionAction. + * Use `create(AsyncAskQuestionCompletionActionSchema)` to create a new message. + */ +export declare const AsyncAskQuestionCompletionActionSchema: GenMessage; +/** + * @generated from message agent.v1.SummarizeAction + */ +export type SummarizeAction = Message<"agent.v1.SummarizeAction"> & {}; +/** + * Describes the message agent.v1.SummarizeAction. + * Use `create(SummarizeActionSchema)` to create a new message. + */ +export declare const SummarizeActionSchema: GenMessage; +/** + * @generated from message agent.v1.ShellCommandAction + */ +export type ShellCommandAction = Message<"agent.v1.ShellCommandAction"> & { + /** + * @generated from field: agent.v1.ShellCommand shell_command = 1; + */ + shellCommand?: ShellCommand; + /** + * unique identifier for preemptive exec attachment + * + * @generated from field: string exec_id = 2; + */ + execId: string; +}; +/** + * Describes the message agent.v1.ShellCommandAction. + * Use `create(ShellCommandActionSchema)` to create a new message. + */ +export declare const ShellCommandActionSchema: GenMessage; +/** + * @generated from message agent.v1.StartPlanAction + */ +export type StartPlanAction = Message<"agent.v1.StartPlanAction"> & { + /** + * @generated from field: agent.v1.UserMessage user_message = 1; + */ + userMessage?: UserMessage; + /** + * @generated from field: agent.v1.RequestContext request_context = 2; + */ + requestContext?: RequestContext; + /** + * @generated from field: bool is_spec = 3; + */ + isSpec: boolean; +}; +/** + * Describes the message agent.v1.StartPlanAction. + * Use `create(StartPlanActionSchema)` to create a new message. + */ +export declare const StartPlanActionSchema: GenMessage; +/** + * @generated from message agent.v1.ExecutePlanAction + */ +export type ExecutePlanAction = Message<"agent.v1.ExecutePlanAction"> & { + /** + * @generated from field: agent.v1.RequestContext request_context = 1; + */ + requestContext?: RequestContext; + /** + * @generated from field: optional agent.v1.ConversationPlan plan = 2; + */ + plan?: ConversationPlan; + /** + * e.g., "cursor-plan://composerId/plan.md" + * + * @generated from field: optional string plan_file_uri = 3; + */ + planFileUri?: string; + /** + * The actual plan content from the file + * + * @generated from field: optional string plan_file_content = 4; + */ + planFileContent?: string; +}; +/** + * Describes the message agent.v1.ExecutePlanAction. + * Use `create(ExecutePlanActionSchema)` to create a new message. + */ +export declare const ExecutePlanActionSchema: GenMessage; +/** + * @generated from message agent.v1.UserMessage + */ +export type UserMessage = Message<"agent.v1.UserMessage"> & { + /** + * @generated from field: string text = 1; + */ + text: string; + /** + * @generated from field: string message_id = 2; + */ + messageId: string; + /** + * @generated from field: optional agent.v1.SelectedContext selected_context = 3; + */ + selectedContext?: SelectedContext; + /** + * @generated from field: int32 mode = 4; + */ + mode: number; + /** + * @generated from field: optional bool is_simulated_msg = 5; + */ + isSimulatedMsg?: boolean; + /** + * @generated from field: optional string best_of_n_group_id = 6; + */ + bestOfNGroupId?: string; + /** + * @generated from field: optional bool try_use_best_of_n_promotion = 7; + */ + tryUseBestOfNPromotion?: boolean; + /** + * @generated from field: optional string rich_text = 8; + */ + richText?: string; +}; +/** + * Describes the message agent.v1.UserMessage. + * Use `create(UserMessageSchema)` to create a new message. + */ +export declare const UserMessageSchema: GenMessage; +/** + * @generated from message agent.v1.AssistantMessage + */ +export type AssistantMessage = Message<"agent.v1.AssistantMessage"> & { + /** + * @generated from field: string text = 1; + */ + text: string; +}; +/** + * Describes the message agent.v1.AssistantMessage. + * Use `create(AssistantMessageSchema)` to create a new message. + */ +export declare const AssistantMessageSchema: GenMessage; +/** + * @generated from message agent.v1.ThinkingMessage + */ +export type ThinkingMessage = Message<"agent.v1.ThinkingMessage"> & { + /** + * @generated from field: string text = 1; + */ + text: string; + /** + * @generated from field: uint32 duration_ms = 2; + */ + durationMs: number; +}; +/** + * Describes the message agent.v1.ThinkingMessage. + * Use `create(ThinkingMessageSchema)` to create a new message. + */ +export declare const ThinkingMessageSchema: GenMessage; +/** + * @generated from message agent.v1.ShellCommand + */ +export type ShellCommand = Message<"agent.v1.ShellCommand"> & { + /** + * @generated from field: string command = 1; + */ + command: string; +}; +/** + * Describes the message agent.v1.ShellCommand. + * Use `create(ShellCommandSchema)` to create a new message. + */ +export declare const ShellCommandSchema: GenMessage; +/** + * @generated from message agent.v1.ShellOutput + */ +export type ShellOutput = Message<"agent.v1.ShellOutput"> & { + /** + * @generated from field: string stdout = 1; + */ + stdout: string; + /** + * @generated from field: string stderr = 2; + */ + stderr: string; + /** + * @generated from field: int32 exit_code = 3; + */ + exitCode: number; +}; +/** + * Describes the message agent.v1.ShellOutput. + * Use `create(ShellOutputSchema)` to create a new message. + */ +export declare const ShellOutputSchema: GenMessage; +/** + * @generated from message agent.v1.ConversationTurn + */ +export type ConversationTurn = Message<"agent.v1.ConversationTurn"> & { + /** + * @generated from oneof agent.v1.ConversationTurn.turn + */ + turn: { + /** + * @generated from field: agent.v1.AgentConversationTurn agent_conversation_turn = 1; + */ + value: AgentConversationTurn; + case: "agentConversationTurn"; + } | { + /** + * @generated from field: agent.v1.ShellConversationTurn shell_conversation_turn = 2; + */ + value: ShellConversationTurn; + case: "shellConversationTurn"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ConversationTurn. + * Use `create(ConversationTurnSchema)` to create a new message. + */ +export declare const ConversationTurnSchema: GenMessage; +/** + * @generated from message agent.v1.ConversationPlan + */ +export type ConversationPlan = Message<"agent.v1.ConversationPlan"> & { + /** + * @generated from field: string plan = 1; + */ + plan: string; +}; +/** + * Describes the message agent.v1.ConversationPlan. + * Use `create(ConversationPlanSchema)` to create a new message. + */ +export declare const ConversationPlanSchema: GenMessage; +/** + * @generated from message agent.v1.ConversationTurnStructure + */ +export type ConversationTurnStructure = Message<"agent.v1.ConversationTurnStructure"> & { + /** + * @generated from oneof agent.v1.ConversationTurnStructure.turn + */ + turn: { + /** + * @generated from field: agent.v1.AgentConversationTurnStructure agent_conversation_turn = 1; + */ + value: AgentConversationTurnStructure; + case: "agentConversationTurn"; + } | { + /** + * @generated from field: agent.v1.ShellConversationTurnStructure shell_conversation_turn = 2; + */ + value: ShellConversationTurnStructure; + case: "shellConversationTurn"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ConversationTurnStructure. + * Use `create(ConversationTurnStructureSchema)` to create a new message. + */ +export declare const ConversationTurnStructureSchema: GenMessage; +/** + * @generated from message agent.v1.AgentConversationTurn + */ +export type AgentConversationTurn = Message<"agent.v1.AgentConversationTurn"> & { + /** + * @generated from field: agent.v1.UserMessage user_message = 1; + */ + userMessage?: UserMessage; + /** + * @generated from field: repeated agent.v1.ConversationStep steps = 2; + */ + steps: ConversationStep[]; + /** + * The request ID associated with this turn, used for analytics tracking + * + * @generated from field: optional string request_id = 3; + */ + requestId?: string; +}; +/** + * Describes the message agent.v1.AgentConversationTurn. + * Use `create(AgentConversationTurnSchema)` to create a new message. + */ +export declare const AgentConversationTurnSchema: GenMessage; +/** + * @generated from message agent.v1.AgentConversationTurnStructure + */ +export type AgentConversationTurnStructure = Message<"agent.v1.AgentConversationTurnStructure"> & { + /** + * @generated from field: bytes user_message = 1; + */ + userMessage: Uint8Array; + /** + * @generated from field: repeated bytes steps = 2; + */ + steps: Uint8Array[]; + /** + * The request ID associated with this turn, used for analytics tracking + * + * @generated from field: optional string request_id = 3; + */ + requestId?: string; +}; +/** + * Describes the message agent.v1.AgentConversationTurnStructure. + * Use `create(AgentConversationTurnStructureSchema)` to create a new message. + */ +export declare const AgentConversationTurnStructureSchema: GenMessage; +/** + * @generated from message agent.v1.ShellConversationTurn + */ +export type ShellConversationTurn = Message<"agent.v1.ShellConversationTurn"> & { + /** + * @generated from field: agent.v1.ShellCommand shell_command = 1; + */ + shellCommand?: ShellCommand; + /** + * @generated from field: agent.v1.ShellOutput shell_output = 2; + */ + shellOutput?: ShellOutput; +}; +/** + * Describes the message agent.v1.ShellConversationTurn. + * Use `create(ShellConversationTurnSchema)` to create a new message. + */ +export declare const ShellConversationTurnSchema: GenMessage; +/** + * @generated from message agent.v1.ShellConversationTurnStructure + */ +export type ShellConversationTurnStructure = Message<"agent.v1.ShellConversationTurnStructure"> & { + /** + * @generated from field: bytes shell_command = 1; + */ + shellCommand: Uint8Array; + /** + * @generated from field: bytes shell_output = 2; + */ + shellOutput: Uint8Array; +}; +/** + * Describes the message agent.v1.ShellConversationTurnStructure. + * Use `create(ShellConversationTurnStructureSchema)` to create a new message. + */ +export declare const ShellConversationTurnStructureSchema: GenMessage; +/** + * @generated from message agent.v1.ConversationSummary + */ +export type ConversationSummary = Message<"agent.v1.ConversationSummary"> & { + /** + * @generated from field: string summary = 1; + */ + summary: string; +}; +/** + * Describes the message agent.v1.ConversationSummary. + * Use `create(ConversationSummarySchema)` to create a new message. + */ +export declare const ConversationSummarySchema: GenMessage; +/** + * @generated from message agent.v1.ConversationSummaryArchive + */ +export type ConversationSummaryArchive = Message<"agent.v1.ConversationSummaryArchive"> & { + /** + * @generated from field: repeated bytes summarized_messages = 1; + */ + summarizedMessages: Uint8Array[]; + /** + * @generated from field: string summary = 2; + */ + summary: string; + /** + * @generated from field: uint32 window_tail = 3; + */ + windowTail: number; + /** + * @generated from field: bytes summary_message = 4; + */ + summaryMessage: Uint8Array; +}; +/** + * Describes the message agent.v1.ConversationSummaryArchive. + * Use `create(ConversationSummaryArchiveSchema)` to create a new message. + */ +export declare const ConversationSummaryArchiveSchema: GenMessage; +/** + * @generated from message agent.v1.ConversationTokenDetails + */ +export type ConversationTokenDetails = Message<"agent.v1.ConversationTokenDetails"> & { + /** + * @generated from field: uint32 used_tokens = 1; + */ + usedTokens: number; + /** + * @generated from field: uint32 max_tokens = 2; + */ + maxTokens: number; +}; +/** + * Describes the message agent.v1.ConversationTokenDetails. + * Use `create(ConversationTokenDetailsSchema)` to create a new message. + */ +export declare const ConversationTokenDetailsSchema: GenMessage; +/** + * @generated from message agent.v1.FileState + */ +export type FileState = Message<"agent.v1.FileState"> & { + /** + * Optional content. If not set or undefined, the file is considered deleted. + * + * @generated from field: optional string content = 1; + */ + content?: string; + /** + * Optional initial content captured when the file was first tracked. If not set or undefined, the file did not exist when tracking began. + * + * @generated from field: optional string initial_content = 2; + */ + initialContent?: string; +}; +/** + * Describes the message agent.v1.FileState. + * Use `create(FileStateSchema)` to create a new message. + */ +export declare const FileStateSchema: GenMessage; +/** + * @generated from message agent.v1.FileStateStructure + */ +export type FileStateStructure = Message<"agent.v1.FileStateStructure"> & { + /** + * Optional content. If not set or undefined, the file is considered deleted. + * + * @generated from field: optional bytes content = 1; + */ + content?: Uint8Array; + /** + * Optional initial content captured when the file was first tracked. If not set or undefined, the file did not exist when tracking began. + * + * @generated from field: optional bytes initial_content = 2; + */ + initialContent?: Uint8Array; +}; +/** + * Describes the message agent.v1.FileStateStructure. + * Use `create(FileStateStructureSchema)` to create a new message. + */ +export declare const FileStateStructureSchema: GenMessage; +/** + * @generated from message agent.v1.StepTiming + */ +export type StepTiming = Message<"agent.v1.StepTiming"> & { + /** + * @generated from field: uint64 duration_ms = 1; + */ + durationMs: bigint; + /** + * @generated from field: uint64 timestamp_ms = 2; + */ + timestampMs: bigint; +}; +/** + * Describes the message agent.v1.StepTiming. + * Use `create(StepTimingSchema)` to create a new message. + */ +export declare const StepTimingSchema: GenMessage; +/** + * @generated from message agent.v1.ConversationState + */ +export type ConversationState = Message<"agent.v1.ConversationState"> & { + /** + * @generated from field: repeated string root_prompt_messages_json = 1; + */ + rootPromptMessagesJson: string[]; + /** + * @generated from field: repeated agent.v1.ConversationTurn turns = 8; + */ + turns: ConversationTurn[]; + /** + * @generated from field: repeated agent.v1.TodoItem todos = 3; + */ + todos: TodoItem[]; + /** + * Raw JSON stringified tool-call content parts awaiting execution + * + * @generated from field: repeated string pending_tool_calls = 4; + */ + pendingToolCalls: string[]; + /** + * @generated from field: agent.v1.ConversationTokenDetails token_details = 5; + */ + tokenDetails?: ConversationTokenDetails; + /** + * only for when the user explicitly asks for a summary through the summary action + * + * @generated from field: optional agent.v1.ConversationSummary summary = 6; + */ + summary?: ConversationSummary; + /** + * @generated from field: optional agent.v1.ConversationPlan plan = 7; + */ + plan?: ConversationPlan; + /** + * @generated from field: optional agent.v1.ConversationSummaryArchive summary_archive = 9; + */ + summaryArchive?: ConversationSummaryArchive; + /** + * Deprecated, use summary_archives instead @deprecated summaryArchive; + * + * @generated from field: map file_states = 10; + */ + fileStates: { + [key: string]: FileState; + }; + /** + * @generated from field: repeated agent.v1.ConversationSummaryArchive summary_archives = 11; + */ + summaryArchives: ConversationSummaryArchive[]; +}; +/** + * Describes the message agent.v1.ConversationState. + * Use `create(ConversationStateSchema)` to create a new message. + */ +export declare const ConversationStateSchema: GenMessage; +/** + * @generated from message agent.v1.SubagentPersistedState + */ +export type SubagentPersistedState = Message<"agent.v1.SubagentPersistedState"> & { + /** + * The subagent's conversation state structure + * + * @generated from field: agent.v1.ConversationStateStructure conversation_state = 1; + */ + conversationState?: ConversationStateStructure; + /** + * Timestamp when this subagent was first created + * + * @generated from field: uint64 created_timestamp_ms = 2; + */ + createdTimestampMs: bigint; + /** + * Timestamp when this subagent was last used (by task tool call) + * + * @generated from field: uint64 last_used_timestamp_ms = 3; + */ + lastUsedTimestampMs: bigint; + /** + * The subagent type (e.g., computerUse, custom with name) + * + * @generated from field: agent.v1.SubagentType subagent_type = 4; + */ + subagentType?: SubagentType; +}; +/** + * Describes the message agent.v1.SubagentPersistedState. + * Use `create(SubagentPersistedStateSchema)` to create a new message. + */ +export declare const SubagentPersistedStateSchema: GenMessage; +/** + * @generated from message agent.v1.ConversationStateStructure + */ +export type ConversationStateStructure = Message<"agent.v1.ConversationStateStructure"> & { + /** + * @generated from field: repeated bytes turns_old = 2; + */ + turnsOld: Uint8Array[]; + /** + * @deprecated turnsOld = []; + * + * @generated from field: repeated bytes root_prompt_messages_json = 1; + */ + rootPromptMessagesJson: Uint8Array[]; + /** + * @generated from field: repeated bytes turns = 8; + */ + turns: Uint8Array[]; + /** + * @generated from field: repeated bytes todos = 3; + */ + todos: Uint8Array[]; + /** + * Raw JSON stringified tool-call content parts awaiting execution + * + * @generated from field: repeated string pending_tool_calls = 4; + */ + pendingToolCalls: string[]; + /** + * @generated from field: agent.v1.ConversationTokenDetails token_details = 5; + */ + tokenDetails?: ConversationTokenDetails; + /** + * only for when the user explicitly asks for a summary through the summary action + * + * @generated from field: optional bytes summary = 6; + */ + summary?: Uint8Array; + /** + * @generated from field: optional bytes plan = 7; + */ + plan?: Uint8Array; + /** + * @generated from field: repeated string previous_workspace_uris = 9; + */ + previousWorkspaceUris: string[]; + /** + * Current mode of the conversation + * + * @generated from field: optional int32 mode = 10; + */ + mode?: number; + /** + * @generated from field: optional bytes summary_archive = 11; + */ + summaryArchive?: Uint8Array; + /** + * @generated from field: map file_states = 12; + */ + fileStates: { + [key: string]: Uint8Array; + }; + /** + * Deprecated, use summary_archives instead @deprecated summaryArchive; Map of file paths to their latest content (stored as blob IDs in the KV store) Each blob contains a serialized FileState message @deprecated fileStates = {}; Map of file paths to their latest content (stored as FileStateStructure) + * + * @generated from field: map file_states_v2 = 15; + */ + fileStatesV2: { + [key: string]: FileStateStructure; + }; + /** + * @generated from field: repeated bytes summary_archives = 13; + */ + summaryArchives: Uint8Array[]; + /** + * @generated from field: repeated agent.v1.StepTiming turn_timings = 14; + */ + turnTimings: StepTiming[]; + /** + * Subagent resume tracking Map of subagent ID to the persisted subagent state (stored inline) + * + * @generated from field: map subagent_states = 16; + */ + subagentStates: { + [key: string]: SubagentPersistedState; + }; + /** + * Count of self-summaries generated for this conversation + * + * @generated from field: uint32 self_summary_count = 17; + */ + selfSummaryCount: number; + /** + * Set of file paths that have been read during this conversation + * + * @generated from field: repeated string read_paths = 18; + */ + readPaths: string[]; +}; +/** + * Describes the message agent.v1.ConversationStateStructure. + * Use `create(ConversationStateStructureSchema)` to create a new message. + */ +export declare const ConversationStateStructureSchema: GenMessage; +/** + * @generated from message agent.v1.ThinkingDetails + */ +export type ThinkingDetails = Message<"agent.v1.ThinkingDetails"> & {}; +/** + * Describes the message agent.v1.ThinkingDetails. + * Use `create(ThinkingDetailsSchema)` to create a new message. + */ +export declare const ThinkingDetailsSchema: GenMessage; +/** + * @generated from message agent.v1.ApiKeyCredentials + */ +export type ApiKeyCredentials = Message<"agent.v1.ApiKeyCredentials"> & { + /** + * @generated from field: string api_key = 1; + */ + apiKey: string; + /** + * For OpenAI-compatible endpoints + * + * @generated from field: optional string base_url = 2; + */ + baseUrl?: string; +}; +/** + * Describes the message agent.v1.ApiKeyCredentials. + * Use `create(ApiKeyCredentialsSchema)` to create a new message. + */ +export declare const ApiKeyCredentialsSchema: GenMessage; +/** + * @generated from message agent.v1.AzureCredentials + */ +export type AzureCredentials = Message<"agent.v1.AzureCredentials"> & { + /** + * @generated from field: string api_key = 1; + */ + apiKey: string; + /** + * @generated from field: string base_url = 2; + */ + baseUrl: string; + /** + * @generated from field: string deployment = 3; + */ + deployment: string; +}; +/** + * Describes the message agent.v1.AzureCredentials. + * Use `create(AzureCredentialsSchema)` to create a new message. + */ +export declare const AzureCredentialsSchema: GenMessage; +/** + * @generated from message agent.v1.BedrockCredentials + */ +export type BedrockCredentials = Message<"agent.v1.BedrockCredentials"> & { + /** + * @generated from field: string access_key = 1; + */ + accessKey: string; + /** + * @generated from field: string secret_key = 2; + */ + secretKey: string; + /** + * @generated from field: string region = 3; + */ + region: string; + /** + * @generated from field: optional string session_token = 4; + */ + sessionToken?: string; +}; +/** + * Describes the message agent.v1.BedrockCredentials. + * Use `create(BedrockCredentialsSchema)` to create a new message. + */ +export declare const BedrockCredentialsSchema: GenMessage; +/** + * @generated from message agent.v1.ModelDetails + */ +export type ModelDetails = Message<"agent.v1.ModelDetails"> & { + /** + * @generated from field: string model_id = 1; + */ + modelId: string; + /** + * @generated from field: string display_model_id = 3; + */ + displayModelId: string; + /** + * @generated from field: string display_name = 4; + */ + displayName: string; + /** + * @generated from field: string display_name_short = 5; + */ + displayNameShort: string; + /** + * @generated from field: repeated string aliases = 6; + */ + aliases: string[]; + /** + * @generated from field: optional agent.v1.ThinkingDetails thinking_details = 2; + */ + thinkingDetails?: ThinkingDetails; + /** + * @generated from field: optional bool max_mode = 7; + */ + maxMode?: boolean; + /** + * @generated from oneof agent.v1.ModelDetails.credentials + */ + credentials: { + /** + * @generated from field: agent.v1.ApiKeyCredentials api_key_credentials = 8; + */ + value: ApiKeyCredentials; + case: "apiKeyCredentials"; + } | { + /** + * @generated from field: agent.v1.AzureCredentials azure_credentials = 9; + */ + value: AzureCredentials; + case: "azureCredentials"; + } | { + /** + * @generated from field: agent.v1.BedrockCredentials bedrock_credentials = 10; + */ + value: BedrockCredentials; + case: "bedrockCredentials"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ModelDetails. + * Use `create(ModelDetailsSchema)` to create a new message. + */ +export declare const ModelDetailsSchema: GenMessage; +/** + * @generated from message agent.v1.RequestedModel + */ +export type RequestedModel = Message<"agent.v1.RequestedModel"> & { + /** + * @generated from field: string model_id = 1; + */ + modelId: string; + /** + * @generated from field: bool max_mode = 2; + */ + maxMode: boolean; + /** + * @generated from field: repeated agent.v1.RequestedModel_ModelParameterbytes parameters = 3; + */ + parameters: RequestedModel_ModelParameterbytes[]; + /** + * @generated from oneof agent.v1.RequestedModel.credentials + */ + credentials: { + /** + * @generated from field: agent.v1.ApiKeyCredentials api_key_credentials = 4; + */ + value: ApiKeyCredentials; + case: "apiKeyCredentials"; + } | { + /** + * @generated from field: agent.v1.AzureCredentials azure_credentials = 5; + */ + value: AzureCredentials; + case: "azureCredentials"; + } | { + /** + * @generated from field: agent.v1.BedrockCredentials bedrock_credentials = 6; + */ + value: BedrockCredentials; + case: "bedrockCredentials"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.RequestedModel. + * Use `create(RequestedModelSchema)` to create a new message. + */ +export declare const RequestedModelSchema: GenMessage; +/** + * @generated from message agent.v1.RequestedModel_ModelParameterbytes + */ +export type RequestedModel_ModelParameterbytes = Message<"agent.v1.RequestedModel_ModelParameterbytes"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + /** + * All paramters are encoded as strings. For boolean parameters, the value is either "true" or "false". For enum parameters, the value is one of the values in the enum. + * + * @generated from field: string value = 2; + */ + value: string; +}; +/** + * Describes the message agent.v1.RequestedModel_ModelParameterbytes. + * Use `create(RequestedModel_ModelParameterbytesSchema)` to create a new message. + */ +export declare const RequestedModel_ModelParameterbytesSchema: GenMessage; +/** + * @generated from message agent.v1.AgentRunRequest + */ +export type AgentRunRequest = Message<"agent.v1.AgentRunRequest"> & { + /** + * @generated from field: agent.v1.ConversationStateStructure conversation_state = 1; + */ + conversationState?: ConversationStateStructure; + /** + * @generated from field: agent.v1.ConversationAction action = 2; + */ + action?: ConversationAction; + /** + * TODO: Today we use model_details, but we are getting ready to deprecate that and use requested_model instead. + * + * @generated from field: agent.v1.ModelDetails model_details = 3; + */ + modelDetails?: ModelDetails; + /** + * @generated from field: optional agent.v1.RequestedModel requested_model = 9; + */ + requestedModel?: RequestedModel; + /** + * @generated from field: agent.v1.McpTools mcp_tools = 4; + */ + mcpTools?: McpTools; + /** + * @generated from field: optional string conversation_id = 5; + */ + conversationId?: string; + /** + * @generated from field: optional agent.v1.McpFileSystemOptions mcp_file_system_options = 6; + */ + mcpFileSystemOptions?: McpFileSystemOptions; + /** + * Deprecated, use the one in RequestContext message in request_context_exec.proto instead + * + * @generated from field: optional agent.v1.SkillOptions skill_options = 7; + */ + skillOptions?: SkillOptions; + /** + * Custom system prompt override. Allowlisted for specific teams only. + * + * @generated from field: optional string custom_system_prompt = 8; + */ + customSystemPrompt?: string; +}; +/** + * Describes the message agent.v1.AgentRunRequest. + * Use `create(AgentRunRequestSchema)` to create a new message. + */ +export declare const AgentRunRequestSchema: GenMessage; +/** + * @generated from message agent.v1.TextDeltaUpdate + */ +export type TextDeltaUpdate = Message<"agent.v1.TextDeltaUpdate"> & { + /** + * @generated from field: string text = 1; + */ + text: string; +}; +/** + * Describes the message agent.v1.TextDeltaUpdate. + * Use `create(TextDeltaUpdateSchema)` to create a new message. + */ +export declare const TextDeltaUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.ToolCallStartedUpdate + */ +export type ToolCallStartedUpdate = Message<"agent.v1.ToolCallStartedUpdate"> & { + /** + * @generated from field: string call_id = 1; + */ + callId: string; + /** + * @generated from field: agent.v1.ToolCall tool_call = 2; + */ + toolCall?: ToolCall; + /** + * groups tool calls that originate from the same model provider call + * + * @generated from field: string model_call_id = 3; + */ + modelCallId: string; +}; +/** + * Describes the message agent.v1.ToolCallStartedUpdate. + * Use `create(ToolCallStartedUpdateSchema)` to create a new message. + */ +export declare const ToolCallStartedUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.ToolCallCompletedUpdate + */ +export type ToolCallCompletedUpdate = Message<"agent.v1.ToolCallCompletedUpdate"> & { + /** + * @generated from field: string call_id = 1; + */ + callId: string; + /** + * @generated from field: agent.v1.ToolCall tool_call = 2; + */ + toolCall?: ToolCall; + /** + * groups tool calls that originate from the same model provider call + * + * @generated from field: string model_call_id = 3; + */ + modelCallId: string; +}; +/** + * Describes the message agent.v1.ToolCallCompletedUpdate. + * Use `create(ToolCallCompletedUpdateSchema)` to create a new message. + */ +export declare const ToolCallCompletedUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.ToolCallDeltaUpdate + */ +export type ToolCallDeltaUpdate = Message<"agent.v1.ToolCallDeltaUpdate"> & { + /** + * @generated from field: string call_id = 1; + */ + callId: string; + /** + * @generated from field: agent.v1.ToolCallDelta tool_call_delta = 2; + */ + toolCallDelta?: ToolCallDelta; + /** + * groups tool calls that originate from the same model provider call + * + * @generated from field: string model_call_id = 3; + */ + modelCallId: string; +}; +/** + * Describes the message agent.v1.ToolCallDeltaUpdate. + * Use `create(ToolCallDeltaUpdateSchema)` to create a new message. + */ +export declare const ToolCallDeltaUpdateSchema: GenMessage; +/** + * Streaming update for partial tool call arguments + * + * @generated from message agent.v1.PartialToolCallUpdate + */ +export type PartialToolCallUpdate = Message<"agent.v1.PartialToolCallUpdate"> & { + /** + * @generated from field: string call_id = 1; + */ + callId: string; + /** + * @generated from field: agent.v1.ToolCall tool_call = 2; + */ + toolCall?: ToolCall; + /** + * Aggregated args text so far (as JSON text). May be incomplete until final tool call. + * + * @generated from field: string args_text_delta = 3; + */ + argsTextDelta: string; + /** + * groups tool calls that originate from the same model provider call + * + * @generated from field: string model_call_id = 4; + */ + modelCallId: string; +}; +/** + * Describes the message agent.v1.PartialToolCallUpdate. + * Use `create(PartialToolCallUpdateSchema)` to create a new message. + */ +export declare const PartialToolCallUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.ThinkingDeltaUpdate + */ +export type ThinkingDeltaUpdate = Message<"agent.v1.ThinkingDeltaUpdate"> & { + /** + * @generated from field: string text = 1; + */ + text: string; +}; +/** + * Describes the message agent.v1.ThinkingDeltaUpdate. + * Use `create(ThinkingDeltaUpdateSchema)` to create a new message. + */ +export declare const ThinkingDeltaUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.ThinkingCompletedUpdate + */ +export type ThinkingCompletedUpdate = Message<"agent.v1.ThinkingCompletedUpdate"> & { + /** + * @generated from field: int32 thinking_duration_ms = 1; + */ + thinkingDurationMs: number; +}; +/** + * Describes the message agent.v1.ThinkingCompletedUpdate. + * Use `create(ThinkingCompletedUpdateSchema)` to create a new message. + */ +export declare const ThinkingCompletedUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.TokenDeltaUpdate + */ +export type TokenDeltaUpdate = Message<"agent.v1.TokenDeltaUpdate"> & { + /** + * @generated from field: int32 tokens = 1; + */ + tokens: number; +}; +/** + * Describes the message agent.v1.TokenDeltaUpdate. + * Use `create(TokenDeltaUpdateSchema)` to create a new message. + */ +export declare const TokenDeltaUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.SummaryUpdate + */ +export type SummaryUpdate = Message<"agent.v1.SummaryUpdate"> & { + /** + * @generated from field: string summary = 1; + */ + summary: string; +}; +/** + * Describes the message agent.v1.SummaryUpdate. + * Use `create(SummaryUpdateSchema)` to create a new message. + */ +export declare const SummaryUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.SummaryStartedUpdate + */ +export type SummaryStartedUpdate = Message<"agent.v1.SummaryStartedUpdate"> & {}; +/** + * Describes the message agent.v1.SummaryStartedUpdate. + * Use `create(SummaryStartedUpdateSchema)` to create a new message. + */ +export declare const SummaryStartedUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.HeartbeatUpdate + */ +export type HeartbeatUpdate = Message<"agent.v1.HeartbeatUpdate"> & {}; +/** + * Describes the message agent.v1.HeartbeatUpdate. + * Use `create(HeartbeatUpdateSchema)` to create a new message. + */ +export declare const HeartbeatUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.SummaryCompletedUpdate + */ +export type SummaryCompletedUpdate = Message<"agent.v1.SummaryCompletedUpdate"> & {}; +/** + * Describes the message agent.v1.SummaryCompletedUpdate. + * Use `create(SummaryCompletedUpdateSchema)` to create a new message. + */ +export declare const SummaryCompletedUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.ShellOutputDeltaUpdate + */ +export type ShellOutputDeltaUpdate = Message<"agent.v1.ShellOutputDeltaUpdate"> & { + /** + * @generated from oneof agent.v1.ShellOutputDeltaUpdate.event + */ + event: { + /** + * @generated from field: agent.v1.ShellStreamStdout stdout = 1; + */ + value: ShellStreamStdout; + case: "stdout"; + } | { + /** + * @generated from field: agent.v1.ShellStreamStderr stderr = 2; + */ + value: ShellStreamStderr; + case: "stderr"; + } | { + /** + * @generated from field: agent.v1.ShellStreamExit exit = 3; + */ + value: ShellStreamExit; + case: "exit"; + } | { + /** + * @generated from field: agent.v1.ShellStreamStart start = 4; + */ + value: ShellStreamStart; + case: "start"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ShellOutputDeltaUpdate. + * Use `create(ShellOutputDeltaUpdateSchema)` to create a new message. + */ +export declare const ShellOutputDeltaUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.TurnEndedUpdate + */ +export type TurnEndedUpdate = Message<"agent.v1.TurnEndedUpdate"> & {}; +/** + * Describes the message agent.v1.TurnEndedUpdate. + * Use `create(TurnEndedUpdateSchema)` to create a new message. + */ +export declare const TurnEndedUpdateSchema: GenMessage; +/** + * Only: user message appended update + * + * @generated from message agent.v1.UserMessageAppendedUpdate + */ +export type UserMessageAppendedUpdate = Message<"agent.v1.UserMessageAppendedUpdate"> & { + /** + * @generated from field: agent.v1.UserMessage user_message = 1; + */ + userMessage?: UserMessage; +}; +/** + * Describes the message agent.v1.UserMessageAppendedUpdate. + * Use `create(UserMessageAppendedUpdateSchema)` to create a new message. + */ +export declare const UserMessageAppendedUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.StepStartedUpdate + */ +export type StepStartedUpdate = Message<"agent.v1.StepStartedUpdate"> & { + /** + * @generated from field: uint64 step_id = 1; + */ + stepId: bigint; +}; +/** + * Describes the message agent.v1.StepStartedUpdate. + * Use `create(StepStartedUpdateSchema)` to create a new message. + */ +export declare const StepStartedUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.StepCompletedUpdate + */ +export type StepCompletedUpdate = Message<"agent.v1.StepCompletedUpdate"> & { + /** + * @generated from field: uint64 step_id = 1; + */ + stepId: bigint; + /** + * @generated from field: int64 step_duration_ms = 2; + */ + stepDurationMs: bigint; +}; +/** + * Describes the message agent.v1.StepCompletedUpdate. + * Use `create(StepCompletedUpdateSchema)` to create a new message. + */ +export declare const StepCompletedUpdateSchema: GenMessage; +/** + * @generated from message agent.v1.InteractionUpdate + */ +export type InteractionUpdate = Message<"agent.v1.InteractionUpdate"> & { + /** + * @generated from oneof agent.v1.InteractionUpdate.message + */ + message: { + /** + * @generated from field: agent.v1.TextDeltaUpdate text_delta = 1; + */ + value: TextDeltaUpdate; + case: "textDelta"; + } | { + /** + * @generated from field: agent.v1.PartialToolCallUpdate partial_tool_call = 7; + */ + value: PartialToolCallUpdate; + case: "partialToolCall"; + } | { + /** + * @generated from field: agent.v1.ToolCallDeltaUpdate tool_call_delta = 15; + */ + value: ToolCallDeltaUpdate; + case: "toolCallDelta"; + } | { + /** + * @generated from field: agent.v1.ToolCallStartedUpdate tool_call_started = 2; + */ + value: ToolCallStartedUpdate; + case: "toolCallStarted"; + } | { + /** + * @generated from field: agent.v1.ToolCallCompletedUpdate tool_call_completed = 3; + */ + value: ToolCallCompletedUpdate; + case: "toolCallCompleted"; + } | { + /** + * @generated from field: agent.v1.ThinkingDeltaUpdate thinking_delta = 4; + */ + value: ThinkingDeltaUpdate; + case: "thinkingDelta"; + } | { + /** + * @generated from field: agent.v1.ThinkingCompletedUpdate thinking_completed = 5; + */ + value: ThinkingCompletedUpdate; + case: "thinkingCompleted"; + } | { + /** + * @generated from field: agent.v1.UserMessageAppendedUpdate user_message_appended = 6; + */ + value: UserMessageAppendedUpdate; + case: "userMessageAppended"; + } | { + /** + * @generated from field: agent.v1.TokenDeltaUpdate token_delta = 8; + */ + value: TokenDeltaUpdate; + case: "tokenDelta"; + } | { + /** + * @generated from field: agent.v1.SummaryUpdate summary = 9; + */ + value: SummaryUpdate; + case: "summary"; + } | { + /** + * @generated from field: agent.v1.SummaryStartedUpdate summary_started = 10; + */ + value: SummaryStartedUpdate; + case: "summaryStarted"; + } | { + /** + * @generated from field: agent.v1.SummaryCompletedUpdate summary_completed = 11; + */ + value: SummaryCompletedUpdate; + case: "summaryCompleted"; + } | { + /** + * @generated from field: agent.v1.ShellOutputDeltaUpdate shell_output_delta = 12; + */ + value: ShellOutputDeltaUpdate; + case: "shellOutputDelta"; + } | { + /** + * @generated from field: agent.v1.HeartbeatUpdate heartbeat = 13; + */ + value: HeartbeatUpdate; + case: "heartbeat"; + } | { + /** + * @generated from field: agent.v1.TurnEndedUpdate turn_ended = 14; + */ + value: TurnEndedUpdate; + case: "turnEnded"; + } | { + /** + * @generated from field: agent.v1.StepStartedUpdate step_started = 16; + */ + value: StepStartedUpdate; + case: "stepStarted"; + } | { + /** + * @generated from field: agent.v1.StepCompletedUpdate step_completed = 17; + */ + value: StepCompletedUpdate; + case: "stepCompleted"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.InteractionUpdate. + * Use `create(InteractionUpdateSchema)` to create a new message. + */ +export declare const InteractionUpdateSchema: GenMessage; +/** + * Interaction query messages for bidirectional communication + * + * @generated from message agent.v1.InteractionQuery + */ +export type InteractionQuery = Message<"agent.v1.InteractionQuery"> & { + /** + * @generated from field: uint32 id = 1; + */ + id: number; + /** + * @generated from oneof agent.v1.InteractionQuery.query + */ + query: { + /** + * @generated from field: agent.v1.WebSearchRequestQuery web_search_request_query = 2; + */ + value: WebSearchRequestQuery; + case: "webSearchRequestQuery"; + } | { + /** + * @generated from field: agent.v1.AskQuestionInteractionQuery ask_question_interaction_query = 3; + */ + value: AskQuestionInteractionQuery; + case: "askQuestionInteractionQuery"; + } | { + /** + * @generated from field: agent.v1.SwitchModeRequestQuery switch_mode_request_query = 4; + */ + value: SwitchModeRequestQuery; + case: "switchModeRequestQuery"; + } | { + /** + * @generated from field: agent.v1.ExaSearchRequestQuery exa_search_request_query = 5; + */ + value: ExaSearchRequestQuery; + case: "exaSearchRequestQuery"; + } | { + /** + * @generated from field: agent.v1.ExaFetchRequestQuery exa_fetch_request_query = 6; + */ + value: ExaFetchRequestQuery; + case: "exaFetchRequestQuery"; + } | { + /** + * @generated from field: agent.v1.CreatePlanRequestQuery create_plan_request_query = 7; + */ + value: CreatePlanRequestQuery; + case: "createPlanRequestQuery"; + } | { + /** + * @generated from field: agent.v1.SetupVmEnvironmentArgs setup_vm_environment_args = 8; + */ + value: SetupVmEnvironmentArgs; + case: "setupVmEnvironmentArgs"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.InteractionQuery. + * Use `create(InteractionQuerySchema)` to create a new message. + */ +export declare const InteractionQuerySchema: GenMessage; +/** + * @generated from message agent.v1.InteractionResponse + */ +export type InteractionResponse = Message<"agent.v1.InteractionResponse"> & { + /** + * @generated from field: uint32 id = 1; + */ + id: number; + /** + * @generated from oneof agent.v1.InteractionResponse.result + */ + result: { + /** + * @generated from field: agent.v1.WebSearchRequestResponse web_search_request_response = 2; + */ + value: WebSearchRequestResponse; + case: "webSearchRequestResponse"; + } | { + /** + * @generated from field: agent.v1.AskQuestionInteractionResponse ask_question_interaction_response = 3; + */ + value: AskQuestionInteractionResponse; + case: "askQuestionInteractionResponse"; + } | { + /** + * @generated from field: agent.v1.SwitchModeRequestResponse switch_mode_request_response = 4; + */ + value: SwitchModeRequestResponse; + case: "switchModeRequestResponse"; + } | { + /** + * @generated from field: agent.v1.ExaSearchRequestResponse exa_search_request_response = 5; + */ + value: ExaSearchRequestResponse; + case: "exaSearchRequestResponse"; + } | { + /** + * @generated from field: agent.v1.ExaFetchRequestResponse exa_fetch_request_response = 6; + */ + value: ExaFetchRequestResponse; + case: "exaFetchRequestResponse"; + } | { + /** + * @generated from field: agent.v1.CreatePlanRequestResponse create_plan_request_response = 7; + */ + value: CreatePlanRequestResponse; + case: "createPlanRequestResponse"; + } | { + /** + * @generated from field: agent.v1.SetupVmEnvironmentResult setup_vm_environment_result = 8; + */ + value: SetupVmEnvironmentResult; + case: "setupVmEnvironmentResult"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.InteractionResponse. + * Use `create(InteractionResponseSchema)` to create a new message. + */ +export declare const InteractionResponseSchema: GenMessage; +/** + * @generated from message agent.v1.AskQuestionInteractionQuery + */ +export type AskQuestionInteractionQuery = Message<"agent.v1.AskQuestionInteractionQuery"> & { + /** + * @generated from field: agent.v1.AskQuestionArgs args = 1; + */ + args?: AskQuestionArgs; + /** + * @generated from field: string tool_call_id = 2; + */ + toolCallId: string; +}; +/** + * Describes the message agent.v1.AskQuestionInteractionQuery. + * Use `create(AskQuestionInteractionQuerySchema)` to create a new message. + */ +export declare const AskQuestionInteractionQuerySchema: GenMessage; +/** + * @generated from message agent.v1.AskQuestionInteractionResponse + */ +export type AskQuestionInteractionResponse = Message<"agent.v1.AskQuestionInteractionResponse"> & { + /** + * @generated from field: agent.v1.AskQuestionResult result = 1; + */ + result?: AskQuestionResult; +}; +/** + * Describes the message agent.v1.AskQuestionInteractionResponse. + * Use `create(AskQuestionInteractionResponseSchema)` to create a new message. + */ +export declare const AskQuestionInteractionResponseSchema: GenMessage; +/** + * @generated from message agent.v1.ClientHeartbeat + */ +export type ClientHeartbeat = Message<"agent.v1.ClientHeartbeat"> & {}; +/** + * Describes the message agent.v1.ClientHeartbeat. + * Use `create(ClientHeartbeatSchema)` to create a new message. + */ +export declare const ClientHeartbeatSchema: GenMessage; +/** + * Prewarm request - sent before the actual action to prepare the backend Contains all config needed for auth, model routing, and session building The actual ConversationAction is sent separately after prewarming completes + * + * @generated from message agent.v1.PrewarmRequest + */ +export type PrewarmRequest = Message<"agent.v1.PrewarmRequest"> & { + /** + * @generated from field: agent.v1.ModelDetails model_details = 1; + */ + modelDetails?: ModelDetails; + /** + * @generated from field: optional agent.v1.RequestedModel requested_model = 9; + */ + requestedModel?: RequestedModel; + /** + * @generated from field: optional string conversation_id = 2; + */ + conversationId?: string; + /** + * @generated from field: agent.v1.ConversationStateStructure conversation_state = 3; + */ + conversationState?: ConversationStateStructure; + /** + * @generated from field: agent.v1.McpTools mcp_tools = 4; + */ + mcpTools?: McpTools; + /** + * @generated from field: optional agent.v1.McpFileSystemOptions mcp_file_system_options = 5; + */ + mcpFileSystemOptions?: McpFileSystemOptions; + /** + * Best-of-N context for usage billing (same fields as UserMessage) + * + * @generated from field: optional string best_of_n_group_id = 6; + */ + bestOfNGroupId?: string; + /** + * @generated from field: optional bool try_use_best_of_n_promotion = 7; + */ + tryUseBestOfNPromotion?: boolean; + /** + * Custom system prompt override. Allowlisted for specific teams only. + * + * @generated from field: optional string custom_system_prompt = 8; + */ + customSystemPrompt?: string; +}; +/** + * Describes the message agent.v1.PrewarmRequest. + * Use `create(PrewarmRequestSchema)` to create a new message. + */ +export declare const PrewarmRequestSchema: GenMessage; +/** + * @generated from message agent.v1.ExecServerAbort + */ +export type ExecServerAbort = Message<"agent.v1.ExecServerAbort"> & { + /** + * @generated from field: uint32 id = 1; + */ + id: number; +}; +/** + * Describes the message agent.v1.ExecServerAbort. + * Use `create(ExecServerAbortSchema)` to create a new message. + */ +export declare const ExecServerAbortSchema: GenMessage; +/** + * @generated from message agent.v1.ExecServerControlMessage + */ +export type ExecServerControlMessage = Message<"agent.v1.ExecServerControlMessage"> & { + /** + * @generated from oneof agent.v1.ExecServerControlMessage.message + */ + message: { + /** + * @generated from field: agent.v1.ExecServerAbort abort = 1; + */ + value: ExecServerAbort; + case: "abort"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ExecServerControlMessage. + * Use `create(ExecServerControlMessageSchema)` to create a new message. + */ +export declare const ExecServerControlMessageSchema: GenMessage; +/** + * @generated from message agent.v1.AgentClientMessage + */ +export type AgentClientMessage = Message<"agent.v1.AgentClientMessage"> & { + /** + * @generated from oneof agent.v1.AgentClientMessage.message + */ + message: { + /** + * @generated from field: agent.v1.AgentRunRequest run_request = 1; + */ + value: AgentRunRequest; + case: "runRequest"; + } | { + /** + * @generated from field: agent.v1.ExecClientMessage exec_client_message = 2; + */ + value: ExecClientMessage; + case: "execClientMessage"; + } | { + /** + * @generated from field: agent.v1.ExecClientControlMessage exec_client_control_message = 5; + */ + value: ExecClientControlMessage; + case: "execClientControlMessage"; + } | { + /** + * @generated from field: agent.v1.KvClientMessage kv_client_message = 3; + */ + value: KvClientMessage; + case: "kvClientMessage"; + } | { + /** + * @generated from field: agent.v1.ConversationAction conversation_action = 4; + */ + value: ConversationAction; + case: "conversationAction"; + } | { + /** + * @generated from field: agent.v1.InteractionResponse interaction_response = 6; + */ + value: InteractionResponse; + case: "interactionResponse"; + } | { + /** + * @generated from field: agent.v1.ClientHeartbeat client_heartbeat = 7; + */ + value: ClientHeartbeat; + case: "clientHeartbeat"; + } | { + /** + * @generated from field: agent.v1.PrewarmRequest prewarm_request = 8; + */ + value: PrewarmRequest; + case: "prewarmRequest"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.AgentClientMessage. + * Use `create(AgentClientMessageSchema)` to create a new message. + */ +export declare const AgentClientMessageSchema: GenMessage; +/** + * @generated from message agent.v1.AgentServerMessage + */ +export type AgentServerMessage = Message<"agent.v1.AgentServerMessage"> & { + /** + * @generated from oneof agent.v1.AgentServerMessage.message + */ + message: { + /** + * @generated from field: agent.v1.InteractionUpdate interaction_update = 1; + */ + value: InteractionUpdate; + case: "interactionUpdate"; + } | { + /** + * @generated from field: agent.v1.ExecServerMessage exec_server_message = 2; + */ + value: ExecServerMessage; + case: "execServerMessage"; + } | { + /** + * @generated from field: agent.v1.ExecServerControlMessage exec_server_control_message = 5; + */ + value: ExecServerControlMessage; + case: "execServerControlMessage"; + } | { + /** + * @generated from field: agent.v1.ConversationStateStructure conversation_checkpoint_update = 3; + */ + value: ConversationStateStructure; + case: "conversationCheckpointUpdate"; + } | { + /** + * @generated from field: agent.v1.KvServerMessage kv_server_message = 4; + */ + value: KvServerMessage; + case: "kvServerMessage"; + } | { + /** + * @generated from field: agent.v1.InteractionQuery interaction_query = 7; + */ + value: InteractionQuery; + case: "interactionQuery"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.AgentServerMessage. + * Use `create(AgentServerMessageSchema)` to create a new message. + */ +export declare const AgentServerMessageSchema: GenMessage; +/** + * New unary API for naming an agent from a user message + * + * @generated from message agent.v1.NameAgentRequest + */ +export type NameAgentRequest = Message<"agent.v1.NameAgentRequest"> & { + /** + * @generated from field: string user_message = 1; + */ + userMessage: string; +}; +/** + * Describes the message agent.v1.NameAgentRequest. + * Use `create(NameAgentRequestSchema)` to create a new message. + */ +export declare const NameAgentRequestSchema: GenMessage; +/** + * @generated from message agent.v1.NameAgentResponse + */ +export type NameAgentResponse = Message<"agent.v1.NameAgentResponse"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; +/** + * Describes the message agent.v1.NameAgentResponse. + * Use `create(NameAgentResponseSchema)` to create a new message. + */ +export declare const NameAgentResponseSchema: GenMessage; +/** + * @generated from message agent.v1.GetUsableModelsRequest + */ +export type GetUsableModelsRequest = Message<"agent.v1.GetUsableModelsRequest"> & { + /** + * Not used right now, but can use to populate info about custom models the user passes in that we don't send down by default + * + * @generated from field: repeated string custom_model_ids = 1; + */ + customModelIds: string[]; +}; +/** + * Describes the message agent.v1.GetUsableModelsRequest. + * Use `create(GetUsableModelsRequestSchema)` to create a new message. + */ +export declare const GetUsableModelsRequestSchema: GenMessage; +/** + * @generated from message agent.v1.GetUsableModelsResponse + */ +export type GetUsableModelsResponse = Message<"agent.v1.GetUsableModelsResponse"> & { + /** + * @generated from field: repeated agent.v1.ModelDetails models = 1; + */ + models: ModelDetails[]; +}; +/** + * Describes the message agent.v1.GetUsableModelsResponse. + * Use `create(GetUsableModelsResponseSchema)` to create a new message. + */ +export declare const GetUsableModelsResponseSchema: GenMessage; +/** + * @generated from message agent.v1.GetDefaultModelForCliRequest + */ +export type GetDefaultModelForCliRequest = Message<"agent.v1.GetDefaultModelForCliRequest"> & {}; +/** + * Describes the message agent.v1.GetDefaultModelForCliRequest. + * Use `create(GetDefaultModelForCliRequestSchema)` to create a new message. + */ +export declare const GetDefaultModelForCliRequestSchema: GenMessage; +/** + * @generated from message agent.v1.GetDefaultModelForCliResponse + */ +export type GetDefaultModelForCliResponse = Message<"agent.v1.GetDefaultModelForCliResponse"> & { + /** + * @generated from field: agent.v1.ModelDetails model = 1; + */ + model?: ModelDetails; +}; +/** + * Describes the message agent.v1.GetDefaultModelForCliResponse. + * Use `create(GetDefaultModelForCliResponseSchema)` to create a new message. + */ +export declare const GetDefaultModelForCliResponseSchema: GenMessage; +/** + * Internal endpoint: returns all allowed model intents for devs + * + * @generated from message agent.v1.GetAllowedModelIntentsRequest + */ +export type GetAllowedModelIntentsRequest = Message<"agent.v1.GetAllowedModelIntentsRequest"> & {}; +/** + * Describes the message agent.v1.GetAllowedModelIntentsRequest. + * Use `create(GetAllowedModelIntentsRequestSchema)` to create a new message. + */ +export declare const GetAllowedModelIntentsRequestSchema: GenMessage; +/** + * @generated from message agent.v1.GetAllowedModelIntentsResponse + */ +export type GetAllowedModelIntentsResponse = Message<"agent.v1.GetAllowedModelIntentsResponse"> & { + /** + * @generated from field: repeated string model_intents = 1; + */ + modelIntents: string[]; +}; +/** + * Describes the message agent.v1.GetAllowedModelIntentsResponse. + * Use `create(GetAllowedModelIntentsResponseSchema)` to create a new message. + */ +export declare const GetAllowedModelIntentsResponseSchema: GenMessage; +/** + * IDE state persistence for clients (CLI / VSCode integration) Mirrors a subset of aiserver.v1.ConversationMessage.IdeEditorsState, but only contains the recently viewed files and avoids any deprecated fields. + * + * @generated from message agent.v1.IdeEditorsStateFile + */ +export type IdeEditorsStateFile = Message<"agent.v1.IdeEditorsStateFile"> & { + /** + * @generated from field: string relative_path = 1; + */ + relativePath: string; + /** + * @generated from field: string absolute_path = 2; + */ + absolutePath: string; + /** + * @generated from field: optional bool is_currently_focused = 3; + */ + isCurrentlyFocused?: boolean; + /** + * @generated from field: optional int32 current_line_number = 4; + */ + currentLineNumber?: number; + /** + * @generated from field: optional string current_line_text = 5; + */ + currentLineText?: string; + /** + * @generated from field: optional int32 line_count = 6; + */ + lineCount?: number; +}; +/** + * Describes the message agent.v1.IdeEditorsStateFile. + * Use `create(IdeEditorsStateFileSchema)` to create a new message. + */ +export declare const IdeEditorsStateFileSchema: GenMessage; +/** + * @generated from message agent.v1.IdeEditorsStateLite + */ +export type IdeEditorsStateLite = Message<"agent.v1.IdeEditorsStateLite"> & { + /** + * @generated from field: repeated agent.v1.IdeEditorsStateFile recently_viewed_files = 1; + */ + recentlyViewedFiles: IdeEditorsStateFile[]; +}; +/** + * Describes the message agent.v1.IdeEditorsStateLite. + * Use `create(IdeEditorsStateLiteSchema)` to create a new message. + */ +export declare const IdeEditorsStateLiteSchema: GenMessage; +/** + * @generated from message agent.v1.ApplyAgentDiffToolCall + */ +export type ApplyAgentDiffToolCall = Message<"agent.v1.ApplyAgentDiffToolCall"> & { + /** + * @generated from field: agent.v1.ApplyAgentDiffArgs args = 1; + */ + args?: ApplyAgentDiffArgs; + /** + * @generated from field: agent.v1.ApplyAgentDiffResult result = 2; + */ + result?: ApplyAgentDiffResult; +}; +/** + * Describes the message agent.v1.ApplyAgentDiffToolCall. + * Use `create(ApplyAgentDiffToolCallSchema)` to create a new message. + */ +export declare const ApplyAgentDiffToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.ApplyAgentDiffArgs + */ +export type ApplyAgentDiffArgs = Message<"agent.v1.ApplyAgentDiffArgs"> & { + /** + * @generated from field: string agent_id = 1; + */ + agentId: string; +}; +/** + * Describes the message agent.v1.ApplyAgentDiffArgs. + * Use `create(ApplyAgentDiffArgsSchema)` to create a new message. + */ +export declare const ApplyAgentDiffArgsSchema: GenMessage; +/** + * @generated from message agent.v1.ApplyAgentDiffResult + */ +export type ApplyAgentDiffResult = Message<"agent.v1.ApplyAgentDiffResult"> & { + /** + * @generated from oneof agent.v1.ApplyAgentDiffResult.result + */ + result: { + /** + * @generated from field: agent.v1.ApplyAgentDiffSuccess success = 1; + */ + value: ApplyAgentDiffSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.ApplyAgentDiffError error = 2; + */ + value: ApplyAgentDiffError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ApplyAgentDiffResult. + * Use `create(ApplyAgentDiffResultSchema)` to create a new message. + */ +export declare const ApplyAgentDiffResultSchema: GenMessage; +/** + * @generated from message agent.v1.ApplyAgentDiffSuccess + */ +export type ApplyAgentDiffSuccess = Message<"agent.v1.ApplyAgentDiffSuccess"> & { + /** + * @generated from field: repeated agent.v1.AppliedAgentChange applied_changes = 1; + */ + appliedChanges: AppliedAgentChange[]; +}; +/** + * Describes the message agent.v1.ApplyAgentDiffSuccess. + * Use `create(ApplyAgentDiffSuccessSchema)` to create a new message. + */ +export declare const ApplyAgentDiffSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.AppliedAgentChange + */ +export type AppliedAgentChange = Message<"agent.v1.AppliedAgentChange"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: int32 change_type = 2; + */ + changeType: number; + /** + * @generated from field: optional string before_content = 3; + */ + beforeContent?: string; + /** + * @generated from field: optional string after_content = 4; + */ + afterContent?: string; + /** + * @generated from field: optional string error = 5; + */ + error?: string; + /** + * Detailed result message from the execution (e.g., "Successfully deleted file: path (123 bytes)") + * + * @generated from field: optional string message_for_model = 6; + */ + messageForModel?: string; +}; +/** + * Describes the message agent.v1.AppliedAgentChange. + * Use `create(AppliedAgentChangeSchema)` to create a new message. + */ +export declare const AppliedAgentChangeSchema: GenMessage; +/** + * @generated from message agent.v1.ApplyAgentDiffError + */ +export type ApplyAgentDiffError = Message<"agent.v1.ApplyAgentDiffError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; + /** + * @generated from field: repeated agent.v1.AppliedAgentChange applied_changes = 2; + */ + appliedChanges: AppliedAgentChange[]; +}; +/** + * Describes the message agent.v1.ApplyAgentDiffError. + * Use `create(ApplyAgentDiffErrorSchema)` to create a new message. + */ +export declare const ApplyAgentDiffErrorSchema: GenMessage; +/** + * @generated from message agent.v1.AskQuestionToolCall + */ +export type AskQuestionToolCall = Message<"agent.v1.AskQuestionToolCall"> & { + /** + * @generated from field: agent.v1.AskQuestionArgs args = 1; + */ + args?: AskQuestionArgs; + /** + * @generated from field: agent.v1.AskQuestionResult result = 2; + */ + result?: AskQuestionResult; +}; +/** + * Describes the message agent.v1.AskQuestionToolCall. + * Use `create(AskQuestionToolCallSchema)` to create a new message. + */ +export declare const AskQuestionToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.AskQuestionArgs + */ +export type AskQuestionArgs = Message<"agent.v1.AskQuestionArgs"> & { + /** + * optional form title + * + * @generated from field: string title = 1; + */ + title: string; + /** + * 1+ questions + * + * @generated from field: repeated agent.v1.AskQuestionArgs_Question questions = 2; + */ + questions: AskQuestionArgs_Question[]; + /** + * if true, return immediately with async marker instead of blocking + * + * @generated from field: bool run_async = 5; + */ + runAsync: boolean; + /** + * if set, indicates this is a synthetic completion for the original async tool call with this ID + * + * @generated from field: string async_original_tool_call_id = 6; + */ + asyncOriginalToolCallId: string; +}; +/** + * Describes the message agent.v1.AskQuestionArgs. + * Use `create(AskQuestionArgsSchema)` to create a new message. + */ +export declare const AskQuestionArgsSchema: GenMessage; +/** + * @generated from message agent.v1.AskQuestionArgs_Question + */ +export type AskQuestionArgs_Question = Message<"agent.v1.AskQuestionArgs_Question"> & { + /** + * unique, model-provided + * + * @generated from field: string id = 1; + */ + id: string; + /** + * the question text + * + * @generated from field: string prompt = 2; + */ + prompt: string; + /** + * choices + * + * @generated from field: repeated agent.v1.AskQuestionArgs_Option options = 3; + */ + options: AskQuestionArgs_Option[]; + /** + * multi-select vs single-select + * + * @generated from field: bool allow_multiple = 4; + */ + allowMultiple: boolean; +}; +/** + * Describes the message agent.v1.AskQuestionArgs_Question. + * Use `create(AskQuestionArgs_QuestionSchema)` to create a new message. + */ +export declare const AskQuestionArgs_QuestionSchema: GenMessage; +/** + * @generated from message agent.v1.AskQuestionArgs_Option + */ +export type AskQuestionArgs_Option = Message<"agent.v1.AskQuestionArgs_Option"> & { + /** + * stable option id + * + * @generated from field: string id = 1; + */ + id: string; + /** + * display text + * + * @generated from field: string label = 2; + */ + label: string; +}; +/** + * Describes the message agent.v1.AskQuestionArgs_Option. + * Use `create(AskQuestionArgs_OptionSchema)` to create a new message. + */ +export declare const AskQuestionArgs_OptionSchema: GenMessage; +/** + * Marker indicating that questions have been sent asynchronously Answers will arrive later as a separate ask_question tool call + * + * @generated from message agent.v1.AskQuestionAsync + */ +export type AskQuestionAsync = Message<"agent.v1.AskQuestionAsync"> & {}; +/** + * Describes the message agent.v1.AskQuestionAsync. + * Use `create(AskQuestionAsyncSchema)` to create a new message. + */ +export declare const AskQuestionAsyncSchema: GenMessage; +/** + * @generated from message agent.v1.AskQuestionResult + */ +export type AskQuestionResult = Message<"agent.v1.AskQuestionResult"> & { + /** + * @generated from oneof agent.v1.AskQuestionResult.result + */ + result: { + /** + * @generated from field: agent.v1.AskQuestionSuccess success = 1; + */ + value: AskQuestionSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.AskQuestionError error = 2; + */ + value: AskQuestionError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.AskQuestionRejected rejected = 3; + */ + value: AskQuestionRejected; + case: "rejected"; + } | { + /** + * @generated from field: agent.v1.AskQuestionAsync async = 4; + */ + value: AskQuestionAsync; + case: "async"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.AskQuestionResult. + * Use `create(AskQuestionResultSchema)` to create a new message. + */ +export declare const AskQuestionResultSchema: GenMessage; +/** + * @generated from message agent.v1.AskQuestionSuccess + */ +export type AskQuestionSuccess = Message<"agent.v1.AskQuestionSuccess"> & { + /** + * @generated from field: repeated agent.v1.AskQuestionSuccess_Answer answers = 1; + */ + answers: AskQuestionSuccess_Answer[]; +}; +/** + * Describes the message agent.v1.AskQuestionSuccess. + * Use `create(AskQuestionSuccessSchema)` to create a new message. + */ +export declare const AskQuestionSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.AskQuestionSuccess_Answer + */ +export type AskQuestionSuccess_Answer = Message<"agent.v1.AskQuestionSuccess_Answer"> & { + /** + * @generated from field: string question_id = 1; + */ + questionId: string; + /** + * empty if unanswered + * + * @generated from field: repeated string selected_option_ids = 2; + */ + selectedOptionIds: string[]; +}; +/** + * Describes the message agent.v1.AskQuestionSuccess_Answer. + * Use `create(AskQuestionSuccess_AnswerSchema)` to create a new message. + */ +export declare const AskQuestionSuccess_AnswerSchema: GenMessage; +/** + * @generated from message agent.v1.AskQuestionError + */ +export type AskQuestionError = Message<"agent.v1.AskQuestionError"> & { + /** + * @generated from field: string error_message = 1; + */ + errorMessage: string; +}; +/** + * Describes the message agent.v1.AskQuestionError. + * Use `create(AskQuestionErrorSchema)` to create a new message. + */ +export declare const AskQuestionErrorSchema: GenMessage; +/** + * @generated from message agent.v1.AskQuestionRejected + */ +export type AskQuestionRejected = Message<"agent.v1.AskQuestionRejected"> & { + /** + * @generated from field: string reason = 1; + */ + reason: string; +}; +/** + * Describes the message agent.v1.AskQuestionRejected. + * Use `create(AskQuestionRejectedSchema)` to create a new message. + */ +export declare const AskQuestionRejectedSchema: GenMessage; +/** + * @generated from message agent.v1.BackgroundShellSpawnArgs + */ +export type BackgroundShellSpawnArgs = Message<"agent.v1.BackgroundShellSpawnArgs"> & { + /** + * @generated from field: string command = 1; + */ + command: string; + /** + * @generated from field: string working_directory = 2; + */ + workingDirectory: string; + /** + * @generated from field: string tool_call_id = 3; + */ + toolCallId: string; + /** + * @generated from field: agent.v1.ShellCommandParsingResult parsing_result = 4; + */ + parsingResult?: ShellCommandParsingResult; + /** + * @generated from field: optional agent.v1.SandboxPolicy sandbox_policy = 5; + */ + sandboxPolicy?: SandboxPolicy; + /** + * @generated from field: bool enable_write_shell_stdin_tool = 6; + */ + enableWriteShellStdinTool: boolean; +}; +/** + * Describes the message agent.v1.BackgroundShellSpawnArgs. + * Use `create(BackgroundShellSpawnArgsSchema)` to create a new message. + */ +export declare const BackgroundShellSpawnArgsSchema: GenMessage; +/** + * Result of spawning a background shell + * + * @generated from message agent.v1.BackgroundShellSpawnResult + */ +export type BackgroundShellSpawnResult = Message<"agent.v1.BackgroundShellSpawnResult"> & { + /** + * @generated from oneof agent.v1.BackgroundShellSpawnResult.result + */ + result: { + /** + * @generated from field: agent.v1.BackgroundShellSpawnSuccess success = 1; + */ + value: BackgroundShellSpawnSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.BackgroundShellSpawnError error = 2; + */ + value: BackgroundShellSpawnError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.ShellRejected rejected = 3; + */ + value: ShellRejected; + case: "rejected"; + } | { + /** + * @generated from field: agent.v1.ShellPermissionDenied permission_denied = 4; + */ + value: ShellPermissionDenied; + case: "permissionDenied"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.BackgroundShellSpawnResult. + * Use `create(BackgroundShellSpawnResultSchema)` to create a new message. + */ +export declare const BackgroundShellSpawnResultSchema: GenMessage; +/** + * @generated from message agent.v1.BackgroundShellSpawnSuccess + */ +export type BackgroundShellSpawnSuccess = Message<"agent.v1.BackgroundShellSpawnSuccess"> & { + /** + * @generated from field: uint32 shell_id = 1; + */ + shellId: number; + /** + * @generated from field: string command = 2; + */ + command: string; + /** + * @generated from field: string working_directory = 3; + */ + workingDirectory: string; + /** + * Process ID of the spawned shell + * + * @generated from field: optional uint32 pid = 4; + */ + pid?: number; +}; +/** + * Describes the message agent.v1.BackgroundShellSpawnSuccess. + * Use `create(BackgroundShellSpawnSuccessSchema)` to create a new message. + */ +export declare const BackgroundShellSpawnSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.BackgroundShellSpawnError + */ +export type BackgroundShellSpawnError = Message<"agent.v1.BackgroundShellSpawnError"> & { + /** + * @generated from field: string command = 1; + */ + command: string; + /** + * @generated from field: string working_directory = 2; + */ + workingDirectory: string; + /** + * @generated from field: string error = 3; + */ + error: string; +}; +/** + * Describes the message agent.v1.BackgroundShellSpawnError. + * Use `create(BackgroundShellSpawnErrorSchema)` to create a new message. + */ +export declare const BackgroundShellSpawnErrorSchema: GenMessage; +/** + * @generated from message agent.v1.WriteShellStdinArgs + */ +export type WriteShellStdinArgs = Message<"agent.v1.WriteShellStdinArgs"> & { + /** + * @generated from field: uint32 shell_id = 1; + */ + shellId: number; + /** + * @generated from field: string chars = 2; + */ + chars: string; +}; +/** + * Describes the message agent.v1.WriteShellStdinArgs. + * Use `create(WriteShellStdinArgsSchema)` to create a new message. + */ +export declare const WriteShellStdinArgsSchema: GenMessage; +/** + * @generated from message agent.v1.WriteShellStdinResult + */ +export type WriteShellStdinResult = Message<"agent.v1.WriteShellStdinResult"> & { + /** + * @generated from oneof agent.v1.WriteShellStdinResult.result + */ + result: { + /** + * @generated from field: agent.v1.WriteShellStdinSuccess success = 1; + */ + value: WriteShellStdinSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.WriteShellStdinError error = 2; + */ + value: WriteShellStdinError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.WriteShellStdinResult. + * Use `create(WriteShellStdinResultSchema)` to create a new message. + */ +export declare const WriteShellStdinResultSchema: GenMessage; +/** + * @generated from message agent.v1.WriteShellStdinSuccess + */ +export type WriteShellStdinSuccess = Message<"agent.v1.WriteShellStdinSuccess"> & { + /** + * @generated from field: uint32 shell_id = 1; + */ + shellId: number; + /** + * @generated from field: uint32 terminal_file_length_before_input_written = 2; + */ + terminalFileLengthBeforeInputWritten: number; +}; +/** + * Describes the message agent.v1.WriteShellStdinSuccess. + * Use `create(WriteShellStdinSuccessSchema)` to create a new message. + */ +export declare const WriteShellStdinSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.WriteShellStdinError + */ +export type WriteShellStdinError = Message<"agent.v1.WriteShellStdinError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.WriteShellStdinError. + * Use `create(WriteShellStdinErrorSchema)` to create a new message. + */ +export declare const WriteShellStdinErrorSchema: GenMessage; +/** + * @generated from message agent.v1.Coordinate + */ +export type Coordinate = Message<"agent.v1.Coordinate"> & { + /** + * @generated from field: int32 x = 1; + */ + x: number; + /** + * @generated from field: int32 y = 2; + */ + y: number; +}; +/** + * Describes the message agent.v1.Coordinate. + * Use `create(CoordinateSchema)` to create a new message. + */ +export declare const CoordinateSchema: GenMessage; +/** + * Arguments for the computer-use tool + * + * @generated from message agent.v1.ComputerUseArgs + */ +export type ComputerUseArgs = Message<"agent.v1.ComputerUseArgs"> & { + /** + * @generated from field: string tool_call_id = 1; + */ + toolCallId: string; + /** + * @generated from field: repeated agent.v1.ComputerUseAction actions = 2; + */ + actions: ComputerUseAction[]; +}; +/** + * Describes the message agent.v1.ComputerUseArgs. + * Use `create(ComputerUseArgsSchema)` to create a new message. + */ +export declare const ComputerUseArgsSchema: GenMessage; +/** + * A single computer-use action. This is our internal canonical representation. Provider-specific formats are converted to this by adapters. + * + * @generated from message agent.v1.ComputerUseAction + */ +export type ComputerUseAction = Message<"agent.v1.ComputerUseAction"> & { + /** + * @generated from oneof agent.v1.ComputerUseAction.action + */ + action: { + /** + * @generated from field: agent.v1.MouseMoveAction mouse_move = 1; + */ + value: MouseMoveAction; + case: "mouseMove"; + } | { + /** + * @generated from field: agent.v1.ClickAction click = 2; + */ + value: ClickAction; + case: "click"; + } | { + /** + * @generated from field: agent.v1.MouseDownAction mouse_down = 3; + */ + value: MouseDownAction; + case: "mouseDown"; + } | { + /** + * @generated from field: agent.v1.MouseUpAction mouse_up = 4; + */ + value: MouseUpAction; + case: "mouseUp"; + } | { + /** + * @generated from field: agent.v1.DragAction drag = 5; + */ + value: DragAction; + case: "drag"; + } | { + /** + * @generated from field: agent.v1.ScrollAction scroll = 6; + */ + value: ScrollAction; + case: "scroll"; + } | { + /** + * @generated from field: agent.v1.TypeAction type = 7; + */ + value: TypeAction; + case: "type"; + } | { + /** + * @generated from field: agent.v1.KeyAction key = 8; + */ + value: KeyAction; + case: "key"; + } | { + /** + * @generated from field: agent.v1.WaitAction wait = 9; + */ + value: WaitAction; + case: "wait"; + } | { + /** + * @generated from field: agent.v1.ScreenshotAction screenshot = 10; + */ + value: ScreenshotAction; + case: "screenshot"; + } | { + /** + * @generated from field: agent.v1.CursorPositionAction cursor_position = 11; + */ + value: CursorPositionAction; + case: "cursorPosition"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ComputerUseAction. + * Use `create(ComputerUseActionSchema)` to create a new message. + */ +export declare const ComputerUseActionSchema: GenMessage; +/** + * Move mouse to coordinate (required) + * + * @generated from message agent.v1.MouseMoveAction + */ +export type MouseMoveAction = Message<"agent.v1.MouseMoveAction"> & { + /** + * @generated from field: agent.v1.Coordinate coordinate = 1; + */ + coordinate?: Coordinate; +}; +/** + * Describes the message agent.v1.MouseMoveAction. + * Use `create(MouseMoveActionSchema)` to create a new message. + */ +export declare const MouseMoveActionSchema: GenMessage; +/** + * Unified click action - coordinate: optional, clicks at current cursor if omitted - button: which mouse button (default: LEFT) - count: click count (1=single, 2=double, 3=triple, default: 1) - modifier_keys: optional, held during click (e.g., "ctrl", "shift", "ctrl+shift") + * + * @generated from message agent.v1.ClickAction + */ +export type ClickAction = Message<"agent.v1.ClickAction"> & { + /** + * @generated from field: optional agent.v1.Coordinate coordinate = 1; + */ + coordinate?: Coordinate; + /** + * @generated from field: int32 button = 2; + */ + button: number; + /** + * @generated from field: int32 count = 3; + */ + count: number; + /** + * @generated from field: optional string modifier_keys = 4; + */ + modifierKeys?: string; +}; +/** + * Describes the message agent.v1.ClickAction. + * Use `create(ClickActionSchema)` to create a new message. + */ +export declare const ClickActionSchema: GenMessage; +/** + * Press mouse button down (for fine-grained drag control) + * + * @generated from message agent.v1.MouseDownAction + */ +export type MouseDownAction = Message<"agent.v1.MouseDownAction"> & { + /** + * @generated from field: int32 button = 1; + */ + button: number; +}; +/** + * Describes the message agent.v1.MouseDownAction. + * Use `create(MouseDownActionSchema)` to create a new message. + */ +export declare const MouseDownActionSchema: GenMessage; +/** + * Release mouse button (for fine-grained drag control) + * + * @generated from message agent.v1.MouseUpAction + */ +export type MouseUpAction = Message<"agent.v1.MouseUpAction"> & { + /** + * @generated from field: int32 button = 1; + */ + button: number; +}; +/** + * Describes the message agent.v1.MouseUpAction. + * Use `create(MouseUpActionSchema)` to create a new message. + */ +export declare const MouseUpActionSchema: GenMessage; +/** + * Drag action - path of coordinates (at least 2 points: [start, ..., end]) + * + * @generated from message agent.v1.DragAction + */ +export type DragAction = Message<"agent.v1.DragAction"> & { + /** + * @generated from field: repeated agent.v1.Coordinate path = 1; + */ + path: Coordinate[]; + /** + * @generated from field: int32 button = 2; + */ + button: number; +}; +/** + * Describes the message agent.v1.DragAction. + * Use `create(DragActionSchema)` to create a new message. + */ +export declare const DragActionSchema: GenMessage; +/** + * Scroll action - coordinate: optional, scrolls at current cursor if omitted - direction: scroll direction (required) - amount: number of scroll "clicks" (default: 3) - modifier_keys: optional, held during scroll (e.g., "ctrl" for zoom) + * + * @generated from message agent.v1.ScrollAction + */ +export type ScrollAction = Message<"agent.v1.ScrollAction"> & { + /** + * @generated from field: optional agent.v1.Coordinate coordinate = 1; + */ + coordinate?: Coordinate; + /** + * @generated from field: int32 direction = 2; + */ + direction: number; + /** + * @generated from field: int32 amount = 3; + */ + amount: number; + /** + * @generated from field: optional string modifier_keys = 4; + */ + modifierKeys?: string; +}; +/** + * Describes the message agent.v1.ScrollAction. + * Use `create(ScrollActionSchema)` to create a new message. + */ +export declare const ScrollActionSchema: GenMessage; +/** + * Type text + * + * @generated from message agent.v1.TypeAction + */ +export type TypeAction = Message<"agent.v1.TypeAction"> & { + /** + * @generated from field: string text = 1; + */ + text: string; +}; +/** + * Describes the message agent.v1.TypeAction. + * Use `create(TypeActionSchema)` to create a new message. + */ +export declare const TypeActionSchema: GenMessage; +/** + * Press key or key combination (xdotool-style: "ctrl+a", "Return", "Alt+Left") If hold_duration_ms is set, holds the key for that duration + * + * @generated from message agent.v1.KeyAction + */ +export type KeyAction = Message<"agent.v1.KeyAction"> & { + /** + * @generated from field: string key = 1; + */ + key: string; + /** + * @generated from field: optional int32 hold_duration_ms = 2; + */ + holdDurationMs?: number; +}; +/** + * Describes the message agent.v1.KeyAction. + * Use `create(KeyActionSchema)` to create a new message. + */ +export declare const KeyActionSchema: GenMessage; +/** + * Wait for a duration + * + * @generated from message agent.v1.WaitAction + */ +export type WaitAction = Message<"agent.v1.WaitAction"> & { + /** + * @generated from field: int32 duration_ms = 1; + */ + durationMs: number; +}; +/** + * Describes the message agent.v1.WaitAction. + * Use `create(WaitActionSchema)` to create a new message. + */ +export declare const WaitActionSchema: GenMessage; +/** + * Take a screenshot + * + * @generated from message agent.v1.ScreenshotAction + */ +export type ScreenshotAction = Message<"agent.v1.ScreenshotAction"> & {}; +/** + * Describes the message agent.v1.ScreenshotAction. + * Use `create(ScreenshotActionSchema)` to create a new message. + */ +export declare const ScreenshotActionSchema: GenMessage; +/** + * Get current cursor position + * + * @generated from message agent.v1.CursorPositionAction + */ +export type CursorPositionAction = Message<"agent.v1.CursorPositionAction"> & {}; +/** + * Describes the message agent.v1.CursorPositionAction. + * Use `create(CursorPositionActionSchema)` to create a new message. + */ +export declare const CursorPositionActionSchema: GenMessage; +/** + * Result of computer-use execution + * + * @generated from message agent.v1.ComputerUseResult + */ +export type ComputerUseResult = Message<"agent.v1.ComputerUseResult"> & { + /** + * @generated from oneof agent.v1.ComputerUseResult.result + */ + result: { + /** + * @generated from field: agent.v1.ComputerUseSuccess success = 1; + */ + value: ComputerUseSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.ComputerUseError error = 2; + */ + value: ComputerUseError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ComputerUseResult. + * Use `create(ComputerUseResultSchema)` to create a new message. + */ +export declare const ComputerUseResultSchema: GenMessage; +/** + * @generated from message agent.v1.ComputerUseSuccess + */ +export type ComputerUseSuccess = Message<"agent.v1.ComputerUseSuccess"> & { + /** + * @generated from field: int32 action_count = 1; + */ + actionCount: number; + /** + * @generated from field: int32 duration_ms = 2; + */ + durationMs: number; + /** + * Base64 WebP at API resolution + * + * @generated from field: optional string screenshot = 3; + */ + screenshot?: string; + /** + * @generated from field: optional string log = 4; + */ + log?: string; + /** + * @generated from field: optional string screenshot_path = 5; + */ + screenshotPath?: string; + /** + * In API resolution + * + * @generated from field: optional agent.v1.Coordinate cursor_position = 6; + */ + cursorPosition?: Coordinate; +}; +/** + * Describes the message agent.v1.ComputerUseSuccess. + * Use `create(ComputerUseSuccessSchema)` to create a new message. + */ +export declare const ComputerUseSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.ComputerUseError + */ +export type ComputerUseError = Message<"agent.v1.ComputerUseError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; + /** + * @generated from field: int32 action_count = 2; + */ + actionCount: number; + /** + * @generated from field: int32 duration_ms = 3; + */ + durationMs: number; + /** + * @generated from field: optional string log = 4; + */ + log?: string; + /** + * Base64 WebP of screen state at error time + * + * @generated from field: optional string screenshot = 5; + */ + screenshot?: string; + /** + * Path where screenshot was saved + * + * @generated from field: optional string screenshot_path = 6; + */ + screenshotPath?: string; +}; +/** + * Describes the message agent.v1.ComputerUseError. + * Use `create(ComputerUseErrorSchema)` to create a new message. + */ +export declare const ComputerUseErrorSchema: GenMessage; +/** + * @generated from message agent.v1.ComputerUseToolCall + */ +export type ComputerUseToolCall = Message<"agent.v1.ComputerUseToolCall"> & { + /** + * @generated from field: agent.v1.ComputerUseArgs args = 1; + */ + args?: ComputerUseArgs; + /** + * @generated from field: agent.v1.ComputerUseResult result = 2; + */ + result?: ComputerUseResult; +}; +/** + * Describes the message agent.v1.ComputerUseToolCall. + * Use `create(ComputerUseToolCallSchema)` to create a new message. + */ +export declare const ComputerUseToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.CreatePlanToolCall + */ +export type CreatePlanToolCall = Message<"agent.v1.CreatePlanToolCall"> & { + /** + * @generated from field: agent.v1.CreatePlanArgs args = 1; + */ + args?: CreatePlanArgs; + /** + * @generated from field: agent.v1.CreatePlanResult result = 2; + */ + result?: CreatePlanResult; +}; +/** + * Describes the message agent.v1.CreatePlanToolCall. + * Use `create(CreatePlanToolCallSchema)` to create a new message. + */ +export declare const CreatePlanToolCallSchema: GenMessage; +/** + * A phase groups related todos together for project-mode plans + * + * @generated from message agent.v1.Phase + */ +export type Phase = Message<"agent.v1.Phase"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + /** + * @generated from field: repeated agent.v1.TodoItem todos = 2; + */ + todos: TodoItem[]; +}; +/** + * Describes the message agent.v1.Phase. + * Use `create(PhaseSchema)` to create a new message. + */ +export declare const PhaseSchema: GenMessage; +/** + * @generated from message agent.v1.CreatePlanArgs + */ +export type CreatePlanArgs = Message<"agent.v1.CreatePlanArgs"> & { + /** + * @generated from field: string plan = 1; + */ + plan: string; + /** + * @generated from field: repeated agent.v1.TodoItem todos = 2; + */ + todos: TodoItem[]; + /** + * @generated from field: string overview = 3; + */ + overview: string; + /** + * @generated from field: string name = 4; + */ + name: string; + /** + * When true, uses phases instead of flat todos (mutually exclusive) + * + * @generated from field: bool is_project = 5; + */ + isProject: boolean; + /** + * Implementation phases (only valid when is_project=true) + * + * @generated from field: repeated agent.v1.Phase phases = 6; + */ + phases: Phase[]; +}; +/** + * Describes the message agent.v1.CreatePlanArgs. + * Use `create(CreatePlanArgsSchema)` to create a new message. + */ +export declare const CreatePlanArgsSchema: GenMessage; +/** + * @generated from message agent.v1.CreatePlanResult + */ +export type CreatePlanResult = Message<"agent.v1.CreatePlanResult"> & { + /** + * URI of the plan file (returned when file_based_plan_edits is enabled) + * + * @generated from field: string plan_uri = 3; + */ + planUri: string; + /** + * @generated from oneof agent.v1.CreatePlanResult.result + */ + result: { + /** + * @generated from field: agent.v1.CreatePlanSuccess success = 1; + */ + value: CreatePlanSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.CreatePlanError error = 2; + */ + value: CreatePlanError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.CreatePlanResult. + * Use `create(CreatePlanResultSchema)` to create a new message. + */ +export declare const CreatePlanResultSchema: GenMessage; +/** + * @generated from message agent.v1.CreatePlanSuccess + */ +export type CreatePlanSuccess = Message<"agent.v1.CreatePlanSuccess"> & {}; +/** + * Describes the message agent.v1.CreatePlanSuccess. + * Use `create(CreatePlanSuccessSchema)` to create a new message. + */ +export declare const CreatePlanSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.CreatePlanError + */ +export type CreatePlanError = Message<"agent.v1.CreatePlanError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.CreatePlanError. + * Use `create(CreatePlanErrorSchema)` to create a new message. + */ +export declare const CreatePlanErrorSchema: GenMessage; +/** + * Query sent from server to client to create a plan file + * + * @generated from message agent.v1.CreatePlanRequestQuery + */ +export type CreatePlanRequestQuery = Message<"agent.v1.CreatePlanRequestQuery"> & { + /** + * @generated from field: agent.v1.CreatePlanArgs args = 1; + */ + args?: CreatePlanArgs; + /** + * @generated from field: string tool_call_id = 2; + */ + toolCallId: string; +}; +/** + * Describes the message agent.v1.CreatePlanRequestQuery. + * Use `create(CreatePlanRequestQuerySchema)` to create a new message. + */ +export declare const CreatePlanRequestQuerySchema: GenMessage; +/** + * Response from client with the created plan URI + * + * @generated from message agent.v1.CreatePlanRequestResponse + */ +export type CreatePlanRequestResponse = Message<"agent.v1.CreatePlanRequestResponse"> & { + /** + * @generated from field: agent.v1.CreatePlanResult result = 1; + */ + result?: CreatePlanResult; +}; +/** + * Describes the message agent.v1.CreatePlanRequestResponse. + * Use `create(CreatePlanRequestResponseSchema)` to create a new message. + */ +export declare const CreatePlanRequestResponseSchema: GenMessage; +/** + * @generated from message agent.v1.CursorRuleTypeGlobal + */ +export type CursorRuleTypeGlobal = Message<"agent.v1.CursorRuleTypeGlobal"> & {}; +/** + * Describes the message agent.v1.CursorRuleTypeGlobal. + * Use `create(CursorRuleTypeGlobalSchema)` to create a new message. + */ +export declare const CursorRuleTypeGlobalSchema: GenMessage; +/** + * @generated from message agent.v1.CursorRuleTypeFileGlobs + */ +export type CursorRuleTypeFileGlobs = Message<"agent.v1.CursorRuleTypeFileGlobs"> & { + /** + * @generated from field: repeated string globs = 1; + */ + globs: string[]; +}; +/** + * Describes the message agent.v1.CursorRuleTypeFileGlobs. + * Use `create(CursorRuleTypeFileGlobsSchema)` to create a new message. + */ +export declare const CursorRuleTypeFileGlobsSchema: GenMessage; +/** + * @generated from message agent.v1.CursorRuleTypeAgentFetched + */ +export type CursorRuleTypeAgentFetched = Message<"agent.v1.CursorRuleTypeAgentFetched"> & { + /** + * @generated from field: string description = 1; + */ + description: string; +}; +/** + * Describes the message agent.v1.CursorRuleTypeAgentFetched. + * Use `create(CursorRuleTypeAgentFetchedSchema)` to create a new message. + */ +export declare const CursorRuleTypeAgentFetchedSchema: GenMessage; +/** + * @generated from message agent.v1.CursorRuleTypeManuallyAttached + */ +export type CursorRuleTypeManuallyAttached = Message<"agent.v1.CursorRuleTypeManuallyAttached"> & {}; +/** + * Describes the message agent.v1.CursorRuleTypeManuallyAttached. + * Use `create(CursorRuleTypeManuallyAttachedSchema)` to create a new message. + */ +export declare const CursorRuleTypeManuallyAttachedSchema: GenMessage; +/** + * @generated from message agent.v1.CursorRuleType + */ +export type CursorRuleType = Message<"agent.v1.CursorRuleType"> & { + /** + * @generated from oneof agent.v1.CursorRuleType.type + */ + type: { + /** + * @generated from field: agent.v1.CursorRuleTypeGlobal global = 1; + */ + value: CursorRuleTypeGlobal; + case: "global"; + } | { + /** + * @generated from field: agent.v1.CursorRuleTypeFileGlobs file_globbed = 2; + */ + value: CursorRuleTypeFileGlobs; + case: "fileGlobbed"; + } | { + /** + * @generated from field: agent.v1.CursorRuleTypeAgentFetched agent_fetched = 3; + */ + value: CursorRuleTypeAgentFetched; + case: "agentFetched"; + } | { + /** + * @generated from field: agent.v1.CursorRuleTypeManuallyAttached manually_attached = 4; + */ + value: CursorRuleTypeManuallyAttached; + case: "manuallyAttached"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.CursorRuleType. + * Use `create(CursorRuleTypeSchema)` to create a new message. + */ +export declare const CursorRuleTypeSchema: GenMessage; +/** + * @generated from message agent.v1.CursorRule + */ +export type CursorRule = Message<"agent.v1.CursorRule"> & { + /** + * absolute path to the .mdc file + * + * @generated from field: string full_path = 1; + */ + fullPath: string; + /** + * rule body, trimmed to reasonable size if needed by client + * + * @generated from field: string content = 2; + */ + content: string; + /** + * classification of rule + * + * @generated from field: agent.v1.CursorRuleType type = 3; + */ + type?: CursorRuleType; + /** + * source of the rule + * + * @generated from field: int32 source = 4; + */ + source: number; + /** + * Git remote origin URL for the repository containing this rule, if available. Normalized to host/path format (e.g., "github.com/owner/repo"). + * + * @generated from field: optional string git_remote_origin = 5; + */ + gitRemoteOrigin?: string; + /** + * @generated from field: optional string parse_error = 6; + */ + parseError?: string; +}; +/** + * Describes the message agent.v1.CursorRule. + * Use `create(CursorRuleSchema)` to create a new message. + */ +export declare const CursorRuleSchema: GenMessage; +/** + * @generated from message agent.v1.DeleteArgs + */ +export type DeleteArgs = Message<"agent.v1.DeleteArgs"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string tool_call_id = 2; + */ + toolCallId: string; +}; +/** + * Describes the message agent.v1.DeleteArgs. + * Use `create(DeleteArgsSchema)` to create a new message. + */ +export declare const DeleteArgsSchema: GenMessage; +/** + * @generated from message agent.v1.DeleteResult + */ +export type DeleteResult = Message<"agent.v1.DeleteResult"> & { + /** + * @generated from oneof agent.v1.DeleteResult.result + */ + result: { + /** + * @generated from field: agent.v1.DeleteSuccess success = 1; + */ + value: DeleteSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.DeleteFileNotFound file_not_found = 2; + */ + value: DeleteFileNotFound; + case: "fileNotFound"; + } | { + /** + * @generated from field: agent.v1.DeleteNotFile not_file = 3; + */ + value: DeleteNotFile; + case: "notFile"; + } | { + /** + * @generated from field: agent.v1.DeletePermissionDenied permission_denied = 4; + */ + value: DeletePermissionDenied; + case: "permissionDenied"; + } | { + /** + * @generated from field: agent.v1.DeleteFileBusy file_busy = 5; + */ + value: DeleteFileBusy; + case: "fileBusy"; + } | { + /** + * @generated from field: agent.v1.DeleteRejected rejected = 6; + */ + value: DeleteRejected; + case: "rejected"; + } | { + /** + * @generated from field: agent.v1.DeleteError error = 7; + */ + value: DeleteError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.DeleteResult. + * Use `create(DeleteResultSchema)` to create a new message. + */ +export declare const DeleteResultSchema: GenMessage; +/** + * @generated from message agent.v1.DeleteSuccess + */ +export type DeleteSuccess = Message<"agent.v1.DeleteSuccess"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string deleted_file = 2; + */ + deletedFile: string; + /** + * @generated from field: int64 file_size = 3; + */ + fileSize: bigint; + /** + * @generated from field: string prev_content = 4; + */ + prevContent: string; +}; +/** + * Describes the message agent.v1.DeleteSuccess. + * Use `create(DeleteSuccessSchema)` to create a new message. + */ +export declare const DeleteSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.DeleteFileNotFound + */ +export type DeleteFileNotFound = Message<"agent.v1.DeleteFileNotFound"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; +/** + * Describes the message agent.v1.DeleteFileNotFound. + * Use `create(DeleteFileNotFoundSchema)` to create a new message. + */ +export declare const DeleteFileNotFoundSchema: GenMessage; +/** + * @generated from message agent.v1.DeleteNotFile + */ +export type DeleteNotFile = Message<"agent.v1.DeleteNotFile"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * "directory" or "other" + * + * @generated from field: string actual_type = 2; + */ + actualType: string; +}; +/** + * Describes the message agent.v1.DeleteNotFile. + * Use `create(DeleteNotFileSchema)` to create a new message. + */ +export declare const DeleteNotFileSchema: GenMessage; +/** + * @generated from message agent.v1.DeletePermissionDenied + */ +export type DeletePermissionDenied = Message<"agent.v1.DeletePermissionDenied"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string client_visible_error = 2; + */ + clientVisibleError: string; + /** + * @generated from field: bool is_readonly = 3; + */ + isReadonly: boolean; +}; +/** + * Describes the message agent.v1.DeletePermissionDenied. + * Use `create(DeletePermissionDeniedSchema)` to create a new message. + */ +export declare const DeletePermissionDeniedSchema: GenMessage; +/** + * @generated from message agent.v1.DeleteFileBusy + */ +export type DeleteFileBusy = Message<"agent.v1.DeleteFileBusy"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; +/** + * Describes the message agent.v1.DeleteFileBusy. + * Use `create(DeleteFileBusySchema)` to create a new message. + */ +export declare const DeleteFileBusySchema: GenMessage; +/** + * @generated from message agent.v1.DeleteRejected + */ +export type DeleteRejected = Message<"agent.v1.DeleteRejected"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string reason = 2; + */ + reason: string; +}; +/** + * Describes the message agent.v1.DeleteRejected. + * Use `create(DeleteRejectedSchema)` to create a new message. + */ +export declare const DeleteRejectedSchema: GenMessage; +/** + * @generated from message agent.v1.DeleteError + */ +export type DeleteError = Message<"agent.v1.DeleteError"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string error = 2; + */ + error: string; +}; +/** + * Describes the message agent.v1.DeleteError. + * Use `create(DeleteErrorSchema)` to create a new message. + */ +export declare const DeleteErrorSchema: GenMessage; +/** + * @generated from message agent.v1.DeleteToolCall + */ +export type DeleteToolCall = Message<"agent.v1.DeleteToolCall"> & { + /** + * @generated from field: agent.v1.DeleteArgs args = 1; + */ + args?: DeleteArgs; + /** + * @generated from field: agent.v1.DeleteResult result = 2; + */ + result?: DeleteResult; +}; +/** + * Describes the message agent.v1.DeleteToolCall. + * Use `create(DeleteToolCallSchema)` to create a new message. + */ +export declare const DeleteToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.DiagnosticsArgs + */ +export type DiagnosticsArgs = Message<"agent.v1.DiagnosticsArgs"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string tool_call_id = 2; + */ + toolCallId: string; +}; +/** + * Describes the message agent.v1.DiagnosticsArgs. + * Use `create(DiagnosticsArgsSchema)` to create a new message. + */ +export declare const DiagnosticsArgsSchema: GenMessage; +/** + * @generated from message agent.v1.DiagnosticsResult + */ +export type DiagnosticsResult = Message<"agent.v1.DiagnosticsResult"> & { + /** + * @generated from oneof agent.v1.DiagnosticsResult.result + */ + result: { + /** + * @generated from field: agent.v1.DiagnosticsSuccess success = 1; + */ + value: DiagnosticsSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.DiagnosticsError error = 2; + */ + value: DiagnosticsError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.DiagnosticsRejected rejected = 3; + */ + value: DiagnosticsRejected; + case: "rejected"; + } | { + /** + * @generated from field: agent.v1.DiagnosticsFileNotFound file_not_found = 4; + */ + value: DiagnosticsFileNotFound; + case: "fileNotFound"; + } | { + /** + * @generated from field: agent.v1.DiagnosticsPermissionDenied permission_denied = 5; + */ + value: DiagnosticsPermissionDenied; + case: "permissionDenied"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.DiagnosticsResult. + * Use `create(DiagnosticsResultSchema)` to create a new message. + */ +export declare const DiagnosticsResultSchema: GenMessage; +/** + * @generated from message agent.v1.DiagnosticsSuccess + */ +export type DiagnosticsSuccess = Message<"agent.v1.DiagnosticsSuccess"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: repeated agent.v1.Diagnostic diagnostics = 2; + */ + diagnostics: Diagnostic[]; + /** + * @generated from field: int32 total_diagnostics = 3; + */ + totalDiagnostics: number; +}; +/** + * Describes the message agent.v1.DiagnosticsSuccess. + * Use `create(DiagnosticsSuccessSchema)` to create a new message. + */ +export declare const DiagnosticsSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.Diagnostic + */ +export type Diagnostic = Message<"agent.v1.Diagnostic"> & { + /** + * @generated from field: int32 severity = 1; + */ + severity: number; + /** + * @generated from field: agent.v1.Range range = 2; + */ + range?: Range; + /** + * @generated from field: string message = 3; + */ + message: string; + /** + * @generated from field: string source = 4; + */ + source: string; + /** + * @generated from field: string code = 5; + */ + code: string; + /** + * @generated from field: bool is_stale = 6; + */ + isStale: boolean; +}; +/** + * Describes the message agent.v1.Diagnostic. + * Use `create(DiagnosticSchema)` to create a new message. + */ +export declare const DiagnosticSchema: GenMessage; +/** + * @generated from message agent.v1.DiagnosticsError + */ +export type DiagnosticsError = Message<"agent.v1.DiagnosticsError"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string error = 2; + */ + error: string; +}; +/** + * Describes the message agent.v1.DiagnosticsError. + * Use `create(DiagnosticsErrorSchema)` to create a new message. + */ +export declare const DiagnosticsErrorSchema: GenMessage; +/** + * @generated from message agent.v1.DiagnosticsRejected + */ +export type DiagnosticsRejected = Message<"agent.v1.DiagnosticsRejected"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string reason = 2; + */ + reason: string; +}; +/** + * Describes the message agent.v1.DiagnosticsRejected. + * Use `create(DiagnosticsRejectedSchema)` to create a new message. + */ +export declare const DiagnosticsRejectedSchema: GenMessage; +/** + * @generated from message agent.v1.DiagnosticsFileNotFound + */ +export type DiagnosticsFileNotFound = Message<"agent.v1.DiagnosticsFileNotFound"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; +/** + * Describes the message agent.v1.DiagnosticsFileNotFound. + * Use `create(DiagnosticsFileNotFoundSchema)` to create a new message. + */ +export declare const DiagnosticsFileNotFoundSchema: GenMessage; +/** + * @generated from message agent.v1.DiagnosticsPermissionDenied + */ +export type DiagnosticsPermissionDenied = Message<"agent.v1.DiagnosticsPermissionDenied"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; +/** + * Describes the message agent.v1.DiagnosticsPermissionDenied. + * Use `create(DiagnosticsPermissionDeniedSchema)` to create a new message. + */ +export declare const DiagnosticsPermissionDeniedSchema: GenMessage; +/** + * @generated from message agent.v1.EditArgs + */ +export type EditArgs = Message<"agent.v1.EditArgs"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: optional string stream_content = 6; + */ + streamContent?: string; +}; +/** + * Describes the message agent.v1.EditArgs. + * Use `create(EditArgsSchema)` to create a new message. + */ +export declare const EditArgsSchema: GenMessage; +/** + * @generated from message agent.v1.EditResult + */ +export type EditResult = Message<"agent.v1.EditResult"> & { + /** + * @generated from oneof agent.v1.EditResult.result + */ + result: { + /** + * @generated from field: agent.v1.EditSuccess success = 1; + */ + value: EditSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.EditFileNotFound file_not_found = 2; + */ + value: EditFileNotFound; + case: "fileNotFound"; + } | { + /** + * @generated from field: agent.v1.EditReadPermissionDenied read_permission_denied = 3; + */ + value: EditReadPermissionDenied; + case: "readPermissionDenied"; + } | { + /** + * @generated from field: agent.v1.EditWritePermissionDenied write_permission_denied = 4; + */ + value: EditWritePermissionDenied; + case: "writePermissionDenied"; + } | { + /** + * @generated from field: agent.v1.EditRejected rejected = 6; + */ + value: EditRejected; + case: "rejected"; + } | { + /** + * @generated from field: agent.v1.EditError error = 7; + */ + value: EditError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.EditResult. + * Use `create(EditResultSchema)` to create a new message. + */ +export declare const EditResultSchema: GenMessage; +/** + * @generated from message agent.v1.EditSuccess + */ +export type EditSuccess = Message<"agent.v1.EditSuccess"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: optional int32 lines_added = 3; + */ + linesAdded?: number; + /** + * @generated from field: optional int32 lines_removed = 4; + */ + linesRemoved?: number; + /** + * Concatenated chunk diff strings separated by "\n...\n" + * + * @generated from field: optional string diff_string = 5; + */ + diffString?: string; + /** + * undefined if file didn't exist before the edit + * + * @generated from field: optional string before_full_file_content = 6; + */ + beforeFullFileContent?: string; + /** + * @generated from field: string after_full_file_content = 7; + */ + afterFullFileContent: string; + /** + * Formatted message for display to model (resultForModel from EditTransformResult) + * + * @generated from field: optional string message = 8; + */ + message?: string; +}; +/** + * Describes the message agent.v1.EditSuccess. + * Use `create(EditSuccessSchema)` to create a new message. + */ +export declare const EditSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.EditFileNotFound + */ +export type EditFileNotFound = Message<"agent.v1.EditFileNotFound"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; +/** + * Describes the message agent.v1.EditFileNotFound. + * Use `create(EditFileNotFoundSchema)` to create a new message. + */ +export declare const EditFileNotFoundSchema: GenMessage; +/** + * @generated from message agent.v1.EditReadPermissionDenied + */ +export type EditReadPermissionDenied = Message<"agent.v1.EditReadPermissionDenied"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; +/** + * Describes the message agent.v1.EditReadPermissionDenied. + * Use `create(EditReadPermissionDeniedSchema)` to create a new message. + */ +export declare const EditReadPermissionDeniedSchema: GenMessage; +/** + * @generated from message agent.v1.EditWritePermissionDenied + */ +export type EditWritePermissionDenied = Message<"agent.v1.EditWritePermissionDenied"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string error = 2; + */ + error: string; + /** + * @generated from field: bool is_readonly = 3; + */ + isReadonly: boolean; +}; +/** + * Describes the message agent.v1.EditWritePermissionDenied. + * Use `create(EditWritePermissionDeniedSchema)` to create a new message. + */ +export declare const EditWritePermissionDeniedSchema: GenMessage; +/** + * @generated from message agent.v1.EditRejected + */ +export type EditRejected = Message<"agent.v1.EditRejected"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string reason = 2; + */ + reason: string; +}; +/** + * Describes the message agent.v1.EditRejected. + * Use `create(EditRejectedSchema)` to create a new message. + */ +export declare const EditRejectedSchema: GenMessage; +/** + * @generated from message agent.v1.EditError + */ +export type EditError = Message<"agent.v1.EditError"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string error = 2; + */ + error: string; + /** + * @generated from field: optional string model_visible_error = 5; + */ + modelVisibleError?: string; +}; +/** + * Describes the message agent.v1.EditError. + * Use `create(EditErrorSchema)` to create a new message. + */ +export declare const EditErrorSchema: GenMessage; +/** + * @generated from message agent.v1.EditToolCall + */ +export type EditToolCall = Message<"agent.v1.EditToolCall"> & { + /** + * @generated from field: agent.v1.EditArgs args = 1; + */ + args?: EditArgs; + /** + * @generated from field: agent.v1.EditResult result = 2; + */ + result?: EditResult; +}; +/** + * Describes the message agent.v1.EditToolCall. + * Use `create(EditToolCallSchema)` to create a new message. + */ +export declare const EditToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.EditToolCallDelta + */ +export type EditToolCallDelta = Message<"agent.v1.EditToolCallDelta"> & { + /** + * @generated from field: string stream_content_delta = 1; + */ + streamContentDelta: string; +}; +/** + * Describes the message agent.v1.EditToolCallDelta. + * Use `create(EditToolCallDeltaSchema)` to create a new message. + */ +export declare const EditToolCallDeltaSchema: GenMessage; +/** + * @generated from message agent.v1.ExaFetchArgs + */ +export type ExaFetchArgs = Message<"agent.v1.ExaFetchArgs"> & { + /** + * @generated from field: repeated string ids = 1; + */ + ids: string[]; + /** + * @generated from field: string tool_call_id = 2; + */ + toolCallId: string; +}; +/** + * Describes the message agent.v1.ExaFetchArgs. + * Use `create(ExaFetchArgsSchema)` to create a new message. + */ +export declare const ExaFetchArgsSchema: GenMessage; +/** + * @generated from message agent.v1.ExaFetchResult + */ +export type ExaFetchResult = Message<"agent.v1.ExaFetchResult"> & { + /** + * @generated from oneof agent.v1.ExaFetchResult.result + */ + result: { + /** + * @generated from field: agent.v1.ExaFetchSuccess success = 1; + */ + value: ExaFetchSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.ExaFetchError error = 2; + */ + value: ExaFetchError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.ExaFetchRejected rejected = 3; + */ + value: ExaFetchRejected; + case: "rejected"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ExaFetchResult. + * Use `create(ExaFetchResultSchema)` to create a new message. + */ +export declare const ExaFetchResultSchema: GenMessage; +/** + * @generated from message agent.v1.ExaFetchSuccess + */ +export type ExaFetchSuccess = Message<"agent.v1.ExaFetchSuccess"> & { + /** + * @generated from field: repeated agent.v1.ExaFetchContent contents = 1; + */ + contents: ExaFetchContent[]; +}; +/** + * Describes the message agent.v1.ExaFetchSuccess. + * Use `create(ExaFetchSuccessSchema)` to create a new message. + */ +export declare const ExaFetchSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.ExaFetchError + */ +export type ExaFetchError = Message<"agent.v1.ExaFetchError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.ExaFetchError. + * Use `create(ExaFetchErrorSchema)` to create a new message. + */ +export declare const ExaFetchErrorSchema: GenMessage; +/** + * @generated from message agent.v1.ExaFetchRejected + */ +export type ExaFetchRejected = Message<"agent.v1.ExaFetchRejected"> & { + /** + * @generated from field: string reason = 1; + */ + reason: string; +}; +/** + * Describes the message agent.v1.ExaFetchRejected. + * Use `create(ExaFetchRejectedSchema)` to create a new message. + */ +export declare const ExaFetchRejectedSchema: GenMessage; +/** + * @generated from message agent.v1.ExaFetchContent + */ +export type ExaFetchContent = Message<"agent.v1.ExaFetchContent"> & { + /** + * @generated from field: string title = 1; + */ + title: string; + /** + * @generated from field: string url = 2; + */ + url: string; + /** + * @generated from field: string text = 3; + */ + text: string; + /** + * @generated from field: string published_date = 4; + */ + publishedDate: string; +}; +/** + * Describes the message agent.v1.ExaFetchContent. + * Use `create(ExaFetchContentSchema)` to create a new message. + */ +export declare const ExaFetchContentSchema: GenMessage; +/** + * @generated from message agent.v1.ExaFetchToolCall + */ +export type ExaFetchToolCall = Message<"agent.v1.ExaFetchToolCall"> & { + /** + * @generated from field: agent.v1.ExaFetchArgs args = 1; + */ + args?: ExaFetchArgs; + /** + * @generated from field: agent.v1.ExaFetchResult result = 2; + */ + result?: ExaFetchResult; +}; +/** + * Describes the message agent.v1.ExaFetchToolCall. + * Use `create(ExaFetchToolCallSchema)` to create a new message. + */ +export declare const ExaFetchToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.ExaFetchRequestQuery + */ +export type ExaFetchRequestQuery = Message<"agent.v1.ExaFetchRequestQuery"> & { + /** + * @generated from field: agent.v1.ExaFetchArgs args = 1; + */ + args?: ExaFetchArgs; +}; +/** + * Describes the message agent.v1.ExaFetchRequestQuery. + * Use `create(ExaFetchRequestQuerySchema)` to create a new message. + */ +export declare const ExaFetchRequestQuerySchema: GenMessage; +/** + * @generated from message agent.v1.ExaFetchRequestResponse + */ +export type ExaFetchRequestResponse = Message<"agent.v1.ExaFetchRequestResponse"> & { + /** + * @generated from oneof agent.v1.ExaFetchRequestResponse.result + */ + result: { + /** + * @generated from field: agent.v1.ExaFetchRequestResponse_Approved approved = 1; + */ + value: ExaFetchRequestResponse_Approved; + case: "approved"; + } | { + /** + * @generated from field: agent.v1.ExaFetchRequestResponse_Rejected rejected = 2; + */ + value: ExaFetchRequestResponse_Rejected; + case: "rejected"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ExaFetchRequestResponse. + * Use `create(ExaFetchRequestResponseSchema)` to create a new message. + */ +export declare const ExaFetchRequestResponseSchema: GenMessage; +/** + * @generated from message agent.v1.ExaFetchRequestResponse_Approved + */ +export type ExaFetchRequestResponse_Approved = Message<"agent.v1.ExaFetchRequestResponse_Approved"> & {}; +/** + * Describes the message agent.v1.ExaFetchRequestResponse_Approved. + * Use `create(ExaFetchRequestResponse_ApprovedSchema)` to create a new message. + */ +export declare const ExaFetchRequestResponse_ApprovedSchema: GenMessage; +/** + * @generated from message agent.v1.ExaFetchRequestResponse_Rejected + */ +export type ExaFetchRequestResponse_Rejected = Message<"agent.v1.ExaFetchRequestResponse_Rejected"> & { + /** + * @generated from field: string reason = 1; + */ + reason: string; +}; +/** + * Describes the message agent.v1.ExaFetchRequestResponse_Rejected. + * Use `create(ExaFetchRequestResponse_RejectedSchema)` to create a new message. + */ +export declare const ExaFetchRequestResponse_RejectedSchema: GenMessage; +/** + * @generated from message agent.v1.ExaSearchArgs + */ +export type ExaSearchArgs = Message<"agent.v1.ExaSearchArgs"> & { + /** + * @generated from field: string query = 1; + */ + query: string; + /** + * "auto", "neural", or "keyword" + * + * @generated from field: string type = 2; + */ + type: string; + /** + * @generated from field: int32 num_results = 3; + */ + numResults: number; + /** + * @generated from field: string tool_call_id = 4; + */ + toolCallId: string; +}; +/** + * Describes the message agent.v1.ExaSearchArgs. + * Use `create(ExaSearchArgsSchema)` to create a new message. + */ +export declare const ExaSearchArgsSchema: GenMessage; +/** + * @generated from message agent.v1.ExaSearchResult + */ +export type ExaSearchResult = Message<"agent.v1.ExaSearchResult"> & { + /** + * @generated from oneof agent.v1.ExaSearchResult.result + */ + result: { + /** + * @generated from field: agent.v1.ExaSearchSuccess success = 1; + */ + value: ExaSearchSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.ExaSearchError error = 2; + */ + value: ExaSearchError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.ExaSearchRejected rejected = 3; + */ + value: ExaSearchRejected; + case: "rejected"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ExaSearchResult. + * Use `create(ExaSearchResultSchema)` to create a new message. + */ +export declare const ExaSearchResultSchema: GenMessage; +/** + * @generated from message agent.v1.ExaSearchSuccess + */ +export type ExaSearchSuccess = Message<"agent.v1.ExaSearchSuccess"> & { + /** + * @generated from field: repeated agent.v1.ExaSearchReference references = 1; + */ + references: ExaSearchReference[]; +}; +/** + * Describes the message agent.v1.ExaSearchSuccess. + * Use `create(ExaSearchSuccessSchema)` to create a new message. + */ +export declare const ExaSearchSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.ExaSearchError + */ +export type ExaSearchError = Message<"agent.v1.ExaSearchError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.ExaSearchError. + * Use `create(ExaSearchErrorSchema)` to create a new message. + */ +export declare const ExaSearchErrorSchema: GenMessage; +/** + * @generated from message agent.v1.ExaSearchRejected + */ +export type ExaSearchRejected = Message<"agent.v1.ExaSearchRejected"> & { + /** + * @generated from field: string reason = 1; + */ + reason: string; +}; +/** + * Describes the message agent.v1.ExaSearchRejected. + * Use `create(ExaSearchRejectedSchema)` to create a new message. + */ +export declare const ExaSearchRejectedSchema: GenMessage; +/** + * @generated from message agent.v1.ExaSearchReference + */ +export type ExaSearchReference = Message<"agent.v1.ExaSearchReference"> & { + /** + * @generated from field: string title = 1; + */ + title: string; + /** + * @generated from field: string url = 2; + */ + url: string; + /** + * @generated from field: string text = 3; + */ + text: string; + /** + * @generated from field: string published_date = 4; + */ + publishedDate: string; +}; +/** + * Describes the message agent.v1.ExaSearchReference. + * Use `create(ExaSearchReferenceSchema)` to create a new message. + */ +export declare const ExaSearchReferenceSchema: GenMessage; +/** + * @generated from message agent.v1.ExaSearchToolCall + */ +export type ExaSearchToolCall = Message<"agent.v1.ExaSearchToolCall"> & { + /** + * @generated from field: agent.v1.ExaSearchArgs args = 1; + */ + args?: ExaSearchArgs; + /** + * @generated from field: agent.v1.ExaSearchResult result = 2; + */ + result?: ExaSearchResult; +}; +/** + * Describes the message agent.v1.ExaSearchToolCall. + * Use `create(ExaSearchToolCallSchema)` to create a new message. + */ +export declare const ExaSearchToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.ExaSearchRequestQuery + */ +export type ExaSearchRequestQuery = Message<"agent.v1.ExaSearchRequestQuery"> & { + /** + * @generated from field: agent.v1.ExaSearchArgs args = 1; + */ + args?: ExaSearchArgs; +}; +/** + * Describes the message agent.v1.ExaSearchRequestQuery. + * Use `create(ExaSearchRequestQuerySchema)` to create a new message. + */ +export declare const ExaSearchRequestQuerySchema: GenMessage; +/** + * @generated from message agent.v1.ExaSearchRequestResponse + */ +export type ExaSearchRequestResponse = Message<"agent.v1.ExaSearchRequestResponse"> & { + /** + * @generated from oneof agent.v1.ExaSearchRequestResponse.result + */ + result: { + /** + * @generated from field: agent.v1.ExaSearchRequestResponse_Approved approved = 1; + */ + value: ExaSearchRequestResponse_Approved; + case: "approved"; + } | { + /** + * @generated from field: agent.v1.ExaSearchRequestResponse_Rejected rejected = 2; + */ + value: ExaSearchRequestResponse_Rejected; + case: "rejected"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ExaSearchRequestResponse. + * Use `create(ExaSearchRequestResponseSchema)` to create a new message. + */ +export declare const ExaSearchRequestResponseSchema: GenMessage; +/** + * @generated from message agent.v1.ExaSearchRequestResponse_Approved + */ +export type ExaSearchRequestResponse_Approved = Message<"agent.v1.ExaSearchRequestResponse_Approved"> & {}; +/** + * Describes the message agent.v1.ExaSearchRequestResponse_Approved. + * Use `create(ExaSearchRequestResponse_ApprovedSchema)` to create a new message. + */ +export declare const ExaSearchRequestResponse_ApprovedSchema: GenMessage; +/** + * @generated from message agent.v1.ExaSearchRequestResponse_Rejected + */ +export type ExaSearchRequestResponse_Rejected = Message<"agent.v1.ExaSearchRequestResponse_Rejected"> & { + /** + * @generated from field: string reason = 1; + */ + reason: string; +}; +/** + * Describes the message agent.v1.ExaSearchRequestResponse_Rejected. + * Use `create(ExaSearchRequestResponse_RejectedSchema)` to create a new message. + */ +export declare const ExaSearchRequestResponse_RejectedSchema: GenMessage; +/** + * @generated from message agent.v1.ExecClientStreamClose + */ +export type ExecClientStreamClose = Message<"agent.v1.ExecClientStreamClose"> & { + /** + * @generated from field: uint32 id = 1; + */ + id: number; +}; +/** + * Describes the message agent.v1.ExecClientStreamClose. + * Use `create(ExecClientStreamCloseSchema)` to create a new message. + */ +export declare const ExecClientStreamCloseSchema: GenMessage; +/** + * @generated from message agent.v1.ExecClientThrow + */ +export type ExecClientThrow = Message<"agent.v1.ExecClientThrow"> & { + /** + * @generated from field: uint32 id = 1; + */ + id: number; + /** + * @generated from field: string error = 2; + */ + error: string; + /** + * @generated from field: optional string stack_trace = 3; + */ + stackTrace?: string; +}; +/** + * Describes the message agent.v1.ExecClientThrow. + * Use `create(ExecClientThrowSchema)` to create a new message. + */ +export declare const ExecClientThrowSchema: GenMessage; +/** + * @generated from message agent.v1.ExecClientHeartbeat + */ +export type ExecClientHeartbeat = Message<"agent.v1.ExecClientHeartbeat"> & { + /** + * @generated from field: uint32 id = 1; + */ + id: number; +}; +/** + * Describes the message agent.v1.ExecClientHeartbeat. + * Use `create(ExecClientHeartbeatSchema)` to create a new message. + */ +export declare const ExecClientHeartbeatSchema: GenMessage; +/** + * @generated from message agent.v1.ExecClientControlMessage + */ +export type ExecClientControlMessage = Message<"agent.v1.ExecClientControlMessage"> & { + /** + * @generated from oneof agent.v1.ExecClientControlMessage.message + */ + message: { + /** + * @generated from field: agent.v1.ExecClientStreamClose stream_close = 1; + */ + value: ExecClientStreamClose; + case: "streamClose"; + } | { + /** + * @generated from field: agent.v1.ExecClientThrow throw = 2; + */ + value: ExecClientThrow; + case: "throw"; + } | { + /** + * @generated from field: agent.v1.ExecClientHeartbeat heartbeat = 3; + */ + value: ExecClientHeartbeat; + case: "heartbeat"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ExecClientControlMessage. + * Use `create(ExecClientControlMessageSchema)` to create a new message. + */ +export declare const ExecClientControlMessageSchema: GenMessage; +/** + * Simplified span context for tracing exec calls + * + * @generated from message agent.v1.SpanContext + */ +export type SpanContext = Message<"agent.v1.SpanContext"> & { + /** + * Trace identifier (128-bit as hex string, same for all spans in a trace) + * + * @generated from field: string trace_id = 1; + */ + traceId: string; + /** + * Unique span identifier (64-bit as hex string) + * + * @generated from field: string span_id = 2; + */ + spanId: string; + /** + * Trace flags bit field following OTEL SPAN_FLAGS_* semantics + * + * @generated from field: optional uint32 trace_flags = 3; + */ + traceFlags?: number; + /** + * W3C trace-state header string (optional) + * + * @generated from field: optional string trace_state = 4; + */ + traceState?: string; +}; +/** + * Describes the message agent.v1.SpanContext. + * Use `create(SpanContextSchema)` to create a new message. + */ +export declare const SpanContextSchema: GenMessage; +/** + * Empty abort message for aborting running execs + * + * @generated from message agent.v1.AbortArgs + */ +export type AbortArgs = Message<"agent.v1.AbortArgs"> & {}; +/** + * Describes the message agent.v1.AbortArgs. + * Use `create(AbortArgsSchema)` to create a new message. + */ +export declare const AbortArgsSchema: GenMessage; +/** + * @generated from message agent.v1.AbortResult + */ +export type AbortResult = Message<"agent.v1.AbortResult"> & {}; +/** + * Describes the message agent.v1.AbortResult. + * Use `create(AbortResultSchema)` to create a new message. + */ +export declare const AbortResultSchema: GenMessage; +/** + * @generated from message agent.v1.ExecServerMessage + */ +export type ExecServerMessage = Message<"agent.v1.ExecServerMessage"> & { + /** + * @generated from field: uint32 id = 1; + */ + id: number; + /** + * Optional exec ID for attachable executions + * + * @generated from field: string exec_id = 15; + */ + execId: string; + /** + * Optional parent span context for tracing + * + * @generated from field: optional agent.v1.SpanContext span_context = 19; + */ + spanContext?: SpanContext; + /** + * @generated from oneof agent.v1.ExecServerMessage.message + */ + message: { + /** + * @generated from field: agent.v1.ShellArgs shell_args = 2; + */ + value: ShellArgs; + case: "shellArgs"; + } | { + /** + * @generated from field: agent.v1.WriteArgs write_args = 3; + */ + value: WriteArgs; + case: "writeArgs"; + } | { + /** + * @generated from field: agent.v1.DeleteArgs delete_args = 4; + */ + value: DeleteArgs; + case: "deleteArgs"; + } | { + /** + * @generated from field: agent.v1.GrepArgs grep_args = 5; + */ + value: GrepArgs; + case: "grepArgs"; + } | { + /** + * @generated from field: agent.v1.ReadArgs read_args = 7; + */ + value: ReadArgs; + case: "readArgs"; + } | { + /** + * @generated from field: agent.v1.LsArgs ls_args = 8; + */ + value: LsArgs; + case: "lsArgs"; + } | { + /** + * @generated from field: agent.v1.DiagnosticsArgs diagnostics_args = 9; + */ + value: DiagnosticsArgs; + case: "diagnosticsArgs"; + } | { + /** + * @generated from field: agent.v1.RequestContextArgs request_context_args = 10; + */ + value: RequestContextArgs; + case: "requestContextArgs"; + } | { + /** + * @generated from field: agent.v1.McpArgs mcp_args = 11; + */ + value: McpArgs; + case: "mcpArgs"; + } | { + /** + * @generated from field: agent.v1.ShellArgs shell_stream_args = 14; + */ + value: ShellArgs; + case: "shellStreamArgs"; + } | { + /** + * @generated from field: agent.v1.BackgroundShellSpawnArgs background_shell_spawn_args = 16; + */ + value: BackgroundShellSpawnArgs; + case: "backgroundShellSpawnArgs"; + } | { + /** + * @generated from field: agent.v1.ListMcpResourcesExecArgs list_mcp_resources_exec_args = 17; + */ + value: ListMcpResourcesExecArgs; + case: "listMcpResourcesExecArgs"; + } | { + /** + * @generated from field: agent.v1.ReadMcpResourceExecArgs read_mcp_resource_exec_args = 18; + */ + value: ReadMcpResourceExecArgs; + case: "readMcpResourceExecArgs"; + } | { + /** + * @generated from field: agent.v1.FetchArgs fetch_args = 20; + */ + value: FetchArgs; + case: "fetchArgs"; + } | { + /** + * @generated from field: agent.v1.RecordScreenArgs record_screen_args = 21; + */ + value: RecordScreenArgs; + case: "recordScreenArgs"; + } | { + /** + * @generated from field: agent.v1.ComputerUseArgs computer_use_args = 22; + */ + value: ComputerUseArgs; + case: "computerUseArgs"; + } | { + /** + * @generated from field: agent.v1.WriteShellStdinArgs write_shell_stdin_args = 23; + */ + value: WriteShellStdinArgs; + case: "writeShellStdinArgs"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ExecServerMessage. + * Use `create(ExecServerMessageSchema)` to create a new message. + */ +export declare const ExecServerMessageSchema: GenMessage; +/** + * @generated from message agent.v1.ExecClientMessage + */ +export type ExecClientMessage = Message<"agent.v1.ExecClientMessage"> & { + /** + * @generated from field: uint32 id = 1; + */ + id: number; + /** + * Optional exec ID for attachable executions + * + * @generated from field: string exec_id = 15; + */ + execId: string; + /** + * @generated from oneof agent.v1.ExecClientMessage.message + */ + message: { + /** + * @generated from field: agent.v1.ShellResult shell_result = 2; + */ + value: ShellResult; + case: "shellResult"; + } | { + /** + * @generated from field: agent.v1.WriteResult write_result = 3; + */ + value: WriteResult; + case: "writeResult"; + } | { + /** + * @generated from field: agent.v1.DeleteResult delete_result = 4; + */ + value: DeleteResult; + case: "deleteResult"; + } | { + /** + * @generated from field: agent.v1.GrepResult grep_result = 5; + */ + value: GrepResult; + case: "grepResult"; + } | { + /** + * @generated from field: agent.v1.ReadResult read_result = 7; + */ + value: ReadResult; + case: "readResult"; + } | { + /** + * @generated from field: agent.v1.LsResult ls_result = 8; + */ + value: LsResult; + case: "lsResult"; + } | { + /** + * @generated from field: agent.v1.DiagnosticsResult diagnostics_result = 9; + */ + value: DiagnosticsResult; + case: "diagnosticsResult"; + } | { + /** + * @generated from field: agent.v1.RequestContextResult request_context_result = 10; + */ + value: RequestContextResult; + case: "requestContextResult"; + } | { + /** + * @generated from field: agent.v1.McpResult mcp_result = 11; + */ + value: McpResult; + case: "mcpResult"; + } | { + /** + * @generated from field: agent.v1.ShellStream shell_stream = 14; + */ + value: ShellStream; + case: "shellStream"; + } | { + /** + * @generated from field: agent.v1.BackgroundShellSpawnResult background_shell_spawn_result = 16; + */ + value: BackgroundShellSpawnResult; + case: "backgroundShellSpawnResult"; + } | { + /** + * @generated from field: agent.v1.ListMcpResourcesExecResult list_mcp_resources_exec_result = 17; + */ + value: ListMcpResourcesExecResult; + case: "listMcpResourcesExecResult"; + } | { + /** + * @generated from field: agent.v1.ReadMcpResourceExecResult read_mcp_resource_exec_result = 18; + */ + value: ReadMcpResourceExecResult; + case: "readMcpResourceExecResult"; + } | { + /** + * @generated from field: agent.v1.FetchResult fetch_result = 20; + */ + value: FetchResult; + case: "fetchResult"; + } | { + /** + * @generated from field: agent.v1.RecordScreenResult record_screen_result = 21; + */ + value: RecordScreenResult; + case: "recordScreenResult"; + } | { + /** + * @generated from field: agent.v1.ComputerUseResult computer_use_result = 22; + */ + value: ComputerUseResult; + case: "computerUseResult"; + } | { + /** + * @generated from field: agent.v1.WriteShellStdinResult write_shell_stdin_result = 23; + */ + value: WriteShellStdinResult; + case: "writeShellStdinResult"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ExecClientMessage. + * Use `create(ExecClientMessageSchema)` to create a new message. + */ +export declare const ExecClientMessageSchema: GenMessage; +/** + * @generated from message agent.v1.FetchArgs + */ +export type FetchArgs = Message<"agent.v1.FetchArgs"> & { + /** + * @generated from field: string url = 1; + */ + url: string; + /** + * @generated from field: string tool_call_id = 2; + */ + toolCallId: string; +}; +/** + * Describes the message agent.v1.FetchArgs. + * Use `create(FetchArgsSchema)` to create a new message. + */ +export declare const FetchArgsSchema: GenMessage; +/** + * @generated from message agent.v1.FetchResult + */ +export type FetchResult = Message<"agent.v1.FetchResult"> & { + /** + * @generated from oneof agent.v1.FetchResult.result + */ + result: { + /** + * @generated from field: agent.v1.FetchSuccess success = 1; + */ + value: FetchSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.FetchError error = 2; + */ + value: FetchError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.FetchResult. + * Use `create(FetchResultSchema)` to create a new message. + */ +export declare const FetchResultSchema: GenMessage; +/** + * @generated from message agent.v1.FetchSuccess + */ +export type FetchSuccess = Message<"agent.v1.FetchSuccess"> & { + /** + * @generated from field: string url = 1; + */ + url: string; + /** + * @generated from field: string content = 2; + */ + content: string; + /** + * @generated from field: int32 status_code = 3; + */ + statusCode: number; + /** + * @generated from field: string content_type = 4; + */ + contentType: string; +}; +/** + * Describes the message agent.v1.FetchSuccess. + * Use `create(FetchSuccessSchema)` to create a new message. + */ +export declare const FetchSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.FetchError + */ +export type FetchError = Message<"agent.v1.FetchError"> & { + /** + * @generated from field: string url = 1; + */ + url: string; + /** + * @generated from field: string error = 2; + */ + error: string; +}; +/** + * Describes the message agent.v1.FetchError. + * Use `create(FetchErrorSchema)` to create a new message. + */ +export declare const FetchErrorSchema: GenMessage; +/** + * @generated from message agent.v1.GenerateImageArgs + */ +export type GenerateImageArgs = Message<"agent.v1.GenerateImageArgs"> & { + /** + * @generated from field: string description = 1; + */ + description: string; + /** + * @generated from field: optional string file_path = 2; + */ + filePath?: string; + /** + * Optional paths to reference images to use as input for image-to-image generation + * + * @generated from field: repeated string reference_image_paths = 5; + */ + referenceImagePaths: string[]; +}; +/** + * Describes the message agent.v1.GenerateImageArgs. + * Use `create(GenerateImageArgsSchema)` to create a new message. + */ +export declare const GenerateImageArgsSchema: GenMessage; +/** + * @generated from message agent.v1.GenerateImageResult + */ +export type GenerateImageResult = Message<"agent.v1.GenerateImageResult"> & { + /** + * @generated from oneof agent.v1.GenerateImageResult.result + */ + result: { + /** + * @generated from field: agent.v1.GenerateImageSuccess success = 1; + */ + value: GenerateImageSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.GenerateImageError error = 2; + */ + value: GenerateImageError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.GenerateImageResult. + * Use `create(GenerateImageResultSchema)` to create a new message. + */ +export declare const GenerateImageResultSchema: GenMessage; +/** + * @generated from message agent.v1.GenerateImageSuccess + */ +export type GenerateImageSuccess = Message<"agent.v1.GenerateImageSuccess"> & { + /** + * Actual file path where the image was saved (e.g., /path/to/project/assets/image.png) + * + * @generated from field: string file_path = 1; + */ + filePath: string; + /** + * Base64-encoded image data + * + * @generated from field: string image_data = 2; + */ + imageData: string; +}; +/** + * Describes the message agent.v1.GenerateImageSuccess. + * Use `create(GenerateImageSuccessSchema)` to create a new message. + */ +export declare const GenerateImageSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.GenerateImageError + */ +export type GenerateImageError = Message<"agent.v1.GenerateImageError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.GenerateImageError. + * Use `create(GenerateImageErrorSchema)` to create a new message. + */ +export declare const GenerateImageErrorSchema: GenMessage; +/** + * @generated from message agent.v1.GenerateImageToolCall + */ +export type GenerateImageToolCall = Message<"agent.v1.GenerateImageToolCall"> & { + /** + * @generated from field: agent.v1.GenerateImageArgs args = 1; + */ + args?: GenerateImageArgs; + /** + * @generated from field: agent.v1.GenerateImageResult result = 2; + */ + result?: GenerateImageResult; +}; +/** + * Describes the message agent.v1.GenerateImageToolCall. + * Use `create(GenerateImageToolCallSchema)` to create a new message. + */ +export declare const GenerateImageToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.GrepArgs + */ +export type GrepArgs = Message<"agent.v1.GrepArgs"> & { + /** + * @generated from field: string pattern = 1; + */ + pattern: string; + /** + * @generated from field: optional string path = 2; + */ + path?: string; + /** + * @generated from field: optional string glob = 3; + */ + glob?: string; + /** + * "content", "files_with_matches", "count" + * + * @generated from field: optional string output_mode = 4; + */ + outputMode?: string; + /** + * @generated from field: optional int32 context_before = 5; + */ + contextBefore?: number; + /** + * @generated from field: optional int32 context_after = 6; + */ + contextAfter?: number; + /** + * @generated from field: optional int32 context = 7; + */ + context?: number; + /** + * @generated from field: optional bool case_insensitive = 8; + */ + caseInsensitive?: boolean; + /** + * --type + * + * @generated from field: optional string type = 9; + */ + type?: string; + /** + * | head -N + * + * @generated from field: optional int32 head_limit = 10; + */ + headLimit?: number; + /** + * -U --multiline-dotall + * + * @generated from field: optional bool multiline = 11; + */ + multiline?: boolean; + /** + * --sort: "none", "path", "modified", "accessed", "created" + * + * @generated from field: optional string sort = 12; + */ + sort?: string; + /** + * if false, use --sortr for reverse sort + * + * @generated from field: optional bool sort_ascending = 13; + */ + sortAscending?: boolean; + /** + * @generated from field: string tool_call_id = 14; + */ + toolCallId: string; + /** + * @generated from field: optional agent.v1.SandboxPolicy sandbox_policy = 15; + */ + sandboxPolicy?: SandboxPolicy; +}; +/** + * Describes the message agent.v1.GrepArgs. + * Use `create(GrepArgsSchema)` to create a new message. + */ +export declare const GrepArgsSchema: GenMessage; +/** + * @generated from message agent.v1.GrepResult + */ +export type GrepResult = Message<"agent.v1.GrepResult"> & { + /** + * @generated from oneof agent.v1.GrepResult.result + */ + result: { + /** + * @generated from field: agent.v1.GrepSuccess success = 1; + */ + value: GrepSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.GrepError error = 2; + */ + value: GrepError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.GrepResult. + * Use `create(GrepResultSchema)` to create a new message. + */ +export declare const GrepResultSchema: GenMessage; +/** + * @generated from message agent.v1.GrepError + */ +export type GrepError = Message<"agent.v1.GrepError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.GrepError. + * Use `create(GrepErrorSchema)` to create a new message. + */ +export declare const GrepErrorSchema: GenMessage; +/** + * @generated from message agent.v1.GrepSuccess + */ +export type GrepSuccess = Message<"agent.v1.GrepSuccess"> & { + /** + * @generated from field: string pattern = 1; + */ + pattern: string; + /** + * @generated from field: string path = 2; + */ + path: string; + /** + * "content", "files_with_matches", or "count" + * + * @generated from field: string output_mode = 3; + */ + outputMode: string; + /** + * @generated from field: map workspace_results = 4; + */ + workspaceResults: { + [key: string]: GrepUnionResult; + }; + /** + * @generated from field: optional agent.v1.GrepUnionResult active_editor_result = 5; + */ + activeEditorResult?: GrepUnionResult; +}; +/** + * Describes the message agent.v1.GrepSuccess. + * Use `create(GrepSuccessSchema)` to create a new message. + */ +export declare const GrepSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.GrepUnionResult + */ +export type GrepUnionResult = Message<"agent.v1.GrepUnionResult"> & { + /** + * @generated from oneof agent.v1.GrepUnionResult.result + */ + result: { + /** + * @generated from field: agent.v1.GrepCountResult count = 1; + */ + value: GrepCountResult; + case: "count"; + } | { + /** + * @generated from field: agent.v1.GrepFilesResult files = 2; + */ + value: GrepFilesResult; + case: "files"; + } | { + /** + * @generated from field: agent.v1.GrepContentResult content = 3; + */ + value: GrepContentResult; + case: "content"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.GrepUnionResult. + * Use `create(GrepUnionResultSchema)` to create a new message. + */ +export declare const GrepUnionResultSchema: GenMessage; +/** + * @generated from message agent.v1.GrepCountResult + */ +export type GrepCountResult = Message<"agent.v1.GrepCountResult"> & { + /** + * ordered by relevance + * + * @generated from field: repeated agent.v1.GrepFileCount counts = 1; + */ + counts: GrepFileCount[]; + /** + * The total count of files that the client found from the ripgrep call This is a lower bound if we truncated the output from the ripgrep call itself, but is accurate if client_truncated is true (but may be more than the number of files returned to the server) + * + * @generated from field: int32 total_files = 2; + */ + totalFiles: number; + /** + * The total count of matches that the client found from the ripgrep call This is a lower bound if we truncated the output from the ripgrep call itself, but is accurate if client_truncated is true (but may be more than the number of matches returned to the server) + * + * @generated from field: int32 total_matches = 3; + */ + totalMatches: number; + /** + * true if the client truncated the output sent to the server + * + * @generated from field: bool client_truncated = 4; + */ + clientTruncated: boolean; + /** + * true if we truncated the output from the ripgrep call itself + * + * @generated from field: bool ripgrep_truncated = 5; + */ + ripgrepTruncated: boolean; +}; +/** + * Describes the message agent.v1.GrepCountResult. + * Use `create(GrepCountResultSchema)` to create a new message. + */ +export declare const GrepCountResultSchema: GenMessage; +/** + * @generated from message agent.v1.GrepFileCount + */ +export type GrepFileCount = Message<"agent.v1.GrepFileCount"> & { + /** + * @generated from field: string file = 1; + */ + file: string; + /** + * @generated from field: int32 count = 2; + */ + count: number; +}; +/** + * Describes the message agent.v1.GrepFileCount. + * Use `create(GrepFileCountSchema)` to create a new message. + */ +export declare const GrepFileCountSchema: GenMessage; +/** + * @generated from message agent.v1.GrepFilesResult + */ +export type GrepFilesResult = Message<"agent.v1.GrepFilesResult"> & { + /** + * ordered by relevance + * + * @generated from field: repeated string files = 1; + */ + files: string[]; + /** + * The total count of files that the client found from the ripgrep call This is a lower bound if we truncated the output from the ripgrep call itself, but is accurate if client_truncated is true (but may be more than the number of files returned to the server) + * + * @generated from field: int32 total_files = 2; + */ + totalFiles: number; + /** + * true if the client truncated the output sent to the server + * + * @generated from field: bool client_truncated = 3; + */ + clientTruncated: boolean; + /** + * true if we truncated the output from the ripgrep call itself + * + * @generated from field: bool ripgrep_truncated = 4; + */ + ripgrepTruncated: boolean; +}; +/** + * Describes the message agent.v1.GrepFilesResult. + * Use `create(GrepFilesResultSchema)` to create a new message. + */ +export declare const GrepFilesResultSchema: GenMessage; +/** + * @generated from message agent.v1.GrepContentResult + */ +export type GrepContentResult = Message<"agent.v1.GrepContentResult"> & { + /** + * ordered by relevance + * + * @generated from field: repeated agent.v1.GrepFileMatch matches = 1; + */ + matches: GrepFileMatch[]; + /** + * The total count of lines that the client found from the ripgrep call This is a lower bound if we truncated the output from the ripgrep call itself, but is accurate if client_truncated is true (but may be more than the number of lines returned to the server) + * + * @generated from field: int32 total_lines = 2; + */ + totalLines: number; + /** + * The total count of matches that the client found from the ripgrep call This is a lower bound if we truncated the output from the ripgrep call itself, but is accurate if client_truncated is true (but may be more than the number of matches returned to the server) + * + * @generated from field: int32 total_matched_lines = 3; + */ + totalMatchedLines: number; + /** + * true if the client truncated the output sent to the server + * + * @generated from field: bool client_truncated = 4; + */ + clientTruncated: boolean; + /** + * true if we truncated the output from the ripgrep call itself + * + * @generated from field: bool ripgrep_truncated = 5; + */ + ripgrepTruncated: boolean; +}; +/** + * Describes the message agent.v1.GrepContentResult. + * Use `create(GrepContentResultSchema)` to create a new message. + */ +export declare const GrepContentResultSchema: GenMessage; +/** + * @generated from message agent.v1.GrepFileMatch + */ +export type GrepFileMatch = Message<"agent.v1.GrepFileMatch"> & { + /** + * @generated from field: string file = 1; + */ + file: string; + /** + * @generated from field: repeated agent.v1.GrepContentMatch matches = 2; + */ + matches: GrepContentMatch[]; +}; +/** + * Describes the message agent.v1.GrepFileMatch. + * Use `create(GrepFileMatchSchema)` to create a new message. + */ +export declare const GrepFileMatchSchema: GenMessage; +/** + * @generated from message agent.v1.GrepContentMatch + */ +export type GrepContentMatch = Message<"agent.v1.GrepContentMatch"> & { + /** + * @generated from field: int32 line_number = 1; + */ + lineNumber: number; + /** + * @generated from field: string content = 2; + */ + content: string; + /** + * @generated from field: bool content_truncated = 3; + */ + contentTruncated: boolean; + /** + * true for context lines (-A/B/C) + * + * @generated from field: bool is_context_line = 4; + */ + isContextLine: boolean; +}; +/** + * Describes the message agent.v1.GrepContentMatch. + * Use `create(GrepContentMatchSchema)` to create a new message. + */ +export declare const GrepContentMatchSchema: GenMessage; +/** + * @generated from message agent.v1.GrepStream + */ +export type GrepStream = Message<"agent.v1.GrepStream"> & { + /** + * @generated from field: string pattern = 1; + */ + pattern: string; +}; +/** + * Describes the message agent.v1.GrepStream. + * Use `create(GrepStreamSchema)` to create a new message. + */ +export declare const GrepStreamSchema: GenMessage; +/** + * @generated from message agent.v1.GrepToolCall + */ +export type GrepToolCall = Message<"agent.v1.GrepToolCall"> & { + /** + * @generated from field: agent.v1.GrepArgs args = 1; + */ + args?: GrepArgs; + /** + * @generated from field: agent.v1.GrepResult result = 2; + */ + result?: GrepResult; +}; +/** + * Describes the message agent.v1.GrepToolCall. + * Use `create(GrepToolCallSchema)` to create a new message. + */ +export declare const GrepToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.GetBlobArgs + */ +export type GetBlobArgs = Message<"agent.v1.GetBlobArgs"> & { + /** + * @generated from field: bytes blob_id = 1; + */ + blobId: Uint8Array; +}; +/** + * Describes the message agent.v1.GetBlobArgs. + * Use `create(GetBlobArgsSchema)` to create a new message. + */ +export declare const GetBlobArgsSchema: GenMessage; +/** + * @generated from message agent.v1.GetBlobResult + */ +export type GetBlobResult = Message<"agent.v1.GetBlobResult"> & { + /** + * @generated from field: optional bytes blob_data = 1; + */ + blobData?: Uint8Array; +}; +/** + * Describes the message agent.v1.GetBlobResult. + * Use `create(GetBlobResultSchema)` to create a new message. + */ +export declare const GetBlobResultSchema: GenMessage; +/** + * @generated from message agent.v1.SetBlobArgs + */ +export type SetBlobArgs = Message<"agent.v1.SetBlobArgs"> & { + /** + * @generated from field: bytes blob_id = 1; + */ + blobId: Uint8Array; + /** + * @generated from field: bytes blob_data = 2; + */ + blobData: Uint8Array; +}; +/** + * Describes the message agent.v1.SetBlobArgs. + * Use `create(SetBlobArgsSchema)` to create a new message. + */ +export declare const SetBlobArgsSchema: GenMessage; +/** + * @generated from message agent.v1.SetBlobResult + */ +export type SetBlobResult = Message<"agent.v1.SetBlobResult"> & { + /** + * @generated from field: optional agent.v1.Error error = 1; + */ + error?: Error; +}; +/** + * Describes the message agent.v1.SetBlobResult. + * Use `create(SetBlobResultSchema)` to create a new message. + */ +export declare const SetBlobResultSchema: GenMessage; +/** + * @generated from message agent.v1.KvServerMessage + */ +export type KvServerMessage = Message<"agent.v1.KvServerMessage"> & { + /** + * @generated from field: uint32 id = 1; + */ + id: number; + /** + * Span context for distributed tracing + * + * @generated from field: optional agent.v1.SpanContext span_context = 4; + */ + spanContext?: SpanContext; + /** + * @generated from oneof agent.v1.KvServerMessage.message + */ + message: { + /** + * @generated from field: agent.v1.GetBlobArgs get_blob_args = 2; + */ + value: GetBlobArgs; + case: "getBlobArgs"; + } | { + /** + * @generated from field: agent.v1.SetBlobArgs set_blob_args = 3; + */ + value: SetBlobArgs; + case: "setBlobArgs"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.KvServerMessage. + * Use `create(KvServerMessageSchema)` to create a new message. + */ +export declare const KvServerMessageSchema: GenMessage; +/** + * @generated from message agent.v1.KvClientMessage + */ +export type KvClientMessage = Message<"agent.v1.KvClientMessage"> & { + /** + * @generated from field: uint32 id = 1; + */ + id: number; + /** + * @generated from oneof agent.v1.KvClientMessage.message + */ + message: { + /** + * @generated from field: agent.v1.GetBlobResult get_blob_result = 2; + */ + value: GetBlobResult; + case: "getBlobResult"; + } | { + /** + * @generated from field: agent.v1.SetBlobResult set_blob_result = 3; + */ + value: SetBlobResult; + case: "setBlobResult"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.KvClientMessage. + * Use `create(KvClientMessageSchema)` to create a new message. + */ +export declare const KvClientMessageSchema: GenMessage; +/** + * @generated from message agent.v1.LsArgs + */ +export type LsArgs = Message<"agent.v1.LsArgs"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: repeated string ignore = 2; + */ + ignore: string[]; + /** + * @generated from field: string tool_call_id = 3; + */ + toolCallId: string; + /** + * @generated from field: optional agent.v1.SandboxPolicy sandbox_policy = 4; + */ + sandboxPolicy?: SandboxPolicy; + /** + * defaults to 5000ms + * + * @generated from field: optional uint32 timeout_ms = 5; + */ + timeoutMs?: number; +}; +/** + * Describes the message agent.v1.LsArgs. + * Use `create(LsArgsSchema)` to create a new message. + */ +export declare const LsArgsSchema: GenMessage; +/** + * @generated from message agent.v1.LsResult + */ +export type LsResult = Message<"agent.v1.LsResult"> & { + /** + * @generated from oneof agent.v1.LsResult.result + */ + result: { + /** + * @generated from field: agent.v1.LsSuccess success = 1; + */ + value: LsSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.LsError error = 2; + */ + value: LsError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.LsRejected rejected = 3; + */ + value: LsRejected; + case: "rejected"; + } | { + /** + * @generated from field: agent.v1.LsTimeout timeout = 4; + */ + value: LsTimeout; + case: "timeout"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.LsResult. + * Use `create(LsResultSchema)` to create a new message. + */ +export declare const LsResultSchema: GenMessage; +/** + * @generated from message agent.v1.LsSuccess + */ +export type LsSuccess = Message<"agent.v1.LsSuccess"> & { + /** + * @generated from field: agent.v1.LsDirectoryTreeNode directory_tree_root = 1; + */ + directoryTreeRoot?: LsDirectoryTreeNode; +}; +/** + * Describes the message agent.v1.LsSuccess. + * Use `create(LsSuccessSchema)` to create a new message. + */ +export declare const LsSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.LsDirectoryTreeNode + */ +export type LsDirectoryTreeNode = Message<"agent.v1.LsDirectoryTreeNode"> & { + /** + * @generated from field: string abs_path = 1; + */ + absPath: string; + /** + * @generated from field: repeated agent.v1.LsDirectoryTreeNode children_dirs = 2; + */ + childrenDirs: LsDirectoryTreeNode[]; + /** + * @generated from field: repeated agent.v1.LsDirectoryTreeNode_File children_files = 3; + */ + childrenFiles: LsDirectoryTreeNode_File[]; + /** + * Proto doesn't allow repeated fields to be optional, so in case of empty children arrays, this fields indicates if it happens: `true` - because directory really doesn't have any children `false` - because we stopped traversal before getting to its children + * + * @generated from field: bool children_were_processed = 4; + */ + childrenWereProcessed: boolean; + /** + * Count of extensions in the full sub-tree + * + * @generated from field: map full_subtree_extension_counts = 5; + */ + fullSubtreeExtensionCounts: { + [key: string]: number; + }; + /** + * @generated from field: int32 num_files = 6; + */ + numFiles: number; +}; +/** + * Describes the message agent.v1.LsDirectoryTreeNode. + * Use `create(LsDirectoryTreeNodeSchema)` to create a new message. + */ +export declare const LsDirectoryTreeNodeSchema: GenMessage; +/** + * @generated from message agent.v1.LsDirectoryTreeNode_File + */ +export type LsDirectoryTreeNode_File = Message<"agent.v1.LsDirectoryTreeNode_File"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + /** + * @generated from field: optional agent.v1.TerminalMetadata terminal_metadata = 2; + */ + terminalMetadata?: TerminalMetadata; +}; +/** + * Describes the message agent.v1.LsDirectoryTreeNode_File. + * Use `create(LsDirectoryTreeNode_FileSchema)` to create a new message. + */ +export declare const LsDirectoryTreeNode_FileSchema: GenMessage; +/** + * @generated from message agent.v1.LsError + */ +export type LsError = Message<"agent.v1.LsError"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string error = 2; + */ + error: string; +}; +/** + * Describes the message agent.v1.LsError. + * Use `create(LsErrorSchema)` to create a new message. + */ +export declare const LsErrorSchema: GenMessage; +/** + * @generated from message agent.v1.LsRejected + */ +export type LsRejected = Message<"agent.v1.LsRejected"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string reason = 2; + */ + reason: string; +}; +/** + * Describes the message agent.v1.LsRejected. + * Use `create(LsRejectedSchema)` to create a new message. + */ +export declare const LsRejectedSchema: GenMessage; +/** + * Returned when ls operation timed out. Contains partial results gathered before timeout. + * + * @generated from message agent.v1.LsTimeout + */ +export type LsTimeout = Message<"agent.v1.LsTimeout"> & { + /** + * @generated from field: agent.v1.LsDirectoryTreeNode directory_tree_root = 1; + */ + directoryTreeRoot?: LsDirectoryTreeNode; +}; +/** + * Describes the message agent.v1.LsTimeout. + * Use `create(LsTimeoutSchema)` to create a new message. + */ +export declare const LsTimeoutSchema: GenMessage; +/** + * @generated from message agent.v1.TerminalMetadata + */ +export type TerminalMetadata = Message<"agent.v1.TerminalMetadata"> & { + /** + * @generated from field: optional string cwd = 1; + */ + cwd?: string; + /** + * @generated from field: repeated agent.v1.TerminalMetadata_Command last_commands = 2; + */ + lastCommands: TerminalMetadata_Command[]; + /** + * @generated from field: optional int64 last_modified_ms = 3; + */ + lastModifiedMs?: bigint; + /** + * @generated from field: optional agent.v1.TerminalMetadata_Command current_command = 4; + */ + currentCommand?: TerminalMetadata_Command; +}; +/** + * Describes the message agent.v1.TerminalMetadata. + * Use `create(TerminalMetadataSchema)` to create a new message. + */ +export declare const TerminalMetadataSchema: GenMessage; +/** + * @generated from message agent.v1.TerminalMetadata_Command + */ +export type TerminalMetadata_Command = Message<"agent.v1.TerminalMetadata_Command"> & { + /** + * @generated from field: string command = 1; + */ + command: string; + /** + * @generated from field: optional int32 exit_code = 2; + */ + exitCode?: number; + /** + * @generated from field: optional int64 timestamp_ms = 3; + */ + timestampMs?: bigint; + /** + * @generated from field: optional int64 duration_ms = 4; + */ + durationMs?: bigint; +}; +/** + * Describes the message agent.v1.TerminalMetadata_Command. + * Use `create(TerminalMetadata_CommandSchema)` to create a new message. + */ +export declare const TerminalMetadata_CommandSchema: GenMessage; +/** + * @generated from message agent.v1.LsToolCall + */ +export type LsToolCall = Message<"agent.v1.LsToolCall"> & { + /** + * @generated from field: agent.v1.LsArgs args = 1; + */ + args?: LsArgs; + /** + * @generated from field: agent.v1.LsResult result = 2; + */ + result?: LsResult; +}; +/** + * Describes the message agent.v1.LsToolCall. + * Use `create(LsToolCallSchema)` to create a new message. + */ +export declare const LsToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.McpArgs + */ +export type McpArgs = Message<"agent.v1.McpArgs"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + /** + * @generated from field: map args = 2; + */ + args: { + [key: string]: Uint8Array; + }; + /** + * @generated from field: string tool_call_id = 3; + */ + toolCallId: string; + /** + * @generated from field: string provider_identifier = 4; + */ + providerIdentifier: string; + /** + * @generated from field: string tool_name = 5; + */ + toolName: string; +}; +/** + * Describes the message agent.v1.McpArgs. + * Use `create(McpArgsSchema)` to create a new message. + */ +export declare const McpArgsSchema: GenMessage; +/** + * @generated from message agent.v1.McpResult + */ +export type McpResult = Message<"agent.v1.McpResult"> & { + /** + * @generated from oneof agent.v1.McpResult.result + */ + result: { + /** + * @generated from field: agent.v1.McpSuccess success = 1; + */ + value: McpSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.McpError error = 2; + */ + value: McpError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.McpRejected rejected = 3; + */ + value: McpRejected; + case: "rejected"; + } | { + /** + * @generated from field: agent.v1.McpPermissionDenied permission_denied = 4; + */ + value: McpPermissionDenied; + case: "permissionDenied"; + } | { + /** + * @generated from field: agent.v1.McpToolNotFound tool_not_found = 5; + */ + value: McpToolNotFound; + case: "toolNotFound"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.McpResult. + * Use `create(McpResultSchema)` to create a new message. + */ +export declare const McpResultSchema: GenMessage; +/** + * @generated from message agent.v1.McpToolNotFound + */ +export type McpToolNotFound = Message<"agent.v1.McpToolNotFound"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + /** + * @generated from field: repeated string available_tools = 2; + */ + availableTools: string[]; +}; +/** + * Describes the message agent.v1.McpToolNotFound. + * Use `create(McpToolNotFoundSchema)` to create a new message. + */ +export declare const McpToolNotFoundSchema: GenMessage; +/** + * Text content item + * + * @generated from message agent.v1.McpTextContent + */ +export type McpTextContent = Message<"agent.v1.McpTextContent"> & { + /** + * @generated from field: string text = 1; + */ + text: string; + /** + * Optional file location for large outputs + * + * @generated from field: optional agent.v1.OutputLocation output_location = 2; + */ + outputLocation?: OutputLocation; +}; +/** + * Describes the message agent.v1.McpTextContent. + * Use `create(McpTextContentSchema)` to create a new message. + */ +export declare const McpTextContentSchema: GenMessage; +/** + * Image content item + * + * @generated from message agent.v1.McpImageContent + */ +export type McpImageContent = Message<"agent.v1.McpImageContent"> & { + /** + * Raw bytes of the image. In JSON, this will be base64-encoded. + * + * @generated from field: bytes data = 1; + */ + data: Uint8Array; + /** + * Optional MIME type, e.g. "image/png" + * + * @generated from field: string mime_type = 2; + */ + mimeType: string; +}; +/** + * Describes the message agent.v1.McpImageContent. + * Use `create(McpImageContentSchema)` to create a new message. + */ +export declare const McpImageContentSchema: GenMessage; +/** + * A single tool result content item: either text or image + * + * @generated from message agent.v1.McpToolResultContentItem + */ +export type McpToolResultContentItem = Message<"agent.v1.McpToolResultContentItem"> & { + /** + * @generated from oneof agent.v1.McpToolResultContentItem.content + */ + content: { + /** + * @generated from field: agent.v1.McpTextContent text = 1; + */ + value: McpTextContent; + case: "text"; + } | { + /** + * @generated from field: agent.v1.McpImageContent image = 2; + */ + value: McpImageContent; + case: "image"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.McpToolResultContentItem. + * Use `create(McpToolResultContentItemSchema)` to create a new message. + */ +export declare const McpToolResultContentItemSchema: GenMessage; +/** + * Equivalent to the requested McpToolResult TypeScript type + * + * @generated from message agent.v1.McpSuccess + */ +export type McpSuccess = Message<"agent.v1.McpSuccess"> & { + /** + * @generated from field: repeated agent.v1.McpToolResultContentItem content = 1; + */ + content: McpToolResultContentItem[]; + /** + * @generated from field: bool is_error = 2; + */ + isError: boolean; +}; +/** + * Describes the message agent.v1.McpSuccess. + * Use `create(McpSuccessSchema)` to create a new message. + */ +export declare const McpSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.McpError + */ +export type McpError = Message<"agent.v1.McpError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.McpError. + * Use `create(McpErrorSchema)` to create a new message. + */ +export declare const McpErrorSchema: GenMessage; +/** + * @generated from message agent.v1.McpRejected + */ +export type McpRejected = Message<"agent.v1.McpRejected"> & { + /** + * @generated from field: string reason = 1; + */ + reason: string; + /** + * @generated from field: bool is_readonly = 2; + */ + isReadonly: boolean; +}; +/** + * Describes the message agent.v1.McpRejected. + * Use `create(McpRejectedSchema)` to create a new message. + */ +export declare const McpRejectedSchema: GenMessage; +/** + * @generated from message agent.v1.McpPermissionDenied + */ +export type McpPermissionDenied = Message<"agent.v1.McpPermissionDenied"> & { + /** + * @generated from field: string error = 1; + */ + error: string; + /** + * @generated from field: bool is_readonly = 2; + */ + isReadonly: boolean; +}; +/** + * Describes the message agent.v1.McpPermissionDenied. + * Use `create(McpPermissionDeniedSchema)` to create a new message. + */ +export declare const McpPermissionDeniedSchema: GenMessage; +/** + * List MCP resources exec args + * + * @generated from message agent.v1.ListMcpResourcesExecArgs + */ +export type ListMcpResourcesExecArgs = Message<"agent.v1.ListMcpResourcesExecArgs"> & { + /** + * Optional server name to filter resources by + * + * @generated from field: optional string server = 1; + */ + server?: string; +}; +/** + * Describes the message agent.v1.ListMcpResourcesExecArgs. + * Use `create(ListMcpResourcesExecArgsSchema)` to create a new message. + */ +export declare const ListMcpResourcesExecArgsSchema: GenMessage; +/** + * List MCP resources exec result + * + * @generated from message agent.v1.ListMcpResourcesExecResult + */ +export type ListMcpResourcesExecResult = Message<"agent.v1.ListMcpResourcesExecResult"> & { + /** + * @generated from oneof agent.v1.ListMcpResourcesExecResult.result + */ + result: { + /** + * @generated from field: agent.v1.ListMcpResourcesSuccess success = 1; + */ + value: ListMcpResourcesSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.ListMcpResourcesError error = 2; + */ + value: ListMcpResourcesError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.ListMcpResourcesRejected rejected = 3; + */ + value: ListMcpResourcesRejected; + case: "rejected"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ListMcpResourcesExecResult. + * Use `create(ListMcpResourcesExecResultSchema)` to create a new message. + */ +export declare const ListMcpResourcesExecResultSchema: GenMessage; +/** + * @generated from message agent.v1.ListMcpResourcesExecResult_McpResource + */ +export type ListMcpResourcesExecResult_McpResource = Message<"agent.v1.ListMcpResourcesExecResult_McpResource"> & { + /** + * @generated from field: string uri = 1; + */ + uri: string; + /** + * @generated from field: optional string name = 2; + */ + name?: string; + /** + * @generated from field: optional string description = 3; + */ + description?: string; + /** + * @generated from field: optional string mime_type = 4; + */ + mimeType?: string; + /** + * Server name that provides this resource + * + * @generated from field: string server = 5; + */ + server: string; + /** + * Additional metadata + * + * @generated from field: map annotations = 6; + */ + annotations: { + [key: string]: string; + }; +}; +/** + * Describes the message agent.v1.ListMcpResourcesExecResult_McpResource. + * Use `create(ListMcpResourcesExecResult_McpResourceSchema)` to create a new message. + */ +export declare const ListMcpResourcesExecResult_McpResourceSchema: GenMessage; +/** + * @generated from message agent.v1.ListMcpResourcesSuccess + */ +export type ListMcpResourcesSuccess = Message<"agent.v1.ListMcpResourcesSuccess"> & { + /** + * @generated from field: repeated agent.v1.ListMcpResourcesExecResult_McpResource resources = 1; + */ + resources: ListMcpResourcesExecResult_McpResource[]; +}; +/** + * Describes the message agent.v1.ListMcpResourcesSuccess. + * Use `create(ListMcpResourcesSuccessSchema)` to create a new message. + */ +export declare const ListMcpResourcesSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.ListMcpResourcesError + */ +export type ListMcpResourcesError = Message<"agent.v1.ListMcpResourcesError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.ListMcpResourcesError. + * Use `create(ListMcpResourcesErrorSchema)` to create a new message. + */ +export declare const ListMcpResourcesErrorSchema: GenMessage; +/** + * @generated from message agent.v1.ListMcpResourcesRejected + */ +export type ListMcpResourcesRejected = Message<"agent.v1.ListMcpResourcesRejected"> & { + /** + * @generated from field: string reason = 1; + */ + reason: string; +}; +/** + * Describes the message agent.v1.ListMcpResourcesRejected. + * Use `create(ListMcpResourcesRejectedSchema)` to create a new message. + */ +export declare const ListMcpResourcesRejectedSchema: GenMessage; +/** + * Read MCP resource exec args + * + * @generated from message agent.v1.ReadMcpResourceExecArgs + */ +export type ReadMcpResourceExecArgs = Message<"agent.v1.ReadMcpResourceExecArgs"> & { + /** + * Required server name + * + * @generated from field: string server = 1; + */ + server: string; + /** + * Required resource URI + * + * @generated from field: string uri = 2; + */ + uri: string; + /** + * Optional: when set, the resource will be downloaded to this path relative to the workspace, and the content will not be returned to the model. + * + * @generated from field: optional string download_path = 3; + */ + downloadPath?: string; +}; +/** + * Describes the message agent.v1.ReadMcpResourceExecArgs. + * Use `create(ReadMcpResourceExecArgsSchema)` to create a new message. + */ +export declare const ReadMcpResourceExecArgsSchema: GenMessage; +/** + * Read MCP resource exec result + * + * @generated from message agent.v1.ReadMcpResourceExecResult + */ +export type ReadMcpResourceExecResult = Message<"agent.v1.ReadMcpResourceExecResult"> & { + /** + * @generated from oneof agent.v1.ReadMcpResourceExecResult.result + */ + result: { + /** + * @generated from field: agent.v1.ReadMcpResourceSuccess success = 1; + */ + value: ReadMcpResourceSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.ReadMcpResourceError error = 2; + */ + value: ReadMcpResourceError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.ReadMcpResourceRejected rejected = 3; + */ + value: ReadMcpResourceRejected; + case: "rejected"; + } | { + /** + * @generated from field: agent.v1.ReadMcpResourceNotFound not_found = 4; + */ + value: ReadMcpResourceNotFound; + case: "notFound"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ReadMcpResourceExecResult. + * Use `create(ReadMcpResourceExecResultSchema)` to create a new message. + */ +export declare const ReadMcpResourceExecResultSchema: GenMessage; +/** + * @generated from message agent.v1.ReadMcpResourceSuccess + */ +export type ReadMcpResourceSuccess = Message<"agent.v1.ReadMcpResourceSuccess"> & { + /** + * @generated from field: string uri = 1; + */ + uri: string; + /** + * @generated from field: optional string name = 2; + */ + name?: string; + /** + * @generated from field: optional string description = 3; + */ + description?: string; + /** + * @generated from field: optional string mime_type = 4; + */ + mimeType?: string; + /** + * Additional metadata + * + * @generated from field: map annotations = 7; + */ + annotations: { + [key: string]: string; + }; + /** + * If set, resource was downloaded to this path + * + * @generated from field: optional string download_path = 8; + */ + downloadPath?: string; + /** + * @generated from oneof agent.v1.ReadMcpResourceSuccess.content + */ + content: { + /** + * @generated from field: string text = 5; + */ + value: string; + case: "text"; + } | { + /** + * @generated from field: bytes blob = 6; + */ + value: Uint8Array; + case: "blob"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ReadMcpResourceSuccess. + * Use `create(ReadMcpResourceSuccessSchema)` to create a new message. + */ +export declare const ReadMcpResourceSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.ReadMcpResourceError + */ +export type ReadMcpResourceError = Message<"agent.v1.ReadMcpResourceError"> & { + /** + * @generated from field: string uri = 1; + */ + uri: string; + /** + * @generated from field: string error = 2; + */ + error: string; +}; +/** + * Describes the message agent.v1.ReadMcpResourceError. + * Use `create(ReadMcpResourceErrorSchema)` to create a new message. + */ +export declare const ReadMcpResourceErrorSchema: GenMessage; +/** + * @generated from message agent.v1.ReadMcpResourceRejected + */ +export type ReadMcpResourceRejected = Message<"agent.v1.ReadMcpResourceRejected"> & { + /** + * @generated from field: string uri = 1; + */ + uri: string; + /** + * @generated from field: string reason = 2; + */ + reason: string; +}; +/** + * Describes the message agent.v1.ReadMcpResourceRejected. + * Use `create(ReadMcpResourceRejectedSchema)` to create a new message. + */ +export declare const ReadMcpResourceRejectedSchema: GenMessage; +/** + * @generated from message agent.v1.ReadMcpResourceNotFound + */ +export type ReadMcpResourceNotFound = Message<"agent.v1.ReadMcpResourceNotFound"> & { + /** + * @generated from field: string uri = 1; + */ + uri: string; +}; +/** + * Describes the message agent.v1.ReadMcpResourceNotFound. + * Use `create(ReadMcpResourceNotFoundSchema)` to create a new message. + */ +export declare const ReadMcpResourceNotFoundSchema: GenMessage; +/** + * @generated from message agent.v1.McpToolDefinition + */ +export type McpToolDefinition = Message<"agent.v1.McpToolDefinition"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + /** + * @generated from field: string provider_identifier = 4; + */ + providerIdentifier: string; + /** + * @generated from field: string tool_name = 5; + */ + toolName: string; + /** + * @generated from field: string description = 2; + */ + description: string; + /** + * @generated from field: bytes input_schema = 3; + */ + inputSchema: Uint8Array; +}; +/** + * Describes the message agent.v1.McpToolDefinition. + * Use `create(McpToolDefinitionSchema)` to create a new message. + */ +export declare const McpToolDefinitionSchema: GenMessage; +/** + * @generated from message agent.v1.McpTools + */ +export type McpTools = Message<"agent.v1.McpTools"> & { + /** + * @generated from field: repeated agent.v1.McpToolDefinition mcp_tools = 1; + */ + mcpTools: McpToolDefinition[]; +}; +/** + * Describes the message agent.v1.McpTools. + * Use `create(McpToolsSchema)` to create a new message. + */ +export declare const McpToolsSchema: GenMessage; +/** + * Represents MCP-provided instructions from a specific server + * + * @generated from message agent.v1.McpInstructions + */ +export type McpInstructions = Message<"agent.v1.McpInstructions"> & { + /** + * @generated from field: string server_name = 1; + */ + serverName: string; + /** + * @generated from field: string instructions = 2; + */ + instructions: string; +}; +/** + * Describes the message agent.v1.McpInstructions. + * Use `create(McpInstructionsSchema)` to create a new message. + */ +export declare const McpInstructionsSchema: GenMessage; +/** + * @generated from message agent.v1.McpDescriptor + */ +export type McpDescriptor = Message<"agent.v1.McpDescriptor"> & { + /** + * Display name of the MCP server associated with this folder. + * + * @generated from field: string server_name = 1; + */ + serverName: string; + /** + * @generated from field: string server_identifier = 2; + */ + serverIdentifier: string; + /** + * Absolute folder path where MCP tool descriptor JSON files are stored. + * + * @generated from field: optional string folder_path = 3; + */ + folderPath?: string; + /** + * @generated from field: optional string server_use_instructions = 4; + */ + serverUseInstructions?: string; + /** + * @generated from field: repeated agent.v1.McpToolDescriptor tools = 5; + */ + tools: McpToolDescriptor[]; +}; +/** + * Describes the message agent.v1.McpDescriptor. + * Use `create(McpDescriptorSchema)` to create a new message. + */ +export declare const McpDescriptorSchema: GenMessage; +/** + * @generated from message agent.v1.McpToolDescriptor + */ +export type McpToolDescriptor = Message<"agent.v1.McpToolDescriptor"> & { + /** + * @generated from field: string tool_name = 1; + */ + toolName: string; + /** + * @generated from field: optional string definition_path = 2; + */ + definitionPath?: string; +}; +/** + * Describes the message agent.v1.McpToolDescriptor. + * Use `create(McpToolDescriptorSchema)` to create a new message. + */ +export declare const McpToolDescriptorSchema: GenMessage; +/** + * @generated from message agent.v1.McpFileSystemOptions + */ +export type McpFileSystemOptions = Message<"agent.v1.McpFileSystemOptions"> & { + /** + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + /** + * @generated from field: string workspace_project_dir = 2; + */ + workspaceProjectDir: string; + /** + * @generated from field: repeated agent.v1.McpDescriptor mcp_descriptors = 3; + */ + mcpDescriptors: McpDescriptor[]; +}; +/** + * Describes the message agent.v1.McpFileSystemOptions. + * Use `create(McpFileSystemOptionsSchema)` to create a new message. + */ +export declare const McpFileSystemOptionsSchema: GenMessage; +/** + * @generated from message agent.v1.ReadArgs + */ +export type ReadArgs = Message<"agent.v1.ReadArgs"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string tool_call_id = 2; + */ + toolCallId: string; +}; +/** + * Describes the message agent.v1.ReadArgs. + * Use `create(ReadArgsSchema)` to create a new message. + */ +export declare const ReadArgsSchema: GenMessage; +/** + * @generated from message agent.v1.ReadResult + */ +export type ReadResult = Message<"agent.v1.ReadResult"> & { + /** + * @generated from oneof agent.v1.ReadResult.result + */ + result: { + /** + * @generated from field: agent.v1.ReadSuccess success = 1; + */ + value: ReadSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.ReadError error = 2; + */ + value: ReadError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.ReadRejected rejected = 3; + */ + value: ReadRejected; + case: "rejected"; + } | { + /** + * @generated from field: agent.v1.ReadFileNotFound file_not_found = 4; + */ + value: ReadFileNotFound; + case: "fileNotFound"; + } | { + /** + * @generated from field: agent.v1.ReadPermissionDenied permission_denied = 5; + */ + value: ReadPermissionDenied; + case: "permissionDenied"; + } | { + /** + * @generated from field: agent.v1.ReadInvalidFile invalid_file = 6; + */ + value: ReadInvalidFile; + case: "invalidFile"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ReadResult. + * Use `create(ReadResultSchema)` to create a new message. + */ +export declare const ReadResultSchema: GenMessage; +/** + * @generated from message agent.v1.ReadSuccess + */ +export type ReadSuccess = Message<"agent.v1.ReadSuccess"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: int32 total_lines = 3; + */ + totalLines: number; + /** + * @generated from field: int64 file_size = 4; + */ + fileSize: bigint; + /** + * true if the content was truncated due to size limits + * + * @generated from field: bool truncated = 6; + */ + truncated: boolean; + /** + * Returns blob ID if the output was stored in the blob store. If provided, the output is stored separately from the rest of the tool result, and since it's already in the blob store, it need not be sent back to the client -- reducing bandwidth. + * + * @generated from field: optional bytes output_blob_id = 7; + */ + outputBlobId?: Uint8Array; + /** + * @generated from oneof agent.v1.ReadSuccess.output + */ + output: { + /** + * @generated from field: string content = 2; + */ + value: string; + case: "content"; + } | { + /** + * @generated from field: bytes data = 5; + */ + value: Uint8Array; + case: "data"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ReadSuccess. + * Use `create(ReadSuccessSchema)` to create a new message. + */ +export declare const ReadSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.ReadError + */ +export type ReadError = Message<"agent.v1.ReadError"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string error = 2; + */ + error: string; +}; +/** + * Describes the message agent.v1.ReadError. + * Use `create(ReadErrorSchema)` to create a new message. + */ +export declare const ReadErrorSchema: GenMessage; +/** + * @generated from message agent.v1.ReadRejected + */ +export type ReadRejected = Message<"agent.v1.ReadRejected"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string reason = 2; + */ + reason: string; +}; +/** + * Describes the message agent.v1.ReadRejected. + * Use `create(ReadRejectedSchema)` to create a new message. + */ +export declare const ReadRejectedSchema: GenMessage; +/** + * @generated from message agent.v1.ReadFileNotFound + */ +export type ReadFileNotFound = Message<"agent.v1.ReadFileNotFound"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; +/** + * Describes the message agent.v1.ReadFileNotFound. + * Use `create(ReadFileNotFoundSchema)` to create a new message. + */ +export declare const ReadFileNotFoundSchema: GenMessage; +/** + * @generated from message agent.v1.ReadPermissionDenied + */ +export type ReadPermissionDenied = Message<"agent.v1.ReadPermissionDenied"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; +/** + * Describes the message agent.v1.ReadPermissionDenied. + * Use `create(ReadPermissionDeniedSchema)` to create a new message. + */ +export declare const ReadPermissionDeniedSchema: GenMessage; +/** + * @generated from message agent.v1.ReadInvalidFile + */ +export type ReadInvalidFile = Message<"agent.v1.ReadInvalidFile"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * e.g., "Path is a directory, not a file" + * + * @generated from field: string reason = 2; + */ + reason: string; +}; +/** + * Describes the message agent.v1.ReadInvalidFile. + * Use `create(ReadInvalidFileSchema)` to create a new message. + */ +export declare const ReadInvalidFileSchema: GenMessage; +/** + * @generated from message agent.v1.ReadToolCall + */ +export type ReadToolCall = Message<"agent.v1.ReadToolCall"> & { + /** + * @generated from field: agent.v1.ReadToolArgs args = 1; + */ + args?: ReadToolArgs; + /** + * @generated from field: agent.v1.ReadToolResult result = 2; + */ + result?: ReadToolResult; +}; +/** + * Describes the message agent.v1.ReadToolCall. + * Use `create(ReadToolCallSchema)` to create a new message. + */ +export declare const ReadToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.ReadToolArgs + */ +export type ReadToolArgs = Message<"agent.v1.ReadToolArgs"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: optional int32 offset = 2; + */ + offset?: number; + /** + * @generated from field: optional int32 limit = 3; + */ + limit?: number; +}; +/** + * Describes the message agent.v1.ReadToolArgs. + * Use `create(ReadToolArgsSchema)` to create a new message. + */ +export declare const ReadToolArgsSchema: GenMessage; +/** + * @generated from message agent.v1.ReadToolResult + */ +export type ReadToolResult = Message<"agent.v1.ReadToolResult"> & { + /** + * @generated from oneof agent.v1.ReadToolResult.result + */ + result: { + /** + * @generated from field: agent.v1.ReadToolSuccess success = 1; + */ + value: ReadToolSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.ReadToolError error = 2; + */ + value: ReadToolError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ReadToolResult. + * Use `create(ReadToolResultSchema)` to create a new message. + */ +export declare const ReadToolResultSchema: GenMessage; +/** + * @generated from message agent.v1.ReadRange + */ +export type ReadRange = Message<"agent.v1.ReadRange"> & { + /** + * @generated from field: uint32 start_line = 1; + */ + startLine: number; + /** + * @generated from field: uint32 end_line = 2; + */ + endLine: number; +}; +/** + * Describes the message agent.v1.ReadRange. + * Use `create(ReadRangeSchema)` to create a new message. + */ +export declare const ReadRangeSchema: GenMessage; +/** + * @generated from message agent.v1.ReadToolSuccess + */ +export type ReadToolSuccess = Message<"agent.v1.ReadToolSuccess"> & { + /** + * @generated from field: bool is_empty = 2; + */ + isEmpty: boolean; + /** + * @generated from field: bool exceeded_limit = 3; + */ + exceededLimit: boolean; + /** + * @generated from field: uint32 total_lines = 4; + */ + totalLines: number; + /** + * @generated from field: uint32 file_size = 5; + */ + fileSize: number; + /** + * @generated from field: string path = 7; + */ + path: string; + /** + * @generated from field: optional agent.v1.ReadRange read_range = 8; + */ + readRange?: ReadRange; + /** + * @generated from oneof agent.v1.ReadToolSuccess.output + */ + output: { + /** + * @generated from field: string content = 1; + */ + value: string; + case: "content"; + } | { + /** + * @generated from field: bytes data = 6; + */ + value: Uint8Array; + case: "data"; + } | { + /** + * @generated from field: bytes data_blob_id = 9; + */ + value: Uint8Array; + case: "dataBlobId"; + } | { + /** + * @generated from field: bytes content_blob_id = 10; + */ + value: Uint8Array; + case: "contentBlobId"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ReadToolSuccess. + * Use `create(ReadToolSuccessSchema)` to create a new message. + */ +export declare const ReadToolSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.ReadToolError + */ +export type ReadToolError = Message<"agent.v1.ReadToolError"> & { + /** + * @generated from field: string error_message = 1; + */ + errorMessage: string; +}; +/** + * Describes the message agent.v1.ReadToolError. + * Use `create(ReadToolErrorSchema)` to create a new message. + */ +export declare const ReadToolErrorSchema: GenMessage; +/** + * @generated from message agent.v1.RecordScreenArgs + */ +export type RecordScreenArgs = Message<"agent.v1.RecordScreenArgs"> & { + /** + * @generated from field: int32 mode = 1; + */ + mode: number; + /** + * @generated from field: string tool_call_id = 2; + */ + toolCallId: string; + /** + * Custom filename for SAVE_RECORDING mode + * + * @generated from field: optional string save_as_filename = 3; + */ + saveAsFilename?: string; +}; +/** + * Describes the message agent.v1.RecordScreenArgs. + * Use `create(RecordScreenArgsSchema)` to create a new message. + */ +export declare const RecordScreenArgsSchema: GenMessage; +/** + * @generated from message agent.v1.RecordScreenResult + */ +export type RecordScreenResult = Message<"agent.v1.RecordScreenResult"> & { + /** + * @generated from oneof agent.v1.RecordScreenResult.result + */ + result: { + /** + * @generated from field: agent.v1.RecordScreenStartSuccess start_success = 1; + */ + value: RecordScreenStartSuccess; + case: "startSuccess"; + } | { + /** + * @generated from field: agent.v1.RecordScreenSaveSuccess save_success = 2; + */ + value: RecordScreenSaveSuccess; + case: "saveSuccess"; + } | { + /** + * @generated from field: agent.v1.RecordScreenDiscardSuccess discard_success = 3; + */ + value: RecordScreenDiscardSuccess; + case: "discardSuccess"; + } | { + /** + * @generated from field: agent.v1.RecordScreenFailure failure = 4; + */ + value: RecordScreenFailure; + case: "failure"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.RecordScreenResult. + * Use `create(RecordScreenResultSchema)` to create a new message. + */ +export declare const RecordScreenResultSchema: GenMessage; +/** + * @generated from message agent.v1.RecordScreenStartSuccess + */ +export type RecordScreenStartSuccess = Message<"agent.v1.RecordScreenStartSuccess"> & { + /** + * True if a prior recording was cancelled, false otherwise + * + * @generated from field: bool was_prior_recording_cancelled = 1; + */ + wasPriorRecordingCancelled: boolean; + /** + * True if save_as_filename arg was passed to start tool and ignored + * + * @generated from field: bool was_save_as_filename_ignored = 2; + */ + wasSaveAsFilenameIgnored: boolean; +}; +/** + * Describes the message agent.v1.RecordScreenStartSuccess. + * Use `create(RecordScreenStartSuccessSchema)` to create a new message. + */ +export declare const RecordScreenStartSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.RecordScreenSaveSuccess + */ +export type RecordScreenSaveSuccess = Message<"agent.v1.RecordScreenSaveSuccess"> & { + /** + * Path to the saved recording file + * + * @generated from field: string path = 1; + */ + path: string; + /** + * Duration of the recording in milliseconds + * + * @generated from field: int64 recording_duration_ms = 2; + */ + recordingDurationMs: bigint; + /** + * Set if save_as_filename was invalid and default path was used instead + * + * @generated from field: optional int32 requested_file_path_rejected_reason = 3; + */ + requestedFilePathRejectedReason?: number; +}; +/** + * Describes the message agent.v1.RecordScreenSaveSuccess. + * Use `create(RecordScreenSaveSuccessSchema)` to create a new message. + */ +export declare const RecordScreenSaveSuccessSchema: GenMessage; +/** + * Empty message - recording discarded successfully + * + * @generated from message agent.v1.RecordScreenDiscardSuccess + */ +export type RecordScreenDiscardSuccess = Message<"agent.v1.RecordScreenDiscardSuccess"> & {}; +/** + * Describes the message agent.v1.RecordScreenDiscardSuccess. + * Use `create(RecordScreenDiscardSuccessSchema)` to create a new message. + */ +export declare const RecordScreenDiscardSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.RecordScreenFailure + */ +export type RecordScreenFailure = Message<"agent.v1.RecordScreenFailure"> & { + /** + * Error message + * + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.RecordScreenFailure. + * Use `create(RecordScreenFailureSchema)` to create a new message. + */ +export declare const RecordScreenFailureSchema: GenMessage; +/** + * @generated from message agent.v1.CursorPackagePrompt + */ +export type CursorPackagePrompt = Message<"agent.v1.CursorPackagePrompt"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + /** + * @generated from field: string file_path = 2; + */ + filePath: string; +}; +/** + * Describes the message agent.v1.CursorPackagePrompt. + * Use `create(CursorPackagePromptSchema)` to create a new message. + */ +export declare const CursorPackagePromptSchema: GenMessage; +/** + * @generated from message agent.v1.CursorPackage + */ +export type CursorPackage = Message<"agent.v1.CursorPackage"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + /** + * @generated from field: string description = 2; + */ + description: string; + /** + * @generated from field: string folder_path = 3; + */ + folderPath: string; + /** + * @generated from field: bool enabled = 4; + */ + enabled: boolean; + /** + * @generated from field: optional string parse_error = 5; + */ + parseError?: string; + /** + * @generated from field: repeated agent.v1.CursorPackagePrompt prompts = 6; + */ + prompts: CursorPackagePrompt[]; + /** + * @generated from field: string readme_file_path = 7; + */ + readmeFilePath: string; + /** + * @generated from field: int32 package_type = 8; + */ + packageType: number; +}; +/** + * Describes the message agent.v1.CursorPackage. + * Use `create(CursorPackageSchema)` to create a new message. + */ +export declare const CursorPackageSchema: GenMessage; +/** + * TODO: you should be able to override / configure this list in your .vscode settings not exactly sure what that should look like... but i guess you should be able to specify an override URL because we use URLs for identifying repos and maybe you should be able to specify additional buckets too... like in the jane street case: i guess jane street should have some default buckets + * + * @generated from message agent.v1.RepositoryIndexingInfo + */ +export type RepositoryIndexingInfo = Message<"agent.v1.RepositoryIndexingInfo"> & { + /** + * the relative path in the current workspace this is useful for locating the repo and identifying what repo a given file is in this should be unique for different repositories (I think) + * + * @generated from field: string relative_workspace_path = 1; + */ + relativeWorkspacePath: string; + /** + * a git repo may have multiple remotes at the server we choose the remote (either origin, or the one we have embedded, or something else) invariant: len(remote_urls) == len(remote_names) + * + * @generated from field: repeated string remote_urls = 2; + */ + remoteUrls: string[]; + /** + * @generated from field: repeated string remote_names = 3; + */ + remoteNames: string[]; + /** + * @generated from field: string repo_name = 4; + */ + repoName: string; + /** + * @generated from field: string repo_owner = 5; + */ + repoOwner: string; + /** + * @generated from field: bool is_tracked = 6; + */ + isTracked: boolean; + /** + * If this is local + * + * @generated from field: bool is_local = 7; + */ + isLocal: boolean; + /** + * the orthogonal transform seed if sent from the client! if the client sends up the transform seed then we use that for the orthogonal transform instead of the value stored in the database + * + * @generated from field: optional double orthogonal_transform_seed = 8; + */ + orthogonalTransformSeed?: number; + /** + * The encrypted workspace uri for the repository. + * + * @generated from field: string workspace_uri = 9; + */ + workspaceUri: string; + /** + * The encryption key for partial paths + * + * @generated from field: string path_encryption_key = 10; + */ + pathEncryptionKey: string; +}; +/** + * Describes the message agent.v1.RepositoryIndexingInfo. + * Use `create(RepositoryIndexingInfoSchema)` to create a new message. + */ +export declare const RepositoryIndexingInfoSchema: GenMessage; +/** + * @generated from message agent.v1.RequestContextArgs + */ +export type RequestContextArgs = Message<"agent.v1.RequestContextArgs"> & { + /** + * @generated from field: optional string notes_session_id = 2; + */ + notesSessionId?: string; + /** + * @generated from field: optional string workspace_id = 3; + */ + workspaceId?: string; +}; +/** + * Describes the message agent.v1.RequestContextArgs. + * Use `create(RequestContextArgsSchema)` to create a new message. + */ +export declare const RequestContextArgsSchema: GenMessage; +/** + * @generated from message agent.v1.RequestContextResult + */ +export type RequestContextResult = Message<"agent.v1.RequestContextResult"> & { + /** + * @generated from oneof agent.v1.RequestContextResult.result + */ + result: { + /** + * @generated from field: agent.v1.RequestContextSuccess success = 1; + */ + value: RequestContextSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.RequestContextError error = 2; + */ + value: RequestContextError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.RequestContextRejected rejected = 3; + */ + value: RequestContextRejected; + case: "rejected"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.RequestContextResult. + * Use `create(RequestContextResultSchema)` to create a new message. + */ +export declare const RequestContextResultSchema: GenMessage; +/** + * @generated from message agent.v1.RequestContextSuccess + */ +export type RequestContextSuccess = Message<"agent.v1.RequestContextSuccess"> & { + /** + * @generated from field: agent.v1.RequestContext request_context = 1; + */ + requestContext?: RequestContext; +}; +/** + * Describes the message agent.v1.RequestContextSuccess. + * Use `create(RequestContextSuccessSchema)` to create a new message. + */ +export declare const RequestContextSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.RequestContextError + */ +export type RequestContextError = Message<"agent.v1.RequestContextError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.RequestContextError. + * Use `create(RequestContextErrorSchema)` to create a new message. + */ +export declare const RequestContextErrorSchema: GenMessage; +/** + * @generated from message agent.v1.RequestContextRejected + */ +export type RequestContextRejected = Message<"agent.v1.RequestContextRejected"> & { + /** + * @generated from field: string reason = 1; + */ + reason: string; +}; +/** + * Describes the message agent.v1.RequestContextRejected. + * Use `create(RequestContextRejectedSchema)` to create a new message. + */ +export declare const RequestContextRejectedSchema: GenMessage; +/** + * same as SelectedImage, but with the data field is the full image data + * + * @generated from message agent.v1.ImageProto + */ +export type ImageProto = Message<"agent.v1.ImageProto"> & { + /** + * @generated from field: bytes data = 1; + */ + data: Uint8Array; + /** + * @generated from field: string uuid = 2; + */ + uuid: string; + /** + * @generated from field: string path = 3; + */ + path: string; + /** + * @generated from field: agent.v1.ImageProto_Dimension dimension = 4; + */ + dimension?: ImageProto_Dimension; + /** + * @generated from field: optional string task_specific_description = 6; + */ + taskSpecificDescription?: string; + /** + * @generated from field: string mime_type = 7; + */ + mimeType: string; +}; +/** + * Describes the message agent.v1.ImageProto. + * Use `create(ImageProtoSchema)` to create a new message. + */ +export declare const ImageProtoSchema: GenMessage; +/** + * @generated from message agent.v1.ImageProto_Dimension + */ +export type ImageProto_Dimension = Message<"agent.v1.ImageProto_Dimension"> & { + /** + * @generated from field: int32 width = 1; + */ + width: number; + /** + * @generated from field: int32 height = 2; + */ + height: number; +}; +/** + * Describes the message agent.v1.ImageProto_Dimension. + * Use `create(ImageProto_DimensionSchema)` to create a new message. + */ +export declare const ImageProto_DimensionSchema: GenMessage; +/** + * Git repository information for a workspace + * + * @generated from message agent.v1.GitRepoInfo + */ +export type GitRepoInfo = Message<"agent.v1.GitRepoInfo"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string status = 2; + */ + status: string; + /** + * @generated from field: string branch_name = 3; + */ + branchName: string; + /** + * @generated from field: optional string remote_url = 4; + */ + remoteUrl?: string; +}; +/** + * Describes the message agent.v1.GitRepoInfo. + * Use `create(GitRepoInfoSchema)` to create a new message. + */ +export declare const GitRepoInfoSchema: GenMessage; +/** + * Environment details for system prompt/context + * + * @generated from message agent.v1.RequestContextEnv + */ +export type RequestContextEnv = Message<"agent.v1.RequestContextEnv"> & { + /** + * @generated from field: string os_version = 1; + */ + osVersion: string; + /** + * @generated from field: repeated string workspace_paths = 2; + */ + workspacePaths: string[]; + /** + * @generated from field: string shell = 3; + */ + shell: string; + /** + * @generated from field: bool sandbox_enabled = 5; + */ + sandboxEnabled: boolean; + /** + * @generated from field: string terminals_folder = 7; + */ + terminalsFolder: string; + /** + * @generated from field: string agent_shared_notes_folder = 8; + */ + agentSharedNotesFolder: string; + /** + * @generated from field: string agent_conversation_notes_folder = 9; + */ + agentConversationNotesFolder: string; + /** + * @generated from field: string time_zone = 10; + */ + timeZone: string; + /** + * Project-specific folder for storing artifacts, computed client-side as ~/.cursor/projects/{slug}/ + * + * @generated from field: string project_folder = 11; + */ + projectFolder: string; + /** + * Folder where agent conversation transcripts are stored + * + * @generated from field: string agent_transcripts_folder = 12; + */ + agentTranscriptsFolder: string; +}; +/** + * Describes the message agent.v1.RequestContextEnv. + * Use `create(RequestContextEnvSchema)` to create a new message. + */ +export declare const RequestContextEnvSchema: GenMessage; +/** + * @generated from message agent.v1.DebugModeConfig + */ +export type DebugModeConfig = Message<"agent.v1.DebugModeConfig"> & { + /** + * @generated from field: string log_path = 1; + */ + logPath: string; + /** + * @generated from field: string server_endpoint = 2; + */ + serverEndpoint: string; +}; +/** + * Describes the message agent.v1.DebugModeConfig. + * Use `create(DebugModeConfigSchema)` to create a new message. + */ +export declare const DebugModeConfigSchema: GenMessage; +/** + * @generated from message agent.v1.SkillDescriptor + */ +export type SkillDescriptor = Message<"agent.v1.SkillDescriptor"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + /** + * @generated from field: string description = 2; + */ + description: string; + /** + * @generated from field: string folder_path = 3; + */ + folderPath: string; + /** + * @generated from field: bool enabled = 4; + */ + enabled: boolean; + /** + * @generated from field: optional string parse_error = 5; + */ + parseError?: string; + /** + * @generated from field: string readme_file_path = 6; + */ + readmeFilePath: string; + /** + * @generated from field: int32 package_type = 7; + */ + packageType: number; +}; +/** + * Describes the message agent.v1.SkillDescriptor. + * Use `create(SkillDescriptorSchema)` to create a new message. + */ +export declare const SkillDescriptorSchema: GenMessage; +/** + * @generated from message agent.v1.SkillOptions + */ +export type SkillOptions = Message<"agent.v1.SkillOptions"> & { + /** + * @generated from field: repeated agent.v1.SkillDescriptor skill_descriptors = 1; + */ + skillDescriptors: SkillDescriptor[]; +}; +/** + * Describes the message agent.v1.SkillOptions. + * Use `create(SkillOptionsSchema)` to create a new message. + */ +export declare const SkillOptionsSchema: GenMessage; +/** + * @generated from message agent.v1.RequestContext + */ +export type RequestContext = Message<"agent.v1.RequestContext"> & { + /** + * All rules, categorized by the embedded type + * + * @generated from field: repeated agent.v1.CursorRule rules = 2; + */ + rules: CursorRule[]; + /** + * @generated from field: agent.v1.RequestContextEnv env = 4; + */ + env?: RequestContextEnv; + /** + * @generated from field: repeated agent.v1.RepositoryIndexingInfo repository_info = 6; + */ + repositoryInfo: RepositoryIndexingInfo[]; + /** + * @generated from field: repeated agent.v1.McpToolDefinition tools = 7; + */ + tools: McpToolDefinition[]; + /** + * @generated from field: optional string conversation_notes_listing = 8; + */ + conversationNotesListing?: string; + /** + * @generated from field: optional string shared_notes_listing = 9; + */ + sharedNotesListing?: string; + /** + * @generated from field: repeated agent.v1.GitRepoInfo git_repos = 11; + */ + gitRepos: GitRepoInfo[]; + /** + * @generated from field: repeated agent.v1.LsDirectoryTreeNode project_layouts = 13; + */ + projectLayouts: LsDirectoryTreeNode[]; + /** + * @generated from field: repeated agent.v1.McpInstructions mcp_instructions = 14; + */ + mcpInstructions: McpInstructions[]; + /** + * @generated from field: optional agent.v1.DebugModeConfig debug_mode_config = 15; + */ + debugModeConfig?: DebugModeConfig; + /** + * @generated from field: optional string cloud_rule = 16; + */ + cloudRule?: string; + /** + * @generated from field: optional bool web_search_enabled = 17; + */ + webSearchEnabled?: boolean; + /** + * @generated from field: optional agent.v1.SkillOptions skill_options = 18; + */ + skillOptions?: SkillOptions; + /** + * @generated from field: optional bool repository_info_should_query_prod = 19; + */ + repositoryInfoShouldQueryProd?: boolean; + /** + * @generated from field: map file_contents = 20; + */ + fileContents: { + [key: string]: string; + }; + /** + * Content of the user-intent/index.md file summarizing past conversations + * + * @generated from field: optional string user_intent_summary = 21; + */ + userIntentSummary?: string; + /** + * Local custom subagent definitions loaded from workspace configuration + * + * @generated from field: repeated agent.v1.CustomSubagent custom_subagents = 22; + */ + customSubagents: CustomSubagent[]; + /** + * MCP file system options for agent MCP tool descriptor access + * + * @generated from field: optional agent.v1.McpFileSystemOptions mcp_file_system_options = 23; + */ + mcpFileSystemOptions?: McpFileSystemOptions; +}; +/** + * Describes the message agent.v1.RequestContext. + * Use `create(RequestContextSchema)` to create a new message. + */ +export declare const RequestContextSchema: GenMessage; +/** + * @generated from message agent.v1.SandboxPolicy + */ +export type SandboxPolicy = Message<"agent.v1.SandboxPolicy"> & { + /** + * @generated from field: int32 type = 1; + */ + type: number; + /** + * @generated from field: optional bool network_access = 2; + */ + networkAccess?: boolean; + /** + * @generated from field: repeated string additional_readwrite_paths = 3; + */ + additionalReadwritePaths: string[]; + /** + * @generated from field: repeated string additional_readonly_paths = 4; + */ + additionalReadonlyPaths: string[]; + /** + * @generated from field: optional string debug_output_dir = 5; + */ + debugOutputDir?: string; + /** + * @generated from field: optional bool block_git_writes = 6; + */ + blockGitWrites?: boolean; + /** + * If true, excludes default tmp paths (/tmp/, /private/tmp/, /var/folders/) from the sandbox writable paths. Useful for testing readonly behavior. + * + * @generated from field: optional bool disable_tmp_write = 7; + */ + disableTmpWrite?: boolean; +}; +/** + * Describes the message agent.v1.SandboxPolicy. + * Use `create(SandboxPolicySchema)` to create a new message. + */ +export declare const SandboxPolicySchema: GenMessage; +/** + * @generated from message agent.v1.SelectedImage + */ +export type SelectedImage = Message<"agent.v1.SelectedImage"> & { + /** + * @generated from field: string uuid = 2; + */ + uuid: string; + /** + * @generated from field: string path = 3; + */ + path: string; + /** + * @generated from field: agent.v1.SelectedImage_Dimension dimension = 4; + */ + dimension?: SelectedImage_Dimension; + /** + * @generated from field: string mime_type = 7; + */ + mimeType: string; + /** + * @generated from oneof agent.v1.SelectedImage.data_or_blob_id + */ + dataOrBlobId: { + /** + * @generated from field: bytes blob_id = 1; + */ + value: Uint8Array; + case: "blobId"; + } | { + /** + * @generated from field: bytes data = 8; + */ + value: Uint8Array; + case: "data"; + } | { + /** + * @generated from field: agent.v1.SelectedImage_BlobIdWithData blob_id_with_data = 9; + */ + value: SelectedImage_BlobIdWithData; + case: "blobIdWithData"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.SelectedImage. + * Use `create(SelectedImageSchema)` to create a new message. + */ +export declare const SelectedImageSchema: GenMessage; +/** + * Contains both blob_id and data together, for when the client has both and wants to populate the server-side cache without re-uploading + * + * @generated from message agent.v1.SelectedImage_BlobIdWithData + */ +export type SelectedImage_BlobIdWithData = Message<"agent.v1.SelectedImage_BlobIdWithData"> & { + /** + * @generated from field: bytes blob_id = 1; + */ + blobId: Uint8Array; + /** + * @generated from field: bytes data = 2; + */ + data: Uint8Array; +}; +/** + * Describes the message agent.v1.SelectedImage_BlobIdWithData. + * Use `create(SelectedImage_BlobIdWithDataSchema)` to create a new message. + */ +export declare const SelectedImage_BlobIdWithDataSchema: GenMessage; +/** + * @generated from message agent.v1.SelectedImage_Dimension + */ +export type SelectedImage_Dimension = Message<"agent.v1.SelectedImage_Dimension"> & { + /** + * @generated from field: int32 width = 1; + */ + width: number; + /** + * @generated from field: int32 height = 2; + */ + height: number; +}; +/** + * Describes the message agent.v1.SelectedImage_Dimension. + * Use `create(SelectedImage_DimensionSchema)` to create a new message. + */ +export declare const SelectedImage_DimensionSchema: GenMessage; +/** + * Extra context entry that can be stored inline or as a blob reference + * + * @generated from message agent.v1.ExtraContextEntry + */ +export type ExtraContextEntry = Message<"agent.v1.ExtraContextEntry"> & { + /** + * @generated from oneof agent.v1.ExtraContextEntry.data_or_blob_id + */ + dataOrBlobId: { + /** + * @generated from field: string data = 1; + */ + value: string; + case: "data"; + } | { + /** + * @generated from field: bytes blob_id = 2; + */ + value: Uint8Array; + case: "blobId"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ExtraContextEntry. + * Use `create(ExtraContextEntrySchema)` to create a new message. + */ +export declare const ExtraContextEntrySchema: GenMessage; +/** + * A selected file from the UI + * + * @generated from message agent.v1.SelectedFile + */ +export type SelectedFile = Message<"agent.v1.SelectedFile"> & { + /** + * @generated from field: string content = 1; + */ + content: string; + /** + * This is the full path + * + * @generated from field: string path = 2; + */ + path: string; + /** + * @generated from field: optional string relative_path = 3; + */ + relativePath?: string; +}; +/** + * Describes the message agent.v1.SelectedFile. + * Use `create(SelectedFileSchema)` to create a new message. + */ +export declare const SelectedFileSchema: GenMessage; +/** + * A selected code selection from the UI + * + * @generated from message agent.v1.SelectedCodeSelection + */ +export type SelectedCodeSelection = Message<"agent.v1.SelectedCodeSelection"> & { + /** + * @generated from field: string content = 1; + */ + content: string; + /** + * This is the full path + * + * @generated from field: string path = 2; + */ + path: string; + /** + * @generated from field: optional string relative_path = 3; + */ + relativePath?: string; + /** + * @generated from field: agent.v1.Range range = 4; + */ + range?: Range; +}; +/** + * Describes the message agent.v1.SelectedCodeSelection. + * Use `create(SelectedCodeSelectionSchema)` to create a new message. + */ +export declare const SelectedCodeSelectionSchema: GenMessage; +/** + * A selected terminal from the UI + * + * @generated from message agent.v1.SelectedTerminal + */ +export type SelectedTerminal = Message<"agent.v1.SelectedTerminal"> & { + /** + * @generated from field: string content = 1; + */ + content: string; + /** + * @generated from field: optional string title = 2; + */ + title?: string; + /** + * @generated from field: optional string path = 3; + */ + path?: string; +}; +/** + * Describes the message agent.v1.SelectedTerminal. + * Use `create(SelectedTerminalSchema)` to create a new message. + */ +export declare const SelectedTerminalSchema: GenMessage; +/** + * A selected terminal selection from the UI + * + * @generated from message agent.v1.SelectedTerminalSelection + */ +export type SelectedTerminalSelection = Message<"agent.v1.SelectedTerminalSelection"> & { + /** + * @generated from field: string content = 1; + */ + content: string; + /** + * @generated from field: optional string title = 2; + */ + title?: string; + /** + * @generated from field: optional string path = 3; + */ + path?: string; + /** + * @generated from field: agent.v1.Range range = 4; + */ + range?: Range; +}; +/** + * Describes the message agent.v1.SelectedTerminalSelection. + * Use `create(SelectedTerminalSelectionSchema)` to create a new message. + */ +export declare const SelectedTerminalSelectionSchema: GenMessage; +/** + * A selected folder from the UI + * + * @generated from message agent.v1.SelectedFolder + */ +export type SelectedFolder = Message<"agent.v1.SelectedFolder"> & { + /** + * This is the full path + * + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: optional string relative_path = 2; + */ + relativePath?: string; + /** + * @generated from field: agent.v1.LsDirectoryTreeNode directory_tree = 3; + */ + directoryTree?: LsDirectoryTreeNode; +}; +/** + * Describes the message agent.v1.SelectedFolder. + * Use `create(SelectedFolderSchema)` to create a new message. + */ +export declare const SelectedFolderSchema: GenMessage; +/** + * An external link manually attached by the user + * + * @generated from message agent.v1.SelectedExternalLink + */ +export type SelectedExternalLink = Message<"agent.v1.SelectedExternalLink"> & { + /** + * @generated from field: string url = 1; + */ + url: string; + /** + * @generated from field: string uuid = 2; + */ + uuid: string; + /** + * For local PDF files Base64-encoded PDF content + * + * @generated from field: optional string pdf_content = 3; + */ + pdfContent?: string; + /** + * @generated from field: optional bool is_pdf = 4; + */ + isPdf?: boolean; + /** + * @generated from field: optional string filename = 5; + */ + filename?: string; +}; +/** + * Describes the message agent.v1.SelectedExternalLink. + * Use `create(SelectedExternalLinkSchema)` to create a new message. + */ +export declare const SelectedExternalLinkSchema: GenMessage; +/** + * A cursor rule manually attached by the user + * + * @generated from message agent.v1.SelectedCursorRule + */ +export type SelectedCursorRule = Message<"agent.v1.SelectedCursorRule"> & { + /** + * @generated from field: agent.v1.CursorRule rule = 1; + */ + rule?: CursorRule; +}; +/** + * Describes the message agent.v1.SelectedCursorRule. + * Use `create(SelectedCursorRuleSchema)` to create a new message. + */ +export declare const SelectedCursorRuleSchema: GenMessage; +/** + * Git diff (uncommitted changes in working tree) + * + * @generated from message agent.v1.SelectedGitDiff + */ +export type SelectedGitDiff = Message<"agent.v1.SelectedGitDiff"> & { + /** + * Raw git diff output + * + * @generated from field: string content = 1; + */ + content: string; +}; +/** + * Describes the message agent.v1.SelectedGitDiff. + * Use `create(SelectedGitDiffSchema)` to create a new message. + */ +export declare const SelectedGitDiffSchema: GenMessage; +/** + * Git diff from branch to main + * + * @generated from message agent.v1.SelectedGitDiffFromBranchToMain + */ +export type SelectedGitDiffFromBranchToMain = Message<"agent.v1.SelectedGitDiffFromBranchToMain"> & { + /** + * Raw git diff output + * + * @generated from field: string content = 1; + */ + content: string; +}; +/** + * Describes the message agent.v1.SelectedGitDiffFromBranchToMain. + * Use `create(SelectedGitDiffFromBranchToMainSchema)` to create a new message. + */ +export declare const SelectedGitDiffFromBranchToMainSchema: GenMessage; +/** + * A git commit manually attached by the user + * + * @generated from message agent.v1.SelectedGitCommit + */ +export type SelectedGitCommit = Message<"agent.v1.SelectedGitCommit"> & { + /** + * @generated from field: string sha = 1; + */ + sha: string; + /** + * @generated from field: string message = 2; + */ + message: string; + /** + * @generated from field: optional string description = 3; + */ + description?: string; + /** + * Raw git diff output for this commit + * + * @generated from field: string diff = 4; + */ + diff: string; +}; +/** + * Describes the message agent.v1.SelectedGitCommit. + * Use `create(SelectedGitCommitSchema)` to create a new message. + */ +export declare const SelectedGitCommitSchema: GenMessage; +/** + * A pull request manually attached by the user via @mention Uses the same folder structure as ViewedPullRequest for consistency + * + * @generated from message agent.v1.SelectedPullRequest + */ +export type SelectedPullRequest = Message<"agent.v1.SelectedPullRequest"> & { + /** + * @generated from field: int32 number = 1; + */ + number: number; + /** + * @generated from field: string url = 2; + */ + url: string; + /** + * @generated from field: optional string title = 3; + */ + title?: string; + /** + * Path to the folder containing PR details (diffs, metadata, etc.) + * + * @generated from field: string folder_path = 4; + */ + folderPath: string; + /** + * Summary JSON containing file list and diff sizes (contents of summary.json) + * + * @generated from field: optional string summary_json = 5; + */ + summaryJson?: string; + /** + * PR description/body + * + * @generated from field: optional string description = 6; + */ + description?: string; + /** + * If set, other fields are empty and data should be fetched from the blob + * + * @generated from field: optional bytes blob_id = 7; + */ + blobId?: Uint8Array; +}; +/** + * Describes the message agent.v1.SelectedPullRequest. + * Use `create(SelectedPullRequestSchema)` to create a new message. + */ +export declare const SelectedPullRequestSchema: GenMessage; +/** + * A selection from a pull request diff (for files that may not exist on disk) + * + * @generated from message agent.v1.SelectedGitPRDiffSelection + */ +export type SelectedGitPRDiffSelection = Message<"agent.v1.SelectedGitPRDiffSelection"> & { + /** + * Full URL to the pull request + * + * @generated from field: string pr_url = 1; + */ + prUrl: string; + /** + * Path to the file within the PR + * + * @generated from field: string file_path = 2; + */ + filePath: string; + /** + * Start line in the diff + * + * @generated from field: int32 start_line = 3; + */ + startLine: number; + /** + * End line in the diff + * + * @generated from field: int32 end_line = 4; + */ + endLine: number; + /** + * The diff content for this file (or selection) + * + * @generated from field: optional string diff_content = 5; + */ + diffContent?: string; + /** + * If set, other fields are empty and data should be fetched from the blob + * + * @generated from field: optional bytes blob_id = 6; + */ + blobId?: Uint8Array; +}; +/** + * Describes the message agent.v1.SelectedGitPRDiffSelection. + * Use `create(SelectedGitPRDiffSelectionSchema)` to create a new message. + */ +export declare const SelectedGitPRDiffSelectionSchema: GenMessage; +/** + * A cursor command manually attached by the user + * + * @generated from message agent.v1.SelectedCursorCommand + */ +export type SelectedCursorCommand = Message<"agent.v1.SelectedCursorCommand"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + /** + * @generated from field: string content = 2; + */ + content: string; +}; +/** + * Describes the message agent.v1.SelectedCursorCommand. + * Use `create(SelectedCursorCommandSchema)` to create a new message. + */ +export declare const SelectedCursorCommandSchema: GenMessage; +/** + * A documentation manually attached by the user + * + * @generated from message agent.v1.SelectedDocumentation + */ +export type SelectedDocumentation = Message<"agent.v1.SelectedDocumentation"> & { + /** + * @generated from field: string doc_id = 1; + */ + docId: string; + /** + * @generated from field: string name = 2; + */ + name: string; +}; +/** + * Describes the message agent.v1.SelectedDocumentation. + * Use `create(SelectedDocumentationSchema)` to create a new message. + */ +export declare const SelectedDocumentationSchema: GenMessage; +/** + * A past chat manually attached by the user (transcript file) + * + * @generated from message agent.v1.SelectedPastChat + */ +export type SelectedPastChat = Message<"agent.v1.SelectedPastChat"> & { + /** + * @generated from field: string agent_id = 1; + */ + agentId: string; + /** + * @generated from field: string name = 2; + */ + name: string; +}; +/** + * Describes the message agent.v1.SelectedPastChat. + * Use `create(SelectedPastChatSchema)` to create a new message. + */ +export declare const SelectedPastChatSchema: GenMessage; +/** + * A call frame from a stack trace + * + * @generated from message agent.v1.CallFrame + */ +export type CallFrame = Message<"agent.v1.CallFrame"> & { + /** + * @generated from field: optional string function_name = 1; + */ + functionName?: string; + /** + * @generated from field: optional string url = 2; + */ + url?: string; + /** + * @generated from field: optional int32 line_number = 3; + */ + lineNumber?: number; + /** + * @generated from field: optional int32 column_number = 4; + */ + columnNumber?: number; +}; +/** + * Describes the message agent.v1.CallFrame. + * Use `create(CallFrameSchema)` to create a new message. + */ +export declare const CallFrameSchema: GenMessage; +/** + * A stack trace + * + * @generated from message agent.v1.StackTrace + */ +export type StackTrace = Message<"agent.v1.StackTrace"> & { + /** + * @generated from field: repeated agent.v1.CallFrame call_frames = 1; + */ + callFrames: CallFrame[]; + /** + * @generated from field: optional string raw_stack_trace = 2; + */ + rawStackTrace?: string; +}; +/** + * Describes the message agent.v1.StackTrace. + * Use `create(StackTraceSchema)` to create a new message. + */ +export declare const StackTraceSchema: GenMessage; +/** + * A console log entry from the runtime + * + * @generated from message agent.v1.SelectedConsoleLog + */ +export type SelectedConsoleLog = Message<"agent.v1.SelectedConsoleLog"> & { + /** + * @generated from field: string message = 1; + */ + message: string; + /** + * * Unix timestamp in milliseconds when this log entry was created + * + * @generated from field: double timestamp = 2; + */ + timestamp: number; + /** + * @generated from field: string level = 3; + */ + level: string; + /** + * @generated from field: string client_name = 4; + */ + clientName: string; + /** + * @generated from field: string session_id = 5; + */ + sessionId: string; + /** + * @generated from field: optional agent.v1.StackTrace stack_trace = 6; + */ + stackTrace?: StackTrace; + /** + * @generated from field: optional string object_data_json = 7; + */ + objectDataJson?: string; +}; +/** + * Describes the message agent.v1.SelectedConsoleLog. + * Use `create(SelectedConsoleLogSchema)` to create a new message. + */ +export declare const SelectedConsoleLogSchema: GenMessage; +/** + * A UI element picked by the user from the runtime + * + * @generated from message agent.v1.SelectedUIElement + */ +export type SelectedUIElement = Message<"agent.v1.SelectedUIElement"> & { + /** + * @generated from field: string element = 1; + */ + element: string; + /** + * @generated from field: string xpath = 2; + */ + xpath: string; + /** + * @generated from field: string text_content = 3; + */ + textContent: string; + /** + * @generated from field: string extra = 4; + */ + extra: string; + /** + * @generated from field: optional string component = 5; + */ + component?: string; + /** + * @generated from field: optional string component_props_json = 6; + */ + componentPropsJson?: string; +}; +/** + * Describes the message agent.v1.SelectedUIElement. + * Use `create(SelectedUIElementSchema)` to create a new message. + */ +export declare const SelectedUIElementSchema: GenMessage; +/** + * A subagent selected by the user from the slash menu + * + * @generated from message agent.v1.SelectedSubagent + */ +export type SelectedSubagent = Message<"agent.v1.SelectedSubagent"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; +/** + * Describes the message agent.v1.SelectedSubagent. + * Use `create(SelectedSubagentSchema)` to create a new message. + */ +export declare const SelectedSubagentSchema: GenMessage; +/** + * Container for selected context from the UI + * + * @generated from message agent.v1.SelectedContext + */ +export type SelectedContext = Message<"agent.v1.SelectedContext"> & { + /** + * @generated from field: repeated agent.v1.SelectedImage selected_images = 1; + */ + selectedImages: SelectedImage[]; + /** + * @generated from field: optional agent.v1.InvocationContext invocation_context = 2; + */ + invocationContext?: InvocationContext; + /** + * Temporary hack for IDE-based context (@filename, @Diff, etc.) in background agents only. TODO: remove once proper IDE context format is implemented. + * + * @generated from field: repeated string extra_context = 3; + */ + extraContext: string[]; + /** + * @generated from field: repeated agent.v1.ExtraContextEntry extra_context_entries = 16; + */ + extraContextEntries: ExtraContextEntry[]; + /** + * New context types + * + * @generated from field: repeated agent.v1.SelectedFile files = 4; + */ + files: SelectedFile[]; + /** + * @generated from field: repeated agent.v1.SelectedCodeSelection code_selections = 5; + */ + codeSelections: SelectedCodeSelection[]; + /** + * @generated from field: repeated agent.v1.SelectedTerminal terminals = 6; + */ + terminals: SelectedTerminal[]; + /** + * @generated from field: repeated agent.v1.SelectedTerminalSelection terminal_selections = 7; + */ + terminalSelections: SelectedTerminalSelection[]; + /** + * @generated from field: repeated agent.v1.SelectedFolder folders = 8; + */ + folders: SelectedFolder[]; + /** + * @generated from field: repeated agent.v1.SelectedExternalLink external_links = 9; + */ + externalLinks: SelectedExternalLink[]; + /** + * @generated from field: repeated agent.v1.SelectedCursorRule cursor_rules = 10; + */ + cursorRules: SelectedCursorRule[]; + /** + * @generated from field: optional agent.v1.SelectedGitDiff git_diff = 18; + */ + gitDiff?: SelectedGitDiff; + /** + * @generated from field: optional agent.v1.SelectedGitDiffFromBranchToMain git_diff_from_branch_to_main = 11; + */ + gitDiffFromBranchToMain?: SelectedGitDiffFromBranchToMain; + /** + * @generated from field: repeated agent.v1.SelectedCursorCommand cursor_commands = 12; + */ + cursorCommands: SelectedCursorCommand[]; + /** + * @generated from field: repeated agent.v1.SelectedDocumentation documentations = 13; + */ + documentations: SelectedDocumentation[]; + /** + * @generated from field: repeated agent.v1.SelectedUIElement ui_elements = 14; + */ + uiElements: SelectedUIElement[]; + /** + * @generated from field: repeated agent.v1.SelectedConsoleLog console_logs = 15; + */ + consoleLogs: SelectedConsoleLog[]; + /** + * @generated from field: repeated agent.v1.SelectedGitCommit git_commits = 17; + */ + gitCommits: SelectedGitCommit[]; + /** + * @generated from field: repeated agent.v1.SelectedPastChat past_chats = 19; + */ + pastChats: SelectedPastChat[]; + /** + * @generated from field: repeated agent.v1.SelectedGitPRDiffSelection git_pr_diff_selections = 20; + */ + gitPrDiffSelections: SelectedGitPRDiffSelection[]; + /** + * @generated from field: repeated agent.v1.SelectedPullRequest selected_pull_requests = 21; + */ + selectedPullRequests: SelectedPullRequest[]; + /** + * @generated from field: repeated agent.v1.SelectedSubagent selected_subagents = 22; + */ + selectedSubagents: SelectedSubagent[]; +}; +/** + * Describes the message agent.v1.SelectedContext. + * Use `create(SelectedContextSchema)` to create a new message. + */ +export declare const SelectedContextSchema: GenMessage; +/** + * InvocationContext represents the context from the external app/integration that triggered this agent request. + * + * @generated from message agent.v1.InvocationContext + */ +export type InvocationContext = Message<"agent.v1.InvocationContext"> & { + /** + * @generated from oneof agent.v1.InvocationContext.data + */ + data: { + /** + * @generated from field: agent.v1.InvocationContext_SlackThread slack_thread = 1; + */ + value: InvocationContext_SlackThread; + case: "slackThread"; + } | { + /** + * @generated from field: agent.v1.InvocationContext_GithubPR github_pr = 2; + */ + value: InvocationContext_GithubPR; + case: "githubPr"; + } | { + /** + * @generated from field: agent.v1.InvocationContext_IdeState ide_state = 3; + */ + value: InvocationContext_IdeState; + case: "ideState"; + } | { + /** + * @generated from field: bytes blob_id = 10; + */ + value: Uint8Array; + case: "blobId"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.InvocationContext. + * Use `create(InvocationContextSchema)` to create a new message. + */ +export declare const InvocationContextSchema: GenMessage; +/** + * @generated from message agent.v1.InvocationContext_SlackThread + */ +export type InvocationContext_SlackThread = Message<"agent.v1.InvocationContext_SlackThread"> & { + /** + * @generated from field: string thread = 1; + */ + thread: string; + /** + * @generated from field: optional string channel_name = 2; + */ + channelName?: string; + /** + * @generated from field: optional string channel_purpose = 3; + */ + channelPurpose?: string; + /** + * @generated from field: optional string channel_topic = 4; + */ + channelTopic?: string; +}; +/** + * Describes the message agent.v1.InvocationContext_SlackThread. + * Use `create(InvocationContext_SlackThreadSchema)` to create a new message. + */ +export declare const InvocationContext_SlackThreadSchema: GenMessage; +/** + * @generated from message agent.v1.InvocationContext_GithubPR + */ +export type InvocationContext_GithubPR = Message<"agent.v1.InvocationContext_GithubPR"> & { + /** + * @generated from field: string title = 1; + */ + title: string; + /** + * @generated from field: string description = 2; + */ + description: string; + /** + * @generated from field: string comments = 3; + */ + comments: string; + /** + * @generated from field: optional string ci_failures = 4; + */ + ciFailures?: string; +}; +/** + * Describes the message agent.v1.InvocationContext_GithubPR. + * Use `create(InvocationContext_GithubPRSchema)` to create a new message. + */ +export declare const InvocationContext_GithubPRSchema: GenMessage; +/** + * @generated from message agent.v1.InvocationContext_IdeState + */ +export type InvocationContext_IdeState = Message<"agent.v1.InvocationContext_IdeState"> & { + /** + * @generated from field: repeated agent.v1.InvocationContext_IdeState_File visible_files = 1; + */ + visibleFiles: InvocationContext_IdeState_File[]; + /** + * @generated from field: repeated agent.v1.InvocationContext_IdeState_File recently_viewed_files = 2; + */ + recentlyViewedFiles: InvocationContext_IdeState_File[]; + /** + * PRs currently being viewed in the review editor (if any) + * + * @generated from field: repeated agent.v1.InvocationContext_IdeState_ViewedPullRequest currently_viewed_prs = 3; + */ + currentlyViewedPrs: InvocationContext_IdeState_ViewedPullRequest[]; +}; +/** + * Describes the message agent.v1.InvocationContext_IdeState. + * Use `create(InvocationContext_IdeStateSchema)` to create a new message. + */ +export declare const InvocationContext_IdeStateSchema: GenMessage; +/** + * @generated from message agent.v1.InvocationContext_IdeState_File + */ +export type InvocationContext_IdeState_File = Message<"agent.v1.InvocationContext_IdeState_File"> & { + /** + * This is the full path + * + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: optional string relative_path = 2; + */ + relativePath?: string; + /** + * Present if file is currently focused + * + * @generated from field: optional agent.v1.InvocationContext_IdeState_File_CursorPosition cursor_position = 3; + */ + cursorPosition?: InvocationContext_IdeState_File_CursorPosition; + /** + * @generated from field: int32 total_lines = 4; + */ + totalLines: number; + /** + * Present for terminal files + * + * @generated from field: optional string active_command = 5; + */ + activeCommand?: string; +}; +/** + * Describes the message agent.v1.InvocationContext_IdeState_File. + * Use `create(InvocationContext_IdeState_FileSchema)` to create a new message. + */ +export declare const InvocationContext_IdeState_FileSchema: GenMessage; +/** + * @generated from message agent.v1.InvocationContext_IdeState_File_CursorPosition + */ +export type InvocationContext_IdeState_File_CursorPosition = Message<"agent.v1.InvocationContext_IdeState_File_CursorPosition"> & { + /** + * @generated from field: int32 line = 1; + */ + line: number; + /** + * @generated from field: string text = 2; + */ + text: string; +}; +/** + * Describes the message agent.v1.InvocationContext_IdeState_File_CursorPosition. + * Use `create(InvocationContext_IdeState_File_CursorPositionSchema)` to create a new message. + */ +export declare const InvocationContext_IdeState_File_CursorPositionSchema: GenMessage; +/** + * Information about a PR currently being viewed in a review editor + * + * @generated from message agent.v1.InvocationContext_IdeState_ViewedPullRequest + */ +export type InvocationContext_IdeState_ViewedPullRequest = Message<"agent.v1.InvocationContext_IdeState_ViewedPullRequest"> & { + /** + * @generated from field: int32 number = 1; + */ + number: number; + /** + * @generated from field: string url = 2; + */ + url: string; + /** + * @generated from field: optional string title = 3; + */ + title?: string; + /** + * Path to the folder containing PR details (diffs, metadata, etc.) + * + * @generated from field: optional string folder_path = 4; + */ + folderPath?: string; + /** + * Summary JSON containing file list and diff sizes (contents of summary.json) + * + * @generated from field: optional string summary_json = 5; + */ + summaryJson?: string; + /** + * PR description/body + * + * @generated from field: optional string description = 6; + */ + description?: string; +}; +/** + * Describes the message agent.v1.InvocationContext_IdeState_ViewedPullRequest. + * Use `create(InvocationContext_IdeState_ViewedPullRequestSchema)` to create a new message. + */ +export declare const InvocationContext_IdeState_ViewedPullRequestSchema: GenMessage; +/** + * @generated from message agent.v1.SetupVmEnvironmentArgs + */ +export type SetupVmEnvironmentArgs = Message<"agent.v1.SetupVmEnvironmentArgs"> & { + /** + * Command to install runtime dependencies (e.g., "npm install") + * + * @generated from field: string install_command = 2; + */ + installCommand: string; + /** + * @generated from field: string start_command = 3; + */ + startCommand: string; +}; +/** + * Describes the message agent.v1.SetupVmEnvironmentArgs. + * Use `create(SetupVmEnvironmentArgsSchema)` to create a new message. + */ +export declare const SetupVmEnvironmentArgsSchema: GenMessage; +/** + * Result of VM environment setup operations + * + * @generated from message agent.v1.SetupVmEnvironmentResult + */ +export type SetupVmEnvironmentResult = Message<"agent.v1.SetupVmEnvironmentResult"> & { + /** + * @generated from oneof agent.v1.SetupVmEnvironmentResult.result + */ + result: { + /** + * @generated from field: agent.v1.SetupVmEnvironmentSuccess success = 1; + */ + value: SetupVmEnvironmentSuccess; + case: "success"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.SetupVmEnvironmentResult. + * Use `create(SetupVmEnvironmentResultSchema)` to create a new message. + */ +export declare const SetupVmEnvironmentResultSchema: GenMessage; +/** + * Successful VM environment setup result + * + * @generated from message agent.v1.SetupVmEnvironmentSuccess + */ +export type SetupVmEnvironmentSuccess = Message<"agent.v1.SetupVmEnvironmentSuccess"> & {}; +/** + * Describes the message agent.v1.SetupVmEnvironmentSuccess. + * Use `create(SetupVmEnvironmentSuccessSchema)` to create a new message. + */ +export declare const SetupVmEnvironmentSuccessSchema: GenMessage; +/** + * Tool call structure for SetupVmEnvironment + * + * @generated from message agent.v1.SetupVmEnvironmentToolCall + */ +export type SetupVmEnvironmentToolCall = Message<"agent.v1.SetupVmEnvironmentToolCall"> & { + /** + * Arguments for the tool call + * + * @generated from field: agent.v1.SetupVmEnvironmentArgs args = 1; + */ + args?: SetupVmEnvironmentArgs; + /** + * Result of the tool call (populated after execution) + * + * @generated from field: agent.v1.SetupVmEnvironmentResult result = 2; + */ + result?: SetupVmEnvironmentResult; +}; +/** + * Describes the message agent.v1.SetupVmEnvironmentToolCall. + * Use `create(SetupVmEnvironmentToolCallSchema)` to create a new message. + */ +export declare const SetupVmEnvironmentToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.ShellCommandParsingResult + */ +export type ShellCommandParsingResult = Message<"agent.v1.ShellCommandParsingResult"> & { + /** + * @generated from field: bool parsing_failed = 1; + */ + parsingFailed: boolean; + /** + * @generated from field: repeated agent.v1.ShellCommandParsingResult_ExecutableCommand executable_commands = 2; + */ + executableCommands: ShellCommandParsingResult_ExecutableCommand[]; + /** + * @generated from field: bool has_redirects = 3; + */ + hasRedirects: boolean; + /** + * @generated from field: bool has_command_substitution = 4; + */ + hasCommandSubstitution: boolean; +}; +/** + * Describes the message agent.v1.ShellCommandParsingResult. + * Use `create(ShellCommandParsingResultSchema)` to create a new message. + */ +export declare const ShellCommandParsingResultSchema: GenMessage; +/** + * @generated from message agent.v1.ShellCommandParsingResult_ExecutableCommandArg + */ +export type ShellCommandParsingResult_ExecutableCommandArg = Message<"agent.v1.ShellCommandParsingResult_ExecutableCommandArg"> & { + /** + * @generated from field: string type = 1; + */ + type: string; + /** + * @generated from field: string value = 2; + */ + value: string; +}; +/** + * Describes the message agent.v1.ShellCommandParsingResult_ExecutableCommandArg. + * Use `create(ShellCommandParsingResult_ExecutableCommandArgSchema)` to create a new message. + */ +export declare const ShellCommandParsingResult_ExecutableCommandArgSchema: GenMessage; +/** + * @generated from message agent.v1.ShellCommandParsingResult_ExecutableCommand + */ +export type ShellCommandParsingResult_ExecutableCommand = Message<"agent.v1.ShellCommandParsingResult_ExecutableCommand"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + /** + * @generated from field: repeated agent.v1.ShellCommandParsingResult_ExecutableCommandArg args = 2; + */ + args: ShellCommandParsingResult_ExecutableCommandArg[]; + /** + * @generated from field: string full_text = 3; + */ + fullText: string; +}; +/** + * Describes the message agent.v1.ShellCommandParsingResult_ExecutableCommand. + * Use `create(ShellCommandParsingResult_ExecutableCommandSchema)` to create a new message. + */ +export declare const ShellCommandParsingResult_ExecutableCommandSchema: GenMessage; +/** + * @generated from message agent.v1.ShellArgs + */ +export type ShellArgs = Message<"agent.v1.ShellArgs"> & { + /** + * @generated from field: string command = 1; + */ + command: string; + /** + * @generated from field: string working_directory = 2; + */ + workingDirectory: string; + /** + * @generated from field: int32 timeout = 3; + */ + timeout: number; + /** + * @generated from field: string tool_call_id = 4; + */ + toolCallId: string; + /** + * @generated from field: repeated string simple_commands = 5; + */ + simpleCommands: string[]; + /** + * @generated from field: bool has_input_redirect = 6; + */ + hasInputRedirect: boolean; + /** + * @generated from field: bool has_output_redirect = 7; + */ + hasOutputRedirect: boolean; + /** + * Deprecated: use parsing_result instead @deprecated simpleCommands = []; Deprecated: use parsing_result instead @deprecated hasInputRedirect = false; Deprecated: use parsing_result instead @deprecated hasOutputRedirect = false; + * + * @generated from field: agent.v1.ShellCommandParsingResult parsing_result = 8; + */ + parsingResult?: ShellCommandParsingResult; + /** + * @generated from field: optional agent.v1.SandboxPolicy requested_sandbox_policy = 9; + */ + requestedSandboxPolicy?: SandboxPolicy; + /** + * If output size exceeds this threshold (in bytes), write to file instead of inline. If unset or 0, always use inline output. + * + * @generated from field: optional uint64 file_output_threshold_bytes = 10; + */ + fileOutputThresholdBytes?: bigint; + /** + * @generated from field: bool is_background = 11; + */ + isBackground: boolean; + /** + * @generated from field: bool skip_approval = 12; + */ + skipApproval: boolean; + /** + * @generated from field: int32 timeout_behavior = 13; + */ + timeoutBehavior: number; + /** + * Hard timeout: kill the command after this many ms, even if running in background + * + * @generated from field: optional int32 hard_timeout = 14; + */ + hardTimeout?: number; +}; +/** + * Describes the message agent.v1.ShellArgs. + * Use `create(ShellArgsSchema)` to create a new message. + */ +export declare const ShellArgsSchema: GenMessage; +/** + * @generated from message agent.v1.ShellResult + */ +export type ShellResult = Message<"agent.v1.ShellResult"> & { + /** + * @generated from field: optional agent.v1.SandboxPolicy sandbox_policy = 101; + */ + sandboxPolicy?: SandboxPolicy; + /** + * Rendering is affected by this flag, pass forward from args. + * + * @generated from field: optional bool is_background = 102; + */ + isBackground?: boolean; + /** + * Rendering is affected by this flag, pass forward from args. + * + * @generated from field: optional string terminals_folder = 103; + */ + terminalsFolder?: string; + /** + * Process ID, used for backgrounded shells. + * + * @generated from field: optional uint32 pid = 104; + */ + pid?: number; + /** + * @generated from oneof agent.v1.ShellResult.result + */ + result: { + /** + * @generated from field: agent.v1.ShellSuccess success = 1; + */ + value: ShellSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.ShellFailure failure = 2; + */ + value: ShellFailure; + case: "failure"; + } | { + /** + * @generated from field: agent.v1.ShellTimeout timeout = 3; + */ + value: ShellTimeout; + case: "timeout"; + } | { + /** + * @generated from field: agent.v1.ShellRejected rejected = 4; + */ + value: ShellRejected; + case: "rejected"; + } | { + /** + * @generated from field: agent.v1.ShellSpawnError spawn_error = 5; + */ + value: ShellSpawnError; + case: "spawnError"; + } | { + /** + * @generated from field: agent.v1.ShellPermissionDenied permission_denied = 7; + */ + value: ShellPermissionDenied; + case: "permissionDenied"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ShellResult. + * Use `create(ShellResultSchema)` to create a new message. + */ +export declare const ShellResultSchema: GenMessage; +/** + * @generated from message agent.v1.ShellStreamStdout + */ +export type ShellStreamStdout = Message<"agent.v1.ShellStreamStdout"> & { + /** + * @generated from field: string data = 1; + */ + data: string; +}; +/** + * Describes the message agent.v1.ShellStreamStdout. + * Use `create(ShellStreamStdoutSchema)` to create a new message. + */ +export declare const ShellStreamStdoutSchema: GenMessage; +/** + * @generated from message agent.v1.ShellStreamStderr + */ +export type ShellStreamStderr = Message<"agent.v1.ShellStreamStderr"> & { + /** + * @generated from field: string data = 1; + */ + data: string; +}; +/** + * Describes the message agent.v1.ShellStreamStderr. + * Use `create(ShellStreamStderrSchema)` to create a new message. + */ +export declare const ShellStreamStderrSchema: GenMessage; +/** + * @generated from message agent.v1.ShellStreamExit + */ +export type ShellStreamExit = Message<"agent.v1.ShellStreamExit"> & { + /** + * @generated from field: uint32 code = 1; + */ + code: number; + /** + * @generated from field: string cwd = 2; + */ + cwd: string; + /** + * @generated from field: optional agent.v1.OutputLocation output_location = 3; + */ + outputLocation?: OutputLocation; + /** + * @generated from field: bool aborted = 4; + */ + aborted: boolean; + /** + * If aborted is true, this field indicates the reason for the abort + * + * @generated from field: optional int32 abort_reason = 5; + */ + abortReason?: number; +}; +/** + * Describes the message agent.v1.ShellStreamExit. + * Use `create(ShellStreamExitSchema)` to create a new message. + */ +export declare const ShellStreamExitSchema: GenMessage; +/** + * @generated from message agent.v1.ShellStreamStart + */ +export type ShellStreamStart = Message<"agent.v1.ShellStreamStart"> & { + /** + * @generated from field: optional agent.v1.SandboxPolicy sandbox_policy = 1; + */ + sandboxPolicy?: SandboxPolicy; +}; +/** + * Describes the message agent.v1.ShellStreamStart. + * Use `create(ShellStreamStartSchema)` to create a new message. + */ +export declare const ShellStreamStartSchema: GenMessage; +/** + * @generated from message agent.v1.ShellStreamBackgrounded + */ +export type ShellStreamBackgrounded = Message<"agent.v1.ShellStreamBackgrounded"> & { + /** + * @generated from field: uint32 shell_id = 1; + */ + shellId: number; + /** + * @generated from field: string command = 2; + */ + command: string; + /** + * @generated from field: string working_directory = 3; + */ + workingDirectory: string; + /** + * @generated from field: optional uint32 pid = 4; + */ + pid?: number; + /** + * The ms_to_wait value that was used for backgrounding, for display purposes + * + * @generated from field: optional int32 ms_to_wait = 5; + */ + msToWait?: number; +}; +/** + * Describes the message agent.v1.ShellStreamBackgrounded. + * Use `create(ShellStreamBackgroundedSchema)` to create a new message. + */ +export declare const ShellStreamBackgroundedSchema: GenMessage; +/** + * @generated from message agent.v1.ShellStream + */ +export type ShellStream = Message<"agent.v1.ShellStream"> & { + /** + * @generated from oneof agent.v1.ShellStream.event + */ + event: { + /** + * @generated from field: agent.v1.ShellStreamStdout stdout = 1; + */ + value: ShellStreamStdout; + case: "stdout"; + } | { + /** + * @generated from field: agent.v1.ShellStreamStderr stderr = 2; + */ + value: ShellStreamStderr; + case: "stderr"; + } | { + /** + * @generated from field: agent.v1.ShellStreamExit exit = 3; + */ + value: ShellStreamExit; + case: "exit"; + } | { + /** + * @generated from field: agent.v1.ShellStreamStart start = 4; + */ + value: ShellStreamStart; + case: "start"; + } | { + /** + * @generated from field: agent.v1.ShellRejected rejected = 5; + */ + value: ShellRejected; + case: "rejected"; + } | { + /** + * @generated from field: agent.v1.ShellPermissionDenied permission_denied = 6; + */ + value: ShellPermissionDenied; + case: "permissionDenied"; + } | { + /** + * @generated from field: agent.v1.ShellStreamBackgrounded backgrounded = 7; + */ + value: ShellStreamBackgrounded; + case: "backgrounded"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ShellStream. + * Use `create(ShellStreamSchema)` to create a new message. + */ +export declare const ShellStreamSchema: GenMessage; +/** + * @generated from message agent.v1.OutputLocation + */ +export type OutputLocation = Message<"agent.v1.OutputLocation"> & { + /** + * Absolute path to the output file + * + * @generated from field: string file_path = 1; + */ + filePath: string; + /** + * Size of the output in bytes + * + * @generated from field: int64 size_bytes = 2; + */ + sizeBytes: bigint; + /** + * Number of lines in the output + * + * @generated from field: int64 line_count = 3; + */ + lineCount: bigint; +}; +/** + * Describes the message agent.v1.OutputLocation. + * Use `create(OutputLocationSchema)` to create a new message. + */ +export declare const OutputLocationSchema: GenMessage; +/** + * @generated from message agent.v1.ShellSuccess + */ +export type ShellSuccess = Message<"agent.v1.ShellSuccess"> & { + /** + * @generated from field: string command = 1; + */ + command: string; + /** + * @generated from field: string working_directory = 2; + */ + workingDirectory: string; + /** + * @generated from field: int32 exit_code = 3; + */ + exitCode: number; + /** + * @generated from field: string signal = 4; + */ + signal: string; + /** + * Inline stdout - populated when write_output_to_file is false, empty when true + * + * @generated from field: string stdout = 5; + */ + stdout: string; + /** + * Inline stderr - populated when write_output_to_file is false, empty when true + * + * @generated from field: string stderr = 6; + */ + stderr: string; + /** + * @generated from field: int32 execution_time = 7; + */ + executionTime: number; + /** + * File-based output - populated when write_output_to_file is true (chronologically merged stdout+stderr) + * + * @generated from field: optional agent.v1.OutputLocation output_location = 8; + */ + outputLocation?: OutputLocation; + /** + * Used by background shell executor + * + * @generated from field: optional uint32 shell_id = 9; + */ + shellId?: number; + /** + * @generated from field: optional string interleaved_output = 10; + */ + interleavedOutput?: string; + /** + * Process ID, used for backgrounded shells + * + * @generated from field: optional uint32 pid = 11; + */ + pid?: number; + /** + * The ms_to_wait value used for backgrounding (for display in result) + * + * @generated from field: optional int32 ms_to_wait = 12; + */ + msToWait?: number; +}; +/** + * Describes the message agent.v1.ShellSuccess. + * Use `create(ShellSuccessSchema)` to create a new message. + */ +export declare const ShellSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.ShellFailure + */ +export type ShellFailure = Message<"agent.v1.ShellFailure"> & { + /** + * @generated from field: string command = 1; + */ + command: string; + /** + * @generated from field: string working_directory = 2; + */ + workingDirectory: string; + /** + * @generated from field: int32 exit_code = 3; + */ + exitCode: number; + /** + * @generated from field: string signal = 4; + */ + signal: string; + /** + * Inline stdout - populated when write_output_to_file is false, empty when true + * + * @generated from field: string stdout = 5; + */ + stdout: string; + /** + * Inline stderr - populated when write_output_to_file is false, empty when true + * + * @generated from field: string stderr = 6; + */ + stderr: string; + /** + * @generated from field: int32 execution_time = 7; + */ + executionTime: number; + /** + * File-based output - populated when write_output_to_file is true (chronologically merged stdout+stderr) + * + * @generated from field: optional agent.v1.OutputLocation output_location = 8; + */ + outputLocation?: OutputLocation; + /** + * @generated from field: optional string interleaved_output = 9; + */ + interleavedOutput?: string; + /** + * If the command was aborted, this indicates the reason + * + * @generated from field: optional int32 abort_reason = 10; + */ + abortReason?: number; + /** + * Whether the command was aborted (by user or timeout) + * + * @generated from field: bool aborted = 11; + */ + aborted: boolean; +}; +/** + * Describes the message agent.v1.ShellFailure. + * Use `create(ShellFailureSchema)` to create a new message. + */ +export declare const ShellFailureSchema: GenMessage; +/** + * @generated from message agent.v1.ShellTimeout + */ +export type ShellTimeout = Message<"agent.v1.ShellTimeout"> & { + /** + * @generated from field: string command = 1; + */ + command: string; + /** + * @generated from field: string working_directory = 2; + */ + workingDirectory: string; + /** + * @generated from field: int32 timeout_ms = 3; + */ + timeoutMs: number; +}; +/** + * Describes the message agent.v1.ShellTimeout. + * Use `create(ShellTimeoutSchema)` to create a new message. + */ +export declare const ShellTimeoutSchema: GenMessage; +/** + * @generated from message agent.v1.ShellRejected + */ +export type ShellRejected = Message<"agent.v1.ShellRejected"> & { + /** + * @generated from field: string command = 1; + */ + command: string; + /** + * @generated from field: string working_directory = 2; + */ + workingDirectory: string; + /** + * @generated from field: string reason = 3; + */ + reason: string; + /** + * @generated from field: bool is_readonly = 4; + */ + isReadonly: boolean; +}; +/** + * Describes the message agent.v1.ShellRejected. + * Use `create(ShellRejectedSchema)` to create a new message. + */ +export declare const ShellRejectedSchema: GenMessage; +/** + * @generated from message agent.v1.ShellPermissionDenied + */ +export type ShellPermissionDenied = Message<"agent.v1.ShellPermissionDenied"> & { + /** + * @generated from field: string command = 1; + */ + command: string; + /** + * @generated from field: string working_directory = 2; + */ + workingDirectory: string; + /** + * @generated from field: string error = 3; + */ + error: string; + /** + * @generated from field: bool is_readonly = 4; + */ + isReadonly: boolean; +}; +/** + * Describes the message agent.v1.ShellPermissionDenied. + * Use `create(ShellPermissionDeniedSchema)` to create a new message. + */ +export declare const ShellPermissionDeniedSchema: GenMessage; +/** + * @generated from message agent.v1.ShellSpawnError + */ +export type ShellSpawnError = Message<"agent.v1.ShellSpawnError"> & { + /** + * @generated from field: string command = 1; + */ + command: string; + /** + * @generated from field: string working_directory = 2; + */ + workingDirectory: string; + /** + * @generated from field: string error = 3; + */ + error: string; +}; +/** + * Describes the message agent.v1.ShellSpawnError. + * Use `create(ShellSpawnErrorSchema)` to create a new message. + */ +export declare const ShellSpawnErrorSchema: GenMessage; +/** + * @generated from message agent.v1.ShellPartialResult + */ +export type ShellPartialResult = Message<"agent.v1.ShellPartialResult"> & { + /** + * @generated from field: string stdout_delta = 1; + */ + stdoutDelta: string; + /** + * @generated from field: string stderr_delta = 2; + */ + stderrDelta: string; +}; +/** + * Describes the message agent.v1.ShellPartialResult. + * Use `create(ShellPartialResultSchema)` to create a new message. + */ +export declare const ShellPartialResultSchema: GenMessage; +/** + * @generated from message agent.v1.ShellToolCall + */ +export type ShellToolCall = Message<"agent.v1.ShellToolCall"> & { + /** + * @generated from field: agent.v1.ShellArgs args = 1; + */ + args?: ShellArgs; + /** + * @generated from field: agent.v1.ShellResult result = 2; + */ + result?: ShellResult; +}; +/** + * Describes the message agent.v1.ShellToolCall. + * Use `create(ShellToolCallSchema)` to create a new message. + */ +export declare const ShellToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.ShellToolCallStdoutDelta + */ +export type ShellToolCallStdoutDelta = Message<"agent.v1.ShellToolCallStdoutDelta"> & { + /** + * @generated from field: string content = 1; + */ + content: string; +}; +/** + * Describes the message agent.v1.ShellToolCallStdoutDelta. + * Use `create(ShellToolCallStdoutDeltaSchema)` to create a new message. + */ +export declare const ShellToolCallStdoutDeltaSchema: GenMessage; +/** + * @generated from message agent.v1.ShellToolCallStderrDelta + */ +export type ShellToolCallStderrDelta = Message<"agent.v1.ShellToolCallStderrDelta"> & { + /** + * @generated from field: string content = 1; + */ + content: string; +}; +/** + * Describes the message agent.v1.ShellToolCallStderrDelta. + * Use `create(ShellToolCallStderrDeltaSchema)` to create a new message. + */ +export declare const ShellToolCallStderrDeltaSchema: GenMessage; +/** + * @generated from message agent.v1.ShellToolCallDelta + */ +export type ShellToolCallDelta = Message<"agent.v1.ShellToolCallDelta"> & { + /** + * @generated from oneof agent.v1.ShellToolCallDelta.delta + */ + delta: { + /** + * @generated from field: agent.v1.ShellToolCallStdoutDelta stdout = 1; + */ + value: ShellToolCallStdoutDelta; + case: "stdout"; + } | { + /** + * @generated from field: agent.v1.ShellToolCallStderrDelta stderr = 2; + */ + value: ShellToolCallStderrDelta; + case: "stderr"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ShellToolCallDelta. + * Use `create(ShellToolCallDeltaSchema)` to create a new message. + */ +export declare const ShellToolCallDeltaSchema: GenMessage; +/** + * @generated from message agent.v1.SubagentType + */ +export type SubagentType = Message<"agent.v1.SubagentType"> & { + /** + * @generated from oneof agent.v1.SubagentType.type + */ + type: { + /** + * @generated from field: agent.v1.SubagentTypeUnspecified unspecified = 1; + */ + value: SubagentTypeUnspecified; + case: "unspecified"; + } | { + /** + * @generated from field: agent.v1.SubagentTypeComputerUse computer_use = 2; + */ + value: SubagentTypeComputerUse; + case: "computerUse"; + } | { + /** + * @generated from field: agent.v1.SubagentTypeCustom custom = 3; + */ + value: SubagentTypeCustom; + case: "custom"; + } | { + /** + * @generated from field: agent.v1.SubagentTypeExplore explore = 4; + */ + value: SubagentTypeExplore; + case: "explore"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.SubagentType. + * Use `create(SubagentTypeSchema)` to create a new message. + */ +export declare const SubagentTypeSchema: GenMessage; +/** + * Empty message for unspecified subagent type + * + * @generated from message agent.v1.SubagentTypeUnspecified + */ +export type SubagentTypeUnspecified = Message<"agent.v1.SubagentTypeUnspecified"> & {}; +/** + * Describes the message agent.v1.SubagentTypeUnspecified. + * Use `create(SubagentTypeUnspecifiedSchema)` to create a new message. + */ +export declare const SubagentTypeUnspecifiedSchema: GenMessage; +/** + * Empty message for computer use subagent type + * + * @generated from message agent.v1.SubagentTypeComputerUse + */ +export type SubagentTypeComputerUse = Message<"agent.v1.SubagentTypeComputerUse"> & {}; +/** + * Describes the message agent.v1.SubagentTypeComputerUse. + * Use `create(SubagentTypeComputerUseSchema)` to create a new message. + */ +export declare const SubagentTypeComputerUseSchema: GenMessage; +/** + * Empty message for explore subagent type (read-only codebase exploration) + * + * @generated from message agent.v1.SubagentTypeExplore + */ +export type SubagentTypeExplore = Message<"agent.v1.SubagentTypeExplore"> & {}; +/** + * Describes the message agent.v1.SubagentTypeExplore. + * Use `create(SubagentTypeExploreSchema)` to create a new message. + */ +export declare const SubagentTypeExploreSchema: GenMessage; +/** + * Custom subagent type with a name field + * + * @generated from message agent.v1.SubagentTypeCustom + */ +export type SubagentTypeCustom = Message<"agent.v1.SubagentTypeCustom"> & { + /** + * unique identifier of the custom subagent + * + * @generated from field: string name = 1; + */ + name: string; +}; +/** + * Describes the message agent.v1.SubagentTypeCustom. + * Use `create(SubagentTypeCustomSchema)` to create a new message. + */ +export declare const SubagentTypeCustomSchema: GenMessage; +/** + * Custom subagent definition loaded from local workspace configuration. + * + * @generated from message agent.v1.CustomSubagent + */ +export type CustomSubagent = Message<"agent.v1.CustomSubagent"> & { + /** + * absolute path to the markdown definition file + * + * @generated from field: string full_path = 1; + */ + fullPath: string; + /** + * unique identifier of the subagent + * + * @generated from field: string name = 2; + */ + name: string; + /** + * short summary of the agent's specialization + * + * @generated from field: string description = 3; + */ + description: string; + /** + * list of tool names the subagent can access + * + * @generated from field: repeated string tools = 4; + */ + tools: string[]; + /** + * preferred model (or "inherit" to use parent's model) + * + * @generated from field: string model = 5; + */ + model: string; + /** + * full prompt contents from the markdown file + * + * @generated from field: string prompt = 6; + */ + prompt: string; + /** + * default permission mode for subagent execution + * + * @generated from field: int32 permission_mode = 7; + */ + permissionMode: number; +}; +/** + * Describes the message agent.v1.CustomSubagent. + * Use `create(CustomSubagentSchema)` to create a new message. + */ +export declare const CustomSubagentSchema: GenMessage; +/** + * @generated from message agent.v1.SwitchModeArgs + */ +export type SwitchModeArgs = Message<"agent.v1.SwitchModeArgs"> & { + /** + * The unified mode id to switch to (agent/chat/plan/spec/debug/triage) + * + * @generated from field: string target_mode_id = 1; + */ + targetModeId: string; + /** + * Optional explanation for why the mode switch is requested + * + * @generated from field: optional string explanation = 2; + */ + explanation?: string; + /** + * @generated from field: string tool_call_id = 3; + */ + toolCallId: string; +}; +/** + * Describes the message agent.v1.SwitchModeArgs. + * Use `create(SwitchModeArgsSchema)` to create a new message. + */ +export declare const SwitchModeArgsSchema: GenMessage; +/** + * @generated from message agent.v1.SwitchModeResult + */ +export type SwitchModeResult = Message<"agent.v1.SwitchModeResult"> & { + /** + * @generated from oneof agent.v1.SwitchModeResult.result + */ + result: { + /** + * @generated from field: agent.v1.SwitchModeSuccess success = 1; + */ + value: SwitchModeSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.SwitchModeError error = 2; + */ + value: SwitchModeError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.SwitchModeRejected rejected = 3; + */ + value: SwitchModeRejected; + case: "rejected"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.SwitchModeResult. + * Use `create(SwitchModeResultSchema)` to create a new message. + */ +export declare const SwitchModeResultSchema: GenMessage; +/** + * @generated from message agent.v1.SwitchModeSuccess + */ +export type SwitchModeSuccess = Message<"agent.v1.SwitchModeSuccess"> & { + /** + * The mode we switched from + * + * @generated from field: string from_mode_id = 1; + */ + fromModeId: string; + /** + * The mode we switched to + * + * @generated from field: string to_mode_id = 2; + */ + toModeId: string; +}; +/** + * Describes the message agent.v1.SwitchModeSuccess. + * Use `create(SwitchModeSuccessSchema)` to create a new message. + */ +export declare const SwitchModeSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.SwitchModeError + */ +export type SwitchModeError = Message<"agent.v1.SwitchModeError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.SwitchModeError. + * Use `create(SwitchModeErrorSchema)` to create a new message. + */ +export declare const SwitchModeErrorSchema: GenMessage; +/** + * @generated from message agent.v1.SwitchModeRejected + */ +export type SwitchModeRejected = Message<"agent.v1.SwitchModeRejected"> & { + /** + * @generated from field: string reason = 1; + */ + reason: string; +}; +/** + * Describes the message agent.v1.SwitchModeRejected. + * Use `create(SwitchModeRejectedSchema)` to create a new message. + */ +export declare const SwitchModeRejectedSchema: GenMessage; +/** + * @generated from message agent.v1.SwitchModeToolCall + */ +export type SwitchModeToolCall = Message<"agent.v1.SwitchModeToolCall"> & { + /** + * @generated from field: agent.v1.SwitchModeArgs args = 1; + */ + args?: SwitchModeArgs; + /** + * @generated from field: agent.v1.SwitchModeResult result = 2; + */ + result?: SwitchModeResult; +}; +/** + * Describes the message agent.v1.SwitchModeToolCall. + * Use `create(SwitchModeToolCallSchema)` to create a new message. + */ +export declare const SwitchModeToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.SwitchModeRequestQuery + */ +export type SwitchModeRequestQuery = Message<"agent.v1.SwitchModeRequestQuery"> & { + /** + * @generated from field: agent.v1.SwitchModeArgs args = 1; + */ + args?: SwitchModeArgs; +}; +/** + * Describes the message agent.v1.SwitchModeRequestQuery. + * Use `create(SwitchModeRequestQuerySchema)` to create a new message. + */ +export declare const SwitchModeRequestQuerySchema: GenMessage; +/** + * @generated from message agent.v1.SwitchModeRequestResponse + */ +export type SwitchModeRequestResponse = Message<"agent.v1.SwitchModeRequestResponse"> & { + /** + * @generated from oneof agent.v1.SwitchModeRequestResponse.result + */ + result: { + /** + * @generated from field: agent.v1.SwitchModeRequestResponse_Approved approved = 1; + */ + value: SwitchModeRequestResponse_Approved; + case: "approved"; + } | { + /** + * @generated from field: agent.v1.SwitchModeRequestResponse_Rejected rejected = 2; + */ + value: SwitchModeRequestResponse_Rejected; + case: "rejected"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.SwitchModeRequestResponse. + * Use `create(SwitchModeRequestResponseSchema)` to create a new message. + */ +export declare const SwitchModeRequestResponseSchema: GenMessage; +/** + * @generated from message agent.v1.SwitchModeRequestResponse_Approved + */ +export type SwitchModeRequestResponse_Approved = Message<"agent.v1.SwitchModeRequestResponse_Approved"> & {}; +/** + * Describes the message agent.v1.SwitchModeRequestResponse_Approved. + * Use `create(SwitchModeRequestResponse_ApprovedSchema)` to create a new message. + */ +export declare const SwitchModeRequestResponse_ApprovedSchema: GenMessage; +/** + * @generated from message agent.v1.SwitchModeRequestResponse_Rejected + */ +export type SwitchModeRequestResponse_Rejected = Message<"agent.v1.SwitchModeRequestResponse_Rejected"> & { + /** + * @generated from field: string reason = 1; + */ + reason: string; +}; +/** + * Describes the message agent.v1.SwitchModeRequestResponse_Rejected. + * Use `create(SwitchModeRequestResponse_RejectedSchema)` to create a new message. + */ +export declare const SwitchModeRequestResponse_RejectedSchema: GenMessage; +/** + * @generated from message agent.v1.TodoItem + */ +export type TodoItem = Message<"agent.v1.TodoItem"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + /** + * @generated from field: string content = 2; + */ + content: string; + /** + * @generated from field: int32 status = 3; + */ + status: number; + /** + * @generated from field: int64 created_at = 4; + */ + createdAt: bigint; + /** + * @generated from field: int64 updated_at = 5; + */ + updatedAt: bigint; + /** + * IDs of other TODOs this depends on + * + * @generated from field: repeated string dependencies = 6; + */ + dependencies: string[]; +}; +/** + * Describes the message agent.v1.TodoItem. + * Use `create(TodoItemSchema)` to create a new message. + */ +export declare const TodoItemSchema: GenMessage; +/** + * UpdateTodos tool call + * + * @generated from message agent.v1.UpdateTodosToolCall + */ +export type UpdateTodosToolCall = Message<"agent.v1.UpdateTodosToolCall"> & { + /** + * @generated from field: agent.v1.UpdateTodosArgs args = 1; + */ + args?: UpdateTodosArgs; + /** + * @generated from field: agent.v1.UpdateTodosResult result = 2; + */ + result?: UpdateTodosResult; +}; +/** + * Describes the message agent.v1.UpdateTodosToolCall. + * Use `create(UpdateTodosToolCallSchema)` to create a new message. + */ +export declare const UpdateTodosToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.UpdateTodosArgs + */ +export type UpdateTodosArgs = Message<"agent.v1.UpdateTodosArgs"> & { + /** + * @generated from field: repeated agent.v1.TodoItem todos = 1; + */ + todos: TodoItem[]; + /** + * @generated from field: bool merge = 2; + */ + merge: boolean; +}; +/** + * Describes the message agent.v1.UpdateTodosArgs. + * Use `create(UpdateTodosArgsSchema)` to create a new message. + */ +export declare const UpdateTodosArgsSchema: GenMessage; +/** + * @generated from message agent.v1.UpdateTodosResult + */ +export type UpdateTodosResult = Message<"agent.v1.UpdateTodosResult"> & { + /** + * @generated from oneof agent.v1.UpdateTodosResult.result + */ + result: { + /** + * @generated from field: agent.v1.UpdateTodosSuccess success = 1; + */ + value: UpdateTodosSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.UpdateTodosError error = 2; + */ + value: UpdateTodosError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.UpdateTodosResult. + * Use `create(UpdateTodosResultSchema)` to create a new message. + */ +export declare const UpdateTodosResultSchema: GenMessage; +/** + * @generated from message agent.v1.UpdateTodosSuccess + */ +export type UpdateTodosSuccess = Message<"agent.v1.UpdateTodosSuccess"> & { + /** + * @generated from field: repeated agent.v1.TodoItem todos = 1; + */ + todos: TodoItem[]; + /** + * @generated from field: int32 total_count = 2; + */ + totalCount: number; + /** + * Whether this was a merge operation (needed for conditional rendering) + * + * @generated from field: bool was_merge = 3; + */ + wasMerge: boolean; +}; +/** + * Describes the message agent.v1.UpdateTodosSuccess. + * Use `create(UpdateTodosSuccessSchema)` to create a new message. + */ +export declare const UpdateTodosSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.UpdateTodosError + */ +export type UpdateTodosError = Message<"agent.v1.UpdateTodosError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.UpdateTodosError. + * Use `create(UpdateTodosErrorSchema)` to create a new message. + */ +export declare const UpdateTodosErrorSchema: GenMessage; +/** + * ReadTodos tool call + * + * @generated from message agent.v1.ReadTodosToolCall + */ +export type ReadTodosToolCall = Message<"agent.v1.ReadTodosToolCall"> & { + /** + * @generated from field: agent.v1.ReadTodosArgs args = 1; + */ + args?: ReadTodosArgs; + /** + * @generated from field: agent.v1.ReadTodosResult result = 2; + */ + result?: ReadTodosResult; +}; +/** + * Describes the message agent.v1.ReadTodosToolCall. + * Use `create(ReadTodosToolCallSchema)` to create a new message. + */ +export declare const ReadTodosToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.ReadTodosArgs + */ +export type ReadTodosArgs = Message<"agent.v1.ReadTodosArgs"> & { + /** + * Optional: filter by status + * + * @generated from field: repeated int32 status_filter = 1; + */ + statusFilter: number[]; + /** + * Optional: filter by IDs + * + * @generated from field: repeated string id_filter = 2; + */ + idFilter: string[]; +}; +/** + * Describes the message agent.v1.ReadTodosArgs. + * Use `create(ReadTodosArgsSchema)` to create a new message. + */ +export declare const ReadTodosArgsSchema: GenMessage; +/** + * @generated from message agent.v1.ReadTodosResult + */ +export type ReadTodosResult = Message<"agent.v1.ReadTodosResult"> & { + /** + * @generated from oneof agent.v1.ReadTodosResult.result + */ + result: { + /** + * @generated from field: agent.v1.ReadTodosSuccess success = 1; + */ + value: ReadTodosSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.ReadTodosError error = 2; + */ + value: ReadTodosError; + case: "error"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ReadTodosResult. + * Use `create(ReadTodosResultSchema)` to create a new message. + */ +export declare const ReadTodosResultSchema: GenMessage; +/** + * @generated from message agent.v1.ReadTodosSuccess + */ +export type ReadTodosSuccess = Message<"agent.v1.ReadTodosSuccess"> & { + /** + * @generated from field: repeated agent.v1.TodoItem todos = 1; + */ + todos: TodoItem[]; + /** + * @generated from field: int32 total_count = 2; + */ + totalCount: number; +}; +/** + * Describes the message agent.v1.ReadTodosSuccess. + * Use `create(ReadTodosSuccessSchema)` to create a new message. + */ +export declare const ReadTodosSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.ReadTodosError + */ +export type ReadTodosError = Message<"agent.v1.ReadTodosError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.ReadTodosError. + * Use `create(ReadTodosErrorSchema)` to create a new message. + */ +export declare const ReadTodosErrorSchema: GenMessage; +/** + * @generated from message agent.v1.Range + */ +export type Range = Message<"agent.v1.Range"> & { + /** + * @generated from field: agent.v1.Position start = 1; + */ + start?: Position; + /** + * @generated from field: agent.v1.Position end = 2; + */ + end?: Position; +}; +/** + * Describes the message agent.v1.Range. + * Use `create(RangeSchema)` to create a new message. + */ +export declare const RangeSchema: GenMessage; +/** + * @generated from message agent.v1.Position + */ +export type Position = Message<"agent.v1.Position"> & { + /** + * @generated from field: uint32 line = 1; + */ + line: number; + /** + * @generated from field: uint32 column = 2; + */ + column: number; +}; +/** + * Describes the message agent.v1.Position. + * Use `create(PositionSchema)` to create a new message. + */ +export declare const PositionSchema: GenMessage; +/** + * @generated from message agent.v1.Error + */ +export type Error = Message<"agent.v1.Error"> & { + /** + * @generated from field: string message = 1; + */ + message: string; +}; +/** + * Describes the message agent.v1.Error. + * Use `create(ErrorSchema)` to create a new message. + */ +export declare const ErrorSchema: GenMessage; +/** + * @generated from message agent.v1.WebSearchArgs + */ +export type WebSearchArgs = Message<"agent.v1.WebSearchArgs"> & { + /** + * @generated from field: string search_term = 1; + */ + searchTerm: string; + /** + * @generated from field: string tool_call_id = 2; + */ + toolCallId: string; +}; +/** + * Describes the message agent.v1.WebSearchArgs. + * Use `create(WebSearchArgsSchema)` to create a new message. + */ +export declare const WebSearchArgsSchema: GenMessage; +/** + * @generated from message agent.v1.WebSearchResult + */ +export type WebSearchResult = Message<"agent.v1.WebSearchResult"> & { + /** + * @generated from oneof agent.v1.WebSearchResult.result + */ + result: { + /** + * @generated from field: agent.v1.WebSearchSuccess success = 1; + */ + value: WebSearchSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.WebSearchError error = 2; + */ + value: WebSearchError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.WebSearchRejected rejected = 3; + */ + value: WebSearchRejected; + case: "rejected"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.WebSearchResult. + * Use `create(WebSearchResultSchema)` to create a new message. + */ +export declare const WebSearchResultSchema: GenMessage; +/** + * @generated from message agent.v1.WebSearchSuccess + */ +export type WebSearchSuccess = Message<"agent.v1.WebSearchSuccess"> & { + /** + * @generated from field: repeated agent.v1.WebSearchReference references = 1; + */ + references: WebSearchReference[]; +}; +/** + * Describes the message agent.v1.WebSearchSuccess. + * Use `create(WebSearchSuccessSchema)` to create a new message. + */ +export declare const WebSearchSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.WebSearchError + */ +export type WebSearchError = Message<"agent.v1.WebSearchError"> & { + /** + * @generated from field: string error = 1; + */ + error: string; +}; +/** + * Describes the message agent.v1.WebSearchError. + * Use `create(WebSearchErrorSchema)` to create a new message. + */ +export declare const WebSearchErrorSchema: GenMessage; +/** + * @generated from message agent.v1.WebSearchRejected + */ +export type WebSearchRejected = Message<"agent.v1.WebSearchRejected"> & { + /** + * @generated from field: string reason = 1; + */ + reason: string; +}; +/** + * Describes the message agent.v1.WebSearchRejected. + * Use `create(WebSearchRejectedSchema)` to create a new message. + */ +export declare const WebSearchRejectedSchema: GenMessage; +/** + * @generated from message agent.v1.WebSearchReference + */ +export type WebSearchReference = Message<"agent.v1.WebSearchReference"> & { + /** + * @generated from field: string title = 1; + */ + title: string; + /** + * @generated from field: string url = 2; + */ + url: string; + /** + * @generated from field: string chunk = 3; + */ + chunk: string; +}; +/** + * Describes the message agent.v1.WebSearchReference. + * Use `create(WebSearchReferenceSchema)` to create a new message. + */ +export declare const WebSearchReferenceSchema: GenMessage; +/** + * @generated from message agent.v1.WebSearchToolCall + */ +export type WebSearchToolCall = Message<"agent.v1.WebSearchToolCall"> & { + /** + * @generated from field: agent.v1.WebSearchArgs args = 1; + */ + args?: WebSearchArgs; + /** + * @generated from field: agent.v1.WebSearchResult result = 2; + */ + result?: WebSearchResult; +}; +/** + * Describes the message agent.v1.WebSearchToolCall. + * Use `create(WebSearchToolCallSchema)` to create a new message. + */ +export declare const WebSearchToolCallSchema: GenMessage; +/** + * @generated from message agent.v1.WebSearchRequestQuery + */ +export type WebSearchRequestQuery = Message<"agent.v1.WebSearchRequestQuery"> & { + /** + * @generated from field: agent.v1.WebSearchArgs args = 1; + */ + args?: WebSearchArgs; +}; +/** + * Describes the message agent.v1.WebSearchRequestQuery. + * Use `create(WebSearchRequestQuerySchema)` to create a new message. + */ +export declare const WebSearchRequestQuerySchema: GenMessage; +/** + * @generated from message agent.v1.WebSearchRequestResponse + */ +export type WebSearchRequestResponse = Message<"agent.v1.WebSearchRequestResponse"> & { + /** + * @generated from oneof agent.v1.WebSearchRequestResponse.result + */ + result: { + /** + * @generated from field: agent.v1.WebSearchRequestResponse_Approved approved = 1; + */ + value: WebSearchRequestResponse_Approved; + case: "approved"; + } | { + /** + * @generated from field: agent.v1.WebSearchRequestResponse_Rejected rejected = 2; + */ + value: WebSearchRequestResponse_Rejected; + case: "rejected"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.WebSearchRequestResponse. + * Use `create(WebSearchRequestResponseSchema)` to create a new message. + */ +export declare const WebSearchRequestResponseSchema: GenMessage; +/** + * @generated from message agent.v1.WebSearchRequestResponse_Approved + */ +export type WebSearchRequestResponse_Approved = Message<"agent.v1.WebSearchRequestResponse_Approved"> & {}; +/** + * Describes the message agent.v1.WebSearchRequestResponse_Approved. + * Use `create(WebSearchRequestResponse_ApprovedSchema)` to create a new message. + */ +export declare const WebSearchRequestResponse_ApprovedSchema: GenMessage; +/** + * @generated from message agent.v1.WebSearchRequestResponse_Rejected + */ +export type WebSearchRequestResponse_Rejected = Message<"agent.v1.WebSearchRequestResponse_Rejected"> & { + /** + * @generated from field: string reason = 1; + */ + reason: string; +}; +/** + * Describes the message agent.v1.WebSearchRequestResponse_Rejected. + * Use `create(WebSearchRequestResponse_RejectedSchema)` to create a new message. + */ +export declare const WebSearchRequestResponse_RejectedSchema: GenMessage; +/** + * @generated from message agent.v1.WriteArgs + */ +export type WriteArgs = Message<"agent.v1.WriteArgs"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string file_text = 2; + */ + fileText: string; + /** + * @generated from field: string tool_call_id = 3; + */ + toolCallId: string; + /** + * @generated from field: bool return_file_content_after_write = 4; + */ + returnFileContentAfterWrite: boolean; + /** + * Raw binary data to write. When set, file_text is ignored and the bytes are written directly without any text processing (e.g., line ending normalization). + * + * @generated from field: bytes file_bytes = 5; + */ + fileBytes: Uint8Array; +}; +/** + * Describes the message agent.v1.WriteArgs. + * Use `create(WriteArgsSchema)` to create a new message. + */ +export declare const WriteArgsSchema: GenMessage; +/** + * @generated from message agent.v1.WriteResult + */ +export type WriteResult = Message<"agent.v1.WriteResult"> & { + /** + * @generated from oneof agent.v1.WriteResult.result + */ + result: { + /** + * @generated from field: agent.v1.WriteSuccess success = 1; + */ + value: WriteSuccess; + case: "success"; + } | { + /** + * @generated from field: agent.v1.WritePermissionDenied permission_denied = 3; + */ + value: WritePermissionDenied; + case: "permissionDenied"; + } | { + /** + * @generated from field: agent.v1.WriteNoSpace no_space = 4; + */ + value: WriteNoSpace; + case: "noSpace"; + } | { + /** + * @generated from field: agent.v1.WriteError error = 5; + */ + value: WriteError; + case: "error"; + } | { + /** + * @generated from field: agent.v1.WriteRejected rejected = 6; + */ + value: WriteRejected; + case: "rejected"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.WriteResult. + * Use `create(WriteResultSchema)` to create a new message. + */ +export declare const WriteResultSchema: GenMessage; +/** + * @generated from message agent.v1.WriteSuccess + */ +export type WriteSuccess = Message<"agent.v1.WriteSuccess"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: int32 lines_created = 2; + */ + linesCreated: number; + /** + * @generated from field: int32 file_size = 3; + */ + fileSize: number; + /** + * @generated from field: optional string file_content_after_write = 4; + */ + fileContentAfterWrite?: string; +}; +/** + * Describes the message agent.v1.WriteSuccess. + * Use `create(WriteSuccessSchema)` to create a new message. + */ +export declare const WriteSuccessSchema: GenMessage; +/** + * @generated from message agent.v1.WritePermissionDenied + */ +export type WritePermissionDenied = Message<"agent.v1.WritePermissionDenied"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string directory = 2; + */ + directory: string; + /** + * "create_directory" or "create_file" + * + * @generated from field: string operation = 3; + */ + operation: string; + /** + * @generated from field: string error = 4; + */ + error: string; + /** + * @generated from field: bool is_readonly = 5; + */ + isReadonly: boolean; +}; +/** + * Describes the message agent.v1.WritePermissionDenied. + * Use `create(WritePermissionDeniedSchema)` to create a new message. + */ +export declare const WritePermissionDeniedSchema: GenMessage; +/** + * @generated from message agent.v1.WriteNoSpace + */ +export type WriteNoSpace = Message<"agent.v1.WriteNoSpace"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; +/** + * Describes the message agent.v1.WriteNoSpace. + * Use `create(WriteNoSpaceSchema)` to create a new message. + */ +export declare const WriteNoSpaceSchema: GenMessage; +/** + * @generated from message agent.v1.WriteError + */ +export type WriteError = Message<"agent.v1.WriteError"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string error = 2; + */ + error: string; +}; +/** + * Describes the message agent.v1.WriteError. + * Use `create(WriteErrorSchema)` to create a new message. + */ +export declare const WriteErrorSchema: GenMessage; +/** + * @generated from message agent.v1.WriteRejected + */ +export type WriteRejected = Message<"agent.v1.WriteRejected"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string reason = 2; + */ + reason: string; +}; +/** + * Describes the message agent.v1.WriteRejected. + * Use `create(WriteRejectedSchema)` to create a new message. + */ +export declare const WriteRejectedSchema: GenMessage; +/** + * @generated from message agent.v1.BootstrapStatsigRequest + */ +export type BootstrapStatsigRequest = Message<"agent.v1.BootstrapStatsigRequest"> & { + /** + * When true, the server should evaluate gates as if dev/internal status is ignored. This is used by clients to simulate a prod user experience. + * + * @generated from field: optional bool ignore_dev_status = 1; + */ + ignoreDevStatus?: boolean; + /** + * @generated from field: optional int32 operating_system = 2; + */ + operatingSystem?: number; +}; +/** + * Describes the message agent.v1.BootstrapStatsigRequest. + * Use `create(BootstrapStatsigRequestSchema)` to create a new message. + */ +export declare const BootstrapStatsigRequestSchema: GenMessage; +/** + * @generated from message agent.v1.PingResponse + */ +export type PingResponse = Message<"agent.v1.PingResponse"> & {}; +/** + * Describes the message agent.v1.PingResponse. + * Use `create(PingResponseSchema)` to create a new message. + */ +export declare const PingResponseSchema: GenMessage; +/** + * @generated from message agent.v1.ExecRequest + */ +export type ExecRequest = Message<"agent.v1.ExecRequest"> & { + /** + * @generated from field: string command = 1; + */ + command: string; + /** + * @generated from field: optional string cwd = 2; + */ + cwd?: string; + /** + * @generated from field: repeated string args = 3; + */ + args: string[]; + /** + * @generated from field: map environment = 4; + */ + environment: { + [key: string]: string; + }; +}; +/** + * Describes the message agent.v1.ExecRequest. + * Use `create(ExecRequestSchema)` to create a new message. + */ +export declare const ExecRequestSchema: GenMessage; +/** + * @generated from message agent.v1.ExecResponse + */ +export type ExecResponse = Message<"agent.v1.ExecResponse"> & { + /** + * @generated from oneof agent.v1.ExecResponse.event + */ + event: { + /** + * @generated from field: agent.v1.StdoutEvent stdout_event = 1; + */ + value: StdoutEvent; + case: "stdoutEvent"; + } | { + /** + * @generated from field: agent.v1.StderrEvent stderr_event = 2; + */ + value: StderrEvent; + case: "stderrEvent"; + } | { + /** + * @generated from field: agent.v1.ExitEvent exit_event = 3; + */ + value: ExitEvent; + case: "exitEvent"; + } | { + case: undefined; + value?: undefined; + }; +}; +/** + * Describes the message agent.v1.ExecResponse. + * Use `create(ExecResponseSchema)` to create a new message. + */ +export declare const ExecResponseSchema: GenMessage; +/** + * @generated from message agent.v1.StdoutEvent + */ +export type StdoutEvent = Message<"agent.v1.StdoutEvent"> & { + /** + * @generated from field: string data = 1; + */ + data: string; +}; +/** + * Describes the message agent.v1.StdoutEvent. + * Use `create(StdoutEventSchema)` to create a new message. + */ +export declare const StdoutEventSchema: GenMessage; +/** + * @generated from message agent.v1.StderrEvent + */ +export type StderrEvent = Message<"agent.v1.StderrEvent"> & { + /** + * @generated from field: string data = 1; + */ + data: string; +}; +/** + * Describes the message agent.v1.StderrEvent. + * Use `create(StderrEventSchema)` to create a new message. + */ +export declare const StderrEventSchema: GenMessage; +/** + * @generated from message agent.v1.ExitEvent + */ +export type ExitEvent = Message<"agent.v1.ExitEvent"> & { + /** + * @generated from field: int32 exit_code = 1; + */ + exitCode: number; +}; +/** + * Describes the message agent.v1.ExitEvent. + * Use `create(ExitEventSchema)` to create a new message. + */ +export declare const ExitEventSchema: GenMessage; +/** + * @generated from message agent.v1.ReadTextFileRequest + */ +export type ReadTextFileRequest = Message<"agent.v1.ReadTextFileRequest"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; +/** + * Describes the message agent.v1.ReadTextFileRequest. + * Use `create(ReadTextFileRequestSchema)` to create a new message. + */ +export declare const ReadTextFileRequestSchema: GenMessage; +/** + * @generated from message agent.v1.ReadTextFileResponse + */ +export type ReadTextFileResponse = Message<"agent.v1.ReadTextFileResponse"> & { + /** + * @generated from field: string content = 1; + */ + content: string; +}; +/** + * Describes the message agent.v1.ReadTextFileResponse. + * Use `create(ReadTextFileResponseSchema)` to create a new message. + */ +export declare const ReadTextFileResponseSchema: GenMessage; +/** + * @generated from message agent.v1.WriteTextFileRequest + */ +export type WriteTextFileRequest = Message<"agent.v1.WriteTextFileRequest"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: string content = 2; + */ + content: string; +}; +/** + * Describes the message agent.v1.WriteTextFileRequest. + * Use `create(WriteTextFileRequestSchema)` to create a new message. + */ +export declare const WriteTextFileRequestSchema: GenMessage; +/** + * Empty response - success is implied by RPC completion + * + * @generated from message agent.v1.WriteTextFileResponse + */ +export type WriteTextFileResponse = Message<"agent.v1.WriteTextFileResponse"> & {}; +/** + * Describes the message agent.v1.WriteTextFileResponse. + * Use `create(WriteTextFileResponseSchema)` to create a new message. + */ +export declare const WriteTextFileResponseSchema: GenMessage; +/** + * @generated from message agent.v1.ReadBinaryFileRequest + */ +export type ReadBinaryFileRequest = Message<"agent.v1.ReadBinaryFileRequest"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; +/** + * Describes the message agent.v1.ReadBinaryFileRequest. + * Use `create(ReadBinaryFileRequestSchema)` to create a new message. + */ +export declare const ReadBinaryFileRequestSchema: GenMessage; +/** + * @generated from message agent.v1.ReadBinaryFileResponse + */ +export type ReadBinaryFileResponse = Message<"agent.v1.ReadBinaryFileResponse"> & { + /** + * @generated from field: bytes content = 1; + */ + content: Uint8Array; +}; +/** + * Describes the message agent.v1.ReadBinaryFileResponse. + * Use `create(ReadBinaryFileResponseSchema)` to create a new message. + */ +export declare const ReadBinaryFileResponseSchema: GenMessage; +/** + * @generated from message agent.v1.WriteBinaryFileRequest + */ +export type WriteBinaryFileRequest = Message<"agent.v1.WriteBinaryFileRequest"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + /** + * @generated from field: bytes content = 2; + */ + content: Uint8Array; +}; +/** + * Describes the message agent.v1.WriteBinaryFileRequest. + * Use `create(WriteBinaryFileRequestSchema)` to create a new message. + */ +export declare const WriteBinaryFileRequestSchema: GenMessage; +/** + * Empty response - success is implied by RPC completion + * + * @generated from message agent.v1.WriteBinaryFileResponse + */ +export type WriteBinaryFileResponse = Message<"agent.v1.WriteBinaryFileResponse"> & {}; +/** + * Describes the message agent.v1.WriteBinaryFileResponse. + * Use `create(WriteBinaryFileResponseSchema)` to create a new message. + */ +export declare const WriteBinaryFileResponseSchema: GenMessage; +/** + * @generated from message agent.v1.GetWorkspaceChangesHashRequest + */ +export type GetWorkspaceChangesHashRequest = Message<"agent.v1.GetWorkspaceChangesHashRequest"> & { + /** + * @generated from field: string root_path = 1; + */ + rootPath: string; + /** + * @generated from field: string base_ref = 2; + */ + baseRef: string; +}; +/** + * Describes the message agent.v1.GetWorkspaceChangesHashRequest. + * Use `create(GetWorkspaceChangesHashRequestSchema)` to create a new message. + */ +export declare const GetWorkspaceChangesHashRequestSchema: GenMessage; +/** + * @generated from message agent.v1.GetWorkspaceChangesHashResponse + */ +export type GetWorkspaceChangesHashResponse = Message<"agent.v1.GetWorkspaceChangesHashResponse"> & { + /** + * @generated from field: string hash = 1; + */ + hash: string; +}; +/** + * Describes the message agent.v1.GetWorkspaceChangesHashResponse. + * Use `create(GetWorkspaceChangesHashResponseSchema)` to create a new message. + */ +export declare const GetWorkspaceChangesHashResponseSchema: GenMessage; +/** + * @generated from message agent.v1.RefreshGithubAccessTokenRequest + */ +export type RefreshGithubAccessTokenRequest = Message<"agent.v1.RefreshGithubAccessTokenRequest"> & { + /** + * @generated from field: string github_access_token = 1; + */ + githubAccessToken: string; + /** + * e.g., "github.com", "gitlab.com", "gitlab.example.com" + * + * @generated from field: string hostname = 2; + */ + hostname: string; +}; +/** + * Describes the message agent.v1.RefreshGithubAccessTokenRequest. + * Use `create(RefreshGithubAccessTokenRequestSchema)` to create a new message. + */ +export declare const RefreshGithubAccessTokenRequestSchema: GenMessage; +/** + * Empty response - success is implied by RPC completion + * + * @generated from message agent.v1.RefreshGithubAccessTokenResponse + */ +export type RefreshGithubAccessTokenResponse = Message<"agent.v1.RefreshGithubAccessTokenResponse"> & {}; +/** + * Describes the message agent.v1.RefreshGithubAccessTokenResponse. + * Use `create(RefreshGithubAccessTokenResponseSchema)` to create a new message. + */ +export declare const RefreshGithubAccessTokenResponseSchema: GenMessage; +/** + * @generated from message agent.v1.WarmRemoteAccessServerRequest + */ +export type WarmRemoteAccessServerRequest = Message<"agent.v1.WarmRemoteAccessServerRequest"> & { + /** + * @generated from field: string commit = 1; + */ + commit: string; + /** + * @generated from field: int32 port = 2; + */ + port: number; + /** + * @generated from field: string connection_token = 3; + */ + connectionToken: string; +}; +/** + * Describes the message agent.v1.WarmRemoteAccessServerRequest. + * Use `create(WarmRemoteAccessServerRequestSchema)` to create a new message. + */ +export declare const WarmRemoteAccessServerRequestSchema: GenMessage; +/** + * Empty response - success is implied by RPC completion + * + * @generated from message agent.v1.WarmRemoteAccessServerResponse + */ +export type WarmRemoteAccessServerResponse = Message<"agent.v1.WarmRemoteAccessServerResponse"> & {}; +/** + * Describes the message agent.v1.WarmRemoteAccessServerResponse. + * Use `create(WarmRemoteAccessServerResponseSchema)` to create a new message. + */ +export declare const WarmRemoteAccessServerResponseSchema: GenMessage; +/** + * @generated from message agent.v1.ListArtifactsRequest + */ +export type ListArtifactsRequest = Message<"agent.v1.ListArtifactsRequest"> & {}; +/** + * Describes the message agent.v1.ListArtifactsRequest. + * Use `create(ListArtifactsRequestSchema)` to create a new message. + */ +export declare const ListArtifactsRequestSchema: GenMessage; +/** + * @generated from message agent.v1.ArtifactUploadMetadata + */ +export type ArtifactUploadMetadata = Message<"agent.v1.ArtifactUploadMetadata"> & { + /** + * @generated from field: string absolute_path = 1; + */ + absolutePath: string; + /** + * @generated from field: uint64 size_bytes = 2; + */ + sizeBytes: bigint; + /** + * @generated from field: int64 updated_at_unix_ms = 3; + */ + updatedAtUnixMs: bigint; + /** + * @generated from field: int32 status = 4; + */ + status: number; + /** + * @generated from field: uint64 bytes_uploaded = 5; + */ + bytesUploaded: bigint; + /** + * @generated from field: string last_error = 6; + */ + lastError: string; + /** + * @generated from field: uint32 upload_attempts = 7; + */ + uploadAttempts: number; + /** + * @generated from field: int64 last_started_at_unix_ms = 8; + */ + lastStartedAtUnixMs: bigint; + /** + * @generated from field: int64 last_finished_at_unix_ms = 9; + */ + lastFinishedAtUnixMs: bigint; + /** + * @generated from field: string upload_id = 10; + */ + uploadId: string; +}; +/** + * Describes the message agent.v1.ArtifactUploadMetadata. + * Use `create(ArtifactUploadMetadataSchema)` to create a new message. + */ +export declare const ArtifactUploadMetadataSchema: GenMessage; +/** + * @generated from message agent.v1.ListArtifactsResponse + */ +export type ListArtifactsResponse = Message<"agent.v1.ListArtifactsResponse"> & { + /** + * @generated from field: repeated agent.v1.ArtifactUploadMetadata artifacts = 1; + */ + artifacts: ArtifactUploadMetadata[]; +}; +/** + * Describes the message agent.v1.ListArtifactsResponse. + * Use `create(ListArtifactsResponseSchema)` to create a new message. + */ +export declare const ListArtifactsResponseSchema: GenMessage; +/** + * @generated from message agent.v1.UploadArtifactsRequest + */ +export type UploadArtifactsRequest = Message<"agent.v1.UploadArtifactsRequest"> & { + /** + * @generated from field: repeated agent.v1.ArtifactUploadInstruction uploads = 1; + */ + uploads: ArtifactUploadInstruction[]; +}; +/** + * Describes the message agent.v1.UploadArtifactsRequest. + * Use `create(UploadArtifactsRequestSchema)` to create a new message. + */ +export declare const UploadArtifactsRequestSchema: GenMessage; +/** + * @generated from message agent.v1.ArtifactUploadInstruction + */ +export type ArtifactUploadInstruction = Message<"agent.v1.ArtifactUploadInstruction"> & { + /** + * @generated from field: string absolute_path = 1; + */ + absolutePath: string; + /** + * @generated from field: string upload_url = 2; + */ + uploadUrl: string; + /** + * @generated from field: string method = 3; + */ + method: string; + /** + * @generated from field: map headers = 4; + */ + headers: { + [key: string]: string; + }; + /** + * @generated from field: optional string content_type = 5; + */ + contentType?: string; + /** + * @generated from field: optional string slack_upload_url = 6; + */ + slackUploadUrl?: string; + /** + * @generated from field: optional string slack_file_id = 7; + */ + slackFileId?: string; +}; +/** + * Describes the message agent.v1.ArtifactUploadInstruction. + * Use `create(ArtifactUploadInstructionSchema)` to create a new message. + */ +export declare const ArtifactUploadInstructionSchema: GenMessage; +/** + * @generated from message agent.v1.ArtifactUploadDispatchResult + */ +export type ArtifactUploadDispatchResult = Message<"agent.v1.ArtifactUploadDispatchResult"> & { + /** + * @generated from field: string absolute_path = 1; + */ + absolutePath: string; + /** + * @generated from field: int32 status = 2; + */ + status: number; + /** + * @generated from field: string message = 3; + */ + message: string; + /** + * @generated from field: optional string slack_file_id = 4; + */ + slackFileId?: string; +}; +/** + * Describes the message agent.v1.ArtifactUploadDispatchResult. + * Use `create(ArtifactUploadDispatchResultSchema)` to create a new message. + */ +export declare const ArtifactUploadDispatchResultSchema: GenMessage; +/** + * @generated from message agent.v1.UploadArtifactsResponse + */ +export type UploadArtifactsResponse = Message<"agent.v1.UploadArtifactsResponse"> & { + /** + * @generated from field: repeated agent.v1.ArtifactUploadDispatchResult results = 1; + */ + results: ArtifactUploadDispatchResult[]; +}; +/** + * Describes the message agent.v1.UploadArtifactsResponse. + * Use `create(UploadArtifactsResponseSchema)` to create a new message. + */ +export declare const UploadArtifactsResponseSchema: GenMessage; +/** + * @generated from message agent.v1.GetMcpRefreshTokensRequest + */ +export type GetMcpRefreshTokensRequest = Message<"agent.v1.GetMcpRefreshTokensRequest"> & {}; +/** + * Describes the message agent.v1.GetMcpRefreshTokensRequest. + * Use `create(GetMcpRefreshTokensRequestSchema)` to create a new message. + */ +export declare const GetMcpRefreshTokensRequestSchema: GenMessage; +/** + * @generated from message agent.v1.GetMcpRefreshTokensResponse + */ +export type GetMcpRefreshTokensResponse = Message<"agent.v1.GetMcpRefreshTokensResponse"> & { + /** + * Map from server URL to refresh token + * + * @generated from field: map refresh_tokens = 1; + */ + refreshTokens: { + [key: string]: string; + }; +}; +/** + * Describes the message agent.v1.GetMcpRefreshTokensResponse. + * Use `create(GetMcpRefreshTokensResponseSchema)` to create a new message. + */ +export declare const GetMcpRefreshTokensResponseSchema: GenMessage; +/** + * @generated from message agent.v1.UpdateEnvironmentVariablesRequest + */ +export type UpdateEnvironmentVariablesRequest = Message<"agent.v1.UpdateEnvironmentVariablesRequest"> & { + /** + * Environment variables to manage (plaintext values). + * + * @generated from field: map env = 1; + */ + env: { + [key: string]: string; + }; + /** + * If true, unset previously-managed keys that are not present in `env`. + * + * @generated from field: bool replace = 2; + */ + replace: boolean; +}; +/** + * Describes the message agent.v1.UpdateEnvironmentVariablesRequest. + * Use `create(UpdateEnvironmentVariablesRequestSchema)` to create a new message. + */ +export declare const UpdateEnvironmentVariablesRequestSchema: GenMessage; +/** + * @generated from message agent.v1.UpdateEnvironmentVariablesResponse + */ +export type UpdateEnvironmentVariablesResponse = Message<"agent.v1.UpdateEnvironmentVariablesResponse"> & { + /** + * @generated from field: uint32 applied = 1; + */ + applied: number; + /** + * @generated from field: uint32 removed = 2; + */ + removed: number; +}; +/** + * Describes the message agent.v1.UpdateEnvironmentVariablesResponse. + * Use `create(UpdateEnvironmentVariablesResponseSchema)` to create a new message. + */ +export declare const UpdateEnvironmentVariablesResponseSchema: GenMessage; +/** + * Check if an error is caused by the client disconnecting (e.g., due to timeout or abort). This includes errors like ERR_STREAM_DESTROYED which occur when the HTTP response stream is closed by the client while the server is still writing to it. function isClientDisconnectError(error) { if (!(error instanceof Error)) { return false; const code = error.code; return (code === "ERR_STREAM_DESTROYED" || code === "ERR_STREAM_PREMATURE_CLOSE" || code === "ECONNRESET" || code === "EPIPE"); ;// ../proto/dist/generated/aiserver/v1/mcp_pb.js // @ts-nocheck + * + * @generated from message agent.v1.McpOAuthStoredData + */ +export type McpOAuthStoredData = Message<"agent.v1.McpOAuthStoredData"> & { + /** + * @generated from field: string refresh_token = 1; + */ + refreshToken: string; + /** + * @generated from field: string client_id = 2; + */ + clientId: string; + /** + * @generated from field: optional string client_secret = 3; + */ + clientSecret?: string; + /** + * @generated from field: repeated string redirect_uris = 4; + */ + redirectUris: string[]; +}; +/** + * Describes the message agent.v1.McpOAuthStoredData. + * Use `create(McpOAuthStoredDataSchema)` to create a new message. + */ +export declare const McpOAuthStoredDataSchema: GenMessage; +/** + * @generated from message agent.v1.Frame + */ +export type Frame = Message<"agent.v1.Frame"> & { + /** + * Correlation ID + * + * @generated from field: string id = 1; + */ + id: string; + /** + * RPC method (e.g., "/agent.v1.ControlService/Ping") + * + * @generated from field: string method = 2; + */ + method: string; + /** + * Serialized payload + * + * @generated from field: bytes data = 3; + */ + data: Uint8Array; + /** + * @generated from field: int32 kind = 4; + */ + kind: number; + /** + * Error message (kind == ERROR) + * + * @generated from field: string error = 5; + */ + error: string; +}; +/** + * Describes the message agent.v1.Frame. + * Use `create(FrameSchema)` to create a new message. + */ +export declare const FrameSchema: GenMessage; +/** + * var Frame_Kind; (function (Frame_Kind) { Frame_Kind[Frame_Kind["UNSPECIFIED"] = 0] = "UNSPECIFIED"; Frame_Kind[Frame_Kind["REQUEST"] = 1] = "REQUEST"; Frame_Kind[Frame_Kind["RESPONSE"] = 2] = "RESPONSE"; Frame_Kind[Frame_Kind["ERROR"] = 3] = "ERROR"; })(Frame_Kind || (Frame_Kind = {})); // Retrieve enum metadata with: proto3.getEnumType(Frame_Kind) proto3/* int32 *\/.C.util.setEnumType(Frame_Kind, "agent.v1.Frame.Kind", [ { no: 0, name: "KIND_UNSPECIFIED" }, { no: 1, name: "KIND_REQUEST" }, { no: 2, name: "KIND_RESPONSE" }, { no: 3, name: "KIND_ERROR" }, ]); + * + * @generated from message agent.v1.Empty + */ +export type Empty = Message<"agent.v1.Empty"> & {}; +/** + * Describes the message agent.v1.Empty. + * Use `create(EmptySchema)` to create a new message. + */ +export declare const EmptySchema: GenMessage; +/** + * @generated from message agent.v1.BidiRequestId + */ +export type BidiRequestId = Message<"agent.v1.BidiRequestId"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; +}; +/** + * Describes the message agent.v1.BidiRequestId. + * Use `create(BidiRequestIdSchema)` to create a new message. + */ +export declare const BidiRequestIdSchema: GenMessage; +/** + * @generated from enum agent.v1.AppliedAgentChange_ChangeType + */ +export declare enum AppliedAgentChange_ChangeType { + /** + * @generated from enum value: CHANGE_TYPE_UNSPECIFIED = 0; + */ + CHANGE_TYPE_UNSPECIFIED = 0, + /** + * @generated from enum value: CHANGE_TYPE_CREATED = 1; + */ + CHANGE_TYPE_CREATED = 1, + /** + * @generated from enum value: CHANGE_TYPE_MODIFIED = 2; + */ + CHANGE_TYPE_MODIFIED = 2, + /** + * @generated from enum value: CHANGE_TYPE_DELETED = 3; + */ + CHANGE_TYPE_DELETED = 3 +} +/** + * Describes the enum agent.v1.AppliedAgentChange_ChangeType. + */ +export declare const AppliedAgentChange_ChangeTypeSchema: GenEnum; +/** + * @generated from enum agent.v1.MouseButton + */ +export declare enum MouseButton { + /** + * @generated from enum value: MOUSE_BUTTON_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * @generated from enum value: MOUSE_BUTTON_LEFT = 1; + */ + LEFT = 1, + /** + * @generated from enum value: MOUSE_BUTTON_RIGHT = 2; + */ + RIGHT = 2, + /** + * @generated from enum value: MOUSE_BUTTON_MIDDLE = 3; + */ + MIDDLE = 3, + /** + * @generated from enum value: MOUSE_BUTTON_BACK = 4; + */ + BACK = 4, + /** + * @generated from enum value: MOUSE_BUTTON_FORWARD = 5; + */ + FORWARD = 5 +} +/** + * Describes the enum agent.v1.MouseButton. + */ +export declare const MouseButtonSchema: GenEnum; +/** + * @generated from enum agent.v1.ScrollDirection + */ +export declare enum ScrollDirection { + /** + * @generated from enum value: SCROLL_DIRECTION_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * @generated from enum value: SCROLL_DIRECTION_UP = 1; + */ + UP = 1, + /** + * @generated from enum value: SCROLL_DIRECTION_DOWN = 2; + */ + DOWN = 2, + /** + * @generated from enum value: SCROLL_DIRECTION_LEFT = 3; + */ + LEFT = 3, + /** + * @generated from enum value: SCROLL_DIRECTION_RIGHT = 4; + */ + RIGHT = 4 +} +/** + * Describes the enum agent.v1.ScrollDirection. + */ +export declare const ScrollDirectionSchema: GenEnum; +/** + * @generated from enum agent.v1.CursorRuleSource + */ +export declare enum CursorRuleSource { + /** + * @generated from enum value: CURSOR_RULE_SOURCE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * @generated from enum value: CURSOR_RULE_SOURCE_TEAM = 1; + */ + TEAM = 1, + /** + * @generated from enum value: CURSOR_RULE_SOURCE_USER = 2; + */ + USER = 2 +} +/** + * Describes the enum agent.v1.CursorRuleSource. + */ +export declare const CursorRuleSourceSchema: GenEnum; +/** + * @generated from enum agent.v1.DiagnosticSeverity + */ +export declare enum DiagnosticSeverity { + /** + * @generated from enum value: DIAGNOSTIC_SEVERITY_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * @generated from enum value: DIAGNOSTIC_SEVERITY_ERROR = 1; + */ + ERROR = 1, + /** + * @generated from enum value: DIAGNOSTIC_SEVERITY_WARNING = 2; + */ + WARNING = 2, + /** + * @generated from enum value: DIAGNOSTIC_SEVERITY_INFORMATION = 3; + */ + INFORMATION = 3, + /** + * @generated from enum value: DIAGNOSTIC_SEVERITY_HINT = 4; + */ + HINT = 4 +} +/** + * Describes the enum agent.v1.DiagnosticSeverity. + */ +export declare const DiagnosticSeveritySchema: GenEnum; +/** + * @generated from enum agent.v1.RecordingMode + */ +export declare enum RecordingMode { + /** + * @generated from enum value: RECORDING_MODE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * @generated from enum value: RECORDING_MODE_START_RECORDING = 1; + */ + START_RECORDING = 1, + /** + * @generated from enum value: RECORDING_MODE_SAVE_RECORDING = 2; + */ + SAVE_RECORDING = 2, + /** + * @generated from enum value: RECORDING_MODE_DISCARD_RECORDING = 3; + */ + DISCARD_RECORDING = 3 +} +/** + * Describes the enum agent.v1.RecordingMode. + */ +export declare const RecordingModeSchema: GenEnum; +/** + * @generated from enum agent.v1.RequestedFilePathRejectedReason + */ +export declare enum RequestedFilePathRejectedReason { + /** + * @generated from enum value: REQUESTED_FILE_PATH_REJECTED_REASON_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * @generated from enum value: REQUESTED_FILE_PATH_REJECTED_REASON_SLASHES_NOT_ALLOWED = 1; + */ + SLASHES_NOT_ALLOWED = 1 +} +/** + * Describes the enum agent.v1.RequestedFilePathRejectedReason. + */ +export declare const RequestedFilePathRejectedReasonSchema: GenEnum; +/** + * @generated from enum agent.v1.PackageType + */ +export declare enum PackageType { + /** + * @generated from enum value: PACKAGE_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * @generated from enum value: PACKAGE_TYPE_CURSOR_PROJECT = 1; + */ + CURSOR_PROJECT = 1, + /** + * @generated from enum value: PACKAGE_TYPE_CURSOR_PERSONAL = 2; + */ + CURSOR_PERSONAL = 2, + /** + * @generated from enum value: PACKAGE_TYPE_CLAUDE_SKILL = 3; + */ + CLAUDE_SKILL = 3, + /** + * @generated from enum value: PACKAGE_TYPE_CLAUDE_PLUGIN = 4; + */ + CLAUDE_PLUGIN = 4 +} +/** + * Describes the enum agent.v1.PackageType. + */ +export declare const PackageTypeSchema: GenEnum; +/** + * @generated from enum agent.v1.SandboxPolicy_Type + */ +export declare enum SandboxPolicy_Type { + /** + * @generated from enum value: TYPE_UNSPECIFIED = 0; + */ + TYPE_UNSPECIFIED = 0, + /** + * @generated from enum value: TYPE_INSECURE_NONE = 1; + */ + TYPE_INSECURE_NONE = 1, + /** + * @generated from enum value: TYPE_WORKSPACE_READWRITE = 2; + */ + TYPE_WORKSPACE_READWRITE = 2, + /** + * @generated from enum value: TYPE_WORKSPACE_READONLY = 3; + */ + TYPE_WORKSPACE_READONLY = 3 +} +/** + * Describes the enum agent.v1.SandboxPolicy_Type. + */ +export declare const SandboxPolicy_TypeSchema: GenEnum; +/** + * @generated from enum agent.v1.TimeoutBehavior + */ +export declare enum TimeoutBehavior { + /** + * @generated from enum value: TIMEOUT_BEHAVIOR_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * @generated from enum value: TIMEOUT_BEHAVIOR_CANCEL = 1; + */ + CANCEL = 1, + /** + * @generated from enum value: TIMEOUT_BEHAVIOR_BACKGROUND = 2; + */ + BACKGROUND = 2 +} +/** + * Describes the enum agent.v1.TimeoutBehavior. + */ +export declare const TimeoutBehaviorSchema: GenEnum; +/** + * @generated from enum agent.v1.ShellAbortReason + */ +export declare enum ShellAbortReason { + /** + * @generated from enum value: SHELL_ABORT_REASON_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * @generated from enum value: SHELL_ABORT_REASON_USER_ABORT = 1; + */ + USER_ABORT = 1, + /** + * @generated from enum value: SHELL_ABORT_REASON_TIMEOUT = 2; + */ + TIMEOUT = 2 +} +/** + * Describes the enum agent.v1.ShellAbortReason. + */ +export declare const ShellAbortReasonSchema: GenEnum; +/** + * @generated from enum agent.v1.CustomSubagentPermissionMode + */ +export declare enum CustomSubagentPermissionMode { + /** + * @generated from enum value: CUSTOM_SUBAGENT_PERMISSION_MODE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * @generated from enum value: CUSTOM_SUBAGENT_PERMISSION_MODE_DEFAULT = 1; + */ + DEFAULT = 1, + /** + * @generated from enum value: CUSTOM_SUBAGENT_PERMISSION_MODE_READONLY = 2; + */ + READONLY = 2 +} +/** + * Describes the enum agent.v1.CustomSubagentPermissionMode. + */ +export declare const CustomSubagentPermissionModeSchema: GenEnum; +/** + * @generated from enum agent.v1.TodoStatus + */ +export declare enum TodoStatus { + /** + * @generated from enum value: TODO_STATUS_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * @generated from enum value: TODO_STATUS_PENDING = 1; + */ + PENDING = 1, + /** + * @generated from enum value: TODO_STATUS_IN_PROGRESS = 2; + */ + IN_PROGRESS = 2, + /** + * @generated from enum value: TODO_STATUS_COMPLETED = 3; + */ + COMPLETED = 3, + /** + * @generated from enum value: TODO_STATUS_CANCELLED = 4; + */ + CANCELLED = 4 +} +/** + * Describes the enum agent.v1.TodoStatus. + */ +export declare const TodoStatusSchema: GenEnum; +/** + * @generated from enum agent.v1.ClientOS + */ +export declare enum ClientOS { + /** + * @generated from enum value: CLIENT_OS_UNSPECIFIED = 0; + */ + CLIENT_OS_UNSPECIFIED = 0, + /** + * @generated from enum value: CLIENT_OS_WINDOWS = 1; + */ + CLIENT_OS_WINDOWS = 1, + /** + * @generated from enum value: CLIENT_OS_MACOS = 2; + */ + CLIENT_OS_MACOS = 2, + /** + * @generated from enum value: CLIENT_OS_LINUX = 3; + */ + CLIENT_OS_LINUX = 3 +} +/** + * Describes the enum agent.v1.ClientOS. + */ +export declare const ClientOSSchema: GenEnum; +/** + * @generated from enum agent.v1.ArtifactUploadDispatchStatus + */ +export declare enum ArtifactUploadDispatchStatus { + /** + * @generated from enum value: ARTIFACT_UPLOAD_DISPATCH_STATUS_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * @generated from enum value: ARTIFACT_UPLOAD_DISPATCH_STATUS_ACCEPTED = 1; + */ + ACCEPTED = 1, + /** + * @generated from enum value: ARTIFACT_UPLOAD_DISPATCH_STATUS_REJECTED = 2; + */ + REJECTED = 2, + /** + * @generated from enum value: ARTIFACT_UPLOAD_DISPATCH_STATUS_SKIPPED_ALREADY_IN_PROGRESS = 3; + */ + SKIPPED_ALREADY_IN_PROGRESS = 3 +} +/** + * Describes the enum agent.v1.ArtifactUploadDispatchStatus. + */ +export declare const ArtifactUploadDispatchStatusSchema: GenEnum; +/** + * @generated from enum agent.v1.Frame_Kind + */ +export declare enum Frame_Kind { + /** + * @generated from enum value: KIND_UNSPECIFIED = 0; + */ + KIND_UNSPECIFIED = 0, + /** + * @generated from enum value: KIND_REQUEST = 1; + */ + KIND_REQUEST = 1, + /** + * @generated from enum value: KIND_RESPONSE = 2; + */ + KIND_RESPONSE = 2, + /** + * @generated from enum value: KIND_ERROR = 3; + */ + KIND_ERROR = 3 +} +/** + * Describes the enum agent.v1.Frame_Kind. + */ +export declare const Frame_KindSchema: GenEnum; +/** + * @generated from enum agent.v1.BugbotDeeplinkEventKind + */ +export declare enum BugbotDeeplinkEventKind { + /** + * @generated from enum value: BUGBOT_DEEPLINK_EVENT_KIND_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * @generated from enum value: BUGBOT_DEEPLINK_EVENT_KIND_CLICKED = 1; + */ + CLICKED = 1, + /** + * @generated from enum value: BUGBOT_DEEPLINK_EVENT_KIND_HANDLED_DIALOG_SHOWN = 2; + */ + HANDLED_DIALOG_SHOWN = 2, + /** + * @generated from enum value: BUGBOT_DEEPLINK_EVENT_KIND_HANDLED_CHAT_CREATED = 3; + */ + HANDLED_CHAT_CREATED = 3, + /** + * @generated from enum value: BUGBOT_DEEPLINK_EVENT_KIND_ERROR = 4; + */ + ERROR = 4, + /** + * @generated from enum value: BUGBOT_DEEPLINK_EVENT_KIND_HANDLED_FIX_IN_WEB = 5; + */ + HANDLED_FIX_IN_WEB = 5 +} +/** + * Describes the enum agent.v1.BugbotDeeplinkEventKind. + */ +export declare const BugbotDeeplinkEventKindSchema: GenEnum; +/** + * Agent Service with bidirectional streaming + * + * @generated from service agent.v1.AgentService + */ +export declare const AgentService: GenService<{ + /** + * @generated from rpc agent.v1.AgentService.Run + */ + run: { + methodKind: "unary"; + input: typeof AgentClientMessageSchema; + output: typeof AgentServerMessageSchema; + }; + /** + * @generated from rpc agent.v1.AgentService.RunSSE + */ + runSSE: { + methodKind: "unary"; + input: typeof BidiRequestIdSchema; + output: typeof AgentServerMessageSchema; + }; + /** + * Generate a very short, succinct agent name from the provided user message. + * + * @generated from rpc agent.v1.AgentService.NameAgent + */ + nameAgent: { + methodKind: "unary"; + input: typeof NameAgentRequestSchema; + output: typeof NameAgentResponseSchema; + }; + /** + * @generated from rpc agent.v1.AgentService.GetUsableModels + */ + getUsableModels: { + methodKind: "unary"; + input: typeof GetUsableModelsRequestSchema; + output: typeof GetUsableModelsResponseSchema; + }; + /** + * @generated from rpc agent.v1.AgentService.GetDefaultModelForCli + */ + getDefaultModelForCli: { + methodKind: "unary"; + input: typeof GetDefaultModelForCliRequestSchema; + output: typeof GetDefaultModelForCliResponseSchema; + }; + /** + * Internal endpoint: returns all allowed model intents for devs + * + * @generated from rpc agent.v1.AgentService.GetAllowedModelIntents + */ + getAllowedModelIntents: { + methodKind: "unary"; + input: typeof GetAllowedModelIntentsRequestSchema; + output: typeof GetAllowedModelIntentsResponseSchema; + }; +}>; +/** + * @generated from service agent.v1.ControlService + */ +export declare const ControlService: GenService<{ + /** + * Spawn + * File read / write + * + * @generated from rpc agent.v1.ControlService.ReadTextFile + */ + readTextFile: { + methodKind: "unary"; + input: typeof ReadTextFileRequestSchema; + output: typeof ReadTextFileResponseSchema; + }; + /** + * @generated from rpc agent.v1.ControlService.WriteTextFile + */ + writeTextFile: { + methodKind: "unary"; + input: typeof WriteTextFileRequestSchema; + output: typeof WriteTextFileResponseSchema; + }; + /** + * Binary file read / write + * + * @generated from rpc agent.v1.ControlService.ReadBinaryFile + */ + readBinaryFile: { + methodKind: "unary"; + input: typeof ReadBinaryFileRequestSchema; + output: typeof ReadBinaryFileResponseSchema; + }; + /** + * @generated from rpc agent.v1.ControlService.WriteBinaryFile + */ + writeBinaryFile: { + methodKind: "unary"; + input: typeof WriteBinaryFileRequestSchema; + output: typeof WriteBinaryFileResponseSchema; + }; + /** + * Git + * + * @generated from rpc agent.v1.ControlService.GetWorkspaceChangesHash + */ + getWorkspaceChangesHash: { + methodKind: "unary"; + input: typeof GetWorkspaceChangesHashRequestSchema; + output: typeof GetWorkspaceChangesHashResponseSchema; + }; + /** + * @generated from rpc agent.v1.ControlService.RefreshGithubAccessToken + */ + refreshGithubAccessToken: { + methodKind: "unary"; + input: typeof RefreshGithubAccessTokenRequestSchema; + output: typeof RefreshGithubAccessTokenResponseSchema; + }; + /** + * Remote access + * + * @generated from rpc agent.v1.ControlService.WarmRemoteAccessServer + */ + warmRemoteAccessServer: { + methodKind: "unary"; + input: typeof WarmRemoteAccessServerRequestSchema; + output: typeof WarmRemoteAccessServerResponseSchema; + }; + /** + * Artifact uploads + * + * @generated from rpc agent.v1.ControlService.ListArtifacts + */ + listArtifacts: { + methodKind: "unary"; + input: typeof ListArtifactsRequestSchema; + output: typeof ListArtifactsResponseSchema; + }; + /** + * @generated from rpc agent.v1.ControlService.UploadArtifacts + */ + uploadArtifacts: { + methodKind: "unary"; + input: typeof UploadArtifactsRequestSchema; + output: typeof UploadArtifactsResponseSchema; + }; + /** + * @generated from rpc agent.v1.ControlService.GetMcpRefreshTokens + */ + getMcpRefreshTokens: { + methodKind: "unary"; + input: typeof GetMcpRefreshTokensRequestSchema; + output: typeof GetMcpRefreshTokensResponseSchema; + }; + /** + * Update the exec-daemon's environment variables for subsequent process spawns. This does NOT affect already-running processes. + * + * @generated from rpc agent.v1.ControlService.UpdateEnvironmentVariables + */ + updateEnvironmentVariables: { + methodKind: "unary"; + input: typeof UpdateEnvironmentVariablesRequestSchema; + output: typeof UpdateEnvironmentVariablesResponseSchema; + }; +}>; +/** + * Agent Service with unary RPC + * + * @generated from service agent.v1.ExecService + */ +export declare const ExecService: GenService<{}>; +/** + * @generated from service agent.v1.PrivateWorkerBridgeExternalService + */ +export declare const PrivateWorkerBridgeExternalService: GenService<{ + /** + * @generated from rpc agent.v1.PrivateWorkerBridgeExternalService.Connect + */ + connect: { + methodKind: "unary"; + input: typeof FrameSchema; + output: typeof FrameSchema; + }; +}>; +/** + * LifecycleService is exposed by the bridge *client*, in addition to ExecService (tool calls) and ControlService (control operations "within the daemon"). It operates at a similar abstraction level as AnyrunService: it represents operations similar to creating a VM, checking out a repository, etc. + * + * @generated from service agent.v1.LifecycleService + */ +export declare const LifecycleService: GenService<{ + /** + * Resets a long-lived worker + * + * @generated from rpc agent.v1.LifecycleService.ResetInstance + */ + resetInstance: { + methodKind: "unary"; + input: typeof EmptySchema; + output: typeof EmptySchema; + }; + /** + * Asks worker to exit(0) so that a new worker can take his place + * + * @generated from rpc agent.v1.LifecycleService.RenewInstance + */ + renewInstance: { + methodKind: "unary"; + input: typeof EmptySchema; + output: typeof EmptySchema; + }; +}>; diff --git a/dist/proto/agent_pb.js b/dist/proto/agent_pb.js new file mode 100644 index 0000000..22410ab --- /dev/null +++ b/dist/proto/agent_pb.js @@ -0,0 +1,3250 @@ +// @generated by protoc-gen-es v2.10.2 with parameter "target=ts" +// @generated from file agent.proto (package agent.v1, syntax proto3) +/* eslint-disable */ +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; +/** + * Describes the file agent.proto. + */ +export const file_agent = +/*@__PURE__*/ +fileDesc("CgthZ2VudC5wcm90bxIIYWdlbnQudjEicgoOR2xvYlRvb2xSZXN1bHQSLAoHc3VjY2VzcxgBIAEoCzIZLmFnZW50LnYxLkdsb2JUb29sU3VjY2Vzc0gAEigKBWVycm9yGAIgASgLMhcuYWdlbnQudjEuR2xvYlRvb2xFcnJvckgAQggKBnJlc3VsdCIeCg1HbG9iVG9vbEVycm9yEg0KBWVycm9yGAEgASgJIokBCg9HbG9iVG9vbFN1Y2Nlc3MSDwoHcGF0dGVybhgBIAEoCRIMCgRwYXRoGAIgASgJEg0KBWZpbGVzGAMgAygJEhMKC3RvdGFsX2ZpbGVzGAQgASgFEhgKEGNsaWVudF90cnVuY2F0ZWQYBSABKAgSGQoRcmlwZ3JlcF90cnVuY2F0ZWQYBiABKAgiRgoMR2xvYlRvb2xDYWxsEgwKBGFyZ3MYASABKAwSKAoGcmVzdWx0GAIgASgLMhguYWdlbnQudjEuR2xvYlRvb2xSZXN1bHQibQoRUmVhZExpbnRzVG9vbENhbGwSKQoEYXJncxgBIAEoCzIbLmFnZW50LnYxLlJlYWRMaW50c1Rvb2xBcmdzEi0KBnJlc3VsdBgCIAEoCzIdLmFnZW50LnYxLlJlYWRMaW50c1Rvb2xSZXN1bHQiIgoRUmVhZExpbnRzVG9vbEFyZ3MSDQoFcGF0aHMYASADKAkigQEKE1JlYWRMaW50c1Rvb2xSZXN1bHQSMQoHc3VjY2VzcxgBIAEoCzIeLmFnZW50LnYxLlJlYWRMaW50c1Rvb2xTdWNjZXNzSAASLQoFZXJyb3IYAiABKAsyHC5hZ2VudC52MS5SZWFkTGludHNUb29sRXJyb3JIAEIICgZyZXN1bHQiewoUUmVhZExpbnRzVG9vbFN1Y2Nlc3MSMwoQZmlsZV9kaWFnbm9zdGljcxgBIAMoCzIZLmFnZW50LnYxLkZpbGVEaWFnbm9zdGljcxITCgt0b3RhbF9maWxlcxgCIAEoBRIZChF0b3RhbF9kaWFnbm9zdGljcxgDIAEoBSJpCg9GaWxlRGlhZ25vc3RpY3MSDAoEcGF0aBgBIAEoCRItCgtkaWFnbm9zdGljcxgCIAMoCzIYLmFnZW50LnYxLkRpYWdub3N0aWNJdGVtEhkKEWRpYWdub3N0aWNzX2NvdW50GAMgASgFIqsBCg5EaWFnbm9zdGljSXRlbRIuCghzZXZlcml0eRgBIAEoDjIcLmFnZW50LnYxLkRpYWdub3N0aWNTZXZlcml0eRIoCgVyYW5nZRgCIAEoCzIZLmFnZW50LnYxLkRpYWdub3N0aWNSYW5nZRIPCgdtZXNzYWdlGAMgASgJEg4KBnNvdXJjZRgEIAEoCRIMCgRjb2RlGAUgASgJEhAKCGlzX3N0YWxlGAYgASgIIlUKD0RpYWdub3N0aWNSYW5nZRIhCgVzdGFydBgBIAEoCzISLmFnZW50LnYxLlBvc2l0aW9uEh8KA2VuZBgCIAEoCzISLmFnZW50LnYxLlBvc2l0aW9uIisKElJlYWRMaW50c1Rvb2xFcnJvchIVCg1lcnJvcl9tZXNzYWdlGAEgASgJIh0KDE1jcFRvb2xFcnJvchINCgVlcnJvchgBIAEoCSLSAQoNTWNwVG9vbFJlc3VsdBInCgdzdWNjZXNzGAEgASgLMhQuYWdlbnQudjEuTWNwU3VjY2Vzc0gAEicKBWVycm9yGAIgASgLMhYuYWdlbnQudjEuTWNwVG9vbEVycm9ySAASKQoIcmVqZWN0ZWQYAyABKAsyFS5hZ2VudC52MS5NY3BSZWplY3RlZEgAEjoKEXBlcm1pc3Npb25fZGVuaWVkGAQgASgLMh0uYWdlbnQudjEuTWNwUGVybWlzc2lvbkRlbmllZEgAQggKBnJlc3VsdCJXCgtNY3BUb29sQ2FsbBIfCgRhcmdzGAEgASgLMhEuYWdlbnQudjEuTWNwQXJncxInCgZyZXN1bHQYAiABKAsyFy5hZ2VudC52MS5NY3BUb29sUmVzdWx0Im0KEVNlbVNlYXJjaFRvb2xDYWxsEikKBGFyZ3MYASABKAsyGy5hZ2VudC52MS5TZW1TZWFyY2hUb29sQXJncxItCgZyZXN1bHQYAiABKAsyHS5hZ2VudC52MS5TZW1TZWFyY2hUb29sUmVzdWx0IlMKEVNlbVNlYXJjaFRvb2xBcmdzEg0KBXF1ZXJ5GAEgASgJEhoKEnRhcmdldF9kaXJlY3RvcmllcxgCIAMoCRITCgtleHBsYW5hdGlvbhgDIAEoCSKBAQoTU2VtU2VhcmNoVG9vbFJlc3VsdBIxCgdzdWNjZXNzGAEgASgLMh4uYWdlbnQudjEuU2VtU2VhcmNoVG9vbFN1Y2Nlc3NIABItCgVlcnJvchgCIAEoCzIcLmFnZW50LnYxLlNlbVNlYXJjaFRvb2xFcnJvckgAQggKBnJlc3VsdCI9ChRTZW1TZWFyY2hUb29sU3VjY2VzcxIPCgdyZXN1bHRzGAEgASgJEhQKDGNvZGVfcmVzdWx0cxgCIAMoDCIrChJTZW1TZWFyY2hUb29sRXJyb3ISFQoNZXJyb3JfbWVzc2FnZRgBIAEoCSKCAQoYTGlzdE1jcFJlc291cmNlc1Rvb2xDYWxsEjAKBGFyZ3MYASABKAsyIi5hZ2VudC52MS5MaXN0TWNwUmVzb3VyY2VzRXhlY0FyZ3MSNAoGcmVzdWx0GAIgASgLMiQuYWdlbnQudjEuTGlzdE1jcFJlc291cmNlc0V4ZWNSZXN1bHQifwoXUmVhZE1jcFJlc291cmNlVG9vbENhbGwSLwoEYXJncxgBIAEoCzIhLmFnZW50LnYxLlJlYWRNY3BSZXNvdXJjZUV4ZWNBcmdzEjMKBnJlc3VsdBgCIAEoCzIjLmFnZW50LnYxLlJlYWRNY3BSZXNvdXJjZUV4ZWNSZXN1bHQiWQoNRmV0Y2hUb29sQ2FsbBIhCgRhcmdzGAEgASgLMhMuYWdlbnQudjEuRmV0Y2hBcmdzEiUKBnJlc3VsdBgCIAEoCzIVLmFnZW50LnYxLkZldGNoUmVzdWx0Im4KFFJlY29yZFNjcmVlblRvb2xDYWxsEigKBGFyZ3MYASABKAsyGi5hZ2VudC52MS5SZWNvcmRTY3JlZW5BcmdzEiwKBnJlc3VsdBgCIAEoCzIcLmFnZW50LnYxLlJlY29yZFNjcmVlblJlc3VsdCJ3ChdXcml0ZVNoZWxsU3RkaW5Ub29sQ2FsbBIrCgRhcmdzGAEgASgLMh0uYWdlbnQudjEuV3JpdGVTaGVsbFN0ZGluQXJncxIvCgZyZXN1bHQYAiABKAsyHy5hZ2VudC52MS5Xcml0ZVNoZWxsU3RkaW5SZXN1bHQisQEKC1JlZmxlY3RBcmdzEiIKGnVuZXhwZWN0ZWRfYWN0aW9uX291dGNvbWVzGAEgASgJEh0KFXJlbGV2YW50X2luc3RydWN0aW9ucxgCIAEoCRIZChFzY2VuYXJpb19hbmFseXNpcxgDIAEoCRIaChJjcml0aWNhbF9zeW50aGVzaXMYBCABKAkSEgoKbmV4dF9zdGVwcxgFIAEoCRIUCgx0b29sX2NhbGxfaWQYBiABKAkibwoNUmVmbGVjdFJlc3VsdBIrCgdzdWNjZXNzGAEgASgLMhguYWdlbnQudjEuUmVmbGVjdFN1Y2Nlc3NIABInCgVlcnJvchgCIAEoCzIWLmFnZW50LnYxLlJlZmxlY3RFcnJvckgAQggKBnJlc3VsdCIQCg5SZWZsZWN0U3VjY2VzcyIdCgxSZWZsZWN0RXJyb3ISDQoFZXJyb3IYASABKAkiXwoPUmVmbGVjdFRvb2xDYWxsEiMKBGFyZ3MYASABKAsyFS5hZ2VudC52MS5SZWZsZWN0QXJncxInCgZyZXN1bHQYAiABKAsyFy5hZ2VudC52MS5SZWZsZWN0UmVzdWx0IlkKF1N0YXJ0R3JpbmRFeGVjdXRpb25BcmdzEhgKC2V4cGxhbmF0aW9uGAEgASgJSACIAQESFAoMdG9vbF9jYWxsX2lkGAIgASgJQg4KDF9leHBsYW5hdGlvbiKTAQoZU3RhcnRHcmluZEV4ZWN1dGlvblJlc3VsdBI3CgdzdWNjZXNzGAEgASgLMiQuYWdlbnQudjEuU3RhcnRHcmluZEV4ZWN1dGlvblN1Y2Nlc3NIABIzCgVlcnJvchgCIAEoCzIiLmFnZW50LnYxLlN0YXJ0R3JpbmRFeGVjdXRpb25FcnJvckgAQggKBnJlc3VsdCIcChpTdGFydEdyaW5kRXhlY3V0aW9uU3VjY2VzcyIpChhTdGFydEdyaW5kRXhlY3V0aW9uRXJyb3ISDQoFZXJyb3IYASABKAkigwEKG1N0YXJ0R3JpbmRFeGVjdXRpb25Ub29sQ2FsbBIvCgRhcmdzGAEgASgLMiEuYWdlbnQudjEuU3RhcnRHcmluZEV4ZWN1dGlvbkFyZ3MSMwoGcmVzdWx0GAIgASgLMiMuYWdlbnQudjEuU3RhcnRHcmluZEV4ZWN1dGlvblJlc3VsdCJYChZTdGFydEdyaW5kUGxhbm5pbmdBcmdzEhgKC2V4cGxhbmF0aW9uGAEgASgJSACIAQESFAoMdG9vbF9jYWxsX2lkGAIgASgJQg4KDF9leHBsYW5hdGlvbiKQAQoYU3RhcnRHcmluZFBsYW5uaW5nUmVzdWx0EjYKB3N1Y2Nlc3MYASABKAsyIy5hZ2VudC52MS5TdGFydEdyaW5kUGxhbm5pbmdTdWNjZXNzSAASMgoFZXJyb3IYAiABKAsyIS5hZ2VudC52MS5TdGFydEdyaW5kUGxhbm5pbmdFcnJvckgAQggKBnJlc3VsdCIbChlTdGFydEdyaW5kUGxhbm5pbmdTdWNjZXNzIigKF1N0YXJ0R3JpbmRQbGFubmluZ0Vycm9yEg0KBWVycm9yGAEgASgJIoABChpTdGFydEdyaW5kUGxhbm5pbmdUb29sQ2FsbBIuCgRhcmdzGAEgASgLMiAuYWdlbnQudjEuU3RhcnRHcmluZFBsYW5uaW5nQXJncxIyCgZyZXN1bHQYAiABKAsyIi5hZ2VudC52MS5TdGFydEdyaW5kUGxhbm5pbmdSZXN1bHQinAEKCFRhc2tBcmdzEhMKC2Rlc2NyaXB0aW9uGAEgASgJEg4KBnByb21wdBgCIAEoCRItCg1zdWJhZ2VudF90eXBlGAMgASgLMhYuYWdlbnQudjEuU3ViYWdlbnRUeXBlEhIKBW1vZGVsGAQgASgJSACIAQESEwoGcmVzdW1lGAUgASgJSAGIAQFCCAoGX21vZGVsQgkKB19yZXN1bWUiqgEKC1Rhc2tTdWNjZXNzEjYKEmNvbnZlcnNhdGlvbl9zdGVwcxgBIAMoCzIaLmFnZW50LnYxLkNvbnZlcnNhdGlvblN0ZXASFQoIYWdlbnRfaWQYAiABKAlIAIgBARIVCg1pc19iYWNrZ3JvdW5kGAMgASgIEhgKC2R1cmF0aW9uX21zGAQgASgESAGIAQFCCwoJX2FnZW50X2lkQg4KDF9kdXJhdGlvbl9tcyIaCglUYXNrRXJyb3ISDQoFZXJyb3IYASABKAkiZgoKVGFza1Jlc3VsdBIoCgdzdWNjZXNzGAEgASgLMhUuYWdlbnQudjEuVGFza1N1Y2Nlc3NIABIkCgVlcnJvchgCIAEoCzITLmFnZW50LnYxLlRhc2tFcnJvckgAQggKBnJlc3VsdCJWCgxUYXNrVG9vbENhbGwSIAoEYXJncxgBIAEoCzISLmFnZW50LnYxLlRhc2tBcmdzEiQKBnJlc3VsdBgCIAEoCzIULmFnZW50LnYxLlRhc2tSZXN1bHQiTAoRVGFza1Rvb2xDYWxsRGVsdGESNwoSaW50ZXJhY3Rpb25fdXBkYXRlGAEgASgLMhsuYWdlbnQudjEuSW50ZXJhY3Rpb25VcGRhdGUiyw8KCFRvb2xDYWxsEjIKD3NoZWxsX3Rvb2xfY2FsbBgBIAEoCzIXLmFnZW50LnYxLlNoZWxsVG9vbENhbGxIABI0ChBkZWxldGVfdG9vbF9jYWxsGAMgASgLMhguYWdlbnQudjEuRGVsZXRlVG9vbENhbGxIABIwCg5nbG9iX3Rvb2xfY2FsbBgEIAEoCzIWLmFnZW50LnYxLkdsb2JUb29sQ2FsbEgAEjAKDmdyZXBfdG9vbF9jYWxsGAUgASgLMhYuYWdlbnQudjEuR3JlcFRvb2xDYWxsSAASMAoOcmVhZF90b29sX2NhbGwYCCABKAsyFi5hZ2VudC52MS5SZWFkVG9vbENhbGxIABI/ChZ1cGRhdGVfdG9kb3NfdG9vbF9jYWxsGAkgASgLMh0uYWdlbnQudjEuVXBkYXRlVG9kb3NUb29sQ2FsbEgAEjsKFHJlYWRfdG9kb3NfdG9vbF9jYWxsGAogASgLMhsuYWdlbnQudjEuUmVhZFRvZG9zVG9vbENhbGxIABIwCg5lZGl0X3Rvb2xfY2FsbBgMIAEoCzIWLmFnZW50LnYxLkVkaXRUb29sQ2FsbEgAEiwKDGxzX3Rvb2xfY2FsbBgNIAEoCzIULmFnZW50LnYxLkxzVG9vbENhbGxIABI7ChRyZWFkX2xpbnRzX3Rvb2xfY2FsbBgOIAEoCzIbLmFnZW50LnYxLlJlYWRMaW50c1Rvb2xDYWxsSAASLgoNbWNwX3Rvb2xfY2FsbBgPIAEoCzIVLmFnZW50LnYxLk1jcFRvb2xDYWxsSAASOwoUc2VtX3NlYXJjaF90b29sX2NhbGwYECABKAsyGy5hZ2VudC52MS5TZW1TZWFyY2hUb29sQ2FsbEgAEj0KFWNyZWF0ZV9wbGFuX3Rvb2xfY2FsbBgRIAEoCzIcLmFnZW50LnYxLkNyZWF0ZVBsYW5Ub29sQ2FsbEgAEjsKFHdlYl9zZWFyY2hfdG9vbF9jYWxsGBIgASgLMhsuYWdlbnQudjEuV2ViU2VhcmNoVG9vbENhbGxIABIwCg50YXNrX3Rvb2xfY2FsbBgTIAEoCzIWLmFnZW50LnYxLlRhc2tUb29sQ2FsbEgAEkoKHGxpc3RfbWNwX3Jlc291cmNlc190b29sX2NhbGwYFCABKAsyIi5hZ2VudC52MS5MaXN0TWNwUmVzb3VyY2VzVG9vbENhbGxIABJIChtyZWFkX21jcF9yZXNvdXJjZV90b29sX2NhbGwYFSABKAsyIS5hZ2VudC52MS5SZWFkTWNwUmVzb3VyY2VUb29sQ2FsbEgAEkYKGmFwcGx5X2FnZW50X2RpZmZfdG9vbF9jYWxsGBYgASgLMiAuYWdlbnQudjEuQXBwbHlBZ2VudERpZmZUb29sQ2FsbEgAEj8KFmFza19xdWVzdGlvbl90b29sX2NhbGwYFyABKAsyHS5hZ2VudC52MS5Bc2tRdWVzdGlvblRvb2xDYWxsSAASMgoPZmV0Y2hfdG9vbF9jYWxsGBggASgLMhcuYWdlbnQudjEuRmV0Y2hUb29sQ2FsbEgAEj0KFXN3aXRjaF9tb2RlX3Rvb2xfY2FsbBgZIAEoCzIcLmFnZW50LnYxLlN3aXRjaE1vZGVUb29sQ2FsbEgAEjsKFGV4YV9zZWFyY2hfdG9vbF9jYWxsGBogASgLMhsuYWdlbnQudjEuRXhhU2VhcmNoVG9vbENhbGxIABI5ChNleGFfZmV0Y2hfdG9vbF9jYWxsGBsgASgLMhouYWdlbnQudjEuRXhhRmV0Y2hUb29sQ2FsbEgAEkMKGGdlbmVyYXRlX2ltYWdlX3Rvb2xfY2FsbBgcIAEoCzIfLmFnZW50LnYxLkdlbmVyYXRlSW1hZ2VUb29sQ2FsbEgAEkEKF3JlY29yZF9zY3JlZW5fdG9vbF9jYWxsGB0gASgLMh4uYWdlbnQudjEuUmVjb3JkU2NyZWVuVG9vbENhbGxIABI/ChZjb21wdXRlcl91c2VfdG9vbF9jYWxsGB4gASgLMh0uYWdlbnQudjEuQ29tcHV0ZXJVc2VUb29sQ2FsbEgAEkgKG3dyaXRlX3NoZWxsX3N0ZGluX3Rvb2xfY2FsbBgfIAEoCzIhLmFnZW50LnYxLldyaXRlU2hlbGxTdGRpblRvb2xDYWxsSAASNgoRcmVmbGVjdF90b29sX2NhbGwYICABKAsyGS5hZ2VudC52MS5SZWZsZWN0VG9vbENhbGxIABJOCh5zZXR1cF92bV9lbnZpcm9ubWVudF90b29sX2NhbGwYISABKAsyJC5hZ2VudC52MS5TZXR1cFZtRW52aXJvbm1lbnRUb29sQ2FsbEgAEjoKE3RydW5jYXRlZF90b29sX2NhbGwYIiABKAsyGy5hZ2VudC52MS5UcnVuY2F0ZWRUb29sQ2FsbEgAElAKH3N0YXJ0X2dyaW5kX2V4ZWN1dGlvbl90b29sX2NhbGwYIyABKAsyJS5hZ2VudC52MS5TdGFydEdyaW5kRXhlY3V0aW9uVG9vbENhbGxIABJOCh5zdGFydF9ncmluZF9wbGFubmluZ190b29sX2NhbGwYJCABKAsyJC5hZ2VudC52MS5TdGFydEdyaW5kUGxhbm5pbmdUb29sQ2FsbEgAQgYKBHRvb2wiFwoVVHJ1bmNhdGVkVG9vbENhbGxBcmdzIhoKGFRydW5jYXRlZFRvb2xDYWxsU3VjY2VzcyInChZUcnVuY2F0ZWRUb29sQ2FsbEVycm9yEg0KBWVycm9yGAEgASgJIo0BChdUcnVuY2F0ZWRUb29sQ2FsbFJlc3VsdBI1CgdzdWNjZXNzGAEgASgLMiIuYWdlbnQudjEuVHJ1bmNhdGVkVG9vbENhbGxTdWNjZXNzSAASMQoFZXJyb3IYAiABKAsyIC5hZ2VudC52MS5UcnVuY2F0ZWRUb29sQ2FsbEVycm9ySABCCAoGcmVzdWx0IpQBChFUcnVuY2F0ZWRUb29sQ2FsbBIdChVvcmlnaW5hbF9zdGVwX2Jsb2JfaWQYASABKAwSLQoEYXJncxgCIAEoCzIfLmFnZW50LnYxLlRydW5jYXRlZFRvb2xDYWxsQXJncxIxCgZyZXN1bHQYAyABKAsyIS5hZ2VudC52MS5UcnVuY2F0ZWRUb29sQ2FsbFJlc3VsdCLRAQoNVG9vbENhbGxEZWx0YRI9ChVzaGVsbF90b29sX2NhbGxfZGVsdGEYASABKAsyHC5hZ2VudC52MS5TaGVsbFRvb2xDYWxsRGVsdGFIABI7ChR0YXNrX3Rvb2xfY2FsbF9kZWx0YRgCIAEoCzIbLmFnZW50LnYxLlRhc2tUb29sQ2FsbERlbHRhSAASOwoUZWRpdF90b29sX2NhbGxfZGVsdGEYAyABKAsyGy5hZ2VudC52MS5FZGl0VG9vbENhbGxEZWx0YUgAQgcKBWRlbHRhIrYBChBDb252ZXJzYXRpb25TdGVwEjcKEWFzc2lzdGFudF9tZXNzYWdlGAEgASgLMhouYWdlbnQudjEuQXNzaXN0YW50TWVzc2FnZUgAEicKCXRvb2xfY2FsbBgCIAEoCzISLmFnZW50LnYxLlRvb2xDYWxsSAASNQoQdGhpbmtpbmdfbWVzc2FnZRgDIAEoCzIZLmFnZW50LnYxLlRoaW5raW5nTWVzc2FnZUgAQgkKB21lc3NhZ2UigQQKEkNvbnZlcnNhdGlvbkFjdGlvbhI6ChN1c2VyX21lc3NhZ2VfYWN0aW9uGAEgASgLMhsuYWdlbnQudjEuVXNlck1lc3NhZ2VBY3Rpb25IABIvCg1yZXN1bWVfYWN0aW9uGAIgASgLMhYuYWdlbnQudjEuUmVzdW1lQWN0aW9uSAASLwoNY2FuY2VsX2FjdGlvbhgDIAEoCzIWLmFnZW50LnYxLkNhbmNlbEFjdGlvbkgAEjUKEHN1bW1hcml6ZV9hY3Rpb24YBCABKAsyGS5hZ2VudC52MS5TdW1tYXJpemVBY3Rpb25IABI8ChRzaGVsbF9jb21tYW5kX2FjdGlvbhgFIAEoCzIcLmFnZW50LnYxLlNoZWxsQ29tbWFuZEFjdGlvbkgAEjYKEXN0YXJ0X3BsYW5fYWN0aW9uGAYgASgLMhkuYWdlbnQudjEuU3RhcnRQbGFuQWN0aW9uSAASOgoTZXhlY3V0ZV9wbGFuX2FjdGlvbhgHIAEoCzIbLmFnZW50LnYxLkV4ZWN1dGVQbGFuQWN0aW9uSAASWgokYXN5bmNfYXNrX3F1ZXN0aW9uX2NvbXBsZXRpb25fYWN0aW9uGAggASgLMiouYWdlbnQudjEuQXN5bmNBc2tRdWVzdGlvbkNvbXBsZXRpb25BY3Rpb25IAEIICgZhY3Rpb24ivwEKEVVzZXJNZXNzYWdlQWN0aW9uEisKDHVzZXJfbWVzc2FnZRgBIAEoCzIVLmFnZW50LnYxLlVzZXJNZXNzYWdlEjEKD3JlcXVlc3RfY29udGV4dBgCIAEoCzIYLmFnZW50LnYxLlJlcXVlc3RDb250ZXh0EikKHHNlbmRfdG9faW50ZXJhY3Rpb25fbGlzdGVuZXIYAyABKAhIAIgBAUIfCh1fc2VuZF90b19pbnRlcmFjdGlvbl9saXN0ZW5lciIOCgxDYW5jZWxBY3Rpb24iQQoMUmVzdW1lQWN0aW9uEjEKD3JlcXVlc3RfY29udGV4dBgCIAEoCzIYLmFnZW50LnYxLlJlcXVlc3RDb250ZXh0IqABCiBBc3luY0Fza1F1ZXN0aW9uQ29tcGxldGlvbkFjdGlvbhIdChVvcmlnaW5hbF90b29sX2NhbGxfaWQYASABKAkSMAoNb3JpZ2luYWxfYXJncxgCIAEoCzIZLmFnZW50LnYxLkFza1F1ZXN0aW9uQXJncxIrCgZyZXN1bHQYAyABKAsyGy5hZ2VudC52MS5Bc2tRdWVzdGlvblJlc3VsdCIRCg9TdW1tYXJpemVBY3Rpb24iVAoSU2hlbGxDb21tYW5kQWN0aW9uEi0KDXNoZWxsX2NvbW1hbmQYASABKAsyFi5hZ2VudC52MS5TaGVsbENvbW1hbmQSDwoHZXhlY19pZBgCIAEoCSKCAQoPU3RhcnRQbGFuQWN0aW9uEisKDHVzZXJfbWVzc2FnZRgBIAEoCzIVLmFnZW50LnYxLlVzZXJNZXNzYWdlEjEKD3JlcXVlc3RfY29udGV4dBgCIAEoCzIYLmFnZW50LnYxLlJlcXVlc3RDb250ZXh0Eg8KB2lzX3NwZWMYAyABKAgi4gEKEUV4ZWN1dGVQbGFuQWN0aW9uEjEKD3JlcXVlc3RfY29udGV4dBgBIAEoCzIYLmFnZW50LnYxLlJlcXVlc3RDb250ZXh0Ei0KBHBsYW4YAiABKAsyGi5hZ2VudC52MS5Db252ZXJzYXRpb25QbGFuSACIAQESGgoNcGxhbl9maWxlX3VyaRgDIAEoCUgBiAEBEh4KEXBsYW5fZmlsZV9jb250ZW50GAQgASgJSAKIAQFCBwoFX3BsYW5CEAoOX3BsYW5fZmlsZV91cmlCFAoSX3BsYW5fZmlsZV9jb250ZW50IugCCgtVc2VyTWVzc2FnZRIMCgR0ZXh0GAEgASgJEhIKCm1lc3NhZ2VfaWQYAiABKAkSOAoQc2VsZWN0ZWRfY29udGV4dBgDIAEoCzIZLmFnZW50LnYxLlNlbGVjdGVkQ29udGV4dEgAiAEBEgwKBG1vZGUYBCABKAUSHQoQaXNfc2ltdWxhdGVkX21zZxgFIAEoCEgBiAEBEh8KEmJlc3Rfb2Zfbl9ncm91cF9pZBgGIAEoCUgCiAEBEigKG3RyeV91c2VfYmVzdF9vZl9uX3Byb21vdGlvbhgHIAEoCEgDiAEBEhYKCXJpY2hfdGV4dBgIIAEoCUgEiAEBQhMKEV9zZWxlY3RlZF9jb250ZXh0QhMKEV9pc19zaW11bGF0ZWRfbXNnQhUKE19iZXN0X29mX25fZ3JvdXBfaWRCHgocX3RyeV91c2VfYmVzdF9vZl9uX3Byb21vdGlvbkIMCgpfcmljaF90ZXh0IiAKEEFzc2lzdGFudE1lc3NhZ2USDAoEdGV4dBgBIAEoCSI0Cg9UaGlua2luZ01lc3NhZ2USDAoEdGV4dBgBIAEoCRITCgtkdXJhdGlvbl9tcxgCIAEoDSIfCgxTaGVsbENvbW1hbmQSDwoHY29tbWFuZBgBIAEoCSJACgtTaGVsbE91dHB1dBIOCgZzdGRvdXQYASABKAkSDgoGc3RkZXJyGAIgASgJEhEKCWV4aXRfY29kZRgDIAEoBSKiAQoQQ29udmVyc2F0aW9uVHVybhJCChdhZ2VudF9jb252ZXJzYXRpb25fdHVybhgBIAEoCzIfLmFnZW50LnYxLkFnZW50Q29udmVyc2F0aW9uVHVybkgAEkIKF3NoZWxsX2NvbnZlcnNhdGlvbl90dXJuGAIgASgLMh8uYWdlbnQudjEuU2hlbGxDb252ZXJzYXRpb25UdXJuSABCBgoEdHVybiIgChBDb252ZXJzYXRpb25QbGFuEgwKBHBsYW4YASABKAkivQEKGUNvbnZlcnNhdGlvblR1cm5TdHJ1Y3R1cmUSSwoXYWdlbnRfY29udmVyc2F0aW9uX3R1cm4YASABKAsyKC5hZ2VudC52MS5BZ2VudENvbnZlcnNhdGlvblR1cm5TdHJ1Y3R1cmVIABJLChdzaGVsbF9jb252ZXJzYXRpb25fdHVybhgCIAEoCzIoLmFnZW50LnYxLlNoZWxsQ29udmVyc2F0aW9uVHVyblN0cnVjdHVyZUgAQgYKBHR1cm4ilwEKFUFnZW50Q29udmVyc2F0aW9uVHVybhIrCgx1c2VyX21lc3NhZ2UYASABKAsyFS5hZ2VudC52MS5Vc2VyTWVzc2FnZRIpCgVzdGVwcxgCIAMoCzIaLmFnZW50LnYxLkNvbnZlcnNhdGlvblN0ZXASFwoKcmVxdWVzdF9pZBgDIAEoCUgAiAEBQg0KC19yZXF1ZXN0X2lkIm0KHkFnZW50Q29udmVyc2F0aW9uVHVyblN0cnVjdHVyZRIUCgx1c2VyX21lc3NhZ2UYASABKAwSDQoFc3RlcHMYAiADKAwSFwoKcmVxdWVzdF9pZBgDIAEoCUgAiAEBQg0KC19yZXF1ZXN0X2lkInMKFVNoZWxsQ29udmVyc2F0aW9uVHVybhItCg1zaGVsbF9jb21tYW5kGAEgASgLMhYuYWdlbnQudjEuU2hlbGxDb21tYW5kEisKDHNoZWxsX291dHB1dBgCIAEoCzIVLmFnZW50LnYxLlNoZWxsT3V0cHV0Ik0KHlNoZWxsQ29udmVyc2F0aW9uVHVyblN0cnVjdHVyZRIVCg1zaGVsbF9jb21tYW5kGAEgASgMEhQKDHNoZWxsX291dHB1dBgCIAEoDCImChNDb252ZXJzYXRpb25TdW1tYXJ5Eg8KB3N1bW1hcnkYASABKAkieAoaQ29udmVyc2F0aW9uU3VtbWFyeUFyY2hpdmUSGwoTc3VtbWFyaXplZF9tZXNzYWdlcxgBIAMoDBIPCgdzdW1tYXJ5GAIgASgJEhMKC3dpbmRvd190YWlsGAMgASgNEhcKD3N1bW1hcnlfbWVzc2FnZRgEIAEoDCJDChhDb252ZXJzYXRpb25Ub2tlbkRldGFpbHMSEwoLdXNlZF90b2tlbnMYASABKA0SEgoKbWF4X3Rva2VucxgCIAEoDSJfCglGaWxlU3RhdGUSFAoHY29udGVudBgBIAEoCUgAiAEBEhwKD2luaXRpYWxfY29udGVudBgCIAEoCUgBiAEBQgoKCF9jb250ZW50QhIKEF9pbml0aWFsX2NvbnRlbnQiaAoSRmlsZVN0YXRlU3RydWN0dXJlEhQKB2NvbnRlbnQYASABKAxIAIgBARIcCg9pbml0aWFsX2NvbnRlbnQYAiABKAxIAYgBAUIKCghfY29udGVudEISChBfaW5pdGlhbF9jb250ZW50IjcKClN0ZXBUaW1pbmcSEwoLZHVyYXRpb25fbXMYASABKAQSFAoMdGltZXN0YW1wX21zGAIgASgEIvYEChFDb252ZXJzYXRpb25TdGF0ZRIhChlyb290X3Byb21wdF9tZXNzYWdlc19qc29uGAEgAygJEikKBXR1cm5zGAggAygLMhouYWdlbnQudjEuQ29udmVyc2F0aW9uVHVybhIhCgV0b2RvcxgDIAMoCzISLmFnZW50LnYxLlRvZG9JdGVtEhoKEnBlbmRpbmdfdG9vbF9jYWxscxgEIAMoCRI5Cg10b2tlbl9kZXRhaWxzGAUgASgLMiIuYWdlbnQudjEuQ29udmVyc2F0aW9uVG9rZW5EZXRhaWxzEjMKB3N1bW1hcnkYBiABKAsyHS5hZ2VudC52MS5Db252ZXJzYXRpb25TdW1tYXJ5SACIAQESLQoEcGxhbhgHIAEoCzIaLmFnZW50LnYxLkNvbnZlcnNhdGlvblBsYW5IAYgBARJCCg9zdW1tYXJ5X2FyY2hpdmUYCSABKAsyJC5hZ2VudC52MS5Db252ZXJzYXRpb25TdW1tYXJ5QXJjaGl2ZUgCiAEBEkAKC2ZpbGVfc3RhdGVzGAogAygLMisuYWdlbnQudjEuQ29udmVyc2F0aW9uU3RhdGUuRmlsZVN0YXRlc0VudHJ5Ej4KEHN1bW1hcnlfYXJjaGl2ZXMYCyADKAsyJC5hZ2VudC52MS5Db252ZXJzYXRpb25TdW1tYXJ5QXJjaGl2ZRpGCg9GaWxlU3RhdGVzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMuYWdlbnQudjEuRmlsZVN0YXRlOgI4AUIKCghfc3VtbWFyeUIHCgVfcGxhbkISChBfc3VtbWFyeV9hcmNoaXZlIscBChZTdWJhZ2VudFBlcnNpc3RlZFN0YXRlEkAKEmNvbnZlcnNhdGlvbl9zdGF0ZRgBIAEoCzIkLmFnZW50LnYxLkNvbnZlcnNhdGlvblN0YXRlU3RydWN0dXJlEhwKFGNyZWF0ZWRfdGltZXN0YW1wX21zGAIgASgEEh4KFmxhc3RfdXNlZF90aW1lc3RhbXBfbXMYAyABKAQSLQoNc3ViYWdlbnRfdHlwZRgEIAEoCzIWLmFnZW50LnYxLlN1YmFnZW50VHlwZSK3BwoaQ29udmVyc2F0aW9uU3RhdGVTdHJ1Y3R1cmUSEQoJdHVybnNfb2xkGAIgAygMEiEKGXJvb3RfcHJvbXB0X21lc3NhZ2VzX2pzb24YASADKAwSDQoFdHVybnMYCCADKAwSDQoFdG9kb3MYAyADKAwSGgoScGVuZGluZ190b29sX2NhbGxzGAQgAygJEjkKDXRva2VuX2RldGFpbHMYBSABKAsyIi5hZ2VudC52MS5Db252ZXJzYXRpb25Ub2tlbkRldGFpbHMSFAoHc3VtbWFyeRgGIAEoDEgAiAEBEhEKBHBsYW4YByABKAxIAYgBARIfChdwcmV2aW91c193b3Jrc3BhY2VfdXJpcxgJIAMoCRIRCgRtb2RlGAogASgFSAKIAQESHAoPc3VtbWFyeV9hcmNoaXZlGAsgASgMSAOIAQESSQoLZmlsZV9zdGF0ZXMYDCADKAsyNC5hZ2VudC52MS5Db252ZXJzYXRpb25TdGF0ZVN0cnVjdHVyZS5GaWxlU3RhdGVzRW50cnkSTgoOZmlsZV9zdGF0ZXNfdjIYDyADKAsyNi5hZ2VudC52MS5Db252ZXJzYXRpb25TdGF0ZVN0cnVjdHVyZS5GaWxlU3RhdGVzVjJFbnRyeRIYChBzdW1tYXJ5X2FyY2hpdmVzGA0gAygMEioKDHR1cm5fdGltaW5ncxgOIAMoCzIULmFnZW50LnYxLlN0ZXBUaW1pbmcSUQoPc3ViYWdlbnRfc3RhdGVzGBAgAygLMjguYWdlbnQudjEuQ29udmVyc2F0aW9uU3RhdGVTdHJ1Y3R1cmUuU3ViYWdlbnRTdGF0ZXNFbnRyeRIaChJzZWxmX3N1bW1hcnlfY291bnQYESABKA0SEgoKcmVhZF9wYXRocxgSIAMoCRoxCg9GaWxlU3RhdGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgMOgI4ARpRChFGaWxlU3RhdGVzVjJFbnRyeRILCgNrZXkYASABKAkSKwoFdmFsdWUYAiABKAsyHC5hZ2VudC52MS5GaWxlU3RhdGVTdHJ1Y3R1cmU6AjgBGlcKE1N1YmFnZW50U3RhdGVzRW50cnkSCwoDa2V5GAEgASgJEi8KBXZhbHVlGAIgASgLMiAuYWdlbnQudjEuU3ViYWdlbnRQZXJzaXN0ZWRTdGF0ZToCOAFCCgoIX3N1bW1hcnlCBwoFX3BsYW5CBwoFX21vZGVCEgoQX3N1bW1hcnlfYXJjaGl2ZSIRCg9UaGlua2luZ0RldGFpbHMiSAoRQXBpS2V5Q3JlZGVudGlhbHMSDwoHYXBpX2tleRgBIAEoCRIVCghiYXNlX3VybBgCIAEoCUgAiAEBQgsKCV9iYXNlX3VybCJJChBBenVyZUNyZWRlbnRpYWxzEg8KB2FwaV9rZXkYASABKAkSEAoIYmFzZV91cmwYAiABKAkSEgoKZGVwbG95bWVudBgDIAEoCSJ6ChJCZWRyb2NrQ3JlZGVudGlhbHMSEgoKYWNjZXNzX2tleRgBIAEoCRISCgpzZWNyZXRfa2V5GAIgASgJEg4KBnJlZ2lvbhgDIAEoCRIaCg1zZXNzaW9uX3Rva2VuGAQgASgJSACIAQFCEAoOX3Nlc3Npb25fdG9rZW4isQMKDE1vZGVsRGV0YWlscxIQCghtb2RlbF9pZBgBIAEoCRIYChBkaXNwbGF5X21vZGVsX2lkGAMgASgJEhQKDGRpc3BsYXlfbmFtZRgEIAEoCRIaChJkaXNwbGF5X25hbWVfc2hvcnQYBSABKAkSDwoHYWxpYXNlcxgGIAMoCRI4ChB0aGlua2luZ19kZXRhaWxzGAIgASgLMhkuYWdlbnQudjEuVGhpbmtpbmdEZXRhaWxzSAGIAQESFQoIbWF4X21vZGUYByABKAhIAogBARI6ChNhcGlfa2V5X2NyZWRlbnRpYWxzGAggASgLMhsuYWdlbnQudjEuQXBpS2V5Q3JlZGVudGlhbHNIABI3ChFhenVyZV9jcmVkZW50aWFscxgJIAEoCzIaLmFnZW50LnYxLkF6dXJlQ3JlZGVudGlhbHNIABI7ChNiZWRyb2NrX2NyZWRlbnRpYWxzGAogASgLMhwuYWdlbnQudjEuQmVkcm9ja0NyZWRlbnRpYWxzSABCDQoLY3JlZGVudGlhbHNCEwoRX3RoaW5raW5nX2RldGFpbHNCCwoJX21heF9tb2RlIrcCCg5SZXF1ZXN0ZWRNb2RlbBIQCghtb2RlbF9pZBgBIAEoCRIQCghtYXhfbW9kZRgCIAEoCBJACgpwYXJhbWV0ZXJzGAMgAygLMiwuYWdlbnQudjEuUmVxdWVzdGVkTW9kZWxfTW9kZWxQYXJhbWV0ZXJieXRlcxI6ChNhcGlfa2V5X2NyZWRlbnRpYWxzGAQgASgLMhsuYWdlbnQudjEuQXBpS2V5Q3JlZGVudGlhbHNIABI3ChFhenVyZV9jcmVkZW50aWFscxgFIAEoCzIaLmFnZW50LnYxLkF6dXJlQ3JlZGVudGlhbHNIABI7ChNiZWRyb2NrX2NyZWRlbnRpYWxzGAYgASgLMhwuYWdlbnQudjEuQmVkcm9ja0NyZWRlbnRpYWxzSABCDQoLY3JlZGVudGlhbHMiPwoiUmVxdWVzdGVkTW9kZWxfTW9kZWxQYXJhbWV0ZXJieXRlcxIKCgJpZBgBIAEoCRINCgV2YWx1ZRgCIAEoCSK5BAoPQWdlbnRSdW5SZXF1ZXN0EkAKEmNvbnZlcnNhdGlvbl9zdGF0ZRgBIAEoCzIkLmFnZW50LnYxLkNvbnZlcnNhdGlvblN0YXRlU3RydWN0dXJlEiwKBmFjdGlvbhgCIAEoCzIcLmFnZW50LnYxLkNvbnZlcnNhdGlvbkFjdGlvbhItCg1tb2RlbF9kZXRhaWxzGAMgASgLMhYuYWdlbnQudjEuTW9kZWxEZXRhaWxzEjYKD3JlcXVlc3RlZF9tb2RlbBgJIAEoCzIYLmFnZW50LnYxLlJlcXVlc3RlZE1vZGVsSACIAQESJQoJbWNwX3Rvb2xzGAQgASgLMhIuYWdlbnQudjEuTWNwVG9vbHMSHAoPY29udmVyc2F0aW9uX2lkGAUgASgJSAGIAQESRAoXbWNwX2ZpbGVfc3lzdGVtX29wdGlvbnMYBiABKAsyHi5hZ2VudC52MS5NY3BGaWxlU3lzdGVtT3B0aW9uc0gCiAEBEjIKDXNraWxsX29wdGlvbnMYByABKAsyFi5hZ2VudC52MS5Ta2lsbE9wdGlvbnNIA4gBARIhChRjdXN0b21fc3lzdGVtX3Byb21wdBgIIAEoCUgEiAEBQhIKEF9yZXF1ZXN0ZWRfbW9kZWxCEgoQX2NvbnZlcnNhdGlvbl9pZEIaChhfbWNwX2ZpbGVfc3lzdGVtX29wdGlvbnNCEAoOX3NraWxsX29wdGlvbnNCFwoVX2N1c3RvbV9zeXN0ZW1fcHJvbXB0Ih8KD1RleHREZWx0YVVwZGF0ZRIMCgR0ZXh0GAEgASgJImYKFVRvb2xDYWxsU3RhcnRlZFVwZGF0ZRIPCgdjYWxsX2lkGAEgASgJEiUKCXRvb2xfY2FsbBgCIAEoCzISLmFnZW50LnYxLlRvb2xDYWxsEhUKDW1vZGVsX2NhbGxfaWQYAyABKAkiaAoXVG9vbENhbGxDb21wbGV0ZWRVcGRhdGUSDwoHY2FsbF9pZBgBIAEoCRIlCgl0b29sX2NhbGwYAiABKAsyEi5hZ2VudC52MS5Ub29sQ2FsbBIVCg1tb2RlbF9jYWxsX2lkGAMgASgJIm8KE1Rvb2xDYWxsRGVsdGFVcGRhdGUSDwoHY2FsbF9pZBgBIAEoCRIwCg90b29sX2NhbGxfZGVsdGEYAiABKAsyFy5hZ2VudC52MS5Ub29sQ2FsbERlbHRhEhUKDW1vZGVsX2NhbGxfaWQYAyABKAkifwoVUGFydGlhbFRvb2xDYWxsVXBkYXRlEg8KB2NhbGxfaWQYASABKAkSJQoJdG9vbF9jYWxsGAIgASgLMhIuYWdlbnQudjEuVG9vbENhbGwSFwoPYXJnc190ZXh0X2RlbHRhGAMgASgJEhUKDW1vZGVsX2NhbGxfaWQYBCABKAkiIwoTVGhpbmtpbmdEZWx0YVVwZGF0ZRIMCgR0ZXh0GAEgASgJIjcKF1RoaW5raW5nQ29tcGxldGVkVXBkYXRlEhwKFHRoaW5raW5nX2R1cmF0aW9uX21zGAEgASgFIiIKEFRva2VuRGVsdGFVcGRhdGUSDgoGdG9rZW5zGAEgASgFIiAKDVN1bW1hcnlVcGRhdGUSDwoHc3VtbWFyeRgBIAEoCSIWChRTdW1tYXJ5U3RhcnRlZFVwZGF0ZSIRCg9IZWFydGJlYXRVcGRhdGUiGAoWU3VtbWFyeUNvbXBsZXRlZFVwZGF0ZSLXAQoWU2hlbGxPdXRwdXREZWx0YVVwZGF0ZRItCgZzdGRvdXQYASABKAsyGy5hZ2VudC52MS5TaGVsbFN0cmVhbVN0ZG91dEgAEi0KBnN0ZGVychgCIAEoCzIbLmFnZW50LnYxLlNoZWxsU3RyZWFtU3RkZXJySAASKQoEZXhpdBgDIAEoCzIZLmFnZW50LnYxLlNoZWxsU3RyZWFtRXhpdEgAEisKBXN0YXJ0GAQgASgLMhouYWdlbnQudjEuU2hlbGxTdHJlYW1TdGFydEgAQgcKBWV2ZW50IhEKD1R1cm5FbmRlZFVwZGF0ZSJIChlVc2VyTWVzc2FnZUFwcGVuZGVkVXBkYXRlEisKDHVzZXJfbWVzc2FnZRgBIAEoCzIVLmFnZW50LnYxLlVzZXJNZXNzYWdlIiQKEVN0ZXBTdGFydGVkVXBkYXRlEg8KB3N0ZXBfaWQYASABKAQiQAoTU3RlcENvbXBsZXRlZFVwZGF0ZRIPCgdzdGVwX2lkGAEgASgEEhgKEHN0ZXBfZHVyYXRpb25fbXMYAiABKAMi7wcKEUludGVyYWN0aW9uVXBkYXRlEi8KCnRleHRfZGVsdGEYASABKAsyGS5hZ2VudC52MS5UZXh0RGVsdGFVcGRhdGVIABI8ChFwYXJ0aWFsX3Rvb2xfY2FsbBgHIAEoCzIfLmFnZW50LnYxLlBhcnRpYWxUb29sQ2FsbFVwZGF0ZUgAEjgKD3Rvb2xfY2FsbF9kZWx0YRgPIAEoCzIdLmFnZW50LnYxLlRvb2xDYWxsRGVsdGFVcGRhdGVIABI8ChF0b29sX2NhbGxfc3RhcnRlZBgCIAEoCzIfLmFnZW50LnYxLlRvb2xDYWxsU3RhcnRlZFVwZGF0ZUgAEkAKE3Rvb2xfY2FsbF9jb21wbGV0ZWQYAyABKAsyIS5hZ2VudC52MS5Ub29sQ2FsbENvbXBsZXRlZFVwZGF0ZUgAEjcKDnRoaW5raW5nX2RlbHRhGAQgASgLMh0uYWdlbnQudjEuVGhpbmtpbmdEZWx0YVVwZGF0ZUgAEj8KEnRoaW5raW5nX2NvbXBsZXRlZBgFIAEoCzIhLmFnZW50LnYxLlRoaW5raW5nQ29tcGxldGVkVXBkYXRlSAASRAoVdXNlcl9tZXNzYWdlX2FwcGVuZGVkGAYgASgLMiMuYWdlbnQudjEuVXNlck1lc3NhZ2VBcHBlbmRlZFVwZGF0ZUgAEjEKC3Rva2VuX2RlbHRhGAggASgLMhouYWdlbnQudjEuVG9rZW5EZWx0YVVwZGF0ZUgAEioKB3N1bW1hcnkYCSABKAsyFy5hZ2VudC52MS5TdW1tYXJ5VXBkYXRlSAASOQoPc3VtbWFyeV9zdGFydGVkGAogASgLMh4uYWdlbnQudjEuU3VtbWFyeVN0YXJ0ZWRVcGRhdGVIABI9ChFzdW1tYXJ5X2NvbXBsZXRlZBgLIAEoCzIgLmFnZW50LnYxLlN1bW1hcnlDb21wbGV0ZWRVcGRhdGVIABI+ChJzaGVsbF9vdXRwdXRfZGVsdGEYDCABKAsyIC5hZ2VudC52MS5TaGVsbE91dHB1dERlbHRhVXBkYXRlSAASLgoJaGVhcnRiZWF0GA0gASgLMhkuYWdlbnQudjEuSGVhcnRiZWF0VXBkYXRlSAASLwoKdHVybl9lbmRlZBgOIAEoCzIZLmFnZW50LnYxLlR1cm5FbmRlZFVwZGF0ZUgAEjMKDHN0ZXBfc3RhcnRlZBgQIAEoCzIbLmFnZW50LnYxLlN0ZXBTdGFydGVkVXBkYXRlSAASNwoOc3RlcF9jb21wbGV0ZWQYESABKAsyHS5hZ2VudC52MS5TdGVwQ29tcGxldGVkVXBkYXRlSABCCQoHbWVzc2FnZSKaBAoQSW50ZXJhY3Rpb25RdWVyeRIKCgJpZBgBIAEoDRJDChh3ZWJfc2VhcmNoX3JlcXVlc3RfcXVlcnkYAiABKAsyHy5hZ2VudC52MS5XZWJTZWFyY2hSZXF1ZXN0UXVlcnlIABJPCh5hc2tfcXVlc3Rpb25faW50ZXJhY3Rpb25fcXVlcnkYAyABKAsyJS5hZ2VudC52MS5Bc2tRdWVzdGlvbkludGVyYWN0aW9uUXVlcnlIABJFChlzd2l0Y2hfbW9kZV9yZXF1ZXN0X3F1ZXJ5GAQgASgLMiAuYWdlbnQudjEuU3dpdGNoTW9kZVJlcXVlc3RRdWVyeUgAEkMKGGV4YV9zZWFyY2hfcmVxdWVzdF9xdWVyeRgFIAEoCzIfLmFnZW50LnYxLkV4YVNlYXJjaFJlcXVlc3RRdWVyeUgAEkEKF2V4YV9mZXRjaF9yZXF1ZXN0X3F1ZXJ5GAYgASgLMh4uYWdlbnQudjEuRXhhRmV0Y2hSZXF1ZXN0UXVlcnlIABJFChljcmVhdGVfcGxhbl9yZXF1ZXN0X3F1ZXJ5GAcgASgLMiAuYWdlbnQudjEuQ3JlYXRlUGxhblJlcXVlc3RRdWVyeUgAEkUKGXNldHVwX3ZtX2Vudmlyb25tZW50X2FyZ3MYCCABKAsyIC5hZ2VudC52MS5TZXR1cFZtRW52aXJvbm1lbnRBcmdzSABCBwoFcXVlcnkixgQKE0ludGVyYWN0aW9uUmVzcG9uc2USCgoCaWQYASABKA0SSQobd2ViX3NlYXJjaF9yZXF1ZXN0X3Jlc3BvbnNlGAIgASgLMiIuYWdlbnQudjEuV2ViU2VhcmNoUmVxdWVzdFJlc3BvbnNlSAASVQohYXNrX3F1ZXN0aW9uX2ludGVyYWN0aW9uX3Jlc3BvbnNlGAMgASgLMiguYWdlbnQudjEuQXNrUXVlc3Rpb25JbnRlcmFjdGlvblJlc3BvbnNlSAASSwocc3dpdGNoX21vZGVfcmVxdWVzdF9yZXNwb25zZRgEIAEoCzIjLmFnZW50LnYxLlN3aXRjaE1vZGVSZXF1ZXN0UmVzcG9uc2VIABJJChtleGFfc2VhcmNoX3JlcXVlc3RfcmVzcG9uc2UYBSABKAsyIi5hZ2VudC52MS5FeGFTZWFyY2hSZXF1ZXN0UmVzcG9uc2VIABJHChpleGFfZmV0Y2hfcmVxdWVzdF9yZXNwb25zZRgGIAEoCzIhLmFnZW50LnYxLkV4YUZldGNoUmVxdWVzdFJlc3BvbnNlSAASSwocY3JlYXRlX3BsYW5fcmVxdWVzdF9yZXNwb25zZRgHIAEoCzIjLmFnZW50LnYxLkNyZWF0ZVBsYW5SZXF1ZXN0UmVzcG9uc2VIABJJChtzZXR1cF92bV9lbnZpcm9ubWVudF9yZXN1bHQYCCABKAsyIi5hZ2VudC52MS5TZXR1cFZtRW52aXJvbm1lbnRSZXN1bHRIAEIICgZyZXN1bHQiXAobQXNrUXVlc3Rpb25JbnRlcmFjdGlvblF1ZXJ5EicKBGFyZ3MYASABKAsyGS5hZ2VudC52MS5Bc2tRdWVzdGlvbkFyZ3MSFAoMdG9vbF9jYWxsX2lkGAIgASgJIk0KHkFza1F1ZXN0aW9uSW50ZXJhY3Rpb25SZXNwb25zZRIrCgZyZXN1bHQYASABKAsyGy5hZ2VudC52MS5Bc2tRdWVzdGlvblJlc3VsdCIRCg9DbGllbnRIZWFydGJlYXQixgQKDlByZXdhcm1SZXF1ZXN0Ei0KDW1vZGVsX2RldGFpbHMYASABKAsyFi5hZ2VudC52MS5Nb2RlbERldGFpbHMSNgoPcmVxdWVzdGVkX21vZGVsGAkgASgLMhguYWdlbnQudjEuUmVxdWVzdGVkTW9kZWxIAIgBARIcCg9jb252ZXJzYXRpb25faWQYAiABKAlIAYgBARJAChJjb252ZXJzYXRpb25fc3RhdGUYAyABKAsyJC5hZ2VudC52MS5Db252ZXJzYXRpb25TdGF0ZVN0cnVjdHVyZRIlCgltY3BfdG9vbHMYBCABKAsyEi5hZ2VudC52MS5NY3BUb29scxJEChdtY3BfZmlsZV9zeXN0ZW1fb3B0aW9ucxgFIAEoCzIeLmFnZW50LnYxLk1jcEZpbGVTeXN0ZW1PcHRpb25zSAKIAQESHwoSYmVzdF9vZl9uX2dyb3VwX2lkGAYgASgJSAOIAQESKAobdHJ5X3VzZV9iZXN0X29mX25fcHJvbW90aW9uGAcgASgISASIAQESIQoUY3VzdG9tX3N5c3RlbV9wcm9tcHQYCCABKAlIBYgBAUISChBfcmVxdWVzdGVkX21vZGVsQhIKEF9jb252ZXJzYXRpb25faWRCGgoYX21jcF9maWxlX3N5c3RlbV9vcHRpb25zQhUKE19iZXN0X29mX25fZ3JvdXBfaWRCHgocX3RyeV91c2VfYmVzdF9vZl9uX3Byb21vdGlvbkIXChVfY3VzdG9tX3N5c3RlbV9wcm9tcHQiHQoPRXhlY1NlcnZlckFib3J0EgoKAmlkGAEgASgNIlEKGEV4ZWNTZXJ2ZXJDb250cm9sTWVzc2FnZRIqCgVhYm9ydBgBIAEoCzIZLmFnZW50LnYxLkV4ZWNTZXJ2ZXJBYm9ydEgAQgkKB21lc3NhZ2Ui+AMKEkFnZW50Q2xpZW50TWVzc2FnZRIwCgtydW5fcmVxdWVzdBgBIAEoCzIZLmFnZW50LnYxLkFnZW50UnVuUmVxdWVzdEgAEjoKE2V4ZWNfY2xpZW50X21lc3NhZ2UYAiABKAsyGy5hZ2VudC52MS5FeGVjQ2xpZW50TWVzc2FnZUgAEkkKG2V4ZWNfY2xpZW50X2NvbnRyb2xfbWVzc2FnZRgFIAEoCzIiLmFnZW50LnYxLkV4ZWNDbGllbnRDb250cm9sTWVzc2FnZUgAEjYKEWt2X2NsaWVudF9tZXNzYWdlGAMgASgLMhkuYWdlbnQudjEuS3ZDbGllbnRNZXNzYWdlSAASOwoTY29udmVyc2F0aW9uX2FjdGlvbhgEIAEoCzIcLmFnZW50LnYxLkNvbnZlcnNhdGlvbkFjdGlvbkgAEj0KFGludGVyYWN0aW9uX3Jlc3BvbnNlGAYgASgLMh0uYWdlbnQudjEuSW50ZXJhY3Rpb25SZXNwb25zZUgAEjUKEGNsaWVudF9oZWFydGJlYXQYByABKAsyGS5hZ2VudC52MS5DbGllbnRIZWFydGJlYXRIABIzCg9wcmV3YXJtX3JlcXVlc3QYCCABKAsyGC5hZ2VudC52MS5QcmV3YXJtUmVxdWVzdEgAQgkKB21lc3NhZ2UiogMKEkFnZW50U2VydmVyTWVzc2FnZRI5ChJpbnRlcmFjdGlvbl91cGRhdGUYASABKAsyGy5hZ2VudC52MS5JbnRlcmFjdGlvblVwZGF0ZUgAEjoKE2V4ZWNfc2VydmVyX21lc3NhZ2UYAiABKAsyGy5hZ2VudC52MS5FeGVjU2VydmVyTWVzc2FnZUgAEkkKG2V4ZWNfc2VydmVyX2NvbnRyb2xfbWVzc2FnZRgFIAEoCzIiLmFnZW50LnYxLkV4ZWNTZXJ2ZXJDb250cm9sTWVzc2FnZUgAEk4KHmNvbnZlcnNhdGlvbl9jaGVja3BvaW50X3VwZGF0ZRgDIAEoCzIkLmFnZW50LnYxLkNvbnZlcnNhdGlvblN0YXRlU3RydWN0dXJlSAASNgoRa3Zfc2VydmVyX21lc3NhZ2UYBCABKAsyGS5hZ2VudC52MS5LdlNlcnZlck1lc3NhZ2VIABI3ChFpbnRlcmFjdGlvbl9xdWVyeRgHIAEoCzIaLmFnZW50LnYxLkludGVyYWN0aW9uUXVlcnlIAEIJCgdtZXNzYWdlIigKEE5hbWVBZ2VudFJlcXVlc3QSFAoMdXNlcl9tZXNzYWdlGAEgASgJIiEKEU5hbWVBZ2VudFJlc3BvbnNlEgwKBG5hbWUYASABKAkiMgoWR2V0VXNhYmxlTW9kZWxzUmVxdWVzdBIYChBjdXN0b21fbW9kZWxfaWRzGAEgAygJIkEKF0dldFVzYWJsZU1vZGVsc1Jlc3BvbnNlEiYKBm1vZGVscxgBIAMoCzIWLmFnZW50LnYxLk1vZGVsRGV0YWlscyIeChxHZXREZWZhdWx0TW9kZWxGb3JDbGlSZXF1ZXN0IkYKHUdldERlZmF1bHRNb2RlbEZvckNsaVJlc3BvbnNlEiUKBW1vZGVsGAEgASgLMhYuYWdlbnQudjEuTW9kZWxEZXRhaWxzIh8KHUdldEFsbG93ZWRNb2RlbEludGVudHNSZXF1ZXN0IjcKHkdldEFsbG93ZWRNb2RlbEludGVudHNSZXNwb25zZRIVCg1tb2RlbF9pbnRlbnRzGAEgAygJIpcCChNJZGVFZGl0b3JzU3RhdGVGaWxlEhUKDXJlbGF0aXZlX3BhdGgYASABKAkSFQoNYWJzb2x1dGVfcGF0aBgCIAEoCRIhChRpc19jdXJyZW50bHlfZm9jdXNlZBgDIAEoCEgAiAEBEiAKE2N1cnJlbnRfbGluZV9udW1iZXIYBCABKAVIAYgBARIeChFjdXJyZW50X2xpbmVfdGV4dBgFIAEoCUgCiAEBEhcKCmxpbmVfY291bnQYBiABKAVIA4gBAUIXChVfaXNfY3VycmVudGx5X2ZvY3VzZWRCFgoUX2N1cnJlbnRfbGluZV9udW1iZXJCFAoSX2N1cnJlbnRfbGluZV90ZXh0Qg0KC19saW5lX2NvdW50IlMKE0lkZUVkaXRvcnNTdGF0ZUxpdGUSPAoVcmVjZW50bHlfdmlld2VkX2ZpbGVzGAEgAygLMh0uYWdlbnQudjEuSWRlRWRpdG9yc1N0YXRlRmlsZSJ0ChZBcHBseUFnZW50RGlmZlRvb2xDYWxsEioKBGFyZ3MYASABKAsyHC5hZ2VudC52MS5BcHBseUFnZW50RGlmZkFyZ3MSLgoGcmVzdWx0GAIgASgLMh4uYWdlbnQudjEuQXBwbHlBZ2VudERpZmZSZXN1bHQiJgoSQXBwbHlBZ2VudERpZmZBcmdzEhAKCGFnZW50X2lkGAEgASgJIoQBChRBcHBseUFnZW50RGlmZlJlc3VsdBIyCgdzdWNjZXNzGAEgASgLMh8uYWdlbnQudjEuQXBwbHlBZ2VudERpZmZTdWNjZXNzSAASLgoFZXJyb3IYAiABKAsyHS5hZ2VudC52MS5BcHBseUFnZW50RGlmZkVycm9ySABCCAoGcmVzdWx0Ik4KFUFwcGx5QWdlbnREaWZmU3VjY2VzcxI1Cg9hcHBsaWVkX2NoYW5nZXMYASADKAsyHC5hZ2VudC52MS5BcHBsaWVkQWdlbnRDaGFuZ2Ui6QEKEkFwcGxpZWRBZ2VudENoYW5nZRIMCgRwYXRoGAEgASgJEhMKC2NoYW5nZV90eXBlGAIgASgFEhsKDmJlZm9yZV9jb250ZW50GAMgASgJSACIAQESGgoNYWZ0ZXJfY29udGVudBgEIAEoCUgBiAEBEhIKBWVycm9yGAUgASgJSAKIAQESHgoRbWVzc2FnZV9mb3JfbW9kZWwYBiABKAlIA4gBAUIRCg9fYmVmb3JlX2NvbnRlbnRCEAoOX2FmdGVyX2NvbnRlbnRCCAoGX2Vycm9yQhQKEl9tZXNzYWdlX2Zvcl9tb2RlbCJbChNBcHBseUFnZW50RGlmZkVycm9yEg0KBWVycm9yGAEgASgJEjUKD2FwcGxpZWRfY2hhbmdlcxgCIAMoCzIcLmFnZW50LnYxLkFwcGxpZWRBZ2VudENoYW5nZSJrChNBc2tRdWVzdGlvblRvb2xDYWxsEicKBGFyZ3MYASABKAsyGS5hZ2VudC52MS5Bc2tRdWVzdGlvbkFyZ3MSKwoGcmVzdWx0GAIgASgLMhsuYWdlbnQudjEuQXNrUXVlc3Rpb25SZXN1bHQijwEKD0Fza1F1ZXN0aW9uQXJncxINCgV0aXRsZRgBIAEoCRI1CglxdWVzdGlvbnMYAiADKAsyIi5hZ2VudC52MS5Bc2tRdWVzdGlvbkFyZ3NfUXVlc3Rpb24SEQoJcnVuX2FzeW5jGAUgASgIEiMKG2FzeW5jX29yaWdpbmFsX3Rvb2xfY2FsbF9pZBgGIAEoCSKBAQoYQXNrUXVlc3Rpb25BcmdzX1F1ZXN0aW9uEgoKAmlkGAEgASgJEg4KBnByb21wdBgCIAEoCRIxCgdvcHRpb25zGAMgAygLMiAuYWdlbnQudjEuQXNrUXVlc3Rpb25BcmdzX09wdGlvbhIWCg5hbGxvd19tdWx0aXBsZRgEIAEoCCIzChZBc2tRdWVzdGlvbkFyZ3NfT3B0aW9uEgoKAmlkGAEgASgJEg0KBWxhYmVsGAIgASgJIhIKEEFza1F1ZXN0aW9uQXN5bmMi2wEKEUFza1F1ZXN0aW9uUmVzdWx0Ei8KB3N1Y2Nlc3MYASABKAsyHC5hZ2VudC52MS5Bc2tRdWVzdGlvblN1Y2Nlc3NIABIrCgVlcnJvchgCIAEoCzIaLmFnZW50LnYxLkFza1F1ZXN0aW9uRXJyb3JIABIxCghyZWplY3RlZBgDIAEoCzIdLmFnZW50LnYxLkFza1F1ZXN0aW9uUmVqZWN0ZWRIABIrCgVhc3luYxgEIAEoCzIaLmFnZW50LnYxLkFza1F1ZXN0aW9uQXN5bmNIAEIICgZyZXN1bHQiSgoSQXNrUXVlc3Rpb25TdWNjZXNzEjQKB2Fuc3dlcnMYASADKAsyIy5hZ2VudC52MS5Bc2tRdWVzdGlvblN1Y2Nlc3NfQW5zd2VyIk0KGUFza1F1ZXN0aW9uU3VjY2Vzc19BbnN3ZXISEwoLcXVlc3Rpb25faWQYASABKAkSGwoTc2VsZWN0ZWRfb3B0aW9uX2lkcxgCIAMoCSIpChBBc2tRdWVzdGlvbkVycm9yEhUKDWVycm9yX21lc3NhZ2UYASABKAkiJQoTQXNrUXVlc3Rpb25SZWplY3RlZBIOCgZyZWFzb24YASABKAkiiQIKGEJhY2tncm91bmRTaGVsbFNwYXduQXJncxIPCgdjb21tYW5kGAEgASgJEhkKEXdvcmtpbmdfZGlyZWN0b3J5GAIgASgJEhQKDHRvb2xfY2FsbF9pZBgDIAEoCRI7Cg5wYXJzaW5nX3Jlc3VsdBgEIAEoCzIjLmFnZW50LnYxLlNoZWxsQ29tbWFuZFBhcnNpbmdSZXN1bHQSNAoOc2FuZGJveF9wb2xpY3kYBSABKAsyFy5hZ2VudC52MS5TYW5kYm94UG9saWN5SACIAQESJQodZW5hYmxlX3dyaXRlX3NoZWxsX3N0ZGluX3Rvb2wYBiABKAhCEQoPX3NhbmRib3hfcG9saWN5IoECChpCYWNrZ3JvdW5kU2hlbGxTcGF3blJlc3VsdBI4CgdzdWNjZXNzGAEgASgLMiUuYWdlbnQudjEuQmFja2dyb3VuZFNoZWxsU3Bhd25TdWNjZXNzSAASNAoFZXJyb3IYAiABKAsyIy5hZ2VudC52MS5CYWNrZ3JvdW5kU2hlbGxTcGF3bkVycm9ySAASKwoIcmVqZWN0ZWQYAyABKAsyFy5hZ2VudC52MS5TaGVsbFJlamVjdGVkSAASPAoRcGVybWlzc2lvbl9kZW5pZWQYBCABKAsyHy5hZ2VudC52MS5TaGVsbFBlcm1pc3Npb25EZW5pZWRIAEIICgZyZXN1bHQidQobQmFja2dyb3VuZFNoZWxsU3Bhd25TdWNjZXNzEhAKCHNoZWxsX2lkGAEgASgNEg8KB2NvbW1hbmQYAiABKAkSGQoRd29ya2luZ19kaXJlY3RvcnkYAyABKAkSEAoDcGlkGAQgASgNSACIAQFCBgoEX3BpZCJWChlCYWNrZ3JvdW5kU2hlbGxTcGF3bkVycm9yEg8KB2NvbW1hbmQYASABKAkSGQoRd29ya2luZ19kaXJlY3RvcnkYAiABKAkSDQoFZXJyb3IYAyABKAkiNgoTV3JpdGVTaGVsbFN0ZGluQXJncxIQCghzaGVsbF9pZBgBIAEoDRINCgVjaGFycxgCIAEoCSKHAQoVV3JpdGVTaGVsbFN0ZGluUmVzdWx0EjMKB3N1Y2Nlc3MYASABKAsyIC5hZ2VudC52MS5Xcml0ZVNoZWxsU3RkaW5TdWNjZXNzSAASLwoFZXJyb3IYAiABKAsyHi5hZ2VudC52MS5Xcml0ZVNoZWxsU3RkaW5FcnJvckgAQggKBnJlc3VsdCJdChZXcml0ZVNoZWxsU3RkaW5TdWNjZXNzEhAKCHNoZWxsX2lkGAEgASgNEjEKKXRlcm1pbmFsX2ZpbGVfbGVuZ3RoX2JlZm9yZV9pbnB1dF93cml0dGVuGAIgASgNIiUKFFdyaXRlU2hlbGxTdGRpbkVycm9yEg0KBWVycm9yGAEgASgJIiIKCkNvb3JkaW5hdGUSCQoBeBgBIAEoBRIJCgF5GAIgASgFIlUKD0NvbXB1dGVyVXNlQXJncxIUCgx0b29sX2NhbGxfaWQYASABKAkSLAoHYWN0aW9ucxgCIAMoCzIbLmFnZW50LnYxLkNvbXB1dGVyVXNlQWN0aW9uIoEEChFDb21wdXRlclVzZUFjdGlvbhIvCgptb3VzZV9tb3ZlGAEgASgLMhkuYWdlbnQudjEuTW91c2VNb3ZlQWN0aW9uSAASJgoFY2xpY2sYAiABKAsyFS5hZ2VudC52MS5DbGlja0FjdGlvbkgAEi8KCm1vdXNlX2Rvd24YAyABKAsyGS5hZ2VudC52MS5Nb3VzZURvd25BY3Rpb25IABIrCghtb3VzZV91cBgEIAEoCzIXLmFnZW50LnYxLk1vdXNlVXBBY3Rpb25IABIkCgRkcmFnGAUgASgLMhQuYWdlbnQudjEuRHJhZ0FjdGlvbkgAEigKBnNjcm9sbBgGIAEoCzIWLmFnZW50LnYxLlNjcm9sbEFjdGlvbkgAEiQKBHR5cGUYByABKAsyFC5hZ2VudC52MS5UeXBlQWN0aW9uSAASIgoDa2V5GAggASgLMhMuYWdlbnQudjEuS2V5QWN0aW9uSAASJAoEd2FpdBgJIAEoCzIULmFnZW50LnYxLldhaXRBY3Rpb25IABIwCgpzY3JlZW5zaG90GAogASgLMhouYWdlbnQudjEuU2NyZWVuc2hvdEFjdGlvbkgAEjkKD2N1cnNvcl9wb3NpdGlvbhgLIAEoCzIeLmFnZW50LnYxLkN1cnNvclBvc2l0aW9uQWN0aW9uSABCCAoGYWN0aW9uIjsKD01vdXNlTW92ZUFjdGlvbhIoCgpjb29yZGluYXRlGAEgASgLMhQuYWdlbnQudjEuQ29vcmRpbmF0ZSKYAQoLQ2xpY2tBY3Rpb24SLQoKY29vcmRpbmF0ZRgBIAEoCzIULmFnZW50LnYxLkNvb3JkaW5hdGVIAIgBARIOCgZidXR0b24YAiABKAUSDQoFY291bnQYAyABKAUSGgoNbW9kaWZpZXJfa2V5cxgEIAEoCUgBiAEBQg0KC19jb29yZGluYXRlQhAKDl9tb2RpZmllcl9rZXlzIiEKD01vdXNlRG93bkFjdGlvbhIOCgZidXR0b24YASABKAUiHwoNTW91c2VVcEFjdGlvbhIOCgZidXR0b24YASABKAUiQAoKRHJhZ0FjdGlvbhIiCgRwYXRoGAEgAygLMhQuYWdlbnQudjEuQ29vcmRpbmF0ZRIOCgZidXR0b24YAiABKAUinQEKDFNjcm9sbEFjdGlvbhItCgpjb29yZGluYXRlGAEgASgLMhQuYWdlbnQudjEuQ29vcmRpbmF0ZUgAiAEBEhEKCWRpcmVjdGlvbhgCIAEoBRIOCgZhbW91bnQYAyABKAUSGgoNbW9kaWZpZXJfa2V5cxgEIAEoCUgBiAEBQg0KC19jb29yZGluYXRlQhAKDl9tb2RpZmllcl9rZXlzIhoKClR5cGVBY3Rpb24SDAoEdGV4dBgBIAEoCSJMCglLZXlBY3Rpb24SCwoDa2V5GAEgASgJEh0KEGhvbGRfZHVyYXRpb25fbXMYAiABKAVIAIgBAUITChFfaG9sZF9kdXJhdGlvbl9tcyIhCgpXYWl0QWN0aW9uEhMKC2R1cmF0aW9uX21zGAEgASgFIhIKEFNjcmVlbnNob3RBY3Rpb24iFgoUQ3Vyc29yUG9zaXRpb25BY3Rpb24iewoRQ29tcHV0ZXJVc2VSZXN1bHQSLwoHc3VjY2VzcxgBIAEoCzIcLmFnZW50LnYxLkNvbXB1dGVyVXNlU3VjY2Vzc0gAEisKBWVycm9yGAIgASgLMhouYWdlbnQudjEuQ29tcHV0ZXJVc2VFcnJvckgAQggKBnJlc3VsdCL7AQoSQ29tcHV0ZXJVc2VTdWNjZXNzEhQKDGFjdGlvbl9jb3VudBgBIAEoBRITCgtkdXJhdGlvbl9tcxgCIAEoBRIXCgpzY3JlZW5zaG90GAMgASgJSACIAQESEAoDbG9nGAQgASgJSAGIAQESHAoPc2NyZWVuc2hvdF9wYXRoGAUgASgJSAKIAQESMgoPY3Vyc29yX3Bvc2l0aW9uGAYgASgLMhQuYWdlbnQudjEuQ29vcmRpbmF0ZUgDiAEBQg0KC19zY3JlZW5zaG90QgYKBF9sb2dCEgoQX3NjcmVlbnNob3RfcGF0aEISChBfY3Vyc29yX3Bvc2l0aW9uIsABChBDb21wdXRlclVzZUVycm9yEg0KBWVycm9yGAEgASgJEhQKDGFjdGlvbl9jb3VudBgCIAEoBRITCgtkdXJhdGlvbl9tcxgDIAEoBRIQCgNsb2cYBCABKAlIAIgBARIXCgpzY3JlZW5zaG90GAUgASgJSAGIAQESHAoPc2NyZWVuc2hvdF9wYXRoGAYgASgJSAKIAQFCBgoEX2xvZ0INCgtfc2NyZWVuc2hvdEISChBfc2NyZWVuc2hvdF9wYXRoImsKE0NvbXB1dGVyVXNlVG9vbENhbGwSJwoEYXJncxgBIAEoCzIZLmFnZW50LnYxLkNvbXB1dGVyVXNlQXJncxIrCgZyZXN1bHQYAiABKAsyGy5hZ2VudC52MS5Db21wdXRlclVzZVJlc3VsdCJoChJDcmVhdGVQbGFuVG9vbENhbGwSJgoEYXJncxgBIAEoCzIYLmFnZW50LnYxLkNyZWF0ZVBsYW5BcmdzEioKBnJlc3VsdBgCIAEoCzIaLmFnZW50LnYxLkNyZWF0ZVBsYW5SZXN1bHQiOAoFUGhhc2USDAoEbmFtZRgBIAEoCRIhCgV0b2RvcxgCIAMoCzISLmFnZW50LnYxLlRvZG9JdGVtIpYBCg5DcmVhdGVQbGFuQXJncxIMCgRwbGFuGAEgASgJEiEKBXRvZG9zGAIgAygLMhIuYWdlbnQudjEuVG9kb0l0ZW0SEAoIb3ZlcnZpZXcYAyABKAkSDAoEbmFtZRgEIAEoCRISCgppc19wcm9qZWN0GAUgASgIEh8KBnBoYXNlcxgGIAMoCzIPLmFnZW50LnYxLlBoYXNlIooBChBDcmVhdGVQbGFuUmVzdWx0EhAKCHBsYW5fdXJpGAMgASgJEi4KB3N1Y2Nlc3MYASABKAsyGy5hZ2VudC52MS5DcmVhdGVQbGFuU3VjY2Vzc0gAEioKBWVycm9yGAIgASgLMhkuYWdlbnQudjEuQ3JlYXRlUGxhbkVycm9ySABCCAoGcmVzdWx0IhMKEUNyZWF0ZVBsYW5TdWNjZXNzIiAKD0NyZWF0ZVBsYW5FcnJvchINCgVlcnJvchgBIAEoCSJWChZDcmVhdGVQbGFuUmVxdWVzdFF1ZXJ5EiYKBGFyZ3MYASABKAsyGC5hZ2VudC52MS5DcmVhdGVQbGFuQXJncxIUCgx0b29sX2NhbGxfaWQYAiABKAkiRwoZQ3JlYXRlUGxhblJlcXVlc3RSZXNwb25zZRIqCgZyZXN1bHQYASABKAsyGi5hZ2VudC52MS5DcmVhdGVQbGFuUmVzdWx0IhYKFEN1cnNvclJ1bGVUeXBlR2xvYmFsIigKF0N1cnNvclJ1bGVUeXBlRmlsZUdsb2JzEg0KBWdsb2JzGAEgAygJIjEKGkN1cnNvclJ1bGVUeXBlQWdlbnRGZXRjaGVkEhMKC2Rlc2NyaXB0aW9uGAEgASgJIiAKHkN1cnNvclJ1bGVUeXBlTWFudWFsbHlBdHRhY2hlZCKLAgoOQ3Vyc29yUnVsZVR5cGUSMAoGZ2xvYmFsGAEgASgLMh4uYWdlbnQudjEuQ3Vyc29yUnVsZVR5cGVHbG9iYWxIABI5CgxmaWxlX2dsb2JiZWQYAiABKAsyIS5hZ2VudC52MS5DdXJzb3JSdWxlVHlwZUZpbGVHbG9ic0gAEj0KDWFnZW50X2ZldGNoZWQYAyABKAsyJC5hZ2VudC52MS5DdXJzb3JSdWxlVHlwZUFnZW50RmV0Y2hlZEgAEkUKEW1hbnVhbGx5X2F0dGFjaGVkGAQgASgLMiguYWdlbnQudjEuQ3Vyc29yUnVsZVR5cGVNYW51YWxseUF0dGFjaGVkSABCBgoEdHlwZSLIAQoKQ3Vyc29yUnVsZRIRCglmdWxsX3BhdGgYASABKAkSDwoHY29udGVudBgCIAEoCRImCgR0eXBlGAMgASgLMhguYWdlbnQudjEuQ3Vyc29yUnVsZVR5cGUSDgoGc291cmNlGAQgASgFEh4KEWdpdF9yZW1vdGVfb3JpZ2luGAUgASgJSACIAQESGAoLcGFyc2VfZXJyb3IYBiABKAlIAYgBAUIUChJfZ2l0X3JlbW90ZV9vcmlnaW5CDgoMX3BhcnNlX2Vycm9yIjAKCkRlbGV0ZUFyZ3MSDAoEcGF0aBgBIAEoCRIUCgx0b29sX2NhbGxfaWQYAiABKAki7QIKDERlbGV0ZVJlc3VsdBIqCgdzdWNjZXNzGAEgASgLMhcuYWdlbnQudjEuRGVsZXRlU3VjY2Vzc0gAEjYKDmZpbGVfbm90X2ZvdW5kGAIgASgLMhwuYWdlbnQudjEuRGVsZXRlRmlsZU5vdEZvdW5kSAASKwoIbm90X2ZpbGUYAyABKAsyFy5hZ2VudC52MS5EZWxldGVOb3RGaWxlSAASPQoRcGVybWlzc2lvbl9kZW5pZWQYBCABKAsyIC5hZ2VudC52MS5EZWxldGVQZXJtaXNzaW9uRGVuaWVkSAASLQoJZmlsZV9idXN5GAUgASgLMhguYWdlbnQudjEuRGVsZXRlRmlsZUJ1c3lIABIsCghyZWplY3RlZBgGIAEoCzIYLmFnZW50LnYxLkRlbGV0ZVJlamVjdGVkSAASJgoFZXJyb3IYByABKAsyFS5hZ2VudC52MS5EZWxldGVFcnJvckgAQggKBnJlc3VsdCJcCg1EZWxldGVTdWNjZXNzEgwKBHBhdGgYASABKAkSFAoMZGVsZXRlZF9maWxlGAIgASgJEhEKCWZpbGVfc2l6ZRgDIAEoAxIUCgxwcmV2X2NvbnRlbnQYBCABKAkiIgoSRGVsZXRlRmlsZU5vdEZvdW5kEgwKBHBhdGgYASABKAkiMgoNRGVsZXRlTm90RmlsZRIMCgRwYXRoGAEgASgJEhMKC2FjdHVhbF90eXBlGAIgASgJIlkKFkRlbGV0ZVBlcm1pc3Npb25EZW5pZWQSDAoEcGF0aBgBIAEoCRIcChRjbGllbnRfdmlzaWJsZV9lcnJvchgCIAEoCRITCgtpc19yZWFkb25seRgDIAEoCCIeCg5EZWxldGVGaWxlQnVzeRIMCgRwYXRoGAEgASgJIi4KDkRlbGV0ZVJlamVjdGVkEgwKBHBhdGgYASABKAkSDgoGcmVhc29uGAIgASgJIioKC0RlbGV0ZUVycm9yEgwKBHBhdGgYASABKAkSDQoFZXJyb3IYAiABKAkiXAoORGVsZXRlVG9vbENhbGwSIgoEYXJncxgBIAEoCzIULmFnZW50LnYxLkRlbGV0ZUFyZ3MSJgoGcmVzdWx0GAIgASgLMhYuYWdlbnQudjEuRGVsZXRlUmVzdWx0IjUKD0RpYWdub3N0aWNzQXJncxIMCgRwYXRoGAEgASgJEhQKDHRvb2xfY2FsbF9pZBgCIAEoCSKvAgoRRGlhZ25vc3RpY3NSZXN1bHQSLwoHc3VjY2VzcxgBIAEoCzIcLmFnZW50LnYxLkRpYWdub3N0aWNzU3VjY2Vzc0gAEisKBWVycm9yGAIgASgLMhouYWdlbnQudjEuRGlhZ25vc3RpY3NFcnJvckgAEjEKCHJlamVjdGVkGAMgASgLMh0uYWdlbnQudjEuRGlhZ25vc3RpY3NSZWplY3RlZEgAEjsKDmZpbGVfbm90X2ZvdW5kGAQgASgLMiEuYWdlbnQudjEuRGlhZ25vc3RpY3NGaWxlTm90Rm91bmRIABJCChFwZXJtaXNzaW9uX2RlbmllZBgFIAEoCzIlLmFnZW50LnYxLkRpYWdub3N0aWNzUGVybWlzc2lvbkRlbmllZEgAQggKBnJlc3VsdCJoChJEaWFnbm9zdGljc1N1Y2Nlc3MSDAoEcGF0aBgBIAEoCRIpCgtkaWFnbm9zdGljcxgCIAMoCzIULmFnZW50LnYxLkRpYWdub3N0aWMSGQoRdG90YWxfZGlhZ25vc3RpY3MYAyABKAUifwoKRGlhZ25vc3RpYxIQCghzZXZlcml0eRgBIAEoBRIeCgVyYW5nZRgCIAEoCzIPLmFnZW50LnYxLlJhbmdlEg8KB21lc3NhZ2UYAyABKAkSDgoGc291cmNlGAQgASgJEgwKBGNvZGUYBSABKAkSEAoIaXNfc3RhbGUYBiABKAgiLwoQRGlhZ25vc3RpY3NFcnJvchIMCgRwYXRoGAEgASgJEg0KBWVycm9yGAIgASgJIjMKE0RpYWdub3N0aWNzUmVqZWN0ZWQSDAoEcGF0aBgBIAEoCRIOCgZyZWFzb24YAiABKAkiJwoXRGlhZ25vc3RpY3NGaWxlTm90Rm91bmQSDAoEcGF0aBgBIAEoCSIrChtEaWFnbm9zdGljc1Blcm1pc3Npb25EZW5pZWQSDAoEcGF0aBgBIAEoCSJICghFZGl0QXJncxIMCgRwYXRoGAEgASgJEhsKDnN0cmVhbV9jb250ZW50GAYgASgJSACIAQFCEQoPX3N0cmVhbV9jb250ZW50ItYCCgpFZGl0UmVzdWx0EigKB3N1Y2Nlc3MYASABKAsyFS5hZ2VudC52MS5FZGl0U3VjY2Vzc0gAEjQKDmZpbGVfbm90X2ZvdW5kGAIgASgLMhouYWdlbnQudjEuRWRpdEZpbGVOb3RGb3VuZEgAEkQKFnJlYWRfcGVybWlzc2lvbl9kZW5pZWQYAyABKAsyIi5hZ2VudC52MS5FZGl0UmVhZFBlcm1pc3Npb25EZW5pZWRIABJGChd3cml0ZV9wZXJtaXNzaW9uX2RlbmllZBgEIAEoCzIjLmFnZW50LnYxLkVkaXRXcml0ZVBlcm1pc3Npb25EZW5pZWRIABIqCghyZWplY3RlZBgGIAEoCzIWLmFnZW50LnYxLkVkaXRSZWplY3RlZEgAEiQKBWVycm9yGAcgASgLMhMuYWdlbnQudjEuRWRpdEVycm9ySABCCAoGcmVzdWx0IqQCCgtFZGl0U3VjY2VzcxIMCgRwYXRoGAEgASgJEhgKC2xpbmVzX2FkZGVkGAMgASgFSACIAQESGgoNbGluZXNfcmVtb3ZlZBgEIAEoBUgBiAEBEhgKC2RpZmZfc3RyaW5nGAUgASgJSAKIAQESJQoYYmVmb3JlX2Z1bGxfZmlsZV9jb250ZW50GAYgASgJSAOIAQESHwoXYWZ0ZXJfZnVsbF9maWxlX2NvbnRlbnQYByABKAkSFAoHbWVzc2FnZRgIIAEoCUgEiAEBQg4KDF9saW5lc19hZGRlZEIQCg5fbGluZXNfcmVtb3ZlZEIOCgxfZGlmZl9zdHJpbmdCGwoZX2JlZm9yZV9mdWxsX2ZpbGVfY29udGVudEIKCghfbWVzc2FnZSIgChBFZGl0RmlsZU5vdEZvdW5kEgwKBHBhdGgYASABKAkiKAoYRWRpdFJlYWRQZXJtaXNzaW9uRGVuaWVkEgwKBHBhdGgYASABKAkiTQoZRWRpdFdyaXRlUGVybWlzc2lvbkRlbmllZBIMCgRwYXRoGAEgASgJEg0KBWVycm9yGAIgASgJEhMKC2lzX3JlYWRvbmx5GAMgASgIIiwKDEVkaXRSZWplY3RlZBIMCgRwYXRoGAEgASgJEg4KBnJlYXNvbhgCIAEoCSJiCglFZGl0RXJyb3ISDAoEcGF0aBgBIAEoCRINCgVlcnJvchgCIAEoCRIgChNtb2RlbF92aXNpYmxlX2Vycm9yGAUgASgJSACIAQFCFgoUX21vZGVsX3Zpc2libGVfZXJyb3IiVgoMRWRpdFRvb2xDYWxsEiAKBGFyZ3MYASABKAsyEi5hZ2VudC52MS5FZGl0QXJncxIkCgZyZXN1bHQYAiABKAsyFC5hZ2VudC52MS5FZGl0UmVzdWx0IjEKEUVkaXRUb29sQ2FsbERlbHRhEhwKFHN0cmVhbV9jb250ZW50X2RlbHRhGAEgASgJIjEKDEV4YUZldGNoQXJncxILCgNpZHMYASADKAkSFAoMdG9vbF9jYWxsX2lkGAIgASgJIqIBCg5FeGFGZXRjaFJlc3VsdBIsCgdzdWNjZXNzGAEgASgLMhkuYWdlbnQudjEuRXhhRmV0Y2hTdWNjZXNzSAASKAoFZXJyb3IYAiABKAsyFy5hZ2VudC52MS5FeGFGZXRjaEVycm9ySAASLgoIcmVqZWN0ZWQYAyABKAsyGi5hZ2VudC52MS5FeGFGZXRjaFJlamVjdGVkSABCCAoGcmVzdWx0Ij4KD0V4YUZldGNoU3VjY2VzcxIrCghjb250ZW50cxgBIAMoCzIZLmFnZW50LnYxLkV4YUZldGNoQ29udGVudCIeCg1FeGFGZXRjaEVycm9yEg0KBWVycm9yGAEgASgJIiIKEEV4YUZldGNoUmVqZWN0ZWQSDgoGcmVhc29uGAEgASgJIlMKD0V4YUZldGNoQ29udGVudBINCgV0aXRsZRgBIAEoCRILCgN1cmwYAiABKAkSDAoEdGV4dBgDIAEoCRIWCg5wdWJsaXNoZWRfZGF0ZRgEIAEoCSJiChBFeGFGZXRjaFRvb2xDYWxsEiQKBGFyZ3MYASABKAsyFi5hZ2VudC52MS5FeGFGZXRjaEFyZ3MSKAoGcmVzdWx0GAIgASgLMhguYWdlbnQudjEuRXhhRmV0Y2hSZXN1bHQiPAoURXhhRmV0Y2hSZXF1ZXN0UXVlcnkSJAoEYXJncxgBIAEoCzIWLmFnZW50LnYxLkV4YUZldGNoQXJncyKjAQoXRXhhRmV0Y2hSZXF1ZXN0UmVzcG9uc2USPgoIYXBwcm92ZWQYASABKAsyKi5hZ2VudC52MS5FeGFGZXRjaFJlcXVlc3RSZXNwb25zZV9BcHByb3ZlZEgAEj4KCHJlamVjdGVkGAIgASgLMiouYWdlbnQudjEuRXhhRmV0Y2hSZXF1ZXN0UmVzcG9uc2VfUmVqZWN0ZWRIAEIICgZyZXN1bHQiIgogRXhhRmV0Y2hSZXF1ZXN0UmVzcG9uc2VfQXBwcm92ZWQiMgogRXhhRmV0Y2hSZXF1ZXN0UmVzcG9uc2VfUmVqZWN0ZWQSDgoGcmVhc29uGAEgASgJIlcKDUV4YVNlYXJjaEFyZ3MSDQoFcXVlcnkYASABKAkSDAoEdHlwZRgCIAEoCRITCgtudW1fcmVzdWx0cxgDIAEoBRIUCgx0b29sX2NhbGxfaWQYBCABKAkipgEKD0V4YVNlYXJjaFJlc3VsdBItCgdzdWNjZXNzGAEgASgLMhouYWdlbnQudjEuRXhhU2VhcmNoU3VjY2Vzc0gAEikKBWVycm9yGAIgASgLMhguYWdlbnQudjEuRXhhU2VhcmNoRXJyb3JIABIvCghyZWplY3RlZBgDIAEoCzIbLmFnZW50LnYxLkV4YVNlYXJjaFJlamVjdGVkSABCCAoGcmVzdWx0IkQKEEV4YVNlYXJjaFN1Y2Nlc3MSMAoKcmVmZXJlbmNlcxgBIAMoCzIcLmFnZW50LnYxLkV4YVNlYXJjaFJlZmVyZW5jZSIfCg5FeGFTZWFyY2hFcnJvchINCgVlcnJvchgBIAEoCSIjChFFeGFTZWFyY2hSZWplY3RlZBIOCgZyZWFzb24YASABKAkiVgoSRXhhU2VhcmNoUmVmZXJlbmNlEg0KBXRpdGxlGAEgASgJEgsKA3VybBgCIAEoCRIMCgR0ZXh0GAMgASgJEhYKDnB1Ymxpc2hlZF9kYXRlGAQgASgJImUKEUV4YVNlYXJjaFRvb2xDYWxsEiUKBGFyZ3MYASABKAsyFy5hZ2VudC52MS5FeGFTZWFyY2hBcmdzEikKBnJlc3VsdBgCIAEoCzIZLmFnZW50LnYxLkV4YVNlYXJjaFJlc3VsdCI+ChVFeGFTZWFyY2hSZXF1ZXN0UXVlcnkSJQoEYXJncxgBIAEoCzIXLmFnZW50LnYxLkV4YVNlYXJjaEFyZ3MipgEKGEV4YVNlYXJjaFJlcXVlc3RSZXNwb25zZRI/CghhcHByb3ZlZBgBIAEoCzIrLmFnZW50LnYxLkV4YVNlYXJjaFJlcXVlc3RSZXNwb25zZV9BcHByb3ZlZEgAEj8KCHJlamVjdGVkGAIgASgLMisuYWdlbnQudjEuRXhhU2VhcmNoUmVxdWVzdFJlc3BvbnNlX1JlamVjdGVkSABCCAoGcmVzdWx0IiMKIUV4YVNlYXJjaFJlcXVlc3RSZXNwb25zZV9BcHByb3ZlZCIzCiFFeGFTZWFyY2hSZXF1ZXN0UmVzcG9uc2VfUmVqZWN0ZWQSDgoGcmVhc29uGAEgASgJIiMKFUV4ZWNDbGllbnRTdHJlYW1DbG9zZRIKCgJpZBgBIAEoDSJWCg9FeGVjQ2xpZW50VGhyb3cSCgoCaWQYASABKA0SDQoFZXJyb3IYAiABKAkSGAoLc3RhY2tfdHJhY2UYAyABKAlIAIgBAUIOCgxfc3RhY2tfdHJhY2UiIQoTRXhlY0NsaWVudEhlYXJ0YmVhdBIKCgJpZBgBIAEoDSK+AQoYRXhlY0NsaWVudENvbnRyb2xNZXNzYWdlEjcKDHN0cmVhbV9jbG9zZRgBIAEoCzIfLmFnZW50LnYxLkV4ZWNDbGllbnRTdHJlYW1DbG9zZUgAEioKBXRocm93GAIgASgLMhkuYWdlbnQudjEuRXhlY0NsaWVudFRocm93SAASMgoJaGVhcnRiZWF0GAMgASgLMh0uYWdlbnQudjEuRXhlY0NsaWVudEhlYXJ0YmVhdEgAQgkKB21lc3NhZ2UihAEKC1NwYW5Db250ZXh0EhAKCHRyYWNlX2lkGAEgASgJEg8KB3NwYW5faWQYAiABKAkSGAoLdHJhY2VfZmxhZ3MYAyABKA1IAIgBARIYCgt0cmFjZV9zdGF0ZRgEIAEoCUgBiAEBQg4KDF90cmFjZV9mbGFnc0IOCgxfdHJhY2Vfc3RhdGUiCwoJQWJvcnRBcmdzIg0KC0Fib3J0UmVzdWx0IoUIChFFeGVjU2VydmVyTWVzc2FnZRIKCgJpZBgBIAEoDRIPCgdleGVjX2lkGA8gASgJEjAKDHNwYW5fY29udGV4dBgTIAEoCzIVLmFnZW50LnYxLlNwYW5Db250ZXh0SAGIAQESKQoKc2hlbGxfYXJncxgCIAEoCzITLmFnZW50LnYxLlNoZWxsQXJnc0gAEikKCndyaXRlX2FyZ3MYAyABKAsyEy5hZ2VudC52MS5Xcml0ZUFyZ3NIABIrCgtkZWxldGVfYXJncxgEIAEoCzIULmFnZW50LnYxLkRlbGV0ZUFyZ3NIABInCglncmVwX2FyZ3MYBSABKAsyEi5hZ2VudC52MS5HcmVwQXJnc0gAEicKCXJlYWRfYXJncxgHIAEoCzISLmFnZW50LnYxLlJlYWRBcmdzSAASIwoHbHNfYXJncxgIIAEoCzIQLmFnZW50LnYxLkxzQXJnc0gAEjUKEGRpYWdub3N0aWNzX2FyZ3MYCSABKAsyGS5hZ2VudC52MS5EaWFnbm9zdGljc0FyZ3NIABI8ChRyZXF1ZXN0X2NvbnRleHRfYXJncxgKIAEoCzIcLmFnZW50LnYxLlJlcXVlc3RDb250ZXh0QXJnc0gAEiUKCG1jcF9hcmdzGAsgASgLMhEuYWdlbnQudjEuTWNwQXJnc0gAEjAKEXNoZWxsX3N0cmVhbV9hcmdzGA4gASgLMhMuYWdlbnQudjEuU2hlbGxBcmdzSAASSQobYmFja2dyb3VuZF9zaGVsbF9zcGF3bl9hcmdzGBAgASgLMiIuYWdlbnQudjEuQmFja2dyb3VuZFNoZWxsU3Bhd25BcmdzSAASSgocbGlzdF9tY3BfcmVzb3VyY2VzX2V4ZWNfYXJncxgRIAEoCzIiLmFnZW50LnYxLkxpc3RNY3BSZXNvdXJjZXNFeGVjQXJnc0gAEkgKG3JlYWRfbWNwX3Jlc291cmNlX2V4ZWNfYXJncxgSIAEoCzIhLmFnZW50LnYxLlJlYWRNY3BSZXNvdXJjZUV4ZWNBcmdzSAASKQoKZmV0Y2hfYXJncxgUIAEoCzITLmFnZW50LnYxLkZldGNoQXJnc0gAEjgKEnJlY29yZF9zY3JlZW5fYXJncxgVIAEoCzIaLmFnZW50LnYxLlJlY29yZFNjcmVlbkFyZ3NIABI2ChFjb21wdXRlcl91c2VfYXJncxgWIAEoCzIZLmFnZW50LnYxLkNvbXB1dGVyVXNlQXJnc0gAEj8KFndyaXRlX3NoZWxsX3N0ZGluX2FyZ3MYFyABKAsyHS5hZ2VudC52MS5Xcml0ZVNoZWxsU3RkaW5BcmdzSABCCQoHbWVzc2FnZUIPCg1fc3Bhbl9jb250ZXh0Iv8HChFFeGVjQ2xpZW50TWVzc2FnZRIKCgJpZBgBIAEoDRIPCgdleGVjX2lkGA8gASgJEi0KDHNoZWxsX3Jlc3VsdBgCIAEoCzIVLmFnZW50LnYxLlNoZWxsUmVzdWx0SAASLQoMd3JpdGVfcmVzdWx0GAMgASgLMhUuYWdlbnQudjEuV3JpdGVSZXN1bHRIABIvCg1kZWxldGVfcmVzdWx0GAQgASgLMhYuYWdlbnQudjEuRGVsZXRlUmVzdWx0SAASKwoLZ3JlcF9yZXN1bHQYBSABKAsyFC5hZ2VudC52MS5HcmVwUmVzdWx0SAASKwoLcmVhZF9yZXN1bHQYByABKAsyFC5hZ2VudC52MS5SZWFkUmVzdWx0SAASJwoJbHNfcmVzdWx0GAggASgLMhIuYWdlbnQudjEuTHNSZXN1bHRIABI5ChJkaWFnbm9zdGljc19yZXN1bHQYCSABKAsyGy5hZ2VudC52MS5EaWFnbm9zdGljc1Jlc3VsdEgAEkAKFnJlcXVlc3RfY29udGV4dF9yZXN1bHQYCiABKAsyHi5hZ2VudC52MS5SZXF1ZXN0Q29udGV4dFJlc3VsdEgAEikKCm1jcF9yZXN1bHQYCyABKAsyEy5hZ2VudC52MS5NY3BSZXN1bHRIABItCgxzaGVsbF9zdHJlYW0YDiABKAsyFS5hZ2VudC52MS5TaGVsbFN0cmVhbUgAEk0KHWJhY2tncm91bmRfc2hlbGxfc3Bhd25fcmVzdWx0GBAgASgLMiQuYWdlbnQudjEuQmFja2dyb3VuZFNoZWxsU3Bhd25SZXN1bHRIABJOCh5saXN0X21jcF9yZXNvdXJjZXNfZXhlY19yZXN1bHQYESABKAsyJC5hZ2VudC52MS5MaXN0TWNwUmVzb3VyY2VzRXhlY1Jlc3VsdEgAEkwKHXJlYWRfbWNwX3Jlc291cmNlX2V4ZWNfcmVzdWx0GBIgASgLMiMuYWdlbnQudjEuUmVhZE1jcFJlc291cmNlRXhlY1Jlc3VsdEgAEi0KDGZldGNoX3Jlc3VsdBgUIAEoCzIVLmFnZW50LnYxLkZldGNoUmVzdWx0SAASPAoUcmVjb3JkX3NjcmVlbl9yZXN1bHQYFSABKAsyHC5hZ2VudC52MS5SZWNvcmRTY3JlZW5SZXN1bHRIABI6ChNjb21wdXRlcl91c2VfcmVzdWx0GBYgASgLMhsuYWdlbnQudjEuQ29tcHV0ZXJVc2VSZXN1bHRIABJDChh3cml0ZV9zaGVsbF9zdGRpbl9yZXN1bHQYFyABKAsyHy5hZ2VudC52MS5Xcml0ZVNoZWxsU3RkaW5SZXN1bHRIAEIJCgdtZXNzYWdlIi4KCUZldGNoQXJncxILCgN1cmwYASABKAkSFAoMdG9vbF9jYWxsX2lkGAIgASgJImkKC0ZldGNoUmVzdWx0EikKB3N1Y2Nlc3MYASABKAsyFi5hZ2VudC52MS5GZXRjaFN1Y2Nlc3NIABIlCgVlcnJvchgCIAEoCzIULmFnZW50LnYxLkZldGNoRXJyb3JIAEIICgZyZXN1bHQiVwoMRmV0Y2hTdWNjZXNzEgsKA3VybBgBIAEoCRIPCgdjb250ZW50GAIgASgJEhMKC3N0YXR1c19jb2RlGAMgASgFEhQKDGNvbnRlbnRfdHlwZRgEIAEoCSIoCgpGZXRjaEVycm9yEgsKA3VybBgBIAEoCRINCgVlcnJvchgCIAEoCSJtChFHZW5lcmF0ZUltYWdlQXJncxITCgtkZXNjcmlwdGlvbhgBIAEoCRIWCglmaWxlX3BhdGgYAiABKAlIAIgBARIdChVyZWZlcmVuY2VfaW1hZ2VfcGF0aHMYBSADKAlCDAoKX2ZpbGVfcGF0aCKBAQoTR2VuZXJhdGVJbWFnZVJlc3VsdBIxCgdzdWNjZXNzGAEgASgLMh4uYWdlbnQudjEuR2VuZXJhdGVJbWFnZVN1Y2Nlc3NIABItCgVlcnJvchgCIAEoCzIcLmFnZW50LnYxLkdlbmVyYXRlSW1hZ2VFcnJvckgAQggKBnJlc3VsdCI9ChRHZW5lcmF0ZUltYWdlU3VjY2VzcxIRCglmaWxlX3BhdGgYASABKAkSEgoKaW1hZ2VfZGF0YRgCIAEoCSIjChJHZW5lcmF0ZUltYWdlRXJyb3ISDQoFZXJyb3IYASABKAkicQoVR2VuZXJhdGVJbWFnZVRvb2xDYWxsEikKBGFyZ3MYASABKAsyGy5hZ2VudC52MS5HZW5lcmF0ZUltYWdlQXJncxItCgZyZXN1bHQYAiABKAsyHS5hZ2VudC52MS5HZW5lcmF0ZUltYWdlUmVzdWx0IsYECghHcmVwQXJncxIPCgdwYXR0ZXJuGAEgASgJEhEKBHBhdGgYAiABKAlIAIgBARIRCgRnbG9iGAMgASgJSAGIAQESGAoLb3V0cHV0X21vZGUYBCABKAlIAogBARIbCg5jb250ZXh0X2JlZm9yZRgFIAEoBUgDiAEBEhoKDWNvbnRleHRfYWZ0ZXIYBiABKAVIBIgBARIUCgdjb250ZXh0GAcgASgFSAWIAQESHQoQY2FzZV9pbnNlbnNpdGl2ZRgIIAEoCEgGiAEBEhEKBHR5cGUYCSABKAlIB4gBARIXCgpoZWFkX2xpbWl0GAogASgFSAiIAQESFgoJbXVsdGlsaW5lGAsgASgISAmIAQESEQoEc29ydBgMIAEoCUgKiAEBEhsKDnNvcnRfYXNjZW5kaW5nGA0gASgISAuIAQESFAoMdG9vbF9jYWxsX2lkGA4gASgJEjQKDnNhbmRib3hfcG9saWN5GA8gASgLMhcuYWdlbnQudjEuU2FuZGJveFBvbGljeUgMiAEBQgcKBV9wYXRoQgcKBV9nbG9iQg4KDF9vdXRwdXRfbW9kZUIRCg9fY29udGV4dF9iZWZvcmVCEAoOX2NvbnRleHRfYWZ0ZXJCCgoIX2NvbnRleHRCEwoRX2Nhc2VfaW5zZW5zaXRpdmVCBwoFX3R5cGVCDQoLX2hlYWRfbGltaXRCDAoKX211bHRpbGluZUIHCgVfc29ydEIRCg9fc29ydF9hc2NlbmRpbmdCEQoPX3NhbmRib3hfcG9saWN5ImYKCkdyZXBSZXN1bHQSKAoHc3VjY2VzcxgBIAEoCzIVLmFnZW50LnYxLkdyZXBTdWNjZXNzSAASJAoFZXJyb3IYAiABKAsyEy5hZ2VudC52MS5HcmVwRXJyb3JIAEIICgZyZXN1bHQiGgoJR3JlcEVycm9yEg0KBWVycm9yGAEgASgJIrQCCgtHcmVwU3VjY2VzcxIPCgdwYXR0ZXJuGAEgASgJEgwKBHBhdGgYAiABKAkSEwoLb3V0cHV0X21vZGUYAyABKAkSRgoRd29ya3NwYWNlX3Jlc3VsdHMYBCADKAsyKy5hZ2VudC52MS5HcmVwU3VjY2Vzcy5Xb3Jrc3BhY2VSZXN1bHRzRW50cnkSPAoUYWN0aXZlX2VkaXRvcl9yZXN1bHQYBSABKAsyGS5hZ2VudC52MS5HcmVwVW5pb25SZXN1bHRIAIgBARpSChVXb3Jrc3BhY2VSZXN1bHRzRW50cnkSCwoDa2V5GAEgASgJEigKBXZhbHVlGAIgASgLMhkuYWdlbnQudjEuR3JlcFVuaW9uUmVzdWx0OgI4AUIXChVfYWN0aXZlX2VkaXRvcl9yZXN1bHQiowEKD0dyZXBVbmlvblJlc3VsdBIqCgVjb3VudBgBIAEoCzIZLmFnZW50LnYxLkdyZXBDb3VudFJlc3VsdEgAEioKBWZpbGVzGAIgASgLMhkuYWdlbnQudjEuR3JlcEZpbGVzUmVzdWx0SAASLgoHY29udGVudBgDIAEoCzIbLmFnZW50LnYxLkdyZXBDb250ZW50UmVzdWx0SABCCAoGcmVzdWx0IpsBCg9HcmVwQ291bnRSZXN1bHQSJwoGY291bnRzGAEgAygLMhcuYWdlbnQudjEuR3JlcEZpbGVDb3VudBITCgt0b3RhbF9maWxlcxgCIAEoBRIVCg10b3RhbF9tYXRjaGVzGAMgASgFEhgKEGNsaWVudF90cnVuY2F0ZWQYBCABKAgSGQoRcmlwZ3JlcF90cnVuY2F0ZWQYBSABKAgiLAoNR3JlcEZpbGVDb3VudBIMCgRmaWxlGAEgASgJEg0KBWNvdW50GAIgASgFImoKD0dyZXBGaWxlc1Jlc3VsdBINCgVmaWxlcxgBIAMoCRITCgt0b3RhbF9maWxlcxgCIAEoBRIYChBjbGllbnRfdHJ1bmNhdGVkGAMgASgIEhkKEXJpcGdyZXBfdHJ1bmNhdGVkGAQgASgIIqQBChFHcmVwQ29udGVudFJlc3VsdBIoCgdtYXRjaGVzGAEgAygLMhcuYWdlbnQudjEuR3JlcEZpbGVNYXRjaBITCgt0b3RhbF9saW5lcxgCIAEoBRIbChN0b3RhbF9tYXRjaGVkX2xpbmVzGAMgASgFEhgKEGNsaWVudF90cnVuY2F0ZWQYBCABKAgSGQoRcmlwZ3JlcF90cnVuY2F0ZWQYBSABKAgiSgoNR3JlcEZpbGVNYXRjaBIMCgRmaWxlGAEgASgJEisKB21hdGNoZXMYAiADKAsyGi5hZ2VudC52MS5HcmVwQ29udGVudE1hdGNoImwKEEdyZXBDb250ZW50TWF0Y2gSEwoLbGluZV9udW1iZXIYASABKAUSDwoHY29udGVudBgCIAEoCRIZChFjb250ZW50X3RydW5jYXRlZBgDIAEoCBIXCg9pc19jb250ZXh0X2xpbmUYBCABKAgiHQoKR3JlcFN0cmVhbRIPCgdwYXR0ZXJuGAEgASgJIlYKDEdyZXBUb29sQ2FsbBIgCgRhcmdzGAEgASgLMhIuYWdlbnQudjEuR3JlcEFyZ3MSJAoGcmVzdWx0GAIgASgLMhQuYWdlbnQudjEuR3JlcFJlc3VsdCIeCgtHZXRCbG9iQXJncxIPCgdibG9iX2lkGAEgASgMIjUKDUdldEJsb2JSZXN1bHQSFgoJYmxvYl9kYXRhGAEgASgMSACIAQFCDAoKX2Jsb2JfZGF0YSIxCgtTZXRCbG9iQXJncxIPCgdibG9iX2lkGAEgASgMEhEKCWJsb2JfZGF0YRgCIAEoDCI+Cg1TZXRCbG9iUmVzdWx0EiMKBWVycm9yGAEgASgLMg8uYWdlbnQudjEuRXJyb3JIAIgBAUIICgZfZXJyb3IiywEKD0t2U2VydmVyTWVzc2FnZRIKCgJpZBgBIAEoDRIwCgxzcGFuX2NvbnRleHQYBCABKAsyFS5hZ2VudC52MS5TcGFuQ29udGV4dEgBiAEBEi4KDWdldF9ibG9iX2FyZ3MYAiABKAsyFS5hZ2VudC52MS5HZXRCbG9iQXJnc0gAEi4KDXNldF9ibG9iX2FyZ3MYAyABKAsyFS5hZ2VudC52MS5TZXRCbG9iQXJnc0gAQgkKB21lc3NhZ2VCDwoNX3NwYW5fY29udGV4dCKQAQoPS3ZDbGllbnRNZXNzYWdlEgoKAmlkGAEgASgNEjIKD2dldF9ibG9iX3Jlc3VsdBgCIAEoCzIXLmFnZW50LnYxLkdldEJsb2JSZXN1bHRIABIyCg9zZXRfYmxvYl9yZXN1bHQYAyABKAsyFy5hZ2VudC52MS5TZXRCbG9iUmVzdWx0SABCCQoHbWVzc2FnZSKtAQoGTHNBcmdzEgwKBHBhdGgYASABKAkSDgoGaWdub3JlGAIgAygJEhQKDHRvb2xfY2FsbF9pZBgDIAEoCRI0Cg5zYW5kYm94X3BvbGljeRgEIAEoCzIXLmFnZW50LnYxLlNhbmRib3hQb2xpY3lIAIgBARIXCgp0aW1lb3V0X21zGAUgASgNSAGIAQFCEQoPX3NhbmRib3hfcG9saWN5Qg0KC190aW1lb3V0X21zIrIBCghMc1Jlc3VsdBImCgdzdWNjZXNzGAEgASgLMhMuYWdlbnQudjEuTHNTdWNjZXNzSAASIgoFZXJyb3IYAiABKAsyES5hZ2VudC52MS5Mc0Vycm9ySAASKAoIcmVqZWN0ZWQYAyABKAsyFC5hZ2VudC52MS5Mc1JlamVjdGVkSAASJgoHdGltZW91dBgEIAEoCzITLmFnZW50LnYxLkxzVGltZW91dEgAQggKBnJlc3VsdCJHCglMc1N1Y2Nlc3MSOgoTZGlyZWN0b3J5X3RyZWVfcm9vdBgBIAEoCzIdLmFnZW50LnYxLkxzRGlyZWN0b3J5VHJlZU5vZGUi9gIKE0xzRGlyZWN0b3J5VHJlZU5vZGUSEAoIYWJzX3BhdGgYASABKAkSNAoNY2hpbGRyZW5fZGlycxgCIAMoCzIdLmFnZW50LnYxLkxzRGlyZWN0b3J5VHJlZU5vZGUSOgoOY2hpbGRyZW5fZmlsZXMYAyADKAsyIi5hZ2VudC52MS5Mc0RpcmVjdG9yeVRyZWVOb2RlX0ZpbGUSHwoXY2hpbGRyZW5fd2VyZV9wcm9jZXNzZWQYBCABKAgSZAodZnVsbF9zdWJ0cmVlX2V4dGVuc2lvbl9jb3VudHMYBSADKAsyPS5hZ2VudC52MS5Mc0RpcmVjdG9yeVRyZWVOb2RlLkZ1bGxTdWJ0cmVlRXh0ZW5zaW9uQ291bnRzRW50cnkSEQoJbnVtX2ZpbGVzGAYgASgFGkEKH0Z1bGxTdWJ0cmVlRXh0ZW5zaW9uQ291bnRzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgFOgI4ASJ6ChhMc0RpcmVjdG9yeVRyZWVOb2RlX0ZpbGUSDAoEbmFtZRgBIAEoCRI6ChF0ZXJtaW5hbF9tZXRhZGF0YRgCIAEoCzIaLmFnZW50LnYxLlRlcm1pbmFsTWV0YWRhdGFIAIgBAUIUChJfdGVybWluYWxfbWV0YWRhdGEiJgoHTHNFcnJvchIMCgRwYXRoGAEgASgJEg0KBWVycm9yGAIgASgJIioKCkxzUmVqZWN0ZWQSDAoEcGF0aBgBIAEoCRIOCgZyZWFzb24YAiABKAkiRwoJTHNUaW1lb3V0EjoKE2RpcmVjdG9yeV90cmVlX3Jvb3QYASABKAsyHS5hZ2VudC52MS5Mc0RpcmVjdG9yeVRyZWVOb2RlIvEBChBUZXJtaW5hbE1ldGFkYXRhEhAKA2N3ZBgBIAEoCUgAiAEBEjkKDWxhc3RfY29tbWFuZHMYAiADKAsyIi5hZ2VudC52MS5UZXJtaW5hbE1ldGFkYXRhX0NvbW1hbmQSHQoQbGFzdF9tb2RpZmllZF9tcxgDIAEoA0gBiAEBEkAKD2N1cnJlbnRfY29tbWFuZBgEIAEoCzIiLmFnZW50LnYxLlRlcm1pbmFsTWV0YWRhdGFfQ29tbWFuZEgCiAEBQgYKBF9jd2RCEwoRX2xhc3RfbW9kaWZpZWRfbXNCEgoQX2N1cnJlbnRfY29tbWFuZCKnAQoYVGVybWluYWxNZXRhZGF0YV9Db21tYW5kEg8KB2NvbW1hbmQYASABKAkSFgoJZXhpdF9jb2RlGAIgASgFSACIAQESGQoMdGltZXN0YW1wX21zGAMgASgDSAGIAQESGAoLZHVyYXRpb25fbXMYBCABKANIAogBAUIMCgpfZXhpdF9jb2RlQg8KDV90aW1lc3RhbXBfbXNCDgoMX2R1cmF0aW9uX21zIlAKCkxzVG9vbENhbGwSHgoEYXJncxgBIAEoCzIQLmFnZW50LnYxLkxzQXJncxIiCgZyZXN1bHQYAiABKAsyEi5hZ2VudC52MS5Mc1Jlc3VsdCK1AQoHTWNwQXJncxIMCgRuYW1lGAEgASgJEikKBGFyZ3MYAiADKAsyGy5hZ2VudC52MS5NY3BBcmdzLkFyZ3NFbnRyeRIUCgx0b29sX2NhbGxfaWQYAyABKAkSGwoTcHJvdmlkZXJfaWRlbnRpZmllchgEIAEoCRIRCgl0b29sX25hbWUYBSABKAkaKwoJQXJnc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoDDoCOAEi/wEKCU1jcFJlc3VsdBInCgdzdWNjZXNzGAEgASgLMhQuYWdlbnQudjEuTWNwU3VjY2Vzc0gAEiMKBWVycm9yGAIgASgLMhIuYWdlbnQudjEuTWNwRXJyb3JIABIpCghyZWplY3RlZBgDIAEoCzIVLmFnZW50LnYxLk1jcFJlamVjdGVkSAASOgoRcGVybWlzc2lvbl9kZW5pZWQYBCABKAsyHS5hZ2VudC52MS5NY3BQZXJtaXNzaW9uRGVuaWVkSAASMwoOdG9vbF9ub3RfZm91bmQYBSABKAsyGS5hZ2VudC52MS5NY3BUb29sTm90Rm91bmRIAEIICgZyZXN1bHQiOAoPTWNwVG9vbE5vdEZvdW5kEgwKBG5hbWUYASABKAkSFwoPYXZhaWxhYmxlX3Rvb2xzGAIgAygJImoKDk1jcFRleHRDb250ZW50EgwKBHRleHQYASABKAkSNgoPb3V0cHV0X2xvY2F0aW9uGAIgASgLMhguYWdlbnQudjEuT3V0cHV0TG9jYXRpb25IAIgBAUISChBfb3V0cHV0X2xvY2F0aW9uIjIKD01jcEltYWdlQ29udGVudBIMCgRkYXRhGAEgASgMEhEKCW1pbWVfdHlwZRgCIAEoCSJ7ChhNY3BUb29sUmVzdWx0Q29udGVudEl0ZW0SKAoEdGV4dBgBIAEoCzIYLmFnZW50LnYxLk1jcFRleHRDb250ZW50SAASKgoFaW1hZ2UYAiABKAsyGS5hZ2VudC52MS5NY3BJbWFnZUNvbnRlbnRIAEIJCgdjb250ZW50IlMKCk1jcFN1Y2Nlc3MSMwoHY29udGVudBgBIAMoCzIiLmFnZW50LnYxLk1jcFRvb2xSZXN1bHRDb250ZW50SXRlbRIQCghpc19lcnJvchgCIAEoCCIZCghNY3BFcnJvchINCgVlcnJvchgBIAEoCSIyCgtNY3BSZWplY3RlZBIOCgZyZWFzb24YASABKAkSEwoLaXNfcmVhZG9ubHkYAiABKAgiOQoTTWNwUGVybWlzc2lvbkRlbmllZBINCgVlcnJvchgBIAEoCRITCgtpc19yZWFkb25seRgCIAEoCCI6ChhMaXN0TWNwUmVzb3VyY2VzRXhlY0FyZ3MSEwoGc2VydmVyGAEgASgJSACIAQFCCQoHX3NlcnZlciLGAQoaTGlzdE1jcFJlc291cmNlc0V4ZWNSZXN1bHQSNAoHc3VjY2VzcxgBIAEoCzIhLmFnZW50LnYxLkxpc3RNY3BSZXNvdXJjZXNTdWNjZXNzSAASMAoFZXJyb3IYAiABKAsyHy5hZ2VudC52MS5MaXN0TWNwUmVzb3VyY2VzRXJyb3JIABI2CghyZWplY3RlZBgDIAEoCzIiLmFnZW50LnYxLkxpc3RNY3BSZXNvdXJjZXNSZWplY3RlZEgAQggKBnJlc3VsdCK9AgomTGlzdE1jcFJlc291cmNlc0V4ZWNSZXN1bHRfTWNwUmVzb3VyY2USCwoDdXJpGAEgASgJEhEKBG5hbWUYAiABKAlIAIgBARIYCgtkZXNjcmlwdGlvbhgDIAEoCUgBiAEBEhYKCW1pbWVfdHlwZRgEIAEoCUgCiAEBEg4KBnNlcnZlchgFIAEoCRJWCgthbm5vdGF0aW9ucxgGIAMoCzJBLmFnZW50LnYxLkxpc3RNY3BSZXNvdXJjZXNFeGVjUmVzdWx0X01jcFJlc291cmNlLkFubm90YXRpb25zRW50cnkaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBQgcKBV9uYW1lQg4KDF9kZXNjcmlwdGlvbkIMCgpfbWltZV90eXBlIl4KF0xpc3RNY3BSZXNvdXJjZXNTdWNjZXNzEkMKCXJlc291cmNlcxgBIAMoCzIwLmFnZW50LnYxLkxpc3RNY3BSZXNvdXJjZXNFeGVjUmVzdWx0X01jcFJlc291cmNlIiYKFUxpc3RNY3BSZXNvdXJjZXNFcnJvchINCgVlcnJvchgBIAEoCSIqChhMaXN0TWNwUmVzb3VyY2VzUmVqZWN0ZWQSDgoGcmVhc29uGAEgASgJImQKF1JlYWRNY3BSZXNvdXJjZUV4ZWNBcmdzEg4KBnNlcnZlchgBIAEoCRILCgN1cmkYAiABKAkSGgoNZG93bmxvYWRfcGF0aBgDIAEoCUgAiAEBQhAKDl9kb3dubG9hZF9wYXRoIvoBChlSZWFkTWNwUmVzb3VyY2VFeGVjUmVzdWx0EjMKB3N1Y2Nlc3MYASABKAsyIC5hZ2VudC52MS5SZWFkTWNwUmVzb3VyY2VTdWNjZXNzSAASLwoFZXJyb3IYAiABKAsyHi5hZ2VudC52MS5SZWFkTWNwUmVzb3VyY2VFcnJvckgAEjUKCHJlamVjdGVkGAMgASgLMiEuYWdlbnQudjEuUmVhZE1jcFJlc291cmNlUmVqZWN0ZWRIABI2Cglub3RfZm91bmQYBCABKAsyIS5hZ2VudC52MS5SZWFkTWNwUmVzb3VyY2VOb3RGb3VuZEgAQggKBnJlc3VsdCLmAgoWUmVhZE1jcFJlc291cmNlU3VjY2VzcxILCgN1cmkYASABKAkSEQoEbmFtZRgCIAEoCUgBiAEBEhgKC2Rlc2NyaXB0aW9uGAMgASgJSAKIAQESFgoJbWltZV90eXBlGAQgASgJSAOIAQESRgoLYW5ub3RhdGlvbnMYByADKAsyMS5hZ2VudC52MS5SZWFkTWNwUmVzb3VyY2VTdWNjZXNzLkFubm90YXRpb25zRW50cnkSGgoNZG93bmxvYWRfcGF0aBgIIAEoCUgEiAEBEg4KBHRleHQYBSABKAlIABIOCgRibG9iGAYgASgMSAAaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBQgkKB2NvbnRlbnRCBwoFX25hbWVCDgoMX2Rlc2NyaXB0aW9uQgwKCl9taW1lX3R5cGVCEAoOX2Rvd25sb2FkX3BhdGgiMgoUUmVhZE1jcFJlc291cmNlRXJyb3ISCwoDdXJpGAEgASgJEg0KBWVycm9yGAIgASgJIjYKF1JlYWRNY3BSZXNvdXJjZVJlamVjdGVkEgsKA3VyaRgBIAEoCRIOCgZyZWFzb24YAiABKAkiJgoXUmVhZE1jcFJlc291cmNlTm90Rm91bmQSCwoDdXJpGAEgASgJInwKEU1jcFRvb2xEZWZpbml0aW9uEgwKBG5hbWUYASABKAkSGwoTcHJvdmlkZXJfaWRlbnRpZmllchgEIAEoCRIRCgl0b29sX25hbWUYBSABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkSFAoMaW5wdXRfc2NoZW1hGAMgASgMIjoKCE1jcFRvb2xzEi4KCW1jcF90b29scxgBIAMoCzIbLmFnZW50LnYxLk1jcFRvb2xEZWZpbml0aW9uIjwKD01jcEluc3RydWN0aW9ucxITCgtzZXJ2ZXJfbmFtZRgBIAEoCRIUCgxpbnN0cnVjdGlvbnMYAiABKAki1wEKDU1jcERlc2NyaXB0b3ISEwoLc2VydmVyX25hbWUYASABKAkSGQoRc2VydmVyX2lkZW50aWZpZXIYAiABKAkSGAoLZm9sZGVyX3BhdGgYAyABKAlIAIgBARIkChdzZXJ2ZXJfdXNlX2luc3RydWN0aW9ucxgEIAEoCUgBiAEBEioKBXRvb2xzGAUgAygLMhsuYWdlbnQudjEuTWNwVG9vbERlc2NyaXB0b3JCDgoMX2ZvbGRlcl9wYXRoQhoKGF9zZXJ2ZXJfdXNlX2luc3RydWN0aW9ucyJYChFNY3BUb29sRGVzY3JpcHRvchIRCgl0b29sX25hbWUYASABKAkSHAoPZGVmaW5pdGlvbl9wYXRoGAIgASgJSACIAQFCEgoQX2RlZmluaXRpb25fcGF0aCJ4ChRNY3BGaWxlU3lzdGVtT3B0aW9ucxIPCgdlbmFibGVkGAEgASgIEh0KFXdvcmtzcGFjZV9wcm9qZWN0X2RpchgCIAEoCRIwCg9tY3BfZGVzY3JpcHRvcnMYAyADKAsyFy5hZ2VudC52MS5NY3BEZXNjcmlwdG9yIi4KCFJlYWRBcmdzEgwKBHBhdGgYASABKAkSFAoMdG9vbF9jYWxsX2lkGAIgASgJIrgCCgpSZWFkUmVzdWx0EigKB3N1Y2Nlc3MYASABKAsyFS5hZ2VudC52MS5SZWFkU3VjY2Vzc0gAEiQKBWVycm9yGAIgASgLMhMuYWdlbnQudjEuUmVhZEVycm9ySAASKgoIcmVqZWN0ZWQYAyABKAsyFi5hZ2VudC52MS5SZWFkUmVqZWN0ZWRIABI0Cg5maWxlX25vdF9mb3VuZBgEIAEoCzIaLmFnZW50LnYxLlJlYWRGaWxlTm90Rm91bmRIABI7ChFwZXJtaXNzaW9uX2RlbmllZBgFIAEoCzIeLmFnZW50LnYxLlJlYWRQZXJtaXNzaW9uRGVuaWVkSAASMQoMaW52YWxpZF9maWxlGAYgASgLMhkuYWdlbnQudjEuUmVhZEludmFsaWRGaWxlSABCCAoGcmVzdWx0IrMBCgtSZWFkU3VjY2VzcxIMCgRwYXRoGAEgASgJEhMKC3RvdGFsX2xpbmVzGAMgASgFEhEKCWZpbGVfc2l6ZRgEIAEoAxIRCgl0cnVuY2F0ZWQYBiABKAgSGwoOb3V0cHV0X2Jsb2JfaWQYByABKAxIAYgBARIRCgdjb250ZW50GAIgASgJSAASDgoEZGF0YRgFIAEoDEgAQggKBm91dHB1dEIRCg9fb3V0cHV0X2Jsb2JfaWQiKAoJUmVhZEVycm9yEgwKBHBhdGgYASABKAkSDQoFZXJyb3IYAiABKAkiLAoMUmVhZFJlamVjdGVkEgwKBHBhdGgYASABKAkSDgoGcmVhc29uGAIgASgJIiAKEFJlYWRGaWxlTm90Rm91bmQSDAoEcGF0aBgBIAEoCSIkChRSZWFkUGVybWlzc2lvbkRlbmllZBIMCgRwYXRoGAEgASgJIi8KD1JlYWRJbnZhbGlkRmlsZRIMCgRwYXRoGAEgASgJEg4KBnJlYXNvbhgCIAEoCSJeCgxSZWFkVG9vbENhbGwSJAoEYXJncxgBIAEoCzIWLmFnZW50LnYxLlJlYWRUb29sQXJncxIoCgZyZXN1bHQYAiABKAsyGC5hZ2VudC52MS5SZWFkVG9vbFJlc3VsdCJaCgxSZWFkVG9vbEFyZ3MSDAoEcGF0aBgBIAEoCRITCgZvZmZzZXQYAiABKAVIAIgBARISCgVsaW1pdBgDIAEoBUgBiAEBQgkKB19vZmZzZXRCCAoGX2xpbWl0InIKDlJlYWRUb29sUmVzdWx0EiwKB3N1Y2Nlc3MYASABKAsyGS5hZ2VudC52MS5SZWFkVG9vbFN1Y2Nlc3NIABIoCgVlcnJvchgCIAEoCzIXLmFnZW50LnYxLlJlYWRUb29sRXJyb3JIAEIICgZyZXN1bHQiMQoJUmVhZFJhbmdlEhIKCnN0YXJ0X2xpbmUYASABKA0SEAoIZW5kX2xpbmUYAiABKA0ijgIKD1JlYWRUb29sU3VjY2VzcxIQCghpc19lbXB0eRgCIAEoCBIWCg5leGNlZWRlZF9saW1pdBgDIAEoCBITCgt0b3RhbF9saW5lcxgEIAEoDRIRCglmaWxlX3NpemUYBSABKA0SDAoEcGF0aBgHIAEoCRIsCgpyZWFkX3JhbmdlGAggASgLMhMuYWdlbnQudjEuUmVhZFJhbmdlSAGIAQESEQoHY29udGVudBgBIAEoCUgAEg4KBGRhdGEYBiABKAxIABIWCgxkYXRhX2Jsb2JfaWQYCSABKAxIABIZCg9jb250ZW50X2Jsb2JfaWQYCiABKAxIAEIICgZvdXRwdXRCDQoLX3JlYWRfcmFuZ2UiJgoNUmVhZFRvb2xFcnJvchIVCg1lcnJvcl9tZXNzYWdlGAEgASgJImoKEFJlY29yZFNjcmVlbkFyZ3MSDAoEbW9kZRgBIAEoBRIUCgx0b29sX2NhbGxfaWQYAiABKAkSHQoQc2F2ZV9hc19maWxlbmFtZRgDIAEoCUgAiAEBQhMKEV9zYXZlX2FzX2ZpbGVuYW1lIokCChJSZWNvcmRTY3JlZW5SZXN1bHQSOwoNc3RhcnRfc3VjY2VzcxgBIAEoCzIiLmFnZW50LnYxLlJlY29yZFNjcmVlblN0YXJ0U3VjY2Vzc0gAEjkKDHNhdmVfc3VjY2VzcxgCIAEoCzIhLmFnZW50LnYxLlJlY29yZFNjcmVlblNhdmVTdWNjZXNzSAASPwoPZGlzY2FyZF9zdWNjZXNzGAMgASgLMiQuYWdlbnQudjEuUmVjb3JkU2NyZWVuRGlzY2FyZFN1Y2Nlc3NIABIwCgdmYWlsdXJlGAQgASgLMh0uYWdlbnQudjEuUmVjb3JkU2NyZWVuRmFpbHVyZUgAQggKBnJlc3VsdCJnChhSZWNvcmRTY3JlZW5TdGFydFN1Y2Nlc3MSJQodd2FzX3ByaW9yX3JlY29yZGluZ19jYW5jZWxsZWQYASABKAgSJAocd2FzX3NhdmVfYXNfZmlsZW5hbWVfaWdub3JlZBgCIAEoCCKgAQoXUmVjb3JkU2NyZWVuU2F2ZVN1Y2Nlc3MSDAoEcGF0aBgBIAEoCRIdChVyZWNvcmRpbmdfZHVyYXRpb25fbXMYAiABKAMSMAojcmVxdWVzdGVkX2ZpbGVfcGF0aF9yZWplY3RlZF9yZWFzb24YAyABKAVIAIgBAUImCiRfcmVxdWVzdGVkX2ZpbGVfcGF0aF9yZWplY3RlZF9yZWFzb24iHAoaUmVjb3JkU2NyZWVuRGlzY2FyZFN1Y2Nlc3MiJAoTUmVjb3JkU2NyZWVuRmFpbHVyZRINCgVlcnJvchgBIAEoCSI2ChNDdXJzb3JQYWNrYWdlUHJvbXB0EgwKBG5hbWUYASABKAkSEQoJZmlsZV9wYXRoGAIgASgJIuIBCg1DdXJzb3JQYWNrYWdlEgwKBG5hbWUYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkSEwoLZm9sZGVyX3BhdGgYAyABKAkSDwoHZW5hYmxlZBgEIAEoCBIYCgtwYXJzZV9lcnJvchgFIAEoCUgAiAEBEi4KB3Byb21wdHMYBiADKAsyHS5hZ2VudC52MS5DdXJzb3JQYWNrYWdlUHJvbXB0EhgKEHJlYWRtZV9maWxlX3BhdGgYByABKAkSFAoMcGFja2FnZV90eXBlGAggASgFQg4KDF9wYXJzZV9lcnJvciKrAgoWUmVwb3NpdG9yeUluZGV4aW5nSW5mbxIfChdyZWxhdGl2ZV93b3Jrc3BhY2VfcGF0aBgBIAEoCRITCgtyZW1vdGVfdXJscxgCIAMoCRIUCgxyZW1vdGVfbmFtZXMYAyADKAkSEQoJcmVwb19uYW1lGAQgASgJEhIKCnJlcG9fb3duZXIYBSABKAkSEgoKaXNfdHJhY2tlZBgGIAEoCBIQCghpc19sb2NhbBgHIAEoCBImChlvcnRob2dvbmFsX3RyYW5zZm9ybV9zZWVkGAggASgBSACIAQESFQoNd29ya3NwYWNlX3VyaRgJIAEoCRIbChNwYXRoX2VuY3J5cHRpb25fa2V5GAogASgJQhwKGl9vcnRob2dvbmFsX3RyYW5zZm9ybV9zZWVkInQKElJlcXVlc3RDb250ZXh0QXJncxIdChBub3Rlc19zZXNzaW9uX2lkGAIgASgJSACIAQESGQoMd29ya3NwYWNlX2lkGAMgASgJSAGIAQFCEwoRX25vdGVzX3Nlc3Npb25faWRCDwoNX3dvcmtzcGFjZV9pZCK6AQoUUmVxdWVzdENvbnRleHRSZXN1bHQSMgoHc3VjY2VzcxgBIAEoCzIfLmFnZW50LnYxLlJlcXVlc3RDb250ZXh0U3VjY2Vzc0gAEi4KBWVycm9yGAIgASgLMh0uYWdlbnQudjEuUmVxdWVzdENvbnRleHRFcnJvckgAEjQKCHJlamVjdGVkGAMgASgLMiAuYWdlbnQudjEuUmVxdWVzdENvbnRleHRSZWplY3RlZEgAQggKBnJlc3VsdCJKChVSZXF1ZXN0Q29udGV4dFN1Y2Nlc3MSMQoPcmVxdWVzdF9jb250ZXh0GAEgASgLMhguYWdlbnQudjEuUmVxdWVzdENvbnRleHQiJAoTUmVxdWVzdENvbnRleHRFcnJvchINCgVlcnJvchgBIAEoCSIoChZSZXF1ZXN0Q29udGV4dFJlamVjdGVkEg4KBnJlYXNvbhgBIAEoCSLCAQoKSW1hZ2VQcm90bxIMCgRkYXRhGAEgASgMEgwKBHV1aWQYAiABKAkSDAoEcGF0aBgDIAEoCRIxCglkaW1lbnNpb24YBCABKAsyHi5hZ2VudC52MS5JbWFnZVByb3RvX0RpbWVuc2lvbhImChl0YXNrX3NwZWNpZmljX2Rlc2NyaXB0aW9uGAYgASgJSACIAQESEQoJbWltZV90eXBlGAcgASgJQhwKGl90YXNrX3NwZWNpZmljX2Rlc2NyaXB0aW9uIjUKFEltYWdlUHJvdG9fRGltZW5zaW9uEg0KBXdpZHRoGAEgASgFEg4KBmhlaWdodBgCIAEoBSJoCgtHaXRSZXBvSW5mbxIMCgRwYXRoGAEgASgJEg4KBnN0YXR1cxgCIAEoCRITCgticmFuY2hfbmFtZRgDIAEoCRIXCgpyZW1vdGVfdXJsGAQgASgJSACIAQFCDQoLX3JlbW90ZV91cmwimwIKEVJlcXVlc3RDb250ZXh0RW52EhIKCm9zX3ZlcnNpb24YASABKAkSFwoPd29ya3NwYWNlX3BhdGhzGAIgAygJEg0KBXNoZWxsGAMgASgJEhcKD3NhbmRib3hfZW5hYmxlZBgFIAEoCBIYChB0ZXJtaW5hbHNfZm9sZGVyGAcgASgJEiEKGWFnZW50X3NoYXJlZF9ub3Rlc19mb2xkZXIYCCABKAkSJwofYWdlbnRfY29udmVyc2F0aW9uX25vdGVzX2ZvbGRlchgJIAEoCRIRCgl0aW1lX3pvbmUYCiABKAkSFgoOcHJvamVjdF9mb2xkZXIYCyABKAkSIAoYYWdlbnRfdHJhbnNjcmlwdHNfZm9sZGVyGAwgASgJIjwKD0RlYnVnTW9kZUNvbmZpZxIQCghsb2dfcGF0aBgBIAEoCRIXCg9zZXJ2ZXJfZW5kcG9pbnQYAiABKAkitAEKD1NraWxsRGVzY3JpcHRvchIMCgRuYW1lGAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEhMKC2ZvbGRlcl9wYXRoGAMgASgJEg8KB2VuYWJsZWQYBCABKAgSGAoLcGFyc2VfZXJyb3IYBSABKAlIAIgBARIYChByZWFkbWVfZmlsZV9wYXRoGAYgASgJEhQKDHBhY2thZ2VfdHlwZRgHIAEoBUIOCgxfcGFyc2VfZXJyb3IiRAoMU2tpbGxPcHRpb25zEjQKEXNraWxsX2Rlc2NyaXB0b3JzGAEgAygLMhkuYWdlbnQudjEuU2tpbGxEZXNjcmlwdG9yIvYICg5SZXF1ZXN0Q29udGV4dBIjCgVydWxlcxgCIAMoCzIULmFnZW50LnYxLkN1cnNvclJ1bGUSKAoDZW52GAQgASgLMhsuYWdlbnQudjEuUmVxdWVzdENvbnRleHRFbnYSOQoPcmVwb3NpdG9yeV9pbmZvGAYgAygLMiAuYWdlbnQudjEuUmVwb3NpdG9yeUluZGV4aW5nSW5mbxIqCgV0b29scxgHIAMoCzIbLmFnZW50LnYxLk1jcFRvb2xEZWZpbml0aW9uEicKGmNvbnZlcnNhdGlvbl9ub3Rlc19saXN0aW5nGAggASgJSACIAQESIQoUc2hhcmVkX25vdGVzX2xpc3RpbmcYCSABKAlIAYgBARIoCglnaXRfcmVwb3MYCyADKAsyFS5hZ2VudC52MS5HaXRSZXBvSW5mbxI2Cg9wcm9qZWN0X2xheW91dHMYDSADKAsyHS5hZ2VudC52MS5Mc0RpcmVjdG9yeVRyZWVOb2RlEjMKEG1jcF9pbnN0cnVjdGlvbnMYDiADKAsyGS5hZ2VudC52MS5NY3BJbnN0cnVjdGlvbnMSOQoRZGVidWdfbW9kZV9jb25maWcYDyABKAsyGS5hZ2VudC52MS5EZWJ1Z01vZGVDb25maWdIAogBARIXCgpjbG91ZF9ydWxlGBAgASgJSAOIAQESHwoSd2ViX3NlYXJjaF9lbmFibGVkGBEgASgISASIAQESMgoNc2tpbGxfb3B0aW9ucxgSIAEoCzIWLmFnZW50LnYxLlNraWxsT3B0aW9uc0gFiAEBEi4KIXJlcG9zaXRvcnlfaW5mb19zaG91bGRfcXVlcnlfcHJvZBgTIAEoCEgGiAEBEkEKDWZpbGVfY29udGVudHMYFCADKAsyKi5hZ2VudC52MS5SZXF1ZXN0Q29udGV4dC5GaWxlQ29udGVudHNFbnRyeRIgChN1c2VyX2ludGVudF9zdW1tYXJ5GBUgASgJSAeIAQESMgoQY3VzdG9tX3N1YmFnZW50cxgWIAMoCzIYLmFnZW50LnYxLkN1c3RvbVN1YmFnZW50EkQKF21jcF9maWxlX3N5c3RlbV9vcHRpb25zGBcgASgLMh4uYWdlbnQudjEuTWNwRmlsZVN5c3RlbU9wdGlvbnNICIgBARozChFGaWxlQ29udGVudHNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBQh0KG19jb252ZXJzYXRpb25fbm90ZXNfbGlzdGluZ0IXChVfc2hhcmVkX25vdGVzX2xpc3RpbmdCFAoSX2RlYnVnX21vZGVfY29uZmlnQg0KC19jbG91ZF9ydWxlQhUKE193ZWJfc2VhcmNoX2VuYWJsZWRCEAoOX3NraWxsX29wdGlvbnNCJAoiX3JlcG9zaXRvcnlfaW5mb19zaG91bGRfcXVlcnlfcHJvZEIWChRfdXNlcl9pbnRlbnRfc3VtbWFyeUIaChhfbWNwX2ZpbGVfc3lzdGVtX29wdGlvbnMisgIKDVNhbmRib3hQb2xpY3kSDAoEdHlwZRgBIAEoBRIbCg5uZXR3b3JrX2FjY2VzcxgCIAEoCEgAiAEBEiIKGmFkZGl0aW9uYWxfcmVhZHdyaXRlX3BhdGhzGAMgAygJEiEKGWFkZGl0aW9uYWxfcmVhZG9ubHlfcGF0aHMYBCADKAkSHQoQZGVidWdfb3V0cHV0X2RpchgFIAEoCUgBiAEBEh0KEGJsb2NrX2dpdF93cml0ZXMYBiABKAhIAogBARIeChFkaXNhYmxlX3RtcF93cml0ZRgHIAEoCEgDiAEBQhEKD19uZXR3b3JrX2FjY2Vzc0ITChFfZGVidWdfb3V0cHV0X2RpckITChFfYmxvY2tfZ2l0X3dyaXRlc0IUChJfZGlzYWJsZV90bXBfd3JpdGUi7wEKDVNlbGVjdGVkSW1hZ2USDAoEdXVpZBgCIAEoCRIMCgRwYXRoGAMgASgJEjQKCWRpbWVuc2lvbhgEIAEoCzIhLmFnZW50LnYxLlNlbGVjdGVkSW1hZ2VfRGltZW5zaW9uEhEKCW1pbWVfdHlwZRgHIAEoCRIRCgdibG9iX2lkGAEgASgMSAASDgoEZGF0YRgIIAEoDEgAEkMKEWJsb2JfaWRfd2l0aF9kYXRhGAkgASgLMiYuYWdlbnQudjEuU2VsZWN0ZWRJbWFnZV9CbG9iSWRXaXRoRGF0YUgAQhEKD2RhdGFfb3JfYmxvYl9pZCI9ChxTZWxlY3RlZEltYWdlX0Jsb2JJZFdpdGhEYXRhEg8KB2Jsb2JfaWQYASABKAwSDAoEZGF0YRgCIAEoDCI4ChdTZWxlY3RlZEltYWdlX0RpbWVuc2lvbhINCgV3aWR0aBgBIAEoBRIOCgZoZWlnaHQYAiABKAUiSQoRRXh0cmFDb250ZXh0RW50cnkSDgoEZGF0YRgBIAEoCUgAEhEKB2Jsb2JfaWQYAiABKAxIAEIRCg9kYXRhX29yX2Jsb2JfaWQiWwoMU2VsZWN0ZWRGaWxlEg8KB2NvbnRlbnQYASABKAkSDAoEcGF0aBgCIAEoCRIaCg1yZWxhdGl2ZV9wYXRoGAMgASgJSACIAQFCEAoOX3JlbGF0aXZlX3BhdGgihAEKFVNlbGVjdGVkQ29kZVNlbGVjdGlvbhIPCgdjb250ZW50GAEgASgJEgwKBHBhdGgYAiABKAkSGgoNcmVsYXRpdmVfcGF0aBgDIAEoCUgAiAEBEh4KBXJhbmdlGAQgASgLMg8uYWdlbnQudjEuUmFuZ2VCEAoOX3JlbGF0aXZlX3BhdGgiXQoQU2VsZWN0ZWRUZXJtaW5hbBIPCgdjb250ZW50GAEgASgJEhIKBXRpdGxlGAIgASgJSACIAQESEQoEcGF0aBgDIAEoCUgBiAEBQggKBl90aXRsZUIHCgVfcGF0aCKGAQoZU2VsZWN0ZWRUZXJtaW5hbFNlbGVjdGlvbhIPCgdjb250ZW50GAEgASgJEhIKBXRpdGxlGAIgASgJSACIAQESEQoEcGF0aBgDIAEoCUgBiAEBEh4KBXJhbmdlGAQgASgLMg8uYWdlbnQudjEuUmFuZ2VCCAoGX3RpdGxlQgcKBV9wYXRoIoMBCg5TZWxlY3RlZEZvbGRlchIMCgRwYXRoGAEgASgJEhoKDXJlbGF0aXZlX3BhdGgYAiABKAlIAIgBARI1Cg5kaXJlY3RvcnlfdHJlZRgDIAEoCzIdLmFnZW50LnYxLkxzRGlyZWN0b3J5VHJlZU5vZGVCEAoOX3JlbGF0aXZlX3BhdGginwEKFFNlbGVjdGVkRXh0ZXJuYWxMaW5rEgsKA3VybBgBIAEoCRIMCgR1dWlkGAIgASgJEhgKC3BkZl9jb250ZW50GAMgASgJSACIAQESEwoGaXNfcGRmGAQgASgISAGIAQESFQoIZmlsZW5hbWUYBSABKAlIAogBAUIOCgxfcGRmX2NvbnRlbnRCCQoHX2lzX3BkZkILCglfZmlsZW5hbWUiOAoSU2VsZWN0ZWRDdXJzb3JSdWxlEiIKBHJ1bGUYASABKAsyFC5hZ2VudC52MS5DdXJzb3JSdWxlIiIKD1NlbGVjdGVkR2l0RGlmZhIPCgdjb250ZW50GAEgASgJIjIKH1NlbGVjdGVkR2l0RGlmZkZyb21CcmFuY2hUb01haW4SDwoHY29udGVudBgBIAEoCSJpChFTZWxlY3RlZEdpdENvbW1pdBILCgNzaGEYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIYCgtkZXNjcmlwdGlvbhgDIAEoCUgAiAEBEgwKBGRpZmYYBCABKAlCDgoMX2Rlc2NyaXB0aW9uIt0BChNTZWxlY3RlZFB1bGxSZXF1ZXN0Eg4KBm51bWJlchgBIAEoBRILCgN1cmwYAiABKAkSEgoFdGl0bGUYAyABKAlIAIgBARITCgtmb2xkZXJfcGF0aBgEIAEoCRIZCgxzdW1tYXJ5X2pzb24YBSABKAlIAYgBARIYCgtkZXNjcmlwdGlvbhgGIAEoCUgCiAEBEhQKB2Jsb2JfaWQYByABKAxIA4gBAUIICgZfdGl0bGVCDwoNX3N1bW1hcnlfanNvbkIOCgxfZGVzY3JpcHRpb25CCgoIX2Jsb2JfaWQiswEKGlNlbGVjdGVkR2l0UFJEaWZmU2VsZWN0aW9uEg4KBnByX3VybBgBIAEoCRIRCglmaWxlX3BhdGgYAiABKAkSEgoKc3RhcnRfbGluZRgDIAEoBRIQCghlbmRfbGluZRgEIAEoBRIZCgxkaWZmX2NvbnRlbnQYBSABKAlIAIgBARIUCgdibG9iX2lkGAYgASgMSAGIAQFCDwoNX2RpZmZfY29udGVudEIKCghfYmxvYl9pZCI2ChVTZWxlY3RlZEN1cnNvckNvbW1hbmQSDAoEbmFtZRgBIAEoCRIPCgdjb250ZW50GAIgASgJIjUKFVNlbGVjdGVkRG9jdW1lbnRhdGlvbhIOCgZkb2NfaWQYASABKAkSDAoEbmFtZRgCIAEoCSIyChBTZWxlY3RlZFBhc3RDaGF0EhAKCGFnZW50X2lkGAEgASgJEgwKBG5hbWUYAiABKAkiqwEKCUNhbGxGcmFtZRIaCg1mdW5jdGlvbl9uYW1lGAEgASgJSACIAQESEAoDdXJsGAIgASgJSAGIAQESGAoLbGluZV9udW1iZXIYAyABKAVIAogBARIaCg1jb2x1bW5fbnVtYmVyGAQgASgFSAOIAQFCEAoOX2Z1bmN0aW9uX25hbWVCBgoEX3VybEIOCgxfbGluZV9udW1iZXJCEAoOX2NvbHVtbl9udW1iZXIiaAoKU3RhY2tUcmFjZRIoCgtjYWxsX2ZyYW1lcxgBIAMoCzITLmFnZW50LnYxLkNhbGxGcmFtZRIcCg9yYXdfc3RhY2tfdHJhY2UYAiABKAlIAIgBAUISChBfcmF3X3N0YWNrX3RyYWNlIuQBChJTZWxlY3RlZENvbnNvbGVMb2cSDwoHbWVzc2FnZRgBIAEoCRIRCgl0aW1lc3RhbXAYAiABKAESDQoFbGV2ZWwYAyABKAkSEwoLY2xpZW50X25hbWUYBCABKAkSEgoKc2Vzc2lvbl9pZBgFIAEoCRIuCgtzdGFja190cmFjZRgGIAEoCzIULmFnZW50LnYxLlN0YWNrVHJhY2VIAIgBARIdChBvYmplY3RfZGF0YV9qc29uGAcgASgJSAGIAQFCDgoMX3N0YWNrX3RyYWNlQhMKEV9vYmplY3RfZGF0YV9qc29uIroBChFTZWxlY3RlZFVJRWxlbWVudBIPCgdlbGVtZW50GAEgASgJEg0KBXhwYXRoGAIgASgJEhQKDHRleHRfY29udGVudBgDIAEoCRINCgVleHRyYRgEIAEoCRIWCgljb21wb25lbnQYBSABKAlIAIgBARIhChRjb21wb25lbnRfcHJvcHNfanNvbhgGIAEoCUgBiAEBQgwKCl9jb21wb25lbnRCFwoVX2NvbXBvbmVudF9wcm9wc19qc29uIiAKEFNlbGVjdGVkU3ViYWdlbnQSDAoEbmFtZRgBIAEoCSKCCgoPU2VsZWN0ZWRDb250ZXh0EjAKD3NlbGVjdGVkX2ltYWdlcxgBIAMoCzIXLmFnZW50LnYxLlNlbGVjdGVkSW1hZ2USPAoSaW52b2NhdGlvbl9jb250ZXh0GAIgASgLMhsuYWdlbnQudjEuSW52b2NhdGlvbkNvbnRleHRIAIgBARIVCg1leHRyYV9jb250ZXh0GAMgAygJEjoKFWV4dHJhX2NvbnRleHRfZW50cmllcxgQIAMoCzIbLmFnZW50LnYxLkV4dHJhQ29udGV4dEVudHJ5EiUKBWZpbGVzGAQgAygLMhYuYWdlbnQudjEuU2VsZWN0ZWRGaWxlEjgKD2NvZGVfc2VsZWN0aW9ucxgFIAMoCzIfLmFnZW50LnYxLlNlbGVjdGVkQ29kZVNlbGVjdGlvbhItCgl0ZXJtaW5hbHMYBiADKAsyGi5hZ2VudC52MS5TZWxlY3RlZFRlcm1pbmFsEkAKE3Rlcm1pbmFsX3NlbGVjdGlvbnMYByADKAsyIy5hZ2VudC52MS5TZWxlY3RlZFRlcm1pbmFsU2VsZWN0aW9uEikKB2ZvbGRlcnMYCCADKAsyGC5hZ2VudC52MS5TZWxlY3RlZEZvbGRlchI2Cg5leHRlcm5hbF9saW5rcxgJIAMoCzIeLmFnZW50LnYxLlNlbGVjdGVkRXh0ZXJuYWxMaW5rEjIKDGN1cnNvcl9ydWxlcxgKIAMoCzIcLmFnZW50LnYxLlNlbGVjdGVkQ3Vyc29yUnVsZRIwCghnaXRfZGlmZhgSIAEoCzIZLmFnZW50LnYxLlNlbGVjdGVkR2l0RGlmZkgBiAEBElQKHGdpdF9kaWZmX2Zyb21fYnJhbmNoX3RvX21haW4YCyABKAsyKS5hZ2VudC52MS5TZWxlY3RlZEdpdERpZmZGcm9tQnJhbmNoVG9NYWluSAKIAQESOAoPY3Vyc29yX2NvbW1hbmRzGAwgAygLMh8uYWdlbnQudjEuU2VsZWN0ZWRDdXJzb3JDb21tYW5kEjcKDmRvY3VtZW50YXRpb25zGA0gAygLMh8uYWdlbnQudjEuU2VsZWN0ZWREb2N1bWVudGF0aW9uEjAKC3VpX2VsZW1lbnRzGA4gAygLMhsuYWdlbnQudjEuU2VsZWN0ZWRVSUVsZW1lbnQSMgoMY29uc29sZV9sb2dzGA8gAygLMhwuYWdlbnQudjEuU2VsZWN0ZWRDb25zb2xlTG9nEjAKC2dpdF9jb21taXRzGBEgAygLMhsuYWdlbnQudjEuU2VsZWN0ZWRHaXRDb21taXQSLgoKcGFzdF9jaGF0cxgTIAMoCzIaLmFnZW50LnYxLlNlbGVjdGVkUGFzdENoYXQSRAoWZ2l0X3ByX2RpZmZfc2VsZWN0aW9ucxgUIAMoCzIkLmFnZW50LnYxLlNlbGVjdGVkR2l0UFJEaWZmU2VsZWN0aW9uEj0KFnNlbGVjdGVkX3B1bGxfcmVxdWVzdHMYFSADKAsyHS5hZ2VudC52MS5TZWxlY3RlZFB1bGxSZXF1ZXN0EjYKEnNlbGVjdGVkX3N1YmFnZW50cxgWIAMoCzIaLmFnZW50LnYxLlNlbGVjdGVkU3ViYWdlbnRCFQoTX2ludm9jYXRpb25fY29udGV4dEILCglfZ2l0X2RpZmZCHwodX2dpdF9kaWZmX2Zyb21fYnJhbmNoX3RvX21haW4i5QEKEUludm9jYXRpb25Db250ZXh0Ej8KDHNsYWNrX3RocmVhZBgBIAEoCzInLmFnZW50LnYxLkludm9jYXRpb25Db250ZXh0X1NsYWNrVGhyZWFkSAASOQoJZ2l0aHViX3ByGAIgASgLMiQuYWdlbnQudjEuSW52b2NhdGlvbkNvbnRleHRfR2l0aHViUFJIABI5CglpZGVfc3RhdGUYAyABKAsyJC5hZ2VudC52MS5JbnZvY2F0aW9uQ29udGV4dF9JZGVTdGF0ZUgAEhEKB2Jsb2JfaWQYCiABKAxIAEIGCgRkYXRhIrsBCh1JbnZvY2F0aW9uQ29udGV4dF9TbGFja1RocmVhZBIOCgZ0aHJlYWQYASABKAkSGQoMY2hhbm5lbF9uYW1lGAIgASgJSACIAQESHAoPY2hhbm5lbF9wdXJwb3NlGAMgASgJSAGIAQESGgoNY2hhbm5lbF90b3BpYxgEIAEoCUgCiAEBQg8KDV9jaGFubmVsX25hbWVCEgoQX2NoYW5uZWxfcHVycG9zZUIQCg5fY2hhbm5lbF90b3BpYyJ8ChpJbnZvY2F0aW9uQ29udGV4dF9HaXRodWJQUhINCgV0aXRsZRgBIAEoCRITCgtkZXNjcmlwdGlvbhgCIAEoCRIQCghjb21tZW50cxgDIAEoCRIYCgtjaV9mYWlsdXJlcxgEIAEoCUgAiAEBQg4KDF9jaV9mYWlsdXJlcyL+AQoaSW52b2NhdGlvbkNvbnRleHRfSWRlU3RhdGUSQAoNdmlzaWJsZV9maWxlcxgBIAMoCzIpLmFnZW50LnYxLkludm9jYXRpb25Db250ZXh0X0lkZVN0YXRlX0ZpbGUSSAoVcmVjZW50bHlfdmlld2VkX2ZpbGVzGAIgAygLMikuYWdlbnQudjEuSW52b2NhdGlvbkNvbnRleHRfSWRlU3RhdGVfRmlsZRJUChRjdXJyZW50bHlfdmlld2VkX3BycxgDIAMoCzI2LmFnZW50LnYxLkludm9jYXRpb25Db250ZXh0X0lkZVN0YXRlX1ZpZXdlZFB1bGxSZXF1ZXN0Io4CCh9JbnZvY2F0aW9uQ29udGV4dF9JZGVTdGF0ZV9GaWxlEgwKBHBhdGgYASABKAkSGgoNcmVsYXRpdmVfcGF0aBgCIAEoCUgAiAEBElYKD2N1cnNvcl9wb3NpdGlvbhgDIAEoCzI4LmFnZW50LnYxLkludm9jYXRpb25Db250ZXh0X0lkZVN0YXRlX0ZpbGVfQ3Vyc29yUG9zaXRpb25IAYgBARITCgt0b3RhbF9saW5lcxgEIAEoBRIbCg5hY3RpdmVfY29tbWFuZBgFIAEoCUgCiAEBQhAKDl9yZWxhdGl2ZV9wYXRoQhIKEF9jdXJzb3JfcG9zaXRpb25CEQoPX2FjdGl2ZV9jb21tYW5kIkwKLkludm9jYXRpb25Db250ZXh0X0lkZVN0YXRlX0ZpbGVfQ3Vyc29yUG9zaXRpb24SDAoEbGluZRgBIAEoBRIMCgR0ZXh0GAIgASgJIukBCixJbnZvY2F0aW9uQ29udGV4dF9JZGVTdGF0ZV9WaWV3ZWRQdWxsUmVxdWVzdBIOCgZudW1iZXIYASABKAUSCwoDdXJsGAIgASgJEhIKBXRpdGxlGAMgASgJSACIAQESGAoLZm9sZGVyX3BhdGgYBCABKAlIAYgBARIZCgxzdW1tYXJ5X2pzb24YBSABKAlIAogBARIYCgtkZXNjcmlwdGlvbhgGIAEoCUgDiAEBQggKBl90aXRsZUIOCgxfZm9sZGVyX3BhdGhCDwoNX3N1bW1hcnlfanNvbkIOCgxfZGVzY3JpcHRpb24iSAoWU2V0dXBWbUVudmlyb25tZW50QXJncxIXCg9pbnN0YWxsX2NvbW1hbmQYAiABKAkSFQoNc3RhcnRfY29tbWFuZBgDIAEoCSJcChhTZXR1cFZtRW52aXJvbm1lbnRSZXN1bHQSNgoHc3VjY2VzcxgBIAEoCzIjLmFnZW50LnYxLlNldHVwVm1FbnZpcm9ubWVudFN1Y2Nlc3NIAEIICgZyZXN1bHQiGwoZU2V0dXBWbUVudmlyb25tZW50U3VjY2VzcyKAAQoaU2V0dXBWbUVudmlyb25tZW50VG9vbENhbGwSLgoEYXJncxgBIAEoCzIgLmFnZW50LnYxLlNldHVwVm1FbnZpcm9ubWVudEFyZ3MSMgoGcmVzdWx0GAIgASgLMiIuYWdlbnQudjEuU2V0dXBWbUVudmlyb25tZW50UmVzdWx0IsABChlTaGVsbENvbW1hbmRQYXJzaW5nUmVzdWx0EhYKDnBhcnNpbmdfZmFpbGVkGAEgASgIElIKE2V4ZWN1dGFibGVfY29tbWFuZHMYAiADKAsyNS5hZ2VudC52MS5TaGVsbENvbW1hbmRQYXJzaW5nUmVzdWx0X0V4ZWN1dGFibGVDb21tYW5kEhUKDWhhc19yZWRpcmVjdHMYAyABKAgSIAoYaGFzX2NvbW1hbmRfc3Vic3RpdHV0aW9uGAQgASgIIk0KLlNoZWxsQ29tbWFuZFBhcnNpbmdSZXN1bHRfRXhlY3V0YWJsZUNvbW1hbmRBcmcSDAoEdHlwZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKWAQorU2hlbGxDb21tYW5kUGFyc2luZ1Jlc3VsdF9FeGVjdXRhYmxlQ29tbWFuZBIMCgRuYW1lGAEgASgJEkYKBGFyZ3MYAiADKAsyOC5hZ2VudC52MS5TaGVsbENvbW1hbmRQYXJzaW5nUmVzdWx0X0V4ZWN1dGFibGVDb21tYW5kQXJnEhEKCWZ1bGxfdGV4dBgDIAEoCSKIBAoJU2hlbGxBcmdzEg8KB2NvbW1hbmQYASABKAkSGQoRd29ya2luZ19kaXJlY3RvcnkYAiABKAkSDwoHdGltZW91dBgDIAEoBRIUCgx0b29sX2NhbGxfaWQYBCABKAkSFwoPc2ltcGxlX2NvbW1hbmRzGAUgAygJEhoKEmhhc19pbnB1dF9yZWRpcmVjdBgGIAEoCBIbChNoYXNfb3V0cHV0X3JlZGlyZWN0GAcgASgIEjsKDnBhcnNpbmdfcmVzdWx0GAggASgLMiMuYWdlbnQudjEuU2hlbGxDb21tYW5kUGFyc2luZ1Jlc3VsdBI+ChhyZXF1ZXN0ZWRfc2FuZGJveF9wb2xpY3kYCSABKAsyFy5hZ2VudC52MS5TYW5kYm94UG9saWN5SACIAQESKAobZmlsZV9vdXRwdXRfdGhyZXNob2xkX2J5dGVzGAogASgESAGIAQESFQoNaXNfYmFja2dyb3VuZBgLIAEoCBIVCg1za2lwX2FwcHJvdmFsGAwgASgIEhgKEHRpbWVvdXRfYmVoYXZpb3IYDSABKAUSGQoMaGFyZF90aW1lb3V0GA4gASgFSAKIAQFCGwoZX3JlcXVlc3RlZF9zYW5kYm94X3BvbGljeUIeChxfZmlsZV9vdXRwdXRfdGhyZXNob2xkX2J5dGVzQg8KDV9oYXJkX3RpbWVvdXQi+gMKC1NoZWxsUmVzdWx0EjQKDnNhbmRib3hfcG9saWN5GGUgASgLMhcuYWdlbnQudjEuU2FuZGJveFBvbGljeUgBiAEBEhoKDWlzX2JhY2tncm91bmQYZiABKAhIAogBARIdChB0ZXJtaW5hbHNfZm9sZGVyGGcgASgJSAOIAQESEAoDcGlkGGggASgNSASIAQESKQoHc3VjY2VzcxgBIAEoCzIWLmFnZW50LnYxLlNoZWxsU3VjY2Vzc0gAEikKB2ZhaWx1cmUYAiABKAsyFi5hZ2VudC52MS5TaGVsbEZhaWx1cmVIABIpCgd0aW1lb3V0GAMgASgLMhYuYWdlbnQudjEuU2hlbGxUaW1lb3V0SAASKwoIcmVqZWN0ZWQYBCABKAsyFy5hZ2VudC52MS5TaGVsbFJlamVjdGVkSAASMAoLc3Bhd25fZXJyb3IYBSABKAsyGS5hZ2VudC52MS5TaGVsbFNwYXduRXJyb3JIABI8ChFwZXJtaXNzaW9uX2RlbmllZBgHIAEoCzIfLmFnZW50LnYxLlNoZWxsUGVybWlzc2lvbkRlbmllZEgAQggKBnJlc3VsdEIRCg9fc2FuZGJveF9wb2xpY3lCEAoOX2lzX2JhY2tncm91bmRCEwoRX3Rlcm1pbmFsc19mb2xkZXJCBgoEX3BpZCIhChFTaGVsbFN0cmVhbVN0ZG91dBIMCgRkYXRhGAEgASgJIiEKEVNoZWxsU3RyZWFtU3RkZXJyEgwKBGRhdGEYASABKAkitQEKD1NoZWxsU3RyZWFtRXhpdBIMCgRjb2RlGAEgASgNEgsKA2N3ZBgCIAEoCRI2Cg9vdXRwdXRfbG9jYXRpb24YAyABKAsyGC5hZ2VudC52MS5PdXRwdXRMb2NhdGlvbkgAiAEBEg8KB2Fib3J0ZWQYBCABKAgSGQoMYWJvcnRfcmVhc29uGAUgASgFSAGIAQFCEgoQX291dHB1dF9sb2NhdGlvbkIPCg1fYWJvcnRfcmVhc29uIlsKEFNoZWxsU3RyZWFtU3RhcnQSNAoOc2FuZGJveF9wb2xpY3kYASABKAsyFy5hZ2VudC52MS5TYW5kYm94UG9saWN5SACIAQFCEQoPX3NhbmRib3hfcG9saWN5IpkBChdTaGVsbFN0cmVhbUJhY2tncm91bmRlZBIQCghzaGVsbF9pZBgBIAEoDRIPCgdjb21tYW5kGAIgASgJEhkKEXdvcmtpbmdfZGlyZWN0b3J5GAMgASgJEhAKA3BpZBgEIAEoDUgAiAEBEhcKCm1zX3RvX3dhaXQYBSABKAVIAYgBAUIGCgRfcGlkQg0KC19tc190b193YWl0IvICCgtTaGVsbFN0cmVhbRItCgZzdGRvdXQYASABKAsyGy5hZ2VudC52MS5TaGVsbFN0cmVhbVN0ZG91dEgAEi0KBnN0ZGVychgCIAEoCzIbLmFnZW50LnYxLlNoZWxsU3RyZWFtU3RkZXJySAASKQoEZXhpdBgDIAEoCzIZLmFnZW50LnYxLlNoZWxsU3RyZWFtRXhpdEgAEisKBXN0YXJ0GAQgASgLMhouYWdlbnQudjEuU2hlbGxTdHJlYW1TdGFydEgAEisKCHJlamVjdGVkGAUgASgLMhcuYWdlbnQudjEuU2hlbGxSZWplY3RlZEgAEjwKEXBlcm1pc3Npb25fZGVuaWVkGAYgASgLMh8uYWdlbnQudjEuU2hlbGxQZXJtaXNzaW9uRGVuaWVkSAASOQoMYmFja2dyb3VuZGVkGAcgASgLMiEuYWdlbnQudjEuU2hlbGxTdHJlYW1CYWNrZ3JvdW5kZWRIAEIHCgVldmVudCJLCg5PdXRwdXRMb2NhdGlvbhIRCglmaWxlX3BhdGgYASABKAkSEgoKc2l6ZV9ieXRlcxgCIAEoAxISCgpsaW5lX2NvdW50GAMgASgDIv8CCgxTaGVsbFN1Y2Nlc3MSDwoHY29tbWFuZBgBIAEoCRIZChF3b3JraW5nX2RpcmVjdG9yeRgCIAEoCRIRCglleGl0X2NvZGUYAyABKAUSDgoGc2lnbmFsGAQgASgJEg4KBnN0ZG91dBgFIAEoCRIOCgZzdGRlcnIYBiABKAkSFgoOZXhlY3V0aW9uX3RpbWUYByABKAUSNgoPb3V0cHV0X2xvY2F0aW9uGAggASgLMhguYWdlbnQudjEuT3V0cHV0TG9jYXRpb25IAIgBARIVCghzaGVsbF9pZBgJIAEoDUgBiAEBEh8KEmludGVybGVhdmVkX291dHB1dBgKIAEoCUgCiAEBEhAKA3BpZBgLIAEoDUgDiAEBEhcKCm1zX3RvX3dhaXQYDCABKAVIBIgBAUISChBfb3V0cHV0X2xvY2F0aW9uQgsKCV9zaGVsbF9pZEIVChNfaW50ZXJsZWF2ZWRfb3V0cHV0QgYKBF9waWRCDQoLX21zX3RvX3dhaXQi1gIKDFNoZWxsRmFpbHVyZRIPCgdjb21tYW5kGAEgASgJEhkKEXdvcmtpbmdfZGlyZWN0b3J5GAIgASgJEhEKCWV4aXRfY29kZRgDIAEoBRIOCgZzaWduYWwYBCABKAkSDgoGc3Rkb3V0GAUgASgJEg4KBnN0ZGVychgGIAEoCRIWCg5leGVjdXRpb25fdGltZRgHIAEoBRI2Cg9vdXRwdXRfbG9jYXRpb24YCCABKAsyGC5hZ2VudC52MS5PdXRwdXRMb2NhdGlvbkgAiAEBEh8KEmludGVybGVhdmVkX291dHB1dBgJIAEoCUgBiAEBEhkKDGFib3J0X3JlYXNvbhgKIAEoBUgCiAEBEg8KB2Fib3J0ZWQYCyABKAhCEgoQX291dHB1dF9sb2NhdGlvbkIVChNfaW50ZXJsZWF2ZWRfb3V0cHV0Qg8KDV9hYm9ydF9yZWFzb24iTgoMU2hlbGxUaW1lb3V0Eg8KB2NvbW1hbmQYASABKAkSGQoRd29ya2luZ19kaXJlY3RvcnkYAiABKAkSEgoKdGltZW91dF9tcxgDIAEoBSJgCg1TaGVsbFJlamVjdGVkEg8KB2NvbW1hbmQYASABKAkSGQoRd29ya2luZ19kaXJlY3RvcnkYAiABKAkSDgoGcmVhc29uGAMgASgJEhMKC2lzX3JlYWRvbmx5GAQgASgIImcKFVNoZWxsUGVybWlzc2lvbkRlbmllZBIPCgdjb21tYW5kGAEgASgJEhkKEXdvcmtpbmdfZGlyZWN0b3J5GAIgASgJEg0KBWVycm9yGAMgASgJEhMKC2lzX3JlYWRvbmx5GAQgASgIIkwKD1NoZWxsU3Bhd25FcnJvchIPCgdjb21tYW5kGAEgASgJEhkKEXdvcmtpbmdfZGlyZWN0b3J5GAIgASgJEg0KBWVycm9yGAMgASgJIkAKElNoZWxsUGFydGlhbFJlc3VsdBIUCgxzdGRvdXRfZGVsdGEYASABKAkSFAoMc3RkZXJyX2RlbHRhGAIgASgJIlkKDVNoZWxsVG9vbENhbGwSIQoEYXJncxgBIAEoCzITLmFnZW50LnYxLlNoZWxsQXJncxIlCgZyZXN1bHQYAiABKAsyFS5hZ2VudC52MS5TaGVsbFJlc3VsdCIrChhTaGVsbFRvb2xDYWxsU3Rkb3V0RGVsdGESDwoHY29udGVudBgBIAEoCSIrChhTaGVsbFRvb2xDYWxsU3RkZXJyRGVsdGESDwoHY29udGVudBgBIAEoCSKJAQoSU2hlbGxUb29sQ2FsbERlbHRhEjQKBnN0ZG91dBgBIAEoCzIiLmFnZW50LnYxLlNoZWxsVG9vbENhbGxTdGRvdXREZWx0YUgAEjQKBnN0ZGVychgCIAEoCzIiLmFnZW50LnYxLlNoZWxsVG9vbENhbGxTdGRlcnJEZWx0YUgAQgcKBWRlbHRhIu0BCgxTdWJhZ2VudFR5cGUSOAoLdW5zcGVjaWZpZWQYASABKAsyIS5hZ2VudC52MS5TdWJhZ2VudFR5cGVVbnNwZWNpZmllZEgAEjkKDGNvbXB1dGVyX3VzZRgCIAEoCzIhLmFnZW50LnYxLlN1YmFnZW50VHlwZUNvbXB1dGVyVXNlSAASLgoGY3VzdG9tGAMgASgLMhwuYWdlbnQudjEuU3ViYWdlbnRUeXBlQ3VzdG9tSAASMAoHZXhwbG9yZRgEIAEoCzIdLmFnZW50LnYxLlN1YmFnZW50VHlwZUV4cGxvcmVIAEIGCgR0eXBlIhkKF1N1YmFnZW50VHlwZVVuc3BlY2lmaWVkIhkKF1N1YmFnZW50VHlwZUNvbXB1dGVyVXNlIhUKE1N1YmFnZW50VHlwZUV4cGxvcmUiIgoSU3ViYWdlbnRUeXBlQ3VzdG9tEgwKBG5hbWUYASABKAkijQEKDkN1c3RvbVN1YmFnZW50EhEKCWZ1bGxfcGF0aBgBIAEoCRIMCgRuYW1lGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEg0KBXRvb2xzGAQgAygJEg0KBW1vZGVsGAUgASgJEg4KBnByb21wdBgGIAEoCRIXCg9wZXJtaXNzaW9uX21vZGUYByABKAUiaAoOU3dpdGNoTW9kZUFyZ3MSFgoOdGFyZ2V0X21vZGVfaWQYASABKAkSGAoLZXhwbGFuYXRpb24YAiABKAlIAIgBARIUCgx0b29sX2NhbGxfaWQYAyABKAlCDgoMX2V4cGxhbmF0aW9uIqoBChBTd2l0Y2hNb2RlUmVzdWx0Ei4KB3N1Y2Nlc3MYASABKAsyGy5hZ2VudC52MS5Td2l0Y2hNb2RlU3VjY2Vzc0gAEioKBWVycm9yGAIgASgLMhkuYWdlbnQudjEuU3dpdGNoTW9kZUVycm9ySAASMAoIcmVqZWN0ZWQYAyABKAsyHC5hZ2VudC52MS5Td2l0Y2hNb2RlUmVqZWN0ZWRIAEIICgZyZXN1bHQiPQoRU3dpdGNoTW9kZVN1Y2Nlc3MSFAoMZnJvbV9tb2RlX2lkGAEgASgJEhIKCnRvX21vZGVfaWQYAiABKAkiIAoPU3dpdGNoTW9kZUVycm9yEg0KBWVycm9yGAEgASgJIiQKElN3aXRjaE1vZGVSZWplY3RlZBIOCgZyZWFzb24YASABKAkiaAoSU3dpdGNoTW9kZVRvb2xDYWxsEiYKBGFyZ3MYASABKAsyGC5hZ2VudC52MS5Td2l0Y2hNb2RlQXJncxIqCgZyZXN1bHQYAiABKAsyGi5hZ2VudC52MS5Td2l0Y2hNb2RlUmVzdWx0IkAKFlN3aXRjaE1vZGVSZXF1ZXN0UXVlcnkSJgoEYXJncxgBIAEoCzIYLmFnZW50LnYxLlN3aXRjaE1vZGVBcmdzIqkBChlTd2l0Y2hNb2RlUmVxdWVzdFJlc3BvbnNlEkAKCGFwcHJvdmVkGAEgASgLMiwuYWdlbnQudjEuU3dpdGNoTW9kZVJlcXVlc3RSZXNwb25zZV9BcHByb3ZlZEgAEkAKCHJlamVjdGVkGAIgASgLMiwuYWdlbnQudjEuU3dpdGNoTW9kZVJlcXVlc3RSZXNwb25zZV9SZWplY3RlZEgAQggKBnJlc3VsdCIkCiJTd2l0Y2hNb2RlUmVxdWVzdFJlc3BvbnNlX0FwcHJvdmVkIjQKIlN3aXRjaE1vZGVSZXF1ZXN0UmVzcG9uc2VfUmVqZWN0ZWQSDgoGcmVhc29uGAEgASgJInUKCFRvZG9JdGVtEgoKAmlkGAEgASgJEg8KB2NvbnRlbnQYAiABKAkSDgoGc3RhdHVzGAMgASgFEhIKCmNyZWF0ZWRfYXQYBCABKAMSEgoKdXBkYXRlZF9hdBgFIAEoAxIUCgxkZXBlbmRlbmNpZXMYBiADKAkiawoTVXBkYXRlVG9kb3NUb29sQ2FsbBInCgRhcmdzGAEgASgLMhkuYWdlbnQudjEuVXBkYXRlVG9kb3NBcmdzEisKBnJlc3VsdBgCIAEoCzIbLmFnZW50LnYxLlVwZGF0ZVRvZG9zUmVzdWx0IkMKD1VwZGF0ZVRvZG9zQXJncxIhCgV0b2RvcxgBIAMoCzISLmFnZW50LnYxLlRvZG9JdGVtEg0KBW1lcmdlGAIgASgIInsKEVVwZGF0ZVRvZG9zUmVzdWx0Ei8KB3N1Y2Nlc3MYASABKAsyHC5hZ2VudC52MS5VcGRhdGVUb2Rvc1N1Y2Nlc3NIABIrCgVlcnJvchgCIAEoCzIaLmFnZW50LnYxLlVwZGF0ZVRvZG9zRXJyb3JIAEIICgZyZXN1bHQiXwoSVXBkYXRlVG9kb3NTdWNjZXNzEiEKBXRvZG9zGAEgAygLMhIuYWdlbnQudjEuVG9kb0l0ZW0SEwoLdG90YWxfY291bnQYAiABKAUSEQoJd2FzX21lcmdlGAMgASgIIiEKEFVwZGF0ZVRvZG9zRXJyb3ISDQoFZXJyb3IYASABKAkiZQoRUmVhZFRvZG9zVG9vbENhbGwSJQoEYXJncxgBIAEoCzIXLmFnZW50LnYxLlJlYWRUb2Rvc0FyZ3MSKQoGcmVzdWx0GAIgASgLMhkuYWdlbnQudjEuUmVhZFRvZG9zUmVzdWx0IjkKDVJlYWRUb2Rvc0FyZ3MSFQoNc3RhdHVzX2ZpbHRlchgBIAMoBRIRCglpZF9maWx0ZXIYAiADKAkidQoPUmVhZFRvZG9zUmVzdWx0Ei0KB3N1Y2Nlc3MYASABKAsyGi5hZ2VudC52MS5SZWFkVG9kb3NTdWNjZXNzSAASKQoFZXJyb3IYAiABKAsyGC5hZ2VudC52MS5SZWFkVG9kb3NFcnJvckgAQggKBnJlc3VsdCJKChBSZWFkVG9kb3NTdWNjZXNzEiEKBXRvZG9zGAEgAygLMhIuYWdlbnQudjEuVG9kb0l0ZW0SEwoLdG90YWxfY291bnQYAiABKAUiHwoOUmVhZFRvZG9zRXJyb3ISDQoFZXJyb3IYASABKAkiSwoFUmFuZ2USIQoFc3RhcnQYASABKAsyEi5hZ2VudC52MS5Qb3NpdGlvbhIfCgNlbmQYAiABKAsyEi5hZ2VudC52MS5Qb3NpdGlvbiIoCghQb3NpdGlvbhIMCgRsaW5lGAEgASgNEg4KBmNvbHVtbhgCIAEoDSIYCgVFcnJvchIPCgdtZXNzYWdlGAEgASgJIjoKDVdlYlNlYXJjaEFyZ3MSEwoLc2VhcmNoX3Rlcm0YASABKAkSFAoMdG9vbF9jYWxsX2lkGAIgASgJIqYBCg9XZWJTZWFyY2hSZXN1bHQSLQoHc3VjY2VzcxgBIAEoCzIaLmFnZW50LnYxLldlYlNlYXJjaFN1Y2Nlc3NIABIpCgVlcnJvchgCIAEoCzIYLmFnZW50LnYxLldlYlNlYXJjaEVycm9ySAASLwoIcmVqZWN0ZWQYAyABKAsyGy5hZ2VudC52MS5XZWJTZWFyY2hSZWplY3RlZEgAQggKBnJlc3VsdCJEChBXZWJTZWFyY2hTdWNjZXNzEjAKCnJlZmVyZW5jZXMYASADKAsyHC5hZ2VudC52MS5XZWJTZWFyY2hSZWZlcmVuY2UiHwoOV2ViU2VhcmNoRXJyb3ISDQoFZXJyb3IYASABKAkiIwoRV2ViU2VhcmNoUmVqZWN0ZWQSDgoGcmVhc29uGAEgASgJIj8KEldlYlNlYXJjaFJlZmVyZW5jZRINCgV0aXRsZRgBIAEoCRILCgN1cmwYAiABKAkSDQoFY2h1bmsYAyABKAkiZQoRV2ViU2VhcmNoVG9vbENhbGwSJQoEYXJncxgBIAEoCzIXLmFnZW50LnYxLldlYlNlYXJjaEFyZ3MSKQoGcmVzdWx0GAIgASgLMhkuYWdlbnQudjEuV2ViU2VhcmNoUmVzdWx0Ij4KFVdlYlNlYXJjaFJlcXVlc3RRdWVyeRIlCgRhcmdzGAEgASgLMhcuYWdlbnQudjEuV2ViU2VhcmNoQXJncyKmAQoYV2ViU2VhcmNoUmVxdWVzdFJlc3BvbnNlEj8KCGFwcHJvdmVkGAEgASgLMisuYWdlbnQudjEuV2ViU2VhcmNoUmVxdWVzdFJlc3BvbnNlX0FwcHJvdmVkSAASPwoIcmVqZWN0ZWQYAiABKAsyKy5hZ2VudC52MS5XZWJTZWFyY2hSZXF1ZXN0UmVzcG9uc2VfUmVqZWN0ZWRIAEIICgZyZXN1bHQiIwohV2ViU2VhcmNoUmVxdWVzdFJlc3BvbnNlX0FwcHJvdmVkIjMKIVdlYlNlYXJjaFJlcXVlc3RSZXNwb25zZV9SZWplY3RlZBIOCgZyZWFzb24YASABKAkifwoJV3JpdGVBcmdzEgwKBHBhdGgYASABKAkSEQoJZmlsZV90ZXh0GAIgASgJEhQKDHRvb2xfY2FsbF9pZBgDIAEoCRInCh9yZXR1cm5fZmlsZV9jb250ZW50X2FmdGVyX3dyaXRlGAQgASgIEhIKCmZpbGVfYnl0ZXMYBSABKAwigAIKC1dyaXRlUmVzdWx0EikKB3N1Y2Nlc3MYASABKAsyFi5hZ2VudC52MS5Xcml0ZVN1Y2Nlc3NIABI8ChFwZXJtaXNzaW9uX2RlbmllZBgDIAEoCzIfLmFnZW50LnYxLldyaXRlUGVybWlzc2lvbkRlbmllZEgAEioKCG5vX3NwYWNlGAQgASgLMhYuYWdlbnQudjEuV3JpdGVOb1NwYWNlSAASJQoFZXJyb3IYBSABKAsyFC5hZ2VudC52MS5Xcml0ZUVycm9ySAASKwoIcmVqZWN0ZWQYBiABKAsyFy5hZ2VudC52MS5Xcml0ZVJlamVjdGVkSABCCAoGcmVzdWx0IooBCgxXcml0ZVN1Y2Nlc3MSDAoEcGF0aBgBIAEoCRIVCg1saW5lc19jcmVhdGVkGAIgASgFEhEKCWZpbGVfc2l6ZRgDIAEoBRIlChhmaWxlX2NvbnRlbnRfYWZ0ZXJfd3JpdGUYBCABKAlIAIgBAUIbChlfZmlsZV9jb250ZW50X2FmdGVyX3dyaXRlIm8KFVdyaXRlUGVybWlzc2lvbkRlbmllZBIMCgRwYXRoGAEgASgJEhEKCWRpcmVjdG9yeRgCIAEoCRIRCglvcGVyYXRpb24YAyABKAkSDQoFZXJyb3IYBCABKAkSEwoLaXNfcmVhZG9ubHkYBSABKAgiHAoMV3JpdGVOb1NwYWNlEgwKBHBhdGgYASABKAkiKQoKV3JpdGVFcnJvchIMCgRwYXRoGAEgASgJEg0KBWVycm9yGAIgASgJIi0KDVdyaXRlUmVqZWN0ZWQSDAoEcGF0aBgBIAEoCRIOCgZyZWFzb24YAiABKAkigwEKF0Jvb3RzdHJhcFN0YXRzaWdSZXF1ZXN0Eh4KEWlnbm9yZV9kZXZfc3RhdHVzGAEgASgISACIAQESHQoQb3BlcmF0aW5nX3N5c3RlbRgCIAEoBUgBiAEBQhQKEl9pZ25vcmVfZGV2X3N0YXR1c0ITChFfb3BlcmF0aW5nX3N5c3RlbSIOCgxQaW5nUmVzcG9uc2UitwEKC0V4ZWNSZXF1ZXN0Eg8KB2NvbW1hbmQYASABKAkSEAoDY3dkGAIgASgJSACIAQESDAoEYXJncxgDIAMoCRI7CgtlbnZpcm9ubWVudBgEIAMoCzImLmFnZW50LnYxLkV4ZWNSZXF1ZXN0LkVudmlyb25tZW50RW50cnkaMgoQRW52aXJvbm1lbnRFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBQgYKBF9jd2QioAEKDEV4ZWNSZXNwb25zZRItCgxzdGRvdXRfZXZlbnQYASABKAsyFS5hZ2VudC52MS5TdGRvdXRFdmVudEgAEi0KDHN0ZGVycl9ldmVudBgCIAEoCzIVLmFnZW50LnYxLlN0ZGVyckV2ZW50SAASKQoKZXhpdF9ldmVudBgDIAEoCzITLmFnZW50LnYxLkV4aXRFdmVudEgAQgcKBWV2ZW50IhsKC1N0ZG91dEV2ZW50EgwKBGRhdGEYASABKAkiGwoLU3RkZXJyRXZlbnQSDAoEZGF0YRgBIAEoCSIeCglFeGl0RXZlbnQSEQoJZXhpdF9jb2RlGAEgASgFIiMKE1JlYWRUZXh0RmlsZVJlcXVlc3QSDAoEcGF0aBgBIAEoCSInChRSZWFkVGV4dEZpbGVSZXNwb25zZRIPCgdjb250ZW50GAEgASgJIjUKFFdyaXRlVGV4dEZpbGVSZXF1ZXN0EgwKBHBhdGgYASABKAkSDwoHY29udGVudBgCIAEoCSIXChVXcml0ZVRleHRGaWxlUmVzcG9uc2UiJQoVUmVhZEJpbmFyeUZpbGVSZXF1ZXN0EgwKBHBhdGgYASABKAkiKQoWUmVhZEJpbmFyeUZpbGVSZXNwb25zZRIPCgdjb250ZW50GAEgASgMIjcKFldyaXRlQmluYXJ5RmlsZVJlcXVlc3QSDAoEcGF0aBgBIAEoCRIPCgdjb250ZW50GAIgASgMIhkKF1dyaXRlQmluYXJ5RmlsZVJlc3BvbnNlIkUKHkdldFdvcmtzcGFjZUNoYW5nZXNIYXNoUmVxdWVzdBIRCglyb290X3BhdGgYASABKAkSEAoIYmFzZV9yZWYYAiABKAkiLwofR2V0V29ya3NwYWNlQ2hhbmdlc0hhc2hSZXNwb25zZRIMCgRoYXNoGAEgASgJIlAKH1JlZnJlc2hHaXRodWJBY2Nlc3NUb2tlblJlcXVlc3QSGwoTZ2l0aHViX2FjY2Vzc190b2tlbhgBIAEoCRIQCghob3N0bmFtZRgCIAEoCSIiCiBSZWZyZXNoR2l0aHViQWNjZXNzVG9rZW5SZXNwb25zZSJXCh1XYXJtUmVtb3RlQWNjZXNzU2VydmVyUmVxdWVzdBIOCgZjb21taXQYASABKAkSDAoEcG9ydBgCIAEoBRIYChBjb25uZWN0aW9uX3Rva2VuGAMgASgJIiAKHldhcm1SZW1vdGVBY2Nlc3NTZXJ2ZXJSZXNwb25zZSIWChRMaXN0QXJ0aWZhY3RzUmVxdWVzdCKKAgoWQXJ0aWZhY3RVcGxvYWRNZXRhZGF0YRIVCg1hYnNvbHV0ZV9wYXRoGAEgASgJEhIKCnNpemVfYnl0ZXMYAiABKAQSGgoSdXBkYXRlZF9hdF91bml4X21zGAMgASgDEg4KBnN0YXR1cxgEIAEoBRIWCg5ieXRlc191cGxvYWRlZBgFIAEoBBISCgpsYXN0X2Vycm9yGAYgASgJEhcKD3VwbG9hZF9hdHRlbXB0cxgHIAEoDRIfChdsYXN0X3N0YXJ0ZWRfYXRfdW5peF9tcxgIIAEoAxIgChhsYXN0X2ZpbmlzaGVkX2F0X3VuaXhfbXMYCSABKAMSEQoJdXBsb2FkX2lkGAogASgJIkwKFUxpc3RBcnRpZmFjdHNSZXNwb25zZRIzCglhcnRpZmFjdHMYASADKAsyIC5hZ2VudC52MS5BcnRpZmFjdFVwbG9hZE1ldGFkYXRhIk4KFlVwbG9hZEFydGlmYWN0c1JlcXVlc3QSNAoHdXBsb2FkcxgBIAMoCzIjLmFnZW50LnYxLkFydGlmYWN0VXBsb2FkSW5zdHJ1Y3Rpb24i1wIKGUFydGlmYWN0VXBsb2FkSW5zdHJ1Y3Rpb24SFQoNYWJzb2x1dGVfcGF0aBgBIAEoCRISCgp1cGxvYWRfdXJsGAIgASgJEg4KBm1ldGhvZBgDIAEoCRJBCgdoZWFkZXJzGAQgAygLMjAuYWdlbnQudjEuQXJ0aWZhY3RVcGxvYWRJbnN0cnVjdGlvbi5IZWFkZXJzRW50cnkSGQoMY29udGVudF90eXBlGAUgASgJSACIAQESHQoQc2xhY2tfdXBsb2FkX3VybBgGIAEoCUgBiAEBEhoKDXNsYWNrX2ZpbGVfaWQYByABKAlIAogBARouCgxIZWFkZXJzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4AUIPCg1fY29udGVudF90eXBlQhMKEV9zbGFja191cGxvYWRfdXJsQhAKDl9zbGFja19maWxlX2lkIoQBChxBcnRpZmFjdFVwbG9hZERpc3BhdGNoUmVzdWx0EhUKDWFic29sdXRlX3BhdGgYASABKAkSDgoGc3RhdHVzGAIgASgFEg8KB21lc3NhZ2UYAyABKAkSGgoNc2xhY2tfZmlsZV9pZBgEIAEoCUgAiAEBQhAKDl9zbGFja19maWxlX2lkIlIKF1VwbG9hZEFydGlmYWN0c1Jlc3BvbnNlEjcKB3Jlc3VsdHMYASADKAsyJi5hZ2VudC52MS5BcnRpZmFjdFVwbG9hZERpc3BhdGNoUmVzdWx0IhwKGkdldE1jcFJlZnJlc2hUb2tlbnNSZXF1ZXN0IqUBChtHZXRNY3BSZWZyZXNoVG9rZW5zUmVzcG9uc2USUAoOcmVmcmVzaF90b2tlbnMYASADKAsyOC5hZ2VudC52MS5HZXRNY3BSZWZyZXNoVG9rZW5zUmVzcG9uc2UuUmVmcmVzaFRva2Vuc0VudHJ5GjQKElJlZnJlc2hUb2tlbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIqMBCiFVcGRhdGVFbnZpcm9ubWVudFZhcmlhYmxlc1JlcXVlc3QSQQoDZW52GAEgAygLMjQuYWdlbnQudjEuVXBkYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNSZXF1ZXN0LkVudkVudHJ5Eg8KB3JlcGxhY2UYAiABKAgaKgoIRW52RW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJGCiJVcGRhdGVFbnZpcm9ubWVudFZhcmlhYmxlc1Jlc3BvbnNlEg8KB2FwcGxpZWQYASABKA0SDwoHcmVtb3ZlZBgCIAEoDSKDAQoSTWNwT0F1dGhTdG9yZWREYXRhEhUKDXJlZnJlc2hfdG9rZW4YASABKAkSEQoJY2xpZW50X2lkGAIgASgJEhoKDWNsaWVudF9zZWNyZXQYAyABKAlIAIgBARIVCg1yZWRpcmVjdF91cmlzGAQgAygJQhAKDl9jbGllbnRfc2VjcmV0Ik4KBUZyYW1lEgoKAmlkGAEgASgJEg4KBm1ldGhvZBgCIAEoCRIMCgRkYXRhGAMgASgMEgwKBGtpbmQYBCABKAUSDQoFZXJyb3IYBSABKAkiBwoFRW1wdHkiIwoNQmlkaVJlcXVlc3RJZBISCgpyZXF1ZXN0X2lkGAEgASgJKogBCh1BcHBsaWVkQWdlbnRDaGFuZ2VfQ2hhbmdlVHlwZRIbChdDSEFOR0VfVFlQRV9VTlNQRUNJRklFRBAAEhcKE0NIQU5HRV9UWVBFX0NSRUFURUQQARIYChRDSEFOR0VfVFlQRV9NT0RJRklFRBACEhcKE0NIQU5HRV9UWVBFX0RFTEVURUQQAyqkAQoLTW91c2VCdXR0b24SHAoYTU9VU0VfQlVUVE9OX1VOU1BFQ0lGSUVEEAASFQoRTU9VU0VfQlVUVE9OX0xFRlQQARIWChJNT1VTRV9CVVRUT05fUklHSFQQAhIXChNNT1VTRV9CVVRUT05fTUlERExFEAMSFQoRTU9VU0VfQlVUVE9OX0JBQ0sQBBIYChRNT1VTRV9CVVRUT05fRk9SV0FSRBAFKp4BCg9TY3JvbGxEaXJlY3Rpb24SIAocU0NST0xMX0RJUkVDVElPTl9VTlNQRUNJRklFRBAAEhcKE1NDUk9MTF9ESVJFQ1RJT05fVVAQARIZChVTQ1JPTExfRElSRUNUSU9OX0RPV04QAhIZChVTQ1JPTExfRElSRUNUSU9OX0xFRlQQAxIaChZTQ1JPTExfRElSRUNUSU9OX1JJR0hUEAQqcAoQQ3Vyc29yUnVsZVNvdXJjZRIiCh5DVVJTT1JfUlVMRV9TT1VSQ0VfVU5TUEVDSUZJRUQQABIbChdDVVJTT1JfUlVMRV9TT1VSQ0VfVEVBTRABEhsKF0NVUlNPUl9SVUxFX1NPVVJDRV9VU0VSEAIqvAEKEkRpYWdub3N0aWNTZXZlcml0eRIjCh9ESUFHTk9TVElDX1NFVkVSSVRZX1VOU1BFQ0lGSUVEEAASHQoZRElBR05PU1RJQ19TRVZFUklUWV9FUlJPUhABEh8KG0RJQUdOT1NUSUNfU0VWRVJJVFlfV0FSTklORxACEiMKH0RJQUdOT1NUSUNfU0VWRVJJVFlfSU5GT1JNQVRJT04QAxIcChhESUFHTk9TVElDX1NFVkVSSVRZX0hJTlQQBCqcAQoNUmVjb3JkaW5nTW9kZRIeChpSRUNPUkRJTkdfTU9ERV9VTlNQRUNJRklFRBAAEiIKHlJFQ09SRElOR19NT0RFX1NUQVJUX1JFQ09SRElORxABEiEKHVJFQ09SRElOR19NT0RFX1NBVkVfUkVDT1JESU5HEAISJAogUkVDT1JESU5HX01PREVfRElTQ0FSRF9SRUNPUkRJTkcQAyqTAQofUmVxdWVzdGVkRmlsZVBhdGhSZWplY3RlZFJlYXNvbhIzCi9SRVFVRVNURURfRklMRV9QQVRIX1JFSkVDVEVEX1JFQVNPTl9VTlNQRUNJRklFRBAAEjsKN1JFUVVFU1RFRF9GSUxFX1BBVEhfUkVKRUNURURfUkVBU09OX1NMQVNIRVNfTk9UX0FMTE9XRUQQASqtAQoLUGFja2FnZVR5cGUSHAoYUEFDS0FHRV9UWVBFX1VOU1BFQ0lGSUVEEAASHwobUEFDS0FHRV9UWVBFX0NVUlNPUl9QUk9KRUNUEAESIAocUEFDS0FHRV9UWVBFX0NVUlNPUl9QRVJTT05BTBACEh0KGVBBQ0tBR0VfVFlQRV9DTEFVREVfU0tJTEwQAxIeChpQQUNLQUdFX1RZUEVfQ0xBVURFX1BMVUdJThAEKn0KElNhbmRib3hQb2xpY3lfVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASFgoSVFlQRV9JTlNFQ1VSRV9OT05FEAESHAoYVFlQRV9XT1JLU1BBQ0VfUkVBRFdSSVRFEAISGwoXVFlQRV9XT1JLU1BBQ0VfUkVBRE9OTFkQAypxCg9UaW1lb3V0QmVoYXZpb3ISIAocVElNRU9VVF9CRUhBVklPUl9VTlNQRUNJRklFRBAAEhsKF1RJTUVPVVRfQkVIQVZJT1JfQ0FOQ0VMEAESHwobVElNRU9VVF9CRUhBVklPUl9CQUNLR1JPVU5EEAIqeQoQU2hlbGxBYm9ydFJlYXNvbhIiCh5TSEVMTF9BQk9SVF9SRUFTT05fVU5TUEVDSUZJRUQQABIhCh1TSEVMTF9BQk9SVF9SRUFTT05fVVNFUl9BQk9SVBABEh4KGlNIRUxMX0FCT1JUX1JFQVNPTl9USU1FT1VUEAIqqgEKHEN1c3RvbVN1YmFnZW50UGVybWlzc2lvbk1vZGUSLworQ1VTVE9NX1NVQkFHRU5UX1BFUk1JU1NJT05fTU9ERV9VTlNQRUNJRklFRBAAEisKJ0NVU1RPTV9TVUJBR0VOVF9QRVJNSVNTSU9OX01PREVfREVGQVVMVBABEiwKKENVU1RPTV9TVUJBR0VOVF9QRVJNSVNTSU9OX01PREVfUkVBRE9OTFkQAiqVAQoKVG9kb1N0YXR1cxIbChdUT0RPX1NUQVRVU19VTlNQRUNJRklFRBAAEhcKE1RPRE9fU1RBVFVTX1BFTkRJTkcQARIbChdUT0RPX1NUQVRVU19JTl9QUk9HUkVTUxACEhkKFVRPRE9fU1RBVFVTX0NPTVBMRVRFRBADEhkKFVRPRE9fU1RBVFVTX0NBTkNFTExFRBAEKmYKCENsaWVudE9TEhkKFUNMSUVOVF9PU19VTlNQRUNJRklFRBAAEhUKEUNMSUVOVF9PU19XSU5ET1dTEAESEwoPQ0xJRU5UX09TX01BQ09TEAISEwoPQ0xJRU5UX09TX0xJTlVYEAMq7AEKHEFydGlmYWN0VXBsb2FkRGlzcGF0Y2hTdGF0dXMSLworQVJUSUZBQ1RfVVBMT0FEX0RJU1BBVENIX1NUQVRVU19VTlNQRUNJRklFRBAAEiwKKEFSVElGQUNUX1VQTE9BRF9ESVNQQVRDSF9TVEFUVVNfQUNDRVBURUQQARIsCihBUlRJRkFDVF9VUExPQURfRElTUEFUQ0hfU1RBVFVTX1JFSkVDVEVEEAISPwo7QVJUSUZBQ1RfVVBMT0FEX0RJU1BBVENIX1NUQVRVU19TS0lQUEVEX0FMUkVBRFlfSU5fUFJPR1JFU1MQAypXCgpGcmFtZV9LaW5kEhQKEEtJTkRfVU5TUEVDSUZJRUQQABIQCgxLSU5EX1JFUVVFU1QQARIRCg1LSU5EX1JFU1BPTlNFEAISDgoKS0lORF9FUlJPUhADKrACChdCdWdib3REZWVwbGlua0V2ZW50S2luZBIqCiZCVUdCT1RfREVFUExJTktfRVZFTlRfS0lORF9VTlNQRUNJRklFRBAAEiYKIkJVR0JPVF9ERUVQTElOS19FVkVOVF9LSU5EX0NMSUNLRUQQARIzCi9CVUdCT1RfREVFUExJTktfRVZFTlRfS0lORF9IQU5ETEVEX0RJQUxPR19TSE9XThACEjMKL0JVR0JPVF9ERUVQTElOS19FVkVOVF9LSU5EX0hBTkRMRURfQ0hBVF9DUkVBVEVEEAMSJAogQlVHQk9UX0RFRVBMSU5LX0VWRU5UX0tJTkRfRVJST1IQBBIxCi1CVUdCT1RfREVFUExJTktfRVZFTlRfS0lORF9IQU5ETEVEX0ZJWF9JTl9XRUIQBTKHBAoMQWdlbnRTZXJ2aWNlEkEKA1J1bhIcLmFnZW50LnYxLkFnZW50Q2xpZW50TWVzc2FnZRocLmFnZW50LnYxLkFnZW50U2VydmVyTWVzc2FnZRI/CgZSdW5TU0USFy5hZ2VudC52MS5CaWRpUmVxdWVzdElkGhwuYWdlbnQudjEuQWdlbnRTZXJ2ZXJNZXNzYWdlEkQKCU5hbWVBZ2VudBIaLmFnZW50LnYxLk5hbWVBZ2VudFJlcXVlc3QaGy5hZ2VudC52MS5OYW1lQWdlbnRSZXNwb25zZRJWCg9HZXRVc2FibGVNb2RlbHMSIC5hZ2VudC52MS5HZXRVc2FibGVNb2RlbHNSZXF1ZXN0GiEuYWdlbnQudjEuR2V0VXNhYmxlTW9kZWxzUmVzcG9uc2USaAoVR2V0RGVmYXVsdE1vZGVsRm9yQ2xpEiYuYWdlbnQudjEuR2V0RGVmYXVsdE1vZGVsRm9yQ2xpUmVxdWVzdBonLmFnZW50LnYxLkdldERlZmF1bHRNb2RlbEZvckNsaVJlc3BvbnNlEmsKFkdldEFsbG93ZWRNb2RlbEludGVudHMSJy5hZ2VudC52MS5HZXRBbGxvd2VkTW9kZWxJbnRlbnRzUmVxdWVzdBooLmFnZW50LnYxLkdldEFsbG93ZWRNb2RlbEludGVudHNSZXNwb25zZTK1CAoOQ29udHJvbFNlcnZpY2USTQoMUmVhZFRleHRGaWxlEh0uYWdlbnQudjEuUmVhZFRleHRGaWxlUmVxdWVzdBoeLmFnZW50LnYxLlJlYWRUZXh0RmlsZVJlc3BvbnNlElAKDVdyaXRlVGV4dEZpbGUSHi5hZ2VudC52MS5Xcml0ZVRleHRGaWxlUmVxdWVzdBofLmFnZW50LnYxLldyaXRlVGV4dEZpbGVSZXNwb25zZRJTCg5SZWFkQmluYXJ5RmlsZRIfLmFnZW50LnYxLlJlYWRCaW5hcnlGaWxlUmVxdWVzdBogLmFnZW50LnYxLlJlYWRCaW5hcnlGaWxlUmVzcG9uc2USVgoPV3JpdGVCaW5hcnlGaWxlEiAuYWdlbnQudjEuV3JpdGVCaW5hcnlGaWxlUmVxdWVzdBohLmFnZW50LnYxLldyaXRlQmluYXJ5RmlsZVJlc3BvbnNlEm4KF0dldFdvcmtzcGFjZUNoYW5nZXNIYXNoEiguYWdlbnQudjEuR2V0V29ya3NwYWNlQ2hhbmdlc0hhc2hSZXF1ZXN0GikuYWdlbnQudjEuR2V0V29ya3NwYWNlQ2hhbmdlc0hhc2hSZXNwb25zZRJxChhSZWZyZXNoR2l0aHViQWNjZXNzVG9rZW4SKS5hZ2VudC52MS5SZWZyZXNoR2l0aHViQWNjZXNzVG9rZW5SZXF1ZXN0GiouYWdlbnQudjEuUmVmcmVzaEdpdGh1YkFjY2Vzc1Rva2VuUmVzcG9uc2USawoWV2FybVJlbW90ZUFjY2Vzc1NlcnZlchInLmFnZW50LnYxLldhcm1SZW1vdGVBY2Nlc3NTZXJ2ZXJSZXF1ZXN0GiguYWdlbnQudjEuV2FybVJlbW90ZUFjY2Vzc1NlcnZlclJlc3BvbnNlElAKDUxpc3RBcnRpZmFjdHMSHi5hZ2VudC52MS5MaXN0QXJ0aWZhY3RzUmVxdWVzdBofLmFnZW50LnYxLkxpc3RBcnRpZmFjdHNSZXNwb25zZRJWCg9VcGxvYWRBcnRpZmFjdHMSIC5hZ2VudC52MS5VcGxvYWRBcnRpZmFjdHNSZXF1ZXN0GiEuYWdlbnQudjEuVXBsb2FkQXJ0aWZhY3RzUmVzcG9uc2USYgoTR2V0TWNwUmVmcmVzaFRva2VucxIkLmFnZW50LnYxLkdldE1jcFJlZnJlc2hUb2tlbnNSZXF1ZXN0GiUuYWdlbnQudjEuR2V0TWNwUmVmcmVzaFRva2Vuc1Jlc3BvbnNlEncKGlVwZGF0ZUVudmlyb25tZW50VmFyaWFibGVzEisuYWdlbnQudjEuVXBkYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNSZXF1ZXN0GiwuYWdlbnQudjEuVXBkYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNSZXNwb25zZTINCgtFeGVjU2VydmljZTJRCiJQcml2YXRlV29ya2VyQnJpZGdlRXh0ZXJuYWxTZXJ2aWNlEisKB0Nvbm5lY3QSDy5hZ2VudC52MS5GcmFtZRoPLmFnZW50LnYxLkZyYW1lMngKEExpZmVjeWNsZVNlcnZpY2USMQoNUmVzZXRJbnN0YW5jZRIPLmFnZW50LnYxLkVtcHR5Gg8uYWdlbnQudjEuRW1wdHkSMQoNUmVuZXdJbnN0YW5jZRIPLmFnZW50LnYxLkVtcHR5Gg8uYWdlbnQudjEuRW1wdHliBnByb3RvMw"); +/** + * Describes the message agent.v1.GlobToolResult. + * Use `create(GlobToolResultSchema)` to create a new message. + */ +export const GlobToolResultSchema = /*@__PURE__*/ messageDesc(file_agent, 0); +/** + * Describes the message agent.v1.GlobToolError. + * Use `create(GlobToolErrorSchema)` to create a new message. + */ +export const GlobToolErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 1); +/** + * Describes the message agent.v1.GlobToolSuccess. + * Use `create(GlobToolSuccessSchema)` to create a new message. + */ +export const GlobToolSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 2); +/** + * Describes the message agent.v1.GlobToolCall. + * Use `create(GlobToolCallSchema)` to create a new message. + */ +export const GlobToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 3); +/** + * Describes the message agent.v1.ReadLintsToolCall. + * Use `create(ReadLintsToolCallSchema)` to create a new message. + */ +export const ReadLintsToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 4); +/** + * Describes the message agent.v1.ReadLintsToolArgs. + * Use `create(ReadLintsToolArgsSchema)` to create a new message. + */ +export const ReadLintsToolArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 5); +/** + * Describes the message agent.v1.ReadLintsToolResult. + * Use `create(ReadLintsToolResultSchema)` to create a new message. + */ +export const ReadLintsToolResultSchema = /*@__PURE__*/ messageDesc(file_agent, 6); +/** + * Describes the message agent.v1.ReadLintsToolSuccess. + * Use `create(ReadLintsToolSuccessSchema)` to create a new message. + */ +export const ReadLintsToolSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 7); +/** + * Describes the message agent.v1.FileDiagnostics. + * Use `create(FileDiagnosticsSchema)` to create a new message. + */ +export const FileDiagnosticsSchema = /*@__PURE__*/ messageDesc(file_agent, 8); +/** + * Describes the message agent.v1.DiagnosticItem. + * Use `create(DiagnosticItemSchema)` to create a new message. + */ +export const DiagnosticItemSchema = /*@__PURE__*/ messageDesc(file_agent, 9); +/** + * Describes the message agent.v1.DiagnosticRange. + * Use `create(DiagnosticRangeSchema)` to create a new message. + */ +export const DiagnosticRangeSchema = /*@__PURE__*/ messageDesc(file_agent, 10); +/** + * Describes the message agent.v1.ReadLintsToolError. + * Use `create(ReadLintsToolErrorSchema)` to create a new message. + */ +export const ReadLintsToolErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 11); +/** + * Describes the message agent.v1.McpToolError. + * Use `create(McpToolErrorSchema)` to create a new message. + */ +export const McpToolErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 12); +/** + * Describes the message agent.v1.McpToolResult. + * Use `create(McpToolResultSchema)` to create a new message. + */ +export const McpToolResultSchema = /*@__PURE__*/ messageDesc(file_agent, 13); +/** + * Describes the message agent.v1.McpToolCall. + * Use `create(McpToolCallSchema)` to create a new message. + */ +export const McpToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 14); +/** + * Describes the message agent.v1.SemSearchToolCall. + * Use `create(SemSearchToolCallSchema)` to create a new message. + */ +export const SemSearchToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 15); +/** + * Describes the message agent.v1.SemSearchToolArgs. + * Use `create(SemSearchToolArgsSchema)` to create a new message. + */ +export const SemSearchToolArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 16); +/** + * Describes the message agent.v1.SemSearchToolResult. + * Use `create(SemSearchToolResultSchema)` to create a new message. + */ +export const SemSearchToolResultSchema = /*@__PURE__*/ messageDesc(file_agent, 17); +/** + * Describes the message agent.v1.SemSearchToolSuccess. + * Use `create(SemSearchToolSuccessSchema)` to create a new message. + */ +export const SemSearchToolSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 18); +/** + * Describes the message agent.v1.SemSearchToolError. + * Use `create(SemSearchToolErrorSchema)` to create a new message. + */ +export const SemSearchToolErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 19); +/** + * Describes the message agent.v1.ListMcpResourcesToolCall. + * Use `create(ListMcpResourcesToolCallSchema)` to create a new message. + */ +export const ListMcpResourcesToolCallSchema = +/*@__PURE__*/ +messageDesc(file_agent, 20); +/** + * Describes the message agent.v1.ReadMcpResourceToolCall. + * Use `create(ReadMcpResourceToolCallSchema)` to create a new message. + */ +export const ReadMcpResourceToolCallSchema = +/*@__PURE__*/ +messageDesc(file_agent, 21); +/** + * Describes the message agent.v1.FetchToolCall. + * Use `create(FetchToolCallSchema)` to create a new message. + */ +export const FetchToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 22); +/** + * Describes the message agent.v1.RecordScreenToolCall. + * Use `create(RecordScreenToolCallSchema)` to create a new message. + */ +export const RecordScreenToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 23); +/** + * Describes the message agent.v1.WriteShellStdinToolCall. + * Use `create(WriteShellStdinToolCallSchema)` to create a new message. + */ +export const WriteShellStdinToolCallSchema = +/*@__PURE__*/ +messageDesc(file_agent, 24); +/** + * Describes the message agent.v1.ReflectArgs. + * Use `create(ReflectArgsSchema)` to create a new message. + */ +export const ReflectArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 25); +/** + * Describes the message agent.v1.ReflectResult. + * Use `create(ReflectResultSchema)` to create a new message. + */ +export const ReflectResultSchema = /*@__PURE__*/ messageDesc(file_agent, 26); +/** + * Describes the message agent.v1.ReflectSuccess. + * Use `create(ReflectSuccessSchema)` to create a new message. + */ +export const ReflectSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 27); +/** + * Describes the message agent.v1.ReflectError. + * Use `create(ReflectErrorSchema)` to create a new message. + */ +export const ReflectErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 28); +/** + * Describes the message agent.v1.ReflectToolCall. + * Use `create(ReflectToolCallSchema)` to create a new message. + */ +export const ReflectToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 29); +/** + * Describes the message agent.v1.StartGrindExecutionArgs. + * Use `create(StartGrindExecutionArgsSchema)` to create a new message. + */ +export const StartGrindExecutionArgsSchema = +/*@__PURE__*/ +messageDesc(file_agent, 30); +/** + * Describes the message agent.v1.StartGrindExecutionResult. + * Use `create(StartGrindExecutionResultSchema)` to create a new message. + */ +export const StartGrindExecutionResultSchema = +/*@__PURE__*/ +messageDesc(file_agent, 31); +/** + * Describes the message agent.v1.StartGrindExecutionSuccess. + * Use `create(StartGrindExecutionSuccessSchema)` to create a new message. + */ +export const StartGrindExecutionSuccessSchema = +/*@__PURE__*/ +messageDesc(file_agent, 32); +/** + * Describes the message agent.v1.StartGrindExecutionError. + * Use `create(StartGrindExecutionErrorSchema)` to create a new message. + */ +export const StartGrindExecutionErrorSchema = +/*@__PURE__*/ +messageDesc(file_agent, 33); +/** + * Describes the message agent.v1.StartGrindExecutionToolCall. + * Use `create(StartGrindExecutionToolCallSchema)` to create a new message. + */ +export const StartGrindExecutionToolCallSchema = +/*@__PURE__*/ +messageDesc(file_agent, 34); +/** + * Describes the message agent.v1.StartGrindPlanningArgs. + * Use `create(StartGrindPlanningArgsSchema)` to create a new message. + */ +export const StartGrindPlanningArgsSchema = +/*@__PURE__*/ +messageDesc(file_agent, 35); +/** + * Describes the message agent.v1.StartGrindPlanningResult. + * Use `create(StartGrindPlanningResultSchema)` to create a new message. + */ +export const StartGrindPlanningResultSchema = +/*@__PURE__*/ +messageDesc(file_agent, 36); +/** + * Describes the message agent.v1.StartGrindPlanningSuccess. + * Use `create(StartGrindPlanningSuccessSchema)` to create a new message. + */ +export const StartGrindPlanningSuccessSchema = +/*@__PURE__*/ +messageDesc(file_agent, 37); +/** + * Describes the message agent.v1.StartGrindPlanningError. + * Use `create(StartGrindPlanningErrorSchema)` to create a new message. + */ +export const StartGrindPlanningErrorSchema = +/*@__PURE__*/ +messageDesc(file_agent, 38); +/** + * Describes the message agent.v1.StartGrindPlanningToolCall. + * Use `create(StartGrindPlanningToolCallSchema)` to create a new message. + */ +export const StartGrindPlanningToolCallSchema = +/*@__PURE__*/ +messageDesc(file_agent, 39); +/** + * Describes the message agent.v1.TaskArgs. + * Use `create(TaskArgsSchema)` to create a new message. + */ +export const TaskArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 40); +/** + * Describes the message agent.v1.TaskSuccess. + * Use `create(TaskSuccessSchema)` to create a new message. + */ +export const TaskSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 41); +/** + * Describes the message agent.v1.TaskError. + * Use `create(TaskErrorSchema)` to create a new message. + */ +export const TaskErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 42); +/** + * Describes the message agent.v1.TaskResult. + * Use `create(TaskResultSchema)` to create a new message. + */ +export const TaskResultSchema = /*@__PURE__*/ messageDesc(file_agent, 43); +/** + * Describes the message agent.v1.TaskToolCall. + * Use `create(TaskToolCallSchema)` to create a new message. + */ +export const TaskToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 44); +/** + * Describes the message agent.v1.TaskToolCallDelta. + * Use `create(TaskToolCallDeltaSchema)` to create a new message. + */ +export const TaskToolCallDeltaSchema = /*@__PURE__*/ messageDesc(file_agent, 45); +/** + * Describes the message agent.v1.ToolCall. + * Use `create(ToolCallSchema)` to create a new message. + */ +export const ToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 46); +/** + * Describes the message agent.v1.TruncatedToolCallArgs. + * Use `create(TruncatedToolCallArgsSchema)` to create a new message. + */ +export const TruncatedToolCallArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 47); +/** + * Describes the message agent.v1.TruncatedToolCallSuccess. + * Use `create(TruncatedToolCallSuccessSchema)` to create a new message. + */ +export const TruncatedToolCallSuccessSchema = +/*@__PURE__*/ +messageDesc(file_agent, 48); +/** + * Describes the message agent.v1.TruncatedToolCallError. + * Use `create(TruncatedToolCallErrorSchema)` to create a new message. + */ +export const TruncatedToolCallErrorSchema = +/*@__PURE__*/ +messageDesc(file_agent, 49); +/** + * Describes the message agent.v1.TruncatedToolCallResult. + * Use `create(TruncatedToolCallResultSchema)` to create a new message. + */ +export const TruncatedToolCallResultSchema = +/*@__PURE__*/ +messageDesc(file_agent, 50); +/** + * Describes the message agent.v1.TruncatedToolCall. + * Use `create(TruncatedToolCallSchema)` to create a new message. + */ +export const TruncatedToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 51); +/** + * Describes the message agent.v1.ToolCallDelta. + * Use `create(ToolCallDeltaSchema)` to create a new message. + */ +export const ToolCallDeltaSchema = /*@__PURE__*/ messageDesc(file_agent, 52); +/** + * Describes the message agent.v1.ConversationStep. + * Use `create(ConversationStepSchema)` to create a new message. + */ +export const ConversationStepSchema = /*@__PURE__*/ messageDesc(file_agent, 53); +/** + * Describes the message agent.v1.ConversationAction. + * Use `create(ConversationActionSchema)` to create a new message. + */ +export const ConversationActionSchema = /*@__PURE__*/ messageDesc(file_agent, 54); +/** + * Describes the message agent.v1.UserMessageAction. + * Use `create(UserMessageActionSchema)` to create a new message. + */ +export const UserMessageActionSchema = /*@__PURE__*/ messageDesc(file_agent, 55); +/** + * Describes the message agent.v1.CancelAction. + * Use `create(CancelActionSchema)` to create a new message. + */ +export const CancelActionSchema = /*@__PURE__*/ messageDesc(file_agent, 56); +/** + * Describes the message agent.v1.ResumeAction. + * Use `create(ResumeActionSchema)` to create a new message. + */ +export const ResumeActionSchema = /*@__PURE__*/ messageDesc(file_agent, 57); +/** + * Describes the message agent.v1.AsyncAskQuestionCompletionAction. + * Use `create(AsyncAskQuestionCompletionActionSchema)` to create a new message. + */ +export const AsyncAskQuestionCompletionActionSchema = +/*@__PURE__*/ +messageDesc(file_agent, 58); +/** + * Describes the message agent.v1.SummarizeAction. + * Use `create(SummarizeActionSchema)` to create a new message. + */ +export const SummarizeActionSchema = /*@__PURE__*/ messageDesc(file_agent, 59); +/** + * Describes the message agent.v1.ShellCommandAction. + * Use `create(ShellCommandActionSchema)` to create a new message. + */ +export const ShellCommandActionSchema = /*@__PURE__*/ messageDesc(file_agent, 60); +/** + * Describes the message agent.v1.StartPlanAction. + * Use `create(StartPlanActionSchema)` to create a new message. + */ +export const StartPlanActionSchema = /*@__PURE__*/ messageDesc(file_agent, 61); +/** + * Describes the message agent.v1.ExecutePlanAction. + * Use `create(ExecutePlanActionSchema)` to create a new message. + */ +export const ExecutePlanActionSchema = /*@__PURE__*/ messageDesc(file_agent, 62); +/** + * Describes the message agent.v1.UserMessage. + * Use `create(UserMessageSchema)` to create a new message. + */ +export const UserMessageSchema = /*@__PURE__*/ messageDesc(file_agent, 63); +/** + * Describes the message agent.v1.AssistantMessage. + * Use `create(AssistantMessageSchema)` to create a new message. + */ +export const AssistantMessageSchema = /*@__PURE__*/ messageDesc(file_agent, 64); +/** + * Describes the message agent.v1.ThinkingMessage. + * Use `create(ThinkingMessageSchema)` to create a new message. + */ +export const ThinkingMessageSchema = /*@__PURE__*/ messageDesc(file_agent, 65); +/** + * Describes the message agent.v1.ShellCommand. + * Use `create(ShellCommandSchema)` to create a new message. + */ +export const ShellCommandSchema = /*@__PURE__*/ messageDesc(file_agent, 66); +/** + * Describes the message agent.v1.ShellOutput. + * Use `create(ShellOutputSchema)` to create a new message. + */ +export const ShellOutputSchema = /*@__PURE__*/ messageDesc(file_agent, 67); +/** + * Describes the message agent.v1.ConversationTurn. + * Use `create(ConversationTurnSchema)` to create a new message. + */ +export const ConversationTurnSchema = /*@__PURE__*/ messageDesc(file_agent, 68); +/** + * Describes the message agent.v1.ConversationPlan. + * Use `create(ConversationPlanSchema)` to create a new message. + */ +export const ConversationPlanSchema = /*@__PURE__*/ messageDesc(file_agent, 69); +/** + * Describes the message agent.v1.ConversationTurnStructure. + * Use `create(ConversationTurnStructureSchema)` to create a new message. + */ +export const ConversationTurnStructureSchema = +/*@__PURE__*/ +messageDesc(file_agent, 70); +/** + * Describes the message agent.v1.AgentConversationTurn. + * Use `create(AgentConversationTurnSchema)` to create a new message. + */ +export const AgentConversationTurnSchema = /*@__PURE__*/ messageDesc(file_agent, 71); +/** + * Describes the message agent.v1.AgentConversationTurnStructure. + * Use `create(AgentConversationTurnStructureSchema)` to create a new message. + */ +export const AgentConversationTurnStructureSchema = +/*@__PURE__*/ +messageDesc(file_agent, 72); +/** + * Describes the message agent.v1.ShellConversationTurn. + * Use `create(ShellConversationTurnSchema)` to create a new message. + */ +export const ShellConversationTurnSchema = /*@__PURE__*/ messageDesc(file_agent, 73); +/** + * Describes the message agent.v1.ShellConversationTurnStructure. + * Use `create(ShellConversationTurnStructureSchema)` to create a new message. + */ +export const ShellConversationTurnStructureSchema = +/*@__PURE__*/ +messageDesc(file_agent, 74); +/** + * Describes the message agent.v1.ConversationSummary. + * Use `create(ConversationSummarySchema)` to create a new message. + */ +export const ConversationSummarySchema = /*@__PURE__*/ messageDesc(file_agent, 75); +/** + * Describes the message agent.v1.ConversationSummaryArchive. + * Use `create(ConversationSummaryArchiveSchema)` to create a new message. + */ +export const ConversationSummaryArchiveSchema = +/*@__PURE__*/ +messageDesc(file_agent, 76); +/** + * Describes the message agent.v1.ConversationTokenDetails. + * Use `create(ConversationTokenDetailsSchema)` to create a new message. + */ +export const ConversationTokenDetailsSchema = +/*@__PURE__*/ +messageDesc(file_agent, 77); +/** + * Describes the message agent.v1.FileState. + * Use `create(FileStateSchema)` to create a new message. + */ +export const FileStateSchema = /*@__PURE__*/ messageDesc(file_agent, 78); +/** + * Describes the message agent.v1.FileStateStructure. + * Use `create(FileStateStructureSchema)` to create a new message. + */ +export const FileStateStructureSchema = /*@__PURE__*/ messageDesc(file_agent, 79); +/** + * Describes the message agent.v1.StepTiming. + * Use `create(StepTimingSchema)` to create a new message. + */ +export const StepTimingSchema = /*@__PURE__*/ messageDesc(file_agent, 80); +/** + * Describes the message agent.v1.ConversationState. + * Use `create(ConversationStateSchema)` to create a new message. + */ +export const ConversationStateSchema = /*@__PURE__*/ messageDesc(file_agent, 81); +/** + * Describes the message agent.v1.SubagentPersistedState. + * Use `create(SubagentPersistedStateSchema)` to create a new message. + */ +export const SubagentPersistedStateSchema = +/*@__PURE__*/ +messageDesc(file_agent, 82); +/** + * Describes the message agent.v1.ConversationStateStructure. + * Use `create(ConversationStateStructureSchema)` to create a new message. + */ +export const ConversationStateStructureSchema = +/*@__PURE__*/ +messageDesc(file_agent, 83); +/** + * Describes the message agent.v1.ThinkingDetails. + * Use `create(ThinkingDetailsSchema)` to create a new message. + */ +export const ThinkingDetailsSchema = /*@__PURE__*/ messageDesc(file_agent, 84); +/** + * Describes the message agent.v1.ApiKeyCredentials. + * Use `create(ApiKeyCredentialsSchema)` to create a new message. + */ +export const ApiKeyCredentialsSchema = /*@__PURE__*/ messageDesc(file_agent, 85); +/** + * Describes the message agent.v1.AzureCredentials. + * Use `create(AzureCredentialsSchema)` to create a new message. + */ +export const AzureCredentialsSchema = /*@__PURE__*/ messageDesc(file_agent, 86); +/** + * Describes the message agent.v1.BedrockCredentials. + * Use `create(BedrockCredentialsSchema)` to create a new message. + */ +export const BedrockCredentialsSchema = /*@__PURE__*/ messageDesc(file_agent, 87); +/** + * Describes the message agent.v1.ModelDetails. + * Use `create(ModelDetailsSchema)` to create a new message. + */ +export const ModelDetailsSchema = /*@__PURE__*/ messageDesc(file_agent, 88); +/** + * Describes the message agent.v1.RequestedModel. + * Use `create(RequestedModelSchema)` to create a new message. + */ +export const RequestedModelSchema = /*@__PURE__*/ messageDesc(file_agent, 89); +/** + * Describes the message agent.v1.RequestedModel_ModelParameterbytes. + * Use `create(RequestedModel_ModelParameterbytesSchema)` to create a new message. + */ +export const RequestedModel_ModelParameterbytesSchema = +/*@__PURE__*/ +messageDesc(file_agent, 90); +/** + * Describes the message agent.v1.AgentRunRequest. + * Use `create(AgentRunRequestSchema)` to create a new message. + */ +export const AgentRunRequestSchema = /*@__PURE__*/ messageDesc(file_agent, 91); +/** + * Describes the message agent.v1.TextDeltaUpdate. + * Use `create(TextDeltaUpdateSchema)` to create a new message. + */ +export const TextDeltaUpdateSchema = /*@__PURE__*/ messageDesc(file_agent, 92); +/** + * Describes the message agent.v1.ToolCallStartedUpdate. + * Use `create(ToolCallStartedUpdateSchema)` to create a new message. + */ +export const ToolCallStartedUpdateSchema = /*@__PURE__*/ messageDesc(file_agent, 93); +/** + * Describes the message agent.v1.ToolCallCompletedUpdate. + * Use `create(ToolCallCompletedUpdateSchema)` to create a new message. + */ +export const ToolCallCompletedUpdateSchema = +/*@__PURE__*/ +messageDesc(file_agent, 94); +/** + * Describes the message agent.v1.ToolCallDeltaUpdate. + * Use `create(ToolCallDeltaUpdateSchema)` to create a new message. + */ +export const ToolCallDeltaUpdateSchema = /*@__PURE__*/ messageDesc(file_agent, 95); +/** + * Describes the message agent.v1.PartialToolCallUpdate. + * Use `create(PartialToolCallUpdateSchema)` to create a new message. + */ +export const PartialToolCallUpdateSchema = /*@__PURE__*/ messageDesc(file_agent, 96); +/** + * Describes the message agent.v1.ThinkingDeltaUpdate. + * Use `create(ThinkingDeltaUpdateSchema)` to create a new message. + */ +export const ThinkingDeltaUpdateSchema = /*@__PURE__*/ messageDesc(file_agent, 97); +/** + * Describes the message agent.v1.ThinkingCompletedUpdate. + * Use `create(ThinkingCompletedUpdateSchema)` to create a new message. + */ +export const ThinkingCompletedUpdateSchema = +/*@__PURE__*/ +messageDesc(file_agent, 98); +/** + * Describes the message agent.v1.TokenDeltaUpdate. + * Use `create(TokenDeltaUpdateSchema)` to create a new message. + */ +export const TokenDeltaUpdateSchema = /*@__PURE__*/ messageDesc(file_agent, 99); +/** + * Describes the message agent.v1.SummaryUpdate. + * Use `create(SummaryUpdateSchema)` to create a new message. + */ +export const SummaryUpdateSchema = /*@__PURE__*/ messageDesc(file_agent, 100); +/** + * Describes the message agent.v1.SummaryStartedUpdate. + * Use `create(SummaryStartedUpdateSchema)` to create a new message. + */ +export const SummaryStartedUpdateSchema = /*@__PURE__*/ messageDesc(file_agent, 101); +/** + * Describes the message agent.v1.HeartbeatUpdate. + * Use `create(HeartbeatUpdateSchema)` to create a new message. + */ +export const HeartbeatUpdateSchema = /*@__PURE__*/ messageDesc(file_agent, 102); +/** + * Describes the message agent.v1.SummaryCompletedUpdate. + * Use `create(SummaryCompletedUpdateSchema)` to create a new message. + */ +export const SummaryCompletedUpdateSchema = +/*@__PURE__*/ +messageDesc(file_agent, 103); +/** + * Describes the message agent.v1.ShellOutputDeltaUpdate. + * Use `create(ShellOutputDeltaUpdateSchema)` to create a new message. + */ +export const ShellOutputDeltaUpdateSchema = +/*@__PURE__*/ +messageDesc(file_agent, 104); +/** + * Describes the message agent.v1.TurnEndedUpdate. + * Use `create(TurnEndedUpdateSchema)` to create a new message. + */ +export const TurnEndedUpdateSchema = /*@__PURE__*/ messageDesc(file_agent, 105); +/** + * Describes the message agent.v1.UserMessageAppendedUpdate. + * Use `create(UserMessageAppendedUpdateSchema)` to create a new message. + */ +export const UserMessageAppendedUpdateSchema = +/*@__PURE__*/ +messageDesc(file_agent, 106); +/** + * Describes the message agent.v1.StepStartedUpdate. + * Use `create(StepStartedUpdateSchema)` to create a new message. + */ +export const StepStartedUpdateSchema = /*@__PURE__*/ messageDesc(file_agent, 107); +/** + * Describes the message agent.v1.StepCompletedUpdate. + * Use `create(StepCompletedUpdateSchema)` to create a new message. + */ +export const StepCompletedUpdateSchema = /*@__PURE__*/ messageDesc(file_agent, 108); +/** + * Describes the message agent.v1.InteractionUpdate. + * Use `create(InteractionUpdateSchema)` to create a new message. + */ +export const InteractionUpdateSchema = /*@__PURE__*/ messageDesc(file_agent, 109); +/** + * Describes the message agent.v1.InteractionQuery. + * Use `create(InteractionQuerySchema)` to create a new message. + */ +export const InteractionQuerySchema = /*@__PURE__*/ messageDesc(file_agent, 110); +/** + * Describes the message agent.v1.InteractionResponse. + * Use `create(InteractionResponseSchema)` to create a new message. + */ +export const InteractionResponseSchema = /*@__PURE__*/ messageDesc(file_agent, 111); +/** + * Describes the message agent.v1.AskQuestionInteractionQuery. + * Use `create(AskQuestionInteractionQuerySchema)` to create a new message. + */ +export const AskQuestionInteractionQuerySchema = +/*@__PURE__*/ +messageDesc(file_agent, 112); +/** + * Describes the message agent.v1.AskQuestionInteractionResponse. + * Use `create(AskQuestionInteractionResponseSchema)` to create a new message. + */ +export const AskQuestionInteractionResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 113); +/** + * Describes the message agent.v1.ClientHeartbeat. + * Use `create(ClientHeartbeatSchema)` to create a new message. + */ +export const ClientHeartbeatSchema = /*@__PURE__*/ messageDesc(file_agent, 114); +/** + * Describes the message agent.v1.PrewarmRequest. + * Use `create(PrewarmRequestSchema)` to create a new message. + */ +export const PrewarmRequestSchema = /*@__PURE__*/ messageDesc(file_agent, 115); +/** + * Describes the message agent.v1.ExecServerAbort. + * Use `create(ExecServerAbortSchema)` to create a new message. + */ +export const ExecServerAbortSchema = /*@__PURE__*/ messageDesc(file_agent, 116); +/** + * Describes the message agent.v1.ExecServerControlMessage. + * Use `create(ExecServerControlMessageSchema)` to create a new message. + */ +export const ExecServerControlMessageSchema = +/*@__PURE__*/ +messageDesc(file_agent, 117); +/** + * Describes the message agent.v1.AgentClientMessage. + * Use `create(AgentClientMessageSchema)` to create a new message. + */ +export const AgentClientMessageSchema = /*@__PURE__*/ messageDesc(file_agent, 118); +/** + * Describes the message agent.v1.AgentServerMessage. + * Use `create(AgentServerMessageSchema)` to create a new message. + */ +export const AgentServerMessageSchema = /*@__PURE__*/ messageDesc(file_agent, 119); +/** + * Describes the message agent.v1.NameAgentRequest. + * Use `create(NameAgentRequestSchema)` to create a new message. + */ +export const NameAgentRequestSchema = /*@__PURE__*/ messageDesc(file_agent, 120); +/** + * Describes the message agent.v1.NameAgentResponse. + * Use `create(NameAgentResponseSchema)` to create a new message. + */ +export const NameAgentResponseSchema = /*@__PURE__*/ messageDesc(file_agent, 121); +/** + * Describes the message agent.v1.GetUsableModelsRequest. + * Use `create(GetUsableModelsRequestSchema)` to create a new message. + */ +export const GetUsableModelsRequestSchema = +/*@__PURE__*/ +messageDesc(file_agent, 122); +/** + * Describes the message agent.v1.GetUsableModelsResponse. + * Use `create(GetUsableModelsResponseSchema)` to create a new message. + */ +export const GetUsableModelsResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 123); +/** + * Describes the message agent.v1.GetDefaultModelForCliRequest. + * Use `create(GetDefaultModelForCliRequestSchema)` to create a new message. + */ +export const GetDefaultModelForCliRequestSchema = +/*@__PURE__*/ +messageDesc(file_agent, 124); +/** + * Describes the message agent.v1.GetDefaultModelForCliResponse. + * Use `create(GetDefaultModelForCliResponseSchema)` to create a new message. + */ +export const GetDefaultModelForCliResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 125); +/** + * Describes the message agent.v1.GetAllowedModelIntentsRequest. + * Use `create(GetAllowedModelIntentsRequestSchema)` to create a new message. + */ +export const GetAllowedModelIntentsRequestSchema = +/*@__PURE__*/ +messageDesc(file_agent, 126); +/** + * Describes the message agent.v1.GetAllowedModelIntentsResponse. + * Use `create(GetAllowedModelIntentsResponseSchema)` to create a new message. + */ +export const GetAllowedModelIntentsResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 127); +/** + * Describes the message agent.v1.IdeEditorsStateFile. + * Use `create(IdeEditorsStateFileSchema)` to create a new message. + */ +export const IdeEditorsStateFileSchema = /*@__PURE__*/ messageDesc(file_agent, 128); +/** + * Describes the message agent.v1.IdeEditorsStateLite. + * Use `create(IdeEditorsStateLiteSchema)` to create a new message. + */ +export const IdeEditorsStateLiteSchema = /*@__PURE__*/ messageDesc(file_agent, 129); +/** + * Describes the message agent.v1.ApplyAgentDiffToolCall. + * Use `create(ApplyAgentDiffToolCallSchema)` to create a new message. + */ +export const ApplyAgentDiffToolCallSchema = +/*@__PURE__*/ +messageDesc(file_agent, 130); +/** + * Describes the message agent.v1.ApplyAgentDiffArgs. + * Use `create(ApplyAgentDiffArgsSchema)` to create a new message. + */ +export const ApplyAgentDiffArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 131); +/** + * Describes the message agent.v1.ApplyAgentDiffResult. + * Use `create(ApplyAgentDiffResultSchema)` to create a new message. + */ +export const ApplyAgentDiffResultSchema = /*@__PURE__*/ messageDesc(file_agent, 132); +/** + * Describes the message agent.v1.ApplyAgentDiffSuccess. + * Use `create(ApplyAgentDiffSuccessSchema)` to create a new message. + */ +export const ApplyAgentDiffSuccessSchema = +/*@__PURE__*/ +messageDesc(file_agent, 133); +/** + * Describes the message agent.v1.AppliedAgentChange. + * Use `create(AppliedAgentChangeSchema)` to create a new message. + */ +export const AppliedAgentChangeSchema = /*@__PURE__*/ messageDesc(file_agent, 134); +/** + * Describes the message agent.v1.ApplyAgentDiffError. + * Use `create(ApplyAgentDiffErrorSchema)` to create a new message. + */ +export const ApplyAgentDiffErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 135); +/** + * Describes the message agent.v1.AskQuestionToolCall. + * Use `create(AskQuestionToolCallSchema)` to create a new message. + */ +export const AskQuestionToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 136); +/** + * Describes the message agent.v1.AskQuestionArgs. + * Use `create(AskQuestionArgsSchema)` to create a new message. + */ +export const AskQuestionArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 137); +/** + * Describes the message agent.v1.AskQuestionArgs_Question. + * Use `create(AskQuestionArgs_QuestionSchema)` to create a new message. + */ +export const AskQuestionArgs_QuestionSchema = +/*@__PURE__*/ +messageDesc(file_agent, 138); +/** + * Describes the message agent.v1.AskQuestionArgs_Option. + * Use `create(AskQuestionArgs_OptionSchema)` to create a new message. + */ +export const AskQuestionArgs_OptionSchema = +/*@__PURE__*/ +messageDesc(file_agent, 139); +/** + * Describes the message agent.v1.AskQuestionAsync. + * Use `create(AskQuestionAsyncSchema)` to create a new message. + */ +export const AskQuestionAsyncSchema = /*@__PURE__*/ messageDesc(file_agent, 140); +/** + * Describes the message agent.v1.AskQuestionResult. + * Use `create(AskQuestionResultSchema)` to create a new message. + */ +export const AskQuestionResultSchema = /*@__PURE__*/ messageDesc(file_agent, 141); +/** + * Describes the message agent.v1.AskQuestionSuccess. + * Use `create(AskQuestionSuccessSchema)` to create a new message. + */ +export const AskQuestionSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 142); +/** + * Describes the message agent.v1.AskQuestionSuccess_Answer. + * Use `create(AskQuestionSuccess_AnswerSchema)` to create a new message. + */ +export const AskQuestionSuccess_AnswerSchema = +/*@__PURE__*/ +messageDesc(file_agent, 143); +/** + * Describes the message agent.v1.AskQuestionError. + * Use `create(AskQuestionErrorSchema)` to create a new message. + */ +export const AskQuestionErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 144); +/** + * Describes the message agent.v1.AskQuestionRejected. + * Use `create(AskQuestionRejectedSchema)` to create a new message. + */ +export const AskQuestionRejectedSchema = /*@__PURE__*/ messageDesc(file_agent, 145); +/** + * Describes the message agent.v1.BackgroundShellSpawnArgs. + * Use `create(BackgroundShellSpawnArgsSchema)` to create a new message. + */ +export const BackgroundShellSpawnArgsSchema = +/*@__PURE__*/ +messageDesc(file_agent, 146); +/** + * Describes the message agent.v1.BackgroundShellSpawnResult. + * Use `create(BackgroundShellSpawnResultSchema)` to create a new message. + */ +export const BackgroundShellSpawnResultSchema = +/*@__PURE__*/ +messageDesc(file_agent, 147); +/** + * Describes the message agent.v1.BackgroundShellSpawnSuccess. + * Use `create(BackgroundShellSpawnSuccessSchema)` to create a new message. + */ +export const BackgroundShellSpawnSuccessSchema = +/*@__PURE__*/ +messageDesc(file_agent, 148); +/** + * Describes the message agent.v1.BackgroundShellSpawnError. + * Use `create(BackgroundShellSpawnErrorSchema)` to create a new message. + */ +export const BackgroundShellSpawnErrorSchema = +/*@__PURE__*/ +messageDesc(file_agent, 149); +/** + * Describes the message agent.v1.WriteShellStdinArgs. + * Use `create(WriteShellStdinArgsSchema)` to create a new message. + */ +export const WriteShellStdinArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 150); +/** + * Describes the message agent.v1.WriteShellStdinResult. + * Use `create(WriteShellStdinResultSchema)` to create a new message. + */ +export const WriteShellStdinResultSchema = +/*@__PURE__*/ +messageDesc(file_agent, 151); +/** + * Describes the message agent.v1.WriteShellStdinSuccess. + * Use `create(WriteShellStdinSuccessSchema)` to create a new message. + */ +export const WriteShellStdinSuccessSchema = +/*@__PURE__*/ +messageDesc(file_agent, 152); +/** + * Describes the message agent.v1.WriteShellStdinError. + * Use `create(WriteShellStdinErrorSchema)` to create a new message. + */ +export const WriteShellStdinErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 153); +/** + * Describes the message agent.v1.Coordinate. + * Use `create(CoordinateSchema)` to create a new message. + */ +export const CoordinateSchema = /*@__PURE__*/ messageDesc(file_agent, 154); +/** + * Describes the message agent.v1.ComputerUseArgs. + * Use `create(ComputerUseArgsSchema)` to create a new message. + */ +export const ComputerUseArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 155); +/** + * Describes the message agent.v1.ComputerUseAction. + * Use `create(ComputerUseActionSchema)` to create a new message. + */ +export const ComputerUseActionSchema = /*@__PURE__*/ messageDesc(file_agent, 156); +/** + * Describes the message agent.v1.MouseMoveAction. + * Use `create(MouseMoveActionSchema)` to create a new message. + */ +export const MouseMoveActionSchema = /*@__PURE__*/ messageDesc(file_agent, 157); +/** + * Describes the message agent.v1.ClickAction. + * Use `create(ClickActionSchema)` to create a new message. + */ +export const ClickActionSchema = /*@__PURE__*/ messageDesc(file_agent, 158); +/** + * Describes the message agent.v1.MouseDownAction. + * Use `create(MouseDownActionSchema)` to create a new message. + */ +export const MouseDownActionSchema = /*@__PURE__*/ messageDesc(file_agent, 159); +/** + * Describes the message agent.v1.MouseUpAction. + * Use `create(MouseUpActionSchema)` to create a new message. + */ +export const MouseUpActionSchema = /*@__PURE__*/ messageDesc(file_agent, 160); +/** + * Describes the message agent.v1.DragAction. + * Use `create(DragActionSchema)` to create a new message. + */ +export const DragActionSchema = /*@__PURE__*/ messageDesc(file_agent, 161); +/** + * Describes the message agent.v1.ScrollAction. + * Use `create(ScrollActionSchema)` to create a new message. + */ +export const ScrollActionSchema = /*@__PURE__*/ messageDesc(file_agent, 162); +/** + * Describes the message agent.v1.TypeAction. + * Use `create(TypeActionSchema)` to create a new message. + */ +export const TypeActionSchema = /*@__PURE__*/ messageDesc(file_agent, 163); +/** + * Describes the message agent.v1.KeyAction. + * Use `create(KeyActionSchema)` to create a new message. + */ +export const KeyActionSchema = /*@__PURE__*/ messageDesc(file_agent, 164); +/** + * Describes the message agent.v1.WaitAction. + * Use `create(WaitActionSchema)` to create a new message. + */ +export const WaitActionSchema = /*@__PURE__*/ messageDesc(file_agent, 165); +/** + * Describes the message agent.v1.ScreenshotAction. + * Use `create(ScreenshotActionSchema)` to create a new message. + */ +export const ScreenshotActionSchema = /*@__PURE__*/ messageDesc(file_agent, 166); +/** + * Describes the message agent.v1.CursorPositionAction. + * Use `create(CursorPositionActionSchema)` to create a new message. + */ +export const CursorPositionActionSchema = /*@__PURE__*/ messageDesc(file_agent, 167); +/** + * Describes the message agent.v1.ComputerUseResult. + * Use `create(ComputerUseResultSchema)` to create a new message. + */ +export const ComputerUseResultSchema = /*@__PURE__*/ messageDesc(file_agent, 168); +/** + * Describes the message agent.v1.ComputerUseSuccess. + * Use `create(ComputerUseSuccessSchema)` to create a new message. + */ +export const ComputerUseSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 169); +/** + * Describes the message agent.v1.ComputerUseError. + * Use `create(ComputerUseErrorSchema)` to create a new message. + */ +export const ComputerUseErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 170); +/** + * Describes the message agent.v1.ComputerUseToolCall. + * Use `create(ComputerUseToolCallSchema)` to create a new message. + */ +export const ComputerUseToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 171); +/** + * Describes the message agent.v1.CreatePlanToolCall. + * Use `create(CreatePlanToolCallSchema)` to create a new message. + */ +export const CreatePlanToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 172); +/** + * Describes the message agent.v1.Phase. + * Use `create(PhaseSchema)` to create a new message. + */ +export const PhaseSchema = /*@__PURE__*/ messageDesc(file_agent, 173); +/** + * Describes the message agent.v1.CreatePlanArgs. + * Use `create(CreatePlanArgsSchema)` to create a new message. + */ +export const CreatePlanArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 174); +/** + * Describes the message agent.v1.CreatePlanResult. + * Use `create(CreatePlanResultSchema)` to create a new message. + */ +export const CreatePlanResultSchema = /*@__PURE__*/ messageDesc(file_agent, 175); +/** + * Describes the message agent.v1.CreatePlanSuccess. + * Use `create(CreatePlanSuccessSchema)` to create a new message. + */ +export const CreatePlanSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 176); +/** + * Describes the message agent.v1.CreatePlanError. + * Use `create(CreatePlanErrorSchema)` to create a new message. + */ +export const CreatePlanErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 177); +/** + * Describes the message agent.v1.CreatePlanRequestQuery. + * Use `create(CreatePlanRequestQuerySchema)` to create a new message. + */ +export const CreatePlanRequestQuerySchema = +/*@__PURE__*/ +messageDesc(file_agent, 178); +/** + * Describes the message agent.v1.CreatePlanRequestResponse. + * Use `create(CreatePlanRequestResponseSchema)` to create a new message. + */ +export const CreatePlanRequestResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 179); +/** + * Describes the message agent.v1.CursorRuleTypeGlobal. + * Use `create(CursorRuleTypeGlobalSchema)` to create a new message. + */ +export const CursorRuleTypeGlobalSchema = /*@__PURE__*/ messageDesc(file_agent, 180); +/** + * Describes the message agent.v1.CursorRuleTypeFileGlobs. + * Use `create(CursorRuleTypeFileGlobsSchema)` to create a new message. + */ +export const CursorRuleTypeFileGlobsSchema = +/*@__PURE__*/ +messageDesc(file_agent, 181); +/** + * Describes the message agent.v1.CursorRuleTypeAgentFetched. + * Use `create(CursorRuleTypeAgentFetchedSchema)` to create a new message. + */ +export const CursorRuleTypeAgentFetchedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 182); +/** + * Describes the message agent.v1.CursorRuleTypeManuallyAttached. + * Use `create(CursorRuleTypeManuallyAttachedSchema)` to create a new message. + */ +export const CursorRuleTypeManuallyAttachedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 183); +/** + * Describes the message agent.v1.CursorRuleType. + * Use `create(CursorRuleTypeSchema)` to create a new message. + */ +export const CursorRuleTypeSchema = /*@__PURE__*/ messageDesc(file_agent, 184); +/** + * Describes the message agent.v1.CursorRule. + * Use `create(CursorRuleSchema)` to create a new message. + */ +export const CursorRuleSchema = /*@__PURE__*/ messageDesc(file_agent, 185); +/** + * Describes the message agent.v1.DeleteArgs. + * Use `create(DeleteArgsSchema)` to create a new message. + */ +export const DeleteArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 186); +/** + * Describes the message agent.v1.DeleteResult. + * Use `create(DeleteResultSchema)` to create a new message. + */ +export const DeleteResultSchema = /*@__PURE__*/ messageDesc(file_agent, 187); +/** + * Describes the message agent.v1.DeleteSuccess. + * Use `create(DeleteSuccessSchema)` to create a new message. + */ +export const DeleteSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 188); +/** + * Describes the message agent.v1.DeleteFileNotFound. + * Use `create(DeleteFileNotFoundSchema)` to create a new message. + */ +export const DeleteFileNotFoundSchema = /*@__PURE__*/ messageDesc(file_agent, 189); +/** + * Describes the message agent.v1.DeleteNotFile. + * Use `create(DeleteNotFileSchema)` to create a new message. + */ +export const DeleteNotFileSchema = /*@__PURE__*/ messageDesc(file_agent, 190); +/** + * Describes the message agent.v1.DeletePermissionDenied. + * Use `create(DeletePermissionDeniedSchema)` to create a new message. + */ +export const DeletePermissionDeniedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 191); +/** + * Describes the message agent.v1.DeleteFileBusy. + * Use `create(DeleteFileBusySchema)` to create a new message. + */ +export const DeleteFileBusySchema = /*@__PURE__*/ messageDesc(file_agent, 192); +/** + * Describes the message agent.v1.DeleteRejected. + * Use `create(DeleteRejectedSchema)` to create a new message. + */ +export const DeleteRejectedSchema = /*@__PURE__*/ messageDesc(file_agent, 193); +/** + * Describes the message agent.v1.DeleteError. + * Use `create(DeleteErrorSchema)` to create a new message. + */ +export const DeleteErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 194); +/** + * Describes the message agent.v1.DeleteToolCall. + * Use `create(DeleteToolCallSchema)` to create a new message. + */ +export const DeleteToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 195); +/** + * Describes the message agent.v1.DiagnosticsArgs. + * Use `create(DiagnosticsArgsSchema)` to create a new message. + */ +export const DiagnosticsArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 196); +/** + * Describes the message agent.v1.DiagnosticsResult. + * Use `create(DiagnosticsResultSchema)` to create a new message. + */ +export const DiagnosticsResultSchema = /*@__PURE__*/ messageDesc(file_agent, 197); +/** + * Describes the message agent.v1.DiagnosticsSuccess. + * Use `create(DiagnosticsSuccessSchema)` to create a new message. + */ +export const DiagnosticsSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 198); +/** + * Describes the message agent.v1.Diagnostic. + * Use `create(DiagnosticSchema)` to create a new message. + */ +export const DiagnosticSchema = /*@__PURE__*/ messageDesc(file_agent, 199); +/** + * Describes the message agent.v1.DiagnosticsError. + * Use `create(DiagnosticsErrorSchema)` to create a new message. + */ +export const DiagnosticsErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 200); +/** + * Describes the message agent.v1.DiagnosticsRejected. + * Use `create(DiagnosticsRejectedSchema)` to create a new message. + */ +export const DiagnosticsRejectedSchema = /*@__PURE__*/ messageDesc(file_agent, 201); +/** + * Describes the message agent.v1.DiagnosticsFileNotFound. + * Use `create(DiagnosticsFileNotFoundSchema)` to create a new message. + */ +export const DiagnosticsFileNotFoundSchema = +/*@__PURE__*/ +messageDesc(file_agent, 202); +/** + * Describes the message agent.v1.DiagnosticsPermissionDenied. + * Use `create(DiagnosticsPermissionDeniedSchema)` to create a new message. + */ +export const DiagnosticsPermissionDeniedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 203); +/** + * Describes the message agent.v1.EditArgs. + * Use `create(EditArgsSchema)` to create a new message. + */ +export const EditArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 204); +/** + * Describes the message agent.v1.EditResult. + * Use `create(EditResultSchema)` to create a new message. + */ +export const EditResultSchema = /*@__PURE__*/ messageDesc(file_agent, 205); +/** + * Describes the message agent.v1.EditSuccess. + * Use `create(EditSuccessSchema)` to create a new message. + */ +export const EditSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 206); +/** + * Describes the message agent.v1.EditFileNotFound. + * Use `create(EditFileNotFoundSchema)` to create a new message. + */ +export const EditFileNotFoundSchema = /*@__PURE__*/ messageDesc(file_agent, 207); +/** + * Describes the message agent.v1.EditReadPermissionDenied. + * Use `create(EditReadPermissionDeniedSchema)` to create a new message. + */ +export const EditReadPermissionDeniedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 208); +/** + * Describes the message agent.v1.EditWritePermissionDenied. + * Use `create(EditWritePermissionDeniedSchema)` to create a new message. + */ +export const EditWritePermissionDeniedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 209); +/** + * Describes the message agent.v1.EditRejected. + * Use `create(EditRejectedSchema)` to create a new message. + */ +export const EditRejectedSchema = /*@__PURE__*/ messageDesc(file_agent, 210); +/** + * Describes the message agent.v1.EditError. + * Use `create(EditErrorSchema)` to create a new message. + */ +export const EditErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 211); +/** + * Describes the message agent.v1.EditToolCall. + * Use `create(EditToolCallSchema)` to create a new message. + */ +export const EditToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 212); +/** + * Describes the message agent.v1.EditToolCallDelta. + * Use `create(EditToolCallDeltaSchema)` to create a new message. + */ +export const EditToolCallDeltaSchema = /*@__PURE__*/ messageDesc(file_agent, 213); +/** + * Describes the message agent.v1.ExaFetchArgs. + * Use `create(ExaFetchArgsSchema)` to create a new message. + */ +export const ExaFetchArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 214); +/** + * Describes the message agent.v1.ExaFetchResult. + * Use `create(ExaFetchResultSchema)` to create a new message. + */ +export const ExaFetchResultSchema = /*@__PURE__*/ messageDesc(file_agent, 215); +/** + * Describes the message agent.v1.ExaFetchSuccess. + * Use `create(ExaFetchSuccessSchema)` to create a new message. + */ +export const ExaFetchSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 216); +/** + * Describes the message agent.v1.ExaFetchError. + * Use `create(ExaFetchErrorSchema)` to create a new message. + */ +export const ExaFetchErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 217); +/** + * Describes the message agent.v1.ExaFetchRejected. + * Use `create(ExaFetchRejectedSchema)` to create a new message. + */ +export const ExaFetchRejectedSchema = /*@__PURE__*/ messageDesc(file_agent, 218); +/** + * Describes the message agent.v1.ExaFetchContent. + * Use `create(ExaFetchContentSchema)` to create a new message. + */ +export const ExaFetchContentSchema = /*@__PURE__*/ messageDesc(file_agent, 219); +/** + * Describes the message agent.v1.ExaFetchToolCall. + * Use `create(ExaFetchToolCallSchema)` to create a new message. + */ +export const ExaFetchToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 220); +/** + * Describes the message agent.v1.ExaFetchRequestQuery. + * Use `create(ExaFetchRequestQuerySchema)` to create a new message. + */ +export const ExaFetchRequestQuerySchema = /*@__PURE__*/ messageDesc(file_agent, 221); +/** + * Describes the message agent.v1.ExaFetchRequestResponse. + * Use `create(ExaFetchRequestResponseSchema)` to create a new message. + */ +export const ExaFetchRequestResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 222); +/** + * Describes the message agent.v1.ExaFetchRequestResponse_Approved. + * Use `create(ExaFetchRequestResponse_ApprovedSchema)` to create a new message. + */ +export const ExaFetchRequestResponse_ApprovedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 223); +/** + * Describes the message agent.v1.ExaFetchRequestResponse_Rejected. + * Use `create(ExaFetchRequestResponse_RejectedSchema)` to create a new message. + */ +export const ExaFetchRequestResponse_RejectedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 224); +/** + * Describes the message agent.v1.ExaSearchArgs. + * Use `create(ExaSearchArgsSchema)` to create a new message. + */ +export const ExaSearchArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 225); +/** + * Describes the message agent.v1.ExaSearchResult. + * Use `create(ExaSearchResultSchema)` to create a new message. + */ +export const ExaSearchResultSchema = /*@__PURE__*/ messageDesc(file_agent, 226); +/** + * Describes the message agent.v1.ExaSearchSuccess. + * Use `create(ExaSearchSuccessSchema)` to create a new message. + */ +export const ExaSearchSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 227); +/** + * Describes the message agent.v1.ExaSearchError. + * Use `create(ExaSearchErrorSchema)` to create a new message. + */ +export const ExaSearchErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 228); +/** + * Describes the message agent.v1.ExaSearchRejected. + * Use `create(ExaSearchRejectedSchema)` to create a new message. + */ +export const ExaSearchRejectedSchema = /*@__PURE__*/ messageDesc(file_agent, 229); +/** + * Describes the message agent.v1.ExaSearchReference. + * Use `create(ExaSearchReferenceSchema)` to create a new message. + */ +export const ExaSearchReferenceSchema = /*@__PURE__*/ messageDesc(file_agent, 230); +/** + * Describes the message agent.v1.ExaSearchToolCall. + * Use `create(ExaSearchToolCallSchema)` to create a new message. + */ +export const ExaSearchToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 231); +/** + * Describes the message agent.v1.ExaSearchRequestQuery. + * Use `create(ExaSearchRequestQuerySchema)` to create a new message. + */ +export const ExaSearchRequestQuerySchema = +/*@__PURE__*/ +messageDesc(file_agent, 232); +/** + * Describes the message agent.v1.ExaSearchRequestResponse. + * Use `create(ExaSearchRequestResponseSchema)` to create a new message. + */ +export const ExaSearchRequestResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 233); +/** + * Describes the message agent.v1.ExaSearchRequestResponse_Approved. + * Use `create(ExaSearchRequestResponse_ApprovedSchema)` to create a new message. + */ +export const ExaSearchRequestResponse_ApprovedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 234); +/** + * Describes the message agent.v1.ExaSearchRequestResponse_Rejected. + * Use `create(ExaSearchRequestResponse_RejectedSchema)` to create a new message. + */ +export const ExaSearchRequestResponse_RejectedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 235); +/** + * Describes the message agent.v1.ExecClientStreamClose. + * Use `create(ExecClientStreamCloseSchema)` to create a new message. + */ +export const ExecClientStreamCloseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 236); +/** + * Describes the message agent.v1.ExecClientThrow. + * Use `create(ExecClientThrowSchema)` to create a new message. + */ +export const ExecClientThrowSchema = /*@__PURE__*/ messageDesc(file_agent, 237); +/** + * Describes the message agent.v1.ExecClientHeartbeat. + * Use `create(ExecClientHeartbeatSchema)` to create a new message. + */ +export const ExecClientHeartbeatSchema = /*@__PURE__*/ messageDesc(file_agent, 238); +/** + * Describes the message agent.v1.ExecClientControlMessage. + * Use `create(ExecClientControlMessageSchema)` to create a new message. + */ +export const ExecClientControlMessageSchema = +/*@__PURE__*/ +messageDesc(file_agent, 239); +/** + * Describes the message agent.v1.SpanContext. + * Use `create(SpanContextSchema)` to create a new message. + */ +export const SpanContextSchema = /*@__PURE__*/ messageDesc(file_agent, 240); +/** + * Describes the message agent.v1.AbortArgs. + * Use `create(AbortArgsSchema)` to create a new message. + */ +export const AbortArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 241); +/** + * Describes the message agent.v1.AbortResult. + * Use `create(AbortResultSchema)` to create a new message. + */ +export const AbortResultSchema = /*@__PURE__*/ messageDesc(file_agent, 242); +/** + * Describes the message agent.v1.ExecServerMessage. + * Use `create(ExecServerMessageSchema)` to create a new message. + */ +export const ExecServerMessageSchema = /*@__PURE__*/ messageDesc(file_agent, 243); +/** + * Describes the message agent.v1.ExecClientMessage. + * Use `create(ExecClientMessageSchema)` to create a new message. + */ +export const ExecClientMessageSchema = /*@__PURE__*/ messageDesc(file_agent, 244); +/** + * Describes the message agent.v1.FetchArgs. + * Use `create(FetchArgsSchema)` to create a new message. + */ +export const FetchArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 245); +/** + * Describes the message agent.v1.FetchResult. + * Use `create(FetchResultSchema)` to create a new message. + */ +export const FetchResultSchema = /*@__PURE__*/ messageDesc(file_agent, 246); +/** + * Describes the message agent.v1.FetchSuccess. + * Use `create(FetchSuccessSchema)` to create a new message. + */ +export const FetchSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 247); +/** + * Describes the message agent.v1.FetchError. + * Use `create(FetchErrorSchema)` to create a new message. + */ +export const FetchErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 248); +/** + * Describes the message agent.v1.GenerateImageArgs. + * Use `create(GenerateImageArgsSchema)` to create a new message. + */ +export const GenerateImageArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 249); +/** + * Describes the message agent.v1.GenerateImageResult. + * Use `create(GenerateImageResultSchema)` to create a new message. + */ +export const GenerateImageResultSchema = /*@__PURE__*/ messageDesc(file_agent, 250); +/** + * Describes the message agent.v1.GenerateImageSuccess. + * Use `create(GenerateImageSuccessSchema)` to create a new message. + */ +export const GenerateImageSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 251); +/** + * Describes the message agent.v1.GenerateImageError. + * Use `create(GenerateImageErrorSchema)` to create a new message. + */ +export const GenerateImageErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 252); +/** + * Describes the message agent.v1.GenerateImageToolCall. + * Use `create(GenerateImageToolCallSchema)` to create a new message. + */ +export const GenerateImageToolCallSchema = +/*@__PURE__*/ +messageDesc(file_agent, 253); +/** + * Describes the message agent.v1.GrepArgs. + * Use `create(GrepArgsSchema)` to create a new message. + */ +export const GrepArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 254); +/** + * Describes the message agent.v1.GrepResult. + * Use `create(GrepResultSchema)` to create a new message. + */ +export const GrepResultSchema = /*@__PURE__*/ messageDesc(file_agent, 255); +/** + * Describes the message agent.v1.GrepError. + * Use `create(GrepErrorSchema)` to create a new message. + */ +export const GrepErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 256); +/** + * Describes the message agent.v1.GrepSuccess. + * Use `create(GrepSuccessSchema)` to create a new message. + */ +export const GrepSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 257); +/** + * Describes the message agent.v1.GrepUnionResult. + * Use `create(GrepUnionResultSchema)` to create a new message. + */ +export const GrepUnionResultSchema = /*@__PURE__*/ messageDesc(file_agent, 258); +/** + * Describes the message agent.v1.GrepCountResult. + * Use `create(GrepCountResultSchema)` to create a new message. + */ +export const GrepCountResultSchema = /*@__PURE__*/ messageDesc(file_agent, 259); +/** + * Describes the message agent.v1.GrepFileCount. + * Use `create(GrepFileCountSchema)` to create a new message. + */ +export const GrepFileCountSchema = /*@__PURE__*/ messageDesc(file_agent, 260); +/** + * Describes the message agent.v1.GrepFilesResult. + * Use `create(GrepFilesResultSchema)` to create a new message. + */ +export const GrepFilesResultSchema = /*@__PURE__*/ messageDesc(file_agent, 261); +/** + * Describes the message agent.v1.GrepContentResult. + * Use `create(GrepContentResultSchema)` to create a new message. + */ +export const GrepContentResultSchema = /*@__PURE__*/ messageDesc(file_agent, 262); +/** + * Describes the message agent.v1.GrepFileMatch. + * Use `create(GrepFileMatchSchema)` to create a new message. + */ +export const GrepFileMatchSchema = /*@__PURE__*/ messageDesc(file_agent, 263); +/** + * Describes the message agent.v1.GrepContentMatch. + * Use `create(GrepContentMatchSchema)` to create a new message. + */ +export const GrepContentMatchSchema = /*@__PURE__*/ messageDesc(file_agent, 264); +/** + * Describes the message agent.v1.GrepStream. + * Use `create(GrepStreamSchema)` to create a new message. + */ +export const GrepStreamSchema = /*@__PURE__*/ messageDesc(file_agent, 265); +/** + * Describes the message agent.v1.GrepToolCall. + * Use `create(GrepToolCallSchema)` to create a new message. + */ +export const GrepToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 266); +/** + * Describes the message agent.v1.GetBlobArgs. + * Use `create(GetBlobArgsSchema)` to create a new message. + */ +export const GetBlobArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 267); +/** + * Describes the message agent.v1.GetBlobResult. + * Use `create(GetBlobResultSchema)` to create a new message. + */ +export const GetBlobResultSchema = /*@__PURE__*/ messageDesc(file_agent, 268); +/** + * Describes the message agent.v1.SetBlobArgs. + * Use `create(SetBlobArgsSchema)` to create a new message. + */ +export const SetBlobArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 269); +/** + * Describes the message agent.v1.SetBlobResult. + * Use `create(SetBlobResultSchema)` to create a new message. + */ +export const SetBlobResultSchema = /*@__PURE__*/ messageDesc(file_agent, 270); +/** + * Describes the message agent.v1.KvServerMessage. + * Use `create(KvServerMessageSchema)` to create a new message. + */ +export const KvServerMessageSchema = /*@__PURE__*/ messageDesc(file_agent, 271); +/** + * Describes the message agent.v1.KvClientMessage. + * Use `create(KvClientMessageSchema)` to create a new message. + */ +export const KvClientMessageSchema = /*@__PURE__*/ messageDesc(file_agent, 272); +/** + * Describes the message agent.v1.LsArgs. + * Use `create(LsArgsSchema)` to create a new message. + */ +export const LsArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 273); +/** + * Describes the message agent.v1.LsResult. + * Use `create(LsResultSchema)` to create a new message. + */ +export const LsResultSchema = /*@__PURE__*/ messageDesc(file_agent, 274); +/** + * Describes the message agent.v1.LsSuccess. + * Use `create(LsSuccessSchema)` to create a new message. + */ +export const LsSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 275); +/** + * Describes the message agent.v1.LsDirectoryTreeNode. + * Use `create(LsDirectoryTreeNodeSchema)` to create a new message. + */ +export const LsDirectoryTreeNodeSchema = /*@__PURE__*/ messageDesc(file_agent, 276); +/** + * Describes the message agent.v1.LsDirectoryTreeNode_File. + * Use `create(LsDirectoryTreeNode_FileSchema)` to create a new message. + */ +export const LsDirectoryTreeNode_FileSchema = +/*@__PURE__*/ +messageDesc(file_agent, 277); +/** + * Describes the message agent.v1.LsError. + * Use `create(LsErrorSchema)` to create a new message. + */ +export const LsErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 278); +/** + * Describes the message agent.v1.LsRejected. + * Use `create(LsRejectedSchema)` to create a new message. + */ +export const LsRejectedSchema = /*@__PURE__*/ messageDesc(file_agent, 279); +/** + * Describes the message agent.v1.LsTimeout. + * Use `create(LsTimeoutSchema)` to create a new message. + */ +export const LsTimeoutSchema = /*@__PURE__*/ messageDesc(file_agent, 280); +/** + * Describes the message agent.v1.TerminalMetadata. + * Use `create(TerminalMetadataSchema)` to create a new message. + */ +export const TerminalMetadataSchema = /*@__PURE__*/ messageDesc(file_agent, 281); +/** + * Describes the message agent.v1.TerminalMetadata_Command. + * Use `create(TerminalMetadata_CommandSchema)` to create a new message. + */ +export const TerminalMetadata_CommandSchema = +/*@__PURE__*/ +messageDesc(file_agent, 282); +/** + * Describes the message agent.v1.LsToolCall. + * Use `create(LsToolCallSchema)` to create a new message. + */ +export const LsToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 283); +/** + * Describes the message agent.v1.McpArgs. + * Use `create(McpArgsSchema)` to create a new message. + */ +export const McpArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 284); +/** + * Describes the message agent.v1.McpResult. + * Use `create(McpResultSchema)` to create a new message. + */ +export const McpResultSchema = /*@__PURE__*/ messageDesc(file_agent, 285); +/** + * Describes the message agent.v1.McpToolNotFound. + * Use `create(McpToolNotFoundSchema)` to create a new message. + */ +export const McpToolNotFoundSchema = /*@__PURE__*/ messageDesc(file_agent, 286); +/** + * Describes the message agent.v1.McpTextContent. + * Use `create(McpTextContentSchema)` to create a new message. + */ +export const McpTextContentSchema = /*@__PURE__*/ messageDesc(file_agent, 287); +/** + * Describes the message agent.v1.McpImageContent. + * Use `create(McpImageContentSchema)` to create a new message. + */ +export const McpImageContentSchema = /*@__PURE__*/ messageDesc(file_agent, 288); +/** + * Describes the message agent.v1.McpToolResultContentItem. + * Use `create(McpToolResultContentItemSchema)` to create a new message. + */ +export const McpToolResultContentItemSchema = +/*@__PURE__*/ +messageDesc(file_agent, 289); +/** + * Describes the message agent.v1.McpSuccess. + * Use `create(McpSuccessSchema)` to create a new message. + */ +export const McpSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 290); +/** + * Describes the message agent.v1.McpError. + * Use `create(McpErrorSchema)` to create a new message. + */ +export const McpErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 291); +/** + * Describes the message agent.v1.McpRejected. + * Use `create(McpRejectedSchema)` to create a new message. + */ +export const McpRejectedSchema = /*@__PURE__*/ messageDesc(file_agent, 292); +/** + * Describes the message agent.v1.McpPermissionDenied. + * Use `create(McpPermissionDeniedSchema)` to create a new message. + */ +export const McpPermissionDeniedSchema = /*@__PURE__*/ messageDesc(file_agent, 293); +/** + * Describes the message agent.v1.ListMcpResourcesExecArgs. + * Use `create(ListMcpResourcesExecArgsSchema)` to create a new message. + */ +export const ListMcpResourcesExecArgsSchema = +/*@__PURE__*/ +messageDesc(file_agent, 294); +/** + * Describes the message agent.v1.ListMcpResourcesExecResult. + * Use `create(ListMcpResourcesExecResultSchema)` to create a new message. + */ +export const ListMcpResourcesExecResultSchema = +/*@__PURE__*/ +messageDesc(file_agent, 295); +/** + * Describes the message agent.v1.ListMcpResourcesExecResult_McpResource. + * Use `create(ListMcpResourcesExecResult_McpResourceSchema)` to create a new message. + */ +export const ListMcpResourcesExecResult_McpResourceSchema = +/*@__PURE__*/ +messageDesc(file_agent, 296); +/** + * Describes the message agent.v1.ListMcpResourcesSuccess. + * Use `create(ListMcpResourcesSuccessSchema)` to create a new message. + */ +export const ListMcpResourcesSuccessSchema = +/*@__PURE__*/ +messageDesc(file_agent, 297); +/** + * Describes the message agent.v1.ListMcpResourcesError. + * Use `create(ListMcpResourcesErrorSchema)` to create a new message. + */ +export const ListMcpResourcesErrorSchema = +/*@__PURE__*/ +messageDesc(file_agent, 298); +/** + * Describes the message agent.v1.ListMcpResourcesRejected. + * Use `create(ListMcpResourcesRejectedSchema)` to create a new message. + */ +export const ListMcpResourcesRejectedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 299); +/** + * Describes the message agent.v1.ReadMcpResourceExecArgs. + * Use `create(ReadMcpResourceExecArgsSchema)` to create a new message. + */ +export const ReadMcpResourceExecArgsSchema = +/*@__PURE__*/ +messageDesc(file_agent, 300); +/** + * Describes the message agent.v1.ReadMcpResourceExecResult. + * Use `create(ReadMcpResourceExecResultSchema)` to create a new message. + */ +export const ReadMcpResourceExecResultSchema = +/*@__PURE__*/ +messageDesc(file_agent, 301); +/** + * Describes the message agent.v1.ReadMcpResourceSuccess. + * Use `create(ReadMcpResourceSuccessSchema)` to create a new message. + */ +export const ReadMcpResourceSuccessSchema = +/*@__PURE__*/ +messageDesc(file_agent, 302); +/** + * Describes the message agent.v1.ReadMcpResourceError. + * Use `create(ReadMcpResourceErrorSchema)` to create a new message. + */ +export const ReadMcpResourceErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 303); +/** + * Describes the message agent.v1.ReadMcpResourceRejected. + * Use `create(ReadMcpResourceRejectedSchema)` to create a new message. + */ +export const ReadMcpResourceRejectedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 304); +/** + * Describes the message agent.v1.ReadMcpResourceNotFound. + * Use `create(ReadMcpResourceNotFoundSchema)` to create a new message. + */ +export const ReadMcpResourceNotFoundSchema = +/*@__PURE__*/ +messageDesc(file_agent, 305); +/** + * Describes the message agent.v1.McpToolDefinition. + * Use `create(McpToolDefinitionSchema)` to create a new message. + */ +export const McpToolDefinitionSchema = /*@__PURE__*/ messageDesc(file_agent, 306); +/** + * Describes the message agent.v1.McpTools. + * Use `create(McpToolsSchema)` to create a new message. + */ +export const McpToolsSchema = /*@__PURE__*/ messageDesc(file_agent, 307); +/** + * Describes the message agent.v1.McpInstructions. + * Use `create(McpInstructionsSchema)` to create a new message. + */ +export const McpInstructionsSchema = /*@__PURE__*/ messageDesc(file_agent, 308); +/** + * Describes the message agent.v1.McpDescriptor. + * Use `create(McpDescriptorSchema)` to create a new message. + */ +export const McpDescriptorSchema = /*@__PURE__*/ messageDesc(file_agent, 309); +/** + * Describes the message agent.v1.McpToolDescriptor. + * Use `create(McpToolDescriptorSchema)` to create a new message. + */ +export const McpToolDescriptorSchema = /*@__PURE__*/ messageDesc(file_agent, 310); +/** + * Describes the message agent.v1.McpFileSystemOptions. + * Use `create(McpFileSystemOptionsSchema)` to create a new message. + */ +export const McpFileSystemOptionsSchema = /*@__PURE__*/ messageDesc(file_agent, 311); +/** + * Describes the message agent.v1.ReadArgs. + * Use `create(ReadArgsSchema)` to create a new message. + */ +export const ReadArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 312); +/** + * Describes the message agent.v1.ReadResult. + * Use `create(ReadResultSchema)` to create a new message. + */ +export const ReadResultSchema = /*@__PURE__*/ messageDesc(file_agent, 313); +/** + * Describes the message agent.v1.ReadSuccess. + * Use `create(ReadSuccessSchema)` to create a new message. + */ +export const ReadSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 314); +/** + * Describes the message agent.v1.ReadError. + * Use `create(ReadErrorSchema)` to create a new message. + */ +export const ReadErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 315); +/** + * Describes the message agent.v1.ReadRejected. + * Use `create(ReadRejectedSchema)` to create a new message. + */ +export const ReadRejectedSchema = /*@__PURE__*/ messageDesc(file_agent, 316); +/** + * Describes the message agent.v1.ReadFileNotFound. + * Use `create(ReadFileNotFoundSchema)` to create a new message. + */ +export const ReadFileNotFoundSchema = /*@__PURE__*/ messageDesc(file_agent, 317); +/** + * Describes the message agent.v1.ReadPermissionDenied. + * Use `create(ReadPermissionDeniedSchema)` to create a new message. + */ +export const ReadPermissionDeniedSchema = /*@__PURE__*/ messageDesc(file_agent, 318); +/** + * Describes the message agent.v1.ReadInvalidFile. + * Use `create(ReadInvalidFileSchema)` to create a new message. + */ +export const ReadInvalidFileSchema = /*@__PURE__*/ messageDesc(file_agent, 319); +/** + * Describes the message agent.v1.ReadToolCall. + * Use `create(ReadToolCallSchema)` to create a new message. + */ +export const ReadToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 320); +/** + * Describes the message agent.v1.ReadToolArgs. + * Use `create(ReadToolArgsSchema)` to create a new message. + */ +export const ReadToolArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 321); +/** + * Describes the message agent.v1.ReadToolResult. + * Use `create(ReadToolResultSchema)` to create a new message. + */ +export const ReadToolResultSchema = /*@__PURE__*/ messageDesc(file_agent, 322); +/** + * Describes the message agent.v1.ReadRange. + * Use `create(ReadRangeSchema)` to create a new message. + */ +export const ReadRangeSchema = /*@__PURE__*/ messageDesc(file_agent, 323); +/** + * Describes the message agent.v1.ReadToolSuccess. + * Use `create(ReadToolSuccessSchema)` to create a new message. + */ +export const ReadToolSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 324); +/** + * Describes the message agent.v1.ReadToolError. + * Use `create(ReadToolErrorSchema)` to create a new message. + */ +export const ReadToolErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 325); +/** + * Describes the message agent.v1.RecordScreenArgs. + * Use `create(RecordScreenArgsSchema)` to create a new message. + */ +export const RecordScreenArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 326); +/** + * Describes the message agent.v1.RecordScreenResult. + * Use `create(RecordScreenResultSchema)` to create a new message. + */ +export const RecordScreenResultSchema = /*@__PURE__*/ messageDesc(file_agent, 327); +/** + * Describes the message agent.v1.RecordScreenStartSuccess. + * Use `create(RecordScreenStartSuccessSchema)` to create a new message. + */ +export const RecordScreenStartSuccessSchema = +/*@__PURE__*/ +messageDesc(file_agent, 328); +/** + * Describes the message agent.v1.RecordScreenSaveSuccess. + * Use `create(RecordScreenSaveSuccessSchema)` to create a new message. + */ +export const RecordScreenSaveSuccessSchema = +/*@__PURE__*/ +messageDesc(file_agent, 329); +/** + * Describes the message agent.v1.RecordScreenDiscardSuccess. + * Use `create(RecordScreenDiscardSuccessSchema)` to create a new message. + */ +export const RecordScreenDiscardSuccessSchema = +/*@__PURE__*/ +messageDesc(file_agent, 330); +/** + * Describes the message agent.v1.RecordScreenFailure. + * Use `create(RecordScreenFailureSchema)` to create a new message. + */ +export const RecordScreenFailureSchema = /*@__PURE__*/ messageDesc(file_agent, 331); +/** + * Describes the message agent.v1.CursorPackagePrompt. + * Use `create(CursorPackagePromptSchema)` to create a new message. + */ +export const CursorPackagePromptSchema = /*@__PURE__*/ messageDesc(file_agent, 332); +/** + * Describes the message agent.v1.CursorPackage. + * Use `create(CursorPackageSchema)` to create a new message. + */ +export const CursorPackageSchema = /*@__PURE__*/ messageDesc(file_agent, 333); +/** + * Describes the message agent.v1.RepositoryIndexingInfo. + * Use `create(RepositoryIndexingInfoSchema)` to create a new message. + */ +export const RepositoryIndexingInfoSchema = +/*@__PURE__*/ +messageDesc(file_agent, 334); +/** + * Describes the message agent.v1.RequestContextArgs. + * Use `create(RequestContextArgsSchema)` to create a new message. + */ +export const RequestContextArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 335); +/** + * Describes the message agent.v1.RequestContextResult. + * Use `create(RequestContextResultSchema)` to create a new message. + */ +export const RequestContextResultSchema = /*@__PURE__*/ messageDesc(file_agent, 336); +/** + * Describes the message agent.v1.RequestContextSuccess. + * Use `create(RequestContextSuccessSchema)` to create a new message. + */ +export const RequestContextSuccessSchema = +/*@__PURE__*/ +messageDesc(file_agent, 337); +/** + * Describes the message agent.v1.RequestContextError. + * Use `create(RequestContextErrorSchema)` to create a new message. + */ +export const RequestContextErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 338); +/** + * Describes the message agent.v1.RequestContextRejected. + * Use `create(RequestContextRejectedSchema)` to create a new message. + */ +export const RequestContextRejectedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 339); +/** + * Describes the message agent.v1.ImageProto. + * Use `create(ImageProtoSchema)` to create a new message. + */ +export const ImageProtoSchema = /*@__PURE__*/ messageDesc(file_agent, 340); +/** + * Describes the message agent.v1.ImageProto_Dimension. + * Use `create(ImageProto_DimensionSchema)` to create a new message. + */ +export const ImageProto_DimensionSchema = /*@__PURE__*/ messageDesc(file_agent, 341); +/** + * Describes the message agent.v1.GitRepoInfo. + * Use `create(GitRepoInfoSchema)` to create a new message. + */ +export const GitRepoInfoSchema = /*@__PURE__*/ messageDesc(file_agent, 342); +/** + * Describes the message agent.v1.RequestContextEnv. + * Use `create(RequestContextEnvSchema)` to create a new message. + */ +export const RequestContextEnvSchema = /*@__PURE__*/ messageDesc(file_agent, 343); +/** + * Describes the message agent.v1.DebugModeConfig. + * Use `create(DebugModeConfigSchema)` to create a new message. + */ +export const DebugModeConfigSchema = /*@__PURE__*/ messageDesc(file_agent, 344); +/** + * Describes the message agent.v1.SkillDescriptor. + * Use `create(SkillDescriptorSchema)` to create a new message. + */ +export const SkillDescriptorSchema = /*@__PURE__*/ messageDesc(file_agent, 345); +/** + * Describes the message agent.v1.SkillOptions. + * Use `create(SkillOptionsSchema)` to create a new message. + */ +export const SkillOptionsSchema = /*@__PURE__*/ messageDesc(file_agent, 346); +/** + * Describes the message agent.v1.RequestContext. + * Use `create(RequestContextSchema)` to create a new message. + */ +export const RequestContextSchema = /*@__PURE__*/ messageDesc(file_agent, 347); +/** + * Describes the message agent.v1.SandboxPolicy. + * Use `create(SandboxPolicySchema)` to create a new message. + */ +export const SandboxPolicySchema = /*@__PURE__*/ messageDesc(file_agent, 348); +/** + * Describes the message agent.v1.SelectedImage. + * Use `create(SelectedImageSchema)` to create a new message. + */ +export const SelectedImageSchema = /*@__PURE__*/ messageDesc(file_agent, 349); +/** + * Describes the message agent.v1.SelectedImage_BlobIdWithData. + * Use `create(SelectedImage_BlobIdWithDataSchema)` to create a new message. + */ +export const SelectedImage_BlobIdWithDataSchema = +/*@__PURE__*/ +messageDesc(file_agent, 350); +/** + * Describes the message agent.v1.SelectedImage_Dimension. + * Use `create(SelectedImage_DimensionSchema)` to create a new message. + */ +export const SelectedImage_DimensionSchema = +/*@__PURE__*/ +messageDesc(file_agent, 351); +/** + * Describes the message agent.v1.ExtraContextEntry. + * Use `create(ExtraContextEntrySchema)` to create a new message. + */ +export const ExtraContextEntrySchema = /*@__PURE__*/ messageDesc(file_agent, 352); +/** + * Describes the message agent.v1.SelectedFile. + * Use `create(SelectedFileSchema)` to create a new message. + */ +export const SelectedFileSchema = /*@__PURE__*/ messageDesc(file_agent, 353); +/** + * Describes the message agent.v1.SelectedCodeSelection. + * Use `create(SelectedCodeSelectionSchema)` to create a new message. + */ +export const SelectedCodeSelectionSchema = +/*@__PURE__*/ +messageDesc(file_agent, 354); +/** + * Describes the message agent.v1.SelectedTerminal. + * Use `create(SelectedTerminalSchema)` to create a new message. + */ +export const SelectedTerminalSchema = /*@__PURE__*/ messageDesc(file_agent, 355); +/** + * Describes the message agent.v1.SelectedTerminalSelection. + * Use `create(SelectedTerminalSelectionSchema)` to create a new message. + */ +export const SelectedTerminalSelectionSchema = +/*@__PURE__*/ +messageDesc(file_agent, 356); +/** + * Describes the message agent.v1.SelectedFolder. + * Use `create(SelectedFolderSchema)` to create a new message. + */ +export const SelectedFolderSchema = /*@__PURE__*/ messageDesc(file_agent, 357); +/** + * Describes the message agent.v1.SelectedExternalLink. + * Use `create(SelectedExternalLinkSchema)` to create a new message. + */ +export const SelectedExternalLinkSchema = /*@__PURE__*/ messageDesc(file_agent, 358); +/** + * Describes the message agent.v1.SelectedCursorRule. + * Use `create(SelectedCursorRuleSchema)` to create a new message. + */ +export const SelectedCursorRuleSchema = /*@__PURE__*/ messageDesc(file_agent, 359); +/** + * Describes the message agent.v1.SelectedGitDiff. + * Use `create(SelectedGitDiffSchema)` to create a new message. + */ +export const SelectedGitDiffSchema = /*@__PURE__*/ messageDesc(file_agent, 360); +/** + * Describes the message agent.v1.SelectedGitDiffFromBranchToMain. + * Use `create(SelectedGitDiffFromBranchToMainSchema)` to create a new message. + */ +export const SelectedGitDiffFromBranchToMainSchema = +/*@__PURE__*/ +messageDesc(file_agent, 361); +/** + * Describes the message agent.v1.SelectedGitCommit. + * Use `create(SelectedGitCommitSchema)` to create a new message. + */ +export const SelectedGitCommitSchema = /*@__PURE__*/ messageDesc(file_agent, 362); +/** + * Describes the message agent.v1.SelectedPullRequest. + * Use `create(SelectedPullRequestSchema)` to create a new message. + */ +export const SelectedPullRequestSchema = /*@__PURE__*/ messageDesc(file_agent, 363); +/** + * Describes the message agent.v1.SelectedGitPRDiffSelection. + * Use `create(SelectedGitPRDiffSelectionSchema)` to create a new message. + */ +export const SelectedGitPRDiffSelectionSchema = +/*@__PURE__*/ +messageDesc(file_agent, 364); +/** + * Describes the message agent.v1.SelectedCursorCommand. + * Use `create(SelectedCursorCommandSchema)` to create a new message. + */ +export const SelectedCursorCommandSchema = +/*@__PURE__*/ +messageDesc(file_agent, 365); +/** + * Describes the message agent.v1.SelectedDocumentation. + * Use `create(SelectedDocumentationSchema)` to create a new message. + */ +export const SelectedDocumentationSchema = +/*@__PURE__*/ +messageDesc(file_agent, 366); +/** + * Describes the message agent.v1.SelectedPastChat. + * Use `create(SelectedPastChatSchema)` to create a new message. + */ +export const SelectedPastChatSchema = /*@__PURE__*/ messageDesc(file_agent, 367); +/** + * Describes the message agent.v1.CallFrame. + * Use `create(CallFrameSchema)` to create a new message. + */ +export const CallFrameSchema = /*@__PURE__*/ messageDesc(file_agent, 368); +/** + * Describes the message agent.v1.StackTrace. + * Use `create(StackTraceSchema)` to create a new message. + */ +export const StackTraceSchema = /*@__PURE__*/ messageDesc(file_agent, 369); +/** + * Describes the message agent.v1.SelectedConsoleLog. + * Use `create(SelectedConsoleLogSchema)` to create a new message. + */ +export const SelectedConsoleLogSchema = /*@__PURE__*/ messageDesc(file_agent, 370); +/** + * Describes the message agent.v1.SelectedUIElement. + * Use `create(SelectedUIElementSchema)` to create a new message. + */ +export const SelectedUIElementSchema = /*@__PURE__*/ messageDesc(file_agent, 371); +/** + * Describes the message agent.v1.SelectedSubagent. + * Use `create(SelectedSubagentSchema)` to create a new message. + */ +export const SelectedSubagentSchema = /*@__PURE__*/ messageDesc(file_agent, 372); +/** + * Describes the message agent.v1.SelectedContext. + * Use `create(SelectedContextSchema)` to create a new message. + */ +export const SelectedContextSchema = /*@__PURE__*/ messageDesc(file_agent, 373); +/** + * Describes the message agent.v1.InvocationContext. + * Use `create(InvocationContextSchema)` to create a new message. + */ +export const InvocationContextSchema = /*@__PURE__*/ messageDesc(file_agent, 374); +/** + * Describes the message agent.v1.InvocationContext_SlackThread. + * Use `create(InvocationContext_SlackThreadSchema)` to create a new message. + */ +export const InvocationContext_SlackThreadSchema = +/*@__PURE__*/ +messageDesc(file_agent, 375); +/** + * Describes the message agent.v1.InvocationContext_GithubPR. + * Use `create(InvocationContext_GithubPRSchema)` to create a new message. + */ +export const InvocationContext_GithubPRSchema = +/*@__PURE__*/ +messageDesc(file_agent, 376); +/** + * Describes the message agent.v1.InvocationContext_IdeState. + * Use `create(InvocationContext_IdeStateSchema)` to create a new message. + */ +export const InvocationContext_IdeStateSchema = +/*@__PURE__*/ +messageDesc(file_agent, 377); +/** + * Describes the message agent.v1.InvocationContext_IdeState_File. + * Use `create(InvocationContext_IdeState_FileSchema)` to create a new message. + */ +export const InvocationContext_IdeState_FileSchema = +/*@__PURE__*/ +messageDesc(file_agent, 378); +/** + * Describes the message agent.v1.InvocationContext_IdeState_File_CursorPosition. + * Use `create(InvocationContext_IdeState_File_CursorPositionSchema)` to create a new message. + */ +export const InvocationContext_IdeState_File_CursorPositionSchema = +/*@__PURE__*/ +messageDesc(file_agent, 379); +/** + * Describes the message agent.v1.InvocationContext_IdeState_ViewedPullRequest. + * Use `create(InvocationContext_IdeState_ViewedPullRequestSchema)` to create a new message. + */ +export const InvocationContext_IdeState_ViewedPullRequestSchema = +/*@__PURE__*/ +messageDesc(file_agent, 380); +/** + * Describes the message agent.v1.SetupVmEnvironmentArgs. + * Use `create(SetupVmEnvironmentArgsSchema)` to create a new message. + */ +export const SetupVmEnvironmentArgsSchema = +/*@__PURE__*/ +messageDesc(file_agent, 381); +/** + * Describes the message agent.v1.SetupVmEnvironmentResult. + * Use `create(SetupVmEnvironmentResultSchema)` to create a new message. + */ +export const SetupVmEnvironmentResultSchema = +/*@__PURE__*/ +messageDesc(file_agent, 382); +/** + * Describes the message agent.v1.SetupVmEnvironmentSuccess. + * Use `create(SetupVmEnvironmentSuccessSchema)` to create a new message. + */ +export const SetupVmEnvironmentSuccessSchema = +/*@__PURE__*/ +messageDesc(file_agent, 383); +/** + * Describes the message agent.v1.SetupVmEnvironmentToolCall. + * Use `create(SetupVmEnvironmentToolCallSchema)` to create a new message. + */ +export const SetupVmEnvironmentToolCallSchema = +/*@__PURE__*/ +messageDesc(file_agent, 384); +/** + * Describes the message agent.v1.ShellCommandParsingResult. + * Use `create(ShellCommandParsingResultSchema)` to create a new message. + */ +export const ShellCommandParsingResultSchema = +/*@__PURE__*/ +messageDesc(file_agent, 385); +/** + * Describes the message agent.v1.ShellCommandParsingResult_ExecutableCommandArg. + * Use `create(ShellCommandParsingResult_ExecutableCommandArgSchema)` to create a new message. + */ +export const ShellCommandParsingResult_ExecutableCommandArgSchema = +/*@__PURE__*/ +messageDesc(file_agent, 386); +/** + * Describes the message agent.v1.ShellCommandParsingResult_ExecutableCommand. + * Use `create(ShellCommandParsingResult_ExecutableCommandSchema)` to create a new message. + */ +export const ShellCommandParsingResult_ExecutableCommandSchema = +/*@__PURE__*/ +messageDesc(file_agent, 387); +/** + * Describes the message agent.v1.ShellArgs. + * Use `create(ShellArgsSchema)` to create a new message. + */ +export const ShellArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 388); +/** + * Describes the message agent.v1.ShellResult. + * Use `create(ShellResultSchema)` to create a new message. + */ +export const ShellResultSchema = /*@__PURE__*/ messageDesc(file_agent, 389); +/** + * Describes the message agent.v1.ShellStreamStdout. + * Use `create(ShellStreamStdoutSchema)` to create a new message. + */ +export const ShellStreamStdoutSchema = /*@__PURE__*/ messageDesc(file_agent, 390); +/** + * Describes the message agent.v1.ShellStreamStderr. + * Use `create(ShellStreamStderrSchema)` to create a new message. + */ +export const ShellStreamStderrSchema = /*@__PURE__*/ messageDesc(file_agent, 391); +/** + * Describes the message agent.v1.ShellStreamExit. + * Use `create(ShellStreamExitSchema)` to create a new message. + */ +export const ShellStreamExitSchema = /*@__PURE__*/ messageDesc(file_agent, 392); +/** + * Describes the message agent.v1.ShellStreamStart. + * Use `create(ShellStreamStartSchema)` to create a new message. + */ +export const ShellStreamStartSchema = /*@__PURE__*/ messageDesc(file_agent, 393); +/** + * Describes the message agent.v1.ShellStreamBackgrounded. + * Use `create(ShellStreamBackgroundedSchema)` to create a new message. + */ +export const ShellStreamBackgroundedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 394); +/** + * Describes the message agent.v1.ShellStream. + * Use `create(ShellStreamSchema)` to create a new message. + */ +export const ShellStreamSchema = /*@__PURE__*/ messageDesc(file_agent, 395); +/** + * Describes the message agent.v1.OutputLocation. + * Use `create(OutputLocationSchema)` to create a new message. + */ +export const OutputLocationSchema = /*@__PURE__*/ messageDesc(file_agent, 396); +/** + * Describes the message agent.v1.ShellSuccess. + * Use `create(ShellSuccessSchema)` to create a new message. + */ +export const ShellSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 397); +/** + * Describes the message agent.v1.ShellFailure. + * Use `create(ShellFailureSchema)` to create a new message. + */ +export const ShellFailureSchema = /*@__PURE__*/ messageDesc(file_agent, 398); +/** + * Describes the message agent.v1.ShellTimeout. + * Use `create(ShellTimeoutSchema)` to create a new message. + */ +export const ShellTimeoutSchema = /*@__PURE__*/ messageDesc(file_agent, 399); +/** + * Describes the message agent.v1.ShellRejected. + * Use `create(ShellRejectedSchema)` to create a new message. + */ +export const ShellRejectedSchema = /*@__PURE__*/ messageDesc(file_agent, 400); +/** + * Describes the message agent.v1.ShellPermissionDenied. + * Use `create(ShellPermissionDeniedSchema)` to create a new message. + */ +export const ShellPermissionDeniedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 401); +/** + * Describes the message agent.v1.ShellSpawnError. + * Use `create(ShellSpawnErrorSchema)` to create a new message. + */ +export const ShellSpawnErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 402); +/** + * Describes the message agent.v1.ShellPartialResult. + * Use `create(ShellPartialResultSchema)` to create a new message. + */ +export const ShellPartialResultSchema = /*@__PURE__*/ messageDesc(file_agent, 403); +/** + * Describes the message agent.v1.ShellToolCall. + * Use `create(ShellToolCallSchema)` to create a new message. + */ +export const ShellToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 404); +/** + * Describes the message agent.v1.ShellToolCallStdoutDelta. + * Use `create(ShellToolCallStdoutDeltaSchema)` to create a new message. + */ +export const ShellToolCallStdoutDeltaSchema = +/*@__PURE__*/ +messageDesc(file_agent, 405); +/** + * Describes the message agent.v1.ShellToolCallStderrDelta. + * Use `create(ShellToolCallStderrDeltaSchema)` to create a new message. + */ +export const ShellToolCallStderrDeltaSchema = +/*@__PURE__*/ +messageDesc(file_agent, 406); +/** + * Describes the message agent.v1.ShellToolCallDelta. + * Use `create(ShellToolCallDeltaSchema)` to create a new message. + */ +export const ShellToolCallDeltaSchema = /*@__PURE__*/ messageDesc(file_agent, 407); +/** + * Describes the message agent.v1.SubagentType. + * Use `create(SubagentTypeSchema)` to create a new message. + */ +export const SubagentTypeSchema = /*@__PURE__*/ messageDesc(file_agent, 408); +/** + * Describes the message agent.v1.SubagentTypeUnspecified. + * Use `create(SubagentTypeUnspecifiedSchema)` to create a new message. + */ +export const SubagentTypeUnspecifiedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 409); +/** + * Describes the message agent.v1.SubagentTypeComputerUse. + * Use `create(SubagentTypeComputerUseSchema)` to create a new message. + */ +export const SubagentTypeComputerUseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 410); +/** + * Describes the message agent.v1.SubagentTypeExplore. + * Use `create(SubagentTypeExploreSchema)` to create a new message. + */ +export const SubagentTypeExploreSchema = /*@__PURE__*/ messageDesc(file_agent, 411); +/** + * Describes the message agent.v1.SubagentTypeCustom. + * Use `create(SubagentTypeCustomSchema)` to create a new message. + */ +export const SubagentTypeCustomSchema = /*@__PURE__*/ messageDesc(file_agent, 412); +/** + * Describes the message agent.v1.CustomSubagent. + * Use `create(CustomSubagentSchema)` to create a new message. + */ +export const CustomSubagentSchema = /*@__PURE__*/ messageDesc(file_agent, 413); +/** + * Describes the message agent.v1.SwitchModeArgs. + * Use `create(SwitchModeArgsSchema)` to create a new message. + */ +export const SwitchModeArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 414); +/** + * Describes the message agent.v1.SwitchModeResult. + * Use `create(SwitchModeResultSchema)` to create a new message. + */ +export const SwitchModeResultSchema = /*@__PURE__*/ messageDesc(file_agent, 415); +/** + * Describes the message agent.v1.SwitchModeSuccess. + * Use `create(SwitchModeSuccessSchema)` to create a new message. + */ +export const SwitchModeSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 416); +/** + * Describes the message agent.v1.SwitchModeError. + * Use `create(SwitchModeErrorSchema)` to create a new message. + */ +export const SwitchModeErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 417); +/** + * Describes the message agent.v1.SwitchModeRejected. + * Use `create(SwitchModeRejectedSchema)` to create a new message. + */ +export const SwitchModeRejectedSchema = /*@__PURE__*/ messageDesc(file_agent, 418); +/** + * Describes the message agent.v1.SwitchModeToolCall. + * Use `create(SwitchModeToolCallSchema)` to create a new message. + */ +export const SwitchModeToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 419); +/** + * Describes the message agent.v1.SwitchModeRequestQuery. + * Use `create(SwitchModeRequestQuerySchema)` to create a new message. + */ +export const SwitchModeRequestQuerySchema = +/*@__PURE__*/ +messageDesc(file_agent, 420); +/** + * Describes the message agent.v1.SwitchModeRequestResponse. + * Use `create(SwitchModeRequestResponseSchema)` to create a new message. + */ +export const SwitchModeRequestResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 421); +/** + * Describes the message agent.v1.SwitchModeRequestResponse_Approved. + * Use `create(SwitchModeRequestResponse_ApprovedSchema)` to create a new message. + */ +export const SwitchModeRequestResponse_ApprovedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 422); +/** + * Describes the message agent.v1.SwitchModeRequestResponse_Rejected. + * Use `create(SwitchModeRequestResponse_RejectedSchema)` to create a new message. + */ +export const SwitchModeRequestResponse_RejectedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 423); +/** + * Describes the message agent.v1.TodoItem. + * Use `create(TodoItemSchema)` to create a new message. + */ +export const TodoItemSchema = /*@__PURE__*/ messageDesc(file_agent, 424); +/** + * Describes the message agent.v1.UpdateTodosToolCall. + * Use `create(UpdateTodosToolCallSchema)` to create a new message. + */ +export const UpdateTodosToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 425); +/** + * Describes the message agent.v1.UpdateTodosArgs. + * Use `create(UpdateTodosArgsSchema)` to create a new message. + */ +export const UpdateTodosArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 426); +/** + * Describes the message agent.v1.UpdateTodosResult. + * Use `create(UpdateTodosResultSchema)` to create a new message. + */ +export const UpdateTodosResultSchema = /*@__PURE__*/ messageDesc(file_agent, 427); +/** + * Describes the message agent.v1.UpdateTodosSuccess. + * Use `create(UpdateTodosSuccessSchema)` to create a new message. + */ +export const UpdateTodosSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 428); +/** + * Describes the message agent.v1.UpdateTodosError. + * Use `create(UpdateTodosErrorSchema)` to create a new message. + */ +export const UpdateTodosErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 429); +/** + * Describes the message agent.v1.ReadTodosToolCall. + * Use `create(ReadTodosToolCallSchema)` to create a new message. + */ +export const ReadTodosToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 430); +/** + * Describes the message agent.v1.ReadTodosArgs. + * Use `create(ReadTodosArgsSchema)` to create a new message. + */ +export const ReadTodosArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 431); +/** + * Describes the message agent.v1.ReadTodosResult. + * Use `create(ReadTodosResultSchema)` to create a new message. + */ +export const ReadTodosResultSchema = /*@__PURE__*/ messageDesc(file_agent, 432); +/** + * Describes the message agent.v1.ReadTodosSuccess. + * Use `create(ReadTodosSuccessSchema)` to create a new message. + */ +export const ReadTodosSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 433); +/** + * Describes the message agent.v1.ReadTodosError. + * Use `create(ReadTodosErrorSchema)` to create a new message. + */ +export const ReadTodosErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 434); +/** + * Describes the message agent.v1.Range. + * Use `create(RangeSchema)` to create a new message. + */ +export const RangeSchema = /*@__PURE__*/ messageDesc(file_agent, 435); +/** + * Describes the message agent.v1.Position. + * Use `create(PositionSchema)` to create a new message. + */ +export const PositionSchema = /*@__PURE__*/ messageDesc(file_agent, 436); +/** + * Describes the message agent.v1.Error. + * Use `create(ErrorSchema)` to create a new message. + */ +export const ErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 437); +/** + * Describes the message agent.v1.WebSearchArgs. + * Use `create(WebSearchArgsSchema)` to create a new message. + */ +export const WebSearchArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 438); +/** + * Describes the message agent.v1.WebSearchResult. + * Use `create(WebSearchResultSchema)` to create a new message. + */ +export const WebSearchResultSchema = /*@__PURE__*/ messageDesc(file_agent, 439); +/** + * Describes the message agent.v1.WebSearchSuccess. + * Use `create(WebSearchSuccessSchema)` to create a new message. + */ +export const WebSearchSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 440); +/** + * Describes the message agent.v1.WebSearchError. + * Use `create(WebSearchErrorSchema)` to create a new message. + */ +export const WebSearchErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 441); +/** + * Describes the message agent.v1.WebSearchRejected. + * Use `create(WebSearchRejectedSchema)` to create a new message. + */ +export const WebSearchRejectedSchema = /*@__PURE__*/ messageDesc(file_agent, 442); +/** + * Describes the message agent.v1.WebSearchReference. + * Use `create(WebSearchReferenceSchema)` to create a new message. + */ +export const WebSearchReferenceSchema = /*@__PURE__*/ messageDesc(file_agent, 443); +/** + * Describes the message agent.v1.WebSearchToolCall. + * Use `create(WebSearchToolCallSchema)` to create a new message. + */ +export const WebSearchToolCallSchema = /*@__PURE__*/ messageDesc(file_agent, 444); +/** + * Describes the message agent.v1.WebSearchRequestQuery. + * Use `create(WebSearchRequestQuerySchema)` to create a new message. + */ +export const WebSearchRequestQuerySchema = +/*@__PURE__*/ +messageDesc(file_agent, 445); +/** + * Describes the message agent.v1.WebSearchRequestResponse. + * Use `create(WebSearchRequestResponseSchema)` to create a new message. + */ +export const WebSearchRequestResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 446); +/** + * Describes the message agent.v1.WebSearchRequestResponse_Approved. + * Use `create(WebSearchRequestResponse_ApprovedSchema)` to create a new message. + */ +export const WebSearchRequestResponse_ApprovedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 447); +/** + * Describes the message agent.v1.WebSearchRequestResponse_Rejected. + * Use `create(WebSearchRequestResponse_RejectedSchema)` to create a new message. + */ +export const WebSearchRequestResponse_RejectedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 448); +/** + * Describes the message agent.v1.WriteArgs. + * Use `create(WriteArgsSchema)` to create a new message. + */ +export const WriteArgsSchema = /*@__PURE__*/ messageDesc(file_agent, 449); +/** + * Describes the message agent.v1.WriteResult. + * Use `create(WriteResultSchema)` to create a new message. + */ +export const WriteResultSchema = /*@__PURE__*/ messageDesc(file_agent, 450); +/** + * Describes the message agent.v1.WriteSuccess. + * Use `create(WriteSuccessSchema)` to create a new message. + */ +export const WriteSuccessSchema = /*@__PURE__*/ messageDesc(file_agent, 451); +/** + * Describes the message agent.v1.WritePermissionDenied. + * Use `create(WritePermissionDeniedSchema)` to create a new message. + */ +export const WritePermissionDeniedSchema = +/*@__PURE__*/ +messageDesc(file_agent, 452); +/** + * Describes the message agent.v1.WriteNoSpace. + * Use `create(WriteNoSpaceSchema)` to create a new message. + */ +export const WriteNoSpaceSchema = /*@__PURE__*/ messageDesc(file_agent, 453); +/** + * Describes the message agent.v1.WriteError. + * Use `create(WriteErrorSchema)` to create a new message. + */ +export const WriteErrorSchema = /*@__PURE__*/ messageDesc(file_agent, 454); +/** + * Describes the message agent.v1.WriteRejected. + * Use `create(WriteRejectedSchema)` to create a new message. + */ +export const WriteRejectedSchema = /*@__PURE__*/ messageDesc(file_agent, 455); +/** + * Describes the message agent.v1.BootstrapStatsigRequest. + * Use `create(BootstrapStatsigRequestSchema)` to create a new message. + */ +export const BootstrapStatsigRequestSchema = +/*@__PURE__*/ +messageDesc(file_agent, 456); +/** + * Describes the message agent.v1.PingResponse. + * Use `create(PingResponseSchema)` to create a new message. + */ +export const PingResponseSchema = /*@__PURE__*/ messageDesc(file_agent, 457); +/** + * Describes the message agent.v1.ExecRequest. + * Use `create(ExecRequestSchema)` to create a new message. + */ +export const ExecRequestSchema = /*@__PURE__*/ messageDesc(file_agent, 458); +/** + * Describes the message agent.v1.ExecResponse. + * Use `create(ExecResponseSchema)` to create a new message. + */ +export const ExecResponseSchema = /*@__PURE__*/ messageDesc(file_agent, 459); +/** + * Describes the message agent.v1.StdoutEvent. + * Use `create(StdoutEventSchema)` to create a new message. + */ +export const StdoutEventSchema = /*@__PURE__*/ messageDesc(file_agent, 460); +/** + * Describes the message agent.v1.StderrEvent. + * Use `create(StderrEventSchema)` to create a new message. + */ +export const StderrEventSchema = /*@__PURE__*/ messageDesc(file_agent, 461); +/** + * Describes the message agent.v1.ExitEvent. + * Use `create(ExitEventSchema)` to create a new message. + */ +export const ExitEventSchema = /*@__PURE__*/ messageDesc(file_agent, 462); +/** + * Describes the message agent.v1.ReadTextFileRequest. + * Use `create(ReadTextFileRequestSchema)` to create a new message. + */ +export const ReadTextFileRequestSchema = /*@__PURE__*/ messageDesc(file_agent, 463); +/** + * Describes the message agent.v1.ReadTextFileResponse. + * Use `create(ReadTextFileResponseSchema)` to create a new message. + */ +export const ReadTextFileResponseSchema = /*@__PURE__*/ messageDesc(file_agent, 464); +/** + * Describes the message agent.v1.WriteTextFileRequest. + * Use `create(WriteTextFileRequestSchema)` to create a new message. + */ +export const WriteTextFileRequestSchema = /*@__PURE__*/ messageDesc(file_agent, 465); +/** + * Describes the message agent.v1.WriteTextFileResponse. + * Use `create(WriteTextFileResponseSchema)` to create a new message. + */ +export const WriteTextFileResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 466); +/** + * Describes the message agent.v1.ReadBinaryFileRequest. + * Use `create(ReadBinaryFileRequestSchema)` to create a new message. + */ +export const ReadBinaryFileRequestSchema = +/*@__PURE__*/ +messageDesc(file_agent, 467); +/** + * Describes the message agent.v1.ReadBinaryFileResponse. + * Use `create(ReadBinaryFileResponseSchema)` to create a new message. + */ +export const ReadBinaryFileResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 468); +/** + * Describes the message agent.v1.WriteBinaryFileRequest. + * Use `create(WriteBinaryFileRequestSchema)` to create a new message. + */ +export const WriteBinaryFileRequestSchema = +/*@__PURE__*/ +messageDesc(file_agent, 469); +/** + * Describes the message agent.v1.WriteBinaryFileResponse. + * Use `create(WriteBinaryFileResponseSchema)` to create a new message. + */ +export const WriteBinaryFileResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 470); +/** + * Describes the message agent.v1.GetWorkspaceChangesHashRequest. + * Use `create(GetWorkspaceChangesHashRequestSchema)` to create a new message. + */ +export const GetWorkspaceChangesHashRequestSchema = +/*@__PURE__*/ +messageDesc(file_agent, 471); +/** + * Describes the message agent.v1.GetWorkspaceChangesHashResponse. + * Use `create(GetWorkspaceChangesHashResponseSchema)` to create a new message. + */ +export const GetWorkspaceChangesHashResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 472); +/** + * Describes the message agent.v1.RefreshGithubAccessTokenRequest. + * Use `create(RefreshGithubAccessTokenRequestSchema)` to create a new message. + */ +export const RefreshGithubAccessTokenRequestSchema = +/*@__PURE__*/ +messageDesc(file_agent, 473); +/** + * Describes the message agent.v1.RefreshGithubAccessTokenResponse. + * Use `create(RefreshGithubAccessTokenResponseSchema)` to create a new message. + */ +export const RefreshGithubAccessTokenResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 474); +/** + * Describes the message agent.v1.WarmRemoteAccessServerRequest. + * Use `create(WarmRemoteAccessServerRequestSchema)` to create a new message. + */ +export const WarmRemoteAccessServerRequestSchema = +/*@__PURE__*/ +messageDesc(file_agent, 475); +/** + * Describes the message agent.v1.WarmRemoteAccessServerResponse. + * Use `create(WarmRemoteAccessServerResponseSchema)` to create a new message. + */ +export const WarmRemoteAccessServerResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 476); +/** + * Describes the message agent.v1.ListArtifactsRequest. + * Use `create(ListArtifactsRequestSchema)` to create a new message. + */ +export const ListArtifactsRequestSchema = /*@__PURE__*/ messageDesc(file_agent, 477); +/** + * Describes the message agent.v1.ArtifactUploadMetadata. + * Use `create(ArtifactUploadMetadataSchema)` to create a new message. + */ +export const ArtifactUploadMetadataSchema = +/*@__PURE__*/ +messageDesc(file_agent, 478); +/** + * Describes the message agent.v1.ListArtifactsResponse. + * Use `create(ListArtifactsResponseSchema)` to create a new message. + */ +export const ListArtifactsResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 479); +/** + * Describes the message agent.v1.UploadArtifactsRequest. + * Use `create(UploadArtifactsRequestSchema)` to create a new message. + */ +export const UploadArtifactsRequestSchema = +/*@__PURE__*/ +messageDesc(file_agent, 480); +/** + * Describes the message agent.v1.ArtifactUploadInstruction. + * Use `create(ArtifactUploadInstructionSchema)` to create a new message. + */ +export const ArtifactUploadInstructionSchema = +/*@__PURE__*/ +messageDesc(file_agent, 481); +/** + * Describes the message agent.v1.ArtifactUploadDispatchResult. + * Use `create(ArtifactUploadDispatchResultSchema)` to create a new message. + */ +export const ArtifactUploadDispatchResultSchema = +/*@__PURE__*/ +messageDesc(file_agent, 482); +/** + * Describes the message agent.v1.UploadArtifactsResponse. + * Use `create(UploadArtifactsResponseSchema)` to create a new message. + */ +export const UploadArtifactsResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 483); +/** + * Describes the message agent.v1.GetMcpRefreshTokensRequest. + * Use `create(GetMcpRefreshTokensRequestSchema)` to create a new message. + */ +export const GetMcpRefreshTokensRequestSchema = +/*@__PURE__*/ +messageDesc(file_agent, 484); +/** + * Describes the message agent.v1.GetMcpRefreshTokensResponse. + * Use `create(GetMcpRefreshTokensResponseSchema)` to create a new message. + */ +export const GetMcpRefreshTokensResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 485); +/** + * Describes the message agent.v1.UpdateEnvironmentVariablesRequest. + * Use `create(UpdateEnvironmentVariablesRequestSchema)` to create a new message. + */ +export const UpdateEnvironmentVariablesRequestSchema = +/*@__PURE__*/ +messageDesc(file_agent, 486); +/** + * Describes the message agent.v1.UpdateEnvironmentVariablesResponse. + * Use `create(UpdateEnvironmentVariablesResponseSchema)` to create a new message. + */ +export const UpdateEnvironmentVariablesResponseSchema = +/*@__PURE__*/ +messageDesc(file_agent, 487); +/** + * Describes the message agent.v1.McpOAuthStoredData. + * Use `create(McpOAuthStoredDataSchema)` to create a new message. + */ +export const McpOAuthStoredDataSchema = /*@__PURE__*/ messageDesc(file_agent, 488); +/** + * Describes the message agent.v1.Frame. + * Use `create(FrameSchema)` to create a new message. + */ +export const FrameSchema = /*@__PURE__*/ messageDesc(file_agent, 489); +/** + * Describes the message agent.v1.Empty. + * Use `create(EmptySchema)` to create a new message. + */ +export const EmptySchema = /*@__PURE__*/ messageDesc(file_agent, 490); +/** + * Describes the message agent.v1.BidiRequestId. + * Use `create(BidiRequestIdSchema)` to create a new message. + */ +export const BidiRequestIdSchema = /*@__PURE__*/ messageDesc(file_agent, 491); +/** + * @generated from enum agent.v1.AppliedAgentChange_ChangeType + */ +export var AppliedAgentChange_ChangeType; +(function (AppliedAgentChange_ChangeType) { + /** + * @generated from enum value: CHANGE_TYPE_UNSPECIFIED = 0; + */ + AppliedAgentChange_ChangeType[AppliedAgentChange_ChangeType["CHANGE_TYPE_UNSPECIFIED"] = 0] = "CHANGE_TYPE_UNSPECIFIED"; + /** + * @generated from enum value: CHANGE_TYPE_CREATED = 1; + */ + AppliedAgentChange_ChangeType[AppliedAgentChange_ChangeType["CHANGE_TYPE_CREATED"] = 1] = "CHANGE_TYPE_CREATED"; + /** + * @generated from enum value: CHANGE_TYPE_MODIFIED = 2; + */ + AppliedAgentChange_ChangeType[AppliedAgentChange_ChangeType["CHANGE_TYPE_MODIFIED"] = 2] = "CHANGE_TYPE_MODIFIED"; + /** + * @generated from enum value: CHANGE_TYPE_DELETED = 3; + */ + AppliedAgentChange_ChangeType[AppliedAgentChange_ChangeType["CHANGE_TYPE_DELETED"] = 3] = "CHANGE_TYPE_DELETED"; +})(AppliedAgentChange_ChangeType || (AppliedAgentChange_ChangeType = {})); +/** + * Describes the enum agent.v1.AppliedAgentChange_ChangeType. + */ +export const AppliedAgentChange_ChangeTypeSchema = +/*@__PURE__*/ +enumDesc(file_agent, 0); +/** + * @generated from enum agent.v1.MouseButton + */ +export var MouseButton; +(function (MouseButton) { + /** + * @generated from enum value: MOUSE_BUTTON_UNSPECIFIED = 0; + */ + MouseButton[MouseButton["UNSPECIFIED"] = 0] = "UNSPECIFIED"; + /** + * @generated from enum value: MOUSE_BUTTON_LEFT = 1; + */ + MouseButton[MouseButton["LEFT"] = 1] = "LEFT"; + /** + * @generated from enum value: MOUSE_BUTTON_RIGHT = 2; + */ + MouseButton[MouseButton["RIGHT"] = 2] = "RIGHT"; + /** + * @generated from enum value: MOUSE_BUTTON_MIDDLE = 3; + */ + MouseButton[MouseButton["MIDDLE"] = 3] = "MIDDLE"; + /** + * @generated from enum value: MOUSE_BUTTON_BACK = 4; + */ + MouseButton[MouseButton["BACK"] = 4] = "BACK"; + /** + * @generated from enum value: MOUSE_BUTTON_FORWARD = 5; + */ + MouseButton[MouseButton["FORWARD"] = 5] = "FORWARD"; +})(MouseButton || (MouseButton = {})); +/** + * Describes the enum agent.v1.MouseButton. + */ +export const MouseButtonSchema = /*@__PURE__*/ enumDesc(file_agent, 1); +/** + * @generated from enum agent.v1.ScrollDirection + */ +export var ScrollDirection; +(function (ScrollDirection) { + /** + * @generated from enum value: SCROLL_DIRECTION_UNSPECIFIED = 0; + */ + ScrollDirection[ScrollDirection["UNSPECIFIED"] = 0] = "UNSPECIFIED"; + /** + * @generated from enum value: SCROLL_DIRECTION_UP = 1; + */ + ScrollDirection[ScrollDirection["UP"] = 1] = "UP"; + /** + * @generated from enum value: SCROLL_DIRECTION_DOWN = 2; + */ + ScrollDirection[ScrollDirection["DOWN"] = 2] = "DOWN"; + /** + * @generated from enum value: SCROLL_DIRECTION_LEFT = 3; + */ + ScrollDirection[ScrollDirection["LEFT"] = 3] = "LEFT"; + /** + * @generated from enum value: SCROLL_DIRECTION_RIGHT = 4; + */ + ScrollDirection[ScrollDirection["RIGHT"] = 4] = "RIGHT"; +})(ScrollDirection || (ScrollDirection = {})); +/** + * Describes the enum agent.v1.ScrollDirection. + */ +export const ScrollDirectionSchema = /*@__PURE__*/ enumDesc(file_agent, 2); +/** + * @generated from enum agent.v1.CursorRuleSource + */ +export var CursorRuleSource; +(function (CursorRuleSource) { + /** + * @generated from enum value: CURSOR_RULE_SOURCE_UNSPECIFIED = 0; + */ + CursorRuleSource[CursorRuleSource["UNSPECIFIED"] = 0] = "UNSPECIFIED"; + /** + * @generated from enum value: CURSOR_RULE_SOURCE_TEAM = 1; + */ + CursorRuleSource[CursorRuleSource["TEAM"] = 1] = "TEAM"; + /** + * @generated from enum value: CURSOR_RULE_SOURCE_USER = 2; + */ + CursorRuleSource[CursorRuleSource["USER"] = 2] = "USER"; +})(CursorRuleSource || (CursorRuleSource = {})); +/** + * Describes the enum agent.v1.CursorRuleSource. + */ +export const CursorRuleSourceSchema = /*@__PURE__*/ enumDesc(file_agent, 3); +/** + * @generated from enum agent.v1.DiagnosticSeverity + */ +export var DiagnosticSeverity; +(function (DiagnosticSeverity) { + /** + * @generated from enum value: DIAGNOSTIC_SEVERITY_UNSPECIFIED = 0; + */ + DiagnosticSeverity[DiagnosticSeverity["UNSPECIFIED"] = 0] = "UNSPECIFIED"; + /** + * @generated from enum value: DIAGNOSTIC_SEVERITY_ERROR = 1; + */ + DiagnosticSeverity[DiagnosticSeverity["ERROR"] = 1] = "ERROR"; + /** + * @generated from enum value: DIAGNOSTIC_SEVERITY_WARNING = 2; + */ + DiagnosticSeverity[DiagnosticSeverity["WARNING"] = 2] = "WARNING"; + /** + * @generated from enum value: DIAGNOSTIC_SEVERITY_INFORMATION = 3; + */ + DiagnosticSeverity[DiagnosticSeverity["INFORMATION"] = 3] = "INFORMATION"; + /** + * @generated from enum value: DIAGNOSTIC_SEVERITY_HINT = 4; + */ + DiagnosticSeverity[DiagnosticSeverity["HINT"] = 4] = "HINT"; +})(DiagnosticSeverity || (DiagnosticSeverity = {})); +/** + * Describes the enum agent.v1.DiagnosticSeverity. + */ +export const DiagnosticSeveritySchema = /*@__PURE__*/ enumDesc(file_agent, 4); +/** + * @generated from enum agent.v1.RecordingMode + */ +export var RecordingMode; +(function (RecordingMode) { + /** + * @generated from enum value: RECORDING_MODE_UNSPECIFIED = 0; + */ + RecordingMode[RecordingMode["UNSPECIFIED"] = 0] = "UNSPECIFIED"; + /** + * @generated from enum value: RECORDING_MODE_START_RECORDING = 1; + */ + RecordingMode[RecordingMode["START_RECORDING"] = 1] = "START_RECORDING"; + /** + * @generated from enum value: RECORDING_MODE_SAVE_RECORDING = 2; + */ + RecordingMode[RecordingMode["SAVE_RECORDING"] = 2] = "SAVE_RECORDING"; + /** + * @generated from enum value: RECORDING_MODE_DISCARD_RECORDING = 3; + */ + RecordingMode[RecordingMode["DISCARD_RECORDING"] = 3] = "DISCARD_RECORDING"; +})(RecordingMode || (RecordingMode = {})); +/** + * Describes the enum agent.v1.RecordingMode. + */ +export const RecordingModeSchema = /*@__PURE__*/ enumDesc(file_agent, 5); +/** + * @generated from enum agent.v1.RequestedFilePathRejectedReason + */ +export var RequestedFilePathRejectedReason; +(function (RequestedFilePathRejectedReason) { + /** + * @generated from enum value: REQUESTED_FILE_PATH_REJECTED_REASON_UNSPECIFIED = 0; + */ + RequestedFilePathRejectedReason[RequestedFilePathRejectedReason["UNSPECIFIED"] = 0] = "UNSPECIFIED"; + /** + * @generated from enum value: REQUESTED_FILE_PATH_REJECTED_REASON_SLASHES_NOT_ALLOWED = 1; + */ + RequestedFilePathRejectedReason[RequestedFilePathRejectedReason["SLASHES_NOT_ALLOWED"] = 1] = "SLASHES_NOT_ALLOWED"; +})(RequestedFilePathRejectedReason || (RequestedFilePathRejectedReason = {})); +/** + * Describes the enum agent.v1.RequestedFilePathRejectedReason. + */ +export const RequestedFilePathRejectedReasonSchema = +/*@__PURE__*/ +enumDesc(file_agent, 6); +/** + * @generated from enum agent.v1.PackageType + */ +export var PackageType; +(function (PackageType) { + /** + * @generated from enum value: PACKAGE_TYPE_UNSPECIFIED = 0; + */ + PackageType[PackageType["UNSPECIFIED"] = 0] = "UNSPECIFIED"; + /** + * @generated from enum value: PACKAGE_TYPE_CURSOR_PROJECT = 1; + */ + PackageType[PackageType["CURSOR_PROJECT"] = 1] = "CURSOR_PROJECT"; + /** + * @generated from enum value: PACKAGE_TYPE_CURSOR_PERSONAL = 2; + */ + PackageType[PackageType["CURSOR_PERSONAL"] = 2] = "CURSOR_PERSONAL"; + /** + * @generated from enum value: PACKAGE_TYPE_CLAUDE_SKILL = 3; + */ + PackageType[PackageType["CLAUDE_SKILL"] = 3] = "CLAUDE_SKILL"; + /** + * @generated from enum value: PACKAGE_TYPE_CLAUDE_PLUGIN = 4; + */ + PackageType[PackageType["CLAUDE_PLUGIN"] = 4] = "CLAUDE_PLUGIN"; +})(PackageType || (PackageType = {})); +/** + * Describes the enum agent.v1.PackageType. + */ +export const PackageTypeSchema = /*@__PURE__*/ enumDesc(file_agent, 7); +/** + * @generated from enum agent.v1.SandboxPolicy_Type + */ +export var SandboxPolicy_Type; +(function (SandboxPolicy_Type) { + /** + * @generated from enum value: TYPE_UNSPECIFIED = 0; + */ + SandboxPolicy_Type[SandboxPolicy_Type["TYPE_UNSPECIFIED"] = 0] = "TYPE_UNSPECIFIED"; + /** + * @generated from enum value: TYPE_INSECURE_NONE = 1; + */ + SandboxPolicy_Type[SandboxPolicy_Type["TYPE_INSECURE_NONE"] = 1] = "TYPE_INSECURE_NONE"; + /** + * @generated from enum value: TYPE_WORKSPACE_READWRITE = 2; + */ + SandboxPolicy_Type[SandboxPolicy_Type["TYPE_WORKSPACE_READWRITE"] = 2] = "TYPE_WORKSPACE_READWRITE"; + /** + * @generated from enum value: TYPE_WORKSPACE_READONLY = 3; + */ + SandboxPolicy_Type[SandboxPolicy_Type["TYPE_WORKSPACE_READONLY"] = 3] = "TYPE_WORKSPACE_READONLY"; +})(SandboxPolicy_Type || (SandboxPolicy_Type = {})); +/** + * Describes the enum agent.v1.SandboxPolicy_Type. + */ +export const SandboxPolicy_TypeSchema = /*@__PURE__*/ enumDesc(file_agent, 8); +/** + * @generated from enum agent.v1.TimeoutBehavior + */ +export var TimeoutBehavior; +(function (TimeoutBehavior) { + /** + * @generated from enum value: TIMEOUT_BEHAVIOR_UNSPECIFIED = 0; + */ + TimeoutBehavior[TimeoutBehavior["UNSPECIFIED"] = 0] = "UNSPECIFIED"; + /** + * @generated from enum value: TIMEOUT_BEHAVIOR_CANCEL = 1; + */ + TimeoutBehavior[TimeoutBehavior["CANCEL"] = 1] = "CANCEL"; + /** + * @generated from enum value: TIMEOUT_BEHAVIOR_BACKGROUND = 2; + */ + TimeoutBehavior[TimeoutBehavior["BACKGROUND"] = 2] = "BACKGROUND"; +})(TimeoutBehavior || (TimeoutBehavior = {})); +/** + * Describes the enum agent.v1.TimeoutBehavior. + */ +export const TimeoutBehaviorSchema = /*@__PURE__*/ enumDesc(file_agent, 9); +/** + * @generated from enum agent.v1.ShellAbortReason + */ +export var ShellAbortReason; +(function (ShellAbortReason) { + /** + * @generated from enum value: SHELL_ABORT_REASON_UNSPECIFIED = 0; + */ + ShellAbortReason[ShellAbortReason["UNSPECIFIED"] = 0] = "UNSPECIFIED"; + /** + * @generated from enum value: SHELL_ABORT_REASON_USER_ABORT = 1; + */ + ShellAbortReason[ShellAbortReason["USER_ABORT"] = 1] = "USER_ABORT"; + /** + * @generated from enum value: SHELL_ABORT_REASON_TIMEOUT = 2; + */ + ShellAbortReason[ShellAbortReason["TIMEOUT"] = 2] = "TIMEOUT"; +})(ShellAbortReason || (ShellAbortReason = {})); +/** + * Describes the enum agent.v1.ShellAbortReason. + */ +export const ShellAbortReasonSchema = /*@__PURE__*/ enumDesc(file_agent, 10); +/** + * @generated from enum agent.v1.CustomSubagentPermissionMode + */ +export var CustomSubagentPermissionMode; +(function (CustomSubagentPermissionMode) { + /** + * @generated from enum value: CUSTOM_SUBAGENT_PERMISSION_MODE_UNSPECIFIED = 0; + */ + CustomSubagentPermissionMode[CustomSubagentPermissionMode["UNSPECIFIED"] = 0] = "UNSPECIFIED"; + /** + * @generated from enum value: CUSTOM_SUBAGENT_PERMISSION_MODE_DEFAULT = 1; + */ + CustomSubagentPermissionMode[CustomSubagentPermissionMode["DEFAULT"] = 1] = "DEFAULT"; + /** + * @generated from enum value: CUSTOM_SUBAGENT_PERMISSION_MODE_READONLY = 2; + */ + CustomSubagentPermissionMode[CustomSubagentPermissionMode["READONLY"] = 2] = "READONLY"; +})(CustomSubagentPermissionMode || (CustomSubagentPermissionMode = {})); +/** + * Describes the enum agent.v1.CustomSubagentPermissionMode. + */ +export const CustomSubagentPermissionModeSchema = +/*@__PURE__*/ +enumDesc(file_agent, 11); +/** + * @generated from enum agent.v1.TodoStatus + */ +export var TodoStatus; +(function (TodoStatus) { + /** + * @generated from enum value: TODO_STATUS_UNSPECIFIED = 0; + */ + TodoStatus[TodoStatus["UNSPECIFIED"] = 0] = "UNSPECIFIED"; + /** + * @generated from enum value: TODO_STATUS_PENDING = 1; + */ + TodoStatus[TodoStatus["PENDING"] = 1] = "PENDING"; + /** + * @generated from enum value: TODO_STATUS_IN_PROGRESS = 2; + */ + TodoStatus[TodoStatus["IN_PROGRESS"] = 2] = "IN_PROGRESS"; + /** + * @generated from enum value: TODO_STATUS_COMPLETED = 3; + */ + TodoStatus[TodoStatus["COMPLETED"] = 3] = "COMPLETED"; + /** + * @generated from enum value: TODO_STATUS_CANCELLED = 4; + */ + TodoStatus[TodoStatus["CANCELLED"] = 4] = "CANCELLED"; +})(TodoStatus || (TodoStatus = {})); +/** + * Describes the enum agent.v1.TodoStatus. + */ +export const TodoStatusSchema = /*@__PURE__*/ enumDesc(file_agent, 12); +/** + * @generated from enum agent.v1.ClientOS + */ +export var ClientOS; +(function (ClientOS) { + /** + * @generated from enum value: CLIENT_OS_UNSPECIFIED = 0; + */ + ClientOS[ClientOS["CLIENT_OS_UNSPECIFIED"] = 0] = "CLIENT_OS_UNSPECIFIED"; + /** + * @generated from enum value: CLIENT_OS_WINDOWS = 1; + */ + ClientOS[ClientOS["CLIENT_OS_WINDOWS"] = 1] = "CLIENT_OS_WINDOWS"; + /** + * @generated from enum value: CLIENT_OS_MACOS = 2; + */ + ClientOS[ClientOS["CLIENT_OS_MACOS"] = 2] = "CLIENT_OS_MACOS"; + /** + * @generated from enum value: CLIENT_OS_LINUX = 3; + */ + ClientOS[ClientOS["CLIENT_OS_LINUX"] = 3] = "CLIENT_OS_LINUX"; +})(ClientOS || (ClientOS = {})); +/** + * Describes the enum agent.v1.ClientOS. + */ +export const ClientOSSchema = /*@__PURE__*/ enumDesc(file_agent, 13); +/** + * @generated from enum agent.v1.ArtifactUploadDispatchStatus + */ +export var ArtifactUploadDispatchStatus; +(function (ArtifactUploadDispatchStatus) { + /** + * @generated from enum value: ARTIFACT_UPLOAD_DISPATCH_STATUS_UNSPECIFIED = 0; + */ + ArtifactUploadDispatchStatus[ArtifactUploadDispatchStatus["UNSPECIFIED"] = 0] = "UNSPECIFIED"; + /** + * @generated from enum value: ARTIFACT_UPLOAD_DISPATCH_STATUS_ACCEPTED = 1; + */ + ArtifactUploadDispatchStatus[ArtifactUploadDispatchStatus["ACCEPTED"] = 1] = "ACCEPTED"; + /** + * @generated from enum value: ARTIFACT_UPLOAD_DISPATCH_STATUS_REJECTED = 2; + */ + ArtifactUploadDispatchStatus[ArtifactUploadDispatchStatus["REJECTED"] = 2] = "REJECTED"; + /** + * @generated from enum value: ARTIFACT_UPLOAD_DISPATCH_STATUS_SKIPPED_ALREADY_IN_PROGRESS = 3; + */ + ArtifactUploadDispatchStatus[ArtifactUploadDispatchStatus["SKIPPED_ALREADY_IN_PROGRESS"] = 3] = "SKIPPED_ALREADY_IN_PROGRESS"; +})(ArtifactUploadDispatchStatus || (ArtifactUploadDispatchStatus = {})); +/** + * Describes the enum agent.v1.ArtifactUploadDispatchStatus. + */ +export const ArtifactUploadDispatchStatusSchema = +/*@__PURE__*/ +enumDesc(file_agent, 14); +/** + * @generated from enum agent.v1.Frame_Kind + */ +export var Frame_Kind; +(function (Frame_Kind) { + /** + * @generated from enum value: KIND_UNSPECIFIED = 0; + */ + Frame_Kind[Frame_Kind["KIND_UNSPECIFIED"] = 0] = "KIND_UNSPECIFIED"; + /** + * @generated from enum value: KIND_REQUEST = 1; + */ + Frame_Kind[Frame_Kind["KIND_REQUEST"] = 1] = "KIND_REQUEST"; + /** + * @generated from enum value: KIND_RESPONSE = 2; + */ + Frame_Kind[Frame_Kind["KIND_RESPONSE"] = 2] = "KIND_RESPONSE"; + /** + * @generated from enum value: KIND_ERROR = 3; + */ + Frame_Kind[Frame_Kind["KIND_ERROR"] = 3] = "KIND_ERROR"; +})(Frame_Kind || (Frame_Kind = {})); +/** + * Describes the enum agent.v1.Frame_Kind. + */ +export const Frame_KindSchema = /*@__PURE__*/ enumDesc(file_agent, 15); +/** + * @generated from enum agent.v1.BugbotDeeplinkEventKind + */ +export var BugbotDeeplinkEventKind; +(function (BugbotDeeplinkEventKind) { + /** + * @generated from enum value: BUGBOT_DEEPLINK_EVENT_KIND_UNSPECIFIED = 0; + */ + BugbotDeeplinkEventKind[BugbotDeeplinkEventKind["UNSPECIFIED"] = 0] = "UNSPECIFIED"; + /** + * @generated from enum value: BUGBOT_DEEPLINK_EVENT_KIND_CLICKED = 1; + */ + BugbotDeeplinkEventKind[BugbotDeeplinkEventKind["CLICKED"] = 1] = "CLICKED"; + /** + * @generated from enum value: BUGBOT_DEEPLINK_EVENT_KIND_HANDLED_DIALOG_SHOWN = 2; + */ + BugbotDeeplinkEventKind[BugbotDeeplinkEventKind["HANDLED_DIALOG_SHOWN"] = 2] = "HANDLED_DIALOG_SHOWN"; + /** + * @generated from enum value: BUGBOT_DEEPLINK_EVENT_KIND_HANDLED_CHAT_CREATED = 3; + */ + BugbotDeeplinkEventKind[BugbotDeeplinkEventKind["HANDLED_CHAT_CREATED"] = 3] = "HANDLED_CHAT_CREATED"; + /** + * @generated from enum value: BUGBOT_DEEPLINK_EVENT_KIND_ERROR = 4; + */ + BugbotDeeplinkEventKind[BugbotDeeplinkEventKind["ERROR"] = 4] = "ERROR"; + /** + * @generated from enum value: BUGBOT_DEEPLINK_EVENT_KIND_HANDLED_FIX_IN_WEB = 5; + */ + BugbotDeeplinkEventKind[BugbotDeeplinkEventKind["HANDLED_FIX_IN_WEB"] = 5] = "HANDLED_FIX_IN_WEB"; +})(BugbotDeeplinkEventKind || (BugbotDeeplinkEventKind = {})); +/** + * Describes the enum agent.v1.BugbotDeeplinkEventKind. + */ +export const BugbotDeeplinkEventKindSchema = /*@__PURE__*/ enumDesc(file_agent, 16); +/** + * Agent Service with bidirectional streaming + * + * @generated from service agent.v1.AgentService + */ +export const AgentService = /*@__PURE__*/ serviceDesc(file_agent, 0); +/** + * @generated from service agent.v1.ControlService + */ +export const ControlService = /*@__PURE__*/ serviceDesc(file_agent, 1); +/** + * Agent Service with unary RPC + * + * @generated from service agent.v1.ExecService + */ +export const ExecService = /*@__PURE__*/ serviceDesc(file_agent, 2); +/** + * @generated from service agent.v1.PrivateWorkerBridgeExternalService + */ +export const PrivateWorkerBridgeExternalService = /*@__PURE__*/ serviceDesc(file_agent, 3); +/** + * LifecycleService is exposed by the bridge *client*, in addition to ExecService (tool calls) and ControlService (control operations "within the daemon"). It operates at a similar abstraction level as AnyrunService: it represents operations similar to creating a VM, checking out a repository, etc. + * + * @generated from service agent.v1.LifecycleService + */ +export const LifecycleService = /*@__PURE__*/ serviceDesc(file_agent, 4); diff --git a/dist/proxy.d.ts b/dist/proxy.d.ts new file mode 100644 index 0000000..e356f7a --- /dev/null +++ b/dist/proxy.d.ts @@ -0,0 +1,19 @@ +interface CursorUnaryRpcOptions { + accessToken: string; + rpcPath: string; + requestBody: Uint8Array; + url?: string; + timeoutMs?: number; +} +export declare function callCursorUnaryRpc(options: CursorUnaryRpcOptions): Promise<{ + body: Uint8Array; + exitCode: number; + timedOut: boolean; +}>; +export declare function getProxyPort(): number | undefined; +export declare function startProxy(getAccessToken: () => Promise, models?: ReadonlyArray<{ + id: string; + name: string; +}>): Promise; +export declare function stopProxy(): void; +export {}; diff --git a/dist/proxy.js b/dist/proxy.js new file mode 100644 index 0000000..438d7c3 --- /dev/null +++ b/dist/proxy.js @@ -0,0 +1,1349 @@ +/** + * Local OpenAI-compatible proxy that translates requests to Cursor's gRPC protocol. + * + * Accepts POST /v1/chat/completions in OpenAI format, translates to Cursor's + * protobuf/HTTP2 Connect protocol, and streams back OpenAI-format SSE. + * + * Tool calling uses Cursor's native MCP tool protocol: + * - OpenAI tool defs → McpToolDefinition in RequestContext + * - Cursor toolCallStarted/Delta/Completed → OpenAI tool_calls SSE chunks + * - mcpArgs exec → pause stream, return tool_calls to caller + * - Follow-up request with tool results → resume bridge with mcpResult + * + * HTTP/2 transport is delegated to a Node child process (h2-bridge.mjs) + * because Bun's node:http2 module is broken. + */ +import { create, fromBinary, fromJson, toBinary, toJson } from "@bufbuild/protobuf"; +import { ValueSchema } from "@bufbuild/protobuf/wkt"; +import { AgentClientMessageSchema, AgentRunRequestSchema, AgentServerMessageSchema, ClientHeartbeatSchema, ConversationActionSchema, ConversationStateStructureSchema, ConversationStepSchema, AgentConversationTurnStructureSchema, ConversationTurnStructureSchema, AssistantMessageSchema, BackgroundShellSpawnResultSchema, DeleteResultSchema, DeleteRejectedSchema, DiagnosticsResultSchema, ExecClientMessageSchema, FetchErrorSchema, FetchResultSchema, GetBlobResultSchema, GrepErrorSchema, GrepResultSchema, KvClientMessageSchema, LsRejectedSchema, LsResultSchema, McpErrorSchema, McpResultSchema, McpSuccessSchema, McpTextContentSchema, McpToolDefinitionSchema, McpToolResultContentItemSchema, ModelDetailsSchema, ReadRejectedSchema, ReadResultSchema, RequestContextResultSchema, RequestedModelSchema, RequestContextSchema, RequestContextSuccessSchema, ResumeActionSchema, SetBlobResultSchema, ShellRejectedSchema, ShellResultSchema, UserMessageActionSchema, UserMessageSchema, WriteRejectedSchema, WriteResultSchema, WriteShellStdinErrorSchema, WriteShellStdinResultSchema, } from "./proto/agent_pb.js"; +import { redirectNativeExec, sendNativeExecResult, } from "./native-tools.js"; +import { createHash } from "node:crypto"; +import { spawn as spawnProcess } from "node:child_process"; +import { mkdir, readFile, readdir, stat, unlink, writeFile } from "node:fs/promises"; +import { createServer } from "node:http"; +import { homedir } from "node:os"; +import { dirname, resolve as pathResolve } from "node:path"; +import { Readable } from "node:stream"; +import { fileURLToPath } from "node:url"; +import { z } from "zod"; +const CURSOR_API_URL = process.env.CURSOR_API_URL ?? "https://api2.cursor.sh"; +const CONNECT_END_STREAM_FLAG = 0b00000010; +const BRIDGE_PATH = pathResolve(dirname(fileURLToPath(import.meta.url)), "h2-bridge.mjs"); +const SSE_HEADERS = { + "Content-Type": "text/event-stream", + "Cache-Control": "no-cache", + Connection: "keep-alive", +}; +// Active bridges keyed by a session token (derived from conversation state). +// When tool_calls are returned, the bridge stays alive. The next request +// with tool results looks up the bridge and sends mcpResult messages. +const activeBridges = new Map(); +const conversationStates = new Map(); +const CONVERSATION_TTL_MS = 30 * 60 * 1000; // 30 minutes +// Conversation state also persists to disk so context survives proxy/opencode +// restarts instead of failing with "Blob not found" (issues #22/#29). +const CONVERSATION_DISK_TTL_MS = 7 * 24 * 60 * 60 * 1000; // 7 days +const CONVERSATION_DIR = pathResolve(process.env.XDG_CACHE_HOME ?? pathResolve(homedir(), ".cache"), "opencode-cursor", "conversations"); +const PersistedConversationSchema = z.object({ + conversationId: z.string(), + checkpoint: z.string().nullable(), + blobs: z.record(z.string()), + lastAccessMs: z.number(), +}); +/** Fire-and-forget write of a conversation snapshot to the disk cache. */ +function persistConversation(convKey, stored) { + const payload = { + conversationId: stored.conversationId, + checkpoint: stored.checkpoint + ? Buffer.from(stored.checkpoint).toString("base64") + : null, + blobs: Object.fromEntries([...stored.blobStore].map(([id, data]) => [ + id, + Buffer.from(data).toString("base64"), + ])), + lastAccessMs: stored.lastAccessMs, + }; + void mkdir(CONVERSATION_DIR, { recursive: true }) + .then(() => writeFile(pathResolve(CONVERSATION_DIR, `${convKey}.json`), JSON.stringify(payload))) + .catch(() => { }); +} +async function loadPersistedConversation(convKey) { + try { + const raw = await readFile(pathResolve(CONVERSATION_DIR, `${convKey}.json`), "utf8"); + const parsed = PersistedConversationSchema.parse(JSON.parse(raw)); + if (Date.now() - parsed.lastAccessMs > CONVERSATION_DISK_TTL_MS) { + return undefined; + } + return { + conversationId: parsed.conversationId, + checkpoint: parsed.checkpoint + ? new Uint8Array(Buffer.from(parsed.checkpoint, "base64")) + : null, + blobStore: new Map(Object.entries(parsed.blobs).map(([id, data]) => [ + id, + new Uint8Array(Buffer.from(data, "base64")), + ])), + lastAccessMs: Date.now(), + }; + } + catch { + return undefined; + } +} +/** Best-effort removal of conversation files past the disk TTL. */ +function pruneStaleConversationFiles() { + void (async () => { + try { + const entries = await readdir(CONVERSATION_DIR); + const cutoff = Date.now() - CONVERSATION_DISK_TTL_MS; + for (const entry of entries) { + const file = pathResolve(CONVERSATION_DIR, entry); + const info = await stat(file); + if (info.mtimeMs < cutoff) + await unlink(file); + } + } + catch { } + })(); +} +function evictStaleConversations() { + const now = Date.now(); + for (const [key, stored] of conversationStates) { + if (now - stored.lastAccessMs > CONVERSATION_TTL_MS) { + conversationStates.delete(key); + } + } +} +/** Length-prefix a message: [4-byte BE length][payload] */ +function lpEncode(data) { + const buf = Buffer.alloc(4 + data.length); + buf.writeUInt32BE(data.length, 0); + buf.set(data, 4); + return buf; +} +/** Connect protocol frame: [1-byte flags][4-byte BE length][payload] */ +function frameConnectMessage(data, flags = 0) { + const frame = Buffer.alloc(5 + data.length); + frame[0] = flags; + frame.writeUInt32BE(data.length, 1); + frame.set(data, 5); + return frame; +} +function spawnBridge(options) { + // Use process.execPath so the bridge runs under the same runtime that loads + // this plugin: Bun on the CLI, Node in the Desktop sidecar. Both can run .mjs. + const proc = spawnProcess(process.execPath, [BRIDGE_PATH], { + stdio: ["pipe", "pipe", "ignore"], + }); + const config = JSON.stringify({ + accessToken: options.accessToken, + url: options.url ?? CURSOR_API_URL, + path: options.rpcPath, + unary: options.unary ?? false, + }); + proc.stdin.write(lpEncode(new TextEncoder().encode(config))); + const cbs = { + data: null, + close: null, + }; + // Track exit state so late onClose registrations fire immediately. + let exited = false; + let exitCode = 1; + const exitedPromise = new Promise((resolve) => { + proc.once("exit", (code) => resolve(code ?? 1)); + proc.once("error", () => resolve(1)); + }); + (async () => { + let pending = Buffer.alloc(0); + try { + for await (const chunk of proc.stdout) { + pending = Buffer.concat([pending, Buffer.from(chunk)]); + while (pending.length >= 4) { + const len = pending.readUInt32BE(0); + if (pending.length < 4 + len) + break; + const payload = pending.subarray(4, 4 + len); + pending = pending.subarray(4 + len); + cbs.data?.(Buffer.from(payload)); + } + } + } + catch { + // Stream ended + } + const code = await exitedPromise; + exited = true; + exitCode = code; + cbs.close?.(code); + })(); + return { + proc, + get alive() { return !exited; }, + write(data) { + try { + proc.stdin.write(lpEncode(data)); + } + catch { } + }, + end() { + try { + proc.stdin.write(lpEncode(new Uint8Array(0))); + proc.stdin.end(); + } + catch { } + }, + onData(cb) { cbs.data = cb; }, + onClose(cb) { + if (exited) { + // Process already exited — invoke immediately so streams don't hang. + queueMicrotask(() => cb(exitCode)); + } + else { + cbs.close = cb; + } + }, + }; +} +export async function callCursorUnaryRpc(options) { + const bridge = spawnBridge({ + accessToken: options.accessToken, + rpcPath: options.rpcPath, + url: options.url, + unary: true, + }); + const chunks = []; + const { promise, resolve } = Promise.withResolvers(); + let timedOut = false; + const timeoutMs = options.timeoutMs ?? 5_000; + const timeout = timeoutMs > 0 + ? setTimeout(() => { + timedOut = true; + try { + bridge.proc.kill(); + } + catch { } + }, timeoutMs) + : undefined; + bridge.onData((chunk) => { + chunks.push(Buffer.from(chunk)); + }); + bridge.onClose((exitCode) => { + if (timeout) + clearTimeout(timeout); + resolve({ + body: Buffer.concat(chunks), + exitCode, + timedOut, + }); + }); + // Unary: send raw protobuf body (no Connect framing) + bridge.write(options.requestBody); + bridge.end(); + return promise; +} +let proxyServer; +let proxyPort; +let proxyAccessTokenProvider; +let proxyModels = []; +function buildOpenAIModelList(models) { + return models.map((model) => ({ + id: model.id, + object: "model", + created: 0, + owned_by: "cursor", + })); +} +/** + * Bridge between node:http and the fetch-style handler below so the request + * handling logic is identical on Bun (CLI) and Node (Desktop sidecar). + */ +async function handleProxyRequest(req, res) { + const url = new URL(req.url ?? "/", "http://127.0.0.1"); + try { + if (req.method === "GET" && url.pathname === "/v1/models") { + await sendResponse(res, new Response(JSON.stringify({ + object: "list", + data: buildOpenAIModelList(proxyModels), + }), { headers: { "Content-Type": "application/json" } })); + return; + } + if (req.method === "POST" && url.pathname === "/v1/chat/completions") { + const chunks = []; + for await (const chunk of req) + chunks.push(Buffer.from(chunk)); + const body = JSON.parse(Buffer.concat(chunks).toString("utf8")); + if (!proxyAccessTokenProvider) { + throw new Error("Cursor proxy access token provider not configured"); + } + const accessToken = await proxyAccessTokenProvider(); + await sendResponse(res, await handleChatCompletion(body, accessToken)); + return; + } + await sendResponse(res, new Response("Not Found", { status: 404 })); + } + catch (err) { + const message = err instanceof Error ? err.message : String(err); + await sendResponse(res, new Response(JSON.stringify({ + error: { message, type: "server_error", code: "internal_error" }, + }), { status: 500, headers: { "Content-Type": "application/json" } })); + } +} +async function sendResponse(res, rs) { + res.writeHead(rs.status, Object.fromEntries(rs.headers.entries())); + if (rs.body) { + const stream = Readable.fromWeb(rs.body); + stream.on("error", () => res.destroy()); + stream.pipe(res); + } + else { + res.end(); + } +} +export function getProxyPort() { + return proxyPort; +} +export async function startProxy(getAccessToken, models = []) { + proxyAccessTokenProvider = getAccessToken; + proxyModels = models.map((model) => ({ + id: model.id, + name: model.name, + })); + if (proxyServer && proxyPort) + return proxyPort; + pruneStaleConversationFiles(); + proxyServer = createServer((req, res) => { + handleProxyRequest(req, res).catch(() => { + if (!res.headersSent) + res.writeHead(500, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ error: { message: "internal_error", type: "server_error" } })); + }); + }); + proxyServer.keepAliveTimeout = 255_000; // max — Cursor responses can take 30s+ + await new Promise((resolve, reject) => { + proxyServer.once("error", reject); + proxyServer.listen(0, "127.0.0.1", () => resolve()); + }); + const address = proxyServer.address(); + if (!address || typeof address === "string") { + throw new Error("Failed to bind proxy to a port"); + } + proxyPort = address.port; + return proxyPort; +} +export function stopProxy() { + if (proxyServer) { + proxyServer.close(); + proxyServer = undefined; + proxyPort = undefined; + proxyAccessTokenProvider = undefined; + proxyModels = []; + } + // Clean up any lingering bridges + for (const active of activeBridges.values()) { + clearInterval(active.heartbeatTimer); + active.bridge.end(); + } + activeBridges.clear(); + conversationStates.clear(); +} +async function handleChatCompletion(body, accessToken) { + const { systemPrompts, userText, history, toolResults } = parseMessages(body.messages); + const modelId = body.model; + const tools = body.tools ?? []; + if (!userText && history.length === 0) { + return new Response(JSON.stringify({ + error: { + message: "No user message found", + type: "invalid_request_error", + }, + }), { status: 400, headers: { "Content-Type": "application/json" } }); + } + // bridgeKey: model-specific, for active tool-call bridges + // convKey: model-independent, for conversation state that survives model switches + const bridgeKey = deriveBridgeKey(modelId, body.messages); + const convKey = deriveConversationKey(body.messages); + const activeBridge = activeBridges.get(bridgeKey); + if (activeBridge && toolResults.length > 0) { + activeBridges.delete(bridgeKey); + if (activeBridge.bridge.alive) { + // Resume the live bridge with tool results + return handleToolResultResume(activeBridge, toolResults, userText, modelId, bridgeKey, convKey); + } + // Bridge died (timeout, server disconnect, etc.). + // Clean up and fall through to start a fresh bridge. + clearInterval(activeBridge.heartbeatTimer); + activeBridge.bridge.end(); + } + // Clean up stale bridge if present + if (activeBridge && activeBridges.has(bridgeKey)) { + clearInterval(activeBridge.heartbeatTimer); + activeBridge.bridge.end(); + activeBridges.delete(bridgeKey); + } + let stored = conversationStates.get(convKey); + if (!stored) { + // Fall back to the disk cache so conversations survive proxy restarts + // and in-memory TTL eviction (issues #22/#29). + stored = (await loadPersistedConversation(convKey)) ?? { + conversationId: deterministicUuid(`cursor-conv-id:${convKey}`), + checkpoint: null, + blobStore: new Map(), + lastAccessMs: Date.now(), + }; + conversationStates.set(convKey, stored); + } + stored.lastAccessMs = Date.now(); + evictStaleConversations(); + // Build the request. When the bridge died mid tool-call, history already + // contains the tool results and the request goes out as a resumeAction. + const mcpTools = buildMcpToolDefinitions(tools); + const payload = buildCursorRequest(modelId, systemPrompts, userText, history, stored.conversationId, stored.checkpoint, stored.blobStore); + payload.mcpTools = mcpTools; + if (body.stream === false) { + return handleNonStreamingResponse(payload, accessToken, modelId, convKey); + } + return handleStreamingResponse(payload, accessToken, modelId, bridgeKey, convKey); +} +/** Normalize OpenAI message content to a plain string. */ +function textContent(content) { + if (content == null) + return ""; + if (typeof content === "string") + return content; + return content + .filter((p) => p.type === "text" && p.text) + .map((p) => p.text) + .join("\n"); +} +function parseMessages(messages) { + const systemPrompts = messages + .filter((m) => m.role === "system") + .map((m) => textContent(m.content)) + .filter((text) => text.length > 0); + const toolResults = []; + const history = []; + for (const msg of messages) { + if (msg.role === "tool") { + const content = textContent(msg.content); + toolResults.push({ + toolCallId: msg.tool_call_id ?? "", + content, + }); + if (content) + history.push({ kind: "tool", text: content }); + } + else if (msg.role === "user") { + history.push({ kind: "user", text: textContent(msg.content) }); + } + else if (msg.role === "assistant") { + // Pure tool_calls messages carry no text; the paired tool entries + // preserve that part of the transcript. + const text = textContent(msg.content); + if (text) + history.push({ kind: "assistant", text }); + } + } + // A trailing user message is the active action; anything else (e.g. tool + // results after a dead bridge) leaves userText empty and the request is + // sent as a resumeAction over the reconstructed history. + let userText = ""; + const last = history[history.length - 1]; + if (last?.kind === "user") { + userText = last.text; + history.pop(); + } + return { systemPrompts, userText, history, toolResults }; +} +/** Convert OpenAI tool definitions to Cursor's MCP tool protobuf format. */ +function buildMcpToolDefinitions(tools) { + return tools.map((t) => { + const fn = t.function; + const jsonSchema = fn.parameters && typeof fn.parameters === "object" + ? fn.parameters + : { type: "object", properties: {}, required: [] }; + const inputSchema = toBinary(ValueSchema, fromJson(ValueSchema, jsonSchema)); + return create(McpToolDefinitionSchema, { + name: fn.name, + description: fn.description || "", + providerIdentifier: "opencode", + toolName: fn.name, + inputSchema, + }); + }); +} +/** Decode a Cursor MCP arg value (protobuf Value bytes) to a JS value. */ +function decodeMcpArgValue(value) { + try { + const parsed = fromBinary(ValueSchema, value); + return toJson(ValueSchema, parsed); + } + catch { } + return new TextDecoder().decode(value); +} +/** Decode a map of MCP arg values. */ +function decodeMcpArgsMap(args) { + const decoded = {}; + for (const [key, value] of Object.entries(args)) { + decoded[key] = decodeMcpArgValue(value); + } + return decoded; +} +function buildCursorRequest(modelId, systemPrompts, userText, history, conversationId, checkpoint, existingBlobStore) { + const blobStore = new Map(existingBlobStore ?? []); + // Every `bytes` field in the *Structure messages is a sha256 blob ID — + // server-produced checkpoints content-address turns, user messages, and + // steps alike. Inlining data where an ID is expected makes Cursor fail + // with "Connect error internal: Blob not found" (issues #22/#29). + const storeBlob = (bytes) => { + const blobId = new Uint8Array(createHash("sha256").update(bytes).digest()); + blobStore.set(Buffer.from(blobId).toString("hex"), bytes); + return blobId; + }; + const storeJsonBlob = (obj) => storeBlob(new TextEncoder().encode(JSON.stringify(obj))); + const prompts = systemPrompts.length > 0 + ? systemPrompts + : ["You are a helpful assistant."]; + const systemBlobIds = prompts.map((content) => storeJsonBlob({ role: "system", content })); + // Cursor's server builds the model prompt from `rootPromptMessagesJson`, + // not from `turns[]`. Sending only the system prompt here makes multi-turn + // conversations lose all prior context after a proxy restart, so the full + // history is rebuilt on every request. Server-echoed checkpoints replace + // historical user entries with empty placeholders, which is why the + // checkpoint's own rootPromptMessagesJson cannot be reused. + const rootPromptMessagesJson = [...systemBlobIds]; + for (const entry of history) { + if (entry.kind === "assistant") { + rootPromptMessagesJson.push(storeJsonBlob({ role: "assistant", content: [{ type: "text", text: entry.text }] })); + } + else { + const text = entry.kind === "tool" ? `[Tool Result]\n${entry.text}` : entry.text; + rootPromptMessagesJson.push(storeJsonBlob({ role: "user", content: [{ type: "text", text }] })); + } + } + // turns[]: one entry per user turn, with assistant/tool texts as steps. + // Deterministic message IDs keep blob IDs stable across rebuilds. + const turnBlobIds = []; + let currentTurn = null; + const flushTurn = () => { + if (!currentTurn) + return; + const agentTurn = create(AgentConversationTurnStructureSchema, { + userMessage: currentTurn.userMessageBlobId, + steps: currentTurn.stepBlobIds, + }); + const turnStructure = create(ConversationTurnStructureSchema, { + turn: { case: "agentConversationTurn", value: agentTurn }, + }); + turnBlobIds.push(storeBlob(toBinary(ConversationTurnStructureSchema, turnStructure))); + currentTurn = null; + }; + for (const entry of history) { + if (entry.kind === "user") { + flushTurn(); + const userMsg = create(UserMessageSchema, { + text: entry.text, + messageId: deterministicUuid(`u:${turnBlobIds.length}:${entry.text}`), + }); + currentTurn = { + userMessageBlobId: storeBlob(toBinary(UserMessageSchema, userMsg)), + stepBlobIds: [], + }; + } + else if (currentTurn) { + const text = entry.kind === "tool" ? `[Tool Result]\n${entry.text}` : entry.text; + const step = create(ConversationStepSchema, { + message: { + case: "assistantMessage", + value: create(AssistantMessageSchema, { text }), + }, + }); + currentTurn.stepBlobIds.push(storeBlob(toBinary(ConversationStepSchema, step))); + } + } + flushTurn(); + // Preserve non-history checkpoint fields (todos, file states, summaries) + // when the system prompt is unchanged; otherwise start fresh. + let baseState = null; + if (checkpoint) { + try { + const decoded = fromBinary(ConversationStateStructureSchema, checkpoint); + const head = decoded.rootPromptMessagesJson.slice(0, systemBlobIds.length); + const matches = head.length === systemBlobIds.length && + systemBlobIds.every((id, idx) => Buffer.from(head[idx]).equals(Buffer.from(id))); + if (matches) + baseState = decoded; + } + catch { } + } + const conversationState = baseState + ? create(ConversationStateStructureSchema, { + ...baseState, + rootPromptMessagesJson, + turns: turnBlobIds, + }) + : create(ConversationStateStructureSchema, { + rootPromptMessagesJson, + turns: turnBlobIds, + todos: [], + pendingToolCalls: [], + previousWorkspaceUris: [], + fileStates: {}, + fileStatesV2: {}, + summaryArchives: [], + turnTimings: [], + subagentStates: {}, + selfSummaryCount: 0, + readPaths: [], + }); + // No trailing user message (e.g. tool results after a dead bridge) → + // resume over the reconstructed history instead of faking a user turn. + const action = userText + ? create(ConversationActionSchema, { + action: { + case: "userMessageAction", + value: create(UserMessageActionSchema, { + userMessage: create(UserMessageSchema, { + text: userText, + messageId: crypto.randomUUID(), + }), + }), + }, + }) + : create(ConversationActionSchema, { + action: { case: "resumeAction", value: create(ResumeActionSchema, {}) }, + }); + // "auto" is the proxy's pseudo-model for Cursor's server-side Auto + // routing; the Run API expects modelId "default" for it. + const cursorModelId = modelId === "auto" ? "default" : modelId; + const displayName = modelId === "auto" ? "Auto" : modelId; + const requestedModel = create(RequestedModelSchema, { + modelId: cursorModelId, + }); + const modelDetails = create(ModelDetailsSchema, { + modelId: cursorModelId, + displayModelId: cursorModelId, + displayName, + displayNameShort: displayName, + }); + const runRequest = create(AgentRunRequestSchema, { + conversationState, + action, + modelDetails, + requestedModel, + conversationId, + }); + const clientMessage = create(AgentClientMessageSchema, { + message: { case: "runRequest", value: runRequest }, + }); + return { + requestBytes: toBinary(AgentClientMessageSchema, clientMessage), + blobStore, + mcpTools: [], + cloudRule: prompts.join("\n\n").trim() || undefined, + }; +} +function parseConnectEndStream(data) { + try { + const payload = JSON.parse(new TextDecoder().decode(data)); + const error = payload?.error; + if (error) { + const code = error.code ?? "unknown"; + const message = error.message ?? "Unknown error"; + return new Error(`Connect error ${code}: ${message}`); + } + return null; + } + catch { + return new Error("Failed to parse Connect end stream"); + } +} +function makeHeartbeatBytes() { + const heartbeat = create(AgentClientMessageSchema, { + message: { + case: "clientHeartbeat", + value: create(ClientHeartbeatSchema, {}), + }, + }); + return frameConnectMessage(toBinary(AgentClientMessageSchema, heartbeat)); +} +/** + * Create a stateful parser for Connect protocol frames. + * Handles buffering partial data across chunks. + */ +function createConnectFrameParser(onMessage, onEndStream) { + let pending = Buffer.alloc(0); + return (incoming) => { + pending = Buffer.concat([pending, incoming]); + while (pending.length >= 5) { + const flags = pending[0]; + const msgLen = pending.readUInt32BE(1); + if (pending.length < 5 + msgLen) + break; + const messageBytes = pending.subarray(5, 5 + msgLen); + pending = pending.subarray(5 + msgLen); + if (flags & CONNECT_END_STREAM_FLAG) { + onEndStream(messageBytes); + } + else { + onMessage(messageBytes); + } + } + }; +} +const THINKING_TAG_NAMES = ['think', 'thinking', 'reasoning', 'thought', 'think_intent']; +const MAX_THINKING_TAG_LEN = 16; // is 15 chars +/** + * Strip thinking tags from streamed text, routing tagged content to reasoning. + * Buffers partial tags across chunk boundaries. + */ +function createThinkingTagFilter() { + let buffer = ''; + let inThinking = false; + return { + process(text) { + const input = buffer + text; + buffer = ''; + let content = ''; + let reasoning = ''; + let lastIdx = 0; + const re = new RegExp(`<(/?)(?:${THINKING_TAG_NAMES.join('|')})\\s*>`, 'gi'); + let match; + while ((match = re.exec(input)) !== null) { + const before = input.slice(lastIdx, match.index); + if (inThinking) + reasoning += before; + else + content += before; + inThinking = match[1] !== '/'; + lastIdx = re.lastIndex; + } + const rest = input.slice(lastIdx); + // Buffer a trailing '<' that could be the start of a thinking tag. + const ltPos = rest.lastIndexOf('<'); + if (ltPos >= 0 && rest.length - ltPos < MAX_THINKING_TAG_LEN && /^<\/?[a-z_]*$/i.test(rest.slice(ltPos))) { + buffer = rest.slice(ltPos); + const before = rest.slice(0, ltPos); + if (inThinking) + reasoning += before; + else + content += before; + } + else { + if (inThinking) + reasoning += rest; + else + content += rest; + } + return { content, reasoning }; + }, + flush() { + const b = buffer; + buffer = ''; + if (!b) + return { content: '', reasoning: '' }; + return inThinking ? { content: '', reasoning: b } : { content: b, reasoning: '' }; + }, + }; +} +function computeUsage(state) { + const completion_tokens = state.outputTokens; + const total_tokens = state.totalTokens || completion_tokens; + const prompt_tokens = Math.max(0, total_tokens - completion_tokens); + return { prompt_tokens, completion_tokens, total_tokens }; +} +function processServerMessage(msg, blobStore, mcpTools, cloudRule, sendFrame, state, onText, onMcpExec, onCheckpoint) { + const msgCase = msg.message.case; + if (msgCase === "interactionUpdate") { + handleInteractionUpdate(msg.message.value, state, onText); + } + else if (msgCase === "kvServerMessage") { + handleKvMessage(msg.message.value, blobStore, sendFrame); + } + else if (msgCase === "execServerMessage") { + handleExecMessage(msg.message.value, mcpTools, cloudRule, sendFrame, onMcpExec); + } + else if (msgCase === "conversationCheckpointUpdate") { + const stateStructure = msg.message.value; + if (stateStructure.tokenDetails) { + state.totalTokens = stateStructure.tokenDetails.usedTokens; + } + if (onCheckpoint) { + onCheckpoint(toBinary(ConversationStateStructureSchema, stateStructure)); + } + } +} +function handleInteractionUpdate(update, state, onText) { + const updateCase = update.message?.case; + if (updateCase === "textDelta") { + const delta = update.message.value.text || ""; + if (delta) + onText(delta, false); + } + else if (updateCase === "thinkingDelta") { + const delta = update.message.value.text || ""; + if (delta) + onText(delta, true); + } + else if (updateCase === "tokenDelta") { + state.outputTokens += update.message.value.tokens ?? 0; + } + // toolCallStarted, partialToolCall, toolCallDelta, toolCallCompleted + // are intentionally ignored. MCP tool calls flow through the exec + // message path (mcpArgs → mcpResult), not interaction updates. +} +/** Send a KV client response back to Cursor. */ +function sendKvResponse(kvMsg, messageCase, value, sendFrame) { + const response = create(KvClientMessageSchema, { + id: kvMsg.id, + message: { case: messageCase, value: value }, + }); + const clientMsg = create(AgentClientMessageSchema, { + message: { case: "kvClientMessage", value: response }, + }); + sendFrame(frameConnectMessage(toBinary(AgentClientMessageSchema, clientMsg))); +} +function handleKvMessage(kvMsg, blobStore, sendFrame) { + const kvCase = kvMsg.message.case; + if (kvCase === "getBlobArgs") { + const blobId = kvMsg.message.value.blobId; + const blobIdKey = Buffer.from(blobId).toString("hex"); + const blobData = blobStore.get(blobIdKey); + if (process.env.CURSOR_PROXY_DEBUG) { + console.error(`[proxy] getBlob ${blobIdKey.slice(0, 16)} ${blobData ? `hit (${blobData.length}b)` : "MISS"}`); + } + sendKvResponse(kvMsg, "getBlobResult", create(GetBlobResultSchema, blobData ? { blobData } : {}), sendFrame); + } + else if (kvCase === "setBlobArgs") { + const { blobId, blobData } = kvMsg.message.value; + blobStore.set(Buffer.from(blobId).toString("hex"), blobData); + if (process.env.CURSOR_PROXY_DEBUG) { + console.error(`[proxy] setBlob ${Buffer.from(blobId).toString("hex").slice(0, 16)} (${blobData.length}b)`); + } + sendKvResponse(kvMsg, "setBlobResult", create(SetBlobResultSchema, {}), sendFrame); + } +} +function handleExecMessage(execMsg, mcpTools, cloudRule, sendFrame, onMcpExec) { + const execCase = execMsg.message.case; + if (process.env.CURSOR_PROXY_DEBUG) { + console.error(`[proxy] exec: ${execCase}`); + } + if (execCase === "requestContextArgs") { + // cloudRule is the prompt channel Cursor's agent actually honors; plain + // system messages are ignored server-side (issue #21). + const requestContext = create(RequestContextSchema, { + rules: [], + cloudRule, + repositoryInfo: [], + tools: mcpTools, + gitRepos: [], + projectLayouts: [], + mcpInstructions: [], + fileContents: {}, + customSubagents: [], + }); + const result = create(RequestContextResultSchema, { + result: { + case: "success", + value: create(RequestContextSuccessSchema, { requestContext }), + }, + }); + sendExecResult(execMsg, "requestContextResult", result, sendFrame); + return; + } + if (execCase === "mcpArgs") { + const mcpArgs = execMsg.message.value; + const decoded = decodeMcpArgsMap(mcpArgs.args ?? {}); + onMcpExec({ + execId: execMsg.execId, + execMsgId: execMsg.id, + toolCallId: mcpArgs.toolCallId || crypto.randomUUID(), + toolName: mcpArgs.toolName || mcpArgs.name, + decodedArgs: JSON.stringify(decoded), + }); + return; + } + // --- Native Cursor tools --- + // The model tries these before the MCP tools. When the client provides an + // equivalent tool, redirect the call to it; otherwise reject so the model + // falls back to the MCP tools registered via RequestContext. + const redirect = redirectNativeExec(execMsg, mcpTools); + if (redirect) { + if (process.env.CURSOR_PROXY_DEBUG) { + console.error(`[proxy] redirect ${execCase} -> ${redirect.toolName}`); + } + onMcpExec({ + execId: execMsg.execId, + execMsgId: execMsg.id, + toolCallId: redirect.toolCallId, + toolName: redirect.toolName, + decodedArgs: redirect.decodedArgs, + native: redirect.binding, + }); + return; + } + const REJECT_REASON = "Tool not available in this environment. Use the MCP tools provided instead."; + if (execCase === "readArgs") { + const args = execMsg.message.value; + const result = create(ReadResultSchema, { + result: { case: "rejected", value: create(ReadRejectedSchema, { path: args.path, reason: REJECT_REASON }) }, + }); + sendExecResult(execMsg, "readResult", result, sendFrame); + return; + } + if (execCase === "lsArgs") { + const args = execMsg.message.value; + const result = create(LsResultSchema, { + result: { case: "rejected", value: create(LsRejectedSchema, { path: args.path, reason: REJECT_REASON }) }, + }); + sendExecResult(execMsg, "lsResult", result, sendFrame); + return; + } + if (execCase === "grepArgs") { + const result = create(GrepResultSchema, { + result: { case: "error", value: create(GrepErrorSchema, { error: REJECT_REASON }) }, + }); + sendExecResult(execMsg, "grepResult", result, sendFrame); + return; + } + if (execCase === "writeArgs") { + const args = execMsg.message.value; + const result = create(WriteResultSchema, { + result: { case: "rejected", value: create(WriteRejectedSchema, { path: args.path, reason: REJECT_REASON }) }, + }); + sendExecResult(execMsg, "writeResult", result, sendFrame); + return; + } + if (execCase === "deleteArgs") { + const args = execMsg.message.value; + const result = create(DeleteResultSchema, { + result: { case: "rejected", value: create(DeleteRejectedSchema, { path: args.path, reason: REJECT_REASON }) }, + }); + sendExecResult(execMsg, "deleteResult", result, sendFrame); + return; + } + if (execCase === "shellArgs" || execCase === "shellStreamArgs") { + const args = execMsg.message.value; + const result = create(ShellResultSchema, { + result: { + case: "rejected", + value: create(ShellRejectedSchema, { + command: args.command ?? "", + workingDirectory: args.workingDirectory ?? "", + reason: REJECT_REASON, + isReadonly: false, + }), + }, + }); + sendExecResult(execMsg, "shellResult", result, sendFrame); + return; + } + if (execCase === "backgroundShellSpawnArgs") { + const args = execMsg.message.value; + const result = create(BackgroundShellSpawnResultSchema, { + result: { + case: "rejected", + value: create(ShellRejectedSchema, { + command: args.command ?? "", + workingDirectory: args.workingDirectory ?? "", + reason: REJECT_REASON, + isReadonly: false, + }), + }, + }); + sendExecResult(execMsg, "backgroundShellSpawnResult", result, sendFrame); + return; + } + if (execCase === "writeShellStdinArgs") { + const result = create(WriteShellStdinResultSchema, { + result: { case: "error", value: create(WriteShellStdinErrorSchema, { error: REJECT_REASON }) }, + }); + sendExecResult(execMsg, "writeShellStdinResult", result, sendFrame); + return; + } + if (execCase === "fetchArgs") { + const args = execMsg.message.value; + const result = create(FetchResultSchema, { + result: { case: "error", value: create(FetchErrorSchema, { url: args.url ?? "", error: REJECT_REASON }) }, + }); + sendExecResult(execMsg, "fetchResult", result, sendFrame); + return; + } + if (execCase === "diagnosticsArgs") { + const result = create(DiagnosticsResultSchema, {}); + sendExecResult(execMsg, "diagnosticsResult", result, sendFrame); + return; + } + // MCP resource/screen/computer exec types + const miscCaseMap = { + listMcpResourcesExecArgs: "listMcpResourcesExecResult", + readMcpResourceExecArgs: "readMcpResourceExecResult", + recordScreenArgs: "recordScreenResult", + computerUseArgs: "computerUseResult", + }; + const resultCase = miscCaseMap[execCase]; + if (resultCase) { + sendExecResult(execMsg, resultCase, create(McpResultSchema, {}), sendFrame); + return; + } + // Unknown exec type — log and ignore + console.error(`[proxy] unhandled exec: ${execCase}`); +} +/** Send an exec client message back to Cursor. */ +function sendExecResult(execMsg, messageCase, value, sendFrame) { + const execClientMessage = create(ExecClientMessageSchema, { + id: execMsg.id, + execId: execMsg.execId, + message: { case: messageCase, value: value }, + }); + const clientMessage = create(AgentClientMessageSchema, { + message: { case: "execClientMessage", value: execClientMessage }, + }); + sendFrame(frameConnectMessage(toBinary(AgentClientMessageSchema, clientMessage))); +} +/** Derive a key for active bridge lookup (tool-call continuations). Model-specific. */ +function deriveBridgeKey(modelId, messages) { + const firstUserMsg = messages.find((m) => m.role === "user"); + const firstUserText = firstUserMsg ? textContent(firstUserMsg.content) : ""; + return createHash("sha256") + .update(`bridge:${modelId}:${firstUserText.slice(0, 200)}`) + .digest("hex") + .slice(0, 16); +} +/** Derive a key for conversation state. Model-independent so context survives model switches. */ +function deriveConversationKey(messages) { + const firstUserMsg = messages.find((m) => m.role === "user"); + const firstUserText = firstUserMsg ? textContent(firstUserMsg.content) : ""; + return createHash("sha256") + .update(`conv:${firstUserText.slice(0, 200)}`) + .digest("hex") + .slice(0, 16); +} +/** Deterministic v4-shaped UUID from a seed (first 16 bytes of SHA-256). + * Keeps conversation and message IDs stable across proxy restarts so + * Cursor's server-side caches stay warm. */ +function deterministicUuid(seed) { + const hex = createHash("sha256").update(seed).digest("hex").slice(0, 32); + // Format as UUID: xxxxxxxx-xxxx-4xxx-Nxxx-xxxxxxxxxxxx + return [ + hex.slice(0, 8), + hex.slice(8, 12), + `4${hex.slice(13, 16)}`, + `${(0x8 | (parseInt(hex[16], 16) & 0x3)).toString(16)}${hex.slice(17, 20)}`, + hex.slice(20, 32), + ].join("-"); +} +/** Create an SSE streaming Response that reads from a live bridge. */ +function createBridgeStreamResponse(bridge, heartbeatTimer, blobStore, mcpTools, cloudRule, modelId, bridgeKey, convKey) { + const completionId = `chatcmpl-${crypto.randomUUID().replace(/-/g, "").slice(0, 28)}`; + const created = Math.floor(Date.now() / 1000); + const stream = new ReadableStream({ + start(controller) { + const encoder = new TextEncoder(); + let closed = false; + const sendSSE = (data) => { + if (closed) + return; + controller.enqueue(encoder.encode(`data: ${JSON.stringify(data)}\n\n`)); + }; + const sendDone = () => { + if (closed) + return; + controller.enqueue(encoder.encode("data: [DONE]\n\n")); + }; + const closeController = () => { + if (closed) + return; + closed = true; + controller.close(); + }; + const makeChunk = (delta, finishReason = null) => ({ + id: completionId, + object: "chat.completion.chunk", + created, + model: modelId, + choices: [{ index: 0, delta, finish_reason: finishReason }], + }); + const makeUsageChunk = () => { + const { prompt_tokens, completion_tokens, total_tokens } = computeUsage(state); + return { + id: completionId, + object: "chat.completion.chunk", + created, + model: modelId, + choices: [], + usage: { prompt_tokens, completion_tokens, total_tokens }, + }; + }; + const state = { + toolCallIndex: 0, + pendingExecs: [], + outputTokens: 0, + totalTokens: 0, + }; + const tagFilter = createThinkingTagFilter(); + let mcpExecReceived = false; + const processChunk = createConnectFrameParser((messageBytes) => { + try { + const serverMessage = fromBinary(AgentServerMessageSchema, messageBytes); + processServerMessage(serverMessage, blobStore, mcpTools, cloudRule, (data) => bridge.write(data), state, (text, isThinking) => { + if (isThinking) { + sendSSE(makeChunk({ reasoning_content: text })); + } + else { + const { content, reasoning } = tagFilter.process(text); + if (reasoning) + sendSSE(makeChunk({ reasoning_content: reasoning })); + if (content) + sendSSE(makeChunk({ content })); + } + }, + // onMcpExec — the model wants to execute a tool. + (exec) => { + state.pendingExecs.push(exec); + mcpExecReceived = true; + const flushed = tagFilter.flush(); + if (flushed.reasoning) + sendSSE(makeChunk({ reasoning_content: flushed.reasoning })); + if (flushed.content) + sendSSE(makeChunk({ content: flushed.content })); + const toolCallIndex = state.toolCallIndex++; + sendSSE(makeChunk({ + tool_calls: [{ + index: toolCallIndex, + id: exec.toolCallId, + type: "function", + function: { + name: exec.toolName, + arguments: exec.decodedArgs, + }, + }], + })); + // Keep the bridge alive for tool result continuation. + activeBridges.set(bridgeKey, { + bridge, + heartbeatTimer, + blobStore, + mcpTools, + cloudRule, + pendingExecs: state.pendingExecs, + }); + sendSSE(makeChunk({}, "tool_calls")); + sendDone(); + closeController(); + }, (checkpointBytes) => { + const stored = conversationStates.get(convKey); + if (stored) { + stored.checkpoint = checkpointBytes; + // Merge live blobs before persisting: the checkpoint may + // reference blobs set during this stream. + for (const [k, v] of blobStore) + stored.blobStore.set(k, v); + stored.lastAccessMs = Date.now(); + persistConversation(convKey, stored); + } + }); + } + catch { + // Skip unparseable messages + } + }, (endStreamBytes) => { + const endError = parseConnectEndStream(endStreamBytes); + if (process.env.CURSOR_PROXY_DEBUG) { + console.error(`[proxy] endStream: ${endError ? endError.message : "clean"}`); + } + if (endError) { + // Surface the error and shut down: the server is done with this + // stream, and heartbeats would otherwise keep the bridge (and the + // SSE response) open forever. + sendSSE(makeChunk({ content: `\n[Error: ${endError.message}]` })); + sendSSE(makeChunk({}, "stop")); + sendSSE(makeUsageChunk()); + sendDone(); + closeController(); + activeBridges.delete(bridgeKey); + clearInterval(heartbeatTimer); + bridge.end(); + } + }); + bridge.onData(processChunk); + bridge.onClose((code) => { + clearInterval(heartbeatTimer); + const stored = conversationStates.get(convKey); + if (stored) { + for (const [k, v] of blobStore) + stored.blobStore.set(k, v); + stored.lastAccessMs = Date.now(); + persistConversation(convKey, stored); + } + if (!mcpExecReceived) { + const flushed = tagFilter.flush(); + if (flushed.reasoning) + sendSSE(makeChunk({ reasoning_content: flushed.reasoning })); + if (flushed.content) + sendSSE(makeChunk({ content: flushed.content })); + sendSSE(makeChunk({}, "stop")); + sendSSE(makeUsageChunk()); + sendDone(); + closeController(); + } + else if (code !== 0) { + // Bridge died while tool calls are pending (timeout, crash, etc.). + // Close the SSE stream so the client doesn't hang forever. + sendSSE(makeChunk({ content: "\n[Error: bridge connection lost]" })); + sendSSE(makeChunk({}, "stop")); + sendSSE(makeUsageChunk()); + sendDone(); + closeController(); + // Remove stale entry so the next request doesn't try to resume it. + activeBridges.delete(bridgeKey); + } + }); + }, + }); + return new Response(stream, { headers: SSE_HEADERS }); +} +/** Spawn a bridge, send the initial request frame, and start heartbeat. */ +function startBridge(accessToken, requestBytes) { + const bridge = spawnBridge({ + accessToken, + rpcPath: "/agent.v1.AgentService/Run", + }); + bridge.write(frameConnectMessage(requestBytes)); + const heartbeatTimer = setInterval(() => bridge.write(makeHeartbeatBytes()), 5_000); + return { bridge, heartbeatTimer }; +} +function handleStreamingResponse(payload, accessToken, modelId, bridgeKey, convKey) { + const { bridge, heartbeatTimer } = startBridge(accessToken, payload.requestBytes); + return createBridgeStreamResponse(bridge, heartbeatTimer, payload.blobStore, payload.mcpTools, payload.cloudRule, modelId, bridgeKey, convKey); +} +/** Resume a paused bridge by sending MCP results and continuing to stream. */ +function handleToolResultResume(active, toolResults, userText, modelId, bridgeKey, convKey) { + const { bridge, heartbeatTimer, blobStore, mcpTools, cloudRule, pendingExecs } = active; + // Answer each pending exec with a matching tool result: redirected native + // execs get their typed native result frame, MCP execs get an mcpResult. + const lastExecId = pendingExecs[pendingExecs.length - 1]?.execId; + for (const exec of pendingExecs) { + const result = toolResults.find((r) => r.toolCallId === exec.toolCallId); + // A user message sent alongside tool results (e.g. the explanation typed + // after rejecting an edit) would otherwise be dropped: the paused bridge + // only accepts tool results. Attach it to the last result so the model + // sees it (issue #23). + let text = result ? result.content : "Tool result not provided"; + if (userText && exec.execId === lastExecId) { + text += `\n\n\n${userText}\n`; + } + if (result && exec.native) { + const sent = sendNativeExecResult(exec, exec.native, text, (bytes) => bridge.write(frameConnectMessage(bytes))); + if (sent) + continue; + } + const mcpResult = result + ? create(McpResultSchema, { + result: { + case: "success", + value: create(McpSuccessSchema, { + content: [ + create(McpToolResultContentItemSchema, { + content: { + case: "text", + value: create(McpTextContentSchema, { text }), + }, + }), + ], + isError: false, + }), + }, + }) + : create(McpResultSchema, { + result: { + case: "error", + value: create(McpErrorSchema, { error: text }), + }, + }); + const execClientMessage = create(ExecClientMessageSchema, { + id: exec.execMsgId, + execId: exec.execId, + message: { + case: "mcpResult", + value: mcpResult, + }, + }); + const clientMessage = create(AgentClientMessageSchema, { + message: { case: "execClientMessage", value: execClientMessage }, + }); + bridge.write(frameConnectMessage(toBinary(AgentClientMessageSchema, clientMessage))); + } + return createBridgeStreamResponse(bridge, heartbeatTimer, blobStore, mcpTools, cloudRule, modelId, bridgeKey, convKey); +} +async function handleNonStreamingResponse(payload, accessToken, modelId, convKey) { + const completionId = `chatcmpl-${crypto.randomUUID().replace(/-/g, "").slice(0, 28)}`; + const created = Math.floor(Date.now() / 1000); + const { text, usage } = await collectFullResponse(payload, accessToken, convKey); + return new Response(JSON.stringify({ + id: completionId, + object: "chat.completion", + created, + model: modelId, + choices: [ + { + index: 0, + message: { role: "assistant", content: text }, + finish_reason: "stop", + }, + ], + usage, + }), { headers: { "Content-Type": "application/json" } }); +} +async function collectFullResponse(payload, accessToken, convKey) { + const { promise, resolve } = Promise.withResolvers(); + let fullText = ""; + const { bridge, heartbeatTimer } = startBridge(accessToken, payload.requestBytes); + const state = { + toolCallIndex: 0, + pendingExecs: [], + outputTokens: 0, + totalTokens: 0, + }; + const tagFilter = createThinkingTagFilter(); + bridge.onData(createConnectFrameParser((messageBytes) => { + try { + const serverMessage = fromBinary(AgentServerMessageSchema, messageBytes); + processServerMessage(serverMessage, payload.blobStore, payload.mcpTools, payload.cloudRule, (data) => bridge.write(data), state, (text, isThinking) => { + if (isThinking) + return; + const { content } = tagFilter.process(text); + fullText += content; + }, () => { }, (checkpointBytes) => { + const stored = conversationStates.get(convKey); + if (stored) { + stored.checkpoint = checkpointBytes; + for (const [k, v] of payload.blobStore) + stored.blobStore.set(k, v); + stored.lastAccessMs = Date.now(); + persistConversation(convKey, stored); + } + }); + } + catch { + // Skip + } + }, () => { })); + bridge.onClose(() => { + clearInterval(heartbeatTimer); + const stored = conversationStates.get(convKey); + if (stored) { + for (const [k, v] of payload.blobStore) + stored.blobStore.set(k, v); + stored.lastAccessMs = Date.now(); + persistConversation(convKey, stored); + } + const flushed = tagFilter.flush(); + fullText += flushed.content; + const usage = computeUsage(state); + resolve({ + text: fullText, + usage, + }); + }); + return promise; +} From fbbf80837421ae5c33bc53686c014402c3769277 Mon Sep 17 00:00:00 2001 From: Eleanor Berger Date: Wed, 12 Aug 2026 10:53:35 +0200 Subject: [PATCH 3/4] fix: use 127.0.0.1 and preserve config model stubs on the proxy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - baseURL/api.url: localhost → 127.0.0.1 (avoid IPv6 mismatch with the proxy bound to 127.0.0.1) - merge user-configured model IDs into the proxy model map so whitelist stubs like cursor-grok-4.5-high keep a working api.url even when GetUsableModels does not list them --- dist/index.js | 42 ++++++++++++++++++++++++++++++++++++++---- src/index.ts | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 82 insertions(+), 8 deletions(-) diff --git a/dist/index.js b/dist/index.js index 5549b44..c0892fa 100644 --- a/dist/index.js +++ b/dist/index.js @@ -139,7 +139,22 @@ export const CursorAuthPlugin = async (input) => { throw new Error("Cursor auth not configured"); return token; }, models); - return buildCursorProviderModels(models, port); + const built = buildCursorProviderModels(models, port); + // Preserve any model IDs already present on the provider (config stubs). + for (const id of Object.keys(_provider.models ?? {})) { + if (!built[id]) { + built[id] = buildCursorProviderModels([ + { + id, + name: id, + reasoning: true, + contextWindow: 200_000, + maxTokens: 64_000, + }, + ], port)[id]; + } + } + return built; }, }, auth: { @@ -185,10 +200,29 @@ export const CursorAuthPlugin = async (input) => { return currentAuth.access; }, models); if (provider) { - provider.models = buildCursorProviderModels(models, port); + const existing = (provider.models ?? {}); + const built = buildCursorProviderModels(models, port); + // Keep user-configured model IDs (e.g. whitelist-only stubs) and + // give them the same proxy api.url as discovered models. + for (const [id, model] of Object.entries(existing)) { + if (!built[id]) { + built[id] = { + ...buildCursorProviderModels([ + { + id, + name: model.name ?? id, + reasoning: true, + contextWindow: 200_000, + maxTokens: 64_000, + }, + ], port)[id], + }; + } + } + provider.models = built; } return { - baseURL: `http://localhost:${port}/v1`, + baseURL: `http://127.0.0.1:${port}/v1`, apiKey: "cursor-proxy", async fetch(requestInput, init) { if (init?.headers) { @@ -241,7 +275,7 @@ function buildCursorProviderModels(models, port) { providerID: CURSOR_PROVIDER_ID, api: { id: model.id, - url: `http://localhost:${port}/v1`, + url: `http://127.0.0.1:${port}/v1`, npm: "@ai-sdk/openai-compatible", }, name: model.name, diff --git a/src/index.ts b/src/index.ts index c724e4b..0f45681 100644 --- a/src/index.ts +++ b/src/index.ts @@ -181,7 +181,25 @@ export const CursorAuthPlugin: Plugin = async ( if (!token) throw new Error("Cursor auth not configured"); return token; }, models); - return buildCursorProviderModels(models, port); + const built = buildCursorProviderModels(models, port); + // Preserve any model IDs already present on the provider (config stubs). + for (const id of Object.keys(_provider.models ?? {})) { + if (!built[id]) { + built[id] = buildCursorProviderModels( + [ + { + id, + name: id, + reasoning: true, + contextWindow: 200_000, + maxTokens: 64_000, + }, + ], + port, + )[id]!; + } + } + return built; }, }, @@ -234,11 +252,33 @@ export const CursorAuthPlugin: Plugin = async ( }, models); if (provider) { - (provider as any).models = buildCursorProviderModels(models, port); + const existing = ((provider as any).models ?? {}) as CatalogModels; + const built = buildCursorProviderModels(models, port); + // Keep user-configured model IDs (e.g. whitelist-only stubs) and + // give them the same proxy api.url as discovered models. + for (const [id, model] of Object.entries(existing)) { + if (!built[id]) { + built[id] = { + ...buildCursorProviderModels( + [ + { + id, + name: (model as { name?: string }).name ?? id, + reasoning: true, + contextWindow: 200_000, + maxTokens: 64_000, + }, + ], + port, + )[id]!, + }; + } + } + (provider as any).models = built; } return { - baseURL: `http://localhost:${port}/v1`, + baseURL: `http://127.0.0.1:${port}/v1`, apiKey: "cursor-proxy", async fetch( requestInput: RequestInfo | URL, @@ -312,7 +352,7 @@ function buildCursorProviderModels( providerID: CURSOR_PROVIDER_ID, api: { id: model.id, - url: `http://localhost:${port}/v1`, + url: `http://127.0.0.1:${port}/v1`, npm: "@ai-sdk/openai-compatible", }, name: model.name, From 2059c33ed09752b60b86be128e56fcea8f51947e Mon Sep 17 00:00:00 2001 From: Eleanor Berger Date: Wed, 12 Aug 2026 11:03:19 +0200 Subject: [PATCH 4/4] fix: keep Bun.spawn/Bun.serve on CLI; Node path only for Desktop The h2-bridge must always run under real Node (Bun http2 is broken). Spawning via process.execPath under the Bun CLI accidentally ran the bridge as bun and produced empty Cursor completions. - CLI (Bun): original Bun.spawn(['node', bridge]) + Bun.serve - Desktop (Node): child_process.spawn('node', bridge) + node:http - baseURL stays on 127.0.0.1; config model stubs keep api.url --- dist/proxy.js | 243 +++++++++++++++++++++++++++++++++------------- src/proxy.ts | 263 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 355 insertions(+), 151 deletions(-) diff --git a/dist/proxy.js b/dist/proxy.js index 438d7c3..5d52d2c 100644 --- a/dist/proxy.js +++ b/dist/proxy.js @@ -130,18 +130,6 @@ function frameConnectMessage(data, flags = 0) { return frame; } function spawnBridge(options) { - // Use process.execPath so the bridge runs under the same runtime that loads - // this plugin: Bun on the CLI, Node in the Desktop sidecar. Both can run .mjs. - const proc = spawnProcess(process.execPath, [BRIDGE_PATH], { - stdio: ["pipe", "pipe", "ignore"], - }); - const config = JSON.stringify({ - accessToken: options.accessToken, - url: options.url ?? CURSOR_API_URL, - path: options.rpcPath, - unary: options.unary ?? false, - }); - proc.stdin.write(lpEncode(new TextEncoder().encode(config))); const cbs = { data: null, close: null, @@ -149,6 +137,83 @@ function spawnBridge(options) { // Track exit state so late onClose registrations fire immediately. let exited = false; let exitCode = 1; + const config = JSON.stringify({ + accessToken: options.accessToken, + url: options.url ?? CURSOR_API_URL, + path: options.rpcPath, + unary: options.unary ?? false, + }); + const configBytes = lpEncode(new TextEncoder().encode(config)); + // Prefer Bun.spawn on the CLI (original path). Fall back to node:child_process + // on the Desktop Node sidecar. The bridge binary is always `node` because + // Bun's node:http2 is broken (see file header). + const bunSpawn = globalThis.Bun?.spawn; + if (bunSpawn) { + const proc = bunSpawn(["node", BRIDGE_PATH], { + stdin: "pipe", + stdout: "pipe", + stderr: "ignore", + }); + proc.stdin.write(configBytes); + (async () => { + const reader = proc.stdout.getReader(); + let pending = Buffer.alloc(0); + try { + while (true) { + const { done, value } = await reader.read(); + if (done) + break; + pending = Buffer.concat([pending, Buffer.from(value)]); + while (pending.length >= 4) { + const len = pending.readUInt32BE(0); + if (pending.length < 4 + len) + break; + const payload = pending.subarray(4, 4 + len); + pending = pending.subarray(4 + len); + cbs.data?.(Buffer.from(payload)); + } + } + } + catch { + // Stream ended + } + const code = (await proc.exited) ?? 1; + exited = true; + exitCode = code; + cbs.close?.(code); + })(); + return { + proc: { kill: () => { try { + proc.kill(); + } + catch { } } }, + get alive() { return !exited; }, + write(data) { + try { + proc.stdin.write(lpEncode(data)); + } + catch { } + }, + end() { + try { + proc.stdin.write(lpEncode(new Uint8Array(0))); + proc.stdin.end(); + } + catch { } + }, + onData(cb) { cbs.data = cb; }, + onClose(cb) { + if (exited) + queueMicrotask(() => cb(exitCode)); + else + cbs.close = cb; + }, + }; + } + const proc = spawnProcess("node", [BRIDGE_PATH], { + stdio: ["pipe", "pipe", "ignore"], + }); + proc.stdin.write(configBytes); const exitedPromise = new Promise((resolve) => { proc.once("exit", (code) => resolve(code ?? 1)); proc.once("error", () => resolve(1)); @@ -177,7 +242,10 @@ function spawnBridge(options) { cbs.close?.(code); })(); return { - proc, + proc: { kill: () => { try { + proc.kill(); + } + catch { } } }, get alive() { return !exited; }, write(data) { try { @@ -194,13 +262,10 @@ function spawnBridge(options) { }, onData(cb) { cbs.data = cb; }, onClose(cb) { - if (exited) { - // Process already exited — invoke immediately so streams don't hang. + if (exited) queueMicrotask(() => cb(exitCode)); - } - else { + else cbs.close = cb; - } }, }; } @@ -253,45 +318,51 @@ function buildOpenAIModelList(models) { owned_by: "cursor", })); } -/** - * Bridge between node:http and the fetch-style handler below so the request - * handling logic is identical on Bun (CLI) and Node (Desktop sidecar). - */ -async function handleProxyRequest(req, res) { - const url = new URL(req.url ?? "/", "http://127.0.0.1"); - try { - if (req.method === "GET" && url.pathname === "/v1/models") { - await sendResponse(res, new Response(JSON.stringify({ - object: "list", - data: buildOpenAIModelList(proxyModels), - }), { headers: { "Content-Type": "application/json" } })); - return; - } - if (req.method === "POST" && url.pathname === "/v1/chat/completions") { - const chunks = []; - for await (const chunk of req) - chunks.push(Buffer.from(chunk)); - const body = JSON.parse(Buffer.concat(chunks).toString("utf8")); +async function handleFetchRequest(req) { + const url = new URL(req.url); + if (req.method === "GET" && url.pathname === "/v1/models") { + return new Response(JSON.stringify({ + object: "list", + data: buildOpenAIModelList(proxyModels), + }), { headers: { "Content-Type": "application/json" } }); + } + if (req.method === "POST" && url.pathname === "/v1/chat/completions") { + try { + const body = (await req.json()); if (!proxyAccessTokenProvider) { throw new Error("Cursor proxy access token provider not configured"); } const accessToken = await proxyAccessTokenProvider(); - await sendResponse(res, await handleChatCompletion(body, accessToken)); - return; + return handleChatCompletion(body, accessToken); + } + catch (err) { + const message = err instanceof Error ? err.message : String(err); + return new Response(JSON.stringify({ + error: { message, type: "server_error", code: "internal_error" }, + }), { status: 500, headers: { "Content-Type": "application/json" } }); } - await sendResponse(res, new Response("Not Found", { status: 404 })); - } - catch (err) { - const message = err instanceof Error ? err.message : String(err); - await sendResponse(res, new Response(JSON.stringify({ - error: { message, type: "server_error", code: "internal_error" }, - }), { status: 500, headers: { "Content-Type": "application/json" } })); } + return new Response("Not Found", { status: 404 }); } -async function sendResponse(res, rs) { - res.writeHead(rs.status, Object.fromEntries(rs.headers.entries())); - if (rs.body) { - const stream = Readable.fromWeb(rs.body); +/** + * Bridge between node:http and the fetch-style handler so Desktop's Node + * sidecar can host the proxy without Bun.serve. + */ +async function handleProxyRequest(req, res) { + const host = req.headers.host ?? "127.0.0.1"; + const url = new URL(req.url ?? "/", `http://${host}`); + const chunks = []; + for await (const chunk of req) + chunks.push(Buffer.from(chunk)); + const request = new Request(url, { + method: req.method, + headers: req.headers, + body: chunks.length > 0 ? Buffer.concat(chunks) : undefined, + }); + const response = await handleFetchRequest(request); + res.writeHead(response.status, Object.fromEntries(response.headers.entries())); + if (response.body) { + const stream = Readable.fromWeb(response.body); stream.on("error", () => res.destroy()); stream.pipe(res); } @@ -299,6 +370,53 @@ async function sendResponse(res, rs) { res.end(); } } +function startNodeHttpProxy() { + const server = createServer((req, res) => { + handleProxyRequest(req, res).catch(() => { + if (!res.headersSent) + res.writeHead(500, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ error: { message: "internal_error", type: "server_error" } })); + }); + }); + server.keepAliveTimeout = 255_000; + return new Promise((resolve, reject) => { + server.once("error", reject); + server.listen(0, "127.0.0.1", () => { + const address = server.address(); + if (!address || typeof address === "string") { + reject(new Error("Failed to bind proxy to a port")); + return; + } + resolve({ + port: address.port, + stop: () => { + server.close(); + }, + }); + }); + }); +} +function startBunProxy() { + // Prefer Bun.serve on the CLI — it is the original, battle-tested path. + const bunServe = globalThis.Bun?.serve; + if (!bunServe) { + throw new Error("Bun.serve is not available"); + } + const server = bunServe({ + port: 0, + hostname: "127.0.0.1", + idleTimeout: 255, + fetch: handleFetchRequest, + }); + if (!server.port) + throw new Error("Failed to bind proxy to a port"); + return { + port: server.port, + stop: () => { + server.stop(); + }, + }; +} export function getProxyPort() { return proxyPort; } @@ -311,28 +429,17 @@ export async function startProxy(getAccessToken, models = []) { if (proxyServer && proxyPort) return proxyPort; pruneStaleConversationFiles(); - proxyServer = createServer((req, res) => { - handleProxyRequest(req, res).catch(() => { - if (!res.headersSent) - res.writeHead(500, { "Content-Type": "application/json" }); - res.end(JSON.stringify({ error: { message: "internal_error", type: "server_error" } })); - }); - }); - proxyServer.keepAliveTimeout = 255_000; // max — Cursor responses can take 30s+ - await new Promise((resolve, reject) => { - proxyServer.once("error", reject); - proxyServer.listen(0, "127.0.0.1", () => resolve()); - }); - const address = proxyServer.address(); - if (!address || typeof address === "string") { - throw new Error("Failed to bind proxy to a port"); - } - proxyPort = address.port; + // Bun CLI → Bun.serve; Node Desktop sidecar → node:http. + proxyServer = + typeof globalThis.Bun !== "undefined" + ? startBunProxy() + : await startNodeHttpProxy(); + proxyPort = proxyServer.port; return proxyPort; } export function stopProxy() { if (proxyServer) { - proxyServer.close(); + proxyServer.stop(); proxyServer = undefined; proxyPort = undefined; proxyAccessTokenProvider = undefined; diff --git a/src/proxy.ts b/src/proxy.ts index c8fc2f5..1220ccb 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -299,8 +299,12 @@ interface SpawnBridgeOptions { unary?: boolean; } +type BridgeHandle = { + kill: () => void; +}; + function spawnBridge(options: SpawnBridgeOptions): { - proc: ChildProcess; + proc: BridgeHandle; write: (data: Uint8Array) => void; end: () => void; onData: (cb: (chunk: Buffer) => void) => void; @@ -308,11 +312,14 @@ function spawnBridge(options: SpawnBridgeOptions): { /** True while the bridge subprocess is still running. */ get alive(): boolean; } { - // Use process.execPath so the bridge runs under the same runtime that loads - // this plugin: Bun on the CLI, Node in the Desktop sidecar. Both can run .mjs. - const proc = spawnProcess(process.execPath, [BRIDGE_PATH], { - stdio: ["pipe", "pipe", "ignore"], - }); + const cbs = { + data: null as ((chunk: Buffer) => void) | null, + close: null as ((code: number) => void) | null, + }; + + // Track exit state so late onClose registrations fire immediately. + let exited = false; + let exitCode = 1; const config = JSON.stringify({ accessToken: options.accessToken, @@ -320,16 +327,70 @@ function spawnBridge(options: SpawnBridgeOptions): { path: options.rpcPath, unary: options.unary ?? false, }); - proc.stdin!.write(lpEncode(new TextEncoder().encode(config))); + const configBytes = lpEncode(new TextEncoder().encode(config)); + + // Prefer Bun.spawn on the CLI (original path). Fall back to node:child_process + // on the Desktop Node sidecar. The bridge binary is always `node` because + // Bun's node:http2 is broken (see file header). + const bunSpawn = (globalThis as { Bun?: { spawn: typeof Bun.spawn } }).Bun?.spawn; + if (bunSpawn) { + const proc = bunSpawn(["node", BRIDGE_PATH], { + stdin: "pipe", + stdout: "pipe", + stderr: "ignore", + }); + proc.stdin.write(configBytes); - const cbs = { - data: null as ((chunk: Buffer) => void) | null, - close: null as ((code: number) => void) | null, - }; + (async () => { + const reader = proc.stdout.getReader(); + let pending = Buffer.alloc(0); + try { + while (true) { + const { done, value } = await reader.read(); + if (done) break; + pending = Buffer.concat([pending, Buffer.from(value)]); + while (pending.length >= 4) { + const len = pending.readUInt32BE(0); + if (pending.length < 4 + len) break; + const payload = pending.subarray(4, 4 + len); + pending = pending.subarray(4 + len); + cbs.data?.(Buffer.from(payload)); + } + } + } catch { + // Stream ended + } + const code = (await proc.exited) ?? 1; + exited = true; + exitCode = code; + cbs.close?.(code); + })(); + + return { + proc: { kill: () => { try { proc.kill(); } catch {} } }, + get alive() { return !exited; }, + write(data) { + try { proc.stdin.write(lpEncode(data)); } catch {} + }, + end() { + try { + proc.stdin.write(lpEncode(new Uint8Array(0))); + proc.stdin.end(); + } catch {} + }, + onData(cb) { cbs.data = cb; }, + onClose(cb) { + if (exited) queueMicrotask(() => cb(exitCode)); + else cbs.close = cb; + }, + }; + } + + const proc: ChildProcess = spawnProcess("node", [BRIDGE_PATH], { + stdio: ["pipe", "pipe", "ignore"], + }); + proc.stdin!.write(configBytes); - // Track exit state so late onClose registrations fire immediately. - let exited = false; - let exitCode = 1; const exitedPromise = new Promise((resolve) => { proc.once("exit", (code) => resolve(code ?? 1)); proc.once("error", () => resolve(1)); @@ -337,11 +398,9 @@ function spawnBridge(options: SpawnBridgeOptions): { (async () => { let pending = Buffer.alloc(0); - try { for await (const chunk of proc.stdout!) { pending = Buffer.concat([pending, Buffer.from(chunk)]); - while (pending.length >= 4) { const len = pending.readUInt32BE(0); if (pending.length < 4 + len) break; @@ -353,7 +412,6 @@ function spawnBridge(options: SpawnBridgeOptions): { } catch { // Stream ended } - const code = await exitedPromise; exited = true; exitCode = code; @@ -361,7 +419,7 @@ function spawnBridge(options: SpawnBridgeOptions): { })(); return { - proc, + proc: { kill: () => { try { proc.kill(); } catch {} } }, get alive() { return !exited; }, write(data) { try { proc.stdin!.write(lpEncode(data)); } catch {} @@ -374,12 +432,8 @@ function spawnBridge(options: SpawnBridgeOptions): { }, onData(cb) { cbs.data = cb; }, onClose(cb) { - if (exited) { - // Process already exited — invoke immediately so streams don't hang. - queueMicrotask(() => cb(exitCode)); - } else { - cbs.close = cb; - } + if (exited) queueMicrotask(() => cb(exitCode)); + else cbs.close = cb; }, }; } @@ -435,7 +489,12 @@ export async function callCursorUnaryRpc( return promise; } -let proxyServer: Server | undefined; +type ProxyServer = { + port: number; + stop: () => void; +}; + +let proxyServer: ProxyServer | undefined; let proxyPort: number | undefined; let proxyAccessTokenProvider: (() => Promise) | undefined; let proxyModels: Array<{ id: string; name: string }> = []; @@ -454,59 +513,61 @@ function buildOpenAIModelList(models: ReadonlyArray<{ id: string; name: string } })); } -/** - * Bridge between node:http and the fetch-style handler below so the request - * handling logic is identical on Bun (CLI) and Node (Desktop sidecar). - */ -async function handleProxyRequest(req: IncomingMessage, res: ServerResponse): Promise { - const url = new URL(req.url ?? "/", "http://127.0.0.1"); +async function handleFetchRequest(req: Request): Promise { + const url = new URL(req.url); - try { - if (req.method === "GET" && url.pathname === "/v1/models") { - await sendResponse( - res, - new Response( - JSON.stringify({ - object: "list", - data: buildOpenAIModelList(proxyModels), - }), - { headers: { "Content-Type": "application/json" } }, - ), - ); - return; - } + if (req.method === "GET" && url.pathname === "/v1/models") { + return new Response( + JSON.stringify({ + object: "list", + data: buildOpenAIModelList(proxyModels), + }), + { headers: { "Content-Type": "application/json" } }, + ); + } - if (req.method === "POST" && url.pathname === "/v1/chat/completions") { - const chunks: Buffer[] = []; - for await (const chunk of req) chunks.push(Buffer.from(chunk)); - const body = JSON.parse(Buffer.concat(chunks).toString("utf8")) as ChatCompletionRequest; + if (req.method === "POST" && url.pathname === "/v1/chat/completions") { + try { + const body = (await req.json()) as ChatCompletionRequest; if (!proxyAccessTokenProvider) { throw new Error("Cursor proxy access token provider not configured"); } const accessToken = await proxyAccessTokenProvider(); - await sendResponse(res, await handleChatCompletion(body, accessToken)); - return; - } - - await sendResponse(res, new Response("Not Found", { status: 404 })); - } catch (err) { - const message = err instanceof Error ? err.message : String(err); - await sendResponse( - res, - new Response( + return handleChatCompletion(body, accessToken); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return new Response( JSON.stringify({ error: { message, type: "server_error", code: "internal_error" }, }), { status: 500, headers: { "Content-Type": "application/json" } }, - ), - ); + ); + } } + + return new Response("Not Found", { status: 404 }); } -async function sendResponse(res: ServerResponse, rs: Response): Promise { - res.writeHead(rs.status, Object.fromEntries(rs.headers.entries())); - if (rs.body) { - const stream = Readable.fromWeb(rs.body as unknown as import("node:stream/web").ReadableStream); +/** + * Bridge between node:http and the fetch-style handler so Desktop's Node + * sidecar can host the proxy without Bun.serve. + */ +async function handleProxyRequest(req: IncomingMessage, res: ServerResponse): Promise { + const host = req.headers.host ?? "127.0.0.1"; + const url = new URL(req.url ?? "/", `http://${host}`); + const chunks: Buffer[] = []; + for await (const chunk of req) chunks.push(Buffer.from(chunk)); + const request = new Request(url, { + method: req.method, + headers: req.headers as HeadersInit, + body: chunks.length > 0 ? Buffer.concat(chunks) : undefined, + }); + const response = await handleFetchRequest(request); + res.writeHead(response.status, Object.fromEntries(response.headers.entries())); + if (response.body) { + const stream = Readable.fromWeb( + response.body as unknown as import("node:stream/web").ReadableStream, + ); stream.on("error", () => res.destroy()); stream.pipe(res); } else { @@ -514,6 +575,53 @@ async function sendResponse(res: ServerResponse, rs: Response): Promise { } } +function startNodeHttpProxy(): Promise { + const server: Server = createServer((req, res) => { + handleProxyRequest(req, res).catch(() => { + if (!res.headersSent) res.writeHead(500, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ error: { message: "internal_error", type: "server_error" } })); + }); + }); + server.keepAliveTimeout = 255_000; + return new Promise((resolve, reject) => { + server.once("error", reject); + server.listen(0, "127.0.0.1", () => { + const address = server.address(); + if (!address || typeof address === "string") { + reject(new Error("Failed to bind proxy to a port")); + return; + } + resolve({ + port: address.port, + stop: () => { + server.close(); + }, + }); + }); + }); +} + +function startBunProxy(): ProxyServer { + // Prefer Bun.serve on the CLI — it is the original, battle-tested path. + const bunServe = (globalThis as { Bun?: { serve: typeof Bun.serve } }).Bun?.serve; + if (!bunServe) { + throw new Error("Bun.serve is not available"); + } + const server = bunServe({ + port: 0, + hostname: "127.0.0.1", + idleTimeout: 255, + fetch: handleFetchRequest, + }); + if (!server.port) throw new Error("Failed to bind proxy to a port"); + return { + port: server.port, + stop: () => { + server.stop(); + }, + }; +} + export function getProxyPort(): number | undefined { return proxyPort; } @@ -531,29 +639,18 @@ export async function startProxy( pruneStaleConversationFiles(); - proxyServer = createServer((req, res) => { - handleProxyRequest(req, res).catch(() => { - if (!res.headersSent) res.writeHead(500, { "Content-Type": "application/json" }); - res.end(JSON.stringify({ error: { message: "internal_error", type: "server_error" } })); - }); - }); - proxyServer.keepAliveTimeout = 255_000; // max — Cursor responses can take 30s+ - await new Promise((resolve, reject) => { - proxyServer!.once("error", reject); - proxyServer!.listen(0, "127.0.0.1", () => resolve()); - }); - - const address = proxyServer.address(); - if (!address || typeof address === "string") { - throw new Error("Failed to bind proxy to a port"); - } - proxyPort = address.port; + // Bun CLI → Bun.serve; Node Desktop sidecar → node:http. + proxyServer = + typeof (globalThis as { Bun?: unknown }).Bun !== "undefined" + ? startBunProxy() + : await startNodeHttpProxy(); + proxyPort = proxyServer.port; return proxyPort; } export function stopProxy(): void { if (proxyServer) { - proxyServer.close(); + proxyServer.stop(); proxyServer = undefined; proxyPort = undefined; proxyAccessTokenProvider = undefined;