feat: establish v0.70 platform milestone
ci / verify (push) Canceled after 0s

This commit is contained in:
Codex Local
2026-08-29 21:56:51 +08:00
parent d97bbf7cf5
commit e652516147
133 changed files with 12907 additions and 801 deletions
+34 -11
View File
@@ -18,6 +18,8 @@ const conversationID = randomUUID();
const conversationPublicID = randomUUID();
const turnID = randomUUID();
const turnPublicID = randomUUID();
const summaryID = randomUUID();
const topicID = randomUUID();
await mkdir(outputDirectory, { recursive: true });
function psql(statement) {
@@ -28,6 +30,7 @@ function psql(statement) {
function cleanup() {
psql(`BEGIN;
DELETE FROM conversation_summary WHERE id IN ('${summaryID}'::uuid,'${topicID}'::uuid);
DELETE FROM conversation_turn WHERE id='${turnID}'::uuid;
DELETE FROM conversation_state_history WHERE conversation_id='${conversationID}'::uuid;
DELETE FROM conversation WHERE id='${conversationID}'::uuid;
@@ -44,6 +47,10 @@ psql(`BEGIN;
VALUES('${conversationID}'::uuid,NULL,'ROOM_ISSUED','visual fixture','platform',now()-interval '2 minutes'),('${conversationID}'::uuid,'ROOM_ISSUED','ACTIVE','visual fixture','provider',now()-interval '110 seconds'),('${conversationID}'::uuid,'ACTIVE','COMPLETED','visual fixture','device',now()-interval '1 minute');
INSERT INTO conversation_turn(id,public_id,tenant_id,subject_id,conversation_id,turn_key,sequence_no,speaker,start_at,end_at,final_text,interrupted,source_type)
VALUES('${turnID}'::uuid,'${turnPublicID}'::uuid,'10000000-0000-0000-0000-000000000001'::uuid,'10000000-0000-0000-0000-000000000401'::uuid,'${conversationID}'::uuid,'visual-turn-${turnPublicID}',1,'subject',now()-interval '100 seconds',now()-interval '98 seconds','今天想聊聊以前的工作。',false,'device');
INSERT INTO conversation_summary(id,tenant_id,subject_id,conversation_id,summary_type,content,source_turn_ids,model_ref,prompt_version,generation_version,confidence,status)
VALUES
('${summaryID}'::uuid,'10000000-0000-0000-0000-000000000001'::uuid,'10000000-0000-0000-0000-000000000401'::uuid,'${conversationID}'::uuid,'conversation_summary','长者回顾了以前的工作经历。\n关键词:以前的工作、职业经历','["${turnPublicID}"]'::jsonb,'ark:visual-summary-model','story-ark-json-v1',1,0.91,'READY'),
('${topicID}'::uuid,'10000000-0000-0000-0000-000000000001'::uuid,'10000000-0000-0000-0000-000000000401'::uuid,'${conversationID}'::uuid,'open_topic','下次可以继续聊聊工作中印象深刻的人。','["${turnPublicID}"]'::jsonb,'ark:visual-summary-model','story-ark-json-v1',1,0.91,'READY');
COMMIT;`);
const browser = await chromium.launch({ headless: true, executablePath: process.env.CHROME_PATH ?? "C:/Program Files/Google/Chrome/Application/chrome.exe" });
@@ -66,14 +73,22 @@ page.on("requestfailed", (request) => {
try {
await page.goto(webURL, { waitUntil: "networkidle" });
await page.getByRole("button", { name: "登录研发环境" }).click();
await page.waitForURL(oidcURLPattern);
await page.locator("#username").fill(username);
await page.locator("#password").fill(password);
await page.locator("#kc-login").click();
await page.waitForURL(webHostPattern, { timeout: 15000 });
await page.getByRole("heading", { name: "家庭业务工作台" }).waitFor();
await page.getByRole("button", { name: "通话记录", exact: true }).click();
const workspace = page.getByRole("region", { name: "家庭业务工作台" });
const loginButton = page.getByRole("button", { name: /登录并进入家庭|登录研发环境/ });
await Promise.race([
workspace.waitFor(),
loginButton.waitFor(),
]);
if (await loginButton.isVisible().catch(() => false)) {
await loginButton.click();
await page.waitForURL(oidcURLPattern);
await page.locator("#username").fill(username);
await page.locator("#password").fill(password);
await page.locator("#kc-login").click();
await page.waitForURL(webHostPattern, { timeout: 15000 });
}
await workspace.waitFor();
await page.getByText("通话记录", { exact: true }).first().click();
const firstRow = page.locator(".conversation-row").first();
await firstRow.waitFor();
@@ -107,16 +122,24 @@ try {
&& /不保存字幕和录音|仅保存字幕|保存字幕和双轨录音/.test(detailText)
&& !/s2s_pure|s2s_hybrid|cascade|transcript_only|transcript_and_audio/.test(detailText);
const selectedRowVisible = await firstRow.evaluate((element) => element.classList.contains("active"));
const summaryVisible = detailText.includes("通话摘要")
&& detailText.includes("长者回顾了以前的工作经历。")
&& detailText.includes("关键词:以前的工作、职业经历")
&& detailText.includes("开放话题")
&& detailText.includes("下次可以继续聊聊工作中印象深刻的人。");
await page.screenshot({ path: fileURLToPath(new URL("conversation-detail-recovery.png", outputDirectory)), fullPage: true });
const overflow = await page.evaluate(() => [...document.querySelectorAll("body *")]
.filter((element) => element instanceof HTMLElement && element.scrollWidth > element.clientWidth + 2 && getComputedStyle(element).overflowX === "visible")
.filter((element) => element instanceof HTMLElement
&& !element.classList.contains("ant-badge")
&& element.scrollWidth > element.clientWidth + 2
&& getComputedStyle(element).overflowX === "visible")
.slice(0, 20)
.map((element) => `${element.tagName}.${element.className}: ${element.clientWidth}/${element.scrollWidth}`));
const unexpectedConsoleErrors = consoleErrors.filter((message) => !message.includes("net::ERR_FAILED"));
const result = { rowUsesBusinessLabels, retryVisible, staleDetailHidden, detailUsesBusinessLabels, selectedRowVisible, expectedDetailFailures, overflow, consoleErrors, unexpectedConsoleErrors, failedRequests };
const result = { rowUsesBusinessLabels, retryVisible, staleDetailHidden, detailUsesBusinessLabels, selectedRowVisible, summaryVisible, expectedDetailFailures, overflow, consoleErrors, unexpectedConsoleErrors, failedRequests };
console.log(JSON.stringify(result, null, 2));
if (!rowUsesBusinessLabels || !retryVisible || !staleDetailHidden || !detailUsesBusinessLabels || !selectedRowVisible || expectedDetailFailures.length !== 1 || overflow.length || unexpectedConsoleErrors.length || failedRequests.length) {
if (!rowUsesBusinessLabels || !retryVisible || !staleDetailHidden || !detailUsesBusinessLabels || !selectedRowVisible || !summaryVisible || expectedDetailFailures.length !== 1 || overflow.length || unexpectedConsoleErrors.length || failedRequests.length) {
throw new Error("Conversation detail visual smoke failed");
}
} finally {
+7 -4
View File
@@ -7,17 +7,20 @@ VALUES
ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, status = EXCLUDED.status,
policy_version = EXCLUDED.policy_version, updated_at = now();
INSERT INTO user_account (id, public_id, tenant_id, oidc_issuer, oidc_subject, display_name, status, platform_role)
INSERT INTO user_account (id, public_id, tenant_id, oidc_issuer, oidc_subject, display_name, status, platform_role, account_kind)
VALUES
('10000000-0000-0000-0000-000000000101', '10000000-0000-0000-0000-000000000111', '10000000-0000-0000-0000-000000000001', 'http://localhost:58180/realms/voice-local', '00000000-0000-0000-0000-000000000101', '本地所有者', 'active', 'ops_admin'),
('10000000-0000-0000-0000-000000000102', '10000000-0000-0000-0000-000000000112', '10000000-0000-0000-0000-000000000001', 'http://localhost:58180/realms/voice-local', '00000000-0000-0000-0000-000000000102', '本地编辑者', 'active', 'ops_approver'),
('20000000-0000-0000-0000-000000000103', '20000000-0000-0000-0000-000000000113', '20000000-0000-0000-0000-000000000001', 'http://localhost:58180/realms/voice-local', '00000000-0000-0000-0000-000000000103', '隔离租户查看者', 'active', 'customer')
('10000000-0000-0000-0000-000000000101', '10000000-0000-0000-0000-000000000111', '10000000-0000-0000-0000-000000000001', 'http://localhost:58180/realms/voice-local', '00000000-0000-0000-0000-000000000101', '本地所有者', 'active', 'customer', 'customer'),
('10000000-0000-0000-0000-000000000102', '10000000-0000-0000-0000-000000000112', '10000000-0000-0000-0000-000000000001', 'http://localhost:58180/realms/voice-local', '00000000-0000-0000-0000-000000000102', '本地编辑者', 'active', 'customer', 'customer'),
('20000000-0000-0000-0000-000000000103', '20000000-0000-0000-0000-000000000113', '20000000-0000-0000-0000-000000000001', 'http://localhost:58180/realms/voice-local', '00000000-0000-0000-0000-000000000103', '隔离租户查看者', 'active', 'customer', 'customer'),
('10000000-0000-0000-0000-000000000104', '10000000-0000-0000-0000-000000000114', '10000000-0000-0000-0000-000000000001', 'http://localhost:58180/realms/voice-local', '00000000-0000-0000-0000-000000000104', '平台运维管理员', 'active', 'ops_admin', 'operator'),
('10000000-0000-0000-0000-000000000105', '10000000-0000-0000-0000-000000000115', '10000000-0000-0000-0000-000000000001', 'http://localhost:58180/realms/voice-local', '00000000-0000-0000-0000-000000000105', '平台运维审批员', 'active', 'ops_approver', 'operator')
ON CONFLICT (id) DO UPDATE SET
oidc_issuer = EXCLUDED.oidc_issuer,
oidc_subject = EXCLUDED.oidc_subject,
display_name = EXCLUDED.display_name,
status = EXCLUDED.status,
platform_role = EXCLUDED.platform_role,
account_kind = EXCLUDED.account_kind,
updated_at = now();
INSERT INTO household (id, public_id, tenant_id, name, owner_user_id, status)