@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 +1 @@
1
- "use strict";exports.id=74528,exports.ids=[74528],exports.modules={49210:(a,b,c)=>{a.exports=c(44870)},60351:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Vp:()=>n,WT:()=>D,cv:()=>w,dy:()=>H,n:()=>K,wZ:()=>C});var e=c(31421),f=c(51455),g=c(76760),h=c(57975),i=c(42482),j=c(63719),k=c(52913),l=c(56752),m=a([i]);i=(m.then?(await m)():m)[0];let I=(0,h.promisify)(e.execFile),J=new Set([".git","node_modules",".next","dist","build","coverage",".turbo"]);class K extends Error{constructor(a,b){super(b),this.kind=a,this.name="L4WorkSessionProjectFileError"}}function n(a){return a instanceof K?a.kind:null}let L=new Map,M=new Map;function o(a,b){return a?`${a}/${b}`:b}function p(a){return a.length>0&&!a.includes("/")&&!a.includes("\\")&&!a.includes("\0")}function q(a){return a.split("/").some(a=>J.has(a))}async function r(a){try{let b=await (0,f.realpath)(a);if(!(await (0,f.stat)(b)).isDirectory())throw new K("not-directory",`Project root is not a directory: ${a}`);return b}catch(b){if(b instanceof K)throw b;throw new K("not-found",`Project root was not found: ${a}`)}}async function s(a,b){let c=b?(0,g.resolve)(a,...b.split("/")):a;if(!(0,l.C)(a,c))throw new K("outside-project",`Project path escapes root: ${b}`);try{let d=await (0,f.realpath)(c);if(!(0,l.C)(a,d))throw new K("outside-project",`Project path resolves outside root: ${b}`);return d}catch(a){if(a instanceof K)throw a;throw new K("not-found",`Project path was not found: ${b}`)}}async function t(a,b){if(!(0,g.isAbsolute)(b))return s(a,b);try{return await (0,f.realpath)((0,g.resolve)(b))}catch{throw new K("not-found",`Preview path was not found: ${b}`)}}async function u(a,b){let c,d,e=(0,g.isAbsolute)(b),h=(0,g.resolve)(a,b);if(!e&&!(0,l.C)(a,h))throw new K("outside-project",`Project path escapes root: ${b}`);try{c=await (0,f.realpath)((0,g.dirname)(h))}catch{throw new K("not-found",`Containing directory was not found: ${b}`)}if(!e&&!(0,l.C)(a,c))throw new K("outside-project",`Containing directory resolves outside root: ${b}`);if(!(await (0,f.stat)(c)).isDirectory())throw new K("not-directory",`Containing path is not a directory: ${b}`);try{d=await (0,f.realpath)(h)}catch(a){if(a instanceof Error&&"code"in a&&"ENOENT"===a.code)return{target:h,directory:c,exists:!1};throw new K("read-failed",`无法读取定位目标:${b}`)}if(!e&&!(0,l.C)(a,d))throw new K("outside-project",`Project path resolves outside root: ${b}`);if(!(await (0,f.stat)(d)).isFile())throw new K("not-file",`Target is not a file: ${b}`);return{target:d,directory:c,exists:!0}}async function v(a,b){await new Promise((c,d)=>{let f=(0,e.spawn)(a,b,{detached:!0,stdio:"ignore",windowsHide:!0}),g=a=>{f.off("spawn",h),d(a)},h=()=>{f.off("error",g),f.unref(),c()};f.once("error",g),f.once("spawn",h)})}async function w(a,b){let c,d,e,h=await r(a),i=await s(h,b);try{c=await (0,f.stat)(i)}catch{throw new K("not-found",`Directory was not found: ${b}`)}if(!c.isDirectory())throw new K("not-directory",`Target is not a directory: ${b}`);try{d=await (0,f.readdir)(i,{withFileTypes:!0})}catch{throw new K("read-failed",`Directory cannot be read: ${b}`)}let k=(await Promise.all(d.map(async a=>{if(J.has(a.name)||!p(a.name))return null;if(a.isDirectory())return{name:a.name,type:"directory"};if(a.isFile())return{name:a.name,type:"file"};if(!a.isSymbolicLink())return null;try{let b=await (0,f.realpath)((0,g.resolve)(i,a.name));if(!(0,l.C)(h,b))return null;let c=await (0,f.stat)(b);if(c.isDirectory())return{name:a.name,type:"directory"};if(c.isFile())return{name:a.name,type:"file"};return null}catch{return null}}))).filter(a=>null!==a).sort((a,b)=>a.type!==b.type?"directory"===a.type?-1:1:a.name.localeCompare(b.name,void 0,{numeric:!0,sensitivity:"base"}));return""===b&&(e=(0,l.b)(h),L.delete(e),M.delete(e)),{entries:k.slice(0,j.xm),truncated:k.length>j.xm}}let N={timeout:1e4,maxBuffer:0x4000000,env:{...process.env,LC_ALL:"C",GIT_OPTIONAL_LOCKS:"0"}};async function x(a){try{let{stdout:b}=await I("git",["-C",a,"rev-parse","--show-toplevel"],N),c=await (0,f.realpath)(b.trim()),d=(0,g.relative)(c,a).split(g.sep).join("/"),{stdout:e}=await I("git",["-C",c,"ls-files","--full-name","--cached","--others","--exclude-standard","-z","--",d||"."],N),h=d?`${d}/`:"",i=e.split("\0").flatMap(a=>{if(!a)return[];let b=h?a.startsWith(h)?a.slice(h.length):"":a;return b?[b]:[]}).filter(a=>p((0,g.basename)(a))&&!a.includes("\\")&&!q(a));return{files:i.slice(0,5e4),truncated:i.length>5e4}}catch{return null}}async function y(a,b,c){let d=b?(0,g.resolve)(a,...b.split("/")):a;try{let{stdout:a}=await I("git",["-C",d,"ls-files","--full-name","--cached","--others","--exclude-standard","-z"],N),e=a.split("\0").flatMap(a=>{if(!a||a.includes("\\")||q(a))return[];let d=o(b,a);return c.some(a=>d===a||d.startsWith(`${a}/`))?[]:p((0,g.basename)(d))?[d]:[]});return{files:e.slice(0,5e4),truncated:e.length>5e4}}catch{return null}}async function z(a,b=[]){let c=[],d=[{absolute:a,relative:""}],e=0;for(;e<d.length;){let a,h=d[e];e+=1;try{a=await (0,f.readdir)(h.absolute,{withFileTypes:!0})}catch{continue}for(let e of a){if(J.has(e.name)||!p(e.name))continue;let a=o(h.relative,e.name);if(e.isDirectory()){if(b.includes(a))continue;d.push({absolute:(0,g.resolve)(h.absolute,e.name),relative:a});continue}if(e.isFile()&&(c.push(a),c.length>=5e4))return{files:c,truncated:!0}}}return{files:c,truncated:!1}}async function A(a,b){let c=new Set,d=!1;if(!b.includes("")){let e=await z(a,b.filter(Boolean));for(let a of e.files)c.add(a);d||=e.truncated}for(let e of b){let f=b.filter(a=>a!==e&&(""===e||a.startsWith(`${e}/`))),h=await y(a,e,f);if(!h){let b=e?(0,g.resolve)(a,...e.split("/")):a,c=f.map(a=>e?a.slice(e.length+1):a),d=await z(b,c);h={files:d.files.map(a=>o(e,a)),truncated:d.truncated}}for(let a of h.files)if(c.add(a),c.size>=5e4)return{files:[...c],truncated:!0};d||=h.truncated}return{files:[...c],truncated:d}}async function B(a){let b=(0,l.b)(a),c=Date.now(),d=L.get(b);if(d&&d.expiresAt>c)return d;let e=M.get(b);if(e)return e;let f=Promise.resolve().then(async()=>{let d=await (0,k.py)(a),e={...d.length>0?await A(a,d):await x(a)??await z(a),expiresAt:c+3e4};if(M.get(b)===f){for(let[a,b]of L)b.expiresAt<=Date.now()&&L.delete(a);for(;L.size>=20;){let a=L.keys().next().value;L.delete(a)}L.set(b,e)}return e});M.set(b,f);try{return await f}finally{M.get(b)===f&&M.delete(b)}}async function C(a,b){let c=await r(a),d=await B(c),e=b.toLocaleLowerCase(),f=d.files.flatMap(a=>{let b=function(a,b){let c=a.toLocaleLowerCase(),d=(0,g.basename)(c);if(d===b)return 0;if(d.startsWith(b))return 100+d.length-b.length;let e=d.indexOf(b);if(e>=0)return 1e3+4*e+d.length;let f=c.indexOf(b);if(f>=0)return 1e4+4*f+c.length;let h=function(a,b){let c=0,d=-1,e=-1,f=0;for(let g=0;g<a.length&&c<b.length;g+=1)a[g]===b[c]&&(d<0&&(d=g),e>=0&&(f+=g-e-1),e=g,c+=1);return c===b.length?4*d+f:null}(c,b);return null===h?null:1e5+h+c.length}(a,e);return null===b?[]:[{path:a,score:b}]}).sort((a,b)=>a.score-b.score||a.path.localeCompare(b.path));return{matches:f.slice(0,j.lt).map(a=>a.path),truncated:d.truncated||f.length>j.lt}}async function D(a,b,c=v,d="file"){let e,g=await r(a);if("directory"===d){let a=await s(g,b);if(!(await (0,f.stat)(a)).isDirectory())throw new K("not-directory","当前路径不是目录");e={command:"win32"===process.platform?"explorer.exe":"darwin"===process.platform?"open":"xdg-open",args:[a]}}else{var h;h=await u(g,b),e="win32"===process.platform?h.exists?{command:"explorer.exe",args:["/select,",h.target]}:{command:"explorer.exe",args:[h.directory]}:"darwin"===process.platform?h.exists?{command:"open",args:["-R",h.target]}:{command:"open",args:[h.directory]}:{command:"xdg-open",args:[h.directory]}}try{await c(e.command,e.args)}catch{throw new K("reveal-failed",`Containing directory could not be opened: ${b}`)}}function E(a){if(a.length>=8&&137===a[0]&&80===a[1]&&78===a[2]&&71===a[3]&&13===a[4]&&10===a[5]&&26===a[6]&&10===a[7])return"image/png";if(a.length>=3&&255===a[0]&&216===a[1]&&255===a[2])return"image/jpeg";if(a.length>=6){let b=a.toString("ascii",0,6);if("GIF87a"===b||"GIF89a"===b)return"image/gif"}return a.length>=12&&"RIFF"===a.toString("ascii",0,4)&&"WEBP"===a.toString("ascii",8,12)?"image/webp":null}async function F(a){let b=await (0,f.open)(a,"r");try{let a=Buffer.alloc(16),{bytesRead:c}=await b.read(a,0,a.length,0);return a.subarray(0,c)}finally{await b.close()}}async function G(a,b,c){let d;try{d=await (0,i.default)(a,{animated:"image/gif"===b,limitInputPixels:j.O_}).metadata()}catch{throw new K("unsupported","Image metadata is invalid")}let e=d.width??0,f=d.height??0;if(e<=0||f<=0||e*f>j.O_)throw new K("image-too-large","Image dimensions exceed limit");let g=a,h=b;if("compressed"===c&&"image/gif"!==b&&a.length>524288)try{let b=await (0,i.default)(a,{limitInputPixels:j.O_}).rotate().resize({width:2560,withoutEnlargement:!0}).webp({quality:85,alphaQuality:90,effort:3,smartSubsample:!0}).toBuffer();b.length<=.85*a.length&&(g=b,h="image/webp")}catch{}return{kind:"image",mimeType:h,data:g.toString("base64"),size:g.length}}async function H(a,b,c){let d,e,g,h=await r(a),i=await t(h,b);try{d=await (0,f.stat)(i)}catch{throw new K("not-found",`File was not found: ${b}`)}if(!d.isFile())throw new K("not-file",`Target is not a file: ${b}`);if(d.size>j.Db){let a=await F(i);throw new K(E(a)?"image-too-large":"text-too-large",`File exceeds preview limit: ${b}`)}try{e=await (0,f.readFile)(i)}catch{throw new K("read-failed",`File cannot be read: ${b}`)}if(e.length>j.Db)throw new K(E(e)?"image-too-large":"text-too-large",`File grew beyond limit: ${b}`);let k=E(e);if(k)return G(e,k,c);if(e.includes(0))throw new K("unsupported",`Binary file is unsupported: ${b}`);try{g=new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{throw new K("unsupported",`File is not valid UTF-8: ${b}`)}if(e.length>j.NL)throw new K("text-too-large",`Text file exceeds limit: ${b}`);return{kind:"text",content:g,size:e.length}}d()}catch(a){d(a)}})},81147:(a,b,c)=>{Object.defineProperty(b,"I",{enumerable:!0,get:function(){return g}});let d=c(70595),e=c(39346),f=c(3905);async function g(a,b,c,g){if((0,d.isNodeNextResponse)(b)){var h;b.statusCode=c.status,b.statusMessage=c.statusText;let d=["set-cookie","www-authenticate","proxy-authenticate","vary"];null==(h=c.headers)||h.forEach((a,c)=>{if("x-middleware-set-cookie"!==c.toLowerCase())if("set-cookie"===c.toLowerCase())for(let d of(0,f.splitCookiesString)(a))b.appendHeader(c,d);else{let e=void 0!==b.getHeader(c);(d.includes(c.toLowerCase())||!e)&&b.appendHeader(c,a)}});let{originalResponse:i}=b;c.body&&"HEAD"!==a.method?await (0,e.pipeToNodeResponse)(c.body,i,g):i.end()}}}};
1
+ "use strict";exports.id=74528,exports.ids=[74528],exports.modules={8015:(a,b,c)=>{c.d(b,{LB:()=>w,U4:()=>k,YY:()=>o,_E:()=>q});var d=c(31421),e=c(51455),f=c(76760),g=c(57975),h=c(52913),i=c(56752);let j=(0,g.promisify)(d.execFile),k=new Set([".git","node_modules",".next","dist","build","coverage",".turbo"]),l=new Map,m=new Map;function n(a,b){return a?`${a}/${b}`:b}function o(a){return a.length>0&&!a.includes("/")&&!a.includes("\\")&&!a.includes("\0")}function p(a){return a.split("/").some(a=>k.has(a))}function q(a){let b=(0,i.b)(a);l.delete(b),m.delete(b)}let r={timeout:1e4,maxBuffer:0x4000000,env:{...process.env,LC_ALL:"C",GIT_OPTIONAL_LOCKS:"0"}};async function s(a){try{let{stdout:b}=await j("git",["-C",a,"rev-parse","--show-toplevel"],r),c=await (0,e.realpath)(b.trim()),d=(0,f.relative)(c,a).split(f.sep).join("/"),{stdout:g}=await j("git",["-C",c,"ls-files","--full-name","--cached","--others","--exclude-standard","-z","--",d||"."],r),h=d?`${d}/`:"",i=g.split("\0").flatMap(a=>{if(!a)return[];let b=h?a.startsWith(h)?a.slice(h.length):"":a;return b?[b]:[]}).filter(a=>o((0,f.basename)(a))&&!a.includes("\\")&&!p(a));return{files:i.slice(0,5e4),truncated:i.length>5e4}}catch{return null}}async function t(a,b,c){let d=b?(0,f.resolve)(a,...b.split("/")):a;try{let{stdout:a}=await j("git",["-C",d,"ls-files","--full-name","--cached","--others","--exclude-standard","-z"],r),e=a.split("\0").flatMap(a=>{if(!a||a.includes("\\")||p(a))return[];let d=n(b,a);return c.some(a=>d===a||d.startsWith(`${a}/`))?[]:o((0,f.basename)(d))?[d]:[]});return{files:e.slice(0,5e4),truncated:e.length>5e4}}catch{return null}}async function u(a,b=[]){let c=[],d=[{absolute:a,relative:""}],g=0;for(;g<d.length;){let a,h=d[g];g+=1;try{a=await (0,e.readdir)(h.absolute,{withFileTypes:!0})}catch{continue}for(let e of a){if(k.has(e.name)||!o(e.name))continue;let a=n(h.relative,e.name);if(e.isDirectory()){if(b.includes(a))continue;d.push({absolute:(0,f.resolve)(h.absolute,e.name),relative:a});continue}if(e.isFile()&&(c.push(a),c.length>=5e4))return{files:c,truncated:!0}}}return{files:c,truncated:!1}}async function v(a,b){let c=new Set,d=!1;if(!b.includes("")){let e=await u(a,b.filter(Boolean));for(let a of e.files)c.add(a);d||=e.truncated}for(let e of b){let g=b.filter(a=>a!==e&&(""===e||a.startsWith(`${e}/`))),h=await t(a,e,g);if(!h){let b=e?(0,f.resolve)(a,...e.split("/")):a,c=g.map(a=>e?a.slice(e.length+1):a),d=await u(b,c);h={files:d.files.map(a=>n(e,a)),truncated:d.truncated}}for(let a of h.files)if(c.add(a),c.size>=5e4)return{files:[...c],truncated:!0};d||=h.truncated}return{files:[...c],truncated:d}}async function w(a){let b=(0,i.b)(a),c=Date.now(),d=l.get(b);if(d&&d.expiresAt>c)return d;let e=m.get(b);if(e)return e;let f=Promise.resolve().then(async()=>{let d=await (0,h.py)(a),e={...d.length>0?await v(a,d):await s(a)??await u(a),expiresAt:c+3e4};if(m.get(b)===f){for(let[a,b]of l)b.expiresAt<=Date.now()&&l.delete(a);for(;l.size>=20;){let a=l.keys().next().value;l.delete(a)}l.set(b,e)}return e});m.set(b,f);try{return await f}finally{m.get(b)===f&&m.delete(b)}}},49210:(a,b,c)=>{a.exports=c(44870)},60351:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Vp:()=>m,WT:()=>t,cv:()=>s,dy:()=>x,n:()=>y});var e=c(31421),f=c(51455),g=c(76760),h=c(42482),i=c(63719),j=c(56752),k=c(8015),l=a([h]);h=(l.then?(await l)():l)[0];class y extends Error{constructor(a,b){super(b),this.kind=a,this.name="L4WorkSessionProjectFileError"}}function m(a){return a instanceof y?a.kind:null}async function n(a){try{let b=await (0,f.realpath)(a);if(!(await (0,f.stat)(b)).isDirectory())throw new y("not-directory",`Project root is not a directory: ${a}`);return b}catch(b){if(b instanceof y)throw b;throw new y("not-found",`Project root was not found: ${a}`)}}async function o(a,b){let c=b?(0,g.resolve)(a,...b.split("/")):a;if(!(0,j.C)(a,c))throw new y("outside-project",`Project path escapes root: ${b}`);try{let d=await (0,f.realpath)(c);if(!(0,j.C)(a,d))throw new y("outside-project",`Project path resolves outside root: ${b}`);return d}catch(a){if(a instanceof y)throw a;throw new y("not-found",`Project path was not found: ${b}`)}}async function p(a,b){if(!(0,g.isAbsolute)(b))return o(a,b);try{return await (0,f.realpath)((0,g.resolve)(b))}catch{throw new y("not-found",`Preview path was not found: ${b}`)}}async function q(a,b){let c,d,e=(0,g.isAbsolute)(b),h=(0,g.resolve)(a,b);if(!e&&!(0,j.C)(a,h))throw new y("outside-project",`Project path escapes root: ${b}`);try{c=await (0,f.realpath)((0,g.dirname)(h))}catch{throw new y("not-found",`Containing directory was not found: ${b}`)}if(!e&&!(0,j.C)(a,c))throw new y("outside-project",`Containing directory resolves outside root: ${b}`);if(!(await (0,f.stat)(c)).isDirectory())throw new y("not-directory",`Containing path is not a directory: ${b}`);try{d=await (0,f.realpath)(h)}catch(a){if(a instanceof Error&&"code"in a&&"ENOENT"===a.code)return{target:h,directory:c,exists:!1};throw new y("read-failed",`无法读取定位目标:${b}`)}if(!e&&!(0,j.C)(a,d))throw new y("outside-project",`Project path resolves outside root: ${b}`);if(!(await (0,f.stat)(d)).isFile())throw new y("not-file",`Target is not a file: ${b}`);return{target:d,directory:c,exists:!0}}async function r(a,b){await new Promise((c,d)=>{let f=(0,e.spawn)(a,b,{detached:!0,stdio:"ignore",windowsHide:!0}),g=a=>{f.off("spawn",h),d(a)},h=()=>{f.off("error",g),f.unref(),c()};f.once("error",g),f.once("spawn",h)})}async function s(a,b){let c,d,e=await n(a),h=await o(e,b);try{c=await (0,f.stat)(h)}catch{throw new y("not-found",`Directory was not found: ${b}`)}if(!c.isDirectory())throw new y("not-directory",`Target is not a directory: ${b}`);try{d=await (0,f.readdir)(h,{withFileTypes:!0})}catch{throw new y("read-failed",`Directory cannot be read: ${b}`)}let l=(await Promise.all(d.map(async a=>{if(k.U4.has(a.name)||!(0,k.YY)(a.name))return null;if(a.isDirectory())return{name:a.name,type:"directory"};if(a.isFile())return{name:a.name,type:"file"};if(!a.isSymbolicLink())return null;try{let b=await (0,f.realpath)((0,g.resolve)(h,a.name));if(!(0,j.C)(e,b))return null;let c=await (0,f.stat)(b);if(c.isDirectory())return{name:a.name,type:"directory"};if(c.isFile())return{name:a.name,type:"file"};return null}catch{return null}}))).filter(a=>null!==a).sort((a,b)=>a.type!==b.type?"directory"===a.type?-1:1:a.name.localeCompare(b.name,void 0,{numeric:!0,sensitivity:"base"}));return""===b&&(0,k._E)(e),{entries:l.slice(0,i.xm),truncated:l.length>i.xm}}async function t(a,b,c=r,d="file"){let e,g=await n(a);if("directory"===d){let a=await o(g,b);if(!(await (0,f.stat)(a)).isDirectory())throw new y("not-directory","当前路径不是目录");e={command:"win32"===process.platform?"explorer.exe":"darwin"===process.platform?"open":"xdg-open",args:[a]}}else{var h;h=await q(g,b),e="win32"===process.platform?h.exists?{command:"explorer.exe",args:["/select,",h.target]}:{command:"explorer.exe",args:[h.directory]}:"darwin"===process.platform?h.exists?{command:"open",args:["-R",h.target]}:{command:"open",args:[h.directory]}:{command:"xdg-open",args:[h.directory]}}try{await c(e.command,e.args)}catch{throw new y("reveal-failed",`Containing directory could not be opened: ${b}`)}}function u(a){if(a.length>=8&&137===a[0]&&80===a[1]&&78===a[2]&&71===a[3]&&13===a[4]&&10===a[5]&&26===a[6]&&10===a[7])return"image/png";if(a.length>=3&&255===a[0]&&216===a[1]&&255===a[2])return"image/jpeg";if(a.length>=6){let b=a.toString("ascii",0,6);if("GIF87a"===b||"GIF89a"===b)return"image/gif"}return a.length>=12&&"RIFF"===a.toString("ascii",0,4)&&"WEBP"===a.toString("ascii",8,12)?"image/webp":null}async function v(a){let b=await (0,f.open)(a,"r");try{let a=Buffer.alloc(16),{bytesRead:c}=await b.read(a,0,a.length,0);return a.subarray(0,c)}finally{await b.close()}}async function w(a,b,c){let d;try{d=await (0,h.default)(a,{animated:"image/gif"===b,limitInputPixels:i.O_}).metadata()}catch{throw new y("unsupported","Image metadata is invalid")}let e=d.width??0,f=d.height??0;if(e<=0||f<=0||e*f>i.O_)throw new y("image-too-large","Image dimensions exceed limit");let g=a,j=b;if("compressed"===c&&"image/gif"!==b&&a.length>524288)try{let b=await (0,h.default)(a,{limitInputPixels:i.O_}).rotate().resize({width:2560,withoutEnlargement:!0}).webp({quality:85,alphaQuality:90,effort:3,smartSubsample:!0}).toBuffer();b.length<=.85*a.length&&(g=b,j="image/webp")}catch{}return{kind:"image",mimeType:j,data:g.toString("base64"),size:g.length}}async function x(a,b,c){let d,e,g,h=await n(a),j=await p(h,b);try{d=await (0,f.stat)(j)}catch{throw new y("not-found",`File was not found: ${b}`)}if(!d.isFile())throw new y("not-file",`Target is not a file: ${b}`);if(d.size>i.Db){let a=await v(j);throw new y(u(a)?"image-too-large":"text-too-large",`File exceeds preview limit: ${b}`)}try{e=await (0,f.readFile)(j)}catch{throw new y("read-failed",`File cannot be read: ${b}`)}if(e.length>i.Db)throw new y(u(e)?"image-too-large":"text-too-large",`File grew beyond limit: ${b}`);let k=u(e);if(k)return w(e,k,c);if(e.includes(0))throw new y("unsupported",`Binary file is unsupported: ${b}`);try{g=new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{throw new y("unsupported",`File is not valid UTF-8: ${b}`)}if(e.length>i.NL)throw new y("text-too-large",`Text file exceeds limit: ${b}`);return{kind:"text",content:g,size:e.length}}d()}catch(a){d(a)}})},81147:(a,b,c)=>{Object.defineProperty(b,"I",{enumerable:!0,get:function(){return g}});let d=c(70595),e=c(39346),f=c(3905);async function g(a,b,c,g){if((0,d.isNodeNextResponse)(b)){var h;b.statusCode=c.status,b.statusMessage=c.statusText;let d=["set-cookie","www-authenticate","proxy-authenticate","vary"];null==(h=c.headers)||h.forEach((a,c)=>{if("x-middleware-set-cookie"!==c.toLowerCase())if("set-cookie"===c.toLowerCase())for(let d of(0,f.splitCookiesString)(a))b.appendHeader(c,d);else{let e=void 0!==b.getHeader(c);(d.includes(c.toLowerCase())||!e)&&b.appendHeader(c,a)}});let{originalResponse:i}=b;c.body&&"HEAD"!==a.method?await (0,e.pipeToNodeResponse)(c.body,i,g):i.end()}}}};
@@ -25,7 +25,7 @@ ${this.initialization.describeStage()}`))}async runSessionLifecycle(a,b=15e3){if
25
25
 
26
26
  ${k(a.usage)}`;case"model_change":return`${a.provider}/${c?.getModel(a.provider,a.modelId)?.name||a.modelId}`;case"thinking_level_change":return a.thinkingLevel;case"session_info":return a.name??"";case"label":return a.label??"已清除标签"}}(d,l(a),c);return{entryId:b,kind:m(d),content:e.length<=65536?e:e.slice(0,65536),truncated:e.length>65536}}function p(a,b){let c=a.getEntry(b);if(!c)throw new f(b);if("message"!==c.type||"user"!==c.message.role)throw new g(b);return{selectedEntryId:b,targetLeafEntryId:c.parentId,editorText:h(c.message.content)}}function q(a,b){let c=a.getEntry(b);if(!c)throw new f(b);return a.getLeafId()===b?{selectedEntryId:b,targetLeafEntryId:b,editorText:null,changed:!1}:"message"===c.type&&"user"===c.message.role?{selectedEntryId:b,targetLeafEntryId:c.parentId,editorText:h(c.message.content),changed:a.getLeafId()!==c.parentId}:"custom_message"===c.type?{selectedEntryId:b,targetLeafEntryId:c.parentId,editorText:h(c.content),changed:a.getLeafId()!==c.parentId}:{selectedEntryId:b,targetLeafEntryId:b,editorText:null,changed:!0}}},47511:(a,b,c)=>{c.d(b,{Dl:()=>o,Qg:()=>m,RC:()=>q,a4:()=>k,dO:()=>j,j0:()=>n});var d=c(59473);let e=d.Yj().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=d.Yj().trim().min(1).max(256),g=d.Ik({allow:d.YO(f).max(5e3).optional(),deny:d.YO(f).max(5e3).optional()}).strict(),h=d.Ik({value:d.Yj().trim().min(1).max(256),label:d.Yj().trim().min(1).max(120).optional(),description:d.Yj().trim().max(1e3).optional()}).strict(),i=d.Ik({label:d.Yj().trim().min(1).max(120),options:d.YO(h).max(5e3)}).strict(),j=d.g1(e,i),k=d.Yj().min(1).max(64),l=d.Ik({name:d.Yj().trim().min(1).max(64),tools:g.optional(),skills:g.optional(),plugins:d.g1(e,d.g1(e,g)).optional()}).strict(),m=d.g1(k,l).refine(a=>Object.keys(a).length<=100,"最多保存 100 个能力模式").refine(a=>new Set(Object.values(a).map(a=>a.name)).size===Object.keys(a).length,"模式名称不能重复"),n=d.g1(k,l.shape.name),o=d.Ik({tools:d.YO(h),skills:d.YO(h),plugins:d.g1(e,j)}).strict();function p(a,b){let c=0,d=0,e=-1,f=0;for(;d<b.length;)if("*"===a[c])e=c++,f=d;else if(a[c]===b[d])c+=1,d+=1;else{if(!(e>=0))return!1;c=e+1,d=++f}for(;"*"===a[c];)c+=1;return c===a.length}function q(a,b){return(a?.allow===void 0||a.allow.some(a=>p(a,b)))&&!a?.deny?.some(a=>p(a,b))}d.Ik({tools:g,skills:g,capabilities:d.g1(e,g)}).strict()},49080:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{A:()=>l});var e=c(73024),f=c(76760),g=c(75430),h=c(78262),i=c(28802),j=a([g,h,i]);[g,h,i]=j.then?(await j)():j;let m=new Set(["off","minimal","low","medium","high","xhigh","max"]);function k(a,b){return`${a}\u0000${b}`}async function l(a,b=process.cwd()){let c=(0,g.getAgentDir)(),d=a?.modelRuntime??await g.ModelRuntime.create({authPath:(0,f.join)(c,"auth.json"),modelsPath:(0,f.join)(c,"models.json")}),j=a?.settingsManager??g.SettingsManager.create(b,c);await d.refresh({allowNetwork:!1});let n=j.getEnabledModels(),o=n?.length?(await (0,g.resolveModelScopeWithDiagnostics)(n,d)).scopedModels.map(a=>a.model):[...await d.getAvailable()],p=new Map;for(let a of(0,h.oj)(o,d))p.set(k(a.provider,a.id),a);let q=[...p.values()].map(a=>({provider:a.provider,modelId:a.id,name:a.name,input:[...a.input],kind:d.getPhysicalModel(a.provider,a.id)?"physical":"virtual",contextWindow:a.contextWindow>0?a.contextWindow:null,thinkingLevels:[...(0,i.getSupportedThinkingLevels)(a)]})),r=new Map(q.map(a=>[k(a.provider,a.modelId),a])),s=[],t=0;for(let a of function(){let a=(0,f.join)((0,g.getAgentDir)(),"models.json");if(!(0,e.existsSync)(a))return[];try{let b=JSON.parse((0,e.readFileSync)(a,"utf8"));return Array.isArray(b.modelPresets)?b.modelPresets:[]}catch(b){return console.warn("[Pi Desk][PiModelCatalog] models.json 读取失败",{path:a,errorName:b instanceof Error?b.name:"UnknownError"}),[]}}()){if("string"!=typeof a.provider||!a.provider.trim()||"string"!=typeof a.modelId||!a.modelId.trim()||"string"!=typeof a.thinkingLevel||!m.has(a.thinkingLevel)||void 0!==a.color&&null!==a.color&&"string"!=typeof a.color){t+=1;continue}let b=a.thinkingLevel,c=r.get(k(a.provider,a.modelId));if(!c||!c.thinkingLevels.includes(b)){t+=1;continue}s.push({provider:a.provider,modelId:a.modelId,thinkingLevel:b,color:"string"==typeof a.color&&a.color.trim()?a.color:null})}return t>0&&console.warn("[Pi Desk][PiModelCatalog] 已忽略无效或不可用的模型预设",{cwd:a?.sessionManager.getCwd()??b,count:t}),{models:q,presets:s}}d()}catch(a){d(a)}})},54174:(a,b,c)=>{c.d(b,{Z:()=>i,f1:()=>j});let d=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;class e extends Error{constructor(a){super(a),this.name="L4PiImageValidationError"}}function f(a,b){if(!Number.isSafeInteger(a)||a<=0)throw new e(`图片 ${b} 无效`);return a}let g=new Set([192,193,194,195,197,198,199,201,202,203,205,206,207]);function h(a,b){return a[b]|a[b+1]<<8|a[b+2]<<16}function i(a){if(!a||a.startsWith("data:")||!d.test(a))throw new e("图片 Base64 无效");let b=Buffer.from(a,"base64");if(0===b.length)throw new e("图片内容为空");let c=function(a){if(a.length>=8&&137===a[0]&&80===a[1]&&78===a[2]&&71===a[3]&&13===a[4]&&10===a[5]&&26===a[6]&&10===a[7])return"image/png";if(a.length>=3&&255===a[0]&&216===a[1]&&255===a[2])return"image/jpeg";if(a.length>=10&&["GIF87a","GIF89a"].includes(a.toString("ascii",0,6)))return"image/gif";if(a.length>=16&&"RIFF"===a.toString("ascii",0,4)&&"WEBP"===a.toString("ascii",8,12))return"image/webp";throw new e("图片格式不受支持")}(b);return{bytes:b,metadata:{mimeType:c,...function(a,b){switch(b){case"image/png":if(a.length<24||"IHDR"!==a.toString("ascii",12,16))throw new e("PNG 图片头无效");return{width:f(a.readUInt32BE(16),"宽度"),height:f(a.readUInt32BE(20),"高度")};case"image/jpeg":let c=2;for(;c+3<a.length;){for(;c<a.length&&255!==a[c];)c+=1;for(;c<a.length&&255===a[c];)c+=1;if(c>=a.length)break;let b=a[c];if(c+=1,216===b||1===b||b>=208&&b<=215)continue;if(217===b||218===b||c+1>=a.length)break;let d=a.readUInt16BE(c);if(d<2||c+d>a.length)break;if(g.has(b)){if(d<7)break;return{width:f(a.readUInt16BE(c+5),"宽度"),height:f(a.readUInt16BE(c+3),"高度")}}c+=d}throw new e("JPEG 图片尺寸无效");case"image/gif":if(a.length<10)throw new e("GIF 图片头无效");return{width:f(a.readUInt16LE(6),"宽度"),height:f(a.readUInt16LE(8),"高度")};case"image/webp":return function(a){let b=a.toString("ascii",12,16);if("VP8X"===b){if(a.length<30)throw new e("WebP VP8X 图片头无效");return{width:f(h(a,24)+1,"宽度"),height:f(h(a,27)+1,"高度")}}if("VP8L"===b){if(a.length<25||47!==a[20])throw new e("WebP VP8L 图片头无效");let b=a[21],c=a[22],d=a[23],g=a[24];return{width:f(1+((63&c)<<8|b),"宽度"),height:f(1+((15&g)<<10|d<<2|(192&c)>>6),"高度")}}if("VP8 "===b){if(a.length<30||157!==a[23]||1!==a[24]||42!==a[25])throw new e("WebP VP8 图片头无效");return{width:f(16383&a.readUInt16LE(26),"宽度"),height:f(16383&a.readUInt16LE(28),"高度")}}throw new e("WebP 图片编码无效")}(a)}}(b,c)}}}function j(a){let b=i(a.data);if(b.metadata.mimeType!==a.mimeType)throw new e("图片 MIME 与实际内容不一致");if(b.metadata.width!==a.width||b.metadata.height!==a.height)throw new e("图片尺寸与实际内容不一致");return b}},56752:(a,b,c)=>{c.d(b,{C:()=>f,b:()=>e});var d=c(76760);function e(a){return"win32"===process.platform?a.toLocaleLowerCase():a}function f(a,b){let c=(0,d.relative)(a,b);return""===c||!c.startsWith(`..${d.sep}`)&&".."!==c&&!(0,d.isAbsolute)(c)}},56971:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{o:()=>o});var e=c(51455),f=c(48161),g=c(76760),h=c(58417),i=c(73589),j=a([i]);function k(a,b){let c=(0,g.relative)(a,b);return""===c||!c.startsWith("..")&&!(0,g.isAbsolute)(c)}async function l(a){try{return await (0,e.realpath)(a)}catch{return(0,g.resolve)(a)}}function m(a){return"win32"===process.platform?a.toLowerCase():a}async function n(a){try{if((await (0,e.stat)(a)).isFile())return{version:null,description:null,hasNodeEntry:!1,error:null};let b=JSON.parse(await (0,e.readFile)((0,g.join)(a,"package.json"),"utf8"));if(!b||"object"!=typeof b||Array.isArray(b))throw Error("package.json 必须是对象");return{version:"string"==typeof b.version?b.version:null,description:(0,h._C)(b),hasNodeEntry:b.piDesk?.entry!==void 0||b.piDesk?.global!==void 0,hasNativeEntries:Array.isArray(b.pi?.extensions)&&b.pi.extensions.length>0,error:null}}catch(a){if(a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code)return{version:null,description:null,hasNodeEntry:!1,error:null};return{version:null,description:null,hasNodeEntry:!1,error:a instanceof Error?a.message:String(a)}}}async function o(a,b,c){let d=c.SettingsManager.create(a,b,{projectTrusted:!1}),h=new c.DefaultPackageManager({cwd:a,agentDir:b,settingsManager:d}),j=d.drainErrors().map(({error:a})=>a.message),o=new Map,p=new Map;for(let a of h.listConfiguredPackages()){if("user"!==a.scope)continue;let b=a.installedPath?await l(a.installedPath):null,c=b?await n(b):null,d=b?p.get(m(b)):void 0;b&&!d&&p.set(m(b),a.source),o.set(a.source,{source:a.source,kind:"package",path:b,nativePaths:[],hasPiResources:!0,piDeskRoot:b&&c?.hasNodeEntry&&!d?b:null,version:c?.version??null,description:c?.description??null,enabled:!0,error:d?`此目录已由 ${d} 声明,不能重复加载`:b?c?.error??null:"插件包未安装或安装目录不存在"})}let q=(0,g.join)(b,"extensions"),r=new Set;try{for(let a of(await (0,e.readdir)(q,{withFileTypes:!0})))if(!a.name.startsWith(".")&&"node_modules"!==a.name&&(a.isDirectory()||a.isSymbolicLink()))try{let b=await l((0,g.join)(q,a.name));(await (0,e.stat)(b)).isDirectory()&&r.add(b)}catch(b){j.push(`${a.name}: ${b instanceof Error?b.message:String(b)}`)}}catch(a){a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code||j.push(a instanceof Error?a.message:String(a))}for(let a of d.getGlobalSettings().extensions??[]){if(/^[!+-]|[?*{}]/.test(a))continue;let c=await l(a.startsWith("~/")?(0,g.join)((0,f.homedir)(),a.slice(2)):(0,g.resolve)(b,a));try{(await (0,e.stat)(c)).isDirectory()&&r.add(c)}catch{}}let s=[...r].sort((a,b)=>b.length-a.length);try{let a=await h.resolve(async()=>"skip");for(let a of o.values())a.hasPiResources=!1;for(let b of[...a.extensions,...a.skills,...a.prompts,...a.themes])if(b.enabled&&"user"===b.metadata.scope&&"package"===b.metadata.origin){let a=o.get(b.metadata.source);a&&(a.hasPiResources=!0)}for(let b of a.extensions){if("user"!==b.metadata.scope)continue;let a=await l(b.path);if("package"===b.metadata.origin){let c=o.get(b.metadata.source);c&&b.enabled&&!c.nativePaths.includes(a)&&c.nativePaths.push(a);continue}let c=s.find(b=>k(b,a))??a,d=[...p].find(([b])=>k(b,m(a)));if(d){let c=o.get(d[1]);b.enabled&&c&&!c.nativePaths.includes(a)&&c.nativePaths.push(a),j.push(`扩展入口 ${a} 与已配置包 ${d[1]} 重复,保留包来源`);continue}let e=o.get(c);e||(e={source:c,kind:"extension",path:c,nativePaths:[],piDeskRoot:null,version:null,description:null,enabled:!1,error:null},o.set(c,e)),b.enabled&&(e.enabled=!0,e.nativePaths.includes(a)||e.nativePaths.push(a))}}catch(a){j.push(a instanceof Error?a.message:String(a))}for(let a of s){if([...p.keys()].some(b=>k(b,m(a))))continue;let b=await n(a),c=o.get(a);if(!c&&!b.hasNodeEntry&&!b.error)continue;let d=(await Promise.all(["index.ts","index.js"].map(b=>(0,e.stat)((0,g.join)(a,b)).then(a=>a.isFile(),()=>!1)))).some(Boolean),f=c??{source:a,kind:"extension",path:a,nativePaths:[],piDeskRoot:null,version:null,description:null,enabled:!b.hasNativeEntries&&!d,error:null};f.version=b.version,f.description=b.description,f.error=b.error,b.hasNodeEntry&&f.enabled&&(f.piDeskRoot=a),o.set(a,f)}let t=await (0,i.n)(b,h,d);for(let a of o.values())await t(a.source,a.path,"package"===a.kind)&&(a.enabled=!1);return{sources:[...o.values()].sort((a,b)=>a.source.localeCompare(b.source)),errors:j}}i=(j.then?(await j)():j)[0],d()}catch(a){d(a)}})},58417:(a,b,c)=>{c.d(b,{LD:()=>k,SZ:()=>f,_C:()=>j,mR:()=>e,w3:()=>g});var d=c(59473);let e=d.Yj().trim().min(1).max(128).regex(/^[a-zA-Z][a-zA-Z0-9._-]*$/),f=d.Yj().trim().url().max(2048).refine(a=>{let b=new URL(a);return["https:","http:"].includes(b.protocol)&&!b.username&&!b.password&&!b.search&&!b.hash},"插件源必须是 HTTP 或 HTTPS 仓库地址"),g=d.gM("mode",[d.Ik({mode:d.eu("auto")}).strict(),d.Ik({mode:d.eu("local")}).strict(),d.Ik({mode:d.eu("official")}).strict(),d.Ik({mode:d.eu("domestic")}).strict(),d.Ik({mode:d.eu("custom"),registry:f}).strict()]),h=d.Ik({description:d.Yj().trim().min(1).max(4e3).optional(),readme:d.Yj().trim().min(1).max(1024).optional()}),i=d.Ik({description:d.Yj().optional(),piDesk:d.Ik({i18n:d.g1(d.Yj().min(1).max(35),h).optional()}).passthrough().optional()}).passthrough();function j(a){let b=i.safeParse(a);if(!b.success)return null;let c=b.data.description?.trim();if(!c)return null;let d=Object.fromEntries(Object.entries(b.data.piDesk?.i18n??{}).slice(0,16).flatMap(([a,b])=>b.description?[[a,b.description]]:[]));return Object.keys(d).length?{default:c,translations:d}:c}function k(a){let b=/^npm:((?:@[^/]+\/)?[^@]+)(?:@.+)?$/.exec(a);return b?`npm:${b[1]}`:a.replaceAll("\\","/")}},58801:(a,b,c)=>{c.a(a,async(a,d)=>{try{let n;c.d(b,{G:()=>m,N:()=>k});var e=c(93736),f=c(73024),g=c(76760),h=a([e]);e=(h.then?(await h)():h)[0];let o=(0,g.join)(process.cwd(),"package.json"),{createRequire:p}=process.getBuiltinModule("module"),q=(0,e.createJiti)((0,g.join)(process.env.PI_DESK_PI_PACKAGE_DIR??process.cwd(),"package.json")),r=new Map,s=0;function i(a){let b=r.get(a);return b&&(r.delete(a),r.set(a,b)),b}function j(a,b){let c=r.get(a);if(c&&(r.delete(a),s-=c.bytes),!(b.bytes>0x2000000)){for(;r.size>=512||s+b.bytes>0x2000000;){let a=r.entries().next().value;r.delete(a[0]),s-=a[1].bytes}r.set(a,b),s+=b.bytes}}function k(){r.size>0&&console.info("[Pi Desk][PluginResources] 已清除插件代码缓存",{fileCount:r.size,bytes:s}),r.clear(),s=0}async function l(){let[a,b,c,d,f,h,k,l,m]=await Promise.all([q.import("@earendil-works/pi-coding-agent"),q.import("@earendil-works/pi-agent-core"),q.import("@earendil-works/pi-tui"),q.import("@earendil-works/pi-ai/compat"),q.import("@earendil-works/pi-ai/oauth"),q.import("@earendil-works/pi-ai/providers/all"),q.import("typebox"),q.import("typebox/compile"),q.import("typebox/value")]),n=(0,e.createJiti)(o,{moduleCache:!1,fsCache:!1,tryNative:!1,virtualModules:{"@earendil-works/pi-coding-agent":a,"@earendil-works/pi-agent-core":b,"@earendil-works/pi-tui":c,"@earendil-works/pi-ai/providers/all":h,"@earendil-works/pi-ai/compat":d,"@earendil-works/pi-ai/oauth":f,"@earendil-works/pi-ai":d,"@mariozechner/pi-coding-agent":a,"@mariozechner/pi-agent-core":b,"@mariozechner/pi-tui":c,"@mariozechner/pi-ai/providers/all":h,"@mariozechner/pi-ai/compat":d,"@mariozechner/pi-ai/oauth":f,"@mariozechner/pi-ai":d,typebox:k,"typebox/compile":l,"typebox/value":m,"@sinclair/typebox":k,"@sinclair/typebox/compile":l,"@sinclair/typebox/value":m}}),p=n.options.transform;return n.options.transform=a=>(function(a,b){if(!a.filename)return b(a);let c=(0,g.resolve)(a.filename),d=i(c),e=d?.source===a.source?d:void 0,f=!0===a.async,h=e?.transforms.get(f);if(h)return h;let k=a.source,l=b(a);return l.error||l.code.includes("__JITI_ERROR__")||j(c,{source:k,transforms:new Map(e?.transforms).set(f,l),bytes:(e?.bytes??Buffer.byteLength(k))+Buffer.byteLength(l.code)}),l})(a,p),n}async function m(a,b=(0,g.dirname)(a)){let c=await (n??=l()),d=p(o).cache,e=(0,g.resolve)(b);for(let a of Object.keys(d)){let b=(0,g.relative)(e,a);b.startsWith("..")||(0,g.isAbsolute)(b)||b.split(/[\\/]/).includes("node_modules")||delete d[a]}try{let b,d=(0,g.resolve)(a),e=c.evalModule((b=(0,f.readFileSync)(d,"utf8"),i(d)?.source!==b&&j(d,{source:b,transforms:new Map,bytes:Buffer.byteLength(b)}),b),{filename:d,async:!1});return{default:e?.default??e}}catch(a){if(k(),a instanceof Error&&/await is only valid|top.level await|ERR_REQUIRE_ASYNC_MODULE/i.test(a.message))throw Error("Pi Desk Node Entry 不支持模块顶层 await,请将异步初始化放入 async setup()",{cause:a});throw a}}d()}catch(a){d(a)}})},61035:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{J:()=>l});var e=c(77598),f=c(73024),g=c(76760),h=c(75430),i=c(41904),j=a([h]);function k(){let a=Intl.DateTimeFormat().resolvedOptions();return i.J.parse({region:{locale:a.locale.toLowerCase().startsWith("zh")?"zh-CN":"en",timeZone:a.timeZone||"UTC"}})}h=(j.then?(await j)():j)[0];class m{constructor(a=(0,g.join)((0,h.getAgentDir)(),"pi-desk-settings.json"),b=k){this.path=a,this.defaults=b,this.snapshot=null,this.listeners=new Set,this.tail=Promise.resolve()}getSnapshot(){if(!this.snapshot)if((0,f.existsSync)(this.path))this.snapshot=i.J.parse(JSON.parse((0,f.readFileSync)(this.path,"utf8")));else{let a=i.J.parse(this.defaults());this.save(a),this.snapshot=a}return this.snapshot}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}update(a){let b=this.tail.then(()=>{let b=this.getSnapshot(),c=i.J.parse({region:{...b.region,...a}});if(JSON.stringify(b)!==JSON.stringify(c))for(let a of(this.save(c),this.snapshot=c,console.info("[Pi Desk][Settings] 共享地区设置已保存",c.region),this.listeners))try{a()}catch(a){console.error("[Pi Desk][Settings] 设置订阅回调失败",{message:a instanceof Error?a.message:String(a)})}});return this.tail=b.catch(()=>void 0),b}save(a){(0,f.mkdirSync)((0,g.dirname)(this.path),{recursive:!0});let b=`${this.path}.${process.pid}.${(0,e.randomUUID)()}.tmp`;try{(0,f.writeFileSync)(b,`${JSON.stringify(a,null,2)}
27
27
  `,"utf8"),(0,f.renameSync)(b,this.path)}finally{(0,f.existsSync)(b)&&(0,f.unlinkSync)(b)}}}function l(){return globalThis.__piDeskHostSettingsStore??=new m}d()}catch(a){d(a)}})},61518:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{O:()=>k});var e=c(77598),f=c(73024),g=c(76760),h=c(75430),i=c(47511),j=a([h]);h=(j.then?(await j)():j)[0];class l{constructor(a=function(){let a=(0,h.getAgentDir)(),b=(0,g.join)(a,"pi-desk-capability-modes.json"),c=(0,g.join)(a,"pi-super-capability-modes.json");return!(0,f.existsSync)(b)&&(0,f.existsSync)(c)&&(0,f.copyFileSync)(c,b),b}()){this.path=a,this.modes=null,this.listeners=new Set,this.tail=Promise.resolve()}read(){if(null===this.modes){let a=(0,f.existsSync)(this.path)?JSON.parse((0,f.readFileSync)(this.path,"utf8")):{modes:{}};if(!a||"object"!=typeof a||!("modes"in a))throw Error("能力模式配置缺少 modes");this.modes=i.Qg.parse(a.modes)}return structuredClone(this.modes)}subscribe(a){return this.listeners.add(a),()=>{this.listeners.delete(a)}}replace(a){let b=i.Qg.parse(a),c=this.tail.then(()=>{(0,f.mkdirSync)((0,g.dirname)(this.path),{recursive:!0});let a=`${this.path}.${process.pid}.${(0,e.randomUUID)()}.tmp`;try{(0,f.writeFileSync)(a,`${JSON.stringify({modes:b},null,2)}
28
- `,"utf8"),(0,f.renameSync)(a,this.path)}finally{(0,f.existsSync)(a)&&(0,f.unlinkSync)(a)}for(let a of(this.modes=structuredClone(b),this.listeners))try{a()}catch(a){console.error("[Pi Desk][Capabilities] 模式配置监听器失败",{message:a instanceof Error?a.message:String(a)})}});return this.tail=c.catch(()=>void 0),c}}function k(){return globalThis.__piDeskCapabilityModesStore??=new l}d()}catch(a){d(a)}})},63719:(a,b,c)=>{c.d(b,{CT:()=>p,Db:()=>i,JH:()=>r,NL:()=>h,O_:()=>j,_g:()=>m,eC:()=>n,ih:()=>t,jI:()=>s,lt:()=>g,p$:()=>o,rh:()=>l,uV:()=>e,xm:()=>f});var d=c(59473);let e=4096,f=5e3,g=100,h=5242880,i=0xa00000,j=5e7;function k(a,b){return""===a?b:!(a.length>e||a.startsWith("/")||a.includes("\\")||a.includes("\0")||/^[a-zA-Z]:/.test(a))&&a.split("/").every(a=>a.length>0&&"."!==a&&".."!==a)}let l=d.Yj().max(e).refine(a=>k(a,!0),"目录路径必须是规范相对路径"),m=d.Yj().min(1).max(e).refine(a=>k(a,!1),"文件路径必须是规范相对路径"),n=d.Yj().min(1).max(e).refine(a=>k(a,!1)||a.length>0&&a.length<=e&&!a.includes("\0")&&(a.startsWith("/")||a.startsWith("\\\\")||/^[a-zA-Z]:[\\/]/.test(a)),"预览路径必须是规范相对路径或绝对路径"),o=d.k5(["compressed","original"]),p=d.k5(["image/jpeg","image/png","image/webp","image/gif"]),q=d.Ik({name:d.Yj().min(1),type:d.k5(["directory","file"])}).strict(),r=d.Ik({entries:d.YO(q).max(f),truncated:d.zM()}).strict(),s=d.Ik({matches:d.YO(m).max(g),truncated:d.zM()}).strict(),t=d.gM("kind",[d.Ik({kind:d.eu("text"),content:d.Yj(),size:d.ai().int().nonnegative().max(h)}).strict(),d.Ik({kind:d.eu("image"),mimeType:p,data:d.Yj().min(1),size:d.ai().int().positive().max(i)}).strict()])},67062:(a,b,c)=>{c.d(b,{P:()=>h,WR:()=>g,YB:()=>i,Z$:()=>j,l3:()=>k});var d=c(59473);let e=d.Yj().max(65536),f=d.Ik({id:d.Yj().uuid(),title:e,expiresAt:d.ai().int().nonnegative().nullable()}),g=d.gM("method",[f.extend({method:d.eu("confirm"),message:e}).strict(),f.extend({method:d.eu("select"),options:d.YO(e).max(200)}).strict(),f.extend({method:d.eu("input"),placeholder:e}).strict(),f.extend({method:d.eu("editor"),prefill:e}).strict()]),h=d.Ik({requests:d.YO(g).max(32),statuses:d.g1(d.Yj().max(128),e),widgets:d.g1(d.Yj().max(128),d.Ik({lines:d.YO(e).max(200),placement:d.k5(["aboveEditor","belowEditor"])}).strict())}).strict(),i=d.Ik({id:d.Yj().uuid(),value:d.KC([d.zM(),e,d.ch()])}).strict(),j=d.gM("type",[d.Ik({type:d.eu("snapshot"),snapshot:h}).strict(),d.Ik({type:d.eu("notify"),message:e,level:d.k5(["info","warning","error"])}).strict(),d.Ik({type:d.eu("editor_text"),text:e,mode:d.k5(["replace","paste"])}).strict()]);function k(){return{requests:[],statuses:{},widgets:{}}}},69503:(a,b,c)=>{c.d(b,{D:()=>h,Yj:()=>i,s6:()=>e,xI:()=>f});var d=c(59473);let e="project-preview",f=32,g=d.Ik({directories:d.YO(d.Yj().min(1).max(4096)).max(f),defaultDirectory:d.Yj().min(1).max(4096).nullable()}).strict();function h(a){let b=g.safeParse(a);return b.success?b.data:{directories:[],defaultDirectory:null}}function i(a){let b=a.replaceAll("\\","/").replace(/\/+$/,"")||"/";return/^[a-z]:/i.test(b)||b.startsWith("//")?b.toLowerCase():b}},69765:(a,b,c)=>{c.d(b,{U:()=>d});class d{constructor(a=()=>void 0){this.onDispatchError=a,this.deferred=[],this.restoreExtensionRuntime=null,this.draining=null,this.paused=!1,this.disposed=!1}get isBlocking(){return this.paused||null!==this.draining||this.deferred.length>0}pause(){this.disposed||(this.paused=!0)}defer(a,b){return!!this.isBlocking&&!this.disposed&&(this.deferred.push({source:a,dispatch:b}),!0)}resume(){if(this.disposed)return Promise.resolve();if(this.paused=!1,this.draining)return this.draining;let a=this.drain().finally(()=>{this.draining===a&&(this.draining=null),!this.paused&&this.deferred.length>0&&this.resume()});return this.draining=a,a}installExtensionRuntime(a){if(this.disposed)return;this.restoreExtensionRuntime?.();let b=a.sendMessage,c=a.sendUserMessage,d=(a,c)=>{this.defer("extension-message",()=>b(a,c))||b(a,c)},e=(a,b)=>{this.defer("extension-user-message",()=>c(a,b))||c(a,b)};a.sendMessage=d,a.sendUserMessage=e,this.restoreExtensionRuntime=()=>{a.sendMessage===d&&(a.sendMessage=b),a.sendUserMessage===e&&(a.sendUserMessage=c)}}discardPending(){this.deferred.length=0}dispose(){this.disposed||(this.disposed=!0,this.paused=!0,this.deferred.length=0,this.restoreExtensionRuntime?.(),this.restoreExtensionRuntime=null)}async drain(){for(;!this.paused&&!this.disposed;){let a=this.deferred.shift();if(!a)return;try{await a.dispatch()}catch(b){this.onDispatchError(a.source,b)}}}}},72498:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Wo:()=>v,Zd:()=>s,er:()=>w,gb:()=>t,ls:()=>r,vC:()=>x,wz:()=>u});var e=c(73024),f=c(76760),g=c(75430),h=c(61518),i=c(32980),j=c(87468),k=c(12727),l=c(65209),m=c(83401),n=c(46524),o=c(26143),p=a([g,h,i,l,o]);[g,h,i,l,o]=p.then?(await p)():p;class v extends Error{constructor(a){super(a),this.name="L4PiSessionBranchBlockedError"}}class w extends Error{constructor(){super("Pi session has no durable entry to clone"),this.name="L4PiSessionCloneEmptyError"}}function q(){return globalThis.__piDeskPiWorkSessionRuntimes||(globalThis.__piDeskPiWorkSessionRuntimes=new Map),globalThis.__piDeskPiWorkSessionRuntimes}class x{constructor(a,b){this.sessionManager=a,this.branchIndex=b,this.resources=new o.h,this.pendingBranchAppend=null,this.capabilityModeValue=null,this.capabilityTail=Promise.resolve(),this.disposed=!1,this.closePromise=null,this.indexedEntryCount=a.getEntries().length,this.branchIdValue=b.branchIdForHead(a.getLeafId()),this.chatWorker=this.createChatWorker(),this.unsubscribeCapabilities=(0,h.O)().subscribe(()=>{if(null===this.capabilityModeValue||this.disposed)return;let a=(0,h.O)().read(),b=Object.hasOwn(a,this.capabilityModeValue)?this.capabilityModeValue:null;this.setCapabilityMode(b).catch(a=>{console.error("[Pi Desk][Capabilities] 会话同步模式配置失败",{sessionId:this.sessionId,message:a instanceof Error?a.message:String(a)})})})}static create(a){let b=g.SessionManager.create(a),c=(0,m.l)(b);return(0,l.Ko)(a),x.fromManager(g.SessionManager.open(c,b.getSessionDir()))}static async open(a,b){let c=q().get(b);if(c){if(c.assertActive(),(0,f.resolve)(c.cwd)!==(0,f.resolve)(a))throw Error(`Pi session ${b} cwd does not match requested cwd`);return c}let d=await (0,l.vg)(a,b);if(!d)throw Error(`Pi session ${b} was not found in ${a}`);let e=x.fromManager(g.SessionManager.open(d));if((0,f.resolve)(e.cwd)!==(0,f.resolve)(a))throw Error(`Pi session ${b} cwd does not match persisted cwd`);return e}get cwd(){return this.sessionManager.getCwd()}get sessionId(){return this.sessionManager.getSessionId()}get branchId(){return this.branchIdValue}get isWorkerInitialized(){return this.assertActive(),this.chatWorker.isInitialized}readChatBackgroundTaskIds(){return this.assertActive(),this.chatWorker.getBackgroundTaskIds()}readPluginReloadBlockReason(){return this.assertActive(),this.chatWorker.readPluginReloadBlockReason()}readChatSnapshot(){return this.assertActive(),(0,k.xf)(this.sessionManager)}async readSessionTree(){this.assertActive();let a=this.sessionManager.getEntries().some(a=>"model_change"===a.type)?await g.ModelRuntime.create():void 0;return(0,n.cg)(this.sessionManager,a)}async readSessionTreeEntryDetail(a){this.assertActive();let b=this.sessionManager.getEntry(a)?.type==="model_change"?await g.ModelRuntime.create():void 0;return(0,n.j0)(this.sessionManager,a,b)}readChatImage(a,b){if(this.assertActive(),!Number.isSafeInteger(b)||b<0)throw Error("图片位置无效");if(!this.sessionManager.getBranch().some(b=>b.id===a))throw Error(`Pi session entry is not on the current branch: ${a}`);let c=this.sessionManager.getEntry(a);if(c?.type!=="message"||"user"!==c.message.role&&"toolResult"!==c.message.role)throw Error(`Pi session entry has no message images: ${a}`);let d=(0,k.Wl)(c.message.content,b);if(!d)throw Error(`Pi message image was not found: ${a}/${b}`);return d}subscribeChat(a){return this.assertActive(),this.chatWorker.subscribe(a)}get nativeUi(){return this.assertActive(),this.chatWorker.nativeUi}async readChatRuntime(){return this.assertActive(),this.chatWorker.getRuntime()}async readModelContext(){return this.assertActive(),this.chatWorker.readModelContext()}watchTaskDetail(a,b){return this.assertActive(),this.chatWorker.watchTaskDetail(a,b)}readTaskMessage(a,b){return this.assertActive(),this.chatWorker.readTaskMessage(a,b)}readTaskImage(a,b,c){return this.assertActive(),this.chatWorker.readTaskImage(a,b,c)}async interruptTask(a){this.assertActive(),await this.chatWorker.interruptTask(a)}async invokePluginMethod(a,b,c,d){if(this.assertActive(),a.sessionId!==this.sessionId||a.branchId!==this.branchId)throw Error("Pi session plugin source does not match the current runtime");return this.chatWorker.invokePluginMethod(b,c,d,a)}async listModels(){return this.assertActive(),this.chatWorker.listModels()}async listNativeCommands(){return this.assertActive(),this.chatWorker.listNativeCommands()}async executeNativeCommand(a,b){this.assertActive(),await this.chatWorker.executeNativeCommand(a,b)}async listNativeTools(a=!1){return a&&this.disposed?[]:(this.assertActive(),this.chatWorker.listNativeTools(a))}async executeDirectBash(a){return this.assertActive(),this.chatWorker.executeDirectBash(a)}async abortDirectBash(){this.assertActive(),await this.chatWorker.abortDirectBash()}async send(a){return this.assertActive(),this.chatWorker.send(a)}async interrupt(){this.assertActive(),await this.chatWorker.interrupt()}async compact(){this.assertActive(),await this.chatWorker.compact()}async reload(a){this.assertActive(),await this.chatWorker.reload(a)}async restoreQueuedMessages(){return this.assertActive(),this.chatWorker.restoreQueuedMessages()}async setTitle(a){this.assertActive(),await this.chatWorker.setTitle(a)}async setModel(a){this.assertActive(),await this.chatWorker.setModel(a)}setCapabilityMode(a){let b=this.capabilityTail.then(async()=>{if(this.assertActive(),null!==a&&!Object.hasOwn((0,h.O)().read(),a))throw Error("能力模式已不存在,请重新选择");this.capabilityModeValue=a,await this.chatWorker.applyCapabilityMode()});return this.capabilityTail=b.catch(()=>void 0),b}async dispose(){this.closePromise||(this.disposed=!0,this.unsubscribeCapabilities(),this.closePromise=this.chatWorker.dispose().finally(()=>this.resources.reset()),this.closePromise.then(()=>{q().get(this.sessionId)===this&&q().delete(this.sessionId)},a=>{console.warn("[Pi Desk][WorkSessionRuntime] 会话关闭未确认,保留实例占用直到重启",{sessionId:this.sessionId,message:a instanceof Error?a.message:String(a)})})),await this.waitForWorkerClose(this.closePromise,1500).catch(()=>void 0)}async waitForWorkerClose(a,b){let c;try{await Promise.race([a.then(()=>!0),new Promise(a=>{c=setTimeout(()=>a(!1),b)})])}finally{c&&clearTimeout(c)}}async branch(a){this.assertActive(),this.assertBranchable(),this.syncBranchIndex();let b=(0,n.eD)(this.sessionManager,a);if(!b.changed)return b;let c=this.sessionManager.getLeafId(),d=this.pendingBranchAppend;this.pendingBranchAppend=null;let e=!1;try{return(e=await this.chatWorker.navigateTree(b.selectedEntryId))?b:{...b,changed:!1,targetLeafEntryId:this.sessionManager.getLeafId(),editorText:null}}finally{this.syncBranchIndex();let a=this.sessionManager.getLeafId();e||a!==c?(this.pendingBranchAppend=this.branchIndex.predictAppend(a),this.branchIdValue=this.pendingBranchAppend.branchId):this.pendingBranchAppend=d}}createBranchedSession(a){let b,c,d,f,h;this.assertActive(),"at"===a.position&&this.assertBranchable(),this.syncBranchIndex();let i=this.sessionManager.getSessionFile();if(!i||!(0,e.existsSync)(i))throw Error(`Pi session ${this.sessionId} has no authoritative JSONL file`);if("before"===a.position){if(!a.entryId)throw new n.Ns("");let e=(0,n.u3)(this.sessionManager,a.entryId);b=e.selectedEntryId,c=e.targetLeafEntryId,d=e.editorText}else{if(!(b=a.entryId??this.sessionManager.getLeafId()??""))throw new w;if(!this.sessionManager.getEntry(b))throw new n.Ns(b);c=b,d=null}if(!(h=null===c?(f=g.SessionManager.create(this.cwd,this.sessionManager.getSessionDir())).newSession({parentSession:i}):(f=g.SessionManager.open(i,this.sessionManager.getSessionDir())).createBranchedSession(c)))throw Error(`Failed to create Pi session from entry: ${b}`);(0,m.l)(f),(0,l.Ko)(this.cwd);let j=x.fromManager(g.SessionManager.open(h,this.sessionManager.getSessionDir()));return console.info("[Pi Desk][PiWorkSessionRuntime] 已创建路径分支 Pi 会话",{sourceSessionId:this.sessionId,sourceBranchId:this.branchIndex.branchIdForEntry(b),selectedEntryId:b,targetLeafEntryId:c,position:a.position,sessionId:j.sessionId,branchId:j.branchId}),{runtime:j,editorText:d}}assertBranchable(){try{this.chatWorker.assertIdle()}catch(a){throw new v(a instanceof Error?a.message:"当前 Pi 会话不能切换分支")}}createChatWorker(){return new i.EG(this.cwd,this.sessionManager,a=>this.confirmAppendedEntry(a),{mode:()=>this.capabilityModeValue,rules:()=>null===this.capabilityModeValue?void 0:(0,h.O)().read()[this.capabilityModeValue]},this.resources)}confirmAppendedEntry(a){try{this.syncBranchIndex(),this.branchIndex.branchIdForEntry(a.id)}catch(b){throw console.error("[Pi Desk][PiWorkSessionRuntime] 增量同步 Pi 分支索引失败",{sessionId:this.sessionId,entryId:a.id,parentId:a.parentId,errorName:b instanceof Error?b.name:"UnknownError",errorMessage:b instanceof Error?b.message:String(b)}),b}}syncBranchIndex(){let a=this.sessionManager.getEntries();for(;this.indexedEntryCount<a.length;){let b,c=a[this.indexedEntryCount];this.pendingBranchAppend?(b=this.branchIndex.confirmAppend(this.pendingBranchAppend,c),this.pendingBranchAppend=null):b=this.branchIndex.appendEntry(c).branchId,this.indexedEntryCount+=1,this.sessionManager.getLeafId()===c.id&&(this.branchIdValue=b)}}static fromManager(a){let b=q().get(a.getSessionId());if(b)return b.assertActive(),b;let c=new x(a,new j.u(a.getEntries()));return q().set(c.sessionId,c),c}assertActive(){if(this.disposed)throw Error(`Pi session runtime has been disposed: ${this.sessionId}`)}}function r(a){let b=q().get(a);if(!b)throw Error(`Pi session runtime is not initialized: ${a}`);return b}async function s(){let a=await Promise.all([...q().values()].map(a=>a.listNativeTools(!0)));return[...new Map(a.flat().map(a=>[a.name,a])).values()]}async function t(a){await q().get(a)?.dispose()}async function u(){await Promise.all([...q().values()].map(a=>a.dispose()))}d()}catch(a){d(a)}})},73383:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{JF:()=>s,cI:()=>r,jd:()=>q});var e=c(76760),f=c(9753),g=c(99327),h=c(76452),i=a([g]);function j(a,b,c){if("string"!=typeof a)throw Error(`${b} must be a string`);let d=a.trim();if(!d||d.length>c)throw Error(`${b} must contain 1-${c} characters`);return d}function k(a,b,c){return null==a?null:j(a,b,c)}function l(a){if(void 0===a)return[];if(!Array.isArray(a)||a.length>12)throw Error("Task info must be an array with at most 12 items");return a.map((a,b)=>{if(!a||"object"!=typeof a||Array.isArray(a))throw Error(`Task info ${b} must be an object`);return{label:j(a.label,`Task info ${b} label`,64),value:j(a.value,`Task info ${b} value`,500)}})}function m(a,b){if("number"!=typeof a||!Number.isSafeInteger(a)||a<0)throw Error(`${b} must be a non-negative Unix millisecond timestamp`);return a}function n(a){if(!a||"object"!=typeof a)throw Error("Task snapshot is invalid");let b=function(a){switch(a){case"running":case"completed":case"failed":case"stopped":case"interrupted":return a;default:throw Error("Task status is invalid")}}(a.status),c=null===a.endedAt?null:m(a.endedAt,"Task endedAt");if("running"===b&&null!==c)throw Error("Running task requires endedAt=null");if("running"!==b&&null===c)throw Error("Terminal task requires endedAt");let d=function(a){if(null===a)return null;if(!a||"object"!=typeof a)throw Error("Task detailSource is invalid");if("text-file"===a.kind){let b=j(a.path,"Task text-file path",32768);if(!(0,e.isAbsolute)(b))throw Error("Task text-file path must be absolute");return{kind:"text-file",path:b}}if("pi-conversation"!==a.kind)throw Error("Task detailSource kind is invalid");if(void 0!==a.session){var b;if(!((b=a.session)&&"object"==typeof b&&"string"==typeof b.sessionId&&"function"==typeof b.sessionManager?.getBranch&&"function"==typeof b.agent?.subscribe))throw Error("Task AgentSession is invalid");return{kind:"pi-conversation",session:a.session}}let c=j(a.sessionFile,"Task sessionFile",32768);if(!(0,e.isAbsolute)(c))throw Error("Task sessionFile must be absolute");return{kind:"pi-conversation",sessionFile:c}}(a.detailSource);if("running"!==b&&d?.kind==="pi-conversation"&&d.session){let a=d.session.sessionFile;d=a?{kind:"pi-conversation",sessionFile:a}:null}return{record:{taskId:j(a.taskId,"Task id",200),taskKind:k(a.taskKind,"Task kind",100),taskType:k(a.taskType,"Task type",100),title:j(a.title,"Task title",200),info:l(a.info),status:b,activity:function(a){if(null==a)return null;if("string"!=typeof a)throw Error("Task activity must be a string");let b=a.trim();return b?b.length<=300?b:`${b.slice(0,299)}…`:null}(a.activity),startedAt:m(a.startedAt,"Task startedAt"),endedAt:c,detailSource:d,interrupt:"running"===b&&"function"==typeof a.interrupt?a.interrupt:null},infoLoader:function(a){if(null==a)return null;if("function"!=typeof a)throw Error("Task infoLoader must be a function");return a}(a.infoLoader)}}function o(a){let{detailSource:b,interrupt:c,...d}=a;return{...d,info:d.info.map(a=>({...a}))}}function p(a){let b=[],c=[];for(let d of a)"running"===d.status?b.push(d):c.push(d);return c.sort((a,b)=>(b.endedAt??0)-(a.endedAt??0)||b.startedAt-a.startedAt),[...b,...c.slice(0,100)].sort((a,b)=>b.startedAt-a.startedAt)}g=(i.then?(await i)():i)[0];class q{constructor(a,b){this.options=b,this.records=new Map,this.infoRuntimes=new Map,this.toolRuntimeOwners=new Map,this.disposed=!1,this.detailPool=new g.Il(a=>{let b=this.records.get(a);return b?{taskId:b.taskId,status:b.status,detailSource:b.detailSource,canInterrupt:"running"===b.status&&null!==b.interrupt}:null}),this.unsubscribe=a.on(f.O0,a=>{if(!this.disposed)try{this.apply(a)}catch(a){this.options.onInvalidReport(a)}})}summaries(){return p(this.records.values()).map(o)}activeTaskIds(){return[...this.records.values()].filter(a=>"running"===a.status).map(a=>a.taskId).sort()}record(a){return this.records.get(a)??null}async watchDetail(a,b){return await this.loadInfo(a),this.detailPool.watch(a,b)}readMessage(a,b){return this.detailPool.readMessage(a,b)}readImage(a,b,c){return this.detailPool.readImage(a,b,c)}async interrupt(a){let b=this.records.get(a);if(!b)throw new r(a);if("running"!==b.status||!b.interrupt)throw new s(a);await b.interrupt()}dispose(){if(!this.disposed){for(let a of(this.disposed=!0,this.unsubscribe(),this.detailPool.dispose(),this.toolRuntimeOwners.values()))a.lease.release();this.toolRuntimeOwners.clear(),this.records.clear(),this.infoRuntimes.clear()}}setToolRuntime(a,b){let c=b?.kind==="pi-conversation"?b.session:void 0,d=this.toolRuntimeOwners.get(a);if(d?.session!==c){if(d?.lease.release(),!c)return void this.toolRuntimeOwners.delete(a);this.toolRuntimeOwners.set(a,{session:c,lease:(0,h.s)(c)})}}releaseToolRuntime(a){this.toolRuntimeOwners.get(a)?.lease.release(),this.toolRuntimeOwners.delete(a)}setInfoLoader(a,b){let c=this.infoRuntimes.get(a);if(!b||c?.loader!==b){if(!b)return void this.infoRuntimes.delete(a);this.infoRuntimes.set(a,{loader:b,promise:null})}}async loadInfo(a){let b=this.infoRuntimes.get(a);if(!b)return;if(b.promise)return b.promise;let c=(async()=>{try{var c;if(!this.records.has(a))return;let d=l(await b.loader());if(this.infoRuntimes.get(a)!==b)return;this.infoRuntimes.delete(a);let e=this.records.get(a);if(!e||(c=e.info,c.length===d.length&&c.every((a,b)=>{let c=d[b];return a.label===c?.label&&a.value===c.value})))return;e.info=d,this.options.onChanged(this.summaries(),this.activeTaskIds())}catch(b){console.warn("[Pi Desk][TaskRuntime] 按需加载任务 info 失败",{taskId:a,errorName:b instanceof Error?b.name:"UnknownError"})}finally{this.infoRuntimes.get(a)===b&&(b.promise=null)}})();b.promise=c,await c}apply(a){if(!a||"object"!=typeof a)throw Error("Task report is invalid");let b=!1,c=new Set;if("upsert"===a.type){if(!Array.isArray(a.tasks))throw Error("Task upsert requires tasks");let d=a.tasks.map(n),e=new Set;for(let a of d){if(e.has(a.record.taskId))throw Error(`Task report contains duplicate id: ${a.record.taskId}`);e.add(a.record.taskId)}for(let a of d)this.records.set(a.record.taskId,a.record),this.setToolRuntime(a.record.taskId,a.record.detailSource),this.setInfoLoader(a.record.taskId,a.infoLoader),c.add(a.record.taskId),b=!0}else if("remove"===a.type){if(!Array.isArray(a.taskIds))throw Error("Task remove requires taskIds");for(let d of a.taskIds){let a=j(d,"Task id",200),e=this.records.delete(a);this.infoRuntimes.delete(a),this.releaseToolRuntime(a),e&&c.add(a),b=e||b}}else throw Error("Task report type is invalid");if(b){for(let a of this.trimTerminalHistory())c.add(a);for(let a of c)this.detailPool.taskChanged(a);this.options.onChanged(this.summaries(),this.activeTaskIds())}}trimTerminalHistory(){let a=[],b=new Set(p(this.records.values()).map(a=>a.taskId));for(let[c,d]of this.records)"running"===d.status||b.has(c)||(this.records.delete(c),this.infoRuntimes.delete(c),this.releaseToolRuntime(c),a.push(c));return a}}class r extends Error{constructor(a){super(`Task was not found: ${a}`),this.name="L4PiTaskNotFoundError"}}class s extends Error{constructor(a){super(`Task is not interruptible: ${a}`),this.name="L4PiTaskNotInterruptibleError"}}d()}catch(a){d(a)}})},73589:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{n:()=>n});var e=c(51455),f=c(48161),g=c(76760),h=c(58417),i=c(46107),j=a([i]);async function k(a){let b=await (0,e.realpath)(a).catch(()=>(0,g.resolve)(a));return"win32"===process.platform?b.toLowerCase():b}function l(a,b){return/^(npm:|git:|https?:|ssh:|git@)/.test(a)?null:a.startsWith("~/")?(0,g.join)((0,f.homedir)(),a.slice(2)):(0,g.resolve)(b,a)}function m(a,b){let c=(0,g.relative)(a,b);return""===c||!c.startsWith("..")&&!(0,g.isAbsolute)(c)}async function n(a,b,c){let d=new Set((0,i.to)(a).disabled.map(h.LD)),f=new Set;for(let b of d){let c=l(b,a);c&&f.add(await k(c))}for(let c of b.listConfiguredPackages()){if("user"!==c.scope||!c.installedPath)continue;let b=l(c.source,a),e=b&&f.has(await k(b));(d.has((0,h.LD)(c.source))||e)&&f.add(await k(c.installedPath))}if(f.size>0){let d=(0,g.join)(a,"extensions"),h=await (0,e.readdir)(d,{withFileTypes:!0}).catch(a=>{if(a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code)return[];throw a}),i=[...b.listConfiguredPackages().filter(a=>"user"===a.scope).flatMap(a=>a.installedPath??[]),...h.filter(a=>!a.name.startsWith(".")&&"node_modules"!==a.name&&(a.isDirectory()||a.isSymbolicLink())).map(a=>(0,g.join)(d,a.name)),...(c.getGlobalSettings().extensions??[]).filter(a=>!/^[!+-]|[?*{}]/.test(a)).flatMap(b=>l(b,a)??[])],j=[];for(let a of i)await (0,e.stat)(a).then(a=>a.isDirectory(),()=>!1)&&j.push(await k(a));for(let a of(j.sort((a,b)=>b.length-a.length),[...f])){if(!await (0,e.stat)(a).then(a=>a.isFile(),()=>!1))continue;let b=j.find(b=>m(b,a));b&&f.add(b)}}let j=new Map;return async(a,b,c)=>{if(c&&d.has((0,h.LD)(a)))return!0;if(!b||b.startsWith("builtin:")||0===f.size)return!1;let e=j.get(b);e||(e=k(b),j.set(b,e));let g=await e;return[...f].some(a=>m(a,g))}}i=(j.then?(await j)():j)[0],d()}catch(a){d(a)}})},75613:(a,b,c)=>{c.d(b,{i:()=>n});var d=c(73024),e=c(51455),f=c(76760),g=c(56752);let h=/\u001b(?:\[[0-?]*[ -/]*[@-~]|\][^\u0007]*(?:\u0007|\u001b\\))/g;function i(a,b,c){for(let d of[...a])try{d(b)}catch(a){console.error("[Pi Desk][TextLogRuntime] 日志监听器执行失败",{path:c,errorName:a instanceof Error?a.name:"UnknownError"})}}async function j(a){let b;try{b=await (0,e.stat)(a)}catch(a){if("ENOENT"===a.code)return{text:"",truncated:!1};throw a}if(!b.isFile())throw Error(`Text log source is not a file: ${a}`);let c=Math.max(0,b.size-131072),d=b.size-c,f=await (0,e.open)(a,"r");try{let a=Buffer.alloc(d);d>0&&await f.read(a,0,d,c);let b=a.toString("utf8").replace(h,""),e=c>0;if(c>0){let a=b.indexOf("\n");a>=0&&(b=b.slice(a+1))}let g=b.split("\n");return g.length>1e3&&(b=g.slice(g.length-1e3).join("\n"),e=!0),{text:b,truncated:e}}finally{await f.close()}}class k{constructor(a,b){this.path=a,this.listeners=new Set,this.watcher=null,this.interval=null,this.refreshTimer=null,this.refreshPromise=null,this.disposed=!1,this.current=b}static async create(a){let b=new k(a,await j(a));return b.startWatching(),b}snapshot(){return{...this.current}}subscribe(a){if(this.disposed)throw Error("Text log runtime has been disposed");return this.listeners.add(a),()=>this.listeners.delete(a)}dispose(){this.disposed||(this.disposed=!0,this.watcher?.close(),this.interval&&clearInterval(this.interval),this.refreshTimer&&clearTimeout(this.refreshTimer),this.watcher=null,this.interval=null,this.refreshTimer=null,this.listeners.clear())}startWatching(){try{this.watcher=(0,d.watch)(this.path,()=>this.scheduleRefresh()),this.watcher.on("error",()=>this.scheduleRefresh())}catch{this.watcher=null}this.interval=setInterval(()=>this.scheduleRefresh(),500)}scheduleRefresh(){this.disposed||this.refreshTimer||(this.refreshTimer=setTimeout(()=>{this.refreshTimer=null,this.refresh()},40))}refresh(){return this.disposed?Promise.resolve():(this.refreshPromise||(this.refreshPromise=(async()=>{try{let a=await j(this.path);if(this.disposed||a.text===this.current.text&&a.truncated===this.current.truncated)return;let b=this.current;this.current=a;let c=a.text.startsWith(b.text)?a.text.slice(b.text.length):"";c&&a.truncated===b.truncated?i(this.listeners,{type:"text_append",text:c},this.path):i(this.listeners,{type:"snapshot",snapshot:{...a}},this.path)}catch(a){console.warn("[Pi Desk][TextLogRuntime] 刷新日志失败",{path:this.path,errorName:a instanceof Error?a.name:"UnknownError"}),i(this.listeners,{type:"unavailable"},this.path)}})().finally(()=>{this.refreshPromise=null})),this.refreshPromise)}}class l{async observe(a,b){if(this.disposed)throw Error("Text log pool has been disposed");let c=function(a){let b=a.trim();if(!b||b.length>32768||!(0,f.isAbsolute)(b))throw Error("Text log path must be an absolute path");return(0,f.resolve)(b)}(a),d=(0,g.b)(c),e=this.sharedByPath.get(d);if(!e){let a=this.pendingByPath.get(d);a||(a=k.create(c).then(a=>{if(this.disposed)throw a.dispose(),Error("Text log pool was disposed during initialization");let b={runtime:a,references:0};return this.sharedByPath.set(d,b),b}).finally(()=>{this.pendingByPath.delete(d)}),this.pendingByPath.set(d,a)),e=await a}e.references+=1;let h=e.runtime.subscribe(b),i=!1;return{snapshot:e.runtime.snapshot(),readSnapshot:()=>e.runtime.snapshot(),release:()=>{i||(i=!0,h(),e.references-=1,e.references>0||(this.sharedByPath.get(d)===e&&this.sharedByPath.delete(d),e.runtime.dispose()))}}}dispose(){if(!this.disposed){for(let a of(this.disposed=!0,this.sharedByPath.values()))a.runtime.dispose();this.sharedByPath.clear(),this.pendingByPath.clear()}}constructor(){this.sharedByPath=new Map,this.pendingByPath=new Map,this.disposed=!1}}let m=new l;function n(){return m}},76452:(a,b,c)=>{c.d(b,{s:()=>i});var d=c(77598),e=c(12727);let f=new WeakMap;function g(a){try{let b=JSON.stringify(a);return void 0===b?null:JSON.parse(b)}catch{return null}}class h{constructor(a){this.session=a,this.listeners=new Set,this.toolsById=new Map,this.disposed=!1,this.unsubscribeAgent=a.agent.subscribe(a=>this.captureAgentEvent(a)),this.unsubscribeSession=a.subscribe(a=>this.captureSessionEvent(a));const b=a.sessionManager.getBranch(),c=a.agent.state.pendingToolCalls;for(const a of function(a){let b=new Map;for(let c of a)if("message"===c.type)if("assistant"===c.message.role)for(let a of(0,e.zz)(c.message.content))b.set(a.id,a);else"toolResult"===c.message.role&&b.delete(c.message.toolCallId);return[...b.values()]}(b))c.has(a.id)&&this.upsertTool(a.id,a.name,a.input);const d=a.agent.state.streamingMessage;d&&this.syncStreamingTools(d,!1)}get size(){return this.toolsById.size}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}activeMessages(){return[...this.toolsById.values()].map(a=>({tempId:a.tempId,message:this.toolMessage(a)}))}tempId(a){return this.toolsById.get(a)?.tempId??null}syncStreamingTools(a,b=!0){if("assistant"===a.role)for(let c of(0,e.zz)(a.content)){let{tool:a,created:d,changed:e}=this.upsertTool(c.id,c.name,c.input);b&&(d?this.publish({type:"message_start",tempId:a.tempId,message:this.toolMessage(a)}):e&&this.publishToolUpdate(a))}}projectLiveResult(a,b){let c=this.toolsById.get(b);return(0,e.zK)(a,b,c?.display,c?.input)}remove(a){this.toolsById.delete(a)}discardAll(){for(let a of this.toolsById.values())this.publish({type:"message_discard",tempId:a.tempId});this.toolsById.clear()}dispose(){this.disposed||(this.disposed=!0,this.unsubscribeAgent(),this.unsubscribeSession(),this.listeners.clear(),this.toolsById.clear())}captureAgentEvent(a){if(!this.disposed&&(!("parentToolCallId"in a)||void 0===a.parentToolCallId))switch(a.type){case"tool_execution_start":this.startTool(a.toolCallId,a.toolName,a.args);return;case"tool_execution_update":this.updateTool(a.toolCallId,a.toolName,a.args,a.partialResult);return;case"tool_execution_end":this.endTool(a.toolCallId,a.toolName,a.result,a.isError);return;case"turn_end":this.discardAll();return;default:return}}captureSessionEvent(a){("agent_end"===a.type&&a.willRetry||"agent_settled"===a.type)&&queueMicrotask(()=>{this.disposed||this.discardAll()})}upsertTool(a,b,c){let f=c&&"object"==typeof c&&!Array.isArray(c)?{...c}:{},g=this.toolsById.get(a);if(g){var h;let a=(0,e.zG)(b,f,g.displayCache),c=g.name!==b||(h=g.display,h.reasoning!==a.reasoning||h.inputPreview!==a.inputPreview||h.activity!==a.activity);return g.name=b,g.input=f,g.display=a,{tool:g,created:!1,changed:c}}let i={},j={tempId:(0,d.randomUUID)(),toolCallId:a,name:b,display:(0,e.zG)(b,f,i),displayCache:i,input:f,partialResult:null,result:null,status:"running",startedAtMs:null,durationMs:null};return this.toolsById.set(a,j),{tool:j,created:!0,changed:!0}}startTool(a,b,c){let{tool:d,created:e,changed:f}=this.upsertTool(a,b,c),g="bash"===b&&null===d.startedAtMs;d.status="running",g&&(d.startedAtMs=Date.now()),e?this.publish({type:"message_start",tempId:d.tempId,message:this.toolMessage(d)}):(f||g)&&this.publishToolUpdate(d)}updateTool(a,b,c,d){this.startTool(a,b,c);let e=this.toolsById.get(a);e&&(e.partialResult=d,e.status="running",this.publishToolUpdate(e))}endTool(a,b,c,d){this.toolsById.has(a)||this.startTool(a,b,{});let e=this.toolsById.get(a);e&&("bash"===e.name&&null!==e.startedAtMs&&(e.durationMs=Math.max(0,Date.now()-e.startedAtMs),function(a,b){if(!a||"object"!=typeof a||Array.isArray(a))return;let c=a.details&&"object"==typeof a.details&&!Array.isArray(a.details)?a.details:{};a.details={...c,durationMs:b}}(c,e.durationMs)),e.result=c,e.status=d?"error":"completed",this.publishToolUpdate(e))}publishToolUpdate(a){this.publish({type:"message_update",tempId:a.tempId,message:this.toolMessage(a)})}toolMessage(a){let b;return{type:"tool",name:a.name,reasoning:a.display.reasoning,inputPreview:a.display.inputPreview,activity:a.display.activity,status:a.status,usage:null,output:"",startedAtMs:a.startedAtMs,durationMs:a.durationMs,declaration:{message:{kind:"tool",toolName:a.name,toolCallId:a.toolCallId,arguments:(b=g(a.input))&&"object"==typeof b&&!Array.isArray(b)?b:{},partialResult:g(a.partialResult),result:g(a.result),isError:"error"===a.status},raw:{toolCallId:a.toolCallId,toolName:a.name,args:a.input,partialResult:a.partialResult,result:a.result}}}}publish(a){for(let b of[...this.listeners])try{b(a)}catch(b){console.error("[Pi Desk][AgentToolRuntime] 事件监听器执行失败",{sessionId:this.session.sessionId,eventType:a.type,errorName:b instanceof Error?b.name:"UnknownError"})}}}function i(a){let b=f.get(a);b||(b={runtime:new h(a),references:0},f.set(a,b)),b.references+=1;let c=!1;return{runtime:b.runtime,release:()=>{c||(c=!0,b.references-=1,b.references>0||(f.delete(a),b.runtime.dispose()))}}}},77662:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{p:()=>r});var e=c(76760),f=c(75430),g=c(9753),h=c(59473),i=c(69503),j=c(73383),k=c(40333),l=a([f,j]);[f,j]=l.then?(await l)():l;let m=h.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),n=h.g1(h.Yj(),h.Pq()),o=h.g1(h.Yj().min(1),h.KC([n,h.ch()])),p=h.Ik({pluginName:m,event:m,data:n}).strict(),q=h.Ik({directory:h.Yj().min(1).max(4096).refine(a=>(0,e.isAbsolute)(a)&&!a.includes("\0")),default:h.zM().optional()}).strict();class r{constructor(a){this.options=a,this.controller=(0,f.createEventBus)(),this.slots=new Map,this.methods=new Map,this.unsubscribe=()=>void 0,this.unsubscribePush=()=>void 0,this.unsubscribePreviewDirectory=()=>void 0,this.disposed=!1,this.eventBus={emit:(a,b)=>{if(!this.disposed){if(a===g.Sl)return void this.applyMethodEvent(b);this.controller.emit(a,b)}},on:(a,b)=>this.disposed?()=>void 0:this.controller.on(a,b)},this.bindChannels()}createTaskRuntime(){let a=this.options;return new j.jd(this.controller,{onChanged:(b,c)=>{this.applyTaskSummaries(b),a.onTasksChanged(c),a.onChanged()},onInvalidReport:b=>a.onInvalidUpdate(b)})}bindChannels(){let a=this.options;this.taskRuntime=this.createTaskRuntime(),this.unsubscribe=this.controller.on(g.k0,b=>{if(this.disposed)return;let c=o.safeParse(b);if(!c.success)return void a.onInvalidUpdate(c.error);try{this.apply(c.data)&&a.onChanged()}catch(b){a.onInvalidUpdate(b)}}),this.unsubscribePreviewDirectory=this.controller.on(g.Nx,b=>{if(this.disposed)return;let c=q.safeParse(b);if(!c.success)return void a.onInvalidUpdate(c.error);try{this.applyPreviewDirectory(c.data)&&a.onChanged()}catch(b){a.onInvalidUpdate(b)}}),this.unsubscribePush=this.controller.on(g.Nb,b=>{if(this.disposed)return;let c=p.safeParse(b);c.success?Buffer.byteLength(JSON.stringify(c.data.data),"utf8")>65536?a.onInvalidUpdate(Error("Session Plugin Push data exceeds 64KB")):a.onPush(structuredClone(c.data)):a.onInvalidUpdate(c.error)})}activeTaskIds(){return this.taskRuntime.activeTaskIds()}taskRecord(a){return this.taskRuntime.record(a)}watchTaskDetail(a,b){return this.taskRuntime.watchDetail(a,b)}readTaskMessage(a,b){return this.taskRuntime.readMessage(a,b)}readTaskImage(a,b,c){return this.taskRuntime.readImage(a,b,c)}interruptTask(a){return this.taskRuntime.interrupt(a)}snapshot(){return Object.fromEntries([...this.slots.entries()].sort(([a],[b])=>a.localeCompare(b)).map(([a,b])=>[a,structuredClone(b.value)]))}async invokeMethod(a,b,c,d,e){if(this.disposed)throw Error("Pi session plugin runtime has been disposed");let f=(0,k.FX)(a),g=(0,k.QK)(b),h=this.methods.get((0,k.$m)(f,g));if(!h)throw new k.Tk(f,g);let i=await h.execute((0,k.nJ)(c,"input"),{source:d,extensionContext:e});return(0,k.nJ)(i,"output")}resetBranch(){this.disposed||(this.taskRuntime.dispose(),this.slots.clear(),this.taskRuntime=this.createTaskRuntime(),this.options.onTasksChanged([]),this.options.onChanged())}reset(){this.disposed||(this.unsubscribe(),this.unsubscribePush(),this.unsubscribePreviewDirectory(),this.taskRuntime.dispose(),this.controller.clear(),this.methods.clear(),this.slots.clear(),this.bindChannels(),this.options.onTasksChanged([]),this.options.onChanged())}dispose(){this.disposed||(this.disposed=!0,this.unsubscribe(),this.unsubscribePush(),this.unsubscribePreviewDirectory(),this.taskRuntime.dispose(),this.controller.clear(),this.methods.clear(),this.slots.clear())}applyMethodEvent(a){if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Session plugin method event is invalid");let b=a.registration;if("register"!==a.type&&"unregister"!==a.type||!b||"object"!=typeof b||"string"!=typeof b.pluginName||"string"!=typeof b.method||"function"!=typeof b.execute)throw Error("Session plugin method registration is invalid");let c=(0,k.FX)(b.pluginName),d=(0,k.QK)(b.method),e=(0,k.$m)(c,d);if("register"===a.type){if(this.methods.has(e))throw new k.qs(c,d);this.methods.set(e,b);return}this.methods.get(e)===b&&this.methods.delete(e)}applyTaskSummaries(a){if(0===a.length)return void this.slots.delete("task-center");let b={tasks:a.map(a=>({...a,info:a.info.map(a=>({...a}))}))};this.slots.set("task-center",{serialized:JSON.stringify(b),value:b})}applyPreviewDirectory(a){let b=(0,e.resolve)(a.directory),c=(0,i.Yj)(b),d=this.slots.get(i.s6),f=(0,i.D)(d?.value),g=f.directories.find(a=>(0,i.Yj)(a)===c);if(!g&&f.directories.length>=i.xI)throw Error(`会话预览目录数量已达上限 ${i.xI}`);let h=g??b,j={directories:g?f.directories:[...f.directories,h],defaultDirectory:!0===a.default?h:f.defaultDirectory},k=JSON.stringify(j);return d?.serialized!==k&&(this.slots.set(i.s6,{serialized:k,value:j}),!0)}apply(a){if(Object.hasOwn(a,"task-center"))throw Error("task-center plugin slot is reserved by the Task Runtime");if(Object.hasOwn(a,i.s6))throw Error("project-preview 插件槽由会话预览目录登记管理");let b=!1;for(let[c,d]of Object.entries(a)){if(null===d){b=this.slots.delete(c)||b;continue}let a=JSON.stringify(d);this.slots.get(c)?.serialized!==a&&(this.slots.set(c,{serialized:a,value:d}),b=!0)}return b}}d()}catch(a){d(a)}})},77844:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{lr:()=>m,mu:()=>l,ni:()=>i,qc:()=>j,ti:()=>k});var e=c(73024),f=c(75430),g=c(54174),h=a([f]);f=(h.then?(await h)():h)[0];let m=0x1f00000;class n extends Error{constructor(a){super(a),this.name="L4PiChatInputError"}}function i(a){if(!a.text.trim()&&0===a.images.length)throw new n("请输入文字或添加图片");return{text:a.text,images:a.images.map(a=>({...a})),imageBytes:function(a){if(a.length>10)throw new n("单次最多发送 10 张图片");let b=0;for(let c of a){let a=(0,g.f1)(c);if(a.bytes.length>0xa00000)throw new n("单张图片压缩后不能超过 10MB");b+=a.bytes.length}if(b>0x1400000)throw new n("单次发送图片总量不能超过 20MB");return b}(a.images)}}function j(a,b,c,d){let h=function(a,b){var c,d;let e;if(!a.startsWith("/"))return a;let f=a.match(/^\/([^\s]+)(?:\s+([\s\S]*))?$/);if(!f)return a;let g=b.find(a=>a.name===f[1]);return g?(c=g.content,e=(d=function(a){let b=[],c="",d=null;for(let e of a){if(d){e===d?d=null:c+=e;continue}if('"'===e||"'"===e){d=e;continue}if(/\s/.test(e)){c&&b.push(c),c="";continue}c+=e}return c&&b.push(c),b}(f[2]??"")).join(" "),c.replace(/\$\{(\d+|ARGUMENTS|@):-([^}]*)\}|\$\{@:(\d+)(?::(\d+))?\}|\$(ARGUMENTS|@|\d+)/g,(a,b,c,f,g,h)=>{if("string"==typeof b)return("@"===b||"ARGUMENTS"===b?e:d[Number.parseInt(b,10)-1])||c;if("string"==typeof f){let a=Math.max(0,Number.parseInt(f,10)-1);return"string"==typeof g?d.slice(a,a+Number.parseInt(g,10)).join(" "):d.slice(a).join(" ")}return"ARGUMENTS"===h||"@"===h?e:d[Number.parseInt(h,10)-1]??""})):a}(function(a,b){if(!a.startsWith("/skill:"))return a;let c=a.indexOf(" "),d=-1===c?a.slice(7):a.slice(7,c),g=-1===c?"":a.slice(c+1).trim(),h=b.find(a=>a.name===d);if(!h)return a;try{let a=(0,f.stripFrontmatter)((0,e.readFileSync)(h.filePath,"utf8")).trim(),b=`<skill name="${h.name}" location="${h.filePath}">
28
+ `,"utf8"),(0,f.renameSync)(a,this.path)}finally{(0,f.existsSync)(a)&&(0,f.unlinkSync)(a)}for(let a of(this.modes=structuredClone(b),this.listeners))try{a()}catch(a){console.error("[Pi Desk][Capabilities] 模式配置监听器失败",{message:a instanceof Error?a.message:String(a)})}});return this.tail=c.catch(()=>void 0),c}}function k(){return globalThis.__piDeskCapabilityModesStore??=new l}d()}catch(a){d(a)}})},63719:(a,b,c)=>{c.d(b,{CT:()=>r,Db:()=>k,JH:()=>t,NL:()=>j,Nu:()=>u,O_:()=>l,Ys:()=>h,_g:()=>o,eC:()=>p,ih:()=>z,jI:()=>y,lt:()=>g,p$:()=>q,rh:()=>n,uV:()=>e,w9:()=>i,xm:()=>f});var d=c(59473);let e=4096,f=5e3,g=100,h=200,i=1e3,j=5242880,k=0xa00000,l=5e7;function m(a,b){return""===a?b:!(a.length>e||a.startsWith("/")||a.includes("\\")||a.includes("\0")||/^[a-zA-Z]:/.test(a))&&a.split("/").every(a=>a.length>0&&"."!==a&&".."!==a)}let n=d.Yj().max(e).refine(a=>m(a,!0),"目录路径必须是规范相对路径"),o=d.Yj().min(1).max(e).refine(a=>m(a,!1),"文件路径必须是规范相对路径"),p=d.Yj().min(1).max(e).refine(a=>m(a,!1)||a.length>0&&a.length<=e&&!a.includes("\0")&&(a.startsWith("/")||a.startsWith("\\\\")||/^[a-zA-Z]:[\\/]/.test(a)),"预览路径必须是规范相对路径或绝对路径"),q=d.k5(["compressed","original"]),r=d.k5(["image/jpeg","image/png","image/webp","image/gif"]),s=d.Ik({name:d.Yj().min(1),type:d.k5(["directory","file"])}).strict(),t=d.Ik({entries:d.YO(s).max(f),truncated:d.zM()}).strict(),u=d.Ik({query:d.Yj().min(1).max(200).refine(a=>a.trim().length>0&&!/[\0\r\n]/.test(a),"搜索词必须是非空单行文本"),scope:d.k5(["all","files","content"]).default("all"),caseSensitive:d.zM().default(!1),wholeWord:d.zM().default(!1),regex:d.zM().default(!1)}).strict(),v=d.Ik({start:d.ai().int().nonnegative(),end:d.ai().int().nonnegative()}).strict().refine(a=>a.start<=a.end,"搜索命中区间无效"),w=d.Ik({path:o,ranges:d.YO(v)}).strict().refine(a=>a.ranges.every(b=>b.end<=a.path.length),"文件名命中区间越界"),x=d.Ik({path:o,line:d.ai().int().positive(),text:d.Yj().max(i),ranges:d.YO(v)}).strict().refine(a=>a.ranges.every(b=>b.end<=a.text.length),"正文命中区间越界"),y=d.Ik({fileMatches:d.YO(w).max(g),contentMatches:d.YO(x).max(h),truncated:d.zM()}).strict(),z=d.gM("kind",[d.Ik({kind:d.eu("text"),content:d.Yj(),size:d.ai().int().nonnegative().max(j)}).strict(),d.Ik({kind:d.eu("image"),mimeType:r,data:d.Yj().min(1),size:d.ai().int().positive().max(k)}).strict()])},67062:(a,b,c)=>{c.d(b,{P:()=>h,WR:()=>g,YB:()=>i,Z$:()=>j,l3:()=>k});var d=c(59473);let e=d.Yj().max(65536),f=d.Ik({id:d.Yj().uuid(),title:e,expiresAt:d.ai().int().nonnegative().nullable()}),g=d.gM("method",[f.extend({method:d.eu("confirm"),message:e}).strict(),f.extend({method:d.eu("select"),options:d.YO(e).max(200)}).strict(),f.extend({method:d.eu("input"),placeholder:e}).strict(),f.extend({method:d.eu("editor"),prefill:e}).strict()]),h=d.Ik({requests:d.YO(g).max(32),statuses:d.g1(d.Yj().max(128),e),widgets:d.g1(d.Yj().max(128),d.Ik({lines:d.YO(e).max(200),placement:d.k5(["aboveEditor","belowEditor"])}).strict())}).strict(),i=d.Ik({id:d.Yj().uuid(),value:d.KC([d.zM(),e,d.ch()])}).strict(),j=d.gM("type",[d.Ik({type:d.eu("snapshot"),snapshot:h}).strict(),d.Ik({type:d.eu("notify"),message:e,level:d.k5(["info","warning","error"])}).strict(),d.Ik({type:d.eu("editor_text"),text:e,mode:d.k5(["replace","paste"])}).strict()]);function k(){return{requests:[],statuses:{},widgets:{}}}},69503:(a,b,c)=>{c.d(b,{D:()=>h,Yj:()=>i,s6:()=>e,xI:()=>f});var d=c(59473);let e="project-preview",f=32,g=d.Ik({directories:d.YO(d.Yj().min(1).max(4096)).max(f),defaultDirectory:d.Yj().min(1).max(4096).nullable()}).strict();function h(a){let b=g.safeParse(a);return b.success?b.data:{directories:[],defaultDirectory:null}}function i(a){let b=a.replaceAll("\\","/").replace(/\/+$/,"")||"/";return/^[a-z]:/i.test(b)||b.startsWith("//")?b.toLowerCase():b}},69765:(a,b,c)=>{c.d(b,{U:()=>d});class d{constructor(a=()=>void 0){this.onDispatchError=a,this.deferred=[],this.restoreExtensionRuntime=null,this.draining=null,this.paused=!1,this.disposed=!1}get isBlocking(){return this.paused||null!==this.draining||this.deferred.length>0}pause(){this.disposed||(this.paused=!0)}defer(a,b){return!!this.isBlocking&&!this.disposed&&(this.deferred.push({source:a,dispatch:b}),!0)}resume(){if(this.disposed)return Promise.resolve();if(this.paused=!1,this.draining)return this.draining;let a=this.drain().finally(()=>{this.draining===a&&(this.draining=null),!this.paused&&this.deferred.length>0&&this.resume()});return this.draining=a,a}installExtensionRuntime(a){if(this.disposed)return;this.restoreExtensionRuntime?.();let b=a.sendMessage,c=a.sendUserMessage,d=(a,c)=>{this.defer("extension-message",()=>b(a,c))||b(a,c)},e=(a,b)=>{this.defer("extension-user-message",()=>c(a,b))||c(a,b)};a.sendMessage=d,a.sendUserMessage=e,this.restoreExtensionRuntime=()=>{a.sendMessage===d&&(a.sendMessage=b),a.sendUserMessage===e&&(a.sendUserMessage=c)}}discardPending(){this.deferred.length=0}dispose(){this.disposed||(this.disposed=!0,this.paused=!0,this.deferred.length=0,this.restoreExtensionRuntime?.(),this.restoreExtensionRuntime=null)}async drain(){for(;!this.paused&&!this.disposed;){let a=this.deferred.shift();if(!a)return;try{await a.dispatch()}catch(b){this.onDispatchError(a.source,b)}}}}},72498:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Wo:()=>v,Zd:()=>s,er:()=>w,gb:()=>t,ls:()=>r,vC:()=>x,wz:()=>u});var e=c(73024),f=c(76760),g=c(75430),h=c(61518),i=c(32980),j=c(87468),k=c(12727),l=c(65209),m=c(83401),n=c(46524),o=c(26143),p=a([g,h,i,l,o]);[g,h,i,l,o]=p.then?(await p)():p;class v extends Error{constructor(a){super(a),this.name="L4PiSessionBranchBlockedError"}}class w extends Error{constructor(){super("Pi session has no durable entry to clone"),this.name="L4PiSessionCloneEmptyError"}}function q(){return globalThis.__piDeskPiWorkSessionRuntimes||(globalThis.__piDeskPiWorkSessionRuntimes=new Map),globalThis.__piDeskPiWorkSessionRuntimes}class x{constructor(a,b){this.sessionManager=a,this.branchIndex=b,this.resources=new o.h,this.pendingBranchAppend=null,this.capabilityModeValue=null,this.capabilityTail=Promise.resolve(),this.disposed=!1,this.closePromise=null,this.indexedEntryCount=a.getEntries().length,this.branchIdValue=b.branchIdForHead(a.getLeafId()),this.chatWorker=this.createChatWorker(),this.unsubscribeCapabilities=(0,h.O)().subscribe(()=>{if(null===this.capabilityModeValue||this.disposed)return;let a=(0,h.O)().read(),b=Object.hasOwn(a,this.capabilityModeValue)?this.capabilityModeValue:null;this.setCapabilityMode(b).catch(a=>{console.error("[Pi Desk][Capabilities] 会话同步模式配置失败",{sessionId:this.sessionId,message:a instanceof Error?a.message:String(a)})})})}static create(a){let b=g.SessionManager.create(a),c=(0,m.l)(b);return(0,l.Ko)(a),x.fromManager(g.SessionManager.open(c,b.getSessionDir()))}static async open(a,b){let c=q().get(b);if(c){if(c.assertActive(),(0,f.resolve)(c.cwd)!==(0,f.resolve)(a))throw Error(`Pi session ${b} cwd does not match requested cwd`);return c}let d=await (0,l.vg)(a,b);if(!d)throw Error(`Pi session ${b} was not found in ${a}`);let e=x.fromManager(g.SessionManager.open(d));if((0,f.resolve)(e.cwd)!==(0,f.resolve)(a))throw Error(`Pi session ${b} cwd does not match persisted cwd`);return e}get cwd(){return this.sessionManager.getCwd()}get sessionId(){return this.sessionManager.getSessionId()}get branchId(){return this.branchIdValue}get isWorkerInitialized(){return this.assertActive(),this.chatWorker.isInitialized}readChatBackgroundTaskIds(){return this.assertActive(),this.chatWorker.getBackgroundTaskIds()}readPluginReloadBlockReason(){return this.assertActive(),this.chatWorker.readPluginReloadBlockReason()}readChatSnapshot(){return this.assertActive(),(0,k.xf)(this.sessionManager)}async readSessionTree(){this.assertActive();let a=this.sessionManager.getEntries().some(a=>"model_change"===a.type)?await g.ModelRuntime.create():void 0;return(0,n.cg)(this.sessionManager,a)}async readSessionTreeEntryDetail(a){this.assertActive();let b=this.sessionManager.getEntry(a)?.type==="model_change"?await g.ModelRuntime.create():void 0;return(0,n.j0)(this.sessionManager,a,b)}readChatImage(a,b){if(this.assertActive(),!Number.isSafeInteger(b)||b<0)throw Error("图片位置无效");if(!this.sessionManager.getBranch().some(b=>b.id===a))throw Error(`Pi session entry is not on the current branch: ${a}`);let c=this.sessionManager.getEntry(a);if(c?.type!=="message"||"user"!==c.message.role&&"toolResult"!==c.message.role)throw Error(`Pi session entry has no message images: ${a}`);let d=(0,k.Wl)(c.message.content,b);if(!d)throw Error(`Pi message image was not found: ${a}/${b}`);return d}subscribeChat(a){return this.assertActive(),this.chatWorker.subscribe(a)}get nativeUi(){return this.assertActive(),this.chatWorker.nativeUi}async readChatRuntime(){return this.assertActive(),this.chatWorker.getRuntime()}async readModelContext(){return this.assertActive(),this.chatWorker.readModelContext()}watchTaskDetail(a,b){return this.assertActive(),this.chatWorker.watchTaskDetail(a,b)}readTaskMessage(a,b){return this.assertActive(),this.chatWorker.readTaskMessage(a,b)}readTaskImage(a,b,c){return this.assertActive(),this.chatWorker.readTaskImage(a,b,c)}async interruptTask(a){this.assertActive(),await this.chatWorker.interruptTask(a)}async invokePluginMethod(a,b,c,d){if(this.assertActive(),a.sessionId!==this.sessionId||a.branchId!==this.branchId)throw Error("Pi session plugin source does not match the current runtime");return this.chatWorker.invokePluginMethod(b,c,d,a)}async listModels(){return this.assertActive(),this.chatWorker.listModels()}async listNativeCommands(){return this.assertActive(),this.chatWorker.listNativeCommands()}async executeNativeCommand(a,b){this.assertActive(),await this.chatWorker.executeNativeCommand(a,b)}async listNativeTools(a=!1){return a&&this.disposed?[]:(this.assertActive(),this.chatWorker.listNativeTools(a))}async executeDirectBash(a){return this.assertActive(),this.chatWorker.executeDirectBash(a)}async abortDirectBash(){this.assertActive(),await this.chatWorker.abortDirectBash()}async send(a){return this.assertActive(),this.chatWorker.send(a)}async interrupt(){this.assertActive(),await this.chatWorker.interrupt()}async compact(){this.assertActive(),await this.chatWorker.compact()}async reload(a){this.assertActive(),await this.chatWorker.reload(a)}async restoreQueuedMessages(){return this.assertActive(),this.chatWorker.restoreQueuedMessages()}async setTitle(a){this.assertActive(),await this.chatWorker.setTitle(a)}async setModel(a){this.assertActive(),await this.chatWorker.setModel(a)}setCapabilityMode(a){let b=this.capabilityTail.then(async()=>{if(this.assertActive(),null!==a&&!Object.hasOwn((0,h.O)().read(),a))throw Error("能力模式已不存在,请重新选择");this.capabilityModeValue=a,await this.chatWorker.applyCapabilityMode()});return this.capabilityTail=b.catch(()=>void 0),b}async dispose(){this.closePromise||(this.disposed=!0,this.unsubscribeCapabilities(),this.closePromise=this.chatWorker.dispose().finally(()=>this.resources.reset()),this.closePromise.then(()=>{q().get(this.sessionId)===this&&q().delete(this.sessionId)},a=>{console.warn("[Pi Desk][WorkSessionRuntime] 会话关闭未确认,保留实例占用直到重启",{sessionId:this.sessionId,message:a instanceof Error?a.message:String(a)})})),await this.waitForWorkerClose(this.closePromise,1500).catch(()=>void 0)}async waitForWorkerClose(a,b){let c;try{await Promise.race([a.then(()=>!0),new Promise(a=>{c=setTimeout(()=>a(!1),b)})])}finally{c&&clearTimeout(c)}}async branch(a){this.assertActive(),this.assertBranchable(),this.syncBranchIndex();let b=(0,n.eD)(this.sessionManager,a);if(!b.changed)return b;let c=this.sessionManager.getLeafId(),d=this.pendingBranchAppend;this.pendingBranchAppend=null;let e=!1;try{return(e=await this.chatWorker.navigateTree(b.selectedEntryId))?b:{...b,changed:!1,targetLeafEntryId:this.sessionManager.getLeafId(),editorText:null}}finally{this.syncBranchIndex();let a=this.sessionManager.getLeafId();e||a!==c?(this.pendingBranchAppend=this.branchIndex.predictAppend(a),this.branchIdValue=this.pendingBranchAppend.branchId):this.pendingBranchAppend=d}}createBranchedSession(a){let b,c,d,f,h;this.assertActive(),"at"===a.position&&this.assertBranchable(),this.syncBranchIndex();let i=this.sessionManager.getSessionFile();if(!i||!(0,e.existsSync)(i))throw Error(`Pi session ${this.sessionId} has no authoritative JSONL file`);if("before"===a.position){if(!a.entryId)throw new n.Ns("");let e=(0,n.u3)(this.sessionManager,a.entryId);b=e.selectedEntryId,c=e.targetLeafEntryId,d=e.editorText}else{if(!(b=a.entryId??this.sessionManager.getLeafId()??""))throw new w;if(!this.sessionManager.getEntry(b))throw new n.Ns(b);c=b,d=null}if(!(h=null===c?(f=g.SessionManager.create(this.cwd,this.sessionManager.getSessionDir())).newSession({parentSession:i}):(f=g.SessionManager.open(i,this.sessionManager.getSessionDir())).createBranchedSession(c)))throw Error(`Failed to create Pi session from entry: ${b}`);(0,m.l)(f),(0,l.Ko)(this.cwd);let j=x.fromManager(g.SessionManager.open(h,this.sessionManager.getSessionDir()));return console.info("[Pi Desk][PiWorkSessionRuntime] 已创建路径分支 Pi 会话",{sourceSessionId:this.sessionId,sourceBranchId:this.branchIndex.branchIdForEntry(b),selectedEntryId:b,targetLeafEntryId:c,position:a.position,sessionId:j.sessionId,branchId:j.branchId}),{runtime:j,editorText:d}}assertBranchable(){try{this.chatWorker.assertIdle()}catch(a){throw new v(a instanceof Error?a.message:"当前 Pi 会话不能切换分支")}}createChatWorker(){return new i.EG(this.cwd,this.sessionManager,a=>this.confirmAppendedEntry(a),{mode:()=>this.capabilityModeValue,rules:()=>null===this.capabilityModeValue?void 0:(0,h.O)().read()[this.capabilityModeValue]},this.resources)}confirmAppendedEntry(a){try{this.syncBranchIndex(),this.branchIndex.branchIdForEntry(a.id)}catch(b){throw console.error("[Pi Desk][PiWorkSessionRuntime] 增量同步 Pi 分支索引失败",{sessionId:this.sessionId,entryId:a.id,parentId:a.parentId,errorName:b instanceof Error?b.name:"UnknownError",errorMessage:b instanceof Error?b.message:String(b)}),b}}syncBranchIndex(){let a=this.sessionManager.getEntries();for(;this.indexedEntryCount<a.length;){let b,c=a[this.indexedEntryCount];this.pendingBranchAppend?(b=this.branchIndex.confirmAppend(this.pendingBranchAppend,c),this.pendingBranchAppend=null):b=this.branchIndex.appendEntry(c).branchId,this.indexedEntryCount+=1,this.sessionManager.getLeafId()===c.id&&(this.branchIdValue=b)}}static fromManager(a){let b=q().get(a.getSessionId());if(b)return b.assertActive(),b;let c=new x(a,new j.u(a.getEntries()));return q().set(c.sessionId,c),c}assertActive(){if(this.disposed)throw Error(`Pi session runtime has been disposed: ${this.sessionId}`)}}function r(a){let b=q().get(a);if(!b)throw Error(`Pi session runtime is not initialized: ${a}`);return b}async function s(){let a=await Promise.all([...q().values()].map(a=>a.listNativeTools(!0)));return[...new Map(a.flat().map(a=>[a.name,a])).values()]}async function t(a){await q().get(a)?.dispose()}async function u(){await Promise.all([...q().values()].map(a=>a.dispose()))}d()}catch(a){d(a)}})},73383:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{JF:()=>s,cI:()=>r,jd:()=>q});var e=c(76760),f=c(9753),g=c(99327),h=c(76452),i=a([g]);function j(a,b,c){if("string"!=typeof a)throw Error(`${b} must be a string`);let d=a.trim();if(!d||d.length>c)throw Error(`${b} must contain 1-${c} characters`);return d}function k(a,b,c){return null==a?null:j(a,b,c)}function l(a){if(void 0===a)return[];if(!Array.isArray(a)||a.length>12)throw Error("Task info must be an array with at most 12 items");return a.map((a,b)=>{if(!a||"object"!=typeof a||Array.isArray(a))throw Error(`Task info ${b} must be an object`);return{label:j(a.label,`Task info ${b} label`,64),value:j(a.value,`Task info ${b} value`,500)}})}function m(a,b){if("number"!=typeof a||!Number.isSafeInteger(a)||a<0)throw Error(`${b} must be a non-negative Unix millisecond timestamp`);return a}function n(a){if(!a||"object"!=typeof a)throw Error("Task snapshot is invalid");let b=function(a){switch(a){case"running":case"completed":case"failed":case"stopped":case"interrupted":return a;default:throw Error("Task status is invalid")}}(a.status),c=null===a.endedAt?null:m(a.endedAt,"Task endedAt");if("running"===b&&null!==c)throw Error("Running task requires endedAt=null");if("running"!==b&&null===c)throw Error("Terminal task requires endedAt");let d=function(a){if(null===a)return null;if(!a||"object"!=typeof a)throw Error("Task detailSource is invalid");if("text-file"===a.kind){let b=j(a.path,"Task text-file path",32768);if(!(0,e.isAbsolute)(b))throw Error("Task text-file path must be absolute");return{kind:"text-file",path:b}}if("pi-conversation"!==a.kind)throw Error("Task detailSource kind is invalid");if(void 0!==a.session){var b;if(!((b=a.session)&&"object"==typeof b&&"string"==typeof b.sessionId&&"function"==typeof b.sessionManager?.getBranch&&"function"==typeof b.agent?.subscribe))throw Error("Task AgentSession is invalid");return{kind:"pi-conversation",session:a.session}}let c=j(a.sessionFile,"Task sessionFile",32768);if(!(0,e.isAbsolute)(c))throw Error("Task sessionFile must be absolute");return{kind:"pi-conversation",sessionFile:c}}(a.detailSource);if("running"!==b&&d?.kind==="pi-conversation"&&d.session){let a=d.session.sessionFile;d=a?{kind:"pi-conversation",sessionFile:a}:null}return{record:{taskId:j(a.taskId,"Task id",200),taskKind:k(a.taskKind,"Task kind",100),taskType:k(a.taskType,"Task type",100),title:j(a.title,"Task title",200),info:l(a.info),status:b,activity:function(a){if(null==a)return null;if("string"!=typeof a)throw Error("Task activity must be a string");let b=a.trim();return b?b.length<=300?b:`${b.slice(0,299)}…`:null}(a.activity),startedAt:m(a.startedAt,"Task startedAt"),endedAt:c,detailSource:d,interrupt:"running"===b&&"function"==typeof a.interrupt?a.interrupt:null},infoLoader:function(a){if(null==a)return null;if("function"!=typeof a)throw Error("Task infoLoader must be a function");return a}(a.infoLoader)}}function o(a){let{detailSource:b,interrupt:c,...d}=a;return{...d,info:d.info.map(a=>({...a}))}}function p(a){let b=[],c=[];for(let d of a)"running"===d.status?b.push(d):c.push(d);return c.sort((a,b)=>(b.endedAt??0)-(a.endedAt??0)||b.startedAt-a.startedAt),[...b,...c.slice(0,100)].sort((a,b)=>b.startedAt-a.startedAt)}g=(i.then?(await i)():i)[0];class q{constructor(a,b){this.options=b,this.records=new Map,this.infoRuntimes=new Map,this.toolRuntimeOwners=new Map,this.disposed=!1,this.detailPool=new g.Il(a=>{let b=this.records.get(a);return b?{taskId:b.taskId,status:b.status,detailSource:b.detailSource,canInterrupt:"running"===b.status&&null!==b.interrupt}:null}),this.unsubscribe=a.on(f.O0,a=>{if(!this.disposed)try{this.apply(a)}catch(a){this.options.onInvalidReport(a)}})}summaries(){return p(this.records.values()).map(o)}activeTaskIds(){return[...this.records.values()].filter(a=>"running"===a.status).map(a=>a.taskId).sort()}record(a){return this.records.get(a)??null}async watchDetail(a,b){return await this.loadInfo(a),this.detailPool.watch(a,b)}readMessage(a,b){return this.detailPool.readMessage(a,b)}readImage(a,b,c){return this.detailPool.readImage(a,b,c)}async interrupt(a){let b=this.records.get(a);if(!b)throw new r(a);if("running"!==b.status||!b.interrupt)throw new s(a);await b.interrupt()}dispose(){if(!this.disposed){for(let a of(this.disposed=!0,this.unsubscribe(),this.detailPool.dispose(),this.toolRuntimeOwners.values()))a.lease.release();this.toolRuntimeOwners.clear(),this.records.clear(),this.infoRuntimes.clear()}}setToolRuntime(a,b){let c=b?.kind==="pi-conversation"?b.session:void 0,d=this.toolRuntimeOwners.get(a);if(d?.session!==c){if(d?.lease.release(),!c)return void this.toolRuntimeOwners.delete(a);this.toolRuntimeOwners.set(a,{session:c,lease:(0,h.s)(c)})}}releaseToolRuntime(a){this.toolRuntimeOwners.get(a)?.lease.release(),this.toolRuntimeOwners.delete(a)}setInfoLoader(a,b){let c=this.infoRuntimes.get(a);if(!b||c?.loader!==b){if(!b)return void this.infoRuntimes.delete(a);this.infoRuntimes.set(a,{loader:b,promise:null})}}async loadInfo(a){let b=this.infoRuntimes.get(a);if(!b)return;if(b.promise)return b.promise;let c=(async()=>{try{var c;if(!this.records.has(a))return;let d=l(await b.loader());if(this.infoRuntimes.get(a)!==b)return;this.infoRuntimes.delete(a);let e=this.records.get(a);if(!e||(c=e.info,c.length===d.length&&c.every((a,b)=>{let c=d[b];return a.label===c?.label&&a.value===c.value})))return;e.info=d,this.options.onChanged(this.summaries(),this.activeTaskIds())}catch(b){console.warn("[Pi Desk][TaskRuntime] 按需加载任务 info 失败",{taskId:a,errorName:b instanceof Error?b.name:"UnknownError"})}finally{this.infoRuntimes.get(a)===b&&(b.promise=null)}})();b.promise=c,await c}apply(a){if(!a||"object"!=typeof a)throw Error("Task report is invalid");let b=!1,c=new Set;if("upsert"===a.type){if(!Array.isArray(a.tasks))throw Error("Task upsert requires tasks");let d=a.tasks.map(n),e=new Set;for(let a of d){if(e.has(a.record.taskId))throw Error(`Task report contains duplicate id: ${a.record.taskId}`);e.add(a.record.taskId)}for(let a of d)this.records.set(a.record.taskId,a.record),this.setToolRuntime(a.record.taskId,a.record.detailSource),this.setInfoLoader(a.record.taskId,a.infoLoader),c.add(a.record.taskId),b=!0}else if("remove"===a.type){if(!Array.isArray(a.taskIds))throw Error("Task remove requires taskIds");for(let d of a.taskIds){let a=j(d,"Task id",200),e=this.records.delete(a);this.infoRuntimes.delete(a),this.releaseToolRuntime(a),e&&c.add(a),b=e||b}}else throw Error("Task report type is invalid");if(b){for(let a of this.trimTerminalHistory())c.add(a);for(let a of c)this.detailPool.taskChanged(a);this.options.onChanged(this.summaries(),this.activeTaskIds())}}trimTerminalHistory(){let a=[],b=new Set(p(this.records.values()).map(a=>a.taskId));for(let[c,d]of this.records)"running"===d.status||b.has(c)||(this.records.delete(c),this.infoRuntimes.delete(c),this.releaseToolRuntime(c),a.push(c));return a}}class r extends Error{constructor(a){super(`Task was not found: ${a}`),this.name="L4PiTaskNotFoundError"}}class s extends Error{constructor(a){super(`Task is not interruptible: ${a}`),this.name="L4PiTaskNotInterruptibleError"}}d()}catch(a){d(a)}})},73589:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{n:()=>n});var e=c(51455),f=c(48161),g=c(76760),h=c(58417),i=c(46107),j=a([i]);async function k(a){let b=await (0,e.realpath)(a).catch(()=>(0,g.resolve)(a));return"win32"===process.platform?b.toLowerCase():b}function l(a,b){return/^(npm:|git:|https?:|ssh:|git@)/.test(a)?null:a.startsWith("~/")?(0,g.join)((0,f.homedir)(),a.slice(2)):(0,g.resolve)(b,a)}function m(a,b){let c=(0,g.relative)(a,b);return""===c||!c.startsWith("..")&&!(0,g.isAbsolute)(c)}async function n(a,b,c){let d=new Set((0,i.to)(a).disabled.map(h.LD)),f=new Set;for(let b of d){let c=l(b,a);c&&f.add(await k(c))}for(let c of b.listConfiguredPackages()){if("user"!==c.scope||!c.installedPath)continue;let b=l(c.source,a),e=b&&f.has(await k(b));(d.has((0,h.LD)(c.source))||e)&&f.add(await k(c.installedPath))}if(f.size>0){let d=(0,g.join)(a,"extensions"),h=await (0,e.readdir)(d,{withFileTypes:!0}).catch(a=>{if(a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code)return[];throw a}),i=[...b.listConfiguredPackages().filter(a=>"user"===a.scope).flatMap(a=>a.installedPath??[]),...h.filter(a=>!a.name.startsWith(".")&&"node_modules"!==a.name&&(a.isDirectory()||a.isSymbolicLink())).map(a=>(0,g.join)(d,a.name)),...(c.getGlobalSettings().extensions??[]).filter(a=>!/^[!+-]|[?*{}]/.test(a)).flatMap(b=>l(b,a)??[])],j=[];for(let a of i)await (0,e.stat)(a).then(a=>a.isDirectory(),()=>!1)&&j.push(await k(a));for(let a of(j.sort((a,b)=>b.length-a.length),[...f])){if(!await (0,e.stat)(a).then(a=>a.isFile(),()=>!1))continue;let b=j.find(b=>m(b,a));b&&f.add(b)}}let j=new Map;return async(a,b,c)=>{if(c&&d.has((0,h.LD)(a)))return!0;if(!b||b.startsWith("builtin:")||0===f.size)return!1;let e=j.get(b);e||(e=k(b),j.set(b,e));let g=await e;return[...f].some(a=>m(a,g))}}i=(j.then?(await j)():j)[0],d()}catch(a){d(a)}})},75613:(a,b,c)=>{c.d(b,{i:()=>n});var d=c(73024),e=c(51455),f=c(76760),g=c(56752);let h=/\u001b(?:\[[0-?]*[ -/]*[@-~]|\][^\u0007]*(?:\u0007|\u001b\\))/g;function i(a,b,c){for(let d of[...a])try{d(b)}catch(a){console.error("[Pi Desk][TextLogRuntime] 日志监听器执行失败",{path:c,errorName:a instanceof Error?a.name:"UnknownError"})}}async function j(a){let b;try{b=await (0,e.stat)(a)}catch(a){if("ENOENT"===a.code)return{text:"",truncated:!1};throw a}if(!b.isFile())throw Error(`Text log source is not a file: ${a}`);let c=Math.max(0,b.size-131072),d=b.size-c,f=await (0,e.open)(a,"r");try{let a=Buffer.alloc(d);d>0&&await f.read(a,0,d,c);let b=a.toString("utf8").replace(h,""),e=c>0;if(c>0){let a=b.indexOf("\n");a>=0&&(b=b.slice(a+1))}let g=b.split("\n");return g.length>1e3&&(b=g.slice(g.length-1e3).join("\n"),e=!0),{text:b,truncated:e}}finally{await f.close()}}class k{constructor(a,b){this.path=a,this.listeners=new Set,this.watcher=null,this.interval=null,this.refreshTimer=null,this.refreshPromise=null,this.disposed=!1,this.current=b}static async create(a){let b=new k(a,await j(a));return b.startWatching(),b}snapshot(){return{...this.current}}subscribe(a){if(this.disposed)throw Error("Text log runtime has been disposed");return this.listeners.add(a),()=>this.listeners.delete(a)}dispose(){this.disposed||(this.disposed=!0,this.watcher?.close(),this.interval&&clearInterval(this.interval),this.refreshTimer&&clearTimeout(this.refreshTimer),this.watcher=null,this.interval=null,this.refreshTimer=null,this.listeners.clear())}startWatching(){try{this.watcher=(0,d.watch)(this.path,()=>this.scheduleRefresh()),this.watcher.on("error",()=>this.scheduleRefresh())}catch{this.watcher=null}this.interval=setInterval(()=>this.scheduleRefresh(),500)}scheduleRefresh(){this.disposed||this.refreshTimer||(this.refreshTimer=setTimeout(()=>{this.refreshTimer=null,this.refresh()},40))}refresh(){return this.disposed?Promise.resolve():(this.refreshPromise||(this.refreshPromise=(async()=>{try{let a=await j(this.path);if(this.disposed||a.text===this.current.text&&a.truncated===this.current.truncated)return;let b=this.current;this.current=a;let c=a.text.startsWith(b.text)?a.text.slice(b.text.length):"";c&&a.truncated===b.truncated?i(this.listeners,{type:"text_append",text:c},this.path):i(this.listeners,{type:"snapshot",snapshot:{...a}},this.path)}catch(a){console.warn("[Pi Desk][TextLogRuntime] 刷新日志失败",{path:this.path,errorName:a instanceof Error?a.name:"UnknownError"}),i(this.listeners,{type:"unavailable"},this.path)}})().finally(()=>{this.refreshPromise=null})),this.refreshPromise)}}class l{async observe(a,b){if(this.disposed)throw Error("Text log pool has been disposed");let c=function(a){let b=a.trim();if(!b||b.length>32768||!(0,f.isAbsolute)(b))throw Error("Text log path must be an absolute path");return(0,f.resolve)(b)}(a),d=(0,g.b)(c),e=this.sharedByPath.get(d);if(!e){let a=this.pendingByPath.get(d);a||(a=k.create(c).then(a=>{if(this.disposed)throw a.dispose(),Error("Text log pool was disposed during initialization");let b={runtime:a,references:0};return this.sharedByPath.set(d,b),b}).finally(()=>{this.pendingByPath.delete(d)}),this.pendingByPath.set(d,a)),e=await a}e.references+=1;let h=e.runtime.subscribe(b),i=!1;return{snapshot:e.runtime.snapshot(),readSnapshot:()=>e.runtime.snapshot(),release:()=>{i||(i=!0,h(),e.references-=1,e.references>0||(this.sharedByPath.get(d)===e&&this.sharedByPath.delete(d),e.runtime.dispose()))}}}dispose(){if(!this.disposed){for(let a of(this.disposed=!0,this.sharedByPath.values()))a.runtime.dispose();this.sharedByPath.clear(),this.pendingByPath.clear()}}constructor(){this.sharedByPath=new Map,this.pendingByPath=new Map,this.disposed=!1}}let m=new l;function n(){return m}},76452:(a,b,c)=>{c.d(b,{s:()=>i});var d=c(77598),e=c(12727);let f=new WeakMap;function g(a){try{let b=JSON.stringify(a);return void 0===b?null:JSON.parse(b)}catch{return null}}class h{constructor(a){this.session=a,this.listeners=new Set,this.toolsById=new Map,this.disposed=!1,this.unsubscribeAgent=a.agent.subscribe(a=>this.captureAgentEvent(a)),this.unsubscribeSession=a.subscribe(a=>this.captureSessionEvent(a));const b=a.sessionManager.getBranch(),c=a.agent.state.pendingToolCalls;for(const a of function(a){let b=new Map;for(let c of a)if("message"===c.type)if("assistant"===c.message.role)for(let a of(0,e.zz)(c.message.content))b.set(a.id,a);else"toolResult"===c.message.role&&b.delete(c.message.toolCallId);return[...b.values()]}(b))c.has(a.id)&&this.upsertTool(a.id,a.name,a.input);const d=a.agent.state.streamingMessage;d&&this.syncStreamingTools(d,!1)}get size(){return this.toolsById.size}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}activeMessages(){return[...this.toolsById.values()].map(a=>({tempId:a.tempId,message:this.toolMessage(a)}))}tempId(a){return this.toolsById.get(a)?.tempId??null}syncStreamingTools(a,b=!0){if("assistant"===a.role)for(let c of(0,e.zz)(a.content)){let{tool:a,created:d,changed:e}=this.upsertTool(c.id,c.name,c.input);b&&(d?this.publish({type:"message_start",tempId:a.tempId,message:this.toolMessage(a)}):e&&this.publishToolUpdate(a))}}projectLiveResult(a,b){let c=this.toolsById.get(b);return(0,e.zK)(a,b,c?.display,c?.input)}remove(a){this.toolsById.delete(a)}discardAll(){for(let a of this.toolsById.values())this.publish({type:"message_discard",tempId:a.tempId});this.toolsById.clear()}dispose(){this.disposed||(this.disposed=!0,this.unsubscribeAgent(),this.unsubscribeSession(),this.listeners.clear(),this.toolsById.clear())}captureAgentEvent(a){if(!this.disposed&&(!("parentToolCallId"in a)||void 0===a.parentToolCallId))switch(a.type){case"tool_execution_start":this.startTool(a.toolCallId,a.toolName,a.args);return;case"tool_execution_update":this.updateTool(a.toolCallId,a.toolName,a.args,a.partialResult);return;case"tool_execution_end":this.endTool(a.toolCallId,a.toolName,a.result,a.isError);return;case"turn_end":this.discardAll();return;default:return}}captureSessionEvent(a){("agent_end"===a.type&&a.willRetry||"agent_settled"===a.type)&&queueMicrotask(()=>{this.disposed||this.discardAll()})}upsertTool(a,b,c){let f=c&&"object"==typeof c&&!Array.isArray(c)?{...c}:{},g=this.toolsById.get(a);if(g){var h;let a=(0,e.zG)(b,f,g.displayCache),c=g.name!==b||(h=g.display,h.reasoning!==a.reasoning||h.inputPreview!==a.inputPreview||h.activity!==a.activity);return g.name=b,g.input=f,g.display=a,{tool:g,created:!1,changed:c}}let i={},j={tempId:(0,d.randomUUID)(),toolCallId:a,name:b,display:(0,e.zG)(b,f,i),displayCache:i,input:f,partialResult:null,result:null,status:"running",startedAtMs:null,durationMs:null};return this.toolsById.set(a,j),{tool:j,created:!0,changed:!0}}startTool(a,b,c){let{tool:d,created:e,changed:f}=this.upsertTool(a,b,c),g="bash"===b&&null===d.startedAtMs;d.status="running",g&&(d.startedAtMs=Date.now()),e?this.publish({type:"message_start",tempId:d.tempId,message:this.toolMessage(d)}):(f||g)&&this.publishToolUpdate(d)}updateTool(a,b,c,d){this.startTool(a,b,c);let e=this.toolsById.get(a);e&&(e.partialResult=d,e.status="running",this.publishToolUpdate(e))}endTool(a,b,c,d){this.toolsById.has(a)||this.startTool(a,b,{});let e=this.toolsById.get(a);e&&("bash"===e.name&&null!==e.startedAtMs&&(e.durationMs=Math.max(0,Date.now()-e.startedAtMs),function(a,b){if(!a||"object"!=typeof a||Array.isArray(a))return;let c=a.details&&"object"==typeof a.details&&!Array.isArray(a.details)?a.details:{};a.details={...c,durationMs:b}}(c,e.durationMs)),e.result=c,e.status=d?"error":"completed",this.publishToolUpdate(e))}publishToolUpdate(a){this.publish({type:"message_update",tempId:a.tempId,message:this.toolMessage(a)})}toolMessage(a){let b;return{type:"tool",name:a.name,reasoning:a.display.reasoning,inputPreview:a.display.inputPreview,activity:a.display.activity,status:a.status,usage:null,output:"",startedAtMs:a.startedAtMs,durationMs:a.durationMs,declaration:{message:{kind:"tool",toolName:a.name,toolCallId:a.toolCallId,arguments:(b=g(a.input))&&"object"==typeof b&&!Array.isArray(b)?b:{},partialResult:g(a.partialResult),result:g(a.result),isError:"error"===a.status},raw:{toolCallId:a.toolCallId,toolName:a.name,args:a.input,partialResult:a.partialResult,result:a.result}}}}publish(a){for(let b of[...this.listeners])try{b(a)}catch(b){console.error("[Pi Desk][AgentToolRuntime] 事件监听器执行失败",{sessionId:this.session.sessionId,eventType:a.type,errorName:b instanceof Error?b.name:"UnknownError"})}}}function i(a){let b=f.get(a);b||(b={runtime:new h(a),references:0},f.set(a,b)),b.references+=1;let c=!1;return{runtime:b.runtime,release:()=>{c||(c=!0,b.references-=1,b.references>0||(f.delete(a),b.runtime.dispose()))}}}},77662:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{p:()=>r});var e=c(76760),f=c(75430),g=c(9753),h=c(59473),i=c(69503),j=c(73383),k=c(40333),l=a([f,j]);[f,j]=l.then?(await l)():l;let m=h.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),n=h.g1(h.Yj(),h.Pq()),o=h.g1(h.Yj().min(1),h.KC([n,h.ch()])),p=h.Ik({pluginName:m,event:m,data:n}).strict(),q=h.Ik({directory:h.Yj().min(1).max(4096).refine(a=>(0,e.isAbsolute)(a)&&!a.includes("\0")),default:h.zM().optional()}).strict();class r{constructor(a){this.options=a,this.controller=(0,f.createEventBus)(),this.slots=new Map,this.methods=new Map,this.unsubscribe=()=>void 0,this.unsubscribePush=()=>void 0,this.unsubscribePreviewDirectory=()=>void 0,this.disposed=!1,this.eventBus={emit:(a,b)=>{if(!this.disposed){if(a===g.Sl)return void this.applyMethodEvent(b);this.controller.emit(a,b)}},on:(a,b)=>this.disposed?()=>void 0:this.controller.on(a,b)},this.bindChannels()}createTaskRuntime(){let a=this.options;return new j.jd(this.controller,{onChanged:(b,c)=>{this.applyTaskSummaries(b),a.onTasksChanged(c),a.onChanged()},onInvalidReport:b=>a.onInvalidUpdate(b)})}bindChannels(){let a=this.options;this.taskRuntime=this.createTaskRuntime(),this.unsubscribe=this.controller.on(g.k0,b=>{if(this.disposed)return;let c=o.safeParse(b);if(!c.success)return void a.onInvalidUpdate(c.error);try{this.apply(c.data)&&a.onChanged()}catch(b){a.onInvalidUpdate(b)}}),this.unsubscribePreviewDirectory=this.controller.on(g.Nx,b=>{if(this.disposed)return;let c=q.safeParse(b);if(!c.success)return void a.onInvalidUpdate(c.error);try{this.applyPreviewDirectory(c.data)&&a.onChanged()}catch(b){a.onInvalidUpdate(b)}}),this.unsubscribePush=this.controller.on(g.Nb,b=>{if(this.disposed)return;let c=p.safeParse(b);c.success?Buffer.byteLength(JSON.stringify(c.data.data),"utf8")>65536?a.onInvalidUpdate(Error("Session Plugin Push data exceeds 64KB")):a.onPush(structuredClone(c.data)):a.onInvalidUpdate(c.error)})}activeTaskIds(){return this.taskRuntime.activeTaskIds()}taskRecord(a){return this.taskRuntime.record(a)}watchTaskDetail(a,b){return this.taskRuntime.watchDetail(a,b)}readTaskMessage(a,b){return this.taskRuntime.readMessage(a,b)}readTaskImage(a,b,c){return this.taskRuntime.readImage(a,b,c)}interruptTask(a){return this.taskRuntime.interrupt(a)}snapshot(){return Object.fromEntries([...this.slots.entries()].sort(([a],[b])=>a.localeCompare(b)).map(([a,b])=>[a,structuredClone(b.value)]))}async invokeMethod(a,b,c,d,e){if(this.disposed)throw Error("Pi session plugin runtime has been disposed");let f=(0,k.FX)(a),g=(0,k.QK)(b),h=this.methods.get((0,k.$m)(f,g));if(!h)throw new k.Tk(f,g);let i=await h.execute((0,k.nJ)(c,"input"),{source:d,extensionContext:e});return(0,k.nJ)(i,"output")}resetBranch(){this.disposed||(this.taskRuntime.dispose(),this.slots.clear(),this.taskRuntime=this.createTaskRuntime(),this.options.onTasksChanged([]),this.options.onChanged())}reset(){this.disposed||(this.unsubscribe(),this.unsubscribePush(),this.unsubscribePreviewDirectory(),this.taskRuntime.dispose(),this.controller.clear(),this.methods.clear(),this.slots.clear(),this.bindChannels(),this.options.onTasksChanged([]),this.options.onChanged())}dispose(){this.disposed||(this.disposed=!0,this.unsubscribe(),this.unsubscribePush(),this.unsubscribePreviewDirectory(),this.taskRuntime.dispose(),this.controller.clear(),this.methods.clear(),this.slots.clear())}applyMethodEvent(a){if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Session plugin method event is invalid");let b=a.registration;if("register"!==a.type&&"unregister"!==a.type||!b||"object"!=typeof b||"string"!=typeof b.pluginName||"string"!=typeof b.method||"function"!=typeof b.execute)throw Error("Session plugin method registration is invalid");let c=(0,k.FX)(b.pluginName),d=(0,k.QK)(b.method),e=(0,k.$m)(c,d);if("register"===a.type){if(this.methods.has(e))throw new k.qs(c,d);this.methods.set(e,b);return}this.methods.get(e)===b&&this.methods.delete(e)}applyTaskSummaries(a){if(0===a.length)return void this.slots.delete("task-center");let b={tasks:a.map(a=>({...a,info:a.info.map(a=>({...a}))}))};this.slots.set("task-center",{serialized:JSON.stringify(b),value:b})}applyPreviewDirectory(a){let b=(0,e.resolve)(a.directory),c=(0,i.Yj)(b),d=this.slots.get(i.s6),f=(0,i.D)(d?.value),g=f.directories.find(a=>(0,i.Yj)(a)===c);if(!g&&f.directories.length>=i.xI)throw Error(`会话预览目录数量已达上限 ${i.xI}`);let h=g??b,j={directories:g?f.directories:[...f.directories,h],defaultDirectory:!0===a.default?h:f.defaultDirectory},k=JSON.stringify(j);return d?.serialized!==k&&(this.slots.set(i.s6,{serialized:k,value:j}),!0)}apply(a){if(Object.hasOwn(a,"task-center"))throw Error("task-center plugin slot is reserved by the Task Runtime");if(Object.hasOwn(a,i.s6))throw Error("project-preview 插件槽由会话预览目录登记管理");let b=!1;for(let[c,d]of Object.entries(a)){if(null===d){b=this.slots.delete(c)||b;continue}let a=JSON.stringify(d);this.slots.get(c)?.serialized!==a&&(this.slots.set(c,{serialized:a,value:d}),b=!0)}return b}}d()}catch(a){d(a)}})},77844:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{lr:()=>m,mu:()=>l,ni:()=>i,qc:()=>j,ti:()=>k});var e=c(73024),f=c(75430),g=c(54174),h=a([f]);f=(h.then?(await h)():h)[0];let m=0x1f00000;class n extends Error{constructor(a){super(a),this.name="L4PiChatInputError"}}function i(a){if(!a.text.trim()&&0===a.images.length)throw new n("请输入文字或添加图片");return{text:a.text,images:a.images.map(a=>({...a})),imageBytes:function(a){if(a.length>10)throw new n("单次最多发送 10 张图片");let b=0;for(let c of a){let a=(0,g.f1)(c);if(a.bytes.length>0xa00000)throw new n("单张图片压缩后不能超过 10MB");b+=a.bytes.length}if(b>0x1400000)throw new n("单次发送图片总量不能超过 20MB");return b}(a.images)}}function j(a,b,c,d){let h=function(a,b){var c,d;let e;if(!a.startsWith("/"))return a;let f=a.match(/^\/([^\s]+)(?:\s+([\s\S]*))?$/);if(!f)return a;let g=b.find(a=>a.name===f[1]);return g?(c=g.content,e=(d=function(a){let b=[],c="",d=null;for(let e of a){if(d){e===d?d=null:c+=e;continue}if('"'===e||"'"===e){d=e;continue}if(/\s/.test(e)){c&&b.push(c),c="";continue}c+=e}return c&&b.push(c),b}(f[2]??"")).join(" "),c.replace(/\$\{(\d+|ARGUMENTS|@):-([^}]*)\}|\$\{@:(\d+)(?::(\d+))?\}|\$(ARGUMENTS|@|\d+)/g,(a,b,c,f,g,h)=>{if("string"==typeof b)return("@"===b||"ARGUMENTS"===b?e:d[Number.parseInt(b,10)-1])||c;if("string"==typeof f){let a=Math.max(0,Number.parseInt(f,10)-1);return"string"==typeof g?d.slice(a,a+Number.parseInt(g,10)).join(" "):d.slice(a).join(" ")}return"ARGUMENTS"===h||"@"===h?e:d[Number.parseInt(h,10)-1]??""})):a}(function(a,b){if(!a.startsWith("/skill:"))return a;let c=a.indexOf(" "),d=-1===c?a.slice(7):a.slice(7,c),g=-1===c?"":a.slice(c+1).trim(),h=b.find(a=>a.name===d);if(!h)return a;try{let a=(0,f.stripFrontmatter)((0,e.readFileSync)(h.filePath,"utf8")).trim(),b=`<skill name="${h.name}" location="${h.filePath}">
29
29
  References are relative to ${h.baseDir}.
30
30
 
31
31
  ${a}
@@ -1 +1 @@
1
- "use strict";(()=>{var a={};a.id=16183,a.ids=[16183],a.modules={27910:a=>{a.exports=require("stream")},28354:a=>{a.exports=require("util")},28802:a=>{a.exports=import("@earendil-works/pi-ai")},31421:a=>{a.exports=require("node:child_process")},34631:a=>{a.exports=require("tls")},38522:a=>{a.exports=require("node:zlib")},48161:a=>{a.exports=require("node:os")},51455:a=>{a.exports=require("node:fs/promises")},55511:a=>{a.exports=require("crypto")},55591:a=>{a.exports=require("https")},57075:a=>{a.exports=require("node:stream")},57975:a=>{a.exports=require("node:util")},58500:a=>{a.exports=require("node:timers/promises")},60815:a=>{a.exports=import("typebox")},68231:(a,b,c)=>{async function d(){let a=performance.now();console.info("[Pi Desk][Instrumentation] 开始装配应用 Runtime");let[{registerL1AppSocketRuntime:b},{registerL1WebAuthRuntime:d},{getL1AppSocketRuntime:e},{getL1WebAuthRuntime:f},{createL2PluginAppRuntimeSink:g},{getL2WorkSessionManage:h},{getL4PiGlobalPluginRuntime:i},{executeL2PluginCommand:j},{initializeL2PluginManagement:k},{initializeL4PiDeskCommands:l}]=await Promise.all([c.e(39144).then(c.bind(c,39144)),c.e(76168).then(c.bind(c,76168)),Promise.all([c.e(36153),c.e(36361),c.e(50520),c.e(5034),c.e(25406),c.e(94296)]).then(c.bind(c,94296)),Promise.all([c.e(36153),c.e(5034),c.e(61211)]).then(c.bind(c,99672)),Promise.all([c.e(36153),c.e(5034),c.e(98227)]).then(c.bind(c,31442)),Promise.all([c.e(36153),c.e(36361),c.e(25406),c.e(93049)]).then(c.bind(c,25406)),Promise.all([c.e(36153),c.e(36361)]).then(c.bind(c,36361)),Promise.all([c.e(36153),c.e(36361),c.e(50520),c.e(84231)]).then(c.bind(c,84231)),Promise.all([c.e(36153),c.e(36361),c.e(50520)]).then(c.bind(c,50520)),c.e(47757).then(c.bind(c,47757))]),m=performance.now();console.info("[Pi Desk][Instrumentation] 应用模块加载完成,开始初始化命令入口",{durationMs:Math.round(m-a)});let n=h();k({refreshPluginMessages:()=>n.refreshPluginMessages(),runPluginRestart:a=>n.runPluginRestart(a)}),d(f()),await l(j);let o=performance.now();console.info("[Pi Desk][Instrumentation] 命令入口初始化完成,开始恢复基础工作会话",{durationMs:Math.round(o-m)});let p=i();p.bindAppRuntimeSink(g()),await n.initialize();let q=performance.now();p.bindWorkSessionProvider(async()=>(await n.listWorkSessions()).workSessions.map(a=>({source:{workId:a.workId,sessionId:a.sessionId,branchId:a.branchId},cwd:a.cwd,status:a.status})));let r=e();p.bindPushSender(a=>r.pushPlugin(a)),b(r),console.info("[Pi Desk][Instrumentation] 登录认证和基础工作会话已就绪,应用 Runtime 已注册",{durationMs:Math.round(performance.now()-a),moduleImportMs:Math.round(m-a),commandInitializeMs:Math.round(o-m),workSessionRestoreMs:Math.round(q-o)}),setTimeout(()=>{p.initialize().then(()=>{n.refreshPluginMessages(),console.info("[Pi Desk][Instrumentation] 插件加载尝试完成,基础聊天不依赖插件就绪")},a=>{console.error("[Pi Desk][Instrumentation] 插件加载失败,保留基础聊天",{message:a instanceof Error?a.message:String(a)})})},0)}c.r(b),c.d(b,{register:()=>d})},73024:a=>{a.exports=require("node:fs")},73136:a=>{a.exports=require("node:url")},74075:a=>{a.exports=require("zlib")},75430:a=>{a.exports=import("@earendil-works/pi-coding-agent")},76760:a=>{a.exports=require("node:path")},77598:a=>{a.exports=require("node:crypto")},79428:a=>{a.exports=require("buffer")},79551:a=>{a.exports=require("url")},80481:a=>{a.exports=require("node:readline")},81630:a=>{a.exports=require("http")},91645:a=>{a.exports=require("net")},93736:a=>{a.exports=import("jiti")},94735:a=>{a.exports=require("events")}};var b=require("./webpack-runtime.js");b.C(a);var c=b(b.s=68231);module.exports=c})();
1
+ "use strict";(()=>{var a={};a.id=16183,a.ids=[16183],a.modules={27910:a=>{a.exports=require("stream")},28354:a=>{a.exports=require("util")},28802:a=>{a.exports=import("@earendil-works/pi-ai")},31421:a=>{a.exports=require("node:child_process")},34631:a=>{a.exports=require("tls")},38522:a=>{a.exports=require("node:zlib")},48161:a=>{a.exports=require("node:os")},51455:a=>{a.exports=require("node:fs/promises")},55511:a=>{a.exports=require("crypto")},55591:a=>{a.exports=require("https")},57075:a=>{a.exports=require("node:stream")},57975:a=>{a.exports=require("node:util")},58500:a=>{a.exports=require("node:timers/promises")},60815:a=>{a.exports=import("typebox")},68231:(a,b,c)=>{async function d(){let a=performance.now();console.info("[Pi Desk][Instrumentation] 开始装配应用 Runtime");let[{registerL1AppSocketRuntime:b},{registerL1WebAuthRuntime:d},{getL1AppSocketRuntime:e},{getL1WebAuthRuntime:f},{createL2PluginAppRuntimeSink:g},{getL2WorkSessionManage:h},{getL4PiGlobalPluginRuntime:i},{executeL2PluginCommand:j},{initializeL2PluginManagement:k},{initializeL4PiDeskCommands:l}]=await Promise.all([c.e(39144).then(c.bind(c,39144)),c.e(76168).then(c.bind(c,76168)),Promise.all([c.e(36153),c.e(36361),c.e(50520),c.e(5034),c.e(25406),c.e(94296)]).then(c.bind(c,94296)),Promise.all([c.e(36153),c.e(5034),c.e(61211)]).then(c.bind(c,99672)),Promise.all([c.e(36153),c.e(5034),c.e(98227)]).then(c.bind(c,31442)),Promise.all([c.e(36153),c.e(36361),c.e(25406),c.e(93049)]).then(c.bind(c,25406)),Promise.all([c.e(36153),c.e(36361)]).then(c.bind(c,36361)),Promise.all([c.e(36153),c.e(36361),c.e(50520),c.e(84231)]).then(c.bind(c,84231)),Promise.all([c.e(36153),c.e(36361),c.e(50520)]).then(c.bind(c,50520)),c.e(47757).then(c.bind(c,47757))]),m=performance.now();console.info("[Pi Desk][Instrumentation] 应用模块加载完成,开始初始化命令入口",{durationMs:Math.round(m-a)});let n=h();k({runPluginRestart:a=>n.runPluginRestart(a)}),d(f()),await l(j);let o=performance.now();console.info("[Pi Desk][Instrumentation] 命令入口初始化完成,开始恢复基础工作会话",{durationMs:Math.round(o-m)});let p=i();p.bindAppRuntimeSink(g()),await n.initialize();let q=performance.now();p.bindWorkSessionProvider(async()=>(await n.listWorkSessions()).workSessions.map(a=>({source:{workId:a.workId,sessionId:a.sessionId,branchId:a.branchId},cwd:a.cwd,status:a.status})));let r=e();p.bindPushSender(a=>r.pushPlugin(a)),b(r),console.info("[Pi Desk][Instrumentation] 登录认证和基础工作会话已就绪,应用 Runtime 已注册",{durationMs:Math.round(performance.now()-a),moduleImportMs:Math.round(m-a),commandInitializeMs:Math.round(o-m),workSessionRestoreMs:Math.round(q-o)}),setTimeout(()=>{p.initialize().then(()=>{console.info("[Pi Desk][Instrumentation] 插件加载尝试完成,基础聊天不依赖插件就绪")},a=>{console.error("[Pi Desk][Instrumentation] 插件加载失败,保留基础聊天",{message:a instanceof Error?a.message:String(a)})})},0)}c.r(b),c.d(b,{register:()=>d})},73024:a=>{a.exports=require("node:fs")},73136:a=>{a.exports=require("node:url")},74075:a=>{a.exports=require("zlib")},75430:a=>{a.exports=import("@earendil-works/pi-coding-agent")},76760:a=>{a.exports=require("node:path")},77598:a=>{a.exports=require("node:crypto")},79428:a=>{a.exports=require("buffer")},79551:a=>{a.exports=require("url")},80481:a=>{a.exports=require("node:readline")},81630:a=>{a.exports=require("http")},91645:a=>{a.exports=require("net")},93736:a=>{a.exports=import("jiti")},94735:a=>{a.exports=require("events")}};var b=require("./webpack-runtime.js");b.C(a);var c=b(b.s=68231);module.exports=c})();
@@ -1 +1 @@
1
- globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],lowPriorityFiles:["static/n2LrXQgq8UkbH_AzhR3fw/_buildManifest.js","static/n2LrXQgq8UkbH_AzhR3fw/_ssgManifest.js"],rootMainFiles:["static/chunks/webpack-40a782fc8a3535b9.js","static/chunks/e388c842-1ca92f1ea0dfe8ee.js","static/chunks/64444-3e955f910569274d.js","static/chunks/main-app-6230945a5a062fce.js"],rootMainFilesTree:{},pages:{"/_app":[]}};
1
+ globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],lowPriorityFiles:["static/RLKcK-RQF5FvEeDmS9uih/_buildManifest.js","static/RLKcK-RQF5FvEeDmS9uih/_ssgManifest.js"],rootMainFiles:["static/chunks/webpack-d7248206b7fc7ba8.js","static/chunks/e388c842-1ca92f1ea0dfe8ee.js","static/chunks/64444-3e955f910569274d.js","static/chunks/main-app-6230945a5a062fce.js"],rootMainFilesTree:{},pages:{"/_app":[]}};