@baique/pi-web-sky 0.1.55 → 0.1.57
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 +8 -4
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +2 -2
- package/.next/react-loadable-manifest.json +2 -2
- package/.next/required-server-files.js +3 -2
- package/.next/required-server-files.json +3 -2
- package/.next/routes-manifest.json +28 -0
- package/.next/server/app/_global-error/page.js +2 -2
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +4 -3
- package/.next/server/app/_not-found.segments/_full.segment.rsc +4 -3
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +4 -3
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/api/agent/[id]/bash-output/route.js +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]/route.js +1 -1
- package/.next/server/app/api/agent/[id]/route.js.nft.json +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/running/route.js +1 -1
- package/.next/server/app/api/agent/running/route.js.nft.json +1 -1
- package/.next/server/app/api/app-update/route.js +1 -1
- package/.next/server/app/api/auth/all-providers/route.js +1 -1
- package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/login/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/providers/route.js +1 -1
- package/.next/server/app/api/board-assets/[...path]/route.js +2 -2
- package/.next/server/app/api/board-assets/route.js +2 -2
- package/.next/server/app/api/boards/[id]/add-session/route.js +1 -0
- package/.next/server/app/api/boards/[id]/add-session/route.js.nft.json +1 -0
- package/.next/server/app/api/boards/[id]/add-session/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/boards/[id]/reconcile/route.js +1 -1
- package/.next/server/app/api/boards/[id]/route.js +1 -1
- package/.next/server/app/api/boards/reorder/route.js +2 -2
- package/.next/server/app/api/boards/route.js +1 -1
- package/.next/server/app/api/cwd/browse/route.js +1 -1
- package/.next/server/app/api/cwd/validate/route.js +2 -2
- package/.next/server/app/api/default-cwd/route.js +2 -2
- package/.next/server/app/api/file-index/route.js +2 -2
- package/.next/server/app/api/files/[...path]/route.js +3 -3
- package/.next/server/app/api/git/diff/route.js +1 -1
- package/.next/server/app/api/git/status/route.js +1 -1
- package/.next/server/app/api/home/route.js +1 -1
- package/.next/server/app/api/mcp/route.js +2 -2
- package/.next/server/app/api/models/route.js +2 -2
- package/.next/server/app/api/models-config/catalog/route.js +1 -1
- package/.next/server/app/api/models-config/discover/route.js +1 -1
- package/.next/server/app/api/models-config/route.js +1 -1
- package/.next/server/app/api/models-config/test/route.js +1 -1
- package/.next/server/app/api/plugins/route.js +2 -2
- package/.next/server/app/api/project-trust/route.js +1 -1
- package/.next/server/app/api/project-trust/route.js.nft.json +1 -1
- package/.next/server/app/api/quota/route.js +1 -1
- package/.next/server/app/api/search/route.js +3 -3
- package/.next/server/app/api/sessions/[id]/auto-name/route.js +2 -2
- package/.next/server/app/api/sessions/[id]/auto-name/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/context/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +2 -2
- package/.next/server/app/api/sessions/[id]/export/route.js +2 -2
- package/.next/server/app/api/sessions/[id]/minimap/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/minimap/route.js.nft.json +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]/state/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/state/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/todos/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/todos/route.js.nft.json +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/summary/route.js +2 -2
- package/.next/server/app/api/skills/check/route.js +1 -1
- package/.next/server/app/api/skills/install/route.js +2 -2
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/search/route.js +1 -1
- package/.next/server/app/api/skills/update/route.js +1 -1
- package/.next/server/app/api/subagents/[id]/route.js +1 -0
- package/.next/server/app/api/subagents/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/subagents/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/subagents/profiles/route.js +30 -0
- package/.next/server/app/api/subagents/profiles/route.js.nft.json +1 -0
- package/.next/server/app/api/subagents/profiles/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/subagents/settings/route.js +1 -0
- package/.next/server/app/api/subagents/settings/route.js.nft.json +1 -0
- package/.next/server/app/api/subagents/settings/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/task-card-questions/[id]/answer/route.js +2 -2
- package/.next/server/app/api/task-card-questions/route.js +2 -2
- package/.next/server/app/api/task-cards/[id]/route.js +1 -1
- package/.next/server/app/api/task-cards/route.js +1 -1
- package/.next/server/app/api/task-cards/unbind/route.js +3 -3
- package/.next/server/app/api/task-scheduler/status/route.js +1 -1
- package/.next/server/app/api/task-scheduler/status/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[id]/assign-session/route.js +2 -12
- package/.next/server/app/api/tasks/[id]/board/route.js +1 -1
- package/.next/server/app/api/tasks/[id]/route.js +1 -1
- package/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/reorder/route.js +2 -12
- package/.next/server/app/api/tasks/route.js +2 -12
- package/.next/server/app/api/terminal/[id]/events/route.js +2 -2
- package/.next/server/app/api/terminal/[id]/route.js +2 -2
- package/.next/server/app/api/terminal/route.js +2 -2
- package/.next/server/app/api/worktrees/route.js +2 -2
- package/.next/server/app/api/yjs-version/route.js +1 -1
- package/.next/server/app/favicon.ico/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +6 -5
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +6 -5
- package/.next/server/app/index.segments/_full.segment.rsc +6 -5
- package/.next/server/app/index.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/manifest.webmanifest/route.js +2 -2
- package/.next/server/app/page.js +175 -8
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +8 -4
- package/.next/server/chunks/1937.js +14 -13
- package/.next/server/chunks/2524.js +2 -2
- package/.next/server/chunks/3379.js +1 -1
- package/.next/server/chunks/3500.js +1 -1
- package/.next/server/chunks/402.js +28 -7
- package/.next/server/chunks/426.js +14 -0
- package/.next/server/chunks/4367.js +1 -1
- package/.next/server/chunks/4457.js +3 -13
- package/.next/server/chunks/4980.js +1 -1
- package/.next/server/chunks/542.js +23 -4
- package/.next/server/chunks/5794.js +2 -2
- package/.next/server/chunks/5940.js +1 -1
- package/.next/server/chunks/6337.js +1 -1
- package/.next/server/chunks/6429.js +15 -2
- package/.next/server/chunks/6525.js +25 -4
- package/.next/server/chunks/6583.js +12 -11
- package/.next/server/chunks/7048.js +6 -0
- package/.next/server/instrumentation.js +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 +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/static/MPBMmQqmDG8zo8tM_bkDy/_buildManifest.js +1 -0
- package/.next/static/chunks/752.bafff304e6b00987.js +1 -0
- package/.next/static/chunks/8088.39866dc5f1d15868.js +1 -0
- package/.next/static/chunks/app/_global-error/page-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/bash-output/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/events/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/agent/new/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/agent/running/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/app-update/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/auth/all-providers/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/auth/api-key/[provider]/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/auth/login/[provider]/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/[provider]/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/auth/providers/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/board-assets/[...path]/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/board-assets/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/boards/[id]/add-session/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/boards/[id]/reconcile/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/boards/[id]/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/boards/reorder/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/boards/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/cwd/browse/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/cwd/validate/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/default-cwd/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/file-index/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/files/[...path]/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/git/diff/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/git/status/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/home/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/mcp/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/models/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/models-config/catalog/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/models-config/discover/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/models-config/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/models-config/test/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/plugins/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/project-trust/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/quota/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/search/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/context/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/export/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/minimap/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/state/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/todos/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/sessions/summary/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/skills/check/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/skills/install/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/skills/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/skills/search/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/skills/update/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/subagents/[id]/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/subagents/profiles/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/subagents/settings/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/task-card-questions/[id]/answer/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/task-card-questions/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/task-cards/[id]/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/task-cards/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/task-cards/unbind/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/task-scheduler/status/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/tasks/[id]/assign-session/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/tasks/[id]/board/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/tasks/[id]/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/tasks/reorder/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/tasks/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/terminal/[id]/events/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/terminal/[id]/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/terminal/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/api/yjs-version/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/layout-fae2b226b3c78448.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/app/page-d5af3bd535589daf.js +256 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-ad6e695deb9de65c.js +1 -0
- package/.next/static/chunks/{webpack-b0effde51c1651b8.js → webpack-1ce35e1249cfd931.js} +1 -1
- package/.next/static/css/bb9361c7f832a89d.css +1 -0
- package/.next/static/css/c7d127e07b1a786c.css +1 -0
- package/.next/trace +8 -7
- package/.next/trace-build +1 -1
- package/.next/types/app/api/boards/[id]/add-session/route.ts +353 -0
- package/.next/types/app/api/subagents/[id]/route.ts +353 -0
- package/.next/types/app/api/subagents/profiles/route.ts +353 -0
- package/.next/types/app/api/subagents/settings/route.ts +353 -0
- package/.next/types/routes.d.ts +5 -1
- package/.next/types/validator.ts +36 -0
- package/lib/api-types.ts +10 -0
- package/lib/board-reconcile.test.mjs +46 -8
- package/lib/board-reconcile.ts +57 -1
- package/lib/board-store.test.mjs +2 -2
- package/lib/chat-lazy-load.test.mjs +0 -62
- package/lib/chat-lazy-load.ts +0 -13
- package/lib/chat-only.ts +23 -0
- package/lib/draft-stash.ts +4 -5
- package/lib/file-types.ts +16 -1
- package/lib/i18n/messages/en.ts +91 -0
- package/lib/i18n/messages/zh-CN.ts +91 -0
- package/lib/id.test.mjs +38 -0
- package/lib/id.ts +17 -0
- package/lib/ime-guard.test.mjs +52 -0
- package/lib/ime-guard.ts +54 -0
- package/lib/message-text.ts +24 -0
- package/lib/models-cache.ts +1 -1
- package/lib/pi-types.ts +19 -1
- package/lib/pin-store.ts +85 -0
- package/lib/powershell-settings.ts +106 -0
- package/lib/quoted-selection.ts +4 -0
- package/lib/rpc-manager.activity.test.mjs +223 -0
- package/lib/rpc-manager.test.mjs +22 -0
- package/lib/rpc-manager.title.test.mjs +152 -0
- package/lib/rpc-manager.ts +301 -28
- package/lib/session-activity.test.mjs +123 -0
- package/lib/session-activity.ts +77 -0
- package/lib/session-delete.test.mjs +45 -41
- package/lib/session-delete.ts +8 -34
- package/lib/session-family.test.mjs +49 -0
- package/lib/session-family.ts +80 -0
- package/lib/session-index-scanner.test.mjs +364 -2
- package/lib/session-index-scanner.ts +199 -55
- package/lib/session-reader.noscan.test.mjs +371 -0
- package/lib/session-reader.project.test.mjs +30 -52
- package/lib/session-reader.test.mjs +2 -65
- package/lib/session-reader.ts +177 -213
- package/lib/session-scanner.test.mjs +151 -38
- package/lib/session-scanner.ts +140 -61
- package/lib/session-search.ts +6 -5
- package/lib/session-time-group.test.mjs +38 -0
- package/lib/session-time-group.ts +55 -0
- package/lib/settings-navigation.ts +124 -0
- package/lib/sqlite-db.test.mjs +26 -0
- package/lib/sqlite-db.ts +10 -1
- package/lib/subagent-extension.test.mjs +424 -0
- package/lib/subagent-extension.ts +309 -0
- package/lib/subagent-input.test.mjs +63 -0
- package/lib/subagent-input.ts +71 -0
- package/lib/subagent-profile-precedence.ts +20 -0
- package/lib/subagent-prompt.test.mjs +64 -0
- package/lib/subagent-prompt.ts +31 -0
- package/lib/subagent-queue.test.mjs +35 -0
- package/lib/subagent-queue.ts +74 -0
- package/lib/subagent-runtime.test.mjs +150 -0
- package/lib/subagent-runtime.ts +629 -0
- package/lib/subagent-session-title.test.mjs +120 -0
- package/lib/subagent-settings.test.mjs +50 -0
- package/lib/subagent-settings.ts +93 -0
- package/lib/subagents.test.mjs +601 -0
- package/lib/subagents.ts +602 -0
- package/lib/task-scheduler.test.mjs +27 -0
- package/lib/task-scheduler.ts +8 -1
- package/lib/task-store.activity.test.mjs +141 -0
- package/lib/task-store.meta-row.test.mjs +25 -5
- package/lib/task-store.partial-row.test.mjs +198 -0
- package/lib/task-store.subtree.test.mjs +172 -0
- package/lib/task-store.test.mjs +46 -20
- package/lib/task-store.ts +344 -68
- package/lib/tool-presets.ts +4 -0
- package/lib/types.ts +19 -0
- package/lib/worktree-isolation.test.mjs +51 -0
- package/next.config.ts +3 -1
- package/package.json +1 -1
- package/.next/static/bsW3fla0-BlBHVMKtAM5I/_buildManifest.js +0 -1
- package/.next/static/chunks/752.0ad92735d5f38143.js +0 -1
- package/.next/static/chunks/8088.53d9cdaf15634d4b.js +0 -1
- package/.next/static/chunks/app/_global-error/page-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/bash-output/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/events/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/agent/new/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/agent/running/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/app-update/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/auth/all-providers/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/auth/api-key/[provider]/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/auth/login/[provider]/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/[provider]/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/auth/providers/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/board-assets/[...path]/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/board-assets/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/boards/[id]/reconcile/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/boards/[id]/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/boards/reorder/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/boards/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/cwd/browse/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/cwd/validate/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/default-cwd/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/file-index/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/files/[...path]/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/git/diff/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/git/status/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/home/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/mcp/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/models/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/models-config/catalog/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/models-config/discover/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/models-config/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/models-config/test/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/plugins/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/project-trust/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/quota/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/search/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/context/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/export/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/minimap/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/state/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/todos/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/sessions/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/sessions/summary/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/skills/check/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/skills/install/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/skills/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/skills/search/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/skills/update/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/task-card-questions/[id]/answer/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/task-card-questions/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/task-cards/[id]/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/task-cards/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/task-cards/unbind/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/task-scheduler/status/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/tasks/[id]/assign-session/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/tasks/[id]/board/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/tasks/[id]/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/tasks/reorder/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/tasks/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/terminal/[id]/events/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/terminal/[id]/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/terminal/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/api/yjs-version/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/layout-dace09825b2d3857.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/app/page-64b9f4b3567a2f73.js +0 -89
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-2d5f6296c7e693c6.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-2d5f6296c7e693c6.js +0 -1
- package/.next/static/css/fd25673802257262.css +0 -1
- package/lib/extension-command.test.mjs +0 -63
- package/lib/extension-command.ts +0 -81
- package/lib/subagent-widget.test.mjs +0 -87
- package/lib/subagent-widget.ts +0 -109
- /package/.next/static/{bsW3fla0-BlBHVMKtAM5I → MPBMmQqmDG8zo8tM_bkDy}/_ssgManifest.js +0 -0
|
@@ -76,65 +76,3 @@ test("treats only the real message tail as live-follow attached", async () => {
|
|
|
76
76
|
assert.equal(getLiveFollowAttached(false, 400, 400, 600, 1096), false);
|
|
77
77
|
assert.equal(getLiveFollowAttached(false, 391, 392, 600, 1000), true);
|
|
78
78
|
});
|
|
79
|
-
|
|
80
|
-
test("prompt anchor spacer uses the rendered content end", async () => {
|
|
81
|
-
const { getPromptAnchorSpacerHeight } = await loadSubject();
|
|
82
|
-
const initial = getPromptAnchorSpacerHeight(400, 700, 600);
|
|
83
|
-
const afterRender = getPromptAnchorSpacerHeight(400, 700, 600);
|
|
84
|
-
|
|
85
|
-
assert.equal(initial, 300);
|
|
86
|
-
assert.equal(afterRender, initial);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
test("prompt anchor spacer includes the viewport deficit for short conversations", async () => {
|
|
90
|
-
const { getPromptAnchorSpacerHeight } = await loadSubject();
|
|
91
|
-
const targetTop = 168;
|
|
92
|
-
const clientHeight = 579;
|
|
93
|
-
|
|
94
|
-
let contentHeight = 411;
|
|
95
|
-
let spacerHeight = getPromptAnchorSpacerHeight(targetTop, contentHeight, clientHeight);
|
|
96
|
-
assert.equal(spacerHeight, 336);
|
|
97
|
-
assert.equal(contentHeight + spacerHeight - clientHeight, targetTop);
|
|
98
|
-
|
|
99
|
-
contentHeight += 24;
|
|
100
|
-
spacerHeight = getPromptAnchorSpacerHeight(targetTop, contentHeight, clientHeight);
|
|
101
|
-
assert.equal(spacerHeight, 312);
|
|
102
|
-
assert.equal(contentHeight + spacerHeight - clientHeight, targetTop);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
test("prompt anchor spacer clamps at zero once content can reach the target", async () => {
|
|
106
|
-
const { getPromptAnchorSpacerHeight } = await loadSubject();
|
|
107
|
-
assert.equal(getPromptAnchorSpacerHeight(100, 750, 600), 0);
|
|
108
|
-
assert.equal(getPromptAnchorSpacerHeight(-20, 200, 600), 0);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
test("prompt anchor spacer rounds fractional layout measurements up", async () => {
|
|
112
|
-
const { getPromptAnchorSpacerHeight } = await loadSubject();
|
|
113
|
-
assert.equal(getPromptAnchorSpacerHeight(400.25, 700, 600), 301);
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
test("streaming content consumes the prompt anchor before advancing the tail", async () => {
|
|
117
|
-
const { getPromptAnchorSpacerHeight } = await loadSubject();
|
|
118
|
-
const targetTop = 400;
|
|
119
|
-
const clientHeight = 600;
|
|
120
|
-
|
|
121
|
-
let contentHeight = 700;
|
|
122
|
-
let spacerHeight = getPromptAnchorSpacerHeight(targetTop, contentHeight, clientHeight);
|
|
123
|
-
assert.equal(spacerHeight, 300);
|
|
124
|
-
assert.equal(contentHeight + spacerHeight - clientHeight, targetTop);
|
|
125
|
-
|
|
126
|
-
contentHeight += 120;
|
|
127
|
-
spacerHeight = getPromptAnchorSpacerHeight(targetTop, contentHeight, clientHeight);
|
|
128
|
-
assert.equal(spacerHeight, 180);
|
|
129
|
-
assert.equal(contentHeight + spacerHeight - clientHeight, targetTop);
|
|
130
|
-
|
|
131
|
-
contentHeight += 180;
|
|
132
|
-
spacerHeight = getPromptAnchorSpacerHeight(targetTop, contentHeight, clientHeight);
|
|
133
|
-
assert.equal(spacerHeight, 0);
|
|
134
|
-
assert.equal(contentHeight - clientHeight, targetTop);
|
|
135
|
-
|
|
136
|
-
contentHeight += 40;
|
|
137
|
-
spacerHeight = getPromptAnchorSpacerHeight(targetTop, contentHeight, clientHeight);
|
|
138
|
-
assert.equal(spacerHeight, 0);
|
|
139
|
-
assert.equal(contentHeight - clientHeight, targetTop + 40);
|
|
140
|
-
});
|
package/lib/chat-lazy-load.ts
CHANGED
|
@@ -49,16 +49,3 @@ export function getLiveFollowAttached(
|
|
|
49
49
|
) return true;
|
|
50
50
|
return wasAttached;
|
|
51
51
|
}
|
|
52
|
-
|
|
53
|
-
export function getPromptAnchorSpacerHeight(
|
|
54
|
-
targetTop: number,
|
|
55
|
-
contentEnd: number,
|
|
56
|
-
clientHeight: number,
|
|
57
|
-
): number {
|
|
58
|
-
const clampedTargetTop = Math.max(0, targetTop);
|
|
59
|
-
if (clampedTargetTop === 0) return 0;
|
|
60
|
-
|
|
61
|
-
return Math.max(0, Math.ceil(
|
|
62
|
-
clampedTargetTop + clientHeight - Math.max(0, contentEnd),
|
|
63
|
-
));
|
|
64
|
-
}
|
package/lib/chat-only.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface ContextFileContent {
|
|
2
|
+
path: string;
|
|
3
|
+
content: string;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export const CHAT_ONLY_RESOURCE_LOADER_OPTIONS = {
|
|
7
|
+
noExtensions: true,
|
|
8
|
+
noSkills: true,
|
|
9
|
+
noPromptTemplates: true,
|
|
10
|
+
noThemes: true,
|
|
11
|
+
noContextFiles: false,
|
|
12
|
+
// Truthy placeholders prevent the loader from discovering configured prompt
|
|
13
|
+
// files. The overrides ensure neither placeholder participates in the prompt.
|
|
14
|
+
systemPrompt: " ",
|
|
15
|
+
appendSystemPrompt: [" "],
|
|
16
|
+
systemPromptOverride: () => undefined,
|
|
17
|
+
appendSystemPromptOverride: () => [],
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/** Preserve Pi's discovery order and include only the context-file contents. */
|
|
21
|
+
export function contextFilesSystemPrompt(files: readonly ContextFileContent[]): string {
|
|
22
|
+
return files.map((file) => file.content).join("\n\n");
|
|
23
|
+
}
|
package/lib/draft-stash.ts
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// 跨会话、浏览器全局存在;内容只增不自动删,删除仅靠手动。
|
|
3
3
|
// 与 lib/draft-store.ts(会话级单条输入框草稿)完全独立,互不干扰。
|
|
4
4
|
|
|
5
|
+
import { newId } from "./id";
|
|
6
|
+
|
|
5
7
|
export interface DraftItem {
|
|
6
8
|
id: string;
|
|
7
9
|
content: string;
|
|
@@ -24,12 +26,9 @@ function isDraftItem(value: unknown): value is DraftItem {
|
|
|
24
26
|
);
|
|
25
27
|
}
|
|
26
28
|
|
|
27
|
-
/** 生成草稿 id
|
|
29
|
+
/** 生成草稿 id(统一走 lib/id 的兜底实现,安全上下文外也能用) */
|
|
28
30
|
export function newDraftId(): string {
|
|
29
|
-
|
|
30
|
-
return crypto.randomUUID();
|
|
31
|
-
}
|
|
32
|
-
return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
31
|
+
return newId();
|
|
33
32
|
}
|
|
34
33
|
|
|
35
34
|
/** 读取全部草稿,按最近活动(updatedAt)降序;存储缺失/损坏时返回空数组 */
|
package/lib/file-types.ts
CHANGED
|
@@ -26,7 +26,14 @@ export const AUDIO_EXT_TO_MIME: Record<string, string> = {
|
|
|
26
26
|
aac: "audio/aac",
|
|
27
27
|
flac: "audio/flac",
|
|
28
28
|
weba: "audio/webm",
|
|
29
|
-
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const VIDEO_EXT_TO_MIME: Record<string, string> = {
|
|
32
|
+
mp4: "video/mp4",
|
|
33
|
+
m4v: "video/mp4",
|
|
34
|
+
webm: "video/webm",
|
|
35
|
+
mov: "video/quicktime",
|
|
36
|
+
ogv: "video/ogg",
|
|
30
37
|
};
|
|
31
38
|
|
|
32
39
|
export const DOCUMENT_EXT_TO_MIME: Record<DocumentPreviewKind, string> = {
|
|
@@ -50,6 +57,10 @@ export function getAudioMime(filePath: string): string | null {
|
|
|
50
57
|
return AUDIO_EXT_TO_MIME[getFileExt(filePath)] ?? null;
|
|
51
58
|
}
|
|
52
59
|
|
|
60
|
+
export function getVideoMime(filePath: string): string | null {
|
|
61
|
+
return VIDEO_EXT_TO_MIME[getFileExt(filePath)] ?? null;
|
|
62
|
+
}
|
|
63
|
+
|
|
53
64
|
export function getDocumentMime(filePath: string): string | null {
|
|
54
65
|
return DOCUMENT_EXT_TO_MIME[getFileExt(filePath) as DocumentPreviewKind] ?? null;
|
|
55
66
|
}
|
|
@@ -68,6 +79,10 @@ export function isAudioPath(filePath: string): boolean {
|
|
|
68
79
|
return getAudioMime(filePath) !== null;
|
|
69
80
|
}
|
|
70
81
|
|
|
82
|
+
export function isVideoPath(filePath: string): boolean {
|
|
83
|
+
return getVideoMime(filePath) !== null;
|
|
84
|
+
}
|
|
85
|
+
|
|
71
86
|
export function isDocumentPreviewPath(filePath: string): boolean {
|
|
72
87
|
return documentPreviewKind(filePath) !== null;
|
|
73
88
|
}
|
package/lib/i18n/messages/en.ts
CHANGED
|
@@ -10,6 +10,8 @@ export const enLocale: LocalePlugin = {
|
|
|
10
10
|
"common.models": "Models",
|
|
11
11
|
"common.skills": "Skills",
|
|
12
12
|
"common.plugins": "Plugins",
|
|
13
|
+
"common.settings": "Settings",
|
|
14
|
+
"common.agents": "Agents",
|
|
13
15
|
"appUpdate.releaseNotes": "Pi Web v{version} is available. View release notes",
|
|
14
16
|
"sidebar.hide": "Hide sidebar",
|
|
15
17
|
"sidebar.show": "Show sidebar",
|
|
@@ -146,6 +148,11 @@ export const enLocale: LocalePlugin = {
|
|
|
146
148
|
"sidebar.filesTab": "Files",
|
|
147
149
|
"sidebar.tasks": "Tasks",
|
|
148
150
|
"sidebar.tempSessions": "Chat",
|
|
151
|
+
"sidebar.timeToday": "Today",
|
|
152
|
+
"sidebar.timeYesterday": "Yesterday",
|
|
153
|
+
"sidebar.timeThisWeek": "This week",
|
|
154
|
+
"sidebar.timeThisMonth": "Last 30 days",
|
|
155
|
+
"sidebar.timeOlder": "Older",
|
|
149
156
|
"sidebar.newTask": "New task…",
|
|
150
157
|
"sidebar.taskName": "Task name",
|
|
151
158
|
"sidebar.newTaskSession": "New task session",
|
|
@@ -300,6 +307,17 @@ export const enLocale: LocalePlugin = {
|
|
|
300
307
|
"chat.steer": "Steer",
|
|
301
308
|
"chat.followUp": "Follow-up",
|
|
302
309
|
"chat.send": "Send",
|
|
310
|
+
"chat.askSelection": "Ask about selected text",
|
|
311
|
+
"chat.askInCurrent": "Ask here",
|
|
312
|
+
"chat.askInNewChat": "Ask in new chat",
|
|
313
|
+
"chat.newQuoteChat": "New chat about selected text",
|
|
314
|
+
"chat.quoteIntro": "About this passage:",
|
|
315
|
+
"chat.quoteQuestion": "My question:",
|
|
316
|
+
"chat.quoteForkFailed": "Failed to create quoted chat",
|
|
317
|
+
"chat.quoteSelectionToggle": "Show an ask menu after selecting text",
|
|
318
|
+
"chat.sendQuestion": "Send question",
|
|
319
|
+
"chat.imageNotSupportedTitle": "The selected model does not support images",
|
|
320
|
+
"chat.imageNotSupportedBody": "Model {model} accepts text input only; attached images will not be sent. Switch to a vision-capable model or remove the attachments.",
|
|
303
321
|
"chat.attachImage": "Attach image",
|
|
304
322
|
"chat.previewImage": "Preview image",
|
|
305
323
|
"chat.filterModels": "Filter models…",
|
|
@@ -360,6 +378,79 @@ export const enLocale: LocalePlugin = {
|
|
|
360
378
|
"chat.commandCopy": "Copy the last assistant message",
|
|
361
379
|
"chat.compacted": "Compacted",
|
|
362
380
|
"chat.tokensSaved": "{saved} saved",
|
|
381
|
+
"settings.chatContentWidth": "Chat content width",
|
|
382
|
+
"settings.chatContentWidthDescription": "Set the maximum width of message content and the input box.",
|
|
383
|
+
"settings.chatContentFontSize": "Chat font size",
|
|
384
|
+
"settings.preferences": "Preferences",
|
|
385
|
+
"settings.title": "Settings",
|
|
386
|
+
"settings.general": "General",
|
|
387
|
+
"settings.appearance": "Appearance",
|
|
388
|
+
"settings.chat": "Chat",
|
|
389
|
+
"settings.quoteSelection": "Ask about selected text",
|
|
390
|
+
"settings.resetChatContentWidth": "Reset chat width",
|
|
391
|
+
"settings.resetChatContentFontSize": "Reset chat font size",
|
|
392
|
+
"settings.projectRequired": "Project required",
|
|
393
|
+
"settings.themeLight": "Light",
|
|
394
|
+
"settings.themeDark": "Dark",
|
|
395
|
+
"tools.title": "Tools enabled in the current session",
|
|
396
|
+
"tools.details": "Tool definition details",
|
|
397
|
+
"tools.load": "Tool definitions have not loaded yet",
|
|
398
|
+
"tools.loading": "Loading tool definitions…",
|
|
399
|
+
"tools.noTools": "No active tools",
|
|
400
|
+
"tools.description": "Description",
|
|
401
|
+
"tools.parameters": "Parameters",
|
|
402
|
+
"tools.parameterCount": "{count} parameters",
|
|
403
|
+
"tools.noParameters": "No parameters",
|
|
404
|
+
"tools.required": "Required",
|
|
405
|
+
"tools.optional": "Optional",
|
|
406
|
+
"tools.allowedValues": "Allowed",
|
|
407
|
+
"tools.defaultValue": "Default",
|
|
408
|
+
"tools.guidelines": "Prompt guidelines",
|
|
409
|
+
|
|
410
|
+
"tools.label": "Tools",
|
|
411
|
+
"agents.close": "Close",
|
|
412
|
+
"agents.builtInTitle": "Enable Pi Web built-in sub-agents",
|
|
413
|
+
"agents.builtInDescription": "Provides Pi Web's integrated Agent tools and disables a conflicting pi-subagents extension.",
|
|
414
|
+
"agents.reloadRequired": "Reload the current session to apply this change.",
|
|
415
|
+
"agents.reloadSession": "Reload session",
|
|
416
|
+
"agents.maxConcurrent": "Concurrent sub-agents",
|
|
417
|
+
"agents.maxConcurrentDescription": "Maximum prompts running at once per parent session.",
|
|
418
|
+
"agents.reloading": "Reloading...",
|
|
419
|
+
"agents.loading": "Loading sub-agents...",
|
|
420
|
+
"agents.new": "New sub-agent",
|
|
421
|
+
"agents.empty": "Select or create a sub-agent profile",
|
|
422
|
+
"agents.saveScope": "Save to",
|
|
423
|
+
"agents.name": "Sub-agent ID",
|
|
424
|
+
"agents.displayName": "Display name",
|
|
425
|
+
"agents.description": "Description",
|
|
426
|
+
"agents.prompt": "System instructions",
|
|
427
|
+
"agents.tools": "Tools",
|
|
428
|
+
"agents.resources": "Resources",
|
|
429
|
+
"agents.loadSkills": "Load skills",
|
|
430
|
+
"agents.loadExtensions": "Load extensions",
|
|
431
|
+
"agents.model": "Model override",
|
|
432
|
+
"agents.modelsLoading": "Loading models...",
|
|
433
|
+
"agents.modelUnavailable": "{model} (unavailable)",
|
|
434
|
+
"agents.thinking": "Thinking",
|
|
435
|
+
"agents.maxTurns": "Max turns",
|
|
436
|
+
"agents.inherit": "Parent default",
|
|
437
|
+
"agents.enable": "Enable sub-agent",
|
|
438
|
+
"agents.disable": "Disable sub-agent",
|
|
439
|
+
"agents.builtinPath": "Built-in profile",
|
|
440
|
+
"agents.inheritContext": "Inherit parent context",
|
|
441
|
+
"agents.background": "Run in background by default",
|
|
442
|
+
"agents.duplicate": "Duplicate",
|
|
443
|
+
"agents.copyName": "{name} copy",
|
|
444
|
+
"agents.delete": "Delete",
|
|
445
|
+
"agents.deleteConfirm": "Delete {name}?",
|
|
446
|
+
"agents.save": "Save",
|
|
447
|
+
"agents.saving": "Saving...",
|
|
448
|
+
"agents.scope.builtin": "built-in",
|
|
449
|
+
"agents.scope.global": "global",
|
|
450
|
+
"agents.scope.workspace": "workspace",
|
|
451
|
+
"agents.scope.project": "project",
|
|
452
|
+
"agents.overridden": "Overridden",
|
|
453
|
+
|
|
363
454
|
"i18n.close": "Close",
|
|
364
455
|
"i18n.copy": "Copy",
|
|
365
456
|
"i18n.pin": "Pin",
|
|
@@ -11,6 +11,8 @@ export const zhCNLocale: LocalePlugin = {
|
|
|
11
11
|
"common.models": "模型",
|
|
12
12
|
"common.skills": "技能",
|
|
13
13
|
"common.plugins": "插件",
|
|
14
|
+
"common.settings": "设置",
|
|
15
|
+
"common.agents": "代理",
|
|
14
16
|
"appUpdate.releaseNotes": "Pi Web v{version} 可用,查看更新说明",
|
|
15
17
|
"sidebar.hide": "隐藏侧边栏",
|
|
16
18
|
"sidebar.show": "显示侧边栏",
|
|
@@ -147,6 +149,11 @@ export const zhCNLocale: LocalePlugin = {
|
|
|
147
149
|
"sidebar.filesTab": "文件",
|
|
148
150
|
"sidebar.tasks": "任务",
|
|
149
151
|
"sidebar.tempSessions": "聊天",
|
|
152
|
+
"sidebar.timeToday": "今天",
|
|
153
|
+
"sidebar.timeYesterday": "昨天",
|
|
154
|
+
"sidebar.timeThisWeek": "本周",
|
|
155
|
+
"sidebar.timeThisMonth": "近一月",
|
|
156
|
+
"sidebar.timeOlder": "更久之前",
|
|
150
157
|
"sidebar.newTask": "新建任务…",
|
|
151
158
|
"sidebar.taskName": "任务名称",
|
|
152
159
|
"sidebar.newTaskSession": "新建任务会话",
|
|
@@ -301,6 +308,17 @@ export const zhCNLocale: LocalePlugin = {
|
|
|
301
308
|
"chat.steer": "引导",
|
|
302
309
|
"chat.followUp": "后续消息",
|
|
303
310
|
"chat.send": "发送",
|
|
311
|
+
"chat.askSelection": "询问选中的文字",
|
|
312
|
+
"chat.askInCurrent": "在当前对话询问",
|
|
313
|
+
"chat.askInNewChat": "在新对话询问",
|
|
314
|
+
"chat.newQuoteChat": "关于选中文字的新对话",
|
|
315
|
+
"chat.quoteIntro": "关于这段内容:",
|
|
316
|
+
"chat.quoteQuestion": "我的问题是:",
|
|
317
|
+
"chat.quoteForkFailed": "无法创建引用对话",
|
|
318
|
+
"chat.quoteSelectionToggle": "选中文字后显示询问菜单",
|
|
319
|
+
"chat.sendQuestion": "发送问题",
|
|
320
|
+
"chat.imageNotSupportedTitle": "当前模型不支持图片",
|
|
321
|
+
"chat.imageNotSupportedBody": "模型 {model} 的输入只支持文本,图片不会被发送。请更换支持图片的模型或移除附件。",
|
|
304
322
|
"chat.attachImage": "附加图片",
|
|
305
323
|
"chat.previewImage": "预览图片",
|
|
306
324
|
"chat.filterModels": "筛选模型…",
|
|
@@ -361,6 +379,79 @@ export const zhCNLocale: LocalePlugin = {
|
|
|
361
379
|
"chat.commandCopy": "复制最后一条助手消息",
|
|
362
380
|
"chat.compacted": "已压缩",
|
|
363
381
|
"chat.tokensSaved": "节省 {saved}",
|
|
382
|
+
"settings.chatContentWidth": "聊天内容宽度",
|
|
383
|
+
"settings.chatContentWidthDescription": "设置消息内容和输入框的最大宽度。",
|
|
384
|
+
"settings.chatContentFontSize": "聊天字体大小",
|
|
385
|
+
"settings.preferences": "偏好",
|
|
386
|
+
"settings.title": "设置",
|
|
387
|
+
"settings.general": "通用",
|
|
388
|
+
"settings.appearance": "外观",
|
|
389
|
+
"settings.chat": "聊天",
|
|
390
|
+
"settings.quoteSelection": "选中文字后询问",
|
|
391
|
+
"settings.resetChatContentWidth": "重置聊天宽度",
|
|
392
|
+
"settings.resetChatContentFontSize": "重置聊天字号",
|
|
393
|
+
"settings.projectRequired": "需要项目",
|
|
394
|
+
"settings.themeLight": "浅色",
|
|
395
|
+
"settings.themeDark": "深色",
|
|
396
|
+
"tools.title": "当前会话启用的工具",
|
|
397
|
+
"tools.details": "工具定义详情",
|
|
398
|
+
"tools.load": "工具定义尚未加载",
|
|
399
|
+
"tools.loading": "正在加载工具定义…",
|
|
400
|
+
"tools.noTools": "没有启用的工具",
|
|
401
|
+
"tools.description": "描述",
|
|
402
|
+
"tools.parameters": "参数",
|
|
403
|
+
"tools.parameterCount": "{count} 个参数",
|
|
404
|
+
"tools.noParameters": "无参数",
|
|
405
|
+
"tools.required": "必填",
|
|
406
|
+
"tools.optional": "可选",
|
|
407
|
+
"tools.allowedValues": "可选值",
|
|
408
|
+
"tools.defaultValue": "默认值",
|
|
409
|
+
"tools.guidelines": "提示词规则",
|
|
410
|
+
|
|
411
|
+
"tools.label": "工具",
|
|
412
|
+
"agents.close": "关闭",
|
|
413
|
+
"agents.builtInTitle": "启用 Pi Web 内置子代理",
|
|
414
|
+
"agents.builtInDescription": "提供 Pi Web 集成的 Agent 工具,并停用发生冲突的 pi-subagents 扩展。",
|
|
415
|
+
"agents.reloadRequired": "重新加载当前会话后生效。",
|
|
416
|
+
"agents.reloadSession": "重新加载会话",
|
|
417
|
+
"agents.maxConcurrent": "并发子代理数",
|
|
418
|
+
"agents.maxConcurrentDescription": "每个父会话同时运行的最大任务数。",
|
|
419
|
+
"agents.reloading": "正在重新加载...",
|
|
420
|
+
"agents.loading": "正在加载子代理...",
|
|
421
|
+
"agents.new": "新建子代理",
|
|
422
|
+
"agents.empty": "选择或创建一个子代理配置",
|
|
423
|
+
"agents.saveScope": "保存到",
|
|
424
|
+
"agents.name": "子代理 ID",
|
|
425
|
+
"agents.displayName": "显示名称",
|
|
426
|
+
"agents.description": "描述",
|
|
427
|
+
"agents.prompt": "系统指令",
|
|
428
|
+
"agents.tools": "工具",
|
|
429
|
+
"agents.resources": "资源",
|
|
430
|
+
"agents.loadSkills": "加载技能",
|
|
431
|
+
"agents.loadExtensions": "加载扩展",
|
|
432
|
+
"agents.model": "指定模型",
|
|
433
|
+
"agents.modelsLoading": "正在加载模型...",
|
|
434
|
+
"agents.modelUnavailable": "{model}(不可用)",
|
|
435
|
+
"agents.thinking": "思考级别",
|
|
436
|
+
"agents.maxTurns": "最大轮次",
|
|
437
|
+
"agents.inherit": "跟随父会话",
|
|
438
|
+
"agents.enable": "启用子代理",
|
|
439
|
+
"agents.disable": "停用子代理",
|
|
440
|
+
"agents.builtinPath": "内置配置",
|
|
441
|
+
"agents.inheritContext": "继承父会话上下文",
|
|
442
|
+
"agents.background": "默认在后台运行",
|
|
443
|
+
"agents.duplicate": "创建副本",
|
|
444
|
+
"agents.copyName": "{name} 副本",
|
|
445
|
+
"agents.delete": "删除",
|
|
446
|
+
"agents.deleteConfirm": "删除 {name}?",
|
|
447
|
+
"agents.save": "保存",
|
|
448
|
+
"agents.saving": "正在保存...",
|
|
449
|
+
"agents.scope.builtin": "内置",
|
|
450
|
+
"agents.scope.global": "全局",
|
|
451
|
+
"agents.scope.workspace": "工作区",
|
|
452
|
+
"agents.scope.project": "项目",
|
|
453
|
+
"agents.overridden": "被覆盖",
|
|
454
|
+
|
|
364
455
|
"i18n.close": "关闭",
|
|
365
456
|
"i18n.copy": "复制",
|
|
366
457
|
"i18n.pin": "钉",
|
package/lib/id.test.mjs
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import { createJiti } from "jiti";
|
|
4
|
+
|
|
5
|
+
const jiti = createJiti(import.meta.url, { tsconfigPaths: true });
|
|
6
|
+
const { newId } = await jiti.import("./id.ts");
|
|
7
|
+
|
|
8
|
+
// 服务端 /api/agent/new 的会话 id 校验(SESSION_ID_RE):兜底 id 必须也能当会话 id 用
|
|
9
|
+
const SESSION_ID_RE = /^[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?$/;
|
|
10
|
+
|
|
11
|
+
const realCrypto = globalThis.crypto;
|
|
12
|
+
|
|
13
|
+
test.afterEach(() => {
|
|
14
|
+
Object.defineProperty(globalThis, "crypto", { value: realCrypto, configurable: true, writable: true });
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test("prefers crypto.randomUUID when the secure-context API exists", () => {
|
|
18
|
+
Object.defineProperty(globalThis, "crypto", { value: { randomUUID: () => "0b6f2f2e-1111-2222-3333-444455556666" }, configurable: true, writable: true });
|
|
19
|
+
assert.equal(newId(), "0b6f2f2e-1111-2222-3333-444455556666");
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test("falls back on insecure origins where randomUUID is missing", () => {
|
|
23
|
+
// http://<LAN-IP>:30143 → crypto 在、randomUUID 不在(裸调会 TypeError)
|
|
24
|
+
Object.defineProperty(globalThis, "crypto", { value: { getRandomValues: (a) => a }, configurable: true, writable: true });
|
|
25
|
+
const id = newId();
|
|
26
|
+
assert.match(id, SESSION_ID_RE, `fallback id must be a valid session id, got ${id}`);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("falls back when crypto itself is unavailable", () => {
|
|
30
|
+
Object.defineProperty(globalThis, "crypto", { value: undefined, configurable: true, writable: true });
|
|
31
|
+
assert.match(newId(), SESSION_ID_RE);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("fallback ids stay unique across rapid calls", () => {
|
|
35
|
+
Object.defineProperty(globalThis, "crypto", { value: {}, configurable: true, writable: true });
|
|
36
|
+
const ids = new Set(Array.from({ length: 200 }, () => newId()));
|
|
37
|
+
assert.equal(ids.size, 200);
|
|
38
|
+
});
|
package/lib/id.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 前端 id 生成(会话 id / 画布节点 id / 草稿 id / 通知 id 等)。
|
|
3
|
+
*
|
|
4
|
+
* **一律用它,别裸调 `crypto.randomUUID()`**:该方法只在**安全上下文**存在
|
|
5
|
+
* (https / localhost)。局域网访问(`npm run dev:lan` → `http://192.168.x.x:30143`)
|
|
6
|
+
* 或老浏览器里它是 undefined,裸调直接抛 “crypto.randomUUID is not a function”
|
|
7
|
+
* —— 任务行「新建会话」2026-09-14 就栽在这里(同一批调用里有的做了兜底、有的漏了)。
|
|
8
|
+
*
|
|
9
|
+
* 退化实现产出的 id 仍是 `[A-Za-z0-9-]`,满足服务端会话 id 校验
|
|
10
|
+
* (`SESSION_ID_RE`,见 `app/api/agent/new/route.ts`),可直接当会话 id 用。
|
|
11
|
+
*/
|
|
12
|
+
export function newId(): string {
|
|
13
|
+
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
14
|
+
return crypto.randomUUID();
|
|
15
|
+
}
|
|
16
|
+
return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
17
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
|
|
4
|
+
async function loadSubject() {
|
|
5
|
+
return import("./ime-guard.ts");
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
test("plain key events are not IME-busy", async () => {
|
|
9
|
+
const { createIMECompositionState, isIMEBusy } = await loadSubject();
|
|
10
|
+
const state = createIMECompositionState();
|
|
11
|
+
|
|
12
|
+
assert.equal(isIMEBusy(state, { isComposing: false, keyCode: 13 }), false);
|
|
13
|
+
assert.equal(isIMEBusy(state, {}), false);
|
|
14
|
+
assert.equal(isIMEBusy(state, null), false);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test("composition session marks every keydown as IME-busy", async () => {
|
|
18
|
+
const { createIMECompositionState, markCompositionStart, markCompositionEnd, isIMEBusy } = await loadSubject();
|
|
19
|
+
const state = createIMECompositionState();
|
|
20
|
+
|
|
21
|
+
markCompositionStart(state);
|
|
22
|
+
assert.equal(state.composing, true);
|
|
23
|
+
// 组合期间即使事件没带信号(老输入法)也要让开
|
|
24
|
+
assert.equal(isIMEBusy(state, { isComposing: false, keyCode: 13 }), true);
|
|
25
|
+
|
|
26
|
+
markCompositionEnd(state, 1_000);
|
|
27
|
+
assert.equal(state.composing, false);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test("isComposing and keyCode 229 are both honoured outside a tracked session", async () => {
|
|
31
|
+
const { createIMECompositionState, isIMEBusy } = await loadSubject();
|
|
32
|
+
const state = createIMECompositionState();
|
|
33
|
+
|
|
34
|
+
assert.equal(isIMEBusy(state, { isComposing: true, keyCode: 13 }), true);
|
|
35
|
+
assert.equal(isIMEBusy(state, { keyCode: 229 }), true);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("keys right after compositionend are IME-busy (Safari / Sogou ordering)", async () => {
|
|
39
|
+
const { createIMECompositionState, markCompositionStart, markCompositionEnd, isIMEBusy, IME_GRACE_MS } = await loadSubject();
|
|
40
|
+
const state = createIMECompositionState();
|
|
41
|
+
|
|
42
|
+
markCompositionStart(state);
|
|
43
|
+
// Safari 反序:compositionend 先到,随后那次 keydown 的 isComposing 已是 false
|
|
44
|
+
markCompositionEnd(state, 5_000);
|
|
45
|
+
|
|
46
|
+
assert.equal(isIMEBusy(state, { isComposing: false, keyCode: 13 }, 5_000), true);
|
|
47
|
+
assert.equal(isIMEBusy(state, { isComposing: false, keyCode: 13 }, 5_000 + IME_GRACE_MS - 1), true);
|
|
48
|
+
|
|
49
|
+
// 宽限窗外恢复正常
|
|
50
|
+
assert.equal(isIMEBusy(state, { isComposing: false, keyCode: 13 }, 5_000 + IME_GRACE_MS), false);
|
|
51
|
+
assert.equal(isIMEBusy(state, { isComposing: false, keyCode: 13 }, 5_000 + IME_GRACE_MS + 1), false);
|
|
52
|
+
});
|
package/lib/ime-guard.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 输入法(IME)组合态判定。
|
|
3
|
+
*
|
|
4
|
+
* Enter / Escape / 方向键等业务快捷键在处理前必须先过 `isIMEBusy()`,
|
|
5
|
+
* 否则中文/日文/韩文输入法「回车确认候选」「Esc 取消候选」会被当成业务提交或业务取消。
|
|
6
|
+
*
|
|
7
|
+
* 四个信号缺一不可(靠前的先短路):
|
|
8
|
+
* 1. `composing` —— 由 compositionstart / compositionend 自己维护,最可靠;
|
|
9
|
+
* 2. `event.isComposing` —— 标准属性;
|
|
10
|
+
* 3. `event.keyCode === 229` —— 老 WebKit 与部分输入法不上报 isComposing;
|
|
11
|
+
* 4. `endedAt` 宽限窗 —— Safari(以及部分搜狗场景)先发 compositionend 再发 keydown,
|
|
12
|
+
* 那次 keydown 的 isComposing 已经是 false,只看属性必然误判成「用户主动按了 Enter」。
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** compositionend 之后仍把按键让给输入法的宽限窗口(ms)。 */
|
|
16
|
+
export const IME_GRACE_MS = 100;
|
|
17
|
+
|
|
18
|
+
export type IMECompositionState = {
|
|
19
|
+
/** 是否处于组合中(compositionstart 之后、compositionend 之前) */
|
|
20
|
+
composing: boolean;
|
|
21
|
+
/** 最近一次 compositionend 的时间戳;0 = 从未组合过 */
|
|
22
|
+
endedAt: number;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export function createIMECompositionState(): IMECompositionState {
|
|
26
|
+
return { composing: false, endedAt: 0 };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function markCompositionStart(state: IMECompositionState): void {
|
|
30
|
+
state.composing = true;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function markCompositionEnd(state: IMECompositionState, now: number = Date.now()): void {
|
|
34
|
+
state.composing = false;
|
|
35
|
+
state.endedAt = now;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** keydown 上取得到的 IME 信号(KeyboardEvent 的结构子集,方便测试)。 */
|
|
39
|
+
export type IMEKeyEvent = {
|
|
40
|
+
isComposing?: boolean;
|
|
41
|
+
keyCode?: number;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/** 这次按键是否属于输入法:true → 业务逻辑让开,交给输入法上屏/取消候选。 */
|
|
45
|
+
export function isIMEBusy(
|
|
46
|
+
state: IMECompositionState,
|
|
47
|
+
event: IMEKeyEvent | null | undefined,
|
|
48
|
+
now: number = Date.now(),
|
|
49
|
+
): boolean {
|
|
50
|
+
if (state.composing) return true;
|
|
51
|
+
if (event?.isComposing === true) return true;
|
|
52
|
+
if (event?.keyCode === 229) return true;
|
|
53
|
+
return now - state.endedAt < IME_GRACE_MS;
|
|
54
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AgentMessage } from "@/lib/types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 从消息中提取可渲染的 markdown 文本(钉卡快照用)。
|
|
5
|
+
* 只取 text 块,忽略 thinking / 工具调用 / 图片等结构 —— 钉卡只渲染内容,与消息气泡解耦。
|
|
6
|
+
*/
|
|
7
|
+
export function extractMessageMarkdown(message: AgentMessage): string {
|
|
8
|
+
const content = (message as unknown as { content?: unknown }).content;
|
|
9
|
+
const parts: string[] = [];
|
|
10
|
+
const push = (c: unknown): void => {
|
|
11
|
+
if (typeof c === "string") {
|
|
12
|
+
parts.push(c);
|
|
13
|
+
} else if (Array.isArray(c)) {
|
|
14
|
+
for (const b of c) {
|
|
15
|
+
if (b && typeof b === "object") {
|
|
16
|
+
const t = b as { type?: string; text?: string };
|
|
17
|
+
if (t.type === "text" && typeof t.text === "string") parts.push(t.text);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
push(content);
|
|
23
|
+
return parts.join("\n\n").trim();
|
|
24
|
+
}
|
package/lib/models-cache.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export interface ModelsData {
|
|
2
2
|
models: Record<string, string>;
|
|
3
|
-
modelList: { id: string; name: string; provider: string }[];
|
|
3
|
+
modelList: { id: string; name: string; provider: string; input?: string[] }[];
|
|
4
4
|
defaultModel: { provider: string; modelId: string } | null;
|
|
5
5
|
thinkingLevels: Record<string, string[]>;
|
|
6
6
|
thinkingLevelMaps: Record<string, Record<string, string | null>>;
|
package/lib/pi-types.ts
CHANGED
|
@@ -6,7 +6,12 @@ import type {
|
|
|
6
6
|
SlashCommandInfo,
|
|
7
7
|
Theme,
|
|
8
8
|
} from "@earendil-works/pi-coding-agent";
|
|
9
|
-
import type {
|
|
9
|
+
import type {
|
|
10
|
+
AgentLoopTurnUpdate,
|
|
11
|
+
AgentMessage as PiAgentMessage,
|
|
12
|
+
PrepareNextTurnContext,
|
|
13
|
+
} from "@earendil-works/pi-agent-core";
|
|
14
|
+
import type { ImageContent, TextContent } from "@earendil-works/pi-ai";
|
|
10
15
|
|
|
11
16
|
export interface ContextUsage {
|
|
12
17
|
percent: number | null;
|
|
@@ -138,6 +143,10 @@ export interface AgentSessionLike {
|
|
|
138
143
|
thinkingLevel?: string;
|
|
139
144
|
streamingMessage?: PiAgentMessage;
|
|
140
145
|
};
|
|
146
|
+
prepareNextTurnWithContext?: (
|
|
147
|
+
context: PrepareNextTurnContext,
|
|
148
|
+
signal?: AbortSignal,
|
|
149
|
+
) => Promise<AgentLoopTurnUpdate | undefined> | AgentLoopTurnUpdate | undefined;
|
|
141
150
|
};
|
|
142
151
|
readonly extensionRunner: ExtensionRunnerLike;
|
|
143
152
|
readonly promptTemplates: readonly PromptTemplateLike[];
|
|
@@ -153,6 +162,15 @@ export interface AgentSessionLike {
|
|
|
153
162
|
source?: "interactive" | "rpc";
|
|
154
163
|
preflightResult?: (success: boolean) => void;
|
|
155
164
|
}): Promise<void>;
|
|
165
|
+
sendCustomMessage<T = unknown>(message: {
|
|
166
|
+
customType: string;
|
|
167
|
+
content: string | (TextContent | ImageContent)[];
|
|
168
|
+
display: boolean;
|
|
169
|
+
details?: T;
|
|
170
|
+
}, options?: {
|
|
171
|
+
triggerTurn?: boolean;
|
|
172
|
+
deliverAs?: "steer" | "followUp" | "nextTurn";
|
|
173
|
+
}): Promise<void>;
|
|
156
174
|
abort(): Promise<void>;
|
|
157
175
|
executeBash(command: string, onChunk?: (chunk: string) => void, options?: {
|
|
158
176
|
excludeFromContext?: boolean;
|