Skip to content

Commit caafdbc

Browse files
committed
Add inline artifact timeline cards
Change-Id: If4f4bb742c3694f7b00e4c603942fc949b6944de
1 parent bb45067 commit caafdbc

23 files changed

Lines changed: 1137 additions & 393 deletions

apps/server/src/lib/agents-config.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ export function validateProviderConfig(input: Record<string, unknown>): Provider
7070
* 1. `~/.agents/config.json` (or `AGENTS_CONFIG_PATH`)
7171
* 2. `process.env` (which already includes `.env` loaded by the server bootstrap)
7272
*
73-
* The disk file may contain only a provider selection; missing fields are
74-
* backfilled from the running process environment so users don't have to
75-
* manually copy values from `.env` into the settings dialog.
73+
* The disk file may contain only a provider selection; missing fields for every
74+
* provider are backfilled from the running process environment so users can
75+
* switch providers in the settings dialog without manually copying `.env`.
7676
*/
7777
export async function readProviderConfig(): Promise<Partial<ProviderConfig>> {
7878
const path = providerConfigPath();
@@ -92,10 +92,13 @@ export async function readProviderConfig(): Promise<Partial<ProviderConfig>> {
9292

9393
const provider: ProviderConfigProvider = diskConfig.AGENTS_PROVIDER ?? resolveActiveProvider();
9494
const merged: Partial<ProviderConfig> = { AGENTS_PROVIDER: provider };
95-
for (const field of AGENTS_PROVIDER_FIELDS[provider]) {
96-
const diskValue = diskConfig[field.key]?.trim();
97-
const envValue = process.env[field.key]?.trim();
98-
merged[field.key] = diskValue || envValue;
95+
for (const candidateProvider of AGENTS_CONFIG_PROVIDERS) {
96+
for (const field of AGENTS_PROVIDER_FIELDS[candidateProvider]) {
97+
const diskValue = diskConfig[field.key]?.trim();
98+
const envValue = process.env[field.key]?.trim();
99+
const value = diskValue || envValue;
100+
if (value) merged[field.key] = value;
101+
}
99102
}
100103
return merged;
101104
}

apps/server/tests/agents-config.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,23 @@ describe("agents-config", () => {
5454
const prevProvider = process.env.AGENTS_PROVIDER;
5555
const prevKey = process.env.DASHSCOPE_API_KEY;
5656
const prevWs = process.env.BAILIAN_WORKSPACE_ID;
57+
const prevQoderPat = process.env.QODER_PAT;
58+
const prevArkKey = process.env.ARK_API_KEY;
59+
const prevAnthropicKey = process.env.ANTHROPIC_API_KEY;
5760
process.env.AGENTS_CONFIG_PATH = path;
5861
delete process.env.AGENTS_PROVIDER;
5962
process.env.DASHSCOPE_API_KEY = "from-env-key";
6063
process.env.BAILIAN_WORKSPACE_ID = "from-env-ws";
64+
process.env.QODER_PAT = "from-env-qoder";
65+
delete process.env.ARK_API_KEY;
66+
delete process.env.ANTHROPIC_API_KEY;
6167
try {
6268
const config = await readProviderConfig();
6369
expect(config).toEqual({
6470
AGENTS_PROVIDER: "bailian",
6571
DASHSCOPE_API_KEY: "from-env-key",
6672
BAILIAN_WORKSPACE_ID: "from-env-ws",
73+
QODER_PAT: "from-env-qoder",
6774
});
6875
} finally {
6976
if (prevConfigPath === undefined) delete process.env.AGENTS_CONFIG_PATH;
@@ -74,6 +81,12 @@ describe("agents-config", () => {
7481
else process.env.DASHSCOPE_API_KEY = prevKey;
7582
if (prevWs === undefined) delete process.env.BAILIAN_WORKSPACE_ID;
7683
else process.env.BAILIAN_WORKSPACE_ID = prevWs;
84+
if (prevQoderPat === undefined) delete process.env.QODER_PAT;
85+
else process.env.QODER_PAT = prevQoderPat;
86+
if (prevArkKey === undefined) delete process.env.ARK_API_KEY;
87+
else process.env.ARK_API_KEY = prevArkKey;
88+
if (prevAnthropicKey === undefined) delete process.env.ANTHROPIC_API_KEY;
89+
else process.env.ANTHROPIC_API_KEY = prevAnthropicKey;
7790
await rm(dir, { recursive: true, force: true });
7891
}
7992
});
@@ -84,9 +97,15 @@ describe("agents-config", () => {
8497
const prevConfigPath = process.env.AGENTS_CONFIG_PATH;
8598
const prevKey = process.env.DASHSCOPE_API_KEY;
8699
const prevWs = process.env.BAILIAN_WORKSPACE_ID;
100+
const prevQoderPat = process.env.QODER_PAT;
101+
const prevArkKey = process.env.ARK_API_KEY;
102+
const prevAnthropicKey = process.env.ANTHROPIC_API_KEY;
87103
process.env.AGENTS_CONFIG_PATH = path;
88104
process.env.DASHSCOPE_API_KEY = "env-key";
89105
process.env.BAILIAN_WORKSPACE_ID = "env-ws";
106+
delete process.env.QODER_PAT;
107+
delete process.env.ARK_API_KEY;
108+
delete process.env.ANTHROPIC_API_KEY;
90109
try {
91110
await writeFile(
92111
path,
@@ -113,6 +132,12 @@ describe("agents-config", () => {
113132
else process.env.DASHSCOPE_API_KEY = prevKey;
114133
if (prevWs === undefined) delete process.env.BAILIAN_WORKSPACE_ID;
115134
else process.env.BAILIAN_WORKSPACE_ID = prevWs;
135+
if (prevQoderPat === undefined) delete process.env.QODER_PAT;
136+
else process.env.QODER_PAT = prevQoderPat;
137+
if (prevArkKey === undefined) delete process.env.ARK_API_KEY;
138+
else process.env.ARK_API_KEY = prevArkKey;
139+
if (prevAnthropicKey === undefined) delete process.env.ANTHROPIC_API_KEY;
140+
else process.env.ANTHROPIC_API_KEY = prevAnthropicKey;
116141
await rm(dir, { recursive: true, force: true });
117142
}
118143
});

apps/webui/src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ export default function Home() {
157157
if (bottomBarVisibleRef.current) {
158158
bottomBarRef.current?.expand();
159159
} else {
160-
setTimeout(() => composerHandleRef.current?.focus(), 80);
160+
setTimeout(() => composerHandleRef.current?.focusStart(), 80);
161161
}
162162
},
163163
[roleCards],

0 commit comments

Comments
 (0)