diff --git a/src/cli/commands/add/__tests__/validate.test.ts b/src/cli/commands/add/__tests__/validate.test.ts index 2be895494..fdefc6417 100644 --- a/src/cli/commands/add/__tests__/validate.test.ts +++ b/src/cli/commands/add/__tests__/validate.test.ts @@ -1583,4 +1583,15 @@ describe('validateAddAgentOptions - session storage mount path', () => { const result = validateAddAgentOptions({ ...baseOptions }); expect(result.valid).toBe(true); }); + + it('rejects session storage for TypeScript agents', () => { + const result = validateAddAgentOptions({ + ...baseOptions, + language: 'TypeScript', + framework: 'Strands', + sessionStorageMountPath: '/mnt/data', + }); + expect(result.valid).toBe(false); + expect(result.error).toBe('--session-storage-mount-path is not supported for TypeScript agents'); + }); }); diff --git a/src/cli/commands/add/validate.ts b/src/cli/commands/add/validate.ts index 4a6275010..b39f89454 100644 --- a/src/cli/commands/add/validate.ts +++ b/src/cli/commands/add/validate.ts @@ -91,6 +91,11 @@ export function validateAddAgentOptions(options: AddAgentOptions): ValidationRes (matchEnumValue(TargetLanguageSchema, options.language) as typeof options.language) ?? options.language; if (options.build) options.build = matchEnumValue(BuildTypeSchema, options.build) ?? options.build; + // Session storage is not supported for TypeScript agents — reject early before any path-specific returns + if (options.sessionStorageMountPath && options.language === 'TypeScript') { + return { valid: false, error: '--session-storage-mount-path is not supported for TypeScript agents' }; + } + if (!options.name) { return { valid: false, error: '--name is required' }; } @@ -285,7 +290,7 @@ export function validateAddAgentOptions(options: AddAgentOptions): ValidationRes if (lifecycleResult.idleTimeout !== undefined) options.idleTimeout = lifecycleResult.idleTimeout; if (lifecycleResult.maxLifetime !== undefined) options.maxLifetime = lifecycleResult.maxLifetime; - // Validate session storage mount path + // Validate session storage mount path format (TypeScript rejection is handled at the top) if (options.sessionStorageMountPath) { const mountPathResult = SessionStorageSchema.shape.mountPath.safeParse(options.sessionStorageMountPath); if (!mountPathResult.success) { diff --git a/src/cli/tui/screens/generate/GenerateWizardUI.tsx b/src/cli/tui/screens/generate/GenerateWizardUI.tsx index 70ece0c74..7daa2d88d 100644 --- a/src/cli/tui/screens/generate/GenerateWizardUI.tsx +++ b/src/cli/tui/screens/generate/GenerateWizardUI.tsx @@ -126,9 +126,11 @@ export function GenerateWizardUI({ const isSessionStorageMountPathStep = wizard.step === 'sessionStorageMountPath'; const isConfirmStep = wizard.step === 'confirm'; - // Advanced multi-select items — filter out dockerfile when not a Container build + // Advanced multi-select items — filter out options not applicable to current config const advancedItems: SelectableItem[] = ADVANCED_SETTING_OPTIONS.filter( - o => o.id !== 'dockerfile' || wizard.config.buildType === 'Container' + o => + (o.id !== 'dockerfile' || wizard.config.buildType === 'Container') && + (o.id !== 'filesystem' || wizard.config.language !== 'TypeScript') ).map(o => ({ id: o.id, title: o.title, description: o.description })); const handleSelect = (item: SelectableItem) => {