feat: implement PI-090 product tools

This commit is contained in:
2026-08-23 15:14:50 +08:00
parent 77cdee7e73
commit 13ab383e53
32 changed files with 2035 additions and 49 deletions

View File

@@ -105,7 +105,16 @@ describe('locked Pi worker process smoke', () => {
success: true,
});
expect(worker.stderrDiagnostic).not.toContain('Failed to load extension');
expect(await readActiveTools(probe.resultPath)).toContain('subagent');
expect(await readActiveTools(probe.resultPath)).toEqual(expect.arrayContaining([
'ask_user',
'subagent',
'agent_browser',
'game_asset_browser',
'game_asset_review',
'task_state',
'changed_file',
'runtime_context',
]));
await expect(worker.stop()).resolves.toMatchObject({ mode: 'stdin-close', code: 0 });
} finally {
await worker.stop().catch(() => undefined);
@@ -233,4 +242,64 @@ describe('locked Pi worker process smoke', () => {
},
15_000,
);
it.skipIf(!packagedRuntimeRoot)(
'loads product tools in the staged production-closure parent runtime',
async () => {
const requireFromProject = createRequire(resolve('package.json'));
const electronExecutable = requireFromProject('electron') as string;
const packageRoot = realpathSync(packagedRuntimeRoot as string);
const root = await mkdtemp(join(tmpdir(), 'makelore-pi-staged-product-tools-'));
scratchRoots.push(root);
const configDir = join(root, 'config');
const sessionDir = join(root, 'sessions');
const cwd = join(root, 'project');
await Promise.all([mkdir(configDir), mkdir(sessionDir), mkdir(cwd)]);
const extensionHost = new PiManagedExtensionHost();
const extension = await extensionHost.registerWorker({
conversationId: 'staged-product-tools-parent',
generation: 1,
projectId: 'staged-project',
extensionsDir: join(root, 'extensions'),
projectPath: cwd,
});
await extensionHost.bindRun('staged-product-tools-parent', 1, 'staged-run');
const probe = await materializeActiveToolsProbe(root);
const worker = new PiWorkerProcess({
executablePath: electronExecutable,
cliPath: join(packageRoot, 'dist', 'cli.js'),
cwd,
configDir,
sessionDir,
additionalArgs: [
'--extension', extension.extensionPath,
'--extension', probe.extensionPath,
],
env: { ...extension.env, MAKELORE_PI_ACTIVE_TOOLS_FILE: probe.resultPath },
sensitiveValues: extension.sensitiveValues,
commandTimeoutMs: 5_000,
});
try {
await worker.start();
await expect(worker.request({ type: 'get_state' })).resolves.toMatchObject({
type: 'response', command: 'get_state', success: true,
});
expect(await readActiveTools(probe.resultPath)).toEqual(expect.arrayContaining([
'agent_browser',
'game_asset_browser',
'game_asset_review',
'task_state',
'changed_file',
'runtime_context',
]));
expect(worker.stderrDiagnostic).not.toContain('Failed to load extension');
await expect(worker.stop()).resolves.toMatchObject({ mode: 'stdin-close', code: 0 });
} finally {
await worker.stop().catch(() => undefined);
await extension.dispose();
await extensionHost.close();
}
},
15_000,
);
});