diff --git a/packages/ai/src/providers/cursor/exec-modern.ts b/packages/ai/src/providers/cursor/exec-modern.ts index 3bfd4825d..a95c76db5 100644 --- a/packages/ai/src/providers/cursor/exec-modern.ts +++ b/packages/ai/src/providers/cursor/exec-modern.ts @@ -10,7 +10,6 @@ * the server reads as "the tool ran and produced nothing". */ -import { create } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { AfterAgentResponseRequestResponseSchema, AfterAgentThoughtRequestResponseSchema, @@ -65,6 +64,7 @@ import { SubagentStartRequestResponseSchema, SubagentStopRequestResponseSchema, } from "@oh-my-pi/pi-catalog/discovery/cursor-proto"; +import { create } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import type { ToolResultMessage } from "../../types"; /** diff --git a/packages/ai/src/providers/cursor/interaction-query.ts b/packages/ai/src/providers/cursor/interaction-query.ts index 35caf4661..d2024f03a 100644 --- a/packages/ai/src/providers/cursor/interaction-query.ts +++ b/packages/ai/src/providers/cursor/interaction-query.ts @@ -1,5 +1,4 @@ import type http2 from "node:http2"; -import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { AgentClientMessageSchema, AskQuestionInteractionResponseSchema, @@ -22,6 +21,7 @@ import { WebSearchRequestResponse_ApprovedSchema, WebSearchRequestResponseSchema, } from "@oh-my-pi/pi-catalog/discovery/cursor-proto"; +import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { $env } from "@oh-my-pi/pi-utils"; const NOT_IMPLEMENTED_SUFFIX = "not implemented by this client"; diff --git a/packages/ai/src/providers/devin.ts b/packages/ai/src/providers/devin.ts index b0a24cb52..746fe21ea 100644 --- a/packages/ai/src/providers/devin.ts +++ b/packages/ai/src/providers/devin.ts @@ -1,5 +1,4 @@ import { gunzipSync, gzipSync } from "node:zlib"; -import { create, fromBinary, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { CacheControlType, type ChatMessagePrompt, @@ -21,6 +20,7 @@ import { PromptCacheOptionsSchema, StopReason, } from "@oh-my-pi/pi-catalog/discovery/devin-proto"; +import { create, fromBinary, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { calculateCost } from "@oh-my-pi/pi-catalog/models"; import { logger, parseStreamingJson, parseStreamingJsonThrottled } from "@oh-my-pi/pi-utils"; import * as AIError from "../error"; diff --git a/packages/ai/test/cursor-caller-headers.test.ts b/packages/ai/test/cursor-caller-headers.test.ts index 0b21759c2..731557b61 100644 --- a/packages/ai/test/cursor-caller-headers.test.ts +++ b/packages/ai/test/cursor-caller-headers.test.ts @@ -1,6 +1,5 @@ import { afterEach, describe, expect, it } from "bun:test"; import * as http2 from "node:http2"; -import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { streamCursor } from "@oh-my-pi/pi-ai/providers/cursor"; import type { Context, Model } from "@oh-my-pi/pi-ai/types"; import { buildModel } from "@oh-my-pi/pi-catalog/build"; @@ -10,6 +9,7 @@ import { TextDeltaUpdateSchema, TurnEndedUpdateSchema, } from "@oh-my-pi/pi-catalog/discovery/cursor-proto"; +import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; // Cursor forwards caller headers (including `before_provider_headers` extension // edits), and it speaks HTTP/2. These assert the TRANSPORT contract against a diff --git a/packages/ai/test/cursor-conversation-rotate.test.ts b/packages/ai/test/cursor-conversation-rotate.test.ts index 63904db38..b56cd269b 100644 --- a/packages/ai/test/cursor-conversation-rotate.test.ts +++ b/packages/ai/test/cursor-conversation-rotate.test.ts @@ -1,6 +1,5 @@ import { afterEach, describe, expect, it } from "bun:test"; import * as http2 from "node:http2"; -import { create, fromBinary, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { streamCursor } from "@oh-my-pi/pi-ai/providers/cursor"; import type { Context, Model } from "@oh-my-pi/pi-ai/types"; import { buildModel } from "@oh-my-pi/pi-catalog/build"; @@ -11,6 +10,7 @@ import { TextDeltaUpdateSchema, TurnEndedUpdateSchema, } from "@oh-my-pi/pi-catalog/discovery/cursor-proto"; +import { create, fromBinary, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; // #8345: a server-side per-conversation rejection (bare resource_exhausted, // zero tokens) poisons the wire conversationId; the next attempt must rotate diff --git a/packages/ai/test/cursor-exec-handlers.test.ts b/packages/ai/test/cursor-exec-handlers.test.ts index 645f23a93..87e2b63b3 100644 --- a/packages/ai/test/cursor-exec-handlers.test.ts +++ b/packages/ai/test/cursor-exec-handlers.test.ts @@ -1,5 +1,4 @@ import { afterEach, describe, expect, it, vi } from "bun:test"; -import { create } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { type BlockState, buildCursorHistoryForTest, @@ -32,6 +31,7 @@ import { ReadResultSchema, ReadSuccessSchema, } from "@oh-my-pi/pi-catalog/discovery/cursor-proto"; +import { create } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { logger } from "@oh-my-pi/pi-utils"; afterEach(() => { diff --git a/packages/ai/test/cursor-exec-modern.test.ts b/packages/ai/test/cursor-exec-modern.test.ts index 798e70442..6f3d7e29b 100644 --- a/packages/ai/test/cursor-exec-modern.test.ts +++ b/packages/ai/test/cursor-exec-modern.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it } from "bun:test"; -import { create, fromBinary, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { type BlockState, CURSOR_CLIENT_VERSION, @@ -65,6 +64,7 @@ import { ToolCallSchema, WebFetchAllowlistPrecheckArgsSchema, } from "@oh-my-pi/pi-catalog/discovery/cursor-proto"; +import { create, fromBinary, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; /** * Drive one `ExecServerMessage` through the real dispatcher and decode every diff --git a/packages/ai/test/cursor-interaction-query.test.ts b/packages/ai/test/cursor-interaction-query.test.ts index 0adad2e57..552bc6a3b 100644 --- a/packages/ai/test/cursor-interaction-query.test.ts +++ b/packages/ai/test/cursor-interaction-query.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it } from "bun:test"; -import { create, fromBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { type BlockState, handleServerMessage, type ToolCallState } from "@oh-my-pi/pi-ai/providers/cursor"; import type { AssistantMessage } from "@oh-my-pi/pi-ai/types"; import { AssistantMessageEventStream } from "@oh-my-pi/pi-ai/utils/event-stream"; @@ -17,6 +16,7 @@ import { SwitchModeRequestQuerySchema, WebSearchRequestQuerySchema, } from "@oh-my-pi/pi-catalog/discovery/cursor-proto"; +import { create, fromBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; type ProtoUnknownField = { no: number; wireType: number; data: Uint8Array }; type ProtoUnknownBag = { $unknown?: ProtoUnknownField[] }; diff --git a/packages/ai/test/cursor-on-payload.test.ts b/packages/ai/test/cursor-on-payload.test.ts index 09a33190d..be311b7a1 100644 --- a/packages/ai/test/cursor-on-payload.test.ts +++ b/packages/ai/test/cursor-on-payload.test.ts @@ -5,11 +5,11 @@ // buildGrpcRequest is exercised directly (the transport is HTTP/2), and the // serialized run request is decoded back from the wire bytes. import { describe, expect, it } from "bun:test"; -import { fromBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { buildGrpcRequest } from "@oh-my-pi/pi-ai/providers/cursor"; import type { Context, Model } from "@oh-my-pi/pi-ai/types"; import { buildModel } from "@oh-my-pi/pi-catalog/build"; import { AgentClientMessageSchema } from "@oh-my-pi/pi-catalog/discovery/cursor-proto"; +import { fromBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; const model: Model<"cursor-agent"> = buildModel({ id: "cursor-composer-2.5", diff --git a/packages/ai/test/cursor-terminal-error.test.ts b/packages/ai/test/cursor-terminal-error.test.ts index f1e9b2a04..4ac6a38ab 100644 --- a/packages/ai/test/cursor-terminal-error.test.ts +++ b/packages/ai/test/cursor-terminal-error.test.ts @@ -1,6 +1,5 @@ import { afterEach, describe, expect, it } from "bun:test"; import * as http2 from "node:http2"; -import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { streamCursor } from "@oh-my-pi/pi-ai/providers/cursor"; import type { Context, CursorToolResultHandler, Model, ToolResultMessage } from "@oh-my-pi/pi-ai/types"; import { buildModel } from "@oh-my-pi/pi-catalog/build"; @@ -16,6 +15,7 @@ import { UpdateTodosArgsSchema, UpdateTodosToolCallSchema, } from "@oh-my-pi/pi-catalog/discovery/cursor-proto"; +import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; const CONNECT_END_STREAM_FLAG = 0b00000010; diff --git a/packages/ai/test/cursor-todo-bridge.test.ts b/packages/ai/test/cursor-todo-bridge.test.ts index 55222d749..f45408cb6 100644 --- a/packages/ai/test/cursor-todo-bridge.test.ts +++ b/packages/ai/test/cursor-todo-bridge.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it } from "bun:test"; -import { create, fromBinary, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { type BlockState, processInteractionUpdate, @@ -30,6 +29,7 @@ import { UpdateTodosSuccessSchema, UpdateTodosToolCallSchema, } from "@oh-my-pi/pi-catalog/discovery/cursor-proto"; +import { create, fromBinary, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; /** One `todoSync` invocation, recorded verbatim. */ interface SyncCall { diff --git a/packages/ai/test/cursor-webfetch-interaction-query.test.ts b/packages/ai/test/cursor-webfetch-interaction-query.test.ts index 658d4119c..fdebabdd2 100644 --- a/packages/ai/test/cursor-webfetch-interaction-query.test.ts +++ b/packages/ai/test/cursor-webfetch-interaction-query.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it } from "bun:test"; -import { create, fromBinary, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { type BlockState, handleServerMessage, type ToolCallState } from "@oh-my-pi/pi-ai/providers/cursor"; import type { AssistantMessage } from "@oh-my-pi/pi-ai/types"; import { AssistantMessageEventStream } from "@oh-my-pi/pi-ai/utils/event-stream"; @@ -21,6 +20,7 @@ import { WebSearchArgsSchema, WebSearchRequestQuerySchema, } from "@oh-my-pi/pi-catalog/discovery/cursor-proto"; +import { create, fromBinary, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; function cursorAssistantMessage(): AssistantMessage { return { diff --git a/packages/ai/test/devin-frame-cap.test.ts b/packages/ai/test/devin-frame-cap.test.ts index e84952279..00eea7e91 100644 --- a/packages/ai/test/devin-frame-cap.test.ts +++ b/packages/ai/test/devin-frame-cap.test.ts @@ -1,9 +1,9 @@ import { describe, expect, it } from "bun:test"; -import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { streamDevin } from "@oh-my-pi/pi-ai/providers/devin"; import type { Context, Model } from "@oh-my-pi/pi-ai/types"; import { buildModel } from "@oh-my-pi/pi-catalog/build"; import { GetUserJwtResponseSchema } from "@oh-my-pi/pi-catalog/discovery/devin-proto"; +import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; /** * Regression for #4228: a Devin Connect frame header advertising an outsized diff --git a/packages/ai/test/devin-history.test.ts b/packages/ai/test/devin-history.test.ts index 71588c630..130bfac7e 100644 --- a/packages/ai/test/devin-history.test.ts +++ b/packages/ai/test/devin-history.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it } from "bun:test"; import { gunzipSync } from "node:zlib"; -import { create, fromBinary, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { streamDevin } from "@oh-my-pi/pi-ai/providers/devin"; import type { AssistantMessage, Context, Model } from "@oh-my-pi/pi-ai/types"; import { buildModel } from "@oh-my-pi/pi-catalog/build"; import { GetChatMessageRequestSchema, GetUserJwtResponseSchema } from "@oh-my-pi/pi-catalog/discovery/devin-proto"; +import { create, fromBinary, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; const devinModel: Model<"devin-agent"> = buildModel({ id: "devin-test", diff --git a/packages/ai/test/devin-large-request-recovery.test.ts b/packages/ai/test/devin-large-request-recovery.test.ts index 66ef28690..e4170da4b 100644 --- a/packages/ai/test/devin-large-request-recovery.test.ts +++ b/packages/ai/test/devin-large-request-recovery.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it } from "bun:test"; -import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import * as AIError from "@oh-my-pi/pi-ai/error"; import { streamDevin } from "@oh-my-pi/pi-ai/providers/devin"; import type { Context, Model } from "@oh-my-pi/pi-ai/types"; import { buildModel } from "@oh-my-pi/pi-catalog/build"; import { GetChatMessageResponseSchema, GetUserJwtResponseSchema } from "@oh-my-pi/pi-catalog/discovery/devin-proto"; +import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; const CONNECT_END_STREAM_FLAG = 0x02; const LARGE_TOOL_RESULT_BYTES = 160 * 1024; diff --git a/packages/ai/test/devin-streaming-args.test.ts b/packages/ai/test/devin-streaming-args.test.ts index b6bb36527..559d62721 100644 --- a/packages/ai/test/devin-streaming-args.test.ts +++ b/packages/ai/test/devin-streaming-args.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it } from "bun:test"; -import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { streamDevin } from "@oh-my-pi/pi-ai/providers/devin"; import type { Context, Model, ToolCall } from "@oh-my-pi/pi-ai/types"; import { buildModel } from "@oh-my-pi/pi-catalog/build"; @@ -9,6 +8,7 @@ import { GetUserJwtResponseSchema, StopReason, } from "@oh-my-pi/pi-catalog/discovery/devin-proto"; +import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; function frameConnectMessage(payload: Uint8Array): Uint8Array { const out = new Uint8Array(5 + payload.length); diff --git a/packages/ai/test/devin-usage.test.ts b/packages/ai/test/devin-usage.test.ts index bb775109b..52bebf5c7 100644 --- a/packages/ai/test/devin-usage.test.ts +++ b/packages/ai/test/devin-usage.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it } from "bun:test"; -import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { streamDevin } from "@oh-my-pi/pi-ai/providers/devin"; import type { Context, Model } from "@oh-my-pi/pi-ai/types"; import { buildModel } from "@oh-my-pi/pi-catalog/build"; @@ -9,6 +8,7 @@ import { ModelUsageStatsSchema, StopReason, } from "@oh-my-pi/pi-catalog/discovery/devin-proto"; +import { create, toBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; function frameConnectMessage(payload: Uint8Array): Uint8Array { const out = new Uint8Array(5 + payload.length); diff --git a/packages/catalog/src/discovery/cursor.ts b/packages/catalog/src/discovery/cursor.ts index 740c8d3be..e10f6dc54 100644 --- a/packages/catalog/src/discovery/cursor.ts +++ b/packages/catalog/src/discovery/cursor.ts @@ -1,5 +1,4 @@ import * as http2 from "node:http2"; -import { create, fromBinary, toBinary } from "./protobuf"; import { type } from "@oh-my-pi/omptype"; import { isKimiK3ModelId } from "../identity"; import { bareModelId, parseGlmModel, semverGte } from "../identity/classify"; @@ -7,6 +6,7 @@ import { getBundledModels } from "../models"; import { toModelSpec } from "../provider-models/bundled-references"; import type { Model, ModelSpec } from "../types"; import { GetUsableModelsRequestSchema, GetUsableModelsResponseSchema } from "./cursor-proto"; +import { create, fromBinary, toBinary } from "./protobuf"; const CURSOR_DEFAULT_BASE_URL = "https://api2.cursor.sh"; const CURSOR_DEFAULT_CLIENT_VERSION = "cli-2026.02.13-41ac335"; diff --git a/packages/catalog/src/discovery/devin.ts b/packages/catalog/src/discovery/devin.ts index dcd82bc3a..d3eac90f7 100644 --- a/packages/catalog/src/discovery/devin.ts +++ b/packages/catalog/src/discovery/devin.ts @@ -1,5 +1,4 @@ import { gunzipSync } from "node:zlib"; -import { create, fromBinary, toBinary } from "./protobuf"; import type { FetchImpl, ModelSpec } from "../types"; import { discoveryFetch } from "../utils"; import { @@ -8,6 +7,7 @@ import { GetCliModelConfigsResponseSchema, MetadataSchema, } from "./devin-proto"; +import { create, fromBinary, toBinary } from "./protobuf"; const DEVIN_DEFAULT_BASE_URL = "https://server.codeium.com"; const DEVIN_GET_CLI_MODEL_CONFIGS_PATH = "/exa.api_server_pb.ApiServerService/GetCliModelConfigs"; diff --git a/packages/catalog/test/cursor-discovery.test.ts b/packages/catalog/test/cursor-discovery.test.ts index f423fa643..86489c9ca 100644 --- a/packages/catalog/test/cursor-discovery.test.ts +++ b/packages/catalog/test/cursor-discovery.test.ts @@ -4,11 +4,11 @@ import * as http2 from "node:http2"; import type * as net from "node:net"; import * as os from "node:os"; import * as path from "node:path"; -import { create, toBinary } from "../src/discovery/protobuf"; // Import from source, not the package specifier: the workspace `node_modules` // copy resolves to the primary checkout, not this worktree. import { fetchCursorUsableModels } from "../src/discovery/cursor"; import { GetUsableModelsResponseSchema, ModelDetailsSchema } from "../src/discovery/cursor-proto"; +import { create, toBinary } from "../src/discovery/protobuf"; import { resolveProviderModels } from "../src/model-manager"; import { cursorModelManagerOptions } from "../src/provider-models/special"; import type { ModelSpec } from "../src/types"; diff --git a/packages/coding-agent/test/cursor-exec.test.ts b/packages/coding-agent/test/cursor-exec.test.ts index 1dced12fa..b9f61ec29 100644 --- a/packages/coding-agent/test/cursor-exec.test.ts +++ b/packages/coding-agent/test/cursor-exec.test.ts @@ -2,7 +2,6 @@ import { afterEach, beforeEach, describe, expect, it } from "bun:test"; import * as fs from "node:fs/promises"; import * as os from "node:os"; import * as path from "node:path"; -import { create, fromBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { type } from "@oh-my-pi/omptype"; import type { AgentEvent, AgentTool, AgentToolContext } from "@oh-my-pi/pi-agent-core"; import { type BlockState, handleServerMessage, type ToolCallState } from "@oh-my-pi/pi-ai/providers/cursor"; @@ -18,6 +17,7 @@ import { ReadArgsSchema, ShellArgsSchema, } from "@oh-my-pi/pi-catalog/discovery/cursor-proto"; +import { create, fromBinary } from "@oh-my-pi/pi-catalog/discovery/protobuf"; import { Settings } from "@oh-my-pi/pi-coding-agent/config/settings"; import { CursorExecHandlers } from "@oh-my-pi/pi-coding-agent/cursor"; import {