@jetcrab/pi-desk 1.1.1 → 1.1.5-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/pi-desk/README.md +47 -0
- package/docs/pi-desk/commands.md +76 -0
- package/docs/pi-desk/examples/local-application/browser/application.js +106 -0
- package/docs/pi-desk/examples/local-application/browser/entry.js +9 -0
- package/docs/pi-desk/examples/local-application/package.json +9 -0
- package/docs/pi-desk/examples/local-application/pi-desk.ts +11 -0
- package/docs/pi-desk/plugins.md +119 -0
- package/package.json +3 -2
- package/src/client/l2_biz/pi-settings/hooks/l2-use-pi-settings.ts +37 -21
- package/src/client/l2_biz/pi-settings/l2-pi-settings.tsx +37 -43
- package/src/client/l2_biz/pi-settings/views/l2-mcp-settings-editor.tsx +3 -1
- package/src/client/l2_biz/pi-settings/views/l2-mcp-settings-list.tsx +1 -1
- package/src/client/l2_biz/plugin-host/hooks/l2-use-plugin-catalog.ts +3 -1
- package/src/client/l2_biz/plugin-host/hooks/l2-use-plugin-download-source.ts +5 -1
- package/src/client/l2_biz/plugin-host/l2-plugin-capability-details.tsx +57 -41
- package/src/client/l2_biz/plugin-host/l2-plugin-management-controls.tsx +89 -116
- package/src/client/l2_biz/plugin-host/l2-plugin-management.tsx +492 -338
- package/src/client/l2_biz/plugin-host/l2-use-plugin-management.ts +72 -22
- package/src/client/l2_biz/plugin-host/views/l2-plugin-catalog-detail.tsx +104 -76
- package/src/client/l2_biz/plugin-host/views/l2-plugin-catalog-search.tsx +101 -56
- package/src/client/l2_biz/plugin-host/views/l2-plugin-direct-install.tsx +91 -59
- package/src/client/l2_biz/plugin-host/views/l2-plugin-download-source.tsx +36 -27
- package/src/client/l2_biz/plugin-host/views/l2-plugin-installed-list.tsx +218 -208
- package/src/client/l2_biz/plugin-host/views/l2-plugin-management-channel.tsx +12 -5
- package/src/client/l2_biz/plugin-host/views/l2-plugin-management-dialog.tsx +84 -106
- package/src/client/l2_biz/plugin-host/views/l2-plugin-readme.tsx +29 -15
- package/src/client/l2_biz/settings/hooks/l2-use-project-model-default-settings.ts +22 -11
- package/src/client/l2_biz/settings/l2-settings.tsx +6 -11
- package/src/client/l2_biz/settings/views/l2-project-model-default-settings.tsx +20 -14
- package/src/client/l2_biz/terminal/l2-terminal-workspace.tsx +35 -1
- package/src/client/l2_biz/workbench/file-workspace/l2-work-session-file-preview.tsx +6 -2
- package/src/client/l2_biz/workbench/hooks/l2-workbench-chat-viewport.ts +14 -1
- package/src/client/l2_biz/workbench/l2-workbench-branch-picker.tsx +33 -5
- package/src/client/l2_biz/workbench/l2-workbench-sidebar-layout.tsx +3 -1
- package/src/client/l2_biz/workbench/l2-workbench.tsx +20 -3
- package/src/client/l3_modules/conversation/l3-conversation-call-summary.tsx +0 -3
- package/src/client/l3_modules/project-files/l3-file-context-menu-content.tsx +1 -0
- package/src/client/l4_foundation/ui/l4-app-dialog.tsx +3 -1
- package/src/client/l4_foundation/ui/l4-image-viewer.tsx +21 -0
- package/src/client/l4_foundation/ui/shadcn/checkbox.tsx +27 -0
- package/src/client/l4_foundation/ui/shadcn/context-menu.tsx +8 -1
- package/src/client/l4_foundation/ui/shadcn/dropdown-menu.tsx +5 -0
- package/src/client/l4_foundation/ui/shadcn/popover.tsx +2 -0
- package/src/client/l4_foundation/ui/shadcn/select.tsx +2 -0
- package/src/client/l4_foundation/ui/shadcn/switch.tsx +31 -0
- package/src/client/l4_foundation/ui/shadcn/tabs.tsx +74 -0
- package/src/common/l2_biz/plugin/l2-plugin-management-messages.ts +52 -22
- package/src/common/l3_modules/conversation/l3-conversation-locale-messages.ts +2 -2
- package/src/common/l3_modules/conversation/l3-conversation-pidesk.ts +1 -1
- package/src/common/l4_foundation/plugin/l4-plugin-package.ts +1 -0
- package/src/server/l2_biz/plugin-management/l2-plugin-catalog.ts +16 -5
- package/src/server/l2_biz/plugin-management/l2-plugin-commands.ts +21 -1
- package/src/server/l2_biz/plugin-management/l2-plugin-management.ts +21 -2
- package/src/server/l2_biz/plugin-management/l2-plugin-updates.ts +17 -3
- package/src/server/l4_foundation/pi/l4-pi-basic-session-services.ts +3 -3
- package/src/server/l4_foundation/pi/l4-pi-package-maintenance-runner.mts +4 -11
- package/src/server/l4_foundation/pi/l4-pi-plugin-registry-config.ts +52 -34
- package/src/server/l4_foundation/pi/l4-pi-plugin-registry-network.ts +5 -3
- package/src/server/l4_foundation/pi/l4-pi-plugin-registry.ts +23 -8
- package/src/server/l4_foundation/pi/l4-pi-session-initialization.ts +2 -5
- package/src/server/l4_foundation/pidesk/l4-pidesk-command.ts +8 -1
- package/src/server/l4_foundation/pidesk/l4-pidesk-runtime.ts +24 -38
- package/src/server/l4_foundation/pidesk/l4-pidesk-system-prompt.ts +11 -0
- package/temp/build/pi-desk/release/.next/BUILD_ID +1 -1
- package/temp/build/pi-desk/release/.next/build-manifest.json +3 -3
- package/temp/build/pi-desk/release/.next/prerender-manifest.json +3 -3
- package/temp/build/pi-desk/release/.next/react-loadable-manifest.json +1 -1
- 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/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_client-reference-manifest.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/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 +79 -79
- package/temp/build/pi-desk/release/.next/server/app/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/25406.js +8 -77
- package/temp/build/pi-desk/release/.next/server/chunks/{81107.js → 35348.js} +2 -2
- package/temp/build/pi-desk/release/.next/server/chunks/35985.js +4 -4
- package/temp/build/pi-desk/release/.next/server/chunks/36361.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/47757.js +6 -75
- package/temp/build/pi-desk/release/.next/server/chunks/50520.js +4 -4
- package/temp/build/pi-desk/release/.next/server/chunks/58330.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/84231.js +2 -2
- package/temp/build/pi-desk/release/.next/server/chunks/89236.js +2 -2
- package/temp/build/pi-desk/release/.next/server/chunks/92386.js +5 -5
- package/temp/build/pi-desk/release/.next/server/chunks/94518.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/9874.js +1 -1
- 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/server/server-reference-manifest.json +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/14197-3d3ddd426ac06c9c.js +3 -0
- package/temp/build/pi-desk/release/.next/static/chunks/34903-e4205c0becabea76.js +318 -0
- package/temp/build/pi-desk/release/.next/static/chunks/{54206.7c0792096df8a5cf.js → 54206.82a63ab971911eda.js} +3 -3
- package/temp/build/pi-desk/release/.next/static/chunks/74132-876f256c7a6101af.js +13 -0
- package/temp/build/pi-desk/release/.next/static/chunks/78923-17a9c337b29dcecd.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/96995-8f8313ea2ac3abd7.js +62 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/{layout-7c5409cced9c2501.js → layout-4faf3a52d219296d.js} +2 -2
- package/temp/build/pi-desk/release/.next/static/chunks/app/login/{page-8c87fb9e6c918848.js → page-bf893718bb151f3c.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/page-28e1d77d6b884657.js +158 -0
- package/temp/build/pi-desk/release/.next/static/chunks/{webpack-45424d28099bbefa.js → webpack-7bfbf627379fb4c1.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/css/3213ee28336bddc2.css +1 -0
- package/temp/build/pi-desk/release/.next/trace-build +1 -1
- package/src/server/l4_foundation/pidesk/l4-pidesk-skill-template.ts +0 -87
- package/temp/build/pi-desk/release/.next/static/chunks/27491-8b2d3e345b9142ea.js +0 -318
- package/temp/build/pi-desk/release/.next/static/chunks/7089-600a8f5593b7846c.js +0 -3
- package/temp/build/pi-desk/release/.next/static/chunks/74132-0884df6a6f11861a.js +0 -13
- package/temp/build/pi-desk/release/.next/static/chunks/78923-539a8b5f7af3c54a.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/96995-ae32167974365050.js +0 -62
- package/temp/build/pi-desk/release/.next/static/chunks/app/page-39b146293b6eb488.js +0 -158
- package/temp/build/pi-desk/release/.next/static/css/56486914a8ba0a1b.css +0 -1
- /package/temp/build/pi-desk/release/.next/static/{STVrBHA3z9KPtvBE4WcE2 → IgHJ40fniC07-ioYUKobL}/_buildManifest.js +0 -0
- /package/temp/build/pi-desk/release/.next/static/{STVrBHA3z9KPtvBE4WcE2 → IgHJ40fniC07-ioYUKobL}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=58330,exports.ids=[58330],exports.modules={1257:(a,b,c)=>{c.d(b,{JM:()=>j,SX:()=>n}),c(51455);var d=c(76760),e=c(38522),f=c(57975),g=c(77598),h=c(57385);let i=(0,f.promisify)(e.gunzip);function j(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:{}}function k(a){let b=a.replaceAll("\\","/").replace(/^\.\//,"");return!b||(0,d.isAbsolute)(a)||d.win32.isAbsolute(a)||b.includes("\0")||b.split("/").some(a=>".."===a)?null:b}function l(a,b,c){return a.subarray(b,b+c).toString("utf8").split("\0")[0]}function m(a,b,c){let d=l(a,b,c).trim();if(!/^[0-7]+$/.test(d))throw new h.XH("插件说明压缩包头部无效");return parseInt(d,8)}async function n(a,b){let c=j(a.dist);if("string"!=typeof c.tarball)return"string"==typeof a.readme&&65536>=Buffer.byteLength(a.readme)?a.readme:null;let d=new URL(c.tarball);if(!["https:","http:"].includes(d.protocol)||d.username||d.password)throw new h.XH("插件说明压缩包地址无效");let e=await (0,h.NL)(d,{limit:8388608,signal:b,cache:!1});if("string"==typeof c.integrity){let a=c.integrity.split(/\s+/).flatMap(a=>{let b=/^(sha512|sha384|sha256|sha1)-([A-Za-z0-9+/=]+)(?:\?.*)?$/.exec(a);return b?[{algorithm:b[1],value:b[2]}]:[]}),b=["sha512","sha384","sha256","sha1"].find(b=>a.some(a=>a.algorithm===b));if(!b||!a.some(a=>a.algorithm===b&&(0,g.createHash)(b).update(e).digest("base64")===a.value))throw new h.XH("插件说明压缩包完整性校验失败")}else if("string"==typeof c.shasum&&(0,g.createHash)("sha1").update(e).digest("hex")!==c.shasum)throw new h.XH("插件说明压缩包完整性校验失败");return function(a,b){let c,d=Object.entries(j(j(b.piDesk).i18n)).slice(0,16).flatMap(([a,b])=>{let c=j(b).readme;return a.length>0&&a.length<=35&&"string"==typeof c&&c.length<=1024?[[a,c]]:[]}),e=new Set(d.flatMap(([,a])=>k(a)?[k(a)]:[])),f=new Map,g=null,i=0,n=0;for(;i+512<=a.length;){let b=a.subarray(i,i+512);if(b.every(a=>0===a))break;if(++n>4096)throw new h.XH("插件说明压缩包文件数量超过限制");if(b.reduce((a,b,c)=>a+(c>=148&&c<156?32:b),0)!==m(b,148,8))throw new h.XH("插件说明压缩包校验失败");let d=m(b,124,12),j=i+512;if(j+d>a.length)throw new h.XH("插件说明压缩包内容不完整");let o=a.subarray(j,j+d),p=b[156],q=l(b,345,155),r=l(b,0,100),s=c??`${q?`${q}/`:""}${r}`;if(c=void 0,120===p||76===p){if(d>16384)throw new h.XH("插件说明压缩包路径超过限制");c=120===p?function(a){let b,c=0;for(;c<a.length;){let d=a.indexOf(32,c);if(d<0)throw new h.XH("插件说明压缩包 PAX 记录无效");let e=a.subarray(c,d).toString("ascii"),f=Number(e);if(!/^\d+$/.test(e)||f<=d-c+1||c+f>a.length)throw new h.XH("插件说明压缩包 PAX 记录无效");let g=a.subarray(d+1,c+f-1).toString("utf8");g.startsWith("path=")&&(b=g.slice(5)),c+=f}return b}(o):o.toString("utf8").split("\0")[0]}else if(0===p||48===p){let a=k(s),b=a?.startsWith("package/")?a.slice(8):null;b&&d<=65536&&("readme.md"===b.toLowerCase()&&(g=o.toString("utf8")),e.has(b)&&f.set(b,o.toString("utf8")))}i=j+512*Math.ceil(d/512)}let o={};for(let[a,b]of d){let c=f.get(k(b)??"");void 0!==c&&(o[a]=c)}var p=g;if(null===p&&!Object.keys(o).length)return null;let q=p??Object.values(o)[0];return Object.keys(o).length?{default:q,translations:o}:q}(await i(e,{maxOutputLength:0x2000000}),a)}},6415:(a,b,c)=>{c.d(b,{N:()=>e});var d=c(48452);function e(a){let b=d.Y.safeParse(a.headers.get(d.n));return b.success?b.data:null}},57385:(a,b,c)=>{c.d(b,{NL:()=>i,XH:()=>f,Yq:()=>j});var d=c(77598),e=c(75885);class f extends Error{constructor(a,b=502,c="invalid"){super(a),this.status=b,this.reason=c,this.name="L4PluginRegistryError"}}let g=new Map,h=0;async function i(a,b){b.signal?.throwIfAborted();let c=!1===b.auth?{}:await (0,e.B)(),i=(0,e.I)(a,c),j=`${a.href}:${b.limit}:${(0,d.createHash)("sha256").update(i??"").digest("hex")}`,k=g.get(j);if(!1!==b.cache&&k&&k.expires>Date.now())return k.body;let l=AbortSignal.any([AbortSignal.timeout(b.timeout??1e4),...b.signal?[b.signal]:[]]),m=a;try{for(let a=0;a<=3;a++){let d=(0,e.I)(m,c),i=await fetch(m,{signal:l,redirect:"manual",headers:d?{Authorization:d}:{}});if([301,302,303,307,308].includes(i.status)){await i.body?.cancel();let b=i.headers.get("location");if(!b||3===a)throw new f("插件源重定向无效");let c=new URL(b,m);if(!["http:","https:"].includes(c.protocol)||c.username||c.password||"https:"===m.protocol&&"https:"!==c.protocol)throw new f("插件源重定向不安全");m=c;continue}if(!i.ok){await i.body?.cancel();let a=404===i.status?"missing":[401,403].includes(i.status)?"denied":i.status>=500?"network":"invalid";throw new f(`插件源请求失败(HTTP ${i.status})`,i.status,a)}if(Number(i.headers.get("content-length")??0)>b.limit)throw await i.body?.cancel(),new f("插件源响应超过大小限制");let k=i.body?.getReader(),n=[],o=0;if(k)try{for(;;){let a=await k.read();if(a.done)break;if((o+=a.value.byteLength)>b.limit)throw new f("插件源响应超过大小限制");n.push(a.value)}}finally{await k.cancel().catch(()=>void 0),k.releaseLock()}let p=Buffer.concat(n);if(!1!==b.cache){for(let[a,b]of g)(b.expires<=Date.now()||a===j)&&(g.delete(a),h-=b.body.length);for(;g.size>=96||h+p.length>0x1800000;){let a=g.entries().next().value;if(!a)break;g.delete(a[0]),h-=a[1].body.length}p.length<=0x1800000&&(g.set(j,{body:p,expires:Date.now()+12e4}),h+=p.length)}return p}throw new f("插件源重定向过多")}catch(a){if(b.signal?.aborted)throw b.signal.reason;if(a instanceof f)throw a;throw new f("插件源网络连接失败或超时",502,"network")}}async function j(a,b){let c=await i(a,{limit:8388608,signal:b});try{let a=JSON.parse(c.toString("utf8"));if(!a||"object"!=typeof a||Array.isArray(a))throw Error("invalid");return a}catch{throw new f("插件源返回的元数据格式无效")}}},74982:(a,b,c)=>{c.a(a,async(a,d)=>{try{let x;c.d(b,{NE:()=>u,Rc:()=>w,XH:()=>h.XH,_G:()=>y,dz:()=>q,kf:()=>k,o4:()=>v});var e=c(58417),f=c(46107),g=c(75885),h=c(57385),i=c(1257),j=a([f]);f=(j.then?(await j)():j)[0];let y=["@jetcrab/pi-desk-bg-run","@jetcrab/pi-desk-subagent","@jetcrab/pi-desk-deliverables","@jetcrab/pi-desk-usage","@jetcrab/pi-desk-ctx","@jetcrab/pi-desk-quota-viewer","@jetcrab/pi-desk-tibo-monitor","@jetcrab/pi-desk-tool-reason","@jetcrab/pi-desk-remote-debug"];function k(){if(!x||x.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 x&&(x.expires=Date.now()+6e4),f.Nx}})();x={expires:Date.now()+18e5,value:a}}return x.value}function l(a){return new URL(e.SZ.parse(a)).href.replace(/\/+$/,"")}function m(a,b,c){return new URL(`${l(a)}/${encodeURIComponent(b)}${c?`/${encodeURIComponent(c)}`:""}`)}function n(a){if(a.length>214||!/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*$/i.test(a))throw new h.XH("npm 插件包名无效",400)}function o(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 p(a,b){if(b.registry){let a=l(b.registry);if(![f.Nx,f.sv].includes(a))return{registry:a,fallback:!1}}let c=(0,f.to)(b.agentDir),d=c.registries[`npm:${a}`];if(d)return{registry:l(d),fallback:!1};if(a.startsWith("@")){let b=(await (0,g.B)())[`${a.split("/")[0]}:registry`];if(b){let a=l(b);if(![f.Nx,f.sv].includes(a))return{registry:a,fallback:!1}}}let e=b.downloadSource??c.downloadSource;return"custom"===e.mode?{registry:l(e.registry),fallback:!1}:"official"===e.mode?{registry:f.Nx,fallback:!1}:"domestic"===e.mode?{registry:f.sv,fallback:!1}:{registry:await k(),fallback:!0}}async function q(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];n(e);let g=d[2]??"latest";if(g.length>128||!/^[a-zA-Z0-9._+-]+$/.test(g))throw new h.XH("npm 插件版本或标签无效",400);let j=await p(e,b),k=j.registry,l=g;try{let a=await r(m(k,e),b),d=(0,i.JM)(a["dist-tags"])[g];"string"==typeof d&&(l=d),c=o(a,l),s((0,i.JM)(a.versions)[c],e,c)}catch(d){if(!j.fallback||k===f.Nx||!(d instanceof h.XH)||!["network","missing"].includes(d.reason))throw d;console.warn("[Pi Desk][PluginRegistry] 自动下载源不可用,回退 npm 官方源",{name:e,reason:d.reason}),k=f.Nx;let a=await r(m(k,e),b);c=o(a,l),s((0,i.JM)(a.versions)[c],e,c)}return{source:`npm:${e}@${c}`,registry:k}}async function r(a,b){if(!1!==b.cache)return(0,h.Yq)(a,b.signal);let c=await (0,h.NL)(a,{limit:8388608,signal:b.signal,cache:!1});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 s(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}async function t(a,b,c,d){n(a);let e=await (0,h.Yq)(m(b,a),d),f=o(e,c??"latest");return{manifest:s(await (0,h.Yq)(m(b,a,f),d),a,f),metadata:e}}async function u(a,b=f.Nx,c){let d=l(b);return n(a),{manifest:s(await (0,h.Yq)(m(d,a,"latest"),c),a),registry:d}}async function v(a,b,c=f.Nx,d){let e=l(c),{manifest:g,metadata:j}=await t(a,e,b,d),k=null;try{k=await (0,i.SX)(g,d),null===k&&console.info("[Pi Desk][PluginRegistry] 指定版本未提供可读取的插件说明",{name:a,version:g.version})}catch(b){if(d?.aborted)throw d.reason;console.warn("[Pi Desk][PluginRegistry] 插件说明读取失败",{name:a,version:g.version,errorName:b instanceof Error?b.name:"UnknownError",reason:b instanceof h.XH?b.reason:"archive"})}let m=Object.keys((0,i.JM)(j.versions)).sort((a,b)=>{let c=(0,i.JM)(j.time),d="string"==typeof c[a]?Date.parse(c[a]):0,e="string"==typeof c[b]?Date.parse(c[b]):0;return(Number.isFinite(e)?e:0)-(Number.isFinite(d)?d:0)||b.localeCompare(a,"en",{numeric:!0})}).slice(0,100);return m.includes(g.version)||m.splice(99,1,g.version),{manifest:g,registry:e,versions:m,readme:k}}async function w(a,b=f.Nx,c,d=1,e="all"){let g=l(b),j="all"===e?10:20,k=(d-1)*j,m=new Map,n=!1;for(let b of"all"===e?["pi-desk-plugin","pi-package"]:["desk"===e?"pi-desk-plugin":"pi-package"]){let d=new URL(`${g}/-/v1/search`);d.searchParams.set("text",`keywords:${b}${a?` ${a}`:""}`),d.searchParams.set("size",String(j)),d.searchParams.set("from",String(k));let e=await (0,h.Yq)(d,c);if(!Array.isArray(e.objects)||"number"!=typeof e.total)throw new h.XH("插件源搜索响应格式无效");for(let a of(n||=k+e.objects.length<e.total,e.objects.slice(0,j))){let c=(0,i.JM)((0,i.JM)(a).package);if("string"!=typeof c.name||"string"!=typeof c.version)continue;let d={...c,keywords:[...Array.isArray(c.keywords)?c.keywords:[],b]};m.has(c.name)||m.set(c.name,{manifest:d,registry:g})}}return{packages:[...m.values()],hasMore:n}}d()}catch(a){d(a)}})},75885:(a,b,c)=>{let d;c.d(b,{B:()=>n,I:()=>o});var e=c(31421),f=c(73024),g=c(51455),h=c(76760),i=c(48161);let j=(0,c(57975).promisify)(e.execFile);function k(a){return a.replace(/\$\{([^}]+)\}/g,(a,b)=>process.env[b]??a)}async function l(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()]=k(d)}}async function m(){let a=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}(),b={};if(a)try{let c=await j(process.execPath,[a,"config","list","--json"],{cwd:process.cwd(),timeout:4e3,maxBuffer:524288,windowsHide:!0});b=JSON.parse(c.stdout)}catch{console.warn("[Pi Desk][PluginRegistry] npm 有效配置读取失败,改用 npmrc 和环境配置")}let c={};a&&await l((0,h.resolve)((0,h.dirname)(a),"../npmrc"),c);let d="string"==typeof b.prefix?b.prefix:(0,h.dirname)(process.execPath),e="string"==typeof b.globalconfig?b.globalconfig:(0,h.join)(d,"etc/npmrc"),g=process.env.NPM_CONFIG_USERCONFIG??process.env.npm_config_userconfig??("string"==typeof b.userconfig?b.userconfig:(0,h.join)((0,i.homedir)(),".npmrc"));await l(e,c),await l(g,c);let m="string"==typeof b["local-prefix"]?b["local-prefix"]:process.cwd();for(let[a,d]of(await l((0,h.join)(m,".npmrc"),c),Object.entries(b)))"string"!=typeof d||"(protected)"===d||/auth|password|username/i.test(a)||(c[a]=d);for(let[a,b]of Object.entries(process.env))if(void 0!==b&&/^npm_config_/i.test(a)){let d=a.slice(11);c[d.startsWith("//")?d:d.replace(/(?!^)_/g,"-").toLowerCase()]=k(b)}return c}function n(){let a=process.cwd();if(!d||d.cwd!==a||d.expires<=Date.now()){let b=m();d={cwd:a,expires:Date.now()+3e4,value:b},b.catch(()=>{d?.value===b&&(d=void 0)})}return d.value}function o(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}`}}}},99431:(a,b,c)=>{c.d(b,{C6:()=>g,Dn:()=>k,EU:()=>h,_s:()=>i,h$:()=>j});var d=c(59473),e=c(42633),f=c(58417);let g=f.SZ,h=f.w3;d.Ik({downloadSource:h,recommendedRegistry:g}).strict();let i=d.Ik({downloadSource:h}).strict(),j=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:g.optional()}).strict(),k=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:g.optional()}).strict(),l=d.Ik({name:d.Yj(),description:e.qf.nullable(),version:d.Yj(),publisher:d.Yj().nullable(),kind:d.k5(["desk","pi","unknown"]),official:d.zM(),registry:g}).strict();d.Ik({items:d.YO(l),hasMore:d.zM()}).strict(),l.extend({versions:d.YO(d.Yj()),readme:e.qf.nullable(),homepage:d.Yj().nullable(),repository:d.Yj().nullable(),compatible:d.zM().nullable(),compatibilityNote:d.Yj().nullable()}).strict()}};
|
|
1
|
+
"use strict";exports.id=58330,exports.ids=[58330],exports.modules={1257:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{JM:()=>k,SX:()=>o}),c(51455);var e=c(76760),f=c(38522),g=c(57975),h=c(77598),i=c(57385),j=a([i]);i=(j.then?(await j)():j)[0];let p=(0,g.promisify)(f.gunzip);function k(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:{}}function l(a){let b=a.replaceAll("\\","/").replace(/^\.\//,"");return!b||(0,e.isAbsolute)(a)||e.win32.isAbsolute(a)||b.includes("\0")||b.split("/").some(a=>".."===a)?null:b}function m(a,b,c){return a.subarray(b,b+c).toString("utf8").split("\0")[0]}function n(a,b,c){let d=m(a,b,c).trim();if(!/^[0-7]+$/.test(d))throw new i.XH("插件说明压缩包头部无效");return parseInt(d,8)}async function o(a,b){let c=k(a.dist);if("string"!=typeof c.tarball)return"string"==typeof a.readme&&65536>=Buffer.byteLength(a.readme)?a.readme:null;let d=new URL(c.tarball);if(!["https:","http:"].includes(d.protocol)||d.username||d.password)throw new i.XH("插件说明压缩包地址无效");let e=await (0,i.NL)(d,{limit:8388608,signal:b,cache:!1});if("string"==typeof c.integrity){let a=c.integrity.split(/\s+/).flatMap(a=>{let b=/^(sha512|sha384|sha256|sha1)-([A-Za-z0-9+/=]+)(?:\?.*)?$/.exec(a);return b?[{algorithm:b[1],value:b[2]}]:[]}),b=["sha512","sha384","sha256","sha1"].find(b=>a.some(a=>a.algorithm===b));if(!b||!a.some(a=>a.algorithm===b&&(0,h.createHash)(b).update(e).digest("base64")===a.value))throw new i.XH("插件说明压缩包完整性校验失败")}else if("string"==typeof c.shasum&&(0,h.createHash)("sha1").update(e).digest("hex")!==c.shasum)throw new i.XH("插件说明压缩包完整性校验失败");let f=await p(e,{maxOutputLength:0x2000000});return function(a,b){let c,d,e=(d=k(k(b.piDesk).i18n),Object.entries(d).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]]:[]})),f=new Set(e.flatMap(([,a])=>l(a)?[l(a)]:[])),g=new Map,h=null,j=0,o=0;for(;j+512<=a.length;){let b=a.subarray(j,j+512);if(b.every(a=>0===a))break;if(++o>4096)throw new i.XH("插件说明压缩包文件数量超过限制");if(b.reduce((a,b,c)=>a+(c>=148&&c<156?32:b),0)!==n(b,148,8))throw new i.XH("插件说明压缩包校验失败");let d=n(b,124,12),e=j+512;if(e+d>a.length)throw new i.XH("插件说明压缩包内容不完整");let k=a.subarray(e,e+d),p=b[156],q=m(b,345,155),r=m(b,0,100),s=c??`${q?`${q}/`:""}${r}`;if(c=void 0,120===p||76===p){if(d>16384)throw new i.XH("插件说明压缩包路径超过限制");c=120===p?function(a){let b,c=0;for(;c<a.length;){let d=a.indexOf(32,c);if(d<0)throw new i.XH("插件说明压缩包 PAX 记录无效");let e=a.subarray(c,d).toString("ascii"),f=Number(e);if(!/^\d+$/.test(e)||f<=d-c+1||c+f>a.length)throw new i.XH("插件说明压缩包 PAX 记录无效");let g=a.subarray(d+1,c+f-1).toString("utf8");g.startsWith("path=")&&(b=g.slice(5)),c+=f}return b}(k):k.toString("utf8").split("\0")[0]}else if(0===p||48===p){let a=l(s),b=a?.startsWith("package/")?a.slice(8):null;b&&d<=65536&&("readme.md"===b.toLowerCase()&&(h=k.toString("utf8")),f.has(b)&&g.set(b,k.toString("utf8")))}j=e+512*Math.ceil(d/512)}let p={};for(let[a,b]of e){let c=g.get(l(b)??"");void 0!==c&&(p[a]=c)}var q=h;if(null===q&&!Object.keys(p).length)return null;let r=q??Object.values(p)[0];return Object.keys(p).length?{default:r,translations:p}:r}(f,a)}d()}catch(a){d(a)}})},6415:(a,b,c)=>{c.d(b,{N:()=>e});var d=c(48452);function e(a){let b=d.Y.safeParse(a.headers.get(d.n));return b.success?b.data:null}},57385:(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(75885),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)}})},74982:(a,b,c)=>{c.a(a,async(a,d)=>{try{let x;c.d(b,{NE:()=>u,Rc:()=>w,XH:()=>h.XH,_G:()=>y,dz:()=>q,kf:()=>k,o4:()=>v,qX:()=>p});var e=c(58417),f=c(46107),g=c(75885),h=c(57385),i=c(1257),j=a([f,g,h,i]);[f,g,h,i]=j.then?(await j)():j;let y=["@jetcrab/pi-desk-bg-run","@jetcrab/pi-desk-subagent","@jetcrab/pi-desk-deliverables","@jetcrab/pi-desk-usage","@jetcrab/pi-desk-ctx","@jetcrab/pi-desk-quota-viewer","@jetcrab/pi-desk-tibo-monitor","@jetcrab/pi-desk-tool-reason","@jetcrab/pi-desk-remote-debug"];function k(){if(!x||x.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 x&&(x.expires=Date.now()+6e4),f.Nx}})();x={expires:Date.now()+18e5,value:a}}return x.value}function l(a){return new URL(e.SZ.parse(a)).href.replace(/\/+$/,"")}function m(a,b,c){return new URL(`${l(a)}/${encodeURIComponent(b)}${c?`/${encodeURIComponent(c)}`:""}`)}function n(a){if(a.length>214||!/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*$/i.test(a))throw new h.XH("npm 插件包名无效",400)}function o(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 p(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:l(d||c.registry||f.Nx),fallback:!1}}if(b.registry){let a=l(b.registry);if(![f.Nx,f.sv].includes(a))return{registry:a,fallback:!1}}let e=c.registries[`npm:${a}`];if(e)return{registry:l(e),fallback:!1};if(a.startsWith("@")){let c=(await (0,g.B)(b.agentDir))[`${a.split("/")[0]}:registry`];if(c){let a=l(c);if(![f.Nx,f.sv].includes(a))return{registry:a,fallback:!1}}}return"custom"===d.mode?{registry:l(d.registry),fallback:!1}:"official"===d.mode?{registry:f.Nx,fallback:!1}:"domestic"===d.mode?{registry:f.sv,fallback:!1}:{registry:await k(),fallback:!0}}async function q(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];n(e);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 p(e,{...b,downloadSource:j}),l=k.registry,t=g;try{let a=await r(m(l,e),b),d=(0,i.JM)(a["dist-tags"])[g];"string"==typeof d&&(t=d),c=o(a,t),s((0,i.JM)(a.versions)[c],e,c)}catch(d){if(!k.fallback||l===f.Nx||!(d instanceof h.XH)||!["network","missing"].includes(d.reason))throw d;console.warn("[Pi Desk][PluginRegistry] 自动下载源不可用,回退 npm 官方源",{name:e,reason:d.reason}),l=f.Nx;let a=await r(m(l,e),b);c=o(a,t),s((0,i.JM)(a.versions)[c],e,c)}return{source:`npm:${e}@${c}`,..."local"===j.mode?{}:{registry:l}}}async function r(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 s(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}async function t(a,b,c,d){n(a);let e=await (0,h.Yq)(m(b,a),d),f=o(e,c??"latest");return{manifest:s(await (0,h.Yq)(m(b,a,f),d),a,f),metadata:e}}async function u(a,b=f.Nx,c){let d=l(b);return n(a),{manifest:s(await (0,h.Yq)(m(d,a,"latest"),c),a),registry:d}}async function v(a,b,c=f.Nx,d){let e=l(c),{manifest:g,metadata:j}=await t(a,e,b,d),k=null;try{k=await (0,i.SX)(g,d),null===k&&console.info("[Pi Desk][PluginRegistry] 指定版本未提供可读取的插件说明",{name:a,version:g.version})}catch(b){if(d?.aborted)throw d.reason;console.warn("[Pi Desk][PluginRegistry] 插件说明读取失败",{name:a,version:g.version,errorName:b instanceof Error?b.name:"UnknownError",reason:b instanceof h.XH?b.reason:"archive"})}let m=Object.keys((0,i.JM)(j.versions)).sort((a,b)=>{let c=(0,i.JM)(j.time),d="string"==typeof c[a]?Date.parse(c[a]):0,e="string"==typeof c[b]?Date.parse(c[b]):0;return(Number.isFinite(e)?e:0)-(Number.isFinite(d)?d:0)||b.localeCompare(a,"en",{numeric:!0})}).slice(0,100);return m.includes(g.version)||m.splice(99,1,g.version),{manifest:g,registry:e,versions:m,readme:k}}async function w(a,b=f.Nx,c,d=1,e="all"){let g=l(b),j="all"===e?10:20,k=(d-1)*j,m=new Map,n=!1;for(let b of"all"===e?["pi-desk-plugin","pi-package"]:["desk"===e?"pi-desk-plugin":"pi-package"]){let d=new URL(`${g}/-/v1/search`);d.searchParams.set("text",`keywords:${b}${a?` ${a}`:""}`),d.searchParams.set("size",String(j)),d.searchParams.set("from",String(k));let e=await (0,h.Yq)(d,c);if(!Array.isArray(e.objects)||"number"!=typeof e.total)throw new h.XH("插件源搜索响应格式无效");for(let a of(n||=k+e.objects.length<e.total,e.objects.slice(0,j))){let c=(0,i.JM)((0,i.JM)(a).package);if("string"!=typeof c.name||"string"!=typeof c.version)continue;let d={...c,keywords:[...Array.isArray(c.keywords)?c.keywords:[],b]};m.has(c.name)||m.set(c.name,{manifest:d,registry:g})}}return{packages:[...m.values()],hasMore:n}}d()}catch(a){d(a)}})},75885:(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)}})},99431:(a,b,c)=>{c.d(b,{C6:()=>g,Dn:()=>k,EU:()=>h,_s:()=>i,h$:()=>j});var d=c(59473),e=c(42633),f=c(58417);let g=f.SZ,h=f.w3;d.Ik({downloadSource:h,recommendedRegistry:g}).strict();let i=d.Ik({downloadSource:h}).strict(),j=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:g.optional()}).strict(),k=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:g.optional()}).strict(),l=d.Ik({name:d.Yj(),description:e.qf.nullable(),version:d.Yj(),publisher:d.Yj().nullable(),kind:d.k5(["desk","pi","unknown"]),official:d.zM(),registry:g}).strict();d.Ik({items:d.YO(l),hasMore:d.zM()}).strict(),l.extend({versions:d.YO(d.Yj()),readme:e.qf.nullable(),homepage:d.Yj().nullable(),repository:d.Yj().nullable(),compatible:d.zM().nullable(),compatibilityNote:d.Yj().nullable()}).strict()}};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";exports.id=84231,exports.ids=[84231],exports.modules={52078:(a,b,c)=>{c.d(b,{DL:()=>h,Y_:()=>g,sg:()=>f,xg:()=>j});var d=c(51455),e=c(76760);function f(a){return/^npm:((?:@[^/]+\/)?[^@]+)(?:@.+)?$/.exec(a)?.[1]??null}function g(a,b){return f(a.source)??a.pluginName??(0,e.basename)((0,e.resolve)(b,a.source)).replace(/\.(?:ts|js)$/,"")}function h(a,b,c){let d=a.filter(a=>g(a,c)===b||a.pluginName===b||!f(a.source)&&(0,e.basename)((0,e.resolve)(c,a.source))===b),h=d.filter(a=>!(f(a.source)&&null===a.version&&null===a.error&&a.operation?.phase==="failed"));if(h.length>1)throw Error(`插件名字对应多个来源,请先检查插件清单:${b}`);return h[0]??(1===d.length?d[0]:null)}async function i(a){try{return await (0,d.stat)(a),!0}catch(a){if(a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code)return!1;throw a}}async function j(a,b,c){if(a.startsWith("@"))return null;let f=(0,e.join)(b,"extensions"),g=[(0,e.join)(f,a),.../\.(?:ts|js)$/.test(a)?[]:[(0,e.join)(f,`${a}.ts`),(0,e.join)(f,`${a}.js`)]];c&&!/^[a-z][a-z0-9+.-]*:/i.test(c.source)?g.push((0,e.resolve)(b,c.source)):c&&(0,e.isAbsolute)(c.source)&&g.push(c.source);let h=[...new Set((await Promise.all(g.map(async a=>await i(a)?(0,d.realpath)(a):null))).filter(a=>null!==a))];if(h.length>1)throw Error(`固定扩展目录中存在多个同名入口:${a}`);let j=h[0];if(!j)return null;let k=(0,e.relative)(await (0,d.realpath)(f),j);if(k.startsWith("..")||(0,e.isAbsolute)(k))throw Error("本地插件必须位于 Pi AgentDir 的 extensions 目录内");return j}},84231:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{executeL2PluginCommand:()=>q});var e=c(75430),f=c(76019),g=c(16056),h=c(50520),i=c(52078),j=a([e,h]);function k(a,b){return{name:(0,i.Y_)(a,b),source:a.source,kind:a.kind,version:a.version,status:a.status,...void 0===a.updateTag?{}:{updateTag:a.updateTag},...void 0===a.availableVersion?{}:{availableVersion:a.availableVersion},...void 0===a.updateError?{}:{updateError:a.updateError},...a.operation?{operation:a.operation}:{},...a.error?{error:a.error}:{}}}function l(a){return a instanceof Error?a.message:String(a)}async function m(a,b,c,d){let e=new Map;for(let f of b){let b=(0,i.DL)(c.plugins,f,d);if("remove"===a.action){if(!b)throw Error(`插件不存在:${f}`);if("package"!==b.kind)throw Error(`当前插件管理只支持卸载包来源,不支持卸载裸扩展:${f}`);e.set(b.source,{name:f,source:b.source,local:!1});continue}let g=await (0,i.xg)(f,d,b),h=b?(0,i.sg)(b.source):null;if(g&&h)throw Error(`同时存在本地扩展和 npm 来源,请先处理同名冲突:${f}`);if(g){if(a.version||a.tag)throw Error(`本地插件加载当前代码,不支持通过版本号或渠道切换源码:${f}`);e.set(g,{name:f,source:b?.source??g,local:!0})}else{if(b&&!h)throw Error(`该来源不能通过名字重新安装;本地插件必须位于全局 extensions 目录:${f}`);let c=`npm:${h??f}${a.version?`@${a.version}`:""}`;e.set(`npm:${h??f}`,{name:f,source:c,...b?{previousSource:b.source}:{},local:!1})}}return[...e.values()]}async function n(a,b,c){let d=new Map,e=b.filter(a=>!a.local),f=b.filter(a=>a.local);if(e.length>0)try{if(a.names)for(let b of(await c.batch("remove"===a.action?{action:"del",sources:e.map(a=>a.source)}:{action:"add",items:e.map(b=>({source:b.source,...a.tag?{tag:a.tag}:{}}))})).results)d.set(b.source,b.error);else{let b=e[0];"remove"===a.action?await c.del(b.source):a.tag?await c.reinstall(b.source,b.previousSource,{tag:a.tag}):await c.reinstall(b.source,b.previousSource),d.set(b.source,null)}}catch(a){for(let b of e)d.set(b.source,l(a))}if(f.length>0)try{for(let a of(await c.apply(f.map(a=>a.source)),f))d.set(a.source,null)}catch(a){for(let b of f)d.set(b.source,l(a))}return b.map(a=>({target:a,error:d.has(a.source)?d.get(a.source):"业务未返回该来源的接纳结果"}))}async function o(a,b,c,d,e){let g,h=await Promise.all(b.map(async({target:a,error:b})=>{if(null!==b)return b;try{return await c.waitForOperations([...new Set([a.source,...a.previousSource?[a.previousSource]:[]])],d.signal),null}catch(a){return l(a)}}));d.signal.throwIfAborted();try{g=await c.list()}catch(a){return b.map(({target:b,error:c},d)=>`${b.name}:${null!==c?"未接纳":"失败或尚未完成"}:${h[d]??l(a)}`)}return b.map(({target:b,error:c},d)=>{let j=h[d];if(null!==c)return`${b.name}:未接纳:${c}`;if(null!==j){let a=g.restartRequired&&g.plugins.some(a=>[b.source,b.previousSource].includes(a.source)&&a.operation?.phase==="waiting")||/^插件尚未生效.*重启/.test(j);return`${b.name}:${a?"等待重启,尚未生效":"失败或尚未完成"}:${j}`}try{return`${b.name}:${function(a,b,c,d){let e=(0,i.DL)(c.plugins,(0,i.sg)(b.source)??b.name,d);if("remove"===a.action){if(e)throw Error("卸载后仍发现该包来源,无法确认卸载完成");return"成功:已卸载并完成宿主插件应用"}if(!e)throw Error("未发现安装后的插件,无法确认生效");if(e.error)throw Error((0,f.fD)(e.error.message,"zh-CN"));if("disabled"===e.status)throw Error("该插件仍被现有配置禁用,尚未生效");if(a.version&&e.version!==a.version)throw Error(`实际版本 ${e.version??"未知"} 与目标版本 ${a.version} 不一致`);return b.local?"成功:已加载当前代码,服务与界面已更新":`成功:已安装${e.version?` ${e.version}`:""}并完成宿主加载`}(a,b,g,e)}`}catch(a){return`${b.name}:失败或尚未完成:${l(a)}`}})}async function p(a,b,c){let d;try{let c=await a;b.signal.throwIfAborted(),d=`结果:
|
|
1
|
+
"use strict";exports.id=84231,exports.ids=[84231],exports.modules={52078:(a,b,c)=>{c.d(b,{DL:()=>h,Y_:()=>g,sg:()=>f,xg:()=>j});var d=c(51455),e=c(76760);function f(a){return/^npm:((?:@[^/]+\/)?[^@]+)(?:@.+)?$/.exec(a)?.[1]??null}function g(a,b){return f(a.source)??a.pluginName??(0,e.basename)((0,e.resolve)(b,a.source)).replace(/\.(?:ts|js)$/,"")}function h(a,b,c){let d=a.filter(a=>g(a,c)===b||a.pluginName===b||!f(a.source)&&(0,e.basename)((0,e.resolve)(c,a.source))===b),h=d.filter(a=>!(f(a.source)&&null===a.version&&null===a.error&&a.operation?.phase==="failed"));if(h.length>1)throw Error(`插件名字对应多个来源,请先检查插件清单:${b}`);return h[0]??(1===d.length?d[0]:null)}async function i(a){try{return await (0,d.stat)(a),!0}catch(a){if(a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code)return!1;throw a}}async function j(a,b,c){if(a.startsWith("@"))return null;let f=(0,e.join)(b,"extensions"),g=[(0,e.join)(f,a),.../\.(?:ts|js)$/.test(a)?[]:[(0,e.join)(f,`${a}.ts`),(0,e.join)(f,`${a}.js`)]];c&&!/^[a-z][a-z0-9+.-]*:/i.test(c.source)?g.push((0,e.resolve)(b,c.source)):c&&(0,e.isAbsolute)(c.source)&&g.push(c.source);let h=[...new Set((await Promise.all(g.map(async a=>await i(a)?(0,d.realpath)(a):null))).filter(a=>null!==a))];if(h.length>1)throw Error(`固定扩展目录中存在多个同名入口:${a}`);let j=h[0];if(!j)return null;let k=(0,e.relative)(await (0,d.realpath)(f),j);if(k.startsWith("..")||(0,e.isAbsolute)(k))throw Error("本地插件必须位于 Pi AgentDir 的 extensions 目录内");return j}},84231:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{executeL2PluginCommand:()=>q});var e=c(75430),f=c(76019),g=c(16056),h=c(50520),i=c(52078),j=a([e,h]);function k(a,b){return{name:(0,i.Y_)(a,b),source:a.source,kind:a.kind,version:a.version,status:a.status,...void 0===a.updateTag?{}:{updateTag:a.updateTag},...void 0===a.availableVersion?{}:{availableVersion:a.availableVersion},...void 0===a.updateError?{}:{updateError:a.updateError},...a.operation?{operation:a.operation}:{},...a.error?{error:a.error}:{}}}function l(a){return a instanceof Error?a.message:String(a)}async function m(a,b,c,d){let e=new Map;for(let f of b){let b=(0,i.DL)(c.plugins,f,d);if("reload"===a.action){if(!b)throw Error(`插件不存在:${f}`);if("disabled"===b.status)throw Error(`插件已禁用,请先启用:${f}`);e.set(b.source,{name:f,source:b.source,local:!1});continue}if("remove"===a.action){if(!b)throw Error(`插件不存在:${f}`);if("package"!==b.kind)throw Error(`当前插件管理只支持卸载包来源,不支持卸载裸扩展:${f}`);e.set(b.source,{name:f,source:b.source,local:!1});continue}let g=await (0,i.xg)(f,d,b),h=b?(0,i.sg)(b.source):null;if(g&&h)throw Error(`同时存在本地扩展和 npm 来源,请先处理同名冲突:${f}`);if(g){if(a.version||a.tag)throw Error(`本地插件加载当前代码,不支持通过版本号或渠道切换源码:${f}`);e.set(g,{name:f,source:b?.source??g,local:!0})}else{if(b&&!h)throw Error(`该来源不能通过名字重新安装;本地插件必须位于全局 extensions 目录:${f}`);let c=`npm:${h??f}${a.version?`@${a.version}`:""}`;e.set(`npm:${h??f}`,{name:f,source:c,...b?{previousSource:b.source}:{},local:!1})}}return[...e.values()]}async function n(a,b,c){if("reload"===a.action){let a=[];for(let d of b)try{await c.apply([d.source]),a.push({target:d,error:null})}catch(b){a.push({target:d,error:l(b)})}return a}let d=new Map,e=b.filter(a=>!a.local),f=b.filter(a=>a.local);if(e.length>0)try{if(a.names)for(let b of(await c.batch("remove"===a.action?{action:"del",sources:e.map(a=>a.source)}:{action:"add",items:e.map(b=>({source:b.source,...a.tag?{tag:a.tag}:{}}))})).results)d.set(b.source,b.error);else{let b=e[0];"remove"===a.action?await c.del(b.source):a.tag?await c.reinstall(b.source,b.previousSource,{tag:a.tag}):await c.reinstall(b.source,b.previousSource),d.set(b.source,null)}}catch(a){for(let b of e)d.set(b.source,l(a))}if(f.length>0)try{for(let a of(await c.apply(f.map(a=>a.source)),f))d.set(a.source,null)}catch(a){for(let b of f)d.set(b.source,l(a))}return b.map(a=>({target:a,error:d.has(a.source)?d.get(a.source):"业务未返回该来源的接纳结果"}))}async function o(a,b,c,d,e){let g,h=await Promise.all(b.map(async({target:a,error:b})=>{if(null!==b)return b;try{return await c.waitForOperations([...new Set([a.source,...a.previousSource?[a.previousSource]:[]])],d.signal),null}catch(a){return l(a)}}));d.signal.throwIfAborted();try{g=await c.list()}catch(a){return b.map(({target:b,error:c},d)=>`${b.name}:${null!==c?"未接纳":"失败或尚未完成"}:${h[d]??l(a)}`)}return b.map(({target:b,error:c},d)=>{let j=h[d];if(null!==c)return`${b.name}:未接纳:${c}`;if(null!==j){let a=g.restartRequired&&g.plugins.some(a=>[b.source,b.previousSource].includes(a.source)&&a.operation?.phase==="waiting")||/^插件尚未生效.*重启/.test(j);return`${b.name}:${a?"等待重启,尚未生效":"失败或尚未完成"}:${j}`}try{return`${b.name}:${function(a,b,c,d){let e=(0,i.DL)(c.plugins,(0,i.sg)(b.source)??b.name,d);if("remove"===a.action){if(e)throw Error("卸载后仍发现该包来源,无法确认卸载完成");return"成功:已卸载并完成宿主插件应用"}if(!e)throw Error("未发现安装后的插件,无法确认生效");if(e.error)throw Error((0,f.fD)(e.error.message,"zh-CN"));if("disabled"===e.status)throw Error("该插件仍被现有配置禁用,尚未生效");if(a.version&&e.version!==a.version)throw Error(`实际版本 ${e.version??"未知"} 与目标版本 ${a.version} 不一致`);return"reload"===a.action?"成功:已重新加载本机代码,已有 Pi 会话保持不变":b.local?"成功:已加载当前代码,服务与界面已更新":`成功:已安装${e.version?` ${e.version}`:""}并完成宿主加载`}(a,b,g,e)}`}catch(a){return`${b.name}:失败或尚未完成:${l(a)}`}})}async function p(a,b,c){let d;try{let c=await a;b.signal.throwIfAborted(),d=`结果:
|
|
2
2
|
${c.join("\n")}
|
|
3
3
|
|
|
4
4
|
以上为宿主插件应用结果;已有 Pi 会话的工具变更需新建会话或主动 reload 才生效。`}catch(a){if(b.signal.aborted)return;d=`结果:失败或尚未完成。
|
|
@@ -6,4 +6,4 @@ ${c.join("\n")}
|
|
|
6
6
|
|
|
7
7
|
操作:${c}
|
|
8
8
|
范围:全局
|
|
9
|
-
${d}`)}catch(a){console.warn("[Pi Desk][Commands] 异步结果投递失败",{operation:c,message:l(a)})}}async function q(a,b,c=(0,h.getL2PluginManagement)(),d=(0,e.getAgentDir)()){if(b.signal.throwIfAborted(),(0,g.P)())throw Error("基础模式不执行插件管理,请正常启动 Pi Desk 后操作");let f=await c.list("list"===a.action&&{...a.checkUpdates?{checkUpdates:!0}:{},...a.tag?{tag:a.tag}:{}});if("list"===a.action)return{mode:"sync",message:JSON.stringify({plugins:f.plugins.filter(b=>!a.tag||b.updateTag===a.tag).map(a=>k(a,d)),restartRequired:f.restartRequired,...f.loadError?{loadError:f.loadError}:{}})};let j=a.names??(a.name?[a.name]:[]);if(0===j.length)throw Error("缺少插件名字");if("show"===a.action){if(1!==j.length)throw Error("show 只支持单个插件名字");let a=(0,i.DL)(f.plugins,j[0],d);if(!a)throw Error(`插件不存在:${j[0]}`);let b=await c.get(a.source);return{mode:"sync",message:JSON.stringify({...k(a,d),detail:{tools:b.tools,skills:b.skills,prompts:b.prompts}})}}let l=await m(a,j,f,d);b.signal.throwIfAborted();let r=await n(a,l,c),s=r.filter(a=>null===a.error).length;if(0===s)throw Error(r.map(({target:a,error:b})=>`${a.name}:${b}`).join("\n"));let t="remove"===a.action?"卸载":"安装",u=`${t} ${l.map(a=>a.name).join("、")}${a.version?`@${a.version}`:a.tag?`(渠道 ${a.tag})`:""}`;return console.info("[Pi Desk][Commands] 插件命令已接纳",{operation:u,sources:l.map(a=>a.source),acceptedCount:s,rejectedCount:r.length-s}),p(o(a,r,c,b,d),b,u),{mode:"async",message:`本次${t}已被接纳(${s}/${l.length} 项):${l.map(a=>a.name).join("、")}${s<l.length?";其余项未接纳":""}。执行结果会统一插入本会话并唤醒模型;无独立工作时结束当前轮,无需持续查询。`}}[e,h]=j.then?(await j)():j,d()}catch(a){d(a)}})}};
|
|
9
|
+
${d}`)}catch(a){console.warn("[Pi Desk][Commands] 异步结果投递失败",{operation:c,message:l(a)})}}async function q(a,b,c=(0,h.getL2PluginManagement)(),d=(0,e.getAgentDir)()){if(b.signal.throwIfAborted(),(0,g.P)())throw Error("基础模式不执行插件管理,请正常启动 Pi Desk 后操作");let f=await c.list("list"===a.action&&{...a.checkUpdates?{checkUpdates:!0}:{},...a.tag?{tag:a.tag}:{}});if("list"===a.action)return{mode:"sync",message:JSON.stringify({plugins:f.plugins.filter(b=>!a.tag||b.updateTag===a.tag).map(a=>k(a,d)),restartRequired:f.restartRequired,...f.loadError?{loadError:f.loadError}:{}})};let j=a.names??(a.name?[a.name]:[]);if(0===j.length)throw Error("缺少插件名字");if("show"===a.action){if(1!==j.length)throw Error("show 只支持单个插件名字");let a=(0,i.DL)(f.plugins,j[0],d);if(!a)throw Error(`插件不存在:${j[0]}`);let b=await c.get(a.source);return{mode:"sync",message:JSON.stringify({...k(a,d),detail:{tools:b.tools,skills:b.skills,prompts:b.prompts}})}}let l=await m(a,j,f,d);b.signal.throwIfAborted();let r=await n(a,l,c),s=r.filter(a=>null===a.error).length;if(0===s)throw Error(r.map(({target:a,error:b})=>`${a.name}:${b}`).join("\n"));let t="remove"===a.action?"卸载":"reload"===a.action?"重载":"安装",u=`${t} ${l.map(a=>a.name).join("、")}${a.version?`@${a.version}`:a.tag?`(渠道 ${a.tag})`:""}`;return console.info("[Pi Desk][Commands] 插件命令已接纳",{operation:u,sources:l.map(a=>a.source),acceptedCount:s,rejectedCount:r.length-s}),p(o(a,r,c,b,d),b,u),{mode:"async",message:`本次${t}已被接纳(${s}/${l.length} 项):${l.map(a=>a.name).join("、")}${s<l.length?";其余项未接纳":""}。执行结果会统一插入本会话并唤醒模型;无独立工作时结束当前轮,无需持续查询。`}}[e,h]=j.then?(await j)():j,d()}catch(a){d(a)}})}};
|