From abdaa7c358711b88c64fbfb838ed83a99b88fe71 Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 07:23:54 +0000 Subject: [PATCH 1/3] fix(cloud-agent-next): normalize subagent model names with kilo/ prefix Subagent models in runtime agent profiles were passed to the CLI verbatim, missing the kilo/ prefix normalization applied to top-level session models. This caused 'model not found' errors for models like 'anthropic/claude-opus-4.7' because the CLI expects 'kilo/anthropic/ claude-opus-4.7'. --- .../src/session-service.test.ts | 57 +++++++++++++++++++ .../cloud-agent-next/src/session-service.ts | 4 +- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/services/cloud-agent-next/src/session-service.test.ts b/services/cloud-agent-next/src/session-service.test.ts index 900bcbcf20..ec17ff1292 100644 --- a/services/cloud-agent-next/src/session-service.test.ts +++ b/services/cloud-agent-next/src/session-service.test.ts @@ -3922,3 +3922,60 @@ describe('SessionService', () => { }); }); }); + +describe('buildAgentEntryFromRuntimeAgent', () => { + const { buildAgentEntryFromRuntimeAgent } = await import('./session-service.js'); + + it('normalizes model with kilo/ prefix when not already prefixed', () => { + const result = buildAgentEntryFromRuntimeAgent({ + slug: 'test-agent', + name: 'Test Agent', + config: { model: 'anthropic/claude-opus-4.7', mode: 'subagent' }, + }); + expect(result.model).toBe('kilo/anthropic/claude-opus-4.7'); + }); + + it('does not double-prefix models that already have kilo/', () => { + const result = buildAgentEntryFromRuntimeAgent({ + slug: 'test-agent', + name: 'Test Agent', + config: { model: 'kilo/code', mode: 'subagent' }, + }); + expect(result.model).toBe('kilo/code'); + }); + + it('handles null model', () => { + const result = buildAgentEntryFromRuntimeAgent({ + slug: 'test-agent', + name: 'Test Agent', + config: { model: null, mode: 'subagent' }, + }); + expect(result.model).toBeUndefined(); + }); + + it('handles undefined model', () => { + const result = buildAgentEntryFromRuntimeAgent({ + slug: 'test-agent', + name: 'Test Agent', + config: { mode: 'subagent' }, + }); + expect(result.model).toBeUndefined(); + }); + + it('passes through other config fields unchanged', () => { + const result = buildAgentEntryFromRuntimeAgent({ + slug: 'test-agent', + name: 'Test Agent', + config: { + model: 'anthropic/claude-sonnet-4', + mode: 'subagent', + temperature: 0.7, + prompt: 'You are a test agent', + }, + }); + expect(result.model).toBe('kilo/anthropic/claude-sonnet-4'); + expect(result.temperature).toBe(0.7); + expect(result.prompt).toBe('You are a test agent'); + expect(result.mode).toBe('subagent'); + }); +}); diff --git a/services/cloud-agent-next/src/session-service.ts b/services/cloud-agent-next/src/session-service.ts index f08c489b28..3b265cae2a 100644 --- a/services/cloud-agent-next/src/session-service.ts +++ b/services/cloud-agent-next/src/session-service.ts @@ -9,6 +9,8 @@ import type { } from './types.js'; import type { ExecutionParams as _ExecutionParams } from './schema.js'; import { generateSandboxId } from './sandbox-id.js'; +import { normalizeKilocodeModel } from './persistence/model-utils.js'; +import { normalizeKilocodeModel } from './persistence/model-utils.js'; import { checkDiskAndCleanBeforeSetup, cloneGitHubRepo, @@ -512,7 +514,7 @@ export function buildAgentEntryFromRuntimeAgent(agent: RuntimeAgent): Record Date: Tue, 12 May 2026 09:33:06 +0200 Subject: [PATCH 2/3] Apply suggestion from @kilo-code-bot[bot] Co-authored-by: kilo-code-bot[bot] <240665456+kilo-code-bot[bot]@users.noreply.github.com> --- services/cloud-agent-next/src/session-service.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/services/cloud-agent-next/src/session-service.ts b/services/cloud-agent-next/src/session-service.ts index 3b265cae2a..f98214eec1 100644 --- a/services/cloud-agent-next/src/session-service.ts +++ b/services/cloud-agent-next/src/session-service.ts @@ -10,7 +10,6 @@ import type { import type { ExecutionParams as _ExecutionParams } from './schema.js'; import { generateSandboxId } from './sandbox-id.js'; import { normalizeKilocodeModel } from './persistence/model-utils.js'; -import { normalizeKilocodeModel } from './persistence/model-utils.js'; import { checkDiskAndCleanBeforeSetup, cloneGitHubRepo, From fb108158ec7c773c9ea6bf2e0cda07dfa1e0d201 Mon Sep 17 00:00:00 2001 From: Evgeny Shurakov Date: Tue, 12 May 2026 09:57:37 +0200 Subject: [PATCH 3/3] fix(cloud-agent-next): use static import for buildAgentEntryFromRuntimeAgent in tests --- services/cloud-agent-next/src/session-service.test.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/services/cloud-agent-next/src/session-service.test.ts b/services/cloud-agent-next/src/session-service.test.ts index ec17ff1292..f605bd0a2e 100644 --- a/services/cloud-agent-next/src/session-service.test.ts +++ b/services/cloud-agent-next/src/session-service.test.ts @@ -66,7 +66,11 @@ import { restoreWorkspace as mockRestoreWorkspace, cleanupWorkspace as mockCleanupWorkspace, } from './workspace.js'; -import { InvalidSessionMetadataError, SessionService } from './session-service.js'; +import { + buildAgentEntryFromRuntimeAgent, + InvalidSessionMetadataError, + SessionService, +} from './session-service.js'; import type { SandboxInstance, SessionId, SessionContext, ExecutionSession } from './types.js'; import type { PersistenceEnv, CloudAgentSessionState } from './persistence/types.js'; @@ -3924,8 +3928,6 @@ describe('SessionService', () => { }); describe('buildAgentEntryFromRuntimeAgent', () => { - const { buildAgentEntryFromRuntimeAgent } = await import('./session-service.js'); - it('normalizes model with kilo/ prefix when not already prefixed', () => { const result = buildAgentEntryFromRuntimeAgent({ slug: 'test-agent',