fix(pi): reopen persisted conversation sessions

This commit is contained in:
2026-08-25 08:46:55 +08:00
parent e74b59a674
commit 862d1b6d92
3 changed files with 148 additions and 8 deletions

View File

@@ -123,8 +123,11 @@ describe('managed Pi worker opener', () => {
const telemetry: PiRuntimeTelemetryEvent[] = [];
const registry = new PiSessionRegistry({ projectStore });
const extensionHost = new PiManagedExtensionHost();
const opener = createPiManagedWorkerOpener({
registry,
const createOpener = (
openerRegistry: PiSessionRegistry,
createSessionKey: () => string = () => 'session-key-a',
) => createPiManagedWorkerOpener({
registry: openerRegistry,
executablePath: 'electron.exe',
cliPath: 'pi-cli.js',
userDataDir,
@@ -132,7 +135,7 @@ describe('managed Pi worker opener', () => {
extensionHost,
loadProviderInput: async () => ({ accounts: [account], modelSummaries: [] }),
resolveCredential: async () => 'provider-secret-value',
createSessionKey: () => 'session-key-a',
createSessionKey,
onTelemetry: (event) => telemetry.push(event),
createProcess: (options) => {
processOptions.push(options);
@@ -140,6 +143,7 @@ describe('managed Pi worker opener', () => {
return new OpenerFakeProcess(options.additionalArgs?.[sessionIndex + 1] ?? '', options);
},
});
const opener = createOpener(registry);
const first = await opener({
conversation: input,
@@ -152,10 +156,23 @@ describe('managed Pi worker opener', () => {
revision: { provider: 2, resources: 1 },
existingSession: first.session,
});
const restartedCreateSessionKey = vi.fn(() => 'unexpected-new-session-key');
const restarted = await createOpener(
new PiSessionRegistry({ projectStore }),
restartedCreateSessionKey,
)({
conversation: input,
generation: 3,
revision: { provider: 2, resources: 1 },
});
expect(first.session).toEqual({ piSessionId: 'session-key-a', sessionKey: 'session-key-a' });
expect(reopened.session).toEqual(first.session);
expect(processOptions).toHaveLength(2);
expect(restarted.session).toEqual(first.session);
expect(restartedCreateSessionKey).not.toHaveBeenCalled();
expect(processOptions).toHaveLength(3);
expect(processOptions[2]?.additionalArgs).toContain('session-key-a');
expect(processOptions[2]?.additionalArgs).not.toContain('unexpected-new-session-key');
for (const options of processOptions) {
const argv = JSON.stringify(options.additionalArgs);
expect(argv).toContain('--system-prompt');
@@ -176,6 +193,7 @@ describe('managed Pi worker opener', () => {
expect(telemetry.map(({ milestone }) => milestone)).toEqual([
'resources.ready', 'worker.spawn', 'rpc.ready', 'session.open',
'resources.ready', 'worker.spawn', 'rpc.ready', 'session.open',
'resources.ready', 'worker.spawn', 'rpc.ready', 'session.open',
]);
expect(telemetry.slice(0, 4).every(({ cold }) => cold)).toBe(true);
expect(telemetry.slice(4).every(({ cold }) => !cold)).toBe(true);
@@ -184,6 +202,7 @@ describe('managed Pi worker opener', () => {
expect(JSON.stringify(telemetry)).not.toContain('provider-secret-value');
await first.worker.stop();
await reopened.worker.stop();
await restarted.worker.stop();
await extensionHost.close();
});