@jetcrab/pi-desk 1.1.23-dev → 1.1.25

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 (95) hide show
  1. package/docs/commands.md +4 -2
  2. package/docs/plugins.md +2 -0
  3. package/package.json +2 -2
  4. package/src/app/project-preview/page.tsx +13 -0
  5. package/src/client/l1_entry/pages/l1-project-preview-page.tsx +1 -5
  6. package/src/client/l2_biz/project-preview/hooks/l2-use-project-preview.ts +25 -0
  7. package/src/client/l2_biz/project-preview/l2-project-preview-storage.ts +7 -7
  8. package/src/client/l2_biz/project-preview/l2-project-preview.tsx +8 -5
  9. package/src/client/l2_biz/project-preview/runtime/l2-project-history-runtime.ts +14 -11
  10. package/src/client/l2_biz/project-preview/views/l2-project-branch-select.tsx +347 -0
  11. package/src/client/l2_biz/project-preview/views/l2-project-change-tree.tsx +28 -11
  12. package/src/client/l2_biz/project-preview/views/l2-project-history-list.tsx +35 -8
  13. package/src/client/l2_biz/project-preview/views/l2-project-history-view.tsx +46 -48
  14. package/src/client/l2_biz/workbench/file-workspace/l2-file-workspace-runtime.ts +2 -1
  15. package/src/client/l2_biz/workbench/file-workspace/l2-file-workspace-view.tsx +6 -2
  16. package/src/client/l3_modules/conversation/l3-conversation-viewport.tsx +18 -8
  17. package/src/client/l3_modules/project-files/l3-project-document-view.tsx +7 -4
  18. package/src/client/l3_modules/project-files/l3-project-file-runtime.ts +181 -89
  19. package/src/client/l3_modules/project-files/l3-project-file-tabs.tsx +80 -28
  20. package/src/common/l2_biz/project-preview/l2-project-history-messages.ts +4 -2
  21. package/src/common/l2_biz/project-preview/l2-project-preview-navigation.ts +14 -0
  22. package/src/server/l1_entry/api/l1-plugin-management-route.ts +0 -4
  23. package/src/server/l2_biz/plugin-management/l2-plugin-management.ts +4 -37
  24. package/src/server/l2_biz/plugin-management/l2-plugin-updates.ts +1 -4
  25. package/src/server/l2_biz/work-session/l2-work-session-chat-runtime.ts +4 -2
  26. package/src/server/l4_foundation/pi/l4-pi-chat-worker.ts +16 -1
  27. package/src/server/l4_foundation/pi/l4-pi-package-root-consistency.ts +3 -6
  28. package/src/server/l4_foundation/pi/l4-pi-package-root-gate.ts +1 -1
  29. package/src/server/l4_foundation/pi/l4-pi-plugin-owner-runtime.ts +4 -0
  30. package/src/server/l4_foundation/pi/l4-pi-plugin-sources.ts +5 -1
  31. package/src/server/l4_foundation/pi/l4-pi-session-initialization.ts +30 -34
  32. package/src/server/l4_foundation/pi/l4-pi-session-resources.ts +15 -14
  33. package/src/server/l4_foundation/pi/l4-pi-work-session-runtime.ts +1 -1
  34. package/src/server/l4_foundation/skills/runtime/l4-skill-catalog.ts +159 -166
  35. package/temp/build/pi-desk/release/.next/BUILD_ID +1 -1
  36. package/temp/build/pi-desk/release/.next/build-manifest.json +3 -3
  37. package/temp/build/pi-desk/release/.next/prerender-manifest.json +3 -3
  38. package/temp/build/pi-desk/release/.next/react-loadable-manifest.json +1 -1
  39. package/temp/build/pi-desk/release/.next/required-server-files.js +3 -3
  40. package/temp/build/pi-desk/release/.next/required-server-files.json +3 -3
  41. package/temp/build/pi-desk/release/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  42. package/temp/build/pi-desk/release/.next/server/app/_global-error.html +1 -1
  43. package/temp/build/pi-desk/release/.next/server/app/_global-error.rsc +1 -1
  44. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  45. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  46. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  47. package/temp/build/pi-desk/release/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  48. package/temp/build/pi-desk/release/.next/server/app/api/health/route.js +1 -1
  49. package/temp/build/pi-desk/release/.next/server/app/api/plugins/add/route.js +1 -1
  50. package/temp/build/pi-desk/release/.next/server/app/api/plugins/apply/route.js +1 -1
  51. package/temp/build/pi-desk/release/.next/server/app/api/plugins/batch/route.js +1 -1
  52. package/temp/build/pi-desk/release/.next/server/app/api/plugins/del/route.js +1 -1
  53. package/temp/build/pi-desk/release/.next/server/app/api/plugins/enabled-set/route.js +1 -1
  54. package/temp/build/pi-desk/release/.next/server/app/api/plugins/get/route.js +1 -1
  55. package/temp/build/pi-desk/release/.next/server/app/api/plugins/list/route.js +1 -1
  56. package/temp/build/pi-desk/release/.next/server/app/api/plugins/reload/route.js +1 -1
  57. package/temp/build/pi-desk/release/.next/server/app/api/plugins/update/route.js +1 -1
  58. package/temp/build/pi-desk/release/.next/server/app/login/page_client-reference-manifest.js +1 -1
  59. package/temp/build/pi-desk/release/.next/server/app/page.js +2 -2
  60. package/temp/build/pi-desk/release/.next/server/app/page_client-reference-manifest.js +1 -1
  61. package/temp/build/pi-desk/release/.next/server/app/project-preview/page.js +1 -1
  62. package/temp/build/pi-desk/release/.next/server/app/project-preview/page_client-reference-manifest.js +1 -1
  63. package/temp/build/pi-desk/release/.next/server/chunks/16438.js +1 -1
  64. package/temp/build/pi-desk/release/.next/server/chunks/18748.js +1 -0
  65. package/temp/build/pi-desk/release/.next/server/chunks/24557.js +1 -1
  66. package/temp/build/pi-desk/release/.next/server/chunks/25406.js +13 -14
  67. package/temp/build/pi-desk/release/.next/server/chunks/27344.js +15 -0
  68. package/temp/build/pi-desk/release/.next/server/chunks/35985.js +1 -1
  69. package/temp/build/pi-desk/release/.next/server/chunks/36361.js +2 -2
  70. package/temp/build/pi-desk/release/.next/server/chunks/50520.js +2 -2
  71. package/temp/build/pi-desk/release/.next/server/chunks/6917.js +1 -1
  72. package/temp/build/pi-desk/release/.next/server/chunks/80290.js +1 -1
  73. package/temp/build/pi-desk/release/.next/server/chunks/92386.js +15 -16
  74. package/temp/build/pi-desk/release/.next/server/instrumentation.js +1 -1
  75. package/temp/build/pi-desk/release/.next/server/middleware-build-manifest.js +1 -1
  76. package/temp/build/pi-desk/release/.next/server/middleware-react-loadable-manifest.js +1 -1
  77. package/temp/build/pi-desk/release/.next/server/pages/500.html +1 -1
  78. package/temp/build/pi-desk/release/.next/server/server-reference-manifest.json +1 -1
  79. package/temp/build/pi-desk/release/.next/static/chunks/15302-6e070e13fa65c863.js +1 -0
  80. package/temp/build/pi-desk/release/.next/static/chunks/19991.bcca96d396b83030.js +1 -0
  81. package/temp/build/pi-desk/release/.next/static/chunks/65232-ef4e5a4174f62faf.js +15 -0
  82. package/temp/build/pi-desk/release/.next/static/chunks/app/{page-54040b9fd54ee8b3.js → page-18d63fd3920dfae0.js} +3 -3
  83. package/temp/build/pi-desk/release/.next/static/chunks/app/project-preview/page-038b6c14e03ed878.js +1 -0
  84. package/temp/build/pi-desk/release/.next/static/chunks/{webpack-48eecbb66781c006.js → webpack-c0b805df46fcf8b3.js} +1 -1
  85. package/temp/build/pi-desk/release/.next/static/css/c43b04c244a64fb4.css +1 -0
  86. package/temp/build/pi-desk/release/.next/trace-build +1 -1
  87. package/temp/build/pi-desk/release/.next/server/chunks/20460.js +0 -15
  88. package/temp/build/pi-desk/release/.next/server/chunks/93049.js +0 -1
  89. package/temp/build/pi-desk/release/.next/static/chunks/15302-9c807afc6c60de0c.js +0 -1
  90. package/temp/build/pi-desk/release/.next/static/chunks/19991.8aa2e4b6df15fad6.js +0 -1
  91. package/temp/build/pi-desk/release/.next/static/chunks/9038-05fd2688407b39c1.js +0 -15
  92. package/temp/build/pi-desk/release/.next/static/chunks/app/project-preview/page-bc18765121950e65.js +0 -1
  93. package/temp/build/pi-desk/release/.next/static/css/10e063cfb3cda7bd.css +0 -1
  94. /package/temp/build/pi-desk/release/.next/static/{gAYTx4KJJR3vTtGYexj4J → 6a4eIEjmpW5l8Qlgtzzzg}/_buildManifest.js +0 -0
  95. /package/temp/build/pi-desk/release/.next/static/{gAYTx4KJJR3vTtGYexj4J → 6a4eIEjmpW5l8Qlgtzzzg}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  "use strict";exports.id=25406,exports.ids=[25406],exports.modules={3086:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{oj:()=>l}),c(77598);var e=c(73024),f=c(76760);c(57975);var g=c(75430),h=c(28802),i=c(37787),j=c(72725),k=a([g,h,i]);function l(a,b){return(0,j.gX)(a,b,function(a){var b;let c;if(!(0,e.existsSync)(a))return{};let d=(0,e.readFileSync)(a,"utf8");try{let a=(65279===d.charCodeAt(0)?d.slice(1):d).replace(/"(?:\\.|[^"\\])*"|\/\/[^\n]*/g,a=>'"'===a[0]?a:"").replace(/"(?:\\.|[^"\\])*"|,(\s*[}\]])/g,(a,b)=>b??('"'===a[0]?a:""));c=JSON.parse(a)}catch(b){throw Error(`配置文件 ${a} 解析失败:${b instanceof Error?b.message:String(b)}`,{cause:b})}if(b=c,"object"!=typeof b||null===b||Array.isArray(b))throw Error(`${a} 必须是 JSON 对象`);return c}((0,f.join)((0,g.getAgentDir)(),"models.json")))}[g,h,i]=k.then?(await k)():k,Promise.resolve(),d()}catch(a){d(a)}})},3329:(a,b,c)=>{c.d(b,{R:()=>f});var d=c(36153),e=c(78143);let f=d.Ik({workId:d.Yj().trim().min(1),sessionId:e.$E,branchId:d.Yj().trim().min(1)}).strict()},5340:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Cz:()=>j,Ht:()=>g.H,NA:()=>k,QS:()=>i});var e=c(36361),f=c(67442),g=c(44164),h=a([e]);function i(a,b,c,d=!1,g="temporary",h=!1){return(0,f.d)(a,b,c,h?[]:(0,e.getL4PiGlobalPluginRuntime)().readMessageDeclarations(),d,g)}function j(a,b,c,d,g,h=!1){return(0,f.N)(a,b,c,d,g,h?[]:(0,e.getL4PiGlobalPluginRuntime)().readMessageDeclarations())}function k(a){let{detail:b,...c}=a;return c}e=(h.then?(await h)():h)[0],d()}catch(a){d(a)}})},6277:(a,b,c)=>{c.d(b,{D:()=>h,Yj:()=>i,s6:()=>e,xI:()=>f});var d=c(36153);let e="project-preview",f=32,g=d.Ik({directories:d.YO(d.Yj().min(1).max(4096)).max(f),defaultDirectory:d.Yj().min(1).max(4096).nullable()}).strict();function h(a){let b=g.safeParse(a);return b.success?b.data:{directories:[],defaultDirectory:null}}function i(a){let b=a.replaceAll("\\","/").replace(/\/+$/,"")||"/";return/^[a-z]:/i.test(b)||b.startsWith("//")?b.toLowerCase():b}},6676:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{EG:()=>D,X9:()=>A,yT:()=>B});var e=c(77598),f=c(58500),g=c(75286),h=c(45870),i=c(27177),j=c(16056),k=c(28802),l=c(9570),m=c(60161),n=c(35350),o=c(49240),p=c(37787),q=c(47757),r=a([g,i,k,l,o,p,q]);function s(a){if(!a)return null;let b=Array.from(a);return b.length<=80?a:`${b.slice(0,79).join("")}…`}[g,i,k,l,o,p,q]=r.then?(await r)():r;class A extends Error{constructor(a){super(`Pi Extension Command was not found: ${a}`),this.name="L4PiNativeCommandNotFoundError"}}class B extends Error{constructor(){super("Pi Direct Bash is already running"),this.name="L4PiDirectBashRunningError"}}class C extends Error{constructor(){super("当前会话正在运行,暂时无法查看系统上下文"),this.name="L4PiModelContextBusyError"}}function t(a){if(!a||"object"!=typeof a)return null;let b=a.role;return"string"==typeof b?b:null}function u(a){if(!a||"object"!=typeof a)return null;let b=a.toolCallId;return"string"==typeof b?b:null}function v(a){return a.images.map(({mimeType:a,width:b,height:c})=>({mimeType:a,width:b,height:c}))}function w(a){return{tempId:a.tempId,text:a.input.text,images:v(a.input)}}function x(a){return{tempId:a.tempId,text:a.initial.text,images:v(a.initial)}}function y(a){let b=a.sourceInfo.path.replaceAll("\\","/");return"llama"!==a.name||!b.includes("/extensions/llama/")}function z(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}class D{get pluginRuntime(){return this.initialization.plugins}get capabilityRuntime(){return this.initialization.capabilities}get messageGate(){return this.initialization.messages}constructor(a,b,c=()=>void 0,d={mode:()=>null,rules:()=>void 0},e){for(const f of(this.cwd=a,this.sessionManager=b,this.onEntryAppended=c,this.capabilities=d,this.nativeUi=new h.k,this.listeners=new Set,this.commandLifetime=new AbortController,this.reloadRequested=!1,this.initializationError=null,this.steeringQueue=[],this.followUpQueue=[],this.pendingQueueText=new Map,this.bashTempsById=new Map,this.observedRunPromises=new Set,this.committedEntryIds=new Set,this.backgroundTaskIds=new Set,this.liveUpdatesByTempId=new Map,this.acceptedInputs=[],this.presentedInputTempIds=new Set,this.session=null,this.extensionMode=(0,j.P)()?"basic":"normal",this.sessionLifecycle=null,this.treeNavigation=null,this.treeResumeImmediate=null,this.disposePromise=null,this.initializePromise=null,this.unsubscribeAgent=null,this.unsubscribeSession=null,this.toolRuntime=null,this.toolRuntimeLease=null,this.unsubscribeToolRuntime=null,this.pendingPrompt=null,this.activeMessage=null,this.activeValidation=null,this.activeCompactionTempId=null,this.acceptedInputTimer=null,this.compactionResumeTimer=null,this.startingAcceptedInput=!1,this.compactionResumeScheduled=!1,this.manualCompactionFinishPending=!1,this.publishingModel=!1,this.oversizedToolCallAbortRequested=!1,this.disposed=!1,this.resources=e??new i.h,this.ownsResources=void 0===e,this.initialization=this.createInitialization(),this.observedEntryCount=b.getEntries().length,b.getBranch()))this.committedEntryIds.add(f.id)}createInitialization(){return new g.k({cwd:this.cwd,sessionManager:this.sessionManager,mode:this.extensionMode,resources:this.resources,ui:this.nativeUi,readCapabilities:this.capabilities.rules,onInput:a=>this.validateFinalInput(a.text,a.images,a.streamingBehavior),onMessageEnd:({message:a})=>{if(!this.disposed&&this.oversizedToolCallAbortRequested&&"assistant"===a.role&&("aborted"===a.stopReason||"error"===a.stopReason))return{message:{...a,stopReason:"error",errorMessage:"工具参数流超过 262144 字符上限,本次响应中的工具均未执行。Please retry your request."}}},onTree:()=>this.resetBranchRuntime(),onCommand:(a,b)=>{let c=this.commandLifetime.signal;return(0,q.executeL4PiDeskCommand)(a,{cwd:this.cwd,signal:c,reload:()=>this.requestReload(b),notify:a=>this.notifyCommandResult(b,a,c)})},pluginEvents:{onChanged:()=>this.emitRuntime(),onPush:({pluginName:a,event:b,data:c})=>this.emit({type:"plugin_push",pluginName:a,event:b,data:c}),onTasksChanged:a=>this.updateBackgroundTasks(a),onInvalidUpdate:a=>{console.warn("[Pi Desk][PiChatWorker] 已忽略非法插件运行态更新",{sessionId:this.sessionManager.getSessionId(),cwd:this.cwd,errorName:a instanceof Error?a.name:"UnknownError",message:a instanceof Error?a.message:String(a)})}}})}async notifyCommandResult(a,b,c){c.aborted||(await this.sessionLifecycle,c.aborted||this.disposed||!this.session||this.sessionManager.getBranch().some(b=>"message"===b.type&&"assistant"===b.message.role&&b.message.content.some(b=>"toolCall"===b.type&&b.id===a))&&this.session.resourceLoader.getExtensions().runtime.sendMessage({customType:"pi-desk:command-result",content:b,display:!0,details:{toolCallId:a}},{deliverAs:"steer",triggerTurn:!0}))}requestReload(a){if(this.commandLifetime.signal.throwIfAborted(),this.reloadRequested)throw Error("当前会话已有重载请求,请结束本轮并等待完成通知");return this.reloadRequested=!0,console.info("[Pi Desk][Commands] 当前会话重载请求已接纳",{sessionId:this.sessionManager.getSessionId(),toolCallId:a}),this.reloadWhenIdle(a).finally(()=>{this.reloadRequested=!1}),{mode:"async",message:"已收到当前窗口的 Pi 配置重载请求。请结束本轮对话并等待,无需查询或重复调用;会话空闲后会执行重载,完成后向本会话发送结果消息并自动唤醒。"}}async reloadWhenIdle(a){let b,c=this.commandLifetime.signal,d={sessionId:this.sessionManager.getSessionId(),toolCallId:a};try{do await (0,f.setTimeout)(250,void 0,{signal:c});while(null!==this.readPluginReloadBlockReason());if(console.info("[Pi Desk][Commands] 会话已空闲,开始重载 Pi 配置",d),await this.reload(),c.throwIfAborted(),this.initializationError)throw Error(`扩展未恢复,当前使用基础会话。
2
2
  ${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 配置重载失败。
3
- 原因:${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(){let a=this.ensureSession(),b=()=>void 0,c=new Promise(a=>{b=this.nativeUi.subscribe(()=>{this.nativeUi.hasPending&&a()}),this.nativeUi.hasPending&&a()});try{return await Promise.race([a,c]),this.runtimeSnapshot()}finally{b()}}async readModelContext(){if(this.startingAcceptedInput||this.acceptedInputs.length>0||this.activeValidation||this.pendingPrompt||this.activeCompactionTempId||this.observedRunPromises.size>0)throw new C;let a=await this.ensureSession();if(!a.isIdle||a.isBashRunning)throw new C;let 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){let b=await this.ensureSession();this.assertIdle(),this.treeResumeImmediate&&clearImmediate(this.treeResumeImmediate),this.treeResumeImmediate=null;let c=!1;try{return await this.runSessionLifecycle(async()=>{let d=this.sessionManager.getLeafId(),e={committed:!1};this.treeNavigation=e,this.messageGate.pause();try{this.initialization.setStage("切换会话树"),(c=!(await b.navigateTree(a,{summarize:!1})).cancelled)&&await this.capabilityRuntime.apply()}catch(a){throw e.committed||this.sessionManager.getLeafId()===d||this.resetBranchRuntime(),a}finally{try{if(e.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,e.committed||(this.reconcileAppendedEntries(),this.emitTreeState()),this.scheduleTreeMessageResume()}}}),c}catch(a){throw b.abortCompaction(),a}}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 扩展生命周期未在截止时间内完成
3
+ 原因:${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(){if(this.startingAcceptedInput||this.acceptedInputs.length>0||this.activeValidation||this.pendingPrompt||this.activeCompactionTempId||this.observedRunPromises.size>0)throw new C;let a=await this.ensureSession();if(!a.isIdle||a.isBashRunning)throw new C;let 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){let b=await this.ensureSession();this.assertIdle(),this.treeResumeImmediate&&clearImmediate(this.treeResumeImmediate),this.treeResumeImmediate=null;let c=!1;try{return await this.runSessionLifecycle(async()=>{let d=this.sessionManager.getLeafId(),e={committed:!1};this.treeNavigation=e,this.messageGate.pause();try{this.initialization.setStage("切换会话树"),(c=!(await b.navigateTree(a,{summarize:!1})).cancelled)&&await this.capabilityRuntime.apply()}catch(a){throw e.committed||this.sessionManager.getLeafId()===d||this.resetBranchRuntime(),a}finally{try{if(e.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,e.committed||(this.reconcileAppendedEntries(),this.emitTreeState()),this.scheduleTreeMessageResume()}}}),c}catch(a){throw b.abortCompaction(),a}}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 扩展生命周期未在截止时间内完成
4
4
  ${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)}
5
5
  …诊断过长,已截断`: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)}})},7832:(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}},8438:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{O:()=>k});var e=c(77598),f=c(73024),g=c(76760),h=c(75430),i=c(63603),j=a([h]);h=(j.then?(await j)():j)[0];class l{constructor(a=function(){let a=(0,h.getAgentDir)(),b=(0,g.join)(a,"pi-desk-capability-modes.json"),c=(0,g.join)(a,"pi-super-capability-modes.json");return!(0,f.existsSync)(b)&&(0,f.existsSync)(c)&&(0,f.copyFileSync)(c,b),b}()){this.path=a,this.modes=null,this.listeners=new Set,this.tail=Promise.resolve()}read(){if(null===this.modes){let a=(0,f.existsSync)(this.path)?JSON.parse((0,f.readFileSync)(this.path,"utf8")):{modes:{}};if(!a||"object"!=typeof a||!("modes"in a))throw Error("能力模式配置缺少 modes");this.modes=i.Qg.parse(a.modes)}return structuredClone(this.modes)}subscribe(a){return this.listeners.add(a),()=>{this.listeners.delete(a)}}replace(a){let b=i.Qg.parse(a),c=this.tail.then(()=>{(0,f.mkdirSync)((0,g.dirname)(this.path),{recursive:!0});let a=`${this.path}.${process.pid}.${(0,e.randomUUID)()}.tmp`;try{(0,f.writeFileSync)(a,`${JSON.stringify({modes:b},null,2)}
@@ -11,19 +11,18 @@ ${a}
11
11
  </skill>`;return g?`${b}
12
12
 
13
13
  ${g}`:b}catch{return a}}(a,c),d),j=(b??[]).map(a=>{let b=(0,g.Z)(a.data);if(b.metadata.mimeType!==a.mimeType)throw new n("图片 MIME 与实际内容不一致");return{...b.metadata,data:a.data}});return i({text:h,images:j})}function k(a){return a.map(a=>({type:"image",data:a.data,mimeType:a.mimeType}))}function l(a){let b,c;if(a.length>32)throw new n("当前 WorkSession 最多排队 32 条输入");if(a.reduce((a,b)=>a+b.imageBytes,0)>0x1400000)throw new n("全部排队图片总量不能超过 20MB");if(b=a.map(a=>a.text).filter(a=>a.trim()).join("\n\n"),c=a.flatMap(a=>a.images),Buffer.byteLength(JSON.stringify({text:b,images:c}),"utf8")+1024>m)throw new n("排队内容过大,无法通过一次恢复响应返回")}d()}catch(a){d(a)}})},10658:(a,b,c)=>{c.d(b,{P:()=>h,WR:()=>g,YB:()=>i,Z$:()=>j,l3:()=>k});var d=c(36153);let e=d.Yj().max(65536),f=d.Ik({id:d.Yj().uuid(),title:e,expiresAt:d.ai().int().nonnegative().nullable()}),g=d.gM("method",[f.extend({method:d.eu("confirm"),message:e}).strict(),f.extend({method:d.eu("select"),options:d.YO(e).max(200)}).strict(),f.extend({method:d.eu("input"),placeholder:e}).strict(),f.extend({method:d.eu("editor"),prefill:e}).strict()]),h=d.Ik({requests:d.YO(g).max(32),statuses:d.g1(d.Yj().max(128),e),widgets:d.g1(d.Yj().max(128),d.Ik({lines:d.YO(e).max(200),placement:d.k5(["aboveEditor","belowEditor"])}).strict())}).strict(),i=d.Ik({id:d.Yj().uuid(),value:d.KC([d.zM(),e,d.ch()])}).strict(),j=d.gM("type",[d.Ik({type:d.eu("snapshot"),snapshot:h}).strict(),d.Ik({type:d.eu("notify"),message:e,level:d.k5(["info","warning","error"])}).strict(),d.Ik({type:d.eu("editor_text"),text:e,mode:d.k5(["replace","paste"])}).strict()]);function k(){return{requests:[],statuses:{},widgets:{}}}},11819:(a,b,c)=>{c.d(b,{Ww:()=>i,cP:()=>j,u2:()=>p,vZ:()=>h,y2:()=>g,zp:()=>n,zt:()=>q});var d=c(36153),e=c(76019),f=c(27519);let g=100,h=5e4,i=f.rh,j=d.Yj().trim().min(1).max(1024),k=d.gM("type",[d.Ik({type:d.eu("branch"),name:j}).strict(),d.Ik({type:d.eu("detached"),commit:d.Yj().regex(/^[0-9a-f]{40,64}$/)}).strict()]),l=d.k5(["added","modified","deleted","renamed","unmerged","untracked"]),m=d.Ik({path:f._g,oldPath:f._g.nullable(),indexStatus:l.nullable(),worktreeStatus:l.nullable()}).strict(),n=d.Ik({root:i,state:d.eu("ready"),head:k,changes:d.YO(m).max(h)}).strict(),o=d.Ik({root:i,state:d.eu("unavailable"),message:e.qf.refine(a=>("string"==typeof a?[a]:[a.default,...Object.values(a.translations)]).every(a=>a.length>0&&a.length<=2e3))}).strict();d.gM("state",[n.omit({changes:!0}),o]);let p=d.gM("state",[n,o]),q=d.gM("type",[d.Ik({type:d.eu("local"),name:j}).strict(),d.Ik({type:d.eu("remote"),name:j}).strict()]);d.Ik({head:k,recent:d.YO(j).max(5),local:d.YO(j).max(1e4),remote:d.YO(j).max(1e4)}).strict();let r=d.Ik({path:f._g,content:d.Yj()}).strict();d.gM("kind",[d.Ik({kind:d.eu("text"),original:r,modified:r}).strict(),d.Ik({kind:d.eu("binary")}).strict(),d.Ik({kind:d.eu("too_large")}).strict()])},12881:(a,b,c)=>{c.d(b,{U:()=>d});class d{constructor(a=()=>void 0){this.onDispatchError=a,this.deferred=[],this.restoreExtensionRuntime=null,this.draining=null,this.paused=!1,this.disposed=!1}get isBlocking(){return this.paused||null!==this.draining||this.deferred.length>0}pause(){this.disposed||(this.paused=!0)}defer(a,b){return!!this.isBlocking&&!this.disposed&&(this.deferred.push({source:a,dispatch:b}),!0)}resume(){if(this.disposed)return Promise.resolve();if(this.paused=!1,this.draining)return this.draining;let a=this.drain().finally(()=>{this.draining===a&&(this.draining=null),!this.paused&&this.deferred.length>0&&this.resume()});return this.draining=a,a}installExtensionRuntime(a){if(this.disposed)return;this.restoreExtensionRuntime?.();let b=a.sendMessage,c=a.sendUserMessage,d=(a,c)=>{this.defer("extension-message",()=>b(a,c))||b(a,c)},e=(a,b)=>{this.defer("extension-user-message",()=>c(a,b))||c(a,b)};a.sendMessage=d,a.sendUserMessage=e,this.restoreExtensionRuntime=()=>{a.sendMessage===d&&(a.sendMessage=b),a.sendUserMessage===e&&(a.sendUserMessage=c)}}discardPending(){this.deferred.length=0}dispose(){this.disposed||(this.disposed=!0,this.paused=!0,this.deferred.length=0,this.restoreExtensionRuntime?.(),this.restoreExtensionRuntime=null)}async drain(){for(;!this.paused&&!this.disposed;){let a=this.deferred.shift();if(!a)return;try{await a.dispatch()}catch(b){this.onDispatchError(a.source,b)}}}}},14290:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{O:()=>i});var e=c(28802),f=c(80159),g=c(63603),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)}})},15819:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{JF:()=>s,cI:()=>r,jd:()=>q});var e=c(76760),f=c(42035),g=c(32757),h=c(35350),i=a([g]);function j(a,b,c){if("string"!=typeof a)throw Error(`${b} must be a string`);let d=a.trim();if(!d||d.length>c)throw Error(`${b} must contain 1-${c} characters`);return d}function k(a,b,c){return null==a?null:j(a,b,c)}function l(a){if(void 0===a)return[];if(!Array.isArray(a)||a.length>12)throw Error("Task info must be an array with at most 12 items");return a.map((a,b)=>{if(!a||"object"!=typeof a||Array.isArray(a))throw Error(`Task info ${b} must be an object`);return{label:j(a.label,`Task info ${b} label`,64),value:j(a.value,`Task info ${b} value`,500)}})}function m(a,b){if("number"!=typeof a||!Number.isSafeInteger(a)||a<0)throw Error(`${b} must be a non-negative Unix millisecond timestamp`);return a}function n(a){if(!a||"object"!=typeof a)throw Error("Task snapshot is invalid");let b=function(a){switch(a){case"running":case"completed":case"failed":case"stopped":case"interrupted":return a;default:throw Error("Task status is invalid")}}(a.status),c=null===a.endedAt?null:m(a.endedAt,"Task endedAt");if("running"===b&&null!==c)throw Error("Running task requires endedAt=null");if("running"!==b&&null===c)throw Error("Terminal task requires endedAt");let d=function(a){if(null===a)return null;if(!a||"object"!=typeof a)throw Error("Task detailSource is invalid");if("text-file"===a.kind){let b=j(a.path,"Task text-file path",32768);if(!(0,e.isAbsolute)(b))throw Error("Task text-file path must be absolute");return{kind:"text-file",path:b}}if("pi-conversation"!==a.kind)throw Error("Task detailSource kind is invalid");if(void 0!==a.session){var b;if(!((b=a.session)&&"object"==typeof b&&"string"==typeof b.sessionId&&"function"==typeof b.sessionManager?.getBranch&&"function"==typeof b.agent?.subscribe))throw Error("Task AgentSession is invalid");return{kind:"pi-conversation",session:a.session}}let c=j(a.sessionFile,"Task sessionFile",32768);if(!(0,e.isAbsolute)(c))throw Error("Task sessionFile must be absolute");return{kind:"pi-conversation",sessionFile:c}}(a.detailSource);if("running"!==b&&d?.kind==="pi-conversation"&&d.session){let a=d.session.sessionFile;d=a?{kind:"pi-conversation",sessionFile:a}:null}return{record:{taskId:j(a.taskId,"Task id",200),taskKind:k(a.taskKind,"Task kind",100),taskType:k(a.taskType,"Task type",100),title:j(a.title,"Task title",200),info:l(a.info),status:b,activity:function(a){if(null==a)return null;if("string"!=typeof a)throw Error("Task activity must be a string");let b=a.trim();return b?b.length<=300?b:`${b.slice(0,299)}…`:null}(a.activity),startedAt:m(a.startedAt,"Task startedAt"),endedAt:c,detailSource:d,interrupt:"running"===b&&"function"==typeof a.interrupt?a.interrupt:null},infoLoader:function(a){if(null==a)return null;if("function"!=typeof a)throw Error("Task infoLoader must be a function");return a}(a.infoLoader)}}function o(a){let{detailSource:b,interrupt:c,...d}=a;return{...d,info:d.info.map(a=>({...a}))}}function p(a){let b=[],c=[];for(let d of a)"running"===d.status?b.push(d):c.push(d);return c.sort((a,b)=>(b.endedAt??0)-(a.endedAt??0)||b.startedAt-a.startedAt),[...b,...c.slice(0,100)].sort((a,b)=>b.startedAt-a.startedAt)}g=(i.then?(await i)():i)[0];class q{constructor(a,b){this.options=b,this.records=new Map,this.infoRuntimes=new Map,this.toolRuntimeOwners=new Map,this.disposed=!1,this.detailPool=new g.Il(a=>{let b=this.records.get(a);return b?{taskId:b.taskId,status:b.status,detailSource:b.detailSource,canInterrupt:"running"===b.status&&null!==b.interrupt}:null}),this.unsubscribe=a.on(f.O0,a=>{if(!this.disposed)try{this.apply(a)}catch(a){this.options.onInvalidReport(a)}})}summaries(){return p(this.records.values()).map(o)}activeTaskIds(){return[...this.records.values()].filter(a=>"running"===a.status).map(a=>a.taskId).sort()}record(a){return this.records.get(a)??null}async watchDetail(a,b){return await this.loadInfo(a),this.detailPool.watch(a,b)}readMessage(a,b){return this.detailPool.readMessage(a,b)}readImage(a,b,c){return this.detailPool.readImage(a,b,c)}async interrupt(a){let b=this.records.get(a);if(!b)throw new r(a);if("running"!==b.status||!b.interrupt)throw new s(a);await b.interrupt()}dispose(){if(!this.disposed){for(let a of(this.disposed=!0,this.unsubscribe(),this.detailPool.dispose(),this.toolRuntimeOwners.values()))a.lease.release();this.toolRuntimeOwners.clear(),this.records.clear(),this.infoRuntimes.clear()}}setToolRuntime(a,b){let c=b?.kind==="pi-conversation"?b.session:void 0,d=this.toolRuntimeOwners.get(a);if(d?.session!==c){if(d?.lease.release(),!c)return void this.toolRuntimeOwners.delete(a);this.toolRuntimeOwners.set(a,{session:c,lease:(0,h.s)(c)})}}releaseToolRuntime(a){this.toolRuntimeOwners.get(a)?.lease.release(),this.toolRuntimeOwners.delete(a)}setInfoLoader(a,b){let c=this.infoRuntimes.get(a);if(!b||c?.loader!==b){if(!b)return void this.infoRuntimes.delete(a);this.infoRuntimes.set(a,{loader:b,promise:null})}}async loadInfo(a){let b=this.infoRuntimes.get(a);if(!b)return;if(b.promise)return b.promise;let c=(async()=>{try{var c;if(!this.records.has(a))return;let d=l(await b.loader());if(this.infoRuntimes.get(a)!==b)return;this.infoRuntimes.delete(a);let e=this.records.get(a);if(!e||(c=e.info,c.length===d.length&&c.every((a,b)=>{let c=d[b];return a.label===c?.label&&a.value===c.value})))return;e.info=d,this.options.onChanged(this.summaries(),this.activeTaskIds())}catch(b){console.warn("[Pi Desk][TaskRuntime] 按需加载任务 info 失败",{taskId:a,errorName:b instanceof Error?b.name:"UnknownError"})}finally{this.infoRuntimes.get(a)===b&&(b.promise=null)}})();b.promise=c,await c}apply(a){if(!a||"object"!=typeof a)throw Error("Task report is invalid");let b=!1,c=new Set;if("upsert"===a.type){if(!Array.isArray(a.tasks))throw Error("Task upsert requires tasks");let d=a.tasks.map(n),e=new Set;for(let a of d){if(e.has(a.record.taskId))throw Error(`Task report contains duplicate id: ${a.record.taskId}`);e.add(a.record.taskId)}for(let a of d)this.records.set(a.record.taskId,a.record),this.setToolRuntime(a.record.taskId,a.record.detailSource),this.setInfoLoader(a.record.taskId,a.infoLoader),c.add(a.record.taskId),b=!0}else if("remove"===a.type){if(!Array.isArray(a.taskIds))throw Error("Task remove requires taskIds");for(let d of a.taskIds){let a=j(d,"Task id",200),e=this.records.delete(a);this.infoRuntimes.delete(a),this.releaseToolRuntime(a),e&&c.add(a),b=e||b}}else throw Error("Task report type is invalid");if(b){for(let a of this.trimTerminalHistory())c.add(a);for(let a of c)this.detailPool.taskChanged(a);this.options.onChanged(this.summaries(),this.activeTaskIds())}}trimTerminalHistory(){let a=[],b=new Set(p(this.records.values()).map(a=>a.taskId));for(let[c,d]of this.records)"running"===d.status||b.has(c)||(this.records.delete(c),this.infoRuntimes.delete(c),this.releaseToolRuntime(c),a.push(c));return a}}class r extends Error{constructor(a){super(`Task was not found: ${a}`),this.name="L4PiTaskNotFoundError"}}class s extends Error{constructor(a){super(`Task is not interruptible: ${a}`),this.name="L4PiTaskNotInterruptibleError"}}d()}catch(a){d(a)}})},17659:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{G2:()=>i}),c(51455);var e=c(73024),f=c(76760),g=c(64791),h=a([g]);g=(h.then?(await h)():h)[0];class j extends Error{constructor(a){super(`Pi project directory is invalid: ${a}`),this.name="L4PiDirectoryInvalidError"}}function i(a){let b=(0,f.resolve)(a);try{if(!(0,e.statSync)(b).isDirectory())throw new j(b)}catch(a){if(a instanceof j)throw a;throw new j(b)}return b}d()}catch(a){d(a)}})},18200:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{p:()=>j});var e=c(51455),f=c(76760),g=c(75430),h=a([g]);async function i(a){let b;try{b=await (0,e.open)(a,"r");let c=[],d=Buffer.allocUnsafe(4096),f=0;for(;f<1048576;){let{bytesRead:a}=await b.read(d,0,d.length,null);f+=a;let e=0;for(let b=0;b<=a;b+=1){let f;if(b===a&&a>0)break;if(b<a&&10!==d[b])continue;c.push(Buffer.from(d.subarray(e,b)));let g=Buffer.concat(c).toString("utf8").trim();if(c.length=0,e=b+1,!g)continue;try{f=JSON.parse(g)}catch{continue}if(!f||"object"!=typeof f)return null;let h=f;return"session"===h.type&&"string"==typeof h.id?{id:h.id,cwd:"string"==typeof h.cwd?h.cwd:""}:null}if(0===a)return null;c.push(Buffer.from(d.subarray(e,a)))}console.warn("[Pi Desk][PiSessionDiscovery] 会话文件头超过读取上限",{path:a})}catch(b){"ENOENT"!==b.code&&console.warn("[Pi Desk][PiSessionDiscovery] 无法读取会话文件头",{path:a,message:b instanceof Error?b.message:String(b)})}finally{await b?.close()}return null}async function j(a,b,c){let d=async c=>{let d=await i(c);return d?.id===b&&""!==d.cwd&&(0,f.resolve)(d.cwd)===a},h=g.SessionManager.create(a).getSessionDir();if(c&&(0,f.dirname)((0,f.resolve)(c))===(0,f.resolve)(h)&&await d(c))return c;for(let a of(await (0,e.readdir)(h))){if(a!==`${b}.jsonl`&&!a.endsWith(`_${b}.jsonl`))continue;let c=(0,f.join)(h,a);if(await d(c))return c}let j=g.SessionManager.findById(a,b,h);return j&&await d(j)?j:null}g=(h.then?(await h)():h)[0],d()}catch(a){d(a)}})},18510:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{E:()=>g});var e=c(33448),f=a([e]);e=(f.then?(await f)():f)[0];class g{constructor(a,b){this.workId=a,this.runtime=b}static async create(a,b,c){let d=c?await e.vC.open(b,c):e.vC.create(b);return new g(a,d)}get cwd(){return this.runtime.cwd}get sessionId(){return this.runtime.sessionId}get branchId(){return this.runtime.branchId}async branch(a){let b=await this.runtime.branch(a);return{changed:b.changed,editorText:b.editorText}}async createBranchedSession(a,b){let c=this.runtime.createBranchedSession(b);return{workSession:new g(a,c.runtime),editorText:c.editorText}}async send(a){return this.runtime.send(a)}async interrupt(){await this.runtime.interrupt()}async restoreQueuedMessages(){return this.runtime.restoreQueuedMessages()}async setTitle(a){await this.runtime.setTitle(a)}async setModel(a){await this.runtime.setModel(a)}}d()}catch(a){d(a)}})},21750:(a,b,c)=>{c.d(b,{XV:()=>p,Yh:()=>o,hr:()=>q});var d=c(36153),e=c(11819),f=c(27519),g=c(41743);let h=e.y2,i=d.Ik({workId:g.eW,cwd:g.ik}).strict(),j=e.Ww,k=e.cP,l=e.zp,m=e.u2;d.Ik({repositories:d.YO(m).max(h)}).strict(),i.extend({repositoryRoot:j}).strict();let n=e.zt,o=i.extend({repositoryRoot:j,target:n}).strict(),p=i.extend({repositoryRoot:j,name:k,startPoint:n.nullable()}).strict(),q=d.Ik({repository:l}).strict();i.extend({repositoryRoot:j,path:f._g}).strict()},23349:(a,b,c)=>{c.d(b,{KE:()=>l,ds:()=>n,kM:()=>o});var d=c(36153),e=c(41743),f=c(98761),g=c(75106),h=c(69375);let i=d.Ik({}).strict(),j=d.Ik({workId:e.eW}).strict(),k=d.Ik({workId:e.eW}).strict(),l=d.Ik({cwd:e.ik.optional(),sessionId:e.Kx.optional(),branchId:d.Yj().min(1).optional(),projectName:d.Yj().trim().min(1).optional(),sessionTitle:d.Yj().trim().min(1).nullable().optional(),status:e.jw.optional(),messageCounts:e.AA.optional(),lastMessageUpdatedAt:g.k.nullable().optional()}).strict().refine(a=>Object.keys(a).length>0,{message:"work session changes cannot be empty"}),m=d.Ik({workSessions:d.YO(e.MY),pinnedCount:e.MT,appRuntime:f.GR}).strict().refine(a=>a.pinnedCount<=a.workSessions.length,{message:"pinnedCount cannot exceed work session count",path:["pinnedCount"]}),n=d.gM("type",[d.Ik({type:d.eu("snapshot"),workSessions:d.YO(e.MY),pinnedCount:e.MT}).strict().refine(a=>a.pinnedCount<=a.workSessions.length,{message:"pinnedCount cannot exceed work session count",path:["pinnedCount"]}),d.Ik({type:d.eu("update"),workId:e.eW,changes:l}).strict(),d.Ik({type:d.eu("delete"),workId:e.eW}).strict()]),o=Object.freeze({list:(0,h.Vc)({path:"work-sessions/list",inputSchema:i,outputSchema:m}),acknowledgeCompleted:(0,h.Vc)({path:"work-sessions/ack-completed",inputSchema:j,outputSchema:k}),update:(0,h._G)({path:"work-sessions/update",bodySchema:n})})},25406:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{WorkSessionBindingChangedError:()=>F,WorkSessionBranchBlockedError:()=>H,WorkSessionBranchEntryNotFoundError:()=>G,WorkSessionBranchInvalidError:()=>I,WorkSessionHistoryNotFoundError:()=>D,WorkSessionManage:()=>K,WorkSessionNotFoundError:()=>B,WorkSessionOrderConflictError:()=>A,WorkSessionProjectChangedError:()=>E,WorkSessionSessionConflictError:()=>C,getL2WorkSessionManage:()=>y,isWorkSessionDirectoryInvalidError:()=>x});var e=c(17691),f=c(77598),g=c(73024),h=c(76760),i=c(36153),j=c(63210),k=c(92411),l=c(21750),m=c(41743),n=c(23349),o=c(53120),p=c(18510),q=c(40104),r=c(17659),s=c(37787),t=c(33448),u=c(55881),v=c(55490),w=a([e,p,r,s,t,v]);[e,p,r,s,t,v]=w.then?(await w)():w;let z=i.Ik({workSessions:m.TO,pinnedCount:m.MT}).strict().refine(a=>a.pinnedCount<=a.workSessions.length,{message:"pinnedCount cannot exceed persisted work session count",path:["pinnedCount"]});class A extends Error{constructor(){super("WorkSession order does not match the current collection"),this.name="WorkSessionOrderConflictError"}}class B extends Error{constructor(a){super(`WorkSession not found: ${a}`),this.name="WorkSessionNotFoundError"}}class C extends Error{constructor(a,b){super(`Pi session ${a} is already bound to work session ${b}`),this.name="WorkSessionSessionConflictError"}}class D extends Error{constructor(a,b){super(`Pi session ${b} was not found in ${a}`),this.name="WorkSessionHistoryNotFoundError"}}class E extends Error{constructor(a,b,c){super(`WorkSession project changed: ${a} (${b} -> ${c})`),this.name="WorkSessionProjectChangedError"}}class F extends Error{constructor(a,b,c){super(`WorkSession binding changed: ${a} (${b} -> ${c})`),this.name="WorkSessionBindingChangedError"}}class G extends Error{constructor(a){super(`WorkSession branch entry was not found: ${a}`),this.name="WorkSessionBranchEntryNotFoundError"}}class H extends Error{constructor(a){super(a),this.name="WorkSessionBranchBlockedError"}}class I extends Error{constructor(a,b){super(b),this.kind=a,this.name="WorkSessionBranchInvalidError"}}class J extends Error{constructor(a){super(`WorkSession project directory is invalid: ${a}`),this.name="WorkSessionDirectoryInvalidError"}}function x(a){return a instanceof Error&&"WorkSessionDirectoryInvalidError"===a.name}class K{constructor(a=(0,h.join)((0,e.M)(),"work-sessions.json")){this.storePath=a,this.workSessionsById=new Map,this.updateListeners=new Set,this.chat=new v.yO,this.hydrated=!1,this.operationTail=Promise.resolve();const b=this.readPersistedState();this.restoredRecords=b.workSessions,this.pinnedCount=b.pinnedCount,this.rewriteLegacyStore=b.rewriteLegacyStore,this.chat.subscribeRecordChanges((a,b,c)=>this.publishChatRecordChange(a,b,c))}initialize(){return this.runExclusive(()=>this.ensureHydrated())}listWorkSessions(){return this.runExclusive(async()=>(await this.ensureHydrated(),this.createSnapshot()))}runPluginRestart(a){return this.runExclusive(async()=>{await this.ensureHydrated();let b=await this.chat.pauseForProcessRestart();try{let b=await a();return console.info("[Pi Desk][WorkSessionManage] 全部工作会话已冻结,等待插件重载"),b}catch(a){throw b(),a}})}subscribeUpdates(a){return this.updateListeners.add(a),()=>this.updateListeners.delete(a)}subscribeMessageEvents(a){return this.chat.subscribe(a)}subscribePluginPushEvents(a){return this.chat.subscribePluginPush(a)}async prepareChatSourceSyncs(a){await this.initialize();let b=a.find(a=>!this.chat.isCurrentSource(a.source));if(b)throw new v.dM(b.source);return await Promise.all(a.map(a=>this.chat.prepareSource(a.source).catch(b=>{if(this.chat.isCurrentSource(a.source))throw b}))),a.filter(a=>this.chat.isCurrentSource(a.source)).map(a=>{let b=this.chat.createSync(a.source,a.cursor);return{source:a.source,event:b.event,watermark:b.watermark}})}async getChatMessageDetail(a){return await this.initialize(),this.chat.getMessageDetail(a)}async getChatModelContext(a){return await this.initialize(),this.chat.getModelContext(a)}async getChatImage(a){return await this.initialize(),this.chat.getImage(a)}async sendChat(a){return await this.initialize(),this.chat.send(a)}async interruptChat(a){await this.initialize(),await this.chat.interrupt(a)}async compactChat(a){await this.initialize(),await this.chat.compact(a)}async reloadChat(a,b){await this.initialize(),await this.chat.reload(a,b)}async setChatPresentation(a,b){await this.initialize(),await this.chat.setPresentation(a,b)}async restoreChatQueue(a){return await this.initialize(),this.chat.restoreQueuedMessages(a)}async setChatModel(a){await this.initialize(),await this.chat.setModel(a)}async setChatCapabilityMode(a){await this.initialize(),await this.chat.setCapabilityMode(a)}getNativeUi(a){if(!this.chat.isCurrentSource(a))throw new v.dM(a);return(0,t.ls)(a.sessionId).nativeUi}async invokeSessionPluginMethod(a){return await this.initialize(),this.chat.invokePluginMethod(a)}async listNativeCommands(a){return await this.initialize(),j.WF.parse({commands:await this.chat.listNativeCommands(a.source)})}async executeNativeCommand(a){await this.initialize(),await this.chat.executeNativeCommand(a.source,a.command,a.args??"")}async listNativeTools(a){return await this.initialize(),j.RH.parse({tools:await this.chat.listNativeTools(a.source)})}async executeDirectBash(a){return await this.initialize(),j.uU.parse(await this.chat.executeDirectBash(a.source,{command:a.command,excludeFromContext:a.excludeFromContext}))}async abortDirectBash(a){await this.initialize(),await this.chat.abortDirectBash(a.source)}async listModels(a){let b=m.eW.parse(a);await this.initialize();let c=this.workSessionsById.get(b);if(!c)throw new B(b);return k.IM.parse(await (0,t.ls)(c.sessionId).listModels())}async acknowledgeCompleted(a){let b=m.eW.parse(a);if(await this.initialize(),!this.workSessionsById.has(b))throw new B(b);return this.chat.acknowledgeCompleted(b)}setWorkSessionArrangement(a,b){let c=a.map(a=>m.eW.parse(a)),d=m.MT.parse(b);return this.runExclusive(async()=>{await this.ensureHydrated();let a=Array.from(this.workSessionsById.keys());if(c.length!==a.length||d>c.length||new Set(c).size!==c.length||c.some(a=>!this.workSessionsById.has(a)))throw new A;if(c.every((b,c)=>b===a[c])&&d===this.pinnedCount)return this.createSnapshot();let b=c.map(a=>this.workSessionsById.get(a));for(let a of(this.workSessionsById.clear(),b))this.workSessionsById.set(a.workId,a);this.pinnedCount=d,this.persist();let e=this.createSnapshot();return this.publishUpdate({type:"snapshot",...e}),console.info("[Pi Desk][WorkSessionManage] 已更新工作会话排列",{workIds:c,pinnedCount:d}),e})}getWorkSession(a){let b=m.eW.parse(a);return this.runExclusive(async()=>(await this.ensureHydrated(),this.workSessionsById.get(b)??null))}getProjectPreviewContext(a,b){return this.workSessionsById.get(a.workId)!==a?null:this.chat.getProjectPreviewContext(a,b)}async replaceProjectGitBranch(a){let b=l.Yh.parse(a),c=await this.authorizeProjectFiles(b.workId,b.cwd),d=await (0,q.Ak)(c,b.repositoryRoot,b.target);return console.info("[Pi Desk][WorkSessionManage] 已切换 Git 分支",{workId:b.workId,cwd:c,repositoryRoot:b.repositoryRoot,targetType:b.target.type,targetName:b.target.name}),l.hr.parse({repository:d})}async addProjectGitBranch(a){let b=l.XV.parse(a),c=await this.authorizeProjectFiles(b.workId,b.cwd),d=await (0,q.bV)(c,b.repositoryRoot,b.name,b.startPoint);return console.info("[Pi Desk][WorkSessionManage] 已新建并切换 Git 分支",{workId:b.workId,cwd:c,repositoryRoot:b.repositoryRoot,branchName:b.name,startPointType:b.startPoint?.type??null,startPointName:b.startPoint?.name??null}),l.hr.parse({repository:d})}createWorkSession(a,b){let c,d=m.ik.parse(a),e=void 0===b?void 0:m.Kx.parse(b);try{c=(0,r.G2)(d)}catch{throw new J(d)}return this.runExclusive(async()=>{if(await this.ensureHydrated(),e){let a=this.findBoundWorkId(e);if(a)throw new C(e,a);if(!await (0,s.vg)(c,e))throw new D(c,e)}let a=await p.E.create((0,f.randomUUID)(),c,e);this.chat.addWorkSession(a),this.insertUnpinnedWorkSession(a),this.persist();let b=this.toListItem(a),d=this.createSnapshot();return this.publishUpdate({type:"snapshot",...d}),console.info("[Pi Desk][WorkSessionManage] 已创建工作会话",{workId:a.workId,cwd:a.cwd,sessionId:a.sessionId,creationType:e?"history":"empty"}),b})}renameWorkSession(a){let b=m.qL.parse(a);return this.runExclusive(async()=>{await this.ensureHydrated();let a=this.workSessionsById.get(b.workId);if(!a)throw new B(b.workId);this.assertSessionBinding(a,b.sessionId),await this.chat.setTitle(a,b.title)})}replaceWorkSession(a,b){let c=m.eW.parse(a),d=b?{cwd:m.ik.parse(b.cwd),sessionId:m.Kx.parse(b.sessionId)}:null;return this.runExclusive(async()=>{let a;await this.ensureHydrated();let b=this.workSessionsById.get(c);if(!b)throw new B(c);if(d&&b.cwd===d.cwd&&b.sessionId===d.sessionId)return this.createSnapshot();if(d){let a=this.findBoundWorkId(d.sessionId);if(a&&a!==c)throw new C(d.sessionId,a)}let e=this.toListItem(b);await this.chat.pauseWorkSession(c);try{a=await p.E.create(c,d?.cwd??b.cwd,d?.sessionId),await this.chat.replaceWorkSession(b,a)}catch(a){throw this.chat.resumeWorkSession(c),a}this.workSessionsById.set(c,a),this.persist();let f=this.toListItem(a),g=this.createSnapshot(),h=this.toChanges(e,f);return h&&this.publishUpdate({type:"update",workId:c,changes:h}),console.info("[Pi Desk][WorkSessionManage] 已替换 Pi 会话",{workId:c,replacementType:d?"history":"empty",previousCwd:b.cwd,previousSessionId:b.sessionId,cwd:a.cwd,sessionId:a.sessionId,branchId:a.branchId}),g})}getWorkSessionTree(a){let b=o.i0.parse(a);return this.runExclusive(async()=>{await this.ensureHydrated();let a=this.workSessionsById.get(b.workId);if(!a)throw new B(b.workId);return this.assertSessionBinding(a,b.sessionId),o.u1.parse(await (0,t.ls)(a.sessionId).readSessionTree())})}getWorkSessionTreeEntry(a){let b=o.iW.parse(a);return this.runExclusive(async()=>{await this.ensureHydrated();let a=this.workSessionsById.get(b.workId);if(!a)throw new B(b.workId);this.assertSessionBinding(a,b.sessionId);try{return o.Cn.parse(await (0,t.ls)(a.sessionId).readSessionTreeEntryDetail(b.entryId))}catch(a){if(a instanceof u.Ns)throw new G(b.entryId);throw a}})}branchWorkSession(a){let b=o.g$.parse(a);return this.runExclusive(async()=>{let a;await this.ensureHydrated();let c=this.workSessionsById.get(b.workId);if(!c)throw new B(b.workId);if(this.assertSessionBinding(c,b.sessionId),"tree"===b.action){let a,d=this.toListItem(c);await this.chat.pauseWorkSession(c.workId);try{(a=await c.branch(b.entryId)).changed?await this.chat.refreshWorkSession(c):this.chat.resumeWorkSession(c.workId)}catch(a){if(c.branchId!==d.branchId){await this.chat.refreshWorkSession(c);let a=this.toChanges(d,this.toListItem(c));a&&this.publishUpdate({type:"update",workId:c.workId,changes:a})}else this.chat.resumeWorkSession(c.workId);this.throwBranchError(a,b.entryId)}let e=this.toListItem(c),f=this.toChanges(d,e);f&&this.publishUpdate({type:"update",workId:c.workId,changes:f});let g=this.createSnapshot();return console.info("[Pi Desk][WorkSessionManage] 已切换当前 JSONL 分支",{workId:c.workId,cwd:c.cwd,sessionId:c.sessionId,entryId:b.entryId,branchId:c.branchId,changed:a.changed}),o.WJ.parse({...g,targetWorkId:c.workId,editorText:a.editorText})}"clone"===b.action&&await this.chat.pauseWorkSession(c.workId);try{a=await c.createBranchedSession((0,f.randomUUID)(),"fork"===b.action?{position:"before",entryId:b.entryId}:{position:"at"}),this.chat.addWorkSession(a.workSession)}catch(a){this.throwBranchError(a,"entryId"in b?b.entryId:null)}finally{"clone"===b.action&&this.chat.resumeWorkSession(c.workId)}let d=a.workSession;this.insertUnpinnedWorkSession(d),this.persist();let e=this.createSnapshot();return this.publishUpdate({type:"snapshot",...e}),console.info("[Pi Desk][WorkSessionManage] 已创建分支 WorkSession",{action:b.action,sourceWorkId:c.workId,sourceSessionId:c.sessionId,workId:d.workId,cwd:d.cwd,entryId:"entryId"in b?b.entryId:null,sessionId:d.sessionId,branchId:d.branchId}),o.WJ.parse({...e,targetWorkId:d.workId,editorText:a.editorText})})}removeWorkSession(a){let b=m.eW.parse(a);return this.runExclusive(async()=>{await this.ensureHydrated();let a=this.workSessionsById.get(b);if(!a)return!1;let c=Array.from(this.workSessionsById.keys()).indexOf(b);return await this.chat.pauseWorkSession(b),await this.chat.removeWorkSession(a),this.workSessionsById.delete(b),c<this.pinnedCount&&(this.pinnedCount-=1),this.persist(),this.publishUpdate({type:"delete",workId:b}),console.info("[Pi Desk][WorkSessionManage] 已删除工作会话",{workId:b,pinnedCount:this.pinnedCount}),!0})}async ensureHydrated(){if(this.hydrated)return;let a=performance.now();console.info("[Pi Desk][WorkSessionManage] 开始恢复工作会话",{workSessionCount:this.restoredRecords.length});let b=await Promise.all(this.restoredRecords.map(a=>p.E.create(a.workId,a.cwd,a.sessionId))),c=performance.now();await this.chat.initialize(b);let d=performance.now();for(let e of(console.info("[Pi Desk][WorkSessionManage] 工作会话恢复完成",{workSessionCount:b.length,durationMs:Math.round(d-a),sessionOpenMs:Math.round(c-a),messageProjectionMs:Math.round(d-c)}),b))this.workSessionsById.set(e.workId,e);this.hydrated=!0,this.rewriteLegacyStore&&(this.persist(),this.rewriteLegacyStore=!1,console.info("[Pi Desk][WorkSessionManage] 已升级工作会话持久化格式",{workSessionCount:b.length,pinnedCount:this.pinnedCount}))}async authorizeProjectFiles(a,b){await this.initialize();let c=this.workSessionsById.get(a);if(!c)throw new B(a);if(c.cwd!==b)throw new E(a,b,c.cwd);return c.cwd}findBoundWorkId(a){for(let b of this.workSessionsById.values())if(b.sessionId===a)return b.workId}insertUnpinnedWorkSession(a){let b=this.orderedWorkSessions();for(let c of(b.splice(this.pinnedCount,0,a),this.workSessionsById.clear(),b))this.workSessionsById.set(c.workId,c)}assertSessionBinding(a,b){if(a.sessionId!==b)throw new F(a.workId,b,a.sessionId)}throwBranchError(a,b){if(a instanceof u.Ns)throw new G(b??"");if(a instanceof u.dX)throw new I("fork-target","只有用户消息可以 Fork");if(a instanceof t.er)throw new I("clone-empty","当前会话还没有可克隆的消息");if(a instanceof t.Wo)throw new H(a.message);throw a}orderedWorkSessions(){return Array.from(this.workSessionsById.values())}createSnapshot(){return m.kg.parse({workSessions:this.orderedWorkSessions().map(a=>this.toListItem(a)),pinnedCount:this.pinnedCount})}toRecord(a){return m.ER.parse({workId:a.workId,cwd:a.cwd,sessionId:a.sessionId})}toListItem(a){let b=this.chat.metadataFor(a);return m.MY.parse({...this.toRecord(a),branchId:a.branchId,projectName:(0,h.basename)(a.cwd)||a.cwd,sessionTitle:b.sessionTitle,status:this.chat.statusFor(a),messageCounts:b.messageCounts,lastMessageUpdatedAt:b.lastMessageUpdatedAt})}toChanges(a,b){let c={};return a.cwd!==b.cwd&&(c.cwd=b.cwd),a.sessionId!==b.sessionId&&(c.sessionId=b.sessionId),a.branchId!==b.branchId&&(c.branchId=b.branchId),a.projectName!==b.projectName&&(c.projectName=b.projectName),a.sessionTitle!==b.sessionTitle&&(c.sessionTitle=b.sessionTitle),a.status!==b.status&&(c.status=b.status),(a.messageCounts.user!==b.messageCounts.user||a.messageCounts.total!==b.messageCounts.total)&&(c.messageCounts=b.messageCounts),a.lastMessageUpdatedAt!==b.lastMessageUpdatedAt&&(c.lastMessageUpdatedAt=b.lastMessageUpdatedAt),0===Object.keys(c).length?null:n.KE.parse(c)}publishChatRecordChange(a,b,c){if(!this.hydrated)return;let d=this.workSessionsById.get(a);if(!d)return;let e=this.toListItem(d),f=this.toChanges({...e,...b,status:c},e);f&&this.publishUpdate({type:"update",workId:a,changes:f})}publishUpdate(a){let b=n.ds.parse(a);for(let a of[...this.updateListeners])try{a(b)}catch(a){console.error("[Pi Desk][WorkSessionManage] 推送工作会话变化失败",{updateType:b.type,errorName:a instanceof Error?a.name:"UnknownError"})}}readPersistedState(){if(!(0,g.existsSync)(this.storePath))return{workSessions:[],pinnedCount:0,rewriteLegacyStore:!1};let a=JSON.parse((0,g.readFileSync)(this.storePath,"utf8")),b=Array.isArray(a),c=b?z.parse({workSessions:m.TO.parse(a),pinnedCount:0}):z.parse(a),d=new Set,e=new Set;for(let a of c.workSessions){if(d.has(a.workId))throw Error(`Duplicate persisted workId: ${a.workId}`);if(e.has(a.sessionId))throw Error(`Duplicate persisted sessionId binding: ${a.sessionId}`);d.add(a.workId),e.add(a.sessionId)}return{...c,rewriteLegacyStore:b}}persist(){let a=z.parse({workSessions:this.orderedWorkSessions().map(a=>this.toRecord(a)),pinnedCount:this.pinnedCount});(0,g.mkdirSync)((0,h.dirname)(this.storePath),{recursive:!0});let b=`${this.storePath}.${process.pid}.${(0,f.randomUUID)()}.tmp`;try{(0,g.writeFileSync)(b,`${JSON.stringify(a,null,2)}
14
- `,"utf8"),(0,g.renameSync)(b,this.storePath)}finally{(0,g.existsSync)(b)&&(0,g.unlinkSync)(b)}}runExclusive(a){let b=this.operationTail.then(a,a);return this.operationTail=b.then(()=>void 0,()=>void 0),b}}function y(){return globalThis.__piDeskWorkSessionManage||(globalThis.__piDeskWorkSessionManage=new K),globalThis.__piDeskWorkSessionManage}d()}catch(a){d(a)}})},25776:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{p:()=>r});var e=c(76760),f=c(75430),g=c(42035),h=c(36153),i=c(6277),j=c(15819),k=c(64007),l=a([f,j]);[f,j]=l.then?(await l)():l;let m=h.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),n=h.g1(h.Yj(),h.Pq()),o=h.g1(h.Yj().min(1),h.KC([n,h.ch()])),p=h.Ik({pluginName:m,event:m,data:n}).strict(),q=h.Ik({directory:h.Yj().min(1).max(4096).refine(a=>(0,e.isAbsolute)(a)&&!a.includes("\0")),default:h.zM().optional()}).strict();class r{constructor(a){this.options=a,this.controller=(0,f.createEventBus)(),this.slots=new Map,this.methods=new Map,this.unsubscribe=()=>void 0,this.unsubscribePush=()=>void 0,this.unsubscribePreviewDirectory=()=>void 0,this.disposed=!1,this.eventBus={emit:(a,b)=>{if(!this.disposed){if(a===g.Sl)return void this.applyMethodEvent(b);this.controller.emit(a,b)}},on:(a,b)=>this.disposed?()=>void 0:this.controller.on(a,b)},this.bindChannels()}createTaskRuntime(){let a=this.options;return new j.jd(this.controller,{onChanged:(b,c)=>{this.applyTaskSummaries(b),a.onTasksChanged(c),a.onChanged()},onInvalidReport:b=>a.onInvalidUpdate(b)})}bindChannels(){let a=this.options;this.taskRuntime=this.createTaskRuntime(),this.unsubscribe=this.controller.on(g.k0,b=>{if(this.disposed)return;let c=o.safeParse(b);if(!c.success)return void a.onInvalidUpdate(c.error);try{this.apply(c.data)&&a.onChanged()}catch(b){a.onInvalidUpdate(b)}}),this.unsubscribePreviewDirectory=this.controller.on(g.Nx,b=>{if(this.disposed)return;let c=q.safeParse(b);if(!c.success)return void a.onInvalidUpdate(c.error);try{this.applyPreviewDirectory(c.data)&&a.onChanged()}catch(b){a.onInvalidUpdate(b)}}),this.unsubscribePush=this.controller.on(g.Nb,b=>{if(this.disposed)return;let c=p.safeParse(b);c.success?Buffer.byteLength(JSON.stringify(c.data.data),"utf8")>65536?a.onInvalidUpdate(Error("Session Plugin Push data exceeds 64KB")):a.onPush(structuredClone(c.data)):a.onInvalidUpdate(c.error)})}activeTaskIds(){return this.taskRuntime.activeTaskIds()}taskRecord(a){return this.taskRuntime.record(a)}watchTaskDetail(a,b){return this.taskRuntime.watchDetail(a,b)}readTaskMessage(a,b){return this.taskRuntime.readMessage(a,b)}readTaskImage(a,b,c){return this.taskRuntime.readImage(a,b,c)}interruptTask(a){return this.taskRuntime.interrupt(a)}snapshot(){return Object.fromEntries([...this.slots.entries()].sort(([a],[b])=>a.localeCompare(b)).map(([a,b])=>[a,structuredClone(b.value)]))}async invokeMethod(a,b,c,d,e){if(this.disposed)throw Error("Pi session plugin runtime has been disposed");let f=(0,k.FX)(a),g=(0,k.QK)(b),h=this.methods.get((0,k.$m)(f,g));if(!h)throw new k.Tk(f,g);let i=await h.execute((0,k.nJ)(c,"input"),{source:d,extensionContext:e});return(0,k.nJ)(i,"output")}resetBranch(){this.disposed||(this.taskRuntime.dispose(),this.slots.clear(),this.taskRuntime=this.createTaskRuntime(),this.options.onTasksChanged([]),this.options.onChanged())}reset(){this.disposed||(this.unsubscribe(),this.unsubscribePush(),this.unsubscribePreviewDirectory(),this.taskRuntime.dispose(),this.controller.clear(),this.methods.clear(),this.slots.clear(),this.bindChannels(),this.options.onTasksChanged([]),this.options.onChanged())}dispose(){this.disposed||(this.disposed=!0,this.unsubscribe(),this.unsubscribePush(),this.unsubscribePreviewDirectory(),this.taskRuntime.dispose(),this.controller.clear(),this.methods.clear(),this.slots.clear())}applyMethodEvent(a){if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Session plugin method event is invalid");let b=a.registration;if("register"!==a.type&&"unregister"!==a.type||!b||"object"!=typeof b||"string"!=typeof b.pluginName||"string"!=typeof b.method||"function"!=typeof b.execute)throw Error("Session plugin method registration is invalid");let c=(0,k.FX)(b.pluginName),d=(0,k.QK)(b.method),e=(0,k.$m)(c,d);if("register"===a.type){if(this.methods.has(e))throw new k.qs(c,d);this.methods.set(e,b);return}this.methods.get(e)===b&&this.methods.delete(e)}applyTaskSummaries(a){if(0===a.length)return void this.slots.delete("task-center");let b={tasks:a.map(a=>({...a,info:a.info.map(a=>({...a}))}))};this.slots.set("task-center",{serialized:JSON.stringify(b),value:b})}applyPreviewDirectory(a){let b=(0,e.resolve)(a.directory),c=(0,i.Yj)(b),d=this.slots.get(i.s6),f=(0,i.D)(d?.value),g=f.directories.find(a=>(0,i.Yj)(a)===c);if(!g&&f.directories.length>=i.xI)throw Error(`会话预览目录数量已达上限 ${i.xI}`);let h=g??b,j={directories:g?f.directories:[...f.directories,h],defaultDirectory:!0===a.default?h:f.defaultDirectory},k=JSON.stringify(j);return d?.serialized!==k&&(this.slots.set(i.s6,{serialized:k,value:j}),!0)}apply(a){if(Object.hasOwn(a,"task-center"))throw Error("task-center plugin slot is reserved by the Task Runtime");if(Object.hasOwn(a,i.s6))throw Error("project-preview 插件槽由会话预览目录登记管理");let b=!1;for(let[c,d]of Object.entries(a)){if(null===d){b=this.slots.delete(c)||b;continue}let a=JSON.stringify(d);this.slots.get(c)?.serialized!==a&&(this.slots.set(c,{serialized:a,value:d}),b=!0)}return b}}d()}catch(a){d(a)}})},26178:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{oj:()=>f.oj});var e=c(48958),f=c(3086),g=a([e,f]);[e,f]=g.then?(await g)():g,d()}catch(a){d(a)}})},27177:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{h:()=>n});var e=c(76760),f=c(75430),g=c(44493),h=c(47154),i=c(30987),j=a([f,g,i]);[f,g,i]=j.then?(await j)():j;let m=[{name:"codemode",create:f.createCodemodeExtension},{name:"tool-search",create:f.createToolSearchExtension},{name:"mcp",create:()=>(0,f.createMcpExtension)({openUrl:()=>void 0})}];function k(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}
14
+ `,"utf8"),(0,g.renameSync)(b,this.storePath)}finally{(0,g.existsSync)(b)&&(0,g.unlinkSync)(b)}}runExclusive(a){let b=this.operationTail.then(a,a);return this.operationTail=b.then(()=>void 0,()=>void 0),b}}function y(){return globalThis.__piDeskWorkSessionManage||(globalThis.__piDeskWorkSessionManage=new K),globalThis.__piDeskWorkSessionManage}d()}catch(a){d(a)}})},25776:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{p:()=>r});var e=c(76760),f=c(75430),g=c(42035),h=c(36153),i=c(6277),j=c(15819),k=c(64007),l=a([f,j]);[f,j]=l.then?(await l)():l;let m=h.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),n=h.g1(h.Yj(),h.Pq()),o=h.g1(h.Yj().min(1),h.KC([n,h.ch()])),p=h.Ik({pluginName:m,event:m,data:n}).strict(),q=h.Ik({directory:h.Yj().min(1).max(4096).refine(a=>(0,e.isAbsolute)(a)&&!a.includes("\0")),default:h.zM().optional()}).strict();class r{constructor(a){this.options=a,this.controller=(0,f.createEventBus)(),this.slots=new Map,this.methods=new Map,this.unsubscribe=()=>void 0,this.unsubscribePush=()=>void 0,this.unsubscribePreviewDirectory=()=>void 0,this.disposed=!1,this.eventBus={emit:(a,b)=>{if(!this.disposed){if(a===g.Sl)return void this.applyMethodEvent(b);this.controller.emit(a,b)}},on:(a,b)=>this.disposed?()=>void 0:this.controller.on(a,b)},this.bindChannels()}createTaskRuntime(){let a=this.options;return new j.jd(this.controller,{onChanged:(b,c)=>{this.applyTaskSummaries(b),a.onTasksChanged(c),a.onChanged()},onInvalidReport:b=>a.onInvalidUpdate(b)})}bindChannels(){let a=this.options;this.taskRuntime=this.createTaskRuntime(),this.unsubscribe=this.controller.on(g.k0,b=>{if(this.disposed)return;let c=o.safeParse(b);if(!c.success)return void a.onInvalidUpdate(c.error);try{this.apply(c.data)&&a.onChanged()}catch(b){a.onInvalidUpdate(b)}}),this.unsubscribePreviewDirectory=this.controller.on(g.Nx,b=>{if(this.disposed)return;let c=q.safeParse(b);if(!c.success)return void a.onInvalidUpdate(c.error);try{this.applyPreviewDirectory(c.data)&&a.onChanged()}catch(b){a.onInvalidUpdate(b)}}),this.unsubscribePush=this.controller.on(g.Nb,b=>{if(this.disposed)return;let c=p.safeParse(b);c.success?Buffer.byteLength(JSON.stringify(c.data.data),"utf8")>65536?a.onInvalidUpdate(Error("Session Plugin Push data exceeds 64KB")):a.onPush(structuredClone(c.data)):a.onInvalidUpdate(c.error)})}activeTaskIds(){return this.taskRuntime.activeTaskIds()}taskRecord(a){return this.taskRuntime.record(a)}watchTaskDetail(a,b){return this.taskRuntime.watchDetail(a,b)}readTaskMessage(a,b){return this.taskRuntime.readMessage(a,b)}readTaskImage(a,b,c){return this.taskRuntime.readImage(a,b,c)}interruptTask(a){return this.taskRuntime.interrupt(a)}snapshot(){return Object.fromEntries([...this.slots.entries()].sort(([a],[b])=>a.localeCompare(b)).map(([a,b])=>[a,structuredClone(b.value)]))}async invokeMethod(a,b,c,d,e){if(this.disposed)throw Error("Pi session plugin runtime has been disposed");let f=(0,k.FX)(a),g=(0,k.QK)(b),h=this.methods.get((0,k.$m)(f,g));if(!h)throw new k.Tk(f,g);let i=await h.execute((0,k.nJ)(c,"input"),{source:d,extensionContext:e});return(0,k.nJ)(i,"output")}resetBranch(){this.disposed||(this.taskRuntime.dispose(),this.slots.clear(),this.taskRuntime=this.createTaskRuntime(),this.options.onTasksChanged([]),this.options.onChanged())}reset(){this.disposed||(this.unsubscribe(),this.unsubscribePush(),this.unsubscribePreviewDirectory(),this.taskRuntime.dispose(),this.controller.clear(),this.methods.clear(),this.slots.clear(),this.bindChannels(),this.options.onTasksChanged([]),this.options.onChanged())}dispose(){this.disposed||(this.disposed=!0,this.unsubscribe(),this.unsubscribePush(),this.unsubscribePreviewDirectory(),this.taskRuntime.dispose(),this.controller.clear(),this.methods.clear(),this.slots.clear())}applyMethodEvent(a){if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Session plugin method event is invalid");let b=a.registration;if("register"!==a.type&&"unregister"!==a.type||!b||"object"!=typeof b||"string"!=typeof b.pluginName||"string"!=typeof b.method||"function"!=typeof b.execute)throw Error("Session plugin method registration is invalid");let c=(0,k.FX)(b.pluginName),d=(0,k.QK)(b.method),e=(0,k.$m)(c,d);if("register"===a.type){if(this.methods.has(e))throw new k.qs(c,d);this.methods.set(e,b);return}this.methods.get(e)===b&&this.methods.delete(e)}applyTaskSummaries(a){if(0===a.length)return void this.slots.delete("task-center");let b={tasks:a.map(a=>({...a,info:a.info.map(a=>({...a}))}))};this.slots.set("task-center",{serialized:JSON.stringify(b),value:b})}applyPreviewDirectory(a){let b=(0,e.resolve)(a.directory),c=(0,i.Yj)(b),d=this.slots.get(i.s6),f=(0,i.D)(d?.value),g=f.directories.find(a=>(0,i.Yj)(a)===c);if(!g&&f.directories.length>=i.xI)throw Error(`会话预览目录数量已达上限 ${i.xI}`);let h=g??b,j={directories:g?f.directories:[...f.directories,h],defaultDirectory:!0===a.default?h:f.defaultDirectory},k=JSON.stringify(j);return d?.serialized!==k&&(this.slots.set(i.s6,{serialized:k,value:j}),!0)}apply(a){if(Object.hasOwn(a,"task-center"))throw Error("task-center plugin slot is reserved by the Task Runtime");if(Object.hasOwn(a,i.s6))throw Error("project-preview 插件槽由会话预览目录登记管理");let b=!1;for(let[c,d]of Object.entries(a)){if(null===d){b=this.slots.delete(c)||b;continue}let a=JSON.stringify(d);this.slots.get(c)?.serialized!==a&&(this.slots.set(c,{serialized:a,value:d}),b=!0)}return b}}d()}catch(a){d(a)}})},26178:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{oj:()=>f.oj});var e=c(48958),f=c(3086),g=a([e,f]);[e,f]=g.then?(await g)():g,d()}catch(a){d(a)}})},27177:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{h:()=>n});var e=c(76760),f=c(75430),g=c(44493),h=c(33290),i=c(30987),j=a([f,g,i]);[f,g,i]=j.then?(await j)():j;let m=[{name:"codemode",create:f.createCodemodeExtension},{name:"tool-search",create:f.createToolSearchExtension},{name:"mcp",create:()=>(0,f.createMcpExtension)({openUrl:()=>void 0})}];function k(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}
15
15
  来源:${a.path}`}async function l(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}
16
16
  当前步骤耗时:${b} 毫秒
17
- 原因:${c instanceof Error?c.message:String(c)}`,{cause:c})}finally{let b=Math.round(performance.now()-d);b>=1e3&&console.info("[Pi Desk][PluginResources] 资源步骤耗时",{stage:a,durationMs:b})}}class n{current(a,b,c,d){if(this.selection)return d?.("等待已选择的插件资源准备完成"),this.selection;d?.(`等待插件资源队列
18
- 工作目录:${a}`);let e=performance.now();return this.selection=(0,h.V)(()=>{let f=Math.round(performance.now()-e);return f>=1e3&&console.info("[Pi Desk][PluginResources] 插件资源队列等待结束",{cwd:a,durationMs:f}),this.discover(a,b,c,d)}),this.selection}async discover(a,b,c,d){await l(`读取 Pi 配置
17
+ 原因:${c instanceof Error?c.message:String(c)}`,{cause:c})}finally{let b=Math.round(performance.now()-d);b>=1e3&&console.info("[Pi Desk][PluginResources] 资源步骤耗时",{stage:a,durationMs:b})}}class n{current(a,b,c,d){return this.selection?d?.("等待已选择的插件资源准备完成"):this.selection=this.discover(a,b,c,d),this.selection}async discover(a,b,c,d){await l(`读取 Pi 配置
19
18
  配置目录:${b}
20
- 工作目录:${a}`,d,()=>c.reload());let e=new f.DefaultPackageManager({cwd:a,agentDir:b,settingsManager:c,builtinExtensions:m.map(a=>a.name)}),g=await l("发现已配置的插件与资源",d,()=>e.resolve(async a=>{throw Error(`插件包未安装:${a}`)})),h=await (0,i.n)(b,e,c),j=async a=>{let b=await Promise.all(a.map(async a=>a.enabled&&!await h(a.metadata.source,a.path,"user"===a.metadata.scope&&"package"===a.metadata.origin)));return a.filter((a,c)=>b[c])};return{extensions:await j(g.extensions),skills:await j(g.skills),prompts:await j(g.prompts),themes:await j(g.themes)}}reset(){this.selection=null}async createServices(a,b,c){let d,h=(0,f.getAgentDir)(),i=f.SettingsManager.create(a,h),j=[],n=await l(`读取模型与认证配置
21
- 配置目录:${h}`,c,()=>f.ModelRuntime.create({authPath:(0,e.join)(h,"auth.json"),modelsPath:(0,e.join)(h,"models.json")})),o=async j=>{j&&((0,g.N)(),this.reset(),await l("重新读取 Pi 配置",c,()=>i.reload()));let n=await this.current(a,h,i,c),o=n.extensions.filter(a=>a.path.startsWith("builtin:")).map(a=>a.path),p=n.extensions.filter(a=>!a.path.startsWith("builtin:")).map(a=>({name:a.path,factory:async b=>{let d=k(a),e=await l(`${d}
19
+ 工作目录:${a}`,d,()=>c.reload());let e=new f.DefaultPackageManager({cwd:a,agentDir:b,settingsManager:c,builtinExtensions:m.map(a=>a.name)}),g=await l("发现已配置的插件与资源",d,()=>e.resolve(async b=>{let c=`插件包未安装或版本不匹配,已跳过:${b}`;return(0,h.pL)(a,c),console.warn("[Pi Desk][PluginResources]",{cwd:a,message:c}),"skip"})),j=await (0,i.n)(b,e,c),k=async a=>{let b=await Promise.all(a.map(async a=>a.enabled&&!await j(a.metadata.source,a.path,"user"===a.metadata.scope&&"package"===a.metadata.origin)));return a.filter((a,c)=>b[c])};return{extensions:await k(g.extensions),skills:await k(g.skills),prompts:await k(g.prompts),themes:await k(g.themes)}}reset(){this.selection=null}async createServices(a,b,c){let d,i=(0,f.getAgentDir)(),j=f.SettingsManager.create(a,i),n=[],o=await l(`读取模型与认证配置
20
+ 配置目录:${i}`,c,()=>f.ModelRuntime.create({authPath:(0,e.join)(i,"auth.json"),modelsPath:(0,e.join)(i,"models.json")})),p=async h=>{h&&((0,g.N)(),this.reset(),await l("重新读取 Pi 配置",c,()=>j.reload()));let n=await this.current(a,i,j,c),o=n.extensions.filter(a=>a.path.startsWith("builtin:")).map(a=>a.path),p=n.extensions.filter(a=>!a.path.startsWith("builtin:")).map(a=>({name:a.path,factory:async b=>{let d=k(a),e=await l(`${d}
22
21
  步骤:导入插件模块`,c,()=>(0,g.G)(a.path).catch(a=>{if(a instanceof Error&&a.message.includes("不支持模块顶层 await"))throw Error("原生扩展不支持模块顶层 await,请将异步初始化放入 async 工厂函数",{cause:a});throw a}));await l(`${d}
23
- 步骤:执行插件工厂`,c,async()=>{if("function"!=typeof e.default)throw Error(`扩展必须导出工厂函数:${a.path}`);await e.default(b)})}})),q=f.SettingsManager.inMemory({},{projectTrusted:i.isProjectTrusted()});d=new f.DefaultResourceLoader({...b,cwd:a,agentDir:h,settingsManager:q,noExtensions:!0,noSkills:!0,noPromptTemplates:!0,noThemes:!0,extensionFactories:[...m.map(({name:a,create:b})=>({name:a,factory:b(),builtin:!0,replaceable:!0})),...p],additionalExtensionPaths:o,additionalSkillPaths:n.skills.map(a=>a.path),additionalPromptTemplatePaths:n.prompts.map(a=>a.path),additionalThemePaths:n.themes.map(a=>a.path)}),c?.("装配插件与会话资源"),await d.reload();let r=(a,b,c)=>{if(b)for(let d of c){let c=(0,e.relative)(d.path,b);if(!(c.startsWith("..")||(0,e.isAbsolute)(c))){a.sourceInfo={...d.metadata,path:b};break}}};for(let a of d.getSkills().skills)r(a,a.filePath,n.skills);for(let a of d.getPrompts().prompts)r(a,a.filePath,n.prompts);for(let a of d.getThemes().themes)r(a,a.sourcePath,n.themes);let s=d.getExtensions();for(let a of s.extensions){let b=n.extensions.find(b=>a.path===`<inline:${b.path}>`);if(b){for(let[d,e]of(a.path=b.path,a.resolvedPath=b.path,a.sourceInfo={...b.metadata,path:b.path},[["session_start","启动会话(session_start)"],["session_shutdown","关闭会话(session_shutdown)"],["resources_discover","补充会话资源(resources_discover)"]])){let f=a.handlers.get(d);f&&a.handlers.set(d,f.map(a=>(...d)=>l(`${k(b)}
24
- 步骤:${e}`,c,()=>a(...d))))}for(let b of a.tools.values())b.sourceInfo=a.sourceInfo;for(let b of a.commands.values())b.sourceInfo=a.sourceInfo}}for(let a of s.errors){let b=n.extensions.find(b=>a.path===`<inline:${b.path}>`);b&&(a.path=b.path)}};await o(!1);let p=new Proxy(d,{get:(a,b)=>{if("reload"===b)return()=>o(!0);let c=Reflect.get(d,b,d);return"function"==typeof c?c.bind(d):c}}),q=p.getExtensions().runtime;for(let{name:a,config:b,extensionPath:c}of q.pendingProviderRegistrations)try{n.registerProvider(a,b)}catch(a){j.push({type:"error",message:`${c}: ${String(a)}`})}for(let{provider:a,extensionPath:b}of q.pendingNativeProviderRegistrations)try{n.registerNativeProvider(a)}catch(a){j.push({type:"error",message:`${b}: ${String(a)}`})}for(let{definition:a,extensionPath:b}of q.pendingVirtualModelRegistrations)try{n.registerVirtualModel(a)}catch(a){j.push({type:"error",message:`${b}: ${String(a)}`})}return q.pendingProviderRegistrations=[],q.pendingNativeProviderRegistrations=[],q.pendingVirtualModelRegistrations=[],await l("刷新模型与认证配置",c,()=>n.refresh({allowNetwork:!1})),j.push(...i.drainErrors().map(({error:a})=>({type:"error",message:a.message}))),{cwd:a,agentDir:h,settingsManager:i,modelRuntime:n,resourceLoader:p,diagnostics:j}}constructor(){this.selection=null}}d()}catch(a){d(a)}})},27519:(a,b,c)=>{c.d(b,{_g:()=>g,eC:()=>h,rh:()=>f});var d=c(36153);function e(a,b){return""===a?b:!(a.length>4096||a.startsWith("/")||a.includes("\\")||a.includes("\0")||/^[a-zA-Z]:/.test(a))&&a.split("/").every(a=>a.length>0&&"."!==a&&".."!==a)}let f=d.Yj().max(4096).refine(a=>e(a,!0),"目录路径必须是规范相对路径"),g=d.Yj().min(1).max(4096).refine(a=>e(a,!1),"文件路径必须是规范相对路径"),h=d.Yj().min(1).max(4096).refine(a=>e(a,!1)||a.length>0&&a.length<=4096&&!a.includes("\0")&&(a.startsWith("/")||a.startsWith("\\\\")||/^[a-zA-Z]:[\\/]/.test(a)),"预览路径必须是规范相对路径或绝对路径");d.k5(["compressed","original"]);let i=d.k5(["image/jpeg","image/png","image/webp","image/gif"]),j=d.Ik({name:d.Yj().min(1),type:d.k5(["directory","file"])}).strict();d.Ik({entries:d.YO(j).max(5e3),truncated:d.zM()}).strict(),d.Ik({query:d.Yj().min(1).max(200).refine(a=>a.trim().length>0&&!/[\0\r\n]/.test(a),"搜索词必须是非空单行文本"),scope:d.k5(["all","files","content"]).default("all"),caseSensitive:d.zM().default(!1),wholeWord:d.zM().default(!1),regex:d.zM().default(!1)}).strict();let k=d.Ik({start:d.ai().int().nonnegative(),end:d.ai().int().nonnegative()}).strict().refine(a=>a.start<=a.end,"搜索命中区间无效"),l=d.Ik({path:g,ranges:d.YO(k)}).strict().refine(a=>a.ranges.every(b=>b.end<=a.path.length),"文件名命中区间越界"),m=d.Ik({path:g,line:d.ai().int().positive(),text:d.Yj().max(1e3),ranges:d.YO(k)}).strict().refine(a=>a.ranges.every(b=>b.end<=a.text.length),"正文命中区间越界");d.Ik({fileMatches:d.YO(l).max(100),contentMatches:d.YO(m).max(200),truncated:d.zM()}).strict(),d.gM("kind",[d.Ik({kind:d.eu("text"),content:d.Yj(),size:d.ai().int().nonnegative().max(5242880)}).strict(),d.Ik({kind:d.eu("image"),mimeType:i,data:d.Yj().min(1),size:d.ai().int().positive().max(0xa00000)}).strict()])},32757:(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(78555),h=c(60161),i=c(35350),j=c(42118),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)}})},33448:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Wo:()=>u,er:()=>v,gb:()=>s,ls:()=>r,vC:()=>w,wz:()=>t});var e=c(73024),f=c(76760),g=c(75430),h=c(8438),i=c(6676),j=c(94074),k=c(60161),l=c(37787),m=c(7832),n=c(55881),o=c(27177),p=a([g,h,i,l,o]);[g,h,i,l,o]=p.then?(await p)():p;class u extends Error{constructor(a){super(a),this.name="L4PiSessionBranchBlockedError"}}class v extends Error{constructor(){super("Pi session has no durable entry to clone"),this.name="L4PiSessionCloneEmptyError"}}function q(){return globalThis.__piDeskPiWorkSessionRuntimes||(globalThis.__piDeskPiWorkSessionRuntimes=new Map),globalThis.__piDeskPiWorkSessionRuntimes}class w{constructor(a,b){this.sessionManager=a,this.branchIndex=b,this.resources=new o.h,this.pendingBranchAppend=null,this.capabilityModeValue=null,this.capabilityTail=Promise.resolve(),this.disposed=!1,this.closePromise=null,this.indexedEntryCount=a.getEntries().length,this.branchIdValue=b.branchIdForHead(a.getLeafId()),this.chatWorker=this.createChatWorker(),this.unsubscribeCapabilities=(0,h.O)().subscribe(()=>{if(null===this.capabilityModeValue||this.disposed)return;let a=(0,h.O)().read(),b=Object.hasOwn(a,this.capabilityModeValue)?this.capabilityModeValue:null;this.setCapabilityMode(b).catch(a=>{console.error("[Pi Desk][Capabilities] 会话同步模式配置失败",{sessionId:this.sessionId,message:a instanceof Error?a.message:String(a)})})})}static create(a){let b=g.SessionManager.create(a),c=(0,m.l)(b);return(0,l.Ko)(a),w.fromManager(g.SessionManager.open(c,b.getSessionDir()))}static async open(a,b){let c=q().get(b);if(c){if(c.assertActive(),(0,f.resolve)(c.cwd)!==(0,f.resolve)(a))throw Error(`Pi session ${b} cwd does not match requested cwd`);return c}let d=await (0,l.vg)(a,b);if(!d)throw Error(`Pi session ${b} was not found in ${a}`);let e=w.fromManager(g.SessionManager.open(d));if((0,f.resolve)(e.cwd)!==(0,f.resolve)(a))throw Error(`Pi session ${b} cwd does not match persisted cwd`);return e}get cwd(){return this.sessionManager.getCwd()}get sessionId(){return this.sessionManager.getSessionId()}get branchId(){return this.branchIdValue}get isWorkerInitialized(){return this.assertActive(),this.chatWorker.isInitialized}readChatBackgroundTaskIds(){return this.assertActive(),this.chatWorker.getBackgroundTaskIds()}readPluginReloadBlockReason(){return this.assertActive(),this.chatWorker.readPluginReloadBlockReason()}readChatSnapshot(){return this.assertActive(),(0,k.xf)(this.sessionManager)}async readSessionTree(){this.assertActive();let a=this.sessionManager.getEntries().some(a=>"model_change"===a.type)?await g.ModelRuntime.create():void 0;return(0,n.cg)(this.sessionManager,a)}async readSessionTreeEntryDetail(a){this.assertActive();let b=this.sessionManager.getEntry(a)?.type==="model_change"?await g.ModelRuntime.create():void 0;return(0,n.j0)(this.sessionManager,a,b)}readChatImage(a,b){if(this.assertActive(),!Number.isSafeInteger(b)||b<0)throw Error("图片位置无效");if(!this.sessionManager.getBranch().some(b=>b.id===a))throw Error(`Pi session entry is not on the current branch: ${a}`);let c=this.sessionManager.getEntry(a);if(c?.type!=="message"||"user"!==c.message.role&&"toolResult"!==c.message.role)throw Error(`Pi session entry has no message images: ${a}`);let d=(0,k.Wl)(c.message.content,b);if(!d)throw Error(`Pi message image was not found: ${a}/${b}`);return d}subscribeChat(a){return this.assertActive(),this.chatWorker.subscribe(a)}get nativeUi(){return this.assertActive(),this.chatWorker.nativeUi}async readChatRuntime(){return this.assertActive(),this.chatWorker.getRuntime()}async readModelContext(){return this.assertActive(),this.chatWorker.readModelContext()}watchTaskDetail(a,b){return this.assertActive(),this.chatWorker.watchTaskDetail(a,b)}readTaskMessage(a,b){return this.assertActive(),this.chatWorker.readTaskMessage(a,b)}readTaskImage(a,b,c){return this.assertActive(),this.chatWorker.readTaskImage(a,b,c)}async interruptTask(a){this.assertActive(),await this.chatWorker.interruptTask(a)}async invokePluginMethod(a,b,c,d){if(this.assertActive(),a.sessionId!==this.sessionId||a.branchId!==this.branchId)throw Error("Pi session plugin source does not match the current runtime");return this.chatWorker.invokePluginMethod(b,c,d,a)}async listModels(){return this.assertActive(),this.chatWorker.listModels()}async listNativeCommands(){return this.assertActive(),this.chatWorker.listNativeCommands()}async executeNativeCommand(a,b){this.assertActive(),await this.chatWorker.executeNativeCommand(a,b)}async listNativeTools(a=!1){return a&&this.disposed?[]:(this.assertActive(),this.chatWorker.listNativeTools(a))}async executeDirectBash(a){return this.assertActive(),this.chatWorker.executeDirectBash(a)}async abortDirectBash(){this.assertActive(),await this.chatWorker.abortDirectBash()}async send(a){return this.assertActive(),this.chatWorker.send(a)}async interrupt(){this.assertActive(),await this.chatWorker.interrupt()}async compact(){this.assertActive(),await this.chatWorker.compact()}async reload(a){this.assertActive(),await this.chatWorker.reload(a)}async restoreQueuedMessages(){return this.assertActive(),this.chatWorker.restoreQueuedMessages()}async setTitle(a){this.assertActive(),await this.chatWorker.setTitle(a)}async setModel(a){this.assertActive(),await this.chatWorker.setModel(a)}setCapabilityMode(a){let b=this.capabilityTail.then(async()=>{if(this.assertActive(),null!==a&&!Object.hasOwn((0,h.O)().read(),a))throw Error("能力模式已不存在,请重新选择");this.capabilityModeValue=a,await this.chatWorker.applyCapabilityMode()});return this.capabilityTail=b.catch(()=>void 0),b}async dispose(){this.closePromise||(this.disposed=!0,this.unsubscribeCapabilities(),this.closePromise=this.chatWorker.dispose().finally(()=>this.resources.reset()),this.closePromise.then(()=>{q().get(this.sessionId)===this&&q().delete(this.sessionId)},a=>{console.warn("[Pi Desk][WorkSessionRuntime] 会话关闭未确认,保留实例占用直到重启",{sessionId:this.sessionId,message:a instanceof Error?a.message:String(a)})})),await this.waitForWorkerClose(this.closePromise,1500).catch(()=>void 0)}async waitForWorkerClose(a,b){let c;try{await Promise.race([a.then(()=>!0),new Promise(a=>{c=setTimeout(()=>a(!1),b)})])}finally{c&&clearTimeout(c)}}async branch(a){this.assertActive(),this.assertBranchable(),this.syncBranchIndex();let b=(0,n.eD)(this.sessionManager,a);if(!b.changed)return b;let c=this.sessionManager.getLeafId(),d=this.pendingBranchAppend;this.pendingBranchAppend=null;let e=!1;try{return(e=await this.chatWorker.navigateTree(b.selectedEntryId))?b:{...b,changed:!1,targetLeafEntryId:this.sessionManager.getLeafId(),editorText:null}}finally{this.syncBranchIndex();let a=this.sessionManager.getLeafId();e||a!==c?(this.pendingBranchAppend=this.branchIndex.predictAppend(a),this.branchIdValue=this.pendingBranchAppend.branchId):this.pendingBranchAppend=d}}createBranchedSession(a){let b,c,d,f,h;this.assertActive(),"at"===a.position&&this.assertBranchable(),this.syncBranchIndex();let i=this.sessionManager.getSessionFile();if(!i||!(0,e.existsSync)(i))throw Error(`Pi session ${this.sessionId} has no authoritative JSONL file`);if("before"===a.position){if(!a.entryId)throw new n.Ns("");let e=(0,n.u3)(this.sessionManager,a.entryId);b=e.selectedEntryId,c=e.targetLeafEntryId,d=e.editorText}else{if(!(b=a.entryId??this.sessionManager.getLeafId()??""))throw new v;if(!this.sessionManager.getEntry(b))throw new n.Ns(b);c=b,d=null}if(!(h=null===c?(f=g.SessionManager.create(this.cwd,this.sessionManager.getSessionDir())).newSession({parentSession:i}):(f=g.SessionManager.open(i,this.sessionManager.getSessionDir())).createBranchedSession(c)))throw Error(`Failed to create Pi session from entry: ${b}`);(0,m.l)(f),(0,l.Ko)(this.cwd);let j=w.fromManager(g.SessionManager.open(h,this.sessionManager.getSessionDir()));return console.info("[Pi Desk][PiWorkSessionRuntime] 已创建路径分支 Pi 会话",{sourceSessionId:this.sessionId,sourceBranchId:this.branchIndex.branchIdForEntry(b),selectedEntryId:b,targetLeafEntryId:c,position:a.position,sessionId:j.sessionId,branchId:j.branchId}),{runtime:j,editorText:d}}assertBranchable(){try{this.chatWorker.assertIdle()}catch(a){throw new u(a instanceof Error?a.message:"当前 Pi 会话不能切换分支")}}createChatWorker(){return new i.EG(this.cwd,this.sessionManager,a=>this.confirmAppendedEntry(a),{mode:()=>this.capabilityModeValue,rules:()=>null===this.capabilityModeValue?void 0:(0,h.O)().read()[this.capabilityModeValue]},this.resources)}confirmAppendedEntry(a){try{this.syncBranchIndex(),this.branchIndex.branchIdForEntry(a.id)}catch(b){throw console.error("[Pi Desk][PiWorkSessionRuntime] 增量同步 Pi 分支索引失败",{sessionId:this.sessionId,entryId:a.id,parentId:a.parentId,errorName:b instanceof Error?b.name:"UnknownError",errorMessage:b instanceof Error?b.message:String(b)}),b}}syncBranchIndex(){let a=this.sessionManager.getEntries();for(;this.indexedEntryCount<a.length;){let b,c=a[this.indexedEntryCount];this.pendingBranchAppend?(b=this.branchIndex.confirmAppend(this.pendingBranchAppend,c),this.pendingBranchAppend=null):b=this.branchIndex.appendEntry(c).branchId,this.indexedEntryCount+=1,this.sessionManager.getLeafId()===c.id&&(this.branchIdValue=b)}}static fromManager(a){let b=q().get(a.getSessionId());if(b)return b.assertActive(),b;let c=new w(a,new j.u(a.getEntries()));return q().set(c.sessionId,c),c}assertActive(){if(this.disposed)throw Error(`Pi session runtime has been disposed: ${this.sessionId}`)}}function r(a){let b=q().get(a);if(!b)throw Error(`Pi session runtime is not initialized: ${a}`);return b}async function s(a){await q().get(a)?.dispose()}async function t(){await Promise.all([...q().values()].map(a=>a.dispose()))}d()}catch(a){d(a)}})},35350:(a,b,c)=>{c.d(b,{s:()=>i});var d=c(77598),e=c(60161);let f=new WeakMap;function g(a){try{let b=JSON.stringify(a);return void 0===b?null:JSON.parse(b)}catch{return null}}class h{constructor(a){this.session=a,this.listeners=new Set,this.toolsById=new Map,this.disposed=!1,this.unsubscribeAgent=a.agent.subscribe(a=>this.captureAgentEvent(a)),this.unsubscribeSession=a.subscribe(a=>this.captureSessionEvent(a));const b=a.sessionManager.getBranch(),c=a.agent.state.pendingToolCalls;for(const a of function(a){let b=new Map;for(let c of a)if("message"===c.type)if("assistant"===c.message.role)for(let a of(0,e.zz)(c.message.content))b.set(a.id,a);else"toolResult"===c.message.role&&b.delete(c.message.toolCallId);return[...b.values()]}(b))c.has(a.id)&&this.upsertTool(a.id,a.name,a.input);const d=a.agent.state.streamingMessage;d&&this.syncStreamingTools(d,!1)}get size(){return this.toolsById.size}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}activeMessages(){return[...this.toolsById.values()].map(a=>({tempId:a.tempId,message:this.toolMessage(a)}))}tempId(a){return this.toolsById.get(a)?.tempId??null}syncStreamingTools(a,b=!0){if("assistant"===a.role)for(let c of(0,e.zz)(a.content)){let{tool:a,created:d,changed:e}=this.upsertTool(c.id,c.name,c.input);b&&(d?this.publish({type:"message_start",tempId:a.tempId,message:this.toolMessage(a)}):e&&this.publishToolUpdate(a))}}projectLiveResult(a,b){let c=this.toolsById.get(b);return(0,e.zK)(a,b,c?.display,c?.input)}remove(a){this.toolsById.delete(a)}discardAll(){for(let a of this.toolsById.values())this.publish({type:"message_discard",tempId:a.tempId});this.toolsById.clear()}dispose(){this.disposed||(this.disposed=!0,this.unsubscribeAgent(),this.unsubscribeSession(),this.listeners.clear(),this.toolsById.clear())}captureAgentEvent(a){if(!this.disposed&&(!("parentToolCallId"in a)||void 0===a.parentToolCallId))switch(a.type){case"tool_execution_start":this.startTool(a.toolCallId,a.toolName,a.args);return;case"tool_execution_update":this.updateTool(a.toolCallId,a.toolName,a.args,a.partialResult);return;case"tool_execution_end":this.endTool(a.toolCallId,a.toolName,a.result,a.isError);return;case"turn_end":this.discardAll();return;default:return}}captureSessionEvent(a){("agent_end"===a.type&&a.willRetry||"agent_settled"===a.type)&&queueMicrotask(()=>{this.disposed||this.discardAll()})}upsertTool(a,b,c){let f=c&&"object"==typeof c&&!Array.isArray(c)?{...c}:{},g=this.toolsById.get(a);if(g){var h;let a=(0,e.zG)(b,f,g.displayCache),c=g.name!==b||(h=g.display,h.reasoning!==a.reasoning||h.inputPreview!==a.inputPreview||h.activity!==a.activity);return g.name=b,g.input=f,g.display=a,{tool:g,created:!1,changed:c}}let i={},j={tempId:(0,d.randomUUID)(),toolCallId:a,name:b,display:(0,e.zG)(b,f,i),displayCache:i,input:f,partialResult:null,result:null,status:"running",startedAtMs:null,durationMs:null};return this.toolsById.set(a,j),{tool:j,created:!0,changed:!0}}startTool(a,b,c){let{tool:d,created:e,changed:f}=this.upsertTool(a,b,c),g="bash"===b&&null===d.startedAtMs;d.status="running",g&&(d.startedAtMs=Date.now()),e?this.publish({type:"message_start",tempId:d.tempId,message:this.toolMessage(d)}):(f||g)&&this.publishToolUpdate(d)}updateTool(a,b,c,d){this.startTool(a,b,c);let e=this.toolsById.get(a);e&&(e.partialResult=d,e.status="running",this.publishToolUpdate(e))}endTool(a,b,c,d){this.toolsById.has(a)||this.startTool(a,b,{});let e=this.toolsById.get(a);e&&("bash"===e.name&&null!==e.startedAtMs&&(e.durationMs=Math.max(0,Date.now()-e.startedAtMs),function(a,b){if(!a||"object"!=typeof a||Array.isArray(a))return;let c=a.details&&"object"==typeof a.details&&!Array.isArray(a.details)?a.details:{};a.details={...c,durationMs:b}}(c,e.durationMs)),e.result=c,e.status=d?"error":"completed",this.publishToolUpdate(e))}publishToolUpdate(a){this.publish({type:"message_update",tempId:a.tempId,message:this.toolMessage(a)})}toolMessage(a){let b;return{type:"tool",name:a.name,reasoning:a.display.reasoning,inputPreview:a.display.inputPreview,activity:a.display.activity,status:a.status,usage:null,output:"",startedAtMs:a.startedAtMs,durationMs:a.durationMs,declaration:{message:{kind:"tool",toolName:a.name,toolCallId:a.toolCallId,arguments:(b=g(a.input))&&"object"==typeof b&&!Array.isArray(b)?b:{},partialResult:g(a.partialResult),result:g(a.result),isError:"error"===a.status},raw:{toolCallId:a.toolCallId,toolName:a.name,args:a.input,partialResult:a.partialResult,result:a.result}}}}publish(a){for(let b of[...this.listeners])try{b(a)}catch(b){console.error("[Pi Desk][AgentToolRuntime] 事件监听器执行失败",{sessionId:this.session.sessionId,eventType:a.type,errorName:b instanceof Error?b.name:"UnknownError"})}}}function i(a){let b=f.get(a);b||(b={runtime:new h(a),references:0},f.set(a,b)),b.references+=1;let c=!1;return{runtime:b.runtime,release:()=>{c||(c=!0,b.references-=1,b.references>0||(f.delete(a),b.runtime.dispose()))}}}},37787:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Ko:()=>q,vg:()=>p,xt:()=>r});var e=c(17691),f=c(77598),g=c(73024),h=c(76760),i=c(36153),j=c(64791),k=c(78180),l=c(18200),m=a([e,j,k,l]);[e,j,k,l]=m.then?(await m)():m;let s=i.Ik({cwd:i.Yj().trim().min(1),sessionCount:i.ai().int().nonnegative(),updatedAt:i.ai().int().nonnegative()}).strict(),t=i.Ik({directories:i.YO(s)}).strict();function n(){return(0,h.join)((0,e.M)(),"pi-directories.json")}function o(a){return(0,h.resolve)(a)}async function p(a,b){return(0,l.p)(o(a),b,(0,k.Ph)(a,b))}function q(a){let b=function(){if(!globalThis.__piDeskPiSessionCatalogState){let a=function(){let a=n();if(!(0,g.existsSync)(a))return null;try{return t.parse(JSON.parse((0,g.readFileSync)(a,"utf8"))).directories}catch(b){return console.warn("[Pi Desk][PiSessionCatalog] 项目目录持久缓存无效",{path:a,errorName:b instanceof Error?b.name:"UnknownError"}),null}}();globalThis.__piDeskPiSessionCatalogState={directorySummaryCache:null,directorySummaryValue:a,directorySummaryNeedsRefresh:null!==a}}return globalThis.__piDeskPiSessionCatalogState}();if(a||(b.directorySummaryNeedsRefresh=!0),a&&b.directorySummaryValue){let d=o(a),e=b.directorySummaryValue.find(a=>(0,j.sC)(a.cwd)===(0,j.sC)(d));e?(e.sessionCount+=1,e.updatedAt=Math.max(e.updatedAt,Date.now())):b.directorySummaryValue=[...b.directorySummaryValue,{cwd:d,sessionCount:1,updatedAt:Date.now()}].sort((a,b)=>b.updatedAt-a.updatedAt);var c=b.directorySummaryValue;let i=n(),k=`${i}.${process.pid}.${(0,f.randomUUID)()}.tmp`;try{(0,g.mkdirSync)((0,h.dirname)(i),{recursive:!0}),(0,g.writeFileSync)(k,`${JSON.stringify({directories:c},null,2)}
22
+ 步骤:执行插件工厂`,c,async()=>{if("function"!=typeof e.default)throw Error(`扩展必须导出工厂函数:${a.path}`);await e.default(b)})}})),q=f.SettingsManager.inMemory({},{projectTrusted:j.isProjectTrusted()});d=new f.DefaultResourceLoader({...b,cwd:a,agentDir:i,settingsManager:q,noExtensions:!0,noSkills:!0,noPromptTemplates:!0,noThemes:!0,extensionFactories:[...m.map(({name:a,create:b})=>({name:a,factory:b(),builtin:!0,replaceable:!0})),...p],additionalExtensionPaths:o,additionalSkillPaths:n.skills.map(a=>a.path),additionalPromptTemplatePaths:n.prompts.map(a=>a.path),additionalThemePaths:n.themes.map(a=>a.path)}),c?.("装配插件与会话资源"),await d.reload();let r=(a,b,c)=>{if(b)for(let d of c){let c=(0,e.relative)(d.path,b);if(!(c.startsWith("..")||(0,e.isAbsolute)(c))){a.sourceInfo={...d.metadata,path:b};break}}};for(let a of d.getSkills().skills)r(a,a.filePath,n.skills);for(let a of d.getPrompts().prompts)r(a,a.filePath,n.prompts);for(let a of d.getThemes().themes)r(a,a.sourcePath,n.themes);let s=d.getExtensions();for(let a of s.extensions){let b=n.extensions.find(b=>a.path===`<inline:${b.path}>`);if(b){for(let[d,e]of(a.path=b.path,a.resolvedPath=b.path,a.sourceInfo={...b.metadata,path:b.path},[["session_start","启动会话(session_start)"],["session_shutdown","关闭会话(session_shutdown)"],["resources_discover","补充会话资源(resources_discover)"]])){let f=a.handlers.get(d);f&&a.handlers.set(d,f.map(a=>(...d)=>l(`${k(b)}
23
+ 步骤:${e}`,c,()=>a(...d))))}for(let b of a.tools.values())b.sourceInfo=a.sourceInfo;for(let b of a.commands.values())b.sourceInfo=a.sourceInfo}}for(let a of s.errors){let b=n.extensions.find(b=>a.path===`<inline:${b.path}>`);b&&(a.path=b.path)}};await p(!1);let q=new Proxy(d,{get:(a,b)=>{if("reload"===b)return()=>p(!0);let c=Reflect.get(d,b,d);return"function"==typeof c?c.bind(d):c}}),r=q.getExtensions().runtime,s=(b,c)=>{let d=`${b}: ${String(c)}`;(0,h.pL)(a,d),n.push({type:"warning",message:d})};for(let{name:a,config:b,extensionPath:c}of r.pendingProviderRegistrations)try{o.registerProvider(a,b)}catch(a){s(c,a)}for(let{provider:a,extensionPath:b}of r.pendingNativeProviderRegistrations)try{o.registerNativeProvider(a)}catch(a){s(b,a)}for(let{definition:a,extensionPath:b}of r.pendingVirtualModelRegistrations)try{o.registerVirtualModel(a)}catch(a){s(b,a)}return r.pendingProviderRegistrations=[],r.pendingNativeProviderRegistrations=[],r.pendingVirtualModelRegistrations=[],await l("刷新模型与认证配置",c,()=>o.refresh({allowNetwork:!1})),n.push(...j.drainErrors().map(({error:a})=>({type:"error",message:a.message}))),{cwd:a,agentDir:i,settingsManager:j,modelRuntime:o,resourceLoader:q,diagnostics:n}}constructor(){this.selection=null}}d()}catch(a){d(a)}})},27519:(a,b,c)=>{c.d(b,{_g:()=>g,eC:()=>h,rh:()=>f});var d=c(36153);function e(a,b){return""===a?b:!(a.length>4096||a.startsWith("/")||a.includes("\\")||a.includes("\0")||/^[a-zA-Z]:/.test(a))&&a.split("/").every(a=>a.length>0&&"."!==a&&".."!==a)}let f=d.Yj().max(4096).refine(a=>e(a,!0),"目录路径必须是规范相对路径"),g=d.Yj().min(1).max(4096).refine(a=>e(a,!1),"文件路径必须是规范相对路径"),h=d.Yj().min(1).max(4096).refine(a=>e(a,!1)||a.length>0&&a.length<=4096&&!a.includes("\0")&&(a.startsWith("/")||a.startsWith("\\\\")||/^[a-zA-Z]:[\\/]/.test(a)),"预览路径必须是规范相对路径或绝对路径");d.k5(["compressed","original"]);let i=d.k5(["image/jpeg","image/png","image/webp","image/gif"]),j=d.Ik({name:d.Yj().min(1),type:d.k5(["directory","file"])}).strict();d.Ik({entries:d.YO(j).max(5e3),truncated:d.zM()}).strict(),d.Ik({query:d.Yj().min(1).max(200).refine(a=>a.trim().length>0&&!/[\0\r\n]/.test(a),"搜索词必须是非空单行文本"),scope:d.k5(["all","files","content"]).default("all"),caseSensitive:d.zM().default(!1),wholeWord:d.zM().default(!1),regex:d.zM().default(!1)}).strict();let k=d.Ik({start:d.ai().int().nonnegative(),end:d.ai().int().nonnegative()}).strict().refine(a=>a.start<=a.end,"搜索命中区间无效"),l=d.Ik({path:g,ranges:d.YO(k)}).strict().refine(a=>a.ranges.every(b=>b.end<=a.path.length),"文件名命中区间越界"),m=d.Ik({path:g,line:d.ai().int().positive(),text:d.Yj().max(1e3),ranges:d.YO(k)}).strict().refine(a=>a.ranges.every(b=>b.end<=a.text.length),"正文命中区间越界");d.Ik({fileMatches:d.YO(l).max(100),contentMatches:d.YO(m).max(200),truncated:d.zM()}).strict(),d.gM("kind",[d.Ik({kind:d.eu("text"),content:d.Yj(),size:d.ai().int().nonnegative().max(5242880)}).strict(),d.Ik({kind:d.eu("image"),mimeType:i,data:d.Yj().min(1),size:d.ai().int().positive().max(0xa00000)}).strict()])},32757:(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(78555),h=c(60161),i=c(35350),j=c(42118),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)}})},33448:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Wo:()=>u,er:()=>v,gb:()=>s,ls:()=>r,vC:()=>w,wz:()=>t});var e=c(73024),f=c(76760),g=c(75430),h=c(8438),i=c(6676),j=c(94074),k=c(60161),l=c(37787),m=c(7832),n=c(55881),o=c(27177),p=a([g,h,i,l,o]);[g,h,i,l,o]=p.then?(await p)():p;class u extends Error{constructor(a){super(a),this.name="L4PiSessionBranchBlockedError"}}class v extends Error{constructor(){super("Pi session has no durable entry to clone"),this.name="L4PiSessionCloneEmptyError"}}function q(){return globalThis.__piDeskPiWorkSessionRuntimes||(globalThis.__piDeskPiWorkSessionRuntimes=new Map),globalThis.__piDeskPiWorkSessionRuntimes}class w{constructor(a,b){this.sessionManager=a,this.branchIndex=b,this.resources=new o.h,this.pendingBranchAppend=null,this.capabilityModeValue=null,this.capabilityTail=Promise.resolve(),this.disposed=!1,this.closePromise=null,this.indexedEntryCount=a.getEntries().length,this.branchIdValue=b.branchIdForHead(a.getLeafId()),this.chatWorker=this.createChatWorker(),this.unsubscribeCapabilities=(0,h.O)().subscribe(()=>{if(null===this.capabilityModeValue||this.disposed)return;let a=(0,h.O)().read(),b=Object.hasOwn(a,this.capabilityModeValue)?this.capabilityModeValue:null;this.setCapabilityMode(b).catch(a=>{console.error("[Pi Desk][Capabilities] 会话同步模式配置失败",{sessionId:this.sessionId,message:a instanceof Error?a.message:String(a)})})})}static create(a){let b=g.SessionManager.create(a),c=(0,m.l)(b);return(0,l.Ko)(a),w.fromManager(g.SessionManager.open(c,b.getSessionDir()))}static async open(a,b){let c=q().get(b);if(c){if(c.assertActive(),(0,f.resolve)(c.cwd)!==(0,f.resolve)(a))throw Error(`Pi session ${b} cwd does not match requested cwd`);return c}let d=await (0,l.vg)(a,b);if(!d)throw Error(`Pi session ${b} was not found in ${a}`);let e=w.fromManager(g.SessionManager.open(d));if((0,f.resolve)(e.cwd)!==(0,f.resolve)(a))throw Error(`Pi session ${b} cwd does not match persisted cwd`);return e}get cwd(){return this.sessionManager.getCwd()}get sessionId(){return this.sessionManager.getSessionId()}get branchId(){return this.branchIdValue}get isWorkerInitialized(){return this.assertActive(),this.chatWorker.isInitialized}readChatBackgroundTaskIds(){return this.assertActive(),this.chatWorker.getBackgroundTaskIds()}readPluginReloadBlockReason(){return this.assertActive(),this.chatWorker.readPluginReloadBlockReason()}readChatSnapshot(){return this.assertActive(),(0,k.xf)(this.sessionManager)}async readSessionTree(){this.assertActive();let a=this.sessionManager.getEntries().some(a=>"model_change"===a.type)?await g.ModelRuntime.create():void 0;return(0,n.cg)(this.sessionManager,a)}async readSessionTreeEntryDetail(a){this.assertActive();let b=this.sessionManager.getEntry(a)?.type==="model_change"?await g.ModelRuntime.create():void 0;return(0,n.j0)(this.sessionManager,a,b)}readChatImage(a,b){if(this.assertActive(),!Number.isSafeInteger(b)||b<0)throw Error("图片位置无效");if(!this.sessionManager.getBranch().some(b=>b.id===a))throw Error(`Pi session entry is not on the current branch: ${a}`);let c=this.sessionManager.getEntry(a);if(c?.type!=="message"||"user"!==c.message.role&&"toolResult"!==c.message.role)throw Error(`Pi session entry has no message images: ${a}`);let d=(0,k.Wl)(c.message.content,b);if(!d)throw Error(`Pi message image was not found: ${a}/${b}`);return d}subscribeChat(a){return this.assertActive(),this.chatWorker.subscribe(a)}get nativeUi(){return this.assertActive(),this.chatWorker.nativeUi}async readChatRuntime(){return this.assertActive(),this.chatWorker.getRuntime(!1)}async readModelContext(){return this.assertActive(),this.chatWorker.readModelContext()}watchTaskDetail(a,b){return this.assertActive(),this.chatWorker.watchTaskDetail(a,b)}readTaskMessage(a,b){return this.assertActive(),this.chatWorker.readTaskMessage(a,b)}readTaskImage(a,b,c){return this.assertActive(),this.chatWorker.readTaskImage(a,b,c)}async interruptTask(a){this.assertActive(),await this.chatWorker.interruptTask(a)}async invokePluginMethod(a,b,c,d){if(this.assertActive(),a.sessionId!==this.sessionId||a.branchId!==this.branchId)throw Error("Pi session plugin source does not match the current runtime");return this.chatWorker.invokePluginMethod(b,c,d,a)}async listModels(){return this.assertActive(),this.chatWorker.listModels()}async listNativeCommands(){return this.assertActive(),this.chatWorker.listNativeCommands()}async executeNativeCommand(a,b){this.assertActive(),await this.chatWorker.executeNativeCommand(a,b)}async listNativeTools(a=!1){return a&&this.disposed?[]:(this.assertActive(),this.chatWorker.listNativeTools(a))}async executeDirectBash(a){return this.assertActive(),this.chatWorker.executeDirectBash(a)}async abortDirectBash(){this.assertActive(),await this.chatWorker.abortDirectBash()}async send(a){return this.assertActive(),this.chatWorker.send(a)}async interrupt(){this.assertActive(),await this.chatWorker.interrupt()}async compact(){this.assertActive(),await this.chatWorker.compact()}async reload(a){this.assertActive(),await this.chatWorker.reload(a)}async restoreQueuedMessages(){return this.assertActive(),this.chatWorker.restoreQueuedMessages()}async setTitle(a){this.assertActive(),await this.chatWorker.setTitle(a)}async setModel(a){this.assertActive(),await this.chatWorker.setModel(a)}setCapabilityMode(a){let b=this.capabilityTail.then(async()=>{if(this.assertActive(),null!==a&&!Object.hasOwn((0,h.O)().read(),a))throw Error("能力模式已不存在,请重新选择");this.capabilityModeValue=a,await this.chatWorker.applyCapabilityMode()});return this.capabilityTail=b.catch(()=>void 0),b}async dispose(){this.closePromise||(this.disposed=!0,this.unsubscribeCapabilities(),this.closePromise=this.chatWorker.dispose().finally(()=>this.resources.reset()),this.closePromise.then(()=>{q().get(this.sessionId)===this&&q().delete(this.sessionId)},a=>{console.warn("[Pi Desk][WorkSessionRuntime] 会话关闭未确认,保留实例占用直到重启",{sessionId:this.sessionId,message:a instanceof Error?a.message:String(a)})})),await this.waitForWorkerClose(this.closePromise,1500).catch(()=>void 0)}async waitForWorkerClose(a,b){let c;try{await Promise.race([a.then(()=>!0),new Promise(a=>{c=setTimeout(()=>a(!1),b)})])}finally{c&&clearTimeout(c)}}async branch(a){this.assertActive(),this.assertBranchable(),this.syncBranchIndex();let b=(0,n.eD)(this.sessionManager,a);if(!b.changed)return b;let c=this.sessionManager.getLeafId(),d=this.pendingBranchAppend;this.pendingBranchAppend=null;let e=!1;try{return(e=await this.chatWorker.navigateTree(b.selectedEntryId))?b:{...b,changed:!1,targetLeafEntryId:this.sessionManager.getLeafId(),editorText:null}}finally{this.syncBranchIndex();let a=this.sessionManager.getLeafId();e||a!==c?(this.pendingBranchAppend=this.branchIndex.predictAppend(a),this.branchIdValue=this.pendingBranchAppend.branchId):this.pendingBranchAppend=d}}createBranchedSession(a){let b,c,d,f,h;this.assertActive(),"at"===a.position&&this.assertBranchable(),this.syncBranchIndex();let i=this.sessionManager.getSessionFile();if(!i||!(0,e.existsSync)(i))throw Error(`Pi session ${this.sessionId} has no authoritative JSONL file`);if("before"===a.position){if(!a.entryId)throw new n.Ns("");let e=(0,n.u3)(this.sessionManager,a.entryId);b=e.selectedEntryId,c=e.targetLeafEntryId,d=e.editorText}else{if(!(b=a.entryId??this.sessionManager.getLeafId()??""))throw new v;if(!this.sessionManager.getEntry(b))throw new n.Ns(b);c=b,d=null}if(!(h=null===c?(f=g.SessionManager.create(this.cwd,this.sessionManager.getSessionDir())).newSession({parentSession:i}):(f=g.SessionManager.open(i,this.sessionManager.getSessionDir())).createBranchedSession(c)))throw Error(`Failed to create Pi session from entry: ${b}`);(0,m.l)(f),(0,l.Ko)(this.cwd);let j=w.fromManager(g.SessionManager.open(h,this.sessionManager.getSessionDir()));return console.info("[Pi Desk][PiWorkSessionRuntime] 已创建路径分支 Pi 会话",{sourceSessionId:this.sessionId,sourceBranchId:this.branchIndex.branchIdForEntry(b),selectedEntryId:b,targetLeafEntryId:c,position:a.position,sessionId:j.sessionId,branchId:j.branchId}),{runtime:j,editorText:d}}assertBranchable(){try{this.chatWorker.assertIdle()}catch(a){throw new u(a instanceof Error?a.message:"当前 Pi 会话不能切换分支")}}createChatWorker(){return new i.EG(this.cwd,this.sessionManager,a=>this.confirmAppendedEntry(a),{mode:()=>this.capabilityModeValue,rules:()=>null===this.capabilityModeValue?void 0:(0,h.O)().read()[this.capabilityModeValue]},this.resources)}confirmAppendedEntry(a){try{this.syncBranchIndex(),this.branchIndex.branchIdForEntry(a.id)}catch(b){throw console.error("[Pi Desk][PiWorkSessionRuntime] 增量同步 Pi 分支索引失败",{sessionId:this.sessionId,entryId:a.id,parentId:a.parentId,errorName:b instanceof Error?b.name:"UnknownError",errorMessage:b instanceof Error?b.message:String(b)}),b}}syncBranchIndex(){let a=this.sessionManager.getEntries();for(;this.indexedEntryCount<a.length;){let b,c=a[this.indexedEntryCount];this.pendingBranchAppend?(b=this.branchIndex.confirmAppend(this.pendingBranchAppend,c),this.pendingBranchAppend=null):b=this.branchIndex.appendEntry(c).branchId,this.indexedEntryCount+=1,this.sessionManager.getLeafId()===c.id&&(this.branchIdValue=b)}}static fromManager(a){let b=q().get(a.getSessionId());if(b)return b.assertActive(),b;let c=new w(a,new j.u(a.getEntries()));return q().set(c.sessionId,c),c}assertActive(){if(this.disposed)throw Error(`Pi session runtime has been disposed: ${this.sessionId}`)}}function r(a){let b=q().get(a);if(!b)throw Error(`Pi session runtime is not initialized: ${a}`);return b}async function s(a){await q().get(a)?.dispose()}async function t(){await Promise.all([...q().values()].map(a=>a.dispose()))}d()}catch(a){d(a)}})},35350:(a,b,c)=>{c.d(b,{s:()=>i});var d=c(77598),e=c(60161);let f=new WeakMap;function g(a){try{let b=JSON.stringify(a);return void 0===b?null:JSON.parse(b)}catch{return null}}class h{constructor(a){this.session=a,this.listeners=new Set,this.toolsById=new Map,this.disposed=!1,this.unsubscribeAgent=a.agent.subscribe(a=>this.captureAgentEvent(a)),this.unsubscribeSession=a.subscribe(a=>this.captureSessionEvent(a));const b=a.sessionManager.getBranch(),c=a.agent.state.pendingToolCalls;for(const a of function(a){let b=new Map;for(let c of a)if("message"===c.type)if("assistant"===c.message.role)for(let a of(0,e.zz)(c.message.content))b.set(a.id,a);else"toolResult"===c.message.role&&b.delete(c.message.toolCallId);return[...b.values()]}(b))c.has(a.id)&&this.upsertTool(a.id,a.name,a.input);const d=a.agent.state.streamingMessage;d&&this.syncStreamingTools(d,!1)}get size(){return this.toolsById.size}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}activeMessages(){return[...this.toolsById.values()].map(a=>({tempId:a.tempId,message:this.toolMessage(a)}))}tempId(a){return this.toolsById.get(a)?.tempId??null}syncStreamingTools(a,b=!0){if("assistant"===a.role)for(let c of(0,e.zz)(a.content)){let{tool:a,created:d,changed:e}=this.upsertTool(c.id,c.name,c.input);b&&(d?this.publish({type:"message_start",tempId:a.tempId,message:this.toolMessage(a)}):e&&this.publishToolUpdate(a))}}projectLiveResult(a,b){let c=this.toolsById.get(b);return(0,e.zK)(a,b,c?.display,c?.input)}remove(a){this.toolsById.delete(a)}discardAll(){for(let a of this.toolsById.values())this.publish({type:"message_discard",tempId:a.tempId});this.toolsById.clear()}dispose(){this.disposed||(this.disposed=!0,this.unsubscribeAgent(),this.unsubscribeSession(),this.listeners.clear(),this.toolsById.clear())}captureAgentEvent(a){if(!this.disposed&&(!("parentToolCallId"in a)||void 0===a.parentToolCallId))switch(a.type){case"tool_execution_start":this.startTool(a.toolCallId,a.toolName,a.args);return;case"tool_execution_update":this.updateTool(a.toolCallId,a.toolName,a.args,a.partialResult);return;case"tool_execution_end":this.endTool(a.toolCallId,a.toolName,a.result,a.isError);return;case"turn_end":this.discardAll();return;default:return}}captureSessionEvent(a){("agent_end"===a.type&&a.willRetry||"agent_settled"===a.type)&&queueMicrotask(()=>{this.disposed||this.discardAll()})}upsertTool(a,b,c){let f=c&&"object"==typeof c&&!Array.isArray(c)?{...c}:{},g=this.toolsById.get(a);if(g){var h;let a=(0,e.zG)(b,f,g.displayCache),c=g.name!==b||(h=g.display,h.reasoning!==a.reasoning||h.inputPreview!==a.inputPreview||h.activity!==a.activity);return g.name=b,g.input=f,g.display=a,{tool:g,created:!1,changed:c}}let i={},j={tempId:(0,d.randomUUID)(),toolCallId:a,name:b,display:(0,e.zG)(b,f,i),displayCache:i,input:f,partialResult:null,result:null,status:"running",startedAtMs:null,durationMs:null};return this.toolsById.set(a,j),{tool:j,created:!0,changed:!0}}startTool(a,b,c){let{tool:d,created:e,changed:f}=this.upsertTool(a,b,c),g="bash"===b&&null===d.startedAtMs;d.status="running",g&&(d.startedAtMs=Date.now()),e?this.publish({type:"message_start",tempId:d.tempId,message:this.toolMessage(d)}):(f||g)&&this.publishToolUpdate(d)}updateTool(a,b,c,d){this.startTool(a,b,c);let e=this.toolsById.get(a);e&&(e.partialResult=d,e.status="running",this.publishToolUpdate(e))}endTool(a,b,c,d){this.toolsById.has(a)||this.startTool(a,b,{});let e=this.toolsById.get(a);e&&("bash"===e.name&&null!==e.startedAtMs&&(e.durationMs=Math.max(0,Date.now()-e.startedAtMs),function(a,b){if(!a||"object"!=typeof a||Array.isArray(a))return;let c=a.details&&"object"==typeof a.details&&!Array.isArray(a.details)?a.details:{};a.details={...c,durationMs:b}}(c,e.durationMs)),e.result=c,e.status=d?"error":"completed",this.publishToolUpdate(e))}publishToolUpdate(a){this.publish({type:"message_update",tempId:a.tempId,message:this.toolMessage(a)})}toolMessage(a){let b;return{type:"tool",name:a.name,reasoning:a.display.reasoning,inputPreview:a.display.inputPreview,activity:a.display.activity,status:a.status,usage:null,output:"",startedAtMs:a.startedAtMs,durationMs:a.durationMs,declaration:{message:{kind:"tool",toolName:a.name,toolCallId:a.toolCallId,arguments:(b=g(a.input))&&"object"==typeof b&&!Array.isArray(b)?b:{},partialResult:g(a.partialResult),result:g(a.result),isError:"error"===a.status},raw:{toolCallId:a.toolCallId,toolName:a.name,args:a.input,partialResult:a.partialResult,result:a.result}}}}publish(a){for(let b of[...this.listeners])try{b(a)}catch(b){console.error("[Pi Desk][AgentToolRuntime] 事件监听器执行失败",{sessionId:this.session.sessionId,eventType:a.type,errorName:b instanceof Error?b.name:"UnknownError"})}}}function i(a){let b=f.get(a);b||(b={runtime:new h(a),references:0},f.set(a,b)),b.references+=1;let c=!1;return{runtime:b.runtime,release:()=>{c||(c=!0,b.references-=1,b.references>0||(f.delete(a),b.runtime.dispose()))}}}},37787:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Ko:()=>q,vg:()=>p,xt:()=>r});var e=c(17691),f=c(77598),g=c(73024),h=c(76760),i=c(36153),j=c(64791),k=c(78180),l=c(18200),m=a([e,j,k,l]);[e,j,k,l]=m.then?(await m)():m;let s=i.Ik({cwd:i.Yj().trim().min(1),sessionCount:i.ai().int().nonnegative(),updatedAt:i.ai().int().nonnegative()}).strict(),t=i.Ik({directories:i.YO(s)}).strict();function n(){return(0,h.join)((0,e.M)(),"pi-directories.json")}function o(a){return(0,h.resolve)(a)}async function p(a,b){return(0,l.p)(o(a),b,(0,k.Ph)(a,b))}function q(a){let b=function(){if(!globalThis.__piDeskPiSessionCatalogState){let a=function(){let a=n();if(!(0,g.existsSync)(a))return null;try{return t.parse(JSON.parse((0,g.readFileSync)(a,"utf8"))).directories}catch(b){return console.warn("[Pi Desk][PiSessionCatalog] 项目目录持久缓存无效",{path:a,errorName:b instanceof Error?b.name:"UnknownError"}),null}}();globalThis.__piDeskPiSessionCatalogState={directorySummaryCache:null,directorySummaryValue:a,directorySummaryNeedsRefresh:null!==a}}return globalThis.__piDeskPiSessionCatalogState}();if(a||(b.directorySummaryNeedsRefresh=!0),a&&b.directorySummaryValue){let d=o(a),e=b.directorySummaryValue.find(a=>(0,j.sC)(a.cwd)===(0,j.sC)(d));e?(e.sessionCount+=1,e.updatedAt=Math.max(e.updatedAt,Date.now())):b.directorySummaryValue=[...b.directorySummaryValue,{cwd:d,sessionCount:1,updatedAt:Date.now()}].sort((a,b)=>b.updatedAt-a.updatedAt);var c=b.directorySummaryValue;let i=n(),k=`${i}.${process.pid}.${(0,f.randomUUID)()}.tmp`;try{(0,g.mkdirSync)((0,h.dirname)(i),{recursive:!0}),(0,g.writeFileSync)(k,`${JSON.stringify({directories:c},null,2)}
25
24
  `,"utf8"),(0,g.renameSync)(k,i)}catch(a){console.warn("[Pi Desk][PiSessionCatalog] 写入项目目录持久缓存失败",{path:i,errorName:a instanceof Error?a.name:"UnknownError"})}finally{(0,g.existsSync)(k)&&(0,g.unlinkSync)(k)}}(0,k.xt)(a)}function r(a){(0,k.xt)(a)}d()}catch(a){d(a)}})},38617:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{I:()=>j});var e=c(73024),f=c(76760),g=c(47757),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.appendL4PiDeskSystemPrompt)(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)}})},40104:(a,b,c)=>{c.d(b,{bV:()=>J,Ak:()=>I});var d=c(51455),e=c(76760);c(27519);var f=c(76019),g=c(88134);class h extends Error{constructor(a,b,c){super(b),this.kind=a,this.localizedMessage=c,this.name="L4WorkSessionGitError"}}var i=c(11819),j=c(31421);let k={GIT_OPTIONAL_LOCKS:"0",GIT_NO_LAZY_FETCH:"1",GIT_TERMINAL_PROMPT:"0"};function l(a,b,c={}){return new Promise(d=>{(0,j.execFile)("git",["-C",a,...b],{encoding:"utf8",timeout:c.timeout??15e3,maxBuffer:0x4000000,windowsHide:!0,env:{...process.env,LC_ALL:"C",...!1===c.readOnly?{}:k}},(a,b,c)=>{d({code:"number"==typeof a?.code?a.code:a?null:0,stdout:String(b??""),stderr:String(c||(a instanceof Error?a.message:""))})})})}let m=new Set([".git","node_modules",".next","dist","build","coverage",".turbo"]),n=new Map,o=new Map,p=new Map;function q(a,b){return(0,e.relative)(a,b).split(e.sep).join("/")}function r(a){let b=a.trim().replaceAll(/\s+/g," ");return b.length>1600?`${b.slice(0,1597)}...`:b}function s(a,b){let c=r(b.stderr)||`Git 退出码 ${String(b.code)}`;return`${a}失败:${c}`}async function t(a,b,c){let d=Array(a.length),e=0;async function f(){for(;e<a.length;){let b=e;e+=1,d[b]=await c(a[b])}}return await Promise.all(Array.from({length:Math.min(b,a.length)},()=>f())),d}async function u(a){try{let b=await (0,d.realpath)(a);if(!(await (0,d.stat)(b)).isDirectory())throw new h("project-not-found","项目目录不存在");return b}catch(a){if(a instanceof h)throw a;throw new h("project-not-found","项目目录不存在")}}async function v(a){try{let b=await (0,d.stat)((0,e.join)(a,".git"));return b.isDirectory()||b.isFile()}catch{return!1}}async function w(a){let b;try{b=await (0,d.readdir)(a,{withFileTypes:!0})}catch{throw new h("read-failed","无法读取项目目录")}let c=[a,...b.filter(a=>a.isDirectory()&&!m.has(a.name)).map(b=>(0,e.resolve)(a,b.name))],f=(await t(c,32,async a=>await v(a)?a:null)).filter(a=>null!==a);if(f.length>i.y2)throw new h("scan-limit","项目中的 Git 仓库数量超过 100 个");return f}async function x(a,b){let c=await l(b,["rev-parse","--show-toplevel"]);if(0!==c.code||!c.stdout.trim()){let c=await (0,d.realpath)(b);return(0,g.C)(a,c)?{absoluteRoot:c,protocolRoot:q(a,c)}:null}try{let e=await (0,d.realpath)(c.stdout.trim());if(!(0,g.C)(a,e))return null;let f=await (0,d.realpath)(b);if((0,g.b)(f)!==(0,g.b)(e))return null;return{absoluteRoot:e,protocolRoot:q(a,e)}}catch{return null}}async function y(a){let b=await u(a),c=(0,g.b)(b),d=Date.now(),e=n.get(c);if(e&&e.expiresAt>d)return e.repositories;let f=o.get(c);if(f)return f;let h=(async()=>{let a=await w(b),e=await t(a,4,a=>x(b,a)),f=new Map;for(let a of e)a&&f.set((0,g.b)(a.absoluteRoot),a);let h=[...f.values()].sort((a,b)=>""===a.protocolRoot?-1:""===b.protocolRoot?1:a.protocolRoot.localeCompare(b.protocolRoot,void 0,{numeric:!0,sensitivity:"base"}));for(let[a,b]of n)b.expiresAt<=d&&n.delete(a);for(;n.size>=20;){let a=n.keys().next().value;if(!a)break;n.delete(a)}return n.set(c,{repositories:h,expiresAt:d+3e4}),h})();o.set(c,h);try{return await h}finally{o.get(c)===h&&o.delete(c)}}function z(a,b){let c=[],d=0;for(let e=0;e<b;e+=1){let b=a.indexOf(" ",d);if(b<0)return null;c.push(a.slice(d,b)),d=b+1}let e=a.slice(d);return e?{fields:c,path:e}:null}function A(a){switch(a){case".":case" ":return null;case"A":case"C":return"added";case"M":case"T":return"modified";case"D":return"deleted";case"R":return"renamed";case"U":return"unmerged";case"?":return"untracked";default:throw new h("read-failed",`无法识别 Git 文件状态:${a}`)}}function B(a,b,c){if(2!==b.length)throw new h("read-failed",`无法识别 Git XY 状态:${b}`);return{path:a,oldPath:c,indexStatus:A(b[0]),worktreeStatus:A(b[1])}}async function C(a,b){let c=await l(a.absoluteRoot,["status","--porcelain=v2","-z","--branch","--renames","--untracked-files=all"]);if(0!==c.code){let a=r(c.stderr)||`Git 退出码 ${String(c.code)}`;throw new h("read-failed",s("读取 Git 状态",c),(0,f.J8)(`读取 Git 状态失败:${a}`,`Could not read Git status: ${a}`))}let d=function(a){let b=a.split("\0"),c=null,d=null,e=[];for(let a=0;a<b.length;a+=1){let f=b[a];if(f){if(f.startsWith("# branch.head ")){let a=f.slice(14);c="(detached)"===a?null:a;continue}if(f.startsWith("# branch.oid ")){let a=f.slice(13);d="(initial)"===a?null:a;continue}if(!f.startsWith("# ")){if(f.startsWith("? ")){e.push({path:f.slice(2),oldPath:null,indexStatus:null,worktreeStatus:"untracked"});continue}if(!f.startsWith("! ")){if(f.startsWith("1 ")){let a=z(f,8);if(!a)throw new h("read-failed","Git 状态记录格式无效");e.push(B(a.path,a.fields[1],null));continue}if(f.startsWith("2 ")){let c=z(f,9),d=b[a+1];if(!c||!d)throw new h("read-failed","Git 重命名状态记录格式无效");a+=1,e.push(B(c.path,c.fields[1],d));continue}if(f.startsWith("u ")){let a=z(f,10);if(!a)throw new h("read-failed","Git 冲突状态记录格式无效");e.push({path:a.path,oldPath:null,indexStatus:"unmerged",worktreeStatus:"unmerged"});continue}throw new h("read-failed","Git 返回了不支持的状态记录")}}}}return{head:c?{type:"branch",name:c}:d&&/^[0-9a-f]{40,64}$/.test(d)?{type:"detached",commit:d}:{type:"branch",name:"HEAD"},changes:e.sort((a,b)=>a.path.localeCompare(b.path))}}(c.stdout),e=b.filter(b=>b.absoluteRoot!==a.absoluteRoot&&(0,g.C)(a.absoluteRoot,b.absoluteRoot)).map(b=>q(a.absoluteRoot,b.absoluteRoot)).filter(Boolean),j=d.changes.filter(a=>{var b;return b=a.path,!e.some(a=>b===a||b.startsWith(`${a}/`))});if(j.length>i.vZ)throw new h("scan-limit","仓库变更文件超过 50000 个",(0,f.J8)("仓库变更文件超过 50000 个","Repository changes exceed 50,000 files"));return{root:a.protocolRoot,state:"ready",head:d.head,changes:j}}async function D(a,b){let c,f=await u(a);if(b.includes("/"))throw new h("not-repository","只支持项目根目录及其直接子目录中的 Git 仓库");let i=b?(0,e.resolve)(f,...b.split("/")):f;if(!(0,g.C)(f,i))throw new h("outside-project","Git 仓库不在当前项目目录内");try{c=await (0,d.realpath)(i)}catch{throw new h("not-repository","Git 仓库不存在")}if(!(0,g.C)(f,c))throw new h("outside-project","Git 仓库不在当前项目目录内");let j=await l(c,["rev-parse","--show-toplevel"]);if(0!==j.code||!j.stdout.trim())throw new h("not-repository","目标目录不是 Git 仓库");try{let a=await (0,d.realpath)(j.stdout.trim());if((0,g.b)(a)!==(0,g.b)(c))throw new h("not-repository","目标目录不是 Git 仓库根目录")}catch(a){if(a instanceof h)throw a;throw new h("not-repository","Git 仓库根目录无效")}return{absoluteRoot:c,protocolRoot:q(f,c)}}async function E(a,b){let c="local"===b.type?`refs/heads/${b.name}`:`refs/remotes/${b.name}`;if(0!==(await l(a,["show-ref","--verify","--quiet",c])).code)throw new h("invalid-ref",`${"local"===b.type?"本地":"远程"}分支不存在:${b.name}`);return b.name}async function F(a,b){if(0!==(await l(a,["check-ref-format","--branch",b])).code)throw new h("invalid-ref",`分支名称无效:${b}`);if(0===(await l(a,["show-ref","--verify","--quiet",`refs/heads/${b}`])).code)throw new h("invalid-ref",`本地分支已经存在:${b}`)}async function G(a,b){let c=(0,g.b)(a),d=p.get(c)??Promise.resolve(),e=()=>void 0,f=new Promise(a=>{e=a}),h=d.catch(()=>void 0).then(()=>f);p.set(c,h),await d.catch(()=>void 0);try{return await b()}finally{e(),p.get(c)===h&&p.delete(c)}}async function H(a,b){return C(b,await y(a))}async function I(a,b,c){let d=await D(a,b);return G(d.absoluteRoot,async()=>{let b=await E(d.absoluteRoot,c),e="local"===c.type?["switch",b]:["switch","--track",b],f=await l(d.absoluteRoot,e,{timeout:12e4,readOnly:!1});if(0!==f.code)throw new h("operation-failed",s("切换 Git 分支",f));return H(a,d)})}async function J(a,b,c,d){let e=await D(a,b);return G(e.absoluteRoot,async()=>{await F(e.absoluteRoot,c);let b=d?await E(e.absoluteRoot,d):null,f=await l(e.absoluteRoot,b?["switch","-c",c,b]:["switch","-c",c],{timeout:12e4,readOnly:!1});if(0!==f.code)throw new h("operation-failed",s("新建 Git 分支",f));return H(a,e)})}},41743:(a,b,c)=>{c.d(b,{AA:()=>p,C3:()=>j,ER:()=>m,Kx:()=>i,MT:()=>l,MY:()=>q,TO:()=>n,_A:()=>k,eW:()=>g,ik:()=>h,jw:()=>o,kg:()=>r,qL:()=>s});var d=c(36153),e=c(78143),f=c(75106);let g=d.Yj().trim().min(1),h=e.m4,i=e.$E,j=e.Rv,k=d.Yj().trim().min(1),l=d.ai().int().nonnegative(),m=d.Ik({workId:g,cwd:h,sessionId:i}).strict(),n=d.YO(m),o=d.k5(["main_running","background_running","completed","idle"]),p=d.Ik({user:d.ai().int().nonnegative(),total:d.ai().int().nonnegative()}).strict().refine(a=>a.user<=a.total,{message:"user message count cannot exceed total message count"}),q=m.extend({branchId:k,projectName:d.Yj().trim().min(1),sessionTitle:d.Yj().trim().min(1).nullable(),status:o,messageCounts:p,lastMessageUpdatedAt:f.k.nullable()}).strict(),r=d.Ik({workSessions:d.YO(q),pinnedCount:l}).strict().refine(a=>a.pinnedCount<=a.workSessions.length,{message:"pinnedCount cannot exceed work session count",path:["pinnedCount"]});d.Ik({cwd:h,sessionId:i.optional()}).strict(),d.Ik({workSession:q}).strict();let s=d.Ik({workId:g,sessionId:i,title:d.Yj().trim().min(1)}).strict();d.Ik({workId:g}).strict(),d.Ik({workIds:d.YO(g),pinnedCount:l}).strict().superRefine((a,b)=>{new Set(a.workIds).size!==a.workIds.length&&b.addIssue({code:"custom",message:"workIds cannot contain duplicates",path:["workIds"]}),a.pinnedCount>a.workIds.length&&b.addIssue({code:"custom",message:"pinnedCount cannot exceed workIds length",path:["pinnedCount"]})}),d.KC([d.Ik({workId:g,cwd:h,sessionId:i}).strict(),d.Ik({workId:g}).strict()])},42035:(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(63603),c(59214);var d=c(48180),e=c(80159)},42118:(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(60161),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)}})},43520:(a,b,c)=>{c.d(b,{L6:()=>e,k_:()=>f});var d=c(87048);let e={extensionMode:"normal",presentationMode:"normal",initializationError:null,queues:{steering:[],followUp:[]},model:null,capabilityMode:null,contextUsage:null,plugins:{}};function f(a,b){if("session_sync"===b.type){if("full"===b.mode)return{...(0,d.zR)(a,b.messages,b.temporaryMessages),runtime:b.runtime};let c=a.messages.at(-1);if(!c||c.location.index!==b.baseCursor.index||c.location.entryId!==b.baseCursor.entryId)throw Error("Incremental chat sync does not match the current durable cursor");let e=new Set(a.messages.map(a=>a.location.entryId));for(let a of b.messages){if(e.has(a.location.entryId))throw Error(`Incremental chat sync contains a duplicate entryId: ${a.location.entryId}`);e.add(a.location.entryId)}return{messages:[...a.messages,...b.messages],temporaryMessages:b.temporaryMessages,runtime:b.runtime}}return"runtime_update"===b.type?{...a,runtime:b.runtime}:{...(0,d.kn)(a,b),runtime:a.runtime}}Object.freeze({messages:[],temporaryMessages:[],runtime:e})},44164:(a,b,c)=>{c.d(b,{H:()=>g});var d=c(75278);function e(a,b){return JSON.stringify(a)===JSON.stringify(b)}function f(a,b,c,d,f){for(let g of new Set([...Object.keys(b),...Object.keys(c)])){let h=b[g],i=Object.hasOwn(c,g),j=i?c[g]:null;if(e(h,j))continue;let k=i?function(a,b){if("string"==typeof a&&"string"==typeof b&&b.startsWith(a))return b.slice(a.length)||null;if(Array.isArray(a)&&Array.isArray(b)&&a.length<=b.length&&a.every((a,c)=>e(a,b[c]))){let c=b.slice(a.length);return c.length>0?c:null}return null}(h,j):null;null!==k?f[`${a}.${g.replace(/\\/g,"\\\\").replace(/\./g,"\\.")}`]=k:d[g]=j}}function g(a,b){var c,e;let g;if(a.fixed.type!==b.fixed.type)throw Error(`Chat message type changed: ${a.fixed.type}/${b.fixed.type}`);let h=(g={},a.fixed.viewKey!==b.fixed.viewKey&&(g.viewKey=b.fixed.viewKey),"status"in a.fixed&&"status"in b.fixed&&a.fixed.status!==b.fixed.status&&(g.status=b.fixed.status),a.fixed.hasDetail!==b.fixed.hasDetail&&(g.hasDetail=b.fixed.hasDetail),"usage"in a.fixed&&"usage"in b.fixed&&(c=a.fixed.usage)!==(e=b.fixed.usage)&&(null===c||null===e||c.inputTokens!==e.inputTokens||c.outputTokens!==e.outputTokens||c.cacheReadTokens!==e.cacheReadTokens||c.costUsd!==e.costUsd)&&(g.usage=b.fixed.usage),Object.keys(g).length>0?g:void 0),i={},j={},k={};f("summary",a.summary,b.summary,i,k),b.fixed.hasDetail&&f("detail",a.detail??{},b.detail??{},j,k);let l=Object.keys(i).length>0,m=Object.keys(j).length>0,n=Object.keys(k).length>0;return h||l||m||n?d.ef.parse({type:"message_update",location:a.location,...h?{fixed:h}:{},...l?{summary:i}:{},...m?{detail:j}:{},...n?{increments:k}:{}}):null}},44937:(a,b,c)=>{c.d(b,{FF:()=>h,LK:()=>i});var d=c(36153),e=c(72497),f=c(62695);let g=d.Ik({name:d.Yj().trim().min(1),description:d.Yj(),parameters:e.Dz}).strict(),h=d.Ik({source:f.Pi}).strict(),i=d.Ik({systemPrompt:d.Yj(),tools:d.YO(g)}).strict()},45166:(a,b,c)=>{c.d(b,{Z:()=>i,f1:()=>j});let d=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;class e extends Error{constructor(a){super(a),this.name="L4PiImageValidationError"}}function f(a,b){if(!Number.isSafeInteger(a)||a<=0)throw new e(`图片 ${b} 无效`);return a}let g=new Set([192,193,194,195,197,198,199,201,202,203,205,206,207]);function h(a,b){return a[b]|a[b+1]<<8|a[b+2]<<16}function i(a){if(!a||a.startsWith("data:")||!d.test(a))throw new e("图片 Base64 无效");let b=Buffer.from(a,"base64");if(0===b.length)throw new e("图片内容为空");let c=function(a){if(a.length>=8&&137===a[0]&&80===a[1]&&78===a[2]&&71===a[3]&&13===a[4]&&10===a[5]&&26===a[6]&&10===a[7])return"image/png";if(a.length>=3&&255===a[0]&&216===a[1]&&255===a[2])return"image/jpeg";if(a.length>=10&&["GIF87a","GIF89a"].includes(a.toString("ascii",0,6)))return"image/gif";if(a.length>=16&&"RIFF"===a.toString("ascii",0,4)&&"WEBP"===a.toString("ascii",8,12))return"image/webp";throw new e("图片格式不受支持")}(b);return{bytes:b,metadata:{mimeType:c,...function(a,b){switch(b){case"image/png":if(a.length<24||"IHDR"!==a.toString("ascii",12,16))throw new e("PNG 图片头无效");return{width:f(a.readUInt32BE(16),"宽度"),height:f(a.readUInt32BE(20),"高度")};case"image/jpeg":let c=2;for(;c+3<a.length;){for(;c<a.length&&255!==a[c];)c+=1;for(;c<a.length&&255===a[c];)c+=1;if(c>=a.length)break;let b=a[c];if(c+=1,216===b||1===b||b>=208&&b<=215)continue;if(217===b||218===b||c+1>=a.length)break;let d=a.readUInt16BE(c);if(d<2||c+d>a.length)break;if(g.has(b)){if(d<7)break;return{width:f(a.readUInt16BE(c+5),"宽度"),height:f(a.readUInt16BE(c+3),"高度")}}c+=d}throw new e("JPEG 图片尺寸无效");case"image/gif":if(a.length<10)throw new e("GIF 图片头无效");return{width:f(a.readUInt16LE(6),"宽度"),height:f(a.readUInt16LE(8),"高度")};case"image/webp":return function(a){let b=a.toString("ascii",12,16);if("VP8X"===b){if(a.length<30)throw new e("WebP VP8X 图片头无效");return{width:f(h(a,24)+1,"宽度"),height:f(h(a,27)+1,"高度")}}if("VP8L"===b){if(a.length<25||47!==a[20])throw new e("WebP VP8L 图片头无效");let b=a[21],c=a[22],d=a[23],g=a[24];return{width:f(1+((63&c)<<8|b),"宽度"),height:f(1+((15&g)<<10|d<<2|(192&c)>>6),"高度")}}if("VP8 "===b){if(a.length<30||157!==a[23]||1!==a[24]||42!==a[25])throw new e("WebP VP8 图片头无效");return{width:f(16383&a.readUInt16LE(26),"宽度"),height:f(16383&a.readUInt16LE(28),"高度")}}throw new e("WebP 图片编码无效")}(a)}}(b,c)}}}function j(a){let b=i(a.data);if(b.metadata.mimeType!==a.mimeType)throw new e("图片 MIME 与实际内容不一致");if(b.metadata.width!==a.width||b.metadata.height!==a.height)throw new e("图片尺寸与实际内容不一致");return b}},45870:(a,b,c)=>{c.d(b,{H:()=>g,k:()=>h});var d=c(77598),e=c(57975),f=c(10658);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}}},47757:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{appendL4PiDeskSystemPrompt:()=>q,createL4PiDeskTool:()=>s,disposeL4PiDeskCommands:()=>p,executeL4PiDeskCommand:()=>r,initializeL4PiDeskCommands:()=>o});var e=c(51455),f=c(76760),g=c(75430),h=c(60815),i=c(17691),j=c(16056),k=c(55574),l=c(77167),m=a([g,h,i]);function n(a){return a.replaceAll("\\","/")}async function o(a,b=!1){let c=(0,g.getAgentDir)(),d=process.cwd(),h=JSON.parse(await (0,e.readFile)((0,f.join)(d,"package.json"),"utf8"));if(!h||"object"!=typeof h||!("version"in h)||"string"!=typeof h.version)throw Error("Pi Desk package.json 缺少版本号");let{createRequire:j}=process.getBuiltinModule("module"),k=(0,f.dirname)((0,f.dirname)(j((0,f.join)(d,"package.json")).resolve("@jetcrab/pi-desk-sdk"))),m=(0,f.join)(d,"docs");await Promise.all(["README.md","commands.md","plugins.md"].map(a=>(0,e.access)((0,f.join)(m,a)))),await (0,e.rm)((0,f.join)((0,i.M)(),b?"dev-skills":"skills","pi-desk"),{recursive:!0,force:!0});let p={handler:a,docsDirectory:m,systemPrompt:(0,l.O)({docsDirectory:n(m),sdkRoot:n(k)}),version:h.version,development:b,agentDir:c};globalThis.__piDeskCommandRuntime=p,console.info("[Pi Desk][Commands] 命令入口与系统资料导航已准备完成",{docsDirectory:m})}function p(){globalThis.__piDeskCommandRuntime=void 0}function q(a=[]){let b=globalThis.__piDeskCommandRuntime?.systemPrompt;return b?[...a,b]:[...a]}async function r(a,b){let c=globalThis.__piDeskCommandRuntime;if(!c)throw Error("Pi Desk 命令入口尚未准备完成");b.signal.throwIfAborted();let d=(0,k.h)(a);if("help"===d.kind)return{mode:"sync",message:d.message};if("version"===d.kind)return{mode:"sync",message:c.version};if("info"===d.kind)return{mode:"sync",message:JSON.stringify({version:c.version,environment:c.development?"development":"production",mode:(0,j.P)()?"basic":"normal",cwd:b.cwd,agentDir:c.agentDir,docsDirectory:c.docsDirectory})};if("session"===d.kind)return b.reload();if("plugins"!==d.kind)throw Error("Pi Desk 命令无效");return c.handler(d,b)}[g,h,i]=m.then?(await m)():m;let t=h.Type.Object({args:h.Type.Array(h.Type.String({minLength:1,maxLength:2048}),{maxItems:32})},{additionalProperties:!1});function s(a){return globalThis.__piDeskCommandRuntime?(0,g.defineTool)({name:"pidesk",exposure:"model-only",label:"Pi Desk",description:"Pi Desk 命令入口。",parameters:t,async execute(b,c){let d=await a(c.args,b),e=(0,g.truncateHead)(d.message),f={mode:d.mode,message:e.truncated?`${e.content}
26
- …结果过长,已截断。`:d.message};return{content:[{type:"text",text:JSON.stringify(f)}],details:f}}}):null}d()}catch(a){d(a)}})},48180:(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}},48958:(a,b,c)=>{c.a(a,async(a,b)=>{try{var d=c(17691);c(77598),c(73024),c(76760);var e=c(75430),f=c(28802),g=a([d,e,f]);[d,e,f]=g.then?(await g)():g,b()}catch(a){b(a)}})},49240:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{A:()=>l});var e=c(73024),f=c(76760),g=c(75430),h=c(26178),i=c(28802),j=a([g,h,i]);[g,h,i]=j.then?(await j)():j;let m=new Set(["off","minimal","low","medium","high","xhigh","max"]);function k(a,b){return`${a}\u0000${b}`}async function l(a,b=process.cwd()){let c=(0,g.getAgentDir)(),d=a?.modelRuntime??await g.ModelRuntime.create({authPath:(0,f.join)(c,"auth.json"),modelsPath:(0,f.join)(c,"models.json")}),j=a?.settingsManager??g.SettingsManager.create(b,c);await d.refresh({allowNetwork:!1});let n=j.getEnabledModels(),o=n?.length?(await (0,g.resolveModelScopeWithDiagnostics)(n,d)).scopedModels.map(a=>a.model):[...await d.getAvailable()],p=new Map;for(let a of(0,h.oj)(o,d))p.set(k(a.provider,a.id),a);let q=[...p.values()].map(a=>({provider:a.provider,modelId:a.id,name:a.name,input:[...a.input],kind:d.getPhysicalModel(a.provider,a.id)?"physical":"virtual",contextWindow:a.contextWindow>0?a.contextWindow:null,thinkingLevels:[...(0,i.getSupportedThinkingLevels)(a)]})),r=new Map(q.map(a=>[k(a.provider,a.modelId),a])),s=[],t=0;for(let a of function(){let a=(0,f.join)((0,g.getAgentDir)(),"models.json");if(!(0,e.existsSync)(a))return[];try{let b=JSON.parse((0,e.readFileSync)(a,"utf8"));return Array.isArray(b.modelPresets)?b.modelPresets:[]}catch(b){return console.warn("[Pi Desk][PiModelCatalog] models.json 读取失败",{path:a,errorName:b instanceof Error?b.name:"UnknownError"}),[]}}()){if("string"!=typeof a.provider||!a.provider.trim()||"string"!=typeof a.modelId||!a.modelId.trim()||"string"!=typeof a.thinkingLevel||!m.has(a.thinkingLevel)||void 0!==a.color&&null!==a.color&&"string"!=typeof a.color){t+=1;continue}let b=a.thinkingLevel,c=r.get(k(a.provider,a.modelId));if(!c||!c.thinkingLevels.includes(b)){t+=1;continue}s.push({provider:a.provider,modelId:a.modelId,thinkingLevel:b,color:"string"==typeof a.color&&a.color.trim()?a.color:null})}return t>0&&console.warn("[Pi Desk][PiModelCatalog] 已忽略无效或不可用的模型预设",{cwd:a?.sessionManager.getCwd()??b,count:t}),{models:q,presets:s}}d()}catch(a){d(a)}})},53120:(a,b,c)=>{c.d(b,{Cn:()=>l,WJ:()=>n,g$:()=>m,i0:()=>i,iW:()=>k,u1:()=>j});var d=c(36153),e=c(75106),f=c(41743);let g=d.k5(["user","assistant","tool","bash","custom_message","compaction","branch_summary","custom","model_change","thinking_level_change","session_info","label"]),h=d.Ik({entryId:f.C3,parentEntryId:f.C3.nullable(),timestampMs:e.k,kind:g,preview:d.Yj(),label:d.Yj().trim().min(1).nullable()}).strict(),i=d.Ik({workId:f.eW,sessionId:f.Kx}).strict(),j=d.Ik({sessionId:f.Kx,leafEntryId:f.C3.nullable(),nodes:d.YO(h)}).strict().superRefine((a,b)=>{let c=new Set;for(let[d,e]of a.nodes.entries())c.has(e.entryId)&&b.addIssue({code:"custom",message:"work session tree entryId values must be unique",path:["nodes",d,"entryId"]}),c.add(e.entryId);null===a.leafEntryId||c.has(a.leafEntryId)||b.addIssue({code:"custom",message:"work session tree leafEntryId must reference a node",path:["leafEntryId"]})}),k=d.Ik({workId:f.eW,sessionId:f.Kx,entryId:f.C3}).strict(),l=d.Ik({entryId:f.C3,kind:g,content:d.Yj(),truncated:d.zM()}).strict();d.k5(["tree","fork","clone"]);let m=d.gM("action",[d.Ik({action:d.eu("tree"),workId:f.eW,sessionId:f.Kx,entryId:f.C3}).strict(),d.Ik({action:d.eu("fork"),workId:f.eW,sessionId:f.Kx,entryId:f.C3}).strict(),d.Ik({action:d.eu("clone"),workId:f.eW,sessionId:f.Kx}).strict()]),n=d.Ik({workSessions:d.YO(f.MY),pinnedCount:f.MT,targetWorkId:f.eW,editorText:d.Yj().nullable()}).strict().superRefine((a,b)=>{a.pinnedCount>a.workSessions.length&&b.addIssue({code:"custom",message:"pinnedCount cannot exceed work session count",path:["pinnedCount"]}),a.workSessions.some(b=>b.workId===a.targetWorkId)||b.addIssue({code:"custom",message:"targetWorkId must reference a returned work session",path:["targetWorkId"]})})},55490:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{dM:()=>q,nJ:()=>s,yO:()=>u});var e=c(76760),f=c(6277),g=c(44937),h=c(62695),i=c(43520),j=c(16056),k=c(6676),l=c(5340),m=c(33448),n=a([k,l,m]);[k,l,m]=n.then?(await n)():n;class q extends Error{constructor(a){super(`Chat source is not current: ${a.workId}/${a.sessionId}/${a.branchId}`),this.name="L2ChatSourceBindingError"}}class r extends Error{constructor(a){super(`Chat message was not found: ${a}`),this.name="L2ChatMessageNotFoundError"}}class s extends Error{constructor(a){super(`Chat commands are blocked by WorkSession lifecycle: ${a}`),this.name="L2ChatLifecycleBlockedError"}}class t extends Error{constructor(a,b){super(`工作会话 ${a} 阻止插件重载:${b}`),this.workId=a,this.reason=b,this.name="L2PluginReloadBlockedError"}}function o(a){try{return structuredClone(a)}catch{let{declaration:b,...c}=a;return structuredClone(c)}}function p(a,b){return JSON.stringify(a)===JSON.stringify(b)}class u{async initialize(a){let b=a.map(a=>this.buildRecord(a));for(let a of(this.recordsByWorkId.clear(),b))this.recordsByWorkId.set(a.source.workId,a)}addWorkSession(a){this.recordsByWorkId.set(a.workId,this.buildRecord(a))}async replaceWorkSession(a,b){let c=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),c&&this.publish({type:"source_invalidated",source:c}),this.recordsByWorkId.set(b.workId,this.buildRecord(b)),a.sessionId!==b.sessionId&&await (0,m.gb)(a.sessionId)}async refreshWorkSession(a){let b=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),b&&this.publish({type:"source_invalidated",source:b}),this.recordsByWorkId.set(a.workId,this.buildRecord(a))}async removeWorkSession(a){let b=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),b&&this.publish({type:"source_invalidated",source:b}),await (0,m.gb)(a.sessionId)}async pauseWorkSession(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,m.ls)(b.source.sessionId).nativeUi.cancelAll(),await b.commandTail)}resumeWorkSession(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!0)}async pauseForProcessRestart(){let a=[...this.recordsByWorkId.values()],b=a.map(a=>({record:a,reason:this.pluginReloadBlockReason(a)})).find(a=>null!==a.reason);if(b?.reason)throw new t(b.record.source.workId,b.reason);for(let b of a)b.acceptingCommands=!1;await Promise.all(a.map(a=>a.commandTail));let c=a.map(a=>({record:a,reason:this.pluginReloadBlockReason(a)})).find(a=>null!==a.reason);if(c?.reason){for(let b of a)b.acceptingCommands=!0;throw new t(c.record.source.workId,c.reason)}let d=!0;return()=>{if(d)for(let b of(d=!1,a))this.recordsByWorkId.get(b.source.workId)===b&&(b.acceptingCommands=!0)}}metadataFor(a){return this.recordFor(a).metadata}statusFor(a){return this.statusForRecord(this.recordFor(a))}statusForRecord(a){return a.mainRunning?"main_running":a.backgroundTaskIds.size>0?"background_running":a.completedPending?"completed":"idle"}acknowledgeCompleted(a){let b=this.recordsByWorkId.get(a);if(!b||!b.completedPending)return!1;let c=this.statusForRecord(b);return b.completedPending=!1,this.publishRecordChanged(a,b.metadata,c),!0}isCurrentSource(a){let b=h.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);return void 0!==c&&this.matches(c.source,b)}getProjectPreviewContext(a,b){let c=this.recordsByWorkId.get(a.workId);if(!c||c.workSession!==a)return null;let d=(0,f.Yj)((0,e.resolve)(b)),g=d===(0,f.Yj)((0,e.resolve)(a.cwd)),h=()=>(0,f.D)(c.state.runtime.plugins[f.s6]).directories.find(a=>(0,f.Yj)(a)===d),i=g?a.cwd:h();if(!i)return null;let j=()=>this.recordsByWorkId.get(a.workId)===c&&c.acceptingCommands&&this.matches(c.source,this.sourceFor(a))&&(g||void 0!==h());return j()?{cwd:i,isCurrent:j}:null}setPresentation(a,b){let c=this.currentRecord(a);return this.enqueueCommand(c,async()=>{if(((0,j.P)()||"basic"===c.state.runtime.extensionMode)&&"normal"===b)throw Error("基础模式不启用插件消息展示,请先恢复插件聊天");c.state.runtime.presentationMode!==b&&this.reprojectRecord(c,b)})}reprojectRecord(a,b){let c=(0,m.ls)(a.source.sessionId).readChatSnapshot(),d=new Map(c.entries.map(a=>[a.entryId,a])),e="basic"===b,f=a.state.messages.map(b=>{let c=d.get(b.location.entryId);if(!c)throw Error(`无法重新投影消息:${b.location.entryId}`);return(0,l.Cz)(b.location.index,c.entryId,c.timestampMs,c.message,a.source,e)}),g=a.state.temporaryMessages.map(b=>{let c=a.rawTemporaryMessages.get(b.location.tempId);if(!c)throw Error(`临时消息基线尚不可重投影:${b.location.tempId}`);return(0,l.QS)(b.location.tempId,c,a.source,!1,"update",e)});a.state={messages:f,temporaryMessages:g,runtime:{...a.state.runtime,presentationMode:b}},a.sourceEventVersion+=1,this.publish({type:"source_event",source:a.source,version:a.sourceEventVersion,event:this.createSync(a.source,null).event})}prepareSource(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>this.syncRecordRuntime(b))}async syncRecordRuntime(a){let b=a.source,c=await (0,m.ls)(b.sessionId).readChatRuntime(),d=h.wf.parse({...c,presentationMode:a.state.runtime.presentationMode});this.isCurrentSource(b)&&(p(a.state.runtime,d)||this.applySourceEvent(b,{type:"runtime_update",runtime:d}))}createSync(a,b){let c=this.currentRecord(a),d=c.source,e=c.state.messages,f=c.state.temporaryMessages,g=c.state.runtime,h=null===b?void 0:e[b.index],i=null!==b&&h?.location.entryId===b.entryId;return null===b||i||console.warn("[Pi Desk][WorkSessionChatRuntime] 客户端消息 cursor 不匹配,回退全量",{workId:d.workId,sessionId:d.sessionId,branchId:d.branchId,clientCursorIndex:b.index,clientCursorEntryId:b.entryId,serverEntryIdAtIndex:h?.location.entryId??null,serverLatestIndex:e.at(-1)?.location.index??-1}),{event:i?{type:"session_sync",mode:"incremental",baseCursor:b,messages:e.slice(b.index+1).map(l.NA),temporaryMessages:f,runtime:g}:{type:"session_sync",mode:"full",baseCursor:null,messages:e.map(l.NA),temporaryMessages:f,runtime:g},watermark:c.sourceEventVersion}}getImage(a){let b=h.kF.parse(a),c=this.recordForSession(b.sessionId,b.branchId),d=c.state.messages.find(a=>a.location.entryId===b.entryId);if(!d||"user"!==d.fixed.type&&"tool"!==d.fixed.type)throw new r(`${b.entryId}/${b.imageIndex}`);return h.mB.parse((0,m.ls)(c.source.sessionId).readChatImage(b.entryId,b.imageIndex))}getMessageDetail(a){let b=h.VK.parse(a),c=this.recordForSession(b.sessionId,b.branchId).state.messages.find(a=>a.location.entryId===b.entryId);if(!c)throw new r(b.entryId);return h.ps.parse({index:c.location.index,entryId:c.location.entryId,detail:c.detail??null})}getModelContext(a){let b=g.FF.parse(a),c=this.currentRecord(b.source);return this.enqueueCommand(c,async()=>g.LK.parse(await (0,m.ls)(c.source.sessionId).readModelContext()))}send(a){let b=this.currentRecord(a.source);if((0,m.ls)(a.source.sessionId).nativeUi.hasPending)return Promise.reject(Error("请先处理当前插件问题,或停止当前任务"));let c=()=>b.workSession.send({mode:a.mode,text:a.text,images:a.images});return b.compactionStart?b.acceptingCommands?b.compactionStart.then(a=>{if(!b.acceptingCommands)throw new s(b.source.workId);return a?c():this.enqueueCommand(b,c)}):Promise.reject(new s(b.source.workId)):this.enqueueCommand(b,c)}interrupt(a){let b=this.currentRecord(a);return(0,m.ls)(a.sessionId).nativeUi.hasPending?b.workSession.interrupt():this.enqueueCommand(b,()=>b.workSession.interrupt())}compact(a){let b,c=this.currentRecord(a);if(c.compactionStart)return Promise.reject(Error("上下文正在压缩"));let d=new Promise(a=>{b=a});c.compactionStart=d;let e=this.enqueueCommand(c,()=>{try{let a=(0,m.ls)(c.source.sessionId).compact();return b(!0),a}catch(a){throw b(!1),a}});return e.then(()=>{b(!1),c.compactionStart===d&&(c.compactionStart=null)},()=>{b(!1),c.compactionStart===d&&(c.compactionStart=null)}),e}reload(a,b){let c=this.currentRecord(a);return(0,m.ls)(a.sessionId).nativeUi.cancelAll(),this.enqueueCommand(c,async()=>{try{await (0,m.ls)(c.source.sessionId).reload(b)}finally{this.recordsByWorkId.get(a.workId)===c&&await this.syncRecordRuntime(c)}})}restoreQueuedMessages(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>b.workSession.restoreQueuedMessages())}setTitle(a,b){let c=this.recordFor(a);return this.enqueueCommand(c,()=>c.workSession.setTitle(b))}setModel(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>b.workSession.setModel(a.model))}setCapabilityMode(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).setCapabilityMode(a.capabilityMode))}invokePluginMethod(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).invokePluginMethod(b.source,a.pluginName,a.method,a.input))}listNativeCommands(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).listNativeCommands())}executeNativeCommand(a,b,c){let d=this.currentRecord(a);return this.enqueueCommand(d,()=>(0,m.ls)(d.source.sessionId).executeNativeCommand(b,c))}listNativeTools(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).listNativeTools())}executeDirectBash(a,b){let c=this.currentRecord(a);return c.directBashActive?Promise.reject(new k.yT):(c.directBashActive=!0,this.enqueueCommand(c,()=>(0,m.ls)(c.source.sessionId).executeDirectBash(b)).finally(()=>{c.directBashActive=!1}))}abortDirectBash(a){let b=this.currentRecord(a);return(0,m.ls)(b.source.sessionId).abortDirectBash()}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}subscribeRecordChanges(a){return this.recordListeners.add(a),()=>this.recordListeners.delete(a)}subscribePluginPush(a){return this.pluginPushListeners.add(a),()=>this.pluginPushListeners.delete(a)}buildRecord(a){let b=this.sourceFor(a),c=(0,m.ls)(a.sessionId),d=c.readChatSnapshot(),e=d.entries.map((a,c)=>(0,l.Cz)(c,a.entryId,a.timestampMs,a.message,b,(0,j.P)())),f=h.oc.parse({messages:e,temporaryMessages:[],runtime:{...i.L6,extensionMode:(0,j.P)()?"basic":"normal",presentationMode:(0,j.P)()?"basic":"normal"}}),g=f.messages.find(a=>"user"===a.fixed.type),k=g?h.xE.safeParse(g.summary):null,n=k?.success&&k.data.text.trim()||null,o={workSession:a,source:b,state:f,sourceEventVersion:0,rawTemporaryMessages:new Map,metadata:{sessionTitle:d.sessionName??n,messageCounts:{user:f.messages.filter(a=>"user"===a.fixed.type).length,total:f.messages.length},lastMessageUpdatedAt:f.messages.at(-1)?.fixed.timestampMs??null},mainRunning:!1,backgroundTaskIds:new Set(c.readChatBackgroundTaskIds()),completedPending:!1,acceptingCommands:!0,directBashActive:!1,compactionStart:null,commandTail:Promise.resolve(),unsubscribeWorker:()=>void 0};return o.unsubscribeWorker=c.subscribeChat(a=>this.handleWorkerEvent(o,a)),o}handleWorkerEvent(a,b){if(this.recordsByWorkId.get(a.source.workId)!==a)return;let c=a.metadata,d=this.statusForRecord(a),e="basic"===a.state.runtime.extensionMode||"basic"===a.state.runtime.presentationMode;switch(b.type){case"message_start":a.rawTemporaryMessages.set(b.tempId,o(b.message)),this.applySourceEvent(a.source,{type:"message_start",snapshot:(0,l.QS)(b.tempId,b.message,a.source,!1,"temporary",e)});return;case"message_update":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);a.rawTemporaryMessages.set(b.tempId,o(b.message));let d=(0,l.Ht)(c,(0,l.QS)(b.tempId,b.message,a.source,!1,"update",e));d&&this.applySourceEvent(a.source,d);return}case"message_commit":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);let d=(0,l.QS)(b.tempId,b.message,a.source,!1,"final",e),f=(0,l.Ht)(c,d);f&&this.applySourceEvent(a.source,f),this.replaceCanonicalTemporary(a,b.tempId,b.message),a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_commit",location:{tempId:b.tempId},durable:{index:a.state.messages.length,entryId:b.entryId},fixed:{timestampMs:b.timestampMs}});return}case"message_discard":a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_discard",location:{tempId:b.tempId}});return;case"plugin_push":this.publishPluginPush({pluginName:b.pluginName,target:{scope:"session",source:a.source},event:b.event,data:structuredClone(b.data)});return;case"runtime_changed":{let c=h.wf.parse({...b.runtime,presentationMode:a.state.runtime.presentationMode});p(a.state.runtime,c)||this.applySourceEvent(a.source,{type:"runtime_update",runtime:c});return}case"agent_started":if(a.mainRunning)return;a.mainRunning=!0,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"main_operation_cancelled":case"main_operation_finished":if(!a.mainRunning)return;a.mainRunning=!1,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"agent_settled":{let b=a.mainRunning||a.backgroundTaskIds.size>0;a.mainRunning=!1,b&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"background_tasks_changed":{let e=a.mainRunning||a.backgroundTaskIds.size>0;a.backgroundTaskIds=new Set(b.taskIds),e&&!a.mainRunning&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"session_info_changed":a.metadata={...a.metadata,sessionTitle:b.sessionTitle},this.publishRecordChanged(a.source.workId,c,d);return}}replaceCanonicalTemporary(a,b,c){let d=a.state.temporaryMessages.findIndex(a=>a.location.tempId===b);if(d<0)throw Error(`Temporary chat message was not found: ${b}`);let e=[...a.state.temporaryMessages];e[d]=(0,l.QS)(b,c,a.source,!0,"final","basic"===a.state.runtime.extensionMode||"basic"===a.state.runtime.presentationMode),a.state={...a.state,temporaryMessages:e}}applySourceEvent(a,b){let c=this.currentRecord(a),d=c.source;if(c.state=(0,i.k_)(c.state,b),c.sourceEventVersion+=1,"message_commit"===b.type){let a=c.state.messages[b.durable.index];if(!a||a.location.entryId!==b.durable.entryId)throw Error(`Committed chat message is missing: ${b.durable.index}/${b.durable.entryId}`);let e=c.metadata;c.metadata=this.metadataFromState(c),this.publishRecordChanged(d.workId,e,this.statusForRecord(c))}this.publish({type:"source_event",source:d,version:c.sourceEventVersion,event:b})}metadataFromState(a){let b=a.state.messages.find(a=>"user"===a.fixed.type),c=b?h.xE.safeParse(b.summary):null,d=c?.success&&c.data.text.trim()||null;return{sessionTitle:a.metadata.sessionTitle??d,messageCounts:{user:a.state.messages.filter(a=>"user"===a.fixed.type).length,total:a.state.messages.length},lastMessageUpdatedAt:a.state.messages.at(-1)?.fixed.timestampMs??null}}enqueueCommand(a,b){if(!a.acceptingCommands)return Promise.reject(new s(a.source.workId));let c=a.commandTail.then(b,b);return a.commandTail=c.then(()=>void 0,()=>void 0),c}pluginReloadBlockReason(a){return(0,m.ls)(a.source.sessionId).nativeUi.hasPending?"原生插件问题正在等待回答":a.directBashActive?"Direct Bash 正在运行":a.mainRunning?"主 Agent 正在运行":a.backgroundTaskIds.size>0?"插件后台任务正在运行":(0,m.ls)(a.source.sessionId).readPluginReloadBlockReason()}async closeRecord(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,m.ls)(b.source.sessionId).nativeUi.cancelAll(),await b.commandTail,b.unsubscribeWorker(),b.rawTemporaryMessages.clear(),this.recordsByWorkId.delete(a))}recordFor(a){let b=this.recordsByWorkId.get(a.workId);if(!b||!this.matches(b.source,this.sourceFor(a)))throw Error(`WorkSession chat state is not initialized: ${a.workId}`);return b}sourceFor(a){return h.Pi.parse({workId:a.workId,sessionId:a.sessionId,branchId:a.branchId})}currentRecord(a){let b=h.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);if(!c||!this.matches(c.source,b))throw new q(b);return c}recordForSession(a,b){let c=[...this.recordsByWorkId.values()].find(c=>c.source.sessionId===a&&c.source.branchId===b);if(c)return c;throw new q({workId:"unknown",sessionId:a,branchId:b})}matches(a,b){return a.workId===b.workId&&a.sessionId===b.sessionId&&a.branchId===b.branchId}publishPluginPush(a){for(let b of[...this.pluginPushListeners])try{b(a)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Plugin Push 监听器执行失败",{pluginName:a.pluginName,event:a.event,errorName:b instanceof Error?b.name:"UnknownError"})}}publish(a){for(let b of[...this.listeners])try{b(a)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Source 事件监听器执行失败",{eventType:a.type,workId:a.source.workId,errorName:b instanceof Error?b.name:"UnknownError"})}}publishRecordChanged(a,b,c){for(let d of[...this.recordListeners])try{d(a,b,c)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Record 监听器执行失败",{workId:a,errorName:b instanceof Error?b.name:"UnknownError"})}}constructor(){this.recordsByWorkId=new Map,this.listeners=new Set,this.recordListeners=new Set,this.pluginPushListeners=new Set}}d()}catch(a){d(a)}})},55574:(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)}
25
+ …结果过长,已截断。`:d.message};return{content:[{type:"text",text:JSON.stringify(f)}],details:f}}}):null}d()}catch(a){d(a)}})},48180:(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}},48958:(a,b,c)=>{c.a(a,async(a,b)=>{try{var d=c(17691);c(77598),c(73024),c(76760);var e=c(75430),f=c(28802),g=a([d,e,f]);[d,e,f]=g.then?(await g)():g,b()}catch(a){b(a)}})},49240:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{A:()=>l});var e=c(73024),f=c(76760),g=c(75430),h=c(26178),i=c(28802),j=a([g,h,i]);[g,h,i]=j.then?(await j)():j;let m=new Set(["off","minimal","low","medium","high","xhigh","max"]);function k(a,b){return`${a}\u0000${b}`}async function l(a,b=process.cwd()){let c=(0,g.getAgentDir)(),d=a?.modelRuntime??await g.ModelRuntime.create({authPath:(0,f.join)(c,"auth.json"),modelsPath:(0,f.join)(c,"models.json")}),j=a?.settingsManager??g.SettingsManager.create(b,c);await d.refresh({allowNetwork:!1});let n=j.getEnabledModels(),o=n?.length?(await (0,g.resolveModelScopeWithDiagnostics)(n,d)).scopedModels.map(a=>a.model):[...await d.getAvailable()],p=new Map;for(let a of(0,h.oj)(o,d))p.set(k(a.provider,a.id),a);let q=[...p.values()].map(a=>({provider:a.provider,modelId:a.id,name:a.name,input:[...a.input],kind:d.getPhysicalModel(a.provider,a.id)?"physical":"virtual",contextWindow:a.contextWindow>0?a.contextWindow:null,thinkingLevels:[...(0,i.getSupportedThinkingLevels)(a)]})),r=new Map(q.map(a=>[k(a.provider,a.modelId),a])),s=[],t=0;for(let a of function(){let a=(0,f.join)((0,g.getAgentDir)(),"models.json");if(!(0,e.existsSync)(a))return[];try{let b=JSON.parse((0,e.readFileSync)(a,"utf8"));return Array.isArray(b.modelPresets)?b.modelPresets:[]}catch(b){return console.warn("[Pi Desk][PiModelCatalog] models.json 读取失败",{path:a,errorName:b instanceof Error?b.name:"UnknownError"}),[]}}()){if("string"!=typeof a.provider||!a.provider.trim()||"string"!=typeof a.modelId||!a.modelId.trim()||"string"!=typeof a.thinkingLevel||!m.has(a.thinkingLevel)||void 0!==a.color&&null!==a.color&&"string"!=typeof a.color){t+=1;continue}let b=a.thinkingLevel,c=r.get(k(a.provider,a.modelId));if(!c||!c.thinkingLevels.includes(b)){t+=1;continue}s.push({provider:a.provider,modelId:a.modelId,thinkingLevel:b,color:"string"==typeof a.color&&a.color.trim()?a.color:null})}return t>0&&console.warn("[Pi Desk][PiModelCatalog] 已忽略无效或不可用的模型预设",{cwd:a?.sessionManager.getCwd()??b,count:t}),{models:q,presets:s}}d()}catch(a){d(a)}})},53120:(a,b,c)=>{c.d(b,{Cn:()=>l,WJ:()=>n,g$:()=>m,i0:()=>i,iW:()=>k,u1:()=>j});var d=c(36153),e=c(75106),f=c(41743);let g=d.k5(["user","assistant","tool","bash","custom_message","compaction","branch_summary","custom","model_change","thinking_level_change","session_info","label"]),h=d.Ik({entryId:f.C3,parentEntryId:f.C3.nullable(),timestampMs:e.k,kind:g,preview:d.Yj(),label:d.Yj().trim().min(1).nullable()}).strict(),i=d.Ik({workId:f.eW,sessionId:f.Kx}).strict(),j=d.Ik({sessionId:f.Kx,leafEntryId:f.C3.nullable(),nodes:d.YO(h)}).strict().superRefine((a,b)=>{let c=new Set;for(let[d,e]of a.nodes.entries())c.has(e.entryId)&&b.addIssue({code:"custom",message:"work session tree entryId values must be unique",path:["nodes",d,"entryId"]}),c.add(e.entryId);null===a.leafEntryId||c.has(a.leafEntryId)||b.addIssue({code:"custom",message:"work session tree leafEntryId must reference a node",path:["leafEntryId"]})}),k=d.Ik({workId:f.eW,sessionId:f.Kx,entryId:f.C3}).strict(),l=d.Ik({entryId:f.C3,kind:g,content:d.Yj(),truncated:d.zM()}).strict();d.k5(["tree","fork","clone"]);let m=d.gM("action",[d.Ik({action:d.eu("tree"),workId:f.eW,sessionId:f.Kx,entryId:f.C3}).strict(),d.Ik({action:d.eu("fork"),workId:f.eW,sessionId:f.Kx,entryId:f.C3}).strict(),d.Ik({action:d.eu("clone"),workId:f.eW,sessionId:f.Kx}).strict()]),n=d.Ik({workSessions:d.YO(f.MY),pinnedCount:f.MT,targetWorkId:f.eW,editorText:d.Yj().nullable()}).strict().superRefine((a,b)=>{a.pinnedCount>a.workSessions.length&&b.addIssue({code:"custom",message:"pinnedCount cannot exceed work session count",path:["pinnedCount"]}),a.workSessions.some(b=>b.workId===a.targetWorkId)||b.addIssue({code:"custom",message:"targetWorkId must reference a returned work session",path:["targetWorkId"]})})},55490:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{dM:()=>q,nJ:()=>s,yO:()=>u});var e=c(76760),f=c(6277),g=c(44937),h=c(62695),i=c(43520),j=c(16056),k=c(6676),l=c(5340),m=c(33448),n=a([k,l,m]);[k,l,m]=n.then?(await n)():n;class q extends Error{constructor(a){super(`Chat source is not current: ${a.workId}/${a.sessionId}/${a.branchId}`),this.name="L2ChatSourceBindingError"}}class r extends Error{constructor(a){super(`Chat message was not found: ${a}`),this.name="L2ChatMessageNotFoundError"}}class s extends Error{constructor(a){super(`Chat commands are blocked by WorkSession lifecycle: ${a}`),this.name="L2ChatLifecycleBlockedError"}}class t extends Error{constructor(a,b){super(`工作会话 ${a} 阻止插件重载:${b}`),this.workId=a,this.reason=b,this.name="L2PluginReloadBlockedError"}}function o(a){try{return structuredClone(a)}catch{let{declaration:b,...c}=a;return structuredClone(c)}}function p(a,b){return JSON.stringify(a)===JSON.stringify(b)}class u{async initialize(a){let b=a.map(a=>this.buildRecord(a));for(let a of(this.recordsByWorkId.clear(),b))this.recordsByWorkId.set(a.source.workId,a)}addWorkSession(a){this.recordsByWorkId.set(a.workId,this.buildRecord(a))}async replaceWorkSession(a,b){let c=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),c&&this.publish({type:"source_invalidated",source:c}),this.recordsByWorkId.set(b.workId,this.buildRecord(b)),a.sessionId!==b.sessionId&&await (0,m.gb)(a.sessionId)}async refreshWorkSession(a){let b=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),b&&this.publish({type:"source_invalidated",source:b}),this.recordsByWorkId.set(a.workId,this.buildRecord(a))}async removeWorkSession(a){let b=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),b&&this.publish({type:"source_invalidated",source:b}),await (0,m.gb)(a.sessionId)}async pauseWorkSession(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,m.ls)(b.source.sessionId).nativeUi.cancelAll(),await b.commandTail)}resumeWorkSession(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!0)}async pauseForProcessRestart(){let a=[...this.recordsByWorkId.values()],b=a.map(a=>({record:a,reason:this.pluginReloadBlockReason(a)})).find(a=>null!==a.reason);if(b?.reason)throw new t(b.record.source.workId,b.reason);for(let b of a)b.acceptingCommands=!1;await Promise.all(a.map(a=>a.commandTail));let c=a.map(a=>({record:a,reason:this.pluginReloadBlockReason(a)})).find(a=>null!==a.reason);if(c?.reason){for(let b of a)b.acceptingCommands=!0;throw new t(c.record.source.workId,c.reason)}let d=!0;return()=>{if(d)for(let b of(d=!1,a))this.recordsByWorkId.get(b.source.workId)===b&&(b.acceptingCommands=!0)}}metadataFor(a){return this.recordFor(a).metadata}statusFor(a){return this.statusForRecord(this.recordFor(a))}statusForRecord(a){return a.mainRunning?"main_running":a.backgroundTaskIds.size>0?"background_running":a.completedPending?"completed":"idle"}acknowledgeCompleted(a){let b=this.recordsByWorkId.get(a);if(!b||!b.completedPending)return!1;let c=this.statusForRecord(b);return b.completedPending=!1,this.publishRecordChanged(a,b.metadata,c),!0}isCurrentSource(a){let b=h.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);return void 0!==c&&this.matches(c.source,b)}getProjectPreviewContext(a,b){let c=this.recordsByWorkId.get(a.workId);if(!c||c.workSession!==a)return null;let d=(0,f.Yj)((0,e.resolve)(b)),g=d===(0,f.Yj)((0,e.resolve)(a.cwd)),h=()=>(0,f.D)(c.state.runtime.plugins[f.s6]).directories.find(a=>(0,f.Yj)(a)===d),i=g?a.cwd:h();if(!i)return null;let j=()=>this.recordsByWorkId.get(a.workId)===c&&c.acceptingCommands&&this.matches(c.source,this.sourceFor(a))&&(g||void 0!==h());return j()?{cwd:i,isCurrent:j}:null}setPresentation(a,b){let c=this.currentRecord(a);return this.enqueueCommand(c,async()=>{if(((0,j.P)()||"basic"===c.state.runtime.extensionMode)&&"normal"===b)throw Error("基础模式不启用插件消息展示,请先恢复插件聊天");c.state.runtime.presentationMode!==b&&this.reprojectRecord(c,b)})}reprojectRecord(a,b){let c=(0,m.ls)(a.source.sessionId).readChatSnapshot(),d=new Map(c.entries.map(a=>[a.entryId,a])),e="basic"===b,f=a.state.messages.map(b=>{let c=d.get(b.location.entryId);if(!c)throw Error(`无法重新投影消息:${b.location.entryId}`);return(0,l.Cz)(b.location.index,c.entryId,c.timestampMs,c.message,a.source,e)}),g=a.state.temporaryMessages.map(b=>{let c=a.rawTemporaryMessages.get(b.location.tempId);if(!c)throw Error(`临时消息基线尚不可重投影:${b.location.tempId}`);return(0,l.QS)(b.location.tempId,c,a.source,!1,"update",e)});a.state={messages:f,temporaryMessages:g,runtime:{...a.state.runtime,presentationMode:b}},a.sourceEventVersion+=1,this.publish({type:"source_event",source:a.source,version:a.sourceEventVersion,event:this.createSync(a.source,null).event})}prepareSource(a){let b=this.currentRecord(a);return this.syncRecordRuntime(b)}async syncRecordRuntime(a){let b=a.source,c=a.sourceEventVersion,d=await (0,m.ls)(b.sessionId).readChatRuntime(),e=h.wf.parse({...d,presentationMode:a.state.runtime.presentationMode});this.isCurrentSource(b)&&a.sourceEventVersion===c&&(p(a.state.runtime,e)||this.applySourceEvent(b,{type:"runtime_update",runtime:e}))}createSync(a,b){let c=this.currentRecord(a),d=c.source,e=c.state.messages,f=c.state.temporaryMessages,g=c.state.runtime,h=null===b?void 0:e[b.index],i=null!==b&&h?.location.entryId===b.entryId;return null===b||i||console.warn("[Pi Desk][WorkSessionChatRuntime] 客户端消息 cursor 不匹配,回退全量",{workId:d.workId,sessionId:d.sessionId,branchId:d.branchId,clientCursorIndex:b.index,clientCursorEntryId:b.entryId,serverEntryIdAtIndex:h?.location.entryId??null,serverLatestIndex:e.at(-1)?.location.index??-1}),{event:i?{type:"session_sync",mode:"incremental",baseCursor:b,messages:e.slice(b.index+1).map(l.NA),temporaryMessages:f,runtime:g}:{type:"session_sync",mode:"full",baseCursor:null,messages:e.map(l.NA),temporaryMessages:f,runtime:g},watermark:c.sourceEventVersion}}getImage(a){let b=h.kF.parse(a),c=this.recordForSession(b.sessionId,b.branchId),d=c.state.messages.find(a=>a.location.entryId===b.entryId);if(!d||"user"!==d.fixed.type&&"tool"!==d.fixed.type)throw new r(`${b.entryId}/${b.imageIndex}`);return h.mB.parse((0,m.ls)(c.source.sessionId).readChatImage(b.entryId,b.imageIndex))}getMessageDetail(a){let b=h.VK.parse(a),c=this.recordForSession(b.sessionId,b.branchId).state.messages.find(a=>a.location.entryId===b.entryId);if(!c)throw new r(b.entryId);return h.ps.parse({index:c.location.index,entryId:c.location.entryId,detail:c.detail??null})}getModelContext(a){let b=g.FF.parse(a),c=this.currentRecord(b.source);return this.enqueueCommand(c,async()=>g.LK.parse(await (0,m.ls)(c.source.sessionId).readModelContext()))}send(a){let b=this.currentRecord(a.source);if((0,m.ls)(a.source.sessionId).nativeUi.hasPending)return Promise.reject(Error("请先处理当前插件问题,或停止当前任务"));let c=()=>b.workSession.send({mode:a.mode,text:a.text,images:a.images});return b.compactionStart?b.acceptingCommands?b.compactionStart.then(a=>{if(!b.acceptingCommands)throw new s(b.source.workId);return a?c():this.enqueueCommand(b,c)}):Promise.reject(new s(b.source.workId)):this.enqueueCommand(b,c)}interrupt(a){let b=this.currentRecord(a);return(0,m.ls)(a.sessionId).nativeUi.hasPending?b.workSession.interrupt():this.enqueueCommand(b,()=>b.workSession.interrupt())}compact(a){let b,c=this.currentRecord(a);if(c.compactionStart)return Promise.reject(Error("上下文正在压缩"));let d=new Promise(a=>{b=a});c.compactionStart=d;let e=this.enqueueCommand(c,()=>{try{let a=(0,m.ls)(c.source.sessionId).compact();return b(!0),a}catch(a){throw b(!1),a}});return e.then(()=>{b(!1),c.compactionStart===d&&(c.compactionStart=null)},()=>{b(!1),c.compactionStart===d&&(c.compactionStart=null)}),e}reload(a,b){let c=this.currentRecord(a);return(0,m.ls)(a.sessionId).nativeUi.cancelAll(),this.enqueueCommand(c,async()=>{try{await (0,m.ls)(c.source.sessionId).reload(b)}finally{this.recordsByWorkId.get(a.workId)===c&&await this.syncRecordRuntime(c)}})}restoreQueuedMessages(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>b.workSession.restoreQueuedMessages())}setTitle(a,b){let c=this.recordFor(a);return this.enqueueCommand(c,()=>c.workSession.setTitle(b))}setModel(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>b.workSession.setModel(a.model))}setCapabilityMode(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).setCapabilityMode(a.capabilityMode))}invokePluginMethod(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).invokePluginMethod(b.source,a.pluginName,a.method,a.input))}listNativeCommands(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).listNativeCommands())}executeNativeCommand(a,b,c){let d=this.currentRecord(a);return this.enqueueCommand(d,()=>(0,m.ls)(d.source.sessionId).executeNativeCommand(b,c))}listNativeTools(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).listNativeTools())}executeDirectBash(a,b){let c=this.currentRecord(a);return c.directBashActive?Promise.reject(new k.yT):(c.directBashActive=!0,this.enqueueCommand(c,()=>(0,m.ls)(c.source.sessionId).executeDirectBash(b)).finally(()=>{c.directBashActive=!1}))}abortDirectBash(a){let b=this.currentRecord(a);return(0,m.ls)(b.source.sessionId).abortDirectBash()}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}subscribeRecordChanges(a){return this.recordListeners.add(a),()=>this.recordListeners.delete(a)}subscribePluginPush(a){return this.pluginPushListeners.add(a),()=>this.pluginPushListeners.delete(a)}buildRecord(a){let b=this.sourceFor(a),c=(0,m.ls)(a.sessionId),d=c.readChatSnapshot(),e=d.entries.map((a,c)=>(0,l.Cz)(c,a.entryId,a.timestampMs,a.message,b,(0,j.P)())),f=h.oc.parse({messages:e,temporaryMessages:[],runtime:{...i.L6,extensionMode:(0,j.P)()?"basic":"normal",presentationMode:(0,j.P)()?"basic":"normal"}}),g=f.messages.find(a=>"user"===a.fixed.type),k=g?h.xE.safeParse(g.summary):null,n=k?.success&&k.data.text.trim()||null,o={workSession:a,source:b,state:f,sourceEventVersion:0,rawTemporaryMessages:new Map,metadata:{sessionTitle:d.sessionName??n,messageCounts:{user:f.messages.filter(a=>"user"===a.fixed.type).length,total:f.messages.length},lastMessageUpdatedAt:f.messages.at(-1)?.fixed.timestampMs??null},mainRunning:!1,backgroundTaskIds:new Set(c.readChatBackgroundTaskIds()),completedPending:!1,acceptingCommands:!0,directBashActive:!1,compactionStart:null,commandTail:Promise.resolve(),unsubscribeWorker:()=>void 0};return o.unsubscribeWorker=c.subscribeChat(a=>this.handleWorkerEvent(o,a)),o}handleWorkerEvent(a,b){if(this.recordsByWorkId.get(a.source.workId)!==a)return;let c=a.metadata,d=this.statusForRecord(a),e="basic"===a.state.runtime.extensionMode||"basic"===a.state.runtime.presentationMode;switch(b.type){case"message_start":a.rawTemporaryMessages.set(b.tempId,o(b.message)),this.applySourceEvent(a.source,{type:"message_start",snapshot:(0,l.QS)(b.tempId,b.message,a.source,!1,"temporary",e)});return;case"message_update":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);a.rawTemporaryMessages.set(b.tempId,o(b.message));let d=(0,l.Ht)(c,(0,l.QS)(b.tempId,b.message,a.source,!1,"update",e));d&&this.applySourceEvent(a.source,d);return}case"message_commit":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);let d=(0,l.QS)(b.tempId,b.message,a.source,!1,"final",e),f=(0,l.Ht)(c,d);f&&this.applySourceEvent(a.source,f),this.replaceCanonicalTemporary(a,b.tempId,b.message),a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_commit",location:{tempId:b.tempId},durable:{index:a.state.messages.length,entryId:b.entryId},fixed:{timestampMs:b.timestampMs}});return}case"message_discard":a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_discard",location:{tempId:b.tempId}});return;case"plugin_push":this.publishPluginPush({pluginName:b.pluginName,target:{scope:"session",source:a.source},event:b.event,data:structuredClone(b.data)});return;case"runtime_changed":{let c=h.wf.parse({...b.runtime,presentationMode:a.state.runtime.presentationMode});p(a.state.runtime,c)||this.applySourceEvent(a.source,{type:"runtime_update",runtime:c});return}case"agent_started":if(a.mainRunning)return;a.mainRunning=!0,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"main_operation_cancelled":case"main_operation_finished":if(!a.mainRunning)return;a.mainRunning=!1,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"agent_settled":{let b=a.mainRunning||a.backgroundTaskIds.size>0;a.mainRunning=!1,b&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"background_tasks_changed":{let e=a.mainRunning||a.backgroundTaskIds.size>0;a.backgroundTaskIds=new Set(b.taskIds),e&&!a.mainRunning&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"session_info_changed":a.metadata={...a.metadata,sessionTitle:b.sessionTitle},this.publishRecordChanged(a.source.workId,c,d);return}}replaceCanonicalTemporary(a,b,c){let d=a.state.temporaryMessages.findIndex(a=>a.location.tempId===b);if(d<0)throw Error(`Temporary chat message was not found: ${b}`);let e=[...a.state.temporaryMessages];e[d]=(0,l.QS)(b,c,a.source,!0,"final","basic"===a.state.runtime.extensionMode||"basic"===a.state.runtime.presentationMode),a.state={...a.state,temporaryMessages:e}}applySourceEvent(a,b){let c=this.currentRecord(a),d=c.source;if(c.state=(0,i.k_)(c.state,b),c.sourceEventVersion+=1,"message_commit"===b.type){let a=c.state.messages[b.durable.index];if(!a||a.location.entryId!==b.durable.entryId)throw Error(`Committed chat message is missing: ${b.durable.index}/${b.durable.entryId}`);let e=c.metadata;c.metadata=this.metadataFromState(c),this.publishRecordChanged(d.workId,e,this.statusForRecord(c))}this.publish({type:"source_event",source:d,version:c.sourceEventVersion,event:b})}metadataFromState(a){let b=a.state.messages.find(a=>"user"===a.fixed.type),c=b?h.xE.safeParse(b.summary):null,d=c?.success&&c.data.text.trim()||null;return{sessionTitle:a.metadata.sessionTitle??d,messageCounts:{user:a.state.messages.filter(a=>"user"===a.fixed.type).length,total:a.state.messages.length},lastMessageUpdatedAt:a.state.messages.at(-1)?.fixed.timestampMs??null}}enqueueCommand(a,b){if(!a.acceptingCommands)return Promise.reject(new s(a.source.workId));let c=a.commandTail.then(b,b);return a.commandTail=c.then(()=>void 0,()=>void 0),c}pluginReloadBlockReason(a){return(0,m.ls)(a.source.sessionId).nativeUi.hasPending?"原生插件问题正在等待回答":a.directBashActive?"Direct Bash 正在运行":a.mainRunning?"主 Agent 正在运行":a.backgroundTaskIds.size>0?"插件后台任务正在运行":(0,m.ls)(a.source.sessionId).readPluginReloadBlockReason()}async closeRecord(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,m.ls)(b.source.sessionId).nativeUi.cancelAll(),await b.commandTail,b.unsubscribeWorker(),b.rawTemporaryMessages.clear(),this.recordsByWorkId.delete(a))}recordFor(a){let b=this.recordsByWorkId.get(a.workId);if(!b||!this.matches(b.source,this.sourceFor(a)))throw Error(`WorkSession chat state is not initialized: ${a.workId}`);return b}sourceFor(a){return h.Pi.parse({workId:a.workId,sessionId:a.sessionId,branchId:a.branchId})}currentRecord(a){let b=h.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);if(!c||!this.matches(c.source,b))throw new q(b);return c}recordForSession(a,b){let c=[...this.recordsByWorkId.values()].find(c=>c.source.sessionId===a&&c.source.branchId===b);if(c)return c;throw new q({workId:"unknown",sessionId:a,branchId:b})}matches(a,b){return a.workId===b.workId&&a.sessionId===b.sessionId&&a.branchId===b.branchId}publishPluginPush(a){for(let b of[...this.pluginPushListeners])try{b(a)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Plugin Push 监听器执行失败",{pluginName:a.pluginName,event:a.event,errorName:b instanceof Error?b.name:"UnknownError"})}}publish(a){for(let b of[...this.listeners])try{b(a)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Source 事件监听器执行失败",{eventType:a.type,workId:a.source.workId,errorName:b instanceof Error?b.name:"UnknownError"})}}publishRecordChanged(a,b,c){for(let d of[...this.recordListeners])try{d(a,b,c)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Record 监听器执行失败",{workId:a,errorName:b instanceof Error?b.name:"UnknownError"})}}constructor(){this.recordsByWorkId=new Map,this.listeners=new Set,this.recordListeners=new Set,this.pluginPushListeners=new Set}}d()}catch(a){d(a)}})},55574:(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)}
27
26
  ${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}
28
27
  ${e(i)}`)}if("required"===i.scope&&void 0===b)throw Error(`必须指定 --scope global
29
28
  ${e(i)}`);if(void 0!==b&&"global"!==b)throw Error("当前插件管理只支持 global 范围,不支持项目级操作");if(i.name){if(0===j.length)throw Error(`缺少插件名字
@@ -33,13 +32,13 @@ ${e(i)}`);for(let a of j)if(!/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$
33
32
  目标节点:${a.targetId}`;case"usage":return`用量记录:${a.kind}
34
33
  模型:${a.provider}/${a.model}
35
34
 
36
- ${k(a.usage)}`;case"model_change":return`${a.provider}/${c?.getModel(a.provider,a.modelId)?.name||a.modelId}`;case"thinking_level_change":return a.thinkingLevel;case"session_info":return a.name??"";case"label":return a.label??"已清除标签"}}(d,l(a),c);return{entryId:b,kind:m(d),content:e.length<=65536?e:e.slice(0,65536),truncated:e.length>65536}}function p(a,b){let c=a.getEntry(b);if(!c)throw new f(b);if("message"!==c.type||"user"!==c.message.role)throw new g(b);return{selectedEntryId:b,targetLeafEntryId:c.parentId,editorText:h(c.message.content)}}function q(a,b){let c=a.getEntry(b);if(!c)throw new f(b);return a.getLeafId()===b?{selectedEntryId:b,targetLeafEntryId:b,editorText:null,changed:!1}:"message"===c.type&&"user"===c.message.role?{selectedEntryId:b,targetLeafEntryId:c.parentId,editorText:h(c.message.content),changed:a.getLeafId()!==c.parentId}:"custom_message"===c.type?{selectedEntryId:b,targetLeafEntryId:c.parentId,editorText:h(c.content),changed:a.getLeafId()!==c.parentId}:{selectedEntryId:b,targetLeafEntryId:b,editorText:null,changed:!0}}},56255:(a,b,c)=>{c.d(b,{D8:()=>I,Hf:()=>H,LJ:()=>j,Pc:()=>i,RX:()=>T,V6:()=>t,XM:()=>U,XW:()=>P,dG:()=>O,fK:()=>S,fb:()=>s,lJ:()=>B,mh:()=>m,mj:()=>M,q5:()=>A,s4:()=>L,wH:()=>Q,y0:()=>V});var d=c(36153),e=c(78143),f=c(27519),g=c(75106),h=c(78220);let i=d.Yj().uuid(),j=d.ai().int().nonnegative(),k=d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/),l=d.k5(["image/jpeg","image/png","image/webp","image/gif"]),m=d.Ik({mimeType:l,width:d.ai().int().positive(),height:d.ai().int().positive()}).strict(),n=d.k5(["running","completed","error","aborted"]),o=d.k5(["running","completed","error"]),p=d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER),q=d.Ik({inputTokens:p,outputTokens:p,cacheReadTokens:p,costUsd:d.ai().finite().nonnegative()}).strict(),r=d.Yj().trim().min(1).nullable(),s=d.Ik({tempId:i}).strict(),t=d.Ik({index:j,entryId:e.Rv}).strict(),u=d.Ik({timestampMs:g.k.nullable(),type:d.eu("user"),viewKey:k,hasDetail:d.zM()}).strict(),v=d.Ik({timestampMs:g.k.nullable(),type:d.eu("assistant"),viewKey:k,status:n,hasDetail:d.zM(),usage:q}).strict(),w=d.Ik({timestampMs:g.k.nullable(),type:d.eu("tool"),viewKey:k,status:o,hasDetail:d.zM(),usage:q.nullable()}).strict(),x=d.Ik({timestampMs:g.k.nullable(),type:d.eu("bash"),viewKey:k,status:n,hasDetail:d.zM()}).strict(),y=d.Ik({timestampMs:g.k.nullable(),type:d.eu("custom"),viewKey:k,hasDetail:d.zM()}).strict();function z(a){let b=u.extend({timestampMs:a}).strict(),c=v.extend({timestampMs:a}).strict(),e=w.extend({timestampMs:a}).strict(),f=x.extend({timestampMs:a}).strict(),g=y.extend({timestampMs:a}).strict();return{user:b,assistant:c,tool:e,bash:f,custom:g,message:d.gM("type",[b,c,e,f,g])}}d.gM("type",[u,v,w,x,y]);let A=z(d.ch()).message;z(g.k).message;let B=d.Ik({text:d.Yj(),images:d.YO(m)}).strict(),C=d.Ik({provider:d.Yj(),modelId:d.Yj()}).strict();d.Ik({text:d.Yj(),errorMessage:d.Yj().nullable().default(null),model:C.nullable().optional()}).strict();let D={name:d.Yj().trim().min(1),reasoning:r,inputPreview:r,activity:r};function E(){return d.Ik({...D,path:f.eC.nullable()}).strict()}d.Ik({...D,images:d.YO(m).optional()}).strict();let F=d.KC([d.Ik({startedAtMs:g.k}).strict(),d.Ik({durationMs:d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER)}).strict()]);d.Ik({...D,timing:F.nullable()}).strict(),E().extend({images:d.YO(m).optional()}).strict(),E(),E(),d.Ik({command:d.Yj().min(1)}).strict(),d.Ik({text:d.Yj()}).strict(),d.Ik({thinking:d.Yj()}).strict();let G=d.Ik({complete:d.zM(),calls:d.YO(d.Ik({name:d.Yj(),arguments:d.g1(d.Yj(),d.Pq()).optional(),argumentsBytes:d.ai().int().nonnegative().optional(),status:d.k5(["ok","error","unfinished"]),durationMs:d.ai().finite().nonnegative().optional(),error:d.Yj().optional()}).strict())}).strict();d.Ik({output:d.Yj(),nestedCalls:G.optional()}).strict(),d.Ik({output:d.Yj()}).strict(),d.Ik({content:d.Yj()}).strict(),d.gM("kind",[d.Ik({kind:d.eu("diff"),content:d.Yj()}).strict(),d.Ik({kind:d.eu("output"),content:d.Yj()}).strict()]),d.gM("kind",[d.Ik({kind:d.eu("content"),content:d.Yj()}).strict(),d.Ik({kind:d.eu("output"),content:d.Yj()}).strict()]),d.Ik({output:d.Yj()}).strict(),d.Ik({text:d.Yj().min(1)}).strict();let H=d.g1(d.Yj(),d.Pq()),I=d.g1(d.Yj(),d.Pq()),J=d.KC([I,d.ch()]);function K(a,b){return d.Ik({location:a,fixed:z(b).message,summary:H,detail:I.optional()}).strict().superRefine((a,b)=>{void 0===a.detail||a.fixed.hasDetail||b.addIssue({code:"custom",message:"message detail requires hasDetail=true",path:["detail"]})})}let L=K(s,d.ch()),M=K(t,g.k);function N(a,b){0===Object.keys(a).length&&b.addIssue({code:"custom",message:"patch requires at least one changed field"})}let O=d.Ik({viewKey:k.optional(),status:d.KC([n,o]).optional(),hasDetail:d.zM().optional(),usage:q.nullable().optional()}).strict().superRefine(N),P=d.g1(d.Yj(),d.Pq()).superRefine(N),Q=d.g1(d.Yj(),d.Pq()).superRefine(N),R=d.KC([d.Yj().min(1),d.YO(d.Pq()).min(1)]),S=d.g1(d.Yj(),R).superRefine((a,b)=>{for(let c of(N(a,b),Object.keys(a)))try{(0,h.U)(c)}catch(a){b.addIssue({code:"custom",message:a instanceof Error?a.message:"increment path is invalid",path:[c]})}}),T=d.Ik({messages:d.YO(M),temporaryMessages:d.YO(L)}).strict(),U=d.Ik({index:j,entryId:e.Rv,detail:J}).strict(),V=d.Ik({mimeType:l,data:d.Yj().min(1)}).strict()},60161:(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(45166);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())}}},62695:(a,b,c)=>{c.d(b,{DK:()=>r,Pi:()=>q,R3:()=>m,TV:()=>A,UR:()=>s,VK:()=>D,kF:()=>F,mB:()=>G,oc:()=>C,ps:()=>E,w$:()=>w,wR:()=>p,wf:()=>B,xE:()=>n,xh:()=>t,yI:()=>o});var d=c(36153),e=c(13127),f=c(41743),g=c(56255),h=c(72415),i=c(3329);let j=g.Pc,k=g.LJ,l=g.mh,m=g.fb,n=g.lJ,o=g.s4,p=g.mj,q=i.R,r=d.Ik({index:k,entryId:f.C3}).strict(),s=d.KC([d.ch(),r]),t=l.extend({data:d.Yj().min(1)}).strict(),u=h.$,v=d.Ik({tempId:j,text:d.Yj(),images:d.YO(l).max(10)}).strict(),w=d.Ik({provider:d.Yj().trim().min(1),modelId:d.Yj().trim().min(1),thinkingLevel:u}).strict(),x=d.Ik({tokens:d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER).nullable(),contextWindow:d.ai().int().positive().max(Number.MAX_SAFE_INTEGER)}).strict(),y=d.g1(d.Yj(),d.Pq()),z=d.g1(d.Yj().min(1),y),A=d.k5(["normal","basic"]),B=d.Ik({extensionMode:A.default("normal"),presentationMode:A.default("normal"),initializationError:d.Yj().max(32e3).nullable().default(null),queues:d.Ik({steering:d.YO(v),followUp:d.YO(v)}).strict(),model:w.nullable(),capabilityMode:e.rY.nullable(),contextUsage:x.nullable(),plugins:z}).strict(),C=g.RX.extend({runtime:B}).strict(),D=d.Ik({sessionId:f.Kx,branchId:f._A,entryId:f.C3}).strict(),E=g.XM,F=D.extend({imageIndex:d.ai().int().nonnegative()}).strict(),G=g.y0},63210:(a,b,c)=>{c.d(b,{QV:()=>u,RH:()=>p,WF:()=>k,uU:()=>r});var d=c(36153),e=c(3329),f=c(69375),g=c(72497);let h=d.k5(["extension","prompt","skill"]),i=d.Ik({name:d.Yj().trim().min(1).max(128),description:d.Yj().max(500).nullable(),source:h}).strict(),j=d.Ik({source:e.R}).strict(),k=d.Ik({commands:d.YO(i)}).strict(),l=d.Ik({source:e.R,command:d.Yj().trim().min(1).max(128),args:d.Yj().max(32768).optional()}).strict(),m=d.Ik({}).strict(),n=d.Ik({name:d.Yj().trim().min(1).max(128),description:d.Yj(),parameters:g.Dz,active:d.zM(),exposure:d.k5(["direct","model-only","codemode","deferred","hidden"]),source:d.Yj().nullable(),blockedByMode:d.zM()}).strict(),o=d.Ik({source:e.R}).strict(),p=d.Ik({tools:d.YO(n)}).strict(),q=d.Ik({source:e.R,command:d.Yj().min(1).max(32768),excludeFromContext:d.zM()}).strict(),r=d.Ik({output:d.Yj(),exitCode:d.ai().int().nullable(),cancelled:d.zM(),truncated:d.zM(),fullOutputPath:d.Yj().nullable()}).strict(),s=d.Ik({source:e.R}).strict(),t=d.Ik({}).strict(),u=Object.freeze({commandsList:(0,f.Vc)({path:"pi/commands/list",inputSchema:j,outputSchema:k}),commandExecute:(0,f.Vc)({path:"pi/commands/execute",inputSchema:l,outputSchema:m,timeoutMs:3e5}),toolsList:(0,f.Vc)({path:"pi/tools/list",inputSchema:o,outputSchema:p}),bashExecute:(0,f.Vc)({path:"pi/bash/execute",inputSchema:q,outputSchema:r,timeoutMs:12e4}),bashAbort:(0,f.Vc)({path:"pi/bash/abort",inputSchema:s,outputSchema:t})})},64007:(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(90733)},64791:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{sC:()=>h});var e=c(17691);c(77598),c(73024);var f=c(76760),g=a([e]);function h(a){let b=(0,f.resolve)(a);return"win32"===process.platform?b.toLowerCase():b}e=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},67442:(a,b,c)=>{c.d(b,{N:()=>u,d:()=>t});var d=c(56255),e=c(36153),f=c(27519);let g=e.Ik({mode:e.k5(["sync","async"]),message:e.Yj()}).strict(),h="pi-desk/message-declaration-error",i=new WeakMap,j=e.Ik({viewKey:e.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/),summary:e.g1(e.Yj(),e.Pq()),detail:e.g1(e.Yj(),e.Pq()).nullable()}).strict();function k(a){switch(a.type){case"user":return"pi-desk/user";case"assistant":return"pi-desk/assistant";case"tool":{let b=a.name.toLowerCase().split(".").at(-1);if("pidesk"===b)return"pi-desk/pidesk";if("bash"===b)return"pi-desk/bash-tool";if("codemode"===b)return"pi-desk/codemode";return"read"===b||"write"===b||"edit"===b?`pi-desk/${b}`:"pi-desk/tool"}case"bash":return"pi-desk/bash";case"custom":return"pi-desk/custom";case"compaction":return"pi-desk/compaction"}}function l(a){return null===a||"object"!=typeof a||Array.isArray(a)?null:a}function m(a){return l(a.result)}function n(a,b){return{...a.summary,path:function(a){let b=a.arguments.path??a.arguments.file_path;if("string"!=typeof b)return null;let c=f.eC.safeParse(b);return c.success?c.data:null}(b)}}function o(a){if(a.declaration)return a.declaration.message;switch(a.type){case"user":return{kind:"user",text:a.text,images:a.images};case"assistant":return{kind:"assistant",text:a.text,thinking:a.thinking,stopReason:a.status};case"tool":return{kind:"tool",toolName:a.name,toolCallId:"",arguments:{},partialResult:null,result:a.output?{output:a.output}:null,isError:"error"===a.status};case"bash":return{kind:"bash",command:a.command,output:a.output,exitCode:"completed"===a.status?0:null,cancelled:"aborted"===a.status,truncated:!1};case"custom":return{kind:"custom",customType:"display-message",content:a.text,details:null};case"compaction":return{kind:"custom",customType:"pi-desk/compaction",content:"",details:a.summary?{text:a.summary}:null}}}function p(a,b,c){return{pluginName:"pi-desk",declarationName:a,builtin:!0,declaration:{priority:b,match:c,project:a=>a.defaultProjection}}}let q=[p("pidesk",-900,a=>"tool"===a.message.kind&&"pidesk"===a.message.toolName),p("read",-900,a=>"tool"===a.message.kind&&"read"===a.message.toolName),p("write",-900,a=>"tool"===a.message.kind&&"write"===a.message.toolName),p("edit",-900,a=>"tool"===a.message.kind&&"edit"===a.message.toolName),p("bash-tool",-900,a=>"tool"===a.message.kind&&"bash"===a.message.toolName),p("user",-1e3,a=>"user"===a.message.kind),p("assistant",-1e3,a=>"assistant"===a.message.kind),p("tool",-1e3,a=>"tool"===a.message.kind),p("bash",-1e3,a=>"bash"===a.message.kind),p("custom",-1e3,a=>"custom"===a.message.kind)];function r(a){var b;let c=a.error instanceof Error?a.error:null,d=a.candidate;for(let b of d?[d]:a.candidates??[]){let d=i.get(b.declaration)??new Set;d.has(a.phase)||(d.add(a.phase),i.set(b.declaration,d),console.warn("[Pi Desk][MessageDeclaration] 插件投影失败,保留基础展示入口",{pluginName:b.pluginName,declarationName:b.declarationName,phase:a.phase,message:(c?.message??"Message Declaration conflict").slice(0,2e3)}))}return{viewKey:h,summary:{text:"string"==typeof a.defaultProjection.summary.text?a.defaultProjection.summary.text:"",phase:a.phase,pluginName:d?.pluginName??null,declarationName:d?.declarationName??null},detail:{phase:a.phase,pluginName:d?.pluginName??null,declarationName:d?.declarationName??null,priority:d?.declaration.priority??null,errorName:c?.name??null,errorMessage:c?.message??String(a.error??"Message Declaration conflict"),errorStack:c?.stack??null,conflicts:(a.candidates??[]).map(a=>({pluginName:a.pluginName,declarationName:a.declarationName,priority:a.declaration.priority})),defaultProjection:{viewKey:(b=a.defaultProjection).viewKey,summary:b.summary,detail:b.detail}}}}function s(a,b,c,e,f,i,p){let s=function(a){let b=function(a){switch(a.type){case"user":return{viewKey:k(a),summary:{text:function(a){let b=a.text.lastIndexOf("\n\n");if(0===a.images.length||b<0)return a.text;let c=a.text.slice(b+2).split("\n");return c.length>a.images.length?a.text:c.every(b=>{let c=/^\[Image: original \d+x\d+, displayed at (\d+)x(\d+)\. Multiply coordinates by \d+\.\d{2} to map to original image\.\]$/.exec(b);return null!==c&&a.images.some(a=>a.width===Number(c[1])&&a.height===Number(c[2]))})?a.text.slice(0,b):a.text}(a),images:a.images.map(a=>({...a}))},detail:null};case"assistant":return{viewKey:k(a),summary:{text:a.text,errorMessage:a.errorMessage,...void 0===a.model?{}:{model:a.model}},detail:a.thinking.length>0?{thinking:a.thinking}:null};case"tool":{let b=k(a),c={...a.images?.length&&["pi-desk/tool","pi-desk/read","pi-desk/codemode"].includes(b)?{images:a.images.map(a=>({...a}))}:{},name:a.name,reasoning:a.reasoning,inputPreview:a.inputPreview,activity:a.activity},d=a.durationMs??null,e=a.startedAtMs??null,f={viewKey:b,summary:"pi-desk/bash-tool"===b?{...c,timing:null!==d?{durationMs:d}:null!==e?{startedAtMs:e}:null}:c,detail:"pi-desk/codemode"===b?{output:a.output,...a.nestedCalls?{nestedCalls:a.nestedCalls}:{}}:a.output?{output:a.output}:null},h=o(a);return"tool"===h.kind?function(a,b){let c=function(a){let b=m(a);if(!b)return null;let c=b.content;if("string"==typeof c)return c;if(Array.isArray(c)){let a=[],b=!1;for(let d of c){let c=l(d);c?.type==="text"&&"string"==typeof c.text&&(b=!0,a.push(c.text))}if(b)return a.join("\n")}return"string"==typeof b.output?b.output:null}(b)??("string"==typeof a.detail?.output?a.detail.output:null);switch(a.viewKey){case"pi-desk/pidesk":{let d=c??"";try{let a=g.safeParse(JSON.parse(d));a.success&&(d=a.data.message)}catch{}return{viewKey:a.viewKey,summary:{input:b.arguments},detail:{output:d}}}case"pi-desk/read":let d;return{viewKey:a.viewKey,summary:n(a,b),detail:Array.isArray(d=m(b)?.content)&&d.some(a=>{let b=l(a);return b?.type==="image"})||null===c?null:{content:c}};case"pi-desk/edit":{let d=l(m(b)?.details??null)?.diff;return{viewKey:a.viewKey,summary:n(a,b),detail:b.isError||"string"!=typeof d?null===c?null:{kind:"output",content:c}:{kind:"diff",content:d}}}case"pi-desk/write":{let d=b.arguments.content;return{viewKey:a.viewKey,summary:n(a,b),detail:b.isError&&null!==c?{kind:"output",content:c}:"string"==typeof d?{kind:"content",content:d}:null===c?null:{kind:"output",content:c}}}default:return a}}(f,h):f}case"bash":return{viewKey:k(a),summary:{command:a.command},detail:a.output?{output:a.output}:null};case"custom":return{viewKey:k(a),summary:{text:a.text},detail:null};case"compaction":return{viewKey:k(a),summary:{},detail:a.summary?{text:a.summary}:null}}}(a.message);if("compaction"===a.message.type)return b;let c={source:a.source,stage:a.stage,message:o(a.message),raw:a.message.declaration?.raw??a.message,defaultProjection:b},d=[...(a.declarations??[]).map(a=>({...a,builtin:!1})),...q];for(let a of[...new Set(d.map(a=>a.declaration.priority))].sort((a,b)=>b-a)){let e,f=d.filter(b=>b.declaration.priority===a),g=[];for(let a of f)try{a.declaration.match(c)&&g.push(a)}catch(c){return r({phase:"match",candidate:a,error:c,defaultProjection:b})}if(0===g.length)continue;if(g.length>1)return r({phase:"conflict",candidates:g,defaultProjection:b});let i=g[0];try{e=i.declaration.project(c)}catch(a){return r({phase:"project",candidate:i,error:a,defaultProjection:b})}try{return function(a,b){let c=j.parse(a);if(!b&&c.viewKey===h)throw Error("Host reserved Message Declaration Error viewKey cannot be registered");return c}(e,i.builtin)}catch(a){return r({phase:"validate",candidate:i,error:a,defaultProjection:b})}}return b}({source:e,stage:f,message:c,declarations:p}),t="tool"===c.type||"bash"===c.type||"custom"===c.type||"compaction"===c.type,u=null!==s.detail&&(!t||i),v={location:a,fixed:function(a,b,c){let d={timestampMs:a,viewKey:c.viewKey,hasDetail:null!==c.detail};switch(b.type){case"user":return{...d,type:"user"};case"assistant":return{...d,type:"assistant",status:b.status,usage:b.usage};case"tool":return{...d,type:"tool",status:b.status,usage:b.usage};case"bash":return{...d,type:"bash",status:b.status};case"custom":case"compaction":return{...d,type:"custom"}}}(b,c,s),summary:s.summary,...u?{detail:s.detail}:{}};return"tempId"in a?d.s4.parse(v):d.mj.parse(v)}function t(a,b,c,d,e=!1,f="temporary"){return s({tempId:a},null,b,c,f,e,d)}function u(a,b,c,d,e,f){return s({index:a,entryId:b},c,d,e,"durable",!0,f)}},72415:(a,b,c)=>{c.d(b,{$:()=>d});let d=c(36153).k5(["off","minimal","low","medium","high","xhigh","max"])},72725:(a,b,c)=>{c.d(b,{gX:()=>g}),c(57975);let d=["input","output","cacheRead","cacheWrite"];function e(a){return"object"!=typeof a||null===a||Array.isArray(a)?{}:a}function f(a,b){return`${a}\u0000${b}`}function g(a,b,c){let g=function(a){let b=new Set((function(a){if(void 0===a.modelSelections)return[];if(!Array.isArray(a.modelSelections))throw Error("modelSelections 必须是模型引用数组");let b=new Set;return a.modelSelections.map(c=>{let g=e(c);if("string"!=typeof g.provider||!g.provider.trim()||"string"!=typeof g.modelId||!g.modelId.trim())throw Error("modelSelections 中的模型必须包含服务 ID 和模型 ID");let h=f(g.provider,g.modelId);if(b.has(h))throw Error(`重复收录模型:${g.provider}/${g.modelId}`);b.add(h);let i=e(e(e(a.providers)[g.provider]).modelOverrides)[g.modelId],j=e(i),k={};for(let a of["contextWindow","maxTokens"])"number"==typeof j[a]&&(k[a]=j[a]);if(void 0!==j.cost){let a=e(j.cost);k.cost=Object.fromEntries(d.filter(b=>"number"==typeof a[b]).map(b=>[b,a[b]]))}return{provider:g.provider,modelId:g.modelId,overrides:k}})})(a).map(a=>f(a.provider,a.modelId)));for(let[c,d]of Object.entries(e(a.providers))){let a=e(d).models;if(Array.isArray(a))for(let d of a){let a=e(d);"string"==typeof a.id&&b.add(f(c,a.id))}}return b}(c),h=new Set(b.getRegisteredProviderIds());return a.filter(a=>g.has(f(a.provider,a.id))||h.has(a.provider)||void 0!==b.getRegisteredNativeProvider(a.provider)||!b.getPhysicalModel(a.provider,a.id))}},75278:(a,b,c)=>{c.d(b,{PS:()=>k,ef:()=>i,gK:()=>j,hS:()=>h,mv:()=>n});var d=c(36153),e=c(56255),f=c(75106),g=c(78220);let h=d.Ik({type:d.eu("message_start"),snapshot:e.s4}).strict(),i=d.Ik({type:d.eu("message_update"),location:e.fb,fixed:e.dG.optional(),summary:e.XW.optional(),detail:e.wH.optional(),increments:e.fK.optional()}).strict().superRefine((a,b)=>{if(!a.fixed&&!a.summary&&!a.detail&&!a.increments)return void b.addIssue({code:"custom",message:"message update requires a changed layer"});let c=[];for(let b of Object.keys(a.increments??{}))try{c.push({raw:b,parsed:(0,g.U)(b)})}catch{}for(let d of c){let c="summary"===d.parsed.root?Object.keys(a.summary??{}):Object.keys(a.detail??{}),e=d.parsed.segments[0];(0===d.parsed.segments.length||"string"==typeof e&&c.includes(e))&&b.addIssue({code:"custom",message:"replacement and increment paths cannot overlap",path:["increments",d.raw]})}for(let a=0;a<c.length;a+=1)for(let d=a+1;d<c.length;d+=1){let e=c[a],f=c[d];((0,g.v)(e.parsed,f.parsed)||(0,g.v)(f.parsed,e.parsed))&&b.addIssue({code:"custom",message:"increment parent and child paths cannot overlap",path:["increments",f.raw]})}}),j=d.Ik({type:d.eu("message_commit"),location:e.fb,durable:e.V6,fixed:d.Ik({timestampMs:f.k}).strict()}).strict(),k=d.Ik({type:d.eu("message_discard"),location:e.fb}).strict(),l=d.Ik({type:d.eu("durable_append"),messages:d.YO(e.mj).min(1)}).strict().superRefine((a,b)=>{let c=new Set;for(let[d,e]of a.messages.entries())d>0&&e.location.index!==a.messages[d-1].location.index+1&&b.addIssue({code:"custom",message:"durable append message indexes must be continuous",path:["messages",d,"location","index"]}),c.has(e.location.entryId)&&b.addIssue({code:"custom",message:"durable append entryId values must be unique",path:["messages",d,"location","entryId"]}),c.add(e.location.entryId)}),m=d.KC([h,i,j,k]),n=d.KC([l,m])},75286:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{k:()=>q});var e=c(75430),f=c(47757),g=c(14290),h=c(38617),i=c(44493),j=c(33290),k=c(12881),l=c(25776),m=c(45870),n=a([e,f,g,h,i,l]);[e,f,g,h,i,l]=n.then?(await n)():n;let o=new Set,p="Pi 会话实例已失效,不能继续访问当前会话";class q{constructor(a){this.options=a,this.active=!0,this.accessRevoked=!1,this.session=null,this.execution=null,this.result=null,this.onLifecycleError=null,this.stage="等待初始化资源",this.stageStartedAt=performance.now(),this.sessionId=a.sessionManager.getSessionId(),this.ui=a.ui??new m.k,this.capabilities=new g.O(a.readCapabilities),this.plugins=new l.p({onChanged:()=>{this.active&&a.pluginEvents.onChanged()},onPush:b=>{this.active&&a.pluginEvents.onPush(b)},onTasksChanged:b=>{this.active&&a.pluginEvents.onTasksChanged(b)},onInvalidUpdate:b=>{this.active&&a.pluginEvents.onInvalidUpdate(b)}}),this.messages=new k.U((a,b)=>{console.warn("[Pi Desk][PiSession] 延后消息投递失败",{sessionId:this.sessionId,source:a,message:b instanceof Error?b.message:String(b)})}),this.manager=new Proxy(a.sessionManager,{get:(a,b)=>{this.assertAccess();let c=Reflect.get(a,b,a);return"function"!=typeof c?c:(...b)=>(this.assertAccess(),Reflect.apply(c,a,b))},set:()=>{throw Error("Pi 会话只能通过 SessionManager 方法修改")}})}start(a=!1){return this.result??=this.initialize(a),this.result}async reload(){this.assertActive();let a=await this.start(),b=null;this.onLifecycleError=a=>{b??=a},this.setStage("重载 Pi 配置");try{if(await a.reload({beforeSessionStart:async()=>{this.assertActive(),this.validateResources(a.resourceLoader,a.settingsManager.drainErrors().map(({error:a})=>({type:"error",message:a.message})))}}),this.assertActive(),b)throw b}finally{this.onLifecycleError=null}}setStage(a){this.active&&(this.stage=a,this.stageStartedAt=performance.now())}describeStage(){return`${this.stage}
37
- 当前步骤耗时:${Math.round(performance.now()-this.stageStartedAt)} 毫秒`}async initialize(a){let b=performance.now();if(this.assertActive(),"normal"===this.options.mode&&o.size>=4)throw Error("尚未结束的插件初始化或关闭任务过多,请重启服务后再加载插件");let c=new Promise((a,b)=>{this.onLifecycleError=b}),d=async()=>(this.assertActive(),a&&(this.setStage("刷新插件资源"),(0,i.N)(),this.options.resources.reset(),this.assertActive()),this.create());this.execution=d();try{let a=await this.ui.waitForOperation(Promise.race([this.execution,c]),6e4,()=>Error("Pi 会话初始化超时(60 秒);不含等待用户回答"));return this.assertActive(),this.setStage("会话已就绪"),console.info("[Pi Desk][PiSession] 会话初始化完成",{sessionId:this.sessionId,cwd:this.options.cwd,mode:this.options.mode,durationMs:Math.round(performance.now()-b)}),a}catch(d){let a=d instanceof Error?d:Error(String(d));if(!this.active)throw console.info("[Pi Desk][PiSession] 会话初始化已取消",{sessionId:this.sessionId,cwd:this.options.cwd,mode:this.options.mode,durationMs:Math.round(performance.now()-b)}),a;let c=`${a.stack??a.message}
35
+ ${k(a.usage)}`;case"model_change":return`${a.provider}/${c?.getModel(a.provider,a.modelId)?.name||a.modelId}`;case"thinking_level_change":return a.thinkingLevel;case"session_info":return a.name??"";case"label":return a.label??"已清除标签"}}(d,l(a),c);return{entryId:b,kind:m(d),content:e.length<=65536?e:e.slice(0,65536),truncated:e.length>65536}}function p(a,b){let c=a.getEntry(b);if(!c)throw new f(b);if("message"!==c.type||"user"!==c.message.role)throw new g(b);return{selectedEntryId:b,targetLeafEntryId:c.parentId,editorText:h(c.message.content)}}function q(a,b){let c=a.getEntry(b);if(!c)throw new f(b);return a.getLeafId()===b?{selectedEntryId:b,targetLeafEntryId:b,editorText:null,changed:!1}:"message"===c.type&&"user"===c.message.role?{selectedEntryId:b,targetLeafEntryId:c.parentId,editorText:h(c.message.content),changed:a.getLeafId()!==c.parentId}:"custom_message"===c.type?{selectedEntryId:b,targetLeafEntryId:c.parentId,editorText:h(c.content),changed:a.getLeafId()!==c.parentId}:{selectedEntryId:b,targetLeafEntryId:b,editorText:null,changed:!0}}},56255:(a,b,c)=>{c.d(b,{D8:()=>I,Hf:()=>H,LJ:()=>j,Pc:()=>i,RX:()=>T,V6:()=>t,XM:()=>U,XW:()=>P,dG:()=>O,fK:()=>S,fb:()=>s,lJ:()=>B,mh:()=>m,mj:()=>M,q5:()=>A,s4:()=>L,wH:()=>Q,y0:()=>V});var d=c(36153),e=c(78143),f=c(27519),g=c(75106),h=c(78220);let i=d.Yj().uuid(),j=d.ai().int().nonnegative(),k=d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/),l=d.k5(["image/jpeg","image/png","image/webp","image/gif"]),m=d.Ik({mimeType:l,width:d.ai().int().positive(),height:d.ai().int().positive()}).strict(),n=d.k5(["running","completed","error","aborted"]),o=d.k5(["running","completed","error"]),p=d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER),q=d.Ik({inputTokens:p,outputTokens:p,cacheReadTokens:p,costUsd:d.ai().finite().nonnegative()}).strict(),r=d.Yj().trim().min(1).nullable(),s=d.Ik({tempId:i}).strict(),t=d.Ik({index:j,entryId:e.Rv}).strict(),u=d.Ik({timestampMs:g.k.nullable(),type:d.eu("user"),viewKey:k,hasDetail:d.zM()}).strict(),v=d.Ik({timestampMs:g.k.nullable(),type:d.eu("assistant"),viewKey:k,status:n,hasDetail:d.zM(),usage:q}).strict(),w=d.Ik({timestampMs:g.k.nullable(),type:d.eu("tool"),viewKey:k,status:o,hasDetail:d.zM(),usage:q.nullable()}).strict(),x=d.Ik({timestampMs:g.k.nullable(),type:d.eu("bash"),viewKey:k,status:n,hasDetail:d.zM()}).strict(),y=d.Ik({timestampMs:g.k.nullable(),type:d.eu("custom"),viewKey:k,hasDetail:d.zM()}).strict();function z(a){let b=u.extend({timestampMs:a}).strict(),c=v.extend({timestampMs:a}).strict(),e=w.extend({timestampMs:a}).strict(),f=x.extend({timestampMs:a}).strict(),g=y.extend({timestampMs:a}).strict();return{user:b,assistant:c,tool:e,bash:f,custom:g,message:d.gM("type",[b,c,e,f,g])}}d.gM("type",[u,v,w,x,y]);let A=z(d.ch()).message;z(g.k).message;let B=d.Ik({text:d.Yj(),images:d.YO(m)}).strict(),C=d.Ik({provider:d.Yj(),modelId:d.Yj()}).strict();d.Ik({text:d.Yj(),errorMessage:d.Yj().nullable().default(null),model:C.nullable().optional()}).strict();let D={name:d.Yj().trim().min(1),reasoning:r,inputPreview:r,activity:r};function E(){return d.Ik({...D,path:f.eC.nullable()}).strict()}d.Ik({...D,images:d.YO(m).optional()}).strict();let F=d.KC([d.Ik({startedAtMs:g.k}).strict(),d.Ik({durationMs:d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER)}).strict()]);d.Ik({...D,timing:F.nullable()}).strict(),E().extend({images:d.YO(m).optional()}).strict(),E(),E(),d.Ik({command:d.Yj().min(1)}).strict(),d.Ik({text:d.Yj()}).strict(),d.Ik({thinking:d.Yj()}).strict();let G=d.Ik({complete:d.zM(),calls:d.YO(d.Ik({name:d.Yj(),arguments:d.g1(d.Yj(),d.Pq()).optional(),argumentsBytes:d.ai().int().nonnegative().optional(),status:d.k5(["ok","error","unfinished"]),durationMs:d.ai().finite().nonnegative().optional(),error:d.Yj().optional()}).strict())}).strict();d.Ik({output:d.Yj(),nestedCalls:G.optional()}).strict(),d.Ik({output:d.Yj()}).strict(),d.Ik({content:d.Yj()}).strict(),d.gM("kind",[d.Ik({kind:d.eu("diff"),content:d.Yj()}).strict(),d.Ik({kind:d.eu("output"),content:d.Yj()}).strict()]),d.gM("kind",[d.Ik({kind:d.eu("content"),content:d.Yj()}).strict(),d.Ik({kind:d.eu("output"),content:d.Yj()}).strict()]),d.Ik({output:d.Yj()}).strict(),d.Ik({text:d.Yj().min(1)}).strict();let H=d.g1(d.Yj(),d.Pq()),I=d.g1(d.Yj(),d.Pq()),J=d.KC([I,d.ch()]);function K(a,b){return d.Ik({location:a,fixed:z(b).message,summary:H,detail:I.optional()}).strict().superRefine((a,b)=>{void 0===a.detail||a.fixed.hasDetail||b.addIssue({code:"custom",message:"message detail requires hasDetail=true",path:["detail"]})})}let L=K(s,d.ch()),M=K(t,g.k);function N(a,b){0===Object.keys(a).length&&b.addIssue({code:"custom",message:"patch requires at least one changed field"})}let O=d.Ik({viewKey:k.optional(),status:d.KC([n,o]).optional(),hasDetail:d.zM().optional(),usage:q.nullable().optional()}).strict().superRefine(N),P=d.g1(d.Yj(),d.Pq()).superRefine(N),Q=d.g1(d.Yj(),d.Pq()).superRefine(N),R=d.KC([d.Yj().min(1),d.YO(d.Pq()).min(1)]),S=d.g1(d.Yj(),R).superRefine((a,b)=>{for(let c of(N(a,b),Object.keys(a)))try{(0,h.U)(c)}catch(a){b.addIssue({code:"custom",message:a instanceof Error?a.message:"increment path is invalid",path:[c]})}}),T=d.Ik({messages:d.YO(M),temporaryMessages:d.YO(L)}).strict(),U=d.Ik({index:j,entryId:e.Rv,detail:J}).strict(),V=d.Ik({mimeType:l,data:d.Yj().min(1)}).strict()},60161:(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(45166);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())}}},62695:(a,b,c)=>{c.d(b,{DK:()=>r,Pi:()=>q,R3:()=>m,TV:()=>A,UR:()=>s,VK:()=>D,kF:()=>F,mB:()=>G,oc:()=>C,ps:()=>E,w$:()=>w,wR:()=>p,wf:()=>B,xE:()=>n,xh:()=>t,yI:()=>o});var d=c(36153),e=c(13127),f=c(41743),g=c(56255),h=c(72415),i=c(3329);let j=g.Pc,k=g.LJ,l=g.mh,m=g.fb,n=g.lJ,o=g.s4,p=g.mj,q=i.R,r=d.Ik({index:k,entryId:f.C3}).strict(),s=d.KC([d.ch(),r]),t=l.extend({data:d.Yj().min(1)}).strict(),u=h.$,v=d.Ik({tempId:j,text:d.Yj(),images:d.YO(l).max(10)}).strict(),w=d.Ik({provider:d.Yj().trim().min(1),modelId:d.Yj().trim().min(1),thinkingLevel:u}).strict(),x=d.Ik({tokens:d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER).nullable(),contextWindow:d.ai().int().positive().max(Number.MAX_SAFE_INTEGER)}).strict(),y=d.g1(d.Yj(),d.Pq()),z=d.g1(d.Yj().min(1),y),A=d.k5(["normal","basic"]),B=d.Ik({extensionMode:A.default("normal"),presentationMode:A.default("normal"),initializationError:d.Yj().max(32e3).nullable().default(null),queues:d.Ik({steering:d.YO(v),followUp:d.YO(v)}).strict(),model:w.nullable(),capabilityMode:e.rY.nullable(),contextUsage:x.nullable(),plugins:z}).strict(),C=g.RX.extend({runtime:B}).strict(),D=d.Ik({sessionId:f.Kx,branchId:f._A,entryId:f.C3}).strict(),E=g.XM,F=D.extend({imageIndex:d.ai().int().nonnegative()}).strict(),G=g.y0},63210:(a,b,c)=>{c.d(b,{QV:()=>u,RH:()=>p,WF:()=>k,uU:()=>r});var d=c(36153),e=c(3329),f=c(69375),g=c(72497);let h=d.k5(["extension","prompt","skill"]),i=d.Ik({name:d.Yj().trim().min(1).max(128),description:d.Yj().max(500).nullable(),source:h}).strict(),j=d.Ik({source:e.R}).strict(),k=d.Ik({commands:d.YO(i)}).strict(),l=d.Ik({source:e.R,command:d.Yj().trim().min(1).max(128),args:d.Yj().max(32768).optional()}).strict(),m=d.Ik({}).strict(),n=d.Ik({name:d.Yj().trim().min(1).max(128),description:d.Yj(),parameters:g.Dz,active:d.zM(),exposure:d.k5(["direct","model-only","codemode","deferred","hidden"]),source:d.Yj().nullable(),blockedByMode:d.zM()}).strict(),o=d.Ik({source:e.R}).strict(),p=d.Ik({tools:d.YO(n)}).strict(),q=d.Ik({source:e.R,command:d.Yj().min(1).max(32768),excludeFromContext:d.zM()}).strict(),r=d.Ik({output:d.Yj(),exitCode:d.ai().int().nullable(),cancelled:d.zM(),truncated:d.zM(),fullOutputPath:d.Yj().nullable()}).strict(),s=d.Ik({source:e.R}).strict(),t=d.Ik({}).strict(),u=Object.freeze({commandsList:(0,f.Vc)({path:"pi/commands/list",inputSchema:j,outputSchema:k}),commandExecute:(0,f.Vc)({path:"pi/commands/execute",inputSchema:l,outputSchema:m,timeoutMs:3e5}),toolsList:(0,f.Vc)({path:"pi/tools/list",inputSchema:o,outputSchema:p}),bashExecute:(0,f.Vc)({path:"pi/bash/execute",inputSchema:q,outputSchema:r,timeoutMs:12e4}),bashAbort:(0,f.Vc)({path:"pi/bash/abort",inputSchema:s,outputSchema:t})})},64007:(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(90733)},64791:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{sC:()=>h});var e=c(17691);c(77598),c(73024);var f=c(76760),g=a([e]);function h(a){let b=(0,f.resolve)(a);return"win32"===process.platform?b.toLowerCase():b}e=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},67442:(a,b,c)=>{c.d(b,{N:()=>u,d:()=>t});var d=c(56255),e=c(36153),f=c(27519);let g=e.Ik({mode:e.k5(["sync","async"]),message:e.Yj()}).strict(),h="pi-desk/message-declaration-error",i=new WeakMap,j=e.Ik({viewKey:e.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/),summary:e.g1(e.Yj(),e.Pq()),detail:e.g1(e.Yj(),e.Pq()).nullable()}).strict();function k(a){switch(a.type){case"user":return"pi-desk/user";case"assistant":return"pi-desk/assistant";case"tool":{let b=a.name.toLowerCase().split(".").at(-1);if("pidesk"===b)return"pi-desk/pidesk";if("bash"===b)return"pi-desk/bash-tool";if("codemode"===b)return"pi-desk/codemode";return"read"===b||"write"===b||"edit"===b?`pi-desk/${b}`:"pi-desk/tool"}case"bash":return"pi-desk/bash";case"custom":return"pi-desk/custom";case"compaction":return"pi-desk/compaction"}}function l(a){return null===a||"object"!=typeof a||Array.isArray(a)?null:a}function m(a){return l(a.result)}function n(a,b){return{...a.summary,path:function(a){let b=a.arguments.path??a.arguments.file_path;if("string"!=typeof b)return null;let c=f.eC.safeParse(b);return c.success?c.data:null}(b)}}function o(a){if(a.declaration)return a.declaration.message;switch(a.type){case"user":return{kind:"user",text:a.text,images:a.images};case"assistant":return{kind:"assistant",text:a.text,thinking:a.thinking,stopReason:a.status};case"tool":return{kind:"tool",toolName:a.name,toolCallId:"",arguments:{},partialResult:null,result:a.output?{output:a.output}:null,isError:"error"===a.status};case"bash":return{kind:"bash",command:a.command,output:a.output,exitCode:"completed"===a.status?0:null,cancelled:"aborted"===a.status,truncated:!1};case"custom":return{kind:"custom",customType:"display-message",content:a.text,details:null};case"compaction":return{kind:"custom",customType:"pi-desk/compaction",content:"",details:a.summary?{text:a.summary}:null}}}function p(a,b,c){return{pluginName:"pi-desk",declarationName:a,builtin:!0,declaration:{priority:b,match:c,project:a=>a.defaultProjection}}}let q=[p("pidesk",-900,a=>"tool"===a.message.kind&&"pidesk"===a.message.toolName),p("read",-900,a=>"tool"===a.message.kind&&"read"===a.message.toolName),p("write",-900,a=>"tool"===a.message.kind&&"write"===a.message.toolName),p("edit",-900,a=>"tool"===a.message.kind&&"edit"===a.message.toolName),p("bash-tool",-900,a=>"tool"===a.message.kind&&"bash"===a.message.toolName),p("user",-1e3,a=>"user"===a.message.kind),p("assistant",-1e3,a=>"assistant"===a.message.kind),p("tool",-1e3,a=>"tool"===a.message.kind),p("bash",-1e3,a=>"bash"===a.message.kind),p("custom",-1e3,a=>"custom"===a.message.kind)];function r(a){var b;let c=a.error instanceof Error?a.error:null,d=a.candidate;for(let b of d?[d]:a.candidates??[]){let d=i.get(b.declaration)??new Set;d.has(a.phase)||(d.add(a.phase),i.set(b.declaration,d),console.warn("[Pi Desk][MessageDeclaration] 插件投影失败,保留基础展示入口",{pluginName:b.pluginName,declarationName:b.declarationName,phase:a.phase,message:(c?.message??"Message Declaration conflict").slice(0,2e3)}))}return{viewKey:h,summary:{text:"string"==typeof a.defaultProjection.summary.text?a.defaultProjection.summary.text:"",phase:a.phase,pluginName:d?.pluginName??null,declarationName:d?.declarationName??null},detail:{phase:a.phase,pluginName:d?.pluginName??null,declarationName:d?.declarationName??null,priority:d?.declaration.priority??null,errorName:c?.name??null,errorMessage:c?.message??String(a.error??"Message Declaration conflict"),errorStack:c?.stack??null,conflicts:(a.candidates??[]).map(a=>({pluginName:a.pluginName,declarationName:a.declarationName,priority:a.declaration.priority})),defaultProjection:{viewKey:(b=a.defaultProjection).viewKey,summary:b.summary,detail:b.detail}}}}function s(a,b,c,e,f,i,p){let s=function(a){let b=function(a){switch(a.type){case"user":return{viewKey:k(a),summary:{text:function(a){let b=a.text.lastIndexOf("\n\n");if(0===a.images.length||b<0)return a.text;let c=a.text.slice(b+2).split("\n");return c.length>a.images.length?a.text:c.every(b=>{let c=/^\[Image: original \d+x\d+, displayed at (\d+)x(\d+)\. Multiply coordinates by \d+\.\d{2} to map to original image\.\]$/.exec(b);return null!==c&&a.images.some(a=>a.width===Number(c[1])&&a.height===Number(c[2]))})?a.text.slice(0,b):a.text}(a),images:a.images.map(a=>({...a}))},detail:null};case"assistant":return{viewKey:k(a),summary:{text:a.text,errorMessage:a.errorMessage,...void 0===a.model?{}:{model:a.model}},detail:a.thinking.length>0?{thinking:a.thinking}:null};case"tool":{let b=k(a),c={...a.images?.length&&["pi-desk/tool","pi-desk/read","pi-desk/codemode"].includes(b)?{images:a.images.map(a=>({...a}))}:{},name:a.name,reasoning:a.reasoning,inputPreview:a.inputPreview,activity:a.activity},d=a.durationMs??null,e=a.startedAtMs??null,f={viewKey:b,summary:"pi-desk/bash-tool"===b?{...c,timing:null!==d?{durationMs:d}:null!==e?{startedAtMs:e}:null}:c,detail:"pi-desk/codemode"===b?{output:a.output,...a.nestedCalls?{nestedCalls:a.nestedCalls}:{}}:a.output?{output:a.output}:null},h=o(a);return"tool"===h.kind?function(a,b){let c=function(a){let b=m(a);if(!b)return null;let c=b.content;if("string"==typeof c)return c;if(Array.isArray(c)){let a=[],b=!1;for(let d of c){let c=l(d);c?.type==="text"&&"string"==typeof c.text&&(b=!0,a.push(c.text))}if(b)return a.join("\n")}return"string"==typeof b.output?b.output:null}(b)??("string"==typeof a.detail?.output?a.detail.output:null);switch(a.viewKey){case"pi-desk/pidesk":{let d=c??"";try{let a=g.safeParse(JSON.parse(d));a.success&&(d=a.data.message)}catch{}return{viewKey:a.viewKey,summary:{input:b.arguments},detail:{output:d}}}case"pi-desk/read":let d;return{viewKey:a.viewKey,summary:n(a,b),detail:Array.isArray(d=m(b)?.content)&&d.some(a=>{let b=l(a);return b?.type==="image"})||null===c?null:{content:c}};case"pi-desk/edit":{let d=l(m(b)?.details??null)?.diff;return{viewKey:a.viewKey,summary:n(a,b),detail:b.isError||"string"!=typeof d?null===c?null:{kind:"output",content:c}:{kind:"diff",content:d}}}case"pi-desk/write":{let d=b.arguments.content;return{viewKey:a.viewKey,summary:n(a,b),detail:b.isError&&null!==c?{kind:"output",content:c}:"string"==typeof d?{kind:"content",content:d}:null===c?null:{kind:"output",content:c}}}default:return a}}(f,h):f}case"bash":return{viewKey:k(a),summary:{command:a.command},detail:a.output?{output:a.output}:null};case"custom":return{viewKey:k(a),summary:{text:a.text},detail:null};case"compaction":return{viewKey:k(a),summary:{},detail:a.summary?{text:a.summary}:null}}}(a.message);if("compaction"===a.message.type)return b;let c={source:a.source,stage:a.stage,message:o(a.message),raw:a.message.declaration?.raw??a.message,defaultProjection:b},d=[...(a.declarations??[]).map(a=>({...a,builtin:!1})),...q];for(let a of[...new Set(d.map(a=>a.declaration.priority))].sort((a,b)=>b-a)){let e,f=d.filter(b=>b.declaration.priority===a),g=[];for(let a of f)try{a.declaration.match(c)&&g.push(a)}catch(c){return r({phase:"match",candidate:a,error:c,defaultProjection:b})}if(0===g.length)continue;if(g.length>1)return r({phase:"conflict",candidates:g,defaultProjection:b});let i=g[0];try{e=i.declaration.project(c)}catch(a){return r({phase:"project",candidate:i,error:a,defaultProjection:b})}try{return function(a,b){let c=j.parse(a);if(!b&&c.viewKey===h)throw Error("Host reserved Message Declaration Error viewKey cannot be registered");return c}(e,i.builtin)}catch(a){return r({phase:"validate",candidate:i,error:a,defaultProjection:b})}}return b}({source:e,stage:f,message:c,declarations:p}),t="tool"===c.type||"bash"===c.type||"custom"===c.type||"compaction"===c.type,u=null!==s.detail&&(!t||i),v={location:a,fixed:function(a,b,c){let d={timestampMs:a,viewKey:c.viewKey,hasDetail:null!==c.detail};switch(b.type){case"user":return{...d,type:"user"};case"assistant":return{...d,type:"assistant",status:b.status,usage:b.usage};case"tool":return{...d,type:"tool",status:b.status,usage:b.usage};case"bash":return{...d,type:"bash",status:b.status};case"custom":case"compaction":return{...d,type:"custom"}}}(b,c,s),summary:s.summary,...u?{detail:s.detail}:{}};return"tempId"in a?d.s4.parse(v):d.mj.parse(v)}function t(a,b,c,d,e=!1,f="temporary"){return s({tempId:a},null,b,c,f,e,d)}function u(a,b,c,d,e,f){return s({index:a,entryId:b},c,d,e,"durable",!0,f)}},72415:(a,b,c)=>{c.d(b,{$:()=>d});let d=c(36153).k5(["off","minimal","low","medium","high","xhigh","max"])},72725:(a,b,c)=>{c.d(b,{gX:()=>g}),c(57975);let d=["input","output","cacheRead","cacheWrite"];function e(a){return"object"!=typeof a||null===a||Array.isArray(a)?{}:a}function f(a,b){return`${a}\u0000${b}`}function g(a,b,c){let g=function(a){let b=new Set((function(a){if(void 0===a.modelSelections)return[];if(!Array.isArray(a.modelSelections))throw Error("modelSelections 必须是模型引用数组");let b=new Set;return a.modelSelections.map(c=>{let g=e(c);if("string"!=typeof g.provider||!g.provider.trim()||"string"!=typeof g.modelId||!g.modelId.trim())throw Error("modelSelections 中的模型必须包含服务 ID 和模型 ID");let h=f(g.provider,g.modelId);if(b.has(h))throw Error(`重复收录模型:${g.provider}/${g.modelId}`);b.add(h);let i=e(e(e(a.providers)[g.provider]).modelOverrides)[g.modelId],j=e(i),k={};for(let a of["contextWindow","maxTokens"])"number"==typeof j[a]&&(k[a]=j[a]);if(void 0!==j.cost){let a=e(j.cost);k.cost=Object.fromEntries(d.filter(b=>"number"==typeof a[b]).map(b=>[b,a[b]]))}return{provider:g.provider,modelId:g.modelId,overrides:k}})})(a).map(a=>f(a.provider,a.modelId)));for(let[c,d]of Object.entries(e(a.providers))){let a=e(d).models;if(Array.isArray(a))for(let d of a){let a=e(d);"string"==typeof a.id&&b.add(f(c,a.id))}}return b}(c),h=new Set(b.getRegisteredProviderIds());return a.filter(a=>g.has(f(a.provider,a.id))||h.has(a.provider)||void 0!==b.getRegisteredNativeProvider(a.provider)||!b.getPhysicalModel(a.provider,a.id))}},75278:(a,b,c)=>{c.d(b,{PS:()=>k,ef:()=>i,gK:()=>j,hS:()=>h,mv:()=>n});var d=c(36153),e=c(56255),f=c(75106),g=c(78220);let h=d.Ik({type:d.eu("message_start"),snapshot:e.s4}).strict(),i=d.Ik({type:d.eu("message_update"),location:e.fb,fixed:e.dG.optional(),summary:e.XW.optional(),detail:e.wH.optional(),increments:e.fK.optional()}).strict().superRefine((a,b)=>{if(!a.fixed&&!a.summary&&!a.detail&&!a.increments)return void b.addIssue({code:"custom",message:"message update requires a changed layer"});let c=[];for(let b of Object.keys(a.increments??{}))try{c.push({raw:b,parsed:(0,g.U)(b)})}catch{}for(let d of c){let c="summary"===d.parsed.root?Object.keys(a.summary??{}):Object.keys(a.detail??{}),e=d.parsed.segments[0];(0===d.parsed.segments.length||"string"==typeof e&&c.includes(e))&&b.addIssue({code:"custom",message:"replacement and increment paths cannot overlap",path:["increments",d.raw]})}for(let a=0;a<c.length;a+=1)for(let d=a+1;d<c.length;d+=1){let e=c[a],f=c[d];((0,g.v)(e.parsed,f.parsed)||(0,g.v)(f.parsed,e.parsed))&&b.addIssue({code:"custom",message:"increment parent and child paths cannot overlap",path:["increments",f.raw]})}}),j=d.Ik({type:d.eu("message_commit"),location:e.fb,durable:e.V6,fixed:d.Ik({timestampMs:f.k}).strict()}).strict(),k=d.Ik({type:d.eu("message_discard"),location:e.fb}).strict(),l=d.Ik({type:d.eu("durable_append"),messages:d.YO(e.mj).min(1)}).strict().superRefine((a,b)=>{let c=new Set;for(let[d,e]of a.messages.entries())d>0&&e.location.index!==a.messages[d-1].location.index+1&&b.addIssue({code:"custom",message:"durable append message indexes must be continuous",path:["messages",d,"location","index"]}),c.has(e.location.entryId)&&b.addIssue({code:"custom",message:"durable append entryId values must be unique",path:["messages",d,"location","entryId"]}),c.add(e.location.entryId)}),m=d.KC([h,i,j,k]),n=d.KC([l,m])},75286:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{k:()=>q});var e=c(75430),f=c(47757),g=c(14290),h=c(38617),i=c(44493),j=c(33290),k=c(12881),l=c(25776),m=c(45870),n=a([e,f,g,h,i,l]);[e,f,g,h,i,l]=n.then?(await n)():n;let o=new WeakMap,p="Pi 会话实例已失效,不能继续访问当前会话";class q{constructor(a){this.options=a,this.active=!0,this.accessRevoked=!1,this.session=null,this.execution=null,this.result=null,this.onLifecycleError=null,this.stage="等待初始化资源",this.stageStartedAt=performance.now(),this.sessionId=a.sessionManager.getSessionId(),this.retired=o.get(a.resources)??new Set,o.set(a.resources,this.retired),this.ui=a.ui??new m.k,this.capabilities=new g.O(a.readCapabilities),this.plugins=new l.p({onChanged:()=>{this.active&&a.pluginEvents.onChanged()},onPush:b=>{this.active&&a.pluginEvents.onPush(b)},onTasksChanged:b=>{this.active&&a.pluginEvents.onTasksChanged(b)},onInvalidUpdate:b=>{this.active&&a.pluginEvents.onInvalidUpdate(b)}}),this.messages=new k.U((a,b)=>{console.warn("[Pi Desk][PiSession] 延后消息投递失败",{sessionId:this.sessionId,source:a,message:b instanceof Error?b.message:String(b)})}),this.manager=new Proxy(a.sessionManager,{get:(a,b)=>{this.assertAccess();let c=Reflect.get(a,b,a);return"function"!=typeof c?c:(...b)=>(this.assertAccess(),Reflect.apply(c,a,b))},set:()=>{throw Error("Pi 会话只能通过 SessionManager 方法修改")}})}start(a=!1){return this.result??=this.initialize(a),this.result}async reload(){this.assertActive();let a=await this.start();this.setStage("重载 Pi 配置"),await a.reload({beforeSessionStart:async()=>{this.assertActive(),this.validateResources(a.resourceLoader,a.settingsManager.drainErrors().map(({error:a})=>({type:"error",message:a.message})))}}),this.assertActive()}setStage(a){this.active&&(this.stage=a,this.stageStartedAt=performance.now())}describeStage(){return`${this.stage}
36
+ 当前步骤耗时:${Math.round(performance.now()-this.stageStartedAt)} 毫秒`}async initialize(a){let b=performance.now();if(this.assertActive(),"normal"===this.options.mode&&this.retired.size>=4)throw Error("当前会话尚未结束的插件初始化或关闭任务过多,可先使用其他会话");let c=new Promise((a,b)=>{this.onLifecycleError=b}),d=async()=>(this.assertActive(),a&&(this.setStage("刷新插件资源"),(0,i.N)(),this.options.resources.reset(),this.assertActive()),this.create());this.execution=d();try{let a=await this.ui.waitForOperation(Promise.race([this.execution,c]),6e4,()=>Error("Pi 会话初始化超时(60 秒);不含等待用户回答"));return this.assertActive(),this.setStage("会话已就绪"),console.info("[Pi Desk][PiSession] 会话初始化完成",{sessionId:this.sessionId,cwd:this.options.cwd,mode:this.options.mode,durationMs:Math.round(performance.now()-b)}),a}catch(d){let a=d instanceof Error?d:Error(String(d));if(!this.active)throw console.info("[Pi Desk][PiSession] 会话初始化已取消",{sessionId:this.sessionId,cwd:this.options.cwd,mode:this.options.mode,durationMs:Math.round(performance.now()-b)}),a;let c=`${a.stack??a.message}
38
37
 
39
- 最后处理步骤:${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]);o.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),o.delete(d)})}assertActive(){if(!this.active)throw Error(p)}assertAccess(){if(this.accessRevoked)throw Error(p)}validateResources(a,b){let c=a.getExtensions().errors.map(({path:a,error:b})=>`${b}
40
- 插件入口:${a}`);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.createL4PiDeskTool)(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.appendL4PiDeskSystemPrompt,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}
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
+ 插件入口:${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.createL4PiDeskTool)(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.appendL4PiDeskSystemPrompt,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}
41
40
  插件入口:${a.extensionPath}
42
- 事件:${a.event}`;this.active&&(console.error("[Pi Desk][PiSession] 扩展处理失败",{sessionId:this.sessionId,message:b}),this.onLifecycleError?.(Error(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)}})},77167:(a,b,c)=>{c.d(b,{O:()=>d});function d(a){return`Pi Desk 资料(仅在使用、管理 Pi Desk 或开发其插件时读取):
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)}})},77167:(a,b,c)=>{c.d(b,{O:()=>d});function d(a){return`Pi Desk 资料(仅在使用、管理 Pi Desk 或开发其插件时读取):
43
42
  - 文档入口:${a.docsDirectory}/README.md
44
43
  - SDK 公开类型声明:${a.sdkRoot}/dist/
45
44
  从入口选择并完整阅读对应文档及引用示例;原生 Pi 能力按入口引用查阅官方资料。相对路径从文档所在目录解析。`}},78143:(a,b,c)=>{c.d(b,{$E:()=>f,Rv:()=>g,m4:()=>e});var d=c(36153);let e=d.Yj().trim().min(1),f=d.Yj().trim().min(1),g=d.Yj().trim().min(1)},78180:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Ph:()=>q,xt:()=>r});var e=c(17691),f=c(77598),g=c(73024);c(51455);var h=c(76760);c(80481);var i=c(75430),j=c(36153),k=c(18200),l=a([e,i,k]);[e,i,k]=l.then?(await l)():l;let s=j.Ik({entryId:j.Yj().min(1),timestampMs:j.ai().int().nonnegative(),text:j.Yj()}).strict(),t=j.Ik({path:j.Yj().min(1),sessionId:j.Yj().min(1),cwd:j.Yj().min(1),name:j.Yj().nullable(),createdAt:j.ai().int().nonnegative(),updatedAt:j.ai().int().nonnegative(),messageCount:j.ai().int().nonnegative(),userMessageCount:j.ai().int().nonnegative(),firstMessage:j.Yj(),userMessages:j.YO(s),assistantMessages:j.YO(s),textBytes:j.ai().int().nonnegative()}).strict(),u=j.Ik({descriptor:j.Ik({path:j.Yj().min(1),size:j.ai().int().nonnegative(),modifiedAt:j.ai().int().nonnegative()}).strict(),record:t.nullable()}).strict(),v=j.Ik({cwd:j.Yj().min(1),files:j.YO(u)}).strict();v.extend({version:j.eu(2)});let w=j.Ik({version:j.eu(1),catalogs:j.YO(v)}).strict();function m(){return(0,h.join)((0,e.M)(),"pi-session-history")}function n(a){let b=(0,f.createHash)("sha256").update(a).digest("hex");return(0,h.join)(m(),`${b}.json`)}function o(){return globalThis.__piDeskPiSessionHistoryCatalogState||(!function(){let a=(0,h.join)((0,e.M)(),"pi-session-history.json");if((0,g.existsSync)(a))try{let b=w.parse(JSON.parse((0,g.readFileSync)(a,"utf8")));for(let a of b.catalogs){let b=function(a){let b=(0,h.resolve)(a.cwd),c=new Map;for(let d of a.files){let a=null;if(d.record&&d.record.path===d.descriptor.path&&(0,h.resolve)(d.record.cwd)===b){let b=d.record.assistantMessages.filter(a=>a.text.trim()),c=d.record.assistantMessages.reduce((a,b)=>a+(b.text.trim()?0:Buffer.byteLength(b.text,"utf8")),0);a={...d.record,assistantMessages:b,textBytes:d.record.textBytes-c}}c.set(d.descriptor.path,{descriptor:d.descriptor,record:a})}let d=Array.from(c.values()).flatMap(a=>a.record?[a.record]:[]).sort((a,b)=>b.updatedAt-a.updatedAt),e=Date.now();return{cwd:b,files:c,sessions:d,textBytes:d.reduce((a,b)=>a+b.textBytes,0),dirty:!1,validatedAt:0,lastAccessedAt:e}}(a);if(!(0,g.existsSync)(n(b.cwd))&&!function(a){let b=n(a.cwd),c=`${b}.${process.pid}.${(0,f.randomUUID)()}.tmp`;try{(0,g.mkdirSync)((0,h.dirname)(b),{recursive:!0}),(0,g.writeFileSync)(c,`${JSON.stringify({version:2,cwd:a.cwd,files:Array.from(a.files.values())})}