fix: align runtime startup and model events

This commit is contained in:
Wenxin Duan
2026-09-08 10:47:42 +08:00
parent 89ce7973c3
commit da7558ab49
8 changed files with 79 additions and 18 deletions
+3 -3
View File
@@ -1,6 +1,6 @@
import { mkdir } from "node:fs/promises";
import { join, resolve } from "node:path";
import { pathToFileURL } from "node:url";
import { dirname, join, resolve } from "node:path";
import { fileURLToPath, pathToFileURL } from "node:url";
import {
FileAttachmentStore,
HarnessSession,
@@ -22,7 +22,7 @@ import { loadServerConfig } from "./config.js";
export async function buildDefaultApp(environment: NodeJS.ProcessEnv = process.env) {
const config = loadServerConfig(environment);
const projectRoot = process.cwd();
const projectRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../../..");
const sessionsRoot = resolve(projectRoot, config.sessionsRoot);
const agentDir = resolve(projectRoot, config.agentDir);
await mkdir(sessionsRoot, { recursive: true, mode: 0o700 });
+38 -7
View File
@@ -21,9 +21,32 @@ export function registerModelRoutes(app: FastifyInstance, dependencies: AppDepen
if (session.isBusy === true) {
throw new HarnessError("SESSION_BUSY", "Model configuration cannot change during a run");
}
const input = ModelConnectionInputSchema.parse(request.body);
await dependencies.modelStore.configure(sessionId, input);
return { modelConfig: dependencies.modelStore.getRedacted(sessionId), requestId: request.id };
try {
const input = ModelConnectionInputSchema.parse(request.body);
await dependencies.modelStore.configure(sessionId, input);
const modelConfig = dependencies.modelStore.getRedacted(sessionId);
if (modelConfig !== undefined) {
dependencies.eventStore?.append(sessionId, {
type: "model.configured",
payload: {
providerId: modelConfig.providerId,
modelId: modelConfig.modelId,
supportsImages: modelConfig.supportsImages,
source: modelConfig.source,
},
});
}
return { modelConfig, requestId: request.id };
} catch (error) {
dependencies.eventStore?.append(sessionId, {
type: "model.validation_failed",
payload: {
code: error instanceof HarnessError ? error.code : "MODEL_VALIDATION_FAILED",
message: "Model configuration validation failed",
},
});
throw error;
}
});
app.delete("/api/sessions/:sessionId/model-config/credentials", (request) => {
@@ -37,9 +60,17 @@ export function registerModelRoutes(app: FastifyInstance, dependencies: AppDepen
const { sessionId } = Params.parse(request.params);
requireSession(dependencies, sessionId);
const resolved = dependencies.modelStore.resolveConnection(sessionId);
const result = dependencies.testModelConnection === undefined
? { status: "deferred" as const, message: "Saved; validation will occur on first run." }
: await dependencies.testModelConnection(resolved, AbortSignal.timeout(5_000));
return { ...result, requestId: request.id };
try {
const result = dependencies.testModelConnection === undefined
? { status: "deferred" as const, message: "Saved; validation will occur on first run." }
: await dependencies.testModelConnection(resolved, AbortSignal.timeout(5_000));
return { ...result, requestId: request.id };
} catch {
dependencies.eventStore?.append(sessionId, {
type: "model.validation_failed",
payload: { code: "MODEL_CONNECTION_FAILED", message: "Model connection validation failed" },
});
throw new HarnessError("MODEL_CONNECTION_FAILED", "Model connection validation failed");
}
});
}