fix(pi): prove packaged workers end to end

This commit is contained in:
2026-08-24 16:51:13 +08:00
parent dc166a18cb
commit 2ff2e4af79
8 changed files with 825 additions and 493 deletions

View File

@@ -467,8 +467,10 @@ describe('Pi worker pool', () => {
it('rebuilds stale idle workers before prompt and lets running workers settle first', async () => {
const workers = new Map<string, FakeWorker[]>();
const revisions: Array<{ conversationId: string; provider: number; resources: number }> = [];
const telemetry: PiRuntimeTelemetryEvent[] = [];
const pool = new PiWorkerPool({
maxIdle: 4,
onTelemetry: (event) => telemetry.push(event),
openWorker: async ({ conversation: input, revision }) => {
const worker = new FakeWorker(`worker-${input.conversationId}-${(workers.get(input.conversationId)?.length ?? 0) + 1}`);
workers.set(input.conversationId, [...(workers.get(input.conversationId) ?? []), worker]);
@@ -494,7 +496,7 @@ describe('Pi worker pool', () => {
await expect.poll(() => workers.get('conversation-running')![0]!.requests.length).toBe(1);
pool.markProviderStale();
pool.startTopLevel({
const idleTicket = pool.startTopLevel({
conversationId: 'conversation-idle',
runId: 'run-idle',
command: { type: 'prompt', message: 'idle' },
@@ -503,6 +505,11 @@ describe('Pi worker pool', () => {
await expect.poll(() => workers.get('conversation-idle')?.length).toBe(2);
expect(workers.get('conversation-idle')![0]!.stopped).toBe(true);
await expect.poll(() => workers.get('conversation-idle')![1]!.requests.length).toBe(1);
await idleTicket.accepted;
expect(telemetry.filter(({ runRef }) => runRef === 'runidle')).toEqual([
expect.objectContaining({ milestone: 'worker.queue_wait', workerGeneration: 2, cold: false }),
expect.objectContaining({ milestone: 'prompt.accepted', workerGeneration: 2, cold: false }),
]);
expect(workers.get('conversation-running')).toHaveLength(1);
expect(workers.get('conversation-running')![0]!.stopped).toBe(false);
@@ -756,15 +763,17 @@ describe('Pi worker pool', () => {
await second.accepted;
expect(telemetry.map(({ milestone }) => milestone)).toEqual([
'worker.queue_wait',
'prompt.accepted',
'agent.settled',
'worker.queue_wait',
'prompt.accepted',
]);
expect(telemetry[1]).toMatchObject({
expect(telemetry[0]).toMatchObject({ durationMs: 0, workerGeneration: 1, cold: true });
expect(telemetry[2]).toMatchObject({
milestone: 'agent.settled', durationMs: 20, workerGeneration: 1, cold: true,
});
expect(telemetry[2]).toMatchObject({ durationMs: 20, workerGeneration: 1, cold: true });
expect(telemetry[3]).toMatchObject({ durationMs: 20, workerGeneration: 1, cold: true });
const serialized = JSON.stringify(telemetry);
expect(serialized).not.toContain('private first prompt');
expect(serialized).not.toContain('private second prompt');