UNPKG

@roo-code/types

Version:

TypeScript type definitions for Roo Code.

1 lines 460 kB
{"version":3,"sources":["../../src/index.ts","../../src/cloud.ts","../../src/events.ts","../../src/message.ts","../../src/tool.ts","../../src/task.ts","../../src/global-settings.ts","../../src/provider-settings.ts","../../src/model.ts","../../src/codebase-index.ts","../../src/providers/anthropic.ts","../../src/providers/baseten.ts","../../src/providers/bedrock.ts","../../src/providers/cerebras.ts","../../src/providers/chutes.ts","../../src/providers/claude-code.ts","../../src/providers/deepseek.ts","../../src/providers/doubao.ts","../../src/providers/featherless.ts","../../src/providers/fireworks.ts","../../src/providers/gemini.ts","../../src/providers/groq.ts","../../src/providers/huggingface.ts","../../src/providers/io-intelligence.ts","../../src/providers/lite-llm.ts","../../src/providers/lm-studio.ts","../../src/providers/mistral.ts","../../src/providers/moonshot.ts","../../src/providers/ollama.ts","../../src/providers/openai.ts","../../src/providers/openrouter.ts","../../src/providers/qwen-code.ts","../../src/providers/requesty.ts","../../src/providers/roo.ts","../../src/providers/sambanova.ts","../../src/providers/unbound.ts","../../src/providers/vertex.ts","../../src/providers/vscode-llm.ts","../../src/providers/xai.ts","../../src/providers/vercel-ai-gateway.ts","../../src/providers/zai.ts","../../src/providers/deepinfra.ts","../../src/providers/minimax.ts","../../src/providers/index.ts","../../src/history.ts","../../src/experiment.ts","../../src/telemetry.ts","../../src/mode.ts","../../src/vscode.ts","../../src/marketplace.ts","../../src/context-management.ts","../../src/cookie-consent.ts","../../src/custom-tool.ts","../../src/followup.ts","../../src/image-generation.ts","../../src/ipc.ts","../../src/mcp.ts","../../src/todo.ts","../../src/terminal.ts"],"sourcesContent":["export * from \"./api.js\"\nexport * from \"./cloud.js\"\nexport * from \"./codebase-index.js\"\nexport * from \"./context-management.js\"\nexport * from \"./cookie-consent.js\"\nexport * from \"./custom-tool.js\"\nexport * from \"./events.js\"\nexport * from \"./experiment.js\"\nexport * from \"./followup.js\"\nexport * from \"./global-settings.js\"\nexport * from \"./history.js\"\nexport * from \"./image-generation.js\"\nexport * from \"./ipc.js\"\nexport * from \"./marketplace.js\"\nexport * from \"./mcp.js\"\nexport * from \"./message.js\"\nexport * from \"./mode.js\"\nexport * from \"./model.js\"\nexport * from \"./provider-settings.js\"\nexport * from \"./task.js\"\nexport * from \"./todo.js\"\nexport * from \"./telemetry.js\"\nexport * from \"./terminal.js\"\nexport * from \"./tool.js\"\nexport * from \"./tool-params.js\"\nexport * from \"./type-fu.js\"\nexport * from \"./vscode.js\"\n\nexport * from \"./providers/index.js\"\n","import EventEmitter from \"events\"\n\nimport { z } from \"zod\"\n\nimport { RooCodeEventName } from \"./events.js\"\nimport { TaskStatus, taskMetadataSchema } from \"./task.js\"\nimport { globalSettingsSchema } from \"./global-settings.js\"\nimport { providerSettingsWithIdSchema } from \"./provider-settings.js\"\nimport { mcpMarketplaceItemSchema } from \"./marketplace.js\"\nimport { clineMessageSchema, queuedMessageSchema, tokenUsageSchema } from \"./message.js\"\nimport { staticAppPropertiesSchema, gitPropertiesSchema } from \"./telemetry.js\"\n\n/**\n * JWTPayload\n */\n\nexport interface JWTPayload {\n\tiss?: string // Issuer (should be 'rcc')\n\tsub?: string // Subject - CloudJob ID for job tokens (t:'cj'), User ID for auth tokens (t:'auth')\n\texp?: number // Expiration time\n\tiat?: number // Issued at time\n\tnbf?: number // Not before time\n\tv?: number // Version (should be 1)\n\tr?: {\n\t\tu?: string // User ID (always present in valid tokens)\n\t\to?: string // Organization ID (optional - undefined when orgId is null)\n\t\tt?: string // Token type: 'cj' for job tokens, 'auth' for auth tokens\n\t}\n}\n\n/**\n * CloudUserInfo\n */\n\nexport interface CloudUserInfo {\n\tid?: string\n\tname?: string\n\temail?: string\n\tpicture?: string\n\torganizationId?: string\n\torganizationName?: string\n\torganizationRole?: string\n\torganizationImageUrl?: string\n\textensionBridgeEnabled?: boolean\n}\n\n/**\n * CloudOrganization\n */\n\nexport interface CloudOrganization {\n\tid: string\n\tname: string\n\tslug?: string\n\timage_url?: string\n\thas_image?: boolean\n\tcreated_at?: number\n\tupdated_at?: number\n}\n\n/**\n * CloudOrganizationMembership\n */\n\nexport interface CloudOrganizationMembership {\n\tid: string\n\torganization: CloudOrganization\n\trole: string\n\tpermissions?: string[]\n\tcreated_at?: number\n\tupdated_at?: number\n}\n\n/**\n * OrganizationAllowList\n */\n\nexport const organizationAllowListSchema = z.object({\n\tallowAll: z.boolean(),\n\tproviders: z.record(\n\t\tz.object({\n\t\t\tallowAll: z.boolean(),\n\t\t\tmodels: z.array(z.string()).optional(),\n\t\t}),\n\t),\n})\n\nexport type OrganizationAllowList = z.infer<typeof organizationAllowListSchema>\n\n/**\n * OrganizationDefaultSettings\n */\n\nexport const organizationDefaultSettingsSchema = globalSettingsSchema\n\t.pick({\n\t\tenableCheckpoints: true,\n\t\tfuzzyMatchThreshold: true,\n\t\tmaxOpenTabsContext: true,\n\t\tmaxReadFileLine: true,\n\t\tmaxWorkspaceFiles: true,\n\t\tshowRooIgnoredFiles: true,\n\t\tterminalCommandDelay: true,\n\t\tterminalCompressProgressBar: true,\n\t\tterminalOutputLineLimit: true,\n\t\tterminalShellIntegrationDisabled: true,\n\t\tterminalShellIntegrationTimeout: true,\n\t\tterminalZshClearEolMark: true,\n\t})\n\t// Add stronger validations for some fields.\n\t.merge(\n\t\tz.object({\n\t\t\tmaxOpenTabsContext: z.number().int().nonnegative().optional(),\n\t\t\tmaxReadFileLine: z.number().int().gte(-1).optional(),\n\t\t\tmaxWorkspaceFiles: z.number().int().nonnegative().optional(),\n\t\t\tterminalCommandDelay: z.number().int().nonnegative().optional(),\n\t\t\tterminalOutputLineLimit: z.number().int().nonnegative().optional(),\n\t\t\tterminalShellIntegrationTimeout: z.number().int().nonnegative().optional(),\n\t\t}),\n\t)\n\nexport type OrganizationDefaultSettings = z.infer<typeof organizationDefaultSettingsSchema>\n\n/**\n * WorkspaceTaskVisibility\n */\n\nconst workspaceTaskVisibilitySchema = z.enum([\"all\", \"list-only\", \"admins-and-creator\", \"creator\", \"full-lockdown\"])\n\nexport type WorkspaceTaskVisibility = z.infer<typeof workspaceTaskVisibilitySchema>\n\n/**\n * OrganizationCloudSettings\n */\n\nexport const organizationCloudSettingsSchema = z.object({\n\trecordTaskMessages: z.boolean().optional(),\n\tenableTaskSharing: z.boolean().optional(),\n\tallowPublicTaskSharing: z.boolean().optional(),\n\ttaskShareExpirationDays: z.number().int().positive().optional(),\n\tallowMembersViewAllTasks: z.boolean().optional(),\n\tworkspaceTaskVisibility: workspaceTaskVisibilitySchema.optional(),\n})\n\nexport type OrganizationCloudSettings = z.infer<typeof organizationCloudSettingsSchema>\n\n/**\n * OrganizationFeatures\n */\n\nexport const organizationFeaturesSchema = z.object({\n\troomoteControlEnabled: z.boolean().optional(),\n})\n\nexport type OrganizationFeatures = z.infer<typeof organizationFeaturesSchema>\n\n/**\n * OrganizationSettings\n */\n\nexport const organizationSettingsSchema = z.object({\n\tversion: z.number(),\n\tcloudSettings: organizationCloudSettingsSchema.optional(),\n\tdefaultSettings: organizationDefaultSettingsSchema,\n\tallowList: organizationAllowListSchema,\n\tfeatures: organizationFeaturesSchema.optional(),\n\thiddenMcps: z.array(z.string()).optional(),\n\thideMarketplaceMcps: z.boolean().optional(),\n\tmcps: z.array(mcpMarketplaceItemSchema).optional(),\n\tproviderProfiles: z.record(z.string(), providerSettingsWithIdSchema).optional(),\n})\n\nexport type OrganizationSettings = z.infer<typeof organizationSettingsSchema>\n\n/**\n * User Settings Schemas\n */\n\nexport const userFeaturesSchema = z.object({\n\troomoteControlEnabled: z.boolean().optional(),\n})\n\nexport type UserFeatures = z.infer<typeof userFeaturesSchema>\n\nexport const userSettingsConfigSchema = z.object({\n\textensionBridgeEnabled: z.boolean().optional(),\n\ttaskSyncEnabled: z.boolean().optional(),\n})\n\nexport type UserSettingsConfig = z.infer<typeof userSettingsConfigSchema>\n\nexport const userSettingsDataSchema = z.object({\n\tfeatures: userFeaturesSchema,\n\tsettings: userSettingsConfigSchema,\n\tversion: z.number(),\n})\n\nexport type UserSettingsData = z.infer<typeof userSettingsDataSchema>\n\n/**\n * Constants\n */\n\nexport const ORGANIZATION_ALLOW_ALL: OrganizationAllowList = {\n\tallowAll: true,\n\tproviders: {},\n} as const\n\nexport const ORGANIZATION_DEFAULT: OrganizationSettings = {\n\tversion: 0,\n\tcloudSettings: {\n\t\trecordTaskMessages: true,\n\t\tenableTaskSharing: true,\n\t\tallowPublicTaskSharing: true,\n\t\ttaskShareExpirationDays: 30,\n\t\tallowMembersViewAllTasks: true,\n\t},\n\tdefaultSettings: {},\n\tallowList: ORGANIZATION_ALLOW_ALL,\n} as const\n\n/**\n * ShareVisibility\n */\n\nexport type ShareVisibility = \"organization\" | \"public\"\n\n/**\n * ShareResponse\n */\n\nexport const shareResponseSchema = z.object({\n\tsuccess: z.boolean(),\n\tshareUrl: z.string().optional(),\n\terror: z.string().optional(),\n\tisNewShare: z.boolean().optional(),\n\tmanageUrl: z.string().optional(),\n})\n\nexport type ShareResponse = z.infer<typeof shareResponseSchema>\n\n/**\n * AuthService\n */\n\nexport type AuthState = \"initializing\" | \"logged-out\" | \"active-session\" | \"attempting-session\" | \"inactive-session\"\n\nexport interface AuthService extends EventEmitter<AuthServiceEvents> {\n\t// Lifecycle\n\tinitialize(): Promise<void>\n\tbroadcast(): void\n\n\t// Authentication methods\n\tlogin(landingPageSlug?: string, useProviderSignup?: boolean): Promise<void>\n\tlogout(): Promise<void>\n\thandleCallback(\n\t\tcode: string | null,\n\t\tstate: string | null,\n\t\torganizationId?: string | null,\n\t\tproviderModel?: string | null,\n\t): Promise<void>\n\tswitchOrganization(organizationId: string | null): Promise<void>\n\n\t// State methods\n\tgetState(): AuthState\n\tisAuthenticated(): boolean\n\thasActiveSession(): boolean\n\thasOrIsAcquiringActiveSession(): boolean\n\n\t// Token and user info\n\tgetSessionToken(): string | undefined\n\tgetUserInfo(): CloudUserInfo | null\n\tgetStoredOrganizationId(): string | null\n\n\t// Organization management\n\tgetOrganizationMemberships(): Promise<CloudOrganizationMembership[]>\n}\n\n/**\n * AuthServiceEvents\n */\n\nexport interface AuthServiceEvents {\n\t\"auth-state-changed\": [\n\t\tdata: {\n\t\t\tstate: AuthState\n\t\t\tpreviousState: AuthState\n\t\t},\n\t]\n\t\"user-info\": [data: { userInfo: CloudUserInfo }]\n}\n\n/**\n * SettingsService\n */\n\n/**\n * Interface for settings services that provide organization settings\n */\nexport interface SettingsService {\n\t/**\n\t * Get the organization allow list\n\t * @returns The organization allow list or default if none available\n\t */\n\tgetAllowList(): OrganizationAllowList\n\n\t/**\n\t * Get the current organization settings\n\t * @returns The organization settings or undefined if none available\n\t */\n\tgetSettings(): OrganizationSettings | undefined\n\n\t/**\n\t * Get the current user settings\n\t * @returns The user settings data or undefined if none available\n\t */\n\tgetUserSettings(): UserSettingsData | undefined\n\n\t/**\n\t * Get the current user features\n\t * @returns The user features or empty object if none available\n\t */\n\tgetUserFeatures(): UserFeatures\n\n\t/**\n\t * Get the current user settings configuration\n\t * @returns The user settings configuration or empty object if none available\n\t */\n\tgetUserSettingsConfig(): UserSettingsConfig\n\n\t/**\n\t * Update user settings with partial configuration\n\t * @param settings Partial user settings configuration to update\n\t * @returns Promise that resolves to true if successful, false otherwise\n\t */\n\tupdateUserSettings(settings: Partial<UserSettingsConfig>): Promise<boolean>\n\n\t/**\n\t * Determines if task sync/recording is enabled based on organization and user settings\n\t * Organization settings take precedence over user settings.\n\t * User settings default to true if unspecified.\n\t * @returns true if task sync is enabled, false otherwise\n\t */\n\tisTaskSyncEnabled(): boolean\n\n\t/**\n\t * Dispose of the settings service and clean up resources\n\t */\n\tdispose(): void\n}\n\n/**\n * SettingsServiceEvents\n */\n\nexport interface SettingsServiceEvents {\n\t\"settings-updated\": [data: Record<string, never>]\n}\n\n/**\n * CloudServiceEvents\n */\n\nexport type CloudServiceEvents = AuthServiceEvents & SettingsServiceEvents\n\n/**\n * ConnectionState\n */\n\nexport enum ConnectionState {\n\tDISCONNECTED = \"disconnected\",\n\tCONNECTING = \"connecting\",\n\tCONNECTED = \"connected\",\n\tRETRYING = \"retrying\",\n\tFAILED = \"failed\",\n}\n\n/**\n * RetryConfig\n */\n\nexport interface RetryConfig {\n\tmaxInitialAttempts: number\n\tinitialDelay: number\n\tmaxDelay: number\n\tbackoffMultiplier: number\n}\n\n/**\n * Constants\n */\n\nexport const HEARTBEAT_INTERVAL_MS = 20_000\nexport const INSTANCE_TTL_SECONDS = 60\n\n/**\n * ExtensionTask\n */\n\nconst extensionTaskSchema = z.object({\n\ttaskId: z.string(),\n\ttaskStatus: z.nativeEnum(TaskStatus),\n\ttaskAsk: clineMessageSchema.optional(),\n\tqueuedMessages: z.array(queuedMessageSchema).optional(),\n\tparentTaskId: z.string().optional(),\n\tchildTaskId: z.string().optional(),\n\ttokenUsage: tokenUsageSchema.optional(),\n\t...taskMetadataSchema.shape,\n})\n\nexport type ExtensionTask = z.infer<typeof extensionTaskSchema>\n\n/**\n * ExtensionInstance\n */\n\nexport const extensionInstanceSchema = z.object({\n\tinstanceId: z.string(),\n\tuserId: z.string(),\n\tworkspacePath: z.string(),\n\tappProperties: staticAppPropertiesSchema,\n\tgitProperties: gitPropertiesSchema.optional(),\n\tlastHeartbeat: z.coerce.number(),\n\ttask: extensionTaskSchema,\n\ttaskAsk: clineMessageSchema.optional(),\n\ttaskHistory: z.array(z.string()),\n\tmode: z.string().optional(),\n\tmodes: z.array(z.object({ slug: z.string(), name: z.string() })).optional(),\n\tproviderProfile: z.string().optional(),\n\tproviderProfiles: z.array(z.object({ name: z.string(), provider: z.string().optional() })).optional(),\n\tisCloudAgent: z.boolean().optional(),\n})\n\nexport type ExtensionInstance = z.infer<typeof extensionInstanceSchema>\n\n/**\n * ExtensionBridgeEvent\n */\n\nexport enum ExtensionBridgeEventName {\n\tTaskCreated = RooCodeEventName.TaskCreated,\n\tTaskStarted = RooCodeEventName.TaskStarted,\n\tTaskCompleted = RooCodeEventName.TaskCompleted,\n\tTaskAborted = RooCodeEventName.TaskAborted,\n\tTaskFocused = RooCodeEventName.TaskFocused,\n\tTaskUnfocused = RooCodeEventName.TaskUnfocused,\n\tTaskActive = RooCodeEventName.TaskActive,\n\tTaskInteractive = RooCodeEventName.TaskInteractive,\n\tTaskResumable = RooCodeEventName.TaskResumable,\n\tTaskIdle = RooCodeEventName.TaskIdle,\n\n\tTaskPaused = RooCodeEventName.TaskPaused,\n\tTaskUnpaused = RooCodeEventName.TaskUnpaused,\n\tTaskSpawned = RooCodeEventName.TaskSpawned,\n\tTaskDelegated = RooCodeEventName.TaskDelegated,\n\tTaskDelegationCompleted = RooCodeEventName.TaskDelegationCompleted,\n\tTaskDelegationResumed = RooCodeEventName.TaskDelegationResumed,\n\n\tTaskUserMessage = RooCodeEventName.TaskUserMessage,\n\n\tTaskTokenUsageUpdated = RooCodeEventName.TaskTokenUsageUpdated,\n\n\tModeChanged = RooCodeEventName.ModeChanged,\n\tProviderProfileChanged = RooCodeEventName.ProviderProfileChanged,\n\n\tInstanceRegistered = \"instance_registered\",\n\tInstanceUnregistered = \"instance_unregistered\",\n\tHeartbeatUpdated = \"heartbeat_updated\",\n}\n\nexport const extensionBridgeEventSchema = z.discriminatedUnion(\"type\", [\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskCreated),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskStarted),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskCompleted),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskAborted),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskFocused),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskUnfocused),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskActive),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskInteractive),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskResumable),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskIdle),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskPaused),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskUnpaused),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskSpawned),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskDelegated),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskDelegationCompleted),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskDelegationResumed),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskUserMessage),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.TaskTokenUsageUpdated),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.ModeChanged),\n\t\tinstance: extensionInstanceSchema,\n\t\tmode: z.string(),\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.ProviderProfileChanged),\n\t\tinstance: extensionInstanceSchema,\n\t\tproviderProfile: z.object({ name: z.string(), provider: z.string().optional() }),\n\t\ttimestamp: z.number(),\n\t}),\n\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.InstanceRegistered),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.InstanceUnregistered),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeEventName.HeartbeatUpdated),\n\t\tinstance: extensionInstanceSchema,\n\t\ttimestamp: z.number(),\n\t}),\n])\n\nexport type ExtensionBridgeEvent = z.infer<typeof extensionBridgeEventSchema>\n\n/**\n * ExtensionBridgeCommand\n */\n\nexport enum ExtensionBridgeCommandName {\n\tStartTask = \"start_task\",\n\tStopTask = \"stop_task\",\n\tResumeTask = \"resume_task\",\n}\n\nexport const extensionBridgeCommandSchema = z.discriminatedUnion(\"type\", [\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeCommandName.StartTask),\n\t\tinstanceId: z.string(),\n\t\tpayload: z.object({\n\t\t\ttext: z.string(),\n\t\t\timages: z.array(z.string()).optional(),\n\t\t\tmode: z.string().optional(),\n\t\t\tproviderProfile: z.string().optional(),\n\t\t}),\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeCommandName.StopTask),\n\t\tinstanceId: z.string(),\n\t\tpayload: z.object({ taskId: z.string() }),\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(ExtensionBridgeCommandName.ResumeTask),\n\t\tinstanceId: z.string(),\n\t\tpayload: z.object({ taskId: z.string() }),\n\t\ttimestamp: z.number(),\n\t}),\n])\n\nexport type ExtensionBridgeCommand = z.infer<typeof extensionBridgeCommandSchema>\n\n/**\n * TaskBridgeEvent\n */\n\nexport enum TaskBridgeEventName {\n\tMessage = RooCodeEventName.Message,\n\tTaskModeSwitched = RooCodeEventName.TaskModeSwitched,\n\tTaskInteractive = RooCodeEventName.TaskInteractive,\n}\n\nexport const taskBridgeEventSchema = z.discriminatedUnion(\"type\", [\n\tz.object({\n\t\ttype: z.literal(TaskBridgeEventName.Message),\n\t\ttaskId: z.string(),\n\t\taction: z.string(),\n\t\tmessage: clineMessageSchema,\n\t}),\n\tz.object({\n\t\ttype: z.literal(TaskBridgeEventName.TaskModeSwitched),\n\t\ttaskId: z.string(),\n\t\tmode: z.string(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(TaskBridgeEventName.TaskInteractive),\n\t\ttaskId: z.string(),\n\t}),\n])\n\nexport type TaskBridgeEvent = z.infer<typeof taskBridgeEventSchema>\n\n/**\n * TaskBridgeCommand\n */\n\nexport enum TaskBridgeCommandName {\n\tMessage = \"message\",\n\tApproveAsk = \"approve_ask\",\n\tDenyAsk = \"deny_ask\",\n}\n\nexport const taskBridgeCommandSchema = z.discriminatedUnion(\"type\", [\n\tz.object({\n\t\ttype: z.literal(TaskBridgeCommandName.Message),\n\t\ttaskId: z.string(),\n\t\tpayload: z.object({\n\t\t\ttext: z.string(),\n\t\t\timages: z.array(z.string()).optional(),\n\t\t\tmode: z.string().optional(),\n\t\t\tproviderProfile: z.string().optional(),\n\t\t}),\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(TaskBridgeCommandName.ApproveAsk),\n\t\ttaskId: z.string(),\n\t\tpayload: z.object({\n\t\t\ttext: z.string().optional(),\n\t\t\timages: z.array(z.string()).optional(),\n\t\t}),\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal(TaskBridgeCommandName.DenyAsk),\n\t\ttaskId: z.string(),\n\t\tpayload: z.object({\n\t\t\ttext: z.string().optional(),\n\t\t\timages: z.array(z.string()).optional(),\n\t\t}),\n\t\ttimestamp: z.number(),\n\t}),\n])\n\nexport type TaskBridgeCommand = z.infer<typeof taskBridgeCommandSchema>\n\n/**\n * ExtensionSocketEvents\n */\n\nexport enum ExtensionSocketEvents {\n\tCONNECTED = \"extension:connected\",\n\n\tREGISTER = \"extension:register\",\n\tUNREGISTER = \"extension:unregister\",\n\n\tHEARTBEAT = \"extension:heartbeat\",\n\n\tEVENT = \"extension:event\", // event from extension instance\n\tRELAYED_EVENT = \"extension:relayed_event\", // relay from server\n\n\tCOMMAND = \"extension:command\", // command from user\n\tRELAYED_COMMAND = \"extension:relayed_command\", // relay from server\n}\n\n/**\n * TaskSocketEvents\n */\n\nexport enum TaskSocketEvents {\n\tJOIN = \"task:join\",\n\tLEAVE = \"task:leave\",\n\n\tEVENT = \"task:event\", // event from extension task\n\tRELAYED_EVENT = \"task:relayed_event\", // relay from server\n\n\tCOMMAND = \"task:command\", // command from user\n\tRELAYED_COMMAND = \"task:relayed_command\", // relay from server\n}\n\n/**\n * `emit()` Response Types\n */\n\nexport type JoinResponse = {\n\tsuccess: boolean\n\terror?: string\n\ttaskId?: string\n\ttimestamp?: string\n}\n\nexport type LeaveResponse = {\n\tsuccess: boolean\n\ttaskId?: string\n\ttimestamp?: string\n}\n\n/**\n * UsageStats\n */\n\nexport const usageStatsSchema = z.object({\n\tsuccess: z.boolean(),\n\tdata: z.object({\n\t\tdates: z.array(z.string()), // Array of date strings\n\t\ttasks: z.array(z.number()), // Array of task counts\n\t\ttokens: z.array(z.number()), // Array of token counts\n\t\tcosts: z.array(z.number()), // Array of costs in USD\n\t\ttotals: z.object({\n\t\t\ttasks: z.number(),\n\t\t\ttokens: z.number(),\n\t\t\tcost: z.number(), // Total cost in USD\n\t\t}),\n\t}),\n\tperiod: z.number(), // Period in days (e.g., 30)\n})\n\nexport type UsageStats = z.infer<typeof usageStatsSchema>\n","import { z } from \"zod\"\n\nimport { clineMessageSchema, tokenUsageSchema } from \"./message.js\"\nimport { toolNamesSchema, toolUsageSchema } from \"./tool.js\"\n\n/**\n * RooCodeEventName\n */\n\nexport enum RooCodeEventName {\n\t// Task Provider Lifecycle\n\tTaskCreated = \"taskCreated\",\n\n\t// Task Lifecycle\n\tTaskStarted = \"taskStarted\",\n\tTaskCompleted = \"taskCompleted\",\n\tTaskAborted = \"taskAborted\",\n\tTaskFocused = \"taskFocused\",\n\tTaskUnfocused = \"taskUnfocused\",\n\tTaskActive = \"taskActive\",\n\tTaskInteractive = \"taskInteractive\",\n\tTaskResumable = \"taskResumable\",\n\tTaskIdle = \"taskIdle\",\n\n\t// Subtask Lifecycle\n\tTaskPaused = \"taskPaused\",\n\tTaskUnpaused = \"taskUnpaused\",\n\tTaskSpawned = \"taskSpawned\",\n\tTaskDelegated = \"taskDelegated\",\n\tTaskDelegationCompleted = \"taskDelegationCompleted\",\n\tTaskDelegationResumed = \"taskDelegationResumed\",\n\n\t// Task Execution\n\tMessage = \"message\",\n\tTaskModeSwitched = \"taskModeSwitched\",\n\tTaskAskResponded = \"taskAskResponded\",\n\tTaskUserMessage = \"taskUserMessage\",\n\n\t// Task Analytics\n\tTaskTokenUsageUpdated = \"taskTokenUsageUpdated\",\n\tTaskToolFailed = \"taskToolFailed\",\n\n\t// Configuration Changes\n\tModeChanged = \"modeChanged\",\n\tProviderProfileChanged = \"providerProfileChanged\",\n\n\t// Evals\n\tEvalPass = \"evalPass\",\n\tEvalFail = \"evalFail\",\n}\n\n/**\n * RooCodeEvents\n */\n\nexport const rooCodeEventsSchema = z.object({\n\t[RooCodeEventName.TaskCreated]: z.tuple([z.string()]),\n\n\t[RooCodeEventName.TaskStarted]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskCompleted]: z.tuple([\n\t\tz.string(),\n\t\ttokenUsageSchema,\n\t\ttoolUsageSchema,\n\t\tz.object({\n\t\t\tisSubtask: z.boolean(),\n\t\t}),\n\t]),\n\t[RooCodeEventName.TaskAborted]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskFocused]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskUnfocused]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskActive]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskInteractive]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskResumable]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskIdle]: z.tuple([z.string()]),\n\n\t[RooCodeEventName.TaskPaused]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskUnpaused]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskSpawned]: z.tuple([z.string(), z.string()]),\n\t[RooCodeEventName.TaskDelegated]: z.tuple([\n\t\tz.string(), // parentTaskId\n\t\tz.string(), // childTaskId\n\t]),\n\t[RooCodeEventName.TaskDelegationCompleted]: z.tuple([\n\t\tz.string(), // parentTaskId\n\t\tz.string(), // childTaskId\n\t\tz.string(), // completionResultSummary\n\t]),\n\t[RooCodeEventName.TaskDelegationResumed]: z.tuple([\n\t\tz.string(), // parentTaskId\n\t\tz.string(), // childTaskId\n\t]),\n\n\t[RooCodeEventName.Message]: z.tuple([\n\t\tz.object({\n\t\t\ttaskId: z.string(),\n\t\t\taction: z.union([z.literal(\"created\"), z.literal(\"updated\")]),\n\t\t\tmessage: clineMessageSchema,\n\t\t}),\n\t]),\n\t[RooCodeEventName.TaskModeSwitched]: z.tuple([z.string(), z.string()]),\n\t[RooCodeEventName.TaskAskResponded]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskUserMessage]: z.tuple([z.string()]),\n\n\t[RooCodeEventName.TaskToolFailed]: z.tuple([z.string(), toolNamesSchema, z.string()]),\n\t[RooCodeEventName.TaskTokenUsageUpdated]: z.tuple([z.string(), tokenUsageSchema, toolUsageSchema]),\n\n\t[RooCodeEventName.ModeChanged]: z.tuple([z.string()]),\n\t[RooCodeEventName.ProviderProfileChanged]: z.tuple([z.object({ name: z.string(), provider: z.string() })]),\n})\n\nexport type RooCodeEvents = z.infer<typeof rooCodeEventsSchema>\n\n/**\n * TaskEvent\n */\n\nexport const taskEventSchema = z.discriminatedUnion(\"eventName\", [\n\t// Task Provider Lifecycle\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskCreated),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskCreated],\n\t\ttaskId: z.number().optional(),\n\t}),\n\n\t// Task Lifecycle\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskStarted),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskStarted],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskCompleted),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskCompleted],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskAborted),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskAborted],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskFocused),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskFocused],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskUnfocused),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskUnfocused],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskActive),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskActive],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskInteractive),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskInteractive],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskResumable),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskResumable],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskIdle),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskIdle],\n\t\ttaskId: z.number().optional(),\n\t}),\n\n\t// Subtask Lifecycle\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskPaused),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskPaused],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskUnpaused),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskUnpaused],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskSpawned),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskSpawned],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskDelegated),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskDelegated],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskDelegationCompleted),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskDelegationCompleted],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskDelegationResumed),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskDelegationResumed],\n\t\ttaskId: z.number().optional(),\n\t}),\n\n\t// Task Execution\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.Message),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.Message],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskModeSwitched),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskModeSwitched],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskAskResponded),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskAskResponded],\n\t\ttaskId: z.number().optional(),\n\t}),\n\n\t// Task Analytics\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskToolFailed),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskToolFailed],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskTokenUsageUpdated),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskTokenUsageUpdated],\n\t\ttaskId: z.number().optional(),\n\t}),\n\n\t// Evals\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.EvalPass),\n\t\tpayload: z.undefined(),\n\t\ttaskId: z.number(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.EvalFail),\n\t\tpayload: z.undefined(),\n\t\ttaskId: z.number(),\n\t}),\n])\n\nexport type TaskEvent = z.infer<typeof taskEventSchema>\n","import { z } from \"zod\"\n\n/**\n * ClineAsk\n */\n\n/**\n * Array of possible ask types that the LLM can use to request user interaction or approval.\n * These represent different scenarios where the assistant needs user input to proceed.\n *\n * @constant\n * @readonly\n *\n * Ask type descriptions:\n * - `followup`: LLM asks a clarifying question to gather more information needed to complete the task\n * - `command`: Permission to execute a terminal/shell command\n * - `command_output`: Permission to read the output from a previously executed command\n * - `completion_result`: Task has been completed, awaiting user feedback or a new task\n * - `tool`: Permission to use a tool for file operations (read, write, search, etc.)\n * - `api_req_failed`: API request failed, asking user whether to retry\n * - `resume_task`: Confirmation needed to resume a previously paused task\n * - `resume_completed_task`: Confirmation needed to resume a task that was already marked as completed\n * - `mistake_limit_reached`: Too many errors encountered, needs user guidance on how to proceed\n * - `browser_action_launch`: Permission to open or interact with a browser\n * - `use_mcp_server`: Permission to use Model Context Protocol (MCP) server functionality\n * - `auto_approval_max_req_reached`: Auto-approval limit has been reached, manual approval required\n */\nexport const clineAsks = [\n\t\"followup\",\n\t\"command\",\n\t\"command_output\",\n\t\"completion_result\",\n\t\"tool\",\n\t\"api_req_failed\",\n\t\"resume_task\",\n\t\"resume_completed_task\",\n\t\"mistake_limit_reached\",\n\t\"browser_action_launch\",\n\t\"use_mcp_server\",\n\t\"auto_approval_max_req_reached\",\n] as const\n\nexport const clineAskSchema = z.enum(clineAsks)\n\nexport type ClineAsk = z.infer<typeof clineAskSchema>\n/**\n * IdleAsk\n *\n * Asks that put the task into an \"idle\" state.\n */\n\nexport const idleAsks = [\n\t\"completion_result\",\n\t\"api_req_failed\",\n\t\"resume_completed_task\",\n\t\"mistake_limit_reached\",\n\t\"auto_approval_max_req_reached\",\n] as const satisfies readonly ClineAsk[]\n\nexport type IdleAsk = (typeof idleAsks)[number]\n\nexport function isIdleAsk(ask: ClineAsk): ask is IdleAsk {\n\treturn (idleAsks as readonly ClineAsk[]).includes(ask)\n}\n\n/**\n * ResumableAsk\n *\n * Asks that put the task into an \"resumable\" state.\n */\n\nexport const resumableAsks = [\"resume_task\"] as const satisfies readonly ClineAsk[]\n\nexport type ResumableAsk = (typeof resumableAsks)[number]\n\nexport function isResumableAsk(ask: ClineAsk): ask is ResumableAsk {\n\treturn (resumableAsks as readonly ClineAsk[]).includes(ask)\n}\n\n/**\n * InteractiveAsk\n *\n * Asks that put the task into an \"user interaction required\" state.\n */\n\nexport const interactiveAsks = [\n\t\"followup\",\n\t\"command\",\n\t\"tool\",\n\t\"browser_action_launch\",\n\t\"use_mcp_server\",\n] as const satisfies readonly ClineAsk[]\n\nexport type InteractiveAsk = (typeof interactiveAsks)[number]\n\nexport function isInteractiveAsk(ask: ClineAsk): ask is InteractiveAsk {\n\treturn (interactiveAsks as readonly ClineAsk[]).includes(ask)\n}\n\n/**\n * NonBlockingAsk\n *\n * Asks that are not associated with an actual approval, and are only used\n * to update chat messages.\n */\n\nexport const nonBlockingAsks = [\"command_output\"] as const satisfies readonly ClineAsk[]\n\nexport type NonBlockingAsk = (typeof nonBlockingAsks)[number]\n\nexport function isNonBlockingAsk(ask: ClineAsk): ask is NonBlockingAsk {\n\treturn (nonBlockingAsks as readonly ClineAsk[]).includes(ask)\n}\n\n/**\n * ClineSay\n */\n\n/**\n * Array of possible say types that represent different kinds of messages the assistant can send.\n * These are used to categorize and handle various types of communication from the LLM to the user.\n *\n * @constant\n * @readonly\n *\n * Say type descriptions:\n * - `error`: General error message\n * - `api_req_started`: Indicates an API request has been initiated\n * - `api_req_finished`: Indicates an API request has completed successfully\n * - `api_req_retried`: Indicates an API request is being retried after a failure\n * - `api_req_retry_delayed`: Indicates an API request retry has been delayed\n * - `api_req_rate_limit_wait`: Indicates a configured rate-limit wait (not an error)\n * - `api_req_deleted`: Indicates an API request has been deleted/cancelled\n * - `text`: General text message or assistant response\n * - `reasoning`: Assistant's reasoning or thought process (often hidden from user)\n * - `completion_result`: Final result of task completion\n * - `user_feedback`: Message containing user feedback\n * - `user_feedback_diff`: Diff-formatted feedback from user showing requested changes\n * - `command_output`: Output from an executed command\n * - `shell_integration_warning`: Warning about shell integration issues or limitations\n * - `browser_action`: Action performed in the browser\n * - `browser_action_result`: Result of a browser action\n * - `mcp_server_request_started`: MCP server request has been initiated\n * - `mcp_server_response`: Response received from MCP server\n * - `subtask_result`: Result of a completed subtask\n * - `checkpoint_saved`: Indicates a checkpoint has been saved\n * - `rooignore_error`: Error related to .rooignore file processing\n * - `diff_error`: Error occurred while applying a diff/patch\n * - `condense_context`: Context condensation/summarization has started\n * - `condense_context_error`: Error occurred during context condensation\n * - `codebase_search_result`: Results from searching the codebase\n */\nexport const clineSays = [\n\t\"error\",\n\t\"api_req_started\",\n\t\"api_req_finished\",\n\t\"api_req_retried\",\n\t\"api_req_retry_delayed\",\n\t\"api_req_rate_limit_wait\",\n\t\"api_req_deleted\",\n\t\"text\",\n\t\"image\",\n\t\"reasoning\",\n\t\"completion_result\",\n\t\"user_feedback\",\n\t\"user_feedback_diff\",\n\t\"command_output\",\n\t\"shell_integration_warning\",\n\t\"browser_action\",\n\t\"browser_action_result\",\n\t\"browser_session_status\",\n\t\"mcp_server_request_started\",\n\t\"mcp_server_response\",\n\t\"subtask_result\",\n\t\"checkpoint_saved\",\n\t\"rooignore_error\",\n\t\"diff_error\",\n\t\"condense_context\",\n\t\"condense_context_error\",\n\t\"sliding_window_truncation\",\n\t\"codebase_search_result\",\n\t\"user_edit_todos\",\n] as const\n\nexport const clineSaySchema = z.enum(clineSays)\n\nexport type ClineSay = z.infer<typeof clineSaySchema>\n\n/**\n * ToolProgressStatus\n */\n\nexport const toolProgressStatusSchema = z.object({\n\ticon: z.string().optional(),\n\ttext: z.string().optional(),\n})\n\nexport type ToolProgressStatus = z.infer<typeof toolProgressStatusSchema>\n\n/**\n * ContextCondense\n *\n * Data associated with a successful context condensation event.\n * This is attached to messages with `say: \"condense_context\"` when\n * the condensation operation completes successfully.\n *\n * @property cost - The API cost incurred for the condensation operation\n * @property prevContextTokens - Token count before condensation\n * @property newContextTokens - Token count after condensation\n * @property summary - The condensed summary that replaced the original context\n * @property condenseId - Optional unique identifier for this condensation operation\n */\nexport const contextCondenseSchema = z.object({\n\tcost: z.number(),\n\tprevContextTokens: z.number(),\n\tnewContextTokens: z.number(),\n\tsummary: z.string(),\n\tcondenseId: z.string().optional(),\n})\n\nexport type ContextCondense = z.infer<typeof contextCondenseSchema>\n\n/**\n * ContextTruncation\n *\n * Data associated with a sliding window truncation event.\n * This is attached to messages with `say: \"sliding_window_truncation\"` when\n * messages are removed from the conversation history to stay within token limits.\n *\n * Unlike condensation, truncation simply removes older messages without\n * summarizing them. This is a faster but less context-preserving approach.\n *\n * @property truncationId - Unique identifier for this truncation operation\n * @property messagesRemoved - Number of conversation messages that were removed\n * @property prevContextTokens - Token count before truncation occurred\n * @property newContextTokens - Token count after truncation occurred\n */\nexport const contextTruncationSchema = z.object({\n\ttruncationId: z.string(),\n\tmessagesRemoved: z.number(),\n\tprevContextTokens: z.number(),\n\tnewContextTokens: z.number(),\n})\n\nexport type ContextTruncation = z.infer<typeof contextTruncationSchema>\n\n/**\n * ClineMessage\n *\n * The main message type used for communication between the extension and webview.\n * Messages can either be \"ask\" (requiring user response) or \"say\" (informational).\n *\n * Context Management Fields:\n * - `contextCondense`: Present when `say: \"condense_context\"` and condensation succeeded\n * - `contextTruncation`: Present when `say: \"sliding_window_truncation\"` and truncation occurred\n *\n * Note: These fields are mutually exclusive - a message will have at most one of them.\n */\nexport const clineMessageSchema = z.object({\n\tts: z.number(),\n\ttype: z.union([z.literal(\"ask\"), z.literal(\"say\")]),\n\task: clineAskSchema.optional(),\n\tsay: clineSaySchema.optional(),\n\ttext: z.string().optional(),\n\timages: z.array(z.string()).optional(),\n\tpartial: z.boolean().optional(),\n\treasoning: z.string().optional(),\n\tconversationHistoryIndex: z.number().optional(),\n\tcheckpoint: z.record(z.string(), z.unknown()).optional(),\n\tprogressStatus: toolProgressStatusSchema.optional(),\n\t/**\n\t * Data for successful context condensation.\n\t * Present when `say: \"condense_context\"` and `partial: false`.\n\t */\n\tcontextCondense: contextCondenseSchema.optional(),\n\t/**\n\t * Data for sliding window truncation.\n\t * Present when `say: \"sliding_window_truncation\"`.\n\t */\n\tcontextTruncation: contextTruncationSchema.optional(),\n\tisProtected: z.boolean().optional(),\n\tapiProtocol: z.union([z.literal(\"openai\"), z.literal(\"anthropic\")]).optional(),\n\tisAnswered: z.boolean().optional(),\n})\n\nexport type ClineMessage = z.infer<typeof clineMessageSchema>\n\n/**\n * TokenUsage\n */\n\nexport const tokenUsageSchema = z.object({\n\ttotalTokensIn: z.number(),\n\ttotalTokensOut: z.number(),\n\ttotalCacheWrites: z.number().optional(),\n\ttotalCacheReads: z.number().optional(),\n\ttotalCost: z.number(),\n\tcontextTokens: z.number(),\n})\n\nexport type TokenUsage = z.infer<typeof tokenUsageSchema>\n\n/**\n * QueuedMessage\n */\n\nexport const queuedMessageSchema = z.object({\n\ttimestamp: z.number(),\n\tid: z.string(),\n\ttext: z.string(),\n\timages: z.array(z.string()).optional(),\n})\n\nexport type QueuedMessage = z.infer<typeof queuedMessageSchema>\n","import { z } from \"zod\"\n\n/**\n * ToolGroup\n */\n\nexport const toolGroups = [\"read\", \"edit\", \"browser\", \"command\", \"mcp\", \"modes\"] as const\n\nexport const toolGroupsSchema = z.enum(toolGroups)\n\nexport type ToolGroup = z.infer<typeof toolGroupsSchema>\n\n/**\n * ToolName\n */\n\nexport const toolNames = [\n\t\"execute_command\",\n\t\"read_file\",\n\t\"write_to_file\",\n\t\"apply_diff\",\n\t\"search_and_replace\",\n\t\"search_replace\",\n\t\"edit_file\",\n\t\"apply_patch\",\n\t\"search_files\",\n\t\"list_files\",\n\t\"browser_action\",\n\t\"use_mcp_tool\",\n\t\"access_mcp_resource\",\n\t\"ask_followup_question\",\n\t\"attempt_completion\",\n\t\"switch_mode\",\n\t\"new_task\",\n\t\"fetch_instructions\",\n\t\"codebase_search\",\n\t\"update_todo_list\",\n\t\"run_slash_command\",\n\t\"generate_image\",\n\t\"custom_tool\",\n] as const\n\nexport const toolNamesSchema = z.enum(toolNames)\n\nexport type ToolName = z.infer<typeof toolNamesSchema>\n\n/**\n * ToolUsage\n */\n\nexport const toolUsageSchema = z.record(\n\ttoolNamesSchema,\n\tz.object({\n\t\tattempts: z.number(),\n\t\tfailures: z.number(),\n\t}),\n)\n\nexport type ToolUsage = z.infer<typeof toolUsageSchema>\n\n/**\n * Tool protocol constants\n */\nexport const TOOL_PROTOCOL = {\n\tXML: \"xml\",\n\tNATIVE: \"native\",\n} as const\n\n/**\n * Tool protocol type for system prompt generation\n * Derived from TOOL_PROTOCOL constants to ensure type safety\n */\nexport type ToolProtocol = (typeof TOOL_PROTOCOL)[keyof typeof TOOL_PROTOCOL]\n\n/**\n * Default model info properties for native tool support.\n * Used to merge with cached model info that may lack these fields.\n * Router providers (Requesty, Unbound, LiteLLM) assume all models support native tools.\n */\nexport const NATIVE_TOOL_DEFAULTS = {\n\tsupportsNativeTools: true,\n\tdefaultToolProtocol: TOOL_PROTOCOL.NATIVE,\n} as const\n\n/**\n * Checks if the protocol is native (non-XML).\n *\n * @param protocol - The tool protocol to check\n * @returns True if protocol is native\n */\nexport function isNativeProtocol(protocol: ToolProtocol): boolean {\n\treturn protocol === TOOL_PROTOCOL.NATIVE\n}\n\n/**\n * Gets the effective protocol from settings or falls back to the default XML.\n * This function is safe to use in webview-accessible code as it doesn't depend on vscode module.\n *\n * @param toolProtocol - Optional tool protocol from settings\n * @returns The effective tool protocol (defaults to \"xml\")\n */\nexport function getEffectiveProtocol(toolProtocol?: ToolProtocol): ToolProtocol {\n\treturn toolProtocol || TOOL_PROTOCOL.XML\n}\n","import { z } from \"zod\"\n\nimport { RooCodeEventName } from \"./events.js\"\nimport type { RooCodeSettings } from \"./global-settings.js\"\nimport type { ClineMessage, QueuedMessage, TokenUsage } from \"./message.js\"\nimport type { ToolUsage, ToolName } from \"./tool.js\"\nimport type { StaticAppProperties, GitProperties, TelemetryProperties } from \"./telemetry.js\"\nimport type { TodoItem } from \"./todo.js\"\n\n/**\n * TaskProviderLike\n */\n\nexport interface TaskProviderLike {\n\t// Tasks\n\tgetCurrentTask(): TaskLike | undefined\n\tgetRecentTasks(): string[]\n\tcreateTask(\n\t\ttext?: string,\n\t\timages?: string[],\n\t\tparentTask?: TaskLike,\n\t\toptions?: CreateTaskOptions,\n\t\tconfiguration?: RooCodeSettings,\n\t): Promise<TaskLike>\n\tcancelTask(): Promise<void>\n\tclearTask(): Promise<void>\n\tresumeTask(taskId: string): void\n\n\t// Modes\n\tgetModes(): Promise<{ slug: string; name: string }[]>\n\tgetMode(): Promise<string>\n\tsetMode(mode: string): Promise<void>\n\n\t// Provider Profiles\n\tgetProviderProfiles(): Promise<{ name: string; provider?: string }[]>\n\tgetProviderProfile(): Promise<string>\n\tsetProviderProfile(providerProfile: string): Promise<void>\n\n\t// Telemetry\n\treadonly appProperties: StaticAppProperties\n\treadonly gitProperties: GitProperties | undefined\n\tgetTelemetryProperties(): Promise<TelemetryProperties>\n\treadonly cwd: string\n\n\t// Event Emitter\n\ton<K extends keyof TaskProviderEvents>(\n\t\tevent: K,\n\t\tlistener: (...args: TaskProviderEvents[K]) => void | Promise<void>,\n\t): this\n\n\toff<K extends keyof TaskProviderEvents>(\n\t\tevent: K,\n\t\tlistener: (...args: TaskProviderEvents[K]) => void | Promise<void>,\n\t): this\n\n\t// @TODO: Find a better way to do this.\n\tpostStateToWebview(): Promise<void>\n}\n\nexport type TaskProviderEvents = {\n\t[RooCodeEventName.TaskCreated]: [task: TaskLike]\n\t[RooCodeEventName.TaskStarted]: [taskId: string]\n\t[RooCodeEventName.TaskCompleted]: [taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage]\n\t[RooCodeEventName.TaskAborted]: [taskId: string]\n\t[RooCodeEventName.TaskFocused]: [taskId: string]\n\t[RooCodeEventName.TaskUnfocused]: [taskId: string]\n\t[RooCodeEventName.TaskActive]: [taskId: string]\n\t[RooCodeEventName.TaskInteractive]: [taskId: string]\n\t[RooCodeEventName.TaskResumable]: [taskId: string]\n\t[RooCodeEventName.TaskIdle]: [taskId: string]\n\n\t[RooCodeEventName.TaskPaused]: [taskId: string]\n\t[RooCodeEventName.TaskUnpaused]: [taskId: string]\n\t[RooCodeEventName.TaskSpawned]: [taskId: string]\n\t[RooCodeEventName.TaskDelegated]: [parentTaskId: string, childTaskId: string]\n\t[RooCodeEventName.TaskDelegationCompleted]: [parentTaskId: string, childTaskId: string, summary: string]\n\t[RooCodeEventName.TaskDelegationResumed]: [parentTaskId: string, childTaskId: string]\n\n\t[RooCodeEventName.TaskUserMessage]: [taskId: string]\n\n\t[RooCodeEventName.TaskTokenUsageUpdated]: [taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage]\n\n\t[RooCodeEventName.ModeChanged]: [mode: string]\n\t[RooCodeEventName.ProviderProfileChanged]: [config: { name: string; provider?: string }]\n}\n\n/**\n * TaskLike\n */\n\nexport interface CreateTaskOptions {\n\tenableDiff?: boolean\n\tenableCheckpoints?: boolean\n\tfuzzyMatchThreshold?: number\n\tconsecutiveMistakeLimit?: number\n\texperiments?: Record<string, boolean>\n\tinitialTodos?: TodoItem[]\n\t/** Initial status for the task's history item (e.g., \"active\" for child tasks) */\n\tinitialStatus?: \"active\" | \"delegated\" | \"completed\"\n}\n\nexport enum TaskStatus {\n\tRunning = \"running\",\n\tInteractive = \"interactive\",\n\tResumable = \"resumable\",\n\tIdle = \"idle\",\n\tNone = \"none\",\n}\n\nexport const taskMetadataSchema = z.object({\n\ttask: z.string().optional(),\n\timages: z.array(z.string()).optional(),\n})\n\nexport type TaskMetadata = z.infer<typeof taskMetadataSchema>\n\nexport interface TaskLike {\n\treadonly taskId: string\n\treadonly rootTaskId?: string\n\treadonly parentTaskId?: string\n\treadonly childTaskId?: string\n\treadonly metadata: TaskMetadata\n\treadonly taskStatus: TaskStatus\n\treadonly taskAsk: ClineMessage | undefined\n\treadonly queuedMessages: QueuedMessage[