@jetcrab/pi-desk 1.1.13-dev → 1.1.16
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/package.json +2 -2
- package/src/app/api/model-settings/preview/route.ts +1 -0
- package/src/client/l2_biz/settings/hooks/l2-use-model-provider-settings.ts +54 -10
- package/src/client/l2_biz/settings/hooks/l2-use-model-settings.ts +37 -9
- package/src/client/l2_biz/settings/l2-model-settings-biz.ts +26 -12
- package/src/client/l2_biz/settings/views/l2-model-provider-settings.tsx +3 -2
- package/src/client/l2_biz/settings/views/l2-model-replacement-preview.tsx +34 -0
- package/src/client/l4_foundation/ui/l4-confirm-dialog.tsx +9 -1
- package/src/common/l2_biz/model-settings/l2-model-settings-contract.ts +23 -1
- package/src/common/l2_biz/settings/l2-settings-messages.ts +8 -0
- package/src/server/l1_entry/api/l1-model-settings-preview-route.ts +32 -0
- package/src/server/l2_biz/model-settings/l2-model-settings.ts +9 -0
- package/src/server/l2_biz/plugin-management/l2-plugin-management.ts +159 -52
- package/src/server/l4_foundation/model-settings/l4-model-settings-store.ts +161 -38
- package/src/server/l4_foundation/model-settings/l4-model-settings-types.ts +11 -0
- package/src/server/l4_foundation/model-settings/l4-model-settings.ts +1 -0
- package/src/server/l4_foundation/pi/l4-pi-package-maintenance-runner.mts +56 -65
- package/src/server/l4_foundation/pi/l4-pi-package-maintenance.ts +2 -0
- package/src/server/l4_foundation/pi/l4-pi-package-reinstall-runner.mts +49 -0
- package/src/server/l4_foundation/pi/l4-pi-package-root-consistency.ts +6 -2
- package/src/server/l4_foundation/pi/l4-pi-plugin-probe.ts +3 -1
- package/src/server/l4_foundation/pi/l4-pi-runner-process.ts +9 -0
- package/temp/build/pi-desk/release/.next/BUILD_ID +1 -1
- package/temp/build/pi-desk/release/.next/app-path-routes-manifest.json +1 -0
- package/temp/build/pi-desk/release/.next/build-manifest.json +2 -2
- package/temp/build/pi-desk/release/.next/prerender-manifest.json +3 -3
- package/temp/build/pi-desk/release/.next/required-server-files.js +3 -3
- package/temp/build/pi-desk/release/.next/required-server-files.json +3 -3
- package/temp/build/pi-desk/release/.next/routes-manifest.json +6 -0
- package/temp/build/pi-desk/release/.next/server/app/_global-error/page.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.html +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_not-found/page.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/auth/login/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/auth/logout/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/auth-settings/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/auth-settings/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/capability-modes/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/capability-modes/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/chat/context/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/chat/images/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/chat/messages/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/health/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/mcp-check/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/mcp-settings/del/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/mcp-settings/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/mcp-settings/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-catalog/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-settings/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-settings/preview/route.js +1 -0
- package/temp/build/pi-desk/release/.next/server/app/api/model-settings/preview/route_client-reference-manifest.js +1 -0
- package/temp/build/pi-desk/release/.next/server/app/api/model-settings/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/directories/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/directory-entries/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/directory-ignores/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/directory-ignores/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/models/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/session-user-messages/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/sessions/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/search/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/settings-get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/settings-replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/add/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/apply/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/batch/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/browser-resources/[resourceGroup]/[...resourcePath]/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/del/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/enabled-set/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/host-runtime/[runtimeVersion]/[...resourcePath]/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/reload/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/update/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-files/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-files/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-files/reveal/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-files/search/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-git/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-branches/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-changes/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-diff/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-heads/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-log/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-model-default/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-model-default/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/skill-files/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/skill-files/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/skill-files/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/skills/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/task-center/images/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/task-center/messages/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-session-git-branch/add/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-session-git-branch/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-session-tree/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-session-tree-entry/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/add/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/branch/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/del/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/rename/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/sort/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/favicon.ico/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/login/page.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/page.js +16 -16
- package/temp/build/pi-desk/release/.next/server/app/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app-paths-manifest.json +1 -0
- package/temp/build/pi-desk/release/.next/server/chunks/35985.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/50520.js +5 -5
- package/temp/build/pi-desk/release/.next/server/chunks/78262.js +3 -3
- package/temp/build/pi-desk/release/.next/server/chunks/82499.js +4 -4
- package/temp/build/pi-desk/release/.next/server/middleware-build-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/pages/500.html +1 -1
- package/temp/build/pi-desk/release/.next/server/server-reference-manifest.json +1 -1
- package/temp/build/pi-desk/release/.next/static/DqamF28k0ShQLbNVzXDIj/_buildManifest.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/{api/auth-settings/get/route-5137efe26947191b.js → _global-error/page-9969fe0baa238786.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/{api/auth-settings/replace/route-5137efe26947191b.js → _not-found/page-9969fe0baa238786.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth/login/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth/logout/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/{_global-error/page-5137efe26947191b.js → api/auth-settings/get/route-9969fe0baa238786.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/{_not-found/page-5137efe26947191b.js → api/auth-settings/replace/route-9969fe0baa238786.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/capability-modes/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/capability-modes/replace/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/context/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/images/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/messages/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/health/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-check/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/del/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/replace/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-catalog/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/preview/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/replace/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directories/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-entries/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-ignores/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-ignores/replace/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/models/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/session-user-messages/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/sessions/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/search/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/settings-get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/settings-replace/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/add/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/apply/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/batch/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/browser-resources/[resourceGroup]/[...resourcePath]/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/del/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/enabled-set/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/host-runtime/[runtimeVersion]/[...resourcePath]/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/reload/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/update/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/reveal/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/search/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-branches/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-changes/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-diff/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-heads/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-log/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-model-default/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-model-default/replace/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/replace/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skills/list/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/task-center/images/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/task-center/messages/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-git-branch/add/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-git-branch/replace/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-tree/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-tree-entry/get/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/add/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/branch/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/del/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/rename/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/replace/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/sort/route-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/{layout-358978b7cfe69a5f.js → layout-c0e1c5cef8620cf8.js} +2 -2
- package/temp/build/pi-desk/release/.next/static/chunks/app/page-0069319a4fb97211.js +158 -0
- package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/app-error-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/forbidden-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/unauthorized-9969fe0baa238786.js +1 -0
- package/temp/build/pi-desk/release/.next/static/css/6427d02b6edf406f.css +1 -0
- package/temp/build/pi-desk/release/.next/trace-build +1 -1
- package/temp/build/pi-desk/release/.next/static/YdOQ7klRBI5tJb5NpDVLW/_buildManifest.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth/login/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth/logout/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/capability-modes/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/capability-modes/replace/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/context/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/images/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/messages/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/health/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-check/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/del/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/replace/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-catalog/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/replace/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directories/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-entries/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-ignores/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-ignores/replace/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/models/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/session-user-messages/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/sessions/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/search/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/settings-get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/settings-replace/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/add/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/apply/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/batch/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/browser-resources/[resourceGroup]/[...resourcePath]/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/del/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/enabled-set/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/host-runtime/[runtimeVersion]/[...resourcePath]/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/reload/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/update/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/reveal/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/search/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-branches/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-changes/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-diff/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-heads/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-log/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-model-default/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-model-default/replace/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/replace/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skills/list/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/task-center/images/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/task-center/messages/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-git-branch/add/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-git-branch/replace/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-tree/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-tree-entry/get/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/add/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/branch/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/del/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/rename/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/replace/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/sort/route-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/page-cc05e71bf51adb57.js +0 -158
- package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/app-error-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/forbidden-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/unauthorized-5137efe26947191b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/css/095a062e18f96657.css +0 -1
- /package/temp/build/pi-desk/release/.next/static/{YdOQ7klRBI5tJb5NpDVLW → DqamF28k0ShQLbNVzXDIj}/_ssgManifest.js +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"use strict";exports.id=50520,exports.ids=[50520],exports.modules={621:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{JM:()=>k,w$:()=>m});var e=c(51455),f=c(76760),g=c(38522),h=c(57975);c(77598);var i=c(73159),j=a([i]);function k(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:{}}async function l(a,b){let c;if(!(c=b.replaceAll("\\","/").replace(/^\.\//,""))||(0,f.isAbsolute)(b)||f.win32.isAbsolute(b)||c.includes("\0")||c.split("/").some(a=>".."===a)||!c)return null;try{let c=await (0,e.realpath)((0,f.resolve)(a,b)),d=(0,f.relative)(a,c);if((0,f.isAbsolute)(d)||".."===d||d.startsWith(`..${"win32"===process.platform?"\\":"/"}`))return null;let g=await (0,e.open)(c,"r");try{let a=await g.stat();if(!a.isFile()||a.size>65536)return null;let b=Buffer.alloc(65537),c=0;for(;c<b.length;){let{bytesRead:a}=await g.read(b,c,b.length-c,c);if(!a)break;c+=a}return c<=65536?b.subarray(0,c).toString("utf8"):null}finally{await g.close()}}catch(a){if(["ENOENT","ENOTDIR"].includes(a.code??""))return null;throw a}}async function m(a){let b,c=await (0,e.realpath)(a),d=await l(c,"package.json"),f=d?k(JSON.parse(d)):{},g={};for(let[a,d]of(b=k(k(f.piDesk).i18n),Object.entries(b).slice(0,16).flatMap(([a,b])=>{let c=k(b).readme;return a.length>0&&a.length<=35&&"string"==typeof c&&c.length<=1024?[[a,c]]:[]}))){let b=await l(c,d);null!==b&&(g[a]=b)}var h=await l(c,"README.md");if(null===h&&!Object.keys(g).length)return null;let i=h??Object.values(g)[0];return Object.keys(g).length?{default:i,translations:g}:i}i=(j.then?(await j)():j)[0],(0,h.promisify)(g.gunzip),d()}catch(a){d(a)}})},2472:(a,b,c)=>{c.d(b,{i:()=>i});var d=c(31421),e=c(76760),f=c(73136);let{createRequire:g}=process.getBuiltinModule("module"),h=g((0,e.join)(process.cwd(),"package.json"))("./src/server/l4_foundation/process/l4-process-tree.js");function i(a){return new Promise((b,c)=>{let g=(0,f.pathToFileURL)((0,e.join)(process.cwd(),"src/server/l4_foundation/pi/l4-pi-runtime-register.mjs")).href,i=(0,d.spawn)(process.execPath,["--import",g,...a.args],{cwd:process.cwd(),env:{...process.env,PI_CODING_AGENT_DIR:a.agentDir,PI_CODING_AGENT_SESSION_DIR:(0,e.join)(a.agentDir,"sessions"),TSX_TSCONFIG_PATH:(0,e.join)(process.cwd(),"tsconfig.json"),...a.env},stdio:["ignore","pipe","pipe"],windowsHide:!0,detached:"win32"!==process.platform}),j="",k="",l=!1,m=null,n=b=>{!l&&(l=!0,m&&clearTimeout(m),h.terminateManagedTree(i).then(b,b=>{let d=b instanceof Error?b:Error(String(b)),e="code"in d?String(d.code):d.name,f="killed"in d&&!0===d.killed,g="stderr"in d&&"string"==typeof d.stderr?d.stderr.trim().slice(-2e3):"";console.error("[Pi Desk][Runner] 子进程清理未完成",{pid:i.pid,exitCode:i.exitCode,code:e,killed:f,detail:g});let h=Error(`子进程 ${i.pid} 清理${f?"超时":"失败"}(${e})${g?`:${g}`:""}`,{cause:d});c(a.cleanupError(k.trim(),h))}))},o=(b,c)=>`${b}${c.toString("utf8")}`.slice(-a.maxOutputBytes);i.stdout.on("data",a=>{j=
|
|
1
|
+
"use strict";exports.id=50520,exports.ids=[50520],exports.modules={621:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{JM:()=>k,w$:()=>m});var e=c(51455),f=c(76760),g=c(38522),h=c(57975);c(77598);var i=c(73159),j=a([i]);function k(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:{}}async function l(a,b){let c;if(!(c=b.replaceAll("\\","/").replace(/^\.\//,""))||(0,f.isAbsolute)(b)||f.win32.isAbsolute(b)||c.includes("\0")||c.split("/").some(a=>".."===a)||!c)return null;try{let c=await (0,e.realpath)((0,f.resolve)(a,b)),d=(0,f.relative)(a,c);if((0,f.isAbsolute)(d)||".."===d||d.startsWith(`..${"win32"===process.platform?"\\":"/"}`))return null;let g=await (0,e.open)(c,"r");try{let a=await g.stat();if(!a.isFile()||a.size>65536)return null;let b=Buffer.alloc(65537),c=0;for(;c<b.length;){let{bytesRead:a}=await g.read(b,c,b.length-c,c);if(!a)break;c+=a}return c<=65536?b.subarray(0,c).toString("utf8"):null}finally{await g.close()}}catch(a){if(["ENOENT","ENOTDIR"].includes(a.code??""))return null;throw a}}async function m(a){let b,c=await (0,e.realpath)(a),d=await l(c,"package.json"),f=d?k(JSON.parse(d)):{},g={};for(let[a,d]of(b=k(k(f.piDesk).i18n),Object.entries(b).slice(0,16).flatMap(([a,b])=>{let c=k(b).readme;return a.length>0&&a.length<=35&&"string"==typeof c&&c.length<=1024?[[a,c]]:[]}))){let b=await l(c,d);null!==b&&(g[a]=b)}var h=await l(c,"README.md");if(null===h&&!Object.keys(g).length)return null;let i=h??Object.values(g)[0];return Object.keys(g).length?{default:i,translations:g}:i}i=(j.then?(await j)():j)[0],(0,h.promisify)(g.gunzip),d()}catch(a){d(a)}})},2472:(a,b,c)=>{c.d(b,{i:()=>i});var d=c(31421),e=c(76760),f=c(73136);let{createRequire:g}=process.getBuiltinModule("module"),h=g((0,e.join)(process.cwd(),"package.json"))("./src/server/l4_foundation/process/l4-process-tree.js");function i(a){return new Promise((b,c)=>{if(a.signal?.aborted)return void c(Error("操作已取消"));let g=(0,f.pathToFileURL)((0,e.join)(process.cwd(),"src/server/l4_foundation/pi/l4-pi-runtime-register.mjs")).href,i=(0,d.spawn)(process.execPath,["--import",g,...a.args],{cwd:process.cwd(),env:{...process.env,PI_CODING_AGENT_DIR:a.agentDir,PI_CODING_AGENT_SESSION_DIR:(0,e.join)(a.agentDir,"sessions"),TSX_TSCONFIG_PATH:(0,e.join)(process.cwd(),"tsconfig.json"),...a.env},stdio:["ignore","pipe","pipe"],windowsHide:!0,detached:"win32"!==process.platform}),j="",k="",l=!1,m=null,n=b=>{!l&&(l=!0,m&&clearTimeout(m),a.signal?.removeEventListener("abort",o),h.terminateManagedTree(i).then(b,b=>{let d=b instanceof Error?b:Error(String(b)),e="code"in d?String(d.code):d.name,f="killed"in d&&!0===d.killed,g="stderr"in d&&"string"==typeof d.stderr?d.stderr.trim().slice(-2e3):"";console.error("[Pi Desk][Runner] 子进程清理未完成",{pid:i.pid,exitCode:i.exitCode,code:e,killed:f,detail:g});let h=Error(`子进程 ${i.pid} 清理${f?"超时":"失败"}(${e})${g?`:${g}`:""}`,{cause:d});c(a.cleanupError(k.trim(),h))}))},o=()=>n(()=>c(Error("操作已取消"))),p=(b,c)=>`${b}${c.toString("utf8")}`.slice(-a.maxOutputBytes);i.stdout.on("data",a=>{j=p(j,a)}),i.stderr.on("data",a=>{k=p(k,a)}),i.once("error",a=>n(()=>c(a))),i.once("close",a=>n(()=>b({stdout:j,stderr:k,code:a}))),(m=setTimeout(()=>{let b=a.timeoutError(),d=`${k}
|
|
2
2
|
${j}`.trim().slice(-4e3);d&&(b.message+=`
|
|
3
|
-
${d}`),n(()=>c(b))},a.timeoutMs)).unref()})}},17691:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{M:()=>j});var e=c(77598),f=c(73024),g=c(76760),h=c(75430),i=a([h]);function j(){let a=(0,h.getAgentDir)(),b=(0,g.join)(a,"pi-desk"),c=(0,g.join)(a,"pi-super");if((0,f.existsSync)(b)||!(0,f.existsSync)(c))return b;let d=(0,g.join)(a,`.pi-desk-migration-${(0,e.randomUUID)()}`);try{(0,f.cpSync)(c,d,{recursive:!0,errorOnExist:!0,force:!1}),(0,f.renameSync)(d,b),console.info("[Pi Desk] 已复制旧版应用数据到新目录")}finally{(0,f.rmSync)(d,{recursive:!0,force:!0})}return b}h=(i.then?(await i)():i)[0],d()}catch(a){d(a)}})},20700:(a,b,c)=>{function d(){return globalThis.__piDeskRestartHandler??null}function e(){return null!==d()}function f(a,b){let c=d();if(!c)throw Error("当前启动方式不支持自动重启 Pi Desk");setTimeout(()=>c(a,b),150).unref()}c.d(b,{Z:()=>f,k:()=>e})},33290:(a,b,c)=>{function d(){return globalThis.__piDeskNativePluginDiagnostics||(globalThis.__piDeskNativePluginDiagnostics=[]),globalThis.__piDeskNativePluginDiagnostics}function e(a,b){let c=d();!c.some(c=>c.cwd===a&&c.message===b)&&(c.push({cwd:a,message:b}),c.length>100&&c.splice(0,c.length-100))}function f(a){let b=a=>{let b=a.replaceAll("\\","/");return"win32"===process.platform?b.toLowerCase():b},c=b(a).replace(/\/$/,""),e=d();for(let a=e.length-1;a>=0;a-=1){let d=b(e[a].message);(d.includes(`${c}:`)||d.includes(`${c}/`))&&e.splice(a,1)}}function g(){return d().map(a=>({...a}))}c.d(b,{pL:()=>e,tt:()=>f,u7:()=>g})},34458:(a,b,c)=>{c.a(a,async(a,d)=>{try{let r;c.d(b,{dz:()=>o,qX:()=>n,w$:()=>i.w$});var e=c(4287),f=c(5235),g=c(64253),h=c(73159),i=c(621),j=a([f,g,h,i]);function k(a){return new URL(e.SZ.parse(a)).href.replace(/\/+$/,"")}function l(a,b,c){return new URL(`${k(a)}/${encodeURIComponent(b)}${c?`/${encodeURIComponent(c)}`:""}`)}function m(a,b){let c=(0,i.JM)(a.versions),d=(0,i.JM)(a["dist-tags"]),e="string"==typeof d[b]?d[b]:b.replace(/^v(?=\d+\.)/,"");if("string"!=typeof e||!Object.hasOwn(c,e))throw new h.XH("插件源不存在指定版本或标签",404,"missing");if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(e))throw new h.XH("插件源返回的版本无效");return e}async function n(a,b){let c=(0,f.to)(b.agentDir),d=b.downloadSource??c.downloadSource;if("local"===d.mode){let c=await (0,g.B)(b.agentDir),d=a.startsWith("@")?c[`${a.split("/")[0]}:registry`]:void 0;return{registry:k(d||c.registry||f.Nx),fallback:!1}}if(b.registry){let a=k(b.registry);if(![f.Nx,f.sv].includes(a))return{registry:a,fallback:!1}}let e=c.registries[`npm:${a}`];if(e)return{registry:k(e),fallback:!1};if(a.startsWith("@")){let c=(await (0,g.B)(b.agentDir))[`${a.split("/")[0]}:registry`];if(c){let a=k(c);if(![f.Nx,f.sv].includes(a))return{registry:a,fallback:!1}}}return"custom"===d.mode?{registry:k(d.registry),fallback:!1}:"official"===d.mode?{registry:f.Nx,fallback:!1}:"domestic"===d.mode?{registry:f.sv,fallback:!1}:{registry:await function(){if(!r||r.expires<=Date.now()){let a=(async()=>{try{let a=await (0,h.NL)(new URL("https://ipwho.is/?fields=success,country_code"),{limit:1024,timeout:3e3,cache:!1,auth:!1}),b=(0,i.JM)(JSON.parse(a.toString("utf8")));if(!0!==b.success)throw Error("出口地区检测失败");return"CN"===b.country_code?f.sv:f.Nx}catch{return r&&(r.expires=Date.now()+6e4),f.Nx}})();r={expires:Date.now()+18e5,value:a}}return r.value}(),fallback:!0}}async function o(a,b={}){let c;if(!a.startsWith("npm:"))return{source:a};let d=/^npm:((?:@[^/]+\/)?[^@]+)(?:@([^@]+))?$/.exec(a);if(!d)throw new h.XH("npm 插件来源无效",400);let e=d[1];if(e.length>214||!/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*$/i.test(e))throw new h.XH("npm 插件包名无效",400);let g=d[2]??"latest";if(g.length>128||!/^[a-zA-Z0-9._+-]+$/.test(g))throw new h.XH("npm 插件版本或标签无效",400);let j=b.downloadSource??(0,f.to)(b.agentDir).downloadSource,k=await n(e,{...b,downloadSource:j}),r=k.registry,s=g;try{let a=await p(l(r,e),b),d=(0,i.JM)(a["dist-tags"])[g];"string"==typeof d&&(s=d),c=m(a,s),q((0,i.JM)(a.versions)[c],e,c)}catch(d){if(!k.fallback||r===f.Nx||!(d instanceof h.XH)||!["network","missing"].includes(d.reason))throw d;console.warn("[Pi Desk][PluginRegistry] 自动下载源不可用,回退 npm 官方源",{name:e,reason:d.reason}),r=f.Nx;let a=await p(l(r,e),b);c=m(a,s),q((0,i.JM)(a.versions)[c],e,c)}return{source:`npm:${e}@${c}`,..."local"===j.mode?{}:{registry:r}}}async function p(a,b){if(!1!==b.cache)return(0,h.Yq)(a,b.signal,b.agentDir);let c=await (0,h.NL)(a,{limit:8388608,signal:b.signal,cache:!1,agentDir:b.agentDir});try{let a=JSON.parse(c.toString("utf8"));if(!a||"object"!=typeof a||Array.isArray(a))throw Error("invalid");return a}catch{throw new h.XH("插件源返回的元数据格式无效")}}function q(a,b,c){let d=(0,i.JM)(a);if(d.name!==b||"string"!=typeof d.version||c&&d.version!==c)throw new h.XH("插件源返回的包名或版本不匹配");return d}[f,g,h,i]=j.then?(await j)():j,d()}catch(a){d(a)}})},47154:(a,b,c)=>{c.d(b,{V:()=>d});function d(a){let b=(globalThis.__piDeskPackageRootTail??Promise.resolve()).then(a,a);return globalThis.__piDeskPackageRootTail=b.then(()=>void 0,()=>void 0),b}},50520:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{L2PluginManagement:()=>P,L2PluginManagementInvalidPackageError:()=>L,L2PluginManagementNotFoundError:()=>J,L2PluginManagementOperationConflictError:()=>K,L2PluginManagementPackageRootError:()=>M,L2PluginManagementRestartPendingError:()=>N,L2PluginManagementRestartUnavailableError:()=>O,disposeL2PluginManagement:()=>G,getL2PluginManagement:()=>I,initializeL2PluginManagement:()=>H});var e=c(16056),f=c(17691),g=c(76019),h=c(77598),i=c(51455),j=c(76760),k=c(75430),l=c(93951),m=c(4287),n=c(34458),o=c(5235),p=c(36361),q=c(69371),r=c(75157),s=c(47154),t=c(60719),u=c(33290),v=c(53584),w=c(96783),x=c(20700),y=c(78597),z=a([f,k,n,o,p,t,y]);[f,k,n,o,p,t,y]=z.then?(await z)():z;class J extends Error{constructor(a){super(`插件不存在:${a}`),this.source=a,this.name="L2PluginManagementNotFoundError"}}class K extends Error{constructor(a){super(a),this.name="L2PluginManagementOperationConflictError"}}class L extends Error{constructor(a){super(a),this.name="L2PluginManagementInvalidPackageError"}}class M extends Error{constructor(a){super(a.message),this.rootError=a,this.name="L2PluginManagementPackageRootError"}}class N extends Error{constructor(){super("已有插件操作需要重启完成"),this.name="L2PluginManagementRestartPendingError"}}class O extends Error{constructor(){super("当前启动方式不支持自动重启 Pi Desk"),this.name="L2PluginManagementRestartUnavailableError"}}function A(a,b,c){let d=(0,j.resolve)(a,b),e=(0,j.relative)(a,d);if(e.startsWith("..")||(0,j.isAbsolute)(e))throw Error(`${c} 必须位于插件包目录内`);return d}async function B(a){try{return(await (0,i.stat)(a)).isFile()}catch{return!1}}function C(a){return a instanceof Error&&a.message?a.message:String(a)}async function D(a){let b;if((await (0,i.stat)(a)).isFile())return{version:null,error:null};try{b=JSON.parse(await (0,i.readFile)((0,j.join)(a,"package.json"),"utf8"))}catch(a){if(a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code)return{version:null,error:null};return{version:null,error:{phase:"package",message:C(a)}}}let c="string"==typeof b.version&&b.version.trim()?b.version.trim():null;try{let d=b.piDesk?.entry??b.piDesk?.global;if(void 0!==d){if("string"!=typeof d||!d.trim())throw Error("piDesk.entry 必须是非空字符串");let b=A(a,d,"piDesk.entry");if(!await B(b))throw Error("Pi Desk Entry 文件不存在")}let e=b.pi?.extensions;if(void 0!==e&&!Array.isArray(e))throw Error("pi.extensions 必须是数组");for(let b of e??[]){if("string"!=typeof b||!b.trim())throw Error("pi.extensions 只允许非空字符串");if(/[*?[\]{}]/.test(b))continue;let c=A(a,b,"pi.extensions");if(!await B(c))throw Error(`Native Extension 文件不存在:${b}`)}return{version:c,error:null}}catch(a){return{version:c,error:{phase:"entry",message:C(a)}}}}async function E(a,b){let[c,d]=await Promise.all([(0,i.realpath)(a),(0,i.realpath)(b)]),e=(0,j.relative)(c,d);if(e.startsWith("..")||(0,j.isAbsolute)(e))throw Error("插件能力资源必须位于 Package 目录内");let f=await (0,i.open)(d,"r");try{let a=Buffer.alloc(65537),{bytesRead:b}=await f.read(a,0,a.length,0);return{content:a.subarray(0,Math.min(b,65536)).toString("utf8"),truncated:b>65536}}finally{await f.close()}}function F(a,b,c){return{error:function(a){if(!a)return null;if(a.length<=32768)return a;let b=a.slice(0,32752);return(0,g.J8)(`${b}
|
|
3
|
+
${d}`),n(()=>c(b))},a.timeoutMs)).unref(),a.signal?.addEventListener("abort",o,{once:!0}),a.signal?.aborted&&o()})}},17691:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{M:()=>j});var e=c(77598),f=c(73024),g=c(76760),h=c(75430),i=a([h]);function j(){let a=(0,h.getAgentDir)(),b=(0,g.join)(a,"pi-desk"),c=(0,g.join)(a,"pi-super");if((0,f.existsSync)(b)||!(0,f.existsSync)(c))return b;let d=(0,g.join)(a,`.pi-desk-migration-${(0,e.randomUUID)()}`);try{(0,f.cpSync)(c,d,{recursive:!0,errorOnExist:!0,force:!1}),(0,f.renameSync)(d,b),console.info("[Pi Desk] 已复制旧版应用数据到新目录")}finally{(0,f.rmSync)(d,{recursive:!0,force:!0})}return b}h=(i.then?(await i)():i)[0],d()}catch(a){d(a)}})},20700:(a,b,c)=>{function d(){return globalThis.__piDeskRestartHandler??null}function e(){return null!==d()}function f(a,b){let c=d();if(!c)throw Error("当前启动方式不支持自动重启 Pi Desk");setTimeout(()=>c(a,b),150).unref()}c.d(b,{Z:()=>f,k:()=>e})},33290:(a,b,c)=>{function d(){return globalThis.__piDeskNativePluginDiagnostics||(globalThis.__piDeskNativePluginDiagnostics=[]),globalThis.__piDeskNativePluginDiagnostics}function e(a,b){let c=d();!c.some(c=>c.cwd===a&&c.message===b)&&(c.push({cwd:a,message:b}),c.length>100&&c.splice(0,c.length-100))}function f(a){let b=a=>{let b=a.replaceAll("\\","/");return"win32"===process.platform?b.toLowerCase():b},c=b(a).replace(/\/$/,""),e=d();for(let a=e.length-1;a>=0;a-=1){let d=b(e[a].message);(d.includes(`${c}:`)||d.includes(`${c}/`))&&e.splice(a,1)}}function g(){return d().map(a=>({...a}))}c.d(b,{pL:()=>e,tt:()=>f,u7:()=>g})},34458:(a,b,c)=>{c.a(a,async(a,d)=>{try{let r;c.d(b,{dz:()=>o,qX:()=>n,w$:()=>i.w$});var e=c(4287),f=c(5235),g=c(64253),h=c(73159),i=c(621),j=a([f,g,h,i]);function k(a){return new URL(e.SZ.parse(a)).href.replace(/\/+$/,"")}function l(a,b,c){return new URL(`${k(a)}/${encodeURIComponent(b)}${c?`/${encodeURIComponent(c)}`:""}`)}function m(a,b){let c=(0,i.JM)(a.versions),d=(0,i.JM)(a["dist-tags"]),e="string"==typeof d[b]?d[b]:b.replace(/^v(?=\d+\.)/,"");if("string"!=typeof e||!Object.hasOwn(c,e))throw new h.XH("插件源不存在指定版本或标签",404,"missing");if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(e))throw new h.XH("插件源返回的版本无效");return e}async function n(a,b){let c=(0,f.to)(b.agentDir),d=b.downloadSource??c.downloadSource;if("local"===d.mode){let c=await (0,g.B)(b.agentDir),d=a.startsWith("@")?c[`${a.split("/")[0]}:registry`]:void 0;return{registry:k(d||c.registry||f.Nx),fallback:!1}}if(b.registry){let a=k(b.registry);if(![f.Nx,f.sv].includes(a))return{registry:a,fallback:!1}}let e=c.registries[`npm:${a}`];if(e)return{registry:k(e),fallback:!1};if(a.startsWith("@")){let c=(await (0,g.B)(b.agentDir))[`${a.split("/")[0]}:registry`];if(c){let a=k(c);if(![f.Nx,f.sv].includes(a))return{registry:a,fallback:!1}}}return"custom"===d.mode?{registry:k(d.registry),fallback:!1}:"official"===d.mode?{registry:f.Nx,fallback:!1}:"domestic"===d.mode?{registry:f.sv,fallback:!1}:{registry:await function(){if(!r||r.expires<=Date.now()){let a=(async()=>{try{let a=await (0,h.NL)(new URL("https://ipwho.is/?fields=success,country_code"),{limit:1024,timeout:3e3,cache:!1,auth:!1}),b=(0,i.JM)(JSON.parse(a.toString("utf8")));if(!0!==b.success)throw Error("出口地区检测失败");return"CN"===b.country_code?f.sv:f.Nx}catch{return r&&(r.expires=Date.now()+6e4),f.Nx}})();r={expires:Date.now()+18e5,value:a}}return r.value}(),fallback:!0}}async function o(a,b={}){let c;if(!a.startsWith("npm:"))return{source:a};let d=/^npm:((?:@[^/]+\/)?[^@]+)(?:@([^@]+))?$/.exec(a);if(!d)throw new h.XH("npm 插件来源无效",400);let e=d[1];if(e.length>214||!/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*$/i.test(e))throw new h.XH("npm 插件包名无效",400);let g=d[2]??"latest";if(g.length>128||!/^[a-zA-Z0-9._+-]+$/.test(g))throw new h.XH("npm 插件版本或标签无效",400);let j=b.downloadSource??(0,f.to)(b.agentDir).downloadSource,k=await n(e,{...b,downloadSource:j}),r=k.registry,s=g;try{let a=await p(l(r,e),b),d=(0,i.JM)(a["dist-tags"])[g];"string"==typeof d&&(s=d),c=m(a,s),q((0,i.JM)(a.versions)[c],e,c)}catch(d){if(!k.fallback||r===f.Nx||!(d instanceof h.XH)||!["network","missing"].includes(d.reason))throw d;console.warn("[Pi Desk][PluginRegistry] 自动下载源不可用,回退 npm 官方源",{name:e,reason:d.reason}),r=f.Nx;let a=await p(l(r,e),b);c=m(a,s),q((0,i.JM)(a.versions)[c],e,c)}return{source:`npm:${e}@${c}`,..."local"===j.mode?{}:{registry:r}}}async function p(a,b){if(!1!==b.cache)return(0,h.Yq)(a,b.signal,b.agentDir);let c=await (0,h.NL)(a,{limit:8388608,signal:b.signal,cache:!1,agentDir:b.agentDir});try{let a=JSON.parse(c.toString("utf8"));if(!a||"object"!=typeof a||Array.isArray(a))throw Error("invalid");return a}catch{throw new h.XH("插件源返回的元数据格式无效")}}function q(a,b,c){let d=(0,i.JM)(a);if(d.name!==b||"string"!=typeof d.version||c&&d.version!==c)throw new h.XH("插件源返回的包名或版本不匹配");return d}[f,g,h,i]=j.then?(await j)():j,d()}catch(a){d(a)}})},47154:(a,b,c)=>{c.d(b,{V:()=>d});function d(a){let b=(globalThis.__piDeskPackageRootTail??Promise.resolve()).then(a,a);return globalThis.__piDeskPackageRootTail=b.then(()=>void 0,()=>void 0),b}},50520:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{L2PluginManagement:()=>P,L2PluginManagementInvalidPackageError:()=>L,L2PluginManagementNotFoundError:()=>J,L2PluginManagementOperationConflictError:()=>K,L2PluginManagementPackageRootError:()=>M,L2PluginManagementRestartPendingError:()=>N,L2PluginManagementRestartUnavailableError:()=>O,disposeL2PluginManagement:()=>G,getL2PluginManagement:()=>I,initializeL2PluginManagement:()=>H});var e=c(16056),f=c(17691),g=c(76019),h=c(77598),i=c(51455),j=c(76760),k=c(75430),l=c(93951),m=c(4287),n=c(34458),o=c(5235),p=c(36361),q=c(69371),r=c(75157),s=c(47154),t=c(60719),u=c(33290),v=c(53584),w=c(96783),x=c(20700),y=c(78597),z=a([f,k,n,o,p,t,y]);[f,k,n,o,p,t,y]=z.then?(await z)():z;class J extends Error{constructor(a){super(`插件不存在:${a}`),this.source=a,this.name="L2PluginManagementNotFoundError"}}class K extends Error{constructor(a){super(a),this.name="L2PluginManagementOperationConflictError"}}class L extends Error{constructor(a){super(a),this.name="L2PluginManagementInvalidPackageError"}}class M extends Error{constructor(a){super(a.message),this.rootError=a,this.name="L2PluginManagementPackageRootError"}}class N extends Error{constructor(){super("已有插件操作需要重启完成"),this.name="L2PluginManagementRestartPendingError"}}class O extends Error{constructor(){super("当前启动方式不支持自动重启 Pi Desk"),this.name="L2PluginManagementRestartUnavailableError"}}function A(a,b,c){let d=(0,j.resolve)(a,b),e=(0,j.relative)(a,d);if(e.startsWith("..")||(0,j.isAbsolute)(e))throw Error(`${c} 必须位于插件包目录内`);return d}async function B(a){try{return(await (0,i.stat)(a)).isFile()}catch{return!1}}function C(a){return a instanceof Error&&a.message?a.message:String(a)}async function D(a){let b;if((await (0,i.stat)(a)).isFile())return{version:null,error:null};try{b=JSON.parse(await (0,i.readFile)((0,j.join)(a,"package.json"),"utf8"))}catch(a){if(a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code)return{version:null,error:null};return{version:null,error:{phase:"package",message:C(a)}}}let c="string"==typeof b.version&&b.version.trim()?b.version.trim():null;try{let d=b.piDesk?.entry??b.piDesk?.global;if(void 0!==d){if("string"!=typeof d||!d.trim())throw Error("piDesk.entry 必须是非空字符串");let b=A(a,d,"piDesk.entry");if(!await B(b))throw Error("Pi Desk Entry 文件不存在")}let e=b.pi?.extensions;if(void 0!==e&&!Array.isArray(e))throw Error("pi.extensions 必须是数组");for(let b of e??[]){if("string"!=typeof b||!b.trim())throw Error("pi.extensions 只允许非空字符串");if(/[*?[\]{}]/.test(b))continue;let c=A(a,b,"pi.extensions");if(!await B(c))throw Error(`Native Extension 文件不存在:${b}`)}return{version:c,error:null}}catch(a){return{version:c,error:{phase:"entry",message:C(a)}}}}async function E(a,b){let[c,d]=await Promise.all([(0,i.realpath)(a),(0,i.realpath)(b)]),e=(0,j.relative)(c,d);if(e.startsWith("..")||(0,j.isAbsolute)(e))throw Error("插件能力资源必须位于 Package 目录内");let f=await (0,i.open)(d,"r");try{let a=Buffer.alloc(65537),{bytesRead:b}=await f.read(a,0,a.length,0);return{content:a.subarray(0,Math.min(b,65536)).toString("utf8"),truncated:b>65536}}finally{await f.close()}}function F(a,b,c){return{error:function(a){if(!a)return null;if(a.length<=32768)return a;let b=a.slice(0,32752);return(0,g.J8)(`${b}
|
|
4
4
|
…(已截断)`,`${b}
|
|
5
|
-
… (truncated)`)}(a?.error??c),extensions:a?.extensions??[],tools:a?.tools.map(a=>({name:a.name,label:a.label,state:a.state,description:a.description,promptSnippet:a.promptSnippet,promptGuidelineCount:a.promptGuidelineCount,promptGuidelinePreview:a.promptGuidelinePreview}))??[],skills:a?.skills.map(a=>({name:a.name,description:a.description,path:a.path,modelVisible:a.modelVisible}))??[],prompts:a?.prompts.map(a=>({name:a.name,description:a.description,path:a.path}))??[],themes:a?.themes??[],providers:a?.providers??[],piDesk:{methods:b?[...b.methods]:[],browserEntries:b?[...b.browserEntries]:[],messageDeclarations:b?[...b.messageDeclarations]:[]}}}class P{get restartRequired(){return this.deferredMaintenance.size>0}constructor(a,b=process.cwd(),c=(0,k.getAgentDir)()){this.workSessions=a,this.cwd=b,this.agentDir=c,this.operationTail=Promise.resolve(),this.operations=new Map,this.listeners=new Set,this.lifetime=new AbortController,this.disposed=!1,this.activeSource=null,this.sourceCache=null,this.capabilityCache=null,this.deferredMaintenance=new Map;const d=(0,h.createHash)("sha256").update(this.agentDir).digest("hex").slice(0,16);this.stagingRoot=(0,j.join)(this.cwd,"temp","pi",`plugin-management-${d}`),this.packageManagerCwd=(0,j.join)((0,f.M)(),"plugin-package-manager"),this.updates=new y.E(this.agentDir,this.packageManagerCwd,this.lifetime.signal),this.maintenanceError=process.env.PI_DESK_PLUGIN_MAINTENANCE_ERROR?.trim()||null,this.unsubscribeRuntime=(0,p.getL4PiGlobalPluginRuntime)().subscribeChanges(()=>this.publish()),this.staleStagingCleanup=(0,i.rm)(this.stagingRoot,{recursive:!0,force:!0}).catch(a=>{console.warn("[Pi Desk][PluginManagement] 清理上次中断的候选目录失败",{path:this.stagingRoot,errorName:a instanceof Error?a.name:"UnknownError"})})}list(a=!1){return this.assertOpen(),this.readSnapshot(a)}async batch(a){this.assertOpen();let b=[],c=new Set;for(let d of"add"===a.action?a.items:a.sources.map(a=>({source:a})))try{let e="add"===a.action?this.normalizeAddedSource(d.source):d.source,f=(0,m.LD)(e);if(c.has(f))throw new K("批量请求中包含重复来源");if(c.add(f),"add"===a.action){let{source:a,...b}=d;await this.reinstall(e,void 0,b)}else"update"===a.action?await this.update(e):"del"===a.action?await this.del(e):await this.setUpdateTag(e,a.tag);b.push({source:d.source,error:null})}catch(a){b.push({source:d.source,error:C(a).slice(0,4e3)})}return{snapshot:await this.readSnapshot(!1),results:b}}subscribe(a){return this.assertOpen(),this.listeners.add(a),()=>this.listeners.delete(a)}get(a){return this.assertOpen(),this.readDetail(a)}add(a,b={}){return this.mutate("add",this.normalizeAddedSource(a),!1,void 0,b)}setEnabled(a,b){return this.mutate(b?"enable":"disable",a)}async update(a){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不执行插件维护");this.assertSourceIdle(a);let b=(await this.readSources()).sources.find(b=>(0,m.LD)(b.source)===(0,m.LD)(a));if(!b)throw new J(a);if((0,m.ug)(b.source)){let a=await this.readSnapshot({checkUpdates:!0,sources:[b.source]}),c=a.plugins.find(a=>a.source===b.source);if(c.updateError)throw new L(c.updateError);if(!0!==c.updateAvailable)return a}return this.mutate("update",b.source)}reinstall(a,b,c={}){return this.mutate("add",this.normalizeAddedSource(a),!0,b,c)}async setUpdateTag(a,b){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不执行插件维护");let c=(await this.readSources()).sources.find(b=>(0,m.LD)(b.source)===(0,m.LD)(a));if(!c)throw new J(a);if("package"!==c.kind||!(0,m.ug)(c.source))throw new L("只有 npm 插件包支持更新渠道");this.assertSourceIdle(c.source),(0,o.ks)(c.source,m.mR.parse(b),this.agentDir),this.updates.clear(c.source),this.publish()}assertSourceIdle(a){let b=(0,m.LD)(a);if(this.activeSource&&(0,m.LD)(this.activeSource)===b||[...this.operations].some(([a,c])=>(0,m.LD)(a)===b&&"failed"!==c.phase))throw new K("该来源已有未完成的维护操作")}waitForOperations(a,b){return b=AbortSignal.any([b,this.lifetime.signal]),new Promise((c,d)=>{let e=()=>void 0,f=a=>{e(),b.removeEventListener("abort",g),a?d(a):c()},g=()=>f(Error(this.disposed?"插件管理已关闭":"发起命令的会话已关闭")),h=()=>{if(this.disposed)return f(Error("插件管理已关闭"));for(let b of a){let a=this.operations.get(b);if(a?.phase==="failed")return f(Error(a.message??"插件操作失败"));if(a?.phase==="waiting"&&this.activeSource!==b&&this.restartRequired)return f(Error(`插件尚未生效,需要在设置的插件管理中重启 Pi Desk。${a.message??""}`))}a.some(a=>this.operations.has(a)||this.activeSource===a)||f()};if(b.aborted)return g();e=this.subscribe(h),b.addEventListener("abort",g,{once:!0}),h()})}del(a){return this.mutate("del",a)}async apply(a){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不加载外部插件");if(a?.some(a=>this.deferredMaintenance.has(a)))throw new N;let b=await (0,p.getL4PiGlobalPluginRuntime)().scanSourceChanges(a);this.assertOpen();let c=b.filter(b=>{if(this.deferredMaintenance.has(b.source))return!1;let c=this.operations.get(b.source);if(!c||"failed"===c.phase)return!0;if(a)throw new K("该来源已有未完成操作");return!1}),d=new Set([...this.operations].filter(([,a])=>"failed"!==a.phase).map(([a])=>a));for(let a of c)d.add(a.source);if(d.size>32)throw new K("加载变更超过队列上限,请选择部分来源");for(let a of c){if(!this.operations.has(a.source)&&this.operations.size>=64){let a=[...this.operations].find(([,a])=>"failed"===a.phase);a&&this.operations.delete(a[0])}this.operations.set(a.source,{action:"apply",phase:"queued",message:null}),this.enqueueApply(a)}return this.publish(),this.readSnapshot(!1)}enqueueApply(a){this.runExclusive(async()=>{this.activeSource=a.source;try{this.setOperation(a.source,"checking",null),await this.probeSourceChange(a),this.assertOpen(),this.setOperation(a.source,"applying",null),await (0,p.getL4PiGlobalPluginRuntime)().applySourceChange(a),a.current?.path&&(0,u.tt)(a.current.path),a.previous?.path&&(0,u.tt)(a.previous.path),this.capabilityCache=null,this.workSessions.refreshPluginMessages(),this.operations.delete(a.source)}catch(b){this.setOperation(a.source,"failed",C(b))}finally{this.activeSource=null,this.sourceCache=null,this.publish()}}).catch(b=>{this.disposed||this.setOperation(a.source,"failed",C(b))})}async probeSourceChange(a){let b=a.current;if(!b||!b.enabled)return;if(b.error)throw new L(b.error);if(!b.path)throw new L("插件来源目录不存在");let c=performance.now();console.info("[Pi Desk][PluginManagement] 源码候选预检开始",{source:a.source});let d=(0,j.join)(this.stagingRoot,(0,h.randomUUID)()),e=(0,j.join)(d,"agent"),f=(0,j.join)(d,"workspace");await (0,i.mkdir)(e,{recursive:!0}),await (0,i.mkdir)(f,{recursive:!0});try{if(await (0,i.writeFile)((0,j.join)(e,"settings.json"),JSON.stringify({extensions:[b.path]}),"utf8"),b.piDeskRoot||b.nativePaths.length>0){let c=await (0,w.Y)(f,e,b.nativePaths.length>0),d=c.loadError??c.packages.find(a=>"failed"===a.status)?.error?.message;if(d)throw new L(d);if(b.piDeskRoot&&!c.packages.some(a=>"ready"===a.status))throw new L("预检未加载到候选 Node Entry,放弃本次变更");for(let b of c.packages)if(b.pluginName&&(0,p.getL4PiGlobalPluginRuntime)().readDiagnostics().packages.some(c=>c.source!==a.source&&"ready"===c.status&&c.pluginName===b.pluginName))throw new L(`插件名冲突:${b.pluginName}`)}this.assertOpen()}finally{await (0,i.rm)(d,{recursive:!0,force:!0}),console.info("[Pi Desk][PluginManagement] 源码候选预检结束",{source:a.source,durationMs:Math.round(performance.now()-c)})}}reload(a){return this.activeSource?Promise.reject(new K("维护仍在执行或等待,请先完成当前操作")):this.runExclusive(async()=>(this.assertRestartAvailable(),this.restartWhenQuiet(a)))}async mutate(a,b,c=!1,d,f={}){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不执行插件维护,请通过基础聊天修复或正常启动后维护");let g=await this.readSources();this.assertOpen();let h=g.sources.find(a=>(0,m.LD)(a.source)===(0,m.LD)(b));if("add"!==a){if(!h)throw new J(b);if("package"!==h.kind&&"enable"!==a&&"disable"!==a)throw new L("裸扩展不是已安装包,请编辑源码后加载变更;此操作不会删除源码")}let i=(d??=h?.source)??b;if(f.tag&&!(0,m.ug)(b))throw new L("只有 npm 插件包支持更新渠道");for(let a of[b,i])this.assertSourceIdle(a);if([...this.operations.values()].filter(a=>"failed"!==a.phase).length>=32)throw new K("插件维护队列已满,请等待当前操作完成");if(this.operations.size>=64){let a=[...this.operations].find(([,a])=>"failed"===a.phase);a&&this.operations.delete(a[0])}return d&&d!==b&&this.operations.get(d)?.phase==="failed"&&this.operations.delete(d),this.operations.set(i,{action:a,phase:"queued",message:null}),this.updates.clear(i),this.updates.clear(b),this.publish(),this.runExclusive(async()=>{this.activeSource=i;try{await this.executeMutation(a,b,i,c,f),this.deferredMaintenance.has(i)||this.operations.delete(i)}catch(a){this.setOperation(i,"failed",C(a))}finally{this.updates.clear(i),this.updates.clear(b),this.sourceCache=null,this.activeSource=null,this.publish()}}).catch(a=>{this.disposed||this.setOperation(i,"failed",C(a))}),this.readSnapshot(!1)}async executeMutation(a,b,c,d,e){let f=(0,p.getL4PiGlobalPluginRuntime)(),g=a=>this.setOperation(c,"waiting",a),h=this.createPackageManager();this.throwSettingsErrors(h.settingsManager);let i=h.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope),j=i.find(a=>a.source===c),k=null,l=null;if("enable"!==a&&"disable"!==a){var n;let f=await (0,r.c)({agentDir:this.agentDir,configured:i});if(f)throw new M(f);if("add"!==a&&!j)throw new J(b);this.setOperation(c,"checking","正在确认插件版本和下载源");let h=this.candidateSource(b,j?.installedPath),p=(0,m.ug)(h),q="del"===a?{source:h,updateTag:null}:await this.updates.resolveInstall(h,c,e,"update"===a);if(l=q.updateTag,"update"===a&&p&&j?.installedPath){let a=await D(j.installedPath),b=q.source.slice(q.source.lastIndexOf("@")+1);if(!a.version)throw new L("无法读取插件已安装版本");if(!(0,m.zj)(b,a.version))return}if(k={...p&&"del"!==a&&(d||j||"update"===a)?{action:"reinstall",source:q.source}:(n=q.source,{action:"add"===a?"install":"update"===a?"update":"remove",source:n}),..."registry"in q&&q.registry?{registry:q.registry}:{}},"del"!==a&&await this.probeCandidate(q.source,c,k.registry),l&&((0,o.ks)(c,l,this.agentDir),this.updates.clear(c)),this.deferredMaintenance.size>0){this.deferredMaintenance.set(c,k),g("等待重启后完成安装维护");return}}this.assertOpen(),await f.withSourceIdle(c,async()=>{if(this.setOperation(c,"applying",k?.registry?`下载源:${k.registry}`:null),"enable"===a||"disable"===a){let c=(0,o.to)(this.agentDir).disabled.includes((0,m.LD)(b));(0,o.El)(b,"enable"===a,this.agentDir),this.sourceCache=null;try{if(await this.applyMutationSources([b],!0),"enable"===a&&!(await this.readSources()).sources.find(a=>a.source===b)?.enabled)throw new L("此插件仍被 Pi 配置排除,请先调整原有资源配置")}catch(a){throw(0,o.El)(b,!c,this.agentDir),this.sourceCache=null,a}}else if(k)try{await f.replaceSource(c,null),await (0,s.V)(async()=>{await (0,q.wC)({maintenance:k,agentDir:this.agentDir,cwd:this.packageManagerCwd}),"del"!==a&&await this.verifyInstalledPackage(k.source)}),this.sourceCache=null,await this.applyMutationSources([c,k.source],!1)}catch(a){if(a instanceof q.rZ&&"locked"===a.kind&&(0,x.k)())this.deferredMaintenance.set(c,k),g("文件正在被使用,需要重启后完成操作");else throw a}this.updates.clear(c),this.updates.clear(b),this.capabilityCache=null,this.workSessions.refreshPluginMessages()},this.lifetime.signal,g)}async verifyInstalledPackage(a){let b=this.createPackageManager();this.throwSettingsErrors(b.settingsManager);let c=(0,m.LD)(a),d=b.packageManager.listConfiguredPackages().find(a=>"user"===a.scope&&(0,m.LD)(a.source)===c);if(!d?.installedPath)throw new L("插件安装后没有有效目录");await this.verifyPackageVersion(a,d.installedPath)}async verifyPackageVersion(a,b){let c=await D(b);if(c.error)throw new L("string"==typeof c.error.message?c.error.message:c.error.message.default);if((0,m.ug)(a)){let b=a.slice(a.lastIndexOf("@")+1);if(c.version!==b)throw new L(`插件实际安装版本与目标不一致:${c.version??"未知"},目标 ${b}`)}}async applyMutationSources(a,b){let c=new Set(a.map(m.LD)),d=(0,p.getL4PiGlobalPluginRuntime)(),e=await d.scanSourceChanges(),f=await this.readSources(),g=[...new Set([...e.filter(a=>c.has((0,m.LD)(a.source))).map(a=>a.source),...f.sources.filter(a=>c.has((0,m.LD)(a.source))).map(a=>a.source)])];for(let a of g.length?await d.scanSourceChanges(g):[])b&&await this.probeSourceChange(a),await d.applySourceChange(a),a.current?.path&&(0,u.tt)(a.current.path),a.previous?.path&&(0,u.tt)(a.previous.path)}dispose(){this.disposed||(this.disposed=!0,this.lifetime.abort(),this.unsubscribeRuntime(),this.listeners.clear())}assertOpen(){if(this.disposed)throw new K("插件管理已关闭")}setOperation(a,b,c){let d=this.operations.get(a);if(!d)return;let e=c?.slice(0,4e3)??null;(d.phase!==b||d.message!==e)&&(this.operations.set(a,{...d,phase:b,message:e}),"failed"===b&&console.warn("[Pi Desk][PluginManagement] 插件操作失败",{source:a,action:d.action,message:e}),this.publish())}publish(){if(!this.disposed)for(let a of this.listeners)try{a()}catch(a){console.warn("[Pi Desk][PluginManagement] 状态监听失败",{message:C(a)})}}async readSources(){let a=()=>null!==this.activeSource&&this.operations.get(this.activeSource)?.phase==="applying";if(a()&&this.sourceCache)return this.sourceCache;let b=await (0,t.o)(this.packageManagerCwd,this.agentDir,{DefaultPackageManager:k.DefaultPackageManager,SettingsManager:k.SettingsManager});return a()&&this.sourceCache||(this.sourceCache=b),a()&&this.sourceCache?this.sourceCache:b}async probeCandidate(a,b,c){let d=(0,j.join)(this.stagingRoot,(0,h.randomUUID)()),e=(0,j.join)(d,"agent"),f=(0,j.join)(d,"workspace");await (0,i.mkdir)(f,{recursive:!0}),console.info("[Pi Desk][PluginManagement] 开始在隔离 AgentDir 预检候选插件",{source:a});try{if(!c&&(0,m.ug)(a))for(let b of[".npmrc",(0,j.join)("etc","npmrc")]){let c=(0,j.join)(e,"npm",b);await (0,i.mkdir)((0,j.dirname)(c),{recursive:!0});try{await (0,i.copyFile)((0,j.join)(this.agentDir,"npm",b),c),console.info("[Pi Desk][PluginManagement] 已为隔离预检继承本机 npm 配置",{source:a,configPath:b})}catch(a){if("ENOENT"!==a.code)throw new L(`无法继承本机 npm 配置(${b}):${C(a)}`)}}await (0,q.wC)({maintenance:{action:"install",source:a,...c?{registry:c}:{}},agentDir:e,cwd:f}),this.assertOpen();let d=this.createPackageManager(e,f);this.throwSettingsErrors(d.settingsManager);let g=d.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope)[0];if(!g?.installedPath)throw new L("候选插件安装后没有有效目录");await this.verifyPackageVersion(a,g.installedPath);let h=await (0,w.Y)(f,e,!0);if(h.loadError)throw new L(h.loadError);let k=h.packages.find(a=>"failed"===a.status);if(k?.error)throw new L(k.error.message);let l=h.packages[0]?.pluginName;if(l&&(0,p.getL4PiGlobalPluginRuntime)().readDiagnostics().packages.find(a=>a.source!==b&&a.pluginName===l))throw new L(`pluginName 已由其他 Package 注册:${l}`);this.assertOpen(),console.info("[Pi Desk][PluginManagement] 候选插件隔离预检通过",{source:a})}catch(a){if(a instanceof L)throw a;throw new L(C(a))}finally{await (0,i.rm)(d,{recursive:!0,force:!0}).catch(a=>{console.warn("[Pi Desk][PluginManagement] 清理候选插件目录失败",{path:d,errorName:a instanceof Error?a.name:"UnknownError"})})}}restartWhenQuiet(a){return this.workSessions.runPluginRestart(async()=>{let b=(0,p.getL4PiGlobalPluginRuntime)(),c=await this.readSnapshot(!1);return await b.prepareReload(),console.info("[Pi Desk][PluginManagement] 插件 Runtime 已通过静默检查,准备重启",{deferredCount:this.deferredMaintenance.size}),(0,x.Z)("basic"===a||0===this.deferredMaintenance.size?void 0:[...this.deferredMaintenance.values()],a),c})}async readDetail(a){if((0,e.P)())throw new K("基础模式不执行插件能力盘点");let b=(await this.readSources()).sources.find(b=>b.source===a),c=b?await (0,t.W)(b):null;if(!c)throw new J(a);let d=await this.readCapabilities(!1),f=d.packages.find(b=>b.source===a);if(!f)throw Error(d.loadError??`插件能力详情不可用:${a}`);let[g,h]=await Promise.all([Promise.all(f.skills.map(async a=>({name:a.name,description:a.description,path:a.path,modelVisible:a.modelVisible,...await E(c,a.filePath)}))),Promise.all(f.prompts.map(async a=>({name:a.name,description:a.description,path:a.path,...await E(c,a.filePath)})))]);return l.tA.parse({source:a,readme:await (0,n.w$)(c),tools:f.tools.map(a=>({name:a.name,label:a.label,state:a.state,description:a.description,parameters:a.parameters,promptSnippet:a.promptSnippetDetail,promptGuidelines:a.promptGuidelines})),skills:g,prompts:h})}async readSnapshot(a){if((0,e.P)())return{plugins:[],restartRequired:!1,loadError:this.maintenanceError};let b=this.createPackageManager(),c=b.settingsManager.drainErrors().map(a=>a.error.message),d=b.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope),f=await (0,r.c)({agentDir:this.agentDir,configured:d}),h=await this.readSources(),i=await this.updates.read(h.sources,"boolean"==typeof a?{checkUpdates:a}:a),j=(0,p.getL4PiGlobalPluginRuntime)(),k=j.readDiagnostics(),n=new Map(k.packages.map(a=>[a.source,a])),q=(0,u.u7)(),s=this.capabilityCache??{packages:[],loadError:null},t=new Map(s.packages.map(a=>[a.source,a])),v=new Map(j.readCapabilityRegistrations().map(a=>[a.source,a])),w=await Promise.all(h.sources.map(async a=>{let b=n.get(a.source),c=a.path?this.findNativeDiagnostic(a.path,q):null,d=(a.error?{phase:"package"===a.kind?"package":"entry",message:a.error}:null)??(b?.status==="failed"?b.error:null)??(c?{phase:"native",message:c}:null);return{source:a.source,kind:a.kind,operation:this.operationFor(a.source),pluginName:b?.pluginName??null,description:a.description,version:a.version??b?.version??null,updateAvailable:i.get(a.source)?.updateAvailable??null,updateTag:i.get(a.source)?.updateTag??null,availableVersion:i.get(a.source)?.availableVersion??null,updateError:i.get(a.source)?.updateError??null,status:a.enabled?d?"failed":b?.status==="ready"?"ready":"available":"disabled",error:d,capabilities:F(t.get(a.source),v.get(a.source),s.loadError)}}));for(let[a,b]of this.operations)w.some(b=>(0,m.LD)(b.source)===(0,m.LD)(a))||w.push({source:a,kind:"package",operation:b,pluginName:null,description:null,version:null,updateAvailable:null,updateTag:(0,m.ug)(a)?(0,o.ey)(a,this.agentDir):null,availableVersion:null,updateError:null,status:"failed"===b.phase?"failed":"available",error:null,capabilities:F(void 0,void 0,null)});return l.oP.parse({plugins:w.sort((a,b)=>a.source.localeCompare(b.source)),restartRequired:this.restartRequired,loadError:function(a){let b=[...new Map(a.flatMap(a=>{let b=("string"==typeof a?a:a.message).trim();return b?[[b,{defaultText:b,englishText:"string"==typeof a?b:a.englishMessage.trim()}]]:[]})).values()];if(0===b.length)return null;let c=b.map(a=>a.defaultText).join("; ");return b.every(a=>a.defaultText===a.englishText)?c:(0,g.J8)(c,b.map(a=>a.englishText).join("; "))}([...c,...h.errors,...k.loadError?[k.loadError]:[],...this.maintenanceError?[this.maintenanceError]:[],...f?[f]:[]])})}async readCapabilities(a){if(!a&&this.capabilityCache)return this.capabilityCache;try{return this.capabilityCache=await (0,s.V)(()=>(this.assertOpen(),!a&&this.capabilityCache)?Promise.resolve(this.capabilityCache):(0,v.a)(this.cwd,this.agentDir)),this.publish(),console.info("[Pi Desk][PluginManagement] 插件能力盘点完成",{packageCount:this.capabilityCache.packages.length,hasLoadError:null!==this.capabilityCache.loadError}),this.capabilityCache}catch(b){let a=C(b);return console.warn("[Pi Desk][PluginManagement] 插件能力盘点失败",{errorName:b instanceof Error?b.name:"UnknownError",message:a}),this.capabilityCache={packages:[],loadError:a},this.publish(),this.capabilityCache}}findNativeDiagnostic(a,b){let c,d=(c=(0,j.resolve)(a).replaceAll("\\","/"),"win32"===process.platform?c.toLowerCase():c),e=b.find(a=>("win32"===process.platform?a.message.replaceAll("\\","/").toLowerCase():a.message.replaceAll("\\","/")).includes(d));return e?.message??null}createPackageManager(a=this.agentDir,b=this.packageManagerCwd){let c=k.SettingsManager.create(b,a,{projectTrusted:!1});return{settingsManager:c,packageManager:new k.DefaultPackageManager({cwd:b,agentDir:a,settingsManager:c})}}candidateSource(a,b){return(0,j.isAbsolute)(a)||/^(?:[a-z][a-z0-9+.-]*:|git@)/i.test(a)?a:b?(0,j.resolve)(b):(0,j.resolve)(this.agentDir,a)}operationFor(a){let b=(0,m.LD)(a);return[...this.operations].find(([a])=>(0,m.LD)(a)===b)?.[1]??null}normalizeAddedSource(a){return/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*(?:@[^\s/]+)?$/i.test(a)?`npm:${a}`:(0,j.isAbsolute)(a)||/^(?:[a-z][a-z0-9+.-]*:|git@)/i.test(a)?a:(0,j.resolve)(this.cwd,a)}throwSettingsErrors(a){let b=a.drainErrors();if(0!==b.length)throw Error(b.map(a=>a.error.message).join("; "))}assertRestartAvailable(){if(!(0,x.k)())throw new O}runExclusive(a){let b=()=>this.staleStagingCleanup.then(()=>(this.assertOpen(),a())),c=this.operationTail.then(b,b);return this.operationTail=c.then(()=>void 0,()=>void 0),c}}function G(){globalThis.__piDeskPluginManagement?.dispose()}function H(a){globalThis.__piDeskPluginManagement||(globalThis.__piDeskPluginManagement=new P(a))}function I(){if(!globalThis.__piDeskPluginManagement)throw Error("插件管理尚未完成进程级装配");return globalThis.__piDeskPluginManagement}d()}catch(a){d(a)}})},53584:(a,b,c)=>{c.d(b,{a:()=>l});var d=c(76760),e=c(36153),f=c(86148),g=c(2472);let h="__PI_DESK_PLUGIN_CAPABILITIES__",i=e.Yj(),j=e.Ik({name:e.Yj(),description:e.Yj().nullable()}).strict(),k=e.Ik({packages:e.YO(e.Ik({source:e.Yj(),error:e.Yj().nullable(),extensions:e.YO(e.Ik({path:e.Yj(),events:e.YO(e.Ik({name:e.Yj(),count:e.ai().int().positive()}).strict()),commands:e.YO(j),shortcuts:e.YO(e.Ik({shortcut:e.Yj(),description:e.Yj().nullable()}).strict()),flags:e.YO(e.Ik({name:e.Yj(),type:e.k5(["boolean","string"]),description:e.Yj().nullable(),default:e.KC([e.zM(),e.Yj(),e.ch()])}).strict()),messageRenderers:e.YO(e.Yj()),entryRenderers:e.YO(e.Yj())}).strict()),tools:e.YO(e.Ik({name:e.Yj(),label:i,state:e.k5(["active","inactive","shadowed"]),description:i,parameters:e.g1(e.Yj(),e.Pq()),promptSnippet:i.nullable(),promptSnippetDetail:i.nullable(),promptGuidelines:e.YO(i),promptGuidelineCount:e.ai().int().nonnegative(),promptGuidelinePreview:i.nullable()}).strict()),skills:e.YO(e.Ik({name:e.Yj(),description:e.Yj(),path:e.Yj(),filePath:e.Yj(),modelVisible:e.zM()}).strict()),prompts:e.YO(e.Ik({name:e.Yj(),description:e.Yj(),path:e.Yj(),filePath:e.Yj()}).strict()),themes:e.YO(e.Ik({name:e.Yj(),path:e.Yj()}).strict()),providers:e.YO(e.Ik({name:e.Yj(),kind:e.k5(["config","native"])}).strict())}).strict()),loadError:e.Yj().nullable()}).strict();async function l(a,b){let c=(0,f.I)(),e=(0,d.join)(process.cwd(),"src","server","l4_foundation","pi","l4-pi-plugin-capability-probe-runner.mts"),{stdout:i,stderr:j,code:l}=await (0,g.i)({args:["--conditions=react-server","--import",c,e],agentDir:b,env:{PI_DESK_PLUGIN_CAPABILITY_AGENT_DIR:b,PI_DESK_PLUGIN_CAPABILITY_CWD:a},maxOutputBytes:4194304,timeoutMs:3e4,timeoutError:()=>Error("插件能力盘点超时"),cleanupError:(a,b)=>Error(`${a}
|
|
6
|
-
能力盘点进程树清理失败`,{cause:b})});if(0!==l)throw Error(j.trim()||`插件能力盘点进程退出码 ${l??"null"}`);let m=i.lastIndexOf(h);if(m<0)throw Error("插件能力盘点没有返回有效结果");let n=i.slice(m+h.length).split(/\r?\n/,1)[0];return k.parse(JSON.parse(n))}},64253:(a,b,c)=>{c.a(a,async(a,d)=>{try{let s;c.d(b,{B:()=>q,I:()=>r});var e=c(31421),f=c(73024),g=c(51455),h=c(76760),i=c(48161),j=c(57975),k=c(75430),l=a([k]);k=(l.then?(await l)():l)[0];let t=(0,j.promisify)(e.execFile);function m(a){return a.replace(/\$\{([^}]+)\}/g,(a,b)=>process.env[b]??a)}async function n(a,b){let c;try{let b=await (0,g.readFile)(a);if(b.length>262144)throw Error("npm 配置文件过大");c=b.toString("utf8")}catch(a){if("ENOENT"===a.code)return;throw a}for(let a of c.split(/\r?\n/)){let c=/^\s*([^;#][^=]*?)\s*=\s*(.*?)\s*$/.exec(a);if(!c)continue;let d=c[2].replace(/\s+[;#].*$/,"").replace(/^(['"])(.*)\1$/,"$2");b[c[1].trim()]=m(d)}}function o(a,b){return("win32"===process.platform?/^~[\\/]/:/^~\//).test(a)?(0,h.resolve)((0,i.homedir)(),a.slice(2)):(0,h.resolve)(b,a)}async function p(a,b){let c={};for(let[a,b]of Object.entries(process.env))if(void 0!==b&&""!==b&&/^npm_config_/i.test(a)){let d=a.slice(11);c[d.startsWith("//")?d:d.replace(/(?!^)_/g,"-").toLowerCase()]=m(b)}let d=function(){for(let a of[(0,h.dirname)(process.execPath),...(process.env.PATH??"").split("win32"===process.platform?";":":")])for(let b of[(0,h.join)(a,"node_modules/npm/bin/npm-cli.js"),(0,h.resolve)(a,"../lib/node_modules/npm/bin/npm-cli.js")])if((0,f.existsSync)(b))return b}(),e={};if(d)try{await (0,g.mkdir)(a,{recursive:!0});let c=await t(process.execPath,[d,"config","list","--json","--prefix",b],{cwd:a,timeout:4e3,maxBuffer:524288,windowsHide:!0});e=JSON.parse(c.stdout)}catch{console.warn("[Pi Desk][PluginRegistry] npm 有效配置读取失败,改用 npmrc 和环境配置")}let j={};d&&await n((0,h.resolve)((0,h.dirname)(d),"../npmrc"),j);let k="string"==typeof e.globalconfig?e.globalconfig:c.globalconfig??(0,h.join)(b,"etc/npmrc"),l="string"==typeof e.userconfig?e.userconfig:c.userconfig??(0,h.join)((0,i.homedir)(),".npmrc");for(let[d,f]of(await n(o(k,a),j),await n(o(l,a),j),!0!==e.global&&"true"!==c.global&&"global"!==e.location&&"global"!==c.location&&await n((0,h.join)(b,".npmrc"),j),Object.entries(e)))"string"!=typeof f||"(protected)"===f||/auth|password|username/i.test(d)||(j[d]=f);return{...j,...c}}function q(a=(0,k.getAgentDir)()){let b=process.env.PI_DESK_PACKAGE_MAINTENANCE_CWD??(0,h.join)(a,"pi-desk","plugin-package-manager"),c=(0,h.join)(a,"npm");if(!s||s.cwd!==b||s.prefix!==c||s.expires<=Date.now()){let a=p(b,c);s={cwd:b,prefix:c,expires:Date.now()+3e4,value:a},a.catch(()=>{s?.value===a&&(s=void 0)})}return s.value}function r(a,b){let c=`//${a.host}${a.pathname}`;for(let a of Object.keys(b).flatMap(a=>{let b=/^(\/\/.*\/):(?:_authToken|_auth|username|_password)$/i.exec(a);return b&&c.startsWith(b[1])?[b[1]]:[]}).sort((a,b)=>b.length-a.length)){let c=b[`${a}:_authToken`]??b[`${a}:_authtoken`];if(c&&!c.includes("${"))return`Bearer ${c}`;let d=b[`${a}:_auth`];if(d&&!d.includes("${"))return`Basic ${d}`;let e=b[`${a}:username`],f=b[`${a}:_password`];if(e&&f&&!f.includes("${"))return`Basic ${Buffer.from(`${e}:${Buffer.from(f,"base64").toString("utf8")}`).toString("base64")}`}let d=b.registry;if(d){let c=new URL(d);if(a.origin===c.origin&&a.pathname.startsWith(`${c.pathname.replace(/\/+$/,"")}/`)){let a=b._authToken??b._authtoken;if(a&&!a.includes("${"))return`Bearer ${a}`;if(b._auth&&!b._auth.includes("${"))return`Basic ${b._auth}`}}}d()}catch(a){d(a)}})},69371:(a,b,c)=>{c.d(b,{rZ:()=>g,wC:()=>h});var d=c(76760),e=c(86148),f=c(2472);class g extends Error{constructor(a,b,c){super(b.slice(-4e3)||`Pi Package 命令退出码 ${c??"null"}`),this.kind=a,this.output=b,this.exitCode=c,this.name="L4PiPackageMaintenanceError"}}async function h(a){let b=(0,e.I)(),c=(0,d.join)(process.cwd(),"src","server","l4_foundation","pi","l4-pi-package-maintenance-runner.mts"),{stdout:h,stderr:i,code:j}=await (0,f.i)({args:["--import",b,c,a.maintenance.action,a.maintenance.source,...a.maintenance.registry?[a.maintenance.registry]:[]],agentDir:a.agentDir,env:{PI_DESK_PACKAGE_MAINTENANCE_CWD:a.cwd},maxOutputBytes:1048576,timeoutMs:12e4,timeoutError:()=>new g("failed","包维护超过120秒,已停止;结果未确认,请检查配置后手动处理",null),cleanupError:(a,b)=>new g("failed",`维护进程树未确认释放:${b instanceof Error?b.message:String(b)}`,null)});if(0===j)return;let k=(i||h).trim();throw new g(function(a){let b=a.toLowerCase();if(b.includes("ebusy")||b.includes("etxtbsy")||b.includes("resource busy")||b.includes("being used by another process")||b.includes("used by another process")||b.includes("process cannot access the file because it is being used"))return"locked";let c=b.includes("eperm")||b.includes("eacces")||b.includes("operation not permitted"),d=/\b(unlink|rename|rmdir|rimraf|remove|cleanup)\b/.test(b);return c&&d?"locked":"failed"}(k),k,j)}},69375:(a,b,c)=>{c.d(b,{Od:()=>r,tU:()=>n,hE:()=>q,P9:()=>f,_G:()=>j,Vc:()=>i});var d=c(36153);d.Yj().uuid();let e=d.Ik({key:d.Yj().min(1).max(160),params:d.g1(d.Yj().min(1).max(80),d.KC([d.Yj().max(1e3),d.ai().finite()])).optional()}).strict(),f=4001,g=d.Yj().trim().min(1),h=d.Yj().uuid();function i(a){return Object.freeze({op:"req",path:g.parse(a.path),inputSchema:a.inputSchema,outputSchema:a.outputSchema,...void 0===a.timeoutMs?{}:{timeoutMs:d.ai().int().positive().parse(a.timeoutMs)}})}function j(a){return Object.freeze({op:"push",path:g.parse(a.path),bodySchema:a.bodySchema})}let k=d.Ik({op:d.eu("req"),path:g,requestId:h}).strict(),l=d.Ik({op:d.eu("resp"),path:g,requestId:h}).strict(),m=d.Ik({op:d.eu("push"),path:g}).strict(),n=d.Ik({head:k,body:d.Pq()}).strict(),o=d.Ik({head:l,body:d.Ik({code:d.eu(0),msg:d.eu(""),data:d.Pq()}).strict()}).strict(),p=d.Ik({head:l,body:d.Ik({code:d.ai().int().positive(),msg:d.Yj().min(1),data:d.ch(),i18n:e.optional()}).strict()}).strict(),q=d.KC([o,p]),r=d.Ik({head:m,body:d.Pq()}).strict()},72497:(a,b,c)=>{c.d(b,{Dz:()=>h,f7:()=>g,tv:()=>f});var d=c(36153);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=e,g=e,h=d.g1(d.Yj(),d.Pq());d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/);let i=d.k5(["plugin","server","rocket","settings","panel","message","terminal","file","folder","bot","wrench","database","globe"]);d.gM("type",[d.Ik({type:d.eu("builtin"),name:i}).strict(),d.Ik({type:d.eu("svg"),content:d.Yj().trim().min(1).max(16384)}).strict()])},73159:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{NL:()=>h,XH:()=>j,Yq:()=>i});var e=c(77598),f=c(64253),g=a([f]);f=(g.then?(await g)():g)[0];class j extends Error{constructor(a,b=502,c="invalid"){super(a),this.status=b,this.reason=c,this.name="L4PluginRegistryError"}}let k=new Map,l=0;async function h(a,b){b.signal?.throwIfAborted();let c=!1===b.auth?{}:await (0,f.B)(b.agentDir),d=(0,f.I)(a,c),g=`${a.href}:${b.limit}:${(0,e.createHash)("sha256").update(d??"").digest("hex")}`,h=k.get(g);if(!1!==b.cache&&h&&h.expires>Date.now())return h.body;let i=AbortSignal.any([AbortSignal.timeout(b.timeout??1e4),...b.signal?[b.signal]:[]]),m=a;try{for(let a=0;a<=3;a++){let d=(0,f.I)(m,c),e=await fetch(m,{signal:i,redirect:"manual",headers:d?{Authorization:d}:{}});if([301,302,303,307,308].includes(e.status)){await e.body?.cancel();let b=e.headers.get("location");if(!b||3===a)throw new j("插件源重定向无效");let c=new URL(b,m);if(!["http:","https:"].includes(c.protocol)||c.username||c.password||"https:"===m.protocol&&"https:"!==c.protocol)throw new j("插件源重定向不安全");m=c;continue}if(!e.ok){await e.body?.cancel();let a=404===e.status?"missing":[401,403].includes(e.status)?"denied":e.status>=500?"network":"invalid";throw new j(`插件源请求失败(HTTP ${e.status})`,e.status,a)}if(Number(e.headers.get("content-length")??0)>b.limit)throw await e.body?.cancel(),new j("插件源响应超过大小限制");let h=e.body?.getReader(),n=[],o=0;if(h)try{for(;;){let a=await h.read();if(a.done)break;if((o+=a.value.byteLength)>b.limit)throw new j("插件源响应超过大小限制");n.push(a.value)}}finally{await h.cancel().catch(()=>void 0),h.releaseLock()}let p=Buffer.concat(n);if(!1!==b.cache){for(let[a,b]of k)(b.expires<=Date.now()||a===g)&&(k.delete(a),l-=b.body.length);for(;k.size>=96||l+p.length>0x1800000;){let a=k.entries().next().value;if(!a)break;k.delete(a[0]),l-=a[1].body.length}p.length<=0x1800000&&(k.set(g,{body:p,expires:Date.now()+12e4}),l+=p.length)}return p}throw new j("插件源重定向过多")}catch(a){if(b.signal?.aborted)throw b.signal.reason;if(a instanceof j)throw a;throw new j("插件源网络连接失败或超时",502,"network")}}async function i(a,b,c){let d=await h(a,{limit:8388608,signal:b,agentDir:c});try{let a=JSON.parse(d.toString("utf8"));if(!a||"object"!=typeof a||Array.isArray(a))throw Error("invalid");return a}catch{throw new j("插件源返回的元数据格式无效")}}d()}catch(a){d(a)}})},75157:(a,b,c)=>{c.d(b,{c:()=>g});var d=c(51455),e=c(76760);async function f(a){try{return(await (0,d.stat)(a)).isDirectory()}catch{return!1}}async function g(a){let b=a.configured.flatMap(a=>{let b=function(a){if(!a.startsWith("npm:"))return null;let b=a.slice(4).trim(),c=b.match(/^(@?[^@]+(?:\/[^@]+)?)(?:@(.+))?$/);return c?.[1]??(b||null)}(a.source);return b?[{name:b,item:a}]:[]}),c=(0,e.join)(a.agentDir,"npm","package.json"),g={};try{let a=JSON.parse(await (0,d.readFile)(c,"utf8"));a.dependencies&&"object"==typeof a.dependencies&&(g=a.dependencies)}catch(c){if(0===b.length)return null;let a=c instanceof Error&&c.message?c.message:String(c);return{message:`Pi Package npm 根不可用:${a}`,englishMessage:`Pi Package npm root is unavailable: ${a}`,i18n:{key:"errors:pluginNpmRootUnavailable",params:{detail:a.slice(0,1e3)}}}}let h=new Set(b.map(a=>a.name)),i=new Set(Object.keys(g)),j=[...h].filter(a=>!i.has(a)),k=[];for(let{name:a,item:c}of b)c.installedPath&&await f(c.installedPath)||k.push(a);if(0===j.length&&0===k.length)return null;let l=[j.length>0?`缺少声明:${j.join("、")}`:null,k.length>0?`缺少目录:${k.join("、")}`:null].filter(a=>null!==a),m=[j.length>0?`missing declarations: ${j.join(", ")}`:null,k.length>0?`missing folders: ${k.join(", ")}`:null].filter(a=>null!==a),n=j.length>0?k.length>0?"errors:pluginNpmRootMissingBoth":"errors:pluginNpmRootMissingDeclarations":"errors:pluginNpmRootMissingFolders";return{message:`Pi Package 配置与 npm 根不一致(${l.join(";")})`,englishMessage:`Pi Package configuration does not match the npm root (${m.join("; ")})`,i18n:{key:n,params:{declarations:j.join(", ").slice(0,1e3),folders:k.join(", ").slice(0,1e3)}}}}},76019:(a,b,c)=>{c.d(b,{J8:()=>f,fD:()=>g,qf:()=>e});var d=c(36153);let e=d.KC([d.Yj(),d.Ik({default:d.Yj(),translations:d.g1(d.Yj().min(1).max(35),d.Yj()).refine(a=>Object.keys(a).length<=16,"too many translations")}).strict()]);function f(a,b){return{default:a,translations:{en:b}}}function g(a,b){return"string"==typeof a?a:a.translations[b]??a.translations[b.split("-")[0]]??a.default}},78597:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{E:()=>k});var e=c(75430),f=c(4287),g=c(5235),h=c(34458),i=c(47154),j=a([e,g,h]);[e,g,h]=j.then?(await j)():j;class k{constructor(a,b,c){this.agentDir=a,this.cwd=b,this.signal=c,this.cache=new Map}async resolveInstall(a,b,c,d){let e=(0,f.ug)(a),i=e?/^npm:(?:@[^/]+\/)?[^@]+@([^@]+)$/.exec(a)?.[1]:void 0,j=i&&!/^v?\d+\./.test(i)&&f.mR.safeParse(i).success?i:null,k=e?d?(0,g.ey)(b,this.agentDir):c.tag??j??(0,g.ey)(b,this.agentDir):null,l=e&&k&&(d||!i)?`npm:${e}@${k}`:a;return{...await (0,h.dz)(l,{...c,agentDir:this.agentDir,signal:this.signal,cache:!d&&void 0}),updateTag:k}}clear(a){let b=(0,f.LD)(a);for(let[a,c]of this.cache)c.identity===b&&this.cache.delete(a)}async read(a,b){for(let[a,b]of this.cache)b.expiresAt<=Date.now()&&this.cache.delete(a);let c=b.sources?new Set(b.sources.map(f.LD)):null,d=new Map;for(let j of a){if("package"!==j.kind)continue;let a=(0,f.LD)(j.source),k=(0,f.ug)(j.source),l=k?(0,g.ey)(j.source,this.agentDir):null,m={updateTag:l,updateAvailable:null,availableVersion:null,updateError:null};d.set(j.source,m);let n=!0===b.checkUpdates&&(!c||c.has(a))&&(!b.tag||b.tag===l);if(k){if(!n&&![...this.cache.values()].some(b=>b.identity===a))continue;let b=null;try{let c=(0,g.to)(this.agentDir).downloadSource,e=await (0,h.qX)(k,{agentDir:this.agentDir,downloadSource:c});b=JSON.stringify([a,l,c.mode,e.registry,e.fallback]);let i=this.cache.get(b)?.value;if(n){if(!j.path||!j.version)throw Error("无法读取插件已安装版本");let d=await (0,h.dz)(`npm:${k}@${l}`,{downloadSource:c,agentDir:this.agentDir,signal:this.signal,cache:!1}),e=d.source.slice(d.source.lastIndexOf("@")+1);i={...m,availableVersion:e},this.store(b,a,i)}i&&d.set(j.source,{...i,updateAvailable:!i.updateError&&j.version&&i.availableVersion?(0,f.zj)(i.availableVersion,j.version):null})}catch(e){let c={...m,updateError:this.message(j.source,e)};d.set(j.source,c),b&&this.store(b,a,c)}}else if(/^(?:git:|https?:|git@)/.test(j.source)){let b=JSON.stringify([a,"git"]),c=this.cache.get(b)?.value;if(c&&d.set(j.source,c),!n)continue;try{let c=e.SettingsManager.inMemory({packages:[j.source]}),f=new e.DefaultPackageManager({agentDir:this.agentDir,cwd:this.cwd,settingsManager:c}),g=await (0,i.V)(()=>f.checkForAvailableUpdates()),h={...m,updateAvailable:g.some(a=>"user"===a.scope)};d.set(j.source,h),this.store(b,a,h)}catch(e){let c={...m,updateError:this.message(j.source,e)};d.set(j.source,c),this.store(b,a,c)}}}return d}store(a,b,c){for(this.cache.delete(a);this.cache.size>=128;){let a=this.cache.keys().next().value;if(void 0===a)break;this.cache.delete(a)}this.cache.set(a,{identity:b,expiresAt:Date.now()+3e5,value:c})}message(a,b){let c=(b instanceof Error?b.message:String(b)).slice(0,4e3);return console.warn("[Pi Desk][PluginManagement] 检查插件更新失败",{source:a,message:c}),this.clear(a),c}}d()}catch(a){d(a)}})},86148:(a,b,c)=>{function d(a){let b=a.replaceAll("\\","/");return"tsx"===b||/(?:^|\/)tsx(?:\/|$)/.test(b)}function e(a=process.execArgv){for(let b=0;b<a.length;b+=1){let c=a[b];if("--import"===c){let c=a[b+1];if(c&&d(c))return c;b+=1;continue}if(c.startsWith("--import=")){let a=c.slice(9);if(d(a))return a}}throw Error("Pi Desk 服务缺少 tsx loader,无法启动插件维护子进程")}c.d(b,{I:()=>e})},93951:(a,b,c)=>{c.d(b,{LC:()=>E,tA:()=>G,oP:()=>H});var d=c(36153),e=c(72497),f=c(76019),g=c(4287),h=c(69375);let i=g.SZ,j=g.w3;d.Ik({downloadSource:j,recommendedRegistry:i}).strict(),d.Ik({downloadSource:j}).strict(),d.Ik({query:d.Yj().trim().max(200).default(""),page:d.ai().int().min(1).max(100).default(1),kind:d.k5(["all","desk","pi"]).default("all"),registry:i.optional()}).strict(),d.Ik({name:d.Yj().trim().min(1).max(214).regex(/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*$/i),version:d.Yj().trim().min(1).max(128).optional(),registry:i.optional()}).strict();let k=d.Ik({name:d.Yj(),description:f.qf.nullable(),version:d.Yj(),publisher:d.Yj().nullable(),kind:d.k5(["desk","pi","unknown"]),official:d.zM(),registry:i}).strict();d.Ik({items:d.YO(k),hasMore:d.zM()}).strict(),k.extend({versions:d.YO(d.Yj()),readme:f.qf.nullable(),homepage:d.Yj().nullable(),repository:d.Yj().nullable(),compatible:d.zM().nullable(),compatibilityNote:d.Yj().nullable()}).strict();let l=d.Yj().trim().min(1).max(2048),m=g.mR,n=d.YO(l).min(1).max(32),o=d.Ik({phase:d.k5(["package","entry","setup","resources","resolve","native"]),message:f.qf.refine(a=>"string"==typeof a?a.length>0:a.default.length>0)}).strict(),p=d.Yj().trim().min(1).max(4096),q=d.Yj().trim().min(1).max(256),r=d.Yj().max(32768),s=d.Ik({name:q,label:r,state:d.k5(["active","inactive","shadowed"]),description:r,promptSnippet:r.nullable(),promptGuidelineCount:d.ai().int().nonnegative(),promptGuidelinePreview:r.nullable()}).strict(),t=d.Ik({name:q,label:r,state:d.k5(["active","inactive","shadowed"]),description:r,parameters:e.Dz,promptSnippet:r.nullable(),promptGuidelines:d.YO(r)}).strict(),u=d.Ik({path:p,events:d.YO(d.Ik({name:q,count:d.ai().int().positive()}).strict()),commands:d.YO(d.Ik({name:q,description:r.nullable()}).strict()),shortcuts:d.YO(d.Ik({shortcut:q,description:r.nullable()}).strict()),flags:d.YO(d.Ik({name:q,type:d.k5(["boolean","string"]),description:r.nullable(),default:d.KC([d.zM(),d.Yj(),d.ch()])}).strict()),messageRenderers:d.YO(q),entryRenderers:d.YO(q)}).strict(),v=d.Ik({name:q,description:r,path:p}).strict(),w=v.extend({modelVisible:d.zM()}).strict(),x=v.extend({content:d.Yj().max(65536),truncated:d.zM()}).strict(),y=x.extend({modelVisible:d.zM()}).strict(),z=d.Ik({name:q,path:p}).strict(),A=d.Ik({name:q,kind:d.k5(["config","native"])}).strict(),B=d.Ik({methods:d.YO(d.Ik({pluginName:q,method:q}).strict()),browserEntries:d.YO(d.Ik({pluginName:q}).strict()),messageDeclarations:d.YO(d.Ik({pluginName:q,declarationName:q,priority:d.ai().int().safe()}).strict())}).strict(),C=d.Ik({error:f.qf.refine(a=>"string"==typeof a?a.length<=32768:[a.default,...Object.values(a.translations)].every(a=>a.length<=32768)).nullable(),extensions:d.YO(u),tools:d.YO(s),skills:d.YO(w),prompts:d.YO(v),themes:d.YO(z),providers:d.YO(A),piDesk:B}).strict(),D=d.Ik({action:d.k5(["add","update","del","apply","enable","disable"]),phase:d.k5(["queued","checking","applying","waiting","failed"]),message:d.Yj().max(4e3).nullable()}).strict(),E=(0,h._G)({path:"plugins/management-update",bodySchema:d.Ik({}).strict()}),F=d.Ik({source:l,kind:d.k5(["package","extension"]).default("package"),operation:D.nullable().default(null),pluginName:d.Yj().trim().min(1).nullable(),description:f.qf.nullable().default(null),version:d.Yj().trim().min(1).nullable(),updateAvailable:d.zM().nullable(),updateTag:m.nullable().optional(),availableVersion:d.Yj().min(1).nullable().optional(),updateError:d.Yj().max(4e3).nullable().optional(),status:d.k5(["ready","available","disabled","failed"]),error:o.nullable(),capabilities:C}).strict(),G=d.Ik({source:l,readme:f.qf.nullable().default(null),tools:d.YO(t),skills:d.YO(y),prompts:d.YO(x)}).strict(),H=d.Ik({plugins:d.YO(F),restartRequired:d.zM(),loadError:f.qf.refine(a=>"string"==typeof a?a.length>0:a.default.length>0).nullable()}).strict();d.Ik({sources:d.YO(l).min(1).max(32).optional()}).strict(),d.Ik({}).strict().extend({mode:d.k5(["normal","basic"]).optional()}).strict(),d.Ik({checkUpdates:d.zM().optional(),sources:n.optional(),tag:m.optional()}).strict();let I=d.Ik({source:l}).strict(),J=I.extend({downloadSource:j.optional(),registry:i.optional(),tag:m.optional()}).strict();d.gM("action",[d.Ik({action:d.eu("add"),items:d.YO(J).min(1).max(32)}).strict(),d.Ik({action:d.eu("update"),sources:n}).strict(),d.Ik({action:d.eu("del"),sources:n}).strict(),d.Ik({action:d.eu("tag"),sources:n,tag:m}).strict()]),d.Ik({snapshot:H,results:d.YO(d.Ik({source:l,error:d.Yj().max(4e3).nullable()}).strict()).max(32)}).strict(),I.extend({enabled:d.zM()}).strict()},96783:(a,b,c)=>{c.d(b,{Y:()=>j});var d=c(76760),e=c(36153),f=c(86148),g=c(2472);let h="__PI_DESK_PLUGIN_PROBE__",i=e.Ik({packages:e.YO(e.Ik({source:e.Yj(),packageName:e.Yj().nullable(),version:e.Yj().nullable(),pluginName:e.Yj().nullable(),status:e.k5(["ready","failed"]),error:e.Ik({phase:e.k5(["package","entry","setup","resources","resolve"]),message:e.Yj()}).strict().nullable()}).strict()),loadError:e.Yj().nullable()}).strict();async function j(a,b,c=!1){let e=(0,f.I)(),k=(0,d.join)(process.cwd(),"src","server","l4_foundation","pi","l4-pi-plugin-probe-runner.mts"),{stdout:l,stderr:m,code:n}=await (0,g.i)({args:["--conditions=react-server","--import",e,k],agentDir:b,env:{PI_DESK_PLUGIN_PROBE_AGENT_DIR:b,PI_DESK_PLUGIN_PROBE_CWD:a,PI_DESK_PLUGIN_PROBE_NATIVE:c?"1":void 0},maxOutputBytes:1048576,timeoutMs:3e4,timeoutError:()=>Error("插件预检超时"),cleanupError:(a,b)=>Error(`${a}
|
|
7
|
-
插件预检进程树清理失败`,{cause:b})});if(0!==
|
|
5
|
+
… (truncated)`)}(a?.error??c),extensions:a?.extensions??[],tools:a?.tools.map(a=>({name:a.name,label:a.label,state:a.state,description:a.description,promptSnippet:a.promptSnippet,promptGuidelineCount:a.promptGuidelineCount,promptGuidelinePreview:a.promptGuidelinePreview}))??[],skills:a?.skills.map(a=>({name:a.name,description:a.description,path:a.path,modelVisible:a.modelVisible}))??[],prompts:a?.prompts.map(a=>({name:a.name,description:a.description,path:a.path}))??[],themes:a?.themes??[],providers:a?.providers??[],piDesk:{methods:b?[...b.methods]:[],browserEntries:b?[...b.browserEntries]:[],messageDeclarations:b?[...b.messageDeclarations]:[]}}}class P{get restartRequired(){return this.deferredMaintenance.size>0}constructor(a,b=process.cwd(),c=(0,k.getAgentDir)()){this.workSessions=a,this.cwd=b,this.agentDir=c,this.operationTail=Promise.resolve(),this.operations=new Map,this.listeners=new Set,this.lifetime=new AbortController,this.disposed=!1,this.activeSource=null,this.sourceCache=null,this.capabilityCache=null,this.deferredMaintenance=new Map;const d=(0,h.createHash)("sha256").update(this.agentDir).digest("hex").slice(0,16);this.stagingRoot=(0,j.join)(this.cwd,"temp","pi",`plugin-management-${d}`),this.packageManagerCwd=(0,j.join)((0,f.M)(),"plugin-package-manager"),this.updates=new y.E(this.agentDir,this.packageManagerCwd,this.lifetime.signal),this.maintenanceError=process.env.PI_DESK_PLUGIN_MAINTENANCE_ERROR?.trim()||null,this.unsubscribeRuntime=(0,p.getL4PiGlobalPluginRuntime)().subscribeChanges(()=>this.publish()),this.staleStagingCleanup=(0,i.rm)(this.stagingRoot,{recursive:!0,force:!0}).catch(a=>{console.warn("[Pi Desk][PluginManagement] 清理上次中断的候选目录失败",{path:this.stagingRoot,errorName:a instanceof Error?a.name:"UnknownError"})})}list(a=!1){return this.assertOpen(),this.readSnapshot(a)}async batch(a){this.assertOpen();let b=[],c=new Set,d="add"===a.action||"update"===a.action?await this.readSources():null,e=[];for(let f of"add"===a.action?a.items:a.sources.map(a=>({source:a})))try{let g="add"===a.action?this.normalizeAddedSource(f.source):f.source,h=(0,m.LD)(g);if(c.has(h))throw new K("批量请求中包含重复来源");if(c.add(h),"add"===a.action){let{source:a,...b}=f;e.push(this.acceptMutation("add",g,d,!0,void 0,b))}else"update"===a.action?e.push(this.acceptMutation("update",g,d)):"del"===a.action?await this.del(g):await this.setUpdateTag(g,a.tag);b.push({source:f.source,error:null})}catch(a){b.push({source:f.source,error:C(a).slice(0,4e3)})}return e.length>0&&this.enqueueMutations(e),{snapshot:await this.readSnapshot(!1),results:b}}subscribe(a){return this.assertOpen(),this.listeners.add(a),()=>this.listeners.delete(a)}get(a){return this.assertOpen(),this.readDetail(a)}add(a,b={}){return this.mutate("add",this.normalizeAddedSource(a),!1,void 0,b)}setEnabled(a,b){return this.mutate(b?"enable":"disable",a)}async update(a){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不执行插件维护");this.assertSourceIdle(a);let b=(await this.readSources()).sources.find(b=>(0,m.LD)(b.source)===(0,m.LD)(a));if(!b)throw new J(a);if((0,m.ug)(b.source)){let a=await this.readSnapshot({checkUpdates:!0,sources:[b.source]}),c=a.plugins.find(a=>a.source===b.source);if(c.updateError)throw new L(c.updateError);if(!0!==c.updateAvailable)return a}return this.mutate("update",b.source)}reinstall(a,b,c={}){return this.mutate("add",this.normalizeAddedSource(a),!0,b,c)}async setUpdateTag(a,b){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不执行插件维护");let c=(await this.readSources()).sources.find(b=>(0,m.LD)(b.source)===(0,m.LD)(a));if(!c)throw new J(a);if("package"!==c.kind||!(0,m.ug)(c.source))throw new L("只有 npm 插件包支持更新渠道");this.assertSourceIdle(c.source),(0,o.ks)(c.source,m.mR.parse(b),this.agentDir),this.updates.clear(c.source),this.publish()}assertSourceIdle(a){let b=(0,m.LD)(a);if(this.activeSource&&(0,m.LD)(this.activeSource)===b||[...this.operations].some(([a,c])=>(0,m.LD)(a)===b&&"failed"!==c.phase))throw new K("该来源已有未完成的维护操作")}waitForOperations(a,b){return b=AbortSignal.any([b,this.lifetime.signal]),new Promise((c,d)=>{let e=()=>void 0,f=a=>{e(),b.removeEventListener("abort",g),a?d(a):c()},g=()=>f(Error(this.disposed?"插件管理已关闭":"发起命令的会话已关闭")),h=()=>{if(this.disposed)return f(Error("插件管理已关闭"));for(let b of a){let a=this.operations.get(b);if(a?.phase==="failed")return f(Error(a.message??"插件操作失败"));if(a?.phase==="waiting"&&this.activeSource!==b&&this.restartRequired)return f(Error(`插件尚未生效,需要在设置的插件管理中重启 Pi Desk。${a.message??""}`))}a.some(a=>this.operations.has(a)||this.activeSource===a)||f()};if(b.aborted)return g();e=this.subscribe(h),b.addEventListener("abort",g,{once:!0}),h()})}del(a){return this.mutate("del",a)}async apply(a){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不加载外部插件");if(a?.some(a=>this.deferredMaintenance.has(a)))throw new N;let b=await (0,p.getL4PiGlobalPluginRuntime)().scanSourceChanges(a);this.assertOpen();let c=b.filter(b=>{if(this.deferredMaintenance.has(b.source))return!1;let c=this.operations.get(b.source);if(!c||"failed"===c.phase)return!0;if(a)throw new K("该来源已有未完成操作");return!1}),d=new Set([...this.operations].filter(([,a])=>"failed"!==a.phase).map(([a])=>a));for(let a of c)d.add(a.source);if(d.size>32)throw new K("加载变更超过队列上限,请选择部分来源");for(let a of c){if(!this.operations.has(a.source)&&this.operations.size>=64){let a=[...this.operations].find(([,a])=>"failed"===a.phase);a&&this.operations.delete(a[0])}this.operations.set(a.source,{action:"apply",phase:"queued",message:null}),this.enqueueApply(a)}return this.publish(),this.readSnapshot(!1)}enqueueApply(a){this.runExclusive(async()=>{this.activeSource=a.source;try{this.setOperation(a.source,"checking",null),await this.probeSourceChange(a),this.assertOpen(),this.setOperation(a.source,"applying",null),await (0,p.getL4PiGlobalPluginRuntime)().applySourceChange(a),a.current?.path&&(0,u.tt)(a.current.path),a.previous?.path&&(0,u.tt)(a.previous.path),this.capabilityCache=null,this.workSessions.refreshPluginMessages(),this.operations.delete(a.source)}catch(b){this.setOperation(a.source,"failed",C(b))}finally{this.activeSource=null,this.sourceCache=null,this.publish()}}).catch(b=>{this.disposed||this.setOperation(a.source,"failed",C(b))})}async probeSourceChange(a){let b=a.current;if(!b||!b.enabled)return;if(b.error)throw new L(b.error);if(!b.path)throw new L("插件来源目录不存在");let c=performance.now();console.info("[Pi Desk][PluginManagement] 源码候选预检开始",{source:a.source});let d=(0,j.join)(this.stagingRoot,(0,h.randomUUID)()),e=(0,j.join)(d,"agent"),f=(0,j.join)(d,"workspace");await (0,i.mkdir)(e,{recursive:!0}),await (0,i.mkdir)(f,{recursive:!0});try{if(await (0,i.writeFile)((0,j.join)(e,"settings.json"),JSON.stringify({extensions:[b.path]}),"utf8"),b.piDeskRoot||b.nativePaths.length>0){let c=await (0,w.Y)(f,e,b.nativePaths.length>0),d=c.loadError??c.packages.find(a=>"failed"===a.status)?.error?.message;if(d)throw new L(d);if(b.piDeskRoot&&!c.packages.some(a=>"ready"===a.status))throw new L("预检未加载到候选 Node Entry,放弃本次变更");for(let b of c.packages)if(b.pluginName&&(0,p.getL4PiGlobalPluginRuntime)().readDiagnostics().packages.some(c=>c.source!==a.source&&"ready"===c.status&&c.pluginName===b.pluginName))throw new L(`插件名冲突:${b.pluginName}`)}this.assertOpen()}finally{await (0,i.rm)(d,{recursive:!0,force:!0}),console.info("[Pi Desk][PluginManagement] 源码候选预检结束",{source:a.source,durationMs:Math.round(performance.now()-c)})}}reload(a){return this.activeSource||[...this.operations].some(([a,b])=>"failed"!==b.phase&&!this.deferredMaintenance.has(a))?Promise.reject(new K("维护仍在执行或等待,请先完成当前操作")):this.runExclusive(async()=>(this.assertRestartAvailable(),this.restartWhenQuiet(a)))}async mutate(a,b,c=!1,d,e={}){this.assertOpen();let f=await this.readSources(),g=this.acceptMutation(a,b,f,c,d,e);return this.enqueueMutations([g]),this.readSnapshot(!1)}acceptMutation(a,b,c,d=!1,f,g={}){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不执行插件维护,请通过基础聊天修复或正常启动后维护");let h=c.sources.find(a=>(0,m.LD)(a.source)===(0,m.LD)(b));if("add"!==a){if(!h)throw new J(b);if("package"!==h.kind&&"enable"!==a&&"disable"!==a)throw new L("裸扩展不是已安装包,请编辑源码后加载变更;此操作不会删除源码")}let i=(f??=h?.source)??b;if(g.tag&&!(0,m.ug)(b))throw new L("只有 npm 插件包支持更新渠道");for(let a of[b,i])this.assertSourceIdle(a);if([...this.operations.values()].filter(a=>"failed"!==a.phase).length>=32)throw new K("插件维护队列已满,请等待当前操作完成");if(this.operations.size>=64){let a=[...this.operations].find(([,a])=>"failed"===a.phase);a&&this.operations.delete(a[0])}return f&&f!==b&&this.operations.get(f)?.phase==="failed"&&this.operations.delete(f),this.operations.set(i,{action:a,phase:"queued",message:null}),this.updates.clear(i),this.updates.clear(b),{mutation:a,source:b,operationSource:i,reinstall:d,options:g}}enqueueMutations(a){this.runExclusive(async()=>{let b=performance.now(),c=await Promise.all(a.map(async a=>{try{let b=await this.prepareMutation(a);return this.assertOpen(),this.setOperation(a.operationSource,"queued","候选检查完成,等待应用"),{input:a,prepared:b}}catch(b){return this.setOperation(a.operationSource,"failed",C(b)),null}}));for(let d of(a.length>1&&console.info("[Pi Desk][PluginManagement] 批量并行准备收尾",{count:a.length,failedCount:c.filter(a=>null===a).length,durationMs:Math.round(performance.now()-b)}),c)){if(!d)continue;let{input:a,prepared:b}=d,{source:c,operationSource:e}=a;this.activeSource=e;try{this.assertOpen(),b&&await this.executeMutation(a,b),this.deferredMaintenance.has(e)||this.operations.delete(e)}catch(a){this.setOperation(e,"failed",C(a))}finally{this.updates.clear(e),this.updates.clear(c),this.sourceCache=null,this.activeSource=null,this.publish()}}}).catch(b=>{if(!this.disposed)for(let c of a)this.setOperation(c.operationSource,"failed",C(b))}),this.publish()}async prepareMutation(a){let{mutation:b,source:c,operationSource:d,reinstall:e,options:f}=a;this.assertOpen();let g=this.createPackageManager();this.throwSettingsErrors(g.settingsManager);let h=g.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope),i=h.find(a=>a.source===d),j=null,k=null,l=null;if("enable"!==b&&"disable"!==b){var n;let a=await (0,r.c)({agentDir:this.agentDir,configured:h,repairSource:"add"===b&&e?d:void 0});if(a)throw new M(a);if("add"!==b&&!i)throw new J(c);this.setOperation(d,"checking","正在确认插件版本和下载源");let g=this.candidateSource(c,i?.installedPath),o=(0,m.ug)(g),p="del"===b?{source:g,updateTag:null}:await this.updates.resolveInstall(g,d,f,"update"===b);if(k=p.updateTag,"update"===b&&o&&i?.installedPath){let a=await D(i.installedPath),b=p.source.slice(p.source.lastIndexOf("@")+1);if(!a.version)throw new L("无法读取插件已安装版本");if(!(0,m.zj)(b,a.version))return null}j={...o&&"del"!==b&&(e||i||"update"===b)?{action:"reinstall",source:p.source}:(n=p.source,{action:"add"===b?"install":"update"===b?"update":"remove",source:n}),..."registry"in p&&p.registry?{registry:p.registry}:{}},"del"!==b&&(l=await this.probeCandidate(p.source,j.registry))}return{request:j,updateTag:k,pluginName:l}}async executeMutation(a,b){let{mutation:c,source:d,operationSource:e}=a,{request:f,updateTag:g,pluginName:h}=b,i=(0,p.getL4PiGlobalPluginRuntime)(),j=a=>this.setOperation(e,"waiting",a);if(f&&(this.assertPluginNameAvailable(h,e),g&&((0,o.ks)(e,g,this.agentDir),this.updates.clear(e)),this.deferredMaintenance.size>0)){this.deferredMaintenance.set(e,f),j("等待重启后完成安装维护");return}this.assertOpen(),await i.withSourceIdle(e,async()=>{if(f){let b=this.createPackageManager();this.throwSettingsErrors(b.settingsManager);let d=b.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope),f=await (0,r.c)({agentDir:this.agentDir,configured:d,repairSource:"add"===c&&a.reinstall?e:void 0});if(f)throw new M(f)}if(this.assertOpen(),this.setOperation(e,"applying",f?.registry?`下载源:${f.registry}`:null),"enable"===c||"disable"===c){let a=(0,o.to)(this.agentDir).disabled.includes((0,m.LD)(d));(0,o.El)(d,"enable"===c,this.agentDir),this.sourceCache=null;try{if(await this.applyMutationSources([d],!0),"enable"===c&&!(await this.readSources()).sources.find(a=>a.source===d)?.enabled)throw new L("此插件仍被 Pi 配置排除,请先调整原有资源配置")}catch(b){throw(0,o.El)(d,!a,this.agentDir),this.sourceCache=null,b}}else if(f)try{await i.replaceSource(e,null),await (0,s.V)(async()=>{await (0,q.wC)({maintenance:f,agentDir:this.agentDir,cwd:this.packageManagerCwd}),"del"!==c&&await this.verifyInstalledPackage(f.source)}),this.sourceCache=null,await this.applyMutationSources([e,f.source],!1)}catch(a){if(a instanceof q.rZ&&"locked"===a.kind&&(0,x.k)())this.deferredMaintenance.set(e,f),j("文件正在被使用,需要重启后完成操作");else throw a}this.updates.clear(e),this.updates.clear(d),this.capabilityCache=null,this.workSessions.refreshPluginMessages()},this.lifetime.signal,j)}async verifyInstalledPackage(a){let b=this.createPackageManager();this.throwSettingsErrors(b.settingsManager);let c=(0,m.LD)(a),d=b.packageManager.listConfiguredPackages().find(a=>"user"===a.scope&&(0,m.LD)(a.source)===c);if(!d?.installedPath)throw new L("插件安装后没有有效目录");await this.verifyPackageVersion(a,d.installedPath)}async verifyPackageVersion(a,b){let c=await D(b);if(c.error)throw new L("string"==typeof c.error.message?c.error.message:c.error.message.default);if((0,m.ug)(a)){let b=a.slice(a.lastIndexOf("@")+1);if(c.version!==b)throw new L(`插件实际安装版本与目标不一致:${c.version??"未知"},目标 ${b}`)}}async applyMutationSources(a,b){let c=new Set(a.map(m.LD)),d=(0,p.getL4PiGlobalPluginRuntime)(),e=await d.scanSourceChanges(),f=await this.readSources(),g=[...new Set([...e.filter(a=>c.has((0,m.LD)(a.source))).map(a=>a.source),...f.sources.filter(a=>c.has((0,m.LD)(a.source))).map(a=>a.source)])];for(let a of g.length?await d.scanSourceChanges(g):[])b&&await this.probeSourceChange(a),await d.applySourceChange(a),a.current?.path&&(0,u.tt)(a.current.path),a.previous?.path&&(0,u.tt)(a.previous.path)}dispose(){this.disposed||(this.disposed=!0,this.lifetime.abort(),this.unsubscribeRuntime(),this.listeners.clear())}assertOpen(){if(this.disposed)throw new K("插件管理已关闭")}setOperation(a,b,c){let d=this.operations.get(a);if(!d)return;let e=c?.slice(0,4e3)??null;(d.phase!==b||d.message!==e)&&(this.operations.set(a,{...d,phase:b,message:e}),"failed"===b&&console.warn("[Pi Desk][PluginManagement] 插件操作失败",{source:a,action:d.action,message:e}),this.publish())}publish(){if(!this.disposed)for(let a of this.listeners)try{a()}catch(a){console.warn("[Pi Desk][PluginManagement] 状态监听失败",{message:C(a)})}}async readSources(){let a=()=>null!==this.activeSource&&this.operations.get(this.activeSource)?.phase==="applying";if(a()&&this.sourceCache)return this.sourceCache;let b=await (0,t.o)(this.packageManagerCwd,this.agentDir,{DefaultPackageManager:k.DefaultPackageManager,SettingsManager:k.SettingsManager});return a()&&this.sourceCache||(this.sourceCache=b),a()&&this.sourceCache?this.sourceCache:b}async probeCandidate(a,b){let c=(0,j.join)(this.stagingRoot,(0,h.randomUUID)()),d=(0,j.join)(c,"agent"),e=(0,j.join)(c,"workspace");await (0,i.mkdir)(e,{recursive:!0}),console.info("[Pi Desk][PluginManagement] 开始在隔离 AgentDir 预检候选插件",{source:a});try{if(!b&&(0,m.ug)(a))for(let b of[".npmrc",(0,j.join)("etc","npmrc")]){let c=(0,j.join)(d,"npm",b);await (0,i.mkdir)((0,j.dirname)(c),{recursive:!0});try{await (0,i.copyFile)((0,j.join)(this.agentDir,"npm",b),c),console.info("[Pi Desk][PluginManagement] 已为隔离预检继承本机 npm 配置",{source:a,configPath:b})}catch(a){if("ENOENT"!==a.code)throw new L(`无法继承本机 npm 配置(${b}):${C(a)}`)}}await (0,q.wC)({maintenance:{action:"install",source:a,...b?{registry:b}:{}},agentDir:d,cwd:e,signal:this.lifetime.signal}),this.assertOpen();let c=this.createPackageManager(d,e);this.throwSettingsErrors(c.settingsManager);let f=c.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope)[0];if(!f?.installedPath)throw new L("候选插件安装后没有有效目录");await this.verifyPackageVersion(a,f.installedPath);let g=await (0,w.Y)(e,d,!0,this.lifetime.signal);if(g.loadError)throw new L(g.loadError);let h=g.packages.find(a=>"failed"===a.status);if(h?.error)throw new L(h.error.message);let k=g.packages[0]?.pluginName??null;return this.assertOpen(),console.info("[Pi Desk][PluginManagement] 候选插件隔离预检通过",{source:a}),k}catch(a){if(a instanceof L)throw a;throw new L(C(a))}finally{await (0,i.rm)(c,{recursive:!0,force:!0}).catch(a=>{console.warn("[Pi Desk][PluginManagement] 清理候选插件目录失败",{path:c,errorName:a instanceof Error?a.name:"UnknownError"})})}}assertPluginNameAvailable(a,b){if(a&&(0,p.getL4PiGlobalPluginRuntime)().readDiagnostics().packages.some(c=>c.source!==b&&c.pluginName===a))throw new L(`pluginName 已由其他 Package 注册:${a}`)}restartWhenQuiet(a){return this.workSessions.runPluginRestart(async()=>{let b=(0,p.getL4PiGlobalPluginRuntime)(),c=await this.readSnapshot(!1);return await b.prepareReload(),console.info("[Pi Desk][PluginManagement] 插件 Runtime 已通过静默检查,准备重启",{deferredCount:this.deferredMaintenance.size}),(0,x.Z)("basic"===a||0===this.deferredMaintenance.size?void 0:[...this.deferredMaintenance.values()],a),c})}async readDetail(a){if((0,e.P)())throw new K("基础模式不执行插件能力盘点");let b=(await this.readSources()).sources.find(b=>b.source===a),c=b?await (0,t.W)(b):null;if(!c)throw new J(a);let d=await this.readCapabilities(!1),f=d.packages.find(b=>b.source===a);if(!f)throw Error(d.loadError??`插件能力详情不可用:${a}`);let[g,h]=await Promise.all([Promise.all(f.skills.map(async a=>({name:a.name,description:a.description,path:a.path,modelVisible:a.modelVisible,...await E(c,a.filePath)}))),Promise.all(f.prompts.map(async a=>({name:a.name,description:a.description,path:a.path,...await E(c,a.filePath)})))]);return l.tA.parse({source:a,readme:await (0,n.w$)(c),tools:f.tools.map(a=>({name:a.name,label:a.label,state:a.state,description:a.description,parameters:a.parameters,promptSnippet:a.promptSnippetDetail,promptGuidelines:a.promptGuidelines})),skills:g,prompts:h})}async readSnapshot(a){if((0,e.P)())return{plugins:[],restartRequired:!1,loadError:this.maintenanceError};let b=this.createPackageManager(),c=b.settingsManager.drainErrors().map(a=>a.error.message),d=b.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope),f=await (0,r.c)({agentDir:this.agentDir,configured:d}),h=await this.readSources(),i=await this.updates.read(h.sources,"boolean"==typeof a?{checkUpdates:a}:a),j=(0,p.getL4PiGlobalPluginRuntime)(),k=j.readDiagnostics(),n=new Map(k.packages.map(a=>[a.source,a])),q=(0,u.u7)(),s=this.capabilityCache??{packages:[],loadError:null},t=new Map(s.packages.map(a=>[a.source,a])),v=new Map(j.readCapabilityRegistrations().map(a=>[a.source,a])),w=await Promise.all(h.sources.map(async a=>{let b=n.get(a.source),c=a.path?this.findNativeDiagnostic(a.path,q):null,d=(a.error?{phase:"package"===a.kind?"package":"entry",message:a.error}:null)??(b?.status==="failed"?b.error:null)??(c?{phase:"native",message:c}:null);return{source:a.source,kind:a.kind,operation:this.operationFor(a.source),pluginName:b?.pluginName??null,description:a.description,version:a.version??b?.version??null,updateAvailable:i.get(a.source)?.updateAvailable??null,updateTag:i.get(a.source)?.updateTag??null,availableVersion:i.get(a.source)?.availableVersion??null,updateError:i.get(a.source)?.updateError??null,status:a.enabled?d?"failed":b?.status==="ready"?"ready":"available":"disabled",error:d,capabilities:F(t.get(a.source),v.get(a.source),s.loadError)}}));for(let[a,b]of this.operations)w.some(b=>(0,m.LD)(b.source)===(0,m.LD)(a))||w.push({source:a,kind:"package",operation:b,pluginName:null,description:null,version:null,updateAvailable:null,updateTag:(0,m.ug)(a)?(0,o.ey)(a,this.agentDir):null,availableVersion:null,updateError:null,status:"failed"===b.phase?"failed":"available",error:null,capabilities:F(void 0,void 0,null)});return l.oP.parse({plugins:w.sort((a,b)=>a.source.localeCompare(b.source)),restartRequired:this.restartRequired,loadError:function(a){let b=[...new Map(a.flatMap(a=>{let b=("string"==typeof a?a:a.message).trim();return b?[[b,{defaultText:b,englishText:"string"==typeof a?b:a.englishMessage.trim()}]]:[]})).values()];if(0===b.length)return null;let c=b.map(a=>a.defaultText).join("; ");return b.every(a=>a.defaultText===a.englishText)?c:(0,g.J8)(c,b.map(a=>a.englishText).join("; "))}([...c,...h.errors,...k.loadError?[k.loadError]:[],...this.maintenanceError?[this.maintenanceError]:[],...f?[f]:[]])})}async readCapabilities(a){if(!a&&this.capabilityCache)return this.capabilityCache;try{return this.capabilityCache=await (0,s.V)(()=>(this.assertOpen(),!a&&this.capabilityCache)?Promise.resolve(this.capabilityCache):(0,v.a)(this.cwd,this.agentDir)),this.publish(),console.info("[Pi Desk][PluginManagement] 插件能力盘点完成",{packageCount:this.capabilityCache.packages.length,hasLoadError:null!==this.capabilityCache.loadError}),this.capabilityCache}catch(b){let a=C(b);return console.warn("[Pi Desk][PluginManagement] 插件能力盘点失败",{errorName:b instanceof Error?b.name:"UnknownError",message:a}),this.capabilityCache={packages:[],loadError:a},this.publish(),this.capabilityCache}}findNativeDiagnostic(a,b){let c,d=(c=(0,j.resolve)(a).replaceAll("\\","/"),"win32"===process.platform?c.toLowerCase():c),e=b.find(a=>("win32"===process.platform?a.message.replaceAll("\\","/").toLowerCase():a.message.replaceAll("\\","/")).includes(d));return e?.message??null}createPackageManager(a=this.agentDir,b=this.packageManagerCwd){let c=k.SettingsManager.create(b,a,{projectTrusted:!1});return{settingsManager:c,packageManager:new k.DefaultPackageManager({cwd:b,agentDir:a,settingsManager:c})}}candidateSource(a,b){return(0,j.isAbsolute)(a)||/^(?:[a-z][a-z0-9+.-]*:|git@)/i.test(a)?a:b?(0,j.resolve)(b):(0,j.resolve)(this.agentDir,a)}operationFor(a){let b=(0,m.LD)(a);return[...this.operations].find(([a])=>(0,m.LD)(a)===b)?.[1]??null}normalizeAddedSource(a){return/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*(?:@[^\s/]+)?$/i.test(a)?`npm:${a}`:(0,j.isAbsolute)(a)||/^(?:[a-z][a-z0-9+.-]*:|git@)/i.test(a)?a:(0,j.resolve)(this.cwd,a)}throwSettingsErrors(a){let b=a.drainErrors();if(0!==b.length)throw Error(b.map(a=>a.error.message).join("; "))}assertRestartAvailable(){if(!(0,x.k)())throw new O}runExclusive(a){let b=()=>this.staleStagingCleanup.then(()=>(this.assertOpen(),a())),c=this.operationTail.then(b,b);return this.operationTail=c.then(()=>void 0,()=>void 0),c}}function G(){globalThis.__piDeskPluginManagement?.dispose()}function H(a){globalThis.__piDeskPluginManagement||(globalThis.__piDeskPluginManagement=new P(a))}function I(){if(!globalThis.__piDeskPluginManagement)throw Error("插件管理尚未完成进程级装配");return globalThis.__piDeskPluginManagement}d()}catch(a){d(a)}})},53584:(a,b,c)=>{c.d(b,{a:()=>l});var d=c(76760),e=c(36153),f=c(86148),g=c(2472);let h="__PI_DESK_PLUGIN_CAPABILITIES__",i=e.Yj(),j=e.Ik({name:e.Yj(),description:e.Yj().nullable()}).strict(),k=e.Ik({packages:e.YO(e.Ik({source:e.Yj(),error:e.Yj().nullable(),extensions:e.YO(e.Ik({path:e.Yj(),events:e.YO(e.Ik({name:e.Yj(),count:e.ai().int().positive()}).strict()),commands:e.YO(j),shortcuts:e.YO(e.Ik({shortcut:e.Yj(),description:e.Yj().nullable()}).strict()),flags:e.YO(e.Ik({name:e.Yj(),type:e.k5(["boolean","string"]),description:e.Yj().nullable(),default:e.KC([e.zM(),e.Yj(),e.ch()])}).strict()),messageRenderers:e.YO(e.Yj()),entryRenderers:e.YO(e.Yj())}).strict()),tools:e.YO(e.Ik({name:e.Yj(),label:i,state:e.k5(["active","inactive","shadowed"]),description:i,parameters:e.g1(e.Yj(),e.Pq()),promptSnippet:i.nullable(),promptSnippetDetail:i.nullable(),promptGuidelines:e.YO(i),promptGuidelineCount:e.ai().int().nonnegative(),promptGuidelinePreview:i.nullable()}).strict()),skills:e.YO(e.Ik({name:e.Yj(),description:e.Yj(),path:e.Yj(),filePath:e.Yj(),modelVisible:e.zM()}).strict()),prompts:e.YO(e.Ik({name:e.Yj(),description:e.Yj(),path:e.Yj(),filePath:e.Yj()}).strict()),themes:e.YO(e.Ik({name:e.Yj(),path:e.Yj()}).strict()),providers:e.YO(e.Ik({name:e.Yj(),kind:e.k5(["config","native"])}).strict())}).strict()),loadError:e.Yj().nullable()}).strict();async function l(a,b){let c=(0,f.I)(),e=(0,d.join)(process.cwd(),"src","server","l4_foundation","pi","l4-pi-plugin-capability-probe-runner.mts"),{stdout:i,stderr:j,code:l}=await (0,g.i)({args:["--conditions=react-server","--import",c,e],agentDir:b,env:{PI_DESK_PLUGIN_CAPABILITY_AGENT_DIR:b,PI_DESK_PLUGIN_CAPABILITY_CWD:a},maxOutputBytes:4194304,timeoutMs:3e4,timeoutError:()=>Error("插件能力盘点超时"),cleanupError:(a,b)=>Error(`${a}
|
|
6
|
+
能力盘点进程树清理失败`,{cause:b})});if(0!==l)throw Error(j.trim()||`插件能力盘点进程退出码 ${l??"null"}`);let m=i.lastIndexOf(h);if(m<0)throw Error("插件能力盘点没有返回有效结果");let n=i.slice(m+h.length).split(/\r?\n/,1)[0];return k.parse(JSON.parse(n))}},64253:(a,b,c)=>{c.a(a,async(a,d)=>{try{let s;c.d(b,{B:()=>q,I:()=>r});var e=c(31421),f=c(73024),g=c(51455),h=c(76760),i=c(48161),j=c(57975),k=c(75430),l=a([k]);k=(l.then?(await l)():l)[0];let t=(0,j.promisify)(e.execFile);function m(a){return a.replace(/\$\{([^}]+)\}/g,(a,b)=>process.env[b]??a)}async function n(a,b){let c;try{let b=await (0,g.readFile)(a);if(b.length>262144)throw Error("npm 配置文件过大");c=b.toString("utf8")}catch(a){if("ENOENT"===a.code)return;throw a}for(let a of c.split(/\r?\n/)){let c=/^\s*([^;#][^=]*?)\s*=\s*(.*?)\s*$/.exec(a);if(!c)continue;let d=c[2].replace(/\s+[;#].*$/,"").replace(/^(['"])(.*)\1$/,"$2");b[c[1].trim()]=m(d)}}function o(a,b){return("win32"===process.platform?/^~[\\/]/:/^~\//).test(a)?(0,h.resolve)((0,i.homedir)(),a.slice(2)):(0,h.resolve)(b,a)}async function p(a,b){let c={};for(let[a,b]of Object.entries(process.env))if(void 0!==b&&""!==b&&/^npm_config_/i.test(a)){let d=a.slice(11);c[d.startsWith("//")?d:d.replace(/(?!^)_/g,"-").toLowerCase()]=m(b)}let d=function(){for(let a of[(0,h.dirname)(process.execPath),...(process.env.PATH??"").split("win32"===process.platform?";":":")])for(let b of[(0,h.join)(a,"node_modules/npm/bin/npm-cli.js"),(0,h.resolve)(a,"../lib/node_modules/npm/bin/npm-cli.js")])if((0,f.existsSync)(b))return b}(),e={};if(d)try{await (0,g.mkdir)(a,{recursive:!0});let c=await t(process.execPath,[d,"config","list","--json","--prefix",b],{cwd:a,timeout:4e3,maxBuffer:524288,windowsHide:!0});e=JSON.parse(c.stdout)}catch{console.warn("[Pi Desk][PluginRegistry] npm 有效配置读取失败,改用 npmrc 和环境配置")}let j={};d&&await n((0,h.resolve)((0,h.dirname)(d),"../npmrc"),j);let k="string"==typeof e.globalconfig?e.globalconfig:c.globalconfig??(0,h.join)(b,"etc/npmrc"),l="string"==typeof e.userconfig?e.userconfig:c.userconfig??(0,h.join)((0,i.homedir)(),".npmrc");for(let[d,f]of(await n(o(k,a),j),await n(o(l,a),j),!0!==e.global&&"true"!==c.global&&"global"!==e.location&&"global"!==c.location&&await n((0,h.join)(b,".npmrc"),j),Object.entries(e)))"string"!=typeof f||"(protected)"===f||/auth|password|username/i.test(d)||(j[d]=f);return{...j,...c}}function q(a=(0,k.getAgentDir)()){let b=process.env.PI_DESK_PACKAGE_MAINTENANCE_CWD??(0,h.join)(a,"pi-desk","plugin-package-manager"),c=(0,h.join)(a,"npm");if(!s||s.cwd!==b||s.prefix!==c||s.expires<=Date.now()){let a=p(b,c);s={cwd:b,prefix:c,expires:Date.now()+3e4,value:a},a.catch(()=>{s?.value===a&&(s=void 0)})}return s.value}function r(a,b){let c=`//${a.host}${a.pathname}`;for(let a of Object.keys(b).flatMap(a=>{let b=/^(\/\/.*\/):(?:_authToken|_auth|username|_password)$/i.exec(a);return b&&c.startsWith(b[1])?[b[1]]:[]}).sort((a,b)=>b.length-a.length)){let c=b[`${a}:_authToken`]??b[`${a}:_authtoken`];if(c&&!c.includes("${"))return`Bearer ${c}`;let d=b[`${a}:_auth`];if(d&&!d.includes("${"))return`Basic ${d}`;let e=b[`${a}:username`],f=b[`${a}:_password`];if(e&&f&&!f.includes("${"))return`Basic ${Buffer.from(`${e}:${Buffer.from(f,"base64").toString("utf8")}`).toString("base64")}`}let d=b.registry;if(d){let c=new URL(d);if(a.origin===c.origin&&a.pathname.startsWith(`${c.pathname.replace(/\/+$/,"")}/`)){let a=b._authToken??b._authtoken;if(a&&!a.includes("${"))return`Bearer ${a}`;if(b._auth&&!b._auth.includes("${"))return`Basic ${b._auth}`}}}d()}catch(a){d(a)}})},69371:(a,b,c)=>{c.d(b,{rZ:()=>g,wC:()=>h});var d=c(76760),e=c(86148),f=c(2472);class g extends Error{constructor(a,b,c){super(b.slice(-4e3)||`Pi Package 命令退出码 ${c??"null"}`),this.kind=a,this.output=b,this.exitCode=c,this.name="L4PiPackageMaintenanceError"}}async function h(a){let b=(0,e.I)(),c=(0,d.join)(process.cwd(),"src","server","l4_foundation","pi","l4-pi-package-maintenance-runner.mts"),{stdout:h,stderr:i,code:j}=await (0,f.i)({args:["--import",b,c,a.maintenance.action,a.maintenance.source,...a.maintenance.registry?[a.maintenance.registry]:[]],agentDir:a.agentDir,env:{PI_DESK_PACKAGE_MAINTENANCE_CWD:a.cwd},maxOutputBytes:1048576,timeoutMs:12e4,signal:a.signal,timeoutError:()=>new g("failed","包维护超过120秒,已停止;结果未确认,请检查配置后手动处理",null),cleanupError:(a,b)=>new g("failed",`维护进程树未确认释放:${b instanceof Error?b.message:String(b)}`,null)});if(0===j)return;let k=(i||h).trim();throw new g(function(a){let b=a.toLowerCase();if(b.includes("ebusy")||b.includes("etxtbsy")||b.includes("resource busy")||b.includes("being used by another process")||b.includes("used by another process")||b.includes("process cannot access the file because it is being used"))return"locked";let c=b.includes("eperm")||b.includes("eacces")||b.includes("operation not permitted"),d=/\b(unlink|rename|rmdir|rimraf|remove|cleanup)\b/.test(b);return c&&d?"locked":"failed"}(k),k,j)}},69375:(a,b,c)=>{c.d(b,{Od:()=>r,tU:()=>n,hE:()=>q,P9:()=>f,_G:()=>j,Vc:()=>i});var d=c(36153);d.Yj().uuid();let e=d.Ik({key:d.Yj().min(1).max(160),params:d.g1(d.Yj().min(1).max(80),d.KC([d.Yj().max(1e3),d.ai().finite()])).optional()}).strict(),f=4001,g=d.Yj().trim().min(1),h=d.Yj().uuid();function i(a){return Object.freeze({op:"req",path:g.parse(a.path),inputSchema:a.inputSchema,outputSchema:a.outputSchema,...void 0===a.timeoutMs?{}:{timeoutMs:d.ai().int().positive().parse(a.timeoutMs)}})}function j(a){return Object.freeze({op:"push",path:g.parse(a.path),bodySchema:a.bodySchema})}let k=d.Ik({op:d.eu("req"),path:g,requestId:h}).strict(),l=d.Ik({op:d.eu("resp"),path:g,requestId:h}).strict(),m=d.Ik({op:d.eu("push"),path:g}).strict(),n=d.Ik({head:k,body:d.Pq()}).strict(),o=d.Ik({head:l,body:d.Ik({code:d.eu(0),msg:d.eu(""),data:d.Pq()}).strict()}).strict(),p=d.Ik({head:l,body:d.Ik({code:d.ai().int().positive(),msg:d.Yj().min(1),data:d.ch(),i18n:e.optional()}).strict()}).strict(),q=d.KC([o,p]),r=d.Ik({head:m,body:d.Pq()}).strict()},72497:(a,b,c)=>{c.d(b,{Dz:()=>h,f7:()=>g,tv:()=>f});var d=c(36153);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=e,g=e,h=d.g1(d.Yj(),d.Pq());d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/);let i=d.k5(["plugin","server","rocket","settings","panel","message","terminal","file","folder","bot","wrench","database","globe"]);d.gM("type",[d.Ik({type:d.eu("builtin"),name:i}).strict(),d.Ik({type:d.eu("svg"),content:d.Yj().trim().min(1).max(16384)}).strict()])},73159:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{NL:()=>h,XH:()=>j,Yq:()=>i});var e=c(77598),f=c(64253),g=a([f]);f=(g.then?(await g)():g)[0];class j extends Error{constructor(a,b=502,c="invalid"){super(a),this.status=b,this.reason=c,this.name="L4PluginRegistryError"}}let k=new Map,l=0;async function h(a,b){b.signal?.throwIfAborted();let c=!1===b.auth?{}:await (0,f.B)(b.agentDir),d=(0,f.I)(a,c),g=`${a.href}:${b.limit}:${(0,e.createHash)("sha256").update(d??"").digest("hex")}`,h=k.get(g);if(!1!==b.cache&&h&&h.expires>Date.now())return h.body;let i=AbortSignal.any([AbortSignal.timeout(b.timeout??1e4),...b.signal?[b.signal]:[]]),m=a;try{for(let a=0;a<=3;a++){let d=(0,f.I)(m,c),e=await fetch(m,{signal:i,redirect:"manual",headers:d?{Authorization:d}:{}});if([301,302,303,307,308].includes(e.status)){await e.body?.cancel();let b=e.headers.get("location");if(!b||3===a)throw new j("插件源重定向无效");let c=new URL(b,m);if(!["http:","https:"].includes(c.protocol)||c.username||c.password||"https:"===m.protocol&&"https:"!==c.protocol)throw new j("插件源重定向不安全");m=c;continue}if(!e.ok){await e.body?.cancel();let a=404===e.status?"missing":[401,403].includes(e.status)?"denied":e.status>=500?"network":"invalid";throw new j(`插件源请求失败(HTTP ${e.status})`,e.status,a)}if(Number(e.headers.get("content-length")??0)>b.limit)throw await e.body?.cancel(),new j("插件源响应超过大小限制");let h=e.body?.getReader(),n=[],o=0;if(h)try{for(;;){let a=await h.read();if(a.done)break;if((o+=a.value.byteLength)>b.limit)throw new j("插件源响应超过大小限制");n.push(a.value)}}finally{await h.cancel().catch(()=>void 0),h.releaseLock()}let p=Buffer.concat(n);if(!1!==b.cache){for(let[a,b]of k)(b.expires<=Date.now()||a===g)&&(k.delete(a),l-=b.body.length);for(;k.size>=96||l+p.length>0x1800000;){let a=k.entries().next().value;if(!a)break;k.delete(a[0]),l-=a[1].body.length}p.length<=0x1800000&&(k.set(g,{body:p,expires:Date.now()+12e4}),l+=p.length)}return p}throw new j("插件源重定向过多")}catch(a){if(b.signal?.aborted)throw b.signal.reason;if(a instanceof j)throw a;throw new j("插件源网络连接失败或超时",502,"network")}}async function i(a,b,c){let d=await h(a,{limit:8388608,signal:b,agentDir:c});try{let a=JSON.parse(d.toString("utf8"));if(!a||"object"!=typeof a||Array.isArray(a))throw Error("invalid");return a}catch{throw new j("插件源返回的元数据格式无效")}}d()}catch(a){d(a)}})},75157:(a,b,c)=>{c.d(b,{c:()=>h});var d=c(51455),e=c(76760);function f(a){if(!a.startsWith("npm:"))return null;let b=a.slice(4).trim(),c=b.match(/^(@?[^@]+(?:\/[^@]+)?)(?:@(.+))?$/);return c?.[1]??(b||null)}async function g(a){try{return(await (0,d.stat)(a)).isDirectory()}catch{return!1}}async function h(a){let b=a.configured.flatMap(a=>{let b=f(a.source);return b?[{name:b,item:a}]:[]}),c=(0,e.join)(a.agentDir,"npm","package.json"),h={};try{let a=JSON.parse(await (0,d.readFile)(c,"utf8"));a.dependencies&&"object"==typeof a.dependencies&&(h=a.dependencies)}catch(c){if(0===b.length)return null;let a=c instanceof Error&&c.message?c.message:String(c);return{message:`Pi Package npm 根不可用:${a}`,englishMessage:`Pi Package npm root is unavailable: ${a}`,i18n:{key:"errors:pluginNpmRootUnavailable",params:{detail:a.slice(0,1e3)}}}}let i=a.repairSource?f(a.repairSource):null,j=b.filter(a=>a.name!==i),k=new Set(j.map(a=>a.name)),l=new Set(Object.keys(h)),m=[...k].filter(a=>!l.has(a)),n=[];for(let{name:a,item:b}of j)b.installedPath&&await g(b.installedPath)||n.push(a);if(0===m.length&&0===n.length)return null;let o=[m.length>0?`缺少声明:${m.join("、")}`:null,n.length>0?`缺少目录:${n.join("、")}`:null].filter(a=>null!==a),p=[m.length>0?`missing declarations: ${m.join(", ")}`:null,n.length>0?`missing folders: ${n.join(", ")}`:null].filter(a=>null!==a),q=m.length>0?n.length>0?"errors:pluginNpmRootMissingBoth":"errors:pluginNpmRootMissingDeclarations":"errors:pluginNpmRootMissingFolders";return{message:`Pi Package 配置与 npm 根不一致(${o.join(";")})`,englishMessage:`Pi Package configuration does not match the npm root (${p.join("; ")})`,i18n:{key:q,params:{declarations:m.join(", ").slice(0,1e3),folders:n.join(", ").slice(0,1e3)}}}}},76019:(a,b,c)=>{c.d(b,{J8:()=>f,fD:()=>g,qf:()=>e});var d=c(36153);let e=d.KC([d.Yj(),d.Ik({default:d.Yj(),translations:d.g1(d.Yj().min(1).max(35),d.Yj()).refine(a=>Object.keys(a).length<=16,"too many translations")}).strict()]);function f(a,b){return{default:a,translations:{en:b}}}function g(a,b){return"string"==typeof a?a:a.translations[b]??a.translations[b.split("-")[0]]??a.default}},78597:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{E:()=>k});var e=c(75430),f=c(4287),g=c(5235),h=c(34458),i=c(47154),j=a([e,g,h]);[e,g,h]=j.then?(await j)():j;class k{constructor(a,b,c){this.agentDir=a,this.cwd=b,this.signal=c,this.cache=new Map}async resolveInstall(a,b,c,d){let e=(0,f.ug)(a),i=e?/^npm:(?:@[^/]+\/)?[^@]+@([^@]+)$/.exec(a)?.[1]:void 0,j=i&&!/^v?\d+\./.test(i)&&f.mR.safeParse(i).success?i:null,k=e?d?(0,g.ey)(b,this.agentDir):c.tag??j??(0,g.ey)(b,this.agentDir):null,l=e&&k&&(d||!i)?`npm:${e}@${k}`:a;return{...await (0,h.dz)(l,{...c,agentDir:this.agentDir,signal:this.signal,cache:!d&&void 0}),updateTag:k}}clear(a){let b=(0,f.LD)(a);for(let[a,c]of this.cache)c.identity===b&&this.cache.delete(a)}async read(a,b){for(let[a,b]of this.cache)b.expiresAt<=Date.now()&&this.cache.delete(a);let c=b.sources?new Set(b.sources.map(f.LD)):null,d=new Map;for(let j of a){if("package"!==j.kind)continue;let a=(0,f.LD)(j.source),k=(0,f.ug)(j.source),l=k?(0,g.ey)(j.source,this.agentDir):null,m={updateTag:l,updateAvailable:null,availableVersion:null,updateError:null};d.set(j.source,m);let n=!0===b.checkUpdates&&(!c||c.has(a))&&(!b.tag||b.tag===l);if(k){if(!n&&![...this.cache.values()].some(b=>b.identity===a))continue;let b=null;try{let c=(0,g.to)(this.agentDir).downloadSource,e=await (0,h.qX)(k,{agentDir:this.agentDir,downloadSource:c});b=JSON.stringify([a,l,c.mode,e.registry,e.fallback]);let i=this.cache.get(b)?.value;if(n){if(!j.path||!j.version)throw Error("无法读取插件已安装版本");let d=await (0,h.dz)(`npm:${k}@${l}`,{downloadSource:c,agentDir:this.agentDir,signal:this.signal,cache:!1}),e=d.source.slice(d.source.lastIndexOf("@")+1);i={...m,availableVersion:e},this.store(b,a,i)}i&&d.set(j.source,{...i,updateAvailable:!i.updateError&&j.version&&i.availableVersion?(0,f.zj)(i.availableVersion,j.version):null})}catch(e){let c={...m,updateError:this.message(j.source,e)};d.set(j.source,c),b&&this.store(b,a,c)}}else if(/^(?:git:|https?:|git@)/.test(j.source)){let b=JSON.stringify([a,"git"]),c=this.cache.get(b)?.value;if(c&&d.set(j.source,c),!n)continue;try{let c=e.SettingsManager.inMemory({packages:[j.source]}),f=new e.DefaultPackageManager({agentDir:this.agentDir,cwd:this.cwd,settingsManager:c}),g=await (0,i.V)(()=>f.checkForAvailableUpdates()),h={...m,updateAvailable:g.some(a=>"user"===a.scope)};d.set(j.source,h),this.store(b,a,h)}catch(e){let c={...m,updateError:this.message(j.source,e)};d.set(j.source,c),this.store(b,a,c)}}}return d}store(a,b,c){for(this.cache.delete(a);this.cache.size>=128;){let a=this.cache.keys().next().value;if(void 0===a)break;this.cache.delete(a)}this.cache.set(a,{identity:b,expiresAt:Date.now()+3e5,value:c})}message(a,b){let c=(b instanceof Error?b.message:String(b)).slice(0,4e3);return console.warn("[Pi Desk][PluginManagement] 检查插件更新失败",{source:a,message:c}),this.clear(a),c}}d()}catch(a){d(a)}})},86148:(a,b,c)=>{function d(a){let b=a.replaceAll("\\","/");return"tsx"===b||/(?:^|\/)tsx(?:\/|$)/.test(b)}function e(a=process.execArgv){for(let b=0;b<a.length;b+=1){let c=a[b];if("--import"===c){let c=a[b+1];if(c&&d(c))return c;b+=1;continue}if(c.startsWith("--import=")){let a=c.slice(9);if(d(a))return a}}throw Error("Pi Desk 服务缺少 tsx loader,无法启动插件维护子进程")}c.d(b,{I:()=>e})},93951:(a,b,c)=>{c.d(b,{LC:()=>E,tA:()=>G,oP:()=>H});var d=c(36153),e=c(72497),f=c(76019),g=c(4287),h=c(69375);let i=g.SZ,j=g.w3;d.Ik({downloadSource:j,recommendedRegistry:i}).strict(),d.Ik({downloadSource:j}).strict(),d.Ik({query:d.Yj().trim().max(200).default(""),page:d.ai().int().min(1).max(100).default(1),kind:d.k5(["all","desk","pi"]).default("all"),registry:i.optional()}).strict(),d.Ik({name:d.Yj().trim().min(1).max(214).regex(/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*$/i),version:d.Yj().trim().min(1).max(128).optional(),registry:i.optional()}).strict();let k=d.Ik({name:d.Yj(),description:f.qf.nullable(),version:d.Yj(),publisher:d.Yj().nullable(),kind:d.k5(["desk","pi","unknown"]),official:d.zM(),registry:i}).strict();d.Ik({items:d.YO(k),hasMore:d.zM()}).strict(),k.extend({versions:d.YO(d.Yj()),readme:f.qf.nullable(),homepage:d.Yj().nullable(),repository:d.Yj().nullable(),compatible:d.zM().nullable(),compatibilityNote:d.Yj().nullable()}).strict();let l=d.Yj().trim().min(1).max(2048),m=g.mR,n=d.YO(l).min(1).max(32),o=d.Ik({phase:d.k5(["package","entry","setup","resources","resolve","native"]),message:f.qf.refine(a=>"string"==typeof a?a.length>0:a.default.length>0)}).strict(),p=d.Yj().trim().min(1).max(4096),q=d.Yj().trim().min(1).max(256),r=d.Yj().max(32768),s=d.Ik({name:q,label:r,state:d.k5(["active","inactive","shadowed"]),description:r,promptSnippet:r.nullable(),promptGuidelineCount:d.ai().int().nonnegative(),promptGuidelinePreview:r.nullable()}).strict(),t=d.Ik({name:q,label:r,state:d.k5(["active","inactive","shadowed"]),description:r,parameters:e.Dz,promptSnippet:r.nullable(),promptGuidelines:d.YO(r)}).strict(),u=d.Ik({path:p,events:d.YO(d.Ik({name:q,count:d.ai().int().positive()}).strict()),commands:d.YO(d.Ik({name:q,description:r.nullable()}).strict()),shortcuts:d.YO(d.Ik({shortcut:q,description:r.nullable()}).strict()),flags:d.YO(d.Ik({name:q,type:d.k5(["boolean","string"]),description:r.nullable(),default:d.KC([d.zM(),d.Yj(),d.ch()])}).strict()),messageRenderers:d.YO(q),entryRenderers:d.YO(q)}).strict(),v=d.Ik({name:q,description:r,path:p}).strict(),w=v.extend({modelVisible:d.zM()}).strict(),x=v.extend({content:d.Yj().max(65536),truncated:d.zM()}).strict(),y=x.extend({modelVisible:d.zM()}).strict(),z=d.Ik({name:q,path:p}).strict(),A=d.Ik({name:q,kind:d.k5(["config","native"])}).strict(),B=d.Ik({methods:d.YO(d.Ik({pluginName:q,method:q}).strict()),browserEntries:d.YO(d.Ik({pluginName:q}).strict()),messageDeclarations:d.YO(d.Ik({pluginName:q,declarationName:q,priority:d.ai().int().safe()}).strict())}).strict(),C=d.Ik({error:f.qf.refine(a=>"string"==typeof a?a.length<=32768:[a.default,...Object.values(a.translations)].every(a=>a.length<=32768)).nullable(),extensions:d.YO(u),tools:d.YO(s),skills:d.YO(w),prompts:d.YO(v),themes:d.YO(z),providers:d.YO(A),piDesk:B}).strict(),D=d.Ik({action:d.k5(["add","update","del","apply","enable","disable"]),phase:d.k5(["queued","checking","applying","waiting","failed"]),message:d.Yj().max(4e3).nullable()}).strict(),E=(0,h._G)({path:"plugins/management-update",bodySchema:d.Ik({}).strict()}),F=d.Ik({source:l,kind:d.k5(["package","extension"]).default("package"),operation:D.nullable().default(null),pluginName:d.Yj().trim().min(1).nullable(),description:f.qf.nullable().default(null),version:d.Yj().trim().min(1).nullable(),updateAvailable:d.zM().nullable(),updateTag:m.nullable().optional(),availableVersion:d.Yj().min(1).nullable().optional(),updateError:d.Yj().max(4e3).nullable().optional(),status:d.k5(["ready","available","disabled","failed"]),error:o.nullable(),capabilities:C}).strict(),G=d.Ik({source:l,readme:f.qf.nullable().default(null),tools:d.YO(t),skills:d.YO(y),prompts:d.YO(x)}).strict(),H=d.Ik({plugins:d.YO(F),restartRequired:d.zM(),loadError:f.qf.refine(a=>"string"==typeof a?a.length>0:a.default.length>0).nullable()}).strict();d.Ik({sources:d.YO(l).min(1).max(32).optional()}).strict(),d.Ik({}).strict().extend({mode:d.k5(["normal","basic"]).optional()}).strict(),d.Ik({checkUpdates:d.zM().optional(),sources:n.optional(),tag:m.optional()}).strict();let I=d.Ik({source:l}).strict(),J=I.extend({downloadSource:j.optional(),registry:i.optional(),tag:m.optional()}).strict();d.gM("action",[d.Ik({action:d.eu("add"),items:d.YO(J).min(1).max(32)}).strict(),d.Ik({action:d.eu("update"),sources:n}).strict(),d.Ik({action:d.eu("del"),sources:n}).strict(),d.Ik({action:d.eu("tag"),sources:n,tag:m}).strict()]),d.Ik({snapshot:H,results:d.YO(d.Ik({source:l,error:d.Yj().max(4e3).nullable()}).strict()).max(32)}).strict(),I.extend({enabled:d.zM()}).strict()},96783:(a,b,c)=>{c.d(b,{Y:()=>j});var d=c(76760),e=c(36153),f=c(86148),g=c(2472);let h="__PI_DESK_PLUGIN_PROBE__",i=e.Ik({packages:e.YO(e.Ik({source:e.Yj(),packageName:e.Yj().nullable(),version:e.Yj().nullable(),pluginName:e.Yj().nullable(),status:e.k5(["ready","failed"]),error:e.Ik({phase:e.k5(["package","entry","setup","resources","resolve"]),message:e.Yj()}).strict().nullable()}).strict()),loadError:e.Yj().nullable()}).strict();async function j(a,b,c=!1,e){let k=(0,f.I)(),l=(0,d.join)(process.cwd(),"src","server","l4_foundation","pi","l4-pi-plugin-probe-runner.mts"),{stdout:m,stderr:n,code:o}=await (0,g.i)({args:["--conditions=react-server","--import",k,l],agentDir:b,env:{PI_DESK_PLUGIN_PROBE_AGENT_DIR:b,PI_DESK_PLUGIN_PROBE_CWD:a,PI_DESK_PLUGIN_PROBE_NATIVE:c?"1":void 0},maxOutputBytes:1048576,timeoutMs:3e4,signal:e,timeoutError:()=>Error("插件预检超时"),cleanupError:(a,b)=>Error(`${a}
|
|
7
|
+
插件预检进程树清理失败`,{cause:b})});if(0!==o)throw Error(n.trim()||`插件预检进程退出码 ${o??"null"}`);let p=m.lastIndexOf(h);if(p<0)throw Error("插件预检没有返回有效结果");let q=m.slice(p+h.length).split(/\r?\n/,1)[0];return i.parse(JSON.parse(q))}}};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
"use strict";exports.id=78262,exports.ids=[78262],exports.modules={6816:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{n:()=>w});var e=c(71473),f=c(77598),g=c(73024),h=c(76760),i=c(75430),j=c(28802),k=a([e,i,j]);[e,i,j]=k.then?(await k)():k;let x=new Set(["openrouter","vercel-ai-gateway","ai-router","cloudflare-ai-gateway","opencode","opencode-go"]),y=null;function l(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function m(){return(0,h.join)((0,e.M)(),"model-catalog.json")}function n(a){return a.trim().toLowerCase().replace(/[\s_]+/gu,"-").replace(/-+/gu,"-")}function o(a){let b=n(a).replace(/:(free|online)$/u,""),c=b.split("/").filter(Boolean);return c.length>1?c.at(-1):b}function p(a){return`${a.provider}\u0000${a.modelId}`}function q(a,b){let c=a[b];return"number"==typeof c&&Number.isFinite(c)&&c>=0?c:null}function r(a,b){if(x.has(a))return!1;let c=n(a),d=n(b);if(b.includes("/"))return d.split("/")[0]===c;let e=o(b);return(e.match(/^(gpt|chatgpt|o1|o3|o4)-/u)?["openai"]:e.startsWith("claude-")?["anthropic"]:e.match(/^(gemini|gemma)-/u)?["google","google-vertex"]:e.startsWith("deepseek-")?["deepseek"]:e.startsWith("glm-")?["zai","zai-coding-cn"]:e.match(/^(kimi|moonshot)-/u)?["moonshotai","moonshotai-cn"]:e.match(/^(mistral|codestral|pixtral)-/u)?["mistral"]:[]).includes(c)}async function s(a){let b=new AbortController,c=setTimeout(()=>b.abort(),2e4);try{let c=await fetch("https://models.dev/api.json",{headers:a?.etag?{"If-None-Match":a.etag}:void 0,signal:b.signal});if(304===c.status){let b=a?.models.flatMap(a=>a.sources.filter(a=>"models-dev"===a.origin));if(!b?.length)throw Error("models.dev 返回 304,但本地没有可用缓存");return{etag:a?.etag??null,unchanged:!0,sources:b}}if(!c.ok)throw Error(`models.dev 请求失败:HTTP ${c.status}`);let d=await c.json();if(!l(d))throw Error("models.dev 返回格式无效");let e=[];for(let[a,b]of Object.entries(d)){if(!l(b)||!l(b.models))continue;let c="string"==typeof b.name&&b.name.trim()?b.name:a;for(let[d,f]of Object.entries(b.models)){if(!l(f))continue;let b="string"==typeof f.id&&f.id.trim()?f.id:d,g=function(a,b,c,d){let e=l(d.limit)?d.limit:{},f=q(e,"context"),g=q(e,"output");if(!f||!g)return null;let h=l(d.modalities)&&Array.isArray(d.modalities.input)?d.modalities.input:["text"],i=[...new Set(h.filter(a=>"text"===a||"image"===a))];return{origin:"models-dev",modelName:"string"==typeof d.name&&d.name.trim()?d.name:c,provider:a,providerName:b,modelId:c,official:r(a,c),defaults:{reasoning:!0===d.reasoning,thinkingLevels:function(a){if(!0!==a.reasoning)return[{level:"off",providerValue:null}];let b=(Array.isArray(a.reasoning_options)?a.reasoning_options:[]).find(a=>l(a)&&"effort"===a.type&&Array.isArray(a.values));if(l(b)&&Array.isArray(b.values)){let a=[];for(let c of b.values){if("string"!=typeof c)continue;let b="none"===c?"off":c;("off"===b||"minimal"===b||"low"===b||"medium"===b||"high"===b||"xhigh"===b||"max"===b)&&a.push({level:b,providerValue:c})}if(a.length>0)return a}return[{level:"high",providerValue:null}]}(d),input:i.length>0?i:["text"],contextWindow:Math.trunc(f),maxTokens:Math.trunc(g),cost:function(a){if(!l(a))return null;let b=q(a,"input"),c=q(a,"output");return null===b||null===c?null:{input:b,output:c,cacheRead:q(a,"cache_read")??0,cacheWrite:q(a,"cache_write")??0}}(d.cost)}}}(a,c,b,f);g&&e.push(g)}}if(0===e.length)throw Error("models.dev 没有返回可用模型");return{etag:c.headers.get("etag"),unchanged:!1,sources:e}}finally{clearTimeout(c)}}async function t(){let a=await i.ModelRuntime.create({allowModelNetwork:!1}),b=new AbortController,c=setTimeout(()=>b.abort(),2e4),d=!1;try{let c=await a.refresh({allowNetwork:!0,force:!0,signal:b.signal});(d=c.aborted||c.errors.size>0)&&console.warn("[Pi Desk][ModelCatalog] Pi 模型目录部分刷新失败",{aborted:c.aborted,providers:[...c.errors.keys()]})}catch(a){d=!0,console.warn("[Pi Desk][ModelCatalog] Pi 模型目录刷新失败",{errorName:a instanceof Error?a.name:"UnknownError"})}finally{clearTimeout(c)}return{sources:a.getModels().map(b=>{var c;return c=a.getProvider(b.provider)?.name??b.provider,{origin:"pi",modelName:b.name,provider:b.provider,providerName:c,modelId:b.id,official:r(b.provider,b.id),defaults:{reasoning:b.reasoning,thinkingLevels:(0,j.getSupportedThinkingLevels)(b).map(a=>({level:a,providerValue:"string"==typeof b.thinkingLevelMap?.[a]?b.thinkingLevelMap[a]:null})),input:[...b.input],contextWindow:b.contextWindow,maxTokens:b.maxTokens,cost:{input:b.cost.input,output:b.cost.output,cacheRead:b.cost.cacheRead,cacheWrite:b.cost.cacheWrite}}}}),failed:d}}async function u(a){let b=a?.models.flatMap(a=>a.sources.filter(a=>"models-dev"===a.origin))??[],c=a?.models.flatMap(a=>a.sources.filter(a=>"pi"===a.origin))??[],[d,e]=await Promise.allSettled([s(a),t()]),i="fulfilled"===d.status,j="fulfilled"===e.status&&!e.value.failed,k=i?d.value.sources:b,l="fulfilled"===e.status?e.value.sources:c;if(!k.length&&!l.length){let a="rejected"===d.status?d.reason:"没有可用缓存";throw Error(`模型参考目录没有可用数据:${a instanceof Error?a.message:String(a)}`)}"rejected"===d.status&&console.warn("[Pi Desk][ModelCatalog] models.dev 刷新失败,继续使用可用目录",{errorName:d.reason instanceof Error?d.reason.name:"UnknownError"});let n=function(a){let b=new Map;for(let d of a){var c;let a=(c=d.modelId,o(c));if(!a)continue;let e=b.get(a),f=e?.name??d.modelName,g=d.official?d.modelName:f;if(!e){b.set(a,{referenceId:a,name:g,sources:[d]});continue}let h=e.sources.findIndex(a=>p(a)===p(d));h>=0?"pi"===d.origin&&(e.sources[h]=d):e.sources.push(d),d.official&&(e.name=g)}return[...b.values()].map(a=>({...a,name:a.sources.find(a=>a.official)?.modelName??a.sources[0]?.modelName??a.name,sources:a.sources.sort((a,b)=>Number(b.official)-Number(a.official)||a.provider.localeCompare(b.provider))})).sort((a,b)=>a.name.localeCompare(b.name))}([...k,...l]),q=!a||JSON.stringify(n)!==JSON.stringify(a.models),r={etag:"fulfilled"===d.status?d.value.etag:a?.etag??null,updatedAt:q?Date.now():a?.updatedAt??Date.now(),models:n},u=m();(0,g.mkdirSync)((0,h.dirname)(u),{recursive:!0});let v=`${u}.${process.pid}.${(0,f.randomUUID)()}.tmp`;try{(0,g.writeFileSync)(v,`${JSON.stringify(r)}
|
|
2
|
-
`,"utf8"),(0,g.renameSync)(v,u)}finally{(0,g.existsSync)(v)&&(0,g.unlinkSync)(v)}let w=Number(i)+Number(j);return{cache:r,result:0===w?"cached":1===w?"partial":q?"updated":"unchanged"}}async function v(a){return y||(y=u(a).finally(()=>{y=null}))}async function w(a){var b;let c,d,e,f,h,i=function(){let a=m();if(!(0,g.existsSync)(a))return null;try{let b=JSON.parse((0,g.readFileSync)(a,"utf8"));if(!l(b)||"number"!=typeof b.updatedAt||!Array.isArray(b.models))return null;let c=[];for(let a of b.models){if(!l(a)||!Array.isArray(a.sources))continue;let b=[];for(let c of a.sources){if(!l(c)||"models-dev"!==c.origin&&"pi"!==c.origin||"string"!=typeof c.modelName)continue;let a=function(a){if("models-dev"!==a.origin&&"pi"!==a.origin||"string"!=typeof a.modelName||"string"!=typeof a.provider||"string"!=typeof a.providerName||"string"!=typeof a.modelId||"boolean"!=typeof a.official||!l(a.defaults))return null;let b=a.defaults;if("boolean"!=typeof b.reasoning||!Array.isArray(b.thinkingLevels)||!Array.isArray(b.input)||"number"!=typeof b.contextWindow||"number"!=typeof b.maxTokens)return null;let c=[];for(let a of b.thinkingLevels){if(!l(a)||"string"!=typeof a.level||"off"!==a.level&&"minimal"!==a.level&&"low"!==a.level&&"medium"!==a.level&&"high"!==a.level&&"xhigh"!==a.level&&"max"!==a.level||null!==a.providerValue&&"string"!=typeof a.providerValue)return null;c.push({level:a.level,providerValue:a.providerValue})}let d=b.input.filter(a=>"text"===a||"image"===a);if(0===c.length||0===d.length)return null;let e=null;if(null!==b.cost){if(!l(b.cost))return null;let a=q(b.cost,"input"),c=q(b.cost,"output"),d=q(b.cost,"cacheRead"),f=q(b.cost,"cacheWrite");if(null===a||null===c||null===d||null===f)return null;e={input:a,output:c,cacheRead:d,cacheWrite:f}}return{origin:a.origin,modelName:a.modelName,provider:a.provider,providerName:a.providerName,modelId:a.modelId,official:a.official,defaults:{reasoning:b.reasoning,thinkingLevels:c,input:d,contextWindow:Math.trunc(b.contextWindow),maxTokens:Math.trunc(b.maxTokens),cost:e}}}(c);a&&b.push(a)}"string"==typeof a.referenceId&&"string"==typeof a.name&&b.length>0&&c.push({referenceId:a.referenceId,name:a.name,sources:b})}if(0===c.length)return null;return{etag:"string"==typeof b.etag?b.etag:null,updatedAt:b.updatedAt,models:c}}catch(a){return console.warn("[Pi Desk][ModelCatalog] 模型参考缓存无效",{errorName:a instanceof Error?a.name:"UnknownError"}),null}}(),j="not-requested";if(a.refresh||!i){let a=await v(i);i=a.cache,j=a.result}let k=(b=i,c=n(a.query),e=(d=b.models.map(a=>{if(!c)return{model:a,exact:!1,similar:!0};let b=[n(a.referenceId),...a.sources.flatMap(a=>[n(a.modelId),o(a.modelId)])],d=[...b,n(a.name),...a.sources.map(a=>n(a.providerName))],e=b.some(a=>a===c),f=e||d.some(a=>a.includes(c));return{model:a,exact:e,similar:f}}).filter(a=>a.similar)).filter(a=>a.exact).length,d.sort((a,b)=>Number(b.exact)-Number(a.exact)||a.model.name.localeCompare(b.model.name)),f=(a.page.index-1)*a.page.size,h=d.slice(f,f+a.page.size).map(({model:a,exact:b})=>({referenceId:a.referenceId,name:a.name,match:c?b&&1===e?"exact":"similar":null,sources:a.sources.map(({origin:a,modelName:b,...c})=>c)})),{total:d.length,models:h});return{updatedAt:i.updatedAt,refreshResult:j,page:{index:a.page.index,size:a.page.size,total:k.total},models:k.models}}d()}catch(a){d(a)}})},78262:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{ZJ:()=>f.ZJ,aY:()=>f.aY,n7:()=>f.n7,nZ:()=>e.n,oj:()=>f.oj,ur:()=>f.ur});var e=c(6816),f=c(82526),g=a([e,f]);[e,f]=g.then?(await g)():g,d()}catch(a){d(a)}})},82526:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{ZJ:()=>
|
|
3
|
-
|
|
4
|
-
`,"utf8");try{let a=await i.ModelRuntime.create({modelsPath:c,modelsStorePath:d,allowModelNetwork:!1}),b=a.getError();if(b)throw Error(`模型配置校验失败:${b}`);return a}finally{(0,f.existsSync)(c)&&(0,f.unlinkSync)(c),(0,f.existsSync)(d)&&(0,f.unlinkSync)(d)}}function E(a,b){return(0,l.gX)(a,b,s(r()))}async function F(a,b){let c=await a.listCredentials(),d=new Set(c.filter(a=>"oauth"===a.type).map(a=>a.providerId));return[...new Set([...d,...b.map(a=>a.provider)])].map(b=>{let c=a.getProvider(b);return{provider:b,name:c?.name??b,loggedIn:d.has(b),subscription:c?.auth.oauth?.isSubscription===!0,models:a.getModels(b).map(a=>w({id:a.id,cost:a.cost},a,void 0))}})}async function G(a,b,c){let d=await c.listCredentials(),e=n(a.providers)?a.providers:{},f=n(b.providers)?b.providers:{},g=["baseUrl","api","apiKey","headers","authHeader"];for(let a of d){if("oauth"!==a.type)continue;let b=e[a.providerId],c=f[a.providerId],d=n(b)?b:{},i=n(c)?c:{};if(g.some(a=>void 0!==i[a]&&!(0,h.isDeepStrictEqual)(d[a],i[a])))throw Error(`服务 ${a.providerId} 已保存账号登录,请为自定义 API 使用独立服务 ID,或先退出账号`)}}async function H(a,b){let c=(0,l.Tp)(b),d=new Set([...(0,l.Tp)(a)].filter(a=>!c.has(a)));if(d.size){for(let a of A(b))if(d.has((0,l.It)(a.provider,a.modelId)))throw Error(`模型 ${a.provider}/${a.modelId} 仍被常用组合引用,请先移除对应组合`);for(let{cwd:a}of(await (0,k.pJ)(!0))){let b=s((0,g.join)(a,i.CONFIG_DIR_NAME,"settings.json"));if("string"==typeof b.defaultProvider&&"string"==typeof b.defaultModel&&d.has((0,l.It)(b.defaultProvider,b.defaultModel)))throw Error(`项目“${a}”仍将 ${b.defaultProvider}/${b.defaultModel} 设为默认模型,请先在“项目默认”中调整`)}}}async function I(){let a=performance.now(),b=s(r()),c=await i.ModelRuntime.create({allowModelNetwork:!1}),d=await i.ModelRuntime.create({modelsPath:null,allowModelNetwork:!1}),e=(0,l.u1)(b),f=performance.now(),g={providers:x(b,c),presets:A(b),models:await z(c,void 0,b),nativeConfig:b,accountModels:e,accounts:await F(d,e)},h=performance.now()-a;return h>500&&console.warn("[Pi Desk][ModelSettings] 读取模型配置耗时较长",{totalMs:Math.round(h),runtimeMs:Math.round(f-a),projectionMs:Math.round(performance.now()-f),providers:g.providers.length,models:g.models.length}),g}async function J(a){await u(async()=>{let b=r();try{let c,d;try{c=s(b)}catch(b){if(void 0===a.nativeConfig)throw b;c={}}if(void 0!==a.nativeConfig)d=a.nativeConfig;else{let b=await i.ModelRuntime.create({allowModelNetwork:!1}),e=b.getError();if(e)throw Error(`当前模型配置不可用,请先通过原生配置修正:${e}`);let f=void 0===a.accountModels?b:await i.ModelRuntime.create({modelsPath:null,allowModelNetwork:!1});d=function(a,b,c,d){if(void 0!==b.nativeConfig)return b.nativeConfig;let e={...a};if(b.providers){let d=n(a.providers)?a.providers:{},f=new Map(x(a,c).map(a=>[a.provider,a]));e.providers=Object.fromEntries([...Object.entries(d).filter(([a])=>!f.has(a)),...b.providers.map(a=>[a.provider,function(a,b,c){let d=n(a)?{...a}:{};for(let a of["name","baseUrl","api","apiKey","authHeader"])c&&b[a]===c[a]||B(d,a,b[a]);c&&(0,h.isDeepStrictEqual)(b.headers,c.headers)||C(d,"headers",b.headers);let e=Array.isArray(d.models)?d.models.filter(n):[],f=new Map(e.filter(a=>"string"==typeof a.id).map(a=>[a.id,a])),g=new Map(c?.models.map(a=>[a.modelId,a])),i=n(d.modelOverrides)?{...d.modelOverrides}:void 0,j=b.models.map(a=>{let b=i?.[a.modelId],c=n(b)?{...b}:void 0,d=function(a,b,c,d){let e=n(a)?{...a}:{};e.id=b.modelId;let f=a=>d&&Object.hasOwn(d,a)?d:e,g=a=>!c||!(0,h.isDeepStrictEqual)(b[a],c[a]);for(let a of["name","api","baseUrl"])g(a)&&B(f(a),a,b[a]);for(let a of["reasoning","input","contextWindow","maxTokens"])g(a)&&(f(a)[a]=b[a]);if(g("thinkingLevels")&&function(a,b,c){let d=n(a.thinkingLevelMap)?{...a.thinkingLevelMap}:{},e=new Map(c?.thinkingLevels.map(a=>[a.level,a.providerValue])),f=new Map(b.thinkingLevels.map(a=>[a.level,a.providerValue]));for(let a of O)if(!c||e.has(a)!==f.has(a)||e.get(a)!==f.get(a))if(f.has(a)){let b=f.get(a);null===b?delete d[a]:d[a]=b}else("xhigh"!==a&&"max"!==a||e.has(a))&&(d[a]=null);C(a,"thinkingLevelMap",d)}(f("thinkingLevelMap"),b,c),g("cost")){let a=f("cost");if(b.cost){let d=n(a.cost)?{...a.cost}:{...b.cost};for(let a of["input","output","cacheRead","cacheWrite"])c&&b.cost[a]===c.cost?.[a]||(d[a]=b.cost[a]);a.cost=d}else delete e.cost,d&&delete d.cost}if(g("headers")&&function(a,b,c,d){let e=q(a.headers),f=q(b?.headers);for(let a of new Set([...Object.keys(d),...Object.keys(c)]))if(c[a]!==d[a]){if(!Object.hasOwn(c,a)){delete e[a],delete f[a];continue}(Object.hasOwn(e,a)||!Object.hasOwn(f,a)?e:f)[a]=c[a]}C(a,"headers",e),b&&C(b,"headers",f)}(e,d,b.headers,c?.headers??{}),g("compat")){let a=f("compat"),d=n(a.compat)?{...a.compat}:{};for(let a of["supportsDeveloperRole","thinkingFormat","requiresReasoningContentOnAssistantMessages"]){let e=b.compat?.[a]??null;c&&e===(c.compat?.[a]??null)||B(d,a,e)}C(a,"compat",d)}return e}(f.get(a.modelId),a,g.get(a.modelId),c);return i&&c&&(i[a.modelId]=c),d});return(void 0!==d.models||j.length>0)&&(d.models=j),i&&(d.modelOverrides=i),d}(d[a.provider],a,f.get(a.provider))])])}return void 0!==b.accountModels&&(0,l.OM)(a,e,b.accountModels,d),b.presets&&!(0,h.isDeepStrictEqual)(b.presets,A(a))&&(e.modelPresets=b.presets),e}(c,a,b,f)}let e=await D(d),f=await z(e,void 0,d);await G(c,d,e),await H(c,d),function(a,b,c=[]){let d=new Set(c.map(a=>`${v(a.provider,a.modelId)}\u0000${a.thinkingLevel}`)),e=new Map(b.map(a=>[v(a.provider,a.modelId),a])),f=new Set;for(let b of a){let a=`${v(b.provider,b.modelId)}\u0000${b.thinkingLevel}`;if(f.has(a))throw Error("模型预设存在重复组合");f.add(a);let c=e.get(v(b.provider,b.modelId));if((!c||!c.thinkingLevels.includes(b.thinkingLevel))&&!d.has(a))throw Error(`模型预设 ${b.provider}/${b.modelId}:${b.thinkingLevel} 不可用`)}}(A(d),f,A(c)),t(b,d)}catch(a){throw console.error("[Pi Desk][ModelSettings] 模型配置保存失败",{message:a instanceof Error?a.message:String(a)}),Error(`模型配置保存失败:${a instanceof Error?a.message:String(a)}`,{cause:a})}})}function K(a){let b=(0,g.resolve)(a);if(!(0,g.isAbsolute)(b)||!(0,f.existsSync)(b)||!(0,f.statSync)(b).isDirectory())throw Error("项目目录不存在");return b}function L(a){return(0,g.join)(K(a),i.CONFIG_DIR_NAME,"settings.json")}async function M(a){let b=K(a),c=L(b),d=s(c),e=await i.ModelRuntime.create({allowModelNetwork:!1}),f=await z(e,b);if(!["defaultProvider","defaultModel","defaultThinkingLevel"].some(a=>Object.hasOwn(d,a)))return{cwd:b,default:null,models:f};let g=i.SettingsManager.create(b,(0,i.getAgentDir)()),h=g.getDefaultProvider(),j=g.getDefaultModel(),k=g.getDefaultThinkingLevel(),l=f.find(a=>a.provider===h&&a.modelId===j),m=h&&j&&k&&l?.thinkingLevels.includes(k)?{provider:h,modelId:j,thinkingLevel:k}:null;return{cwd:b,default:m,models:f}}async function N(a,b){await u(async()=>{let c=K(a);if(b){let a=await i.ModelRuntime.create({allowModelNetwork:!1}),d=(await z(a,c)).find(a=>a.provider===b.provider&&a.modelId===b.modelId);if(!d||!d.thinkingLevels.includes(b.thinkingLevel))throw Error("项目默认模型或思考等级不可用")}let d=L(c),e=s(d);b?(e.defaultProvider=b.provider,e.defaultModel=b.modelId,e.defaultThinkingLevel=b.thinkingLevel):(delete e.defaultProvider,delete e.defaultModel,delete e.defaultThinkingLevel),t(d,e)})}d()}catch(a){d(a)}})},97219:(a,b,c)=>{c.d(b,{It:()=>g,OM:()=>k,Tp:()=>i,gX:()=>j,u1:()=>h});var d=c(57975);let e=["input","output","cacheRead","cacheWrite"];function f(a){return"object"!=typeof a||null===a||Array.isArray(a)?{}:a}function g(a,b){return`${a}\u0000${b}`}function h(a){if(void 0===a.modelSelections)return[];if(!Array.isArray(a.modelSelections))throw Error("modelSelections 必须是模型引用数组");let b=new Set;return a.modelSelections.map(c=>{let d=f(c);if("string"!=typeof d.provider||!d.provider.trim()||"string"!=typeof d.modelId||!d.modelId.trim())throw Error("modelSelections 中的模型必须包含服务 ID 和模型 ID");let h=g(d.provider,d.modelId);if(b.has(h))throw Error(`重复收录模型:${d.provider}/${d.modelId}`);b.add(h);let i=f(f(f(a.providers)[d.provider]).modelOverrides)[d.modelId],j=f(i),k={};for(let a of["contextWindow","maxTokens"])"number"==typeof j[a]&&(k[a]=j[a]);if(void 0!==j.cost){let a=f(j.cost);k.cost=Object.fromEntries(e.filter(b=>"number"==typeof a[b]).map(b=>[b,a[b]]))}return{provider:d.provider,modelId:d.modelId,overrides:k}})}function i(a){let b=new Set(h(a).map(a=>g(a.provider,a.modelId)));for(let[c,d]of Object.entries(f(a.providers))){let a=f(d).models;if(Array.isArray(a))for(let d of a){let a=f(d);"string"==typeof a.id&&b.add(g(c,a.id))}}return b}function j(a,b,c){let d=i(c),e=new Set(b.getRegisteredProviderIds());return a.filter(a=>d.has(g(a.provider,a.id))||e.has(a.provider)||void 0!==b.getRegisteredNativeProvider(a.provider)||!b.getPhysicalModel(a.provider,a.id))}function k(a,b,c,i){let j=new Map(h(a).map(a=>[g(a.provider,a.modelId),a])),k=new Set,l={...f(b.providers)};for(let a of c){let b=g(a.provider,a.modelId);if(k.has(b))throw Error(`重复收录模型:${a.provider}/${a.modelId}`);k.add(b);let c=j.get(b),h=i.getModel(a.provider,a.modelId);if(!c&&(!h||!i.getProvider(a.provider)?.auth.oauth))throw Error(`登录服务未提供模型:${a.provider}/${a.modelId}`);let m={...f(l[a.provider])};if(Array.isArray(m.models)&&m.models.some(b=>f(b).id===a.modelId))throw Error(`模型已存在于自定义配置:${a.provider}/${a.modelId}`);let n={...f(m.modelOverrides)},o={...f(n[a.modelId])},p=!1;for(let b of["contextWindow","maxTokens","cost"]){let g=a.overrides[b],h=c?.overrides[b];if(!(0,d.isDeepStrictEqual)(h,g))if(p=!0,void 0===g)delete o[b];else if("cost"===b){let b={...f(o.cost)};for(let c of e){let d=a.overrides.cost?.[c];void 0===d?delete b[c]:b[c]=d}Object.keys(b).length?o.cost=b:delete o.cost}else o[b]=g}p&&(Object.keys(o).length?n[a.modelId]=o:delete n[a.modelId],Object.keys(n).length?m.modelOverrides=n:delete m.modelOverrides,Object.keys(m).length?l[a.provider]=m:delete l[a.provider])}let m=c.map(({provider:a,modelId:b})=>({provider:a,modelId:b})),n=h(a).map(({provider:a,modelId:b})=>({provider:a,modelId:b}));(0,d.isDeepStrictEqual)(n,m)||(b.modelSelections=m),(0,d.isDeepStrictEqual)(l,f(b.providers))||(b.providers=l)}}};
|
|
2
|
+
`,"utf8"),(0,g.renameSync)(v,u)}finally{(0,g.existsSync)(v)&&(0,g.unlinkSync)(v)}let w=Number(i)+Number(j);return{cache:r,result:0===w?"cached":1===w?"partial":q?"updated":"unchanged"}}async function v(a){return y||(y=u(a).finally(()=>{y=null}))}async function w(a){var b;let c,d,e,f,h,i=function(){let a=m();if(!(0,g.existsSync)(a))return null;try{let b=JSON.parse((0,g.readFileSync)(a,"utf8"));if(!l(b)||"number"!=typeof b.updatedAt||!Array.isArray(b.models))return null;let c=[];for(let a of b.models){if(!l(a)||!Array.isArray(a.sources))continue;let b=[];for(let c of a.sources){if(!l(c)||"models-dev"!==c.origin&&"pi"!==c.origin||"string"!=typeof c.modelName)continue;let a=function(a){if("models-dev"!==a.origin&&"pi"!==a.origin||"string"!=typeof a.modelName||"string"!=typeof a.provider||"string"!=typeof a.providerName||"string"!=typeof a.modelId||"boolean"!=typeof a.official||!l(a.defaults))return null;let b=a.defaults;if("boolean"!=typeof b.reasoning||!Array.isArray(b.thinkingLevels)||!Array.isArray(b.input)||"number"!=typeof b.contextWindow||"number"!=typeof b.maxTokens)return null;let c=[];for(let a of b.thinkingLevels){if(!l(a)||"string"!=typeof a.level||"off"!==a.level&&"minimal"!==a.level&&"low"!==a.level&&"medium"!==a.level&&"high"!==a.level&&"xhigh"!==a.level&&"max"!==a.level||null!==a.providerValue&&"string"!=typeof a.providerValue)return null;c.push({level:a.level,providerValue:a.providerValue})}let d=b.input.filter(a=>"text"===a||"image"===a);if(0===c.length||0===d.length)return null;let e=null;if(null!==b.cost){if(!l(b.cost))return null;let a=q(b.cost,"input"),c=q(b.cost,"output"),d=q(b.cost,"cacheRead"),f=q(b.cost,"cacheWrite");if(null===a||null===c||null===d||null===f)return null;e={input:a,output:c,cacheRead:d,cacheWrite:f}}return{origin:a.origin,modelName:a.modelName,provider:a.provider,providerName:a.providerName,modelId:a.modelId,official:a.official,defaults:{reasoning:b.reasoning,thinkingLevels:c,input:d,contextWindow:Math.trunc(b.contextWindow),maxTokens:Math.trunc(b.maxTokens),cost:e}}}(c);a&&b.push(a)}"string"==typeof a.referenceId&&"string"==typeof a.name&&b.length>0&&c.push({referenceId:a.referenceId,name:a.name,sources:b})}if(0===c.length)return null;return{etag:"string"==typeof b.etag?b.etag:null,updatedAt:b.updatedAt,models:c}}catch(a){return console.warn("[Pi Desk][ModelCatalog] 模型参考缓存无效",{errorName:a instanceof Error?a.name:"UnknownError"}),null}}(),j="not-requested";if(a.refresh||!i){let a=await v(i);i=a.cache,j=a.result}let k=(b=i,c=n(a.query),e=(d=b.models.map(a=>{if(!c)return{model:a,exact:!1,similar:!0};let b=[n(a.referenceId),...a.sources.flatMap(a=>[n(a.modelId),o(a.modelId)])],d=[...b,n(a.name),...a.sources.map(a=>n(a.providerName))],e=b.some(a=>a===c),f=e||d.some(a=>a.includes(c));return{model:a,exact:e,similar:f}}).filter(a=>a.similar)).filter(a=>a.exact).length,d.sort((a,b)=>Number(b.exact)-Number(a.exact)||a.model.name.localeCompare(b.model.name)),f=(a.page.index-1)*a.page.size,h=d.slice(f,f+a.page.size).map(({model:a,exact:b})=>({referenceId:a.referenceId,name:a.name,match:c?b&&1===e?"exact":"similar":null,sources:a.sources.map(({origin:a,modelName:b,...c})=>c)})),{total:d.length,models:h});return{updatedAt:i.updatedAt,refreshResult:j,page:{index:a.page.index,size:a.page.size,total:k.total},models:k.models}}d()}catch(a){d(a)}})},78262:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Z:()=>f.Z,ZJ:()=>f.ZJ,aY:()=>f.aY,n7:()=>f.n7,nZ:()=>e.n,oj:()=>f.oj,ur:()=>f.ur});var e=c(6816),f=c(82526),g=a([e,f]);[e,f]=g.then?(await g)():g,d()}catch(a){d(a)}})},82526:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Z:()=>L,ZJ:()=>J,aY:()=>P,n7:()=>M,oj:()=>F,ur:()=>Q});var e=c(77598),f=c(73024),g=c(76760),h=c(57975),i=c(75430),j=c(28802),k=c(65209),l=c(97219),m=a([i,j,k]);[i,j,k]=m.then?(await m)():m;let R=["off","minimal","low","medium","high","xhigh","max"],S=/^#[0-9a-fA-F]{6}$/,T=Promise.resolve();function n(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function o(a){return"string"==typeof a&&a.trim()?a:null}function p(a){return"boolean"==typeof a?a:null}function q(a){return n(a)?Object.fromEntries(Object.entries(a).filter(a=>!!a[0].trim()&&"string"==typeof a[1])):{}}function r(){return(0,g.join)((0,i.getAgentDir)(),"models.json")}function s(a){let b;if(!(0,f.existsSync)(a))return{};let c=(0,f.readFileSync)(a,"utf8");try{let a=(65279===c.charCodeAt(0)?c.slice(1):c).replace(/"(?:\\.|[^"\\])*"|\/\/[^\n]*/g,a=>'"'===a[0]?a:"").replace(/"(?:\\.|[^"\\])*"|,(\s*[}\]])/g,(a,b)=>b??('"'===a[0]?a:""));b=JSON.parse(a)}catch(b){throw Error(`配置文件 ${a} 解析失败:${b instanceof Error?b.message:String(b)}`,{cause:b})}if(!n(b))throw Error(`${a} 必须是 JSON 对象`);return b}function t(a,b){(0,f.mkdirSync)((0,g.dirname)(a),{recursive:!0});let c=`${a}.${process.pid}.${(0,e.randomUUID)()}.tmp`;try{(0,f.writeFileSync)(c,b,"utf8"),(0,f.renameSync)(c,a)}finally{(0,f.existsSync)(c)&&(0,f.unlinkSync)(c)}}function u(a,b){t(a,`${JSON.stringify(b,null,2)}
|
|
3
|
+
`)}function v(a){let b=T.then(a,a);return T=b.then(()=>void 0,()=>void 0),b}function w(a,b){return`${a}\u0000${b}`}function x(a,b,c){let d=o(a.id)??b?.id;if(!d)throw Error("模型缺少 id");let e=b?.reasoning??p(a.reasoning)??!1,f=b?.thinkingLevelMap??(n(a.thinkingLevelMap)?a.thinkingLevelMap:{}),g=(b?(0,j.getSupportedThinkingLevels)(b):e?R.filter(a=>"xhigh"===a||"max"===a?"string"==typeof f[a]:null!==f[a]):["off"]).map(a=>({level:a,providerValue:"string"==typeof f[a]?f[a]:null})),h=b?.input??(Array.isArray(a.input)?a.input:["text"]),i=[...new Set(h.filter(a=>"text"===a||"image"===a))],k=n(a.cost)?a.cost:null,l=n(c)&&n(c.cost)?c.cost:null,m=k||l?b?.cost??k:null,r=m&&"number"==typeof m.input&&"number"==typeof m.output&&"number"==typeof m.cacheRead&&"number"==typeof m.cacheWrite?{input:m.input,output:m.output,cacheRead:m.cacheRead,cacheWrite:m.cacheWrite}:null;return{modelId:d,name:b?.name??o(a.name)??d,api:o(a.api),baseUrl:o(a.baseUrl),reasoning:e,thinkingLevels:g,input:i.length>0?i:["text"],contextWindow:b?.contextWindow??("number"==typeof a.contextWindow&&a.contextWindow>0?Math.trunc(a.contextWindow):128e3),maxTokens:b?.maxTokens??("number"==typeof a.maxTokens&&a.maxTokens>0?Math.trunc(a.maxTokens):16384),cost:r,headers:{...q(n(c)?c.headers:void 0),...q(a.headers),...q(b?.headers)},compat:function(a){if(!n(a))return null;let b=o(a.thinkingFormat),c={supportsDeveloperRole:p(a.supportsDeveloperRole),thinkingFormat:b,requiresReasoningContentOnAssistantMessages:p(a.requiresReasoningContentOnAssistantMessages)};return Object.values(c).some(a=>null!==a)?c:null}(b?.compat??a.compat)}}function y(a,b){let c=n(a.providers)?a.providers:{},d=[];for(let[a,e]of Object.entries(c)){if(!a.trim()||!n(e)||void 0!==e.modelOverrides&&Object.keys(e).every(a=>"modelOverrides"===a))continue;let c=Array.isArray(e.models)?e.models:[];d.push({provider:a,name:o(e.name),baseUrl:o(e.baseUrl),api:o(e.api),apiKey:"string"==typeof e.apiKey?e.apiKey:null,authHeader:p(e.authHeader),headers:q(e.headers),models:c.filter(n).map(c=>x(c,"string"==typeof c.id?b.getModel(a,c.id):void 0,n(e.modelOverrides)&&"string"==typeof c.id?e.modelOverrides[c.id]:void 0))})}return d}function z(a){return{provider:a.provider,modelId:a.id,name:a.name,input:[...a.input],contextWindow:a.contextWindow,thinkingLevels:[...(0,j.getSupportedThinkingLevels)(a)]}}async function A(a,b,c=s(r())){let d=[...a.getAvailableSnapshot()];if(b){let c=i.SettingsManager.create(b,(0,i.getAgentDir)()).getEnabledModels();c?.length&&(d=(await (0,i.resolveModelScopeWithDiagnostics)(c,a)).scopedModels.map(a=>a.model))}let e=new Map;for(let b of(0,l.gX)(d,a,c))e.set(w(b.provider,b.id),b);return[...e.values()].map(z)}function B(a){if(!Array.isArray(a.modelPresets))return[];let b=[];for(let c of a.modelPresets){if(!n(c))continue;let a=o(c.provider),d=o(c.modelId),e=o(c.thinkingLevel);a&&d&&e&&R.includes(e)&&b.push({provider:a,modelId:d,thinkingLevel:e,color:"string"==typeof c.color&&S.test(c.color)?c.color:null})}return b}function C(a,b,c){null===c?delete a[b]:a[b]=c}function D(a,b,c){Object.keys(c).length>0?a[b]=c:delete a[b]}async function E(a){let b=(0,i.getAgentDir)();(0,f.mkdirSync)(b,{recursive:!0});let c=(0,g.join)(b,`models.${process.pid}.${(0,e.randomUUID)()}.tmp.json`),d=(0,g.join)(b,`models-store.${process.pid}.${(0,e.randomUUID)()}.tmp.json`);(0,f.writeFileSync)(c,`${JSON.stringify(a,null,2)}
|
|
4
|
+
`,"utf8");try{let a=await i.ModelRuntime.create({modelsPath:c,modelsStorePath:d,allowModelNetwork:!1}),b=a.getError();if(b)throw Error(`模型配置校验失败:${b}`);return a}finally{(0,f.existsSync)(c)&&(0,f.unlinkSync)(c),(0,f.existsSync)(d)&&(0,f.unlinkSync)(d)}}function F(a,b){return(0,l.gX)(a,b,s(r()))}async function G(a,b){let c=await a.listCredentials(),d=new Set(c.filter(a=>"oauth"===a.type).map(a=>a.providerId));return[...new Set([...d,...b.map(a=>a.provider)])].map(b=>{let c=a.getProvider(b);return{provider:b,name:c?.name??b,loggedIn:d.has(b),subscription:c?.auth.oauth?.isSubscription===!0,models:a.getModels(b).map(a=>x({id:a.id,cost:a.cost},a,void 0))}})}async function H(a,b,c){let d=await c.listCredentials(),e=n(a.providers)?a.providers:{},f=n(b.providers)?b.providers:{},g=["baseUrl","api","apiKey","headers","authHeader"];for(let a of d){if("oauth"!==a.type)continue;let b=e[a.providerId],c=f[a.providerId],d=n(b)?b:{},i=n(c)?c:{};if(g.some(a=>void 0!==i[a]&&!(0,h.isDeepStrictEqual)(d[a],i[a])))throw Error(`服务 ${a.providerId} 已保存账号登录,请为自定义 API 使用独立服务 ID,或先退出账号`)}}async function I(a,b,c,d,e){let f=(0,l.Tp)(a),h=(0,l.Tp)(b),j=new Set([...f].filter(a=>!h.has(a))),m=new Map;for(let{from:a,to:b}of c.modelReplacements??[]){let c=(0,l.It)(a.provider,a.modelId),d=(0,l.It)(b.provider,b.modelId);if(c===d)throw Error("模型替换来源和目标不能相同");if(m.has(c))throw Error("模型替换来源不能重复");if(!f.has(c)||!j.has(c))throw Error(`替换来源 ${a.provider}/${a.modelId} 必须是本次移除的已收录模型`);let g=e.find(a=>a.provider===b.provider&&a.modelId===b.modelId);if(!h.has(d)||!g)throw Error(`替换目标 ${b.provider}/${b.modelId} 未收录或不可用`);m.set(c,g)}let n={projectDefaults:[],files:[]};if(!j.size)return n;for(let a of B(b))if(j.has((0,l.It)(a.provider,a.modelId)))throw Error(`模型 ${a.provider}/${a.modelId} 仍被常用组合引用,请先移除对应组合`);for(let{cwd:a}of(await (0,k.pJ)(!0))){let c=(0,g.join)(a,i.CONFIG_DIR_NAME,"settings.json"),e=s(c);if(!["defaultProvider","defaultModel","defaultThinkingLevel"].some(a=>Object.hasOwn(e,a)))continue;let f=i.SettingsManager.create(a,(0,i.getAgentDir)()),h=f.getDefaultProvider(),k=f.getDefaultModel();if(!h||!k||!j.has((0,l.It)(h,k)))continue;let o=m.get((0,l.It)(h,k));if(!o)throw Error(`项目“${a}”仍将 ${h}/${k} 设为默认模型,请先在“项目默认”中调整`);if(!(await A(d,a,b)).some(a=>a.provider===o.provider&&a.modelId===o.modelId))throw Error(`替换目标 ${o.provider}/${o.modelId} 在项目“${a}”中不可用`);let p={provider:h,modelId:k,thinkingLevel:f.getDefaultThinkingLevel()??"off"},q=o.thinkingLevels.includes(p.thinkingLevel)?p.thinkingLevel:o.thinkingLevels[0];if(!q)throw Error(`替换目标 ${o.provider}/${o.modelId} 没有可用思考等级`);let r={provider:o.provider,modelId:o.modelId,thinkingLevel:q};n.projectDefaults.push({cwd:a,from:p,to:r}),n.files.push({path:c,value:{...e,defaultProvider:r.provider,defaultModel:r.modelId,defaultThinkingLevel:r.thinkingLevel}})}return n}async function J(){let a=performance.now(),b=s(r()),c=await i.ModelRuntime.create({allowModelNetwork:!1}),d=await i.ModelRuntime.create({modelsPath:null,allowModelNetwork:!1}),e=(0,l.u1)(b),f=performance.now(),g={providers:y(b,c),presets:B(b),models:await A(c,void 0,b),nativeConfig:b,accountModels:e,accounts:await G(d,e)},h=performance.now()-a;return h>500&&console.warn("[Pi Desk][ModelSettings] 读取模型配置耗时较长",{totalMs:Math.round(h),runtimeMs:Math.round(f-a),projectionMs:Math.round(performance.now()-f),providers:g.providers.length,models:g.models.length}),g}async function K(a){let b,c,d=r();try{b=s(d)}catch(c){if(void 0===a.nativeConfig)throw c;b={}}if(void 0!==a.nativeConfig)c=a.nativeConfig;else{let d=await i.ModelRuntime.create({allowModelNetwork:!1}),e=d.getError();if(e)throw Error(`当前模型配置不可用,请先通过原生配置修正:${e}`);let f=void 0===a.accountModels?d:await i.ModelRuntime.create({modelsPath:null,allowModelNetwork:!1});c=function(a,b,c,d){if(void 0!==b.nativeConfig)return b.nativeConfig;let e={...a};if(b.providers){let d=n(a.providers)?a.providers:{},f=new Map(y(a,c).map(a=>[a.provider,a]));e.providers=Object.fromEntries([...Object.entries(d).filter(([a])=>!f.has(a)),...b.providers.map(a=>[a.provider,function(a,b,c){let d=n(a)?{...a}:{};for(let a of["name","baseUrl","api","apiKey","authHeader"])c&&b[a]===c[a]||C(d,a,b[a]);c&&(0,h.isDeepStrictEqual)(b.headers,c.headers)||D(d,"headers",b.headers);let e=Array.isArray(d.models)?d.models.filter(n):[],f=new Map(e.filter(a=>"string"==typeof a.id).map(a=>[a.id,a])),g=new Map(c?.models.map(a=>[a.modelId,a])),i=n(d.modelOverrides)?{...d.modelOverrides}:void 0,j=b.models.map(a=>{let b=i?.[a.modelId],c=n(b)?{...b}:void 0,d=function(a,b,c,d){let e=n(a)?{...a}:{};e.id=b.modelId;let f=a=>d&&Object.hasOwn(d,a)?d:e,g=a=>!c||!(0,h.isDeepStrictEqual)(b[a],c[a]);for(let a of["name","api","baseUrl"])g(a)&&C(f(a),a,b[a]);for(let a of["reasoning","input","contextWindow","maxTokens"])g(a)&&(f(a)[a]=b[a]);if(g("thinkingLevels")&&function(a,b,c){let d=n(a.thinkingLevelMap)?{...a.thinkingLevelMap}:{},e=new Map(c?.thinkingLevels.map(a=>[a.level,a.providerValue])),f=new Map(b.thinkingLevels.map(a=>[a.level,a.providerValue]));for(let a of R)if(!c||e.has(a)!==f.has(a)||e.get(a)!==f.get(a))if(f.has(a)){let b=f.get(a);null===b?delete d[a]:d[a]=b}else("xhigh"!==a&&"max"!==a||e.has(a))&&(d[a]=null);D(a,"thinkingLevelMap",d)}(f("thinkingLevelMap"),b,c),g("cost")){let a=f("cost");if(b.cost){let d=n(a.cost)?{...a.cost}:{...b.cost};for(let a of["input","output","cacheRead","cacheWrite"])c&&b.cost[a]===c.cost?.[a]||(d[a]=b.cost[a]);a.cost=d}else delete e.cost,d&&delete d.cost}if(g("headers")&&function(a,b,c,d){let e=q(a.headers),f=q(b?.headers);for(let a of new Set([...Object.keys(d),...Object.keys(c)]))if(c[a]!==d[a]){if(!Object.hasOwn(c,a)){delete e[a],delete f[a];continue}(Object.hasOwn(e,a)||!Object.hasOwn(f,a)?e:f)[a]=c[a]}D(a,"headers",e),b&&D(b,"headers",f)}(e,d,b.headers,c?.headers??{}),g("compat")){let a=f("compat"),d=n(a.compat)?{...a.compat}:{};for(let a of["supportsDeveloperRole","thinkingFormat","requiresReasoningContentOnAssistantMessages"]){let e=b.compat?.[a]??null;c&&e===(c.compat?.[a]??null)||C(d,a,e)}D(a,"compat",d)}return e}(f.get(a.modelId),a,g.get(a.modelId),c);return i&&c&&(i[a.modelId]=c),d});return(void 0!==d.models||j.length>0)&&(d.models=j),i&&(d.modelOverrides=i),d}(d[a.provider],a,f.get(a.provider))])])}return void 0!==b.accountModels&&(0,l.OM)(a,e,b.accountModels,d),b.presets&&!(0,h.isDeepStrictEqual)(b.presets,B(a))&&(e.modelPresets=b.presets),e}(b,a,d,f)}let e=await E(c),f=await A(e,void 0,c);await H(b,c,e),function(a,b,c=[]){let d=new Set(c.map(a=>`${w(a.provider,a.modelId)}\u0000${a.thinkingLevel}`)),e=new Map(b.map(a=>[w(a.provider,a.modelId),a])),f=new Set;for(let b of a){let a=`${w(b.provider,b.modelId)}\u0000${b.thinkingLevel}`;if(f.has(a))throw Error("模型预设存在重复组合");f.add(a);let c=e.get(w(b.provider,b.modelId));if((!c||!c.thinkingLevels.includes(b.thinkingLevel))&&!d.has(a))throw Error(`模型预设 ${b.provider}/${b.modelId}:${b.thinkingLevel} 不可用`)}}(B(c),f,B(b));let g=await I(b,c,a,e,f);return g.files.push({path:d,value:c}),g}async function L(a){return v(async()=>{let{projectDefaults:b}=await K(a);return{projectDefaults:b}})}async function M(a){await v(async()=>{try{let{files:b}=await K(a);!function(a){let b=a.map(({path:a})=>(0,f.existsSync)(a)?(0,f.readFileSync)(a,"utf8"):null),c=0;try{for(let{path:b,value:d}of a)u(b,d),c+=1}catch(d){for(let d=c-1;d>=0;d-=1){let c=a[d].path,e=b[d];try{null===e?(0,f.unlinkSync)(c):t(c,e)}catch(a){console.error("[Pi Desk][ModelSettings] 配置文件回滚失败",{path:c,message:a instanceof Error?a.message:String(a)})}}throw d}}(b)}catch(a){throw console.error("[Pi Desk][ModelSettings] 模型配置保存失败",{message:a instanceof Error?a.message:String(a)}),Error(`模型配置保存失败:${a instanceof Error?a.message:String(a)}`,{cause:a})}})}function N(a){let b=(0,g.resolve)(a);if(!(0,g.isAbsolute)(b)||!(0,f.existsSync)(b)||!(0,f.statSync)(b).isDirectory())throw Error("项目目录不存在");return b}function O(a){return(0,g.join)(N(a),i.CONFIG_DIR_NAME,"settings.json")}async function P(a){let b=N(a),c=O(b),d=s(c),e=await i.ModelRuntime.create({allowModelNetwork:!1}),f=await A(e,b);if(!["defaultProvider","defaultModel","defaultThinkingLevel"].some(a=>Object.hasOwn(d,a)))return{cwd:b,default:null,models:f};let g=i.SettingsManager.create(b,(0,i.getAgentDir)()),h=g.getDefaultProvider(),j=g.getDefaultModel(),k=g.getDefaultThinkingLevel(),l=f.find(a=>a.provider===h&&a.modelId===j),m=h&&j&&k&&l?.thinkingLevels.includes(k)?{provider:h,modelId:j,thinkingLevel:k}:null;return{cwd:b,default:m,models:f}}async function Q(a,b){await v(async()=>{let c=N(a);if(b){let a=await i.ModelRuntime.create({allowModelNetwork:!1}),d=(await A(a,c)).find(a=>a.provider===b.provider&&a.modelId===b.modelId);if(!d||!d.thinkingLevels.includes(b.thinkingLevel))throw Error("项目默认模型或思考等级不可用")}let d=O(c),e=s(d);b?(e.defaultProvider=b.provider,e.defaultModel=b.modelId,e.defaultThinkingLevel=b.thinkingLevel):(delete e.defaultProvider,delete e.defaultModel,delete e.defaultThinkingLevel),u(d,e)})}d()}catch(a){d(a)}})},97219:(a,b,c)=>{c.d(b,{It:()=>g,OM:()=>k,Tp:()=>i,gX:()=>j,u1:()=>h});var d=c(57975);let e=["input","output","cacheRead","cacheWrite"];function f(a){return"object"!=typeof a||null===a||Array.isArray(a)?{}:a}function g(a,b){return`${a}\u0000${b}`}function h(a){if(void 0===a.modelSelections)return[];if(!Array.isArray(a.modelSelections))throw Error("modelSelections 必须是模型引用数组");let b=new Set;return a.modelSelections.map(c=>{let d=f(c);if("string"!=typeof d.provider||!d.provider.trim()||"string"!=typeof d.modelId||!d.modelId.trim())throw Error("modelSelections 中的模型必须包含服务 ID 和模型 ID");let h=g(d.provider,d.modelId);if(b.has(h))throw Error(`重复收录模型:${d.provider}/${d.modelId}`);b.add(h);let i=f(f(f(a.providers)[d.provider]).modelOverrides)[d.modelId],j=f(i),k={};for(let a of["contextWindow","maxTokens"])"number"==typeof j[a]&&(k[a]=j[a]);if(void 0!==j.cost){let a=f(j.cost);k.cost=Object.fromEntries(e.filter(b=>"number"==typeof a[b]).map(b=>[b,a[b]]))}return{provider:d.provider,modelId:d.modelId,overrides:k}})}function i(a){let b=new Set(h(a).map(a=>g(a.provider,a.modelId)));for(let[c,d]of Object.entries(f(a.providers))){let a=f(d).models;if(Array.isArray(a))for(let d of a){let a=f(d);"string"==typeof a.id&&b.add(g(c,a.id))}}return b}function j(a,b,c){let d=i(c),e=new Set(b.getRegisteredProviderIds());return a.filter(a=>d.has(g(a.provider,a.id))||e.has(a.provider)||void 0!==b.getRegisteredNativeProvider(a.provider)||!b.getPhysicalModel(a.provider,a.id))}function k(a,b,c,i){let j=new Map(h(a).map(a=>[g(a.provider,a.modelId),a])),k=new Set,l={...f(b.providers)};for(let a of c){let b=g(a.provider,a.modelId);if(k.has(b))throw Error(`重复收录模型:${a.provider}/${a.modelId}`);k.add(b);let c=j.get(b),h=i.getModel(a.provider,a.modelId);if(!c&&(!h||!i.getProvider(a.provider)?.auth.oauth))throw Error(`登录服务未提供模型:${a.provider}/${a.modelId}`);let m={...f(l[a.provider])};if(Array.isArray(m.models)&&m.models.some(b=>f(b).id===a.modelId))throw Error(`模型已存在于自定义配置:${a.provider}/${a.modelId}`);let n={...f(m.modelOverrides)},o={...f(n[a.modelId])},p=!1;for(let b of["contextWindow","maxTokens","cost"]){let g=a.overrides[b],h=c?.overrides[b];if(!(0,d.isDeepStrictEqual)(h,g))if(p=!0,void 0===g)delete o[b];else if("cost"===b){let b={...f(o.cost)};for(let c of e){let d=a.overrides.cost?.[c];void 0===d?delete b[c]:b[c]=d}Object.keys(b).length?o.cost=b:delete o.cost}else o[b]=g}p&&(Object.keys(o).length?n[a.modelId]=o:delete n[a.modelId],Object.keys(n).length?m.modelOverrides=n:delete m.modelOverrides,Object.keys(m).length?l[a.provider]=m:delete l[a.provider])}let m=c.map(({provider:a,modelId:b})=>({provider:a,modelId:b})),n=h(a).map(({provider:a,modelId:b})=>({provider:a,modelId:b}));(0,d.isDeepStrictEqual)(n,m)||(b.modelSelections=m),(0,d.isDeepStrictEqual)(l,f(b.providers))||(b.providers=l)}}};
|