@jetcrab/pi-desk 1.1.34-dev → 1.1.38-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 (62) hide show
  1. package/README.md +10 -10
  2. package/README.zh-CN.md +10 -10
  3. package/docs/commands.md +13 -2
  4. package/docs/plugins.md +10 -0
  5. package/package.json +3 -3
  6. package/src/client/l2_biz/pi-settings/l2-pi-settings-locale.ts +3 -3
  7. package/src/client/l2_biz/plugin-host/l2-plugin-host-runtime.ts +5 -6
  8. package/src/client/l4_foundation/plugin-host/l4-plugin-host-runtime.ts +20 -2
  9. package/src/common/l2_biz/plugin/l2-plugin-management-messages.ts +29 -17
  10. package/src/common/l2_biz/project-preview/l2-project-history-messages.ts +9 -7
  11. package/src/common/l2_biz/settings/l2-settings-messages.ts +82 -69
  12. package/src/common/l2_biz/terminal/l2-terminal-locale-messages.ts +1 -1
  13. package/src/common/l2_biz/workbench/l2-workbench-locale-messages.ts +48 -38
  14. package/src/common/l2_biz/workbench/l2-workbench-picker-messages.ts +12 -8
  15. package/src/common/l3_modules/conversation/l3-conversation-locale-messages.ts +24 -20
  16. package/src/common/l3_modules/project-files/l3-project-files-locale-messages.ts +29 -17
  17. package/src/common/l4_foundation/locale/l4-host-error-messages.ts +5 -5
  18. package/src/server/l2_biz/plugin-management/l2-plugin-commands.ts +8 -7
  19. package/src/server/l2_biz/plugin-management/l2-plugin-management.ts +51 -2
  20. package/src/server/l4_foundation/pi/l4-pi-global-plugin-runtime.ts +9 -1
  21. package/src/server/l4_foundation/pi/l4-pi-local-extension-maintenance.ts +118 -0
  22. package/src/server/l4_foundation/pi/l4-pi-plugin-owner-runtime.ts +4 -1
  23. package/src/server/l4_foundation/pi/l4-pi-plugin-source-changes.ts +4 -0
  24. package/src/server/l4_foundation/pidesk/l4-pidesk-command.ts +1 -1
  25. package/temp/build/pi-desk/release/.next/BUILD_ID +1 -1
  26. package/temp/build/pi-desk/release/.next/build-manifest.json +2 -2
  27. package/temp/build/pi-desk/release/.next/required-server-files.js +2 -2
  28. package/temp/build/pi-desk/release/.next/required-server-files.json +2 -2
  29. package/temp/build/pi-desk/release/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  30. package/temp/build/pi-desk/release/.next/server/app/_global-error.html +1 -1
  31. package/temp/build/pi-desk/release/.next/server/app/_global-error.rsc +1 -1
  32. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  33. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  34. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  35. package/temp/build/pi-desk/release/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  36. package/temp/build/pi-desk/release/.next/server/app/api/health/route.js +1 -1
  37. package/temp/build/pi-desk/release/.next/server/app/login/page_client-reference-manifest.js +1 -1
  38. package/temp/build/pi-desk/release/.next/server/app/page.js +3 -3
  39. package/temp/build/pi-desk/release/.next/server/app/page_client-reference-manifest.js +1 -1
  40. package/temp/build/pi-desk/release/.next/server/app/project-preview/page_client-reference-manifest.js +1 -1
  41. package/temp/build/pi-desk/release/.next/server/chunks/16438.js +1 -1
  42. package/temp/build/pi-desk/release/.next/server/chunks/25406.js +2 -2
  43. package/temp/build/pi-desk/release/.next/server/chunks/35985.js +2 -2
  44. package/temp/build/pi-desk/release/.next/server/chunks/36361.js +3 -3
  45. package/temp/build/pi-desk/release/.next/server/chunks/47757.js +1 -1
  46. package/temp/build/pi-desk/release/.next/server/chunks/50520.js +2 -2
  47. package/temp/build/pi-desk/release/.next/server/chunks/84231.js +3 -3
  48. package/temp/build/pi-desk/release/.next/server/chunks/{18748.js → 88353.js} +1 -1
  49. package/temp/build/pi-desk/release/.next/server/chunks/92386.js +4 -4
  50. package/temp/build/pi-desk/release/.next/server/instrumentation.js +1 -1
  51. package/temp/build/pi-desk/release/.next/server/middleware-build-manifest.js +1 -1
  52. package/temp/build/pi-desk/release/.next/server/pages/500.html +1 -1
  53. package/temp/build/pi-desk/release/.next/static/chunks/11937-c21edad81915b999.js +1 -0
  54. package/temp/build/pi-desk/release/.next/static/chunks/15302-e9fd56a464b5267b.js +1 -0
  55. package/temp/build/pi-desk/release/.next/static/chunks/app/layout-1ec03fc5766568f6.js +1 -0
  56. package/temp/build/pi-desk/release/.next/static/chunks/app/{page-468db7c29da3cdf6.js → page-402842ab5d6afb08.js} +3 -3
  57. package/temp/build/pi-desk/release/.next/trace-build +1 -1
  58. package/temp/build/pi-desk/release/.next/static/chunks/11937-d5d4d2199356c3ed.js +0 -1
  59. package/temp/build/pi-desk/release/.next/static/chunks/15302-6e070e13fa65c863.js +0 -1
  60. package/temp/build/pi-desk/release/.next/static/chunks/app/layout-fdea504082053156.js +0 -1
  61. /package/temp/build/pi-desk/release/.next/static/{SEeF4XXo-IRzX6G2WyyuJ → ljXlpZIQpD6BvWyD8Fmc3}/_buildManifest.js +0 -0
  62. /package/temp/build/pi-desk/release/.next/static/{SEeF4XXo-IRzX6G2WyyuJ → ljXlpZIQpD6BvWyD8Fmc3}/_ssgManifest.js +0 -0
@@ -1,9 +1,9 @@
1
- "use strict";exports.id=84231,exports.ids=[84231],exports.modules={52078:(a,b,c)=>{c.d(b,{DL:()=>h,Y_:()=>g,sg:()=>f,xg:()=>j});var d=c(51455),e=c(76760);function f(a){return/^npm:((?:@[^/]+\/)?[^@]+)(?:@.+)?$/.exec(a)?.[1]??null}function g(a,b){return f(a.source)??a.pluginName??(0,e.basename)((0,e.resolve)(b,a.source)).replace(/\.(?:ts|js)$/,"")}function h(a,b,c){let d=a.filter(a=>g(a,c)===b||a.pluginName===b||!f(a.source)&&(0,e.basename)((0,e.resolve)(c,a.source))===b),h=d.filter(a=>!(f(a.source)&&null===a.version&&null===a.error&&a.operation?.phase==="failed"));if(h.length>1)throw Error(`插件名字对应多个来源,请先检查插件清单:${b}`);return h[0]??(1===d.length?d[0]:null)}async function i(a){try{return await (0,d.stat)(a),!0}catch(a){if(a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code)return!1;throw a}}async function j(a,b,c){if(a.startsWith("@"))return null;let f=(0,e.join)(b,"extensions"),g=[(0,e.join)(f,a),.../\.(?:ts|js)$/.test(a)?[]:[(0,e.join)(f,`${a}.ts`),(0,e.join)(f,`${a}.js`)]];c&&!/^[a-z][a-z0-9+.-]*:/i.test(c.source)?g.push((0,e.resolve)(b,c.source)):c&&(0,e.isAbsolute)(c.source)&&g.push(c.source);let h=[...new Set((await Promise.all(g.map(async a=>await i(a)?(0,d.realpath)(a):null))).filter(a=>null!==a))];if(h.length>1)throw Error(`固定扩展目录中存在多个同名入口:${a}`);let j=h[0];if(!j)return null;let k=(0,e.relative)(await (0,d.realpath)(f),j);if(k.startsWith("..")||(0,e.isAbsolute)(k))throw Error("本地插件必须位于 Pi AgentDir 的 extensions 目录内");return j}},84231:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{executeL2PluginCommand:()=>q});var e=c(75430),f=c(76019),g=c(16056),h=c(50520),i=c(52078),j=a([e,h]);function k(a,b){return{name:(0,i.Y_)(a,b),source:a.source,kind:a.kind,version:a.version,status:a.status,...void 0===a.updateTag?{}:{updateTag:a.updateTag},...void 0===a.availableVersion?{}:{availableVersion:a.availableVersion},...void 0===a.updateError?{}:{updateError:a.updateError},...a.operation?{operation:a.operation}:{},...a.error?{error:a.error}:{}}}function l(a){return a instanceof Error?a.message:String(a)}async function m(a,b,c,d){let e=new Map;for(let f of b){let b=(0,i.DL)(c.plugins,f,d);if("reload"===a.action){if(!b)throw Error(`插件不存在:${f}`);if("disabled"===b.status)throw Error(`插件已禁用,请先启用:${f}`);e.set(b.source,{name:f,source:b.source,local:!1});continue}if("remove"===a.action){if(!b)throw Error(`插件不存在:${f}`);if("package"!==b.kind)throw Error(`当前插件管理只支持卸载包来源,不支持卸载裸扩展:${f}`);e.set(b.source,{name:f,source:b.source,local:!1});continue}let g=await (0,i.xg)(f,d,b),h=b?(0,i.sg)(b.source):null;if(g&&h)throw Error(`同时存在本地扩展和 npm 来源,请先处理同名冲突:${f}`);if(g){if(a.version||a.tag)throw Error(`本地插件加载当前代码,不支持通过版本号或渠道切换源码:${f}`);e.set(g,{name:f,source:b?.source??g,local:!0})}else{if(b&&!h)throw Error(`该来源不能通过名字重新安装;本地插件必须位于全局 extensions 目录:${f}`);let c=`npm:${h??f}${a.version?`@${a.version}`:""}`;e.set(`npm:${h??f}`,{name:f,source:c,...b?{previousSource:b.source}:{},local:!1})}}return[...e.values()]}async function n(a,b,c){if("reload"===a.action){let a=[];for(let d of b)try{await c.apply([d.source]),a.push({target:d,error:null})}catch(b){a.push({target:d,error:l(b)})}return a}let d=new Map,e=b.filter(a=>!a.local),f=b.filter(a=>a.local);if(e.length>0)try{if(a.names)for(let b of(await c.batch("remove"===a.action?{action:"del",sources:e.map(a=>a.source)}:{action:"add",items:e.map(b=>({source:b.source,...a.tag?{tag:a.tag}:{}}))})).results)d.set(b.source,b.error);else{let b=e[0];"remove"===a.action?await c.del(b.source):a.tag?await c.reinstall(b.source,b.previousSource,{tag:a.tag}):await c.reinstall(b.source,b.previousSource),d.set(b.source,null)}}catch(a){for(let b of e)d.set(b.source,l(a))}if(f.length>0)try{for(let a of(await c.apply(f.map(a=>a.source)),f))d.set(a.source,null)}catch(a){for(let b of f)d.set(b.source,l(a))}return b.map(a=>({target:a,error:d.has(a.source)?d.get(a.source):"业务未返回该来源的接纳结果"}))}async function o(a,b,c,d,e){let g,h=await Promise.all(b.map(async({target:a,error:b})=>{if(null!==b)return b;try{return await c.waitForOperations([...new Set([a.source,...a.previousSource?[a.previousSource]:[]])],d.signal),null}catch(a){return l(a)}}));d.signal.throwIfAborted();try{g=await c.list()}catch(a){return b.map(({target:b,error:c},d)=>`${b.name}:${null!==c?"未接纳":"失败或尚未完成"}:${h[d]??l(a)}`)}return b.map(({target:b,error:c},d)=>{let j=h[d];if(null!==c)return`${b.name}:未接纳:${c}`;if(null!==j){let a=g.restartRequired&&g.plugins.some(a=>[b.source,b.previousSource].includes(a.source)&&a.operation?.phase==="waiting")||/^插件尚未生效.*重启/.test(j);return`${b.name}:${a?"等待重启,尚未生效":"失败或尚未完成"}:${j}`}try{return`${b.name}:${function(a,b,c,d){let e=(0,i.DL)(c.plugins,(0,i.sg)(b.source)??b.name,d);if("remove"===a.action){if(e)throw Error("卸载后仍发现该包来源,无法确认卸载完成");return"成功:已卸载并完成宿主插件应用"}if(!e)throw Error("未发现安装后的插件,无法确认生效");if(e.error)throw Error((0,f.fD)(e.error.message,"zh-CN"));if("disabled"===e.status)throw Error("该插件仍被现有配置禁用,尚未生效");if(a.version&&e.version!==a.version)throw Error(`实际版本 ${e.version??"未知"} 与目标版本 ${a.version} 不一致`);return"reload"===a.action?"成功:已重新加载本机代码,已有 Pi 会话保持不变":b.local?"成功:已加载当前代码,服务与界面已更新":`成功:已安装${e.version?` ${e.version}`:""}并完成宿主加载`}(a,b,g,e)}`}catch(a){return`${b.name}:失败或尚未完成:${l(a)}`}})}async function p(a,b,c){let d;try{let c=await a;b.signal.throwIfAborted(),d=`结果:
1
+ "use strict";exports.id=84231,exports.ids=[84231],exports.modules={52078:(a,b,c)=>{c.d(b,{DL:()=>h,Y_:()=>g,sg:()=>f,xg:()=>j});var d=c(51455),e=c(76760);function f(a){return/^npm:((?:@[^/]+\/)?[^@]+)(?:@.+)?$/.exec(a)?.[1]??null}function g(a,b){return f(a.source)??a.pluginName??(0,e.basename)((0,e.resolve)(b,a.source)).replace(/\.(?:ts|js)$/,"")}function h(a,b,c){let d=a.filter(a=>g(a,c)===b||a.pluginName===b||!f(a.source)&&(0,e.basename)((0,e.resolve)(c,a.source))===b),h=d.filter(a=>!(f(a.source)&&null===a.version&&null===a.error&&a.operation?.phase==="failed"));if(h.length>1)throw Error(`插件名字对应多个来源,请先检查插件清单:${b}`);return h[0]??(1===d.length?d[0]:null)}async function i(a){try{return await (0,d.stat)(a),!0}catch(a){if(a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code)return!1;throw a}}async function j(a,b,c){if(a.startsWith("@"))return null;let f=(0,e.join)(b,"extensions"),g=[(0,e.join)(f,a),.../\.(?:ts|js)$/.test(a)?[]:[(0,e.join)(f,`${a}.ts`),(0,e.join)(f,`${a}.js`)]];c&&!/^[a-z][a-z0-9+.-]*:/i.test(c.source)?g.push((0,e.resolve)(b,c.source)):c&&(0,e.isAbsolute)(c.source)&&g.push(c.source);let h=[...new Set((await Promise.all(g.map(async a=>await i(a)?(0,d.realpath)(a):null))).filter(a=>null!==a))];if(h.length>1)throw Error(`固定扩展目录中存在多个同名入口:${a}`);let j=h[0];if(!j)return null;let k=(0,e.relative)(await (0,d.realpath)(f),j);if(k.startsWith("..")||(0,e.isAbsolute)(k))throw Error("本地插件必须位于 Pi AgentDir 的 extensions 目录内");return j}},84231:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{executeL2PluginCommand:()=>r});var e=c(75430),f=c(76019),g=c(4287),h=c(16056),i=c(50520),j=c(52078),k=a([e,i]);function l(a,b){return{name:(0,j.Y_)(a,b),source:a.source,kind:a.kind,version:a.version,status:a.status,...void 0===a.updateTag?{}:{updateTag:a.updateTag},...void 0===a.availableVersion?{}:{availableVersion:a.availableVersion},...void 0===a.updateError?{}:{updateError:a.updateError},...a.operation?{operation:a.operation}:{},...a.error?{error:a.error}:{}}}function m(a){return a instanceof Error?a.message:String(a)}async function n(a,b,c,d){let e=new Map;for(let f of b){let b=(0,j.DL)(c.plugins,f,d);if("reload"===a.action){if(!b)throw Error(`插件不存在:${f}`);if("disabled"===b.status)throw Error(`插件已禁用,请先启用:${f}`);e.set(b.source,{name:f,source:b.source,local:!1});continue}if("remove"===a.action){if(!b)throw Error(`插件不存在:${f}`);e.set(b.source,{name:f,source:b.source,local:!1});continue}let g=await (0,j.xg)(f,d,b),h=b?(0,j.sg)(b.source):null;if(g&&h)throw Error(`同时存在本地扩展和 npm 来源,请先处理同名冲突:${f}`);if(g){if(a.version||a.tag)throw Error(`本地插件加载当前代码,不支持通过版本号或渠道切换源码:${f}`);e.set(g,{name:f,source:b?.source??g,local:!0})}else{if(b&&!h)throw Error(`该来源不能通过名字重新安装;本地插件必须位于全局 extensions 目录:${f}`);let c=`npm:${h??f}${a.version?`@${a.version}`:""}`;e.set(`npm:${h??f}`,{name:f,source:c,...b?{previousSource:b.source}:{},local:!1})}}return[...e.values()]}async function o(a,b,c){if("reload"===a.action){let a=[];for(let d of b)try{await c.apply([d.source]),a.push({target:d,error:null})}catch(b){a.push({target:d,error:m(b)})}return a}let d=new Map,e=b.filter(a=>!a.local),f=b.filter(a=>a.local);if(e.length>0)try{if(a.names)for(let b of(await c.batch("remove"===a.action?{action:"del",sources:e.map(a=>a.source)}:{action:"add",items:e.map(b=>({source:b.source,...a.tag?{tag:a.tag}:{}}))})).results)d.set(b.source,b.error);else{let b=e[0];"remove"===a.action?await c.del(b.source):a.tag?await c.reinstall(b.source,b.previousSource,{tag:a.tag}):await c.reinstall(b.source,b.previousSource),d.set(b.source,null)}}catch(a){for(let b of e)d.set(b.source,m(a))}if(f.length>0)try{for(let a of(await c.apply(f.map(a=>a.source)),f))d.set(a.source,null)}catch(a){for(let b of f)d.set(b.source,m(a))}return b.map(a=>({target:a,error:d.has(a.source)?d.get(a.source):"业务未返回该来源的接纳结果"}))}async function p(a,b,c,d,e){let h,i=await Promise.all(b.map(async({target:a,error:b})=>{if(null!==b)return b;try{return await c.waitForOperations([...new Set([a.source,...a.previousSource?[a.previousSource]:[]])],d.signal),null}catch(a){return m(a)}}));d.signal.throwIfAborted();try{h=await c.list()}catch(a){return b.map(({target:b,error:c},d)=>`${b.name}:${null!==c?"未接纳":"失败或尚未完成"}:${i[d]??m(a)}`)}return b.map(({target:b,error:c},d)=>{let k=i[d];if(null!==c)return`${b.name}:未接纳:${c}`;if(null!==k){let a=h.restartRequired&&h.plugins.some(a=>[b.source,b.previousSource].includes(a.source)&&a.operation?.phase==="waiting")||/^插件尚未生效.*重启/.test(k);return`${b.name}:${a?"等待重启,尚未生效":"失败或尚未完成"}:${k}`}try{return`${b.name}:${function(a,b,c,d){if("remove"===a.action){let a=(0,g.LD)(b.source);if(c.plugins.some(b=>(0,g.LD)(b.source)===a))throw Error("卸载后仍发现该来源,无法确认卸载完成");return"成功:已卸载并完成宿主插件应用"}let e=(0,j.DL)(c.plugins,(0,j.sg)(b.source)??b.name,d);if(!e)throw Error("未发现安装后的插件,无法确认生效");if(e.error)throw Error((0,f.fD)(e.error.message,"zh-CN"));if("disabled"===e.status)throw Error("该插件仍被现有配置禁用,尚未生效");if(a.version&&e.version!==a.version)throw Error(`实际版本 ${e.version??"未知"} 与目标版本 ${a.version} 不一致`);return"reload"===a.action?"成功:已重新加载本机代码,已有 Pi 会话保持不变":b.local?"成功:已加载当前代码,服务与界面已更新":`成功:已安装${e.version?` ${e.version}`:""}并完成宿主加载`}(a,b,h,e)}`}catch(a){return`${b.name}:失败或尚未完成:${m(a)}`}})}async function q(a,b,c){let d;try{let c=await a;b.signal.throwIfAborted(),d=`结果:
2
2
  ${c.join("\n")}
3
3
 
4
4
  以上为宿主插件应用结果;已有 Pi 会话的工具变更需新建会话或主动 reload 才生效。`}catch(a){if(b.signal.aborted)return;d=`结果:失败或尚未完成。
5
- 原因:${l(a)}`}try{await b.notify(`Pi Desk 命令执行结果
5
+ 原因:${m(a)}`}try{await b.notify(`Pi Desk 命令执行结果
6
6
 
7
7
  操作:${c}
8
8
  范围:全局
9
- ${d}`)}catch(a){console.warn("[Pi Desk][Commands] 异步结果投递失败",{operation:c,message:l(a)})}}async function q(a,b,c=(0,h.getL2PluginManagement)(),d=(0,e.getAgentDir)()){if(b.signal.throwIfAborted(),(0,g.P)())throw Error("基础模式不执行插件管理,请正常启动 Pi Desk 后操作");let f=await c.list("list"===a.action&&{...a.checkUpdates?{checkUpdates:!0}:{},...a.tag?{tag:a.tag}:{}});if("list"===a.action)return{mode:"sync",message:JSON.stringify({plugins:f.plugins.filter(b=>!a.tag||b.updateTag===a.tag).map(a=>k(a,d)),restartRequired:f.restartRequired,...f.loadError?{loadError:f.loadError}:{}})};let j=a.names??(a.name?[a.name]:[]);if(0===j.length)throw Error("缺少插件名字");if("show"===a.action){if(1!==j.length)throw Error("show 只支持单个插件名字");let a=(0,i.DL)(f.plugins,j[0],d);if(!a)throw Error(`插件不存在:${j[0]}`);let b=await c.get(a.source);return{mode:"sync",message:JSON.stringify({...k(a,d),detail:{tools:b.tools,skills:b.skills,prompts:b.prompts}})}}let l=await m(a,j,f,d);b.signal.throwIfAborted();let r=await n(a,l,c),s=r.filter(a=>null===a.error).length;if(0===s)throw Error(r.map(({target:a,error:b})=>`${a.name}:${b}`).join("\n"));let t="remove"===a.action?"卸载":"reload"===a.action?"重载":"安装",u=`${t} ${l.map(a=>a.name).join("、")}${a.version?`@${a.version}`:a.tag?`(渠道 ${a.tag})`:""}`;return console.info("[Pi Desk][Commands] 插件命令已接纳",{operation:u,sources:l.map(a=>a.source),acceptedCount:s,rejectedCount:r.length-s}),p(o(a,r,c,b,d),b,u),{mode:"async",message:`本次${t}已被接纳(${s}/${l.length} 项):${l.map(a=>a.name).join("、")}${s<l.length?";其余项未接纳":""}。执行结果会统一插入本会话并唤醒模型;无独立工作时结束当前轮,无需持续查询。`}}[e,h]=j.then?(await j)():j,d()}catch(a){d(a)}})}};
9
+ ${d}`)}catch(a){console.warn("[Pi Desk][Commands] 异步结果投递失败",{operation:c,message:m(a)})}}async function r(a,b,c=(0,i.getL2PluginManagement)(),d=(0,e.getAgentDir)()){if(b.signal.throwIfAborted(),(0,h.P)())throw Error("基础模式不执行插件管理,请正常启动 Pi Desk 后操作");let f=await c.list("list"===a.action&&{...a.checkUpdates?{checkUpdates:!0}:{},...a.tag?{tag:a.tag}:{}});if("list"===a.action)return{mode:"sync",message:JSON.stringify({plugins:f.plugins.filter(b=>!a.tag||b.updateTag===a.tag).map(a=>l(a,d)),restartRequired:f.restartRequired,...f.loadError?{loadError:f.loadError}:{}})};let g=a.names??(a.name?[a.name]:[]);if(0===g.length)throw Error("缺少插件名字");if("show"===a.action){if(1!==g.length)throw Error("show 只支持单个插件名字");let a=(0,j.DL)(f.plugins,g[0],d);if(!a)throw Error(`插件不存在:${g[0]}`);let b=await c.get(a.source);return{mode:"sync",message:JSON.stringify({...l(a,d),detail:{tools:b.tools,skills:b.skills,prompts:b.prompts}})}}let k=await n(a,g,f,d);b.signal.throwIfAborted();let m=await o(a,k,c),s=m.filter(a=>null===a.error).length;if(0===s)throw Error(m.map(({target:a,error:b})=>`${a.name}:${b}`).join("\n"));let t="remove"===a.action?"卸载":"reload"===a.action?"重载":"安装",u=`${t} ${k.map(a=>a.name).join("、")}${a.version?`@${a.version}`:a.tag?`(渠道 ${a.tag})`:""}`;return console.info("[Pi Desk][Commands] 插件命令已接纳",{operation:u,sources:k.map(a=>a.source),acceptedCount:s,rejectedCount:m.length-s}),q(p(a,m,c,b,d),b,u),{mode:"async",message:`本次${t}已被接纳(${s}/${k.length} 项):${k.map(a=>a.name).join("、")}${s<k.length?";其余项未接纳":""}。执行结果会统一插入本会话并唤醒模型;无独立工作时结束当前轮,无需持续查询。`}}[e,i]=k.then?(await k)():k,d()}catch(a){d(a)}})}};
@@ -1 +1 @@
1
- "use strict";exports.id=18748,exports.ids=[18748],exports.modules={13127:(a,b,c)=>{c.d(b,{HE:()=>e,Wu:()=>d.j0,rY:()=>d.a4});var d=c(63603);function e(a){return Object.fromEntries(Object.entries(a).map(([a,b])=>[a,b.name]))}},17691:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{M:()=>j});var e=c(77598),f=c(73024),g=c(76760),h=c(75430),i=a([h]);function j(){let a=(0,h.getAgentDir)(),b=(0,g.join)(a,"pi-desk"),c=(0,g.join)(a,"pi-super");if((0,f.existsSync)(b)||!(0,f.existsSync)(c))return b;let d=(0,g.join)(a,`.pi-desk-migration-${(0,e.randomUUID)()}`);try{(0,f.cpSync)(c,d,{recursive:!0,errorOnExist:!0,force:!1}),(0,f.renameSync)(d,b),console.info("[Pi Desk] 已复制旧版应用数据到新目录")}finally{(0,f.rmSync)(d,{recursive:!0,force:!0})}return b}h=(i.then?(await i)():i)[0],d()}catch(a){d(a)}})},33290:(a,b,c)=>{function d(){return globalThis.__piDeskNativePluginDiagnostics||(globalThis.__piDeskNativePluginDiagnostics=[]),globalThis.__piDeskNativePluginDiagnostics}function e(a,b){let c=d();!c.some(c=>c.cwd===a&&c.message===b)&&(c.push({cwd:a,message:b}),c.length>100&&c.splice(0,c.length-100))}function f(a){let b=a=>{let b=a.replaceAll("\\","/");return"win32"===process.platform?b.toLowerCase():b},c=b(a).replace(/\/$/,""),e=d();for(let a=e.length-1;a>=0;a-=1){let d=b(e[a].message);(d.includes(`${c}:`)||d.includes(`${c}/`))&&e.splice(a,1)}}function g(){return d().map(a=>({...a}))}c.d(b,{pL:()=>e,tt:()=>f,u7:()=>g})},69375:(a,b,c)=>{c.d(b,{Od:()=>r,tU:()=>n,hE:()=>q,P9:()=>f,_G:()=>j,Vc:()=>i});var d=c(36153);d.Yj().uuid();let e=d.Ik({key:d.Yj().min(1).max(160),params:d.g1(d.Yj().min(1).max(80),d.KC([d.Yj().max(1e3),d.ai().finite()])).optional()}).strict(),f=4001,g=d.Yj().trim().min(1),h=d.Yj().uuid();function i(a){return Object.freeze({op:"req",path:g.parse(a.path),inputSchema:a.inputSchema,outputSchema:a.outputSchema,...void 0===a.timeoutMs?{}:{timeoutMs:d.ai().int().positive().parse(a.timeoutMs)}})}function j(a){return Object.freeze({op:"push",path:g.parse(a.path),bodySchema:a.bodySchema})}let k=d.Ik({op:d.eu("req"),path:g,requestId:h}).strict(),l=d.Ik({op:d.eu("resp"),path:g,requestId:h}).strict(),m=d.Ik({op:d.eu("push"),path:g}).strict(),n=d.Ik({head:k,body:d.Pq()}).strict(),o=d.Ik({head:l,body:d.Ik({code:d.eu(0),msg:d.eu(""),data:d.Pq()}).strict()}).strict(),p=d.Ik({head:l,body:d.Ik({code:d.ai().int().positive(),msg:d.Yj().min(1),data:d.ch(),i18n:e.optional()}).strict()}).strict(),q=d.KC([o,p]),r=d.Ik({head:m,body:d.Pq()}).strict()},72497:(a,b,c)=>{c.d(b,{Dz:()=>h,f7:()=>g,tv:()=>f});var d=c(36153);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=e,g=e,h=d.g1(d.Yj(),d.Pq());d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/);let i=d.k5(["plugin","server","rocket","settings","panel","message","terminal","file","folder","bot","wrench","database","globe"]);d.gM("type",[d.Ik({type:d.eu("builtin"),name:i}).strict(),d.Ik({type:d.eu("svg"),content:d.Yj().trim().min(1).max(16384)}).strict()])},75106:(a,b,c)=>{c.d(b,{k:()=>d});let d=c(36153).ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER)},76019:(a,b,c)=>{c.d(b,{J8:()=>f,fD:()=>g,qf:()=>e});var d=c(36153);let e=d.KC([d.Yj(),d.Ik({default:d.Yj(),translations:d.g1(d.Yj().min(1).max(35),d.Yj()).refine(a=>Object.keys(a).length<=16,"too many translations")}).strict()]);function f(a,b){return{default:a,translations:{en:b}}}function g(a,b){return"string"==typeof a?a:a.translations[b]??a.translations[b.split("-")[0]]??a.default}},98761:(a,b,c)=>{c.d(b,{$C:()=>A,A8:()=>E,GR:()=>q,MQ:()=>D,Pq:()=>B,UH:()=>j,Wh:()=>r,Xo:()=>o,YT:()=>z});var d=c(36153),e=c(59214),f=c(13127),g=c(72497),h=c(75106);let i=d.Yj().uuid(),j=d.Yj().trim().min(1).max(256),k=d.k5(["info","success","warning","error"]),l=d.Yj().trim().min(1).max(120),m=d.Yj().trim().max(320).nullable(),n=d.Ik({type:d.eu("plugin"),pluginName:g.tv,name:g.f7,data:g.Dz}).strict(),o=d.Ik({notificationId:i,level:k,title:l,description:m,createdAt:h.k,event:n.nullable()}).strict(),p=d.g1(g.tv,g.Dz),q=d.Ik({mode:d.k5(["normal","basic"]).default("normal"),notifications:d.YO(o),plugins:p,capabilityModes:f.Wu,settings:e.J.default({region:{locale:"en",timeZone:"UTC"}})}).strict(),r=d.Ik({level:k.optional(),title:l.optional(),description:m.optional(),event:n.nullable().optional()}).strict().refine(a=>Object.keys(a).length>0,{message:"notification changes cannot be empty"}),s=d.Ik({type:d.eu("add"),notification:o}).strict(),t=d.Ik({type:d.eu("update"),notificationId:i,changes:r}).strict(),u=d.Ik({type:d.eu("delete"),notificationId:i}).strict(),v=d.gM("type",[s,t,u]),w=d.Ik({pluginName:g.tv,state:g.Dz.nullable()}).strict(),x=d.Ik({key:d.eu("capabilityModes"),update:f.Wu}).strict(),y=d.Ik({key:d.eu("settings"),update:e.J}).strict();d.gM("key",[y,x,d.Ik({key:d.eu("notifications"),update:v}).strict(),d.Ik({key:d.eu("plugins"),update:w}).strict()]);let z=d.KC([y.extend({type:d.eu("update")}),x.extend({type:d.eu("update")}),d.Ik({type:d.eu("replace"),runtime:q}).strict(),d.Ik({type:d.eu("update"),key:d.eu("notifications"),update:v}).strict(),d.Ik({type:d.eu("update"),key:d.eu("plugins"),update:w}).strict()]),A=d.gM("key",[d.Ik({key:d.eu("notifications"),update:u}).strict(),d.Ik({key:d.eu("settings"),update:d.Ik({region:e.a.unwrap().partial().strict().refine(a=>Object.keys(a).length>0,"地区更新不能为空")}).strict()}).strict()]),B=d.Ik({}).strict(),C=d.Ik({name:g.f7,data:g.Dz}).strict(),D=d.Ik({key:j.optional(),level:k,title:l,description:d.Yj().trim().max(320).optional(),event:C.optional()}).strict(),E=d.Ik({level:k.optional(),title:l.optional(),description:m.optional()}).strict().refine(a=>Object.keys(a).length>0,{message:"plugin notification changes cannot be empty"})}};
1
+ "use strict";exports.id=88353,exports.ids=[88353],exports.modules={13127:(a,b,c)=>{c.d(b,{HE:()=>e,Wu:()=>d.j0,rY:()=>d.a4});var d=c(63603);function e(a){return Object.fromEntries(Object.entries(a).map(([a,b])=>[a,b.name]))}},17691:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{M:()=>j});var e=c(77598),f=c(73024),g=c(76760),h=c(75430),i=a([h]);function j(){let a=(0,h.getAgentDir)(),b=(0,g.join)(a,"pi-desk"),c=(0,g.join)(a,"pi-super");if((0,f.existsSync)(b)||!(0,f.existsSync)(c))return b;let d=(0,g.join)(a,`.pi-desk-migration-${(0,e.randomUUID)()}`);try{(0,f.cpSync)(c,d,{recursive:!0,errorOnExist:!0,force:!1}),(0,f.renameSync)(d,b),console.info("[Pi Desk] 已复制旧版应用数据到新目录")}finally{(0,f.rmSync)(d,{recursive:!0,force:!0})}return b}h=(i.then?(await i)():i)[0],d()}catch(a){d(a)}})},33290:(a,b,c)=>{function d(){return globalThis.__piDeskNativePluginDiagnostics||(globalThis.__piDeskNativePluginDiagnostics=[]),globalThis.__piDeskNativePluginDiagnostics}function e(a,b){let c=d();!c.some(c=>c.cwd===a&&c.message===b)&&(c.push({cwd:a,message:b}),c.length>100&&c.splice(0,c.length-100))}function f(a){let b=a=>{let b=a.replaceAll("\\","/");return"win32"===process.platform?b.toLowerCase():b},c=b(a).replace(/\/$/,""),e=d();for(let a=e.length-1;a>=0;a-=1){let d=b(e[a].message);(d.includes(`${c}:`)||d.includes(`${c}/`))&&e.splice(a,1)}}function g(){return d().map(a=>({...a}))}c.d(b,{pL:()=>e,tt:()=>f,u7:()=>g})},69375:(a,b,c)=>{c.d(b,{Od:()=>r,tU:()=>n,hE:()=>q,P9:()=>f,_G:()=>j,Vc:()=>i});var d=c(36153);d.Yj().uuid();let e=d.Ik({key:d.Yj().min(1).max(160),params:d.g1(d.Yj().min(1).max(80),d.KC([d.Yj().max(1e3),d.ai().finite()])).optional()}).strict(),f=4001,g=d.Yj().trim().min(1),h=d.Yj().uuid();function i(a){return Object.freeze({op:"req",path:g.parse(a.path),inputSchema:a.inputSchema,outputSchema:a.outputSchema,...void 0===a.timeoutMs?{}:{timeoutMs:d.ai().int().positive().parse(a.timeoutMs)}})}function j(a){return Object.freeze({op:"push",path:g.parse(a.path),bodySchema:a.bodySchema})}let k=d.Ik({op:d.eu("req"),path:g,requestId:h}).strict(),l=d.Ik({op:d.eu("resp"),path:g,requestId:h}).strict(),m=d.Ik({op:d.eu("push"),path:g}).strict(),n=d.Ik({head:k,body:d.Pq()}).strict(),o=d.Ik({head:l,body:d.Ik({code:d.eu(0),msg:d.eu(""),data:d.Pq()}).strict()}).strict(),p=d.Ik({head:l,body:d.Ik({code:d.ai().int().positive(),msg:d.Yj().min(1),data:d.ch(),i18n:e.optional()}).strict()}).strict(),q=d.KC([o,p]),r=d.Ik({head:m,body:d.Pq()}).strict()},72497:(a,b,c)=>{c.d(b,{Dz:()=>h,f7:()=>g,tv:()=>f});var d=c(36153);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=e,g=e,h=d.g1(d.Yj(),d.Pq());d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/);let i=d.k5(["plugin","server","rocket","settings","panel","message","terminal","file","folder","bot","wrench","database","globe"]);d.gM("type",[d.Ik({type:d.eu("builtin"),name:i}).strict(),d.Ik({type:d.eu("svg"),content:d.Yj().trim().min(1).max(16384)}).strict()])},75106:(a,b,c)=>{c.d(b,{k:()=>d});let d=c(36153).ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER)},76019:(a,b,c)=>{c.d(b,{J8:()=>f,fD:()=>g,qf:()=>e});var d=c(36153);let e=d.KC([d.Yj(),d.Ik({default:d.Yj(),translations:d.g1(d.Yj().min(1).max(35),d.Yj()).refine(a=>Object.keys(a).length<=16,"too many translations")}).strict()]);function f(a,b){return{default:a,translations:{en:b}}}function g(a,b){return"string"==typeof a?a:a.translations[b]??a.translations[b.split("-")[0]]??a.default}},88134:(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)}},98761:(a,b,c)=>{c.d(b,{$C:()=>A,A8:()=>E,GR:()=>q,MQ:()=>D,Pq:()=>B,UH:()=>j,Wh:()=>r,Xo:()=>o,YT:()=>z});var d=c(36153),e=c(59214),f=c(13127),g=c(72497),h=c(75106);let i=d.Yj().uuid(),j=d.Yj().trim().min(1).max(256),k=d.k5(["info","success","warning","error"]),l=d.Yj().trim().min(1).max(120),m=d.Yj().trim().max(320).nullable(),n=d.Ik({type:d.eu("plugin"),pluginName:g.tv,name:g.f7,data:g.Dz}).strict(),o=d.Ik({notificationId:i,level:k,title:l,description:m,createdAt:h.k,event:n.nullable()}).strict(),p=d.g1(g.tv,g.Dz),q=d.Ik({mode:d.k5(["normal","basic"]).default("normal"),notifications:d.YO(o),plugins:p,capabilityModes:f.Wu,settings:e.J.default({region:{locale:"en",timeZone:"UTC"}})}).strict(),r=d.Ik({level:k.optional(),title:l.optional(),description:m.optional(),event:n.nullable().optional()}).strict().refine(a=>Object.keys(a).length>0,{message:"notification changes cannot be empty"}),s=d.Ik({type:d.eu("add"),notification:o}).strict(),t=d.Ik({type:d.eu("update"),notificationId:i,changes:r}).strict(),u=d.Ik({type:d.eu("delete"),notificationId:i}).strict(),v=d.gM("type",[s,t,u]),w=d.Ik({pluginName:g.tv,state:g.Dz.nullable()}).strict(),x=d.Ik({key:d.eu("capabilityModes"),update:f.Wu}).strict(),y=d.Ik({key:d.eu("settings"),update:e.J}).strict();d.gM("key",[y,x,d.Ik({key:d.eu("notifications"),update:v}).strict(),d.Ik({key:d.eu("plugins"),update:w}).strict()]);let z=d.KC([y.extend({type:d.eu("update")}),x.extend({type:d.eu("update")}),d.Ik({type:d.eu("replace"),runtime:q}).strict(),d.Ik({type:d.eu("update"),key:d.eu("notifications"),update:v}).strict(),d.Ik({type:d.eu("update"),key:d.eu("plugins"),update:w}).strict()]),A=d.gM("key",[d.Ik({key:d.eu("notifications"),update:u}).strict(),d.Ik({key:d.eu("settings"),update:d.Ik({region:e.a.unwrap().partial().strict().refine(a=>Object.keys(a).length>0,"地区更新不能为空")}).strict()}).strict()]),B=d.Ik({}).strict(),C=d.Ik({name:g.f7,data:g.Dz}).strict(),D=d.Ik({key:j.optional(),level:k,title:l,description:d.Yj().trim().max(320).optional(),event:C.optional()}).strict(),E=d.Ik({level:k.optional(),title:l.optional(),description:m.optional()}).strict().refine(a=>Object.keys(a).length>0,{message:"plugin notification changes cannot be empty"})}};
@@ -1,8 +1,8 @@
1
- "use strict";exports.id=92386,exports.ids=[92386],exports.modules={568:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{mH:()=>i,tE:()=>k,uS:()=>j});var e=c(51455),f=c(75430),g=c(12727),h=a([f]);async function i(a){let b=await (0,e.readFile)(a,"utf8"),c=(0,f.parseSessionEntries)(b),d=c[0];if(!d||"session"!==d.type||!d.id||!d.cwd)throw Error(`Pi session file has an invalid header: ${a}`);let h=c.slice(1).filter(a=>"session"!==a.type),i=function(a){let b=a.at(-1);if(!b)return[];let c=new Map(a.map(a=>[a.id,a])),d=[],e=new Set,f=b;for(;f;){if(e.has(f.id))throw Error(`Pi session parent cycle detected: ${f.id}`);e.add(f.id),d.push(f),f=f.parentId?c.get(f.parentId):void 0}return d.reverse()}(h);return{header:d,branch:i,entries:(0,g.xm)(i),truncated:!1}}async function j(a,b){let c=await i(a),d=c.branch.findIndex(a=>a.id===b);if(d<0)throw Error(`Pi session entry is not on the current branch: ${b}`);let e=(0,g.xm)(c.branch.slice(0,d+1)).at(-1);if(!e||e.entryId!==b)throw Error(`Pi session entry is not a visible message: ${b}`);return{snapshot:c,entry:c.branch[d],projected:e}}async function k(a,b,c){if(!Number.isSafeInteger(c)||c<0)throw Error("图片位置无效");let{entry:d}=await j(a,b);if("message"!==d.type||"user"!==d.message.role&&"toolResult"!==d.message.role)throw Error(`Pi session entry has no message images: ${b}`);let e=(0,g.Wl)(d.message.content,c);if(!e)throw Error(`Pi message image was not found: ${b}/${c}`);return e}f=(h.then?(await h)():h)[0],d()}catch(a){d(a)}})},2234:(a,b,c)=>{c.d(b,{h:()=>g});let d=[{path:["--version"],description:"查看 Pi Desk 版本"},{path:["info"],description:"查看当前宿主环境与目录"},{path:["session","reload"],description:"等待当前会话空闲后重载 Pi 配置与已安装插件;完成后通知并唤醒本会话"},{path:["plugins","list"],description:"查看全局插件及维护状态;可按跟随渠道筛选并检查更新,不改变渠道",scope:"optional",tag:!0,checkUpdates:!0},{path:["plugins","show"],description:"查看插件详情",name:"single",scope:"required"},{path:["plugins","install"],description:"安装、更新或重新安装一个或多个插件;版本可省略,完成后向本会话汇总结果",name:"multiple",scope:"required",version:!0,tag:!0},{path:["plugins","reload"],description:"重新加载一个或多个已安装插件;不下载、不重启宿主,不重载已有 Pi 会话;完成后向本会话汇总结果",name:"multiple",scope:"required"},{path:["plugins","remove"],description:"卸载一个或多个包来源;完成后向本会话汇总结果",name:"multiple",scope:"required"}];function e(a){return["pidesk",...a.path,...a.name?["multiple"===a.name?"<name...>":"<name>"]:[],..."required"===a.scope?["--scope global"]:a.scope?["[--scope global]"]:[],...a.checkUpdates?["[--check-updates]"]:[],...a.version?["[--tag <tag> | --version <exact>]"]:a.tag?["[--tag <tag>]"]:[]].join(" ")}function f(a){let b=d.filter(b=>a.every((a,c)=>b.path[c]===a));if(0===b.length)throw Error("未知命令,请使用 pidesk --help");return[...b.map(a=>`${e(a)}
1
+ "use strict";exports.id=92386,exports.ids=[92386],exports.modules={568:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{mH:()=>i,tE:()=>k,uS:()=>j});var e=c(51455),f=c(75430),g=c(12727),h=a([f]);async function i(a){let b=await (0,e.readFile)(a,"utf8"),c=(0,f.parseSessionEntries)(b),d=c[0];if(!d||"session"!==d.type||!d.id||!d.cwd)throw Error(`Pi session file has an invalid header: ${a}`);let h=c.slice(1).filter(a=>"session"!==a.type),i=function(a){let b=a.at(-1);if(!b)return[];let c=new Map(a.map(a=>[a.id,a])),d=[],e=new Set,f=b;for(;f;){if(e.has(f.id))throw Error(`Pi session parent cycle detected: ${f.id}`);e.add(f.id),d.push(f),f=f.parentId?c.get(f.parentId):void 0}return d.reverse()}(h);return{header:d,branch:i,entries:(0,g.xm)(i),truncated:!1}}async function j(a,b){let c=await i(a),d=c.branch.findIndex(a=>a.id===b);if(d<0)throw Error(`Pi session entry is not on the current branch: ${b}`);let e=(0,g.xm)(c.branch.slice(0,d+1)).at(-1);if(!e||e.entryId!==b)throw Error(`Pi session entry is not a visible message: ${b}`);return{snapshot:c,entry:c.branch[d],projected:e}}async function k(a,b,c){if(!Number.isSafeInteger(c)||c<0)throw Error("图片位置无效");let{entry:d}=await j(a,b);if("message"!==d.type||"user"!==d.message.role&&"toolResult"!==d.message.role)throw Error(`Pi session entry has no message images: ${b}`);let e=(0,g.Wl)(d.message.content,c);if(!e)throw Error(`Pi message image was not found: ${b}/${c}`);return e}f=(h.then?(await h)():h)[0],d()}catch(a){d(a)}})},2234:(a,b,c)=>{c.d(b,{h:()=>g});let d=[{path:["--version"],description:"查看 Pi Desk 版本"},{path:["info"],description:"查看当前宿主环境与目录"},{path:["session","reload"],description:"等待当前会话空闲后重载 Pi 配置与已安装插件;完成后通知并唤醒本会话"},{path:["plugins","list"],description:"查看全局插件及维护状态;可按跟随渠道筛选并检查更新,不改变渠道",scope:"optional",tag:!0,checkUpdates:!0},{path:["plugins","show"],description:"查看插件详情",name:"single",scope:"required"},{path:["plugins","install"],description:"安装、更新或重新安装一个或多个插件;版本可省略,完成后向本会话汇总结果",name:"multiple",scope:"required",version:!0,tag:!0},{path:["plugins","reload"],description:"重新加载一个或多个已安装插件;不下载、不重启宿主,不重载已有 Pi 会话;完成后向本会话汇总结果",name:"multiple",scope:"required"},{path:["plugins","remove"],description:"卸载包、本地扩展或残留来源并释放实例;完成后向本会话汇总结果",name:"multiple",scope:"required"}];function e(a){return["pidesk",...a.path,...a.name?["multiple"===a.name?"<name...>":"<name>"]:[],..."required"===a.scope?["--scope global"]:a.scope?["[--scope global]"]:[],...a.checkUpdates?["[--check-updates]"]:[],...a.version?["[--tag <tag> | --version <exact>]"]:a.tag?["[--tag <tag>]"]:[]].join(" ")}function f(a){let b=d.filter(b=>a.every((a,c)=>b.path[c]===a));if(0===b.length)throw Error("未知命令,请使用 pidesk --help");return[...b.map(a=>`${e(a)}
2
2
  ${a.description}`),"各级命令均支持 --help。当前插件管理只支持 global 范围。",..."plugins"===a[0]&&(1===a.length||"install"===a[1])?["install = install + update + reinstall。版本和渠道均可省略:新 npm 插件默认 latest,已有插件沿保存的渠道;--tag 选择跟随渠道,--version 固定完整版本号,两者互斥。","多个插件可共用同一渠道或具体版本;同版本仍重新安装。","本地扩展使用 Pi 全局 extensions 目录中的名字,加载当前代码;不接受版本、渠道或自定义路径。","异步接纳不代表生效;结果会插入本会话并唤醒模型,无需持续查询。"]:[]].join("\n\n")}function g(a){let b,c,g,h;if(a.length>32)throw Error("命令参数最多 32 项");if(0===a.length)return{kind:"help",message:f([])};let i=d.find(b=>b.path.every((b,c)=>a[c]===b));if(a.includes("--help")||a.includes("-h")||1===a.length&&["plugins","session"].includes(a[0])){let b=["plugins","session"].includes(a[0])?a[0]:null,c=i?.path??(b?[b]:[]);if(!i&&!b&&!["--help","-h"].includes(a[0]))throw Error("未知命令,请使用 pidesk --help");if(!i&&b&&a[1]&&!["--help","-h"].includes(a[1]))throw Error(`未知子命令,请使用 pidesk ${b} --help`);return{kind:"help",message:f(c)}}if(!i)throw Error("未知命令,请使用 pidesk --help");let j=[];for(let d=i.path.length;d<a.length;d+=1){let f=a[d];if("--scope"===f&&i.scope){if(void 0!==b)throw Error("--scope 不允许重复");if(!(b=a[++d])||b.startsWith("--"))throw Error("--scope 缺少范围")}else if("--version"===f&&i.version){if(void 0!==c)throw Error("--version 不允许重复");if(!(c=a[++d])||c.startsWith("--"))throw Error("--version 缺少版本号")}else if("--tag"===f&&i.tag){if(void 0!==g)throw Error("--tag 不允许重复");if(!(g=a[++d])||g.startsWith("--"))throw Error("--tag 缺少渠道标签")}else if("--check-updates"===f&&i.checkUpdates){if(void 0!==h)throw Error("--check-updates 不允许重复");h=!0}else if(i.name&&("multiple"===i.name||0===j.length)&&!f.startsWith("-"))j.push(f);else throw Error(`不支持的参数:${f}
3
3
  ${e(i)}`)}if("required"===i.scope&&void 0===b)throw Error(`必须指定 --scope global
4
4
  ${e(i)}`);if(void 0!==b&&"global"!==b)throw Error("当前插件管理只支持 global 范围,不支持项目级操作");if(i.name){if(0===j.length)throw Error(`缺少插件名字
5
- ${e(i)}`);for(let a of j)if(!/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(a)||"node_modules"===a)throw Error(`插件名字必须是扩展名字或完整 npm 包名,不接受路径或内嵌版本号:${a}`)}if(void 0!==c&&!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/.test(c))throw Error("--version 必须是完整版本号,例如 1.2.3;版本可省略");if(void 0!==g&&(g.length>128||!/^[a-zA-Z][a-zA-Z0-9._-]*$/.test(g)))throw Error("--tag 必须是有效的渠道标签,例如 latest 或 dev");if(void 0!==g&&void 0!==c)throw Error("--tag 与 --version 互斥,不能同时指定");return"--version"===i.path[0]?{kind:"version"}:"info"===i.path[0]?{kind:"info"}:"session"===i.path[0]?{kind:"session",action:"reload"}:{kind:"plugins",action:i.path[1],...1===j.length?{name:j[0]}:j.length>1?{names:j}:{},...void 0===c?{}:{version:c},...void 0===g?{}:{tag:g},...void 0===h?{}:{checkUpdates:h}}}},2476:(a,b,c)=>{c.d(b,{N:()=>l,l:()=>i});var d=c(77598),e=c(51455),f=c(76760);let g=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".json",".md",".css",".yaml",".yml",".toml",".wasm",".node"]),h=new Set(["node_modules","temp","logs","coverage"]);class i extends Error{constructor(a){super(`插件来源不存在:${a}`),this.source=a,this.name="L4PiPluginSourceNotFoundError"}}async function j(a){let b=(0,d.createHash)("sha256").update(JSON.stringify({path:a.path,enabled:a.enabled,nativePaths:[...a.nativePaths].sort(),piDeskRoot:a.piDeskRoot,hasPiResources:a.hasPiResources}));if(!a.path||a.error||!a.enabled)return b.update(a.error??"").digest("hex");let c=await (0,e.realpath)(a.path),i=0,j=0,k=async(a,d,l)=>{if(++j>8192)throw Error("源码目录条目超过8192项,请使用独立插件目录");let m=await (0,e.realpath)(a),n=(0,f.relative)(c,m);if(n.startsWith("..")||(0,f.isAbsolute)(n))return;let o=await (0,e.stat)(m);if(o.isDirectory()){if(l.has(m))throw Error("源码目录存在符号链接循环");let a=new Set(l).add(m);for(let b of(await (0,e.readdir)(m,{withFileTypes:!0})).sort((a,b)=>a.name.localeCompare(b.name)))b.name.startsWith(".")||h.has(b.name)||await k((0,f.join)(m,b.name),`${d}/${b.name}`,a)}else if(o.isFile()&&(""===d||g.has((0,f.extname)(d)))){if(o.size>0x1000000||i+o.size>0x4000000)throw Error("源码指纹内容超过容量上限");let a=await (0,e.readFile)(m),c=await (0,e.stat)(m);if(c.size!==o.size||c.mtimeMs!==o.mtimeMs||a.length!==o.size)throw Error("插件源码正在变化,请保存或构建完成后重新加载");i+=a.length,b.update(d).update("\0").update(a).update("\0")}};return await k(c,"",new Set),b.digest("hex")}async function k(a){try{return{source:a,fingerprint:await j(a)}}catch(c){let b={...a,error:c instanceof Error?c.message:String(c)};return{source:b,fingerprint:`failed:${b.error}`}}}class l{async initialize(a){for(let b of(this.applied.clear(),a.sources))this.applied.set(b.source,await k(b))}async scan(a,b){let c=new Map(a.sources.map(a=>[a.source,a])),d=b?[...new Set(b)]:[...new Set([...this.applied.keys(),...c.keys()])],e=[];for(let f of d){let d=this.applied.get(f),g=c.get(f);if(!d&&!g)throw new i(f);if(!g&&a.errors.length>0){if(b)throw Error(`来源发现不完整,不能确认已删除:${f}`);continue}let h=g?await k(g):null;(b||d?.fingerprint!==h?.fingerprint)&&e.push({source:f,previous:d?.source??null,current:h?.source??null,fingerprint:h?.fingerprint??null})}return e}commit(a){a.current&&null!==a.fingerprint?this.applied.set(a.source,{source:a.current,fingerprint:a.fingerprint}):this.applied.delete(a.source)}constructor(){this.applied=new Map}}},5782:(a,b,c)=>{c.d(b,{l:()=>g});var d=c(77598),e=c(73024),f=c(76760);function g(a){let b=a.getSessionFile();if(!b)throw Error("Persisted Pi session is missing a session file");if((0,e.existsSync)(b))return b;let c=a.getHeader();if(!c||c.id!==a.getSessionId())throw Error(`Pi session ${a.getSessionId()} has an invalid header`);(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0});let g=`${[c,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")}
5
+ ${e(i)}`);for(let a of j)if(!/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(a)||"node_modules"===a)throw Error(`插件名字必须是扩展名字或完整 npm 包名,不接受路径或内嵌版本号:${a}`)}if(void 0!==c&&!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/.test(c))throw Error("--version 必须是完整版本号,例如 1.2.3;版本可省略");if(void 0!==g&&(g.length>128||!/^[a-zA-Z][a-zA-Z0-9._-]*$/.test(g)))throw Error("--tag 必须是有效的渠道标签,例如 latest 或 dev");if(void 0!==g&&void 0!==c)throw Error("--tag 与 --version 互斥,不能同时指定");return"--version"===i.path[0]?{kind:"version"}:"info"===i.path[0]?{kind:"info"}:"session"===i.path[0]?{kind:"session",action:"reload"}:{kind:"plugins",action:i.path[1],...1===j.length?{name:j[0]}:j.length>1?{names:j}:{},...void 0===c?{}:{version:c},...void 0===g?{}:{tag:g},...void 0===h?{}:{checkUpdates:h}}}},2476:(a,b,c)=>{c.d(b,{N:()=>l,l:()=>i});var d=c(77598),e=c(51455),f=c(76760);let g=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".json",".md",".css",".yaml",".yml",".toml",".wasm",".node"]),h=new Set(["node_modules","temp","logs","coverage"]);class i extends Error{constructor(a){super(`插件来源不存在:${a}`),this.source=a,this.name="L4PiPluginSourceNotFoundError"}}async function j(a){let b=(0,d.createHash)("sha256").update(JSON.stringify({path:a.path,enabled:a.enabled,nativePaths:[...a.nativePaths].sort(),piDeskRoot:a.piDeskRoot,hasPiResources:a.hasPiResources}));if(!a.path||a.error||!a.enabled)return b.update(a.error??"").digest("hex");let c=await (0,e.realpath)(a.path),i=0,j=0,k=async(a,d,l)=>{if(++j>8192)throw Error("源码目录条目超过8192项,请使用独立插件目录");let m=await (0,e.realpath)(a),n=(0,f.relative)(c,m);if(n.startsWith("..")||(0,f.isAbsolute)(n))return;let o=await (0,e.stat)(m);if(o.isDirectory()){if(l.has(m))throw Error("源码目录存在符号链接循环");let a=new Set(l).add(m);for(let b of(await (0,e.readdir)(m,{withFileTypes:!0})).sort((a,b)=>a.name.localeCompare(b.name)))b.name.startsWith(".")||h.has(b.name)||await k((0,f.join)(m,b.name),`${d}/${b.name}`,a)}else if(o.isFile()&&(""===d||g.has((0,f.extname)(d)))){if(o.size>0x1000000||i+o.size>0x4000000)throw Error("源码指纹内容超过容量上限");let a=await (0,e.readFile)(m),c=await (0,e.stat)(m);if(c.size!==o.size||c.mtimeMs!==o.mtimeMs||a.length!==o.size)throw Error("插件源码正在变化,请保存或构建完成后重新加载");i+=a.length,b.update(d).update("\0").update(a).update("\0")}};return await k(c,"",new Set),b.digest("hex")}async function k(a){try{return{source:a,fingerprint:await j(a)}}catch(c){let b={...a,error:c instanceof Error?c.message:String(c)};return{source:b,fingerprint:`failed:${b.error}`}}}class l{async initialize(a){for(let b of(this.applied.clear(),a.sources))this.applied.set(b.source,await k(b))}readAppliedSources(){return structuredClone([...this.applied.values()].map(a=>a.source))}async scan(a,b){let c=new Map(a.sources.map(a=>[a.source,a])),d=b?[...new Set(b)]:[...new Set([...this.applied.keys(),...c.keys()])],e=[];for(let f of d){let d=this.applied.get(f),g=c.get(f);if(!d&&!g)throw new i(f);if(!g&&a.errors.length>0){if(b)throw Error(`来源发现不完整,不能确认已删除:${f}`);continue}let h=g?await k(g):null;(b||d?.fingerprint!==h?.fingerprint)&&e.push({source:f,previous:d?.source??null,current:h?.source??null,fingerprint:h?.fingerprint??null})}return e}commit(a){a.current&&null!==a.fingerprint?this.applied.set(a.source,{source:a.current,fingerprint:a.fingerprint}):this.applied.delete(a.source)}constructor(){this.applied=new Map}}},5782:(a,b,c)=>{c.d(b,{l:()=>g});var d=c(77598),e=c(73024),f=c(76760);function g(a){let b=a.getSessionFile();if(!b)throw Error("Persisted Pi session is missing a session file");if((0,e.existsSync)(b))return b;let c=a.getHeader();if(!c||c.id!==a.getSessionId())throw Error(`Pi session ${a.getSessionId()} has an invalid header`);(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0});let g=`${[c,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")}
6
6
  `,h=`${b}.${(0,d.randomUUID)()}.tmp`;try{(0,e.writeFileSync)(h,g,{encoding:"utf8",flag:"wx"});try{(0,e.linkSync)(h,b)}catch(a){if("EEXIST"!==a.code)throw a}}finally{(0,e.existsSync)(h)&&(0,e.unlinkSync)(h)}if(!(0,e.existsSync)(b))throw Error(`Failed to materialize Pi session: ${a.getSessionId()}`);return b}},9753:(a,b,c)=>{c.d(b,{LO:()=>d.L,Nb:()=>e.Nb,Nx:()=>e.Nx,O0:()=>e.O0,Sl:()=>e.Sl,k0:()=>e.k0}),c(47511),c(41904);var d=c(41966),e=c(85273)},12727:(a,b,c)=>{c.d(b,{B4:()=>x,Wl:()=>r,b7:()=>u,xf:()=>z,xm:()=>y,zG:()=>k,zK:()=>v,zz:()=>l});var d=c(54174);let e=new Intl.NumberFormat("en-US",{maximumFractionDigits:0});function f(a){if("string"!=typeof a)return null;let b=a.replace(/\s+/g," ").trim();return b?b.length<=500?b:`${b.slice(0,499)}…`:null}function g(a,...b){for(let c of b){let b=f(a[c]);if(b)return b}return null}function h(a,b){let c=a[b];return"number"==typeof c&&Number.isSafeInteger(c)&&c>=0?c:null}function i(a){if(0===a.length)return 0;let b=1;for(let c of a)"\n"===c&&(b+=1);return b}function j(a){let b=0;for(let c of a)b+=1;return b}function k(a,b,c){return{reasoning:f(b.reasoning),inputPreview:function(a,b){switch(a.toLowerCase().split(".").at(-1)??a.toLowerCase()){case"bash":return g(b,"command");case"read":case"write":case"edit":return g(b,"path","file_path");case"grep":{let a=g(b,"pattern","query"),c=g(b,"path");return a&&c?f(`${a} \xb7 ${c}`):a??c}case"find":return g(b,"pattern","path");case"ls":return g(b,"path");case"agent":return g(b,"description");case"agent_resume":return g(b,"description","prompt");default:return g(b,"command","path","file_path","pattern","query","description","prompt")}}(a,b),activity:function(a,b,c){switch(a.toLowerCase().split(".").at(-1)??a.toLowerCase()){case"read":let d=h(b,"offset"),f=h(b,"limit");if(null!==f){let a=d??1;return`${a}-${a+Math.max(0,f-1)}`}return null===d?null:`${d}-`;case"write":return function(a,b){let c,d,f=a.content;if("string"!=typeof f)return null;let g=b?.writeContent;if(b&&void 0!==g&&void 0!==b.writeCharacters&&void 0!==b.writeLines&&f.startsWith(g)){let a=f.slice(g.length);0===a.length?(c=b.writeCharacters,d=b.writeLines):(c=b.writeCharacters+j(a),d=b.writeLines+i(a)-(0!==g.length))}else c=j(f),d=i(f);return b&&(b.writeContent=f,b.writeCharacters=c,b.writeLines=d),`${e.format(c)} \xb7 L${e.format(d)}`}(b,c);case"edit":return function(a){let b=Array.isArray(a.edits)?a.edits.filter(a=>null!==a&&"object"==typeof a&&!Array.isArray(a)):"string"==typeof a.oldText||"string"==typeof a.newText?[a]:[];if(0===b.length)return null;let c=0,d=0,f=!1,g=!1;for(let a of b)"string"==typeof a.oldText&&(f=!0,c+=i(a.oldText)),"string"==typeof a.newText&&(g=!0,d+=i(a.newText));let h=[...f?[`-${e.format(c)}`]:[],...g?[`+${e.format(d)}`]:[]].join(" ");return h?`${e.format(b.length)} \xb7 ${h}`:e.format(b.length)}(b);default:return null}}(a,b,c)}}function l(a){if(!Array.isArray(a))return[];let b=[];for(let c of a){if(!c||"object"!=typeof c||"toolCall"!==c.type||"string"!=typeof c.id||!c.id||"string"!=typeof c.name||!c.name)continue;let a=c.arguments&&"object"==typeof c.arguments&&!Array.isArray(c.arguments)?c.arguments:{};b.push({id:c.id,name:c.name,input:a})}return b}function m(a){try{let b=JSON.stringify(a);return void 0===b?null:JSON.parse(b)}catch{return null}}function n(a){let b=m(a);return b&&"object"==typeof b&&!Array.isArray(b)?b:{}}function o(a){return"string"==typeof a?a:Array.isArray(a)?a.flatMap(a=>a&&"object"==typeof a&&"text"===a.type&&"string"==typeof a.text?[a.text]:[]).join("\n"):""}function p(a){return Array.isArray(a)?a.flatMap(a=>{if(!a||"object"!=typeof a||"image"!==a.type||"string"!=typeof a.data)return[];try{return[{data:a.data,metadata:(0,d.Z)(a.data).metadata}]}catch(a){return console.warn("[Pi Desk][PiChatProjection] 已忽略损坏的历史图片",{errorName:a instanceof Error?a.name:"UnknownError"}),[]}}):[]}function q(a){return p(a).map(a=>a.metadata)}function r(a,b){let c=p(a)[b];return c?{mimeType:c.metadata.mimeType,data:c.data}:null}function s(a,b){return Array.isArray(a)?a.flatMap(a=>{if(!a||"object"!=typeof a||a.type!==b)return[];let c="text"===b?a.text:a.thinking;return"string"==typeof c?[c]:[]}).join("\n"):""}function t(a){return a?{inputTokens:a.input,outputTokens:a.output,cacheReadTokens:a.cacheRead,costUsd:a.cost.total}:null}function u(a,b,c){switch(a.role){case"user":{let b=o(a.content),c=q(a.content);return{type:"user",text:b,images:c,declaration:{message:{kind:"user",text:b,images:c},raw:a}}}case"assistant":{b&&function(a,b,c){for(let d of l(a))b.set(d.id,k(d.name,d.input)),c?.set(d.id,{...d.input})}(a.content,b,c);let d=s(a.content,"text"),e=s(a.content,"thinking");return{type:"assistant",text:d,thinking:e,model:"pi-virtual"!==a.api&&"string"==typeof a.provider&&"string"==typeof(a.responseModel??a.model)?{provider:a.provider,modelId:a.responseModel??a.model}:null,status:function(a){switch(a){case"pending":return"running";case"stop":case"length":case"toolUse":return"completed";case"aborted":return"aborted";default:return"error"}}(a.stopReason),errorMessage:a.errorMessage??null,usage:t(a.usage),declaration:{message:{kind:"assistant",text:d,thinking:e,stopReason:a.stopReason},raw:a}}}case"toolResult":{let d=b?.get(a.toolCallId),e=c?.get(a.toolCallId);b?.delete(a.toolCallId),c?.delete(a.toolCallId);let f=o(a.content),g=q(a.content),h=a.nestedCalls?{complete:a.nestedCalls.complete,calls:a.nestedCalls.calls.map(a=>({name:a.name,...void 0===a.arguments?{}:{arguments:n(a.arguments)},...void 0===a.argumentsBytes?{}:{argumentsBytes:a.argumentsBytes},status:a.status,...void 0===a.durationMs?{}:{durationMs:a.durationMs},...void 0===a.error?{}:{error:a.error}}))}:null;return{type:"tool",name:a.toolName,reasoning:d?.reasoning??null,inputPreview:d?.inputPreview??null,activity:d?.activity??null,status:a.isError?"error":"completed",usage:t(a.usage),output:f,...g.length>0?{images:g}:{},...h?{nestedCalls:h}:{},startedAtMs:null,durationMs:function(a,b){if("bash"!==a||!b||"object"!=typeof b||Array.isArray(b))return null;let c=b.durationMs;return"number"==typeof c&&Number.isSafeInteger(c)&&c>=0?c:null}(a.toolName,a.details),declaration:{message:{kind:"tool",toolName:a.toolName,toolCallId:a.toolCallId,arguments:n(e),partialResult:null,result:m({content:a.content,details:a.details,output:f}),isError:a.isError},raw:a}}}case"bashExecution":return{type:"bash",command:a.command,status:a.cancelled?"aborted":0===a.exitCode?"completed":"error",output:a.output,declaration:{message:{kind:"bash",command:a.command,output:a.output,exitCode:a.exitCode??null,cancelled:a.cancelled,truncated:a.truncated},raw:a}};case"custom":{if(!a.display)return null;let b=o(a.content);return{type:"custom",text:b,declaration:{message:{kind:"custom",customType:a.customType,content:b,details:m(a.details)},raw:a}}}default:return null}}function v(a,b,c,d){let e=new Map,f=new Map;return c&&e.set(b,c),d&&f.set(b,d),u(a,e,f)}function w(a,b,c){let d="message"===a.type?u(a.message,b,c):"custom_message"===a.type?function(a){if(!a.display)return null;let b=o(a.content);return{type:"custom",text:b,declaration:{message:{kind:"custom",customType:a.customType,content:b,details:m(a.details)},raw:a}}}(a):"compaction"===a.type?{type:"compaction",summary:a.summary,declaration:{message:{kind:"custom",customType:"pi-desk/compaction",content:"",details:{text:a.summary}},raw:a}}:null;if(!d)return null;let e=Date.parse(a.timestamp);if(!Number.isSafeInteger(e)||e<0)throw Error(`Pi session entry has an invalid timestamp: ${a.id}`);return{entryId:a.id,timestampMs:e,message:d}}function x(a){return w(a,new Map,new Map)}function y(a,b){let c=[],d=new Map,e=new Map;for(let f of a){let a=w(f,d,e);a&&(c.push(a),void 0!==b&&c.length>b&&c.shift())}return c}function z(a){return{sessionName:a.getSessionName()?.trim()||null,entries:y(a.getBranch())}}},20369:(a,b,c)=>{c.d(b,{HE:()=>e,IS:()=>d.Dl,Wu:()=>d.j0,f$:()=>d.Qg,rY:()=>d.a4});var d=c(47511);function e(a){return Object.fromEntries(Object.entries(a).map(([a,b])=>[a,b.name]))}},23272:(a,b,c)=>{c.d(b,{H:()=>g,k:()=>h});var d=c(77598),e=c(57975),f=c(67062);class g extends Error{constructor(a,b){super(b),this.code=a,this.name="L4PiUiResponseError"}}class h{get hasPending(){return this.pending.size>0}snapshot(){return structuredClone(this.state)}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}bind(a,b){let c=()=>{b()},d=(a,b)=>(c(),this.request(a,b));return{...a,select:async(a,b,c)=>await d({method:"select",title:a,options:b},c),confirm:async(a,b,c)=>await d({method:"confirm",title:a,message:b},c)===!0,input:async(a,b="",c)=>await d({method:"input",title:a,placeholder:b},c),editor:async(a,b="")=>await d({method:"editor",title:a,prefill:b}),notify:(a,b="info")=>{c(),this.active&&this.emit({type:"notify",message:(0,e.stripVTControlCharacters)(a).slice(0,65536),level:b})},setStatus:(a,b)=>{if(c(),!this.active)return;let d={...this.state.statuses};void 0===b?delete d[a]:d[a]=(0,e.stripVTControlCharacters)(b),this.replace({...this.state,statuses:d})},setWidget:(a,b,d)=>{if(c(),!this.active)return;if("function"==typeof b)return void this.emit({type:"notify",level:"warning",message:"该插件挂件需要终端界面,当前仅支持文本挂件。"});let f={...this.state.widgets};void 0===b?delete f[a]:f[a]={lines:b.map(e.stripVTControlCharacters),placement:d?.placement??"aboveEditor"},this.replace({...this.state,widgets:f})},setEditorText:a=>{c(),this.active&&this.emit({type:"editor_text",mode:"replace",text:a.slice(0,65536)})},pasteToEditor:a=>{c(),this.active&&this.emit({type:"editor_text",mode:"paste",text:a.slice(0,65536)})},custom:async()=>{throw c(),Error("当前界面不支持自定义终端组件,请使用插件提供的网页界面。")}}}respond(a){let b=this.pending.get(a.id);if(!b)throw new g(409,"问题已结束或已失效,请查看最新状态");let{request:c}=b;if(null!==c.expiresAt&&c.expiresAt<=Date.now())throw this.finish(a.id,void 0),new g(409,"问题已超时");if(null!==a.value){if("confirm"===c.method?"boolean"!=typeof a.value:"string"!=typeof a.value)throw new g(400,"回答类型不正确");if("select"===c.method&&!c.options.includes(a.value))throw new g(400,"选择的选项已无效")}this.finish(a.id,a.value??void 0)}cancelAll(){let a=[...this.pending.values()];for(let b of(this.pending.clear(),this.state={...this.state,requests:[]},a))b.cleanup();for(let b of(a.length>0&&(this.publishSnapshot(),console.info("[Pi Desk][NativeUI] 已取消待处理交互",{count:a.length})),a))b.resolve(void 0)}reset(a=!0){this.active=a,this.cancelAll(),this.state=(0,f.l3)(),this.publishSnapshot()}dispose(){this.reset(!1),this.listeners.clear()}async waitForOperation(a,b,c){let d,e=b,f=performance.now(),g=()=>void 0,h=new Promise((a,b)=>{g=b}),i=()=>{d&&(e-=performance.now()-f,clearTimeout(d),d=void 0),this.hasPending||(f=performance.now(),d=setTimeout(()=>g(c()),Math.max(0,e)))},j=this.subscribe(a=>{"snapshot"===a.type&&i()});i();try{return await Promise.race([a,h])}finally{d&&clearTimeout(d),j()}}request(a,b){if(!this.active||b?.signal?.aborted)return Promise.resolve(void 0);let c=f.WR.parse({...a,id:(0,d.randomUUID)(),expiresAt:b?.timeout===void 0?null:Date.now()+Math.max(0,b.timeout)}),e={...this.state,requests:[...this.state.requests,c]};return this.validate(e),new Promise(a=>{let d=()=>this.finish(c.id,void 0),f=null===c.expiresAt?void 0:setTimeout(d,Math.max(0,c.expiresAt-Date.now()));b?.signal?.addEventListener("abort",d,{once:!0}),this.pending.set(c.id,{request:c,resolve:a,cleanup:()=>{f&&clearTimeout(f),b?.signal?.removeEventListener("abort",d)}}),this.state=e,this.publishSnapshot()})}finish(a,b){let c=this.pending.get(a);c&&(this.pending.delete(a),c.cleanup(),this.state={...this.state,requests:this.state.requests.filter(b=>b.id!==a)},c.resolve(b),null===this.snapshotImmediate&&(this.snapshotImmediate=setImmediate(()=>{this.snapshotImmediate=null,this.publishSnapshot()})))}validate(a){if(f.P.parse(a),Object.keys(a.statuses).length>32||Object.keys(a.widgets).length>16||Buffer.byteLength(JSON.stringify(a),"utf8")>262144)throw Error("插件交互内容过多,请先清理已有状态或缩短内容")}replace(a){this.validate(a),this.state=a,this.publishSnapshot()}publishSnapshot(){null!==this.snapshotImmediate&&(clearImmediate(this.snapshotImmediate),this.snapshotImmediate=null),this.emit({type:"snapshot",snapshot:this.snapshot()})}emit(a){for(let b of this.listeners)try{b(a)}catch(a){console.error("[Pi Desk][NativeUI] 交互推送失败",{message:a instanceof Error?a.message:String(a)})}}constructor(){this.state=(0,f.l3)(),this.pending=new Map,this.listeners=new Set,this.active=!0,this.snapshotImmediate=null}}},23404:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{O:()=>i});var e=c(28802),f=c(85273),g=c(47511),h=a([e]);e=(h.then?(await h)():h)[0];class i{constructor(a){this.readMode=a,this.registrations=new Map,this.session=null,this.requestedTools=new Set,this.setTools=null,this.originalSetTools=null,this.ready=!1,this.disposed=!1,this.rules=a()}eventBus(a){return{on:(b,c)=>a.on(b,c),emit:(b,c)=>{this.disposed||(b===f.Hj?this.register(c):a.emit(b,c))}}}createHostExtension(a,b){let c="<inline:pi-desk-input-validator>",d=new Map;return d.set("input",[async(b,c)=>a(b,c)]),d.set("tool_call",[async a=>{if(!this.isToolAllowed(a.toolName))return{block:!0,reason:`当前能力模式不允许工具:${a.toolName}`}}]),d.set("session_shutdown",[async()=>{this.ready=!1,this.registrations.clear(),b?.()}]),{path:c,resolvedPath:c,hidden:!0,sourceInfo:{path:c,source:"inline",scope:"temporary",origin:"top-level"},handlers:d,tools:new Map,commands:new Map,flags:new Map,shortcuts:new Map,messageRenderers:new Map}}resources(a){return new Proxy(a,{get:(a,b)=>{if("getSkills"===b)return()=>{let b=a.getSkills();return{...b,skills:b.skills.filter(a=>(0,g.RC)(this.rules?.skills,a.name))}};let c=Reflect.get(a,b,a);return"function"==typeof c?c.bind(a):c}})}attach(a){this.session!==a&&(this.session=a,this.requestedTools=new Set(a.getActiveToolNames()),this.originalSetTools=a.setActiveToolsByName,this.setTools=a.setActiveToolsByName.bind(a),a.setActiveToolsByName=a=>{this.rememberRequestedTools(a),this.refreshTools()},this.refreshTools())}isToolAllowed(a){return(0,g.RC)(this.rules?.tools,a)}restoreBranchSelection(){let a=this.session;!this.disposed&&a&&((0,e.getCurrentSystemMessage)(a.messages)&&(this.requestedTools=new Set(a.getActiveToolNames())),this.refreshTools())}async apply(){let a=this.session;if(this.disposed||!a)return;this.rememberRequestedTools(a.getActiveToolNames()),this.rules=this.readMode(),this.ready=!0,this.refreshTools();let b=[];for(let c of[...this.registrations.values()])try{await this.applyRegistration(c)}catch(e){let d=e instanceof Error?e.message:String(e);console.error("[Pi Desk][Capabilities] 插件应用能力规则失败",{sessionId:a.sessionId,pluginName:c.pluginName,message:d}),b.push(`${c.pluginName}:${d}`)}if(this.refreshTools(),b.length>0)throw Error(`能力规则应用失败:${b.join(";")}`)}dispose(){this.disposed=!0,this.detach()}detach(){this.ready=!1,this.registrations.clear(),this.session&&this.originalSetTools&&(this.session.setActiveToolsByName=this.originalSetTools),this.session=null,this.setTools=null,this.originalSetTools=null,this.requestedTools.clear()}rememberRequestedTools(a){let b=new Set(this.session?.getAllTools().filter(a=>"hidden"!==a.exposure).map(a=>a.name)),c=[...this.requestedTools].filter(a=>b.has(a)&&!(0,g.RC)(this.rules?.tools,a));this.requestedTools=new Set([...a,...c].filter(a=>b.has(a)))}refreshTools(){this.setTools?.([...this.requestedTools].filter(a=>(0,g.RC)(this.rules?.tools,a)))}async applyRegistration(a){let b=this.session;if(!b||this.disposed||this.registrations.get(a.pluginName)!==a)return;let c={tools:this.rules?.tools??{},skills:this.rules?.skills??{},capabilities:this.rules?.plugins?.[a.pluginName]??{}};await a.execute(structuredClone(c),b.extensionRunner.createContext())}register(a){if(!a||"object"!=typeof a)throw Error("能力回调注册无效");let b=a.registration;if(!b||"string"!=typeof b.pluginName||"function"!=typeof b.execute)throw Error("能力回调缺少插件名称或处理函数");if("unregister"===a.type){this.registrations.get(b.pluginName)===b&&this.registrations.delete(b.pluginName);return}if("register"!==a.type)throw Error("能力回调事件无效");if(this.registrations.has(b.pluginName))throw Error(`能力回调已注册:${b.pluginName}`);b.hostManaged=!0,this.registrations.set(b.pluginName,b),this.ready&&this.applyRegistration(b).catch(a=>{console.error("[Pi Desk][Capabilities] 新注册插件应用规则失败",{pluginName:b.pluginName,message:a instanceof Error?a.message:String(a)})})}}d()}catch(a){d(a)}})},26143:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{h:()=>o});var e=c(76760),f=c(75430),g=c(58801),h=c(42520),i=c(73589),j=c(47351),k=a([f,g,i,j]);[f,g,i,j]=k.then?(await k)():k;let n=[{name:"codemode",create:f.createCodemodeExtension},{name:"tool-search",create:f.createToolSearchExtension},{name:"mcp",create:()=>a=>(0,f.createMcpExtension)({openUrl:()=>void 0})({...a,registerCommand:(b,c)=>a.registerCommand(b,"mcp"===b?(0,j.V)(c):c)})}];function l(a){let b=(0,e.basename)(a.path),c="package"===a.metadata.origin?a.metadata.source.replace(/^npm:/,""):/^(index\.[^.]+|SKILL\.md)$/.test(b)?(0,e.basename)((0,e.dirname)(a.path)):(0,e.basename)(a.path,(0,e.extname)(a.path));return`插件 ${c}
7
7
  来源:${a.path}`}async function m(a,b,c){b?.(a);let d=performance.now();try{return await c()}catch(c){let b=Math.round(performance.now()-d);throw console.error("[Pi Desk][PluginResources] 资源步骤失败",{stage:a,durationMs:b,message:c instanceof Error?c.stack??c.message:String(c)}),Error(`${a}
8
8
  当前步骤耗时:${b} 毫秒
@@ -16,7 +16,7 @@ ${e(i)}`);for(let a of j)if(!/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$
16
16
  ${this.initializationError}`);b="basic"===this.extensionMode?"当前窗口的 Pi 配置已重载完成。服务处于基础模式,未加载外部插件。可以继续处理重载前尚未完成的任务。":"当前窗口的 Pi 配置已重载完成,已重新加载配置及本机已安装插件的当前代码。可以继续处理重载前尚未完成的任务。",console.info("[Pi Desk][Commands] 当前会话重载完成",d)}catch(e){if(c.aborted)return;let a=e instanceof Error?e.message:String(e);console.warn("[Pi Desk][Commands] 当前会话重载失败",{...d,reason:a}),b=`当前窗口的 Pi 配置重载失败。
17
17
  原因:${a}`}try{if(this.sessionLifecycle||!this.session)throw Error("会话尚未恢复,无法投递重载结果");await this.notifyCommandResult(a,b,c)}catch(a){if(c.aborted)return;console.warn("[Pi Desk][Commands] 会话重载结果投递失败",{...d,message:a instanceof Error?a.message:String(a)})}}getBackgroundTaskIds(){return this.pluginRuntime.activeTaskIds()}getTaskRecord(a){return this.pluginRuntime.taskRecord(a)}async watchTaskDetail(a,b){return await this.ensureSession(),this.pluginRuntime.watchTaskDetail(a,b)}async readTaskMessage(a,b){return await this.ensureSession(),this.pluginRuntime.readTaskMessage(a,b)}async readTaskImage(a,b,c){return await this.ensureSession(),this.pluginRuntime.readTaskImage(a,b,c)}async interruptTask(a){await this.ensureSession(),await this.pluginRuntime.interruptTask(a)}async invokePluginMethod(a,b,c,d){let e=await this.ensureSession();return this.pluginRuntime.invokeMethod(a,b,c,d,e.extensionRunner.createContext())}async listNativeCommands(){let a=await this.ensureSession(),b=a.extensionRunner.getRegisteredCommands(),c=new Set(b.map(a=>a.invocationName)),d=b.filter(y).map(a=>({name:a.invocationName,description:s(a.description),source:"extension"})),e=a.resourceLoader.getSkills().skills.map(a=>({name:`skill:${a.name}`,description:s(a.description),source:"skill"})).filter(a=>!c.has(a.name)),f=new Set(e.map(a=>a.name)),g=a.promptTemplates.filter(a=>!c.has(a.name)&&!f.has(a.name)).map(a=>({name:a.name,description:s(a.description),source:"prompt"}));return[...d,...g,...e]}async executeNativeCommand(a,b){let c=await this.ensureSession(),d=c.extensionRunner.getCommand(a);if(!d)throw new A(a);try{await d.handler(b,c.extensionRunner.createCommandContext())}catch(b){let a=b instanceof Error?b:Error(String(b));throw c.extensionRunner.emitError({extensionPath:d.sourceInfo.path,event:`command:${d.invocationName}`,error:a.message,...a.stack?{stack:a.stack}:{}}),a}}async listNativeTools(a=!1){if(a&&!this.session)return[];let b=await this.ensureSession(),c=new Set(b.getActiveToolNames()),d=new Map;for(let a of b.resourceLoader.getExtensions().extensions)for(let b of a.tools.keys())d.set(b,a.sourceInfo?.path??a.path);return b.getAllTools().map(a=>({name:a.name,description:a.description,parameters:JSON.parse(JSON.stringify(a.parameters)),active:c.has(a.name),exposure:a.exposure??"direct",source:a.namespace?.name??d.get(a.name)??null,blockedByMode:!this.capabilityRuntime.isToolAllowed(a.name)}))}async executeDirectBash(a){let b=await this.ensureSession();if(b.isBashRunning)throw new B;let c=(0,e.randomUUID)();console.info("[Pi Desk][PiChatWorker] Direct Bash 已开始",{sessionId:b.sessionId,executionId:c,excludeFromContext:a.excludeFromContext,commandLength:a.command.length}),this.startBash(c,a.command);try{let d=await b.extensionRunner.emitUserBash({type:"user_bash",command:a.command,excludeFromContext:a.excludeFromContext,cwd:this.cwd}),e=d?.result?d.result:await b.executeBash(a.command,void 0,{excludeFromContext:a.excludeFromContext,id:c,operations:d?.operations});return d?.result&&b.recordBashResult(a.command,e,{excludeFromContext:a.excludeFromContext}),this.completeBash(c,e),{output:e.output,exitCode:e.exitCode??null,cancelled:e.cancelled,truncated:e.truncated,fullOutputPath:e.fullOutputPath??null}}catch(a){throw this.discardBash(c),a}finally{console.info("[Pi Desk][PiChatWorker] Direct Bash 已结束",{sessionId:b.sessionId,executionId:c})}}async abortDirectBash(){(await this.ensureSession()).abortBash()}assertIdle(){if(this.disposed||this.initializePromise)throw Error("Pi 会话仍在初始化或关闭,不能切换分支");if(this.sessionLifecycle)throw Error("Pi 会话生命周期仍在处理,不能切换分支");if(this.startingAcceptedInput||this.acceptedInputs.length>0)throw Error("主 Agent 正在接管聊天输入,不能切换分支");if(this.activeCompactionTempId)throw Error("上下文压缩期间不能切换分支");if(this.session&&!this.session.isIdle)throw Error("主 Agent 运行时不能切换分支")}readPluginReloadBlockReason(){return this.disposed?"Pi Worker 已释放":this.sessionLifecycle?"Pi 扩展重载或关闭仍未完成":this.initializePromise?"AgentSession 正在初始化":this.startingAcceptedInput||this.acceptedInputs.length>0||this.acceptedInputTimer?"聊天输入正在接纳":this.activeValidation||this.pendingPrompt?"聊天输入正在校验":this.activeCompactionTempId?"上下文正在压缩":this.steeringQueue.length>0||this.followUpQueue.length>0?"聊天队列不为空":this.observedRunPromises.size>0?"Agent 运行仍在收尾":this.backgroundTaskIds.size>0?"插件后台任务仍在运行":this.session?.isBashRunning?"Bash 正在运行":this.session&&!this.session.isIdle?"主 Agent 正在运行":this.activeMessage||(this.toolRuntime?.size??0)>0||this.bashTempsById.size>0?"实时消息仍在处理":null}subscribe(a){if(this.disposed)throw Error("Pi chat worker has been disposed");return this.listeners.add(a),()=>this.listeners.delete(a)}async getRuntime(a=!0){if(!a){if(this.disposed)throw Error("Pi chat worker has been disposed");return this.session||this.sessionLifecycle||this.ensureSession().catch(a=>{this.disposed||this.session||(this.initializationError=(a instanceof Error?a.message:String(a)).slice(0,32e3),this.emit({type:"runtime_changed",runtime:this.runtimeSnapshot()}))}),this.runtimeSnapshot()}let b=this.ensureSession(),c=()=>void 0,d=new Promise(a=>{c=this.nativeUi.subscribe(()=>{this.nativeUi.hasPending&&a()}),this.nativeUi.hasPending&&a()});try{return await Promise.race([b,d]),this.runtimeSnapshot()}finally{c()}}async readModelContext(){let a=await this.ensureSession(),b=new Set(a.getActiveToolNames()),c=a.getAllTools().filter(a=>b.has(a.name)).map(a=>{var b;let c;return{name:a.name,description:a.description,parameters:(b=a.parameters,(c=function(a){try{let b=JSON.stringify(a);return void 0===b?null:JSON.parse(b)}catch{return null}}(b))&&"object"==typeof c&&!Array.isArray(c)?c:{})}}),d={systemPrompt:a.systemPrompt,tools:c};return console.info("[Pi Desk][PiChatWorker] 已读取模型上下文",{sessionId:a.sessionId,toolCount:d.tools.length}),d}async listModels(){return(0,o.A)(this.sessionLifecycle?null:this.session,this.cwd)}async send(a){let b=await this.ensureSession(),c=(0,l.ni)(a);if(c.images.length>0&&!b.model?.input.includes("image"))throw Error("当前模型不支持图片输入");let d=this.messageGate.isBlocking;"follow_up"!==a.mode||d||this.resolveMode(b,a.mode),d&&(0,l.mu)([...this.steeringQueue.map(a=>a.input),...this.followUpQueue.map(a=>a.input),...this.acceptedInputs.filter(a=>a.deferredByCompaction).map(a=>a.initial),c]);let f=(0,e.randomUUID)(),g={tempId:f,input:a,initial:c,deferredByCompaction:d,allowIdleFollowUp:d};return this.acceptedInputs.push(g),d&&this.messageGate.defer("web-user-message",()=>this.startDeferredAcceptedInput(g))?this.emitRuntime():(g.deferredByCompaction=!1,this.scheduleAcceptedInputStart()),console.info("[Pi Desk][PiChatWorker] 聊天输入已由 Worker 接管",{sessionId:b.sessionId,tempId:f,requestedMode:a.mode,deferredByCompaction:d}),{tempId:f}}async interrupt(){this.nativeUi.cancelAll(),this.discardAcceptedInputs();let a=await this.ensureSession();this.oversizedToolCallAbortRequested=!1,await a.abort()}async navigateTree(a,b=!1){let c=await this.ensureSession();this.assertIdle(),this.treeResumeImmediate&&clearImmediate(this.treeResumeImmediate),this.treeResumeImmediate=null;let d=!1;try{return await this.runSessionLifecycle(async()=>{let e=this.sessionManager.getLeafId(),f={committed:!1};this.treeNavigation=f,this.messageGate.pause();try{this.initialization.setStage("切换会话树"),(d=!(b&&e===a?await this.navigateLeafUserMessage(c,a):await c.navigateTree(a,{summarize:!1})).cancelled)&&await this.capabilityRuntime.apply()}catch(a){throw f.committed||this.sessionManager.getLeafId()===e||this.resetBranchRuntime(),a}finally{try{if(f.committed)for(let a of(this.syncOwnerAppendedEntries(),this.observedEntryCount=this.sessionManager.getEntries().length,this.committedEntryIds.clear(),this.sessionManager.getBranch()))this.committedEntryIds.add(a.id)}finally{this.treeNavigation=null,f.committed||(this.reconcileAppendedEntries(),this.emitTreeState()),this.scheduleTreeMessageResume()}}}),d}catch(a){throw c.abortCompaction(),a}}async navigateLeafUserMessage(a,b){let c=this.sessionManager.getEntry(b),d=await a.extensionRunner.emit({type:"session_before_tree",preparation:{targetId:b,oldLeafId:b,commonAncestorId:b,entriesToSummarize:[],userWantsSummary:!1},signal:this.commandLifetime.signal});return d?.cancel||this.commandLifetime.signal.aborted?{cancelled:!0}:(null===c.parentId?this.sessionManager.resetLeaf():this.sessionManager.branch(c.parentId),d?.label&&this.sessionManager.appendLabelChange(b,d.label),a.refreshContext(),await a.extensionRunner.emit({type:"session_tree",oldLeafId:b,newLeafId:this.sessionManager.getLeafId()}),{cancelled:!1})}resetBranchRuntime(){this.treeNavigation&&(this.treeNavigation.committed=!0),this.commandLifetime.abort(),this.commandLifetime=new AbortController,this.acceptedInputTimer&&clearTimeout(this.acceptedInputTimer),this.compactionResumeTimer&&clearTimeout(this.compactionResumeTimer),this.acceptedInputTimer=null,this.compactionResumeTimer=null,this.messageGate.discardPending(),this.toolRuntime?.discardAll(),this.clearLiveUpdates(),this.clearMemory(),this.nativeUi.reset(),this.capabilityRuntime.restoreBranchSelection(),this.pluginRuntime.resetBranch()}scheduleTreeMessageResume(){if(this.disposed)return;let a=setImmediate(()=>{(async()=>{await this.sessionLifecycle?.catch(()=>void 0),this.treeResumeImmediate!==a||(this.treeResumeImmediate=null,this.disposed||this.treeNavigation||!this.session||(await this.messageGate.resume(),this.disposed||(this.reconcileAppendedEntries(),this.emitTreeState(),this.scheduleAcceptedInputStart())))})().catch(b=>{this.treeResumeImmediate===a&&(this.treeResumeImmediate=null),console.warn("[Pi Desk][PiChatWorker] 分支消息恢复失败",{error:b})})});this.treeResumeImmediate=a}emitTreeState(){this.emitBackgroundTasks(),this.emit({type:"session_info_changed",sessionTitle:this.sessionManager.getSessionName()?.trim()||null}),this.emitRuntime()}get isInitialized(){return null!==this.session}async reload(a){let b=a??((0,j.P)()?"basic":"normal");if((0,j.P)()&&"normal"===b)throw Error("服务处于基础模式,请正常启动 Pi Desk 后再加载外部扩展");let c=this.readPluginReloadBlockReason();if(c)throw Error(`当前会话不能重载 Pi 配置:${c}`);if(b!==this.extensionMode||!this.session)return void await this.runSessionLifecycle(async()=>{if(this.releaseSessionBindings(),this.initialization.dispose(),this.session=null,this.updateBackgroundTasks([]),this.disposed)throw Error("Pi Worker 已释放");this.extensionMode=b,this.initialization=this.createInitialization();try{await this.createSession("normal"===b)}finally{this.emit({type:"runtime_changed",runtime:this.runtimeSnapshot()})}},125e3);let d=await this.ensureSession(),e=this.readPluginReloadBlockReason();if(e)throw Error(`当前会话不能重载 Pi 配置:${e}`);await this.runSessionLifecycle(async()=>{this.unsubscribeAgent?.(),this.unsubscribeAgent=null;try{await this.initialization.reload()}catch(a){this.restoreBasicInitialization(a),await this.createSession();return}finally{this.disposed||this.session!==d||this.unsubscribeAgent||(this.unsubscribeAgent=d.agent.subscribe(a=>{this.session===d&&this.handleAgentEvent(a)}))}this.disposed||this.session!==d||(this.messageGate.installExtensionRuntime(d.resourceLoader.getExtensions().runtime),await this.capabilityRuntime.apply(),this.reconcileAppendedEntries(),this.emitRuntime())})}waitForSessionLifecycle(a,b=15e3){return this.nativeUi.waitForOperation(a,b,()=>Error(`Pi 扩展生命周期未在截止时间内完成
18
18
  ${this.initialization.describeStage()}`))}async runSessionLifecycle(a,b=15e3){if(this.sessionLifecycle)throw Error("Pi 扩展生命周期尚未完成");let c=Promise.resolve().then(()=>{if(this.disposed)throw Error("Pi Worker 已释放");return a()});this.sessionLifecycle=c;let d=()=>{this.sessionLifecycle===c&&(this.sessionLifecycle=null)};c.then(d,d),await this.waitForSessionLifecycle(c,b)}releaseSessionBindings(){this.unsubscribeAgent?.(),this.unsubscribeSession?.(),this.unsubscribeToolRuntime?.(),this.toolRuntimeLease?.release(),this.unsubscribeAgent=null,this.unsubscribeSession=null,this.unsubscribeToolRuntime=null,this.toolRuntimeLease=null,this.toolRuntime=null}async compact(){if(this.startingAcceptedInput||this.acceptedInputs.length>0)throw Error("主 Agent 正在接管聊天输入,不能压缩上下文");if(this.activeCompactionTempId)throw Error("上下文正在压缩");this.messageGate.pause();let a=null;try{if(!(a=await this.ensureSession()).isIdle)throw Error("主 Agent 运行时不能压缩上下文");if(a.isBashRunning)throw Error("Bash 运行时不能压缩上下文");let b=this.unsubscribeAgent;this.unsubscribeAgent=null,b?.();try{await a.compact()}finally{this.disposed||this.session!==a||this.unsubscribeAgent||(this.unsubscribeAgent=a.agent.subscribe(a=>this.handleAgentEvent(a)))}}finally{this.scheduleCompactionMessageResume()}}async restoreQueuedMessages(){let a=await this.ensureSession(),b=this.acceptedInputs.splice(0),c=b.filter(a=>"auto"===a.input.mode).map(a=>a.initial),d=b.filter(a=>"follow_up"===a.input.mode).map(a=>a.initial),e=this.steeringQueue.splice(0),f=this.followUpQueue.splice(0),g=e.map(a=>a.input),h=f.map(a=>a.input),i=[...g,...c,...h,...d];for(let c of(this.pendingQueueText.clear(),a.clearQueue(),b))this.discardPresentedInput(c.tempId);for(let a of[...e,...f])this.discardPresentedInput(a.tempId);return this.emitRuntime(),{text:i.map(a=>a.text).filter(a=>a.trim()).join("\n\n"),images:i.flatMap(a=>a.images.map(a=>({...a})))}}async applyCapabilityMode(){let a=null!==this.session;await this.ensureSession();try{a&&await this.capabilityRuntime.apply()}finally{this.emitRuntime()}}async setTitle(a){let b=await this.ensureSession(),c=a.replace(/[\r\n]+/g," ").trim();this.sessionManager.getSessionName()!==c&&b.setSessionName(c)}async setModel(a){if(this.startingAcceptedInput||this.acceptedInputs.length>0)throw Error("主 Agent 正在接管聊天输入,不能切换模型");if(this.activeCompactionTempId)throw Error("上下文压缩期间不能切换模型");let b=await this.ensureSession();if(!b.isIdle)throw Error("主 Agent 运行时不能切换模型");let c=b.modelRuntime.getModel(a.provider,a.modelId);if(!c)throw Error("模型不存在或当前不可用");if(!(0,k.getSupportedThinkingLevels)(c).includes(a.thinkingLevel))throw Error("模型不支持该思考等级");this.publishingModel=!0;try{await b.setModel(c),b.setThinkingLevel(a.thinkingLevel)}finally{this.publishingModel=!1,this.emitRuntime()}}dispose(){return this.disposePromise??=this.disposeSession().finally(()=>{this.ownsResources&&this.resources.reset()}),this.disposePromise}async disposeSession(){this.disposed=!0,this.nativeUi.dispose(),this.commandLifetime.abort(),this.treeResumeImmediate&&clearImmediate(this.treeResumeImmediate),this.treeResumeImmediate=null,this.acceptedInputTimer&&clearTimeout(this.acceptedInputTimer),this.compactionResumeTimer&&clearTimeout(this.compactionResumeTimer),this.acceptedInputTimer=null,this.compactionResumeTimer=null,this.messageGate.dispose(),this.clearLiveUpdates(),this.listeners.clear();let a=this.session;a||this.initialization.dispose(),a?.clearQueue(),a?.abortCompaction();let b=a?.abort().catch(()=>void 0);await Promise.allSettled([this.initializePromise,this.sessionLifecycle,b]);let c=this.session;if(!c){this.capabilityRuntime.dispose(),this.pluginRuntime.dispose(),this.clearMemory();return}c!==a&&(c.clearQueue(),c.abortCompaction(),await c.abort().catch(()=>void 0));try{await c.extensionRunner.emit({type:"session_shutdown",reason:"quit"})}catch(a){console.warn("[Pi Desk][PiChatWorker] 扩展关闭失败",{sessionId:c.sessionId,message:a instanceof Error?a.message:String(a)})}this.releaseSessionBindings(),this.initialization.dispose(!1),this.session=null,this.initializationError=null,await Promise.allSettled([...this.observedRunPromises]),this.clearMemory()}resolveMode(a,b,c=!1){if("follow_up"===b){if(a.isStreaming)return"followUp";if(c)return"prompt";throw Error("主 Agent 已空闲,不能添加 Follow-up")}return a.isStreaming?"steer":"prompt"}scheduleCompactionMessageResume(){this.disposed||this.compactionResumeScheduled||this.compactionResumeTimer||(this.compactionResumeScheduled=!0,queueMicrotask(()=>{if(this.compactionResumeScheduled=!1,!this.disposed){if(this.session?.isCompacting){this.compactionResumeTimer=setTimeout(()=>{this.compactionResumeTimer=null,this.scheduleCompactionMessageResume()},0);return}this.activeValidation?.compactionStarted||this.messageGate.resume().then(()=>{this.disposed||(this.scheduleAcceptedInputStart(),this.manualCompactionFinishPending&&(this.manualCompactionFinishPending=!1,this.session?.isStreaming||this.emit({type:"main_operation_finished"})),this.emitRuntime())})}}))}scheduleAcceptedInputStart(){this.disposed||this.startingAcceptedInput||0===this.acceptedInputs.length||this.acceptedInputTimer||this.messageGate.isBlocking||(this.acceptedInputTimer=setTimeout(()=>{this.acceptedInputTimer=null,this.startAcceptedInput()},0))}startAcceptedInput(){if(this.disposed||this.startingAcceptedInput||this.messageGate.isBlocking)return;let a=this.acceptedInputs.shift();a&&(this.startingAcceptedInput=!0,this.runAcceptedInput(a).finally(()=>{this.startingAcceptedInput=!1,this.scheduleAcceptedInputStart()}))}async startDeferredAcceptedInput(a){if(this.disposed)return;let b=this.acceptedInputs.indexOf(a);if(!(b<0)){this.acceptedInputs.splice(b,1),a.deferredByCompaction=!1,this.emitRuntime(),this.startingAcceptedInput=!0;try{await this.runAcceptedInput(a)}finally{this.startingAcceptedInput=!1}}}async runAcceptedInput(a){let b=null;try{let c,d=await this.ensureSession(),e=this.resolveMode(d,a.input.mode,a.allowIdleFollowUp);b={tempId:a.tempId,requestedMode:a.input.mode,mode:e,prepared:null,error:null,compactionStarted:!1,allowIdleFollowUp:a.allowIdleFollowUp},this.activeValidation=b,"prompt"===e&&(this.presentedInputTempIds.add(a.tempId),this.emit({type:"message_start",tempId:a.tempId,message:{type:"user",text:a.initial.text,images:v(a.initial)}}));let f=new Promise(a=>{c=a}),g=null,h=d.prompt(a.input.text,{images:(0,l.ti)(a.initial.images),source:"rpc",streamingBehavior:"follow_up"===a.input.mode?"followUp":"steer",preflightResult:()=>c(!0)}).then(()=>{c(!1),this.finishObservedSend(b)},a=>{g=a,c(!1),this.finishObservedSend(b)});this.observeRun(h);let i=await f;if(this.activeValidation===b&&(this.activeValidation=null),b.compactionStarted&&this.scheduleCompactionMessageResume(),b.error)throw b.error;if(!i)throw await h,g instanceof Error?g:Error("Pi 拒绝接纳聊天输入");if(!b.prepared){this.discardPresentedInput(a.tempId),console.info("[Pi Desk][PiChatWorker] 聊天输入已由扩展直接处理",{sessionId:d.sessionId,tempId:a.tempId});return}console.info("[Pi Desk][PiChatWorker] Pi 已开始处理已接管聊天输入",{sessionId:d.sessionId,tempId:a.tempId,mode:b.mode})}catch(c){this.activeValidation===b&&(this.activeValidation=null),b&&(this.cancelPreflightOperation(b),b.compactionStarted&&this.scheduleCompactionMessageResume()),this.discardPresentedInput(a.tempId),console.warn("[Pi Desk][PiChatWorker] 已撤回未被 Pi 接纳的聊天输入",{sessionId:this.session?.sessionId??this.sessionManager.getSessionId(),tempId:a.tempId,errorName:c instanceof Error?c.name:"UnknownError"})}}discardAcceptedInputs(){let a=this.acceptedInputs.splice(0);for(let b of a)this.discardPresentedInput(b.tempId);a.some(a=>a.deferredByCompaction)&&this.emitRuntime()}discardPresentedInput(a){this.presentedInputTempIds.delete(a)&&this.emit({type:"message_discard",tempId:a})}async ensureSession(){if(this.disposed)throw Error("Pi chat worker has been disposed");if(this.sessionLifecycle)throw Error("Pi 扩展生命周期尚未完成,请等待或在新会话使用基础聊天");return this.session?this.session:(this.initializePromise||(this.initializePromise=this.createSession().finally(()=>{this.initializePromise=null})),this.initializePromise)}restoreBasicInitialization(a){if(this.releaseSessionBindings(),this.initialization.dispose(),this.session=null,this.disposed||"basic"===this.extensionMode)throw a;let b=a instanceof Error?a.message:String(a);this.initializationError=b.length>32e3?`${b.slice(0,31970)}
19
- …诊断过长,已截断`:b,this.extensionMode="basic",this.updateBackgroundTasks([]),this.initialization=this.createInitialization(),console.warn("[Pi Desk][PiChatWorker] 扩展加载失败,切换基础聊天",{sessionId:this.sessionManager.getSessionId(),cwd:this.cwd,message:this.initializationError})}async createSession(a=!1){let b;try{b=await this.initialization.start(a)}catch(a){this.restoreBasicInitialization(a),b=await this.initialization.start()}if(this.disposed)throw this.initialization.dispose(),Error("Pi Worker 已释放");try{this.syncOwnerAppendedEntries()}catch(a){throw this.initialization.dispose(),a}return this.session=b,"normal"===this.extensionMode&&(this.initializationError=null),this.unsubscribeAgent=b.agent.subscribe(a=>{this.session===b&&this.handleAgentEvent(a)}),this.toolRuntimeLease=(0,n.s)(b),this.toolRuntime=this.toolRuntimeLease.runtime,this.unsubscribeToolRuntime=this.toolRuntime.subscribe(a=>{this.session===b&&(this.emit(a),"message_update"===a.type&&"tool"===a.message.type&&"running"!==a.message.status&&this.flushLiveUpdates())}),this.unsubscribeSession=b.subscribe(a=>{this.session===b&&this.handleSessionEvent(a)}),this.backgroundTaskIds.size>0&&this.emitBackgroundTasks(),this.emitRuntime(),b}syncOwnerAppendedEntries(){for(let a of this.sessionManager.getEntries().slice(this.observedEntryCount))this.onEntryAppended(a)}validateFinalInput(a,b,c){let d=this.activeValidation;if(!d)return{action:"continue"};try{let e=c??"prompt";if("follow_up"===d.requestedMode&&"followUp"!==e&&!(d.allowIdleFollowUp&&"prompt"===e))throw Error("主 Agent 已空闲,不能添加 Follow-up");d.mode=e;let f=this.session;if(!f)throw Error("Pi AgentSession 尚未就绪");let g=(0,l.qc)(a,b,f.resourceLoader.getSkills().skills,f.promptTemplates);if(g.images.length>0&&!f.model?.input.includes("image"))throw Error("当前模型不支持图片输入");if(d.prepared=g,"prompt"===d.mode)this.pendingPrompt={tempId:d.tempId,input:g};else{let a="steer"===d.mode?this.steeringQueue:this.followUpQueue,b={tempId:d.tempId,input:g,confirmed:!1};(0,l.mu)([...this.steeringQueue.map(a=>a.input),...this.followUpQueue.map(a=>a.input),g]),a.push(b)}return{action:"continue"}}catch(a){return d.error=a instanceof Error?a:Error("聊天输入校验失败"),{action:"handled"}}}cancelPreflightOperation(a){a.compactionStarted&&(a.compactionStarted=!1,this.emit({type:"main_operation_cancelled"}))}finishObservedSend(a){this.reconcileAppendedEntries(),this.activeValidation===a&&(this.activeValidation=null),this.pendingPrompt?.tempId===a.tempId&&(this.pendingPrompt=null,this.discardPresentedInput(a.tempId)),this.removeUnconfirmedQueueItem(a.tempId)&&(this.discardPresentedInput(a.tempId),this.emitRuntime())}removeUnconfirmedQueueItem(a){for(let b of[this.steeringQueue,this.followUpQueue]){let c=b.findIndex(b=>b.tempId===a&&!b.confirmed);if(c>=0)return b.splice(c,1),!0}return!1}observeRun(a){this.observedRunPromises.add(a),a.finally(()=>this.observedRunPromises.delete(a))}handleAgentEvent(a){if(!this.disposed&&!this.treeNavigation)switch(a.type){case"agent_start":this.oversizedToolCallAbortRequested=!1,this.emit({type:"agent_started"});return;case"agent_end":this.oversizedToolCallAbortRequested=!1,this.reconcileAppendedEntries();return;case"message_start":if(this.abortOversizedStreamingToolCall(a.message))return;this.startMessage(a.message);return;case"message_update":if(this.abortOversizedStreamingToolCall(a.message))return;this.updateMessage(a.message),this.toolRuntime?.syncStreamingTools(a.message);return;case"message_end":this.toolRuntime?.syncStreamingTools(a.message),this.endMessage(a.message);return;default:return}}abortOversizedStreamingToolCall(a){let b=function(a){if("assistant"!==t(a))return null;let b=a.content;if(!Array.isArray(b))return null;for(let a of b)if(!(!a||"object"!=typeof a||Array.isArray(a))&&"toolCall"===a.type&&"string"==typeof a.partialJson&&!(a.partialJson.length<=262144))return{toolCallId:"string"==typeof a.id?a.id:null,toolName:"string"==typeof a.name?a.name:null,argumentChars:a.partialJson.length};return null}(a);return!!b&&(this.oversizedToolCallAbortRequested||this.session?.agent.signal?.aborted||(this.oversizedToolCallAbortRequested=!0,console.warn("[Pi Desk][PiChatWorker] 工具参数流过大,已中止当前运行,交由 Pi 重试策略处理",{sessionId:this.sessionManager.getSessionId(),toolCallId:b.toolCallId,toolName:b.toolName,argumentChars:b.argumentChars,maxArgumentChars:262144}),this.session?.agent.abort()),!0)}handleSessionEvent(a){if(!this.disposed)switch(a.type){case"queue_update":this.handleQueueUpdate(a.steering,a.followUp);return;case"agent_end":a.willRetry&&(this.toolRuntime?.size??0)>0&&(console.warn("[Pi Desk][PiChatWorker] 自动重试前丢弃未闭合 ToolCall",{sessionId:this.sessionManager.getSessionId(),toolCount:this.toolRuntime?.size??0}),this.toolRuntime?.discardAll());return;case"agent_settled":this.oversizedToolCallAbortRequested=!1,this.reconcileAppendedEntries(),this.toolRuntime?.discardAll(),this.emitRuntime(),this.emit({type:"agent_settled"});return;case"compaction_start":if(this.messageGate.pause(),console.info("[Pi Desk][PiChatWorker] 上下文压缩开始",{sessionId:this.session?.sessionId,reason:a.reason}),this.activeCompactionTempId)console.warn("[Pi Desk][PiChatWorker] 已忽略重复的上下文压缩开始事件",{sessionId:this.session?.sessionId,reason:a.reason});else{let a=(0,e.randomUUID)();this.activeCompactionTempId=a,this.emit({type:"message_start",tempId:a,message:function(a=""){return{type:"compaction",summary:a}}()})}this.activeValidation&&(this.activeValidation.compactionStarted=!0),this.emit({type:"agent_started"});return;case"compaction_end":if(a.errorMessage?console.error("[Pi Desk][PiChatWorker] 上下文压缩失败",{sessionId:this.session?.sessionId,reason:a.reason,errorMessage:a.errorMessage}):console.info("[Pi Desk][PiChatWorker] 上下文压缩结束",{sessionId:this.session?.sessionId,reason:a.reason,aborted:a.aborted,compacted:void 0!==a.result,willRetry:a.willRetry}),a.result){let b=this.activeCompactionTempId;this.reconcileAppendedEntries(),b&&this.activeCompactionTempId===b&&(console.error("[Pi Desk][PiChatWorker] 压缩成功但未找到对应 CompactionEntry",{sessionId:this.session?.sessionId,reason:a.reason}),this.discardActiveCompaction())}else this.discardActiveCompaction();this.emitRuntime(),"manual"===a.reason&&(this.manualCompactionFinishPending=!0),this.scheduleCompactionMessageResume();return;case"thinking_level_changed":this.publishingModel||this.emitRuntime();return;case"entry_appended":this.treeNavigation||this.onEntryAppended(a.entry);return;case"session_info_changed":{let b=this.sessionManager.getLeafEntry();this.treeNavigation||b?.type!=="session_info"||this.onEntryAppended(b),this.emit({type:"session_info_changed",sessionTitle:a.name?.trim()||null});return}case"bash_execution_update":a.id&&this.updateBash(a.id,a.delta);return;default:return}}startMessage(a){let b,c=t(a),d=!0,f=!1,g=null;if("user"===c){let a=this.takeUserInput();b=a?.tempId??(0,e.randomUUID)(),f=this.presentedInputTempIds.delete(b)}else if("toolResult"===c){let c=(g=u(a))?this.toolRuntime?.tempId(g):null;b=c??(0,e.randomUUID)(),d=null===c}else b=(0,e.randomUUID)();let h=this.projectLiveMessage(a,g);h&&(this.activeMessage={tempId:b,started:d||f,toolCallId:g},this.emit({type:d&&!f?"message_start":"message_update",tempId:b,message:h}))}updateMessage(a){let b=this.activeMessage;if(!b)return;let c=this.projectLiveMessage(a,b.toolCallId);c&&this.emit({type:"message_update",tempId:b.tempId,message:c})}endMessage(a){let b=this.activeMessage,c=t(a),d="toolResult"===c?u(a):null;if(!b){let c=this.projectLiveMessage(a,d);if(!c)return;b={tempId:(0,e.randomUUID)(),started:!0,toolCallId:d},this.emit({type:"message_start",tempId:b.tempId,message:c})}let f=this.projectLiveMessage(a,b.toolCallId);f&&this.emit({type:"message_update",tempId:b.tempId,message:f});let g=this.sessionManager.getLeafEntry(),h=g?(0,m.B4)(g):null;g&&h?(this.onEntryAppended(g),this.committedEntryIds.add(g.id),this.observedEntryCount=this.sessionManager.getEntries().length,this.emit({type:"message_commit",tempId:b.tempId,entryId:h.entryId,timestampMs:h.timestampMs,message:f??h.message}),this.emitRuntime()):b.started&&this.emit({type:"message_discard",tempId:b.tempId}),b.toolCallId&&this.toolRuntime?.remove(b.toolCallId),this.activeMessage=null}projectLiveMessage(a,b){return"toolResult"===t(a)&&b?this.toolRuntime?.projectLiveResult(a,b)??null:(0,m.b7)(a)}takeUserInput(){if(this.pendingPrompt){let a=this.pendingPrompt;return this.pendingPrompt=null,a}let a=this.steeringQueue.shift()??this.followUpQueue.shift();return a?(this.applyPendingQueueText(),this.emitRuntime(),{tempId:a.tempId,input:a.input}):null}startBash(a,b){let c={tempId:(0,e.randomUUID)(),executionId:a,command:b,output:"",status:"running"};this.bashTempsById.set(a,c),this.emit({type:"message_start",tempId:c.tempId,message:this.bashMessage(c)})}updateBash(a,b){let c=this.bashTempsById.get(a);c&&"running"===c.status&&(c.output+=b,this.emit({type:"message_update",tempId:c.tempId,message:this.bashMessage(c)}))}completeBash(a,b){let c=this.bashTempsById.get(a);if(!c)return;c.output=b.output,c.status=b.cancelled?"aborted":0===b.exitCode?"completed":"error",this.emit({type:"message_update",tempId:c.tempId,message:this.bashMessage(c)}),this.flushLiveUpdates();let d=this.sessionManager.getLeafEntry(),e=d?(0,m.B4)(d):null;d&&e?.message.type==="bash"&&e.message.command===c.command&&(this.onEntryAppended(d),this.commitBash(c,e))}commitBash(a,b){this.flushLiveUpdates(),this.committedEntryIds.add(b.entryId),this.observedEntryCount=this.sessionManager.getEntries().length,this.emit({type:"message_commit",tempId:a.tempId,entryId:b.entryId,timestampMs:b.timestampMs,message:b.message}),this.bashTempsById.delete(a.executionId)}discardBash(a){let b=this.bashTempsById.get(a);b&&(this.bashTempsById.delete(a),this.emit({type:"message_discard",tempId:b.tempId}))}bashMessage(a){return{type:"bash",command:a.command,status:a.status,output:a.output,declaration:{message:{kind:"bash",command:a.command,output:a.output,exitCode:"completed"===a.status?0:null,cancelled:"aborted"===a.status,truncated:!1},raw:{executionId:a.executionId,command:a.command,output:a.output,status:a.status}}}}handleQueueUpdate(a,b){this.confirmAndSyncQueue("steering",a),this.confirmAndSyncQueue("followUp",b),this.emitRuntime()}confirmAndSyncQueue(a,b){let c="steering"===a?this.steeringQueue:this.followUpQueue;for(let a of c)a.confirmed=!0;c.length!==b.length?this.pendingQueueText.set(a,b):(c.forEach((a,c)=>{a.input.text=b[c]??a.input.text}),this.pendingQueueText.delete(a))}applyPendingQueueText(){for(let a of["steering","followUp"]){let b=this.pendingQueueText.get(a);b&&this.confirmAndSyncQueue(a,b)}}reconcileAppendedEntries(){if(this.treeNavigation)return;let a=this.sessionManager.getEntries(),b=a.slice(this.observedEntryCount);for(let c of(this.observedEntryCount=a.length,b)){if(this.onEntryAppended(c),this.committedEntryIds.has(c.id))continue;let a=(0,m.B4)(c);if(!a)continue;if("compaction"===c.type&&this.activeCompactionTempId){let b=this.activeCompactionTempId;this.activeCompactionTempId=null,this.committedEntryIds.add(c.id),this.emit({type:"message_commit",tempId:b,entryId:a.entryId,timestampMs:z(c.id,c.timestamp),message:a.message});continue}if("bash"===a.message.type){let b=a.message.command,c=[...this.bashTempsById.values()].reverse().find(a=>a.command===b);if(c){this.commitBash(c,a);continue}}let b=(0,e.randomUUID)();this.committedEntryIds.add(c.id),this.emit({type:"message_start",tempId:b,message:a.message}),this.emit({type:"message_commit",tempId:b,entryId:a.entryId,timestampMs:z(c.id,c.timestamp),message:a.message})}}discardActiveCompaction(){let a=this.activeCompactionTempId;a&&(this.activeCompactionTempId=null,this.emit({type:"message_discard",tempId:a}))}updateBackgroundTasks(a){let b=new Set(a);if(!(b.size===this.backgroundTaskIds.size&&[...b].every(a=>this.backgroundTaskIds.has(a)))){for(let a of(this.backgroundTaskIds.clear(),b))this.backgroundTaskIds.add(a);this.emitBackgroundTasks()}}emitBackgroundTasks(){this.emit({type:"background_tasks_changed",taskIds:[...this.backgroundTaskIds]})}runtimeSnapshot(){let a=this.session,b=a?.model,c=a?.getContextUsage(),d=this.acceptedInputs.filter(a=>a.deferredByCompaction&&"auto"===a.input.mode).map(x),e=this.acceptedInputs.filter(a=>a.deferredByCompaction&&"follow_up"===a.input.mode).map(x);return{extensionMode:this.extensionMode,initializationError:this.initializationError,queues:{steering:[...this.steeringQueue.map(w),...d],followUp:[...this.followUpQueue.map(w),...e]},model:b?{provider:b.provider,modelId:b.id,thinkingLevel:a.thinkingLevel}:null,contextUsage:c&&c.contextWindow>0?{tokens:c.tokens,contextWindow:c.contextWindow}:null,plugins:this.pluginRuntime.snapshot(),capabilityMode:this.capabilities.mode()}}emitRuntime(){this.session&&this.emit({type:"runtime_changed",runtime:this.runtimeSnapshot()})}emit(a){if(!this.disposed&&!this.treeNavigation){if("message_update"===a.type)return void this.scheduleLiveUpdate(a);this.flushLiveUpdates(),"message_start"===a.type?(this.clearLiveUpdate(a.tempId),this.liveUpdatesByTempId.set(a.tempId,{lastPublishedAt:Date.now(),pending:null,timer:null,receivedCount:0,publishedCount:0})):("message_commit"===a.type||"message_discard"===a.type)&&this.finishLiveUpdate(a.tempId),("message_commit"===a.type||"session_info_changed"===a.type)&&(0,p.xt)(this.cwd),this.publish(a)}}scheduleLiveUpdate(a){let b=this.liveUpdatesByTempId.get(a.tempId)??{lastPublishedAt:0,pending:null,timer:null,receivedCount:0,publishedCount:0};if(b.pending=a,b.receivedCount+=1,this.liveUpdatesByTempId.set(a.tempId,b),b.timer)return;let c=Date.now()-b.lastPublishedAt,d=Math.max(0,500-c);0===d?this.publishPendingLiveUpdate(b):b.timer=setTimeout(()=>{this.liveUpdatesByTempId.get(a.tempId)===b&&(b.timer=null,this.publishPendingLiveUpdate(b))},d)}publishPendingLiveUpdate(a){let b=a.pending;b&&!this.disposed&&(a.pending=null,a.lastPublishedAt=Date.now(),a.publishedCount+=1,this.publish(b))}flushLiveUpdates(){for(let a of this.liveUpdatesByTempId.values())a.timer&&clearTimeout(a.timer),a.timer=null,this.publishPendingLiveUpdate(a)}finishLiveUpdate(a){let b=this.liveUpdatesByTempId.get(a);this.clearLiveUpdate(a),b&&b.receivedCount!==b.publishedCount&&console.debug("[Pi Desk][PiChatWorker] 流式消息更新已合并",{sessionId:this.sessionManager.getSessionId(),tempId:a,receivedCount:b.receivedCount,publishedCount:b.publishedCount})}clearLiveUpdate(a){let b=this.liveUpdatesByTempId.get(a);b?.timer&&clearTimeout(b.timer),this.liveUpdatesByTempId.delete(a)}clearLiveUpdates(){for(let a of this.liveUpdatesByTempId.values())a.timer&&clearTimeout(a.timer);this.liveUpdatesByTempId.clear()}publish(a){for(let b of[...this.listeners])try{b(a)}catch(b){console.error("[Pi Desk][PiChatWorker] 事件监听器执行失败",{sessionId:this.sessionManager.getSessionId(),eventType:a.type,errorName:b instanceof Error?b.name:"UnknownError"})}}clearMemory(){this.steeringQueue.length=0,this.followUpQueue.length=0,this.pendingQueueText.clear(),this.bashTempsById.clear(),this.pendingPrompt=null,this.activeMessage=null,this.activeValidation=null,this.activeCompactionTempId=null,this.oversizedToolCallAbortRequested=!1,this.acceptedInputs.length=0,this.presentedInputTempIds.clear(),this.committedEntryIds.clear(),this.backgroundTaskIds.clear()}}d()}catch(a){d(a)}})},40333:(a,b,c)=>{c.d(b,{$m:()=>d.$m,FX:()=>d.FX,Pu:()=>d.Pu,QK:()=>d.QK,Tk:()=>d.Tk,nJ:()=>d.nJ,qs:()=>d.qs});var d=c(43969)},41904:(a,b,c)=>{c.d(b,{J:()=>f,a:()=>e});var d=c(59473);let e=d.Ik({locale:d.k5(["zh-CN","en"]),timeZone:d.Yj().trim().min(1).max(100).refine(a=>{try{return new Intl.DateTimeFormat("en",{timeZone:a}),!0}catch{return!1}},"无效的 IANA 时区")}).strict().readonly(),f=d.Ik({region:e}).strict().readonly()},41966:(a,b,c)=>{c.d(b,{L:()=>d});function d(a){if(!(a instanceof Error)||"PiDeskPluginMethodError"!==a.name)return!1;let b=a.code;return 400===b||404===b||409===b}},42520:(a,b,c)=>{c.d(b,{pL:()=>d});function d(a,b){let c=(globalThis.__piDeskNativePluginDiagnostics||(globalThis.__piDeskNativePluginDiagnostics=[]),globalThis.__piDeskNativePluginDiagnostics);!c.some(c=>c.cwd===a&&c.message===b)&&(c.push({cwd:a,message:b}),c.length>100&&c.splice(0,c.length-100))}},42633:(a,b,c)=>{c.d(b,{J8:()=>f,qf:()=>e});var d=c(59473);let e=d.KC([d.Yj(),d.Ik({default:d.Yj(),translations:d.g1(d.Yj().min(1).max(35),d.Yj()).refine(a=>Object.keys(a).length<=16,"too many translations")}).strict()]);function f(a,b){return{default:a,translations:{en:b}}}},43969:(a,b,c)=>{c.d(b,{$m:()=>g,FX:()=>h,Pu:()=>m,QK:()=>i,Tk:()=>k,nJ:()=>j,qs:()=>l});var d=c(59473);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=d.g1(d.Yj(),d.Pq());function g(a,b){return`${a}\u0000${b}`}function h(a){return e.parse(a)}function i(a){return e.parse(a)}function j(a,b){let c=f.parse(a);if(Buffer.byteLength(JSON.stringify(c),"utf8")>2097152)throw new m(b);return c}class k extends Error{constructor(a,b){super(`Plugin method was not found: ${a}/${b}`),this.name="L4PiPluginMethodNotFoundError"}}class l extends Error{constructor(a,b){super(`Plugin method is already registered: ${a}/${b}`),this.name="L4PiPluginMethodConflictError"}}class m extends Error{constructor(a){super(`Plugin method ${a} exceeds 2MB`),this.direction=a,this.name="L4PiPluginMethodPayloadTooLargeError"}}},44095:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{K:()=>z,y:()=>w});var e=c(77598),f=c(58500),g=c(51455),h=c(76760),i=c(59473),j=c(47511),k=c(58801),l=c(88502),m=c(43969),n=a([k]);k=(n.then?(await n)():n)[0];let r=i.g1(i.Yj(),i.Pq()),s=i.Ik({workId:i.Yj().trim().min(1),sessionId:i.Yj().trim().min(1),branchId:i.Yj().trim().min(1)}).strict(),t=i.Ik({source:s,cwd:i.Yj().trim().min(1),status:i.k5(["main_running","background_running","completed","idle"])}).strict(),u=i.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),v=i.ai().int().safe();class w extends Error{constructor(){super("插件运行时仍有调用正在执行"),this.name="L4PiPluginRuntimeBusyError"}}class x extends Error{constructor(a,b){super(b instanceof Error?b.message:String(b),{cause:b}),this.phase=a,this.name="L4PiPluginPhaseError"}}class y extends x{constructor(a,b){super(a,Error("插件加载超时,已停止本次加载")),this.execution=b,this.name="L4PiPluginLoadTimeoutError"}}function o(a,b,c){if("string"!=typeof b||!b.trim())throw Error(`package.json.${c} must be a non-empty string`);let d=(0,h.resolve)(a,b),e=(0,h.relative)(a,d);if(e.startsWith("..")||(0,h.isAbsolute)(e))throw Error(`package.json.${c} must stay inside the package root`);return d}function p(a){return a instanceof Error&&a.message?a.message:String(a)}async function q(a){let b=null,c=Promise.resolve().then(a.execute);a.owner.pendingCleanup.add(c);let d=()=>{a.owner.pendingCleanup.delete(c)};c.then(d,d);try{if(await Promise.race([c.then(()=>!0),new Promise(a=>{b=setTimeout(()=>a(!1),1500)})]))return;throw a.onTimeout?.(),Error(`插件 ${a.phase} 超时,关闭结果未确认`)}catch(b){console.warn("[Pi Desk][GlobalPluginRuntime] Pi Desk Plugin 生命周期执行失败",{source:a.owner.source,packageName:a.owner.packageName,phase:a.phase,timeoutMs:1500,message:p(b)})}finally{b&&clearTimeout(b)}}class z{constructor(a,b){this.packageProvider=a,this.hostSettings=b,this.methods=new Map,this.pluginOwners=new Map,this.browserEntries=new Map,this.declarations=new Map,this.capabilityLoaders=new Map,this.owners=[],this.loadingOwners=new Set,this.changeListeners=new Set,this.changingSources=new Set,this.maintainingSources=new Set,this.lifetime=new AbortController,this.packageDiagnostics=new Map,this.recoveries=new Map,this.initializePromise=null,this.initialized=!1,this.disposed=!1,this.acceptingCalls=!0,this.loadError=null,this.workSessionProvider=null,this.pushSender=null,this.appRuntimeSink=null}initialize(){return this.disposed?Promise.reject(Error("Global plugin runtime has been disposed")):this.initialized?Promise.resolve():(this.initializePromise||(this.initializePromise=this.loadConfiguredPackages().catch(a=>{this.loadError=p(a),console.error("[Pi Desk][GlobalPluginRuntime] 读取插件配置失败,核心应用继续启动",{errorName:a instanceof Error?a.name:"UnknownError",message:this.loadError})}).finally(()=>{this.initializePromise=null,this.initialized=!0,this.publishChanges()})),this.initializePromise)}subscribeChanges(a){return this.changeListeners.add(a),()=>this.changeListeners.delete(a)}publishChanges(){if(!this.disposed)for(let a of this.changeListeners)try{a()}catch(a){console.warn("[Pi Desk][GlobalPluginRuntime] 状态监听失败",{message:p(a)})}}async withSourceIdle(a,b,c,d){let e,g=AbortSignal.any([c,this.lifetime.signal]);g.throwIfAborted();let h=new Promise((a,b)=>{e=()=>b(g.reason),g.addEventListener("abort",e,{once:!0})});try{await Promise.race([this.initialize(),h])}finally{g.removeEventListener("abort",e)}if(g.throwIfAborted(),!this.acceptingCalls||this.changingSources.has(a)||this.maintainingSources.has(a))throw new w;this.cancelRecovery(a),this.maintainingSources.add(a);let i=performance.now()+15e3;try{for(;this.owners.some(b=>b.source===a&&b.activeCalls.size>0);){if(performance.now()>=i)throw Error(`插件 ${a} 的在途调用未在15秒内结束,本次维护失败,可稍后手动重试`);d(`插件 ${a} 仍有调用正在执行`),await (0,f.setTimeout)(250,void 0,{signal:g})}return g.throwIfAborted(),await b()}finally{this.maintainingSources.delete(a)}}async replaceSource(a,b){if(await this.initialize(),this.disposed||!this.acceptingCalls||this.changingSources.has(a))throw new w;this.cancelRecovery(a);let c=this.owners.find(b=>b.source===a);this.changingSources.add(a);try{if(c&&this.releaseOwner(c),this.disposed)throw Error("Global plugin runtime has been disposed");if((0,k.N)(),this.packageDiagnostics.delete(a),null!==b){if(await this.loadPackage(a,b),this.disposed)throw Error("Global plugin runtime has been disposed");let c=this.packageDiagnostics.get(a);if(c?.status==="failed")throw Error(c.error?.message??"插件加载失败")}}finally{this.changingSources.delete(a),this.publishChanges()}}ownerPublished(a){return a.active&&!a.draining&&!this.changingSources.has(a.source)&&this.owners.includes(a)}readDiagnostics(){return{packages:[...this.packageDiagnostics.values()].sort((a,b)=>a.source.localeCompare(b.source)).map(a=>structuredClone(a)),loadError:this.loadError}}readCapabilityRegistrations(){return[...this.owners].filter(a=>this.ownerPublished(a)).sort((a,b)=>a.source.localeCompare(b.source)).map(a=>({source:a.source,methods:[...this.methods.values()].filter(b=>b.owner===a).sort((a,b)=>{let c=a.pluginName.localeCompare(b.pluginName);return 0===c?a.method.localeCompare(b.method):c}).map(({pluginName:a,method:b})=>({pluginName:a,method:b})),browserEntries:[...this.browserEntries.values()].filter(b=>b.owner===a).sort((a,b)=>a.pluginName.localeCompare(b.pluginName)).map(({pluginName:a})=>({pluginName:a})),messageDeclarations:[...this.declarations.values()].filter(b=>b.owner===a).sort((a,b)=>{let c=a.pluginName.localeCompare(b.pluginName);return 0===c?a.declarationName.localeCompare(b.declarationName):c}).map(({pluginName:a,declarationName:b,declaration:c})=>({pluginName:a,declarationName:b,priority:c.priority}))}))}async prepareReload(){if(await this.initialize(),this.disposed)throw Error("Global plugin runtime has been disposed");if(!this.acceptingCalls||this.changingSources.size>0||this.maintainingSources.size>0||this.owners.some(a=>a.activeCalls.size>0))throw new w;for(let a of(this.acceptingCalls=!1,this.recoveries.keys()))this.cancelRecovery(a);for(let a of this.owners)a.draining=!0;await Promise.all([...this.owners].reverse().map(async a=>{let b=a.beforeReload;if(!b)return;a.beforeReload=null;let c=new AbortController;await q({owner:a,phase:"beforeReload",execute:()=>b({signal:c.signal}),onTimeout:()=>c.abort()})}))}bindWorkSessionProvider(a){if(this.disposed)throw Error("Global plugin runtime has been disposed");return this.workSessionProvider=a,()=>{this.workSessionProvider===a&&(this.workSessionProvider=null)}}bindPushSender(a){if(this.disposed)throw Error("Global plugin runtime has been disposed");return this.pushSender=a,()=>{this.pushSender===a&&(this.pushSender=null)}}bindAppRuntimeSink(a){if(this.disposed)throw Error("Global plugin runtime has been disposed");return this.appRuntimeSink=a,()=>{this.appRuntimeSink===a&&(this.appRuntimeSink=null)}}async runOwnedCall(a,b){let c;if(this.ensureOwnerActive(a),this.maintainingSources.has(a.source))throw new w;let d=new AbortController,e=new Promise((a,b)=>{c=b}),f=()=>{c(Error("Pi Desk Plugin owner is no longer active"))};d.signal.addEventListener("abort",f,{once:!0}),a.activeCalls.add(d);try{let c=await Promise.race([Promise.resolve().then(()=>(this.ensureOwnerActive(a),b(d.signal))),e]);return this.ensureOwnerActive(a),c}finally{a.activeCalls.delete(d),d.signal.removeEventListener("abort",f)}}async invoke(a,b,c){if(await this.initialize(),this.disposed)throw Error("Global plugin runtime has been disposed");if(!this.acceptingCalls)throw new w;let d=(0,m.FX)(a),e=(0,m.QK)(b),f=this.methods.get((0,m.$m)(d,e));if(!f)throw new m.Tk(d,e);if(!this.ownerPublished(f.owner)||this.changingSources.has(f.owner.source))throw new w;let g=(0,m.nJ)(c,"input");return this.runOwnedCall(f.owner,async a=>{let b=await f.execute(g,{signal:a});return(0,m.nJ)(b,"output")})}async listCapabilityDeclarations(){if(await this.initialize(),this.disposed||!this.acceptingCalls)throw new w;let a=await Promise.all([...this.capabilityLoaders].filter(([,a])=>this.ownerPublished(a.owner)&&!this.changingSources.has(a.owner.source)).map(async([a,b])=>{try{return await this.runOwnedCall(b.owner,async c=>{let d=await b.load({signal:c});if(this.capabilityLoaders.get(a)!==b)throw Error(`能力声明已被替换:${a}`);return[a,j.dO.parse(d)]})}catch(b){throw Error(`读取 ${a} 能力选项失败:${p(b)}`,{cause:b})}}));return Object.fromEntries(a)}async listBrowserEntries(){return await this.initialize(),[...this.browserEntries.values()].filter(a=>this.ownerPublished(a.owner)).sort((a,b)=>a.pluginName.localeCompare(b.pluginName)).flatMap(({pluginName:a,entryPath:b,resourceKey:c,snapshot:d})=>d?[{pluginName:a,entryPath:b,resourceKey:c,snapshot:d}]:[])}async listMessageDeclarations(){return await this.initialize(),this.readMessageDeclarations()}readMessageDeclarations(){return[...this.declarations.values()].filter(a=>this.ownerPublished(a.owner)).sort((a,b)=>{let c=a.pluginName.localeCompare(b.pluginName);return 0===c?a.declarationName.localeCompare(b.declarationName):c}).map(({pluginName:a,declarationName:b,declaration:c})=>({pluginName:a,declarationName:b,declaration:c}))}async dispose(){if(this.disposed)return;for(let a of(this.disposed=!0,this.lifetime.abort(),this.recoveries.keys()))this.cancelRecovery(a);this.acceptingCalls=!1,this.changeListeners.clear(),this.workSessionProvider=null,this.pushSender=null;let a=[...new Set([...this.owners,...this.loadingOwners])].reverse();this.owners.length=0,this.loadingOwners.clear(),await Promise.all(a.map(a=>this.releaseOwner(a))),this.methods.clear(),this.pluginOwners.clear(),this.browserEntries.clear(),this.declarations.clear(),this.capabilityLoaders.clear(),this.appRuntimeSink=null}async loadConfiguredPackages(){for(let a of(this.loadError=null,this.packageDiagnostics.clear(),await this.packageProvider())){if(this.disposed)return;let b=await this.loadPackage(a.source,a.installedPath);b&&!this.disposed&&this.recoveries.set(a.source,{installedPath:a.installedPath,settled:b.execution,controller:new AbortController})}for(let[a,b]of this.recoveries)this.recoverSource(a,b)}cancelRecovery(a){let b=this.recoveries.get(a);this.recoveries.delete(a),b?.controller.abort()}async recoverSource(a,b){let c,d=b.controller.signal,e=new Promise((a,b)=>{c=()=>b(d.reason),d.addEventListener("abort",c,{once:!0})});try{await Promise.race([b.settled,e]),d.throwIfAborted(),console.info("[Pi Desk][GlobalPluginRuntime] 插件加载超时,稍后自动重试一次",{source:a,delayMs:1e4}),await (0,f.setTimeout)(1e4,void 0,{signal:d}),d.throwIfAborted(),this.recoveries.delete(a),await this.replaceSource(a,b.installedPath),console.info("[Pi Desk][GlobalPluginRuntime] 插件自动重试成功",{source:a})}catch(b){d.aborted||console.warn("[Pi Desk][GlobalPluginRuntime] 插件自动重试失败,不再自动加载",{source:a,message:p(b)})}finally{d.removeEventListener("abort",c),this.recoveries.get(a)===b&&this.recoveries.delete(a)}}async loadOwnerWithinDeadline(a,b,c){let d,e="entry",f=performance.now(),g=()=>{let b=Math.round(performance.now()-f);b<1e3||console.info("[Pi Desk][GlobalPluginRuntime] 插件加载阶段耗时",{source:a.source,packageName:a.packageName,phase:e,durationMs:b})},h=a=>{g(),e=a,f=performance.now()},i=(async()=>{let d=()=>h("setup");void 0!==b?await this.loadEntryOwner(a,b,d):await this.loadLegacyOwner(a,c,d),h("resources");try{await this.validateOwnerResources(a)}catch(a){throw new x("resources",a)}this.ensureOwnerActive(a)})();try{await Promise.race([i,new Promise((a,b)=>{d=setTimeout(()=>{b(new y(e,i))},15e3)})])}finally{d&&clearTimeout(d),g()}}async loadPackage(a,b){let c,d=performance.now(),e=(0,h.resolve)(b);try{let a=(0,h.join)(e,"package.json");c=JSON.parse(await (0,g.readFile)(a,"utf8"))}catch(b){return this.packageDiagnostics.set(a,{source:a,packageName:null,version:null,pluginName:null,status:"failed",error:{phase:"package",message:p(b)}}),null}let f=c.piDesk?.entry,i=c.piDesk?.global;if(void 0===f&&void 0===i||this.disposed)return null;let j={source:a,packageName:"string"==typeof c.name?c.name:null,version:"string"==typeof c.version?c.version:null,packageRoot:e,active:!0,draining:!1,pluginNames:new Set,activeCalls:new Set,subscriptions:new Set,pendingCleanup:new Set,beforeReload:null,disposer:null};console.info("[Pi Desk][GlobalPluginRuntime] 开始加载 Pi Desk Plugin",{source:a,packageName:j.packageName}),this.loadingOwners.add(j);try{await this.loadOwnerWithinDeadline(j,f,i),this.owners.push(j),this.recordOwnerDiagnostic(j),console.info("[Pi Desk][GlobalPluginRuntime] Pi Desk Plugin 已加载",{source:a,packageName:j.packageName,pluginNames:[...j.pluginNames],methodCount:[...this.methods.values()].filter(a=>a.owner===j).length,browserEntryCount:[...this.browserEntries.values()].filter(a=>a.owner===j).length,declarationCount:[...this.declarations.values()].filter(a=>a.owner===j).length,durationMs:Math.round(performance.now()-d)})}catch(f){let b=f instanceof x?f.phase:"entry",c=[...j.pluginNames][0]??null;await this.releaseOwner(j);let e=p(f);if(this.packageDiagnostics.set(a,{source:a,packageName:j.packageName,version:j.version,pluginName:c,status:"failed",error:{phase:b,message:e}}),console.warn("[Pi Desk][GlobalPluginRuntime] Pi Desk Plugin 加载失败",{source:a,packageName:j.packageName,phase:b,errorName:f instanceof Error?f.name:"UnknownError",message:e,durationMs:Math.round(performance.now()-d)}),f instanceof y)return{execution:f.execution.catch(()=>{}).then(async()=>{await Promise.allSettled([...j.pendingCleanup])})}}finally{this.loadingOwners.delete(j)}return null}async loadEntryOwner(a,b,c){let d=o(a.packageRoot,b,"piDesk.entry");if(!(await (0,g.stat)(d)).isFile())throw Error("Pi Desk Plugin entry is not a file");let e=(await (0,k.G)(d,a.packageRoot)).default;if(!e||"object"!=typeof e||"string"!=typeof e.name||"function"!=typeof e.setup)throw Error("Pi Desk Plugin entry must default-export definePiDeskPlugin(...)");let f=(0,m.FX)(e.name);this.claimPluginName(a,f),c();try{let b=function(a){if(void 0===a)return{beforeReload:null,disposer:null};if("function"==typeof a)return{beforeReload:null,disposer:a};if(!a||"object"!=typeof a)throw Error("Pi Desk Plugin setup must return void, a disposer, or a lifecycle object");if(void 0!==a.beforeReload&&"function"!=typeof a.beforeReload)throw Error("Pi Desk Plugin lifecycle.beforeReload must be a function");if(void 0!==a.dispose&&"function"!=typeof a.dispose)throw Error("Pi Desk Plugin lifecycle.dispose must be a function");return{beforeReload:a.beforeReload??null,disposer:a.dispose??null}}(await e.setup(this.createPiDeskFacade(a,f,a.packageRoot)));if(a.beforeReload=b.beforeReload,a.disposer=b.disposer,!a.active||this.disposed)throw await this.releaseOwner(a),Error("插件初始化完成时 Owner 已失效")}catch(a){throw new x("setup",a)}}async loadLegacyOwner(a,b,c){let d=o(a.packageRoot,b,"piDesk.global");if(!(await (0,g.stat)(d)).isFile())throw Error("Global Plugin entry is not a file");let e=await (0,k.G)(d,a.packageRoot);if("function"!=typeof e.default)throw Error("Global Plugin entry must default-export a factory function");let f=e.default;c();try{let b=await f(this.createLegacyApi(a));if(void 0!==b&&"function"!=typeof b)throw Error("Global Plugin factory must return void or a disposer function");if(a.disposer=b??null,!a.active||this.disposed)throw await this.releaseOwner(a),Error("插件初始化完成时 Owner 已失效")}catch(a){throw new x("setup",a)}}claimPluginName(a,b){this.ensureOwnerActive(a);let c=this.pluginOwners.get(b);if(c&&c!==a)throw Error(`Pi Desk pluginName is already registered: ${b}`);this.pluginOwners.set(b,a),a.pluginNames.add(b)}createLegacyApi(a){return{bindPlugin:b=>{let c=(0,m.FX)(b);return this.claimPluginName(a,c),{name:c,registerMethod:(b,d)=>this.registerMethod(a,c,b,d)}}}}createPiDeskFacade(a,b,c){return{name:b,host:{settings:{getSnapshot:()=>{if(this.ensureOwnerActive(a),!this.hostSettings)throw Error("宿主共享设置尚未就绪");return this.hostSettings.getSnapshot()},subscribe:b=>{if(this.ensureOwnerActive(a),!this.hostSettings)throw Error("宿主共享设置尚未就绪");let c=this.hostSettings.subscribe(()=>{a.active&&!a.draining&&b()});return a.subscriptions.add(c),()=>{if(a.subscriptions.delete(c))return c()}}},workSessions:{listWorkSessions:async()=>{this.ensureOwnerActive(a);let b=await this.readWorkSessions();return this.ensureOwnerActive(a),b}}},notifications:{publish:c=>(this.ensureOwnerActive(a),this.requireAppRuntimeSink().publishNotification(b,c)),update:(c,d)=>{this.ensureOwnerActive(a),this.requireAppRuntimeSink().updateNotification(b,c,d)},delete:c=>{this.ensureOwnerActive(a),this.requireAppRuntimeSink().deleteNotification(b,c)}},setState:c=>{this.ensureOwnerActive(a),this.requireAppRuntimeSink().setState(b,c)},registerMethod:(c,d)=>this.registerMethod(a,b,c,d),registerBrowserEntry:d=>{if(this.ensureOwnerActive(a),this.browserEntries.has(b))throw Error(`Browser Entry is already registered: ${b}`);let f=o(c,d,"browserEntry"),g={pluginName:b,entryPath:f,resourceKey:(0,e.randomUUID)(),snapshot:null,owner:a};return this.browserEntries.set(b,g),this.registrationDisposer(a,()=>{this.browserEntries.get(b)===g&&this.browserEntries.delete(b)})},declareCapabilities:c=>{if(this.ensureOwnerActive(a),"function"!=typeof c)throw Error("能力声明必须是按需查询函数");if(this.capabilityLoaders.has(b))throw Error(`能力声明已注册:${b}`);let d={load:c,owner:a};return this.capabilityLoaders.set(b,d),this.registrationDisposer(a,()=>{this.capabilityLoaders.get(b)===d&&this.capabilityLoaders.delete(b)})},declareMessage:(c,d)=>this.registerDeclaration(a,b,c,d),pushGlobal:(c,d)=>{a.active&&!a.draining&&this.sendPush(b,{scope:"global"},c,d)},pushSession:(c,d,e)=>{a.active&&!a.draining&&this.sendPush(b,{scope:"session",source:s.parse(c)},d,e)}}}registerMethod(a,b,c,d){this.ensureOwnerActive(a);let e=(0,m.QK)(c),f=(0,m.$m)(b,e);if(this.methods.has(f))throw new m.qs(b,e);let g={pluginName:b,method:e,execute:d,owner:a};return this.methods.set(f,g),this.registrationDisposer(a,()=>{this.methods.get(f)===g&&this.methods.delete(f)})}registerDeclaration(a,b,c,d){var e;this.ensureOwnerActive(a);let f=u.parse(c);if(!d||"object"!=typeof d||"function"!=typeof d.match||"function"!=typeof d.project)throw Error("Message Declaration must provide match and project functions");let g={priority:(e=d.priority,v.parse(e)),match:d.match,project:d.project},h=`${b}\u0000${f}`;if(this.declarations.has(h))throw Error(`Message Declaration is already registered: ${b}/${f}`);let i={pluginName:b,declarationName:f,declaration:g,owner:a};return this.declarations.set(h,i),this.registrationDisposer(a,()=>{this.declarations.get(h)===i&&this.declarations.delete(h)})}registrationDisposer(a,b){let c=!0;return()=>{c&&(c=!1,a.active&&b())}}requireAppRuntimeSink(){if(!this.appRuntimeSink)throw Error("App Runtime sink has not been bound");return this.appRuntimeSink}sendPush(a,b,c,d){if(this.disposed)return;let e=(0,m.QK)(c),f=function(a){let b=r.parse(a);if(Buffer.byteLength(JSON.stringify(b),"utf8")>65536)throw Error("Plugin Push data exceeds 64KB");return b}(d);this.pushSender?.({pluginName:a,target:b,event:e,data:structuredClone(f)})}async readWorkSessions(){if(!this.workSessionProvider||this.disposed)return[];let a=await this.workSessionProvider();return i.YO(t).parse(a).map(a=>structuredClone(a))}async validateOwnerResources(a){for(let b of[...this.browserEntries.values()].filter(b=>b.owner===a)){if(!(await (0,g.stat)(b.entryPath)).isFile())throw Error("Browser Entry resource is not a file");if("entry.js"!==(0,h.basename)(b.entryPath))throw Error("Browser Entry resource file must be named entry.js");let c=await (0,l.f)(b.entryPath);if(this.ensureOwnerActive(a),[...this.browserEntries.values()].reduce((a,b)=>a+(b.snapshot?.size??0),0)+c.size>0x8000000)throw Error("Browser 模块快照总量超过128MB,拒绝加载此插件");b.snapshot=c}}recordOwnerDiagnostic(a){this.packageDiagnostics.set(a.source,{source:a.source,packageName:a.packageName,version:a.version,pluginName:[...a.pluginNames][0]??null,status:"ready",error:null})}ensureOwnerActive(a){if(!a.active||a.draining||this.disposed)throw Error("Pi Desk Plugin owner is no longer active")}async releaseOwner(a){let b=[...a.subscriptions];if(a.subscriptions.clear(),a.active){for(let b of(a.active=!1,a.activeCalls))b.abort();a.activeCalls.clear();let b=this.owners.indexOf(a);for(let[c,d]of(b>=0&&this.owners.splice(b,1),this.methods))d.owner===a&&this.methods.delete(c);for(let[b,c]of this.browserEntries)c.owner===a&&this.browserEntries.delete(b);for(let[b,c]of this.declarations)c.owner===a&&this.declarations.delete(b);for(let[b,c]of this.capabilityLoaders)c.owner===a&&this.capabilityLoaders.delete(b);for(let b of a.pluginNames)if(this.pluginOwners.get(b)===a){this.pluginOwners.delete(b);try{this.appRuntimeSink?.releasePlugin(b)}catch(a){console.warn("[Pi Desk][GlobalPluginRuntime] 清理插件 App Runtime 失败",{pluginName:b,errorName:a instanceof Error?a.name:"UnknownError",message:p(a)})}}a.pluginNames.clear()}let c=a.beforeReload,d=a.disposer;a.beforeReload=null,a.disposer=null;let e=new AbortController;await Promise.all([...b.map(b=>q({owner:a,phase:"dispose",execute:b})),c?q({owner:a,phase:"beforeReload",execute:()=>c({signal:e.signal}),onTimeout:()=>e.abort()}):Promise.resolve(),d?q({owner:a,phase:"dispose",execute:d}):Promise.resolve()])}}d()}catch(a){d(a)}})},46107:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Nx:()=>n,cY:()=>m,sv:()=>o,to:()=>l});var e=c(73024),f=c(76760),g=c(77598),h=c(75430),i=c(59473),j=c(58417),k=a([h]);h=(k.then?(await k)():k)[0];let n="https://registry.npmjs.org",o="https://mirrors.cloud.tencent.com/npm",p=i.Ik({downloadSource:j.w3.default({mode:"auto"}),disabled:i.YO(i.Yj()).max(2e3).default([]),registries:i.g1(i.Yj(),j.SZ).default({}),updateTags:i.g1(i.Yj(),j.mR).default({})}).strict();function l(a=(0,h.getAgentDir)()){let b=(0,f.join)(a,"pi-desk-plugins.json");return(0,e.existsSync)(b)?p.parse(JSON.parse((0,e.readFileSync)(b,"utf8"))):p.parse({})}function m(a,b=(0,h.getAgentDir)()){!function(a,b){let c=(0,f.join)(a,"pi-desk-plugins.json"),d=p.parse(b(l(a)));(0,e.mkdirSync)((0,f.dirname)(c),{recursive:!0});let h=`${c}.${(0,g.randomUUID)()}.tmp`;try{(0,e.writeFileSync)(h,`${JSON.stringify(d,null,2)}
19
+ …诊断过长,已截断`:b,this.extensionMode="basic",this.updateBackgroundTasks([]),this.initialization=this.createInitialization(),console.warn("[Pi Desk][PiChatWorker] 扩展加载失败,切换基础聊天",{sessionId:this.sessionManager.getSessionId(),cwd:this.cwd,message:this.initializationError})}async createSession(a=!1){let b;try{b=await this.initialization.start(a)}catch(a){this.restoreBasicInitialization(a),b=await this.initialization.start()}if(this.disposed)throw this.initialization.dispose(),Error("Pi Worker 已释放");try{this.syncOwnerAppendedEntries()}catch(a){throw this.initialization.dispose(),a}return this.session=b,"normal"===this.extensionMode&&(this.initializationError=null),this.unsubscribeAgent=b.agent.subscribe(a=>{this.session===b&&this.handleAgentEvent(a)}),this.toolRuntimeLease=(0,n.s)(b),this.toolRuntime=this.toolRuntimeLease.runtime,this.unsubscribeToolRuntime=this.toolRuntime.subscribe(a=>{this.session===b&&(this.emit(a),"message_update"===a.type&&"tool"===a.message.type&&"running"!==a.message.status&&this.flushLiveUpdates())}),this.unsubscribeSession=b.subscribe(a=>{this.session===b&&this.handleSessionEvent(a)}),this.backgroundTaskIds.size>0&&this.emitBackgroundTasks(),this.emitRuntime(),b}syncOwnerAppendedEntries(){for(let a of this.sessionManager.getEntries().slice(this.observedEntryCount))this.onEntryAppended(a)}validateFinalInput(a,b,c){let d=this.activeValidation;if(!d)return{action:"continue"};try{let e=c??"prompt";if("follow_up"===d.requestedMode&&"followUp"!==e&&!(d.allowIdleFollowUp&&"prompt"===e))throw Error("主 Agent 已空闲,不能添加 Follow-up");d.mode=e;let f=this.session;if(!f)throw Error("Pi AgentSession 尚未就绪");let g=(0,l.qc)(a,b,f.resourceLoader.getSkills().skills,f.promptTemplates);if(g.images.length>0&&!f.model?.input.includes("image"))throw Error("当前模型不支持图片输入");if(d.prepared=g,"prompt"===d.mode)this.pendingPrompt={tempId:d.tempId,input:g};else{let a="steer"===d.mode?this.steeringQueue:this.followUpQueue,b={tempId:d.tempId,input:g,confirmed:!1};(0,l.mu)([...this.steeringQueue.map(a=>a.input),...this.followUpQueue.map(a=>a.input),g]),a.push(b)}return{action:"continue"}}catch(a){return d.error=a instanceof Error?a:Error("聊天输入校验失败"),{action:"handled"}}}cancelPreflightOperation(a){a.compactionStarted&&(a.compactionStarted=!1,this.emit({type:"main_operation_cancelled"}))}finishObservedSend(a){this.reconcileAppendedEntries(),this.activeValidation===a&&(this.activeValidation=null),this.pendingPrompt?.tempId===a.tempId&&(this.pendingPrompt=null,this.discardPresentedInput(a.tempId)),this.removeUnconfirmedQueueItem(a.tempId)&&(this.discardPresentedInput(a.tempId),this.emitRuntime())}removeUnconfirmedQueueItem(a){for(let b of[this.steeringQueue,this.followUpQueue]){let c=b.findIndex(b=>b.tempId===a&&!b.confirmed);if(c>=0)return b.splice(c,1),!0}return!1}observeRun(a){this.observedRunPromises.add(a),a.finally(()=>this.observedRunPromises.delete(a))}handleAgentEvent(a){if(!this.disposed&&!this.treeNavigation)switch(a.type){case"agent_start":this.oversizedToolCallAbortRequested=!1,this.emit({type:"agent_started"});return;case"agent_end":this.oversizedToolCallAbortRequested=!1,this.reconcileAppendedEntries();return;case"message_start":if(this.abortOversizedStreamingToolCall(a.message))return;this.startMessage(a.message);return;case"message_update":if(this.abortOversizedStreamingToolCall(a.message))return;this.updateMessage(a.message),this.toolRuntime?.syncStreamingTools(a.message);return;case"message_end":this.toolRuntime?.syncStreamingTools(a.message),this.endMessage(a.message);return;default:return}}abortOversizedStreamingToolCall(a){let b=function(a){if("assistant"!==t(a))return null;let b=a.content;if(!Array.isArray(b))return null;for(let a of b)if(!(!a||"object"!=typeof a||Array.isArray(a))&&"toolCall"===a.type&&"string"==typeof a.partialJson&&!(a.partialJson.length<=262144))return{toolCallId:"string"==typeof a.id?a.id:null,toolName:"string"==typeof a.name?a.name:null,argumentChars:a.partialJson.length};return null}(a);return!!b&&(this.oversizedToolCallAbortRequested||this.session?.agent.signal?.aborted||(this.oversizedToolCallAbortRequested=!0,console.warn("[Pi Desk][PiChatWorker] 工具参数流过大,已中止当前运行,交由 Pi 重试策略处理",{sessionId:this.sessionManager.getSessionId(),toolCallId:b.toolCallId,toolName:b.toolName,argumentChars:b.argumentChars,maxArgumentChars:262144}),this.session?.agent.abort()),!0)}handleSessionEvent(a){if(!this.disposed)switch(a.type){case"queue_update":this.handleQueueUpdate(a.steering,a.followUp);return;case"agent_end":a.willRetry&&(this.toolRuntime?.size??0)>0&&(console.warn("[Pi Desk][PiChatWorker] 自动重试前丢弃未闭合 ToolCall",{sessionId:this.sessionManager.getSessionId(),toolCount:this.toolRuntime?.size??0}),this.toolRuntime?.discardAll());return;case"agent_settled":this.oversizedToolCallAbortRequested=!1,this.reconcileAppendedEntries(),this.toolRuntime?.discardAll(),this.emitRuntime(),this.emit({type:"agent_settled"});return;case"compaction_start":if(this.messageGate.pause(),console.info("[Pi Desk][PiChatWorker] 上下文压缩开始",{sessionId:this.session?.sessionId,reason:a.reason}),this.activeCompactionTempId)console.warn("[Pi Desk][PiChatWorker] 已忽略重复的上下文压缩开始事件",{sessionId:this.session?.sessionId,reason:a.reason});else{let a=(0,e.randomUUID)();this.activeCompactionTempId=a,this.emit({type:"message_start",tempId:a,message:function(a=""){return{type:"compaction",summary:a}}()})}this.activeValidation&&(this.activeValidation.compactionStarted=!0),this.emit({type:"agent_started"});return;case"compaction_end":if(a.errorMessage?console.error("[Pi Desk][PiChatWorker] 上下文压缩失败",{sessionId:this.session?.sessionId,reason:a.reason,errorMessage:a.errorMessage}):console.info("[Pi Desk][PiChatWorker] 上下文压缩结束",{sessionId:this.session?.sessionId,reason:a.reason,aborted:a.aborted,compacted:void 0!==a.result,willRetry:a.willRetry}),a.result){let b=this.activeCompactionTempId;this.reconcileAppendedEntries(),b&&this.activeCompactionTempId===b&&(console.error("[Pi Desk][PiChatWorker] 压缩成功但未找到对应 CompactionEntry",{sessionId:this.session?.sessionId,reason:a.reason}),this.discardActiveCompaction())}else this.discardActiveCompaction();this.emitRuntime(),"manual"===a.reason&&(this.manualCompactionFinishPending=!0),this.scheduleCompactionMessageResume();return;case"thinking_level_changed":this.publishingModel||this.emitRuntime();return;case"entry_appended":this.treeNavigation||this.onEntryAppended(a.entry);return;case"session_info_changed":{let b=this.sessionManager.getLeafEntry();this.treeNavigation||b?.type!=="session_info"||this.onEntryAppended(b),this.emit({type:"session_info_changed",sessionTitle:a.name?.trim()||null});return}case"bash_execution_update":a.id&&this.updateBash(a.id,a.delta);return;default:return}}startMessage(a){let b,c=t(a),d=!0,f=!1,g=null;if("user"===c){let a=this.takeUserInput();b=a?.tempId??(0,e.randomUUID)(),f=this.presentedInputTempIds.delete(b)}else if("toolResult"===c){let c=(g=u(a))?this.toolRuntime?.tempId(g):null;b=c??(0,e.randomUUID)(),d=null===c}else b=(0,e.randomUUID)();let h=this.projectLiveMessage(a,g);h&&(this.activeMessage={tempId:b,started:d||f,toolCallId:g},this.emit({type:d&&!f?"message_start":"message_update",tempId:b,message:h}))}updateMessage(a){let b=this.activeMessage;if(!b)return;let c=this.projectLiveMessage(a,b.toolCallId);c&&this.emit({type:"message_update",tempId:b.tempId,message:c})}endMessage(a){let b=this.activeMessage,c=t(a),d="toolResult"===c?u(a):null;if(!b){let c=this.projectLiveMessage(a,d);if(!c)return;b={tempId:(0,e.randomUUID)(),started:!0,toolCallId:d},this.emit({type:"message_start",tempId:b.tempId,message:c})}let f=this.projectLiveMessage(a,b.toolCallId);f&&this.emit({type:"message_update",tempId:b.tempId,message:f});let g=this.sessionManager.getLeafEntry(),h=g?(0,m.B4)(g):null;g&&h?(this.onEntryAppended(g),this.committedEntryIds.add(g.id),this.observedEntryCount=this.sessionManager.getEntries().length,this.emit({type:"message_commit",tempId:b.tempId,entryId:h.entryId,timestampMs:h.timestampMs,message:f??h.message}),this.emitRuntime()):b.started&&this.emit({type:"message_discard",tempId:b.tempId}),b.toolCallId&&this.toolRuntime?.remove(b.toolCallId),this.activeMessage=null}projectLiveMessage(a,b){return"toolResult"===t(a)&&b?this.toolRuntime?.projectLiveResult(a,b)??null:(0,m.b7)(a)}takeUserInput(){if(this.pendingPrompt){let a=this.pendingPrompt;return this.pendingPrompt=null,a}let a=this.steeringQueue.shift()??this.followUpQueue.shift();return a?(this.applyPendingQueueText(),this.emitRuntime(),{tempId:a.tempId,input:a.input}):null}startBash(a,b){let c={tempId:(0,e.randomUUID)(),executionId:a,command:b,output:"",status:"running"};this.bashTempsById.set(a,c),this.emit({type:"message_start",tempId:c.tempId,message:this.bashMessage(c)})}updateBash(a,b){let c=this.bashTempsById.get(a);c&&"running"===c.status&&(c.output+=b,this.emit({type:"message_update",tempId:c.tempId,message:this.bashMessage(c)}))}completeBash(a,b){let c=this.bashTempsById.get(a);if(!c)return;c.output=b.output,c.status=b.cancelled?"aborted":0===b.exitCode?"completed":"error",this.emit({type:"message_update",tempId:c.tempId,message:this.bashMessage(c)}),this.flushLiveUpdates();let d=this.sessionManager.getLeafEntry(),e=d?(0,m.B4)(d):null;d&&e?.message.type==="bash"&&e.message.command===c.command&&(this.onEntryAppended(d),this.commitBash(c,e))}commitBash(a,b){this.flushLiveUpdates(),this.committedEntryIds.add(b.entryId),this.observedEntryCount=this.sessionManager.getEntries().length,this.emit({type:"message_commit",tempId:a.tempId,entryId:b.entryId,timestampMs:b.timestampMs,message:b.message}),this.bashTempsById.delete(a.executionId)}discardBash(a){let b=this.bashTempsById.get(a);b&&(this.bashTempsById.delete(a),this.emit({type:"message_discard",tempId:b.tempId}))}bashMessage(a){return{type:"bash",command:a.command,status:a.status,output:a.output,declaration:{message:{kind:"bash",command:a.command,output:a.output,exitCode:"completed"===a.status?0:null,cancelled:"aborted"===a.status,truncated:!1},raw:{executionId:a.executionId,command:a.command,output:a.output,status:a.status}}}}handleQueueUpdate(a,b){this.confirmAndSyncQueue("steering",a),this.confirmAndSyncQueue("followUp",b),this.emitRuntime()}confirmAndSyncQueue(a,b){let c="steering"===a?this.steeringQueue:this.followUpQueue;for(let a of c)a.confirmed=!0;c.length!==b.length?this.pendingQueueText.set(a,b):(c.forEach((a,c)=>{a.input.text=b[c]??a.input.text}),this.pendingQueueText.delete(a))}applyPendingQueueText(){for(let a of["steering","followUp"]){let b=this.pendingQueueText.get(a);b&&this.confirmAndSyncQueue(a,b)}}reconcileAppendedEntries(){if(this.treeNavigation)return;let a=this.sessionManager.getEntries(),b=a.slice(this.observedEntryCount);for(let c of(this.observedEntryCount=a.length,b)){if(this.onEntryAppended(c),this.committedEntryIds.has(c.id))continue;let a=(0,m.B4)(c);if(!a)continue;if("compaction"===c.type&&this.activeCompactionTempId){let b=this.activeCompactionTempId;this.activeCompactionTempId=null,this.committedEntryIds.add(c.id),this.emit({type:"message_commit",tempId:b,entryId:a.entryId,timestampMs:z(c.id,c.timestamp),message:a.message});continue}if("bash"===a.message.type){let b=a.message.command,c=[...this.bashTempsById.values()].reverse().find(a=>a.command===b);if(c){this.commitBash(c,a);continue}}let b=(0,e.randomUUID)();this.committedEntryIds.add(c.id),this.emit({type:"message_start",tempId:b,message:a.message}),this.emit({type:"message_commit",tempId:b,entryId:a.entryId,timestampMs:z(c.id,c.timestamp),message:a.message})}}discardActiveCompaction(){let a=this.activeCompactionTempId;a&&(this.activeCompactionTempId=null,this.emit({type:"message_discard",tempId:a}))}updateBackgroundTasks(a){let b=new Set(a);if(!(b.size===this.backgroundTaskIds.size&&[...b].every(a=>this.backgroundTaskIds.has(a)))){for(let a of(this.backgroundTaskIds.clear(),b))this.backgroundTaskIds.add(a);this.emitBackgroundTasks()}}emitBackgroundTasks(){this.emit({type:"background_tasks_changed",taskIds:[...this.backgroundTaskIds]})}runtimeSnapshot(){let a=this.session,b=a?.model,c=a?.getContextUsage(),d=this.acceptedInputs.filter(a=>a.deferredByCompaction&&"auto"===a.input.mode).map(x),e=this.acceptedInputs.filter(a=>a.deferredByCompaction&&"follow_up"===a.input.mode).map(x);return{extensionMode:this.extensionMode,initializationError:this.initializationError,queues:{steering:[...this.steeringQueue.map(w),...d],followUp:[...this.followUpQueue.map(w),...e]},model:b?{provider:b.provider,modelId:b.id,thinkingLevel:a.thinkingLevel}:null,contextUsage:c&&c.contextWindow>0?{tokens:c.tokens,contextWindow:c.contextWindow}:null,plugins:this.pluginRuntime.snapshot(),capabilityMode:this.capabilities.mode()}}emitRuntime(){this.session&&this.emit({type:"runtime_changed",runtime:this.runtimeSnapshot()})}emit(a){if(!this.disposed&&!this.treeNavigation){if("message_update"===a.type)return void this.scheduleLiveUpdate(a);this.flushLiveUpdates(),"message_start"===a.type?(this.clearLiveUpdate(a.tempId),this.liveUpdatesByTempId.set(a.tempId,{lastPublishedAt:Date.now(),pending:null,timer:null,receivedCount:0,publishedCount:0})):("message_commit"===a.type||"message_discard"===a.type)&&this.finishLiveUpdate(a.tempId),("message_commit"===a.type||"session_info_changed"===a.type)&&(0,p.xt)(this.cwd),this.publish(a)}}scheduleLiveUpdate(a){let b=this.liveUpdatesByTempId.get(a.tempId)??{lastPublishedAt:0,pending:null,timer:null,receivedCount:0,publishedCount:0};if(b.pending=a,b.receivedCount+=1,this.liveUpdatesByTempId.set(a.tempId,b),b.timer)return;let c=Date.now()-b.lastPublishedAt,d=Math.max(0,500-c);0===d?this.publishPendingLiveUpdate(b):b.timer=setTimeout(()=>{this.liveUpdatesByTempId.get(a.tempId)===b&&(b.timer=null,this.publishPendingLiveUpdate(b))},d)}publishPendingLiveUpdate(a){let b=a.pending;b&&!this.disposed&&(a.pending=null,a.lastPublishedAt=Date.now(),a.publishedCount+=1,this.publish(b))}flushLiveUpdates(){for(let a of this.liveUpdatesByTempId.values())a.timer&&clearTimeout(a.timer),a.timer=null,this.publishPendingLiveUpdate(a)}finishLiveUpdate(a){let b=this.liveUpdatesByTempId.get(a);this.clearLiveUpdate(a),b&&b.receivedCount!==b.publishedCount&&console.debug("[Pi Desk][PiChatWorker] 流式消息更新已合并",{sessionId:this.sessionManager.getSessionId(),tempId:a,receivedCount:b.receivedCount,publishedCount:b.publishedCount})}clearLiveUpdate(a){let b=this.liveUpdatesByTempId.get(a);b?.timer&&clearTimeout(b.timer),this.liveUpdatesByTempId.delete(a)}clearLiveUpdates(){for(let a of this.liveUpdatesByTempId.values())a.timer&&clearTimeout(a.timer);this.liveUpdatesByTempId.clear()}publish(a){for(let b of[...this.listeners])try{b(a)}catch(b){console.error("[Pi Desk][PiChatWorker] 事件监听器执行失败",{sessionId:this.sessionManager.getSessionId(),eventType:a.type,errorName:b instanceof Error?b.name:"UnknownError"})}}clearMemory(){this.steeringQueue.length=0,this.followUpQueue.length=0,this.pendingQueueText.clear(),this.bashTempsById.clear(),this.pendingPrompt=null,this.activeMessage=null,this.activeValidation=null,this.activeCompactionTempId=null,this.oversizedToolCallAbortRequested=!1,this.acceptedInputs.length=0,this.presentedInputTempIds.clear(),this.committedEntryIds.clear(),this.backgroundTaskIds.clear()}}d()}catch(a){d(a)}})},40333:(a,b,c)=>{c.d(b,{$m:()=>d.$m,FX:()=>d.FX,Pu:()=>d.Pu,QK:()=>d.QK,Tk:()=>d.Tk,nJ:()=>d.nJ,qs:()=>d.qs});var d=c(43969)},41904:(a,b,c)=>{c.d(b,{J:()=>f,a:()=>e});var d=c(59473);let e=d.Ik({locale:d.k5(["zh-CN","en"]),timeZone:d.Yj().trim().min(1).max(100).refine(a=>{try{return new Intl.DateTimeFormat("en",{timeZone:a}),!0}catch{return!1}},"无效的 IANA 时区")}).strict().readonly(),f=d.Ik({region:e}).strict().readonly()},41966:(a,b,c)=>{c.d(b,{L:()=>d});function d(a){if(!(a instanceof Error)||"PiDeskPluginMethodError"!==a.name)return!1;let b=a.code;return 400===b||404===b||409===b}},42520:(a,b,c)=>{c.d(b,{pL:()=>d});function d(a,b){let c=(globalThis.__piDeskNativePluginDiagnostics||(globalThis.__piDeskNativePluginDiagnostics=[]),globalThis.__piDeskNativePluginDiagnostics);!c.some(c=>c.cwd===a&&c.message===b)&&(c.push({cwd:a,message:b}),c.length>100&&c.splice(0,c.length-100))}},42633:(a,b,c)=>{c.d(b,{J8:()=>f,qf:()=>e});var d=c(59473);let e=d.KC([d.Yj(),d.Ik({default:d.Yj(),translations:d.g1(d.Yj().min(1).max(35),d.Yj()).refine(a=>Object.keys(a).length<=16,"too many translations")}).strict()]);function f(a,b){return{default:a,translations:{en:b}}}},43969:(a,b,c)=>{c.d(b,{$m:()=>g,FX:()=>h,Pu:()=>m,QK:()=>i,Tk:()=>k,nJ:()=>j,qs:()=>l});var d=c(59473);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=d.g1(d.Yj(),d.Pq());function g(a,b){return`${a}\u0000${b}`}function h(a){return e.parse(a)}function i(a){return e.parse(a)}function j(a,b){let c=f.parse(a);if(Buffer.byteLength(JSON.stringify(c),"utf8")>2097152)throw new m(b);return c}class k extends Error{constructor(a,b){super(`Plugin method was not found: ${a}/${b}`),this.name="L4PiPluginMethodNotFoundError"}}class l extends Error{constructor(a,b){super(`Plugin method is already registered: ${a}/${b}`),this.name="L4PiPluginMethodConflictError"}}class m extends Error{constructor(a){super(`Plugin method ${a} exceeds 2MB`),this.direction=a,this.name="L4PiPluginMethodPayloadTooLargeError"}}},44095:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{K:()=>z,y:()=>w});var e=c(77598),f=c(58500),g=c(51455),h=c(76760),i=c(59473),j=c(47511),k=c(58801),l=c(88502),m=c(43969),n=a([k]);k=(n.then?(await n)():n)[0];let r=i.g1(i.Yj(),i.Pq()),s=i.Ik({workId:i.Yj().trim().min(1),sessionId:i.Yj().trim().min(1),branchId:i.Yj().trim().min(1)}).strict(),t=i.Ik({source:s,cwd:i.Yj().trim().min(1),status:i.k5(["main_running","background_running","completed","idle"])}).strict(),u=i.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),v=i.ai().int().safe();class w extends Error{constructor(){super("插件运行时仍有调用正在执行"),this.name="L4PiPluginRuntimeBusyError"}}class x extends Error{constructor(a,b){super(b instanceof Error?b.message:String(b),{cause:b}),this.phase=a,this.name="L4PiPluginPhaseError"}}class y extends x{constructor(a,b){super(a,Error("插件加载超时,已停止本次加载")),this.execution=b,this.name="L4PiPluginLoadTimeoutError"}}function o(a,b,c){if("string"!=typeof b||!b.trim())throw Error(`package.json.${c} must be a non-empty string`);let d=(0,h.resolve)(a,b),e=(0,h.relative)(a,d);if(e.startsWith("..")||(0,h.isAbsolute)(e))throw Error(`package.json.${c} must stay inside the package root`);return d}function p(a){return a instanceof Error&&a.message?a.message:String(a)}async function q(a){let b=null,c=Promise.resolve().then(a.execute);a.owner.pendingCleanup.add(c);let d=()=>{a.owner.pendingCleanup.delete(c)};c.then(d,d);try{if(await Promise.race([c.then(()=>!0),new Promise(a=>{b=setTimeout(()=>a(!1),1500)})]))return;throw a.onTimeout?.(),Error(`插件 ${a.phase} 超时,关闭结果未确认`)}catch(b){console.warn("[Pi Desk][GlobalPluginRuntime] Pi Desk Plugin 生命周期执行失败",{source:a.owner.source,packageName:a.owner.packageName,phase:a.phase,timeoutMs:1500,message:p(b)})}finally{b&&clearTimeout(b)}}class z{constructor(a,b){this.packageProvider=a,this.hostSettings=b,this.methods=new Map,this.pluginOwners=new Map,this.browserEntries=new Map,this.declarations=new Map,this.capabilityLoaders=new Map,this.owners=[],this.loadingOwners=new Set,this.changeListeners=new Set,this.changingSources=new Set,this.maintainingSources=new Set,this.lifetime=new AbortController,this.packageDiagnostics=new Map,this.recoveries=new Map,this.initializePromise=null,this.initialized=!1,this.disposed=!1,this.acceptingCalls=!0,this.loadError=null,this.workSessionProvider=null,this.pushSender=null,this.appRuntimeSink=null}initialize(){return this.disposed?Promise.reject(Error("Global plugin runtime has been disposed")):this.initialized?Promise.resolve():(this.initializePromise||(this.initializePromise=this.loadConfiguredPackages().catch(a=>{this.loadError=p(a),console.error("[Pi Desk][GlobalPluginRuntime] 读取插件配置失败,核心应用继续启动",{errorName:a instanceof Error?a.name:"UnknownError",message:this.loadError})}).finally(()=>{this.initializePromise=null,this.initialized=!0,this.publishChanges()})),this.initializePromise)}subscribeChanges(a){return this.changeListeners.add(a),()=>this.changeListeners.delete(a)}publishChanges(){if(!this.disposed)for(let a of this.changeListeners)try{a()}catch(a){console.warn("[Pi Desk][GlobalPluginRuntime] 状态监听失败",{message:p(a)})}}async withSourceIdle(a,b,c,d){let e,g=AbortSignal.any([c,this.lifetime.signal]);g.throwIfAborted();let h=new Promise((a,b)=>{e=()=>b(g.reason),g.addEventListener("abort",e,{once:!0})});try{await Promise.race([this.initialize(),h])}finally{g.removeEventListener("abort",e)}if(g.throwIfAborted(),!this.acceptingCalls||this.changingSources.has(a)||this.maintainingSources.has(a))throw new w;this.cancelRecovery(a),this.maintainingSources.add(a);let i=performance.now()+15e3;try{for(;this.owners.some(b=>b.source===a&&b.activeCalls.size>0);){if(performance.now()>=i)throw Error(`插件 ${a} 的在途调用未在15秒内结束,本次维护失败,可稍后手动重试`);d(`插件 ${a} 仍有调用正在执行`),await (0,f.setTimeout)(250,void 0,{signal:g})}return g.throwIfAborted(),await b()}finally{this.maintainingSources.delete(a)}}async replaceSource(a,b){if(await this.initialize(),this.disposed||!this.acceptingCalls||this.changingSources.has(a))throw new w;this.cancelRecovery(a);let c=this.owners.find(b=>b.source===a);this.changingSources.add(a);try{if(c){let a=this.releaseOwner(c);null===b&&await a}if(this.disposed)throw Error("Global plugin runtime has been disposed");if((0,k.N)(),this.packageDiagnostics.delete(a),null!==b){if(await this.loadPackage(a,b),this.disposed)throw Error("Global plugin runtime has been disposed");let c=this.packageDiagnostics.get(a);if(c?.status==="failed")throw Error(c.error?.message??"插件加载失败")}}finally{this.changingSources.delete(a),this.publishChanges()}}ownerPublished(a){return a.active&&!a.draining&&!this.changingSources.has(a.source)&&this.owners.includes(a)}readDiagnostics(){return{packages:[...this.packageDiagnostics.values()].sort((a,b)=>a.source.localeCompare(b.source)).map(a=>structuredClone(a)),loadError:this.loadError}}readCapabilityRegistrations(){return[...this.owners].filter(a=>this.ownerPublished(a)).sort((a,b)=>a.source.localeCompare(b.source)).map(a=>({source:a.source,methods:[...this.methods.values()].filter(b=>b.owner===a).sort((a,b)=>{let c=a.pluginName.localeCompare(b.pluginName);return 0===c?a.method.localeCompare(b.method):c}).map(({pluginName:a,method:b})=>({pluginName:a,method:b})),browserEntries:[...this.browserEntries.values()].filter(b=>b.owner===a).sort((a,b)=>a.pluginName.localeCompare(b.pluginName)).map(({pluginName:a})=>({pluginName:a})),messageDeclarations:[...this.declarations.values()].filter(b=>b.owner===a).sort((a,b)=>{let c=a.pluginName.localeCompare(b.pluginName);return 0===c?a.declarationName.localeCompare(b.declarationName):c}).map(({pluginName:a,declarationName:b,declaration:c})=>({pluginName:a,declarationName:b,priority:c.priority}))}))}async prepareReload(){if(await this.initialize(),this.disposed)throw Error("Global plugin runtime has been disposed");if(!this.acceptingCalls||this.changingSources.size>0||this.maintainingSources.size>0||this.owners.some(a=>a.activeCalls.size>0))throw new w;for(let a of(this.acceptingCalls=!1,this.recoveries.keys()))this.cancelRecovery(a);for(let a of this.owners)a.draining=!0;await Promise.all([...this.owners].reverse().map(async a=>{let b=a.beforeReload;if(!b)return;a.beforeReload=null;let c=new AbortController;await q({owner:a,phase:"beforeReload",execute:()=>b({signal:c.signal}),onTimeout:()=>c.abort()})}))}bindWorkSessionProvider(a){if(this.disposed)throw Error("Global plugin runtime has been disposed");return this.workSessionProvider=a,()=>{this.workSessionProvider===a&&(this.workSessionProvider=null)}}bindPushSender(a){if(this.disposed)throw Error("Global plugin runtime has been disposed");return this.pushSender=a,()=>{this.pushSender===a&&(this.pushSender=null)}}bindAppRuntimeSink(a){if(this.disposed)throw Error("Global plugin runtime has been disposed");return this.appRuntimeSink=a,()=>{this.appRuntimeSink===a&&(this.appRuntimeSink=null)}}async runOwnedCall(a,b){let c;if(this.ensureOwnerActive(a),this.maintainingSources.has(a.source))throw new w;let d=new AbortController,e=new Promise((a,b)=>{c=b}),f=()=>{c(Error("Pi Desk Plugin owner is no longer active"))};d.signal.addEventListener("abort",f,{once:!0}),a.activeCalls.add(d);try{let c=await Promise.race([Promise.resolve().then(()=>(this.ensureOwnerActive(a),b(d.signal))),e]);return this.ensureOwnerActive(a),c}finally{a.activeCalls.delete(d),d.signal.removeEventListener("abort",f)}}async invoke(a,b,c){if(await this.initialize(),this.disposed)throw Error("Global plugin runtime has been disposed");if(!this.acceptingCalls)throw new w;let d=(0,m.FX)(a),e=(0,m.QK)(b),f=this.methods.get((0,m.$m)(d,e));if(!f)throw new m.Tk(d,e);if(!this.ownerPublished(f.owner)||this.changingSources.has(f.owner.source))throw new w;let g=(0,m.nJ)(c,"input");return this.runOwnedCall(f.owner,async a=>{let b=await f.execute(g,{signal:a});return(0,m.nJ)(b,"output")})}async listCapabilityDeclarations(){if(await this.initialize(),this.disposed||!this.acceptingCalls)throw new w;let a=await Promise.all([...this.capabilityLoaders].filter(([,a])=>this.ownerPublished(a.owner)&&!this.changingSources.has(a.owner.source)).map(async([a,b])=>{try{return await this.runOwnedCall(b.owner,async c=>{let d=await b.load({signal:c});if(this.capabilityLoaders.get(a)!==b)throw Error(`能力声明已被替换:${a}`);return[a,j.dO.parse(d)]})}catch(b){throw Error(`读取 ${a} 能力选项失败:${p(b)}`,{cause:b})}}));return Object.fromEntries(a)}async listBrowserEntries(){return await this.initialize(),[...this.browserEntries.values()].filter(a=>this.ownerPublished(a.owner)).sort((a,b)=>a.pluginName.localeCompare(b.pluginName)).flatMap(({pluginName:a,entryPath:b,resourceKey:c,snapshot:d})=>d?[{pluginName:a,entryPath:b,resourceKey:c,snapshot:d}]:[])}async listMessageDeclarations(){return await this.initialize(),this.readMessageDeclarations()}readMessageDeclarations(){return[...this.declarations.values()].filter(a=>this.ownerPublished(a.owner)).sort((a,b)=>{let c=a.pluginName.localeCompare(b.pluginName);return 0===c?a.declarationName.localeCompare(b.declarationName):c}).map(({pluginName:a,declarationName:b,declaration:c})=>({pluginName:a,declarationName:b,declaration:c}))}async dispose(){if(this.disposed)return;for(let a of(this.disposed=!0,this.lifetime.abort(),this.recoveries.keys()))this.cancelRecovery(a);this.acceptingCalls=!1,this.changeListeners.clear(),this.workSessionProvider=null,this.pushSender=null;let a=[...new Set([...this.owners,...this.loadingOwners])].reverse();this.owners.length=0,this.loadingOwners.clear(),await Promise.all(a.map(a=>this.releaseOwner(a))),this.methods.clear(),this.pluginOwners.clear(),this.browserEntries.clear(),this.declarations.clear(),this.capabilityLoaders.clear(),this.appRuntimeSink=null}async loadConfiguredPackages(){for(let a of(this.loadError=null,this.packageDiagnostics.clear(),await this.packageProvider())){if(this.disposed)return;let b=await this.loadPackage(a.source,a.installedPath);b&&!this.disposed&&this.recoveries.set(a.source,{installedPath:a.installedPath,settled:b.execution,controller:new AbortController})}for(let[a,b]of this.recoveries)this.recoverSource(a,b)}cancelRecovery(a){let b=this.recoveries.get(a);this.recoveries.delete(a),b?.controller.abort()}async recoverSource(a,b){let c,d=b.controller.signal,e=new Promise((a,b)=>{c=()=>b(d.reason),d.addEventListener("abort",c,{once:!0})});try{await Promise.race([b.settled,e]),d.throwIfAborted(),console.info("[Pi Desk][GlobalPluginRuntime] 插件加载超时,稍后自动重试一次",{source:a,delayMs:1e4}),await (0,f.setTimeout)(1e4,void 0,{signal:d}),d.throwIfAborted(),this.recoveries.delete(a),await this.replaceSource(a,b.installedPath),console.info("[Pi Desk][GlobalPluginRuntime] 插件自动重试成功",{source:a})}catch(b){d.aborted||console.warn("[Pi Desk][GlobalPluginRuntime] 插件自动重试失败,不再自动加载",{source:a,message:p(b)})}finally{d.removeEventListener("abort",c),this.recoveries.get(a)===b&&this.recoveries.delete(a)}}async loadOwnerWithinDeadline(a,b,c){let d,e="entry",f=performance.now(),g=()=>{let b=Math.round(performance.now()-f);b<1e3||console.info("[Pi Desk][GlobalPluginRuntime] 插件加载阶段耗时",{source:a.source,packageName:a.packageName,phase:e,durationMs:b})},h=a=>{g(),e=a,f=performance.now()},i=(async()=>{let d=()=>h("setup");void 0!==b?await this.loadEntryOwner(a,b,d):await this.loadLegacyOwner(a,c,d),h("resources");try{await this.validateOwnerResources(a)}catch(a){throw new x("resources",a)}this.ensureOwnerActive(a)})();try{await Promise.race([i,new Promise((a,b)=>{d=setTimeout(()=>{b(new y(e,i))},15e3)})])}finally{d&&clearTimeout(d),g()}}async loadPackage(a,b){let c,d=performance.now(),e=(0,h.resolve)(b);try{let a=(0,h.join)(e,"package.json");c=JSON.parse(await (0,g.readFile)(a,"utf8"))}catch(b){return this.packageDiagnostics.set(a,{source:a,packageName:null,version:null,pluginName:null,status:"failed",error:{phase:"package",message:p(b)}}),null}let f=c.piDesk?.entry,i=c.piDesk?.global;if(void 0===f&&void 0===i||this.disposed)return null;let j={source:a,packageName:"string"==typeof c.name?c.name:null,version:"string"==typeof c.version?c.version:null,packageRoot:e,active:!0,draining:!1,pluginNames:new Set,activeCalls:new Set,subscriptions:new Set,pendingCleanup:new Set,beforeReload:null,disposer:null};console.info("[Pi Desk][GlobalPluginRuntime] 开始加载 Pi Desk Plugin",{source:a,packageName:j.packageName}),this.loadingOwners.add(j);try{await this.loadOwnerWithinDeadline(j,f,i),this.owners.push(j),this.recordOwnerDiagnostic(j),console.info("[Pi Desk][GlobalPluginRuntime] Pi Desk Plugin 已加载",{source:a,packageName:j.packageName,pluginNames:[...j.pluginNames],methodCount:[...this.methods.values()].filter(a=>a.owner===j).length,browserEntryCount:[...this.browserEntries.values()].filter(a=>a.owner===j).length,declarationCount:[...this.declarations.values()].filter(a=>a.owner===j).length,durationMs:Math.round(performance.now()-d)})}catch(f){let b=f instanceof x?f.phase:"entry",c=[...j.pluginNames][0]??null;await this.releaseOwner(j);let e=p(f);if(this.packageDiagnostics.set(a,{source:a,packageName:j.packageName,version:j.version,pluginName:c,status:"failed",error:{phase:b,message:e}}),console.warn("[Pi Desk][GlobalPluginRuntime] Pi Desk Plugin 加载失败",{source:a,packageName:j.packageName,phase:b,errorName:f instanceof Error?f.name:"UnknownError",message:e,durationMs:Math.round(performance.now()-d)}),f instanceof y)return{execution:f.execution.catch(()=>{}).then(async()=>{await Promise.allSettled([...j.pendingCleanup])})}}finally{this.loadingOwners.delete(j)}return null}async loadEntryOwner(a,b,c){let d=o(a.packageRoot,b,"piDesk.entry");if(!(await (0,g.stat)(d)).isFile())throw Error("Pi Desk Plugin entry is not a file");let e=(await (0,k.G)(d,a.packageRoot)).default;if(!e||"object"!=typeof e||"string"!=typeof e.name||"function"!=typeof e.setup)throw Error("Pi Desk Plugin entry must default-export definePiDeskPlugin(...)");let f=(0,m.FX)(e.name);this.claimPluginName(a,f),c();try{let b=function(a){if(void 0===a)return{beforeReload:null,disposer:null};if("function"==typeof a)return{beforeReload:null,disposer:a};if(!a||"object"!=typeof a)throw Error("Pi Desk Plugin setup must return void, a disposer, or a lifecycle object");if(void 0!==a.beforeReload&&"function"!=typeof a.beforeReload)throw Error("Pi Desk Plugin lifecycle.beforeReload must be a function");if(void 0!==a.dispose&&"function"!=typeof a.dispose)throw Error("Pi Desk Plugin lifecycle.dispose must be a function");return{beforeReload:a.beforeReload??null,disposer:a.dispose??null}}(await e.setup(this.createPiDeskFacade(a,f,a.packageRoot)));if(a.beforeReload=b.beforeReload,a.disposer=b.disposer,!a.active||this.disposed)throw await this.releaseOwner(a),Error("插件初始化完成时 Owner 已失效")}catch(a){throw new x("setup",a)}}async loadLegacyOwner(a,b,c){let d=o(a.packageRoot,b,"piDesk.global");if(!(await (0,g.stat)(d)).isFile())throw Error("Global Plugin entry is not a file");let e=await (0,k.G)(d,a.packageRoot);if("function"!=typeof e.default)throw Error("Global Plugin entry must default-export a factory function");let f=e.default;c();try{let b=await f(this.createLegacyApi(a));if(void 0!==b&&"function"!=typeof b)throw Error("Global Plugin factory must return void or a disposer function");if(a.disposer=b??null,!a.active||this.disposed)throw await this.releaseOwner(a),Error("插件初始化完成时 Owner 已失效")}catch(a){throw new x("setup",a)}}claimPluginName(a,b){this.ensureOwnerActive(a);let c=this.pluginOwners.get(b);if(c&&c!==a)throw Error(`Pi Desk pluginName is already registered: ${b}`);this.pluginOwners.set(b,a),a.pluginNames.add(b)}createLegacyApi(a){return{bindPlugin:b=>{let c=(0,m.FX)(b);return this.claimPluginName(a,c),{name:c,registerMethod:(b,d)=>this.registerMethod(a,c,b,d)}}}}createPiDeskFacade(a,b,c){return{name:b,host:{settings:{getSnapshot:()=>{if(this.ensureOwnerActive(a),!this.hostSettings)throw Error("宿主共享设置尚未就绪");return this.hostSettings.getSnapshot()},subscribe:b=>{if(this.ensureOwnerActive(a),!this.hostSettings)throw Error("宿主共享设置尚未就绪");let c=this.hostSettings.subscribe(()=>{a.active&&!a.draining&&b()});return a.subscriptions.add(c),()=>{if(a.subscriptions.delete(c))return c()}}},workSessions:{listWorkSessions:async()=>{this.ensureOwnerActive(a);let b=await this.readWorkSessions();return this.ensureOwnerActive(a),b}}},notifications:{publish:c=>(this.ensureOwnerActive(a),this.requireAppRuntimeSink().publishNotification(b,c)),update:(c,d)=>{this.ensureOwnerActive(a),this.requireAppRuntimeSink().updateNotification(b,c,d)},delete:c=>{this.ensureOwnerActive(a),this.requireAppRuntimeSink().deleteNotification(b,c)}},setState:c=>{this.ensureOwnerActive(a),this.requireAppRuntimeSink().setState(b,c)},registerMethod:(c,d)=>this.registerMethod(a,b,c,d),registerBrowserEntry:d=>{if(this.ensureOwnerActive(a),this.browserEntries.has(b))throw Error(`Browser Entry is already registered: ${b}`);let f=o(c,d,"browserEntry"),g={pluginName:b,entryPath:f,resourceKey:(0,e.randomUUID)(),snapshot:null,owner:a};return this.browserEntries.set(b,g),this.registrationDisposer(a,()=>{this.browserEntries.get(b)===g&&this.browserEntries.delete(b)})},declareCapabilities:c=>{if(this.ensureOwnerActive(a),"function"!=typeof c)throw Error("能力声明必须是按需查询函数");if(this.capabilityLoaders.has(b))throw Error(`能力声明已注册:${b}`);let d={load:c,owner:a};return this.capabilityLoaders.set(b,d),this.registrationDisposer(a,()=>{this.capabilityLoaders.get(b)===d&&this.capabilityLoaders.delete(b)})},declareMessage:(c,d)=>this.registerDeclaration(a,b,c,d),pushGlobal:(c,d)=>{a.active&&!a.draining&&this.sendPush(b,{scope:"global"},c,d)},pushSession:(c,d,e)=>{a.active&&!a.draining&&this.sendPush(b,{scope:"session",source:s.parse(c)},d,e)}}}registerMethod(a,b,c,d){this.ensureOwnerActive(a);let e=(0,m.QK)(c),f=(0,m.$m)(b,e);if(this.methods.has(f))throw new m.qs(b,e);let g={pluginName:b,method:e,execute:d,owner:a};return this.methods.set(f,g),this.registrationDisposer(a,()=>{this.methods.get(f)===g&&this.methods.delete(f)})}registerDeclaration(a,b,c,d){var e;this.ensureOwnerActive(a);let f=u.parse(c);if(!d||"object"!=typeof d||"function"!=typeof d.match||"function"!=typeof d.project)throw Error("Message Declaration must provide match and project functions");let g={priority:(e=d.priority,v.parse(e)),match:d.match,project:d.project},h=`${b}\u0000${f}`;if(this.declarations.has(h))throw Error(`Message Declaration is already registered: ${b}/${f}`);let i={pluginName:b,declarationName:f,declaration:g,owner:a};return this.declarations.set(h,i),this.registrationDisposer(a,()=>{this.declarations.get(h)===i&&this.declarations.delete(h)})}registrationDisposer(a,b){let c=!0;return()=>{c&&(c=!1,a.active&&b())}}requireAppRuntimeSink(){if(!this.appRuntimeSink)throw Error("App Runtime sink has not been bound");return this.appRuntimeSink}sendPush(a,b,c,d){if(this.disposed)return;let e=(0,m.QK)(c),f=function(a){let b=r.parse(a);if(Buffer.byteLength(JSON.stringify(b),"utf8")>65536)throw Error("Plugin Push data exceeds 64KB");return b}(d);this.pushSender?.({pluginName:a,target:b,event:e,data:structuredClone(f)})}async readWorkSessions(){if(!this.workSessionProvider||this.disposed)return[];let a=await this.workSessionProvider();return i.YO(t).parse(a).map(a=>structuredClone(a))}async validateOwnerResources(a){for(let b of[...this.browserEntries.values()].filter(b=>b.owner===a)){if(!(await (0,g.stat)(b.entryPath)).isFile())throw Error("Browser Entry resource is not a file");if("entry.js"!==(0,h.basename)(b.entryPath))throw Error("Browser Entry resource file must be named entry.js");let c=await (0,l.f)(b.entryPath);if(this.ensureOwnerActive(a),[...this.browserEntries.values()].reduce((a,b)=>a+(b.snapshot?.size??0),0)+c.size>0x8000000)throw Error("Browser 模块快照总量超过128MB,拒绝加载此插件");b.snapshot=c}}recordOwnerDiagnostic(a){this.packageDiagnostics.set(a.source,{source:a.source,packageName:a.packageName,version:a.version,pluginName:[...a.pluginNames][0]??null,status:"ready",error:null})}ensureOwnerActive(a){if(!a.active||a.draining||this.disposed)throw Error("Pi Desk Plugin owner is no longer active")}async releaseOwner(a){let b=[...a.subscriptions];if(a.subscriptions.clear(),a.active){for(let b of(a.active=!1,a.activeCalls))b.abort();a.activeCalls.clear();let b=this.owners.indexOf(a);for(let[c,d]of(b>=0&&this.owners.splice(b,1),this.methods))d.owner===a&&this.methods.delete(c);for(let[b,c]of this.browserEntries)c.owner===a&&this.browserEntries.delete(b);for(let[b,c]of this.declarations)c.owner===a&&this.declarations.delete(b);for(let[b,c]of this.capabilityLoaders)c.owner===a&&this.capabilityLoaders.delete(b);for(let b of a.pluginNames)if(this.pluginOwners.get(b)===a){this.pluginOwners.delete(b);try{this.appRuntimeSink?.releasePlugin(b)}catch(a){console.warn("[Pi Desk][GlobalPluginRuntime] 清理插件 App Runtime 失败",{pluginName:b,errorName:a instanceof Error?a.name:"UnknownError",message:p(a)})}}a.pluginNames.clear()}let c=a.beforeReload,d=a.disposer;a.beforeReload=null,a.disposer=null;let e=new AbortController;await Promise.all([...b.map(b=>q({owner:a,phase:"dispose",execute:b})),c?q({owner:a,phase:"beforeReload",execute:()=>c({signal:e.signal}),onTimeout:()=>e.abort()}):Promise.resolve(),d?q({owner:a,phase:"dispose",execute:d}):Promise.resolve()])}}d()}catch(a){d(a)}})},46107:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Nx:()=>n,cY:()=>m,sv:()=>o,to:()=>l});var e=c(73024),f=c(76760),g=c(77598),h=c(75430),i=c(59473),j=c(58417),k=a([h]);h=(k.then?(await k)():k)[0];let n="https://registry.npmjs.org",o="https://mirrors.cloud.tencent.com/npm",p=i.Ik({downloadSource:j.w3.default({mode:"auto"}),disabled:i.YO(i.Yj()).max(2e3).default([]),registries:i.g1(i.Yj(),j.SZ).default({}),updateTags:i.g1(i.Yj(),j.mR).default({})}).strict();function l(a=(0,h.getAgentDir)()){let b=(0,f.join)(a,"pi-desk-plugins.json");return(0,e.existsSync)(b)?p.parse(JSON.parse((0,e.readFileSync)(b,"utf8"))):p.parse({})}function m(a,b=(0,h.getAgentDir)()){!function(a,b){let c=(0,f.join)(a,"pi-desk-plugins.json"),d=p.parse(b(l(a)));(0,e.mkdirSync)((0,f.dirname)(c),{recursive:!0});let h=`${c}.${(0,g.randomUUID)()}.tmp`;try{(0,e.writeFileSync)(h,`${JSON.stringify(d,null,2)}
20
20
  `,"utf8"),(0,e.renameSync)(h,c)}finally{(0,e.rmSync)(h,{force:!0})}}(b,b=>({...b,downloadSource:a}))}d()}catch(a){d(a)}})},46524:(a,b,c)=>{c.d(b,{Ns:()=>f,cg:()=>n,dX:()=>g,eD:()=>q,j0:()=>o,u3:()=>p});var d=c(12727);let e=new WeakMap;class f extends Error{constructor(a){super(`Pi session entry was not found: ${a}`),this.name="L4PiSessionEntryNotFoundError"}}class g extends Error{constructor(a){super(`Pi session fork target is not a user message: ${a}`),this.name="L4PiSessionForkTargetError"}}function h(a){return"string"==typeof a?a:Array.isArray(a)?a.flatMap(a=>a&&"object"==typeof a&&"text"===a.type&&"string"==typeof a.text?[a.text]:[]).join("\n"):""}function i(a){return Array.isArray(a)?a.filter(a=>null!==a&&"object"==typeof a&&"image"===a.type).length:0}function j(a){let b=a.replace(/\s+/g," ").trim();return b.length<=240?b:`${b.slice(0,239)}…`}function k(a){try{return JSON.stringify(a,null,2)??""}catch{return""}}function l(a){let b=a.getEntries(),c=e.get(a);if(c?.entryCount===b.length)return c.callsById;let f=new Map;for(let a of b)if("message"===a.type&&"assistant"===a.message.role)for(let b of(0,d.zz)(a.message.content))f.set(b.id,{name:b.name,input:b.input,display:(0,d.zG)(b.name,b.input)});return e.set(a,{entryCount:b.length,callsById:f}),f}function m(a){switch(a.type){case"message":switch(a.message.role){case"user":return"user";case"assistant":return"assistant";case"toolResult":return"tool";case"bashExecution":return"bash";case"custom":return"custom_message";default:return"custom"}case"custom_message":return"custom_message";case"compaction":return"compaction";case"branch_summary":return"branch_summary";case"custom":case"context_edit":case"usage":return"custom";case"model_change":return"model_change";case"thinking_level_change":return"thinking_level_change";case"session_info":return"session_info";case"label":return"label"}}function n(a,b){let c=l(a);return{sessionId:a.getSessionId(),leafEntryId:a.getLeafId(),nodes:a.getEntries().map(d=>({entryId:d.id,parentEntryId:d.parentId,timestampMs:function(a){let b=Date.parse(a.timestamp);if(!Number.isSafeInteger(b)||b<0)throw Error(`Pi session entry has an invalid timestamp: ${a.id}`);return b}(d),kind:m(d),preview:function(a,b,c){switch(a.type){case"message":let d=a.message;switch(d.role){case"user":{let a=h(d.content),b=i(d.content);return j(a||(b>0?`${b} 张图片`:""))}case"assistant":{let a=h(d.content);if(a)return j(a);if(d.errorMessage)return j(d.errorMessage);return"aborted"===d.stopReason?"已中断":""}case"toolResult":return function(a,b){if(!b)return j(a);let c=b.display.inputPreview??function(a){try{let b=JSON.stringify(a);return"{}"===b?"":j(b)}catch{return""}}(b.input),d=c?`${b.name}: ${c}`:b.name;return j(b.display.activity?`${d} \xb7 ${b.display.activity}`:d)}(d.toolName,b.get(d.toolCallId));case"bashExecution":return j(d.command);case"custom":return j(h(d.content));default:return""}case"custom_message":return j(h(a.content));case"compaction":case"branch_summary":return j(a.summary);case"custom":return j(a.customType);case"context_edit":return j(`${null===a.replacement?"从上下文移除":"替换上下文内容"}:${a.targetId}`);case"usage":return j(`用量记录:${a.kind}`);case"model_change":return j(`${a.provider}/${c?.getModel(a.provider,a.modelId)?.name||a.modelId}`);case"thinking_level_change":return j(a.thinkingLevel);case"session_info":return j(a.name??"");case"label":return j(a.label??"已清除标签")}}(d,c,b),label:a.getLabel(d.id)?.trim()||null}))}}function o(a,b,c){let d=a.getEntry(b);if(!d)throw new f(b);let e=function(a,b,c){switch(a.type){case"message":let d=a.message;switch(d.role){case"user":{let a=h(d.content),b=i(d.content);return[a,b>0?`[图片 ${b} 张]`:""].filter(Boolean).join("\n\n")}case"assistant":return h(d.content)||d.errorMessage||("aborted"===d.stopReason?"已中断":"");case"toolResult":return function(a,b){if(!b)return`工具:${a}
21
21
 
22
22
  未找到对应的 Tool Call 参数`;let c=[`工具:${b.name}`];b.display.reasoning&&c.push(`目的:${b.display.reasoning}`),b.display.inputPreview&&c.push(`调用:${b.display.inputPreview}`),b.display.activity&&c.push(`范围/变化:${b.display.activity}`);let d=Object.fromEntries(Object.entries(b.input).filter(([a])=>"reasoning"!==a));return Object.keys(d).length>0&&c.push("","调用参数:",k(d)),c.join("\n")}(d.toolName,b.get(d.toolCallId));case"bashExecution":return`命令:${d.command}`;case"custom":return h(d.content);default:return""}case"custom_message":return h(a.content);case"compaction":case"branch_summary":return a.summary;case"custom":return[`类型:${a.customType}`,k(a.data)].filter(Boolean).join("\n\n");case"context_edit":return`操作:${null===a.replacement?"从上下文移除":"替换上下文内容"}
@@ -38,4 +38,4 @@ ${g}`:b}catch{return a}}(a,c),d),j=(b??[]).map(a=>{let b=(0,g.Z)(a.data);if(b.me
38
38
  最后处理步骤:${this.describeStage()}`;throw console.error("[Pi Desk][PiSession] 会话初始化失败",{sessionId:this.sessionId,cwd:this.options.cwd,mode:this.options.mode,durationMs:Math.round(performance.now()-b),message:c}),this.dispose(),Error(c)}finally{this.onLifecycleError=null}}dispose(a=!0){if(!this.active)return;this.active=!1,this.onLifecycleError?.(Error(p)),this.ui.reset(!1),this.messages.dispose(),this.plugins.dispose(),this.capabilities.dispose();let b=this.session;this.session=null;try{b?.dispose()}catch(a){console.warn("[Pi Desk][PiSession] 释放会话失败",{sessionId:this.sessionId,message:a instanceof Error?a.message:String(a)})}finally{this.accessRevoked=!0}if(!this.execution)return;let c=b&&a?Promise.resolve().then(()=>b.extensionRunner.emit({type:"session_shutdown",reason:"quit"})):Promise.resolve(),d=Promise.allSettled([this.execution,c]);this.retired.add(d);let e=setTimeout(()=>{console.warn("[Pi Desk][PiSession] 旧实例仍在后台清理,不阻塞基础聊天",{sessionId:this.sessionId,cwd:this.options.cwd,stage:this.describeStage()})},1500);e.unref(),d.then(()=>{clearTimeout(e),this.retired.delete(d)})}assertActive(){if(!this.active)throw Error(p)}assertAccess(){if(this.accessRevoked)throw Error(p)}validateResources(a,b){for(let{path:b,error:c}of a.getExtensions().errors){let a=`${c}
39
39
  插件入口:${b}`;(0,j.pL)(this.options.cwd,a),console.warn("[Pi Desk][PiSession] 已跳过失败扩展",{cwd:this.options.cwd,message:a})}let c=[];for(let a of b)"error"===a.type?c.push(a.message):console.info("[Pi Desk][PiSession] 初始化诊断",{cwd:this.options.cwd,...a});if(c.length>0){for(let a of c)(0,j.pL)(this.options.cwd,a);throw a.getExtensions().runtime.invalidate(p),Error(c.join("\n"))}}async create(){this.setStage("加载 Pi 配置与插件");let a=()=>{this.ui.reset();let a=this.capabilities.createHostExtension((a,b)=>(this.assertActive(),this.options.onInput(a,b)),()=>{this.ui.reset(!1),this.plugins.reset()});a.handlers.set("message_end",[async a=>(this.assertActive(),this.options.onMessageEnd(a))]),a.handlers.set("session_tree",[async()=>this.options.onTree?.()]),a.handlers.set("session_before_tree",[async a=>{if(a.signal.aborted)return{cancel:!0}}]);let b=this.options.onCommand?(0,f.zP)(this.options.onCommand):null;return b&&a.tools.set(b.name,{definition:b,sourceInfo:a.sourceInfo}),a},b="basic"===this.options.mode?await (0,h.I)({cwd:this.options.cwd,createHostExtension:a}):await this.options.resources.createServices(this.options.cwd,{appendSystemPromptOverride:f.ue,eventBus:this.capabilities.eventBus(this.plugins.eventBus),extensionsOverride:b=>{if(!this.active)throw b.runtime.invalidate(p),Error(p);let c=a(),d="<inline:pi-desk-branch-state>",e={...c,path:d,resolvedPath:d,sourceInfo:{...c.sourceInfo,path:d},handlers:new Map([["session_tree",c.handlers.get("session_tree")]]),tools:new Map};return c.handlers.delete("session_tree"),{...b,extensions:[e,...b.extensions,c]}}},a=>this.setStage(a));this.assertActive(),this.validateResources(b.resourceLoader,b.diagnostics),this.setStage("创建会话与恢复模型"),b.resourceLoader=this.capabilities.resources(b.resourceLoader);let{session:c}=await (0,e.createAgentSessionFromServices)({services:b,sessionManager:this.manager});return this.assertActive(),this.session=c,this.capabilities.attach(c),this.setStage("启动插件"),await c.bindExtensions({mode:"rpc",uiContext:this.ui.bind(c.extensionRunner.getUIContext(),()=>this.assertActive()),onError:a=>{let b=`${a.stack??a.error}
40
40
  插件入口:${a.extensionPath}
41
- 事件:${a.event}`;this.active&&(console.error("[Pi Desk][PiSession] 扩展处理失败",{sessionId:this.sessionId,message:b}),(0,j.pL)(this.options.cwd,b),("session_tree"===a.event||"session_before_tree"===a.event)&&this.session?.extensionRunner.getUIContext().notify(`会话树扩展处理失败:${a.error}`,"error"))}}),this.assertActive(),this.messages.installExtensionRuntime(b.resourceLoader.getExtensions().runtime),this.setStage("应用会话能力"),await this.capabilities.apply(),this.assertActive(),c}}d()}catch(a){d(a)}})},84889:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{I:()=>j});var e=c(73024),f=c(76760),g=c(82459),h=c(75430),i=a([g,h]);[g,h]=i.then?(await i)():i;class k{constructor(a,b,c,d){this.cwd=a,this.agentDir=b,this.settings=c,this.createHostExtension=d,this.extensions={extensions:[],errors:[],runtime:(0,h.createExtensionRuntime)()},this.agentsFiles={agentsFiles:[]}}getExtensions(){return this.extensions}getSkills(){return{skills:[],diagnostics:[]}}getPrompts(){return{prompts:[],diagnostics:[]}}getThemes(){return{themes:[],diagnostics:[]}}getAgentsFiles(){return this.agentsFiles}getSystemPrompt(){return this.systemPrompt?.content}getSystemPromptSource(){return this.systemPrompt?{path:this.systemPrompt.path}:void 0}getAppendSystemPrompt(){return(0,g.ue)(this.appendPrompt?[this.appendPrompt.content]:[])}getAppendSystemPromptSources(){return this.appendPrompt?[{path:this.appendPrompt.path}]:[]}extendResources(){}async reload(){await this.settings.reload(),this.extensions={extensions:[this.createHostExtension()],errors:[],runtime:(0,h.createExtensionRuntime)()},this.agentsFiles={agentsFiles:(0,h.loadProjectContextFiles)({cwd:this.cwd,agentDir:this.agentDir})},this.systemPrompt=this.readPrompt("SYSTEM.md"),this.appendPrompt=this.readPrompt("APPEND_SYSTEM.md")}readPrompt(a){let b=[...this.settings.isProjectTrusted()?[(0,f.join)(this.cwd,h.CONFIG_DIR_NAME,a)]:[],(0,f.join)(this.agentDir,a)].find(a=>(0,e.existsSync)(a));return b?{path:b,content:(0,e.readFileSync)(b,"utf8")}:void 0}}async function j(a){let b=(0,h.getAgentDir)(),c=h.SettingsManager.create(a.cwd,b),d=await h.ModelRuntime.create({authPath:(0,f.join)(b,"auth.json"),modelsPath:(0,f.join)(b,"models.json")}),e=new k(a.cwd,b,c,a.createHostExtension);return await e.reload(),await d.refresh({allowNetwork:!1}),{cwd:a.cwd,agentDir:b,settingsManager:c,modelRuntime:d,resourceLoader:e,diagnostics:c.drainErrors().map(({error:a})=>({type:"error",message:a.message}))}}d()}catch(a){d(a)}})},85273:(a,b,c)=>{c.d(b,{Hj:()=>g,Nb:()=>f,Nx:()=>h,O0:()=>i,Sl:()=>e,k0:()=>d}),c(77598),c(41966);let d="pi-desk:session-plugins",e="pi-desk:session-plugin-methods:v1",f="pi-desk:session-plugin-push:v1",g="pi-desk:session-capabilities",h="pi-desk:session-preview-directory",i="pi-desk:task-report:v1"},87468:(a,b,c)=>{c.d(b,{u:()=>e});let d="v1:main";class e{constructor(a){for(const b of(this.entryIds=new Set,this.branchIdByEntryId=new Map,this.childCountByParentId=new Map,a))this.appendEntry(b)}branchIdForEntry(a){let b=this.branchIdByEntryId.get(a);if(!b)throw Error(`Pi session entry has no branch identity: ${a}`);return b}branchIdForHead(a){return null===a?d:this.branchIdForEntry(a)}predictAppend(a){if(null!==a&&!this.entryIds.has(a))throw Error(`Cannot append to missing Pi session parent: ${a}`);let b=(this.childCountByParentId.get(a)??0)+1;return{parentEntryId:a,childOrdinal:b,branchId:this.branchIdForChild(a,b)}}appendEntry(a){this.assertEntry(a);let b=this.predictAppend(a.parentId);return this.entryIds.add(a.id),this.branchIdByEntryId.set(a.id,b.branchId),this.childCountByParentId.set(a.parentId,b.childOrdinal),b}confirmAppend(a,b){let c=this.predictAppend(b.parentId);if(a.parentEntryId!==c.parentEntryId||a.childOrdinal!==c.childOrdinal||a.branchId!==c.branchId)throw Error(`Pi branch append conflict: expected ${a.branchId}/${a.childOrdinal}, got ${c.branchId}/${c.childOrdinal}`);return this.appendEntry(b),c.branchId}branchIdForChild(a,b){return null===a?1===b?d:`v1:fork:r:${b}`:1===b?this.branchIdForEntry(a):`v1:fork:e:${encodeURIComponent(a)}:${b}`}assertEntry(a){if(!a.id)throw Error("Pi session entry is missing an id");if(this.entryIds.has(a.id))throw Error(`Pi session contains duplicate entry id: ${a.id}`);if(null!==a.parentId&&(!a.parentId||!this.entryIds.has(a.parentId)))throw Error(`Pi session entry ${a.id} has missing parent: ${a.parentId}`)}}},88502:(a,b,c)=>{c.d(b,{f:()=>h});var d=c(77598),e=c(51455),f=c(76760);function g(a,b){let c=(0,f.relative)(a,b);return""===c||!c.startsWith("..")&&!(0,f.isAbsolute)(c)}async function h(a){if("entry.js"!==(0,f.basename)(a))throw Error("Browser Entry 必须命名为 entry.js");let b=await (0,e.realpath)((0,f.dirname)(a)),c=new Map,h=0,i=0,j=[],k=async(a,l,m)=>{let n=await (0,e.realpath)(a);if(!g(b,n))return;if(m.has(n))throw Error("Browser 模块目录存在符号链接循环");let o=new Set(m).add(n);for(let a of(await (0,e.readdir)(n,{withFileTypes:!0})).sort((a,b)=>a.name.localeCompare(b.name))){if(++i>4096)throw Error("Browser 模块目录条目超过上限");if(a.name.startsWith(".")||"node_modules"===a.name)continue;let m=(0,f.join)(n,a.name),p=await (0,e.realpath)(m);if(!g(b,p))continue;let q=await (0,e.stat)(p),r=l?`${l}/${a.name}`:a.name;if(q.isDirectory()){await k(p,r,o);continue}if(!q.isFile()||!a.name.endsWith(".js"))continue;if("entry.js"===r&&"entry.js"!==(0,f.basename)(p))throw Error("Browser Entry 符号链接必须指向 entry.js");if(c.size>=2048||q.size>0x1000000||h+q.size>0x2000000)throw Error("Browser 模块快照超过数量或容量上限");let s=await (0,e.readFile)(p),t=await (0,e.stat)(p);if(s.length!==q.size||t.size!==q.size||t.mtimeMs!==q.mtimeMs)throw Error("Browser 模块在读取时发生变化,请构建完成后重新加载");h+=s.length,j.push({path:p,size:t.size,mtimeMs:t.mtimeMs,ino:t.ino}),c.set(r,{content:s,etag:`"${(0,d.createHash)("sha256").update(s).digest("hex")}"`})}};for(let a of(await k(b,"",new Set),j)){let b=await (0,e.stat)(a.path);if(b.size!==a.size||b.mtimeMs!==a.mtimeMs||b.ino!==a.ino)throw Error("Browser 模块组在读取时发生变化,请构建完成后重新加载")}if(!c.has("entry.js"))throw Error("Browser Entry 模块缺失或越出专用目录");return{size:h,modules:c}}},95220:(a,b,c)=>{c.d(b,{P:()=>e});let d=process.argv.includes("--safe-mode")||"1"===process.env.PI_DESK_SAFE_MODE;function e(){return d}},96459:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{H0:()=>n,WE:()=>m});var e=c(61035),f=c(75430),g=c(44095),h=c(95220),i=c(56971),j=c(2476),k=c(58801),l=a([e,f,g,i,k]);[e,f,g,i,k]=l.then?(await l)():l;class o extends g.K{constructor(a=process.cwd(),b=(0,f.getAgentDir)()){const c=new j.N,d=async()=>(0,h.P)()?{sources:[],errors:[]}:(0,i.o)(a,b,{DefaultPackageManager:f.DefaultPackageManager,SettingsManager:f.SettingsManager});super(async()=>{let a=await d();for(let b of a.errors)console.warn("[Pi Desk][GlobalPluginRuntime] 插件来源发现诊断",{message:b});return await c.initialize(a),a.sources.flatMap(a=>a.enabled&&!a.error&&a.piDeskRoot?[{source:a.source,installedPath:a.piDeskRoot}]:[])},(0,e.J)()),this.sourceChanges=c,this.discover=d}async scanSourceChanges(a){return await this.initialize(),this.sourceChanges.scan(await this.discover(),a)}async applySourceChange(a){let[b]=await this.scanSourceChanges([a.source]);if(!b||b.fingerprint!==a.fingerprint||b.current?.enabled&&b.current.error)throw Error(b?.current?.error??"插件源码在预检后发生变化,请重新加载");a.previous?.piDeskRoot||a.current?.piDeskRoot?await this.replaceSource(a.source,a.current?.enabled?a.current.piDeskRoot:null):(0,k.N)(),this.sourceChanges.commit(a)}}function m(){return globalThis.__piDeskGlobalPluginRuntime||(globalThis.__piDeskGlobalPluginRuntime=new o),globalThis.__piDeskGlobalPluginRuntime}async function n(){let a=globalThis.__piDeskGlobalPluginRuntime;globalThis.__piDeskGlobalPluginRuntime=void 0,await a?.dispose()}d()}catch(a){d(a)}})},99327:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{HJ:()=>x,Il:()=>u,L9:()=>v,dw:()=>w});var e=c(77598),f=c(73024),g=c(75613),h=c(12727),i=c(76452),j=c(568),k=a([j]);function l(a){if(!a||"object"!=typeof a)return null;let b=a.role;return"string"==typeof b?b:null}function m(a){if(!a||"object"!=typeof a)return null;let b=a.toolCallId;return"string"==typeof b?b:null}function n(a){return null===a?null:"text-file"===a.kind?`text:${a.path}`:void 0!==a.session?a.session:`session-file:${a.sessionFile}`}function o(a,b,c){for(let d of[...a])try{d(b)}catch(a){console.error("[Pi Desk][TaskDetailRuntime] 事件监听器执行失败",{label:c,errorName:a instanceof Error?a.name:"UnknownError"})}}j=(k.then?(await k)():k)[0];class q{snapshot(){return null}subscribe(){return()=>void 0}dispose(){}}class r{constructor(a,b,c){this.path=a,this.observation=c,this.listeners=new Set,this.disposed=!1,this.current=b}static async create(a){let b=[],c=null,d=await (0,g.i)().observe(a,a=>{c?c.handleLogEvent(a):b.push(a)});for(let e of(c=new r(a,d.snapshot,d),b))c.handleLogEvent(e);return c}snapshot(){return{kind:"text",...this.current}}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}dispose(){this.disposed||(this.disposed=!0,this.observation.release(),this.listeners.clear())}handleLogEvent(a){if(!this.disposed){if("snapshot"===a.type){this.current={...a.snapshot},o(this.listeners,{type:"snapshot"},this.path);return}if("text_append"===a.type){this.current={...this.current,text:this.current.text+a.text},o(this.listeners,a,this.path);return}o(this.listeners,a,this.path)}}}class s{constructor(a,b){this.sessionFile=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 s(a,await (0,j.mH)(a));return b.startWatching(),b}snapshot(){return{kind:"conversation",entries:this.current.entries,temporaryMessages:[],truncated:this.current.truncated}}subscribe(a){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,f.watch)(this.sessionFile,()=>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 (0,j.mH)(this.sessionFile);if(this.disposed)return;let b=this.current.entries.map(a=>a.entryId),c=a.entries.map(a=>a.entryId);if(b.length===c.length&&b.every((a,b)=>a===c[b])){this.current=a;return}let d=!this.current.truncated&&!a.truncated&&b.every((a,b)=>a===c[b])?a.entries.slice(b.length):[];this.current=a,d.length>0?o(this.listeners,{type:"conversation_event",event:{type:"durable_append",entries:d}},this.sessionFile):o(this.listeners,{type:"snapshot"},this.sessionFile)}catch(a){console.warn("[Pi Desk][TaskSessionFileDetail] 刷新会话失败",{sessionFile:this.sessionFile,errorName:a instanceof Error?a.name:"UnknownError"}),o(this.listeners,{type:"unavailable"},this.sessionFile)}})().finally(()=>{this.refreshPromise=null})),this.refreshPromise)}}class t{constructor(a){for(const b of(this.session=a,this.listeners=new Set,this.temporaryMessages=new Map,this.temporaryOrder=[],this.pendingEvents=[],this.activeMessage=null,this.drainScheduled=!1,this.disposed=!1,this.toolRuntimeLease=(0,i.s)(a),this.toolRuntime=this.toolRuntimeLease.runtime,this.unsubscribeToolRuntime=this.toolRuntime.subscribe(a=>this.captureToolEvent(a)),this.unsubscribeAgent=a.agent.subscribe(b=>{try{this.captureAgentEvent(b)}catch(c){console.error("[Pi Desk][TaskAgentDetail] 捕获 AgentEvent 失败",{sessionId:a.sessionId,eventType:b.type,errorName:c instanceof Error?c.name:"UnknownError"})}}),this.entries=(0,h.xm)(a.sessionManager.getBranch()),this.toolRuntime.activeMessages()))this.setTemporary(b.tempId,b.message);const b=a.agent.state.streamingMessage;if(b){const a=(0,h.b7)(b);if(a){const c=(0,e.randomUUID)();for(const d of(this.activeMessage={tempId:c,started:!0,toolCallId:null},this.setTemporary(c,a),this.toolRuntime.syncStreamingTools(b,!1),this.toolRuntime.activeMessages()))this.setTemporary(d.tempId,d.message)}}}snapshot(){return{kind:"conversation",entries:this.entries,temporaryMessages:this.temporaryOrder.flatMap(a=>{let b=this.temporaryMessages.get(a);return b?[{tempId:a,message:b}]:[]}),truncated:!1}}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}dispose(){this.disposed||(this.disposed=!0,this.unsubscribeAgent(),this.unsubscribeToolRuntime(),this.toolRuntimeLease.release(),this.listeners.clear(),this.pendingEvents.length=0,this.temporaryMessages.clear(),this.temporaryOrder.length=0)}captureAgentEvent(a){if(!this.disposed)switch(a.type){case"message_start":this.startMessage(a.message);return;case"message_update":this.updateMessage(a.message),this.toolRuntime.syncStreamingTools(a.message);return;case"message_end":this.toolRuntime.syncStreamingTools(a.message),this.endMessage(a.message);return;default:return}}captureToolEvent(a){if(!this.disposed){if("message_discard"===a.type){this.removeTemporary(a.tempId),this.queueEvent(a);return}this.setTemporary(a.tempId,a.message),this.queueEvent(a)}}startMessage(a){let b=l(a),c=(0,e.randomUUID)(),d=!0,f=null;if("toolResult"===b){let b=(f=m(a))?this.toolRuntime.tempId(f):null;b&&(c=b,d=!1)}let g=this.projectLiveMessage(a,f);g&&(this.activeMessage={tempId:c,started:d,toolCallId:f},this.setTemporary(c,g),this.queueEvent({type:d?"message_start":"message_update",tempId:c,message:g}))}updateMessage(a){let b=this.activeMessage;if(!b)return;let c=this.projectLiveMessage(a,b.toolCallId);c&&(this.setTemporary(b.tempId,c),this.queueEvent({type:"message_update",tempId:b.tempId,message:c}))}endMessage(a){let b=this.activeMessage,c=l(a),d="toolResult"===c?m(a):null;if(!b){let c=this.projectLiveMessage(a,d);if(!c)return;b={tempId:(0,e.randomUUID)(),started:!0,toolCallId:d},this.setTemporary(b.tempId,c),this.queueEvent({type:"message_start",tempId:b.tempId,message:c})}let f=this.projectLiveMessage(a,b.toolCallId);f&&(this.setTemporary(b.tempId,f),this.queueEvent({type:"message_update",tempId:b.tempId,message:f}));let g=this.session.sessionManager.getLeafEntry(),i=g?(0,h.B4)(g):null;g&&i?(this.entries.some(a=>a.entryId===i.entryId)||(this.entries=[...this.entries,i]),this.removeTemporary(b.tempId),this.queueEvent({type:"message_commit",tempId:b.tempId,entryId:i.entryId,timestampMs:function(a,b){let c=Date.parse(b);if(!Number.isSafeInteger(c)||c<0)throw Error(`Pi session entry has an invalid timestamp: ${a}`);return c}(g.id,g.timestamp)})):b.started&&(this.removeTemporary(b.tempId),this.queueEvent({type:"message_discard",tempId:b.tempId})),b.toolCallId&&this.toolRuntime.remove(b.toolCallId),this.activeMessage=null}projectLiveMessage(a,b){return"toolResult"===l(a)&&b?this.toolRuntime.projectLiveResult(a,b):(0,h.b7)(a)}setTemporary(a,b){this.temporaryMessages.has(a)||this.temporaryOrder.push(a),this.temporaryMessages.set(a,b)}removeTemporary(a){this.temporaryMessages.delete(a);let b=this.temporaryOrder.indexOf(a);b>=0&&this.temporaryOrder.splice(b,1)}queueEvent(a){if(!this.disposed){if("message_update"===a.type){let b=this.pendingEvents.at(-1);b?.type==="message_update"&&b.tempId===a.tempId?this.pendingEvents[this.pendingEvents.length-1]=a:this.pendingEvents.push(a)}else this.pendingEvents.push(a);this.drainScheduled||(this.drainScheduled=!0,queueMicrotask(()=>this.drainEvents()))}}drainEvents(){if(this.drainScheduled=!1,!this.disposed)for(;this.pendingEvents.length>0;){let a=this.pendingEvents.shift();o(this.listeners,{type:"conversation_event",event:a},this.session.sessionId)}}}async function p(a){return null===a?new q:"text-file"===a.kind?r.create(a.path):void 0!==a.session?new t(a.session):s.create(a.sessionFile)}class u{constructor(a){this.readRecord=a,this.sharedByTaskId=new Map,this.operationTail=Promise.resolve(),this.disposed=!1}watch(a,b){return this.enqueue(()=>this.watchInternal(a,b))}taskChanged(a){this.enqueue(async()=>{let b=this.sharedByTaskId.get(a);if(!b)return;let c=this.readRecord(a);if(!c){o(b.listeners,{type:"unavailable"},a),this.disposeShared(a,b);return}n(c.detailSource)!==b.sourceIdentity?await this.replaceShared(a,b,c):b.canInterrupt!==c.canInterrupt&&(b.canInterrupt=c.canInterrupt,o(b.listeners,{type:"snapshot",snapshot:this.snapshot(a,b)},a))})}async readMessage(a,b){let c=this.readRecord(a);if(!c)throw new v(a);let d=c.detailSource;if(d?.kind!=="pi-conversation")throw new w(a);if(void 0!==d.session){let a=(0,h.xm)(d.session.sessionManager.getBranch()),c=a.findIndex(a=>a.entryId===b);if(c<0)throw new x(b);return{index:c,entry:a[c]}}let e=await (0,j.uS)(d.sessionFile,b),f=e.snapshot.entries.findIndex(a=>a.entryId===b);if(f<0)throw new x(b);return{index:f,entry:e.projected}}async readImage(a,b,c){if(!Number.isSafeInteger(c)||c<0)throw Error("图片位置无效");let d=this.readRecord(a);if(!d)throw new v(a);let e=d.detailSource;if(e?.kind!=="pi-conversation")throw new w(a);if(void 0===e.session)return(0,j.tE)(e.sessionFile,b,c);if(!e.session.sessionManager.getBranch().some(a=>a.id===b))throw new x(b);let f=e.session.sessionManager.getEntry(b);if(f?.type!=="message"||"user"!==f.message.role&&"toolResult"!==f.message.role)throw new x(b);let g=(0,h.Wl)(f.message.content,c);if(!g)throw new x(`${b}/${c}`);return g}dispose(){if(!this.disposed){for(let[a,b]of(this.disposed=!0,this.sharedByTaskId))this.disposeShared(a,b);this.sharedByTaskId.clear()}}async watchInternal(a,b){if(this.disposed)throw Error("Task detail pool has been disposed");let c=this.readRecord(a);if(!c)throw new v(a);let d=this.sharedByTaskId.get(a),e=n(c.detailSource);if(!d||d.sourceIdentity!==e){d?.unsubscribeSource(),d?.sourceRuntime.dispose();let b=await p(c.detailSource);if(this.disposed)throw b.dispose(),Error("Task detail pool was disposed during initialization");(d={sourceRuntime:b,sourceIdentity:e,canInterrupt:c.canInterrupt,listeners:new Set,unsubscribeSource:()=>void 0}).unsubscribeSource=b.subscribe(b=>this.handleSourceEvent(a,d,b)),this.sharedByTaskId.set(a,d)}d.canInterrupt=c.canInterrupt,d.listeners.add(b);let f=!1;return{snapshot:this.snapshot(a,d),readSnapshot:()=>this.snapshot(a,d),release:()=>{f||(f=!0,this.release(a,d,b))}}}enqueue(a){let b=this.operationTail.then(a,a);return this.operationTail=b.then(()=>void 0,()=>void 0),b}snapshot(a,b){return{taskId:a,canInterrupt:b.canInterrupt,body:b.sourceRuntime.snapshot()}}handleSourceEvent(a,b,c){if(this.sharedByTaskId.get(a)===b){if("snapshot"===c.type)return void o(b.listeners,{type:"snapshot",snapshot:this.snapshot(a,b)},a);o(b.listeners,c,a)}}release(a,b,c){this.sharedByTaskId.get(a)===b&&(b.listeners.delete(c),0===b.listeners.size&&this.disposeShared(a,b))}disposeShared(a,b){this.sharedByTaskId.get(a)===b&&this.sharedByTaskId.delete(a),b.unsubscribeSource(),b.sourceRuntime.dispose(),b.listeners.clear()}async replaceShared(a,b,c){try{let d=await p(c.detailSource);if(this.sharedByTaskId.get(a)!==b)return void d.dispose();b.unsubscribeSource(),b.sourceRuntime.dispose(),b.sourceRuntime=d,b.sourceIdentity=n(c.detailSource),b.canInterrupt=c.canInterrupt,b.unsubscribeSource=d.subscribe(c=>this.handleSourceEvent(a,b,c)),o(b.listeners,{type:"snapshot",snapshot:this.snapshot(a,b)},a)}catch(c){console.warn("[Pi Desk][TaskDetailPool] 替换详情来源失败",{taskId:a,errorName:c instanceof Error?c.name:"UnknownError"}),o(b.listeners,{type:"unavailable"},a),this.disposeShared(a,b)}}}class v extends Error{constructor(a){super(`Task detail was not found: ${a}`),this.name="L4PiTaskDetailNotFoundError"}}class w extends Error{constructor(a){super(`Task does not provide conversation detail: ${a}`),this.name="L4PiTaskDetailUnsupportedError"}}class x extends Error{constructor(a){super(`Task conversation message was not found: ${a}`),this.name="L4PiTaskMessageNotFoundError"}}d()}catch(a){d(a)}})}};
41
+ 事件:${a.event}`;this.active&&(console.error("[Pi Desk][PiSession] 扩展处理失败",{sessionId:this.sessionId,message:b}),(0,j.pL)(this.options.cwd,b),("session_tree"===a.event||"session_before_tree"===a.event)&&this.session?.extensionRunner.getUIContext().notify(`会话树扩展处理失败:${a.error}`,"error"))}}),this.assertActive(),this.messages.installExtensionRuntime(b.resourceLoader.getExtensions().runtime),this.setStage("应用会话能力"),await this.capabilities.apply(),this.assertActive(),c}}d()}catch(a){d(a)}})},84889:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{I:()=>j});var e=c(73024),f=c(76760),g=c(82459),h=c(75430),i=a([g,h]);[g,h]=i.then?(await i)():i;class k{constructor(a,b,c,d){this.cwd=a,this.agentDir=b,this.settings=c,this.createHostExtension=d,this.extensions={extensions:[],errors:[],runtime:(0,h.createExtensionRuntime)()},this.agentsFiles={agentsFiles:[]}}getExtensions(){return this.extensions}getSkills(){return{skills:[],diagnostics:[]}}getPrompts(){return{prompts:[],diagnostics:[]}}getThemes(){return{themes:[],diagnostics:[]}}getAgentsFiles(){return this.agentsFiles}getSystemPrompt(){return this.systemPrompt?.content}getSystemPromptSource(){return this.systemPrompt?{path:this.systemPrompt.path}:void 0}getAppendSystemPrompt(){return(0,g.ue)(this.appendPrompt?[this.appendPrompt.content]:[])}getAppendSystemPromptSources(){return this.appendPrompt?[{path:this.appendPrompt.path}]:[]}extendResources(){}async reload(){await this.settings.reload(),this.extensions={extensions:[this.createHostExtension()],errors:[],runtime:(0,h.createExtensionRuntime)()},this.agentsFiles={agentsFiles:(0,h.loadProjectContextFiles)({cwd:this.cwd,agentDir:this.agentDir})},this.systemPrompt=this.readPrompt("SYSTEM.md"),this.appendPrompt=this.readPrompt("APPEND_SYSTEM.md")}readPrompt(a){let b=[...this.settings.isProjectTrusted()?[(0,f.join)(this.cwd,h.CONFIG_DIR_NAME,a)]:[],(0,f.join)(this.agentDir,a)].find(a=>(0,e.existsSync)(a));return b?{path:b,content:(0,e.readFileSync)(b,"utf8")}:void 0}}async function j(a){let b=(0,h.getAgentDir)(),c=h.SettingsManager.create(a.cwd,b),d=await h.ModelRuntime.create({authPath:(0,f.join)(b,"auth.json"),modelsPath:(0,f.join)(b,"models.json")}),e=new k(a.cwd,b,c,a.createHostExtension);return await e.reload(),await d.refresh({allowNetwork:!1}),{cwd:a.cwd,agentDir:b,settingsManager:c,modelRuntime:d,resourceLoader:e,diagnostics:c.drainErrors().map(({error:a})=>({type:"error",message:a.message}))}}d()}catch(a){d(a)}})},85273:(a,b,c)=>{c.d(b,{Hj:()=>g,Nb:()=>f,Nx:()=>h,O0:()=>i,Sl:()=>e,k0:()=>d}),c(77598),c(41966);let d="pi-desk:session-plugins",e="pi-desk:session-plugin-methods:v1",f="pi-desk:session-plugin-push:v1",g="pi-desk:session-capabilities",h="pi-desk:session-preview-directory",i="pi-desk:task-report:v1"},87468:(a,b,c)=>{c.d(b,{u:()=>e});let d="v1:main";class e{constructor(a){for(const b of(this.entryIds=new Set,this.branchIdByEntryId=new Map,this.childCountByParentId=new Map,a))this.appendEntry(b)}branchIdForEntry(a){let b=this.branchIdByEntryId.get(a);if(!b)throw Error(`Pi session entry has no branch identity: ${a}`);return b}branchIdForHead(a){return null===a?d:this.branchIdForEntry(a)}predictAppend(a){if(null!==a&&!this.entryIds.has(a))throw Error(`Cannot append to missing Pi session parent: ${a}`);let b=(this.childCountByParentId.get(a)??0)+1;return{parentEntryId:a,childOrdinal:b,branchId:this.branchIdForChild(a,b)}}appendEntry(a){this.assertEntry(a);let b=this.predictAppend(a.parentId);return this.entryIds.add(a.id),this.branchIdByEntryId.set(a.id,b.branchId),this.childCountByParentId.set(a.parentId,b.childOrdinal),b}confirmAppend(a,b){let c=this.predictAppend(b.parentId);if(a.parentEntryId!==c.parentEntryId||a.childOrdinal!==c.childOrdinal||a.branchId!==c.branchId)throw Error(`Pi branch append conflict: expected ${a.branchId}/${a.childOrdinal}, got ${c.branchId}/${c.childOrdinal}`);return this.appendEntry(b),c.branchId}branchIdForChild(a,b){return null===a?1===b?d:`v1:fork:r:${b}`:1===b?this.branchIdForEntry(a):`v1:fork:e:${encodeURIComponent(a)}:${b}`}assertEntry(a){if(!a.id)throw Error("Pi session entry is missing an id");if(this.entryIds.has(a.id))throw Error(`Pi session contains duplicate entry id: ${a.id}`);if(null!==a.parentId&&(!a.parentId||!this.entryIds.has(a.parentId)))throw Error(`Pi session entry ${a.id} has missing parent: ${a.parentId}`)}}},88502:(a,b,c)=>{c.d(b,{f:()=>h});var d=c(77598),e=c(51455),f=c(76760);function g(a,b){let c=(0,f.relative)(a,b);return""===c||!c.startsWith("..")&&!(0,f.isAbsolute)(c)}async function h(a){if("entry.js"!==(0,f.basename)(a))throw Error("Browser Entry 必须命名为 entry.js");let b=await (0,e.realpath)((0,f.dirname)(a)),c=new Map,h=0,i=0,j=[],k=async(a,l,m)=>{let n=await (0,e.realpath)(a);if(!g(b,n))return;if(m.has(n))throw Error("Browser 模块目录存在符号链接循环");let o=new Set(m).add(n);for(let a of(await (0,e.readdir)(n,{withFileTypes:!0})).sort((a,b)=>a.name.localeCompare(b.name))){if(++i>4096)throw Error("Browser 模块目录条目超过上限");if(a.name.startsWith(".")||"node_modules"===a.name)continue;let m=(0,f.join)(n,a.name),p=await (0,e.realpath)(m);if(!g(b,p))continue;let q=await (0,e.stat)(p),r=l?`${l}/${a.name}`:a.name;if(q.isDirectory()){await k(p,r,o);continue}if(!q.isFile()||!a.name.endsWith(".js"))continue;if("entry.js"===r&&"entry.js"!==(0,f.basename)(p))throw Error("Browser Entry 符号链接必须指向 entry.js");if(c.size>=2048||q.size>0x1000000||h+q.size>0x2000000)throw Error("Browser 模块快照超过数量或容量上限");let s=await (0,e.readFile)(p),t=await (0,e.stat)(p);if(s.length!==q.size||t.size!==q.size||t.mtimeMs!==q.mtimeMs)throw Error("Browser 模块在读取时发生变化,请构建完成后重新加载");h+=s.length,j.push({path:p,size:t.size,mtimeMs:t.mtimeMs,ino:t.ino}),c.set(r,{content:s,etag:`"${(0,d.createHash)("sha256").update(s).digest("hex")}"`})}};for(let a of(await k(b,"",new Set),j)){let b=await (0,e.stat)(a.path);if(b.size!==a.size||b.mtimeMs!==a.mtimeMs||b.ino!==a.ino)throw Error("Browser 模块组在读取时发生变化,请构建完成后重新加载")}if(!c.has("entry.js"))throw Error("Browser Entry 模块缺失或越出专用目录");return{size:h,modules:c}}},95220:(a,b,c)=>{c.d(b,{P:()=>e});let d=process.argv.includes("--safe-mode")||"1"===process.env.PI_DESK_SAFE_MODE;function e(){return d}},96459:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{H0:()=>n,WE:()=>m});var e=c(61035),f=c(75430),g=c(44095),h=c(95220),i=c(56971),j=c(2476),k=c(58801),l=a([e,f,g,i,k]);[e,f,g,i,k]=l.then?(await l)():l;class o extends g.K{constructor(a=process.cwd(),b=(0,f.getAgentDir)()){const c=new j.N,d=async()=>(0,h.P)()?{sources:[],errors:[]}:(0,i.o)(a,b,{DefaultPackageManager:f.DefaultPackageManager,SettingsManager:f.SettingsManager});super(async()=>{let a=await d();for(let b of a.errors)console.warn("[Pi Desk][GlobalPluginRuntime] 插件来源发现诊断",{message:b});return await c.initialize(a),a.sources.flatMap(a=>a.enabled&&!a.error&&a.piDeskRoot?[{source:a.source,installedPath:a.piDeskRoot}]:[])},(0,e.J)()),this.sourceChanges=c,this.discover=d}readAppliedSources(){return this.sourceChanges.readAppliedSources()}async scanSourceChanges(a){return await this.initialize(),this.sourceChanges.scan(await this.discover(),a)}async applySourceChange(a){let[b]=await this.scanSourceChanges([a.source]);if(!b||b.fingerprint!==a.fingerprint||b.current?.enabled&&b.current.error)throw Error(b?.current?.error??"插件源码在预检后发生变化,请重新加载");a.previous?.piDeskRoot||a.current?.piDeskRoot?await this.replaceSource(a.source,a.current?.enabled?a.current.piDeskRoot:null):(0,k.N)(),this.sourceChanges.commit(a)}}function m(){return globalThis.__piDeskGlobalPluginRuntime||(globalThis.__piDeskGlobalPluginRuntime=new o),globalThis.__piDeskGlobalPluginRuntime}async function n(){let a=globalThis.__piDeskGlobalPluginRuntime;globalThis.__piDeskGlobalPluginRuntime=void 0,await a?.dispose()}d()}catch(a){d(a)}})},99327:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{HJ:()=>x,Il:()=>u,L9:()=>v,dw:()=>w});var e=c(77598),f=c(73024),g=c(75613),h=c(12727),i=c(76452),j=c(568),k=a([j]);function l(a){if(!a||"object"!=typeof a)return null;let b=a.role;return"string"==typeof b?b:null}function m(a){if(!a||"object"!=typeof a)return null;let b=a.toolCallId;return"string"==typeof b?b:null}function n(a){return null===a?null:"text-file"===a.kind?`text:${a.path}`:void 0!==a.session?a.session:`session-file:${a.sessionFile}`}function o(a,b,c){for(let d of[...a])try{d(b)}catch(a){console.error("[Pi Desk][TaskDetailRuntime] 事件监听器执行失败",{label:c,errorName:a instanceof Error?a.name:"UnknownError"})}}j=(k.then?(await k)():k)[0];class q{snapshot(){return null}subscribe(){return()=>void 0}dispose(){}}class r{constructor(a,b,c){this.path=a,this.observation=c,this.listeners=new Set,this.disposed=!1,this.current=b}static async create(a){let b=[],c=null,d=await (0,g.i)().observe(a,a=>{c?c.handleLogEvent(a):b.push(a)});for(let e of(c=new r(a,d.snapshot,d),b))c.handleLogEvent(e);return c}snapshot(){return{kind:"text",...this.current}}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}dispose(){this.disposed||(this.disposed=!0,this.observation.release(),this.listeners.clear())}handleLogEvent(a){if(!this.disposed){if("snapshot"===a.type){this.current={...a.snapshot},o(this.listeners,{type:"snapshot"},this.path);return}if("text_append"===a.type){this.current={...this.current,text:this.current.text+a.text},o(this.listeners,a,this.path);return}o(this.listeners,a,this.path)}}}class s{constructor(a,b){this.sessionFile=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 s(a,await (0,j.mH)(a));return b.startWatching(),b}snapshot(){return{kind:"conversation",entries:this.current.entries,temporaryMessages:[],truncated:this.current.truncated}}subscribe(a){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,f.watch)(this.sessionFile,()=>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 (0,j.mH)(this.sessionFile);if(this.disposed)return;let b=this.current.entries.map(a=>a.entryId),c=a.entries.map(a=>a.entryId);if(b.length===c.length&&b.every((a,b)=>a===c[b])){this.current=a;return}let d=!this.current.truncated&&!a.truncated&&b.every((a,b)=>a===c[b])?a.entries.slice(b.length):[];this.current=a,d.length>0?o(this.listeners,{type:"conversation_event",event:{type:"durable_append",entries:d}},this.sessionFile):o(this.listeners,{type:"snapshot"},this.sessionFile)}catch(a){console.warn("[Pi Desk][TaskSessionFileDetail] 刷新会话失败",{sessionFile:this.sessionFile,errorName:a instanceof Error?a.name:"UnknownError"}),o(this.listeners,{type:"unavailable"},this.sessionFile)}})().finally(()=>{this.refreshPromise=null})),this.refreshPromise)}}class t{constructor(a){for(const b of(this.session=a,this.listeners=new Set,this.temporaryMessages=new Map,this.temporaryOrder=[],this.pendingEvents=[],this.activeMessage=null,this.drainScheduled=!1,this.disposed=!1,this.toolRuntimeLease=(0,i.s)(a),this.toolRuntime=this.toolRuntimeLease.runtime,this.unsubscribeToolRuntime=this.toolRuntime.subscribe(a=>this.captureToolEvent(a)),this.unsubscribeAgent=a.agent.subscribe(b=>{try{this.captureAgentEvent(b)}catch(c){console.error("[Pi Desk][TaskAgentDetail] 捕获 AgentEvent 失败",{sessionId:a.sessionId,eventType:b.type,errorName:c instanceof Error?c.name:"UnknownError"})}}),this.entries=(0,h.xm)(a.sessionManager.getBranch()),this.toolRuntime.activeMessages()))this.setTemporary(b.tempId,b.message);const b=a.agent.state.streamingMessage;if(b){const a=(0,h.b7)(b);if(a){const c=(0,e.randomUUID)();for(const d of(this.activeMessage={tempId:c,started:!0,toolCallId:null},this.setTemporary(c,a),this.toolRuntime.syncStreamingTools(b,!1),this.toolRuntime.activeMessages()))this.setTemporary(d.tempId,d.message)}}}snapshot(){return{kind:"conversation",entries:this.entries,temporaryMessages:this.temporaryOrder.flatMap(a=>{let b=this.temporaryMessages.get(a);return b?[{tempId:a,message:b}]:[]}),truncated:!1}}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}dispose(){this.disposed||(this.disposed=!0,this.unsubscribeAgent(),this.unsubscribeToolRuntime(),this.toolRuntimeLease.release(),this.listeners.clear(),this.pendingEvents.length=0,this.temporaryMessages.clear(),this.temporaryOrder.length=0)}captureAgentEvent(a){if(!this.disposed)switch(a.type){case"message_start":this.startMessage(a.message);return;case"message_update":this.updateMessage(a.message),this.toolRuntime.syncStreamingTools(a.message);return;case"message_end":this.toolRuntime.syncStreamingTools(a.message),this.endMessage(a.message);return;default:return}}captureToolEvent(a){if(!this.disposed){if("message_discard"===a.type){this.removeTemporary(a.tempId),this.queueEvent(a);return}this.setTemporary(a.tempId,a.message),this.queueEvent(a)}}startMessage(a){let b=l(a),c=(0,e.randomUUID)(),d=!0,f=null;if("toolResult"===b){let b=(f=m(a))?this.toolRuntime.tempId(f):null;b&&(c=b,d=!1)}let g=this.projectLiveMessage(a,f);g&&(this.activeMessage={tempId:c,started:d,toolCallId:f},this.setTemporary(c,g),this.queueEvent({type:d?"message_start":"message_update",tempId:c,message:g}))}updateMessage(a){let b=this.activeMessage;if(!b)return;let c=this.projectLiveMessage(a,b.toolCallId);c&&(this.setTemporary(b.tempId,c),this.queueEvent({type:"message_update",tempId:b.tempId,message:c}))}endMessage(a){let b=this.activeMessage,c=l(a),d="toolResult"===c?m(a):null;if(!b){let c=this.projectLiveMessage(a,d);if(!c)return;b={tempId:(0,e.randomUUID)(),started:!0,toolCallId:d},this.setTemporary(b.tempId,c),this.queueEvent({type:"message_start",tempId:b.tempId,message:c})}let f=this.projectLiveMessage(a,b.toolCallId);f&&(this.setTemporary(b.tempId,f),this.queueEvent({type:"message_update",tempId:b.tempId,message:f}));let g=this.session.sessionManager.getLeafEntry(),i=g?(0,h.B4)(g):null;g&&i?(this.entries.some(a=>a.entryId===i.entryId)||(this.entries=[...this.entries,i]),this.removeTemporary(b.tempId),this.queueEvent({type:"message_commit",tempId:b.tempId,entryId:i.entryId,timestampMs:function(a,b){let c=Date.parse(b);if(!Number.isSafeInteger(c)||c<0)throw Error(`Pi session entry has an invalid timestamp: ${a}`);return c}(g.id,g.timestamp)})):b.started&&(this.removeTemporary(b.tempId),this.queueEvent({type:"message_discard",tempId:b.tempId})),b.toolCallId&&this.toolRuntime.remove(b.toolCallId),this.activeMessage=null}projectLiveMessage(a,b){return"toolResult"===l(a)&&b?this.toolRuntime.projectLiveResult(a,b):(0,h.b7)(a)}setTemporary(a,b){this.temporaryMessages.has(a)||this.temporaryOrder.push(a),this.temporaryMessages.set(a,b)}removeTemporary(a){this.temporaryMessages.delete(a);let b=this.temporaryOrder.indexOf(a);b>=0&&this.temporaryOrder.splice(b,1)}queueEvent(a){if(!this.disposed){if("message_update"===a.type){let b=this.pendingEvents.at(-1);b?.type==="message_update"&&b.tempId===a.tempId?this.pendingEvents[this.pendingEvents.length-1]=a:this.pendingEvents.push(a)}else this.pendingEvents.push(a);this.drainScheduled||(this.drainScheduled=!0,queueMicrotask(()=>this.drainEvents()))}}drainEvents(){if(this.drainScheduled=!1,!this.disposed)for(;this.pendingEvents.length>0;){let a=this.pendingEvents.shift();o(this.listeners,{type:"conversation_event",event:a},this.session.sessionId)}}}async function p(a){return null===a?new q:"text-file"===a.kind?r.create(a.path):void 0!==a.session?new t(a.session):s.create(a.sessionFile)}class u{constructor(a){this.readRecord=a,this.sharedByTaskId=new Map,this.operationTail=Promise.resolve(),this.disposed=!1}watch(a,b){return this.enqueue(()=>this.watchInternal(a,b))}taskChanged(a){this.enqueue(async()=>{let b=this.sharedByTaskId.get(a);if(!b)return;let c=this.readRecord(a);if(!c){o(b.listeners,{type:"unavailable"},a),this.disposeShared(a,b);return}n(c.detailSource)!==b.sourceIdentity?await this.replaceShared(a,b,c):b.canInterrupt!==c.canInterrupt&&(b.canInterrupt=c.canInterrupt,o(b.listeners,{type:"snapshot",snapshot:this.snapshot(a,b)},a))})}async readMessage(a,b){let c=this.readRecord(a);if(!c)throw new v(a);let d=c.detailSource;if(d?.kind!=="pi-conversation")throw new w(a);if(void 0!==d.session){let a=(0,h.xm)(d.session.sessionManager.getBranch()),c=a.findIndex(a=>a.entryId===b);if(c<0)throw new x(b);return{index:c,entry:a[c]}}let e=await (0,j.uS)(d.sessionFile,b),f=e.snapshot.entries.findIndex(a=>a.entryId===b);if(f<0)throw new x(b);return{index:f,entry:e.projected}}async readImage(a,b,c){if(!Number.isSafeInteger(c)||c<0)throw Error("图片位置无效");let d=this.readRecord(a);if(!d)throw new v(a);let e=d.detailSource;if(e?.kind!=="pi-conversation")throw new w(a);if(void 0===e.session)return(0,j.tE)(e.sessionFile,b,c);if(!e.session.sessionManager.getBranch().some(a=>a.id===b))throw new x(b);let f=e.session.sessionManager.getEntry(b);if(f?.type!=="message"||"user"!==f.message.role&&"toolResult"!==f.message.role)throw new x(b);let g=(0,h.Wl)(f.message.content,c);if(!g)throw new x(`${b}/${c}`);return g}dispose(){if(!this.disposed){for(let[a,b]of(this.disposed=!0,this.sharedByTaskId))this.disposeShared(a,b);this.sharedByTaskId.clear()}}async watchInternal(a,b){if(this.disposed)throw Error("Task detail pool has been disposed");let c=this.readRecord(a);if(!c)throw new v(a);let d=this.sharedByTaskId.get(a),e=n(c.detailSource);if(!d||d.sourceIdentity!==e){d?.unsubscribeSource(),d?.sourceRuntime.dispose();let b=await p(c.detailSource);if(this.disposed)throw b.dispose(),Error("Task detail pool was disposed during initialization");(d={sourceRuntime:b,sourceIdentity:e,canInterrupt:c.canInterrupt,listeners:new Set,unsubscribeSource:()=>void 0}).unsubscribeSource=b.subscribe(b=>this.handleSourceEvent(a,d,b)),this.sharedByTaskId.set(a,d)}d.canInterrupt=c.canInterrupt,d.listeners.add(b);let f=!1;return{snapshot:this.snapshot(a,d),readSnapshot:()=>this.snapshot(a,d),release:()=>{f||(f=!0,this.release(a,d,b))}}}enqueue(a){let b=this.operationTail.then(a,a);return this.operationTail=b.then(()=>void 0,()=>void 0),b}snapshot(a,b){return{taskId:a,canInterrupt:b.canInterrupt,body:b.sourceRuntime.snapshot()}}handleSourceEvent(a,b,c){if(this.sharedByTaskId.get(a)===b){if("snapshot"===c.type)return void o(b.listeners,{type:"snapshot",snapshot:this.snapshot(a,b)},a);o(b.listeners,c,a)}}release(a,b,c){this.sharedByTaskId.get(a)===b&&(b.listeners.delete(c),0===b.listeners.size&&this.disposeShared(a,b))}disposeShared(a,b){this.sharedByTaskId.get(a)===b&&this.sharedByTaskId.delete(a),b.unsubscribeSource(),b.sourceRuntime.dispose(),b.listeners.clear()}async replaceShared(a,b,c){try{let d=await p(c.detailSource);if(this.sharedByTaskId.get(a)!==b)return void d.dispose();b.unsubscribeSource(),b.sourceRuntime.dispose(),b.sourceRuntime=d,b.sourceIdentity=n(c.detailSource),b.canInterrupt=c.canInterrupt,b.unsubscribeSource=d.subscribe(c=>this.handleSourceEvent(a,b,c)),o(b.listeners,{type:"snapshot",snapshot:this.snapshot(a,b)},a)}catch(c){console.warn("[Pi Desk][TaskDetailPool] 替换详情来源失败",{taskId:a,errorName:c instanceof Error?c.name:"UnknownError"}),o(b.listeners,{type:"unavailable"},a),this.disposeShared(a,b)}}}class v extends Error{constructor(a){super(`Task detail was not found: ${a}`),this.name="L4PiTaskDetailNotFoundError"}}class w extends Error{constructor(a){super(`Task does not provide conversation detail: ${a}`),this.name="L4PiTaskDetailUnsupportedError"}}class x extends Error{constructor(a){super(`Task conversation message was not found: ${a}`),this.name="L4PiTaskMessageNotFoundError"}}d()}catch(a){d(a)}})}};