{"_id":"@blksails/pi-web","_rev":"9-8b41f5cacc4250f6a2ad77e23dfff2d4","name":"@blksails/pi-web","dist-tags":{"latest":"0.3.2"},"versions":{"0.1.0":{"name":"@blksails/pi-web","version":"0.1.0","_id":"@blksails/pi-web@0.1.0","maintainers":[{"name":"hysios","email":"hysios@gmail.com"}],"bin":{"pi-web":"bin/pi-web.mjs"},"dist":{"shasum":"559fff9b17cd356b817fcb9884805d7406971cf1","tarball":"https://registry.npmjs.org/@blksails/pi-web/-/pi-web-0.1.0.tgz","fileCount":13619,"integrity":"sha512-+tzZsGyvSpxB2U2y0rBOkj9ZuOpz0kYh9qyl/CzWegZHhgStw29eUZwfTL2RAgExGPlNLlzS2xHP8/+/+L9ydw==","signatures":[{"sig":"MEYCIQDtMPnyn4b7C+29p5Isj01G+RpRPp5RDEqaCainDwwLvwIhAIG29mvKI1iJv5cUJ9x898KXBVtykjD7hoD7tDXa2yVv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":283825312},"_from":"file:blksails-pi-web-0.1.0.tgz","engines":{"node":">=22.19.0"},"scripts":{"dev":"next dev","e2e":"playwright test","test":"pnpm -r --workspace-concurrency=1 run test","build":"next build","start":"next start","e2e:cli":"node e2e/cli/cli-smoke.mjs","e2e:node":"PI_WEB_STUB_AGENT=1 vitest run -c vitest.node-e2e.config.ts","test:app":"vitest run","build:cli":"NEXT_DIST_DIR=.next-cli next build && NEXT_DIST_DIR=.next-cli node scripts/pack-standalone.mjs","e2e:build":"next build && playwright test","start:cli":"node bin/pi-web.mjs","typecheck":"pnpm -r run typecheck && tsc -p tsconfig.json --noEmit","e2e:cli:watch":"node e2e/cli/cli-watch.mjs"},"_npmUser":{"name":"hysios","email":"hysios@gmail.com"},"_resolved":"/private/var/folders/r2/pzm9pv1x0jx0fd596wnyrw6w0000gn/T/a5a3ed93fe0dc450393b5b6eee211dcd/blksails-pi-web-0.1.0.tgz","_integrity":"sha512-+tzZsGyvSpxB2U2y0rBOkj9ZuOpz0kYh9qyl/CzWegZHhgStw29eUZwfTL2RAgExGPlNLlzS2xHP8/+/+L9ydw==","deprecated":"体积过大(283MB)，请使用 >=0.1.1（已瘦身至 ~46MB）","_npmVersion":"10.9.4","description":"pi web — 全局可安装 CLI，拉起 Next standalone 自包含产物","directories":{},"_nodeVersion":"22.22.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1","vitest":"^2.1.8","postcss":"^8.4.49","typescript":"^5.6.3","@types/node":"^22.10.0","tailwindcss":"^3.4.17","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@playwright/test":"^1.49.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3"},"_npmOperationalInternal":{"tmp":"tmp/pi-web_0.1.0_1782287452986_0.6745266921142457","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@blksails/pi-web","version":"0.1.1","_id":"@blksails/pi-web@0.1.1","maintainers":[{"name":"hysios","email":"hysios@gmail.com"}],"bin":{"pi-web":"bin/pi-web.mjs"},"dist":{"shasum":"ad1a7406a59e833b05a9147ba1ce03181a9ab8d3","tarball":"https://registry.npmjs.org/@blksails/pi-web/-/pi-web-0.1.1.tgz","fileCount":8345,"integrity":"sha512-vbd0H/ashpAHa8fXcASZmnlsQMjtt3o8Y/9D249TYhAOKHpOAwT4WTLisNCblXqHZ/dtelcTivJWffXYjsKGJw==","signatures":[{"sig":"MEYCIQC10HqyryBLojSKKlYagkGxFavxd6J1QF7aiOF5jIYa+QIhALyuU7p1weqkBHSyxAeKr3bpEvGKS7B7Wmi9OLjgpimN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203225683},"_from":"file:blksails-pi-web-0.1.1.tgz","engines":{"node":">=22.19.0"},"scripts":{"dev":"next dev","e2e":"playwright test","test":"pnpm -r --workspace-concurrency=1 run test","build":"next build","start":"next start","e2e:cli":"node e2e/cli/cli-smoke.mjs","e2e:node":"PI_WEB_STUB_AGENT=1 vitest run -c vitest.node-e2e.config.ts","test:app":"vitest run","build:cli":"NEXT_DIST_DIR=.next-cli next build && NEXT_DIST_DIR=.next-cli node scripts/pack-standalone.mjs","e2e:build":"next build && playwright test","start:cli":"node bin/pi-web.mjs","typecheck":"pnpm -r run typecheck && tsc -p tsconfig.json --noEmit","e2e:cli:watch":"node e2e/cli/cli-watch.mjs"},"_npmUser":{"name":"hysios","email":"hysios@gmail.com"},"_resolved":"/private/var/folders/r2/pzm9pv1x0jx0fd596wnyrw6w0000gn/T/6be3fbaf147c6b11668a87fa7e6fe18d/blksails-pi-web-0.1.1.tgz","_integrity":"sha512-vbd0H/ashpAHa8fXcASZmnlsQMjtt3o8Y/9D249TYhAOKHpOAwT4WTLisNCblXqHZ/dtelcTivJWffXYjsKGJw==","_npmVersion":"10.9.4","description":"pi web — 全局可安装 CLI，拉起 Next standalone 自包含产物","directories":{},"_nodeVersion":"22.22.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1","vitest":"^2.1.8","postcss":"^8.4.49","typescript":"^5.6.3","@types/node":"^22.10.0","tailwindcss":"^3.4.17","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@playwright/test":"^1.49.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3"},"_npmOperationalInternal":{"tmp":"tmp/pi-web_0.1.1_1782288281504_0.4503211724540437","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@blksails/pi-web","version":"0.1.2","_id":"@blksails/pi-web@0.1.2","maintainers":[{"name":"hysios","email":"hysios@gmail.com"}],"bin":{"pi-web":"bin/pi-web.mjs"},"dist":{"shasum":"6b121979f80ce25d90ba84ba6bfb3eada213b24a","tarball":"https://registry.npmjs.org/@blksails/pi-web/-/pi-web-0.1.2.tgz","fileCount":8144,"integrity":"sha512-vKYFuowUpNS/UCOe7KTSE3IReINt8y9rI0KoxDzYjfKbO9aS2UtM2Sz1fsnN0EoRMcxxRkG/q6Lq2X35izVvUw==","signatures":[{"sig":"MEYCIQD/aMzfMCy84cMO9Z3Xb3195T5irhyFxCW8X2d11hZ2gQIhAKdEprI0cm8zGcUjjQT3VOTveOBPEwmBwTkxQ1GBWWZk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199354766},"_from":"file:blksails-pi-web-0.1.2.tgz","engines":{"node":">=22.19.0"},"scripts":{"dev":"next dev","e2e":"playwright test","test":"pnpm -r --workspace-concurrency=1 run test","build":"next build","start":"next start","e2e:cli":"node e2e/cli/cli-smoke.mjs","e2e:node":"PI_WEB_STUB_AGENT=1 vitest run -c vitest.node-e2e.config.ts","test:app":"vitest run","build:cli":"NEXT_DIST_DIR=.next-cli next build && NEXT_DIST_DIR=.next-cli node scripts/pack-standalone.mjs","e2e:build":"next build && playwright test","start:cli":"node bin/pi-web.mjs","typecheck":"pnpm -r run typecheck && tsc -p tsconfig.json --noEmit","e2e:cli:watch":"node e2e/cli/cli-watch.mjs"},"_npmUser":{"name":"hysios","email":"hysios@gmail.com"},"_resolved":"/private/var/folders/r2/pzm9pv1x0jx0fd596wnyrw6w0000gn/T/b865c1dab3da055cdc5ca9ed61db69d9/blksails-pi-web-0.1.2.tgz","_integrity":"sha512-vKYFuowUpNS/UCOe7KTSE3IReINt8y9rI0KoxDzYjfKbO9aS2UtM2Sz1fsnN0EoRMcxxRkG/q6Lq2X35izVvUw==","_npmVersion":"10.9.4","description":"pi web — 全局可安装 CLI，拉起 Next standalone 自包含产物","directories":{},"_nodeVersion":"22.22.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1","vitest":"^2.1.8","postcss":"^8.4.49","typescript":"^5.6.3","@types/node":"^22.10.0","tailwindcss":"^3.4.17","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@playwright/test":"^1.49.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3"},"_npmOperationalInternal":{"tmp":"tmp/pi-web_0.1.2_1782289848189_0.20604613419860196","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@blksails/pi-web","version":"0.2.0","_id":"@blksails/pi-web@0.2.0","maintainers":[{"name":"hysios","email":"hysios@gmail.com"}],"bin":{"pi-web":"bin/pi-web.mjs"},"dist":{"shasum":"fd5c4a51ff839244abc31ad5559e5ce0e3979902","tarball":"https://registry.npmjs.org/@blksails/pi-web/-/pi-web-0.2.0.tgz","fileCount":8,"integrity":"sha512-KRWky5IrD8pOkPW7Zv1m+jQeScxAS7GXL1Vv3H7KRzaKzHEwsE98Xo1OJXS6IvjMoPFJ4r2fxT0Xcr/ltkjbTQ==","signatures":[{"sig":"MEYCIQD22AYr4a6egrvwhc2K4d72Dr9aY3JuyrnC10TAnBCpdQIhAO4BErKEGuD16kh6ane9NNJO1y5twqVgjj67/4R5/OES","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10026478},"engines":{"node":">=22.19.0"},"gitHead":"a585f599fa21324da4479dd0998d66fc412590b8","scripts":{"dev":"node scripts/dev-all.mjs","e2e":"playwright test","test":"pnpm -r --workspace-concurrency=1 run test","build":"pnpm build:dist","start":"node dist/server.mjs","e2e:cli":"node e2e/cli/cli-smoke.mjs","e2e:csp":"node e2e/csp/import-map-csp.mjs","e2e:node":"cross-env PI_WEB_STUB_AGENT=1 vitest run -c vitest.node-e2e.config.ts","test:app":"vitest run","build:cli":"pnpm build:dist","e2e:build":"pnpm build:dist && playwright test","start:cli":"node bin/pi-web.mjs","typecheck":"pnpm -r run typecheck && tsc -p tsconfig.json --noEmit","build:dist":"pnpm build:client && pnpm build:server && node scripts/pack-dist.mjs && pnpm build:unpacker && pnpm build:payload","dev:client":"vite","dev:server":"node --import ./node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/jiti-register.mjs server/index.ts","start:dist":"node dist/server.mjs","build:client":"vite build","build:server":"node scripts/build-server.mjs","e2e:cli:real":"node e2e/cli/cli-real.mjs","build:payload":"node scripts/pack-payload.mjs","desktop:build":"pnpm --filter @blksails/pi-web-desktop exec tauri build","e2e:cli:reloc":"node e2e/cli/cli-reloc.mjs","e2e:cli:watch":"node e2e/cli/cli-watch.mjs","build:unpacker":"node scripts/build-unpacker.mjs","desktop:sidecar":"node scripts/fetch-node-sidecar.mjs","desktop:baseline":"node scripts/measure-desktop-baseline.mjs","e2e:desktop:real":"node e2e/desktop/desktop-real.mjs","e2e:runtime:conc":"node e2e/runtime-payload/concurrency.mjs","e2e:desktop:nonode":"node e2e/desktop/desktop-no-node.mjs","e2e:desktop:corrupt":"node e2e/desktop/desktop-corrupt-payload.mjs","e2e:desktop:packaged":"node e2e/desktop/desktop-packaged.mjs","e2e:runtime:recovery":"node e2e/runtime-payload/recovery.mjs","e2e:desktop:webdriver":"node e2e/desktop/webdriver/bridge.e2e.mjs"},"_npmUser":{"name":"hysios","email":"hysios@gmail.com"},"_npmVersion":"10.9.4","description":"pi web — 全局可安装 CLI，为任何 pi SDK agent 起一个流式 Web UI","directories":{},"_nodeVersion":"22.22.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.12.0","devDependencies":{"tar":"^7.5.19","vite":"^6","jsdom":"^25.0.1","vitest":"^2.1.8","esbuild":"^0.28.1","postcss":"^8.4.49","cross-env":"^10.1.0","typescript":"^5.6.3","@types/node":"^22.10.0","tailwindcss":"^3.4.17","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@playwright/test":"^1.49.0","@types/react-dom":"^19.0.0","@vitejs/plugin-react":"^4","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3"},"_npmOperationalInternal":{"tmp":"tmp/pi-web_0.2.0_1783685396038_0.2559587199398865","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@blksails/pi-web","version":"0.2.1","_id":"@blksails/pi-web@0.2.1","maintainers":[{"name":"hysios","email":"hysios@gmail.com"}],"bin":{"pi-web":"bin/pi-web.mjs"},"dist":{"shasum":"892cc031b47e79b7878cf51711f7942f9d7ebfad","tarball":"https://registry.npmjs.org/@blksails/pi-web/-/pi-web-0.2.1.tgz","fileCount":8,"integrity":"sha512-l+FL44Dstpd5mogxKcYVEAC/n0SFaca4xHu7k7or78DywXcSjia/B5LoDIa2udz/ALQUKySrV6kRpRrWLt/lww==","signatures":[{"sig":"MEQCIDf7wH8dczQuG0pyZPwwKVxCUacWavn6+0YkeyOOM2pWAiB6NrwTLt7SckabW5LrD2GU0XpJAD1hKNbRse2XLbQQEw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10872985},"_from":"file:blksails-pi-web-0.2.1.tgz","engines":{"node":">=22.19.0"},"scripts":{"dev":"node scripts/dev-all.mjs","e2e":"playwright test","test":"pnpm -r --workspace-concurrency=1 run test","build":"pnpm build:dist","start":"node dist/server.mjs","dev:acs":"node scripts/dev-acs.mjs","dev:e2b":"cross-env PI_WEB_TRANSPORT=e2b node scripts/dev-all.mjs","e2e:cli":"node e2e/cli/cli-smoke.mjs","e2e:csp":"node e2e/csp/import-map-csp.mjs","e2e:node":"cross-env PI_WEB_STUB_AGENT=1 vitest run -c vitest.node-e2e.config.ts","test:app":"vitest run","build:cli":"pnpm build:dist","e2e:build":"pnpm build:dist && playwright test","start:cli":"node bin/pi-web.mjs","typecheck":"pnpm -r run typecheck && tsc -p tsconfig.json --noEmit","build:dist":"pnpm build:client && pnpm build:server && node scripts/pack-dist.mjs && pnpm build:unpacker && pnpm build:payload","dev:client":"vite","dev:server":"node --import ./node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/jiti-register.mjs server/index.ts","start:dist":"node dist/server.mjs","e2e:cli:all":"pnpm e2e:cli && pnpm e2e:cli:create && pnpm e2e:cli:install && pnpm e2e:cli:reloc","build:client":"vite build","build:server":"node scripts/build-server.mjs","e2e:cli:real":"node e2e/cli/cli-real.mjs","build:payload":"node scripts/pack-payload.mjs","desktop:build":"pnpm --filter @blksails/pi-web-desktop exec tauri build","dev:e2b:local":"node scripts/dev-e2b-local.mjs","e2e:cli:reloc":"node e2e/cli/cli-reloc.mjs","e2e:cli:watch":"node e2e/cli/cli-watch.mjs","build:unpacker":"node scripts/build-unpacker.mjs","e2e:cli:create":"node e2e/cli/cli-create-run.mjs","desktop:sidecar":"node scripts/fetch-node-sidecar.mjs","e2e:cli:install":"node e2e/cli/cli-install-local.mjs","e2e:llm-gateway":"node e2e/llm-gateway/gateway-chain.local.mjs","desktop:baseline":"node scripts/measure-desktop-baseline.mjs","e2e:desktop:real":"node e2e/desktop/desktop-real.mjs","e2e:runtime:conc":"node e2e/runtime-payload/concurrency.mjs","build:agent-image":"node scripts/build-agent-image.mjs","e2e:sandbox-baked":"node e2e/sandbox-baked-image.local.mjs","e2e:desktop:nonode":"node e2e/desktop/desktop-no-node.mjs","e2e:desktop:corrupt":"node e2e/desktop/desktop-corrupt-payload.mjs","e2e:sandbox-browser":"node e2e/sandbox-browser.local.mjs","e2e:desktop:packaged":"node e2e/desktop/desktop-packaged.mjs","e2e:runtime:recovery":"node e2e/runtime-payload/recovery.mjs","e2e:desktop:webdriver":"node e2e/desktop/webdriver/bridge.e2e.mjs"},"_npmUser":{"name":"hysios","email":"hysios@gmail.com"},"_resolved":"/private/var/folders/r2/pzm9pv1x0jx0fd596wnyrw6w0000gn/T/83916d629f7ba31051641dafc184a8b3/blksails-pi-web-0.2.1.tgz","_integrity":"sha512-l+FL44Dstpd5mogxKcYVEAC/n0SFaca4xHu7k7or78DywXcSjia/B5LoDIa2udz/ALQUKySrV6kRpRrWLt/lww==","_npmVersion":"10.9.4","description":"pi web — 全局可安装 CLI，为任何 pi SDK agent 起一个流式 Web UI","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ai":"^5.0.0","hono":"^4.12.28","react":"^19.0.0","react-dom":"^19.0.0","react-router":"^8.2.0","@ai-sdk/react":"^2.0.0","@hono/node-server":"^2.0.8","@blksails/pi-web-ui":"0.3.0","@blksails/pi-web-kit":"0.2.0","@blksails/pi-web-react":"0.3.0","@blksails/pi-web-logger":"0.2.0","@blksails/pi-web-server":"0.3.0","@blksails/pi-web-protocol":"0.3.0","@blksails/pi-web-tool-kit":"0.3.0","@blksails/pi-web-canvas-ui":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tar":"^7.5.19","vite":"^6","jsdom":"^25.0.1","vitest":"^2.1.8","esbuild":"^0.28.1","postcss":"^8.4.49","cross-env":"^10.1.0","typescript":"^5.6.3","@types/node":"^22.10.0","tailwindcss":"^3.4.17","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@playwright/test":"^1.49.0","@types/react-dom":"^19.0.0","@vitejs/plugin-react":"^4","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3"},"_npmOperationalInternal":{"tmp":"tmp/pi-web_0.2.1_1784272063903_0.4926453432966529","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@blksails/pi-web","version":"0.3.0","_id":"@blksails/pi-web@0.3.0","maintainers":[{"name":"hysios","email":"hysios@gmail.com"}],"bin":{"pi-web":"bin/pi-web.mjs"},"dist":{"shasum":"7f1e86b76326bc6a81e2ee2f66db08a3bb85b885","tarball":"https://registry.npmjs.org/@blksails/pi-web/-/pi-web-0.3.0.tgz","fileCount":8,"integrity":"sha512-2AcsCyZwZIB9E+S57xWU3/l5m8lUpmhEBAXuf4GPp1IS9DyeKcg2fMWbU/QdWDfWpdggBjaGzN9ckwquzCIbSg==","signatures":[{"sig":"MEYCIQDbxAIdqv4SFK5Ncs3akP/RPoVGo6vhvuLXIOFsTbSfLQIhAPJB8kBzYGFQJ3Uyq0GCpNGgPuUpDMxB2GSvnpp8FPTB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10906738},"engines":{"node":">=22.19.0"},"gitHead":"ad6d1372d0fb3aefeab55229fd9a99e8129a336d","scripts":{"dev":"node scripts/dev-all.mjs","e2e":"playwright test","test":"pnpm -r --workspace-concurrency=1 run test","build":"pnpm build:dist","start":"node dist/server.mjs","dev:acs":"node scripts/dev-acs.mjs","dev:e2b":"cross-env PI_WEB_TRANSPORT=e2b node scripts/dev-all.mjs","e2e:cli":"node e2e/cli/cli-smoke.mjs","e2e:csp":"node e2e/csp/import-map-csp.mjs","e2e:node":"cross-env PI_WEB_STUB_AGENT=1 vitest run -c vitest.node-e2e.config.ts","test:app":"vitest run","build:cli":"pnpm build:dist","e2e:build":"pnpm build:dist && playwright test","start:cli":"node bin/pi-web.mjs","typecheck":"pnpm -r run typecheck && tsc -p tsconfig.json --noEmit","build:dist":"pnpm build:client && pnpm build:server && node scripts/pack-dist.mjs && pnpm build:unpacker && pnpm build:payload","dev:client":"vite","dev:server":"node --import ./node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/jiti-register.mjs server/index.ts","start:dist":"node dist/server.mjs","e2e:cli:all":"pnpm e2e:cli && pnpm e2e:cli:create && pnpm e2e:cli:install && pnpm e2e:cli:reloc","build:client":"vite build","build:server":"node scripts/build-server.mjs","e2e:cli:real":"node e2e/cli/cli-real.mjs","build:payload":"node scripts/pack-payload.mjs","desktop:build":"pnpm --filter @blksails/pi-web-desktop exec tauri build","dev:e2b:local":"node scripts/dev-e2b-local.mjs","e2e:cli:reloc":"node e2e/cli/cli-reloc.mjs","e2e:cli:watch":"node e2e/cli/cli-watch.mjs","build:unpacker":"node scripts/build-unpacker.mjs","e2e:cli:create":"node e2e/cli/cli-create-run.mjs","desktop:sidecar":"node scripts/fetch-node-sidecar.mjs","e2e:cli:install":"node e2e/cli/cli-install-local.mjs","e2e:llm-gateway":"node e2e/llm-gateway/gateway-chain.local.mjs","desktop:baseline":"node scripts/measure-desktop-baseline.mjs","e2e:desktop:real":"node e2e/desktop/desktop-real.mjs","e2e:runtime:conc":"node e2e/runtime-payload/concurrency.mjs","build:agent-image":"node scripts/build-agent-image.mjs","e2e:sandbox-baked":"node e2e/sandbox-baked-image.local.mjs","e2e:desktop:nonode":"node e2e/desktop/desktop-no-node.mjs","e2e:desktop:corrupt":"node e2e/desktop/desktop-corrupt-payload.mjs","e2e:sandbox-browser":"node e2e/sandbox-browser.local.mjs","e2e:desktop:packaged":"node e2e/desktop/desktop-packaged.mjs","e2e:runtime:recovery":"node e2e/runtime-payload/recovery.mjs","e2e:desktop:webdriver":"node e2e/desktop/webdriver/bridge.e2e.mjs"},"_npmUser":{"name":"hysios","email":"hysios@gmail.com"},"_npmVersion":"10.9.4","description":"pi web — 全局可安装 CLI，为任何 pi SDK agent 起一个流式 Web UI","directories":{},"_nodeVersion":"22.22.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.12.0","devDependencies":{"tar":"^7.5.19","vite":"^6","jsdom":"^25.0.1","vitest":"^2.1.8","esbuild":"^0.28.1","postcss":"^8.4.49","cross-env":"^10.1.0","typescript":"^5.6.3","@types/node":"^22.10.0","tailwindcss":"^3.4.17","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@playwright/test":"^1.49.0","@types/react-dom":"^19.0.0","@vitejs/plugin-react":"^4","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3"},"_npmOperationalInternal":{"tmp":"tmp/pi-web_0.3.0_1784393471635_0.03295900591502665","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@blksails/pi-web","version":"0.3.1","_id":"@blksails/pi-web@0.3.1","maintainers":[{"name":"hysios","email":"hysios@gmail.com"}],"bin":{"pi-web":"bin/pi-web.mjs"},"dist":{"shasum":"43ebd60480ff295dce41cf2824d0893d561d50a2","tarball":"https://registry.npmjs.org/@blksails/pi-web/-/pi-web-0.3.1.tgz","fileCount":8,"integrity":"sha512-U1AsMZw7JlZfsHmK4KKHSWTlZEG+EdM5TowkB6sLehD4nWZHAK3XusLXQiwviDsHhKG8SPhbqXV3iu/z5UmPTQ==","signatures":[{"sig":"MEUCIQC6gS6/K1qelFDSLy7BTfKfMk3GtvKKUPJ5FN7HFDDejgIgSQb+wLDEdZjc3aVJKCpXpDmcG3LynAsDRr3dwOgWj80=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10945946},"engines":{"node":">=22.19.0"},"gitHead":"229d42f5bd7a1e6a1347bb34bd16034a2bb86994","scripts":{"dev":"node scripts/dev-all.mjs","e2e":"playwright test","test":"pnpm -r --workspace-concurrency=1 run test","build":"pnpm build:dist","start":"node dist/server.mjs","dev:acs":"node scripts/dev-acs.mjs","dev:e2b":"cross-env PI_WEB_TRANSPORT=e2b node scripts/dev-all.mjs","e2e:cli":"node e2e/cli/cli-smoke.mjs","e2e:csp":"node e2e/csp/import-map-csp.mjs","e2e:node":"cross-env PI_WEB_STUB_AGENT=1 vitest run -c vitest.node-e2e.config.ts","test:app":"vitest run","build:cli":"pnpm build:dist","e2e:build":"pnpm build:dist && playwright test","start:cli":"node bin/pi-web.mjs","typecheck":"pnpm -r run typecheck && tsc -p tsconfig.json --noEmit","build:dist":"pnpm build:client && pnpm build:server && node scripts/pack-dist.mjs && pnpm build:unpacker && pnpm build:payload","dev:client":"vite","dev:server":"node --import ./node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/jiti-register.mjs server/index.ts","start:dist":"node dist/server.mjs","e2e:cli:all":"pnpm e2e:cli && pnpm e2e:cli:create && pnpm e2e:cli:install && pnpm e2e:cli:reloc","build:client":"vite build","build:server":"node scripts/build-server.mjs","e2e:cli:real":"node e2e/cli/cli-real.mjs","build:payload":"node scripts/pack-payload.mjs","desktop:build":"pnpm --filter @blksails/pi-web-desktop exec tauri build","dev:e2b:local":"node scripts/dev-e2b-local.mjs","e2e:cli:reloc":"node e2e/cli/cli-reloc.mjs","e2e:cli:watch":"node e2e/cli/cli-watch.mjs","build:unpacker":"node scripts/build-unpacker.mjs","e2e:cli:create":"node e2e/cli/cli-create-run.mjs","desktop:sidecar":"node scripts/fetch-node-sidecar.mjs","e2e:cli:install":"node e2e/cli/cli-install-local.mjs","e2e:llm-gateway":"node e2e/llm-gateway/gateway-chain.local.mjs","desktop:baseline":"node scripts/measure-desktop-baseline.mjs","e2e:desktop:real":"node e2e/desktop/desktop-real.mjs","e2e:runtime:conc":"node e2e/runtime-payload/concurrency.mjs","build:agent-image":"node scripts/build-agent-image.mjs","e2e:sandbox-baked":"node e2e/sandbox-baked-image.local.mjs","e2e:desktop:nonode":"node e2e/desktop/desktop-no-node.mjs","e2e:desktop:corrupt":"node e2e/desktop/desktop-corrupt-payload.mjs","e2e:sandbox-browser":"node e2e/sandbox-browser.local.mjs","e2e:desktop:packaged":"node e2e/desktop/desktop-packaged.mjs","e2e:runtime:recovery":"node e2e/runtime-payload/recovery.mjs","e2e:desktop:webdriver":"node e2e/desktop/webdriver/bridge.e2e.mjs"},"_npmUser":{"name":"hysios","email":"hysios@gmail.com"},"_npmVersion":"10.9.4","description":"pi web — 全局可安装 CLI，为任何 pi SDK agent 起一个流式 Web UI","directories":{},"_nodeVersion":"22.22.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.12.0","devDependencies":{"tar":"^7.5.19","vite":"^6","jsdom":"^25.0.1","vitest":"^2.1.8","esbuild":"^0.28.1","postcss":"^8.4.49","cross-env":"^10.1.0","typescript":"^5.6.3","@types/node":"^22.10.0","tailwindcss":"^3.4.17","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@playwright/test":"^1.49.0","@types/react-dom":"^19.0.0","@vitejs/plugin-react":"^4","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3"},"_npmOperationalInternal":{"tmp":"tmp/pi-web_0.3.1_1784553445050_0.42548281368259966","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@blksails/pi-web","version":"0.3.2","engines":{"node":">=22.19.0"},"bin":{"pi-web":"bin/pi-web.mjs"},"dependencies":{"@ai-sdk/react":"^2.0.0","@hono/node-server":"^2.0.8","ai":"^5.0.0","hono":"^4.12.28","react":"^19.0.0","react-dom":"^19.0.0","react-router":"^8.2.0","@blksails/pi-web-canvas-ui":"0.2.0","@blksails/pi-web-logger":"0.2.0","@blksails/pi-web-kit":"0.5.0","@blksails/pi-web-panes-kit":"0.1.0","@blksails/pi-web-protocol":"0.5.1","@blksails/pi-web-react":"0.5.0","@blksails/pi-web-server":"0.5.3","@blksails/pi-web-tool-kit":"0.5.0","@blksails/pi-web-ui":"0.5.0"},"devDependencies":{"@playwright/test":"^1.49.0","@testing-library/jest-dom":"^6.6.3","@testing-library/react":"^16.1.0","@types/node":"^22.10.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitejs/plugin-react":"^4","autoprefixer":"^10.4.20","cross-env":"^10.1.0","esbuild":"^0.28.1","jsdom":"^25.0.1","postcss":"^8.4.49","tailwindcss":"^3.4.17","tar":"^7.5.19","typescript":"^5.6.3","vite":"^6","vitest":"^2.1.8"},"description":"pi web — 全局可安装 CLI，为任何 pi SDK agent 起一个流式 Web UI","publishConfig":{"access":"public"},"scripts":{"dev":"node scripts/dev-all.mjs","dev:e2b":"cross-env PI_WEB_TRANSPORT=e2b node scripts/dev-all.mjs","dev:e2b:local":"node scripts/dev-e2b-local.mjs","dev:acs":"node scripts/dev-acs.mjs","dev:client":"vite","build":"pnpm build:dist","build:client":"vite build","build:server":"node scripts/build-server.mjs","build:agent-image":"node scripts/build-agent-image.mjs","build:dist":"pnpm build:client && pnpm build:server && node scripts/pack-dist.mjs && pnpm build:unpacker && pnpm build:payload","start:dist":"node dist/server.mjs","dev:server":"node --import ./node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/jiti-register.mjs server/index.ts","start":"node dist/server.mjs","build:cli":"pnpm build:dist","start:cli":"node bin/pi-web.mjs","e2e:cli":"node e2e/cli/cli-smoke.mjs","e2e:cli:watch":"node e2e/cli/cli-watch.mjs","e2e:cli:real":"node e2e/cli/cli-real.mjs","e2e:cli:reloc":"node e2e/cli/cli-reloc.mjs","e2e:cli:create":"node e2e/cli/cli-create-run.mjs","e2e:cli:install":"node e2e/cli/cli-install-local.mjs","e2e:cli:all":"pnpm e2e:cli && pnpm e2e:cli:create && pnpm e2e:cli:install && pnpm e2e:cli:reloc","test":"pnpm -r --workspace-concurrency=1 run test","test:app":"vitest run","e2e":"playwright test","e2e:build":"pnpm build:dist && playwright test","e2e:node":"cross-env PI_WEB_STUB_AGENT=1 vitest run -c vitest.node-e2e.config.ts","e2e:csp":"node e2e/csp/import-map-csp.mjs","e2e:sandbox-baked":"node e2e/sandbox-baked-image.local.mjs","e2e:sandbox-browser":"node e2e/sandbox-browser.local.mjs","e2e:llm-gateway":"node e2e/llm-gateway/gateway-chain.local.mjs","typecheck":"pnpm -r run typecheck && tsc -p tsconfig.json --noEmit","e2e:desktop:real":"node e2e/desktop/desktop-real.mjs","e2e:desktop:nonode":"node e2e/desktop/desktop-no-node.mjs","e2e:desktop:packaged":"node e2e/desktop/desktop-packaged.mjs","desktop:sidecar":"node scripts/fetch-node-sidecar.mjs","desktop:baseline":"node scripts/measure-desktop-baseline.mjs","desktop:build":"pnpm --filter @blksails/pi-web-desktop exec tauri build","e2e:desktop:webdriver":"node e2e/desktop/webdriver/bridge.e2e.mjs","build:unpacker":"node scripts/build-unpacker.mjs","build:payload":"node scripts/pack-payload.mjs","e2e:runtime:conc":"node e2e/runtime-payload/concurrency.mjs","e2e:runtime:recovery":"node e2e/runtime-payload/recovery.mjs","e2e:desktop:corrupt":"node e2e/desktop/desktop-corrupt-payload.mjs"},"_id":"@blksails/pi-web@0.3.2","_integrity":"sha512-+RFUu2jBuLlj7ieZOrVUybbz1GAGkEJOSzbvbKcBB9O9J6umL93mqDly++rlI1Q21eJBCEyuIW4zCX9EUfCPqg==","_resolved":"/private/var/folders/r2/pzm9pv1x0jx0fd596wnyrw6w0000gn/T/3a5c1c119423dae5d81dfc38493e3aaf/blksails-pi-web-0.3.2.tgz","_from":"file:blksails-pi-web-0.3.2.tgz","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-+RFUu2jBuLlj7ieZOrVUybbz1GAGkEJOSzbvbKcBB9O9J6umL93mqDly++rlI1Q21eJBCEyuIW4zCX9EUfCPqg==","shasum":"2b050d06e6a9abcb81295b3beb3f18c087eeadea","tarball":"https://registry.npmjs.org/@blksails/pi-web/-/pi-web-0.3.2.tgz","fileCount":8,"unpackedSize":11439678,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDopPyl9lV63H5y2YxxDY5+jMtfLsT/37g7kUn/7+qn+gIgEHEMGOxtTLZvovA+LUMT13X9Q8H/N+Brjt014An7+ZA="}]},"_npmUser":{"name":"hysios","email":"hysios@gmail.com"},"directories":{},"maintainers":[{"name":"hysios","email":"hysios@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-web_0.3.2_1784735035817_0.34901065991858893"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-24T07:50:52.711Z","modified":"2026-07-22T15:43:56.341Z","0.1.0":"2026-06-24T07:50:54.006Z","0.1.1":"2026-06-24T08:04:42.209Z","0.1.2":"2026-06-24T08:30:48.941Z","0.2.0":"2026-07-10T12:09:56.461Z","0.2.1":"2026-07-17T07:07:44.194Z","0.3.0":"2026-07-18T16:51:11.966Z","0.3.1":"2026-07-20T13:17:25.376Z","0.3.2":"2026-07-22T15:43:56.163Z"},"description":"pi web — 全局可安装 CLI，为任何 pi SDK agent 起一个流式 Web UI","maintainers":[{"name":"hysios","email":"hysios@gmail.com"}],"readme":"# pi-web\n\n[English](./README.md) | **简体中文**\n\n> pi 自定义 Agent 的即时 Web UI —— 给定一个目录或 git 仓库(含用 pi SDK 写的 `index.[js|ts]` 入口),自动载入并起一个流式 Web 聊天 UI。\n\npi-web 把任何用 [`@earendil-works/pi-coding-agent`](https://www.npmjs.com/package/@earendil-works/pi-coding-agent) SDK 写的 agent 以接近零的额外成本变成带 UI 的产品;也能把通用 pi coding agent 作为 Web 服务对外提供,并被设计为未来 \"pi cloud\" 的内核与开放层。\n\n📖 **文档站:** [pi-web.blksails.ai](https://pi-web.blksails.ai) —— 完整产品文档(概述、快速开始、架构、API、部署)。\n\n> npm 包统一在 **`@blksails/*`** scope 下发布(`@blksails/pi-web-protocol`、`@blksails/pi-web-server`、`@blksails/pi-web-react`、`@blksails/pi-web-ui`、`@blksails/pi-web-agent-kit`、`@blksails/pi-web-tool-kit`、`@blksails/pi-web-kit`)。\n\n## 核心能力\n\n- **双模式载入** —— 有 `index.[js|ts]` 入口的源用 SDK 的 `runRpcMode` 跑自定义 agent;无入口则回退通用 `pi --mode rpc`。两者对前端是同一套 RPC 协议。\n- **流式对话 UI** —— Vite + React SPA,搭配 shadcn/ui + Vercel AI Elements,经 SSE + AI SDK v5 自定义 `ChatTransport` 渲染文本 / 思考 / 工具调用。\n- **pi 资源体系直通** —— extensions / skills / prompt templates 自动发现 + 声明式注入;权限弹窗经 extension UI 子协议。\n- **附件系统** —— 图片/文件上传经可插拔对象存储(先本地)落库 + 签名分发 URL。两条消费路径:**base64 喂 LLM 识别**,以及**文件交 server 端 tool**(图像编辑/生成)经 `attachmentId` 解析执行,产出回流并可被下一轮再次引用。\n- **自定义 provider** —— 经 `~/.pi/agent/models.json` 接入任意 OpenAI 兼容网关(NewAPI、DashScope 等);设置 UI 提供可搜索的 provider/模型下拉,选项来自你已配置凭证的可用模型。\n- **开放可集成** —— 分层 npm 包 + 语言无关 HTTP/SSE 协议 + 渲染器注册表,可嵌入任意 Web 栈。\n\n## 架构\n\n```\n浏览器 (Vite SPA — AI Elements + useChat)\n   │  SSE / HTTP\n   ▼\nHono 宿主 (server/index.ts — 一条 app.all(\"/api/*\") 转发到 createPiWebHandler)\n   │  stdin/stdout JSONL\n   ▼\nAgent 子进程  — bootstrap runner `runRpcMode`  或  `pi --mode rpc`\n               (一会话一进程)\n```\n\n后端核心是一条**传输无关的 RPC 通道**(`PiRpcChannel`);事件 → AI SDK `UIMessage` 流的翻译层是前后端枢纽。两种模式底层同实现,故桥接完全复用,仅 spawn 目标不同。\n\n> 有状态长连接 —— **不能** Serverless/Edge(除非控制面/数据面分离);横向扩容需按 `sessionId` sticky routing。\n\n## 包结构\n\n分层、可单独发布的包,依赖方向单向收敛(`protocol ← 所有`;`server` 仅依赖 `protocol`;`react`/`ui` 与后端解耦):\n\n| 包 | 职责 |\n| --- | --- |\n| `@blksails/pi-web-protocol` | 稳定契约:RPC 类型/schema、配置表单 IR。改动需语义化版本;SSE 帧带 `protocolVersion`。 |\n| `@blksails/pi-web-server` | 后端引擎:agent 源解析、bootstrap runner、RPC 通道、会话注册与翻译、配置/附件路由。 |\n| `@blksails/pi-web-react` | 无样式的 headless hooks 与 transport。 |\n| `@blksails/pi-web-ui` | shadcn/ui + AI Elements 组件,以及 schema 驱动的配置 UI。 |\n| `@blksails/pi-web-agent-kit` | 写 `index.ts` 用的 `defineAgent()` 类型帮助。 |\n| `@blksails/pi-web-tool-kit`、`@blksails/pi-web-kit` | 工具与 Web 集成的配套套件。 |\n| `@blksails/pi-web-primitives` | 与对话壳解耦的框架中立 UI 原语。 |\n| `@blksails/pi-web-canvas-kit` | Canvas 内核:图层模型、ops、history。headless。 |\n| `@blksails/pi-web-canvas-ui` | Canvas 工作台 UI、动作与插件注册面。 |\n| `@blksails/pi-web-logger` | 浏览器与 Node 共用的同构 logger。 |\n\n## 快速开始\n\n### 前置要求\n\n- Node `>=22.19.0`(pi `engines` 约束)\n- [pnpm](https://pnpm.io/)(workspace monorepo)\n- 一个 `~/.pi/agent` 配置目录 —— 先跑 `pi` 登录一次,使 `auth.json` / `settings.json` 存在。(或经环境变量提供 provider key,见下。)\n\n### 安装与运行\n\n```bash\npnpm install\npnpm dev          # API 宿主跑 :3000 + Vite dev server —— 浏览器开 http://localhost:5173\n```\n\n打开应用,在选择器里输入 **agent source**:\n- 含 `index.ts` 的目录 → 你的自定义 agent,\n- 任意目录 → 通用 CLI 模式,\n- 或一个 git 源。\n\n### 配置\n\n凭证与默认值默认来自 `~/.pi/agent`(若已用 `pi` 登录则无需 env key)。复制 `.env.local.example` 为 `.env.local` 以覆盖。关键变量(均由 `lib/app/config.ts` 运行时读取,绝不记录):\n\n| 变量 | 用途 |\n| --- | --- |\n| `PI_WEB_AGENT_DIR` / `PI_CODING_AGENT_DIR` | 覆盖 pi 配置目录(默认 `~/.pi/agent`)。 |\n| `PI_WEB_DEFAULT_PROVIDER` / `PI_WEB_DEFAULT_MODEL` | 强制指定 provider/模型(否则由 `settings.json` 决定)。 |\n| `PI_WEB_HIDE_PROVIDERS` | 逗号分隔的 provider 名,从 settings 的模型/provider 下拉中隐藏(其模型会被从 `GET /config/models` 过滤掉)。 |\n| `PI_WEB_DEFAULT_SOURCE` | 选择器默认提供的 agent 源。 |\n| `PI_WEB_DEFAULT_CWD` | 会话默认工作目录。 |\n| `ANTHROPIC_API_KEY`、`OPENAI_API_KEY` 等 | 可选,叠加透传以覆盖 `auth.json`。 |\n| `PI_WEB_STUB_AGENT=1` | 用确定性离线 stub 跑会话(e2e 用)。 |\n\n#### 自定义 OpenAI 兼容 provider\n\n在 `~/.pi/agent/models.json` 中接入任意 OpenAI 兼容网关:\n\n```json\n{\n  \"providers\": {\n    \"my-gateway\": {\n      \"name\": \"My Gateway\",\n      \"baseUrl\": \"https://example.com/v1\",\n      \"apiKey\": \"sk-...\",\n      \"api\": \"openai-completions\",\n      \"models\": [\n        { \"id\": \"some-model\", \"name\": \"Some Model\", \"input\": [\"text\"], \"contextWindow\": 131072, \"maxTokens\": 16384, \"cost\": { \"input\": 0, \"output\": 0, \"cacheRead\": 0, \"cacheWrite\": 0 } }\n      ]\n    }\n  }\n}\n```\n\n非内置 provider 需 `baseUrl` + `apiKey`;用 `pi --list-models` 验证。随后该模型会出现在设置的 provider/模型下拉里。\n\n## 常用命令\n\n| 命令 | 说明 |\n| --- | --- |\n| `pnpm dev` | 并发拉起两个开发进程(`scripts/dev-all.mjs`):API 宿主 `:3000` + Vite `:5173`。 |\n| `pnpm dev:client` | 只起 Vite dev server。 |\n| `pnpm build` | 生产构建(`build:dist`):Vite 客户端 → esbuild 服务端 → `pack-dist` → 载荷。 |\n| `pnpm start` | 运行生产构建(`node dist/server.mjs`)。 |\n| `pnpm test` | 运行所有 workspace 包测试。 |\n| `pnpm test:app` | 应用级 vitest。 |\n| `pnpm e2e` | Playwright e2e。 |\n| `pnpm e2e:node` | 离线 Node 级流式 e2e(stub agent)。 |\n| `pnpm typecheck` | 全部包 + 应用类型检查。 |\n\n## 开发标准\n\n- **TypeScript strict**,禁 `any`。\n- **测试是硬性要求**:每个 spec 必须有单元/集成测试 **加** e2e 验证,并以新鲜证据(实际运行输出)证明通过。后端 RPC 桥用对真实子进程的集成测试;前端翻译层用纯函数单测。\n- 传输 / 隔离 / 存储用接口隔开(`PiRpcChannel`、`SessionStore`、`BlobStore`),为未来 e2b/edge/device 与对象存储预留接缝。\n\n本仓库遵循 Kiro 风格的 spec 驱动开发 —— 见 `.kiro/steering/`(项目记忆)与 `.kiro/specs/`(各功能 spec)。权威需求见 `PLAN.md`。\n\n---\n\n_私有仓库 —— © blksails。_\n","readmeFilename":"README.zh-CN.md"}