@jetcrab/pi-desk 1.1.18-dev → 1.1.20-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.
Files changed (105) hide show
  1. package/docs/plugins.md +1 -1
  2. package/next.config.ts +1 -0
  3. package/package.json +3 -2
  4. package/src/client/l2_biz/workbench/file-workspace/l2-file-workspace-runtime.ts +1 -1
  5. package/src/client/l2_biz/workbench/hooks/l2-workbench-chat-reload.ts +42 -0
  6. package/src/client/l2_biz/workbench/l2-work-session-sidebar.tsx +19 -1
  7. package/src/client/l2_biz/workbench/l2-workbench-chat.ts +45 -0
  8. package/src/client/l2_biz/workbench/l2-workbench.tsx +4 -0
  9. package/src/client/l3_modules/conversation/l3-conversation-markdown.tsx +10 -1
  10. package/src/client/l3_modules/project-files/l3-markdown-preview.tsx +10 -1
  11. package/src/client/l3_modules/project-files/l3-project-document-view.tsx +2 -0
  12. package/src/client/l3_modules/project-files/l3-project-file-browser.tsx +171 -229
  13. package/src/client/l3_modules/project-files/l3-project-file-runtime.ts +133 -70
  14. package/src/client/l3_modules/project-files/l3-project-reader.ts +4 -3
  15. package/src/client/l3_modules/project-files/views/l3-project-search-controls.tsx +201 -0
  16. package/src/client/l3_modules/project-files/views/l3-project-search-results.tsx +333 -0
  17. package/src/client/l4_foundation/ui/code/l4-code-preview.tsx +47 -3
  18. package/src/client/l4_foundation/ui/markdown/l4-markdown-remark.ts +89 -0
  19. package/src/client/l4_foundation/ui/markdown/l4-markdown.module.css +58 -0
  20. package/src/client/l4_foundation/ui/markdown/l4-markdown.tsx +108 -0
  21. package/src/common/l2_biz/work-session/l2-work-session-file-contract.ts +4 -3
  22. package/src/common/l2_biz/workbench/l2-workbench-locale-messages.ts +6 -0
  23. package/src/common/l3_modules/project-files/l3-project-files-contract.ts +2 -3
  24. package/src/common/l3_modules/project-files/l3-project-files-locale-messages.ts +56 -10
  25. package/src/common/l4_foundation/file/l4-project-file-contract.ts +51 -1
  26. package/src/common/l4_foundation/locale/l4-host-error-messages.ts +11 -0
  27. package/src/common/l4_foundation/locale/l4-locale-messages.ts +16 -0
  28. package/src/instrumentation.ts +0 -2
  29. package/src/server/l1_entry/api/l1-project-read-routes.ts +6 -4
  30. package/src/server/l1_entry/api/l1-project-route.ts +9 -8
  31. package/src/server/l1_entry/api/l1-work-session-file-error.ts +23 -0
  32. package/src/server/l2_biz/plugin-management/l2-plugin-management.ts +0 -3
  33. package/src/server/l2_biz/work-session/l2-work-session-chat-runtime.ts +30 -58
  34. package/src/server/l2_biz/work-session/l2-work-session-manage.ts +0 -4
  35. package/src/server/l4_foundation/file/l4-project-file-index.ts +276 -0
  36. package/src/server/l4_foundation/file/l4-project-search.ts +399 -0
  37. package/src/server/l4_foundation/file/l4-ripgrep-search.ts +192 -0
  38. package/src/server/l4_foundation/file/l4-work-session-project-file.ts +8 -332
  39. package/src/server/l4_foundation/pi/l4-pi-package-maintenance.ts +0 -6
  40. package/src/server/l4_foundation/pi/l4-pi-plugin-capability-probe.ts +1 -3
  41. package/src/server/l4_foundation/pi/l4-pi-plugin-probe.ts +1 -3
  42. package/src/server/l4_foundation/pi/l4-pi-runner-process.ts +2 -2
  43. package/src/server/l4_foundation/process/l4-process-tree.js +23 -4
  44. package/temp/build/pi-desk/release/.next/BUILD_ID +1 -1
  45. package/temp/build/pi-desk/release/.next/build-manifest.json +3 -3
  46. package/temp/build/pi-desk/release/.next/prerender-manifest.json +3 -3
  47. package/temp/build/pi-desk/release/.next/react-loadable-manifest.json +1 -1
  48. package/temp/build/pi-desk/release/.next/required-server-files.js +3 -2
  49. package/temp/build/pi-desk/release/.next/required-server-files.json +3 -2
  50. package/temp/build/pi-desk/release/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  51. package/temp/build/pi-desk/release/.next/server/app/_global-error.html +1 -1
  52. package/temp/build/pi-desk/release/.next/server/app/_global-error.rsc +1 -1
  53. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  54. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  55. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  56. package/temp/build/pi-desk/release/.next/server/app/_not-found/page.js +1 -1
  57. package/temp/build/pi-desk/release/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  58. package/temp/build/pi-desk/release/.next/server/app/api/health/route.js +1 -1
  59. package/temp/build/pi-desk/release/.next/server/app/api/project-files/get/route.js +2 -1
  60. package/temp/build/pi-desk/release/.next/server/app/api/project-files/list/route.js +2 -1
  61. package/temp/build/pi-desk/release/.next/server/app/api/project-files/reveal/route.js +1 -1
  62. package/temp/build/pi-desk/release/.next/server/app/api/project-files/search/route.js +2 -1
  63. package/temp/build/pi-desk/release/.next/server/app/api/project-git/get/route.js +2 -1
  64. package/temp/build/pi-desk/release/.next/server/app/api/project-git-branches/list/route.js +2 -1
  65. package/temp/build/pi-desk/release/.next/server/app/api/project-git-changes/list/route.js +2 -1
  66. package/temp/build/pi-desk/release/.next/server/app/api/project-git-diff/get/route.js +2 -1
  67. package/temp/build/pi-desk/release/.next/server/app/api/project-git-heads/get/route.js +2 -1
  68. package/temp/build/pi-desk/release/.next/server/app/api/project-git-log/list/route.js +2 -1
  69. package/temp/build/pi-desk/release/.next/server/app/login/page.js +1 -1
  70. package/temp/build/pi-desk/release/.next/server/app/login/page_client-reference-manifest.js +1 -1
  71. package/temp/build/pi-desk/release/.next/server/app/page.js +77 -77
  72. package/temp/build/pi-desk/release/.next/server/app/page_client-reference-manifest.js +1 -1
  73. package/temp/build/pi-desk/release/.next/server/chunks/{33658.js → 10881.js} +8 -8
  74. package/temp/build/pi-desk/release/.next/server/chunks/23054.js +1 -1
  75. package/temp/build/pi-desk/release/.next/server/chunks/25406.js +3 -3
  76. package/temp/build/pi-desk/release/.next/server/chunks/35985.js +5 -5
  77. package/temp/build/pi-desk/release/.next/server/chunks/50520.js +2 -4
  78. package/temp/build/pi-desk/release/.next/server/chunks/6917.js +1 -1
  79. package/temp/build/pi-desk/release/.next/server/chunks/70780.js +1 -0
  80. package/temp/build/pi-desk/release/.next/server/chunks/74528.js +1 -1
  81. package/temp/build/pi-desk/release/.next/server/chunks/92386.js +1 -1
  82. package/temp/build/pi-desk/release/.next/server/instrumentation.js +1 -1
  83. package/temp/build/pi-desk/release/.next/server/middleware-build-manifest.js +1 -1
  84. package/temp/build/pi-desk/release/.next/server/middleware-react-loadable-manifest.js +1 -1
  85. package/temp/build/pi-desk/release/.next/server/pages/500.html +1 -1
  86. package/temp/build/pi-desk/release/.next/server/server-reference-manifest.json +1 -1
  87. package/temp/build/pi-desk/release/.next/static/chunks/27611-0890482fe76bd9d6.js +238 -0
  88. package/temp/build/pi-desk/release/.next/static/chunks/{31087-ba426d09d6f68bfd.js → 31087-d8e5765d541d5c26.js} +1 -1
  89. package/temp/build/pi-desk/release/.next/static/chunks/{49516-cc4dcd84d64ab4fe.js → 51474-8dc714cb76b2e60a.js} +2 -2
  90. package/temp/build/pi-desk/release/.next/static/chunks/77592-5bef6acb8e7c4b96.js +13 -0
  91. package/temp/build/pi-desk/release/.next/static/chunks/app/layout-a50c456648537afb.js +3 -0
  92. package/temp/build/pi-desk/release/.next/static/chunks/app/{page-a984139e99586041.js → page-0789c43551b29dd2.js} +4 -4
  93. package/temp/build/pi-desk/release/.next/static/chunks/{webpack-40a782fc8a3535b9.js → webpack-d7248206b7fc7ba8.js} +1 -1
  94. package/temp/build/pi-desk/release/.next/static/css/250a6b93cc2222d1.css +1 -0
  95. package/temp/build/pi-desk/release/.next/static/css/6dbae2922f88ca31.css +1 -0
  96. package/temp/build/pi-desk/release/.next/static/css/a4cf28fd76c70165.css +1 -0
  97. package/temp/build/pi-desk/release/.next/trace-build +1 -1
  98. package/temp/build/pi-desk/release/.next/server/chunks/8584.js +0 -2
  99. package/temp/build/pi-desk/release/.next/static/chunks/39654-b5fedd762ea0312e.js +0 -238
  100. package/temp/build/pi-desk/release/.next/static/chunks/75130-d2ca74894aff8085.js +0 -13
  101. package/temp/build/pi-desk/release/.next/static/chunks/app/layout-c0e1c5cef8620cf8.js +0 -3
  102. package/temp/build/pi-desk/release/.next/static/css/6427d02b6edf406f.css +0 -1
  103. package/temp/build/pi-desk/release/.next/static/css/79e06f05df9edff0.css +0 -1
  104. /package/temp/build/pi-desk/release/.next/static/{n2LrXQgq8UkbH_AzhR3fw → RLKcK-RQF5FvEeDmS9uih}/_buildManifest.js +0 -0
  105. /package/temp/build/pi-desk/release/.next/static/{n2LrXQgq8UkbH_AzhR3fw → RLKcK-RQF5FvEeDmS9uih}/_ssgManifest.js +0 -0
@@ -1,7 +1,5 @@
1
- "use strict";exports.id=50520,exports.ids=[50520],exports.modules={621:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{JM:()=>k,w$:()=>m});var e=c(51455),f=c(76760),g=c(38522),h=c(57975);c(77598);var i=c(73159),j=a([i]);function k(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:{}}async function l(a,b){let c;if(!(c=b.replaceAll("\\","/").replace(/^\.\//,""))||(0,f.isAbsolute)(b)||f.win32.isAbsolute(b)||c.includes("\0")||c.split("/").some(a=>".."===a)||!c)return null;try{let c=await (0,e.realpath)((0,f.resolve)(a,b)),d=(0,f.relative)(a,c);if((0,f.isAbsolute)(d)||".."===d||d.startsWith(`..${"win32"===process.platform?"\\":"/"}`))return null;let g=await (0,e.open)(c,"r");try{let a=await g.stat();if(!a.isFile()||a.size>65536)return null;let b=Buffer.alloc(65537),c=0;for(;c<b.length;){let{bytesRead:a}=await g.read(b,c,b.length-c,c);if(!a)break;c+=a}return c<=65536?b.subarray(0,c).toString("utf8"):null}finally{await g.close()}}catch(a){if(["ENOENT","ENOTDIR"].includes(a.code??""))return null;throw a}}async function m(a){let b,c=await (0,e.realpath)(a),d=await l(c,"package.json"),f=d?k(JSON.parse(d)):{},g={};for(let[a,d]of(b=k(k(f.piDesk).i18n),Object.entries(b).slice(0,16).flatMap(([a,b])=>{let c=k(b).readme;return a.length>0&&a.length<=35&&"string"==typeof c&&c.length<=1024?[[a,c]]:[]}))){let b=await l(c,d);null!==b&&(g[a]=b)}var h=await l(c,"README.md");if(null===h&&!Object.keys(g).length)return null;let i=h??Object.values(g)[0];return Object.keys(g).length?{default:i,translations:g}:i}i=(j.then?(await j)():j)[0],(0,h.promisify)(g.gunzip),d()}catch(a){d(a)}})},2472:(a,b,c)=>{c.d(b,{i:()=>i});var d=c(31421),e=c(76760),f=c(73136);let{createRequire:g}=process.getBuiltinModule("module"),h=g((0,e.join)(process.cwd(),"package.json"))("./src/server/l4_foundation/process/l4-process-tree.js");function i(a){return new Promise((b,c)=>{if(a.signal?.aborted)return void c(Error("操作已取消"));let g=(0,f.pathToFileURL)((0,e.join)(process.cwd(),"src/server/l4_foundation/pi/l4-pi-runtime-register.mjs")).href,i=(0,d.spawn)(process.execPath,["--import",g,...a.args],{cwd:process.cwd(),env:{...process.env,PI_CODING_AGENT_DIR:a.agentDir,PI_CODING_AGENT_SESSION_DIR:(0,e.join)(a.agentDir,"sessions"),TSX_TSCONFIG_PATH:(0,e.join)(process.cwd(),"tsconfig.json"),...a.env},stdio:["ignore","pipe","pipe"],windowsHide:!0,detached:"win32"!==process.platform}),j="",k="",l=!1,m=null,n=b=>{!l&&(l=!0,m&&clearTimeout(m),a.signal?.removeEventListener("abort",o),h.terminateManagedTree(i).then(b,b=>{let d=b instanceof Error?b:Error(String(b));console.error("[Pi Desk][Runner] 子进程清理未完成",{pid:i.pid,exitCode:i.exitCode,reason:d.message}),c(a.cleanupError(k.trim(),d))}))},o=()=>n(()=>c(Error("操作已取消"))),p=(b,c)=>`${b}${c.toString("utf8")}`.slice(-a.maxOutputBytes);i.stdout.on("data",a=>{j=p(j,a)}),i.stderr.on("data",a=>{k=p(k,a)}),i.once("error",a=>n(()=>c(a))),i.once("close",a=>n(()=>b({stdout:j,stderr:k,code:a}))),(m=setTimeout(()=>{let b=a.timeoutError(),d=`${k}
1
+ "use strict";exports.id=50520,exports.ids=[50520],exports.modules={621:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{JM:()=>k,w$:()=>m});var e=c(51455),f=c(76760),g=c(38522),h=c(57975);c(77598);var i=c(73159),j=a([i]);function k(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:{}}async function l(a,b){let c;if(!(c=b.replaceAll("\\","/").replace(/^\.\//,""))||(0,f.isAbsolute)(b)||f.win32.isAbsolute(b)||c.includes("\0")||c.split("/").some(a=>".."===a)||!c)return null;try{let c=await (0,e.realpath)((0,f.resolve)(a,b)),d=(0,f.relative)(a,c);if((0,f.isAbsolute)(d)||".."===d||d.startsWith(`..${"win32"===process.platform?"\\":"/"}`))return null;let g=await (0,e.open)(c,"r");try{let a=await g.stat();if(!a.isFile()||a.size>65536)return null;let b=Buffer.alloc(65537),c=0;for(;c<b.length;){let{bytesRead:a}=await g.read(b,c,b.length-c,c);if(!a)break;c+=a}return c<=65536?b.subarray(0,c).toString("utf8"):null}finally{await g.close()}}catch(a){if(["ENOENT","ENOTDIR"].includes(a.code??""))return null;throw a}}async function m(a){let b,c=await (0,e.realpath)(a),d=await l(c,"package.json"),f=d?k(JSON.parse(d)):{},g={};for(let[a,d]of(b=k(k(f.piDesk).i18n),Object.entries(b).slice(0,16).flatMap(([a,b])=>{let c=k(b).readme;return a.length>0&&a.length<=35&&"string"==typeof c&&c.length<=1024?[[a,c]]:[]}))){let b=await l(c,d);null!==b&&(g[a]=b)}var h=await l(c,"README.md");if(null===h&&!Object.keys(g).length)return null;let i=h??Object.values(g)[0];return Object.keys(g).length?{default:i,translations:g}:i}i=(j.then?(await j)():j)[0],(0,h.promisify)(g.gunzip),d()}catch(a){d(a)}})},2472:(a,b,c)=>{c.d(b,{i:()=>i});var d=c(31421),e=c(76760),f=c(73136);let{createRequire:g}=process.getBuiltinModule("module"),h=g((0,e.join)(process.cwd(),"package.json"))("./src/server/l4_foundation/process/l4-process-tree.js");function i(a){return new Promise((b,c)=>{if(a.signal?.aborted)return void c(Error("操作已取消"));let g=(0,f.pathToFileURL)((0,e.join)(process.cwd(),"src/server/l4_foundation/pi/l4-pi-runtime-register.mjs")).href,i=(0,d.spawn)(process.execPath,["--import",g,...a.args],{cwd:process.cwd(),env:{...process.env,PI_CODING_AGENT_DIR:a.agentDir,PI_CODING_AGENT_SESSION_DIR:(0,e.join)(a.agentDir,"sessions"),TSX_TSCONFIG_PATH:(0,e.join)(process.cwd(),"tsconfig.json"),...a.env},stdio:["ignore","pipe","pipe"],windowsHide:!0,detached:"win32"!==process.platform}),j="",k="",l=!1,m=null,n=b=>{!l&&(l=!0,m&&clearTimeout(m),a.signal?.removeEventListener("abort",o),h.terminateManagedTree(i).then(b,a=>{let c=a instanceof Error?a:Error(String(a));console.error("[Pi Desk][Runner] 子进程清理未完成",{pid:i.pid,exitCode:i.exitCode,reason:c.message}),b()}))},o=()=>n(()=>c(Error("操作已取消"))),p=(b,c)=>`${b}${c.toString("utf8")}`.slice(-a.maxOutputBytes);i.stdout.on("data",a=>{j=p(j,a)}),i.stderr.on("data",a=>{k=p(k,a)}),i.once("error",a=>n(()=>c(a))),i.once("close",a=>n(()=>b({stdout:j,stderr:k,code:a}))),(m=setTimeout(()=>{let b=a.timeoutError(),d=`${k}
2
2
  ${j}`.trim().slice(-4e3);d&&(b.message+=`
3
3
  ${d}`),n(()=>c(b))},a.timeoutMs)).unref(),a.signal?.addEventListener("abort",o,{once:!0}),a.signal?.aborted&&o()})}},17691:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{M:()=>j});var e=c(77598),f=c(73024),g=c(76760),h=c(75430),i=a([h]);function j(){let a=(0,h.getAgentDir)(),b=(0,g.join)(a,"pi-desk"),c=(0,g.join)(a,"pi-super");if((0,f.existsSync)(b)||!(0,f.existsSync)(c))return b;let d=(0,g.join)(a,`.pi-desk-migration-${(0,e.randomUUID)()}`);try{(0,f.cpSync)(c,d,{recursive:!0,errorOnExist:!0,force:!1}),(0,f.renameSync)(d,b),console.info("[Pi Desk] 已复制旧版应用数据到新目录")}finally{(0,f.rmSync)(d,{recursive:!0,force:!0})}return b}h=(i.then?(await i)():i)[0],d()}catch(a){d(a)}})},20700:(a,b,c)=>{function d(){return globalThis.__piDeskRestartHandler??null}function e(){return null!==d()}function f(a,b){let c=d();if(!c)throw Error("当前启动方式不支持自动重启 Pi Desk");setTimeout(()=>c(a,b),150).unref()}c.d(b,{Z:()=>f,k:()=>e})},33290:(a,b,c)=>{function d(){return globalThis.__piDeskNativePluginDiagnostics||(globalThis.__piDeskNativePluginDiagnostics=[]),globalThis.__piDeskNativePluginDiagnostics}function e(a,b){let c=d();!c.some(c=>c.cwd===a&&c.message===b)&&(c.push({cwd:a,message:b}),c.length>100&&c.splice(0,c.length-100))}function f(a){let b=a=>{let b=a.replaceAll("\\","/");return"win32"===process.platform?b.toLowerCase():b},c=b(a).replace(/\/$/,""),e=d();for(let a=e.length-1;a>=0;a-=1){let d=b(e[a].message);(d.includes(`${c}:`)||d.includes(`${c}/`))&&e.splice(a,1)}}function g(){return d().map(a=>({...a}))}c.d(b,{pL:()=>e,tt:()=>f,u7:()=>g})},34458:(a,b,c)=>{c.a(a,async(a,d)=>{try{let r;c.d(b,{dz:()=>o,qX:()=>n,w$:()=>i.w$});var e=c(4287),f=c(5235),g=c(64253),h=c(73159),i=c(621),j=a([f,g,h,i]);function k(a){return new URL(e.SZ.parse(a)).href.replace(/\/+$/,"")}function l(a,b,c){return new URL(`${k(a)}/${encodeURIComponent(b)}${c?`/${encodeURIComponent(c)}`:""}`)}function m(a,b){let c=(0,i.JM)(a.versions),d=(0,i.JM)(a["dist-tags"]),e="string"==typeof d[b]?d[b]:b.replace(/^v(?=\d+\.)/,"");if("string"!=typeof e||!Object.hasOwn(c,e))throw new h.XH("插件源不存在指定版本或标签",404,"missing");if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(e))throw new h.XH("插件源返回的版本无效");return e}async function n(a,b){let c=(0,f.to)(b.agentDir),d=b.downloadSource??c.downloadSource;if("local"===d.mode){let c=await (0,g.B)(b.agentDir),d=a.startsWith("@")?c[`${a.split("/")[0]}:registry`]:void 0;return{registry:k(d||c.registry||f.Nx),fallback:!1}}if(b.registry){let a=k(b.registry);if(![f.Nx,f.sv].includes(a))return{registry:a,fallback:!1}}let e=c.registries[`npm:${a}`];if(e)return{registry:k(e),fallback:!1};if(a.startsWith("@")){let c=(await (0,g.B)(b.agentDir))[`${a.split("/")[0]}:registry`];if(c){let a=k(c);if(![f.Nx,f.sv].includes(a))return{registry:a,fallback:!1}}}return"custom"===d.mode?{registry:k(d.registry),fallback:!1}:"official"===d.mode?{registry:f.Nx,fallback:!1}:"domestic"===d.mode?{registry:f.sv,fallback:!1}:{registry:await function(){if(!r||r.expires<=Date.now()){let a=(async()=>{try{let a=await (0,h.NL)(new URL("https://ipwho.is/?fields=success,country_code"),{limit:1024,timeout:3e3,cache:!1,auth:!1}),b=(0,i.JM)(JSON.parse(a.toString("utf8")));if(!0!==b.success)throw Error("出口地区检测失败");return"CN"===b.country_code?f.sv:f.Nx}catch{return r&&(r.expires=Date.now()+6e4),f.Nx}})();r={expires:Date.now()+18e5,value:a}}return r.value}(),fallback:!0}}async function o(a,b={}){let c;if(!a.startsWith("npm:"))return{source:a};let d=/^npm:((?:@[^/]+\/)?[^@]+)(?:@([^@]+))?$/.exec(a);if(!d)throw new h.XH("npm 插件来源无效",400);let e=d[1];if(e.length>214||!/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*$/i.test(e))throw new h.XH("npm 插件包名无效",400);let g=d[2]??"latest";if(g.length>128||!/^[a-zA-Z0-9._+-]+$/.test(g))throw new h.XH("npm 插件版本或标签无效",400);let j=b.downloadSource??(0,f.to)(b.agentDir).downloadSource,k=await n(e,{...b,downloadSource:j}),r=k.registry,s=g;try{let a=await p(l(r,e),b),d=(0,i.JM)(a["dist-tags"])[g];"string"==typeof d&&(s=d),c=m(a,s),q((0,i.JM)(a.versions)[c],e,c)}catch(d){if(!k.fallback||r===f.Nx||!(d instanceof h.XH)||!["network","missing"].includes(d.reason))throw d;console.warn("[Pi Desk][PluginRegistry] 自动下载源不可用,回退 npm 官方源",{name:e,reason:d.reason}),r=f.Nx;let a=await p(l(r,e),b);c=m(a,s),q((0,i.JM)(a.versions)[c],e,c)}return{source:`npm:${e}@${c}`,..."local"===j.mode?{}:{registry:r}}}async function p(a,b){if(!1!==b.cache)return(0,h.Yq)(a,b.signal,b.agentDir);let c=await (0,h.NL)(a,{limit:8388608,signal:b.signal,cache:!1,agentDir:b.agentDir});try{let a=JSON.parse(c.toString("utf8"));if(!a||"object"!=typeof a||Array.isArray(a))throw Error("invalid");return a}catch{throw new h.XH("插件源返回的元数据格式无效")}}function q(a,b,c){let d=(0,i.JM)(a);if(d.name!==b||"string"!=typeof d.version||c&&d.version!==c)throw new h.XH("插件源返回的包名或版本不匹配");return d}[f,g,h,i]=j.then?(await j)():j,d()}catch(a){d(a)}})},47154:(a,b,c)=>{c.d(b,{V:()=>d});function d(a){let b=(globalThis.__piDeskPackageRootTail??Promise.resolve()).then(a,a);return globalThis.__piDeskPackageRootTail=b.then(()=>void 0,()=>void 0),b}},50520:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{L2PluginManagement:()=>P,L2PluginManagementInvalidPackageError:()=>L,L2PluginManagementNotFoundError:()=>J,L2PluginManagementOperationConflictError:()=>K,L2PluginManagementPackageRootError:()=>M,L2PluginManagementRestartPendingError:()=>N,L2PluginManagementRestartUnavailableError:()=>O,disposeL2PluginManagement:()=>G,getL2PluginManagement:()=>I,initializeL2PluginManagement:()=>H});var e=c(16056),f=c(17691),g=c(76019),h=c(77598),i=c(51455),j=c(76760),k=c(75430),l=c(93951),m=c(4287),n=c(34458),o=c(5235),p=c(36361),q=c(69371),r=c(75157),s=c(47154),t=c(60719),u=c(33290),v=c(53584),w=c(96783),x=c(20700),y=c(78597),z=a([f,k,n,o,p,t,y]);[f,k,n,o,p,t,y]=z.then?(await z)():z;class J extends Error{constructor(a){super(`插件不存在:${a}`),this.source=a,this.name="L2PluginManagementNotFoundError"}}class K extends Error{constructor(a){super(a),this.name="L2PluginManagementOperationConflictError"}}class L extends Error{constructor(a){super(a),this.name="L2PluginManagementInvalidPackageError"}}class M extends Error{constructor(a){super(a.message),this.rootError=a,this.name="L2PluginManagementPackageRootError"}}class N extends Error{constructor(){super("已有插件操作需要重启完成"),this.name="L2PluginManagementRestartPendingError"}}class O extends Error{constructor(){super("当前启动方式不支持自动重启 Pi Desk"),this.name="L2PluginManagementRestartUnavailableError"}}function A(a,b,c){let d=(0,j.resolve)(a,b),e=(0,j.relative)(a,d);if(e.startsWith("..")||(0,j.isAbsolute)(e))throw Error(`${c} 必须位于插件包目录内`);return d}async function B(a){try{return(await (0,i.stat)(a)).isFile()}catch{return!1}}function C(a){return a instanceof Error&&a.message?a.message:String(a)}async function D(a){let b;if((await (0,i.stat)(a)).isFile())return{version:null,error:null};try{b=JSON.parse(await (0,i.readFile)((0,j.join)(a,"package.json"),"utf8"))}catch(a){if(a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code)return{version:null,error:null};return{version:null,error:{phase:"package",message:C(a)}}}let c="string"==typeof b.version&&b.version.trim()?b.version.trim():null;try{let d=b.piDesk?.entry??b.piDesk?.global;if(void 0!==d){if("string"!=typeof d||!d.trim())throw Error("piDesk.entry 必须是非空字符串");let b=A(a,d,"piDesk.entry");if(!await B(b))throw Error("Pi Desk Entry 文件不存在")}let e=b.pi?.extensions;if(void 0!==e&&!Array.isArray(e))throw Error("pi.extensions 必须是数组");for(let b of e??[]){if("string"!=typeof b||!b.trim())throw Error("pi.extensions 只允许非空字符串");if(/[*?[\]{}]/.test(b))continue;let c=A(a,b,"pi.extensions");if(!await B(c))throw Error(`Native Extension 文件不存在:${b}`)}return{version:c,error:null}}catch(a){return{version:c,error:{phase:"entry",message:C(a)}}}}async function E(a,b){let[c,d]=await Promise.all([(0,i.realpath)(a),(0,i.realpath)(b)]),e=(0,j.relative)(c,d);if(e.startsWith("..")||(0,j.isAbsolute)(e))throw Error("插件能力资源必须位于 Package 目录内");let f=await (0,i.open)(d,"r");try{let a=Buffer.alloc(65537),{bytesRead:b}=await f.read(a,0,a.length,0);return{content:a.subarray(0,Math.min(b,65536)).toString("utf8"),truncated:b>65536}}finally{await f.close()}}function F(a,b,c){return{error:function(a){if(!a)return null;if(a.length<=32768)return a;let b=a.slice(0,32752);return(0,g.J8)(`${b}
4
4
  …(已截断)`,`${b}
5
- … (truncated)`)}(a?.error??c),extensions:a?.extensions??[],tools:a?.tools.map(a=>({name:a.name,label:a.label,state:a.state,description:a.description,promptSnippet:a.promptSnippet,promptGuidelineCount:a.promptGuidelineCount,promptGuidelinePreview:a.promptGuidelinePreview}))??[],skills:a?.skills.map(a=>({name:a.name,description:a.description,path:a.path,modelVisible:a.modelVisible}))??[],prompts:a?.prompts.map(a=>({name:a.name,description:a.description,path:a.path}))??[],themes:a?.themes??[],providers:a?.providers??[],piDesk:{methods:b?[...b.methods]:[],browserEntries:b?[...b.browserEntries]:[],messageDeclarations:b?[...b.messageDeclarations]:[]}}}class P{get restartRequired(){return this.deferredMaintenance.size>0}constructor(a,b=process.cwd(),c=(0,k.getAgentDir)()){this.workSessions=a,this.cwd=b,this.agentDir=c,this.operationTail=Promise.resolve(),this.operations=new Map,this.listeners=new Set,this.lifetime=new AbortController,this.disposed=!1,this.activeSource=null,this.sourceCache=null,this.capabilityCache=null,this.deferredMaintenance=new Map;const d=(0,h.createHash)("sha256").update(this.agentDir).digest("hex").slice(0,16);this.stagingRoot=(0,j.join)(this.cwd,"temp","pi",`plugin-management-${d}`),this.packageManagerCwd=(0,j.join)((0,f.M)(),"plugin-package-manager"),this.updates=new y.E(this.agentDir,this.packageManagerCwd,this.lifetime.signal),this.maintenanceError=process.env.PI_DESK_PLUGIN_MAINTENANCE_ERROR?.trim()||null,this.unsubscribeRuntime=(0,p.getL4PiGlobalPluginRuntime)().subscribeChanges(()=>this.publish()),this.staleStagingCleanup=(0,i.rm)(this.stagingRoot,{recursive:!0,force:!0}).catch(a=>{console.warn("[Pi Desk][PluginManagement] 清理上次中断的候选目录失败",{path:this.stagingRoot,errorName:a instanceof Error?a.name:"UnknownError"})})}list(a=!1){return this.assertOpen(),this.readSnapshot(a)}async batch(a){this.assertOpen();let b=[],c=new Set,d="add"===a.action||"update"===a.action?await this.readSources():null,e=[];for(let f of"add"===a.action?a.items:a.sources.map(a=>({source:a})))try{let g="add"===a.action?this.normalizeAddedSource(f.source):f.source,h=(0,m.LD)(g);if(c.has(h))throw new K("批量请求中包含重复来源");if(c.add(h),"add"===a.action){let{source:a,...b}=f;e.push(this.acceptMutation("add",g,d,!0,void 0,b))}else"update"===a.action?e.push(this.acceptMutation("update",g,d)):"del"===a.action?await this.del(g):await this.setUpdateTag(g,a.tag);b.push({source:f.source,error:null})}catch(a){b.push({source:f.source,error:C(a).slice(0,4e3)})}return e.length>0&&this.enqueueMutations(e),{snapshot:await this.readSnapshot(!1),results:b}}subscribe(a){return this.assertOpen(),this.listeners.add(a),()=>this.listeners.delete(a)}get(a){return this.assertOpen(),this.readDetail(a)}add(a,b={}){return this.mutate("add",this.normalizeAddedSource(a),!1,void 0,b)}setEnabled(a,b){return this.mutate(b?"enable":"disable",a)}async update(a){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不执行插件维护");this.assertSourceIdle(a);let b=(await this.readSources()).sources.find(b=>(0,m.LD)(b.source)===(0,m.LD)(a));if(!b)throw new J(a);if((0,m.ug)(b.source)){let a=await this.readSnapshot({checkUpdates:!0,sources:[b.source]}),c=a.plugins.find(a=>a.source===b.source);if(c.updateError)throw new L(c.updateError);if(!0!==c.updateAvailable)return a}return this.mutate("update",b.source)}reinstall(a,b,c={}){return this.mutate("add",this.normalizeAddedSource(a),!0,b,c)}async setUpdateTag(a,b){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不执行插件维护");let c=(await this.readSources()).sources.find(b=>(0,m.LD)(b.source)===(0,m.LD)(a));if(!c)throw new J(a);if("package"!==c.kind||!(0,m.ug)(c.source))throw new L("只有 npm 插件包支持更新渠道");this.assertSourceIdle(c.source),(0,o.ks)(c.source,m.mR.parse(b),this.agentDir),this.updates.clear(c.source),this.publish()}assertSourceIdle(a){let b=(0,m.LD)(a);if(this.activeSource&&(0,m.LD)(this.activeSource)===b||[...this.operations].some(([a,c])=>(0,m.LD)(a)===b&&"failed"!==c.phase))throw new K("该来源已有未完成的维护操作")}waitForOperations(a,b){return b=AbortSignal.any([b,this.lifetime.signal]),new Promise((c,d)=>{let e=()=>void 0,f=a=>{e(),b.removeEventListener("abort",g),a?d(a):c()},g=()=>f(Error(this.disposed?"插件管理已关闭":"发起命令的会话已关闭")),h=()=>{if(this.disposed)return f(Error("插件管理已关闭"));for(let b of a){let a=this.operations.get(b);if(a?.phase==="failed")return f(Error(a.message??"插件操作失败"));if(a?.phase==="waiting"&&this.activeSource!==b&&this.restartRequired)return f(Error(`插件尚未生效,需要在设置的插件管理中重启 Pi Desk。${a.message??""}`))}a.some(a=>this.operations.has(a)||this.activeSource===a)||f()};if(b.aborted)return g();e=this.subscribe(h),b.addEventListener("abort",g,{once:!0}),h()})}del(a){return this.mutate("del",a)}async apply(a){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不加载外部插件");if(a?.some(a=>this.deferredMaintenance.has(a)))throw new N;let b=await (0,p.getL4PiGlobalPluginRuntime)().scanSourceChanges(a);this.assertOpen();let c=b.filter(b=>{if(this.deferredMaintenance.has(b.source))return!1;let c=this.operations.get(b.source);if(!c||"failed"===c.phase)return!0;if(a)throw new K("该来源已有未完成操作");return!1}),d=new Set([...this.operations].filter(([,a])=>"failed"!==a.phase).map(([a])=>a));for(let a of c)d.add(a.source);if(d.size>32)throw new K("加载变更超过队列上限,请选择部分来源");for(let a of c){if(!this.operations.has(a.source)&&this.operations.size>=64){let a=[...this.operations].find(([,a])=>"failed"===a.phase);a&&this.operations.delete(a[0])}this.operations.set(a.source,{action:"apply",phase:"queued",message:null}),this.enqueueApply(a)}return this.publish(),this.readSnapshot(!1)}enqueueApply(a){this.runExclusive(async()=>{this.activeSource=a.source;try{this.setOperation(a.source,"checking",null),await this.probeSourceChange(a),this.assertOpen(),this.setOperation(a.source,"applying",null),await (0,p.getL4PiGlobalPluginRuntime)().applySourceChange(a),a.current?.path&&(0,u.tt)(a.current.path),a.previous?.path&&(0,u.tt)(a.previous.path),this.capabilityCache=null,this.workSessions.refreshPluginMessages(),this.operations.delete(a.source)}catch(b){this.setOperation(a.source,"failed",C(b))}finally{this.activeSource=null,this.sourceCache=null,this.publish()}}).catch(b=>{this.disposed||this.setOperation(a.source,"failed",C(b))})}async probeSourceChange(a){let b=a.current;if(!b||!b.enabled)return;if(b.error)throw new L(b.error);if(!b.path)throw new L("插件来源目录不存在");let c=performance.now();console.info("[Pi Desk][PluginManagement] 源码候选预检开始",{source:a.source});let d=(0,j.join)(this.stagingRoot,(0,h.randomUUID)()),e=(0,j.join)(d,"agent"),f=(0,j.join)(d,"workspace");await (0,i.mkdir)(e,{recursive:!0}),await (0,i.mkdir)(f,{recursive:!0});try{if(await (0,i.writeFile)((0,j.join)(e,"settings.json"),JSON.stringify({extensions:[b.path]}),"utf8"),b.piDeskRoot||b.nativePaths.length>0){let c=await (0,w.Y)(f,e,b.nativePaths.length>0),d=c.loadError??c.packages.find(a=>"failed"===a.status)?.error?.message;if(d)throw new L(d);if(b.piDeskRoot&&!c.packages.some(a=>"ready"===a.status))throw new L("预检未加载到候选 Node Entry,放弃本次变更");for(let b of c.packages)if(b.pluginName&&(0,p.getL4PiGlobalPluginRuntime)().readDiagnostics().packages.some(c=>c.source!==a.source&&"ready"===c.status&&c.pluginName===b.pluginName))throw new L(`插件名冲突:${b.pluginName}`)}this.assertOpen()}finally{await (0,i.rm)(d,{recursive:!0,force:!0}),console.info("[Pi Desk][PluginManagement] 源码候选预检结束",{source:a.source,durationMs:Math.round(performance.now()-c)})}}reload(a){return this.activeSource||[...this.operations].some(([a,b])=>"failed"!==b.phase&&!this.deferredMaintenance.has(a))?Promise.reject(new K("维护仍在执行或等待,请先完成当前操作")):this.runExclusive(async()=>(this.assertRestartAvailable(),this.restartWhenQuiet(a)))}async mutate(a,b,c=!1,d,e={}){this.assertOpen();let f=await this.readSources(),g=this.acceptMutation(a,b,f,c,d,e);return this.enqueueMutations([g]),this.readSnapshot(!1)}acceptMutation(a,b,c,d=!1,f,g={}){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不执行插件维护,请通过基础聊天修复或正常启动后维护");let h=c.sources.find(a=>(0,m.LD)(a.source)===(0,m.LD)(b));if("add"!==a){if(!h)throw new J(b);if("package"!==h.kind&&"enable"!==a&&"disable"!==a)throw new L("裸扩展不是已安装包,请编辑源码后加载变更;此操作不会删除源码")}let i=(f??=h?.source)??b;if(g.tag&&!(0,m.ug)(b))throw new L("只有 npm 插件包支持更新渠道");for(let a of[b,i])this.assertSourceIdle(a);if([...this.operations.values()].filter(a=>"failed"!==a.phase).length>=32)throw new K("插件维护队列已满,请等待当前操作完成");if(this.operations.size>=64){let a=[...this.operations].find(([,a])=>"failed"===a.phase);a&&this.operations.delete(a[0])}return f&&f!==b&&this.operations.get(f)?.phase==="failed"&&this.operations.delete(f),this.operations.set(i,{action:a,phase:"queued",message:null}),this.updates.clear(i),this.updates.clear(b),{mutation:a,source:b,operationSource:i,reinstall:d,options:g}}enqueueMutations(a){this.runExclusive(async()=>{let b=performance.now(),c=await Promise.all(a.map(async a=>{try{let b=await this.prepareMutation(a);return this.assertOpen(),this.setOperation(a.operationSource,"queued","候选检查完成,等待应用"),{input:a,prepared:b}}catch(b){return this.setOperation(a.operationSource,"failed",C(b)),null}}));for(let d of(a.length>1&&console.info("[Pi Desk][PluginManagement] 批量并行准备收尾",{count:a.length,failedCount:c.filter(a=>null===a).length,durationMs:Math.round(performance.now()-b)}),c)){if(!d)continue;let{input:a,prepared:b}=d,{source:c,operationSource:e}=a;this.activeSource=e;try{this.assertOpen(),b&&await this.executeMutation(a,b),this.deferredMaintenance.has(e)||this.operations.delete(e)}catch(a){this.setOperation(e,"failed",C(a))}finally{this.updates.clear(e),this.updates.clear(c),this.sourceCache=null,this.activeSource=null,this.publish()}}}).catch(b=>{if(!this.disposed)for(let c of a)this.setOperation(c.operationSource,"failed",C(b))}),this.publish()}async prepareMutation(a){let{mutation:b,source:c,operationSource:d,reinstall:e,options:f}=a;this.assertOpen();let g=this.createPackageManager();this.throwSettingsErrors(g.settingsManager);let h=g.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope),i=h.find(a=>a.source===d),j=null,k=null,l=null;if("enable"!==b&&"disable"!==b){var n;let a=await (0,r.c)({agentDir:this.agentDir,configured:h,repairSource:"add"===b&&e?d:void 0});if(a)throw new M(a);if("add"!==b&&!i)throw new J(c);this.setOperation(d,"checking","正在确认插件版本和下载源");let g=this.candidateSource(c,i?.installedPath),o=(0,m.ug)(g),p="del"===b?{source:g,updateTag:null}:await this.updates.resolveInstall(g,d,f,"update"===b);if(k=p.updateTag,"update"===b&&o&&i?.installedPath){let a=await D(i.installedPath),b=p.source.slice(p.source.lastIndexOf("@")+1);if(!a.version)throw new L("无法读取插件已安装版本");if(!(0,m.zj)(b,a.version))return null}j={...o&&"del"!==b&&(e||i||"update"===b)?{action:"reinstall",source:p.source}:(n=p.source,{action:"add"===b?"install":"update"===b?"update":"remove",source:n}),..."registry"in p&&p.registry?{registry:p.registry}:{}},"del"!==b&&(l=await this.probeCandidate(p.source,j.registry))}return{request:j,updateTag:k,pluginName:l}}async executeMutation(a,b){let{mutation:c,source:d,operationSource:e}=a,{request:f,updateTag:g,pluginName:h}=b,i=(0,p.getL4PiGlobalPluginRuntime)(),j=a=>this.setOperation(e,"waiting",a);if(f&&(this.assertPluginNameAvailable(h,e),g&&((0,o.ks)(e,g,this.agentDir),this.updates.clear(e)),this.deferredMaintenance.size>0)){this.deferredMaintenance.set(e,f),j("等待重启后完成安装维护");return}this.assertOpen(),await i.withSourceIdle(e,async()=>{if(f){let b=this.createPackageManager();this.throwSettingsErrors(b.settingsManager);let d=b.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope),f=await (0,r.c)({agentDir:this.agentDir,configured:d,repairSource:"add"===c&&a.reinstall?e:void 0});if(f)throw new M(f)}if(this.assertOpen(),this.setOperation(e,"applying",f?.registry?`下载源:${f.registry}`:null),"enable"===c||"disable"===c){let a=(0,o.to)(this.agentDir).disabled.includes((0,m.LD)(d));(0,o.El)(d,"enable"===c,this.agentDir),this.sourceCache=null;try{if(await this.applyMutationSources([d],!0),"enable"===c&&!(await this.readSources()).sources.find(a=>a.source===d)?.enabled)throw new L("此插件仍被 Pi 配置排除,请先调整原有资源配置")}catch(b){throw(0,o.El)(d,!a,this.agentDir),this.sourceCache=null,b}}else if(f)try{await i.replaceSource(e,null),await (0,s.V)(async()=>{await (0,q.wC)({maintenance:f,agentDir:this.agentDir,cwd:this.packageManagerCwd}),"del"!==c&&await this.verifyInstalledPackage(f.source)}),this.sourceCache=null,await this.applyMutationSources([e,f.source],!1)}catch(a){if(a instanceof q.rZ&&"locked"===a.kind&&(0,x.k)())this.deferredMaintenance.set(e,f),j("文件正在被使用,需要重启后完成操作");else throw a}this.updates.clear(e),this.updates.clear(d),this.capabilityCache=null,this.workSessions.refreshPluginMessages()},this.lifetime.signal,j)}async verifyInstalledPackage(a){let b=this.createPackageManager();this.throwSettingsErrors(b.settingsManager);let c=(0,m.LD)(a),d=b.packageManager.listConfiguredPackages().find(a=>"user"===a.scope&&(0,m.LD)(a.source)===c);if(!d?.installedPath)throw new L("插件安装后没有有效目录");await this.verifyPackageVersion(a,d.installedPath)}async verifyPackageVersion(a,b){let c=await D(b);if(c.error)throw new L("string"==typeof c.error.message?c.error.message:c.error.message.default);if((0,m.ug)(a)){let b=a.slice(a.lastIndexOf("@")+1);if(c.version!==b)throw new L(`插件实际安装版本与目标不一致:${c.version??"未知"},目标 ${b}`)}}async applyMutationSources(a,b){let c=new Set(a.map(m.LD)),d=(0,p.getL4PiGlobalPluginRuntime)(),e=await d.scanSourceChanges(),f=await this.readSources(),g=[...new Set([...e.filter(a=>c.has((0,m.LD)(a.source))).map(a=>a.source),...f.sources.filter(a=>c.has((0,m.LD)(a.source))).map(a=>a.source)])];for(let a of g.length?await d.scanSourceChanges(g):[])b&&await this.probeSourceChange(a),await d.applySourceChange(a),a.current?.path&&(0,u.tt)(a.current.path),a.previous?.path&&(0,u.tt)(a.previous.path)}dispose(){this.disposed||(this.disposed=!0,this.lifetime.abort(),this.unsubscribeRuntime(),this.listeners.clear())}assertOpen(){if(this.disposed)throw new K("插件管理已关闭")}setOperation(a,b,c){let d=this.operations.get(a);if(!d)return;let e=c?.slice(0,4e3)??null;(d.phase!==b||d.message!==e)&&(this.operations.set(a,{...d,phase:b,message:e}),"failed"===b&&console.warn("[Pi Desk][PluginManagement] 插件操作失败",{source:a,action:d.action,message:e}),this.publish())}publish(){if(!this.disposed)for(let a of this.listeners)try{a()}catch(a){console.warn("[Pi Desk][PluginManagement] 状态监听失败",{message:C(a)})}}async readSources(){let a=()=>null!==this.activeSource&&this.operations.get(this.activeSource)?.phase==="applying";if(a()&&this.sourceCache)return this.sourceCache;let b=await (0,t.o)(this.packageManagerCwd,this.agentDir,{DefaultPackageManager:k.DefaultPackageManager,SettingsManager:k.SettingsManager});return a()&&this.sourceCache||(this.sourceCache=b),a()&&this.sourceCache?this.sourceCache:b}async probeCandidate(a,b){let c=(0,j.join)(this.stagingRoot,(0,h.randomUUID)()),d=(0,j.join)(c,"agent"),e=(0,j.join)(c,"workspace");await (0,i.mkdir)(e,{recursive:!0}),console.info("[Pi Desk][PluginManagement] 开始在隔离 AgentDir 预检候选插件",{source:a});try{if(!b&&(0,m.ug)(a))for(let b of[".npmrc",(0,j.join)("etc","npmrc")]){let c=(0,j.join)(d,"npm",b);await (0,i.mkdir)((0,j.dirname)(c),{recursive:!0});try{await (0,i.copyFile)((0,j.join)(this.agentDir,"npm",b),c),console.info("[Pi Desk][PluginManagement] 已为隔离预检继承本机 npm 配置",{source:a,configPath:b})}catch(a){if("ENOENT"!==a.code)throw new L(`无法继承本机 npm 配置(${b}):${C(a)}`)}}await (0,q.wC)({maintenance:{action:"install",source:a,...b?{registry:b}:{}},agentDir:d,cwd:e,signal:this.lifetime.signal}),this.assertOpen();let c=this.createPackageManager(d,e);this.throwSettingsErrors(c.settingsManager);let f=c.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope)[0];if(!f?.installedPath)throw new L("候选插件安装后没有有效目录");await this.verifyPackageVersion(a,f.installedPath);let g=await (0,w.Y)(e,d,!0,this.lifetime.signal);if(g.loadError)throw new L(g.loadError);let h=g.packages.find(a=>"failed"===a.status);if(h?.error)throw new L(h.error.message);let k=g.packages[0]?.pluginName??null;return this.assertOpen(),console.info("[Pi Desk][PluginManagement] 候选插件隔离预检通过",{source:a}),k}catch(a){if(a instanceof L)throw a;throw new L(C(a))}finally{await (0,i.rm)(c,{recursive:!0,force:!0}).catch(a=>{console.warn("[Pi Desk][PluginManagement] 清理候选插件目录失败",{path:c,errorName:a instanceof Error?a.name:"UnknownError"})})}}assertPluginNameAvailable(a,b){if(a&&(0,p.getL4PiGlobalPluginRuntime)().readDiagnostics().packages.some(c=>c.source!==b&&c.pluginName===a))throw new L(`pluginName 已由其他 Package 注册:${a}`)}restartWhenQuiet(a){return this.workSessions.runPluginRestart(async()=>{let b=(0,p.getL4PiGlobalPluginRuntime)(),c=await this.readSnapshot(!1);return await b.prepareReload(),console.info("[Pi Desk][PluginManagement] 插件 Runtime 已通过静默检查,准备重启",{deferredCount:this.deferredMaintenance.size}),(0,x.Z)("basic"===a||0===this.deferredMaintenance.size?void 0:[...this.deferredMaintenance.values()],a),c})}async readDetail(a){if((0,e.P)())throw new K("基础模式不执行插件能力盘点");let b=(await this.readSources()).sources.find(b=>b.source===a),c=b?await (0,t.W)(b):null;if(!c)throw new J(a);let d=await this.readCapabilities(!1),f=d.packages.find(b=>b.source===a);if(!f)throw Error(d.loadError??`插件能力详情不可用:${a}`);let[g,h]=await Promise.all([Promise.all(f.skills.map(async a=>({name:a.name,description:a.description,path:a.path,modelVisible:a.modelVisible,...await E(c,a.filePath)}))),Promise.all(f.prompts.map(async a=>({name:a.name,description:a.description,path:a.path,...await E(c,a.filePath)})))]);return l.tA.parse({source:a,readme:await (0,n.w$)(c),tools:f.tools.map(a=>({name:a.name,label:a.label,state:a.state,description:a.description,parameters:a.parameters,promptSnippet:a.promptSnippetDetail,promptGuidelines:a.promptGuidelines})),skills:g,prompts:h})}async readSnapshot(a){if((0,e.P)())return{plugins:[],restartRequired:!1,loadError:this.maintenanceError};let b=this.createPackageManager(),c=b.settingsManager.drainErrors().map(a=>a.error.message),d=b.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope),f=await (0,r.c)({agentDir:this.agentDir,configured:d}),h=await this.readSources(),i=await this.updates.read(h.sources,"boolean"==typeof a?{checkUpdates:a}:a),j=(0,p.getL4PiGlobalPluginRuntime)(),k=j.readDiagnostics(),n=new Map(k.packages.map(a=>[a.source,a])),q=(0,u.u7)(),s=this.capabilityCache??{packages:[],loadError:null},t=new Map(s.packages.map(a=>[a.source,a])),v=new Map(j.readCapabilityRegistrations().map(a=>[a.source,a])),w=await Promise.all(h.sources.map(async a=>{let b=n.get(a.source),c=a.path?this.findNativeDiagnostic(a.path,q):null,d=(a.error?{phase:"package"===a.kind?"package":"entry",message:a.error}:null)??(b?.status==="failed"?b.error:null)??(c?{phase:"native",message:c}:null);return{source:a.source,kind:a.kind,operation:this.operationFor(a.source),pluginName:b?.pluginName??null,description:a.description,version:a.version??b?.version??null,updateAvailable:i.get(a.source)?.updateAvailable??null,updateTag:i.get(a.source)?.updateTag??null,availableVersion:i.get(a.source)?.availableVersion??null,updateError:i.get(a.source)?.updateError??null,status:a.enabled?d?"failed":b?.status==="ready"?"ready":"available":"disabled",error:d,capabilities:F(t.get(a.source),v.get(a.source),s.loadError)}}));for(let[a,b]of this.operations)w.some(b=>(0,m.LD)(b.source)===(0,m.LD)(a))||w.push({source:a,kind:"package",operation:b,pluginName:null,description:null,version:null,updateAvailable:null,updateTag:(0,m.ug)(a)?(0,o.ey)(a,this.agentDir):null,availableVersion:null,updateError:null,status:"failed"===b.phase?"failed":"available",error:null,capabilities:F(void 0,void 0,null)});return l.oP.parse({plugins:w.sort((a,b)=>a.source.localeCompare(b.source)),restartRequired:this.restartRequired,loadError:function(a){let b=[...new Map(a.flatMap(a=>{let b=("string"==typeof a?a:a.message).trim();return b?[[b,{defaultText:b,englishText:"string"==typeof a?b:a.englishMessage.trim()}]]:[]})).values()];if(0===b.length)return null;let c=b.map(a=>a.defaultText).join("; ");return b.every(a=>a.defaultText===a.englishText)?c:(0,g.J8)(c,b.map(a=>a.englishText).join("; "))}([...c,...h.errors,...k.loadError?[k.loadError]:[],...this.maintenanceError?[this.maintenanceError]:[],...f?[f]:[]])})}async readCapabilities(a){if(!a&&this.capabilityCache)return this.capabilityCache;try{return this.capabilityCache=await (0,s.V)(()=>(this.assertOpen(),!a&&this.capabilityCache)?Promise.resolve(this.capabilityCache):(0,v.a)(this.cwd,this.agentDir)),this.publish(),console.info("[Pi Desk][PluginManagement] 插件能力盘点完成",{packageCount:this.capabilityCache.packages.length,hasLoadError:null!==this.capabilityCache.loadError}),this.capabilityCache}catch(b){let a=C(b);return console.warn("[Pi Desk][PluginManagement] 插件能力盘点失败",{errorName:b instanceof Error?b.name:"UnknownError",message:a}),this.capabilityCache={packages:[],loadError:a},this.publish(),this.capabilityCache}}findNativeDiagnostic(a,b){let c,d=(c=(0,j.resolve)(a).replaceAll("\\","/"),"win32"===process.platform?c.toLowerCase():c),e=b.find(a=>("win32"===process.platform?a.message.replaceAll("\\","/").toLowerCase():a.message.replaceAll("\\","/")).includes(d));return e?.message??null}createPackageManager(a=this.agentDir,b=this.packageManagerCwd){let c=k.SettingsManager.create(b,a,{projectTrusted:!1});return{settingsManager:c,packageManager:new k.DefaultPackageManager({cwd:b,agentDir:a,settingsManager:c})}}candidateSource(a,b){return(0,j.isAbsolute)(a)||/^(?:[a-z][a-z0-9+.-]*:|git@)/i.test(a)?a:b?(0,j.resolve)(b):(0,j.resolve)(this.agentDir,a)}operationFor(a){let b=(0,m.LD)(a);return[...this.operations].find(([a])=>(0,m.LD)(a)===b)?.[1]??null}normalizeAddedSource(a){return/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*(?:@[^\s/]+)?$/i.test(a)?`npm:${a}`:(0,j.isAbsolute)(a)||/^(?:[a-z][a-z0-9+.-]*:|git@)/i.test(a)?a:(0,j.resolve)(this.cwd,a)}throwSettingsErrors(a){let b=a.drainErrors();if(0!==b.length)throw Error(b.map(a=>a.error.message).join("; "))}assertRestartAvailable(){if(!(0,x.k)())throw new O}runExclusive(a){let b=()=>this.staleStagingCleanup.then(()=>(this.assertOpen(),a())),c=this.operationTail.then(b,b);return this.operationTail=c.then(()=>void 0,()=>void 0),c}}function G(){globalThis.__piDeskPluginManagement?.dispose()}function H(a){globalThis.__piDeskPluginManagement||(globalThis.__piDeskPluginManagement=new P(a))}function I(){if(!globalThis.__piDeskPluginManagement)throw Error("插件管理尚未完成进程级装配");return globalThis.__piDeskPluginManagement}d()}catch(a){d(a)}})},53584:(a,b,c)=>{c.d(b,{a:()=>l});var d=c(76760),e=c(36153),f=c(86148),g=c(2472);let h="__PI_DESK_PLUGIN_CAPABILITIES__",i=e.Yj(),j=e.Ik({name:e.Yj(),description:e.Yj().nullable()}).strict(),k=e.Ik({packages:e.YO(e.Ik({source:e.Yj(),error:e.Yj().nullable(),extensions:e.YO(e.Ik({path:e.Yj(),events:e.YO(e.Ik({name:e.Yj(),count:e.ai().int().positive()}).strict()),commands:e.YO(j),shortcuts:e.YO(e.Ik({shortcut:e.Yj(),description:e.Yj().nullable()}).strict()),flags:e.YO(e.Ik({name:e.Yj(),type:e.k5(["boolean","string"]),description:e.Yj().nullable(),default:e.KC([e.zM(),e.Yj(),e.ch()])}).strict()),messageRenderers:e.YO(e.Yj()),entryRenderers:e.YO(e.Yj())}).strict()),tools:e.YO(e.Ik({name:e.Yj(),label:i,state:e.k5(["active","inactive","shadowed"]),description:i,parameters:e.g1(e.Yj(),e.Pq()),promptSnippet:i.nullable(),promptSnippetDetail:i.nullable(),promptGuidelines:e.YO(i),promptGuidelineCount:e.ai().int().nonnegative(),promptGuidelinePreview:i.nullable()}).strict()),skills:e.YO(e.Ik({name:e.Yj(),description:e.Yj(),path:e.Yj(),filePath:e.Yj(),modelVisible:e.zM()}).strict()),prompts:e.YO(e.Ik({name:e.Yj(),description:e.Yj(),path:e.Yj(),filePath:e.Yj()}).strict()),themes:e.YO(e.Ik({name:e.Yj(),path:e.Yj()}).strict()),providers:e.YO(e.Ik({name:e.Yj(),kind:e.k5(["config","native"])}).strict())}).strict()),loadError:e.Yj().nullable()}).strict();async function l(a,b){let c=(0,f.I)(),e=(0,d.join)(process.cwd(),"src","server","l4_foundation","pi","l4-pi-plugin-capability-probe-runner.mts"),{stdout:i,stderr:j,code:l}=await (0,g.i)({args:["--conditions=react-server","--import",c,e],agentDir:b,env:{PI_DESK_PLUGIN_CAPABILITY_AGENT_DIR:b,PI_DESK_PLUGIN_CAPABILITY_CWD:a},maxOutputBytes:4194304,timeoutMs:3e4,timeoutError:()=>Error("插件能力盘点超时"),cleanupError:(a,b)=>Error(`${a}
6
- 能力盘点进程树清理失败`,{cause:b})});if(0!==l)throw Error(j.trim()||`插件能力盘点进程退出码 ${l??"null"}`);let m=i.lastIndexOf(h);if(m<0)throw Error("插件能力盘点没有返回有效结果");let n=i.slice(m+h.length).split(/\r?\n/,1)[0];return k.parse(JSON.parse(n))}},64253:(a,b,c)=>{c.a(a,async(a,d)=>{try{let s;c.d(b,{B:()=>q,I:()=>r});var e=c(31421),f=c(73024),g=c(51455),h=c(76760),i=c(48161),j=c(57975),k=c(75430),l=a([k]);k=(l.then?(await l)():l)[0];let t=(0,j.promisify)(e.execFile);function m(a){return a.replace(/\$\{([^}]+)\}/g,(a,b)=>process.env[b]??a)}async function n(a,b){let c;try{let b=await (0,g.readFile)(a);if(b.length>262144)throw Error("npm 配置文件过大");c=b.toString("utf8")}catch(a){if("ENOENT"===a.code)return;throw a}for(let a of c.split(/\r?\n/)){let c=/^\s*([^;#][^=]*?)\s*=\s*(.*?)\s*$/.exec(a);if(!c)continue;let d=c[2].replace(/\s+[;#].*$/,"").replace(/^(['"])(.*)\1$/,"$2");b[c[1].trim()]=m(d)}}function o(a,b){return("win32"===process.platform?/^~[\\/]/:/^~\//).test(a)?(0,h.resolve)((0,i.homedir)(),a.slice(2)):(0,h.resolve)(b,a)}async function p(a,b){let c={};for(let[a,b]of Object.entries(process.env))if(void 0!==b&&""!==b&&/^npm_config_/i.test(a)){let d=a.slice(11);c[d.startsWith("//")?d:d.replace(/(?!^)_/g,"-").toLowerCase()]=m(b)}let d=function(){for(let a of[(0,h.dirname)(process.execPath),...(process.env.PATH??"").split("win32"===process.platform?";":":")])for(let b of[(0,h.join)(a,"node_modules/npm/bin/npm-cli.js"),(0,h.resolve)(a,"../lib/node_modules/npm/bin/npm-cli.js")])if((0,f.existsSync)(b))return b}(),e={};if(d)try{await (0,g.mkdir)(a,{recursive:!0});let c=await t(process.execPath,[d,"config","list","--json","--prefix",b],{cwd:a,timeout:4e3,maxBuffer:524288,windowsHide:!0});e=JSON.parse(c.stdout)}catch{console.warn("[Pi Desk][PluginRegistry] npm 有效配置读取失败,改用 npmrc 和环境配置")}let j={};d&&await n((0,h.resolve)((0,h.dirname)(d),"../npmrc"),j);let k="string"==typeof e.globalconfig?e.globalconfig:c.globalconfig??(0,h.join)(b,"etc/npmrc"),l="string"==typeof e.userconfig?e.userconfig:c.userconfig??(0,h.join)((0,i.homedir)(),".npmrc");for(let[d,f]of(await n(o(k,a),j),await n(o(l,a),j),!0!==e.global&&"true"!==c.global&&"global"!==e.location&&"global"!==c.location&&await n((0,h.join)(b,".npmrc"),j),Object.entries(e)))"string"!=typeof f||"(protected)"===f||/auth|password|username/i.test(d)||(j[d]=f);return{...j,...c}}function q(a=(0,k.getAgentDir)()){let b=process.env.PI_DESK_PACKAGE_MAINTENANCE_CWD??(0,h.join)(a,"pi-desk","plugin-package-manager"),c=(0,h.join)(a,"npm");if(!s||s.cwd!==b||s.prefix!==c||s.expires<=Date.now()){let a=p(b,c);s={cwd:b,prefix:c,expires:Date.now()+3e4,value:a},a.catch(()=>{s?.value===a&&(s=void 0)})}return s.value}function r(a,b){let c=`//${a.host}${a.pathname}`;for(let a of Object.keys(b).flatMap(a=>{let b=/^(\/\/.*\/):(?:_authToken|_auth|username|_password)$/i.exec(a);return b&&c.startsWith(b[1])?[b[1]]:[]}).sort((a,b)=>b.length-a.length)){let c=b[`${a}:_authToken`]??b[`${a}:_authtoken`];if(c&&!c.includes("${"))return`Bearer ${c}`;let d=b[`${a}:_auth`];if(d&&!d.includes("${"))return`Basic ${d}`;let e=b[`${a}:username`],f=b[`${a}:_password`];if(e&&f&&!f.includes("${"))return`Basic ${Buffer.from(`${e}:${Buffer.from(f,"base64").toString("utf8")}`).toString("base64")}`}let d=b.registry;if(d){let c=new URL(d);if(a.origin===c.origin&&a.pathname.startsWith(`${c.pathname.replace(/\/+$/,"")}/`)){let a=b._authToken??b._authtoken;if(a&&!a.includes("${"))return`Bearer ${a}`;if(b._auth&&!b._auth.includes("${"))return`Basic ${b._auth}`}}}d()}catch(a){d(a)}})},69371:(a,b,c)=>{c.d(b,{rZ:()=>g,wC:()=>h});var d=c(76760),e=c(86148),f=c(2472);class g extends Error{constructor(a,b,c){super(b.slice(-4e3)||`Pi Package 命令退出码 ${c??"null"}`),this.kind=a,this.output=b,this.exitCode=c,this.name="L4PiPackageMaintenanceError"}}async function h(a){let b=(0,e.I)(),c=(0,d.join)(process.cwd(),"src","server","l4_foundation","pi","l4-pi-package-maintenance-runner.mts"),{stdout:h,stderr:i,code:j}=await (0,f.i)({args:["--import",b,c,a.maintenance.action,a.maintenance.source,...a.maintenance.registry?[a.maintenance.registry]:[]],agentDir:a.agentDir,env:{PI_DESK_PACKAGE_MAINTENANCE_CWD:a.cwd},maxOutputBytes:1048576,timeoutMs:12e4,signal:a.signal,timeoutError:()=>new g("failed","包维护超过120秒,已停止;结果未确认,请检查配置后手动处理",null),cleanupError:(a,b)=>new g("failed",`维护进程树未确认释放:${b instanceof Error?b.message:String(b)}`,null)});if(0===j)return;let k=(i||h).trim();throw new g(function(a){let b=a.toLowerCase();if(b.includes("ebusy")||b.includes("etxtbsy")||b.includes("resource busy")||b.includes("being used by another process")||b.includes("used by another process")||b.includes("process cannot access the file because it is being used"))return"locked";let c=b.includes("eperm")||b.includes("eacces")||b.includes("operation not permitted"),d=/\b(unlink|rename|rmdir|rimraf|remove|cleanup)\b/.test(b);return c&&d?"locked":"failed"}(k),k,j)}},69375:(a,b,c)=>{c.d(b,{Od:()=>r,tU:()=>n,hE:()=>q,P9:()=>f,_G:()=>j,Vc:()=>i});var d=c(36153);d.Yj().uuid();let e=d.Ik({key:d.Yj().min(1).max(160),params:d.g1(d.Yj().min(1).max(80),d.KC([d.Yj().max(1e3),d.ai().finite()])).optional()}).strict(),f=4001,g=d.Yj().trim().min(1),h=d.Yj().uuid();function i(a){return Object.freeze({op:"req",path:g.parse(a.path),inputSchema:a.inputSchema,outputSchema:a.outputSchema,...void 0===a.timeoutMs?{}:{timeoutMs:d.ai().int().positive().parse(a.timeoutMs)}})}function j(a){return Object.freeze({op:"push",path:g.parse(a.path),bodySchema:a.bodySchema})}let k=d.Ik({op:d.eu("req"),path:g,requestId:h}).strict(),l=d.Ik({op:d.eu("resp"),path:g,requestId:h}).strict(),m=d.Ik({op:d.eu("push"),path:g}).strict(),n=d.Ik({head:k,body:d.Pq()}).strict(),o=d.Ik({head:l,body:d.Ik({code:d.eu(0),msg:d.eu(""),data:d.Pq()}).strict()}).strict(),p=d.Ik({head:l,body:d.Ik({code:d.ai().int().positive(),msg:d.Yj().min(1),data:d.ch(),i18n:e.optional()}).strict()}).strict(),q=d.KC([o,p]),r=d.Ik({head:m,body:d.Pq()}).strict()},72497:(a,b,c)=>{c.d(b,{Dz:()=>h,f7:()=>g,tv:()=>f});var d=c(36153);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=e,g=e,h=d.g1(d.Yj(),d.Pq());d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/);let i=d.k5(["plugin","server","rocket","settings","panel","message","terminal","file","folder","bot","wrench","database","globe"]);d.gM("type",[d.Ik({type:d.eu("builtin"),name:i}).strict(),d.Ik({type:d.eu("svg"),content:d.Yj().trim().min(1).max(16384)}).strict()])},73159:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{NL:()=>h,XH:()=>j,Yq:()=>i});var e=c(77598),f=c(64253),g=a([f]);f=(g.then?(await g)():g)[0];class j extends Error{constructor(a,b=502,c="invalid"){super(a),this.status=b,this.reason=c,this.name="L4PluginRegistryError"}}let k=new Map,l=0;async function h(a,b){b.signal?.throwIfAborted();let c=!1===b.auth?{}:await (0,f.B)(b.agentDir),d=(0,f.I)(a,c),g=`${a.href}:${b.limit}:${(0,e.createHash)("sha256").update(d??"").digest("hex")}`,h=k.get(g);if(!1!==b.cache&&h&&h.expires>Date.now())return h.body;let i=AbortSignal.any([AbortSignal.timeout(b.timeout??1e4),...b.signal?[b.signal]:[]]),m=a;try{for(let a=0;a<=3;a++){let d=(0,f.I)(m,c),e=await fetch(m,{signal:i,redirect:"manual",headers:d?{Authorization:d}:{}});if([301,302,303,307,308].includes(e.status)){await e.body?.cancel();let b=e.headers.get("location");if(!b||3===a)throw new j("插件源重定向无效");let c=new URL(b,m);if(!["http:","https:"].includes(c.protocol)||c.username||c.password||"https:"===m.protocol&&"https:"!==c.protocol)throw new j("插件源重定向不安全");m=c;continue}if(!e.ok){await e.body?.cancel();let a=404===e.status?"missing":[401,403].includes(e.status)?"denied":e.status>=500?"network":"invalid";throw new j(`插件源请求失败(HTTP ${e.status})`,e.status,a)}if(Number(e.headers.get("content-length")??0)>b.limit)throw await e.body?.cancel(),new j("插件源响应超过大小限制");let h=e.body?.getReader(),n=[],o=0;if(h)try{for(;;){let a=await h.read();if(a.done)break;if((o+=a.value.byteLength)>b.limit)throw new j("插件源响应超过大小限制");n.push(a.value)}}finally{await h.cancel().catch(()=>void 0),h.releaseLock()}let p=Buffer.concat(n);if(!1!==b.cache){for(let[a,b]of k)(b.expires<=Date.now()||a===g)&&(k.delete(a),l-=b.body.length);for(;k.size>=96||l+p.length>0x1800000;){let a=k.entries().next().value;if(!a)break;k.delete(a[0]),l-=a[1].body.length}p.length<=0x1800000&&(k.set(g,{body:p,expires:Date.now()+12e4}),l+=p.length)}return p}throw new j("插件源重定向过多")}catch(a){if(b.signal?.aborted)throw b.signal.reason;if(a instanceof j)throw a;throw new j("插件源网络连接失败或超时",502,"network")}}async function i(a,b,c){let d=await h(a,{limit:8388608,signal:b,agentDir:c});try{let a=JSON.parse(d.toString("utf8"));if(!a||"object"!=typeof a||Array.isArray(a))throw Error("invalid");return a}catch{throw new j("插件源返回的元数据格式无效")}}d()}catch(a){d(a)}})},75157:(a,b,c)=>{c.d(b,{c:()=>h});var d=c(51455),e=c(76760);function f(a){if(!a.startsWith("npm:"))return null;let b=a.slice(4).trim(),c=b.match(/^(@?[^@]+(?:\/[^@]+)?)(?:@(.+))?$/);return c?.[1]??(b||null)}async function g(a){try{return(await (0,d.stat)(a)).isDirectory()}catch{return!1}}async function h(a){let b=a.configured.flatMap(a=>{let b=f(a.source);return b?[{name:b,item:a}]:[]}),c=(0,e.join)(a.agentDir,"npm","package.json"),h={};try{let a=JSON.parse(await (0,d.readFile)(c,"utf8"));a.dependencies&&"object"==typeof a.dependencies&&(h=a.dependencies)}catch(c){if(0===b.length)return null;let a=c instanceof Error&&c.message?c.message:String(c);return{message:`Pi Package npm 根不可用:${a}`,englishMessage:`Pi Package npm root is unavailable: ${a}`,i18n:{key:"errors:pluginNpmRootUnavailable",params:{detail:a.slice(0,1e3)}}}}let i=a.repairSource?f(a.repairSource):null,j=b.filter(a=>a.name!==i),k=new Set(j.map(a=>a.name)),l=new Set(Object.keys(h)),m=[...k].filter(a=>!l.has(a)),n=[];for(let{name:a,item:b}of j)b.installedPath&&await g(b.installedPath)||n.push(a);if(0===m.length&&0===n.length)return null;let o=[m.length>0?`缺少声明:${m.join("、")}`:null,n.length>0?`缺少目录:${n.join("、")}`:null].filter(a=>null!==a),p=[m.length>0?`missing declarations: ${m.join(", ")}`:null,n.length>0?`missing folders: ${n.join(", ")}`:null].filter(a=>null!==a),q=m.length>0?n.length>0?"errors:pluginNpmRootMissingBoth":"errors:pluginNpmRootMissingDeclarations":"errors:pluginNpmRootMissingFolders";return{message:`Pi Package 配置与 npm 根不一致(${o.join(";")})`,englishMessage:`Pi Package configuration does not match the npm root (${p.join("; ")})`,i18n:{key:q,params:{declarations:m.join(", ").slice(0,1e3),folders:n.join(", ").slice(0,1e3)}}}}},76019:(a,b,c)=>{c.d(b,{J8:()=>f,fD:()=>g,qf:()=>e});var d=c(36153);let e=d.KC([d.Yj(),d.Ik({default:d.Yj(),translations:d.g1(d.Yj().min(1).max(35),d.Yj()).refine(a=>Object.keys(a).length<=16,"too many translations")}).strict()]);function f(a,b){return{default:a,translations:{en:b}}}function g(a,b){return"string"==typeof a?a:a.translations[b]??a.translations[b.split("-")[0]]??a.default}},78597:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{E:()=>k});var e=c(75430),f=c(4287),g=c(5235),h=c(34458),i=c(47154),j=a([e,g,h]);[e,g,h]=j.then?(await j)():j;class k{constructor(a,b,c){this.agentDir=a,this.cwd=b,this.signal=c,this.cache=new Map}async resolveInstall(a,b,c,d){let e=(0,f.ug)(a),i=e?/^npm:(?:@[^/]+\/)?[^@]+@([^@]+)$/.exec(a)?.[1]:void 0,j=i&&!/^v?\d+\./.test(i)&&f.mR.safeParse(i).success?i:null,k=e?d?(0,g.ey)(b,this.agentDir):c.tag??j??(0,g.ey)(b,this.agentDir):null,l=e&&k&&(d||!i)?`npm:${e}@${k}`:a;return{...await (0,h.dz)(l,{...c,agentDir:this.agentDir,signal:this.signal,cache:!d&&void 0}),updateTag:k}}clear(a){let b=(0,f.LD)(a);for(let[a,c]of this.cache)c.identity===b&&this.cache.delete(a)}async read(a,b){for(let[a,b]of this.cache)b.expiresAt<=Date.now()&&this.cache.delete(a);let c=b.sources?new Set(b.sources.map(f.LD)):null,d=new Map;for(let j of a){if("package"!==j.kind)continue;let a=(0,f.LD)(j.source),k=(0,f.ug)(j.source),l=k?(0,g.ey)(j.source,this.agentDir):null,m={updateTag:l,updateAvailable:null,availableVersion:null,updateError:null};d.set(j.source,m);let n=!0===b.checkUpdates&&(!c||c.has(a))&&(!b.tag||b.tag===l);if(k){if(!n&&![...this.cache.values()].some(b=>b.identity===a))continue;let b=null;try{let c=(0,g.to)(this.agentDir).downloadSource,e=await (0,h.qX)(k,{agentDir:this.agentDir,downloadSource:c});b=JSON.stringify([a,l,c.mode,e.registry,e.fallback]);let i=this.cache.get(b)?.value;if(n){if(!j.path||!j.version)throw Error("无法读取插件已安装版本");let d=await (0,h.dz)(`npm:${k}@${l}`,{downloadSource:c,agentDir:this.agentDir,signal:this.signal,cache:!1}),e=d.source.slice(d.source.lastIndexOf("@")+1);i={...m,availableVersion:e},this.store(b,a,i)}i&&d.set(j.source,{...i,updateAvailable:!i.updateError&&j.version&&i.availableVersion?(0,f.zj)(i.availableVersion,j.version):null})}catch(e){let c={...m,updateError:this.message(j.source,e)};d.set(j.source,c),b&&this.store(b,a,c)}}else if(/^(?:git:|https?:|git@)/.test(j.source)){let b=JSON.stringify([a,"git"]),c=this.cache.get(b)?.value;if(c&&d.set(j.source,c),!n)continue;try{let c=e.SettingsManager.inMemory({packages:[j.source]}),f=new e.DefaultPackageManager({agentDir:this.agentDir,cwd:this.cwd,settingsManager:c}),g=await (0,i.V)(()=>f.checkForAvailableUpdates()),h={...m,updateAvailable:g.some(a=>"user"===a.scope)};d.set(j.source,h),this.store(b,a,h)}catch(e){let c={...m,updateError:this.message(j.source,e)};d.set(j.source,c),this.store(b,a,c)}}}return d}store(a,b,c){for(this.cache.delete(a);this.cache.size>=128;){let a=this.cache.keys().next().value;if(void 0===a)break;this.cache.delete(a)}this.cache.set(a,{identity:b,expiresAt:Date.now()+3e5,value:c})}message(a,b){let c=(b instanceof Error?b.message:String(b)).slice(0,4e3);return console.warn("[Pi Desk][PluginManagement] 检查插件更新失败",{source:a,message:c}),this.clear(a),c}}d()}catch(a){d(a)}})},86148:(a,b,c)=>{function d(a){let b=a.replaceAll("\\","/");return"tsx"===b||/(?:^|\/)tsx(?:\/|$)/.test(b)}function e(a=process.execArgv){for(let b=0;b<a.length;b+=1){let c=a[b];if("--import"===c){let c=a[b+1];if(c&&d(c))return c;b+=1;continue}if(c.startsWith("--import=")){let a=c.slice(9);if(d(a))return a}}throw Error("Pi Desk 服务缺少 tsx loader,无法启动插件维护子进程")}c.d(b,{I:()=>e})},93951:(a,b,c)=>{c.d(b,{LC:()=>E,tA:()=>G,oP:()=>H});var d=c(36153),e=c(72497),f=c(76019),g=c(4287),h=c(69375);let i=g.SZ,j=g.w3;d.Ik({downloadSource:j,recommendedRegistry:i}).strict(),d.Ik({downloadSource:j}).strict(),d.Ik({query:d.Yj().trim().max(200).default(""),page:d.ai().int().min(1).max(100).default(1),kind:d.k5(["all","desk","pi"]).default("all"),registry:i.optional()}).strict(),d.Ik({name:d.Yj().trim().min(1).max(214).regex(/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*$/i),version:d.Yj().trim().min(1).max(128).optional(),registry:i.optional()}).strict();let k=d.Ik({name:d.Yj(),description:f.qf.nullable(),version:d.Yj(),publisher:d.Yj().nullable(),kind:d.k5(["desk","pi","unknown"]),official:d.zM(),registry:i}).strict();d.Ik({items:d.YO(k),hasMore:d.zM()}).strict(),k.extend({versions:d.YO(d.Yj()),readme:f.qf.nullable(),homepage:d.Yj().nullable(),repository:d.Yj().nullable(),compatible:d.zM().nullable(),compatibilityNote:d.Yj().nullable()}).strict();let l=d.Yj().trim().min(1).max(2048),m=g.mR,n=d.YO(l).min(1).max(32),o=d.Ik({phase:d.k5(["package","entry","setup","resources","resolve","native"]),message:f.qf.refine(a=>"string"==typeof a?a.length>0:a.default.length>0)}).strict(),p=d.Yj().trim().min(1).max(4096),q=d.Yj().trim().min(1).max(256),r=d.Yj().max(32768),s=d.Ik({name:q,label:r,state:d.k5(["active","inactive","shadowed"]),description:r,promptSnippet:r.nullable(),promptGuidelineCount:d.ai().int().nonnegative(),promptGuidelinePreview:r.nullable()}).strict(),t=d.Ik({name:q,label:r,state:d.k5(["active","inactive","shadowed"]),description:r,parameters:e.Dz,promptSnippet:r.nullable(),promptGuidelines:d.YO(r)}).strict(),u=d.Ik({path:p,events:d.YO(d.Ik({name:q,count:d.ai().int().positive()}).strict()),commands:d.YO(d.Ik({name:q,description:r.nullable()}).strict()),shortcuts:d.YO(d.Ik({shortcut:q,description:r.nullable()}).strict()),flags:d.YO(d.Ik({name:q,type:d.k5(["boolean","string"]),description:r.nullable(),default:d.KC([d.zM(),d.Yj(),d.ch()])}).strict()),messageRenderers:d.YO(q),entryRenderers:d.YO(q)}).strict(),v=d.Ik({name:q,description:r,path:p}).strict(),w=v.extend({modelVisible:d.zM()}).strict(),x=v.extend({content:d.Yj().max(65536),truncated:d.zM()}).strict(),y=x.extend({modelVisible:d.zM()}).strict(),z=d.Ik({name:q,path:p}).strict(),A=d.Ik({name:q,kind:d.k5(["config","native"])}).strict(),B=d.Ik({methods:d.YO(d.Ik({pluginName:q,method:q}).strict()),browserEntries:d.YO(d.Ik({pluginName:q}).strict()),messageDeclarations:d.YO(d.Ik({pluginName:q,declarationName:q,priority:d.ai().int().safe()}).strict())}).strict(),C=d.Ik({error:f.qf.refine(a=>"string"==typeof a?a.length<=32768:[a.default,...Object.values(a.translations)].every(a=>a.length<=32768)).nullable(),extensions:d.YO(u),tools:d.YO(s),skills:d.YO(w),prompts:d.YO(v),themes:d.YO(z),providers:d.YO(A),piDesk:B}).strict(),D=d.Ik({action:d.k5(["add","update","del","apply","enable","disable"]),phase:d.k5(["queued","checking","applying","waiting","failed"]),message:d.Yj().max(4e3).nullable()}).strict(),E=(0,h._G)({path:"plugins/management-update",bodySchema:d.Ik({}).strict()}),F=d.Ik({source:l,kind:d.k5(["package","extension"]).default("package"),operation:D.nullable().default(null),pluginName:d.Yj().trim().min(1).nullable(),description:f.qf.nullable().default(null),version:d.Yj().trim().min(1).nullable(),updateAvailable:d.zM().nullable(),updateTag:m.nullable().optional(),availableVersion:d.Yj().min(1).nullable().optional(),updateError:d.Yj().max(4e3).nullable().optional(),status:d.k5(["ready","available","disabled","failed"]),error:o.nullable(),capabilities:C}).strict(),G=d.Ik({source:l,readme:f.qf.nullable().default(null),tools:d.YO(t),skills:d.YO(y),prompts:d.YO(x)}).strict(),H=d.Ik({plugins:d.YO(F),restartRequired:d.zM(),loadError:f.qf.refine(a=>"string"==typeof a?a.length>0:a.default.length>0).nullable()}).strict();d.Ik({sources:d.YO(l).min(1).max(32).optional()}).strict(),d.Ik({}).strict().extend({mode:d.k5(["normal","basic"]).optional()}).strict(),d.Ik({checkUpdates:d.zM().optional(),sources:n.optional(),tag:m.optional()}).strict();let I=d.Ik({source:l}).strict(),J=I.extend({downloadSource:j.optional(),registry:i.optional(),tag:m.optional()}).strict();d.gM("action",[d.Ik({action:d.eu("add"),items:d.YO(J).min(1).max(32)}).strict(),d.Ik({action:d.eu("update"),sources:n}).strict(),d.Ik({action:d.eu("del"),sources:n}).strict(),d.Ik({action:d.eu("tag"),sources:n,tag:m}).strict()]),d.Ik({snapshot:H,results:d.YO(d.Ik({source:l,error:d.Yj().max(4e3).nullable()}).strict()).max(32)}).strict(),I.extend({enabled:d.zM()}).strict()},96783:(a,b,c)=>{c.d(b,{Y:()=>j});var d=c(76760),e=c(36153),f=c(86148),g=c(2472);let h="__PI_DESK_PLUGIN_PROBE__",i=e.Ik({packages:e.YO(e.Ik({source:e.Yj(),packageName:e.Yj().nullable(),version:e.Yj().nullable(),pluginName:e.Yj().nullable(),status:e.k5(["ready","failed"]),error:e.Ik({phase:e.k5(["package","entry","setup","resources","resolve"]),message:e.Yj()}).strict().nullable()}).strict()),loadError:e.Yj().nullable()}).strict();async function j(a,b,c=!1,e){let k=(0,f.I)(),l=(0,d.join)(process.cwd(),"src","server","l4_foundation","pi","l4-pi-plugin-probe-runner.mts"),{stdout:m,stderr:n,code:o}=await (0,g.i)({args:["--conditions=react-server","--import",k,l],agentDir:b,env:{PI_DESK_PLUGIN_PROBE_AGENT_DIR:b,PI_DESK_PLUGIN_PROBE_CWD:a,PI_DESK_PLUGIN_PROBE_NATIVE:c?"1":void 0},maxOutputBytes:1048576,timeoutMs:3e4,signal:e,timeoutError:()=>Error("插件预检超时"),cleanupError:(a,b)=>Error(`${a}
7
- 插件预检进程树清理失败`,{cause:b})});if(0!==o)throw Error(n.trim()||`插件预检进程退出码 ${o??"null"}`);let p=m.lastIndexOf(h);if(p<0)throw Error("插件预检没有返回有效结果");let q=m.slice(p+h.length).split(/\r?\n/,1)[0];return i.parse(JSON.parse(q))}}};
5
+ … (truncated)`)}(a?.error??c),extensions:a?.extensions??[],tools:a?.tools.map(a=>({name:a.name,label:a.label,state:a.state,description:a.description,promptSnippet:a.promptSnippet,promptGuidelineCount:a.promptGuidelineCount,promptGuidelinePreview:a.promptGuidelinePreview}))??[],skills:a?.skills.map(a=>({name:a.name,description:a.description,path:a.path,modelVisible:a.modelVisible}))??[],prompts:a?.prompts.map(a=>({name:a.name,description:a.description,path:a.path}))??[],themes:a?.themes??[],providers:a?.providers??[],piDesk:{methods:b?[...b.methods]:[],browserEntries:b?[...b.browserEntries]:[],messageDeclarations:b?[...b.messageDeclarations]:[]}}}class P{get restartRequired(){return this.deferredMaintenance.size>0}constructor(a,b=process.cwd(),c=(0,k.getAgentDir)()){this.workSessions=a,this.cwd=b,this.agentDir=c,this.operationTail=Promise.resolve(),this.operations=new Map,this.listeners=new Set,this.lifetime=new AbortController,this.disposed=!1,this.activeSource=null,this.sourceCache=null,this.capabilityCache=null,this.deferredMaintenance=new Map;const d=(0,h.createHash)("sha256").update(this.agentDir).digest("hex").slice(0,16);this.stagingRoot=(0,j.join)(this.cwd,"temp","pi",`plugin-management-${d}`),this.packageManagerCwd=(0,j.join)((0,f.M)(),"plugin-package-manager"),this.updates=new y.E(this.agentDir,this.packageManagerCwd,this.lifetime.signal),this.maintenanceError=process.env.PI_DESK_PLUGIN_MAINTENANCE_ERROR?.trim()||null,this.unsubscribeRuntime=(0,p.getL4PiGlobalPluginRuntime)().subscribeChanges(()=>this.publish()),this.staleStagingCleanup=(0,i.rm)(this.stagingRoot,{recursive:!0,force:!0}).catch(a=>{console.warn("[Pi Desk][PluginManagement] 清理上次中断的候选目录失败",{path:this.stagingRoot,errorName:a instanceof Error?a.name:"UnknownError"})})}list(a=!1){return this.assertOpen(),this.readSnapshot(a)}async batch(a){this.assertOpen();let b=[],c=new Set,d="add"===a.action||"update"===a.action?await this.readSources():null,e=[];for(let f of"add"===a.action?a.items:a.sources.map(a=>({source:a})))try{let g="add"===a.action?this.normalizeAddedSource(f.source):f.source,h=(0,m.LD)(g);if(c.has(h))throw new K("批量请求中包含重复来源");if(c.add(h),"add"===a.action){let{source:a,...b}=f;e.push(this.acceptMutation("add",g,d,!0,void 0,b))}else"update"===a.action?e.push(this.acceptMutation("update",g,d)):"del"===a.action?await this.del(g):await this.setUpdateTag(g,a.tag);b.push({source:f.source,error:null})}catch(a){b.push({source:f.source,error:C(a).slice(0,4e3)})}return e.length>0&&this.enqueueMutations(e),{snapshot:await this.readSnapshot(!1),results:b}}subscribe(a){return this.assertOpen(),this.listeners.add(a),()=>this.listeners.delete(a)}get(a){return this.assertOpen(),this.readDetail(a)}add(a,b={}){return this.mutate("add",this.normalizeAddedSource(a),!1,void 0,b)}setEnabled(a,b){return this.mutate(b?"enable":"disable",a)}async update(a){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不执行插件维护");this.assertSourceIdle(a);let b=(await this.readSources()).sources.find(b=>(0,m.LD)(b.source)===(0,m.LD)(a));if(!b)throw new J(a);if((0,m.ug)(b.source)){let a=await this.readSnapshot({checkUpdates:!0,sources:[b.source]}),c=a.plugins.find(a=>a.source===b.source);if(c.updateError)throw new L(c.updateError);if(!0!==c.updateAvailable)return a}return this.mutate("update",b.source)}reinstall(a,b,c={}){return this.mutate("add",this.normalizeAddedSource(a),!0,b,c)}async setUpdateTag(a,b){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不执行插件维护");let c=(await this.readSources()).sources.find(b=>(0,m.LD)(b.source)===(0,m.LD)(a));if(!c)throw new J(a);if("package"!==c.kind||!(0,m.ug)(c.source))throw new L("只有 npm 插件包支持更新渠道");this.assertSourceIdle(c.source),(0,o.ks)(c.source,m.mR.parse(b),this.agentDir),this.updates.clear(c.source),this.publish()}assertSourceIdle(a){let b=(0,m.LD)(a);if(this.activeSource&&(0,m.LD)(this.activeSource)===b||[...this.operations].some(([a,c])=>(0,m.LD)(a)===b&&"failed"!==c.phase))throw new K("该来源已有未完成的维护操作")}waitForOperations(a,b){return b=AbortSignal.any([b,this.lifetime.signal]),new Promise((c,d)=>{let e=()=>void 0,f=a=>{e(),b.removeEventListener("abort",g),a?d(a):c()},g=()=>f(Error(this.disposed?"插件管理已关闭":"发起命令的会话已关闭")),h=()=>{if(this.disposed)return f(Error("插件管理已关闭"));for(let b of a){let a=this.operations.get(b);if(a?.phase==="failed")return f(Error(a.message??"插件操作失败"));if(a?.phase==="waiting"&&this.activeSource!==b&&this.restartRequired)return f(Error(`插件尚未生效,需要在设置的插件管理中重启 Pi Desk。${a.message??""}`))}a.some(a=>this.operations.has(a)||this.activeSource===a)||f()};if(b.aborted)return g();e=this.subscribe(h),b.addEventListener("abort",g,{once:!0}),h()})}del(a){return this.mutate("del",a)}async apply(a){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不加载外部插件");if(a?.some(a=>this.deferredMaintenance.has(a)))throw new N;let b=await (0,p.getL4PiGlobalPluginRuntime)().scanSourceChanges(a);this.assertOpen();let c=b.filter(b=>{if(this.deferredMaintenance.has(b.source))return!1;let c=this.operations.get(b.source);if(!c||"failed"===c.phase)return!0;if(a)throw new K("该来源已有未完成操作");return!1}),d=new Set([...this.operations].filter(([,a])=>"failed"!==a.phase).map(([a])=>a));for(let a of c)d.add(a.source);if(d.size>32)throw new K("加载变更超过队列上限,请选择部分来源");for(let a of c){if(!this.operations.has(a.source)&&this.operations.size>=64){let a=[...this.operations].find(([,a])=>"failed"===a.phase);a&&this.operations.delete(a[0])}this.operations.set(a.source,{action:"apply",phase:"queued",message:null}),this.enqueueApply(a)}return this.publish(),this.readSnapshot(!1)}enqueueApply(a){this.runExclusive(async()=>{this.activeSource=a.source;try{this.setOperation(a.source,"checking",null),await this.probeSourceChange(a),this.assertOpen(),this.setOperation(a.source,"applying",null),await (0,p.getL4PiGlobalPluginRuntime)().applySourceChange(a),a.current?.path&&(0,u.tt)(a.current.path),a.previous?.path&&(0,u.tt)(a.previous.path),this.capabilityCache=null,this.operations.delete(a.source)}catch(b){this.setOperation(a.source,"failed",C(b))}finally{this.activeSource=null,this.sourceCache=null,this.publish()}}).catch(b=>{this.disposed||this.setOperation(a.source,"failed",C(b))})}async probeSourceChange(a){let b=a.current;if(!b||!b.enabled)return;if(b.error)throw new L(b.error);if(!b.path)throw new L("插件来源目录不存在");let c=performance.now();console.info("[Pi Desk][PluginManagement] 源码候选预检开始",{source:a.source});let d=(0,j.join)(this.stagingRoot,(0,h.randomUUID)()),e=(0,j.join)(d,"agent"),f=(0,j.join)(d,"workspace");await (0,i.mkdir)(e,{recursive:!0}),await (0,i.mkdir)(f,{recursive:!0});try{if(await (0,i.writeFile)((0,j.join)(e,"settings.json"),JSON.stringify({extensions:[b.path]}),"utf8"),b.piDeskRoot||b.nativePaths.length>0){let c=await (0,w.Y)(f,e,b.nativePaths.length>0),d=c.loadError??c.packages.find(a=>"failed"===a.status)?.error?.message;if(d)throw new L(d);if(b.piDeskRoot&&!c.packages.some(a=>"ready"===a.status))throw new L("预检未加载到候选 Node Entry,放弃本次变更");for(let b of c.packages)if(b.pluginName&&(0,p.getL4PiGlobalPluginRuntime)().readDiagnostics().packages.some(c=>c.source!==a.source&&"ready"===c.status&&c.pluginName===b.pluginName))throw new L(`插件名冲突:${b.pluginName}`)}this.assertOpen()}finally{await (0,i.rm)(d,{recursive:!0,force:!0}),console.info("[Pi Desk][PluginManagement] 源码候选预检结束",{source:a.source,durationMs:Math.round(performance.now()-c)})}}reload(a){return this.activeSource||[...this.operations].some(([a,b])=>"failed"!==b.phase&&!this.deferredMaintenance.has(a))?Promise.reject(new K("维护仍在执行或等待,请先完成当前操作")):this.runExclusive(async()=>(this.assertRestartAvailable(),this.restartWhenQuiet(a)))}async mutate(a,b,c=!1,d,e={}){this.assertOpen();let f=await this.readSources(),g=this.acceptMutation(a,b,f,c,d,e);return this.enqueueMutations([g]),this.readSnapshot(!1)}acceptMutation(a,b,c,d=!1,f,g={}){if(this.assertOpen(),(0,e.P)())throw new K("基础模式不执行插件维护,请通过基础聊天修复或正常启动后维护");let h=c.sources.find(a=>(0,m.LD)(a.source)===(0,m.LD)(b));if("add"!==a){if(!h)throw new J(b);if("package"!==h.kind&&"enable"!==a&&"disable"!==a)throw new L("裸扩展不是已安装包,请编辑源码后加载变更;此操作不会删除源码")}let i=(f??=h?.source)??b;if(g.tag&&!(0,m.ug)(b))throw new L("只有 npm 插件包支持更新渠道");for(let a of[b,i])this.assertSourceIdle(a);if([...this.operations.values()].filter(a=>"failed"!==a.phase).length>=32)throw new K("插件维护队列已满,请等待当前操作完成");if(this.operations.size>=64){let a=[...this.operations].find(([,a])=>"failed"===a.phase);a&&this.operations.delete(a[0])}return f&&f!==b&&this.operations.get(f)?.phase==="failed"&&this.operations.delete(f),this.operations.set(i,{action:a,phase:"queued",message:null}),this.updates.clear(i),this.updates.clear(b),{mutation:a,source:b,operationSource:i,reinstall:d,options:g}}enqueueMutations(a){this.runExclusive(async()=>{let b=performance.now(),c=await Promise.all(a.map(async a=>{try{let b=await this.prepareMutation(a);return this.assertOpen(),this.setOperation(a.operationSource,"queued","候选检查完成,等待应用"),{input:a,prepared:b}}catch(b){return this.setOperation(a.operationSource,"failed",C(b)),null}}));for(let d of(a.length>1&&console.info("[Pi Desk][PluginManagement] 批量并行准备收尾",{count:a.length,failedCount:c.filter(a=>null===a).length,durationMs:Math.round(performance.now()-b)}),c)){if(!d)continue;let{input:a,prepared:b}=d,{source:c,operationSource:e}=a;this.activeSource=e;try{this.assertOpen(),b&&await this.executeMutation(a,b),this.deferredMaintenance.has(e)||this.operations.delete(e)}catch(a){this.setOperation(e,"failed",C(a))}finally{this.updates.clear(e),this.updates.clear(c),this.sourceCache=null,this.activeSource=null,this.publish()}}}).catch(b=>{if(!this.disposed)for(let c of a)this.setOperation(c.operationSource,"failed",C(b))}),this.publish()}async prepareMutation(a){let{mutation:b,source:c,operationSource:d,reinstall:e,options:f}=a;this.assertOpen();let g=this.createPackageManager();this.throwSettingsErrors(g.settingsManager);let h=g.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope),i=h.find(a=>a.source===d),j=null,k=null,l=null;if("enable"!==b&&"disable"!==b){var n;let a=await (0,r.c)({agentDir:this.agentDir,configured:h,repairSource:"add"===b&&e?d:void 0});if(a)throw new M(a);if("add"!==b&&!i)throw new J(c);this.setOperation(d,"checking","正在确认插件版本和下载源");let g=this.candidateSource(c,i?.installedPath),o=(0,m.ug)(g),p="del"===b?{source:g,updateTag:null}:await this.updates.resolveInstall(g,d,f,"update"===b);if(k=p.updateTag,"update"===b&&o&&i?.installedPath){let a=await D(i.installedPath),b=p.source.slice(p.source.lastIndexOf("@")+1);if(!a.version)throw new L("无法读取插件已安装版本");if(!(0,m.zj)(b,a.version))return null}j={...o&&"del"!==b&&(e||i||"update"===b)?{action:"reinstall",source:p.source}:(n=p.source,{action:"add"===b?"install":"update"===b?"update":"remove",source:n}),..."registry"in p&&p.registry?{registry:p.registry}:{}},"del"!==b&&(l=await this.probeCandidate(p.source,j.registry))}return{request:j,updateTag:k,pluginName:l}}async executeMutation(a,b){let{mutation:c,source:d,operationSource:e}=a,{request:f,updateTag:g,pluginName:h}=b,i=(0,p.getL4PiGlobalPluginRuntime)(),j=a=>this.setOperation(e,"waiting",a);if(f&&(this.assertPluginNameAvailable(h,e),g&&((0,o.ks)(e,g,this.agentDir),this.updates.clear(e)),this.deferredMaintenance.size>0)){this.deferredMaintenance.set(e,f),j("等待重启后完成安装维护");return}this.assertOpen(),await i.withSourceIdle(e,async()=>{if(f){let b=this.createPackageManager();this.throwSettingsErrors(b.settingsManager);let d=b.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope),f=await (0,r.c)({agentDir:this.agentDir,configured:d,repairSource:"add"===c&&a.reinstall?e:void 0});if(f)throw new M(f)}if(this.assertOpen(),this.setOperation(e,"applying",f?.registry?`下载源:${f.registry}`:null),"enable"===c||"disable"===c){let a=(0,o.to)(this.agentDir).disabled.includes((0,m.LD)(d));(0,o.El)(d,"enable"===c,this.agentDir),this.sourceCache=null;try{if(await this.applyMutationSources([d],!0),"enable"===c&&!(await this.readSources()).sources.find(a=>a.source===d)?.enabled)throw new L("此插件仍被 Pi 配置排除,请先调整原有资源配置")}catch(b){throw(0,o.El)(d,!a,this.agentDir),this.sourceCache=null,b}}else if(f)try{await i.replaceSource(e,null),await (0,s.V)(async()=>{await (0,q.wC)({maintenance:f,agentDir:this.agentDir,cwd:this.packageManagerCwd}),"del"!==c&&await this.verifyInstalledPackage(f.source)}),this.sourceCache=null,await this.applyMutationSources([e,f.source],!1)}catch(a){if(a instanceof q.rZ&&"locked"===a.kind&&(0,x.k)())this.deferredMaintenance.set(e,f),j("文件正在被使用,需要重启后完成操作");else throw a}this.updates.clear(e),this.updates.clear(d),this.capabilityCache=null},this.lifetime.signal,j)}async verifyInstalledPackage(a){let b=this.createPackageManager();this.throwSettingsErrors(b.settingsManager);let c=(0,m.LD)(a),d=b.packageManager.listConfiguredPackages().find(a=>"user"===a.scope&&(0,m.LD)(a.source)===c);if(!d?.installedPath)throw new L("插件安装后没有有效目录");await this.verifyPackageVersion(a,d.installedPath)}async verifyPackageVersion(a,b){let c=await D(b);if(c.error)throw new L("string"==typeof c.error.message?c.error.message:c.error.message.default);if((0,m.ug)(a)){let b=a.slice(a.lastIndexOf("@")+1);if(c.version!==b)throw new L(`插件实际安装版本与目标不一致:${c.version??"未知"},目标 ${b}`)}}async applyMutationSources(a,b){let c=new Set(a.map(m.LD)),d=(0,p.getL4PiGlobalPluginRuntime)(),e=await d.scanSourceChanges(),f=await this.readSources(),g=[...new Set([...e.filter(a=>c.has((0,m.LD)(a.source))).map(a=>a.source),...f.sources.filter(a=>c.has((0,m.LD)(a.source))).map(a=>a.source)])];for(let a of g.length?await d.scanSourceChanges(g):[])b&&await this.probeSourceChange(a),await d.applySourceChange(a),a.current?.path&&(0,u.tt)(a.current.path),a.previous?.path&&(0,u.tt)(a.previous.path)}dispose(){this.disposed||(this.disposed=!0,this.lifetime.abort(),this.unsubscribeRuntime(),this.listeners.clear())}assertOpen(){if(this.disposed)throw new K("插件管理已关闭")}setOperation(a,b,c){let d=this.operations.get(a);if(!d)return;let e=c?.slice(0,4e3)??null;(d.phase!==b||d.message!==e)&&(this.operations.set(a,{...d,phase:b,message:e}),"failed"===b&&console.warn("[Pi Desk][PluginManagement] 插件操作失败",{source:a,action:d.action,message:e}),this.publish())}publish(){if(!this.disposed)for(let a of this.listeners)try{a()}catch(a){console.warn("[Pi Desk][PluginManagement] 状态监听失败",{message:C(a)})}}async readSources(){let a=()=>null!==this.activeSource&&this.operations.get(this.activeSource)?.phase==="applying";if(a()&&this.sourceCache)return this.sourceCache;let b=await (0,t.o)(this.packageManagerCwd,this.agentDir,{DefaultPackageManager:k.DefaultPackageManager,SettingsManager:k.SettingsManager});return a()&&this.sourceCache||(this.sourceCache=b),a()&&this.sourceCache?this.sourceCache:b}async probeCandidate(a,b){let c=(0,j.join)(this.stagingRoot,(0,h.randomUUID)()),d=(0,j.join)(c,"agent"),e=(0,j.join)(c,"workspace");await (0,i.mkdir)(e,{recursive:!0}),console.info("[Pi Desk][PluginManagement] 开始在隔离 AgentDir 预检候选插件",{source:a});try{if(!b&&(0,m.ug)(a))for(let b of[".npmrc",(0,j.join)("etc","npmrc")]){let c=(0,j.join)(d,"npm",b);await (0,i.mkdir)((0,j.dirname)(c),{recursive:!0});try{await (0,i.copyFile)((0,j.join)(this.agentDir,"npm",b),c),console.info("[Pi Desk][PluginManagement] 已为隔离预检继承本机 npm 配置",{source:a,configPath:b})}catch(a){if("ENOENT"!==a.code)throw new L(`无法继承本机 npm 配置(${b}):${C(a)}`)}}await (0,q.wC)({maintenance:{action:"install",source:a,...b?{registry:b}:{}},agentDir:d,cwd:e,signal:this.lifetime.signal}),this.assertOpen();let c=this.createPackageManager(d,e);this.throwSettingsErrors(c.settingsManager);let f=c.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope)[0];if(!f?.installedPath)throw new L("候选插件安装后没有有效目录");await this.verifyPackageVersion(a,f.installedPath);let g=await (0,w.Y)(e,d,!0,this.lifetime.signal);if(g.loadError)throw new L(g.loadError);let h=g.packages.find(a=>"failed"===a.status);if(h?.error)throw new L(h.error.message);let k=g.packages[0]?.pluginName??null;return this.assertOpen(),console.info("[Pi Desk][PluginManagement] 候选插件隔离预检通过",{source:a}),k}catch(a){if(a instanceof L)throw a;throw new L(C(a))}finally{await (0,i.rm)(c,{recursive:!0,force:!0}).catch(a=>{console.warn("[Pi Desk][PluginManagement] 清理候选插件目录失败",{path:c,errorName:a instanceof Error?a.name:"UnknownError"})})}}assertPluginNameAvailable(a,b){if(a&&(0,p.getL4PiGlobalPluginRuntime)().readDiagnostics().packages.some(c=>c.source!==b&&c.pluginName===a))throw new L(`pluginName 已由其他 Package 注册:${a}`)}restartWhenQuiet(a){return this.workSessions.runPluginRestart(async()=>{let b=(0,p.getL4PiGlobalPluginRuntime)(),c=await this.readSnapshot(!1);return await b.prepareReload(),console.info("[Pi Desk][PluginManagement] 插件 Runtime 已通过静默检查,准备重启",{deferredCount:this.deferredMaintenance.size}),(0,x.Z)("basic"===a||0===this.deferredMaintenance.size?void 0:[...this.deferredMaintenance.values()],a),c})}async readDetail(a){if((0,e.P)())throw new K("基础模式不执行插件能力盘点");let b=(await this.readSources()).sources.find(b=>b.source===a),c=b?await (0,t.W)(b):null;if(!c)throw new J(a);let d=await this.readCapabilities(!1),f=d.packages.find(b=>b.source===a);if(!f)throw Error(d.loadError??`插件能力详情不可用:${a}`);let[g,h]=await Promise.all([Promise.all(f.skills.map(async a=>({name:a.name,description:a.description,path:a.path,modelVisible:a.modelVisible,...await E(c,a.filePath)}))),Promise.all(f.prompts.map(async a=>({name:a.name,description:a.description,path:a.path,...await E(c,a.filePath)})))]);return l.tA.parse({source:a,readme:await (0,n.w$)(c),tools:f.tools.map(a=>({name:a.name,label:a.label,state:a.state,description:a.description,parameters:a.parameters,promptSnippet:a.promptSnippetDetail,promptGuidelines:a.promptGuidelines})),skills:g,prompts:h})}async readSnapshot(a){if((0,e.P)())return{plugins:[],restartRequired:!1,loadError:this.maintenanceError};let b=this.createPackageManager(),c=b.settingsManager.drainErrors().map(a=>a.error.message),d=b.packageManager.listConfiguredPackages().filter(a=>"user"===a.scope),f=await (0,r.c)({agentDir:this.agentDir,configured:d}),h=await this.readSources(),i=await this.updates.read(h.sources,"boolean"==typeof a?{checkUpdates:a}:a),j=(0,p.getL4PiGlobalPluginRuntime)(),k=j.readDiagnostics(),n=new Map(k.packages.map(a=>[a.source,a])),q=(0,u.u7)(),s=this.capabilityCache??{packages:[],loadError:null},t=new Map(s.packages.map(a=>[a.source,a])),v=new Map(j.readCapabilityRegistrations().map(a=>[a.source,a])),w=await Promise.all(h.sources.map(async a=>{let b=n.get(a.source),c=a.path?this.findNativeDiagnostic(a.path,q):null,d=(a.error?{phase:"package"===a.kind?"package":"entry",message:a.error}:null)??(b?.status==="failed"?b.error:null)??(c?{phase:"native",message:c}:null);return{source:a.source,kind:a.kind,operation:this.operationFor(a.source),pluginName:b?.pluginName??null,description:a.description,version:a.version??b?.version??null,updateAvailable:i.get(a.source)?.updateAvailable??null,updateTag:i.get(a.source)?.updateTag??null,availableVersion:i.get(a.source)?.availableVersion??null,updateError:i.get(a.source)?.updateError??null,status:a.enabled?d?"failed":b?.status==="ready"?"ready":"available":"disabled",error:d,capabilities:F(t.get(a.source),v.get(a.source),s.loadError)}}));for(let[a,b]of this.operations)w.some(b=>(0,m.LD)(b.source)===(0,m.LD)(a))||w.push({source:a,kind:"package",operation:b,pluginName:null,description:null,version:null,updateAvailable:null,updateTag:(0,m.ug)(a)?(0,o.ey)(a,this.agentDir):null,availableVersion:null,updateError:null,status:"failed"===b.phase?"failed":"available",error:null,capabilities:F(void 0,void 0,null)});return l.oP.parse({plugins:w.sort((a,b)=>a.source.localeCompare(b.source)),restartRequired:this.restartRequired,loadError:function(a){let b=[...new Map(a.flatMap(a=>{let b=("string"==typeof a?a:a.message).trim();return b?[[b,{defaultText:b,englishText:"string"==typeof a?b:a.englishMessage.trim()}]]:[]})).values()];if(0===b.length)return null;let c=b.map(a=>a.defaultText).join("; ");return b.every(a=>a.defaultText===a.englishText)?c:(0,g.J8)(c,b.map(a=>a.englishText).join("; "))}([...c,...h.errors,...k.loadError?[k.loadError]:[],...this.maintenanceError?[this.maintenanceError]:[],...f?[f]:[]])})}async readCapabilities(a){if(!a&&this.capabilityCache)return this.capabilityCache;try{return this.capabilityCache=await (0,s.V)(()=>(this.assertOpen(),!a&&this.capabilityCache)?Promise.resolve(this.capabilityCache):(0,v.a)(this.cwd,this.agentDir)),this.publish(),console.info("[Pi Desk][PluginManagement] 插件能力盘点完成",{packageCount:this.capabilityCache.packages.length,hasLoadError:null!==this.capabilityCache.loadError}),this.capabilityCache}catch(b){let a=C(b);return console.warn("[Pi Desk][PluginManagement] 插件能力盘点失败",{errorName:b instanceof Error?b.name:"UnknownError",message:a}),this.capabilityCache={packages:[],loadError:a},this.publish(),this.capabilityCache}}findNativeDiagnostic(a,b){let c,d=(c=(0,j.resolve)(a).replaceAll("\\","/"),"win32"===process.platform?c.toLowerCase():c),e=b.find(a=>("win32"===process.platform?a.message.replaceAll("\\","/").toLowerCase():a.message.replaceAll("\\","/")).includes(d));return e?.message??null}createPackageManager(a=this.agentDir,b=this.packageManagerCwd){let c=k.SettingsManager.create(b,a,{projectTrusted:!1});return{settingsManager:c,packageManager:new k.DefaultPackageManager({cwd:b,agentDir:a,settingsManager:c})}}candidateSource(a,b){return(0,j.isAbsolute)(a)||/^(?:[a-z][a-z0-9+.-]*:|git@)/i.test(a)?a:b?(0,j.resolve)(b):(0,j.resolve)(this.agentDir,a)}operationFor(a){let b=(0,m.LD)(a);return[...this.operations].find(([a])=>(0,m.LD)(a)===b)?.[1]??null}normalizeAddedSource(a){return/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*(?:@[^\s/]+)?$/i.test(a)?`npm:${a}`:(0,j.isAbsolute)(a)||/^(?:[a-z][a-z0-9+.-]*:|git@)/i.test(a)?a:(0,j.resolve)(this.cwd,a)}throwSettingsErrors(a){let b=a.drainErrors();if(0!==b.length)throw Error(b.map(a=>a.error.message).join("; "))}assertRestartAvailable(){if(!(0,x.k)())throw new O}runExclusive(a){let b=()=>this.staleStagingCleanup.then(()=>(this.assertOpen(),a())),c=this.operationTail.then(b,b);return this.operationTail=c.then(()=>void 0,()=>void 0),c}}function G(){globalThis.__piDeskPluginManagement?.dispose()}function H(a){globalThis.__piDeskPluginManagement||(globalThis.__piDeskPluginManagement=new P(a))}function I(){if(!globalThis.__piDeskPluginManagement)throw Error("插件管理尚未完成进程级装配");return globalThis.__piDeskPluginManagement}d()}catch(a){d(a)}})},53584:(a,b,c)=>{c.d(b,{a:()=>l});var d=c(76760),e=c(36153),f=c(86148),g=c(2472);let h="__PI_DESK_PLUGIN_CAPABILITIES__",i=e.Yj(),j=e.Ik({name:e.Yj(),description:e.Yj().nullable()}).strict(),k=e.Ik({packages:e.YO(e.Ik({source:e.Yj(),error:e.Yj().nullable(),extensions:e.YO(e.Ik({path:e.Yj(),events:e.YO(e.Ik({name:e.Yj(),count:e.ai().int().positive()}).strict()),commands:e.YO(j),shortcuts:e.YO(e.Ik({shortcut:e.Yj(),description:e.Yj().nullable()}).strict()),flags:e.YO(e.Ik({name:e.Yj(),type:e.k5(["boolean","string"]),description:e.Yj().nullable(),default:e.KC([e.zM(),e.Yj(),e.ch()])}).strict()),messageRenderers:e.YO(e.Yj()),entryRenderers:e.YO(e.Yj())}).strict()),tools:e.YO(e.Ik({name:e.Yj(),label:i,state:e.k5(["active","inactive","shadowed"]),description:i,parameters:e.g1(e.Yj(),e.Pq()),promptSnippet:i.nullable(),promptSnippetDetail:i.nullable(),promptGuidelines:e.YO(i),promptGuidelineCount:e.ai().int().nonnegative(),promptGuidelinePreview:i.nullable()}).strict()),skills:e.YO(e.Ik({name:e.Yj(),description:e.Yj(),path:e.Yj(),filePath:e.Yj(),modelVisible:e.zM()}).strict()),prompts:e.YO(e.Ik({name:e.Yj(),description:e.Yj(),path:e.Yj(),filePath:e.Yj()}).strict()),themes:e.YO(e.Ik({name:e.Yj(),path:e.Yj()}).strict()),providers:e.YO(e.Ik({name:e.Yj(),kind:e.k5(["config","native"])}).strict())}).strict()),loadError:e.Yj().nullable()}).strict();async function l(a,b){let c=(0,f.I)(),e=(0,d.join)(process.cwd(),"src","server","l4_foundation","pi","l4-pi-plugin-capability-probe-runner.mts"),{stdout:i,stderr:j,code:l}=await (0,g.i)({args:["--conditions=react-server","--import",c,e],agentDir:b,env:{PI_DESK_PLUGIN_CAPABILITY_AGENT_DIR:b,PI_DESK_PLUGIN_CAPABILITY_CWD:a},maxOutputBytes:4194304,timeoutMs:3e4,timeoutError:()=>Error("插件能力盘点超时")});if(0!==l)throw Error(j.trim()||`插件能力盘点进程退出码 ${l??"null"}`);let m=i.lastIndexOf(h);if(m<0)throw Error("插件能力盘点没有返回有效结果");let n=i.slice(m+h.length).split(/\r?\n/,1)[0];return k.parse(JSON.parse(n))}},64253:(a,b,c)=>{c.a(a,async(a,d)=>{try{let s;c.d(b,{B:()=>q,I:()=>r});var e=c(31421),f=c(73024),g=c(51455),h=c(76760),i=c(48161),j=c(57975),k=c(75430),l=a([k]);k=(l.then?(await l)():l)[0];let t=(0,j.promisify)(e.execFile);function m(a){return a.replace(/\$\{([^}]+)\}/g,(a,b)=>process.env[b]??a)}async function n(a,b){let c;try{let b=await (0,g.readFile)(a);if(b.length>262144)throw Error("npm 配置文件过大");c=b.toString("utf8")}catch(a){if("ENOENT"===a.code)return;throw a}for(let a of c.split(/\r?\n/)){let c=/^\s*([^;#][^=]*?)\s*=\s*(.*?)\s*$/.exec(a);if(!c)continue;let d=c[2].replace(/\s+[;#].*$/,"").replace(/^(['"])(.*)\1$/,"$2");b[c[1].trim()]=m(d)}}function o(a,b){return("win32"===process.platform?/^~[\\/]/:/^~\//).test(a)?(0,h.resolve)((0,i.homedir)(),a.slice(2)):(0,h.resolve)(b,a)}async function p(a,b){let c={};for(let[a,b]of Object.entries(process.env))if(void 0!==b&&""!==b&&/^npm_config_/i.test(a)){let d=a.slice(11);c[d.startsWith("//")?d:d.replace(/(?!^)_/g,"-").toLowerCase()]=m(b)}let d=function(){for(let a of[(0,h.dirname)(process.execPath),...(process.env.PATH??"").split("win32"===process.platform?";":":")])for(let b of[(0,h.join)(a,"node_modules/npm/bin/npm-cli.js"),(0,h.resolve)(a,"../lib/node_modules/npm/bin/npm-cli.js")])if((0,f.existsSync)(b))return b}(),e={};if(d)try{await (0,g.mkdir)(a,{recursive:!0});let c=await t(process.execPath,[d,"config","list","--json","--prefix",b],{cwd:a,timeout:4e3,maxBuffer:524288,windowsHide:!0});e=JSON.parse(c.stdout)}catch{console.warn("[Pi Desk][PluginRegistry] npm 有效配置读取失败,改用 npmrc 和环境配置")}let j={};d&&await n((0,h.resolve)((0,h.dirname)(d),"../npmrc"),j);let k="string"==typeof e.globalconfig?e.globalconfig:c.globalconfig??(0,h.join)(b,"etc/npmrc"),l="string"==typeof e.userconfig?e.userconfig:c.userconfig??(0,h.join)((0,i.homedir)(),".npmrc");for(let[d,f]of(await n(o(k,a),j),await n(o(l,a),j),!0!==e.global&&"true"!==c.global&&"global"!==e.location&&"global"!==c.location&&await n((0,h.join)(b,".npmrc"),j),Object.entries(e)))"string"!=typeof f||"(protected)"===f||/auth|password|username/i.test(d)||(j[d]=f);return{...j,...c}}function q(a=(0,k.getAgentDir)()){let b=process.env.PI_DESK_PACKAGE_MAINTENANCE_CWD??(0,h.join)(a,"pi-desk","plugin-package-manager"),c=(0,h.join)(a,"npm");if(!s||s.cwd!==b||s.prefix!==c||s.expires<=Date.now()){let a=p(b,c);s={cwd:b,prefix:c,expires:Date.now()+3e4,value:a},a.catch(()=>{s?.value===a&&(s=void 0)})}return s.value}function r(a,b){let c=`//${a.host}${a.pathname}`;for(let a of Object.keys(b).flatMap(a=>{let b=/^(\/\/.*\/):(?:_authToken|_auth|username|_password)$/i.exec(a);return b&&c.startsWith(b[1])?[b[1]]:[]}).sort((a,b)=>b.length-a.length)){let c=b[`${a}:_authToken`]??b[`${a}:_authtoken`];if(c&&!c.includes("${"))return`Bearer ${c}`;let d=b[`${a}:_auth`];if(d&&!d.includes("${"))return`Basic ${d}`;let e=b[`${a}:username`],f=b[`${a}:_password`];if(e&&f&&!f.includes("${"))return`Basic ${Buffer.from(`${e}:${Buffer.from(f,"base64").toString("utf8")}`).toString("base64")}`}let d=b.registry;if(d){let c=new URL(d);if(a.origin===c.origin&&a.pathname.startsWith(`${c.pathname.replace(/\/+$/,"")}/`)){let a=b._authToken??b._authtoken;if(a&&!a.includes("${"))return`Bearer ${a}`;if(b._auth&&!b._auth.includes("${"))return`Basic ${b._auth}`}}}d()}catch(a){d(a)}})},69371:(a,b,c)=>{c.d(b,{rZ:()=>g,wC:()=>h});var d=c(76760),e=c(86148),f=c(2472);class g extends Error{constructor(a,b,c){super(b.slice(-4e3)||`Pi Package 命令退出码 ${c??"null"}`),this.kind=a,this.output=b,this.exitCode=c,this.name="L4PiPackageMaintenanceError"}}async function h(a){let b=(0,e.I)(),c=(0,d.join)(process.cwd(),"src","server","l4_foundation","pi","l4-pi-package-maintenance-runner.mts"),{stdout:h,stderr:i,code:j}=await (0,f.i)({args:["--import",b,c,a.maintenance.action,a.maintenance.source,...a.maintenance.registry?[a.maintenance.registry]:[]],agentDir:a.agentDir,env:{PI_DESK_PACKAGE_MAINTENANCE_CWD:a.cwd},maxOutputBytes:1048576,timeoutMs:12e4,signal:a.signal,timeoutError:()=>new g("failed","包维护超过120秒,已停止;结果未确认,请检查配置后手动处理",null)});if(0===j)return;let k=(i||h).trim();throw new g(function(a){let b=a.toLowerCase();if(b.includes("ebusy")||b.includes("etxtbsy")||b.includes("resource busy")||b.includes("being used by another process")||b.includes("used by another process")||b.includes("process cannot access the file because it is being used"))return"locked";let c=b.includes("eperm")||b.includes("eacces")||b.includes("operation not permitted"),d=/\b(unlink|rename|rmdir|rimraf|remove|cleanup)\b/.test(b);return c&&d?"locked":"failed"}(k),k,j)}},69375:(a,b,c)=>{c.d(b,{Od:()=>r,tU:()=>n,hE:()=>q,P9:()=>f,_G:()=>j,Vc:()=>i});var d=c(36153);d.Yj().uuid();let e=d.Ik({key:d.Yj().min(1).max(160),params:d.g1(d.Yj().min(1).max(80),d.KC([d.Yj().max(1e3),d.ai().finite()])).optional()}).strict(),f=4001,g=d.Yj().trim().min(1),h=d.Yj().uuid();function i(a){return Object.freeze({op:"req",path:g.parse(a.path),inputSchema:a.inputSchema,outputSchema:a.outputSchema,...void 0===a.timeoutMs?{}:{timeoutMs:d.ai().int().positive().parse(a.timeoutMs)}})}function j(a){return Object.freeze({op:"push",path:g.parse(a.path),bodySchema:a.bodySchema})}let k=d.Ik({op:d.eu("req"),path:g,requestId:h}).strict(),l=d.Ik({op:d.eu("resp"),path:g,requestId:h}).strict(),m=d.Ik({op:d.eu("push"),path:g}).strict(),n=d.Ik({head:k,body:d.Pq()}).strict(),o=d.Ik({head:l,body:d.Ik({code:d.eu(0),msg:d.eu(""),data:d.Pq()}).strict()}).strict(),p=d.Ik({head:l,body:d.Ik({code:d.ai().int().positive(),msg:d.Yj().min(1),data:d.ch(),i18n:e.optional()}).strict()}).strict(),q=d.KC([o,p]),r=d.Ik({head:m,body:d.Pq()}).strict()},72497:(a,b,c)=>{c.d(b,{Dz:()=>h,f7:()=>g,tv:()=>f});var d=c(36153);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=e,g=e,h=d.g1(d.Yj(),d.Pq());d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/);let i=d.k5(["plugin","server","rocket","settings","panel","message","terminal","file","folder","bot","wrench","database","globe"]);d.gM("type",[d.Ik({type:d.eu("builtin"),name:i}).strict(),d.Ik({type:d.eu("svg"),content:d.Yj().trim().min(1).max(16384)}).strict()])},73159:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{NL:()=>h,XH:()=>j,Yq:()=>i});var e=c(77598),f=c(64253),g=a([f]);f=(g.then?(await g)():g)[0];class j extends Error{constructor(a,b=502,c="invalid"){super(a),this.status=b,this.reason=c,this.name="L4PluginRegistryError"}}let k=new Map,l=0;async function h(a,b){b.signal?.throwIfAborted();let c=!1===b.auth?{}:await (0,f.B)(b.agentDir),d=(0,f.I)(a,c),g=`${a.href}:${b.limit}:${(0,e.createHash)("sha256").update(d??"").digest("hex")}`,h=k.get(g);if(!1!==b.cache&&h&&h.expires>Date.now())return h.body;let i=AbortSignal.any([AbortSignal.timeout(b.timeout??1e4),...b.signal?[b.signal]:[]]),m=a;try{for(let a=0;a<=3;a++){let d=(0,f.I)(m,c),e=await fetch(m,{signal:i,redirect:"manual",headers:d?{Authorization:d}:{}});if([301,302,303,307,308].includes(e.status)){await e.body?.cancel();let b=e.headers.get("location");if(!b||3===a)throw new j("插件源重定向无效");let c=new URL(b,m);if(!["http:","https:"].includes(c.protocol)||c.username||c.password||"https:"===m.protocol&&"https:"!==c.protocol)throw new j("插件源重定向不安全");m=c;continue}if(!e.ok){await e.body?.cancel();let a=404===e.status?"missing":[401,403].includes(e.status)?"denied":e.status>=500?"network":"invalid";throw new j(`插件源请求失败(HTTP ${e.status})`,e.status,a)}if(Number(e.headers.get("content-length")??0)>b.limit)throw await e.body?.cancel(),new j("插件源响应超过大小限制");let h=e.body?.getReader(),n=[],o=0;if(h)try{for(;;){let a=await h.read();if(a.done)break;if((o+=a.value.byteLength)>b.limit)throw new j("插件源响应超过大小限制");n.push(a.value)}}finally{await h.cancel().catch(()=>void 0),h.releaseLock()}let p=Buffer.concat(n);if(!1!==b.cache){for(let[a,b]of k)(b.expires<=Date.now()||a===g)&&(k.delete(a),l-=b.body.length);for(;k.size>=96||l+p.length>0x1800000;){let a=k.entries().next().value;if(!a)break;k.delete(a[0]),l-=a[1].body.length}p.length<=0x1800000&&(k.set(g,{body:p,expires:Date.now()+12e4}),l+=p.length)}return p}throw new j("插件源重定向过多")}catch(a){if(b.signal?.aborted)throw b.signal.reason;if(a instanceof j)throw a;throw new j("插件源网络连接失败或超时",502,"network")}}async function i(a,b,c){let d=await h(a,{limit:8388608,signal:b,agentDir:c});try{let a=JSON.parse(d.toString("utf8"));if(!a||"object"!=typeof a||Array.isArray(a))throw Error("invalid");return a}catch{throw new j("插件源返回的元数据格式无效")}}d()}catch(a){d(a)}})},75157:(a,b,c)=>{c.d(b,{c:()=>h});var d=c(51455),e=c(76760);function f(a){if(!a.startsWith("npm:"))return null;let b=a.slice(4).trim(),c=b.match(/^(@?[^@]+(?:\/[^@]+)?)(?:@(.+))?$/);return c?.[1]??(b||null)}async function g(a){try{return(await (0,d.stat)(a)).isDirectory()}catch{return!1}}async function h(a){let b=a.configured.flatMap(a=>{let b=f(a.source);return b?[{name:b,item:a}]:[]}),c=(0,e.join)(a.agentDir,"npm","package.json"),h={};try{let a=JSON.parse(await (0,d.readFile)(c,"utf8"));a.dependencies&&"object"==typeof a.dependencies&&(h=a.dependencies)}catch(c){if(0===b.length)return null;let a=c instanceof Error&&c.message?c.message:String(c);return{message:`Pi Package npm 根不可用:${a}`,englishMessage:`Pi Package npm root is unavailable: ${a}`,i18n:{key:"errors:pluginNpmRootUnavailable",params:{detail:a.slice(0,1e3)}}}}let i=a.repairSource?f(a.repairSource):null,j=b.filter(a=>a.name!==i),k=new Set(j.map(a=>a.name)),l=new Set(Object.keys(h)),m=[...k].filter(a=>!l.has(a)),n=[];for(let{name:a,item:b}of j)b.installedPath&&await g(b.installedPath)||n.push(a);if(0===m.length&&0===n.length)return null;let o=[m.length>0?`缺少声明:${m.join("、")}`:null,n.length>0?`缺少目录:${n.join("、")}`:null].filter(a=>null!==a),p=[m.length>0?`missing declarations: ${m.join(", ")}`:null,n.length>0?`missing folders: ${n.join(", ")}`:null].filter(a=>null!==a),q=m.length>0?n.length>0?"errors:pluginNpmRootMissingBoth":"errors:pluginNpmRootMissingDeclarations":"errors:pluginNpmRootMissingFolders";return{message:`Pi Package 配置与 npm 根不一致(${o.join(";")})`,englishMessage:`Pi Package configuration does not match the npm root (${p.join("; ")})`,i18n:{key:q,params:{declarations:m.join(", ").slice(0,1e3),folders:n.join(", ").slice(0,1e3)}}}}},76019:(a,b,c)=>{c.d(b,{J8:()=>f,fD:()=>g,qf:()=>e});var d=c(36153);let e=d.KC([d.Yj(),d.Ik({default:d.Yj(),translations:d.g1(d.Yj().min(1).max(35),d.Yj()).refine(a=>Object.keys(a).length<=16,"too many translations")}).strict()]);function f(a,b){return{default:a,translations:{en:b}}}function g(a,b){return"string"==typeof a?a:a.translations[b]??a.translations[b.split("-")[0]]??a.default}},78597:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{E:()=>k});var e=c(75430),f=c(4287),g=c(5235),h=c(34458),i=c(47154),j=a([e,g,h]);[e,g,h]=j.then?(await j)():j;class k{constructor(a,b,c){this.agentDir=a,this.cwd=b,this.signal=c,this.cache=new Map}async resolveInstall(a,b,c,d){let e=(0,f.ug)(a),i=e?/^npm:(?:@[^/]+\/)?[^@]+@([^@]+)$/.exec(a)?.[1]:void 0,j=i&&!/^v?\d+\./.test(i)&&f.mR.safeParse(i).success?i:null,k=e?d?(0,g.ey)(b,this.agentDir):c.tag??j??(0,g.ey)(b,this.agentDir):null,l=e&&k&&(d||!i)?`npm:${e}@${k}`:a;return{...await (0,h.dz)(l,{...c,agentDir:this.agentDir,signal:this.signal,cache:!d&&void 0}),updateTag:k}}clear(a){let b=(0,f.LD)(a);for(let[a,c]of this.cache)c.identity===b&&this.cache.delete(a)}async read(a,b){for(let[a,b]of this.cache)b.expiresAt<=Date.now()&&this.cache.delete(a);let c=b.sources?new Set(b.sources.map(f.LD)):null,d=new Map;for(let j of a){if("package"!==j.kind)continue;let a=(0,f.LD)(j.source),k=(0,f.ug)(j.source),l=k?(0,g.ey)(j.source,this.agentDir):null,m={updateTag:l,updateAvailable:null,availableVersion:null,updateError:null};d.set(j.source,m);let n=!0===b.checkUpdates&&(!c||c.has(a))&&(!b.tag||b.tag===l);if(k){if(!n&&![...this.cache.values()].some(b=>b.identity===a))continue;let b=null;try{let c=(0,g.to)(this.agentDir).downloadSource,e=await (0,h.qX)(k,{agentDir:this.agentDir,downloadSource:c});b=JSON.stringify([a,l,c.mode,e.registry,e.fallback]);let i=this.cache.get(b)?.value;if(n){if(!j.path||!j.version)throw Error("无法读取插件已安装版本");let d=await (0,h.dz)(`npm:${k}@${l}`,{downloadSource:c,agentDir:this.agentDir,signal:this.signal,cache:!1}),e=d.source.slice(d.source.lastIndexOf("@")+1);i={...m,availableVersion:e},this.store(b,a,i)}i&&d.set(j.source,{...i,updateAvailable:!i.updateError&&j.version&&i.availableVersion?(0,f.zj)(i.availableVersion,j.version):null})}catch(e){let c={...m,updateError:this.message(j.source,e)};d.set(j.source,c),b&&this.store(b,a,c)}}else if(/^(?:git:|https?:|git@)/.test(j.source)){let b=JSON.stringify([a,"git"]),c=this.cache.get(b)?.value;if(c&&d.set(j.source,c),!n)continue;try{let c=e.SettingsManager.inMemory({packages:[j.source]}),f=new e.DefaultPackageManager({agentDir:this.agentDir,cwd:this.cwd,settingsManager:c}),g=await (0,i.V)(()=>f.checkForAvailableUpdates()),h={...m,updateAvailable:g.some(a=>"user"===a.scope)};d.set(j.source,h),this.store(b,a,h)}catch(e){let c={...m,updateError:this.message(j.source,e)};d.set(j.source,c),this.store(b,a,c)}}}return d}store(a,b,c){for(this.cache.delete(a);this.cache.size>=128;){let a=this.cache.keys().next().value;if(void 0===a)break;this.cache.delete(a)}this.cache.set(a,{identity:b,expiresAt:Date.now()+3e5,value:c})}message(a,b){let c=(b instanceof Error?b.message:String(b)).slice(0,4e3);return console.warn("[Pi Desk][PluginManagement] 检查插件更新失败",{source:a,message:c}),this.clear(a),c}}d()}catch(a){d(a)}})},86148:(a,b,c)=>{function d(a){let b=a.replaceAll("\\","/");return"tsx"===b||/(?:^|\/)tsx(?:\/|$)/.test(b)}function e(a=process.execArgv){for(let b=0;b<a.length;b+=1){let c=a[b];if("--import"===c){let c=a[b+1];if(c&&d(c))return c;b+=1;continue}if(c.startsWith("--import=")){let a=c.slice(9);if(d(a))return a}}throw Error("Pi Desk 服务缺少 tsx loader,无法启动插件维护子进程")}c.d(b,{I:()=>e})},93951:(a,b,c)=>{c.d(b,{LC:()=>E,tA:()=>G,oP:()=>H});var d=c(36153),e=c(72497),f=c(76019),g=c(4287),h=c(69375);let i=g.SZ,j=g.w3;d.Ik({downloadSource:j,recommendedRegistry:i}).strict(),d.Ik({downloadSource:j}).strict(),d.Ik({query:d.Yj().trim().max(200).default(""),page:d.ai().int().min(1).max(100).default(1),kind:d.k5(["all","desk","pi"]).default("all"),registry:i.optional()}).strict(),d.Ik({name:d.Yj().trim().min(1).max(214).regex(/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*$/i),version:d.Yj().trim().min(1).max(128).optional(),registry:i.optional()}).strict();let k=d.Ik({name:d.Yj(),description:f.qf.nullable(),version:d.Yj(),publisher:d.Yj().nullable(),kind:d.k5(["desk","pi","unknown"]),official:d.zM(),registry:i}).strict();d.Ik({items:d.YO(k),hasMore:d.zM()}).strict(),k.extend({versions:d.YO(d.Yj()),readme:f.qf.nullable(),homepage:d.Yj().nullable(),repository:d.Yj().nullable(),compatible:d.zM().nullable(),compatibilityNote:d.Yj().nullable()}).strict();let l=d.Yj().trim().min(1).max(2048),m=g.mR,n=d.YO(l).min(1).max(32),o=d.Ik({phase:d.k5(["package","entry","setup","resources","resolve","native"]),message:f.qf.refine(a=>"string"==typeof a?a.length>0:a.default.length>0)}).strict(),p=d.Yj().trim().min(1).max(4096),q=d.Yj().trim().min(1).max(256),r=d.Yj().max(32768),s=d.Ik({name:q,label:r,state:d.k5(["active","inactive","shadowed"]),description:r,promptSnippet:r.nullable(),promptGuidelineCount:d.ai().int().nonnegative(),promptGuidelinePreview:r.nullable()}).strict(),t=d.Ik({name:q,label:r,state:d.k5(["active","inactive","shadowed"]),description:r,parameters:e.Dz,promptSnippet:r.nullable(),promptGuidelines:d.YO(r)}).strict(),u=d.Ik({path:p,events:d.YO(d.Ik({name:q,count:d.ai().int().positive()}).strict()),commands:d.YO(d.Ik({name:q,description:r.nullable()}).strict()),shortcuts:d.YO(d.Ik({shortcut:q,description:r.nullable()}).strict()),flags:d.YO(d.Ik({name:q,type:d.k5(["boolean","string"]),description:r.nullable(),default:d.KC([d.zM(),d.Yj(),d.ch()])}).strict()),messageRenderers:d.YO(q),entryRenderers:d.YO(q)}).strict(),v=d.Ik({name:q,description:r,path:p}).strict(),w=v.extend({modelVisible:d.zM()}).strict(),x=v.extend({content:d.Yj().max(65536),truncated:d.zM()}).strict(),y=x.extend({modelVisible:d.zM()}).strict(),z=d.Ik({name:q,path:p}).strict(),A=d.Ik({name:q,kind:d.k5(["config","native"])}).strict(),B=d.Ik({methods:d.YO(d.Ik({pluginName:q,method:q}).strict()),browserEntries:d.YO(d.Ik({pluginName:q}).strict()),messageDeclarations:d.YO(d.Ik({pluginName:q,declarationName:q,priority:d.ai().int().safe()}).strict())}).strict(),C=d.Ik({error:f.qf.refine(a=>"string"==typeof a?a.length<=32768:[a.default,...Object.values(a.translations)].every(a=>a.length<=32768)).nullable(),extensions:d.YO(u),tools:d.YO(s),skills:d.YO(w),prompts:d.YO(v),themes:d.YO(z),providers:d.YO(A),piDesk:B}).strict(),D=d.Ik({action:d.k5(["add","update","del","apply","enable","disable"]),phase:d.k5(["queued","checking","applying","waiting","failed"]),message:d.Yj().max(4e3).nullable()}).strict(),E=(0,h._G)({path:"plugins/management-update",bodySchema:d.Ik({}).strict()}),F=d.Ik({source:l,kind:d.k5(["package","extension"]).default("package"),operation:D.nullable().default(null),pluginName:d.Yj().trim().min(1).nullable(),description:f.qf.nullable().default(null),version:d.Yj().trim().min(1).nullable(),updateAvailable:d.zM().nullable(),updateTag:m.nullable().optional(),availableVersion:d.Yj().min(1).nullable().optional(),updateError:d.Yj().max(4e3).nullable().optional(),status:d.k5(["ready","available","disabled","failed"]),error:o.nullable(),capabilities:C}).strict(),G=d.Ik({source:l,readme:f.qf.nullable().default(null),tools:d.YO(t),skills:d.YO(y),prompts:d.YO(x)}).strict(),H=d.Ik({plugins:d.YO(F),restartRequired:d.zM(),loadError:f.qf.refine(a=>"string"==typeof a?a.length>0:a.default.length>0).nullable()}).strict();d.Ik({sources:d.YO(l).min(1).max(32).optional()}).strict(),d.Ik({}).strict().extend({mode:d.k5(["normal","basic"]).optional()}).strict(),d.Ik({checkUpdates:d.zM().optional(),sources:n.optional(),tag:m.optional()}).strict();let I=d.Ik({source:l}).strict(),J=I.extend({downloadSource:j.optional(),registry:i.optional(),tag:m.optional()}).strict();d.gM("action",[d.Ik({action:d.eu("add"),items:d.YO(J).min(1).max(32)}).strict(),d.Ik({action:d.eu("update"),sources:n}).strict(),d.Ik({action:d.eu("del"),sources:n}).strict(),d.Ik({action:d.eu("tag"),sources:n,tag:m}).strict()]),d.Ik({snapshot:H,results:d.YO(d.Ik({source:l,error:d.Yj().max(4e3).nullable()}).strict()).max(32)}).strict(),I.extend({enabled:d.zM()}).strict()},96783:(a,b,c)=>{c.d(b,{Y:()=>j});var d=c(76760),e=c(36153),f=c(86148),g=c(2472);let h="__PI_DESK_PLUGIN_PROBE__",i=e.Ik({packages:e.YO(e.Ik({source:e.Yj(),packageName:e.Yj().nullable(),version:e.Yj().nullable(),pluginName:e.Yj().nullable(),status:e.k5(["ready","failed"]),error:e.Ik({phase:e.k5(["package","entry","setup","resources","resolve"]),message:e.Yj()}).strict().nullable()}).strict()),loadError:e.Yj().nullable()}).strict();async function j(a,b,c=!1,e){let k=(0,f.I)(),l=(0,d.join)(process.cwd(),"src","server","l4_foundation","pi","l4-pi-plugin-probe-runner.mts"),{stdout:m,stderr:n,code:o}=await (0,g.i)({args:["--conditions=react-server","--import",k,l],agentDir:b,env:{PI_DESK_PLUGIN_PROBE_AGENT_DIR:b,PI_DESK_PLUGIN_PROBE_CWD:a,PI_DESK_PLUGIN_PROBE_NATIVE:c?"1":void 0},maxOutputBytes:1048576,timeoutMs:3e4,signal:e,timeoutError:()=>Error("插件预检超时")});if(0!==o)throw Error(n.trim()||`插件预检进程退出码 ${o??"null"}`);let p=m.lastIndexOf(h);if(p<0)throw Error("插件预检没有返回有效结果");let q=m.slice(p+h.length).split(/\r?\n/,1)[0];return i.parse(JSON.parse(q))}}};
@@ -1 +1 @@
1
- "use strict";exports.id=6917,exports.ids=[6917],exports.modules={18:(a,b,c)=>{c.d(b,{FR:()=>m,kn:()=>l,zR:()=>k});var d=c(89409),e=c(25984);function f(a){return`${a.location.index}:${a.location.entryId}`}let g={user:["viewKey","hasDetail"],assistant:["viewKey","status","hasDetail","usage"],tool:["viewKey","status","hasDetail","usage"],bash:["viewKey","status","hasDetail"],custom:["viewKey","hasDetail"]};function h(a,b,c){if(!b)return a;let e={...a,...b};return"summary"===c?d.Hf.parse(e):d.D8.parse(e)}function i(a,b){if(Array.isArray(a.parent)){if("number"!=typeof a.key)throw Error("Increment array key is invalid");a.parent[a.key]=b;return}if("string"!=typeof a.key)throw Error("Increment object key is invalid");a.parent[a.key]=b}function j(a,b,c){let e=structuredClone(a),f=function(a,b){if(0===b.length)throw Error("Increment cannot append to the message layer root");let c=a;for(let a of b.slice(0,-1)){if("number"==typeof a){if(!Array.isArray(c)||a>=c.length)throw Error(`Increment array path does not exist: ${a}`);c=c[a];continue}if(!c||"object"!=typeof c||Array.isArray(c))throw Error(`Increment object path does not exist: ${a}`);if(!Object.hasOwn(c,a))throw Error(`Increment object field does not exist: ${a}`);c=c[a]}let d=b.at(-1);if("number"==typeof d){if(!Array.isArray(c)||d>=c.length)throw Error(`Increment array target does not exist: ${d}`);return{parent:c,key:d,value:c[d]}}if(!c||"object"!=typeof c||Array.isArray(c))throw Error(`Increment object target does not exist: ${d}`);if(!Object.hasOwn(c,d))throw Error(`Increment target does not exist: ${d}`);return{parent:c,key:d,value:c[d]}}(e,b);if("string"==typeof c){if("string"!=typeof f.value)throw Error("Increment target is not a string");return i(f,`${f.value}${c}`),d.Hf.parse(e)}if(!Array.isArray(f.value))throw Error("Increment target is not an array");return i(f,[...f.value,...c]),d.Hf.parse(e)}function k(a,b,c){let e=new Map(a.messages.filter(a=>void 0!==a.detail).map(a=>[f(a),a]));return{messages:b.map(a=>{let b=e.get(f(a));return a.fixed.hasDetail&&b&&b.fixed.type===a.fixed.type&&b.fixed.viewKey===a.fixed.viewKey&&void 0!==b.detail?d.mj.parse({...a,detail:b.detail}):a}),temporaryMessages:[...c]}}function l(a,b){if("message_start"===b.type){if(a.temporaryMessages.some(a=>a.location.tempId===b.snapshot.location.tempId))throw Error(`Temporary conversation message already exists: ${b.snapshot.location.tempId}`);return{...a,temporaryMessages:[...a.temporaryMessages,b.snapshot]}}let c=a.temporaryMessages.findIndex(a=>a.location.tempId===b.location.tempId);if(c<0)throw Error(`Temporary conversation message was not found: ${b.location.tempId}`);if("message_update"===b.type){let f=[...a.temporaryMessages];return f[c]=function(a,b){var c,f;if(a.location.tempId!==b.location.tempId)throw Error(`Conversation update tempId mismatch: ${b.location.tempId}`);let i=(c=a.fixed,(f=b.fixed)?(!function(a,b,c){let d=Object.keys(a).filter(a=>!b.includes(a));if(d.length>0)throw Error(`${c} patch contains fields invalid for the current message: ${d}`)}(f,g[c.type],`${c.type} fixed`),d.q5.parse({...c,...f})):c),k=h(a.summary,b.summary,"summary"),l=a.detail;if(void 0!==b.detail||Object.keys(b.increments??{}).some(a=>"detail"===(0,e.U)(a).root)){if(b.fixed?.hasDetail===!1)throw Error("Realtime detail cannot be updated while explicitly clearing hasDetail");i.hasDetail||(i=d.q5.parse({...i,hasDetail:!0}))}for(let[a,c]of(b.detail&&(l=h(l??{},b.detail,"detail")),Object.entries(b.increments??{}))){let b=(0,e.U)(a);"summary"===b.root?k=j(k,b.segments,c):l=j(l??{},b.segments,c)}return i.hasDetail||(l=void 0),d.s4.parse({location:a.location,fixed:i,summary:k,...void 0===l?{}:{detail:l}})}(f[c],b),{...a,temporaryMessages:f}}if("message_discard"===b.type)return{...a,temporaryMessages:a.temporaryMessages.filter(a=>a.location.tempId!==b.location.tempId)};if(b.durable.index!==a.messages.length)throw Error(`Conversation commit index is not continuous: expected ${a.messages.length}, received ${b.durable.index}`);if(a.messages.some(a=>a.location.entryId===b.durable.entryId))throw Error(`Conversation commit entryId already exists: ${b.durable.entryId}`);let{detail:f,fixed:i,...k}=a.temporaryMessages[c],l=d.mj.parse({...k,location:b.durable,fixed:{...i,timestampMs:b.fixed.timestampMs},...i.hasDetail&&void 0!==f?{detail:f}:{}});return{messages:[...a.messages,l],temporaryMessages:a.temporaryMessages.filter(a=>a.location.tempId!==b.location.tempId)}}function m(a,b){return"durable_append"===b.type?function(a,b){let c=a.messages.length;if(b.messages[0]?.location.index!==c)throw Error(`Conversation append index is not continuous: expected ${c}, received ${b.messages[0]?.location.index}`);let d=new Set(a.messages.map(a=>a.location.entryId));for(let a of b.messages){if(d.has(a.location.entryId))throw Error(`Conversation append entryId already exists: ${a.location.entryId}`);d.add(a.location.entryId)}return{...a,messages:[...a.messages,...b.messages]}}(a,b):l(a,b)}},610:(a,b,c)=>{c.d(b,{PS:()=>k,ef:()=>i,gK:()=>j,hS:()=>h,mv:()=>n});var d=c(59473),e=c(89409),f=c(2364),g=c(25984);let h=d.Ik({type:d.eu("message_start"),snapshot:e.s4}).strict(),i=d.Ik({type:d.eu("message_update"),location:e.fb,fixed:e.dG.optional(),summary:e.XW.optional(),detail:e.wH.optional(),increments:e.fK.optional()}).strict().superRefine((a,b)=>{if(!a.fixed&&!a.summary&&!a.detail&&!a.increments)return void b.addIssue({code:"custom",message:"message update requires a changed layer"});let c=[];for(let b of Object.keys(a.increments??{}))try{c.push({raw:b,parsed:(0,g.U)(b)})}catch{}for(let d of c){let c="summary"===d.parsed.root?Object.keys(a.summary??{}):Object.keys(a.detail??{}),e=d.parsed.segments[0];(0===d.parsed.segments.length||"string"==typeof e&&c.includes(e))&&b.addIssue({code:"custom",message:"replacement and increment paths cannot overlap",path:["increments",d.raw]})}for(let a=0;a<c.length;a+=1)for(let d=a+1;d<c.length;d+=1){let e=c[a],f=c[d];((0,g.v)(e.parsed,f.parsed)||(0,g.v)(f.parsed,e.parsed))&&b.addIssue({code:"custom",message:"increment parent and child paths cannot overlap",path:["increments",f.raw]})}}),j=d.Ik({type:d.eu("message_commit"),location:e.fb,durable:e.V6,fixed:d.Ik({timestampMs:f.k}).strict()}).strict(),k=d.Ik({type:d.eu("message_discard"),location:e.fb}).strict(),l=d.Ik({type:d.eu("durable_append"),messages:d.YO(e.mj).min(1)}).strict().superRefine((a,b)=>{let c=new Set;for(let[d,e]of a.messages.entries())d>0&&e.location.index!==a.messages[d-1].location.index+1&&b.addIssue({code:"custom",message:"durable append message indexes must be continuous",path:["messages",d,"location","index"]}),c.has(e.location.entryId)&&b.addIssue({code:"custom",message:"durable append entryId values must be unique",path:["messages",d,"location","entryId"]}),c.add(e.location.entryId)}),m=d.KC([h,i,j,k]),n=d.KC([l,m])},2002:(a,b,c)=>{c.d(b,{Od:()=>s,tU:()=>o,hE:()=>r,Sp:()=>g,P9:()=>f,_G:()=>k,Vc:()=>j});var d=c(59473);c(48452);let e=d.Ik({key:d.Yj().min(1).max(160),params:d.g1(d.Yj().min(1).max(80),d.KC([d.Yj().max(1e3),d.ai().finite()])).optional()}).strict(),f=4001,g=4003,h=d.Yj().trim().min(1),i=d.Yj().uuid();function j(a){return Object.freeze({op:"req",path:h.parse(a.path),inputSchema:a.inputSchema,outputSchema:a.outputSchema,...void 0===a.timeoutMs?{}:{timeoutMs:d.ai().int().positive().parse(a.timeoutMs)}})}function k(a){return Object.freeze({op:"push",path:h.parse(a.path),bodySchema:a.bodySchema})}let l=d.Ik({op:d.eu("req"),path:h,requestId:i}).strict(),m=d.Ik({op:d.eu("resp"),path:h,requestId:i}).strict(),n=d.Ik({op:d.eu("push"),path:h}).strict(),o=d.Ik({head:l,body:d.Pq()}).strict(),p=d.Ik({head:m,body:d.Ik({code:d.eu(0),msg:d.eu(""),data:d.Pq()}).strict()}).strict(),q=d.Ik({head:m,body:d.Ik({code:d.ai().int().positive(),msg:d.Yj().min(1),data:d.ch(),i18n:e.optional()}).strict()}).strict(),r=d.KC([p,q]),s=d.Ik({head:n,body:d.Pq()}).strict()},2364:(a,b,c)=>{c.d(b,{k:()=>d});let d=c(59473).ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER)},12683:(a,b,c)=>{c.d(b,{FF:()=>h,LK:()=>i});var d=c(59473),e=c(24187),f=c(43037);let g=d.Ik({name:d.Yj().trim().min(1),description:d.Yj(),parameters:e.Dz}).strict(),h=d.Ik({source:f.Pi}).strict(),i=d.Ik({systemPrompt:d.Yj(),tools:d.YO(g)}).strict()},24187:(a,b,c)=>{c.d(b,{Dz:()=>h,f7:()=>g,tv:()=>f});var d=c(59473);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=e,g=e,h=d.g1(d.Yj(),d.Pq());d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/);let i=d.k5(["plugin","server","rocket","settings","panel","message","terminal","file","folder","bot","wrench","database","globe"]);d.gM("type",[d.Ik({type:d.eu("builtin"),name:i}).strict(),d.Ik({type:d.eu("svg"),content:d.Yj().trim().min(1).max(16384)}).strict()])},25984:(a,b,c)=>{function d(a){if(!/^(0|[1-9]\d*)$/.test(a))return a;let b=Number(a);if(!Number.isSafeInteger(b))throw Error(`Increment array index is invalid: ${a}`);return b}function e(a){if(!a||a.length>1024)throw Error("Increment path length is invalid");let b=[],c="",e=!1;for(let d of a){if(e){if("."!==d&&"\\"!==d)throw Error(`Increment path contains an invalid escape: \\${d}`);c+=d,e=!1;continue}if("\\"===d){e=!0;continue}if("."===d){if(!c)throw Error("Increment path contains an empty segment");b.push(c),c="";continue}c+=d}if(e)throw Error("Increment path ends with an escape");if(!c)throw Error("Increment path contains an empty segment");b.push(c);let f=b.shift();if("summary"!==f&&"detail"!==f)throw Error("Increment path root must be summary or detail");return{root:f,segments:b.map(d)}}function f(a,b){return a.root===b.root&&!(a.segments.length>b.segments.length)&&a.segments.every((a,c)=>a===b.segments[c])}c.d(b,{U:()=>e,v:()=>f})},40750:(a,b,c)=>{c.d(b,{L6:()=>e,k_:()=>f});var d=c(18);let e={extensionMode:"normal",presentationMode:"normal",initializationError:null,queues:{steering:[],followUp:[]},model:null,capabilityMode:null,contextUsage:null,plugins:{}};function f(a,b){if("session_sync"===b.type){if("full"===b.mode)return{...(0,d.zR)(a,b.messages,b.temporaryMessages),runtime:b.runtime};let c=a.messages.at(-1);if(!c||c.location.index!==b.baseCursor.index||c.location.entryId!==b.baseCursor.entryId)throw Error("Incremental chat sync does not match the current durable cursor");let e=new Set(a.messages.map(a=>a.location.entryId));for(let a of b.messages){if(e.has(a.location.entryId))throw Error(`Incremental chat sync contains a duplicate entryId: ${a.location.entryId}`);e.add(a.location.entryId)}return{messages:[...a.messages,...b.messages],temporaryMessages:b.temporaryMessages,runtime:b.runtime}}return"runtime_update"===b.type?{...a,runtime:b.runtime}:{...(0,d.kn)(a,b),runtime:a.runtime}}Object.freeze({messages:[],temporaryMessages:[],runtime:e})},41468:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Cz:()=>j,Ht:()=>g.H,NA:()=>k,QS:()=>i});var e=c(96459),f=c(79626),g=c(72904),h=a([e]);function i(a,b,c,d=!1,g="temporary",h=!1){return(0,f.d)(a,b,c,h?[]:(0,e.WE)().readMessageDeclarations(),d,g)}function j(a,b,c,d,g,h=!1){return(0,f.N)(a,b,c,d,g,h?[]:(0,e.WE)().readMessageDeclarations())}function k(a){let{detail:b,...c}=a;return c}e=(h.then?(await h)():h)[0],d()}catch(a){d(a)}})},43037:(a,b,c)=>{c.d(b,{DK:()=>r,Pi:()=>q,R3:()=>m,TV:()=>A,UR:()=>s,VK:()=>D,kF:()=>F,mB:()=>G,oc:()=>C,ps:()=>E,w$:()=>w,wR:()=>p,wf:()=>B,xE:()=>n,xh:()=>t,yI:()=>o});var d=c(59473),e=c(20369),f=c(54733),g=c(89409),h=c(62977),i=c(96089);let j=g.Pc,k=g.LJ,l=g.mh,m=g.fb,n=g.lJ,o=g.s4,p=g.mj,q=i.R,r=d.Ik({index:k,entryId:f.C3}).strict(),s=d.KC([d.ch(),r]),t=l.extend({data:d.Yj().min(1)}).strict(),u=h.$,v=d.Ik({tempId:j,text:d.Yj(),images:d.YO(l).max(10)}).strict(),w=d.Ik({provider:d.Yj().trim().min(1),modelId:d.Yj().trim().min(1),thinkingLevel:u}).strict(),x=d.Ik({tokens:d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER).nullable(),contextWindow:d.ai().int().positive().max(Number.MAX_SAFE_INTEGER)}).strict(),y=d.g1(d.Yj(),d.Pq()),z=d.g1(d.Yj().min(1),y),A=d.k5(["normal","basic"]),B=d.Ik({extensionMode:A.default("normal"),presentationMode:A.default("normal"),initializationError:d.Yj().max(32e3).nullable().default(null),queues:d.Ik({steering:d.YO(v),followUp:d.YO(v)}).strict(),model:w.nullable(),capabilityMode:e.rY.nullable(),contextUsage:x.nullable(),plugins:z}).strict(),C=g.RX.extend({runtime:B}).strict(),D=d.Ik({sessionId:f.Kx,branchId:f._A,entryId:f.C3}).strict(),E=g.XM,F=D.extend({imageIndex:d.ai().int().nonnegative()}).strict(),G=g.y0},47574:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{VB:()=>t,dM:()=>q,hr:()=>r,nJ:()=>s,yO:()=>u});var e=c(76760),f=c(69503),g=c(12683),h=c(43037),i=c(40750),j=c(95220),k=c(32980),l=c(41468),m=c(72498),n=a([k,l,m]);[k,l,m]=n.then?(await n)():n;class q extends Error{constructor(a){super(`Chat source is not current: ${a.workId}/${a.sessionId}/${a.branchId}`),this.name="L2ChatSourceBindingError"}}class r extends Error{constructor(a){super(`Chat message was not found: ${a}`),this.name="L2ChatMessageNotFoundError"}}class s extends Error{constructor(a){super(`Chat commands are blocked by WorkSession lifecycle: ${a}`),this.name="L2ChatLifecycleBlockedError"}}class t extends Error{constructor(a,b){super(`工作会话 ${a} 阻止插件重载:${b}`),this.workId=a,this.reason=b,this.name="L2PluginReloadBlockedError"}}function o(a){try{return structuredClone(a)}catch{let{declaration:b,...c}=a;return structuredClone(c)}}function p(a,b){return JSON.stringify(a)===JSON.stringify(b)}class u{async initialize(a){let b=a.map(a=>this.buildRecord(a));for(let a of(this.recordsByWorkId.clear(),b))this.recordsByWorkId.set(a.source.workId,a)}addWorkSession(a){this.recordsByWorkId.set(a.workId,this.buildRecord(a))}async replaceWorkSession(a,b){let c=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),c&&this.publish({type:"source_invalidated",source:c}),this.recordsByWorkId.set(b.workId,this.buildRecord(b)),a.sessionId!==b.sessionId&&await (0,m.gb)(a.sessionId)}async refreshWorkSession(a){let b=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),b&&this.publish({type:"source_invalidated",source:b}),this.recordsByWorkId.set(a.workId,this.buildRecord(a))}async removeWorkSession(a){let b=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),b&&this.publish({type:"source_invalidated",source:b}),await (0,m.gb)(a.sessionId)}async pauseWorkSession(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,m.ls)(b.source.sessionId).nativeUi.cancelAll(),await b.commandTail)}resumeWorkSession(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!0)}async pauseForProcessRestart(){let a=[...this.recordsByWorkId.values()],b=a.map(a=>({record:a,reason:this.pluginReloadBlockReason(a)})).find(a=>null!==a.reason);if(b?.reason)throw new t(b.record.source.workId,b.reason);for(let b of a)b.acceptingCommands=!1;await Promise.all(a.map(a=>a.commandTail));let c=a.map(a=>({record:a,reason:this.pluginReloadBlockReason(a)})).find(a=>null!==a.reason);if(c?.reason){for(let b of a)b.acceptingCommands=!0;throw new t(c.record.source.workId,c.reason)}let d=!0;return()=>{if(d)for(let b of(d=!1,a))this.recordsByWorkId.get(b.source.workId)===b&&(b.acceptingCommands=!0)}}metadataFor(a){return this.recordFor(a).metadata}statusFor(a){return this.statusForRecord(this.recordFor(a))}statusForRecord(a){return a.mainRunning?"main_running":a.backgroundTaskIds.size>0?"background_running":a.completedPending?"completed":"idle"}acknowledgeCompleted(a){let b=this.recordsByWorkId.get(a);if(!b||!b.completedPending)return!1;let c=this.statusForRecord(b);return b.completedPending=!1,this.publishRecordChanged(a,b.metadata,c),!0}isCurrentSource(a){let b=h.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);return void 0!==c&&this.matches(c.source,b)}getProjectPreviewContext(a,b){let c=this.recordsByWorkId.get(a.workId);if(!c||c.workSession!==a)return null;let d=(0,f.Yj)((0,e.resolve)(b)),g=d===(0,f.Yj)((0,e.resolve)(a.cwd)),h=()=>(0,f.D)(c.state.runtime.plugins[f.s6]).directories.find(a=>(0,f.Yj)(a)===d),i=g?a.cwd:h();if(!i)return null;let j=()=>this.recordsByWorkId.get(a.workId)===c&&c.acceptingCommands&&this.matches(c.source,this.sourceFor(a))&&(g||void 0!==h());return j()?{cwd:i,isCurrent:j}:null}refreshPluginMessages(){for(let a of this.recordsByWorkId.values())if("basic"!==a.state.runtime.presentationMode)try{this.reprojectRecord(a,a.state.runtime.presentationMode)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] 插件消息刷新失败,保留已有聊天",{workId:a.source.workId,message:b instanceof Error?b.message:String(b)})}}setPresentation(a,b){let c=this.currentRecord(a);return this.enqueueCommand(c,async()=>{if(((0,j.P)()||"basic"===c.state.runtime.extensionMode)&&"normal"===b)throw Error("基础模式不启用插件消息展示,请先恢复插件聊天");c.state.runtime.presentationMode!==b&&this.reprojectRecord(c,b)})}reprojectRecord(a,b){let c=(0,m.ls)(a.source.sessionId).readChatSnapshot(),d=new Map(c.entries.map(a=>[a.entryId,a])),e="basic"===b,f=a.state.messages.map(b=>{let c=d.get(b.location.entryId);if(!c)throw Error(`无法重新投影消息:${b.location.entryId}`);return(0,l.Cz)(b.location.index,c.entryId,c.timestampMs,c.message,a.source,e)}),g=a.state.temporaryMessages.map(b=>{let c=a.rawTemporaryMessages.get(b.location.tempId);if(!c)throw Error(`临时消息基线尚不可重投影:${b.location.tempId}`);return(0,l.QS)(b.location.tempId,c,a.source,!1,"update",e)});a.state={messages:f,temporaryMessages:g,runtime:{...a.state.runtime,presentationMode:b}},a.forceFullSync=!0,a.sourceEventVersion+=1,this.publish({type:"source_event",source:a.source,version:a.sourceEventVersion,event:this.createSync(a.source,null).event})}prepareSource(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>this.syncRecordRuntime(b))}async syncRecordRuntime(a){let b=a.source,c=h.wf.parse({...await (0,m.ls)(b.sessionId).readChatRuntime(),presentationMode:a.state.runtime.presentationMode});this.isCurrentSource(b)&&(p(a.state.runtime,c)||this.applySourceEvent(b,{type:"runtime_update",runtime:c}),"basic"===c.extensionMode&&"basic"!==a.state.runtime.presentationMode&&this.reprojectRecord(a,"basic"))}createSync(a,b){let c=this.currentRecord(a),d=c.source,e=c.state.messages,f=c.state.temporaryMessages,g=c.state.runtime,h=null===b?void 0:e[b.index],i=null!==b&&h?.location.entryId===b.entryId;return null===b||i||console.warn("[Pi Desk][WorkSessionChatRuntime] 客户端消息 cursor 不匹配,回退全量",{workId:d.workId,sessionId:d.sessionId,branchId:d.branchId,clientCursorIndex:b.index,clientCursorEntryId:b.entryId,serverEntryIdAtIndex:h?.location.entryId??null,serverLatestIndex:e.at(-1)?.location.index??-1}),{event:null!==b&&i&&!c.forceFullSync?{type:"session_sync",mode:"incremental",baseCursor:b,messages:e.slice(b.index+1).map(l.NA),temporaryMessages:f,runtime:g}:{type:"session_sync",mode:"full",baseCursor:null,messages:e.map(l.NA),temporaryMessages:f,runtime:g},watermark:c.sourceEventVersion}}getImage(a){let b=h.kF.parse(a),c=this.recordForSession(b.sessionId,b.branchId),d=c.state.messages.find(a=>a.location.entryId===b.entryId);if(!d||"user"!==d.fixed.type&&"tool"!==d.fixed.type)throw new r(`${b.entryId}/${b.imageIndex}`);return h.mB.parse((0,m.ls)(c.source.sessionId).readChatImage(b.entryId,b.imageIndex))}getMessageDetail(a){let b=h.VK.parse(a),c=this.recordForSession(b.sessionId,b.branchId).state.messages.find(a=>a.location.entryId===b.entryId);if(!c)throw new r(b.entryId);return h.ps.parse({index:c.location.index,entryId:c.location.entryId,detail:c.detail??null})}getModelContext(a){let b=g.FF.parse(a),c=this.currentRecord(b.source);return this.enqueueCommand(c,async()=>g.LK.parse(await (0,m.ls)(c.source.sessionId).readModelContext()))}send(a){let b=this.currentRecord(a.source);if((0,m.ls)(a.source.sessionId).nativeUi.hasPending)return Promise.reject(Error("请先处理当前插件问题,或停止当前任务"));let c=()=>b.workSession.send({mode:a.mode,text:a.text,images:a.images});return b.compactionStart?b.acceptingCommands?b.compactionStart.then(a=>{if(!b.acceptingCommands)throw new s(b.source.workId);return a?c():this.enqueueCommand(b,c)}):Promise.reject(new s(b.source.workId)):this.enqueueCommand(b,c)}interrupt(a){let b=this.currentRecord(a);return(0,m.ls)(a.sessionId).nativeUi.hasPending?b.workSession.interrupt():this.enqueueCommand(b,()=>b.workSession.interrupt())}compact(a){let b,c=this.currentRecord(a);if(c.compactionStart)return Promise.reject(Error("上下文正在压缩"));let d=new Promise(a=>{b=a});c.compactionStart=d;let e=this.enqueueCommand(c,()=>{try{let a=(0,m.ls)(c.source.sessionId).compact();return b(!0),a}catch(a){throw b(!1),a}});return e.then(()=>{b(!1),c.compactionStart===d&&(c.compactionStart=null)},()=>{b(!1),c.compactionStart===d&&(c.compactionStart=null)}),e}reload(a,b){let c=this.currentRecord(a);return(0,m.ls)(a.sessionId).nativeUi.cancelAll(),this.enqueueCommand(c,async()=>{try{await (0,m.ls)(c.source.sessionId).reload(b)}finally{this.recordsByWorkId.get(a.workId)===c&&(await this.syncRecordRuntime(c),"basic"===c.state.runtime.extensionMode&&"basic"!==c.state.runtime.presentationMode&&this.reprojectRecord(c,"basic"))}})}restoreQueuedMessages(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>b.workSession.restoreQueuedMessages())}setTitle(a,b){let c=this.recordFor(a);return this.enqueueCommand(c,()=>c.workSession.setTitle(b))}setModel(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>b.workSession.setModel(a.model))}setCapabilityMode(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).setCapabilityMode(a.capabilityMode))}invokePluginMethod(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).invokePluginMethod(b.source,a.pluginName,a.method,a.input))}listNativeCommands(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).listNativeCommands())}executeNativeCommand(a,b,c){let d=this.currentRecord(a);return this.enqueueCommand(d,()=>(0,m.ls)(d.source.sessionId).executeNativeCommand(b,c))}listNativeTools(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).listNativeTools())}executeDirectBash(a,b){let c=this.currentRecord(a);return c.directBashActive?Promise.reject(new k.yT):(c.directBashActive=!0,this.enqueueCommand(c,()=>(0,m.ls)(c.source.sessionId).executeDirectBash(b)).finally(()=>{c.directBashActive=!1}))}abortDirectBash(a){let b=this.currentRecord(a);return(0,m.ls)(b.source.sessionId).abortDirectBash()}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}subscribeRecordChanges(a){return this.recordListeners.add(a),()=>this.recordListeners.delete(a)}subscribePluginPush(a){return this.pluginPushListeners.add(a),()=>this.pluginPushListeners.delete(a)}buildRecord(a){let b=this.sourceFor(a),c=(0,m.ls)(a.sessionId),d=c.readChatSnapshot(),e=d.entries.map((a,c)=>(0,l.Cz)(c,a.entryId,a.timestampMs,a.message,b,(0,j.P)())),f=h.oc.parse({messages:e,temporaryMessages:[],runtime:{...i.L6,extensionMode:(0,j.P)()?"basic":"normal",presentationMode:(0,j.P)()?"basic":"normal"}}),g=f.messages.find(a=>"user"===a.fixed.type),k=g?h.xE.safeParse(g.summary):null,n=k?.success&&k.data.text.trim()||null,o={workSession:a,source:b,state:f,sourceEventVersion:0,forceFullSync:(0,j.P)(),rawTemporaryMessages:new Map,metadata:{sessionTitle:d.sessionName??n,messageCounts:{user:f.messages.filter(a=>"user"===a.fixed.type).length,total:f.messages.length},lastMessageUpdatedAt:f.messages.at(-1)?.fixed.timestampMs??null},mainRunning:!1,backgroundTaskIds:new Set(c.readChatBackgroundTaskIds()),completedPending:!1,acceptingCommands:!0,directBashActive:!1,compactionStart:null,commandTail:Promise.resolve(),unsubscribeWorker:()=>void 0};return o.unsubscribeWorker=c.subscribeChat(a=>this.handleWorkerEvent(o,a)),o}handleWorkerEvent(a,b){if(this.recordsByWorkId.get(a.source.workId)!==a)return;let c=a.metadata,d=this.statusForRecord(a);switch(b.type){case"message_start":a.rawTemporaryMessages.set(b.tempId,o(b.message)),this.applySourceEvent(a.source,{type:"message_start",snapshot:(0,l.QS)(b.tempId,b.message,a.source,!1,"temporary","basic"===a.state.runtime.presentationMode)});return;case"message_update":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);a.rawTemporaryMessages.set(b.tempId,o(b.message));let d=(0,l.Ht)(c,(0,l.QS)(b.tempId,b.message,a.source,!1,"update","basic"===a.state.runtime.presentationMode));d&&this.applySourceEvent(a.source,d);return}case"message_commit":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);let d=(0,l.QS)(b.tempId,b.message,a.source,!1,"final","basic"===a.state.runtime.presentationMode),e=(0,l.Ht)(c,d);e&&this.applySourceEvent(a.source,e),this.replaceCanonicalTemporary(a,b.tempId,b.message),a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_commit",location:{tempId:b.tempId},durable:{index:a.state.messages.length,entryId:b.entryId},fixed:{timestampMs:b.timestampMs}});return}case"message_discard":a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_discard",location:{tempId:b.tempId}});return;case"plugin_push":this.publishPluginPush({pluginName:b.pluginName,target:{scope:"session",source:a.source},event:b.event,data:structuredClone(b.data)});return;case"runtime_changed":{let c=h.wf.parse({...b.runtime,presentationMode:a.state.runtime.presentationMode});p(a.state.runtime,c)||this.applySourceEvent(a.source,{type:"runtime_update",runtime:c}),"basic"===c.extensionMode&&"basic"!==a.state.runtime.presentationMode&&this.reprojectRecord(a,"basic");return}case"agent_started":if(a.mainRunning)return;a.mainRunning=!0,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"main_operation_cancelled":case"main_operation_finished":if(!a.mainRunning)return;a.mainRunning=!1,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"agent_settled":{let b=a.mainRunning||a.backgroundTaskIds.size>0;a.mainRunning=!1,b&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"background_tasks_changed":{let e=a.mainRunning||a.backgroundTaskIds.size>0;a.backgroundTaskIds=new Set(b.taskIds),e&&!a.mainRunning&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"session_info_changed":a.metadata={...a.metadata,sessionTitle:b.sessionTitle},this.publishRecordChanged(a.source.workId,c,d);return}}replaceCanonicalTemporary(a,b,c){let d=a.state.temporaryMessages.findIndex(a=>a.location.tempId===b);if(d<0)throw Error(`Temporary chat message was not found: ${b}`);let e=[...a.state.temporaryMessages];e[d]=(0,l.QS)(b,c,a.source,!0,"final","basic"===a.state.runtime.presentationMode),a.state={...a.state,temporaryMessages:e}}applySourceEvent(a,b){let c=this.currentRecord(a),d=c.source;if(c.state=(0,i.k_)(c.state,b),c.sourceEventVersion+=1,"message_commit"===b.type){let a=c.state.messages[b.durable.index];if(!a||a.location.entryId!==b.durable.entryId)throw Error(`Committed chat message is missing: ${b.durable.index}/${b.durable.entryId}`);let e=c.metadata;c.metadata=this.metadataFromState(c),this.publishRecordChanged(d.workId,e,this.statusForRecord(c))}this.publish({type:"source_event",source:d,version:c.sourceEventVersion,event:b})}metadataFromState(a){let b=a.state.messages.find(a=>"user"===a.fixed.type),c=b?h.xE.safeParse(b.summary):null,d=c?.success&&c.data.text.trim()||null;return{sessionTitle:a.metadata.sessionTitle??d,messageCounts:{user:a.state.messages.filter(a=>"user"===a.fixed.type).length,total:a.state.messages.length},lastMessageUpdatedAt:a.state.messages.at(-1)?.fixed.timestampMs??null}}enqueueCommand(a,b){if(!a.acceptingCommands)return Promise.reject(new s(a.source.workId));let c=a.commandTail.then(b,b);return a.commandTail=c.then(()=>void 0,()=>void 0),c}pluginReloadBlockReason(a){return(0,m.ls)(a.source.sessionId).nativeUi.hasPending?"原生插件问题正在等待回答":a.directBashActive?"Direct Bash 正在运行":a.mainRunning?"主 Agent 正在运行":a.backgroundTaskIds.size>0?"插件后台任务正在运行":(0,m.ls)(a.source.sessionId).readPluginReloadBlockReason()}async closeRecord(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,m.ls)(b.source.sessionId).nativeUi.cancelAll(),await b.commandTail,b.unsubscribeWorker(),b.rawTemporaryMessages.clear(),this.recordsByWorkId.delete(a))}recordFor(a){let b=this.recordsByWorkId.get(a.workId);if(!b||!this.matches(b.source,this.sourceFor(a)))throw Error(`WorkSession chat state is not initialized: ${a.workId}`);return b}sourceFor(a){return h.Pi.parse({workId:a.workId,sessionId:a.sessionId,branchId:a.branchId})}currentRecord(a){let b=h.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);if(!c||!this.matches(c.source,b))throw new q(b);return c}recordForSession(a,b){let c=[...this.recordsByWorkId.values()].find(c=>c.source.sessionId===a&&c.source.branchId===b);if(c)return c;throw new q({workId:"unknown",sessionId:a,branchId:b})}matches(a,b){return a.workId===b.workId&&a.sessionId===b.sessionId&&a.branchId===b.branchId}publishPluginPush(a){for(let b of[...this.pluginPushListeners])try{b(a)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Plugin Push 监听器执行失败",{pluginName:a.pluginName,event:a.event,errorName:b instanceof Error?b.name:"UnknownError"})}}publish(a){for(let b of[...this.listeners])try{b(a)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Source 事件监听器执行失败",{eventType:a.type,workId:a.source.workId,errorName:b instanceof Error?b.name:"UnknownError"})}}publishRecordChanged(a,b,c){for(let d of[...this.recordListeners])try{d(a,b,c)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Record 监听器执行失败",{workId:a,errorName:b instanceof Error?b.name:"UnknownError"})}}constructor(){this.recordsByWorkId=new Map,this.listeners=new Set,this.recordListeners=new Set,this.pluginPushListeners=new Set}}d()}catch(a){d(a)}})},48452:(a,b,c)=>{c.d(b,{Y:()=>f,n:()=>e});var d=c(59473);let e="X-Pi-Desk-Client-Id",f=d.Yj().uuid()},54733:(a,b,c)=>{c.d(b,{AA:()=>p,Bn:()=>v,C3:()=>j,Ck:()=>s,ER:()=>m,Jl:()=>w,Kx:()=>i,MT:()=>l,MY:()=>q,Ms:()=>x,TO:()=>n,_A:()=>k,eW:()=>g,ik:()=>h,jw:()=>o,kg:()=>r,qL:()=>u,uX:()=>t});var d=c(59473),e=c(83905),f=c(2364);let g=d.Yj().trim().min(1),h=e.m4,i=e.$E,j=e.Rv,k=d.Yj().trim().min(1),l=d.ai().int().nonnegative(),m=d.Ik({workId:g,cwd:h,sessionId:i}).strict(),n=d.YO(m),o=d.k5(["main_running","background_running","completed","idle"]),p=d.Ik({user:d.ai().int().nonnegative(),total:d.ai().int().nonnegative()}).strict().refine(a=>a.user<=a.total,{message:"user message count cannot exceed total message count"}),q=m.extend({branchId:k,projectName:d.Yj().trim().min(1),sessionTitle:d.Yj().trim().min(1).nullable(),status:o,messageCounts:p,lastMessageUpdatedAt:f.k.nullable()}).strict(),r=d.Ik({workSessions:d.YO(q),pinnedCount:l}).strict().refine(a=>a.pinnedCount<=a.workSessions.length,{message:"pinnedCount cannot exceed work session count",path:["pinnedCount"]}),s=d.Ik({cwd:h,sessionId:i.optional()}).strict(),t=d.Ik({workSession:q}).strict(),u=d.Ik({workId:g,sessionId:i,title:d.Yj().trim().min(1)}).strict(),v=d.Ik({workId:g}).strict(),w=d.Ik({workIds:d.YO(g),pinnedCount:l}).strict().superRefine((a,b)=>{new Set(a.workIds).size!==a.workIds.length&&b.addIssue({code:"custom",message:"workIds cannot contain duplicates",path:["workIds"]}),a.pinnedCount>a.workIds.length&&b.addIssue({code:"custom",message:"pinnedCount cannot exceed workIds length",path:["pinnedCount"]})}),x=d.KC([d.Ik({workId:g,cwd:h,sessionId:i}).strict(),d.Ik({workId:g}).strict()])},62977:(a,b,c)=>{c.d(b,{$:()=>d});let d=c(59473).k5(["off","minimal","low","medium","high","xhigh","max"])},72904:(a,b,c)=>{c.d(b,{H:()=>g});var d=c(610);function e(a,b){return JSON.stringify(a)===JSON.stringify(b)}function f(a,b,c,d,f){for(let g of new Set([...Object.keys(b),...Object.keys(c)])){let h=b[g],i=Object.hasOwn(c,g),j=i?c[g]:null;if(e(h,j))continue;let k=i?function(a,b){if("string"==typeof a&&"string"==typeof b&&b.startsWith(a))return b.slice(a.length)||null;if(Array.isArray(a)&&Array.isArray(b)&&a.length<=b.length&&a.every((a,c)=>e(a,b[c]))){let c=b.slice(a.length);return c.length>0?c:null}return null}(h,j):null;null!==k?f[`${a}.${g.replace(/\\/g,"\\\\").replace(/\./g,"\\.")}`]=k:d[g]=j}}function g(a,b){var c,e;let g;if(a.fixed.type!==b.fixed.type)throw Error(`Chat message type changed: ${a.fixed.type}/${b.fixed.type}`);let h=(g={},a.fixed.viewKey!==b.fixed.viewKey&&(g.viewKey=b.fixed.viewKey),"status"in a.fixed&&"status"in b.fixed&&a.fixed.status!==b.fixed.status&&(g.status=b.fixed.status),a.fixed.hasDetail!==b.fixed.hasDetail&&(g.hasDetail=b.fixed.hasDetail),"usage"in a.fixed&&"usage"in b.fixed&&(c=a.fixed.usage)!==(e=b.fixed.usage)&&(null===c||null===e||c.inputTokens!==e.inputTokens||c.outputTokens!==e.outputTokens||c.cacheReadTokens!==e.cacheReadTokens||c.costUsd!==e.costUsd)&&(g.usage=b.fixed.usage),Object.keys(g).length>0?g:void 0),i={},j={},k={};f("summary",a.summary,b.summary,i,k),b.fixed.hasDetail&&f("detail",a.detail??{},b.detail??{},j,k);let l=Object.keys(i).length>0,m=Object.keys(j).length>0,n=Object.keys(k).length>0;return h||l||m||n?d.ef.parse({type:"message_update",location:a.location,...h?{fixed:h}:{},...l?{summary:i}:{},...m?{detail:j}:{},...n?{increments:k}:{}}):null}},79626:(a,b,c)=>{c.d(b,{N:()=>u,d:()=>t});var d=c(89409),e=c(59473),f=c(63719);let g=e.Ik({mode:e.k5(["sync","async"]),message:e.Yj()}).strict(),h="pi-desk/message-declaration-error",i=new WeakMap,j=e.Ik({viewKey:e.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/),summary:e.g1(e.Yj(),e.Pq()),detail:e.g1(e.Yj(),e.Pq()).nullable()}).strict();function k(a){switch(a.type){case"user":return"pi-desk/user";case"assistant":return"pi-desk/assistant";case"tool":{let b=a.name.toLowerCase().split(".").at(-1);if("pidesk"===b)return"pi-desk/pidesk";if("bash"===b)return"pi-desk/bash-tool";if("codemode"===b)return"pi-desk/codemode";return"read"===b||"write"===b||"edit"===b?`pi-desk/${b}`:"pi-desk/tool"}case"bash":return"pi-desk/bash";case"custom":return"pi-desk/custom";case"compaction":return"pi-desk/compaction"}}function l(a){return null===a||"object"!=typeof a||Array.isArray(a)?null:a}function m(a){return l(a.result)}function n(a,b){return{...a.summary,path:function(a){let b=a.arguments.path??a.arguments.file_path;if("string"!=typeof b)return null;let c=f.eC.safeParse(b);return c.success?c.data:null}(b)}}function o(a){if(a.declaration)return a.declaration.message;switch(a.type){case"user":return{kind:"user",text:a.text,images:a.images};case"assistant":return{kind:"assistant",text:a.text,thinking:a.thinking,stopReason:a.status};case"tool":return{kind:"tool",toolName:a.name,toolCallId:"",arguments:{},partialResult:null,result:a.output?{output:a.output}:null,isError:"error"===a.status};case"bash":return{kind:"bash",command:a.command,output:a.output,exitCode:"completed"===a.status?0:null,cancelled:"aborted"===a.status,truncated:!1};case"custom":return{kind:"custom",customType:"display-message",content:a.text,details:null};case"compaction":return{kind:"custom",customType:"pi-desk/compaction",content:"",details:a.summary?{text:a.summary}:null}}}function p(a,b,c){return{pluginName:"pi-desk",declarationName:a,builtin:!0,declaration:{priority:b,match:c,project:a=>a.defaultProjection}}}let q=[p("pidesk",-900,a=>"tool"===a.message.kind&&"pidesk"===a.message.toolName),p("read",-900,a=>"tool"===a.message.kind&&"read"===a.message.toolName),p("write",-900,a=>"tool"===a.message.kind&&"write"===a.message.toolName),p("edit",-900,a=>"tool"===a.message.kind&&"edit"===a.message.toolName),p("bash-tool",-900,a=>"tool"===a.message.kind&&"bash"===a.message.toolName),p("user",-1e3,a=>"user"===a.message.kind),p("assistant",-1e3,a=>"assistant"===a.message.kind),p("tool",-1e3,a=>"tool"===a.message.kind),p("bash",-1e3,a=>"bash"===a.message.kind),p("custom",-1e3,a=>"custom"===a.message.kind)];function r(a){var b;let c=a.error instanceof Error?a.error:null,d=a.candidate;for(let b of d?[d]:a.candidates??[]){let d=i.get(b.declaration)??new Set;d.has(a.phase)||(d.add(a.phase),i.set(b.declaration,d),console.warn("[Pi Desk][MessageDeclaration] 插件投影失败,保留基础展示入口",{pluginName:b.pluginName,declarationName:b.declarationName,phase:a.phase,message:(c?.message??"Message Declaration conflict").slice(0,2e3)}))}return{viewKey:h,summary:{text:"string"==typeof a.defaultProjection.summary.text?a.defaultProjection.summary.text:"",phase:a.phase,pluginName:d?.pluginName??null,declarationName:d?.declarationName??null},detail:{phase:a.phase,pluginName:d?.pluginName??null,declarationName:d?.declarationName??null,priority:d?.declaration.priority??null,errorName:c?.name??null,errorMessage:c?.message??String(a.error??"Message Declaration conflict"),errorStack:c?.stack??null,conflicts:(a.candidates??[]).map(a=>({pluginName:a.pluginName,declarationName:a.declarationName,priority:a.declaration.priority})),defaultProjection:{viewKey:(b=a.defaultProjection).viewKey,summary:b.summary,detail:b.detail}}}}function s(a,b,c,e,f,i,p){let s=function(a){let b=function(a){switch(a.type){case"user":return{viewKey:k(a),summary:{text:function(a){let b=a.text.lastIndexOf("\n\n");if(0===a.images.length||b<0)return a.text;let c=a.text.slice(b+2).split("\n");return c.length>a.images.length?a.text:c.every(b=>{let c=/^\[Image: original \d+x\d+, displayed at (\d+)x(\d+)\. Multiply coordinates by \d+\.\d{2} to map to original image\.\]$/.exec(b);return null!==c&&a.images.some(a=>a.width===Number(c[1])&&a.height===Number(c[2]))})?a.text.slice(0,b):a.text}(a),images:a.images.map(a=>({...a}))},detail:null};case"assistant":return{viewKey:k(a),summary:{text:a.text,errorMessage:a.errorMessage,...void 0===a.model?{}:{model:a.model}},detail:a.thinking.length>0?{thinking:a.thinking}:null};case"tool":{let b=k(a),c={...a.images?.length&&["pi-desk/tool","pi-desk/read","pi-desk/codemode"].includes(b)?{images:a.images.map(a=>({...a}))}:{},name:a.name,reasoning:a.reasoning,inputPreview:a.inputPreview,activity:a.activity},d=a.durationMs??null,e=a.startedAtMs??null,f={viewKey:b,summary:"pi-desk/bash-tool"===b?{...c,timing:null!==d?{durationMs:d}:null!==e?{startedAtMs:e}:null}:c,detail:"pi-desk/codemode"===b?{output:a.output,...a.nestedCalls?{nestedCalls:a.nestedCalls}:{}}:a.output?{output:a.output}:null},h=o(a);return"tool"===h.kind?function(a,b){let c=function(a){let b=m(a);if(!b)return null;let c=b.content;if("string"==typeof c)return c;if(Array.isArray(c)){let a=[],b=!1;for(let d of c){let c=l(d);c?.type==="text"&&"string"==typeof c.text&&(b=!0,a.push(c.text))}if(b)return a.join("\n")}return"string"==typeof b.output?b.output:null}(b)??("string"==typeof a.detail?.output?a.detail.output:null);switch(a.viewKey){case"pi-desk/pidesk":{let d=c??"";try{let a=g.safeParse(JSON.parse(d));a.success&&(d=a.data.message)}catch{}return{viewKey:a.viewKey,summary:{input:b.arguments},detail:{output:d}}}case"pi-desk/read":let d;return{viewKey:a.viewKey,summary:n(a,b),detail:Array.isArray(d=m(b)?.content)&&d.some(a=>{let b=l(a);return b?.type==="image"})||null===c?null:{content:c}};case"pi-desk/edit":{let d=l(m(b)?.details??null)?.diff;return{viewKey:a.viewKey,summary:n(a,b),detail:b.isError||"string"!=typeof d?null===c?null:{kind:"output",content:c}:{kind:"diff",content:d}}}case"pi-desk/write":{let d=b.arguments.content;return{viewKey:a.viewKey,summary:n(a,b),detail:b.isError&&null!==c?{kind:"output",content:c}:"string"==typeof d?{kind:"content",content:d}:null===c?null:{kind:"output",content:c}}}default:return a}}(f,h):f}case"bash":return{viewKey:k(a),summary:{command:a.command},detail:a.output?{output:a.output}:null};case"custom":return{viewKey:k(a),summary:{text:a.text},detail:null};case"compaction":return{viewKey:k(a),summary:{},detail:a.summary?{text:a.summary}:null}}}(a.message);if("compaction"===a.message.type)return b;let c={source:a.source,stage:a.stage,message:o(a.message),raw:a.message.declaration?.raw??a.message,defaultProjection:b},d=[...(a.declarations??[]).map(a=>({...a,builtin:!1})),...q];for(let a of[...new Set(d.map(a=>a.declaration.priority))].sort((a,b)=>b-a)){let e,f=d.filter(b=>b.declaration.priority===a),g=[];for(let a of f)try{a.declaration.match(c)&&g.push(a)}catch(c){return r({phase:"match",candidate:a,error:c,defaultProjection:b})}if(0===g.length)continue;if(g.length>1)return r({phase:"conflict",candidates:g,defaultProjection:b});let i=g[0];try{e=i.declaration.project(c)}catch(a){return r({phase:"project",candidate:i,error:a,defaultProjection:b})}try{return function(a,b){let c=j.parse(a);if(!b&&c.viewKey===h)throw Error("Host reserved Message Declaration Error viewKey cannot be registered");return c}(e,i.builtin)}catch(a){return r({phase:"validate",candidate:i,error:a,defaultProjection:b})}}return b}({source:e,stage:f,message:c,declarations:p}),t="tool"===c.type||"bash"===c.type||"custom"===c.type||"compaction"===c.type,u=null!==s.detail&&(!t||i),v={location:a,fixed:function(a,b,c){let d={timestampMs:a,viewKey:c.viewKey,hasDetail:null!==c.detail};switch(b.type){case"user":return{...d,type:"user"};case"assistant":return{...d,type:"assistant",status:b.status,usage:b.usage};case"tool":return{...d,type:"tool",status:b.status,usage:b.usage};case"bash":return{...d,type:"bash",status:b.status};case"custom":case"compaction":return{...d,type:"custom"}}}(b,c,s),summary:s.summary,...u?{detail:s.detail}:{}};return"tempId"in a?d.s4.parse(v):d.mj.parse(v)}function t(a,b,c,d,e=!1,f="temporary"){return s({tempId:a},null,b,c,f,e,d)}function u(a,b,c,d,e,f){return s({index:a,entryId:b},c,d,e,"durable",!0,f)}},83905:(a,b,c)=>{c.d(b,{$E:()=>f,Rv:()=>g,m4:()=>e});var d=c(59473);let e=d.Yj().trim().min(1),f=d.Yj().trim().min(1),g=d.Yj().trim().min(1)},89409:(a,b,c)=>{c.d(b,{D8:()=>I,Hf:()=>H,LJ:()=>j,Pc:()=>i,RX:()=>T,V6:()=>t,XM:()=>U,XW:()=>P,dG:()=>O,fK:()=>S,fb:()=>s,lJ:()=>B,mh:()=>m,mj:()=>M,q5:()=>A,s4:()=>L,wH:()=>Q,y0:()=>V});var d=c(59473),e=c(83905),f=c(63719),g=c(2364),h=c(25984);let i=d.Yj().uuid(),j=d.ai().int().nonnegative(),k=d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/),l=d.k5(["image/jpeg","image/png","image/webp","image/gif"]),m=d.Ik({mimeType:l,width:d.ai().int().positive(),height:d.ai().int().positive()}).strict(),n=d.k5(["running","completed","error","aborted"]),o=d.k5(["running","completed","error"]),p=d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER),q=d.Ik({inputTokens:p,outputTokens:p,cacheReadTokens:p,costUsd:d.ai().finite().nonnegative()}).strict(),r=d.Yj().trim().min(1).nullable(),s=d.Ik({tempId:i}).strict(),t=d.Ik({index:j,entryId:e.Rv}).strict(),u=d.Ik({timestampMs:g.k.nullable(),type:d.eu("user"),viewKey:k,hasDetail:d.zM()}).strict(),v=d.Ik({timestampMs:g.k.nullable(),type:d.eu("assistant"),viewKey:k,status:n,hasDetail:d.zM(),usage:q}).strict(),w=d.Ik({timestampMs:g.k.nullable(),type:d.eu("tool"),viewKey:k,status:o,hasDetail:d.zM(),usage:q.nullable()}).strict(),x=d.Ik({timestampMs:g.k.nullable(),type:d.eu("bash"),viewKey:k,status:n,hasDetail:d.zM()}).strict(),y=d.Ik({timestampMs:g.k.nullable(),type:d.eu("custom"),viewKey:k,hasDetail:d.zM()}).strict();function z(a){let b=u.extend({timestampMs:a}).strict(),c=v.extend({timestampMs:a}).strict(),e=w.extend({timestampMs:a}).strict(),f=x.extend({timestampMs:a}).strict(),g=y.extend({timestampMs:a}).strict();return{user:b,assistant:c,tool:e,bash:f,custom:g,message:d.gM("type",[b,c,e,f,g])}}d.gM("type",[u,v,w,x,y]);let A=z(d.ch()).message;z(g.k).message;let B=d.Ik({text:d.Yj(),images:d.YO(m)}).strict(),C=d.Ik({provider:d.Yj(),modelId:d.Yj()}).strict();d.Ik({text:d.Yj(),errorMessage:d.Yj().nullable().default(null),model:C.nullable().optional()}).strict();let D={name:d.Yj().trim().min(1),reasoning:r,inputPreview:r,activity:r};function E(){return d.Ik({...D,path:f.eC.nullable()}).strict()}d.Ik({...D,images:d.YO(m).optional()}).strict();let F=d.KC([d.Ik({startedAtMs:g.k}).strict(),d.Ik({durationMs:d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER)}).strict()]);d.Ik({...D,timing:F.nullable()}).strict(),E().extend({images:d.YO(m).optional()}).strict(),E(),E(),d.Ik({command:d.Yj().min(1)}).strict(),d.Ik({text:d.Yj()}).strict(),d.Ik({thinking:d.Yj()}).strict();let G=d.Ik({complete:d.zM(),calls:d.YO(d.Ik({name:d.Yj(),arguments:d.g1(d.Yj(),d.Pq()).optional(),argumentsBytes:d.ai().int().nonnegative().optional(),status:d.k5(["ok","error","unfinished"]),durationMs:d.ai().finite().nonnegative().optional(),error:d.Yj().optional()}).strict())}).strict();d.Ik({output:d.Yj(),nestedCalls:G.optional()}).strict(),d.Ik({output:d.Yj()}).strict(),d.Ik({content:d.Yj()}).strict(),d.gM("kind",[d.Ik({kind:d.eu("diff"),content:d.Yj()}).strict(),d.Ik({kind:d.eu("output"),content:d.Yj()}).strict()]),d.gM("kind",[d.Ik({kind:d.eu("content"),content:d.Yj()}).strict(),d.Ik({kind:d.eu("output"),content:d.Yj()}).strict()]),d.Ik({output:d.Yj()}).strict(),d.Ik({text:d.Yj().min(1)}).strict();let H=d.g1(d.Yj(),d.Pq()),I=d.g1(d.Yj(),d.Pq()),J=d.KC([I,d.ch()]);function K(a,b){return d.Ik({location:a,fixed:z(b).message,summary:H,detail:I.optional()}).strict().superRefine((a,b)=>{void 0===a.detail||a.fixed.hasDetail||b.addIssue({code:"custom",message:"message detail requires hasDetail=true",path:["detail"]})})}let L=K(s,d.ch()),M=K(t,g.k);function N(a,b){0===Object.keys(a).length&&b.addIssue({code:"custom",message:"patch requires at least one changed field"})}let O=d.Ik({viewKey:k.optional(),status:d.KC([n,o]).optional(),hasDetail:d.zM().optional(),usage:q.nullable().optional()}).strict().superRefine(N),P=d.g1(d.Yj(),d.Pq()).superRefine(N),Q=d.g1(d.Yj(),d.Pq()).superRefine(N),R=d.KC([d.Yj().min(1),d.YO(d.Pq()).min(1)]),S=d.g1(d.Yj(),R).superRefine((a,b)=>{for(let c of(N(a,b),Object.keys(a)))try{(0,h.U)(c)}catch(a){b.addIssue({code:"custom",message:a instanceof Error?a.message:"increment path is invalid",path:[c]})}}),T=d.Ik({messages:d.YO(M),temporaryMessages:d.YO(L)}).strict(),U=d.Ik({index:j,entryId:e.Rv,detail:J}).strict(),V=d.Ik({mimeType:l,data:d.Yj().min(1)}).strict()},96089:(a,b,c)=>{c.d(b,{R:()=>f});var d=c(59473),e=c(83905);let f=d.Ik({workId:d.Yj().trim().min(1),sessionId:e.$E,branchId:d.Yj().trim().min(1)}).strict()}};
1
+ "use strict";exports.id=6917,exports.ids=[6917],exports.modules={18:(a,b,c)=>{c.d(b,{FR:()=>m,kn:()=>l,zR:()=>k});var d=c(89409),e=c(25984);function f(a){return`${a.location.index}:${a.location.entryId}`}let g={user:["viewKey","hasDetail"],assistant:["viewKey","status","hasDetail","usage"],tool:["viewKey","status","hasDetail","usage"],bash:["viewKey","status","hasDetail"],custom:["viewKey","hasDetail"]};function h(a,b,c){if(!b)return a;let e={...a,...b};return"summary"===c?d.Hf.parse(e):d.D8.parse(e)}function i(a,b){if(Array.isArray(a.parent)){if("number"!=typeof a.key)throw Error("Increment array key is invalid");a.parent[a.key]=b;return}if("string"!=typeof a.key)throw Error("Increment object key is invalid");a.parent[a.key]=b}function j(a,b,c){let e=structuredClone(a),f=function(a,b){if(0===b.length)throw Error("Increment cannot append to the message layer root");let c=a;for(let a of b.slice(0,-1)){if("number"==typeof a){if(!Array.isArray(c)||a>=c.length)throw Error(`Increment array path does not exist: ${a}`);c=c[a];continue}if(!c||"object"!=typeof c||Array.isArray(c))throw Error(`Increment object path does not exist: ${a}`);if(!Object.hasOwn(c,a))throw Error(`Increment object field does not exist: ${a}`);c=c[a]}let d=b.at(-1);if("number"==typeof d){if(!Array.isArray(c)||d>=c.length)throw Error(`Increment array target does not exist: ${d}`);return{parent:c,key:d,value:c[d]}}if(!c||"object"!=typeof c||Array.isArray(c))throw Error(`Increment object target does not exist: ${d}`);if(!Object.hasOwn(c,d))throw Error(`Increment target does not exist: ${d}`);return{parent:c,key:d,value:c[d]}}(e,b);if("string"==typeof c){if("string"!=typeof f.value)throw Error("Increment target is not a string");return i(f,`${f.value}${c}`),d.Hf.parse(e)}if(!Array.isArray(f.value))throw Error("Increment target is not an array");return i(f,[...f.value,...c]),d.Hf.parse(e)}function k(a,b,c){let e=new Map(a.messages.filter(a=>void 0!==a.detail).map(a=>[f(a),a]));return{messages:b.map(a=>{let b=e.get(f(a));return a.fixed.hasDetail&&b&&b.fixed.type===a.fixed.type&&b.fixed.viewKey===a.fixed.viewKey&&void 0!==b.detail?d.mj.parse({...a,detail:b.detail}):a}),temporaryMessages:[...c]}}function l(a,b){if("message_start"===b.type){if(a.temporaryMessages.some(a=>a.location.tempId===b.snapshot.location.tempId))throw Error(`Temporary conversation message already exists: ${b.snapshot.location.tempId}`);return{...a,temporaryMessages:[...a.temporaryMessages,b.snapshot]}}let c=a.temporaryMessages.findIndex(a=>a.location.tempId===b.location.tempId);if(c<0)throw Error(`Temporary conversation message was not found: ${b.location.tempId}`);if("message_update"===b.type){let f=[...a.temporaryMessages];return f[c]=function(a,b){var c,f;if(a.location.tempId!==b.location.tempId)throw Error(`Conversation update tempId mismatch: ${b.location.tempId}`);let i=(c=a.fixed,(f=b.fixed)?(!function(a,b,c){let d=Object.keys(a).filter(a=>!b.includes(a));if(d.length>0)throw Error(`${c} patch contains fields invalid for the current message: ${d}`)}(f,g[c.type],`${c.type} fixed`),d.q5.parse({...c,...f})):c),k=h(a.summary,b.summary,"summary"),l=a.detail;if(void 0!==b.detail||Object.keys(b.increments??{}).some(a=>"detail"===(0,e.U)(a).root)){if(b.fixed?.hasDetail===!1)throw Error("Realtime detail cannot be updated while explicitly clearing hasDetail");i.hasDetail||(i=d.q5.parse({...i,hasDetail:!0}))}for(let[a,c]of(b.detail&&(l=h(l??{},b.detail,"detail")),Object.entries(b.increments??{}))){let b=(0,e.U)(a);"summary"===b.root?k=j(k,b.segments,c):l=j(l??{},b.segments,c)}return i.hasDetail||(l=void 0),d.s4.parse({location:a.location,fixed:i,summary:k,...void 0===l?{}:{detail:l}})}(f[c],b),{...a,temporaryMessages:f}}if("message_discard"===b.type)return{...a,temporaryMessages:a.temporaryMessages.filter(a=>a.location.tempId!==b.location.tempId)};if(b.durable.index!==a.messages.length)throw Error(`Conversation commit index is not continuous: expected ${a.messages.length}, received ${b.durable.index}`);if(a.messages.some(a=>a.location.entryId===b.durable.entryId))throw Error(`Conversation commit entryId already exists: ${b.durable.entryId}`);let{detail:f,fixed:i,...k}=a.temporaryMessages[c],l=d.mj.parse({...k,location:b.durable,fixed:{...i,timestampMs:b.fixed.timestampMs},...i.hasDetail&&void 0!==f?{detail:f}:{}});return{messages:[...a.messages,l],temporaryMessages:a.temporaryMessages.filter(a=>a.location.tempId!==b.location.tempId)}}function m(a,b){return"durable_append"===b.type?function(a,b){let c=a.messages.length;if(b.messages[0]?.location.index!==c)throw Error(`Conversation append index is not continuous: expected ${c}, received ${b.messages[0]?.location.index}`);let d=new Set(a.messages.map(a=>a.location.entryId));for(let a of b.messages){if(d.has(a.location.entryId))throw Error(`Conversation append entryId already exists: ${a.location.entryId}`);d.add(a.location.entryId)}return{...a,messages:[...a.messages,...b.messages]}}(a,b):l(a,b)}},610:(a,b,c)=>{c.d(b,{PS:()=>k,ef:()=>i,gK:()=>j,hS:()=>h,mv:()=>n});var d=c(59473),e=c(89409),f=c(2364),g=c(25984);let h=d.Ik({type:d.eu("message_start"),snapshot:e.s4}).strict(),i=d.Ik({type:d.eu("message_update"),location:e.fb,fixed:e.dG.optional(),summary:e.XW.optional(),detail:e.wH.optional(),increments:e.fK.optional()}).strict().superRefine((a,b)=>{if(!a.fixed&&!a.summary&&!a.detail&&!a.increments)return void b.addIssue({code:"custom",message:"message update requires a changed layer"});let c=[];for(let b of Object.keys(a.increments??{}))try{c.push({raw:b,parsed:(0,g.U)(b)})}catch{}for(let d of c){let c="summary"===d.parsed.root?Object.keys(a.summary??{}):Object.keys(a.detail??{}),e=d.parsed.segments[0];(0===d.parsed.segments.length||"string"==typeof e&&c.includes(e))&&b.addIssue({code:"custom",message:"replacement and increment paths cannot overlap",path:["increments",d.raw]})}for(let a=0;a<c.length;a+=1)for(let d=a+1;d<c.length;d+=1){let e=c[a],f=c[d];((0,g.v)(e.parsed,f.parsed)||(0,g.v)(f.parsed,e.parsed))&&b.addIssue({code:"custom",message:"increment parent and child paths cannot overlap",path:["increments",f.raw]})}}),j=d.Ik({type:d.eu("message_commit"),location:e.fb,durable:e.V6,fixed:d.Ik({timestampMs:f.k}).strict()}).strict(),k=d.Ik({type:d.eu("message_discard"),location:e.fb}).strict(),l=d.Ik({type:d.eu("durable_append"),messages:d.YO(e.mj).min(1)}).strict().superRefine((a,b)=>{let c=new Set;for(let[d,e]of a.messages.entries())d>0&&e.location.index!==a.messages[d-1].location.index+1&&b.addIssue({code:"custom",message:"durable append message indexes must be continuous",path:["messages",d,"location","index"]}),c.has(e.location.entryId)&&b.addIssue({code:"custom",message:"durable append entryId values must be unique",path:["messages",d,"location","entryId"]}),c.add(e.location.entryId)}),m=d.KC([h,i,j,k]),n=d.KC([l,m])},2002:(a,b,c)=>{c.d(b,{Od:()=>s,tU:()=>o,hE:()=>r,Sp:()=>g,P9:()=>f,_G:()=>k,Vc:()=>j});var d=c(59473);c(48452);let e=d.Ik({key:d.Yj().min(1).max(160),params:d.g1(d.Yj().min(1).max(80),d.KC([d.Yj().max(1e3),d.ai().finite()])).optional()}).strict(),f=4001,g=4003,h=d.Yj().trim().min(1),i=d.Yj().uuid();function j(a){return Object.freeze({op:"req",path:h.parse(a.path),inputSchema:a.inputSchema,outputSchema:a.outputSchema,...void 0===a.timeoutMs?{}:{timeoutMs:d.ai().int().positive().parse(a.timeoutMs)}})}function k(a){return Object.freeze({op:"push",path:h.parse(a.path),bodySchema:a.bodySchema})}let l=d.Ik({op:d.eu("req"),path:h,requestId:i}).strict(),m=d.Ik({op:d.eu("resp"),path:h,requestId:i}).strict(),n=d.Ik({op:d.eu("push"),path:h}).strict(),o=d.Ik({head:l,body:d.Pq()}).strict(),p=d.Ik({head:m,body:d.Ik({code:d.eu(0),msg:d.eu(""),data:d.Pq()}).strict()}).strict(),q=d.Ik({head:m,body:d.Ik({code:d.ai().int().positive(),msg:d.Yj().min(1),data:d.ch(),i18n:e.optional()}).strict()}).strict(),r=d.KC([p,q]),s=d.Ik({head:n,body:d.Pq()}).strict()},2364:(a,b,c)=>{c.d(b,{k:()=>d});let d=c(59473).ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER)},12683:(a,b,c)=>{c.d(b,{FF:()=>h,LK:()=>i});var d=c(59473),e=c(24187),f=c(43037);let g=d.Ik({name:d.Yj().trim().min(1),description:d.Yj(),parameters:e.Dz}).strict(),h=d.Ik({source:f.Pi}).strict(),i=d.Ik({systemPrompt:d.Yj(),tools:d.YO(g)}).strict()},24187:(a,b,c)=>{c.d(b,{Dz:()=>h,f7:()=>g,tv:()=>f});var d=c(59473);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=e,g=e,h=d.g1(d.Yj(),d.Pq());d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/);let i=d.k5(["plugin","server","rocket","settings","panel","message","terminal","file","folder","bot","wrench","database","globe"]);d.gM("type",[d.Ik({type:d.eu("builtin"),name:i}).strict(),d.Ik({type:d.eu("svg"),content:d.Yj().trim().min(1).max(16384)}).strict()])},25984:(a,b,c)=>{function d(a){if(!/^(0|[1-9]\d*)$/.test(a))return a;let b=Number(a);if(!Number.isSafeInteger(b))throw Error(`Increment array index is invalid: ${a}`);return b}function e(a){if(!a||a.length>1024)throw Error("Increment path length is invalid");let b=[],c="",e=!1;for(let d of a){if(e){if("."!==d&&"\\"!==d)throw Error(`Increment path contains an invalid escape: \\${d}`);c+=d,e=!1;continue}if("\\"===d){e=!0;continue}if("."===d){if(!c)throw Error("Increment path contains an empty segment");b.push(c),c="";continue}c+=d}if(e)throw Error("Increment path ends with an escape");if(!c)throw Error("Increment path contains an empty segment");b.push(c);let f=b.shift();if("summary"!==f&&"detail"!==f)throw Error("Increment path root must be summary or detail");return{root:f,segments:b.map(d)}}function f(a,b){return a.root===b.root&&!(a.segments.length>b.segments.length)&&a.segments.every((a,c)=>a===b.segments[c])}c.d(b,{U:()=>e,v:()=>f})},40750:(a,b,c)=>{c.d(b,{L6:()=>e,k_:()=>f});var d=c(18);let e={extensionMode:"normal",presentationMode:"normal",initializationError:null,queues:{steering:[],followUp:[]},model:null,capabilityMode:null,contextUsage:null,plugins:{}};function f(a,b){if("session_sync"===b.type){if("full"===b.mode)return{...(0,d.zR)(a,b.messages,b.temporaryMessages),runtime:b.runtime};let c=a.messages.at(-1);if(!c||c.location.index!==b.baseCursor.index||c.location.entryId!==b.baseCursor.entryId)throw Error("Incremental chat sync does not match the current durable cursor");let e=new Set(a.messages.map(a=>a.location.entryId));for(let a of b.messages){if(e.has(a.location.entryId))throw Error(`Incremental chat sync contains a duplicate entryId: ${a.location.entryId}`);e.add(a.location.entryId)}return{messages:[...a.messages,...b.messages],temporaryMessages:b.temporaryMessages,runtime:b.runtime}}return"runtime_update"===b.type?{...a,runtime:b.runtime}:{...(0,d.kn)(a,b),runtime:a.runtime}}Object.freeze({messages:[],temporaryMessages:[],runtime:e})},41468:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Cz:()=>j,Ht:()=>g.H,NA:()=>k,QS:()=>i});var e=c(96459),f=c(79626),g=c(72904),h=a([e]);function i(a,b,c,d=!1,g="temporary",h=!1){return(0,f.d)(a,b,c,h?[]:(0,e.WE)().readMessageDeclarations(),d,g)}function j(a,b,c,d,g,h=!1){return(0,f.N)(a,b,c,d,g,h?[]:(0,e.WE)().readMessageDeclarations())}function k(a){let{detail:b,...c}=a;return c}e=(h.then?(await h)():h)[0],d()}catch(a){d(a)}})},43037:(a,b,c)=>{c.d(b,{DK:()=>r,Pi:()=>q,R3:()=>m,TV:()=>A,UR:()=>s,VK:()=>D,kF:()=>F,mB:()=>G,oc:()=>C,ps:()=>E,w$:()=>w,wR:()=>p,wf:()=>B,xE:()=>n,xh:()=>t,yI:()=>o});var d=c(59473),e=c(20369),f=c(54733),g=c(89409),h=c(62977),i=c(96089);let j=g.Pc,k=g.LJ,l=g.mh,m=g.fb,n=g.lJ,o=g.s4,p=g.mj,q=i.R,r=d.Ik({index:k,entryId:f.C3}).strict(),s=d.KC([d.ch(),r]),t=l.extend({data:d.Yj().min(1)}).strict(),u=h.$,v=d.Ik({tempId:j,text:d.Yj(),images:d.YO(l).max(10)}).strict(),w=d.Ik({provider:d.Yj().trim().min(1),modelId:d.Yj().trim().min(1),thinkingLevel:u}).strict(),x=d.Ik({tokens:d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER).nullable(),contextWindow:d.ai().int().positive().max(Number.MAX_SAFE_INTEGER)}).strict(),y=d.g1(d.Yj(),d.Pq()),z=d.g1(d.Yj().min(1),y),A=d.k5(["normal","basic"]),B=d.Ik({extensionMode:A.default("normal"),presentationMode:A.default("normal"),initializationError:d.Yj().max(32e3).nullable().default(null),queues:d.Ik({steering:d.YO(v),followUp:d.YO(v)}).strict(),model:w.nullable(),capabilityMode:e.rY.nullable(),contextUsage:x.nullable(),plugins:z}).strict(),C=g.RX.extend({runtime:B}).strict(),D=d.Ik({sessionId:f.Kx,branchId:f._A,entryId:f.C3}).strict(),E=g.XM,F=D.extend({imageIndex:d.ai().int().nonnegative()}).strict(),G=g.y0},47574:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{VB:()=>t,dM:()=>q,hr:()=>r,nJ:()=>s,yO:()=>u});var e=c(76760),f=c(69503),g=c(12683),h=c(43037),i=c(40750),j=c(95220),k=c(32980),l=c(41468),m=c(72498),n=a([k,l,m]);[k,l,m]=n.then?(await n)():n;class q extends Error{constructor(a){super(`Chat source is not current: ${a.workId}/${a.sessionId}/${a.branchId}`),this.name="L2ChatSourceBindingError"}}class r extends Error{constructor(a){super(`Chat message was not found: ${a}`),this.name="L2ChatMessageNotFoundError"}}class s extends Error{constructor(a){super(`Chat commands are blocked by WorkSession lifecycle: ${a}`),this.name="L2ChatLifecycleBlockedError"}}class t extends Error{constructor(a,b){super(`工作会话 ${a} 阻止插件重载:${b}`),this.workId=a,this.reason=b,this.name="L2PluginReloadBlockedError"}}function o(a){try{return structuredClone(a)}catch{let{declaration:b,...c}=a;return structuredClone(c)}}function p(a,b){return JSON.stringify(a)===JSON.stringify(b)}class u{async initialize(a){let b=a.map(a=>this.buildRecord(a));for(let a of(this.recordsByWorkId.clear(),b))this.recordsByWorkId.set(a.source.workId,a)}addWorkSession(a){this.recordsByWorkId.set(a.workId,this.buildRecord(a))}async replaceWorkSession(a,b){let c=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),c&&this.publish({type:"source_invalidated",source:c}),this.recordsByWorkId.set(b.workId,this.buildRecord(b)),a.sessionId!==b.sessionId&&await (0,m.gb)(a.sessionId)}async refreshWorkSession(a){let b=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),b&&this.publish({type:"source_invalidated",source:b}),this.recordsByWorkId.set(a.workId,this.buildRecord(a))}async removeWorkSession(a){let b=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),b&&this.publish({type:"source_invalidated",source:b}),await (0,m.gb)(a.sessionId)}async pauseWorkSession(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,m.ls)(b.source.sessionId).nativeUi.cancelAll(),await b.commandTail)}resumeWorkSession(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!0)}async pauseForProcessRestart(){let a=[...this.recordsByWorkId.values()],b=a.map(a=>({record:a,reason:this.pluginReloadBlockReason(a)})).find(a=>null!==a.reason);if(b?.reason)throw new t(b.record.source.workId,b.reason);for(let b of a)b.acceptingCommands=!1;await Promise.all(a.map(a=>a.commandTail));let c=a.map(a=>({record:a,reason:this.pluginReloadBlockReason(a)})).find(a=>null!==a.reason);if(c?.reason){for(let b of a)b.acceptingCommands=!0;throw new t(c.record.source.workId,c.reason)}let d=!0;return()=>{if(d)for(let b of(d=!1,a))this.recordsByWorkId.get(b.source.workId)===b&&(b.acceptingCommands=!0)}}metadataFor(a){return this.recordFor(a).metadata}statusFor(a){return this.statusForRecord(this.recordFor(a))}statusForRecord(a){return a.mainRunning?"main_running":a.backgroundTaskIds.size>0?"background_running":a.completedPending?"completed":"idle"}acknowledgeCompleted(a){let b=this.recordsByWorkId.get(a);if(!b||!b.completedPending)return!1;let c=this.statusForRecord(b);return b.completedPending=!1,this.publishRecordChanged(a,b.metadata,c),!0}isCurrentSource(a){let b=h.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);return void 0!==c&&this.matches(c.source,b)}getProjectPreviewContext(a,b){let c=this.recordsByWorkId.get(a.workId);if(!c||c.workSession!==a)return null;let d=(0,f.Yj)((0,e.resolve)(b)),g=d===(0,f.Yj)((0,e.resolve)(a.cwd)),h=()=>(0,f.D)(c.state.runtime.plugins[f.s6]).directories.find(a=>(0,f.Yj)(a)===d),i=g?a.cwd:h();if(!i)return null;let j=()=>this.recordsByWorkId.get(a.workId)===c&&c.acceptingCommands&&this.matches(c.source,this.sourceFor(a))&&(g||void 0!==h());return j()?{cwd:i,isCurrent:j}:null}setPresentation(a,b){let c=this.currentRecord(a);return this.enqueueCommand(c,async()=>{if(((0,j.P)()||"basic"===c.state.runtime.extensionMode)&&"normal"===b)throw Error("基础模式不启用插件消息展示,请先恢复插件聊天");c.state.runtime.presentationMode!==b&&this.reprojectRecord(c,b)})}reprojectRecord(a,b){let c=(0,m.ls)(a.source.sessionId).readChatSnapshot(),d=new Map(c.entries.map(a=>[a.entryId,a])),e="basic"===b,f=a.state.messages.map(b=>{let c=d.get(b.location.entryId);if(!c)throw Error(`无法重新投影消息:${b.location.entryId}`);return(0,l.Cz)(b.location.index,c.entryId,c.timestampMs,c.message,a.source,e)}),g=a.state.temporaryMessages.map(b=>{let c=a.rawTemporaryMessages.get(b.location.tempId);if(!c)throw Error(`临时消息基线尚不可重投影:${b.location.tempId}`);return(0,l.QS)(b.location.tempId,c,a.source,!1,"update",e)});a.state={messages:f,temporaryMessages:g,runtime:{...a.state.runtime,presentationMode:b}},a.sourceEventVersion+=1,this.publish({type:"source_event",source:a.source,version:a.sourceEventVersion,event:this.createSync(a.source,null).event})}prepareSource(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>this.syncRecordRuntime(b))}async syncRecordRuntime(a){let b=a.source,c=await (0,m.ls)(b.sessionId).readChatRuntime(),d=h.wf.parse({...c,presentationMode:a.state.runtime.presentationMode});this.isCurrentSource(b)&&(p(a.state.runtime,d)||this.applySourceEvent(b,{type:"runtime_update",runtime:d}))}createSync(a,b){let c=this.currentRecord(a),d=c.source,e=c.state.messages,f=c.state.temporaryMessages,g=c.state.runtime,h=null===b?void 0:e[b.index],i=null!==b&&h?.location.entryId===b.entryId;return null===b||i||console.warn("[Pi Desk][WorkSessionChatRuntime] 客户端消息 cursor 不匹配,回退全量",{workId:d.workId,sessionId:d.sessionId,branchId:d.branchId,clientCursorIndex:b.index,clientCursorEntryId:b.entryId,serverEntryIdAtIndex:h?.location.entryId??null,serverLatestIndex:e.at(-1)?.location.index??-1}),{event:i?{type:"session_sync",mode:"incremental",baseCursor:b,messages:e.slice(b.index+1).map(l.NA),temporaryMessages:f,runtime:g}:{type:"session_sync",mode:"full",baseCursor:null,messages:e.map(l.NA),temporaryMessages:f,runtime:g},watermark:c.sourceEventVersion}}getImage(a){let b=h.kF.parse(a),c=this.recordForSession(b.sessionId,b.branchId),d=c.state.messages.find(a=>a.location.entryId===b.entryId);if(!d||"user"!==d.fixed.type&&"tool"!==d.fixed.type)throw new r(`${b.entryId}/${b.imageIndex}`);return h.mB.parse((0,m.ls)(c.source.sessionId).readChatImage(b.entryId,b.imageIndex))}getMessageDetail(a){let b=h.VK.parse(a),c=this.recordForSession(b.sessionId,b.branchId).state.messages.find(a=>a.location.entryId===b.entryId);if(!c)throw new r(b.entryId);return h.ps.parse({index:c.location.index,entryId:c.location.entryId,detail:c.detail??null})}getModelContext(a){let b=g.FF.parse(a),c=this.currentRecord(b.source);return this.enqueueCommand(c,async()=>g.LK.parse(await (0,m.ls)(c.source.sessionId).readModelContext()))}send(a){let b=this.currentRecord(a.source);if((0,m.ls)(a.source.sessionId).nativeUi.hasPending)return Promise.reject(Error("请先处理当前插件问题,或停止当前任务"));let c=()=>b.workSession.send({mode:a.mode,text:a.text,images:a.images});return b.compactionStart?b.acceptingCommands?b.compactionStart.then(a=>{if(!b.acceptingCommands)throw new s(b.source.workId);return a?c():this.enqueueCommand(b,c)}):Promise.reject(new s(b.source.workId)):this.enqueueCommand(b,c)}interrupt(a){let b=this.currentRecord(a);return(0,m.ls)(a.sessionId).nativeUi.hasPending?b.workSession.interrupt():this.enqueueCommand(b,()=>b.workSession.interrupt())}compact(a){let b,c=this.currentRecord(a);if(c.compactionStart)return Promise.reject(Error("上下文正在压缩"));let d=new Promise(a=>{b=a});c.compactionStart=d;let e=this.enqueueCommand(c,()=>{try{let a=(0,m.ls)(c.source.sessionId).compact();return b(!0),a}catch(a){throw b(!1),a}});return e.then(()=>{b(!1),c.compactionStart===d&&(c.compactionStart=null)},()=>{b(!1),c.compactionStart===d&&(c.compactionStart=null)}),e}reload(a,b){let c=this.currentRecord(a);return(0,m.ls)(a.sessionId).nativeUi.cancelAll(),this.enqueueCommand(c,async()=>{try{await (0,m.ls)(c.source.sessionId).reload(b)}finally{this.recordsByWorkId.get(a.workId)===c&&await this.syncRecordRuntime(c)}})}restoreQueuedMessages(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>b.workSession.restoreQueuedMessages())}setTitle(a,b){let c=this.recordFor(a);return this.enqueueCommand(c,()=>c.workSession.setTitle(b))}setModel(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>b.workSession.setModel(a.model))}setCapabilityMode(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).setCapabilityMode(a.capabilityMode))}invokePluginMethod(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).invokePluginMethod(b.source,a.pluginName,a.method,a.input))}listNativeCommands(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).listNativeCommands())}executeNativeCommand(a,b,c){let d=this.currentRecord(a);return this.enqueueCommand(d,()=>(0,m.ls)(d.source.sessionId).executeNativeCommand(b,c))}listNativeTools(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).listNativeTools())}executeDirectBash(a,b){let c=this.currentRecord(a);return c.directBashActive?Promise.reject(new k.yT):(c.directBashActive=!0,this.enqueueCommand(c,()=>(0,m.ls)(c.source.sessionId).executeDirectBash(b)).finally(()=>{c.directBashActive=!1}))}abortDirectBash(a){let b=this.currentRecord(a);return(0,m.ls)(b.source.sessionId).abortDirectBash()}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}subscribeRecordChanges(a){return this.recordListeners.add(a),()=>this.recordListeners.delete(a)}subscribePluginPush(a){return this.pluginPushListeners.add(a),()=>this.pluginPushListeners.delete(a)}buildRecord(a){let b=this.sourceFor(a),c=(0,m.ls)(a.sessionId),d=c.readChatSnapshot(),e=d.entries.map((a,c)=>(0,l.Cz)(c,a.entryId,a.timestampMs,a.message,b,(0,j.P)())),f=h.oc.parse({messages:e,temporaryMessages:[],runtime:{...i.L6,extensionMode:(0,j.P)()?"basic":"normal",presentationMode:(0,j.P)()?"basic":"normal"}}),g=f.messages.find(a=>"user"===a.fixed.type),k=g?h.xE.safeParse(g.summary):null,n=k?.success&&k.data.text.trim()||null,o={workSession:a,source:b,state:f,sourceEventVersion:0,rawTemporaryMessages:new Map,metadata:{sessionTitle:d.sessionName??n,messageCounts:{user:f.messages.filter(a=>"user"===a.fixed.type).length,total:f.messages.length},lastMessageUpdatedAt:f.messages.at(-1)?.fixed.timestampMs??null},mainRunning:!1,backgroundTaskIds:new Set(c.readChatBackgroundTaskIds()),completedPending:!1,acceptingCommands:!0,directBashActive:!1,compactionStart:null,commandTail:Promise.resolve(),unsubscribeWorker:()=>void 0};return o.unsubscribeWorker=c.subscribeChat(a=>this.handleWorkerEvent(o,a)),o}handleWorkerEvent(a,b){if(this.recordsByWorkId.get(a.source.workId)!==a)return;let c=a.metadata,d=this.statusForRecord(a),e="basic"===a.state.runtime.extensionMode||"basic"===a.state.runtime.presentationMode;switch(b.type){case"message_start":a.rawTemporaryMessages.set(b.tempId,o(b.message)),this.applySourceEvent(a.source,{type:"message_start",snapshot:(0,l.QS)(b.tempId,b.message,a.source,!1,"temporary",e)});return;case"message_update":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);a.rawTemporaryMessages.set(b.tempId,o(b.message));let d=(0,l.Ht)(c,(0,l.QS)(b.tempId,b.message,a.source,!1,"update",e));d&&this.applySourceEvent(a.source,d);return}case"message_commit":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);let d=(0,l.QS)(b.tempId,b.message,a.source,!1,"final",e),f=(0,l.Ht)(c,d);f&&this.applySourceEvent(a.source,f),this.replaceCanonicalTemporary(a,b.tempId,b.message),a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_commit",location:{tempId:b.tempId},durable:{index:a.state.messages.length,entryId:b.entryId},fixed:{timestampMs:b.timestampMs}});return}case"message_discard":a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_discard",location:{tempId:b.tempId}});return;case"plugin_push":this.publishPluginPush({pluginName:b.pluginName,target:{scope:"session",source:a.source},event:b.event,data:structuredClone(b.data)});return;case"runtime_changed":{let c=h.wf.parse({...b.runtime,presentationMode:a.state.runtime.presentationMode});p(a.state.runtime,c)||this.applySourceEvent(a.source,{type:"runtime_update",runtime:c});return}case"agent_started":if(a.mainRunning)return;a.mainRunning=!0,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"main_operation_cancelled":case"main_operation_finished":if(!a.mainRunning)return;a.mainRunning=!1,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"agent_settled":{let b=a.mainRunning||a.backgroundTaskIds.size>0;a.mainRunning=!1,b&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"background_tasks_changed":{let e=a.mainRunning||a.backgroundTaskIds.size>0;a.backgroundTaskIds=new Set(b.taskIds),e&&!a.mainRunning&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"session_info_changed":a.metadata={...a.metadata,sessionTitle:b.sessionTitle},this.publishRecordChanged(a.source.workId,c,d);return}}replaceCanonicalTemporary(a,b,c){let d=a.state.temporaryMessages.findIndex(a=>a.location.tempId===b);if(d<0)throw Error(`Temporary chat message was not found: ${b}`);let e=[...a.state.temporaryMessages];e[d]=(0,l.QS)(b,c,a.source,!0,"final","basic"===a.state.runtime.extensionMode||"basic"===a.state.runtime.presentationMode),a.state={...a.state,temporaryMessages:e}}applySourceEvent(a,b){let c=this.currentRecord(a),d=c.source;if(c.state=(0,i.k_)(c.state,b),c.sourceEventVersion+=1,"message_commit"===b.type){let a=c.state.messages[b.durable.index];if(!a||a.location.entryId!==b.durable.entryId)throw Error(`Committed chat message is missing: ${b.durable.index}/${b.durable.entryId}`);let e=c.metadata;c.metadata=this.metadataFromState(c),this.publishRecordChanged(d.workId,e,this.statusForRecord(c))}this.publish({type:"source_event",source:d,version:c.sourceEventVersion,event:b})}metadataFromState(a){let b=a.state.messages.find(a=>"user"===a.fixed.type),c=b?h.xE.safeParse(b.summary):null,d=c?.success&&c.data.text.trim()||null;return{sessionTitle:a.metadata.sessionTitle??d,messageCounts:{user:a.state.messages.filter(a=>"user"===a.fixed.type).length,total:a.state.messages.length},lastMessageUpdatedAt:a.state.messages.at(-1)?.fixed.timestampMs??null}}enqueueCommand(a,b){if(!a.acceptingCommands)return Promise.reject(new s(a.source.workId));let c=a.commandTail.then(b,b);return a.commandTail=c.then(()=>void 0,()=>void 0),c}pluginReloadBlockReason(a){return(0,m.ls)(a.source.sessionId).nativeUi.hasPending?"原生插件问题正在等待回答":a.directBashActive?"Direct Bash 正在运行":a.mainRunning?"主 Agent 正在运行":a.backgroundTaskIds.size>0?"插件后台任务正在运行":(0,m.ls)(a.source.sessionId).readPluginReloadBlockReason()}async closeRecord(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,m.ls)(b.source.sessionId).nativeUi.cancelAll(),await b.commandTail,b.unsubscribeWorker(),b.rawTemporaryMessages.clear(),this.recordsByWorkId.delete(a))}recordFor(a){let b=this.recordsByWorkId.get(a.workId);if(!b||!this.matches(b.source,this.sourceFor(a)))throw Error(`WorkSession chat state is not initialized: ${a.workId}`);return b}sourceFor(a){return h.Pi.parse({workId:a.workId,sessionId:a.sessionId,branchId:a.branchId})}currentRecord(a){let b=h.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);if(!c||!this.matches(c.source,b))throw new q(b);return c}recordForSession(a,b){let c=[...this.recordsByWorkId.values()].find(c=>c.source.sessionId===a&&c.source.branchId===b);if(c)return c;throw new q({workId:"unknown",sessionId:a,branchId:b})}matches(a,b){return a.workId===b.workId&&a.sessionId===b.sessionId&&a.branchId===b.branchId}publishPluginPush(a){for(let b of[...this.pluginPushListeners])try{b(a)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Plugin Push 监听器执行失败",{pluginName:a.pluginName,event:a.event,errorName:b instanceof Error?b.name:"UnknownError"})}}publish(a){for(let b of[...this.listeners])try{b(a)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Source 事件监听器执行失败",{eventType:a.type,workId:a.source.workId,errorName:b instanceof Error?b.name:"UnknownError"})}}publishRecordChanged(a,b,c){for(let d of[...this.recordListeners])try{d(a,b,c)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Record 监听器执行失败",{workId:a,errorName:b instanceof Error?b.name:"UnknownError"})}}constructor(){this.recordsByWorkId=new Map,this.listeners=new Set,this.recordListeners=new Set,this.pluginPushListeners=new Set}}d()}catch(a){d(a)}})},48452:(a,b,c)=>{c.d(b,{Y:()=>f,n:()=>e});var d=c(59473);let e="X-Pi-Desk-Client-Id",f=d.Yj().uuid()},54733:(a,b,c)=>{c.d(b,{AA:()=>p,Bn:()=>v,C3:()=>j,Ck:()=>s,ER:()=>m,Jl:()=>w,Kx:()=>i,MT:()=>l,MY:()=>q,Ms:()=>x,TO:()=>n,_A:()=>k,eW:()=>g,ik:()=>h,jw:()=>o,kg:()=>r,qL:()=>u,uX:()=>t});var d=c(59473),e=c(83905),f=c(2364);let g=d.Yj().trim().min(1),h=e.m4,i=e.$E,j=e.Rv,k=d.Yj().trim().min(1),l=d.ai().int().nonnegative(),m=d.Ik({workId:g,cwd:h,sessionId:i}).strict(),n=d.YO(m),o=d.k5(["main_running","background_running","completed","idle"]),p=d.Ik({user:d.ai().int().nonnegative(),total:d.ai().int().nonnegative()}).strict().refine(a=>a.user<=a.total,{message:"user message count cannot exceed total message count"}),q=m.extend({branchId:k,projectName:d.Yj().trim().min(1),sessionTitle:d.Yj().trim().min(1).nullable(),status:o,messageCounts:p,lastMessageUpdatedAt:f.k.nullable()}).strict(),r=d.Ik({workSessions:d.YO(q),pinnedCount:l}).strict().refine(a=>a.pinnedCount<=a.workSessions.length,{message:"pinnedCount cannot exceed work session count",path:["pinnedCount"]}),s=d.Ik({cwd:h,sessionId:i.optional()}).strict(),t=d.Ik({workSession:q}).strict(),u=d.Ik({workId:g,sessionId:i,title:d.Yj().trim().min(1)}).strict(),v=d.Ik({workId:g}).strict(),w=d.Ik({workIds:d.YO(g),pinnedCount:l}).strict().superRefine((a,b)=>{new Set(a.workIds).size!==a.workIds.length&&b.addIssue({code:"custom",message:"workIds cannot contain duplicates",path:["workIds"]}),a.pinnedCount>a.workIds.length&&b.addIssue({code:"custom",message:"pinnedCount cannot exceed workIds length",path:["pinnedCount"]})}),x=d.KC([d.Ik({workId:g,cwd:h,sessionId:i}).strict(),d.Ik({workId:g}).strict()])},62977:(a,b,c)=>{c.d(b,{$:()=>d});let d=c(59473).k5(["off","minimal","low","medium","high","xhigh","max"])},72904:(a,b,c)=>{c.d(b,{H:()=>g});var d=c(610);function e(a,b){return JSON.stringify(a)===JSON.stringify(b)}function f(a,b,c,d,f){for(let g of new Set([...Object.keys(b),...Object.keys(c)])){let h=b[g],i=Object.hasOwn(c,g),j=i?c[g]:null;if(e(h,j))continue;let k=i?function(a,b){if("string"==typeof a&&"string"==typeof b&&b.startsWith(a))return b.slice(a.length)||null;if(Array.isArray(a)&&Array.isArray(b)&&a.length<=b.length&&a.every((a,c)=>e(a,b[c]))){let c=b.slice(a.length);return c.length>0?c:null}return null}(h,j):null;null!==k?f[`${a}.${g.replace(/\\/g,"\\\\").replace(/\./g,"\\.")}`]=k:d[g]=j}}function g(a,b){var c,e;let g;if(a.fixed.type!==b.fixed.type)throw Error(`Chat message type changed: ${a.fixed.type}/${b.fixed.type}`);let h=(g={},a.fixed.viewKey!==b.fixed.viewKey&&(g.viewKey=b.fixed.viewKey),"status"in a.fixed&&"status"in b.fixed&&a.fixed.status!==b.fixed.status&&(g.status=b.fixed.status),a.fixed.hasDetail!==b.fixed.hasDetail&&(g.hasDetail=b.fixed.hasDetail),"usage"in a.fixed&&"usage"in b.fixed&&(c=a.fixed.usage)!==(e=b.fixed.usage)&&(null===c||null===e||c.inputTokens!==e.inputTokens||c.outputTokens!==e.outputTokens||c.cacheReadTokens!==e.cacheReadTokens||c.costUsd!==e.costUsd)&&(g.usage=b.fixed.usage),Object.keys(g).length>0?g:void 0),i={},j={},k={};f("summary",a.summary,b.summary,i,k),b.fixed.hasDetail&&f("detail",a.detail??{},b.detail??{},j,k);let l=Object.keys(i).length>0,m=Object.keys(j).length>0,n=Object.keys(k).length>0;return h||l||m||n?d.ef.parse({type:"message_update",location:a.location,...h?{fixed:h}:{},...l?{summary:i}:{},...m?{detail:j}:{},...n?{increments:k}:{}}):null}},79626:(a,b,c)=>{c.d(b,{N:()=>u,d:()=>t});var d=c(89409),e=c(59473),f=c(63719);let g=e.Ik({mode:e.k5(["sync","async"]),message:e.Yj()}).strict(),h="pi-desk/message-declaration-error",i=new WeakMap,j=e.Ik({viewKey:e.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/),summary:e.g1(e.Yj(),e.Pq()),detail:e.g1(e.Yj(),e.Pq()).nullable()}).strict();function k(a){switch(a.type){case"user":return"pi-desk/user";case"assistant":return"pi-desk/assistant";case"tool":{let b=a.name.toLowerCase().split(".").at(-1);if("pidesk"===b)return"pi-desk/pidesk";if("bash"===b)return"pi-desk/bash-tool";if("codemode"===b)return"pi-desk/codemode";return"read"===b||"write"===b||"edit"===b?`pi-desk/${b}`:"pi-desk/tool"}case"bash":return"pi-desk/bash";case"custom":return"pi-desk/custom";case"compaction":return"pi-desk/compaction"}}function l(a){return null===a||"object"!=typeof a||Array.isArray(a)?null:a}function m(a){return l(a.result)}function n(a,b){return{...a.summary,path:function(a){let b=a.arguments.path??a.arguments.file_path;if("string"!=typeof b)return null;let c=f.eC.safeParse(b);return c.success?c.data:null}(b)}}function o(a){if(a.declaration)return a.declaration.message;switch(a.type){case"user":return{kind:"user",text:a.text,images:a.images};case"assistant":return{kind:"assistant",text:a.text,thinking:a.thinking,stopReason:a.status};case"tool":return{kind:"tool",toolName:a.name,toolCallId:"",arguments:{},partialResult:null,result:a.output?{output:a.output}:null,isError:"error"===a.status};case"bash":return{kind:"bash",command:a.command,output:a.output,exitCode:"completed"===a.status?0:null,cancelled:"aborted"===a.status,truncated:!1};case"custom":return{kind:"custom",customType:"display-message",content:a.text,details:null};case"compaction":return{kind:"custom",customType:"pi-desk/compaction",content:"",details:a.summary?{text:a.summary}:null}}}function p(a,b,c){return{pluginName:"pi-desk",declarationName:a,builtin:!0,declaration:{priority:b,match:c,project:a=>a.defaultProjection}}}let q=[p("pidesk",-900,a=>"tool"===a.message.kind&&"pidesk"===a.message.toolName),p("read",-900,a=>"tool"===a.message.kind&&"read"===a.message.toolName),p("write",-900,a=>"tool"===a.message.kind&&"write"===a.message.toolName),p("edit",-900,a=>"tool"===a.message.kind&&"edit"===a.message.toolName),p("bash-tool",-900,a=>"tool"===a.message.kind&&"bash"===a.message.toolName),p("user",-1e3,a=>"user"===a.message.kind),p("assistant",-1e3,a=>"assistant"===a.message.kind),p("tool",-1e3,a=>"tool"===a.message.kind),p("bash",-1e3,a=>"bash"===a.message.kind),p("custom",-1e3,a=>"custom"===a.message.kind)];function r(a){var b;let c=a.error instanceof Error?a.error:null,d=a.candidate;for(let b of d?[d]:a.candidates??[]){let d=i.get(b.declaration)??new Set;d.has(a.phase)||(d.add(a.phase),i.set(b.declaration,d),console.warn("[Pi Desk][MessageDeclaration] 插件投影失败,保留基础展示入口",{pluginName:b.pluginName,declarationName:b.declarationName,phase:a.phase,message:(c?.message??"Message Declaration conflict").slice(0,2e3)}))}return{viewKey:h,summary:{text:"string"==typeof a.defaultProjection.summary.text?a.defaultProjection.summary.text:"",phase:a.phase,pluginName:d?.pluginName??null,declarationName:d?.declarationName??null},detail:{phase:a.phase,pluginName:d?.pluginName??null,declarationName:d?.declarationName??null,priority:d?.declaration.priority??null,errorName:c?.name??null,errorMessage:c?.message??String(a.error??"Message Declaration conflict"),errorStack:c?.stack??null,conflicts:(a.candidates??[]).map(a=>({pluginName:a.pluginName,declarationName:a.declarationName,priority:a.declaration.priority})),defaultProjection:{viewKey:(b=a.defaultProjection).viewKey,summary:b.summary,detail:b.detail}}}}function s(a,b,c,e,f,i,p){let s=function(a){let b=function(a){switch(a.type){case"user":return{viewKey:k(a),summary:{text:function(a){let b=a.text.lastIndexOf("\n\n");if(0===a.images.length||b<0)return a.text;let c=a.text.slice(b+2).split("\n");return c.length>a.images.length?a.text:c.every(b=>{let c=/^\[Image: original \d+x\d+, displayed at (\d+)x(\d+)\. Multiply coordinates by \d+\.\d{2} to map to original image\.\]$/.exec(b);return null!==c&&a.images.some(a=>a.width===Number(c[1])&&a.height===Number(c[2]))})?a.text.slice(0,b):a.text}(a),images:a.images.map(a=>({...a}))},detail:null};case"assistant":return{viewKey:k(a),summary:{text:a.text,errorMessage:a.errorMessage,...void 0===a.model?{}:{model:a.model}},detail:a.thinking.length>0?{thinking:a.thinking}:null};case"tool":{let b=k(a),c={...a.images?.length&&["pi-desk/tool","pi-desk/read","pi-desk/codemode"].includes(b)?{images:a.images.map(a=>({...a}))}:{},name:a.name,reasoning:a.reasoning,inputPreview:a.inputPreview,activity:a.activity},d=a.durationMs??null,e=a.startedAtMs??null,f={viewKey:b,summary:"pi-desk/bash-tool"===b?{...c,timing:null!==d?{durationMs:d}:null!==e?{startedAtMs:e}:null}:c,detail:"pi-desk/codemode"===b?{output:a.output,...a.nestedCalls?{nestedCalls:a.nestedCalls}:{}}:a.output?{output:a.output}:null},h=o(a);return"tool"===h.kind?function(a,b){let c=function(a){let b=m(a);if(!b)return null;let c=b.content;if("string"==typeof c)return c;if(Array.isArray(c)){let a=[],b=!1;for(let d of c){let c=l(d);c?.type==="text"&&"string"==typeof c.text&&(b=!0,a.push(c.text))}if(b)return a.join("\n")}return"string"==typeof b.output?b.output:null}(b)??("string"==typeof a.detail?.output?a.detail.output:null);switch(a.viewKey){case"pi-desk/pidesk":{let d=c??"";try{let a=g.safeParse(JSON.parse(d));a.success&&(d=a.data.message)}catch{}return{viewKey:a.viewKey,summary:{input:b.arguments},detail:{output:d}}}case"pi-desk/read":let d;return{viewKey:a.viewKey,summary:n(a,b),detail:Array.isArray(d=m(b)?.content)&&d.some(a=>{let b=l(a);return b?.type==="image"})||null===c?null:{content:c}};case"pi-desk/edit":{let d=l(m(b)?.details??null)?.diff;return{viewKey:a.viewKey,summary:n(a,b),detail:b.isError||"string"!=typeof d?null===c?null:{kind:"output",content:c}:{kind:"diff",content:d}}}case"pi-desk/write":{let d=b.arguments.content;return{viewKey:a.viewKey,summary:n(a,b),detail:b.isError&&null!==c?{kind:"output",content:c}:"string"==typeof d?{kind:"content",content:d}:null===c?null:{kind:"output",content:c}}}default:return a}}(f,h):f}case"bash":return{viewKey:k(a),summary:{command:a.command},detail:a.output?{output:a.output}:null};case"custom":return{viewKey:k(a),summary:{text:a.text},detail:null};case"compaction":return{viewKey:k(a),summary:{},detail:a.summary?{text:a.summary}:null}}}(a.message);if("compaction"===a.message.type)return b;let c={source:a.source,stage:a.stage,message:o(a.message),raw:a.message.declaration?.raw??a.message,defaultProjection:b},d=[...(a.declarations??[]).map(a=>({...a,builtin:!1})),...q];for(let a of[...new Set(d.map(a=>a.declaration.priority))].sort((a,b)=>b-a)){let e,f=d.filter(b=>b.declaration.priority===a),g=[];for(let a of f)try{a.declaration.match(c)&&g.push(a)}catch(c){return r({phase:"match",candidate:a,error:c,defaultProjection:b})}if(0===g.length)continue;if(g.length>1)return r({phase:"conflict",candidates:g,defaultProjection:b});let i=g[0];try{e=i.declaration.project(c)}catch(a){return r({phase:"project",candidate:i,error:a,defaultProjection:b})}try{return function(a,b){let c=j.parse(a);if(!b&&c.viewKey===h)throw Error("Host reserved Message Declaration Error viewKey cannot be registered");return c}(e,i.builtin)}catch(a){return r({phase:"validate",candidate:i,error:a,defaultProjection:b})}}return b}({source:e,stage:f,message:c,declarations:p}),t="tool"===c.type||"bash"===c.type||"custom"===c.type||"compaction"===c.type,u=null!==s.detail&&(!t||i),v={location:a,fixed:function(a,b,c){let d={timestampMs:a,viewKey:c.viewKey,hasDetail:null!==c.detail};switch(b.type){case"user":return{...d,type:"user"};case"assistant":return{...d,type:"assistant",status:b.status,usage:b.usage};case"tool":return{...d,type:"tool",status:b.status,usage:b.usage};case"bash":return{...d,type:"bash",status:b.status};case"custom":case"compaction":return{...d,type:"custom"}}}(b,c,s),summary:s.summary,...u?{detail:s.detail}:{}};return"tempId"in a?d.s4.parse(v):d.mj.parse(v)}function t(a,b,c,d,e=!1,f="temporary"){return s({tempId:a},null,b,c,f,e,d)}function u(a,b,c,d,e,f){return s({index:a,entryId:b},c,d,e,"durable",!0,f)}},83905:(a,b,c)=>{c.d(b,{$E:()=>f,Rv:()=>g,m4:()=>e});var d=c(59473);let e=d.Yj().trim().min(1),f=d.Yj().trim().min(1),g=d.Yj().trim().min(1)},89409:(a,b,c)=>{c.d(b,{D8:()=>I,Hf:()=>H,LJ:()=>j,Pc:()=>i,RX:()=>T,V6:()=>t,XM:()=>U,XW:()=>P,dG:()=>O,fK:()=>S,fb:()=>s,lJ:()=>B,mh:()=>m,mj:()=>M,q5:()=>A,s4:()=>L,wH:()=>Q,y0:()=>V});var d=c(59473),e=c(83905),f=c(63719),g=c(2364),h=c(25984);let i=d.Yj().uuid(),j=d.ai().int().nonnegative(),k=d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/),l=d.k5(["image/jpeg","image/png","image/webp","image/gif"]),m=d.Ik({mimeType:l,width:d.ai().int().positive(),height:d.ai().int().positive()}).strict(),n=d.k5(["running","completed","error","aborted"]),o=d.k5(["running","completed","error"]),p=d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER),q=d.Ik({inputTokens:p,outputTokens:p,cacheReadTokens:p,costUsd:d.ai().finite().nonnegative()}).strict(),r=d.Yj().trim().min(1).nullable(),s=d.Ik({tempId:i}).strict(),t=d.Ik({index:j,entryId:e.Rv}).strict(),u=d.Ik({timestampMs:g.k.nullable(),type:d.eu("user"),viewKey:k,hasDetail:d.zM()}).strict(),v=d.Ik({timestampMs:g.k.nullable(),type:d.eu("assistant"),viewKey:k,status:n,hasDetail:d.zM(),usage:q}).strict(),w=d.Ik({timestampMs:g.k.nullable(),type:d.eu("tool"),viewKey:k,status:o,hasDetail:d.zM(),usage:q.nullable()}).strict(),x=d.Ik({timestampMs:g.k.nullable(),type:d.eu("bash"),viewKey:k,status:n,hasDetail:d.zM()}).strict(),y=d.Ik({timestampMs:g.k.nullable(),type:d.eu("custom"),viewKey:k,hasDetail:d.zM()}).strict();function z(a){let b=u.extend({timestampMs:a}).strict(),c=v.extend({timestampMs:a}).strict(),e=w.extend({timestampMs:a}).strict(),f=x.extend({timestampMs:a}).strict(),g=y.extend({timestampMs:a}).strict();return{user:b,assistant:c,tool:e,bash:f,custom:g,message:d.gM("type",[b,c,e,f,g])}}d.gM("type",[u,v,w,x,y]);let A=z(d.ch()).message;z(g.k).message;let B=d.Ik({text:d.Yj(),images:d.YO(m)}).strict(),C=d.Ik({provider:d.Yj(),modelId:d.Yj()}).strict();d.Ik({text:d.Yj(),errorMessage:d.Yj().nullable().default(null),model:C.nullable().optional()}).strict();let D={name:d.Yj().trim().min(1),reasoning:r,inputPreview:r,activity:r};function E(){return d.Ik({...D,path:f.eC.nullable()}).strict()}d.Ik({...D,images:d.YO(m).optional()}).strict();let F=d.KC([d.Ik({startedAtMs:g.k}).strict(),d.Ik({durationMs:d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER)}).strict()]);d.Ik({...D,timing:F.nullable()}).strict(),E().extend({images:d.YO(m).optional()}).strict(),E(),E(),d.Ik({command:d.Yj().min(1)}).strict(),d.Ik({text:d.Yj()}).strict(),d.Ik({thinking:d.Yj()}).strict();let G=d.Ik({complete:d.zM(),calls:d.YO(d.Ik({name:d.Yj(),arguments:d.g1(d.Yj(),d.Pq()).optional(),argumentsBytes:d.ai().int().nonnegative().optional(),status:d.k5(["ok","error","unfinished"]),durationMs:d.ai().finite().nonnegative().optional(),error:d.Yj().optional()}).strict())}).strict();d.Ik({output:d.Yj(),nestedCalls:G.optional()}).strict(),d.Ik({output:d.Yj()}).strict(),d.Ik({content:d.Yj()}).strict(),d.gM("kind",[d.Ik({kind:d.eu("diff"),content:d.Yj()}).strict(),d.Ik({kind:d.eu("output"),content:d.Yj()}).strict()]),d.gM("kind",[d.Ik({kind:d.eu("content"),content:d.Yj()}).strict(),d.Ik({kind:d.eu("output"),content:d.Yj()}).strict()]),d.Ik({output:d.Yj()}).strict(),d.Ik({text:d.Yj().min(1)}).strict();let H=d.g1(d.Yj(),d.Pq()),I=d.g1(d.Yj(),d.Pq()),J=d.KC([I,d.ch()]);function K(a,b){return d.Ik({location:a,fixed:z(b).message,summary:H,detail:I.optional()}).strict().superRefine((a,b)=>{void 0===a.detail||a.fixed.hasDetail||b.addIssue({code:"custom",message:"message detail requires hasDetail=true",path:["detail"]})})}let L=K(s,d.ch()),M=K(t,g.k);function N(a,b){0===Object.keys(a).length&&b.addIssue({code:"custom",message:"patch requires at least one changed field"})}let O=d.Ik({viewKey:k.optional(),status:d.KC([n,o]).optional(),hasDetail:d.zM().optional(),usage:q.nullable().optional()}).strict().superRefine(N),P=d.g1(d.Yj(),d.Pq()).superRefine(N),Q=d.g1(d.Yj(),d.Pq()).superRefine(N),R=d.KC([d.Yj().min(1),d.YO(d.Pq()).min(1)]),S=d.g1(d.Yj(),R).superRefine((a,b)=>{for(let c of(N(a,b),Object.keys(a)))try{(0,h.U)(c)}catch(a){b.addIssue({code:"custom",message:a instanceof Error?a.message:"increment path is invalid",path:[c]})}}),T=d.Ik({messages:d.YO(M),temporaryMessages:d.YO(L)}).strict(),U=d.Ik({index:j,entryId:e.Rv,detail:J}).strict(),V=d.Ik({mimeType:l,data:d.Yj().min(1)}).strict()},96089:(a,b,c)=>{c.d(b,{R:()=>f});var d=c(59473),e=c(83905);let f=d.Ik({workId:d.Yj().trim().min(1),sessionId:e.$E,branchId:d.Yj().trim().min(1)}).strict()}};
@@ -0,0 +1 @@
1
+ "use strict";exports.id=70780,exports.ids=[70780],exports.modules={193:(a,b,c)=>{c.d(b,{OC:()=>u,Ot:()=>l,Xe:()=>m,ZI:()=>o,_X:()=>q,fg:()=>n,p0:()=>p,p3:()=>s,ry:()=>r,ys:()=>t});var d=c(59473),e=c(63719),f=c(66951),g=c(39792);let h=d.Ik({cwd:d.Yj().trim().min(1).max(4096),workId:d.Yj().trim().min(1).optional()}).strict(),i=h.extend({repositoryRoot:e.rh}),j=h.extend({path:e.eC,imagePreviewMode:e.p$}).superRefine((a,b)=>{a.workId||e._g.safeParse(a.path).success||b.addIssue({code:"custom",path:["path"],message:"独立项目预览只接受根内相对路径"})}),k=d.k5(["file","directory"]),l={path:"/api/project-files/reveal",request:h.extend({path:d.KC([e.rh,e.eC]),targetType:k.optional()}).refine(a=>""!==a.path||"directory"===a.targetType,"文件路径不能为空").refine(a=>a.workId&&"directory"!==a.targetType||e.rh.safeParse(a.path).success,"独立项目和目录定位只接受根内相对路径"),response:d.Ik({}).strict()},m={path:"/api/project-files/list",request:h.extend({path:e.rh}).strict(),response:e.JH},n={path:"/api/project-files/search",request:h.extend(e.Nu.shape).strict(),response:e.jI},o={path:"/api/project-files/get",request:j,response:e.ih},p={path:"/api/project-git/get",request:h.extend({refresh:d.zM().optional()}).strict(),response:d.Ik({repositories:d.YO(f.u2).max(100)}).strict()},q={path:"/api/project-git-heads/get",request:h,response:d.Ik({repositories:d.YO(f.yl).max(f.y2)}).strict()},r={path:"/api/project-git-branches/list",request:i.strict(),response:g.WW},s={path:"/api/project-git-log/list",request:i.extend(g.co.shape).strict(),response:g.yw},t={path:"/api/project-git-changes/list",request:i.extend(g.ph.shape).strict(),response:g.T8},u={path:"/api/project-git-diff/get",request:i.extend({path:e._g,comparison:g.xv.optional()}).strict(),response:g.lw}},8127:(a,b,c)=>{c.d(b,{m:()=>f});var d=c(52913),e=c(8602);function f(a){if(a instanceof Error&&"WorkSessionNotFoundError"===a.name)return(0,e.e)(404,"工作会话不存在",{key:"errors:sessionMissing"});if(a instanceof Error&&"WorkSessionProjectChangedError"===a.name)return(0,e.e)(409,"工作会话项目已变化",{key:"errors:projectChanged"});switch((0,d.C$)(a)){case"project-not-found":return(0,e.e)(404,"项目目录不存在",{key:"errors:projectMissing"});case"not-repository":return(0,e.e)(404,"Git 仓库不存在",{key:"errors:repositoryMissing"});case"outside-project":return(0,e.e)(403,"Git 目标不在当前项目目录内",{key:"errors:gitOutsideProject"});case"invalid-ref":return(0,e.e)(400,a instanceof Error?a.message:"Git 分支无效");case"scan-limit":return(0,e.e)(413,a instanceof Error?a.message:"Git 仓库过大");case"operation-failed":return(0,e.e)(409,a instanceof Error?a.message:"Git 操作失败");case"read-failed":return(0,e.e)(500,"读取 Git 仓库失败",{key:"errors:gitReadFailed"});case null:return null}}},11420:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{G:()=>l});var e=c(76760),f=c(23054),g=c(8602),h=c(52913),i=c(61371),j=c(8127),k=a([f,i]);function l(a,b){return async c=>{let d;try{d=await c.json()}catch{return(0,g.e)(400,"项目请求 JSON 格式无效",{key:"errors:projectJsonInvalid"})}let k=a.request.safeParse(d);if(!k.success)return(0,g.e)(400,"项目请求参数无效",{key:"errors:projectInputInvalid"});let l=k.data;if(!(0,e.isAbsolute)(l.cwd)||l.cwd.includes("\0"))return(0,g.e)(400,"项目目录必须是绝对路径",{key:"errors:projectCwdAbsolute"});try{let d;if(l.workId){let a=(0,f.JJ)(),b=await a.getWorkSession(l.workId);if(!b)return(0,g.e)(404,"工作会话不存在",{key:"errors:sessionMissing"});let c=a.getProjectPreviewContext(b,l.cwd);if(!c)return(0,g.e)(409,"工作会话项目已变化或预览目录未登记",{key:"errors:projectChanged"});l.cwd=c.cwd,d=c.isCurrent}let e=await b(l,c.signal);if(d&&!d())return(0,g.e)(409,"工作会话项目已变化",{key:"errors:projectChanged"});return(0,g.n)(a.response.parse(e))}catch(b){if(c.signal.aborted||console.warn("[Pi Desk][Project] 项目请求失败",{path:a.path,cwd:l.cwd,workId:l.workId,error:b instanceof Error?b.message:String(b)}),"read-failed"===(0,h.C$)(b))return(0,g.e)(500,b instanceof Error?b.message:"读取 Git 失败",b instanceof Error?void 0:{key:"errors:gitReadOperationFailed"});return(0,i.g)(b)??(0,j.m)(b)??(0,g.e)(500,"项目操作失败",{key:"errors:projectOperationFailed"})}}}[f,i]=k.then?(await k)():k,d()}catch(a){d(a)}})},39792:(a,b,c)=>{c.d(b,{T8:()=>q,WW:()=>r,aD:()=>g,co:()=>m,lw:()=>s,ph:()=>p,xi:()=>h,xv:()=>k,yw:()=>n});var d=c(59473),e=c(63719),f=c(66951);let g=d.Yj().regex(/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/),h=d.KC([g,d.eu("HEAD"),d.Yj().max(1024).regex(/^refs\/(?:heads|remotes)\/[^\0\r\n]+$/)]).refine(a=>!a.includes("..")&&!a.endsWith("/"),"Git 版本无效"),i=d.KC([d.Ik({commit:h,parent:g.optional()}).strict(),d.Ik({base:h,target:h,strategy:d.k5(["merge-base","direct"])}).strict()]),j=d.Ik({base:g.nullable(),target:g,original:g.nullable()}).strict(),k=d.Ik({baseCommit:g.nullable(),targetCommit:g,oldPath:e._g.optional()}).strict(),l=d.Ik({oid:g,parents:d.YO(g),subject:d.Yj(),author:d.Yj(),timestampMs:d.ai().int(),refs:d.YO(d.Yj())}).strict(),m=d.Ik({tip:h,exclude:h.optional(),query:d.Yj().trim().max(200).default(""),author:d.Yj().trim().max(200).optional(),page:d.Ik({index:d.ai().int().min(1).max(2e3),size:d.ai().int().min(1).max(100)}).strict()}).strict(),n=d.Ik({tip:g.nullable(),exclude:g.nullable(),items:d.YO(l),hasMore:d.zM(),truncated:d.zM()}).strict(),o=d.Ik({path:e._g,oldPath:e._g.nullable(),status:d.k5(["added","modified","deleted","renamed","type-changed"])}).strict(),p=d.Ik({selection:i,page:d.Ik({index:d.ai().int().min(1).max(5e4),size:d.ai().int().min(1).max(500)}).strict()}).strict(),q=d.Ik({comparison:j,commit:l.extend({message:d.Yj(),selectedParent:g.nullable()}).nullable(),items:d.YO(o),hasMore:d.zM(),truncated:d.zM()}).strict(),r=f.gf.extend({upstream:d.Ik({ref:d.Yj(),ahead:d.ai().int().nonnegative().nullable(),behind:d.ai().int().nonnegative().nullable()}).strict().nullable()}).strict(),s=d.KC([f.FJ,d.Ik({kind:d.eu("metadata"),original:d.Yj(),modified:d.Yj()}).strict()])},42932:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Z:()=>q,m:()=>k.m2});var e=c(51455),f=c(76760),g=c(63719),h=c(56752),i=c(8015),j=c(60351),k=c(46614),l=a([j]);function m(a,b){let c=Buffer.from((0,k.RH)(b.lines)),d=0,e=0,f=b=>(e+=c.subarray(d,b).toString("utf8").length,d=b,Math.min(a.length,e));return b.submatches.map(({start:a,end:b})=>({start:f(a),end:f(b)}))}async function n(a,b,c){if(!b)return!0;let d=c.get(b);if(d)return d;let g=(async()=>{let d=b.lastIndexOf("/");if(!await n(a,d<0?"":b.slice(0,d),c))return!1;let g=await (0,e.lstat)((0,f.resolve)(a,b));return g.isDirectory()&&!g.isSymbolicLink()})();return c.set(b,g),g}async function o(a,b,c,d,i){try{(0,k.Ze)(c,d);let j=b.lastIndexOf("/");if(!await n(a,j<0?"":b.slice(0,j),i))return!1;(0,k.Ze)(c,d);let l=(0,f.resolve)(a,b),m=await (0,e.lstat)(l);if(!m.isFile()||m.isSymbolicLink()||m.size>g.NL||!(0,h.C)(a,await (0,e.realpath)(l)))return!1;(0,k.Ze)(c,d);let o=await (0,e.open)(l,"r");try{let a=new TextDecoder("utf-8",{fatal:!0}),b=Buffer.alloc(65536),e=0;for(;;){(0,k.Ze)(c,d);let{bytesRead:f}=await o.read(b,0,b.length,null);if(0===f)break;if((e+=f)>g.NL)return!1;let h=b.subarray(0,f);if(h.includes(0))return!1;try{a.decode(h,{stream:!0})}catch{return!1}}try{a.decode()}catch{return!1}return!0}finally{await o.close()}}catch(a){if((0,k.Ze)(c,d),a instanceof Error&&"code"in a&&("ENOENT"===a.code||"ENOTDIR"===a.code))return!1;throw new k.m2("read-failed",`无法读取搜索文件:${b}`)}}async function p(a,b,c){return(0,k.Ze)(b,c),new Promise((d,e)=>{let f=()=>{clearTimeout(h),b?.removeEventListener("abort",g)},g=()=>{f(),e(b?.reason??new DOMException("搜索已取消","AbortError"))},h=setTimeout(()=>{f(),e(new k.m2("timeout","项目搜索超时,请缩小搜索范围"))},Math.max(1,c.deadline-Date.now()));b?.addEventListener("abort",g,{once:!0}),(0,i.LB)(a).then(d,e).finally(f)})}async function q(a,b,c){let d=Date.now(),h={deadline:d+1e4,outputBytes:0},i="index";try{let d;if((0,k.Ze)(c,h),!g.Nu.safeParse(b).success)throw new k.m2("invalid-pattern","搜索条件无效");try{if(d=await (0,e.realpath)(a),!(await (0,e.stat)(d)).isDirectory())throw new j.n("not-directory","项目根路径不是目录")}catch(a){if(a instanceof j.n)throw a;throw new j.n("not-found","项目目录不存在")}let l=await p(d,c,h);(0,k.Ze)(c,h);let n=l.files.filter(a=>g._g.safeParse(a).success),q={fileMatches:[],contentMatches:[],truncated:l.truncated},r=(0,k.dt)(b);if("content"!==b.scope)if(i="files",b.regex||b.wholeWord){let a=new Set(n),b=await (0,k.nB)(d,[...r,"--null-data","-"],h,c,b=>{let c=(0,k.RH)(b.lines).replace(/\0$/,"");return!a.has(c)||!(q.fileMatches.length>=g.lt)&&(q.fileMatches.push({path:c,ranges:m(c,b)}),!0)},function*(){for(let a of n)yield`${a}\0`}());q.truncated||=b}else{let a=n.flatMap(a=>{let c=function(a,b){let c,d,e=b.caseSensitive?a:a.toLocaleLowerCase(),g=b.caseSensitive?b.query:b.query.toLocaleLowerCase(),h=(0,f.basename)(e),i=e.length-h.length;if(h===g)c=0,d=Array.from({length:g.length},(a,b)=>i+b);else if(h.startsWith(g))c=100+h.length-g.length,d=Array.from({length:g.length},(a,b)=>i+b);else if(h.includes(g)){let a=h.indexOf(g);c=1e3+4*a+h.length,d=Array.from({length:g.length},(b,c)=>i+a+c)}else if(e.includes(g)){let a=e.indexOf(g);c=1e4+4*a+e.length,d=Array.from({length:g.length},(b,c)=>a+c)}else{d=[];let a=0;for(let b=0;b<e.length&&a<g.length;b+=1)e[b]===g[a]&&(d.push(b),a+=1);if(a!==g.length)return null;let b=d.at(-1)-d[0]+1-g.length;c=1e5+4*d[0]+b+e.length}let j=[],k=0;for(let c of a){let a=b.caseSensitive?c:c.toLocaleLowerCase();for(let b=0;b<a.length;b+=1)j.push({start:k,end:k+c.length});k+=c.length}let l=[];for(let a of d){let b=j[a],c=l.at(-1);c&&c.end>=b.start?c.end=Math.max(c.end,b.end):l.push({...b})}return{match:{path:a,ranges:l},score:c}}(a,b);return c?[c]:[]}).sort((a,b)=>a.score-b.score||a.match.path.localeCompare(b.match.path));q.fileMatches=a.slice(0,g.lt).map(({match:a})=>a),q.truncated||=a.length>g.lt}if("files"!==b.scope&&h.outputBytes<=4194304){i="content";let a=[],e=0,f=!1,j=!1,l=new Map,p=async()=>{let b=[];for(let e=0;e<a.length;e+=16){(0,k.Ze)(c,h);let f=a.slice(e,e+16);for(let[a,e]of(await Promise.allSettled(f.map(a=>o(d,a,c,h,l)))).entries()){if("rejected"===e.status)throw e.reason;e.value&&b.push(f[a])}}if(a=[],e=0,0===b.length)return;f=!0;let i=new Set(b);j=await (0,k.nB)(d,[...r,"--no-ignore","--hidden","--no-follow","--no-mmap","--threads","1","--encoding","utf-8","--max-filesize",String(g.NL),"--",...b.map(a=>`./${a}`)],h,c,a=>{let b,c,d,e,f=(0,k.RH)(a.path).replace(/^\.\//,"").replaceAll("\\","/");return!i.has(f)||!g._g.safeParse(f).success||!(q.contentMatches.length>=g.Ys)&&(q.contentMatches.push((b=(0,k.RH)(a.lines).replace(/\r?\n$/,""),c=m(b,a),d=Math.max(0,(c[0]?.start??0)-200),e=Math.min(b.length,d+g.w9),d>0&&/[\uDC00-\uDFFF]/.test(b[d])&&/[\uD800-\uDBFF]/.test(b[d-1])&&(d+=1),e<b.length&&/[\uD800-\uDBFF]/.test(b[e-1])&&/[\uDC00-\uDFFF]/.test(b[e])&&(e-=1),{path:f,line:a.line_number,text:b.slice(d,e),ranges:c.filter(a=>a.end>=d&&a.start<=e).map(a=>({start:Math.max(d,a.start)-d,end:Math.min(e,a.end)-d}))})),!0)}),q.truncated||=j};for(let b of n){(0,k.Ze)(c,h);let d=2*Math.max(b.length,Buffer.byteLength(b))+8;if(e+d>16e3&&await p(),j)break;a.push(b),e+=d}if(j||await p(),!f&&b.regex&&"content"===b.scope){let a=await (0,k.nB)(d,[...r,"-"],h,c,()=>!0);q.truncated||=a}q.contentMatches.sort((a,b)=>a.path.localeCompare(b.path)||a.line-b.line)}return(0,k.Ze)(c,h),q}catch(e){throw c?.aborted||e instanceof Error&&"AbortError"===e.name||console.warn("[Pi Desk][Project Search] 项目搜索失败",{cwd:a,scope:b.scope,stage:i,elapsedMs:Date.now()-d,reason:e instanceof Error?e.message:String(e)}),e}}j=(l.then?(await l)():l)[0],d()}catch(a){d(a)}})},46614:(a,b,c)=>{c.d(b,{RH:()=>k,Ze:()=>g,dt:()=>h,m2:()=>f,nB:()=>j});var d=c(31421),e=c(57075);class f extends Error{constructor(a,b){super(b),this.kind=a,this.name="L4ProjectSearchError"}}function g(a,b){if(a?.throwIfAborted(),Date.now()>=b.deadline)throw new f("timeout","项目搜索超时,请缩小搜索范围")}function h(a){return["--no-config","--json",a.caseSensitive?"--case-sensitive":"--ignore-case",...a.regex?[]:["--fixed-strings"],...a.wholeWord?["--word-regexp"]:[],"-e",a.query]}async function i(){try{return(await Promise.resolve().then(c.bind(c,57520))).rgPath}catch{throw new f("unavailable","项目搜索引擎不可用,请重新安装完整运行依赖")}}async function j(a,b,c,h,j,k){g(h,c);let l=await i();return g(h,c),new Promise((g,i)=>{let m,n=(0,d.spawn)(l,b,{cwd:a,shell:!1,windowsHide:!0,stdio:"pipe"}),o=Buffer.alloc(0),p=Buffer.alloc(0),q=!1,r=!1,s=k?e.Readable.from(k):null,t=()=>{r=!0,s?.unpipe(n.stdin),s?.destroy(),n.stdin.destroy(),n.kill()},u=()=>{m=h?.reason??new DOMException("搜索已取消","AbortError"),t()},v=setTimeout(()=>{m=new f("timeout","项目搜索超时,请缩小搜索范围"),t()},Math.max(1,c.deadline-Date.now())),w=a=>{if(0!==a.length)try{let b=JSON.parse(a.toString("utf8"));"match"!==b.type||j(b.data)||(q=!0,t())}catch(a){m=a instanceof f?a:new f("read-failed","无法解析项目搜索结果"),t()}};n.stdout.on("data",a=>{let b;if(r)return;let d=4194304-c.outputBytes;c.outputBytes+=a.length;let e=a.subarray(0,Math.max(0,d));for(o=Buffer.concat([o,e]);!r&&(b=o.indexOf(10))>=0;){if(b>1048576){c.outputBytes=4194305,q=!0,t();break}w(o.subarray(0,b)),o=o.subarray(b+1)}!r&&(o.length>1048576||c.outputBytes>4194304)&&(c.outputBytes=4194305,q=!0,t()),r&&(o=Buffer.alloc(0))}),n.stderr.on("data",a=>{let b=65536-p.length;b>0&&(p=Buffer.concat([p,a.subarray(0,b)]))}),n.stdin.on("error",a=>{"EPIPE"===a.code||"ERR_STREAM_DESTROYED"===a.code||r||(m=new f("read-failed","无法向项目搜索引擎传递文件列表"),t())}),n.once("error",()=>{m=new f("unavailable","项目搜索引擎无法启动,请检查运行依赖")}),n.once("close",a=>{clearTimeout(v),h?.removeEventListener("abort",u),s?.unpipe(n.stdin),s?.destroy(),n.stdin.destroy(),!r&&o.length>0&&w(o),o=Buffer.alloc(0);let b=p.toString("utf8");p=Buffer.alloc(0),m?i(m):q||0===a||1===a?g(q):/regex parse error|regex syntax error|error parsing.*regex|compiled regex exceeds size limit/i.test(b)?i(new f("invalid-pattern","正则表达式无效或包含不支持的语法")):i(new f("read-failed",`项目搜索读取失败:${b.trim()||`退出码 ${a}`}`))}),h?.addEventListener("abort",u,{once:!0}),h?.aborted?u():s?s.pipe(n.stdin):n.stdin.end()})}function k(a){return a.text??Buffer.from(a.bytes??"","base64").toString("utf8")}},61371:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{g:()=>i});var e=c(60351),f=c(42932),g=c(8602),h=a([e,f]);function i(a){if(a instanceof Error&&"WorkSessionNotFoundError"===a.name)return(0,g.e)(404,"工作会话不存在",{key:"errors:sessionMissing"});if(a instanceof Error&&"WorkSessionProjectChangedError"===a.name)return(0,g.e)(409,"工作会话项目已变化",{key:"errors:projectChanged"});if(a instanceof Error&&"AbortError"===a.name)return(0,g.e)(499,"项目搜索已取消",{key:"errors:projectSearchCancelled"});if(a instanceof f.m)switch(a.kind){case"invalid-pattern":return(0,g.e)(400,a.message,{key:"errors:projectSearchPatternInvalid"});case"unavailable":return(0,g.e)(503,a.message,{key:"errors:projectSearchUnavailable"});case"timeout":return(0,g.e)(504,a.message,{key:"errors:projectSearchTimeout"});case"read-failed":return(0,g.e)(500,a.message,{key:"errors:projectSearchReadFailed"})}switch((0,e.Vp)(a)){case"not-found":return(0,g.e)(404,"文件或目录不存在",{key:"errors:fileMissing"});case"not-directory":return(0,g.e)(400,"目标不是目录",{key:"errors:notDirectory"});case"not-file":return(0,g.e)(400,"目标不是文件",{key:"errors:notFile"});case"outside-project":return(0,g.e)(403,"目标不在当前项目目录内",{key:"errors:outsideProject"});case"text-too-large":return(0,g.e)(413,"文本文件超过 5MB,暂不支持在线预览",{key:"errors:textTooLarge"});case"image-too-large":return(0,g.e)(413,"图片过大,暂不支持在线预览",{key:"errors:imageTooLarge"});case"unsupported":return(0,g.e)(415,"当前文件类型不支持在线预览",{key:"errors:previewUnsupported"});case"read-failed":return(0,g.e)(500,"读取项目文件失败",{key:"errors:fileReadFailed"});case"reveal-failed":return(0,g.e)(500,"打开所在文件夹失败",{key:"errors:revealFailed"});case null:return null}}[e,f]=h.then?(await h)():h,d()}catch(a){d(a)}})}};