Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 29 additions & 5 deletions frontend/src/adk/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5035,14 +5035,38 @@ export interface GeneratedAgentTestRun {
planHash?: string;
}

const GENERATED_AGENT_PROJECT_TIMEOUT_MS = 60_000;

function isGeneratedAgentProjectDeadlineError(error: unknown): boolean {
if (!error || typeof error !== "object") return false;
const name = "name" in error ? (error as { name?: unknown }).name : undefined;
if (name === "TimeoutError") return true;
if (name !== "AbortError") return false;
const message = "message" in error ? (error as { message?: unknown }).message : "";
return typeof message !== "string" || message === "" || /abort/i.test(message);
}

export async function generateAgentProject(
draft: AgentDraft,
): Promise<AgentProject> {
const res = await apiFetch("/web/generated-agent-projects", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ draft }),
});
let res: Response;
try {
res = await apiFetch(
"/web/generated-agent-projects",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ draft }),
},
{},
GENERATED_AGENT_PROJECT_TIMEOUT_MS,
);
} catch (error) {
if (isGeneratedAgentProjectDeadlineError(error)) {
throw new Error(adkT("client.generateProjectTimedOut"));
}
throw error;
}
if (!res.ok) {
throw new Error(await httpErrorMessage(res, adkT("client.generateProjectFailed")));
}
Expand Down
1 change: 1 addition & 0 deletions frontend/src/i18n/resources/en-US/adk.json
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,7 @@
"checkRuntimeUpdateFailed": "Failed to check Runtime update capability (HTTP {{status}}). Try again later.",
"loadRuntimeDetailFailed": "Failed to load Runtime details",
"generateProjectFailed": "Failed to generate the project",
"generateProjectTimedOut": "Generating the publish preview project timed out. Please try again.",
"generateAgentConfigFailed": "Failed to generate the Agent configuration",
"createDebugRunFailed": "Failed to create the debug run",
"createDebugSessionFailed": "Failed to create the debug session",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/i18n/resources/zh-CN/adk.json
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,7 @@
"checkRuntimeUpdateFailed": "检查 Runtime 更新能力失败(HTTP {{status}}),请稍后重试。",
"loadRuntimeDetailFailed": "加载 Runtime 详情失败",
"generateProjectFailed": "生成项目失败",
"generateProjectTimedOut": "生成发布预览项目超时,请稍后重试。",
"generateAgentConfigFailed": "生成 Agent 配置失败",
"createDebugRunFailed": "创建调试运行失败",
"createDebugSessionFailed": "创建调试会话失败",
Expand Down
20 changes: 20 additions & 0 deletions frontend/tests/timeout.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,23 @@ test("generated-agent creation deadline exceeds both backend readiness windows",
/apiFetch\([\s\S]*?\},\s*\{\},\s*GENERATED_AGENT_TEST_RUN_TIMEOUT_MS,\s*\)/,
);
});

test("generated-agent project creation uses its own publish preview deadline", () => {
const declaration = clientSource.match(
/const GENERATED_AGENT_PROJECT_TIMEOUT_MS = ([\d_]+);/,
);
assert.ok(declaration, "generated project creation needs a dedicated deadline");
const timeoutMs = Number(declaration[1].replaceAll("_", ""));
assert.equal(timeoutMs, 60_000);

const generateProject = functionSource(
"export async function generateAgentProject",
"export interface GeneratedAgentDraftResult",
);
assert.match(
generateProject,
/apiFetch\([\s\S]*?"\/web\/generated-agent-projects"[\s\S]*?\},\s*\{\},\s*GENERATED_AGENT_PROJECT_TIMEOUT_MS,\s*\)/,
);
assert.match(generateProject, /isGeneratedAgentProjectDeadlineError\(error\)/);
assert.match(generateProject, /adkT\("client\.generateProjectTimedOut"\)/);
});

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1 +1 @@
import{U as a,C as n}from"../visualizations/mermaid/mermaid.core-CY863Aa9.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
import{U as a,C as n}from"../visualizations/mermaid/mermaid.core-IM_oNPTV.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};

Large diffs are not rendered by default.

Loading
Loading