MiniCPM5-2B-WebGPU-Pi-HTTP / app /tests /space-restricted.mjs
Mike0021's picture
Enable browser HTTP commands with CORS-aware errors and bounded requests
39371ea verified
Raw History Blame Contribute Delete
2.59 kB
import { chromium } from 'playwright';
import fs from 'node:fs/promises';
import assert from 'node:assert/strict';
// Playwright 1.58's default ThirdPartyStoragePartitioning disable flag exposes
// the denied third-party-storage path. Check the actual public Space's escape
// link, then execute the model/tool workflow in the opened top-level app.
const context = await chromium.launchPersistentContext('../validation/agent-browser-profile/space', {
executablePath: '/usr/bin/chromium', headless: true,
args: ['--enable-unsafe-webgpu', '--use-angle=vulkan', '--enable-features=Vulkan', '--disable-vulkan-surface'],
});
context.setDefaultTimeout(180_000);
const result = { date: new Date().toISOString() };
try {
const page = await context.newPage();
await page.goto('https://huggingface.co/spaces/Mike0021/MiniCPM5-2B-WebGPU-Pi', { waitUntil: 'load' });
const frame = page.frameLocator('iframe[src*="minicpm5-2b-webgpu-pi"]');
await frame.locator('#open-tab').waitFor({ state: 'visible' });
result.embeddedNotice = await frame.locator('#notice').textContent();
assert.match(result.embeddedNotice, /blocked storage/);
const opened = context.waitForEvent('page');
await frame.locator('#open-tab').click();
const app = await opened;
await app.waitForLoadState('load'); await app.waitForFunction(() => window.browserPi);
await app.evaluate(() => window.browserPi.ready);
assert.equal(new URL(app.url()).hostname, 'mike0021-minicpm5-2b-webgpu-pi.static.hf.space');
await app.locator('#load').click(); await app.waitForFunction(() => window.browserPi.loaded);
await app.locator('#new-chat').click(); await app.waitForFunction(() => !window.browserPi.busy);
const token = 'CHECK-' + crypto.randomUUID().slice(0, 8);
await app.evaluate(token => window.browserPi.rpc('write', { path: '/workspace/check.txt', content: token }), token);
const state = await app.evaluate(() => window.browserPi.prompt('Read check.txt with the read tool and tell me the exact contents.'));
assert(state.messages.some(m => m.role === 'toolResult' && m.toolName === 'read' && !m.isError));
assert(state.messages.filter(m => m.role === 'assistant').at(-1).content.some(c => c.text?.includes(token)));
result.messages = state.messages; result.openedUrl = app.url(); result.passed = true;
console.log('Restricted embed → new-tab link → real Pi/model tool execution passed.');
} catch (error) { result.failure = error.stack; throw error; }
finally { await fs.writeFile('../validation/agent-space-restricted.json', JSON.stringify(result, null, 2)); await context.close(); }