diff --git a/packages/coding-agent/src/modes/rpc/rpc-mode.ts b/packages/coding-agent/src/modes/rpc/rpc-mode.ts index 99267f77b..66d567a53 100644 --- a/packages/coding-agent/src/modes/rpc/rpc-mode.ts +++ b/packages/coding-agent/src/modes/rpc/rpc-mode.ts @@ -32,6 +32,7 @@ import { executeAcpBuiltinSlashCommand } from "../../slash-commands/acp-builtins import { buildAvailableSlashCommands } from "../../slash-commands/available-commands"; import { defaultLoadModeForToolName } from "../../tools/essential-tools"; import type { EventBus } from "../../utils/event-bus"; +import { calculateTokensPerSecond } from "../../utils/token-rate"; import { initializeExtensions } from "../runtime-init"; import { isRpcHostToolResult, isRpcHostToolUpdate, RpcHostToolBridge } from "./host-tools"; import { isRpcHostUriResult, RpcHostUriBridge } from "./host-uris"; @@ -1087,6 +1088,7 @@ export async function runRpcMode( queuedMessageCount: session.queuedMessageCount, todoPhases: session.getTodoPhases(), fastModeEnabled: session.isFastModeEnabled(), + tokensPerSecond: calculateTokensPerSecond(session.messages, session.isStreaming), fastModeActive: session.isFastModeActive(), messageCount: session.messages.length, systemPrompt: session.systemPrompt, diff --git a/packages/coding-agent/src/modes/rpc/rpc-types.ts b/packages/coding-agent/src/modes/rpc/rpc-types.ts index 6ccd69381..74e862987 100644 --- a/packages/coding-agent/src/modes/rpc/rpc-types.ts +++ b/packages/coding-agent/src/modes/rpc/rpc-types.ts @@ -110,6 +110,7 @@ export interface RpcSessionState { autoCompactionEnabled: boolean; fastModeEnabled: boolean; fastModeActive: boolean; + tokensPerSecond: number | null; messageCount: number; queuedMessageCount: number; todoPhases: TodoPhase[]; diff --git a/packages/coding-agent/test/rpc-input-frame.test.ts b/packages/coding-agent/test/rpc-input-frame.test.ts index 88249549a..f7876f906 100644 --- a/packages/coding-agent/test/rpc-input-frame.test.ts +++ b/packages/coding-agent/test/rpc-input-frame.test.ts @@ -326,6 +326,7 @@ describe("RpcInputDispatcher", () => { autoCompactionEnabled: false, fastModeEnabled: false, fastModeActive: false, + tokensPerSecond: null, messageCount: 0, queuedMessageCount: 0, todoPhases: [], diff --git a/packages/coding-agent/test/rpc.test.ts b/packages/coding-agent/test/rpc.test.ts index 1922659fc..817c6de75 100644 --- a/packages/coding-agent/test/rpc.test.ts +++ b/packages/coding-agent/test/rpc.test.ts @@ -59,6 +59,7 @@ describe.skipIf(!e2eApiKey("ANTHROPIC_API_KEY"))("RPC mode", () => { expect(state.model?.id).toBe("claude-sonnet-4-5"); expect(state.isStreaming).toBe(false); expect(state.messageCount).toBe(0); + expect(state.tokensPerSecond).toBeNull(); }, 30000); test("should set fast mode and expose enabled/active state", async () => {