feat(agent): support Responses steering and project-aware tools

Use the dedicated TJWATER_AGENT_URL and Responses stream protocol. Keep running
turns active while users steer or queue follow-ups and edit pending delivery.
Refresh the model catalog before generation and preserve approval mode selection.

Integrate scoped investigation messaging/presentation, geographic place selection,
current Agent composer styles and supporting workbench contracts.

Validation: 77 focused Vitest checks, 21 browser cases, lint, typecheck and
production build. Preserve direct Server/Agent routing and project authentication.
This commit is contained in:
2026-10-19 18:46:58 +08:00
parent 2c5bf15cce
commit ec23d44b02
131 changed files with 6663 additions and 1204 deletions
+4 -2
View File
@@ -23,8 +23,9 @@ test("Dev Panel opens as a floating desktop panel and closes with Escape", async
expect(panelBox!.y + panelBox!.height).toBeLessThanOrEqual(884);
await expect(page.getByRole("navigation", { name: "地图工具" })).toBeHidden();
await expect(panel.getByRole("button", { name: "定位并高亮" })).toBeVisible();
await expect(panel.getByRole("button", { name: "重置全部" })).toBeVisible();
await expect(panel.getByRole("button", { name: "重置地图调试效果" })).toBeVisible();
await panel.locator("summary").filter({ hasText: "水流调试" }).click();
await panel.getByLabel("管道 ID").fill("P-9");
await panel.getByLabel("有符号流速").fill("-2.75");
await panel.getByRole("button", { name: "更新该管道方向" }).click();
@@ -61,9 +62,10 @@ test("labels remain active per business group and clear globally", async ({ page
await page.getByRole("button", { name: "切换地图 Dev Panel" }).click();
const panel = page.getByTestId("map-dev-panel");
await panel.locator("summary").filter({ hasText: "数值标注" }).click();
const apply = panel.getByRole("button", { name: "应用标注", exact: true });
await apply.click();
await panel.getByRole("combobox", { name: "业务图层组" }).click();
await panel.getByRole("combobox", { name: "标注图层组" }).click();
await page.getByRole("option", { name: "节点", exact: true }).click();
await apply.click();