@jetcrab/pi-desk 1.1.20-dev → 1.1.22-dev
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/docs/plugins.md +81 -1
- package/package.json +3 -3
- package/src/app/page.tsx +6 -1
- package/src/app/project-preview/page.tsx +10 -0
- package/src/client/l1_entry/pages/l1-home-page.tsx +30 -0
- package/src/client/l1_entry/pages/l1-project-preview-page.tsx +33 -0
- package/src/client/l1_entry/providers/l1-app-providers.tsx +18 -15
- package/src/client/l1_entry/providers/l1-app-runtime-provider.tsx +2 -2
- package/src/client/l2_biz/auth/l2-login-biz.ts +3 -0
- package/src/client/l2_biz/auth/l2-login.tsx +2 -3
- package/src/client/l2_biz/plugin-host/l2-plugin-capability-details.tsx +6 -1
- package/src/client/l2_biz/plugin-host/l2-plugin-contribution-host.tsx +71 -10
- package/src/client/l2_biz/plugin-host/l2-plugin-management-controls.tsx +9 -0
- package/src/client/l2_biz/plugin-host/l2-plugin-session-header-layout.ts +18 -0
- package/src/client/l2_biz/plugin-host/l2-plugin-session-header.tsx +247 -0
- package/src/client/l2_biz/plugin-host/l2-plugin-widgets.tsx +50 -0
- package/src/client/l2_biz/plugin-host/views/l2-plugin-session-header-action.tsx +112 -0
- package/src/client/l2_biz/project-preview/hooks/l2-use-project-picker.ts +76 -0
- package/src/client/l2_biz/project-preview/hooks/l2-use-project-preview.ts +214 -0
- package/src/client/l2_biz/project-preview/l2-project-preview-biz.ts +49 -4
- package/src/client/l2_biz/project-preview/l2-project-preview-dialog.tsx +42 -450
- package/src/client/l2_biz/project-preview/l2-project-preview-page.tsx +61 -0
- package/src/client/l2_biz/project-preview/l2-project-preview.tsx +342 -0
- package/src/client/l2_biz/project-preview/runtime/l2-project-history-runtime.ts +9 -3
- package/src/client/l2_biz/project-preview/views/l2-project-picker.tsx +168 -0
- package/src/client/l2_biz/settings/hooks/l2-use-model-settings.ts +34 -31
- package/src/client/l2_biz/settings/views/l2-model-replacement-preview.tsx +7 -1
- package/src/client/l2_biz/workbench/file-workspace/l2-project-preview-biz.ts +4 -3
- package/src/client/l2_biz/workbench/hooks/l2-workbench-chat-viewport.ts +28 -21
- package/src/client/l2_biz/workbench/l2-work-session-columns.module.css +32 -0
- package/src/client/l2_biz/workbench/l2-work-session-columns.tsx +55 -16
- package/src/client/l2_biz/workbench/l2-work-session-sidebar.tsx +19 -8
- package/src/client/l2_biz/workbench/l2-workbench-chat-composer.tsx +12 -1
- package/src/client/l2_biz/workbench/l2-workbench-initialization-notice.tsx +8 -3
- package/src/client/l2_biz/workbench/l2-workbench-plugin-slots.ts +13 -0
- package/src/client/l2_biz/workbench/l2-workbench.tsx +15 -2
- package/src/client/l3_modules/conversation/l3-conversation-viewport.tsx +12 -6
- package/src/client/l3_modules/project-files/l3-markdown-preview.module.css +1 -1
- package/src/client/l3_modules/project-files/l3-project-document-git.ts +4 -3
- package/src/client/l3_modules/project-files/l3-project-document-view.tsx +4 -1
- package/src/client/l3_modules/project-files/l3-project-reader.ts +23 -35
- package/src/client/l4_foundation/lib/l4-client-id.tsx +11 -0
- package/src/client/l4_foundation/plugin-host/l4-plugin-host-runtime.ts +316 -35
- package/src/common/l2_biz/auth/l2-auth-return-to.ts +41 -0
- package/src/common/l2_biz/model-settings/l2-model-settings-contract.ts +5 -1
- package/src/common/l2_biz/plugin/l2-plugin-management-messages.ts +4 -0
- package/src/common/l2_biz/project-preview/l2-project-history-messages.ts +28 -0
- package/src/common/l2_biz/project-preview/l2-project-preview-navigation.ts +5 -0
- package/src/common/l2_biz/settings/l2-settings-messages.ts +4 -3
- package/src/common/l2_biz/workbench/l2-workbench-locale-messages.ts +2 -0
- package/src/server/l1_entry/node/l1-server.ts +8 -4
- package/src/server/l4_foundation/model-settings/l4-model-settings-store.ts +29 -20
- package/src/server/l4_foundation/model-settings/l4-model-settings-types.ts +1 -1
- package/src/server/l4_foundation/pi/l4-pi-chat-worker.ts +22 -5
- package/src/server/l4_foundation/pi/l4-pi-plugin-owner-runtime.ts +133 -13
- package/src/server/l4_foundation/pi/l4-pi-session-initialization.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 +3 -2
- package/temp/build/pi-desk/release/.next/build-manifest.json +3 -3
- package/temp/build/pi-desk/release/.next/react-loadable-manifest.json +1 -2
- package/temp/build/pi-desk/release/.next/required-server-files.js +2 -2
- package/temp/build/pi-desk/release/.next/required-server-files.json +2 -2
- 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 +3 -3
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_full.segment.rsc +3 -3
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +3 -3
- 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 -1
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +140 -140
- 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/project-preview/page.js +1 -0
- package/temp/build/pi-desk/release/.next/server/app/project-preview/page_client-reference-manifest.js +1 -0
- package/temp/build/pi-desk/release/.next/server/app-paths-manifest.json +3 -2
- package/temp/build/pi-desk/release/.next/server/chunks/10912.js +2 -2
- package/temp/build/pi-desk/release/.next/server/chunks/20460.js +15 -0
- package/temp/build/pi-desk/release/.next/server/chunks/25406.js +8 -8
- package/temp/build/pi-desk/release/.next/server/chunks/35985.js +3 -17
- package/temp/build/pi-desk/release/.next/server/chunks/36361.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/48180.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/56830.js +235 -0
- package/temp/build/pi-desk/release/.next/server/chunks/78262.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/79686.js +62 -0
- package/temp/build/pi-desk/release/.next/server/chunks/80780.js +1 -0
- package/temp/build/pi-desk/release/.next/server/chunks/81363.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/82499.js +4 -4
- package/temp/build/pi-desk/release/.next/server/chunks/92386.js +8 -8
- package/temp/build/pi-desk/release/.next/server/middleware-build-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/pages/500.html +1 -1
- package/temp/build/pi-desk/release/.next/static/MV6_lBt7Mzmi1rBNI-3dx/_buildManifest.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/11937-1d0a9822f2c7995b.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/14825-5579aed34a631ad7.js +62 -0
- package/temp/build/pi-desk/release/.next/static/chunks/15302-9c807afc6c60de0c.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/19991.8aa2e4b6df15fad6.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/22092-6d1bfbefa825ec03.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/37313-d5970e2d0c270d22.js +238 -0
- package/temp/build/pi-desk/release/.next/static/chunks/57235-03ba1044f22b6c84.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/79267-7d21d7cdbd7cfca1.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/82371-f7ba4a07a5dbcf34.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/9038-03144ed96d613f75.js +15 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/{error-0296a3b20cd1bf00.js → error-216b14b5da089ed3.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/layout-20718f1503910291.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/login/page-0d3d4827802108e5.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/{not-found-2aab8b33ebbf3257.js → not-found-720cdf6a606b821a.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/page-e8a5274c115f528d.js +158 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/project-preview/page-d70ee4e9409b970a.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/webpack-b60891a214e0925d.js +1 -0
- package/temp/build/pi-desk/release/.next/static/css/{250a6b93cc2222d1.css → 1e780a4936aa6ba3.css} +1 -1
- package/temp/build/pi-desk/release/.next/static/css/f646ca6c07245c4c.css +1 -0
- package/temp/build/pi-desk/release/.next/trace-build +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/10881.js +0 -296
- package/temp/build/pi-desk/release/.next/static/RLKcK-RQF5FvEeDmS9uih/_buildManifest.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/27611-0890482fe76bd9d6.js +0 -238
- package/temp/build/pi-desk/release/.next/static/chunks/31087-d8e5765d541d5c26.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/3814-35cfab0ce3aa7c41.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/70669.07f3670bfb7d6dd2.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/74220-795a2e7185bd66cb.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/77592-5bef6acb8e7c4b96.js +0 -13
- package/temp/build/pi-desk/release/.next/static/chunks/78923-17a9c337b29dcecd.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/81881-f11dbe7dc0d04ed9.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/96995-8f8313ea2ac3abd7.js +0 -62
- package/temp/build/pi-desk/release/.next/static/chunks/app/layout-a50c456648537afb.js +0 -3
- package/temp/build/pi-desk/release/.next/static/chunks/app/login/page-84892b06243891f0.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/page-0789c43551b29dd2.js +0 -158
- package/temp/build/pi-desk/release/.next/static/chunks/webpack-d7248206b7fc7ba8.js +0 -1
- package/temp/build/pi-desk/release/.next/static/css/a4cf28fd76c70165.css +0 -1
- /package/temp/build/pi-desk/release/.next/static/{RLKcK-RQF5FvEeDmS9uih → MV6_lBt7Mzmi1rBNI-3dx}/_ssgManifest.js +0 -0
|
@@ -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
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
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)}}};
|
|
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)(b),h=new Map;for(let{from:b,to:d}of c.modelReplacements??[]){let c=(0,l.It)(b.provider,b.modelId),g=(0,l.It)(d.provider,d.modelId);if(c===g)throw Error("模型替换来源和目标不能相同");if(h.has(c))throw Error("模型替换来源不能重复");if(!a.has(c))throw Error(`替换来源 ${b.provider}/${b.modelId} 必须是本次移除的已收录模型`);let i=e.find(a=>a.provider===d.provider&&a.modelId===d.modelId);if(!f.has(g)||!i)throw Error(`替换目标 ${d.provider}/${d.modelId} 未收录或不可用`);h.set(c,i)}let j={projectDefaults:[],files:[]};if(!a.size)return j;for(let{cwd:c}of(await (0,k.pJ)(!0))){let e=(0,g.join)(c,i.CONFIG_DIR_NAME,"settings.json"),f=s(e);if(!["defaultProvider","defaultModel","defaultThinkingLevel"].some(a=>Object.hasOwn(f,a)))continue;let k=i.SettingsManager.create(c,(0,i.getAgentDir)()),m=k.getDefaultProvider(),n=k.getDefaultModel();if(!m||!n||!a.has((0,l.It)(m,n)))continue;let o={provider:m,modelId:n,thinkingLevel:k.getDefaultThinkingLevel()??"off"},p=h.get((0,l.It)(m,n));if(!p){let a={...f};delete a.defaultProvider,delete a.defaultModel,delete a.defaultThinkingLevel,j.projectDefaults.push({cwd:c,from:o,to:null}),j.files.push({path:e,value:a});continue}if(!(await A(d,c,b)).some(a=>a.provider===p.provider&&a.modelId===p.modelId))throw Error(`替换目标 ${p.provider}/${p.modelId} 在项目“${c}”中不可用`);let q=p.thinkingLevels.includes(o.thinkingLevel)?o.thinkingLevel:p.thinkingLevels[0];if(!q)throw Error(`替换目标 ${p.provider}/${p.modelId} 没有可用思考等级`);let r={provider:p.provider,modelId:p.modelId,thinkingLevel:q};j.projectDefaults.push({cwd:c,from:o,to:r}),j.files.push({path:e,value:{...f,defaultProvider:r.provider,defaultModel:r.modelId,defaultThinkingLevel:r.thinkingLevel}})}return j}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=(0,l.Tp)(c),f=new Set([...(0,l.Tp)(b)].filter(a=>!e.has(a)));f.size&&Array.isArray(c.modelPresets)&&(c={...c,modelPresets:c.modelPresets.filter(a=>!n(a)||"string"!=typeof a.provider||"string"!=typeof a.modelId||!f.has((0,l.It)(a.provider,a.modelId)))});let g=await E(c),j=await A(g,void 0,c);await H(b,c,g),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),j,B(b));let k=await I(f,c,a,g,j);return k.files.push({path:d,value:c}),k}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)}}};
|