Files
tutti/tools/scripts/agent-provider-status-performance-scenario.mjs
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

257 lines
7.8 KiB
JavaScript

import {
evaluate,
finishRendererScenario,
markRenderer,
startRendererScenario,
waitForProviderTiles
} from "./agent-gui-performance-helpers.mjs";
import { setTimeout as delay } from "node:timers/promises";
const markers = {
start: "tutti-perf:provider-status-focus-refresh:start",
firstFocusDispatched:
"tutti-perf:provider-status-focus-refresh:first-focus-dispatched",
secondFocusDispatched:
"tutti-perf:provider-status-focus-refresh:second-focus-dispatched",
observationCompleted:
"tutti-perf:provider-status-focus-refresh:observation-completed",
end: "tutti-perf:provider-status-focus-refresh:end"
};
export const providerStatusFocusRefreshScenario = {
id: "provider-status-focus-refresh",
markers,
milestones: [
{
key: "firstFocusDispatched",
label: "first focus dispatched",
marker: markers.firstFocusDispatched
},
{
key: "secondFocusDispatched",
label: "second focus dispatched",
marker: markers.secondFocusDispatched
},
{
key: "observationCompleted",
label: "focus observation completed",
marker: markers.observationCompleted
}
],
prepare: prepareProviderStatusFocusRefresh,
execute: executeProviderStatusFocusRefresh,
describe(prepared) {
return `${prepared.providerCount} visible providers; focus twice without requesting provider status`;
},
summarize(prepared, result) {
return summarizeProviderStatusFocusRefresh(prepared, result);
}
};
async function prepareProviderStatusFocusRefresh(context, options) {
const { pageClient } = context;
await pageClient.send("Page.enable");
await pageClient.send("Network.enable");
const networkRecorder = createProviderStatusNetworkRecorder(pageClient);
const ownership = await evaluate(
pageClient,
`new URLSearchParams(location.search).get('reportPredefinePageview')`
);
if (ownership !== "1") {
const loaded = pageClient.waitForEvent("Page.loadEventFired");
await evaluate(
pageClient,
`(() => {
const url = new URL(location.href);
url.searchParams.set('reportPredefinePageview', '1');
history.replaceState(null, '', url);
return true;
})()`
);
await pageClient.send("Page.reload");
await loaded;
}
const providers = await waitForProviderTiles(pageClient, options.timeoutMs);
await waitForRecordedRequests(
networkRecorder,
(requests) =>
requests.length > 0 &&
requests.every((request) => request.endedAt !== null),
options.timeoutMs,
"completed startup provider-status request"
);
await waitForNetworkQuiescence(networkRecorder, 2_500, options.timeoutMs);
const startupRequestCount = networkRecorder.requests.length;
networkRecorder.reset();
return {
networkRecorder,
providerCount: providers.tiles.length,
startupRequestCount
};
}
async function executeProviderStatusFocusRefresh(context, prepared) {
const { pageClient } = context;
const recorder = prepared.networkRecorder;
try {
await startRendererScenario(pageClient, markers.start);
await evaluate(
pageClient,
`(() => {
window.dispatchEvent(new Event('focus'));
console.timeStamp(${JSON.stringify(markers.firstFocusDispatched)});
return true;
})()`
);
await delay(100);
await evaluate(
pageClient,
`(() => {
window.dispatchEvent(new Event('focus'));
console.timeStamp(${JSON.stringify(markers.secondFocusDispatched)});
return true;
})()`
);
await delay(1_000);
await markRenderer(pageClient, markers.observationCompleted);
await finishRendererScenario(pageClient, markers.end);
return { requests: recorder.requests.map((request) => ({ ...request })) };
} finally {
recorder.dispose();
await pageClient.send("Network.disable").catch(() => {});
}
}
function createProviderStatusNetworkRecorder(pageClient) {
const requests = [];
const requestsByID = new Map();
let lastActivityAt = Date.now();
const markActivity = () => {
lastActivityAt = Date.now();
};
const disposables = [
pageClient.subscribe("Network.requestWillBeSent", (event) => {
const url = new URL(event.params.request.url);
if (
url.pathname !== "/v1/agent-providers/status" ||
event.params.request.method !== "GET"
) {
return;
}
markActivity();
const record = {
endedAt: null,
error: null,
ok: null,
refresh: url.searchParams.get("refresh"),
requestID: event.params.requestId,
startedAt: event.params.timestamp * 1000,
status: null,
url: url.toString()
};
requests.push(record);
requestsByID.set(record.requestID, record);
}),
pageClient.subscribe("Network.responseReceived", (event) => {
const record = requestsByID.get(event.params.requestId);
if (!record) return;
markActivity();
record.status = event.params.response.status;
record.ok = record.status >= 200 && record.status < 300;
}),
pageClient.subscribe("Network.loadingFinished", (event) => {
const record = requestsByID.get(event.params.requestId);
if (record) {
markActivity();
record.endedAt = event.params.timestamp * 1000;
}
}),
pageClient.subscribe("Network.loadingFailed", (event) => {
const record = requestsByID.get(event.params.requestId);
if (!record) return;
markActivity();
record.endedAt = event.params.timestamp * 1000;
record.error = event.params.errorText;
record.ok = false;
})
];
return {
requests,
getLastActivityAt: () => lastActivityAt,
dispose() {
for (const dispose of disposables) dispose();
},
reset() {
requests.length = 0;
requestsByID.clear();
markActivity();
}
};
}
async function waitForRecordedRequests(recorder, predicate, timeoutMs, label) {
const deadline = Date.now() + timeoutMs;
while (Date.now() < deadline) {
if (predicate(recorder.requests)) return;
await delay(50);
}
throw new Error(
`timed out waiting for ${label}: ${JSON.stringify(recorder.requests)}`
);
}
async function waitForNetworkQuiescence(recorder, quietPeriodMs, timeoutMs) {
await waitForRecordedRequests(
recorder,
(requests) =>
requests.length > 0 &&
requests.every((request) => request.endedAt !== null) &&
Date.now() - recorder.getLastActivityAt() >= quietPeriodMs,
timeoutMs,
`${quietPeriodMs} ms of provider-status startup quiescence`
);
}
export function summarizeProviderStatusFocusRefresh(prepared, result) {
const requests = result.requests ?? [];
const durations = requests.map((request) =>
request.endedAt === null
? "incomplete"
: `${Math.round(request.endedAt - request.startedAt)} ms`
);
const assertions = [
{
name: "startup provider snapshot loaded before capture",
passed: prepared.startupRequestCount > 0
},
{
name: "focus uses the loaded renderer snapshot",
passed: requests.length === 0
},
{
name: "focus never forces provider detection",
passed: requests.every((request) => request.refresh !== "true")
}
];
return {
outcome: assertions.every((assertion) => assertion.passed)
? "passed"
: "failed",
assertions,
details: [
{ label: "Visible providers", value: String(prepared.providerCount) },
{
label: "Startup requests drained before capture",
value: String(prepared.startupRequestCount)
},
{ label: "Focus-driven status requests", value: String(requests.length) },
{
label: "Unexpected request durations",
value: durations.length > 0 ? durations.join(" → ") : "none"
}
],
stabilityCriterion:
"two focus events observed for one second with no provider-status request"
};
}