66import type { APIClient } from "@/browser/contexts/API" ;
77import type { FrontendWorkspaceMetadata } from "@/common/types/workspace" ;
88import type { ProjectConfig } from "@/node/config" ;
9- import type { WorkspaceChatMessage , ProvidersConfigMap } from "@/common/orpc/types" ;
9+ import type {
10+ WorkspaceChatMessage ,
11+ ProvidersConfigMap ,
12+ WorkspaceStatsSnapshot ,
13+ } from "@/common/orpc/types" ;
1014import type { ChatStats } from "@/common/types/chatStats" ;
1115import { DEFAULT_RUNTIME_CONFIG } from "@/common/constants/workspace" ;
1216import { createAsyncMessageQueue } from "@/common/utils/asyncMessageQueue" ;
@@ -69,6 +73,8 @@ export interface MockORPCClientOptions {
6973 } >
7074 > ;
7175 /** Session usage data per workspace (for Costs tab) */
76+ workspaceStatsSnapshots ?: Map < string , WorkspaceStatsSnapshot > ;
77+ statsTabVariant ?: "control" | "stats" ;
7278 sessionUsage ?: Map < string , MockSessionUsage > ;
7379 /** MCP server configuration per project */
7480 mcpServers ?: Map <
@@ -112,11 +118,27 @@ export function createMockORPCClient(options: MockORPCClientOptions = {}): APICl
112118 onProjectRemove,
113119 backgroundProcesses = new Map ( ) ,
114120 sessionUsage = new Map ( ) ,
121+ workspaceStatsSnapshots = new Map < string , WorkspaceStatsSnapshot > ( ) ,
122+ statsTabVariant = "control" ,
115123 mcpServers = new Map ( ) ,
116124 mcpOverrides = new Map ( ) ,
117125 mcpTestResults = new Map ( ) ,
118126 } = options ;
119127
128+ // Feature flags
129+ let statsTabOverride : "default" | "on" | "off" = "default" ;
130+
131+ const getStatsTabState = ( ) => {
132+ const enabled =
133+ statsTabOverride === "on"
134+ ? true
135+ : statsTabOverride === "off"
136+ ? false
137+ : statsTabVariant === "stats" ;
138+
139+ return { enabled, variant : statsTabVariant , override : statsTabOverride } as const ;
140+ } ;
141+
120142 const workspaceMap = new Map ( workspaces . map ( ( w ) => [ w . id , w ] ) ) ;
121143
122144 const mockStats : ChatStats = {
@@ -136,8 +158,14 @@ export function createMockORPCClient(options: MockORPCClientOptions = {}): APICl
136158 calculateStats : async ( ) => mockStats ,
137159 } ,
138160 features : {
139- getStatsTabState : async ( ) => ( { enabled : false , variant : "control" , override : "default" } ) ,
140- setStatsTabOverride : async ( ) => ( { enabled : false , variant : "control" , override : "default" } ) ,
161+ getStatsTabState : async ( ) => getStatsTabState ( ) ,
162+ setStatsTabOverride : async ( input : { override : "default" | "on" | "off" } ) => {
163+ statsTabOverride = input . override ;
164+ return getStatsTabState ( ) ;
165+ } ,
166+ } ,
167+ telemetry : {
168+ track : async ( ) => undefined ,
141169 } ,
142170 server : {
143171 getLaunchProject : async ( ) => null ,
@@ -276,11 +304,16 @@ export function createMockORPCClient(options: MockORPCClientOptions = {}): APICl
276304 sendToBackground : async ( ) => ( { success : true , data : undefined } ) ,
277305 } ,
278306 stats : {
279- subscribe : async function * ( ) {
280- // Empty generator - no stats updates in mock
281- return ;
307+ subscribe : async function * ( input : { workspaceId : string } ) {
308+ const snapshot = workspaceStatsSnapshots . get ( input . workspaceId ) ;
309+ if ( snapshot ) {
310+ yield snapshot ;
311+ }
312+ } ,
313+ clear : async ( input : { workspaceId : string } ) => {
314+ workspaceStatsSnapshots . delete ( input . workspaceId ) ;
315+ return { success : true , data : undefined } ;
282316 } ,
283- clear : async ( ) => ( { success : true , data : undefined } ) ,
284317 } ,
285318 getSessionUsage : async ( input : { workspaceId : string } ) => sessionUsage . get ( input . workspaceId ) ,
286319 mcp : {
0 commit comments