aws-runtime-bridge 1.7.48 → 1.7.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/routes/terminal.d.ts +15 -0
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +73 -2
- package/dist/routes/terminal.test.js +51 -1
- package/dist/services/ai-source-apply.d.ts.map +1 -1
- package/dist/services/ai-source-apply.js +30 -9
- package/dist/services/ai-source-apply.test.js +50 -0
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts +1 -0
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts.map +1 -1
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.js +2 -1
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +1 -0
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +1 -1
- package/package/cc-switch-sdk/dist/services/ai-config-service.js +2 -1
- package/package.json +1 -1
|
@@ -60,6 +60,21 @@ export declare function evaluatePersistedSessionReuse(session: Pick<PersistedSes
|
|
|
60
60
|
*/
|
|
61
61
|
export declare function formatTerminalPrompt(currentDirectory: string): string;
|
|
62
62
|
export declare function buildRuntimeEnv(agentId: string, workspacePath: string | undefined, baseEnv: NodeJS.ProcessEnv, envOverrides?: Record<string, unknown>): Record<string, string>;
|
|
63
|
+
/**
|
|
64
|
+
* 主流程:SDK 模式输入若只是 mini-term 剪贴板临时文件路径,则展开为文件内容再发给模型。
|
|
65
|
+
* 具体实现:只处理整串匹配的绝对临时 paste 文件路径,避免影响显式 `type "path"` 等正常命令。
|
|
66
|
+
*/
|
|
67
|
+
export declare function resolveSdkInputMessage(input: unknown): Promise<string>;
|
|
68
|
+
export interface ClaudeCodeLaunchConfig {
|
|
69
|
+
envOverrides: Record<string, string>;
|
|
70
|
+
model?: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 主流程:将已持久化的 ClaudeCode AI 配置合并到启动配置,再让请求级覆盖保持最高优先级。
|
|
74
|
+
*/
|
|
75
|
+
export declare function buildClaudeCodeLaunchConfig(savedClaudeConfig: {
|
|
76
|
+
env?: Record<string, unknown>;
|
|
77
|
+
} | null | undefined, requestEnvOverrides?: Record<string, unknown>): ClaudeCodeLaunchConfig;
|
|
63
78
|
/**
|
|
64
79
|
* 将 SDK 工具结束事件转换为时间线返回数据状态。
|
|
65
80
|
* 主流程:格式化工具结果 -> 保留 MCP 专用展示 -> 其它工具按动作类型追加到对应时间线事件。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAKxC,OAAO,EAOL,KAAK,oBAAoB,EAEzB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAE7B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/terminal.js
CHANGED
|
@@ -14,6 +14,7 @@ import { v4 as uuidv4 } from 'uuid';
|
|
|
14
14
|
import { adapterRegistry, getToolActionInfo, isTransientClipboardPasteFilePath, redactTransientClipboardPastePaths, registerSdkProviders, resolveSdkProviderIdByCommand, } from '../adapter/index.js';
|
|
15
15
|
import { validateToken } from '../middleware/auth.js';
|
|
16
16
|
import { getAgentProcessManager } from '../services/agent-process-manager.js';
|
|
17
|
+
import { getAiConfigService } from '../services/cc-switch-sdk.js';
|
|
17
18
|
import { enqueueMcpLaunchBinding } from '../services/mcp-launch-binding-queue.js';
|
|
18
19
|
import { findClaudeCodeProcesses, isProcessRunning } from '../services/process-detector.js';
|
|
19
20
|
import { sendOutput, sendQuestionRequest, sendStatus } from '../services/session-output.js';
|
|
@@ -301,6 +302,69 @@ export function buildRuntimeEnv(agentId, workspacePath, baseEnv, envOverrides) {
|
|
|
301
302
|
env.AWS_MCP_CLAIM_LAUNCH_BINDING = 'true';
|
|
302
303
|
return env;
|
|
303
304
|
}
|
|
305
|
+
function stripWrappingQuotes(value) {
|
|
306
|
+
const trimmed = value.trim();
|
|
307
|
+
const first = trimmed[0];
|
|
308
|
+
const last = trimmed[trimmed.length - 1];
|
|
309
|
+
if ((first === '"' || first === "'") && first === last) {
|
|
310
|
+
return trimmed.slice(1, -1);
|
|
311
|
+
}
|
|
312
|
+
return trimmed;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* 主流程:SDK 模式输入若只是 mini-term 剪贴板临时文件路径,则展开为文件内容再发给模型。
|
|
316
|
+
* 具体实现:只处理整串匹配的绝对临时 paste 文件路径,避免影响显式 `type "path"` 等正常命令。
|
|
317
|
+
*/
|
|
318
|
+
export async function resolveSdkInputMessage(input) {
|
|
319
|
+
const message = String(input);
|
|
320
|
+
if (!isTransientClipboardPasteFilePath(message)) {
|
|
321
|
+
return message;
|
|
322
|
+
}
|
|
323
|
+
const filePath = stripWrappingQuotes(message);
|
|
324
|
+
if (!path.isAbsolute(filePath)) {
|
|
325
|
+
return message;
|
|
326
|
+
}
|
|
327
|
+
return fs.readFile(filePath, 'utf-8');
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* 主流程:将已持久化的 ClaudeCode AI 配置合并到启动配置,再让请求级覆盖保持最高优先级。
|
|
331
|
+
*/
|
|
332
|
+
export function buildClaudeCodeLaunchConfig(savedClaudeConfig, requestEnvOverrides) {
|
|
333
|
+
const envOverrides = {};
|
|
334
|
+
for (const source of [savedClaudeConfig?.env, requestEnvOverrides]) {
|
|
335
|
+
if (!source) {
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
for (const [key, value] of Object.entries(source)) {
|
|
339
|
+
const normalizedKey = key.trim();
|
|
340
|
+
if (!normalizedKey || value === undefined || value === null) {
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
const normalizedValue = String(value).trim();
|
|
344
|
+
if (!normalizedValue) {
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
envOverrides[normalizedKey] = normalizedValue;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
const model = envOverrides.ANTHROPIC_MODEL?.trim()
|
|
351
|
+
|| envOverrides.CODEX_MODEL?.trim()
|
|
352
|
+
|| undefined;
|
|
353
|
+
return { envOverrides, model };
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* 具体逻辑:读取 ClaudeCode live settings;读取失败不阻断启动,保持原 SDK 启动路径可用。
|
|
357
|
+
*/
|
|
358
|
+
async function readSavedClaudeCodeLaunchConfig() {
|
|
359
|
+
try {
|
|
360
|
+
return await getAiConfigService().readClaudeCodeConfig();
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
const err = error;
|
|
364
|
+
console.warn(`[Runtime] Failed to read saved ClaudeCode AI config: ${err.message}`);
|
|
365
|
+
return {};
|
|
366
|
+
}
|
|
367
|
+
}
|
|
304
368
|
function formatToolResultForTimeline(result) {
|
|
305
369
|
if (result === undefined || result === null) {
|
|
306
370
|
return undefined;
|
|
@@ -512,16 +576,23 @@ async function startSdkSession(req, res) {
|
|
|
512
576
|
console.log(`[Runtime] ★★★ SDK启动 ★★★ command="${command}", normalizedCommand="${normalizedCommand}", providerId="${providerId}"`);
|
|
513
577
|
const adapter = adapterRegistry.get(providerId);
|
|
514
578
|
sessionId = uuidv4();
|
|
579
|
+
const savedClaudeConfig = providerId === 'claude-code'
|
|
580
|
+
? await readSavedClaudeCodeLaunchConfig()
|
|
581
|
+
: null;
|
|
582
|
+
const claudeLaunchConfig = providerId === 'claude-code'
|
|
583
|
+
? buildClaudeCodeLaunchConfig(savedClaudeConfig, envOverrides)
|
|
584
|
+
: buildClaudeCodeLaunchConfig(null, envOverrides);
|
|
515
585
|
// 构建SDK配置
|
|
516
586
|
const config = {
|
|
517
587
|
command: command || 'claude',
|
|
518
588
|
workingDirectory: workspacePath,
|
|
519
589
|
autoAccept: Boolean(autoAccept),
|
|
520
590
|
initialPrompt,
|
|
591
|
+
model: claudeLaunchConfig.model,
|
|
521
592
|
// MCP 配置:不再默认注入 aws-mcp;由用户在面板中安装/配置
|
|
522
593
|
mcpConfigPath,
|
|
523
594
|
extraMcpServers: extraMcpServers || {},
|
|
524
|
-
envOverrides: buildRuntimeEnv(String(agentId), String(workspacePath), process.env, envOverrides),
|
|
595
|
+
envOverrides: buildRuntimeEnv(String(agentId), String(workspacePath), process.env, claudeLaunchConfig.envOverrides),
|
|
525
596
|
};
|
|
526
597
|
// 存储会话信息
|
|
527
598
|
sdkSessions.set(sessionId, {
|
|
@@ -844,7 +915,7 @@ terminalRouter.post('/input', validateToken, async (req, res) => {
|
|
|
844
915
|
res.json({ ok: true, mode: 'shortcut' });
|
|
845
916
|
return;
|
|
846
917
|
}
|
|
847
|
-
await adapter.sendMessage(sessionId,
|
|
918
|
+
await adapter.sendMessage(sessionId, await resolveSdkInputMessage(input));
|
|
848
919
|
res.json({ ok: true, mode: 'sdk' });
|
|
849
920
|
}
|
|
850
921
|
catch (error) {
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { mkdtemp, mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
1
4
|
import { describe, expect, it } from 'vitest';
|
|
2
5
|
import { SDK_PROVIDER_DEFINITIONS } from '../adapter/SdkProviderSpi.js';
|
|
3
|
-
import { buildRuntimeEnv, buildToolResultTimelineActionInfo, createTerminalOutputDecoder, decodeTerminalOutputChunk, evaluatePersistedSessionReuse, formatTerminalPrompt, formatSdkOutputEvent, normalizeTerminalCommandInput, parseTerminalDirectoryChangeTarget, resolveTerminalOutputEncoding, resolveSdkProviderId, resolveStatusChangeUsage, } from './terminal.js';
|
|
6
|
+
import { buildClaudeCodeLaunchConfig, buildRuntimeEnv, buildToolResultTimelineActionInfo, createTerminalOutputDecoder, decodeTerminalOutputChunk, evaluatePersistedSessionReuse, formatTerminalPrompt, formatSdkOutputEvent, normalizeTerminalCommandInput, parseTerminalDirectoryChangeTarget, resolveSdkInputMessage, resolveTerminalOutputEncoding, resolveSdkProviderId, resolveStatusChangeUsage, } from './terminal.js';
|
|
4
7
|
describe('terminal route validation', () => {
|
|
5
8
|
it('requires agentId and workspacePath for start', () => {
|
|
6
9
|
const validateStartRequest = (body) => {
|
|
@@ -82,6 +85,41 @@ describe('terminal configuration', () => {
|
|
|
82
85
|
expect(env.AWS_AGENT_ID).toBe('agent-123');
|
|
83
86
|
expect(env.AWS_WORKSPACE_PATH).toBe('/workspace');
|
|
84
87
|
});
|
|
88
|
+
it('merges saved ClaudeCode AI settings into SDK launch env with request overrides taking precedence', () => {
|
|
89
|
+
const launchConfig = buildClaudeCodeLaunchConfig({
|
|
90
|
+
env: {
|
|
91
|
+
ANTHROPIC_BASE_URL: 'https://saved.example.com',
|
|
92
|
+
ANTHROPIC_AUTH_TOKEN: 'sk-saved',
|
|
93
|
+
ANTHROPIC_MODEL: 'claude-saved',
|
|
94
|
+
EMPTY_SAVED: ' ',
|
|
95
|
+
},
|
|
96
|
+
}, {
|
|
97
|
+
ANTHROPIC_MODEL: ' claude-request ',
|
|
98
|
+
EXTRA_VALUE: 'enabled',
|
|
99
|
+
});
|
|
100
|
+
expect(launchConfig).toEqual({
|
|
101
|
+
envOverrides: {
|
|
102
|
+
ANTHROPIC_BASE_URL: 'https://saved.example.com',
|
|
103
|
+
ANTHROPIC_AUTH_TOKEN: 'sk-saved',
|
|
104
|
+
ANTHROPIC_MODEL: 'claude-request',
|
|
105
|
+
EXTRA_VALUE: 'enabled',
|
|
106
|
+
},
|
|
107
|
+
model: 'claude-request',
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
it('uses CODEX_MODEL from request env overrides as SDK launch model', () => {
|
|
111
|
+
const launchConfig = buildClaudeCodeLaunchConfig(null, {
|
|
112
|
+
OPENAI_API_KEY: 'sk-codex',
|
|
113
|
+
CODEX_MODEL: ' gpt-5.3-codex ',
|
|
114
|
+
});
|
|
115
|
+
expect(launchConfig).toEqual({
|
|
116
|
+
envOverrides: {
|
|
117
|
+
OPENAI_API_KEY: 'sk-codex',
|
|
118
|
+
CODEX_MODEL: 'gpt-5.3-codex',
|
|
119
|
+
},
|
|
120
|
+
model: 'gpt-5.3-codex',
|
|
121
|
+
});
|
|
122
|
+
});
|
|
85
123
|
});
|
|
86
124
|
describe('persisted SDK session reuse', () => {
|
|
87
125
|
it('does not reuse a persisted session without a PID', () => {
|
|
@@ -98,6 +136,18 @@ describe('persisted SDK session reuse', () => {
|
|
|
98
136
|
});
|
|
99
137
|
});
|
|
100
138
|
describe('terminal command helpers', () => {
|
|
139
|
+
it('expands a whole mini-term clipboard paste file path into SDK input content', async () => {
|
|
140
|
+
const tempDir = await mkdtemp(path.join(os.tmpdir(), 'terminal-input-'));
|
|
141
|
+
const clipboardDir = path.join(tempDir, 'mini-term-clipboard');
|
|
142
|
+
await mkdir(clipboardDir, { recursive: true });
|
|
143
|
+
const pasteFile = path.join(clipboardDir, 'paste-1780491671137.txt');
|
|
144
|
+
await writeFile(pasteFile, 'real pasted prompt', 'utf-8');
|
|
145
|
+
await expect(resolveSdkInputMessage(`"${pasteFile}"`)).resolves.toBe('real pasted prompt');
|
|
146
|
+
});
|
|
147
|
+
it('keeps explicit commands that mention mini-term clipboard files unchanged', async () => {
|
|
148
|
+
const command = 'type "C:\\Users\\ZHUANG~1\\AppData\\Local\\Temp\\mini-term-clipboard\\paste-1780491671137.txt"';
|
|
149
|
+
await expect(resolveSdkInputMessage(command)).resolves.toBe(command);
|
|
150
|
+
});
|
|
101
151
|
it('normalizes carriage-return terminal input into executable command text', () => {
|
|
102
152
|
expect(normalizeTerminalCommandInput('npm test\r')).toBe('npm test');
|
|
103
153
|
expect(normalizeTerminalCommandInput(' pwd \n')).toBe('pwd');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-source-apply.d.ts","sourceRoot":"","sources":["../../src/services/ai-source-apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3E,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,CAAC;IACnD,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC9C,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,4BAA4B,EAAE,OAAO,CAAC;IACtC,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE;QACN,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;QACpC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;QAC1B,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;KACjC,CAAC;CACH;
|
|
1
|
+
{"version":3,"file":"ai-source-apply.d.ts","sourceRoot":"","sources":["../../src/services/ai-source-apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3E,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,CAAC;IACnD,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC9C,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,4BAA4B,EAAE,OAAO,CAAC;IACtC,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE;QACN,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;QACpC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;QAC1B,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;KACjC,CAAC;CACH;AAuCD;;GAEG;AACH,wBAAsB,oCAAoC,CACxD,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAkDjC"}
|
|
@@ -15,6 +15,21 @@ function isInstalled(toolStatus, tool) {
|
|
|
15
15
|
function isClaudeCodeInstalled(toolStatus) {
|
|
16
16
|
return isInstalled(toolStatus, 'claude') || isInstalled(toolStatus, 'claudecode');
|
|
17
17
|
}
|
|
18
|
+
function isRecord(value) {
|
|
19
|
+
return Boolean(value && typeof value === 'object' && !Array.isArray(value));
|
|
20
|
+
}
|
|
21
|
+
function hasConfigContent(value) {
|
|
22
|
+
return Object.keys(value).length > 0;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 具体逻辑:将服务端已生成的 per-tool AI 配置规范化为可应用 patch,空对象视为未配置。
|
|
26
|
+
*/
|
|
27
|
+
function normalizeRequestedConfig(value) {
|
|
28
|
+
if (!isRecord(value) || !hasConfigContent(value)) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
18
33
|
/**
|
|
19
34
|
* 主流程:用当前统一 AI 配置覆盖各 Agent CLI 配置,并跳过未安装 CLI。
|
|
20
35
|
*/
|
|
@@ -22,27 +37,33 @@ export async function applyCurrentAiConfigToInstalledTools(options) {
|
|
|
22
37
|
const generatedConfig = options.template
|
|
23
38
|
? buildToolSpecificAiConfig(normalizeTemplate(options.template))
|
|
24
39
|
: null;
|
|
40
|
+
const requestedClaudeConfig = normalizeRequestedConfig(options.requestedSources?.claudecode);
|
|
41
|
+
const requestedCodexConfig = normalizeRequestedConfig(options.requestedSources?.codex);
|
|
42
|
+
const requestedOpenCodeConfig = normalizeRequestedConfig(options.requestedSources?.opencode);
|
|
43
|
+
const claudeConfig = generatedConfig?.claudecode || requestedClaudeConfig;
|
|
44
|
+
const codexConfig = generatedConfig?.codex || requestedCodexConfig;
|
|
45
|
+
const openCodeConfig = generatedConfig?.opencode || requestedOpenCodeConfig;
|
|
25
46
|
const skippedTools = Object.values(options.toolStatus)
|
|
26
47
|
.filter((item) => !item.installed)
|
|
27
48
|
.map((item) => item.tool);
|
|
28
49
|
let mergedClaude = null;
|
|
29
50
|
let mergedCodex = null;
|
|
30
51
|
let mergedOpencode = null;
|
|
31
|
-
if (
|
|
32
|
-
mergedClaude = await options.aiConfigService.applyClaudeCodeConfig(
|
|
52
|
+
if (claudeConfig && isClaudeCodeInstalled(options.toolStatus)) {
|
|
53
|
+
mergedClaude = await options.aiConfigService.applyClaudeCodeConfig(claudeConfig);
|
|
33
54
|
}
|
|
34
|
-
if (
|
|
35
|
-
mergedCodex = await options.aiConfigService.applyCodexConfig(
|
|
55
|
+
if (codexConfig && isInstalled(options.toolStatus, 'codex')) {
|
|
56
|
+
mergedCodex = await options.aiConfigService.applyCodexConfig(codexConfig);
|
|
36
57
|
}
|
|
37
|
-
if (
|
|
38
|
-
mergedOpencode = await options.aiConfigService.applyOpenCodeConfig(
|
|
58
|
+
if (openCodeConfig && isInstalled(options.toolStatus, 'opencode')) {
|
|
59
|
+
mergedOpencode = await options.aiConfigService.applyOpenCodeConfig(openCodeConfig);
|
|
39
60
|
}
|
|
40
61
|
return {
|
|
41
62
|
generatedFromUnifiedTemplate: Boolean(generatedConfig),
|
|
42
63
|
applied: {
|
|
43
|
-
claudecode:
|
|
44
|
-
codex:
|
|
45
|
-
opencode:
|
|
64
|
+
claudecode: claudeConfig && mergedClaude ? Object.keys(claudeConfig) : [],
|
|
65
|
+
codex: codexConfig && mergedCodex ? Object.keys(codexConfig) : [],
|
|
66
|
+
opencode: openCodeConfig && mergedOpencode ? Object.keys(openCodeConfig) : [],
|
|
46
67
|
},
|
|
47
68
|
skippedTools,
|
|
48
69
|
merged: {
|
|
@@ -48,6 +48,7 @@ describe('applyCurrentAiConfigToInstalledTools', () => {
|
|
|
48
48
|
expect(applyOpenCodeConfig).toHaveBeenCalledWith(expect.objectContaining({
|
|
49
49
|
provider: expect.objectContaining({
|
|
50
50
|
default: expect.objectContaining({
|
|
51
|
+
model: 'gpt-current',
|
|
51
52
|
options: expect.objectContaining({
|
|
52
53
|
baseURL: 'https://current.example.com/v1',
|
|
53
54
|
apiKey: 'sk-current',
|
|
@@ -78,4 +79,53 @@ describe('applyCurrentAiConfigToInstalledTools', () => {
|
|
|
78
79
|
});
|
|
79
80
|
expect(applyClaudeCodeConfig).toHaveBeenCalledOnce();
|
|
80
81
|
});
|
|
82
|
+
it('applies explicit per-tool AI sources when no unified template is present', async () => {
|
|
83
|
+
const applyClaudeCodeConfig = vi.fn(async (config) => config);
|
|
84
|
+
const applyCodexConfig = vi.fn(async (config) => config);
|
|
85
|
+
const applyOpenCodeConfig = vi.fn(async (config) => config);
|
|
86
|
+
const { applyCurrentAiConfigToInstalledTools } = await import('./ai-source-apply.js');
|
|
87
|
+
const result = await applyCurrentAiConfigToInstalledTools({
|
|
88
|
+
template: null,
|
|
89
|
+
requestedSources: {
|
|
90
|
+
claudecode: {
|
|
91
|
+
env: {
|
|
92
|
+
ANTHROPIC_BASE_URL: 'https://explicit.example.com',
|
|
93
|
+
ANTHROPIC_AUTH_TOKEN: 'sk-explicit',
|
|
94
|
+
ANTHROPIC_MODEL: 'claude-explicit',
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
codex: { model: 'gpt-explicit' },
|
|
98
|
+
opencode: {
|
|
99
|
+
provider: {
|
|
100
|
+
default: {
|
|
101
|
+
options: { baseURL: 'https://explicit.example.com/v1', apiKey: 'sk-explicit' },
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
toolStatus: {
|
|
107
|
+
claude: status('claude', true),
|
|
108
|
+
codex: status('codex', true),
|
|
109
|
+
opencode: status('opencode', true),
|
|
110
|
+
},
|
|
111
|
+
aiConfigService: {
|
|
112
|
+
applyClaudeCodeConfig,
|
|
113
|
+
applyCodexConfig,
|
|
114
|
+
applyOpenCodeConfig,
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
expect(applyClaudeCodeConfig).toHaveBeenCalledWith({
|
|
118
|
+
env: {
|
|
119
|
+
ANTHROPIC_BASE_URL: 'https://explicit.example.com',
|
|
120
|
+
ANTHROPIC_AUTH_TOKEN: 'sk-explicit',
|
|
121
|
+
ANTHROPIC_MODEL: 'claude-explicit',
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
expect(applyCodexConfig).toHaveBeenCalledWith({ model: 'gpt-explicit' });
|
|
125
|
+
expect(applyOpenCodeConfig).toHaveBeenCalledOnce();
|
|
126
|
+
expect(result.generatedFromUnifiedTemplate).toBe(false);
|
|
127
|
+
expect(result.applied.claudecode).toEqual(['env']);
|
|
128
|
+
expect(result.applied.codex).toEqual(['model']);
|
|
129
|
+
expect(result.applied.opencode).toEqual(['provider']);
|
|
130
|
+
});
|
|
81
131
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-config-service.d.ts","sourceRoot":"","sources":["../../src/services/ai-config-service.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE;QACJ,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE;YACX,KAAK,EAAE,MAAM,EAAE,CAAC;YAChB,MAAM,EAAE,MAAM,EAAE,CAAC;SAClB,CAAC;KACH,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,sBAAsB,CAAC;KAClC,CAAC;CACH;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;CAC5D;AAmBD,MAAM,WAAW,aAAa;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AA8JD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,gBAAgB,GACzB;IAAE,UAAU,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"ai-config-service.d.ts","sourceRoot":"","sources":["../../src/services/ai-config-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -155,7 +155,7 @@ export function buildToolSpecificAiConfig(template) {
|
|
|
155
155
|
let baseUrl = String(template.baseUrl || "").trim();
|
|
156
156
|
const apiKey = String(template.apiKey || "").trim();
|
|
157
157
|
const models = normalizeTemplateModels(template);
|
|
158
|
-
const model =
|
|
158
|
+
const model = String(template.model || "").trim() || models[0];
|
|
159
159
|
if (!baseUrl || !apiKey || !model) {
|
|
160
160
|
return null;
|
|
161
161
|
}
|
|
@@ -199,6 +199,7 @@ export function buildToolSpecificAiConfig(template) {
|
|
|
199
199
|
provider: {
|
|
200
200
|
default: {
|
|
201
201
|
npm: "@ai-sdk/openai-compatible",
|
|
202
|
+
model,
|
|
202
203
|
options: {
|
|
203
204
|
baseURL: openCodeBaseUrl,
|
|
204
205
|
apiKey,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-config-service.d.ts","sourceRoot":"","sources":["../../src/services/ai-config-service.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE;QACJ,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE;YACX,KAAK,EAAE,MAAM,EAAE,CAAC;YAChB,MAAM,EAAE,MAAM,EAAE,CAAC;SAClB,CAAC;KACH,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,sBAAsB,CAAC;KAClC,CAAC;CACH;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;CAC5D;AAmBD,MAAM,WAAW,aAAa;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AA8JD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,gBAAgB,GACzB;IAAE,UAAU,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"ai-config-service.d.ts","sourceRoot":"","sources":["../../src/services/ai-config-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -155,7 +155,7 @@ export function buildToolSpecificAiConfig(template) {
|
|
|
155
155
|
let baseUrl = String(template.baseUrl || "").trim();
|
|
156
156
|
const apiKey = String(template.apiKey || "").trim();
|
|
157
157
|
const models = normalizeTemplateModels(template);
|
|
158
|
-
const model =
|
|
158
|
+
const model = String(template.model || "").trim() || models[0];
|
|
159
159
|
if (!baseUrl || !apiKey || !model) {
|
|
160
160
|
return null;
|
|
161
161
|
}
|
|
@@ -199,6 +199,7 @@ export function buildToolSpecificAiConfig(template) {
|
|
|
199
199
|
provider: {
|
|
200
200
|
default: {
|
|
201
201
|
npm: "@ai-sdk/openai-compatible",
|
|
202
|
+
model,
|
|
202
203
|
options: {
|
|
203
204
|
baseURL: openCodeBaseUrl,
|
|
204
205
|
apiKey,
|