@rexvane/piweb 0.3.25 → 0.3.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +6 -5
- package/.next/build-manifest.json +4 -4
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +4 -4
- package/.next/react-loadable-manifest.json +14 -26
- package/.next/required-server-files.js +26 -26
- package/.next/required-server-files.json +26 -26
- package/.next/routes-manifest.json +6 -0
- package/.next/server/app/_global-error/page.js +2 -2
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/agent/[id]/events/route.js +2 -2
- package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/[id]/events/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/[id]/route.js +1 -1
- package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/[id]/tree/route.js +1 -1
- package/.next/server/app/api/agent/[id]/tree/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/new/route.js +1 -1
- package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/new/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/resources/route.js +1 -0
- package/.next/server/app/api/agent/resources/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/resources/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/config/route.js +1 -1
- package/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/server/app/api/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/files/route.js +1 -1
- package/.next/server/app/api/files/route.js.nft.json +1 -1
- package/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/route.js +1 -1
- package/.next/server/app/api/fs/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/git/route.js +4 -4
- package/.next/server/app/api/git/route.js.nft.json +1 -1
- package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/github/route.js +4 -4
- package/.next/server/app/api/github/route.js.nft.json +1 -1
- package/.next/server/app/api/github/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/growth/route.js +1 -1
- package/.next/server/app/api/growth/route.js.nft.json +1 -1
- package/.next/server/app/api/growth/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/health/route.js +1 -1
- package/.next/server/app/api/health/route.js.nft.json +1 -1
- package/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/models/defaults/route.js +1 -1
- package/.next/server/app/api/models/defaults/route.js.nft.json +1 -1
- package/.next/server/app/api/models/defaults/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/models/route.js +1 -1
- package/.next/server/app/api/models/route.js.nft.json +1 -1
- package/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/pi-settings/route.js +1 -1
- package/.next/server/app/api/pi-settings/route.js.nft.json +1 -1
- package/.next/server/app/api/pi-settings/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/plugins/route.js +1 -1
- package/.next/server/app/api/plugins/route.js.nft.json +1 -1
- package/.next/server/app/api/plugins/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/prompts/route.js +1 -1
- package/.next/server/app/api/prompts/route.js.nft.json +1 -1
- package/.next/server/app/api/prompts/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/route.js +2 -2
- package/.next/server/app/api/remote/route.js.nft.json +1 -1
- package/.next/server/app/api/remote/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/security/route.js +1 -1
- package/.next/server/app/api/security/route.js.nft.json +1 -1
- package/.next/server/app/api/security/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/export/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/import/route.js +2 -2
- package/.next/server/app/api/sessions/import/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/import/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/route.js +1 -1
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +2 -2
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/update/route.js +2 -2
- package/.next/server/app/api/update/route.js.nft.json +1 -1
- package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/version/route.js +1 -1
- package/.next/server/app/api/version/route.js.nft.json +1 -1
- package/.next/server/app/api/version/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/web-auth/route.js +2 -2
- package/.next/server/app/api/web-auth/route.js.nft.json +1 -1
- package/.next/server/app/api/web-auth/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/workspaces/route.js +1 -1
- package/.next/server/app/api/workspaces/route.js.nft.json +1 -1
- package/.next/server/app/api/workspaces/route_client-reference-manifest.js +1 -1
- package/.next/server/app/icon.svg/route.js +1 -1
- package/.next/server/app/icon.svg/route.js.nft.json +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +5 -5
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +5 -5
- package/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login/page.js +1 -1
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +4 -4
- package/.next/server/app/login.segments/_full.segment.rsc +4 -4
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +6 -5
- package/.next/server/chunks/{813.js → 1813.js} +1 -1
- package/.next/server/chunks/{430.js → 2430.js} +5 -5
- package/.next/server/chunks/{970.js → 2970.js} +1 -1
- package/.next/server/chunks/3924.js +6 -0
- package/.next/server/chunks/4807.js +1 -0
- package/.next/server/chunks/5393.js +1 -0
- package/.next/server/chunks/5802.js +2 -0
- package/.next/server/chunks/620.js +1 -1
- package/.next/server/chunks/6229.js +1 -0
- package/.next/server/chunks/7496.js +1 -0
- package/.next/server/chunks/7662.js +2 -0
- package/.next/server/chunks/8686.js +1 -0
- package/.next/server/chunks/{593.js → 974.js} +1 -1
- package/.next/server/chunks/{920.js → 9920.js} +1 -1
- package/.next/server/instrumentation.js +1 -1
- package/.next/server/instrumentation.js.nft.json +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/middleware.js +5 -5
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/preview-props.json +3 -3
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/webpack-runtime.js +1 -1
- package/.next/static/QJCtqgDKzGS2BdKABd9ch/_buildManifest.js +1 -0
- package/.next/static/chunks/2577.86c8538fbf05a8b2.js +1 -0
- package/.next/static/chunks/2716.fa561519675a3ff1.js +1 -0
- package/.next/static/chunks/2906.8a0e09bb47605cf1.js +1 -0
- package/.next/static/chunks/4673.ea36e55005c0f82f.js +1 -0
- package/.next/static/chunks/4686-4dc565817a160351.js +1 -0
- package/.next/static/chunks/4778.0d2c5d75b791d352.js +1 -0
- package/.next/static/chunks/app/_global-error/page-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/_not-found/page-2d40d1d7d916666a.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/events/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/tree/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/agent/new/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/agent/resources/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/config/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/files/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/fs/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/git/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/github/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/growth/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/health/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/models/defaults/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/models/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/pi-settings/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/plugins/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/prompts/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/remote/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/security/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/export/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/sessions/import/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/skills/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/update/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/version/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/web-auth/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/api/workspaces/route-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/app/{layout-7f64fa67ea6ce980.js → layout-50d06e2078d6ce76.js} +1 -1
- package/.next/static/chunks/app/login/{page-00dbd2f395b364d5.js → page-5e276a1eeb8867df.js} +1 -1
- package/.next/static/chunks/app/page-71f2d3b3ed864b3d.js +1 -0
- package/.next/static/chunks/main-5403f0764579e5fe.js +5 -0
- package/.next/static/chunks/{main-app-56863ace24eb152f.js → main-app-e9b53f0e1c6591b2.js} +1 -1
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-a7e260f8cc2582d7.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-f2d93969c0bcf406.js +1 -0
- package/.next/static/chunks/webpack-ffc09b5fcc8aaa6d.js +1 -0
- package/.next/static/css/7e3caf797e4cb19a.css +1 -0
- package/.next/types/app/api/agent/[id]/events/route.ts +1 -1
- package/.next/types/app/api/agent/[id]/route.ts +1 -1
- package/.next/types/app/api/agent/[id]/tree/route.ts +1 -1
- package/.next/types/app/api/agent/new/route.ts +1 -1
- package/.next/types/app/api/agent/resources/route.ts +355 -0
- package/.next/types/app/api/config/route.ts +1 -1
- package/.next/types/app/api/files/route.ts +1 -1
- package/.next/types/app/api/fs/route.ts +1 -1
- package/.next/types/app/api/git/route.ts +1 -1
- package/.next/types/app/api/github/route.ts +1 -1
- package/.next/types/app/api/growth/route.ts +1 -1
- package/.next/types/app/api/health/route.ts +1 -1
- package/.next/types/app/api/models/defaults/route.ts +1 -1
- package/.next/types/app/api/models/route.ts +1 -1
- package/.next/types/app/api/pi-settings/route.ts +1 -1
- package/.next/types/app/api/plugins/route.ts +1 -1
- package/.next/types/app/api/prompts/route.ts +1 -1
- package/.next/types/app/api/remote/route.ts +1 -1
- package/.next/types/app/api/security/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/export/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/route.ts +1 -1
- package/.next/types/app/api/sessions/import/route.ts +1 -1
- package/.next/types/app/api/sessions/route.ts +1 -1
- package/.next/types/app/api/skills/route.ts +1 -1
- package/.next/types/app/api/update/route.ts +1 -1
- package/.next/types/app/api/version/route.ts +1 -1
- package/.next/types/app/api/web-auth/route.ts +1 -1
- package/.next/types/app/api/workspaces/route.ts +1 -1
- package/.next/types/app/layout.ts +1 -1
- package/.next/types/app/login/page.ts +1 -1
- package/.next/types/app/page.ts +1 -1
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +10 -0
- package/LICENSE +1 -1
- package/README.md +1 -1
- package/bin/pi.js +0 -0
- package/bin/piweb.js +0 -0
- package/package.json +1 -1
- package/scripts/build-output.mjs +0 -0
- package/scripts/dev.mjs +0 -0
- package/scripts/entrypoint.mjs +0 -0
- package/scripts/install-build.mjs +0 -0
- package/scripts/launcher.mjs +0 -0
- package/scripts/pick-folder.ps1 +0 -0
- package/scripts/postinstall.mjs +0 -0
- package/scripts/process-runner.mjs +0 -0
- package/scripts/release.mjs +0 -0
- package/scripts/sync-file-icons.mjs +0 -0
- package/scripts/sync-provider-icons.mjs +0 -0
- package/src/app/api/agent/resources/route.ts +18 -0
- package/src/app/api/remote/route.ts +5 -7
- package/src/app/api/sessions/[id]/export/route.ts +3 -1
- package/src/app/globals.css +16 -0
- package/src/components/AppShell.tsx +68 -21
- package/src/components/ChatInput.tsx +98 -27
- package/src/components/ChatWindow.tsx +68 -11
- package/src/components/ContextMeter.tsx +24 -4
- package/src/components/ExtensionUI.tsx +9 -3
- package/src/components/FileViewer.tsx +24 -21
- package/src/components/GitPanel.tsx +449 -449
- package/src/components/GrowthTree.tsx +3 -1
- package/src/components/ImageViewer.tsx +72 -0
- package/src/components/MarkdownBlock.tsx +6 -3
- package/src/components/PreviewImage.tsx +33 -0
- package/src/components/ProjectPanel.tsx +5 -3
- package/src/components/PromptPanel.tsx +322 -313
- package/src/components/RemoteSection.tsx +2 -1
- package/src/components/SessionSidebar.tsx +22 -4
- package/src/components/SettingsPanel.tsx +2654 -2639
- package/src/components/composer/ComposerImages.tsx +1 -79
- package/src/hooks/usePiWeb.ts +47 -2
- package/src/i18n.tsx +24 -0
- package/src/lib/agent-manager.ts +275 -18
- package/src/lib/chat/skill-expansion.ts +10 -0
- package/src/lib/extension-ui.ts +25 -1
- package/src/lib/git-service.ts +291 -289
- package/src/lib/github-identity.ts +245 -245
- package/src/lib/growth-turns.ts +3 -1
- package/src/lib/session-reader.ts +25 -13
- package/src/lib/session-retention.ts +11 -8
- package/src/lib/slash-command-token.ts +14 -0
- package/src/lib/trajectory.ts +17 -6
- package/src/lib/types.ts +24 -2
- package/src/lib/workspace-store.ts +36 -1
- package/.next/diagnostics/build-diagnostics.json +0 -6
- package/.next/diagnostics/framework.json +0 -1
- package/.next/server/chunks/229.js +0 -1
- package/.next/server/chunks/393.js +0 -1
- package/.next/server/chunks/612.js +0 -1
- package/.next/server/chunks/662.js +0 -2
- package/.next/server/chunks/686.js +0 -1
- package/.next/server/chunks/802.js +0 -2
- package/.next/server/chunks/807.js +0 -1
- package/.next/server/chunks/924.js +0 -6
- package/.next/static/4snUelZTEIiQYCkB5nTW7/_buildManifest.js +0 -1
- package/.next/static/chunks/1966.1560d0f43ac9a41a.js +0 -1
- package/.next/static/chunks/2577.eebf2cf291a811ad.js +0 -1
- package/.next/static/chunks/2716.a5228b0eeedbe4c8.js +0 -1
- package/.next/static/chunks/2906.546a64377e12dfbc.js +0 -1
- package/.next/static/chunks/3899.55a0943bf5e7fec7.js +0 -1
- package/.next/static/chunks/4673.8eff281cb63e2799.js +0 -1
- package/.next/static/chunks/4686-f03275819a719fd8.js +0 -1
- package/.next/static/chunks/4778.2dae0c6a9e396326.js +0 -1
- package/.next/static/chunks/app/_global-error/page-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/_not-found/page-851dc3883a1937aa.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/events/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/tree/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/agent/new/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/config/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/files/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/fs/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/git/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/github/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/growth/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/health/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/models/defaults/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/models/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/pi-settings/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/plugins/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/prompts/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/remote/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/security/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/export/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/sessions/import/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/sessions/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/skills/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/update/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/version/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/web-auth/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/api/workspaces/route-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/app/page-0159987118376f42.js +0 -1
- package/.next/static/chunks/main-22ccebc2da4d291e.js +0 -5
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-c37b7707077f50ce.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-f977af7f858990a2.js +0 -1
- package/.next/static/chunks/webpack-c1b43c269867b64f.js +0 -1
- package/.next/static/css/93ed3daa6f3fbc35.css +0 -1
- package/.next/trace +0 -58
- package/.next/trace-build +0 -1
- /package/.next/static/{4snUelZTEIiQYCkB5nTW7 → QJCtqgDKzGS2BdKABd9ch}/_ssgManifest.js +0 -0
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { useEffect, useRef, useState } from "react";
|
|
16
16
|
import { createPortal } from "react-dom";
|
|
17
|
+
import { ImageViewer } from "@/components/ImageViewer";
|
|
17
18
|
import { useI18n } from "@/i18n";
|
|
18
19
|
import type { ImageAttachment } from "@/lib/types";
|
|
19
20
|
|
|
@@ -255,82 +256,3 @@ export function ComposerImages({ images, disabled, onRemove, onClear }: { images
|
|
|
255
256
|
</>
|
|
256
257
|
);
|
|
257
258
|
}
|
|
258
|
-
|
|
259
|
-
/** 放大预览:手机上没法用本机程序打开图片,应用内看最实在 */
|
|
260
|
-
function ImageViewer({
|
|
261
|
-
images,
|
|
262
|
-
index,
|
|
263
|
-
disabled,
|
|
264
|
-
onIndex,
|
|
265
|
-
onRemove,
|
|
266
|
-
onClose,
|
|
267
|
-
}: {
|
|
268
|
-
images: ImageAttachment[];
|
|
269
|
-
index: number;
|
|
270
|
-
disabled?: boolean;
|
|
271
|
-
onIndex: (index: number) => void;
|
|
272
|
-
onRemove: (index: number) => void;
|
|
273
|
-
onClose: () => void;
|
|
274
|
-
}) {
|
|
275
|
-
const { t } = useI18n();
|
|
276
|
-
const dialogRef = useRef<HTMLDivElement>(null);
|
|
277
|
-
const closeRef = useRef<HTMLButtonElement>(null);
|
|
278
|
-
const count = images.length;
|
|
279
|
-
const go = (delta: number) => onIndex((index + delta + count) % count);
|
|
280
|
-
|
|
281
|
-
// 打开时把焦点移进来,关掉时还给原来那个元素(还在页面上的话)
|
|
282
|
-
useEffect(() => {
|
|
283
|
-
const opener = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
284
|
-
closeRef.current?.focus();
|
|
285
|
-
return () => {
|
|
286
|
-
if (opener?.isConnected) opener.focus();
|
|
287
|
-
};
|
|
288
|
-
}, []);
|
|
289
|
-
|
|
290
|
-
// 捕获阶段处理:Esc / 方向键不再传给页面上其它监听 document 的面板;Tab 只在预览里转
|
|
291
|
-
useEffect(() => {
|
|
292
|
-
const onKey = (event: KeyboardEvent) => {
|
|
293
|
-
if (event.key === "Escape") onClose();
|
|
294
|
-
else if (event.key === "ArrowLeft" && count > 1) go(-1);
|
|
295
|
-
else if (event.key === "ArrowRight" && count > 1) go(1);
|
|
296
|
-
else if (event.key === "Tab") {
|
|
297
|
-
const focusable = [...(dialogRef.current?.querySelectorAll<HTMLElement>("button:not(:disabled)") ?? [])];
|
|
298
|
-
if (!focusable.length) return;
|
|
299
|
-
const at = focusable.indexOf(document.activeElement as HTMLElement);
|
|
300
|
-
const next = event.shiftKey ? (at <= 0 ? focusable.length - 1 : at - 1) : at === focusable.length - 1 ? 0 : at + 1;
|
|
301
|
-
focusable[next].focus();
|
|
302
|
-
} else return;
|
|
303
|
-
event.preventDefault();
|
|
304
|
-
event.stopPropagation();
|
|
305
|
-
};
|
|
306
|
-
document.addEventListener("keydown", onKey, true);
|
|
307
|
-
return () => document.removeEventListener("keydown", onKey, true);
|
|
308
|
-
// onClose / onIndex 来自父组件的 setState 包装,语义不变;只随张数和当前张重绑
|
|
309
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
310
|
-
}, [count, index]);
|
|
311
|
-
|
|
312
|
-
return (
|
|
313
|
-
<div ref={dialogRef} className="pw-lightbox" role="dialog" aria-modal="true" aria-label={t.imageViewer} onClick={onClose}>
|
|
314
|
-
<div className="pw-lightbox-bar" onClick={(event) => event.stopPropagation()}>
|
|
315
|
-
<span className="pw-lightbox-count">{count > 1 ? `${index + 1} / ${count}` : ""}</span>
|
|
316
|
-
<button type="button" className="pw-lightbox-btn" disabled={disabled} onClick={() => onRemove(index)}>
|
|
317
|
-
{t.delete}
|
|
318
|
-
</button>
|
|
319
|
-
<button ref={closeRef} type="button" className="pw-lightbox-btn" aria-label={t.close} onClick={onClose}>
|
|
320
|
-
✕
|
|
321
|
-
</button>
|
|
322
|
-
</div>
|
|
323
|
-
<img src={srcOf(images[index])} alt="" className="pw-lightbox-image" onClick={(event) => event.stopPropagation()} />
|
|
324
|
-
{count > 1 ? (
|
|
325
|
-
<>
|
|
326
|
-
<button type="button" className="pw-lightbox-nav" data-side="prev" aria-label={t.imagePrev} onClick={(event) => { event.stopPropagation(); go(-1); }}>
|
|
327
|
-
‹
|
|
328
|
-
</button>
|
|
329
|
-
<button type="button" className="pw-lightbox-nav" data-side="next" aria-label={t.imageNext} onClick={(event) => { event.stopPropagation(); go(1); }}>
|
|
330
|
-
›
|
|
331
|
-
</button>
|
|
332
|
-
</>
|
|
333
|
-
) : null}
|
|
334
|
-
</div>
|
|
335
|
-
);
|
|
336
|
-
}
|
package/src/hooks/usePiWeb.ts
CHANGED
|
@@ -44,6 +44,17 @@ export interface ExtensionDialog {
|
|
|
44
44
|
ts: number;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
/** 右下角的短通知:扩展 notify,或 PiWeb 自己的提示(带 code,渲染时按语言取文案) */
|
|
48
|
+
export interface PiWebNotice {
|
|
49
|
+
id: string;
|
|
50
|
+
message: string;
|
|
51
|
+
type: "info" | "warning" | "error";
|
|
52
|
+
ts: number;
|
|
53
|
+
/** external_reload:终端写了这个会话,已从磁盘重载;external_write:正在跑时终端也在写 */
|
|
54
|
+
code?: "external_reload" | "external_write";
|
|
55
|
+
count?: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
47
58
|
export interface PiWebState {
|
|
48
59
|
snapshot: WebSnapshot | null;
|
|
49
60
|
messages: WebMessage[];
|
|
@@ -57,7 +68,7 @@ export interface PiWebState {
|
|
|
57
68
|
/** 扩展对话框队列(按到达顺序,一次显示一个) */
|
|
58
69
|
extensionDialogs: ExtensionDialog[];
|
|
59
70
|
/** 扩展通知(notify),显示几秒后消失 */
|
|
60
|
-
extensionNotices:
|
|
71
|
+
extensionNotices: PiWebNotice[];
|
|
61
72
|
/** 扩展设的页脚状态文本(setStatus) */
|
|
62
73
|
extensionStatuses: Record<string, string>;
|
|
63
74
|
/** 扩展覆盖的「工作中」文案(setWorkingMessage) */
|
|
@@ -176,6 +187,17 @@ export const foldPiWebEvent = (state: PiWebState, evt: WebEvent): PiWebState =>
|
|
|
176
187
|
return s;
|
|
177
188
|
case "compaction":
|
|
178
189
|
s.compaction = { phase: evt.phase, errorMessage: evt.errorMessage, ts: evt.ts };
|
|
190
|
+
if (evt.marker) {
|
|
191
|
+
// 已显示的消息全部保留;分隔卡插到保留下来的第一条前面,和刷新后的快照位置一致
|
|
192
|
+
const marker = evt.marker;
|
|
193
|
+
const msgs = s.messages.filter((message) => !(marker.id && message.id === marker.id));
|
|
194
|
+
const at = msgs.findIndex((message) =>
|
|
195
|
+
(!!evt.beforeId && message.id === evt.beforeId) ||
|
|
196
|
+
(!!evt.beforeStreamId && message.streamId === evt.beforeStreamId));
|
|
197
|
+
if (at >= 0) msgs.splice(at, 0, marker);
|
|
198
|
+
else msgs.push(marker);
|
|
199
|
+
s.messages = msgs;
|
|
200
|
+
}
|
|
179
201
|
return s;
|
|
180
202
|
case "traj": {
|
|
181
203
|
if (s.snapshot) {
|
|
@@ -236,6 +258,12 @@ export const foldPiWebEvent = (state: PiWebState, evt: WebEvent): PiWebState =>
|
|
|
236
258
|
case "extension_ui_resolved":
|
|
237
259
|
s.extensionDialogs = s.extensionDialogs.filter((dialog) => dialog.id !== evt.id);
|
|
238
260
|
return s;
|
|
261
|
+
case "external_write":
|
|
262
|
+
s.extensionNotices = [
|
|
263
|
+
...s.extensionNotices.filter((notice) => notice.code !== "external_write").slice(-4),
|
|
264
|
+
{ id: `external-write-${evt.ts}`, message: "", type: "warning", ts: evt.ts, code: "external_write", count: evt.entries },
|
|
265
|
+
];
|
|
266
|
+
return s;
|
|
239
267
|
case "status":
|
|
240
268
|
if (s.snapshot) s.snapshot = { ...s.snapshot, isStreaming: evt.isStreaming };
|
|
241
269
|
if (!evt.isStreaming) {
|
|
@@ -366,6 +394,7 @@ export function usePiWeb() {
|
|
|
366
394
|
const [snapshotEpoch, setSnapshotEpoch] = useState(0);
|
|
367
395
|
const esRef = useRef<{ close(): void } | null>(null);
|
|
368
396
|
const promptRequestsRef = useRef(new Set<string>());
|
|
397
|
+
const shownReloadsRef = useRef(new Set<string>());
|
|
369
398
|
const presetRestoreAttemptRef = useRef<string | null>(null);
|
|
370
399
|
const presetRestorePromiseRef = useRef<Promise<void> | null>(null);
|
|
371
400
|
const activeSessionRef = useRef(currentId);
|
|
@@ -689,6 +718,14 @@ export function usePiWeb() {
|
|
|
689
718
|
: { ...emptyState(savedToolPreset()), connected: false });
|
|
690
719
|
let retryDelayMs = 2000;
|
|
691
720
|
const eventsUrl = `/api/agent/${currentId}/events`;
|
|
721
|
+
// 同一次重载既有 external_reload 事件、又会出现在随后若干快照里:按重载时间只提示一次
|
|
722
|
+
const reloadNotice = (reload?: { entries: number; at: number }): PiWebNotice | null => {
|
|
723
|
+
if (!reload) return null;
|
|
724
|
+
const key = `${currentId}:${reload.at}`;
|
|
725
|
+
if (shownReloadsRef.current.has(key)) return null;
|
|
726
|
+
shownReloadsRef.current.add(key);
|
|
727
|
+
return { id: `external-reload-${reload.at}`, message: "", type: "info", ts: Date.now(), code: "external_reload", count: reload.entries };
|
|
728
|
+
};
|
|
692
729
|
const connect = () => {
|
|
693
730
|
// 流式事件按帧合并:token 速率再高也只每 16ms 渲染一次(见 event-batcher)
|
|
694
731
|
const batcher = createEventBatcher<WebEvent>({
|
|
@@ -707,11 +744,19 @@ export function usePiWeb() {
|
|
|
707
744
|
// 单帧损坏(代理截断等)只丢弃该帧,不能让 EventSource 回调抛异常
|
|
708
745
|
return;
|
|
709
746
|
}
|
|
747
|
+
if (parsed.type === "external_reload") {
|
|
748
|
+
// 服务端发现终端写过这个会话、已从磁盘重载,旧流随即关闭:不等 EventSource 2 秒后自己重连,马上换新连接拿快照
|
|
749
|
+
const notice = reloadNotice(parsed);
|
|
750
|
+
if (notice) setState((s) => ({ ...s, extensionNotices: [...s.extensionNotices.slice(-4), notice] }));
|
|
751
|
+
setResyncNonce((n) => n + 1);
|
|
752
|
+
return;
|
|
753
|
+
}
|
|
710
754
|
if (parsed.type === "snapshot" && parsed.snapshot) {
|
|
711
755
|
// 快照是权威状态:之前缓冲的增量已经过时,直接丢弃
|
|
712
756
|
batcher.cancel();
|
|
713
757
|
retryDelayMs = 2000;
|
|
714
758
|
const snap = parsed.snapshot as WebSnapshot;
|
|
759
|
+
const notice = reloadNotice(snap.externalReload);
|
|
715
760
|
setSnapshotEpoch((epoch) => epoch + 1);
|
|
716
761
|
setState((prev) => ({
|
|
717
762
|
snapshot: snap,
|
|
@@ -724,7 +769,7 @@ export function usePiWeb() {
|
|
|
724
769
|
retryNotice: null,
|
|
725
770
|
// 服务器当前 pending 集合是权威来源,刷新可恢复、已答请求不能复活。
|
|
726
771
|
extensionDialogs: extensionDialogsFromSnapshot(snap, prev.extensionDialogs),
|
|
727
|
-
extensionNotices: prev.extensionNotices,
|
|
772
|
+
extensionNotices: notice ? [...prev.extensionNotices.slice(-4), notice] : prev.extensionNotices,
|
|
728
773
|
extensionStatuses: snap.extensionStatuses ?? {},
|
|
729
774
|
workingMessage: null,
|
|
730
775
|
// 重连的快照不带生长账本;连接期间已收到的步保留,useGrowth 会按 seq 与拉取结果去重
|
package/src/i18n.tsx
CHANGED
|
@@ -34,6 +34,15 @@ const zh = {
|
|
|
34
34
|
compacting: "正在压缩上下文…",
|
|
35
35
|
compactionComplete: "上下文压缩完成",
|
|
36
36
|
compactionFailed: "上下文压缩失败",
|
|
37
|
+
compactedTitle: "上下文已压缩",
|
|
38
|
+
compactedTitleTokens: "上下文已压缩 · 压缩前约 {tokens} tokens",
|
|
39
|
+
compactedHint: "以上内容模型只看得到摘要",
|
|
40
|
+
branchSummaryTitle: "分支摘要",
|
|
41
|
+
branchSummaryHint: "切换分支时,离开的那条分支以摘要形式发给模型",
|
|
42
|
+
showSummary: "查看摘要",
|
|
43
|
+
hideSummary: "收起摘要",
|
|
44
|
+
externalSessionReloaded: "终端在这个会话里写了 {n} 条新内容,已重新载入",
|
|
45
|
+
externalSessionWriting: "终端也在写这个会话({n} 条)。两边同时写会分叉,这一轮结束后自动重新载入",
|
|
37
46
|
pickWorkspaceFirst: "请先选择工作区",
|
|
38
47
|
capacityFields: "容量",
|
|
39
48
|
contextWindowLabel: "上下文窗口",
|
|
@@ -215,6 +224,8 @@ const zh = {
|
|
|
215
224
|
archiveSession: "归档会话",
|
|
216
225
|
unarchiveSession: "取消归档",
|
|
217
226
|
archivedSessions: "已归档",
|
|
227
|
+
archiveRetentionHint: "归档满 30 天自动删除",
|
|
228
|
+
archiveRetentionDetail: "归档的会话从归档那天起保留 30 天,之后自动删除;归档后又用过的,从最后一次使用起算。打开中的会话不会被删。",
|
|
218
229
|
deleteAllSessions: "删除全部会话",
|
|
219
230
|
deleteAllConfirm: "删除此工作区的全部会话?不可恢复。",
|
|
220
231
|
contextInject: "上下文注入",
|
|
@@ -645,6 +656,7 @@ const zh = {
|
|
|
645
656
|
uninstall: "卸载",
|
|
646
657
|
confirmUninstallPackage: "确定卸载“{source}”吗?",
|
|
647
658
|
update: "更新",
|
|
659
|
+
updateNeedsEnable: "已停用的插件要先启用才能更新",
|
|
648
660
|
pluginConfig: "插件配置",
|
|
649
661
|
pluginList: "插件列表",
|
|
650
662
|
pluginPageDesc: "配置和查看本部署已安装的插件。",
|
|
@@ -772,6 +784,15 @@ const en: Dict = {
|
|
|
772
784
|
compacting: "Compacting context…",
|
|
773
785
|
compactionComplete: "Context compaction complete",
|
|
774
786
|
compactionFailed: "Context compaction failed",
|
|
787
|
+
compactedTitle: "Context compacted",
|
|
788
|
+
compactedTitleTokens: "Context compacted · about {tokens} tokens before",
|
|
789
|
+
compactedHint: "The model only sees a summary of everything above",
|
|
790
|
+
branchSummaryTitle: "Branch summary",
|
|
791
|
+
branchSummaryHint: "The branch you left is sent to the model as a summary",
|
|
792
|
+
showSummary: "Show summary",
|
|
793
|
+
hideSummary: "Hide summary",
|
|
794
|
+
externalSessionReloaded: "The terminal added {n} new entries to this session — reloaded",
|
|
795
|
+
externalSessionWriting: "The terminal is also writing to this session ({n} entries). Writing from both sides forks it; it reloads after this turn",
|
|
775
796
|
pickWorkspaceFirst: "Select a workspace first",
|
|
776
797
|
capacityFields: "Capacities",
|
|
777
798
|
contextWindowLabel: "Context window",
|
|
@@ -953,6 +974,8 @@ const en: Dict = {
|
|
|
953
974
|
archiveSession: "Archive session",
|
|
954
975
|
unarchiveSession: "Unarchive",
|
|
955
976
|
archivedSessions: "Archived",
|
|
977
|
+
archiveRetentionHint: "Deleted 30 days after archiving",
|
|
978
|
+
archiveRetentionDetail: "Archived sessions are kept for 30 days from the day they were archived, then deleted automatically. If you use one after archiving, the 30 days restart from its last use. Open sessions are never deleted.",
|
|
956
979
|
deleteAllSessions: "Delete all sessions",
|
|
957
980
|
deleteAllConfirm: "Delete ALL sessions in this workspace? This cannot be undone.",
|
|
958
981
|
contextInject: "Context",
|
|
@@ -1376,6 +1399,7 @@ const en: Dict = {
|
|
|
1376
1399
|
uninstall: "Uninstall",
|
|
1377
1400
|
confirmUninstallPackage: "Uninstall \"{source}\"?",
|
|
1378
1401
|
update: "Update",
|
|
1402
|
+
updateNeedsEnable: "Enable this plugin before updating it",
|
|
1379
1403
|
pluginConfig: "Plugin config",
|
|
1380
1404
|
pluginList: "Plugin list",
|
|
1381
1405
|
pluginPageDesc: "Configure and view installed plugins for this deployment.",
|