diff --git a/cloud-agent-next/src/kilo/wrapper-client.test.ts b/cloud-agent-next/src/kilo/wrapper-client.test.ts index ea0a87098..6fe758806 100644 --- a/cloud-agent-next/src/kilo/wrapper-client.test.ts +++ b/cloud-agent-next/src/kilo/wrapper-client.test.ts @@ -259,7 +259,7 @@ describe('WrapperClient', () => { const options: WrapperPromptOptions = { prompt: 'Complex prompt', model: { providerID: 'kilo', modelID: 'anthropic/claude-sonnet-4-20250514' }, - agent: 'build', + agent: 'code', messageId: 'msg_custom', system: 'You are a helpful assistant', tools: { read_file: true, write_file: false }, diff --git a/cloud-agent-next/src/logger.ts b/cloud-agent-next/src/logger.ts index cb5424e76..3300bed7c 100644 --- a/cloud-agent-next/src/logger.ts +++ b/cloud-agent-next/src/logger.ts @@ -14,7 +14,7 @@ export type CloudAgentTags = { inflightId?: string; // Execution context - mode?: 'plan' | 'code' | 'build' | 'orchestrator' | 'architect' | 'ask' | 'custom'; + mode?: 'plan' | 'code' | 'debug' | 'build' | 'orchestrator' | 'architect' | 'ask' | 'custom'; model?: string; isResume?: boolean; diff --git a/cloud-agent-next/src/persistence/CloudAgentSession.ts b/cloud-agent-next/src/persistence/CloudAgentSession.ts index d602d0537..6d74e3fc7 100644 --- a/cloud-agent-next/src/persistence/CloudAgentSession.ts +++ b/cloud-agent-next/src/persistence/CloudAgentSession.ts @@ -1568,7 +1568,7 @@ export class CloudAgentSession extends DurableObject { metadata.gitToken = request.tokenOverrides.gitToken; } - const mode = (request.mode ?? metadata.mode ?? 'build') as ExecutionMode; + const mode = (request.mode ?? metadata.mode ?? 'code') as ExecutionMode; const model = normalizeKilocodeModel(request.model ?? metadata.model); if (!model) { return this.buildStartError( diff --git a/cloud-agent-next/src/router.test.ts b/cloud-agent-next/src/router.test.ts index f383057ee..fd5cd9cda 100644 --- a/cloud-agent-next/src/router.test.ts +++ b/cloud-agent-next/src/router.test.ts @@ -643,7 +643,7 @@ describe('router sessionId validation', () => { gitUrl: undefined, gitToken: undefined, prompt: 'Build a feature', - mode: 'build', + mode: 'code', model: 'claude-3-sonnet', autoCommit: true, upstreamBranch: 'main', @@ -667,7 +667,7 @@ describe('router sessionId validation', () => { expect(result.orgId).toBe('org-123'); expect(result.githubRepo).toBe('acme/repo'); expect(result.prompt).toBe('Build a feature'); - expect(result.mode).toBe('build'); + expect(result.mode).toBe('code'); expect(result.model).toBe('claude-3-sonnet'); expect(result.autoCommit).toBe(true); expect(result.upstreamBranch).toBe('main'); diff --git a/cloud-agent-next/src/schema.ts b/cloud-agent-next/src/schema.ts index 521e6d578..24ef9256e 100644 --- a/cloud-agent-next/src/schema.ts +++ b/cloud-agent-next/src/schema.ts @@ -6,27 +6,31 @@ import type { MCPServerConfig } from './persistence/types.js'; * Internal agent modes used by the kilo CLI. * These are the actual modes passed to `kilo run --agent `. */ -export const InternalAgentModes = ['plan', 'code', 'custom'] as const; +export const InternalAgentModes = [ + 'code', + 'plan', + 'debug', + 'orchestrator', + 'ask', + 'custom', +] as const; export type InternalAgentMode = (typeof InternalAgentModes)[number]; /** * Input agent modes accepted by the API. - * These include aliases that map to internal modes: - * - plan: maps to 'plan' - * - code: maps to 'code' - * - build: maps to 'code' (alias) - * - orchestrator: maps to 'code' (alias) - * - architect: maps to 'plan' (alias) - * - ask: maps to 'plan' (alias) - * - custom: maps to 'custom' + * These include backward-compatible aliases: + * - build: maps to 'code' + * - architect: maps to 'plan' + * All other modes pass through 1:1 to the CLI. */ export const AgentModes = [ - 'plan', 'code', - 'build', + 'plan', + 'debug', 'orchestrator', - 'architect', 'ask', + 'build', + 'architect', 'custom', ] as const; export type AgentMode = (typeof AgentModes)[number]; @@ -37,16 +41,17 @@ export const AgentModeSchema = z.enum(AgentModes); */ export function normalizeAgentMode(mode: AgentMode): InternalAgentMode { switch (mode) { + case 'build': + return 'code'; case 'architect': - case 'ask': - case 'plan': return 'plan'; - case 'orchestrator': - case 'build': case 'code': - return 'code'; + case 'plan': + case 'debug': + case 'orchestrator': + case 'ask': case 'custom': - return 'custom'; + return mode; } } diff --git a/cloud-agent-next/src/session-prepare.test.ts b/cloud-agent-next/src/session-prepare.test.ts index 8ef2ec6e2..7f6a3150f 100644 --- a/cloud-agent-next/src/session-prepare.test.ts +++ b/cloud-agent-next/src/session-prepare.test.ts @@ -208,7 +208,7 @@ describe('prepareSession endpoint', () => { await expect( caller.prepareSession({ prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', githubToken: 'ghp_test_token', @@ -229,7 +229,7 @@ describe('prepareSession endpoint', () => { await expect( caller.prepareSession({ prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', githubToken: 'ghp_test_token', @@ -249,7 +249,7 @@ describe('prepareSession endpoint', () => { await expect( caller.prepareSession({ prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', githubToken: 'ghp_test_token', @@ -269,7 +269,7 @@ describe('prepareSession endpoint', () => { await expect( caller.prepareSession({ prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', githubToken: 'ghp_test_token', @@ -288,7 +288,7 @@ describe('prepareSession endpoint', () => { const caller = appRouter.createCaller(ctx); const result = await caller.prepareSession({ prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', githubToken: 'ghp_token', @@ -302,7 +302,7 @@ describe('prepareSession endpoint', () => { userId: 'test-user-123', kiloSessionId: 'cli-session-abc123', prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', githubToken: 'ghp_token', @@ -319,7 +319,7 @@ describe('prepareSession endpoint', () => { const caller = appRouter.createCaller(ctx); const result = await caller.prepareSession({ prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', gitUrl: 'https://gitlab.com/org/repo.git', gitToken: 'token123', @@ -378,7 +378,7 @@ describe('prepareSession endpoint', () => { await expect( caller.prepareSession({ prompt: '', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', }) @@ -392,7 +392,7 @@ describe('prepareSession endpoint', () => { await expect( caller.prepareSession({ prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', } as Parameters[0]) ).rejects.toThrow(); @@ -425,7 +425,7 @@ describe('prepareSession endpoint', () => { await expect( caller.prepareSession({ prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', githubToken: 'ghp_test_token', @@ -618,7 +618,7 @@ describe('DO state machine methods', () => { await expect( caller.prepareSession({ prompt: 'Test', - mode: 'build', + mode: 'code', model: 'test', githubRepo: 'acme/repo', githubToken: 'ghp_test_token', @@ -637,7 +637,7 @@ describe('DO state machine methods', () => { const caller = appRouter.createCaller(ctx); const result = await caller.updateSession({ cloudAgentSessionId: 'agent_12345678-1234-1234-1234-123456789abc' as SessionId, - mode: 'build', + mode: 'code', }); expect(result.success).toBe(true); @@ -669,7 +669,7 @@ describe('DO state machine methods', () => { preparedAt: Date.now() - 1000, initiatedAt: Date.now(), prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', kiloSessionId: '123e4567-e89b-12d3-a456-426614174000', githubRepo: 'acme/repo', @@ -738,7 +738,7 @@ describe('initiateFromKilocodeSession (prepared mode)', () => { describe('PrepareSessionInput schema validation', () => { it('should accept all valid modes', () => { // All valid modes including aliases - const modes = ['plan', 'code', 'build', 'orchestrator', 'architect', 'ask']; + const modes = ['code', 'plan', 'debug', 'orchestrator', 'ask', 'build', 'architect']; for (const mode of modes) { const result = schemas.PrepareSessionInput.safeParse({ prompt: 'Test', @@ -775,7 +775,7 @@ describe('PrepareSessionInput schema validation', () => { for (const repo of validRepos) { const result = schemas.PrepareSessionInput.safeParse({ prompt: 'Test', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: repo, }); @@ -787,7 +787,7 @@ describe('PrepareSessionInput schema validation', () => { for (const repo of invalidRepos) { const result = schemas.PrepareSessionInput.safeParse({ prompt: 'Test', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: repo, }); @@ -805,7 +805,7 @@ describe('PrepareSessionInput schema validation', () => { for (const gitUrl of validUrls) { const result = schemas.PrepareSessionInput.safeParse({ prompt: 'Test', - mode: 'build', + mode: 'code', model: 'claude-3', gitUrl, }); @@ -817,7 +817,7 @@ describe('PrepareSessionInput schema validation', () => { for (const gitUrl of invalidUrls) { const result = schemas.PrepareSessionInput.safeParse({ prompt: 'Test', - mode: 'build', + mode: 'code', model: 'claude-3', gitUrl, }); @@ -829,7 +829,7 @@ describe('PrepareSessionInput schema validation', () => { const longPrompt = 'a'.repeat(schemaLimits.Limits.MAX_PROMPT_LENGTH + 1); const result = schemas.PrepareSessionInput.safeParse({ prompt: longPrompt, - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', }); @@ -840,7 +840,7 @@ describe('PrepareSessionInput schema validation', () => { const tooManyCommands = Array(schemaLimits.Limits.MAX_SETUP_COMMANDS + 1).fill('echo test'); const result = schemas.PrepareSessionInput.safeParse({ prompt: 'Test', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', setupCommands: tooManyCommands, @@ -852,7 +852,7 @@ describe('PrepareSessionInput schema validation', () => { const longCommand = 'a'.repeat(schemaLimits.Limits.MAX_SETUP_COMMAND_LENGTH + 1); const result = schemas.PrepareSessionInput.safeParse({ prompt: 'Test', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', setupCommands: [longCommand], @@ -903,8 +903,17 @@ describe('UpdateSessionInput schema validation', () => { it('should validate mode values', () => { // All modes except 'custom' don't require appendSystemPrompt - // Includes aliases: architect/ask -> plan, orchestrator/build -> code - const modesWithoutPrompt = ['plan', 'code', 'build', 'orchestrator', 'architect', 'ask', null]; + // Includes backward-compatible aliases: build -> code, architect -> plan + const modesWithoutPrompt = [ + 'code', + 'plan', + 'debug', + 'orchestrator', + 'ask', + 'build', + 'architect', + null, + ]; for (const mode of modesWithoutPrompt) { const result = schemas.UpdateSessionInput.safeParse({ cloudAgentSessionId: 'agent_12345678-1234-1234-1234-123456789abc', @@ -951,7 +960,7 @@ describe('integration flow tests', () => { const prepareResult = await prepareCaller.prepareSession({ prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', githubToken: 'ghp_test_token', @@ -991,7 +1000,7 @@ describe('MCP server count limits', () => { const result = schemas.PrepareSessionInput.safeParse({ prompt: 'Test', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', mcpServers: tooManyServers, @@ -1010,7 +1019,7 @@ describe('MCP server count limits', () => { const result = schemas.PrepareSessionInput.safeParse({ prompt: 'Test', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', mcpServers: maxServers, @@ -1046,7 +1055,7 @@ describe('DO state machine edge cases', () => { preparedAt: Date.now() - 1000, initiatedAt: Date.now(), // Missing: prompt - mode: 'build', + mode: 'code', model: 'claude-3', kiloSessionId: '123e4567-e89b-12d3-a456-426614174000', githubRepo: 'acme/repo', @@ -1075,7 +1084,7 @@ describe('DO state machine edge cases', () => { preparedAt: Date.now() - 1000, initiatedAt: Date.now(), prompt: 'Test prompt', - // Missing: mode + // Missing: mode (this test verifies we handle missing mode gracefully) model: 'claude-3', kiloSessionId: '123e4567-e89b-12d3-a456-426614174000', githubRepo: 'acme/repo', @@ -1102,7 +1111,7 @@ describe('DO state machine edge cases', () => { preparedAt: Date.now() - 1000, initiatedAt: Date.now(), prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', // Missing: kiloSessionId githubRepo: 'acme/repo', @@ -1136,7 +1145,7 @@ describe('DO state machine edge cases', () => { preparedAt: Date.now() - 1000, initiatedAt: Date.now(), prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', kiloSessionId: '123e4567-e89b-12d3-a456-426614174000', githubRepo: 'acme/repo', @@ -1175,7 +1184,7 @@ describe('DO state machine edge cases', () => { preparedAt: Date.now() - 1000, initiatedAt: firstInitiatedAt, prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', kiloSessionId: '123e4567-e89b-12d3-a456-426614174000', githubRepo: 'acme/repo', @@ -1328,7 +1337,7 @@ describe('DO state machine edge cases', () => { await expect( caller.prepareSession({ prompt: 'Test', - mode: 'build', + mode: 'code', model: 'claude-3', githubRepo: 'acme/repo', githubToken: 'ghp_test_token', diff --git a/cloud-agent-next/src/session-service.test.ts b/cloud-agent-next/src/session-service.test.ts index a14a467d9..4d3ee45dc 100644 --- a/cloud-agent-next/src/session-service.test.ts +++ b/cloud-agent-next/src/session-service.test.ts @@ -2923,7 +2923,7 @@ describe('SessionService', () => { preparedAt: 1700000000000, initiatedAt: 1700000001000, prompt: 'Original prompt from prepareSession', - mode: 'build', + mode: 'code', model: 'claude-3-opus', autoCommit: true, kiloSessionId: '123e4567-e89b-12d3-a456-426614174000', @@ -2976,7 +2976,7 @@ describe('SessionService', () => { preparedAt: 1700000000000, initiatedAt: 1700000001000, prompt: 'Original prompt from prepareSession', - mode: 'build', + mode: 'code', model: 'claude-3-opus', autoCommit: true, // These fields should be updated @@ -3062,7 +3062,7 @@ describe('SessionService', () => { initiatedAt: 1700000001000, upstreamBranch: 'feature/my-branch', // This triggers manageBranch path prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', kiloSessionId: '123e4567-e89b-12d3-a456-426614174000', }; @@ -3133,7 +3133,7 @@ describe('SessionService', () => { initiatedAt: 1700000001000, // NO upstreamBranch - should create session branch prompt: 'Test prompt', - mode: 'build', + mode: 'code', model: 'claude-3', kiloSessionId: '123e4567-e89b-12d3-a456-426614174000', }; diff --git a/cloud-agent-next/src/streaming.test.ts b/cloud-agent-next/src/streaming.test.ts index 3166b5df2..5ac6f23c7 100644 --- a/cloud-agent-next/src/streaming.test.ts +++ b/cloud-agent-next/src/streaming.test.ts @@ -135,7 +135,7 @@ describe('streamKilocodeExecution', () => { const prompt = 'test prompt'; const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', prompt, { + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', prompt, { sessionId: 'session-123', }) ); @@ -146,7 +146,7 @@ describe('streamKilocodeExecution', () => { ); expect(mockExecStream).toHaveBeenCalledTimes(1); const command = mockExecStream.mock.calls[0]?.[0] as string; - expect(command).toContain('--mode=build'); + expect(command).toContain('--mode=code'); expect(command).toContain('--workspace=/workspace/test'); expect(command).toContain('--json'); @@ -179,7 +179,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const { events, error } = await collectEventsUntilError( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt') + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt') ); expect(mockExecStream).toHaveBeenCalledTimes(1); @@ -202,7 +202,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const { events, error } = await collectEventsUntilError( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt') + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt') ); expect(mockExecStream).toHaveBeenCalledTimes(1); @@ -228,7 +228,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt', { + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt', { sessionId: 'stream-session', }) ); @@ -262,7 +262,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt') + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt') ); expect(mockExecStream).toHaveBeenCalledTimes(1); @@ -319,7 +319,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt') + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt') ); expect(mockExecStream).toHaveBeenCalledTimes(1); @@ -371,7 +371,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt') + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt') ); expect(mockExecStream).toHaveBeenCalledTimes(1); @@ -425,7 +425,7 @@ describe('streamKilocodeExecution', () => { mockSandbox, mockSession, sessionContext, - 'build', + 'code', 'test prompt', options ) @@ -464,7 +464,7 @@ describe('streamKilocodeExecution', () => { mockSandbox, mockSession, sessionContext, - 'build', + 'code', 'prompt', undefined, fakeEnv @@ -493,7 +493,7 @@ describe('streamKilocodeExecution', () => { mockSandbox, mockSession, sessionContext, - 'build', + 'code', 'prompt', { kiloSessionId, isFirstExecution: false }, fakeEnv @@ -521,7 +521,7 @@ describe('streamKilocodeExecution', () => { mockSandbox, mockSession, sessionContext, - 'build', + 'code', 'prompt', { isFirstExecution: true }, fakeEnv @@ -570,7 +570,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt', { + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt', { sessionId: 'session-terminal', }) ); @@ -636,7 +636,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt', { + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt', { sessionId: 'session-payment', }) ); @@ -688,7 +688,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt', { + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt', { sessionId: 'session-payment-title', }) ); @@ -729,7 +729,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt') + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt') ); // Should have attempted to list and kill processes @@ -776,7 +776,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt') + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt') ); // Should have listed processes but not killed any @@ -815,7 +815,7 @@ describe('streamKilocodeExecution', () => { mockSandbox, mockSession, sessionContext, - 'build', + 'code', 'test prompt' ); @@ -861,7 +861,7 @@ describe('streamKilocodeExecution', () => { mockSandbox, mockSession, sessionContext, - 'build', + 'code', 'prompt', { skipInterruptPolling: true }, fakeEnv @@ -896,7 +896,7 @@ describe('streamKilocodeExecution', () => { mockSandbox, mockSession, sessionContext, - 'build', + 'code', 'prompt', { skipInterruptPolling: true }, fakeEnv @@ -935,7 +935,7 @@ describe('streamKilocodeExecution', () => { mockSandbox, mockSession, sessionContext, - 'build', + 'code', 'prompt', { skipInterruptPolling: true }, fakeEnv @@ -975,7 +975,7 @@ describe('streamKilocodeExecution', () => { mockSandbox, mockSession, sessionContext, - 'build', + 'code', 'prompt', { skipInterruptPolling: true }, fakeEnv @@ -1009,7 +1009,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); // No env provided - should not throw const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'prompt') + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'prompt') ); // Should still emit the session_created event as a kilocode event @@ -1042,7 +1042,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt', { + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt', { sessionId: 'session-rpc-test', }) ); @@ -1065,7 +1065,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt', { + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt', { sessionId: 'session-network-test', }) ); @@ -1087,7 +1087,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt', { + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt', { sessionId: 'session-container-test', }) ); @@ -1109,7 +1109,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt', { + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt', { sessionId: 'session-deployment-test', }) ); @@ -1131,7 +1131,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt', { + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt', { sessionId: 'session-do-storage-test', }) ); @@ -1153,7 +1153,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const events = await collectEvents( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt', { + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt', { sessionId: 'session-generic-rpc-test', }) ); @@ -1175,7 +1175,7 @@ describe('streamKilocodeExecution', () => { const sessionContext = createSessionContext('/workspace/test'); const { events, error } = await collectEventsUntilError( - streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'build', 'test prompt', { + streamKilocodeExecution(mockSandbox, mockSession, sessionContext, 'code', 'test prompt', { sessionId: 'session-unrelated-test', }) ); @@ -1197,7 +1197,7 @@ describe('streamKilocodeExecution', () => { mockSandbox, mockSession, sessionContext, - 'build', + 'code', 'test prompt' // No options provided ) diff --git a/cloud-agent-next/test/integration/session/start-execution-v2.test.ts b/cloud-agent-next/test/integration/session/start-execution-v2.test.ts index cf83f1c34..cadc41758 100644 --- a/cloud-agent-next/test/integration/session/start-execution-v2.test.ts +++ b/cloud-agent-next/test/integration/session/start-execution-v2.test.ts @@ -34,7 +34,7 @@ describe('CloudAgentSession.startExecutionV2', () => { const activeId = 'exc_active' as ExecutionId; await instance.addExecution({ executionId: activeId, - mode: 'build', + mode: 'code', streamingMode: 'websocket', ingestToken: activeId, }); @@ -45,7 +45,7 @@ describe('CloudAgentSession.startExecutionV2', () => { userId, authToken: 'token-init', prompt: 'do the thing', - mode: 'build', + mode: 'code', model: 'test-model', gitUrl: 'https://example.com/repo.git', gitToken: 'git-token', @@ -84,7 +84,7 @@ describe('CloudAgentSession.startExecutionV2', () => { orgId: 'org_test', kiloSessionId: '88888888-8888-4888-8888-888888888888', prompt: 'prepared prompt', - mode: 'build', + mode: 'code', model: 'test-model', kilocodeToken: 'token-followup', gitUrl: 'https://example.com/repo.git', diff --git a/cloud-agent-next/wrapper/src/auto-commit.ts b/cloud-agent-next/wrapper/src/auto-commit.ts index be2983d0f..36a7a47a5 100644 --- a/cloud-agent-next/wrapper/src/auto-commit.ts +++ b/cloud-agent-next/wrapper/src/auto-commit.ts @@ -103,7 +103,7 @@ export async function runAutoCommit(opts: AutoCommitOptions): Promise([ const DEFAULT_AUTO_MODEL = SONNET; function resolveAutoModel(modeHeader: string | null) { - const mode = modeHeader?.trim().toLowerCase() ?? 'build'; + const mode = modeHeader?.trim().toLowerCase() ?? 'code'; return MODE_TO_MODEL.get(mode) ?? DEFAULT_AUTO_MODEL; } diff --git a/src/components/cloud-agent-next/CloudChatContainer.tsx b/src/components/cloud-agent-next/CloudChatContainer.tsx index b49a5135a..c95002faf 100644 --- a/src/components/cloud-agent-next/CloudChatContainer.tsx +++ b/src/components/cloud-agent-next/CloudChatContainer.tsx @@ -54,6 +54,13 @@ import { CloudChatPresentation } from './CloudChatPresentation'; import type { ResumeConfig } from './ResumeConfigModal'; import type { AgentMode, SessionStartConfig } from './types'; +/** Normalize legacy mode strings ('build' → 'code', 'architect' → 'plan') from DB/DO */ +function normalizeMode(mode: string): AgentMode { + if (mode === 'build') return 'code'; + if (mode === 'architect') return 'plan'; + return mode as AgentMode; +} + type CloudChatContainerProps = { organizationId?: string; }; @@ -177,7 +184,7 @@ export function CloudChatContainer({ organizationId }: CloudChatContainerProps) // Input toolbar state for mode/model selection // These persist between messages and update sessionConfig when changed - const [inputMode, setInputMode] = useState('build'); + const [inputMode, setInputMode] = useState('code'); const [inputModel, setInputModel] = useState(''); // Auto-scroll behavior @@ -288,7 +295,7 @@ export function CloudChatContainer({ organizationId }: CloudChatContainerProps) // Only sync when sessionConfig changes (new session loaded or initial config) useEffect(() => { if (sessionConfig?.mode) { - setInputMode(sessionConfig.mode as AgentMode); + setInputMode(normalizeMode(sessionConfig.mode)); } if (sessionConfig?.model) { setInputModel(sessionConfig.model); @@ -426,17 +433,19 @@ export function CloudChatContainer({ organizationId }: CloudChatContainerProps) // Apply runtime state from DO (mode, model, repository) if (runtimeState) { if (runtimeState.mode) { - setInputMode(runtimeState.mode as AgentMode); + setInputMode(normalizeMode(runtimeState.mode)); } if (runtimeState.model) { setInputModel(runtimeState.model); } // Update sessionConfig with mode/model/repository from cloud-agent DO if (runtimeState.mode && runtimeState.model) { + const normalizedMode = normalizeMode(runtimeState.mode); + const model = runtimeState.model; setSessionConfig(prev => ({ sessionId: sessionData.cloud_agent_session_id ?? sessionData.session_id, - mode: runtimeState.mode as AgentMode, - model: runtimeState.model as string, + mode: normalizedMode, + model, repository: runtimeState.githubRepo ?? prev?.repository ?? '', })); } diff --git a/src/components/cloud-agent-next/CloudNextSessionsPage.tsx b/src/components/cloud-agent-next/CloudNextSessionsPage.tsx index 56ee3e413..eaac65387 100644 --- a/src/components/cloud-agent-next/CloudNextSessionsPage.tsx +++ b/src/components/cloud-agent-next/CloudNextSessionsPage.tsx @@ -93,7 +93,7 @@ export function CloudNextSessionsPage({ organizationId }: CloudNextSessionsPageP const [prompt, setPrompt] = useState(''); const [selectedRepo, setSelectedRepo] = useState(''); const [selectedPlatform, setSelectedPlatform] = useState('github'); - const [mode, setMode] = useState('build'); + const [mode, setMode] = useState('code'); const [model, setModel] = useState(''); const [isModelUserSelected, setIsModelUserSelected] = useState(false); const [isPreparing, setIsPreparing] = useState(false); diff --git a/src/components/cloud-agent-next/ResumeConfigModal.tsx b/src/components/cloud-agent-next/ResumeConfigModal.tsx index 145c59243..4a0102680 100644 --- a/src/components/cloud-agent-next/ResumeConfigModal.tsx +++ b/src/components/cloud-agent-next/ResumeConfigModal.tsx @@ -51,8 +51,11 @@ type ResumeConfigModalProps = { }; export const MODES = [ - { value: 'build', label: 'Build' }, + { value: 'code', label: 'Code' }, { value: 'plan', label: 'Plan' }, + { value: 'debug', label: 'Debug' }, + { value: 'orchestrator', label: 'Orchestrator' }, + { value: 'ask', label: 'Ask' }, ] as const; /** Valid mode values for validation */ @@ -80,7 +83,7 @@ export function ResumeConfigModal({ defaultModel, }: ResumeConfigModalProps) { // Form state - const [mode, setMode] = useState(defaultMode || 'build'); + const [mode, setMode] = useState(defaultMode || 'code'); const [model, setModel] = useState(defaultModel || ''); const [envVars, setEnvVars] = useState>({}); const [setupCommands, setSetupCommands] = useState([]); @@ -88,7 +91,7 @@ export function ResumeConfigModal({ // Sync mode when defaultMode prop changes (e.g., when session data loads or modal opens for different session) // Always sync to handle both truthy values and reset to fallback when undefined/null useEffect(() => { - setMode(defaultMode || 'build'); + setMode(defaultMode || 'code'); }, [defaultMode]); // Sync model when defaultModel prop changes (e.g., when session data loads or modal opens for different session) diff --git a/src/components/cloud-agent-next/demo-config.ts b/src/components/cloud-agent-next/demo-config.ts index 7b9d214bc..07ee703b6 100644 --- a/src/components/cloud-agent-next/demo-config.ts +++ b/src/components/cloud-agent-next/demo-config.ts @@ -21,7 +21,7 @@ export const DEMO_CONFIGS: DemoConfig[] = [ 'Personalize the KiloMan game by updating the player avatar to use your GitHub Gravatar', prompt: 'Update the player avatar in this game to use the Gravatar for GitHub user "{username}". The Gravatar URL should be: https://github.com/{username}.png. Once complete, please use "gh" the github cli to create a draft pull request with the changes, the GH_TOKEN is already available in the environment. Please be sure assign the pr to the user.', - mode: 'build', + mode: 'code', model: 'x-ai/grok-code-fast-1', }, { diff --git a/src/components/cloud-agent-next/hooks/useResumeConfigModal.test.ts b/src/components/cloud-agent-next/hooks/useResumeConfigModal.test.ts index 0ec6612ab..bfa57b50b 100644 --- a/src/components/cloud-agent-next/hooks/useResumeConfigModal.test.ts +++ b/src/components/cloud-agent-next/hooks/useResumeConfigModal.test.ts @@ -93,7 +93,7 @@ describe('needsResumeConfigModal', () => { const indexedDbSession = createIndexedDbSession({ resumeConfig: { - mode: 'build', + mode: 'code', model: 'anthropic/claude-3-5-sonnet', }, }); @@ -168,7 +168,7 @@ describe('buildStreamResumeConfig', () => { const result = buildStreamResumeConfig({ resumeConfig: { - mode: 'build', + mode: 'code', model: 'local-model', envVars: { API_KEY: 'secret' }, }, @@ -177,7 +177,7 @@ describe('buildStreamResumeConfig', () => { }); expect(result).toEqual({ - mode: 'build', + mode: 'code', model: 'local-model', envVars: { API_KEY: 'secret' }, setupCommands: undefined, diff --git a/src/components/cloud-agent-next/hooks/useSidebarSessions.ts b/src/components/cloud-agent-next/hooks/useSidebarSessions.ts index 178269a6e..10a45e1b8 100644 --- a/src/components/cloud-agent-next/hooks/useSidebarSessions.ts +++ b/src/components/cloud-agent-next/hooks/useSidebarSessions.ts @@ -31,7 +31,7 @@ function dbSessionV2ToStoredSession(session: DbSessionV2): StoredSession { sessionId: session.session_id, repository: 'Repository', // V2 sessions don't store git_url in DB - shown as generic prompt: title, - mode: 'build', // Default mode for V2 + mode: 'code', // Default mode for V2 model: '', // Not stored in DB session list status: session.cloud_agent_session_id ? 'active' : 'completed', createdAt: session.created_at.toISOString(), diff --git a/src/components/cloud-agent-next/session-config.test.ts b/src/components/cloud-agent-next/session-config.test.ts index 2e132f243..d153a0b2a 100644 --- a/src/components/cloud-agent-next/session-config.test.ts +++ b/src/components/cloud-agent-next/session-config.test.ts @@ -16,7 +16,7 @@ describe('needsResumeConfiguration', () => { it('returns false when resumeConfig is provided', () => { const resumeConfig: ResumeConfig = { - mode: 'build', + mode: 'code', model: 'anthropic/claude-3-5-sonnet', }; @@ -32,7 +32,7 @@ describe('needsResumeConfiguration', () => { it('returns false when streamResumeConfig is provided', () => { const streamResumeConfig: StreamResumeConfig = { - mode: 'build', + mode: 'code', model: 'anthropic/claude-3-5-sonnet', githubRepo: 'owner/repo', }; @@ -49,7 +49,7 @@ describe('needsResumeConfiguration', () => { it('returns true for CLI session without valid config', () => { const invalidConfig: SessionConfig = { - mode: 'build', + mode: 'code', model: '', // Empty model is invalid repository: '', sessionId: '', @@ -67,7 +67,7 @@ describe('needsResumeConfiguration', () => { it('returns false for web session with valid config', () => { const validConfig: SessionConfig = { - mode: 'build', + mode: 'code', model: 'anthropic/claude-3-5-sonnet', repository: 'owner/repo', sessionId: 'agent_xyz', @@ -85,7 +85,7 @@ describe('needsResumeConfiguration', () => { it('returns true for legacy web session with invalid config (empty model)', () => { const invalidConfig: SessionConfig = { - mode: 'build', + mode: 'code', model: '', // Legacy sessions may have empty model repository: '', sessionId: '', @@ -132,12 +132,12 @@ describe('needsResumeConfiguration', () => { it('prioritizes resumeConfig over invalid sessionConfig', () => { const resumeConfig: ResumeConfig = { - mode: 'build', + mode: 'code', model: 'anthropic/claude-3-5-sonnet', }; const invalidConfig: SessionConfig = { - mode: 'build', + mode: 'code', model: '', // Invalid repository: '', sessionId: '', @@ -155,13 +155,13 @@ describe('needsResumeConfiguration', () => { it('prioritizes streamResumeConfig over invalid sessionConfig', () => { const streamResumeConfig: StreamResumeConfig = { - mode: 'build', + mode: 'code', model: 'anthropic/claude-3-5-sonnet', githubRepo: 'owner/repo', }; const invalidConfig: SessionConfig = { - mode: 'build', + mode: 'code', model: '', // Invalid repository: '', sessionId: '', diff --git a/src/components/cloud-agent-next/session-config.ts b/src/components/cloud-agent-next/session-config.ts index 4fc604cdd..4cef1cacf 100644 --- a/src/components/cloud-agent-next/session-config.ts +++ b/src/components/cloud-agent-next/session-config.ts @@ -53,7 +53,7 @@ export type BuildSessionConfigOptions = { * Precedence for mode/model: * 1. resumeConfig (from ResumeConfigModal or CLI resume flow) * 2. dbSession (last_mode/last_model from database) - * 3. defaults (defaultMode/defaultModel or 'build'/'') + * 3. defaults (defaultMode/defaultModel or 'code'/'') * * @param options - Configuration sources and defaults * @returns Complete SessionConfig object @@ -80,7 +80,7 @@ export function buildSessionConfig(options: BuildSessionConfigOptions): SessionC repository, resumeConfig, dbSession, - defaultMode = 'build', + defaultMode = 'code', defaultModel = '', } = options; @@ -100,7 +100,7 @@ export function buildSessionConfig(options: BuildSessionConfigOptions): SessionC * Check if a SessionConfig has valid mode and model for sendMessage. * * The sendMessage schema requires: - * - mode: one of the valid agent modes (plan, build) + * - mode: one of the valid agent modes (code, plan, debug, orchestrator, ask) * - model: non-empty string (min 1 character) * * @param config - SessionConfig to validate @@ -109,7 +109,7 @@ export function buildSessionConfig(options: BuildSessionConfigOptions): SessionC export function isValidSessionConfig(config: SessionConfig | null): config is SessionConfig { if (!config) return false; - const validModes: AgentMode[] = ['plan', 'build']; + const validModes: AgentMode[] = ['code', 'plan', 'debug', 'orchestrator', 'ask']; const hasValidMode = validModes.includes(config.mode as AgentMode); const hasValidModel = config.model.length > 0; @@ -129,7 +129,7 @@ export function getModeModelWithSource(options: { dbSession?: DbSessionInfo | null; defaults?: { mode: string; model: string }; }): { mode: string; model: string; modeSource: string; modelSource: string } { - const { resumeConfig, dbSession, defaults = { mode: 'build', model: '' } } = options; + const { resumeConfig, dbSession, defaults = { mode: 'code', model: '' } } = options; let mode: string = defaults.mode; let model: string = defaults.model; diff --git a/src/components/cloud-agent-next/store/db-session-atoms.ts b/src/components/cloud-agent-next/store/db-session-atoms.ts index 418129711..3e1670b91 100644 --- a/src/components/cloud-agent-next/store/db-session-atoms.ts +++ b/src/components/cloud-agent-next/store/db-session-atoms.ts @@ -517,7 +517,7 @@ export const createNewSessionInIndexedDbAtom = atom( /** Organization context if applicable */ orgContext?: OrgContext | null; /** Session mode from the form */ - mode?: 'plan' | 'build'; + mode?: 'code' | 'plan' | 'debug' | 'orchestrator' | 'ask'; /** Session model from the form */ model?: string; } diff --git a/src/components/cloud-agent-next/types.ts b/src/components/cloud-agent-next/types.ts index a935a40e5..aadf7ca6d 100644 --- a/src/components/cloud-agent-next/types.ts +++ b/src/components/cloud-agent-next/types.ts @@ -243,7 +243,7 @@ export function isMessageStreaming(message: StoredMessage): boolean { * Valid mode values for cloud agent sessions. * Uses new modes for cloud-agent-next. */ -export type AgentMode = 'plan' | 'build'; +export type AgentMode = 'code' | 'plan' | 'debug' | 'orchestrator' | 'ask'; // ============================================================================ // Stream Event Types @@ -337,7 +337,7 @@ export type SessionConfig = { export type SessionStartConfig = { githubRepo: string; prompt: string; - mode: 'plan' | 'build'; + mode: AgentMode; model: string; githubToken?: string; envVars?: Record; diff --git a/src/components/cloud-agent-next/useCloudAgentStream.ts b/src/components/cloud-agent-next/useCloudAgentStream.ts index f190a6d82..017b8f7b5 100644 --- a/src/components/cloud-agent-next/useCloudAgentStream.ts +++ b/src/components/cloud-agent-next/useCloudAgentStream.ts @@ -500,7 +500,7 @@ export function useCloudAgentStream({ try { let result: { cloudAgentSessionId: string }; - // Use cloudAgentNext endpoints with new modes ('plan' | 'build') + // Use cloudAgentNext endpoints if (organizationIdRef.current) { result = await trpcClient.organizations.cloudAgentNext.initiateFromPreparedSession.mutate( { @@ -642,13 +642,13 @@ export function useCloudAgentStream({ try { let result: { cloudAgentSessionId: string }; - // Use cloudAgentNext endpoints with new modes ('plan' | 'build') + // mode param is string from caller; cast to schema type needed if (organizationIdRef.current) { result = await trpcClient.organizations.cloudAgentNext.sendMessage.mutate( { cloudAgentSessionId: activeCloudAgentSessionId, prompt: message, - mode: mode as 'plan' | 'build', + mode: mode as 'code' | 'plan' | 'debug' | 'orchestrator' | 'ask', model, organizationId: organizationIdRef.current, }, @@ -659,7 +659,7 @@ export function useCloudAgentStream({ { cloudAgentSessionId: activeCloudAgentSessionId, prompt: message, - mode: mode as 'plan' | 'build', + mode: mode as 'code' | 'plan' | 'debug' | 'orchestrator' | 'ask', model, }, { context: { skipBatch: true } } diff --git a/src/components/cloud-agent-next/utils/mode-conversion.ts b/src/components/cloud-agent-next/utils/mode-conversion.ts deleted file mode 100644 index b14f66c50..000000000 --- a/src/components/cloud-agent-next/utils/mode-conversion.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Mode conversion utilities for cloud-agent-next - * - * The new cloud-agent-next uses 'plan' | 'build' modes, while the current - * tRPC endpoints use the legacy 'architect' | 'code' | 'ask' | 'debug' | 'orchestrator' modes. - * - * This module provides conversion functions to bridge the gap until the new - * worker endpoints are ready. - */ - -export type NewAgentMode = 'plan' | 'build'; -export type LegacyAgentMode = 'architect' | 'code' | 'ask' | 'debug' | 'orchestrator'; - -/** - * Convert new mode to legacy mode for current tRPC endpoints - */ -export function newModeToLegacy(mode: NewAgentMode): LegacyAgentMode { - switch (mode) { - case 'plan': - return 'architect'; - case 'build': - return 'code'; - } -} - -/** - * Convert legacy mode to new mode - */ -export function legacyModeToNew(mode: LegacyAgentMode): NewAgentMode { - switch (mode) { - case 'architect': - case 'ask': - return 'plan'; - case 'code': - case 'debug': - case 'orchestrator': - return 'build'; - } -} - -/** - * Check if a mode is a new-style mode - */ -export function isNewMode(mode: string): mode is NewAgentMode { - return mode === 'plan' || mode === 'build'; -} - -/** - * Check if a mode is a legacy-style mode - */ -export function isLegacyMode(mode: string): mode is LegacyAgentMode { - return ['architect', 'code', 'ask', 'debug', 'orchestrator'].includes(mode); -} diff --git a/src/components/shared/ModeCombobox.tsx b/src/components/shared/ModeCombobox.tsx index 8d2bf0d2f..393aa1e4a 100644 --- a/src/components/shared/ModeCombobox.tsx +++ b/src/components/shared/ModeCombobox.tsx @@ -34,9 +34,12 @@ export const LEGACY_MODE_OPTIONS: ModeOption< /** * New mode options for cloud-agent-next. */ -export const NEXT_MODE_OPTIONS: ModeOption<'plan' | 'build'>[] = [ - { value: 'build', label: 'Build', description: 'Write and modify code' }, +export const NEXT_MODE_OPTIONS: ModeOption<'code' | 'plan' | 'debug' | 'orchestrator' | 'ask'>[] = [ + { value: 'code', label: 'Code', description: 'Write and modify code' }, { value: 'plan', label: 'Plan', description: 'Plan and design solutions' }, + { value: 'debug', label: 'Debug', description: 'Find and fix issues' }, + { value: 'orchestrator', label: 'Orchestrator', description: 'Coordinate complex tasks' }, + { value: 'ask', label: 'Ask', description: 'Get answers and explanations' }, ]; /** diff --git a/src/lib/cloud-agent-next/cloud-agent-client.ts b/src/lib/cloud-agent-next/cloud-agent-client.ts index 60fe8ddb3..286664999 100644 --- a/src/lib/cloud-agent-next/cloud-agent-client.ts +++ b/src/lib/cloud-agent-next/cloud-agent-client.ts @@ -63,11 +63,19 @@ export type CallbackTarget = { /** * Agent modes accepted by the API. - * - plan, architect, ask: Planning/analysis mode - * - code, build, orchestrator: Code generation mode + * - code, plan, debug, orchestrator, ask: CLI agent modes + * - build, architect: Backward-compatible aliases (build → code, architect → plan) * - custom: Custom mode (requires appendSystemPrompt) */ -export type AgentMode = 'plan' | 'code' | 'build' | 'orchestrator' | 'architect' | 'ask' | 'custom'; +export type AgentMode = + | 'code' + | 'plan' + | 'debug' + | 'orchestrator' + | 'ask' + | 'build' + | 'architect' + | 'custom'; /** Input for prepareSession procedure */ export type PrepareSessionInput = { @@ -117,7 +125,7 @@ export type InitiateFromPreparedSessionInput = { export type SendMessageInput = { cloudAgentSessionId: string; prompt: string; - mode: 'plan' | 'build'; + mode: 'code' | 'plan' | 'debug' | 'orchestrator' | 'ask'; model: string; autoCommit?: boolean; githubToken?: string; diff --git a/src/routers/cloud-agent-next-schemas.ts b/src/routers/cloud-agent-next-schemas.ts index 98bdf0d93..c71628747 100644 --- a/src/routers/cloud-agent-next-schemas.ts +++ b/src/routers/cloud-agent-next-schemas.ts @@ -8,17 +8,18 @@ import * as z from 'zod'; /** * Agent mode enum - all supported modes. - * - plan, architect, ask: Planning/analysis mode - * - code, build, orchestrator: Code generation mode + * - code, plan, debug, orchestrator, ask: CLI agent modes + * - build, architect: Backward-compatible aliases (build → code, architect → plan) * - custom: Custom mode (requires appendSystemPrompt) */ export const agentModeNextSchema = z.enum([ - 'plan', 'code', - 'build', + 'plan', + 'debug', 'orchestrator', - 'architect', 'ask', + 'build', + 'architect', 'custom', ]); @@ -113,7 +114,7 @@ export const baseInitiateFromPreparedSessionNextSchema = z.object({ }); // Agent mode for sendMessage (excludes custom - use prepareSession/updateSession for custom mode) -export const agentModeSendMessageSchema = z.enum(['plan', 'build']); +export const agentModeSendMessageSchema = z.enum(['code', 'plan', 'debug', 'orchestrator', 'ask']); // Schema for sending a message (V2 - uses cloudAgentSessionId) // Note: custom mode is not allowed for sendMessage - use prepareSession/updateSession instead