feat(agent): add controlled task execution

This commit is contained in:
2026-09-24 04:19:02 +08:00
parent d018bcae67
commit b31033e9ce
48 changed files with 14498 additions and 86 deletions
+20 -2
View File
@@ -45,16 +45,18 @@ const envSchema = z
// HTTP 服务监听端口。
PORT: z.coerce.number().int().positive().default(8787),
// HTTP 服务监听地址。
HOST: z.string().default("0.0.0.0"),
HOST: z.string().default("127.0.0.1"),
// Product Server base URL used to verify browser identity and project scope.
TJWATER_SERVER_BASE_URL: z.string().url().default("http://127.0.0.1:8000"),
// 工况任务调用 Server 的最长等待时间,必须短于两次租约心跳之间的间隔。
TJWATER_SERVER_TIMEOUT_MS: z.coerce.number().int().positive().max(30_000).default(10_000),
// Pino 日志级别。
LOG_LEVEL: z.string().default("info"),
// LLM 工具/技能调用审计日志路径。
LLM_REQUEST_AUDIT_LOG_PATH: z
.string()
.default("./logs/llm-request-audit.log"),
// 内部工具桥调用本服务时使用的鉴权 token;未显式配置时启动阶段会自动生成。
// 内部工具桥鉴权 token;embedded 可自动生成,client 模式必须与外部 OpenCode 显式共享。
AGENT_INTERNAL_TOKEN: optionalString(),
// opencode 运行模式:embedded 会启动本地 CLI 子进程;client 只连接现有 server。
OPENCODE_MODE: z.enum(["embedded", "client"]).default("embedded"),
@@ -66,6 +68,8 @@ const envSchema = z
OPENCODE_TIMEOUT_MS: z.coerce.number().int().positive().default(5000),
// 默认使用的 opencode 模型标识。
OPENCODE_MODEL: z.string().default("deepseek/deepseek-v4-flash"),
// 后台工况任务首选模型;缺省沿用 OPENCODE_MODEL,运行时会从实际可用模型中选择回退。
OPERATIONAL_TASK_MODEL: optionalString(),
// 聊天 UI 和 /stream 允许选择的 opencode 模型完整配置,JSON 数组。
OPENCODE_MODEL_OPTIONS: z.string().default(defaultAgentModelOptionsJson),
// 平滑 token 输出,避免上游模型大块/抖动 token 直接传到前端。
@@ -143,6 +147,13 @@ const envSchema = z
message: "OPENCODE_CLIENT_BASE_URL is required when OPENCODE_MODE=client",
});
}
if (env.OPENCODE_MODE === "client" && !env.AGENT_INTERNAL_TOKEN) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
path: ["AGENT_INTERNAL_TOKEN"],
message: "AGENT_INTERNAL_TOKEN is required in client mode and must also be configured on the external OpenCode process",
});
}
let modelOptions;
try {
modelOptions = parseAgentModelOptions(env.OPENCODE_MODEL_OPTIONS);
@@ -169,6 +180,13 @@ const envSchema = z
message: "OPENCODE_MODEL must be included in OPENCODE_MODEL_OPTIONS",
});
}
if (env.OPERATIONAL_TASK_MODEL && !supportedModels.includes(env.OPERATIONAL_TASK_MODEL)) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
path: ["OPERATIONAL_TASK_MODEL"],
message: "OPERATIONAL_TASK_MODEL must be included in OPENCODE_MODEL_OPTIONS",
});
}
});
export type AppConfig = z.infer<typeof envSchema>;