@jetcrab/pi-desk 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/server/l4_foundation/model-settings/l4-model-settings-store.ts +3 -5
- package/src/server/l4_foundation/pi/l4-pi-session-catalog.ts +22 -63
- package/src/server/l4_foundation/pi/l4-pi-session-discovery.ts +139 -0
- package/src/server/l4_foundation/pi/l4-pi-session-history-catalog.ts +36 -7
- package/temp/build/pi-desk/release/.next/BUILD_ID +1 -1
- package/temp/build/pi-desk/release/.next/build-manifest.json +2 -2
- package/temp/build/pi-desk/release/.next/prerender-manifest.json +3 -3
- package/temp/build/pi-desk/release/.next/required-server-files.js +2 -2
- package/temp/build/pi-desk/release/.next/required-server-files.json +2 -2
- package/temp/build/pi-desk/release/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.html +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/health/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-catalog/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-settings/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-settings/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-model-default/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-model-default/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/page.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/25406.js +6 -6
- package/temp/build/pi-desk/release/.next/server/chunks/3108.js +3 -3
- package/temp/build/pi-desk/release/.next/server/chunks/78262.js +3 -3
- package/temp/build/pi-desk/release/.next/server/middleware-build-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/pages/500.html +1 -1
- package/temp/build/pi-desk/release/.next/server/server-reference-manifest.json +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/{page-a659ca2be4d0f904.js → page-39b146293b6eb488.js} +1 -1
- package/temp/build/pi-desk/release/.next/trace-build +1 -1
- /package/temp/build/pi-desk/release/.next/static/{nyIG3F2lwWYn5hTFPNrHZ → STVrBHA3z9KPtvBE4WcE2}/_buildManifest.js +0 -0
- /package/temp/build/pi-desk/release/.next/static/{nyIG3F2lwWYn5hTFPNrHZ → STVrBHA3z9KPtvBE4WcE2}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
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:()=>
|
|
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)}})},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),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"})}}})}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
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();a.abortRetry(),a.abortCompaction(),a.agent.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 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)}
|
|
@@ -10,7 +10,7 @@ References are relative to ${h.baseDir}.
|
|
|
10
10
|
${a}
|
|
11
11
|
</skill>`;return g?`${b}
|
|
12
12
|
|
|
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)}})},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)}}}}},13127:(a,b,c)=>{c.d(b,{HE:()=>e,Wu:()=>d.j0,rY:()=>d.a4});var d=c(63603);function e(a){return Object.fromEntries(Object.entries(a).map(([a,b])=>[a,b.name]))}},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)}})},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 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()))}refreshPluginMessages(){this.chat.refreshPluginMessages()}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))}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})}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)}
|
|
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)}})},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)}}}}},13127:(a,b,c)=>{c.d(b,{HE:()=>e,Wu:()=>d.j0,rY:()=>d.a4});var d=c(63603);function e(a){return Object.fromEntries(Object.entries(a).map(([a,b])=>[a,b.name]))}},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 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()))}refreshPluginMessages(){this.chat.refreshPluginMessages()}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))}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})}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
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:()=>o});var e=c(75430),f=c(42035),g=c(36153),h=c(15819),i=c(64007),j=a([e,h]);[e,h]=j.then?(await j)():j;let k=g.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),l=g.g1(g.Yj(),g.Pq()),m=g.g1(g.Yj().min(1),g.KC([l,g.ch()])),n=g.Ik({pluginName:k,event:k,data:l}).strict();class o{constructor(a){this.options=a,this.controller=(0,e.createEventBus)(),this.slots=new Map,this.methods=new Map,this.unsubscribe=()=>void 0,this.unsubscribePush=()=>void 0,this.disposed=!1,this.eventBus={emit:(a,b)=>{if(!this.disposed){if(a===f.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 h.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(f.k0,b=>{if(this.disposed)return;let c=m.safeParse(b);if(!c.success)return void a.onInvalidUpdate(c.error);try{this.apply(c.data)&&a.onChanged()}catch(b){a.onInvalidUpdate(b)}}),this.unsubscribePush=this.controller.on(f.Nb,b=>{if(this.disposed)return;let c=n.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,i.FX)(a),g=(0,i.QK)(b),h=this.methods.get((0,i.$m)(f,g));if(!h)throw new i.Tk(f,g);let j=await h.execute((0,i.nJ)(c,"input"),{source:d,extensionContext:e});return(0,i.nJ)(j,"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.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.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,i.FX)(b.pluginName),d=(0,i.QK)(b.method),e=(0,i.$m)(c,d);if("register"===a.type){if(this.methods.has(e))throw new i.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})}apply(a){if(Object.hasOwn(a,"task-center"))throw Error("task-center plugin slot is reserved by the Task Runtime");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}
|
|
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} 毫秒
|
|
@@ -21,8 +21,8 @@ ${g}`:b}catch{return a}}(a,c),d),j=(b??[]).map(a=>{let b=(0,g.Z)(a.data);if(b.me
|
|
|
21
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}
|
|
22
22
|
步骤:导入插件模块`,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
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({matches:d.YO(g).max(100),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 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:()=>u,vg:()=>s,xt:()=>v});var e=c(17691),f=c(77598),g=c(73024),h=c(76760),i=c(75430),j=c(36153),k=c(64791),l=c(78180),m=a([e,i,k,l]);[e,i,k,l]=m.then?(await m)():m;let w=j.Ik({cwd:j.Yj().trim().min(1),sessionCount:j.ai().int().nonnegative(),updatedAt:j.ai().int().nonnegative()}).strict(),x=j.Ik({directories:j.YO(w)}).strict();function n(){return(0,h.join)((0,e.M)(),"pi-directories.json")}function o(a){let b=n(),c=`${b}.${process.pid}.${(0,f.randomUUID)()}.tmp`;try{(0,g.mkdirSync)((0,h.dirname)(b),{recursive:!0}),(0,g.writeFileSync)(c,`${JSON.stringify({directories:a},null,2)}
|
|
25
|
-
`,"utf8"),(0,g.renameSync)(c,b)}catch(a){console.warn("[Pi Desk][PiSessionCatalog] 写入项目目录持久缓存失败",{path:b,errorName:a instanceof Error?a.name:"UnknownError"})}finally{(0,g.existsSync)(c)&&(0,g.unlinkSync)(c)}}function p(){if(!globalThis.__piDeskPiSessionCatalogState){let a=function(){let a=n();if(!(0,g.existsSync)(a))return null;try{return x.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={activePathLookups:new Map,directorySummaryCache:null,directorySummaryValue:a,directorySummaryNeedsRefresh:null!==a}}return globalThis.__piDeskPiSessionCatalogState}function q(a){return(0,h.resolve)(a)}async function r(a){let b=await i.SessionManager.list(a);return new Map(b.map(a=>[a.id,a.path]))}async function s(a,b){let c=(0,l.Ph)(a,b);return void 0!==c?c:(await function(a){let b=q(a),c=p(),d=c.activePathLookups.get(b);if(d)return d;let e=r(b);c.activePathLookups.set(b,e);let f=()=>{c.activePathLookups.get(b)===e&&c.activePathLookups.delete(b)};return e.then(f,f),e}(a)).get(b)??null}async function t(){let a=await i.SessionManager.listAll(),b=new Map;for(let c of a){if(!c.cwd)continue;let a=q(c.cwd),d=c.modified.getTime(),e=b.get(a);if(!e){b.set(a,{cwd:a,sessionCount:1,updatedAt:d});continue}e.sessionCount+=1,d>e.updatedAt&&(e.updatedAt=d)}return Array.from(b.values()).sort((a,b)=>b.updatedAt-a.updatedAt)}function u(a){let b=p();if(b.directorySummaryNeedsRefresh=!0,a&&b.directorySummaryValue){let c=q(a),d=b.directorySummaryValue.find(a=>(0,k.sC)(a.cwd)===(0,k.sC)(c));d?(d.sessionCount+=1,d.updatedAt=Math.max(d.updatedAt,Date.now())):b.directorySummaryValue=[...b.directorySummaryValue,{cwd:c,sessionCount:1,updatedAt:Date.now()}].sort((a,b)=>b.updatedAt-a.updatedAt),o(b.directorySummaryValue)}b.directorySummaryValue&&function(){let a=p();if(a.directorySummaryCache)return a.directorySummaryCache;let b=t();a.directorySummaryCache=b,b.then(b=>{a.directorySummaryValue=b,a.directorySummaryNeedsRefresh=!1,o(b),console.info("[Pi Desk][PiSessionCatalog] 已更新 Pi 完整目录缓存",{directoryCount:b.length})},b=>{a.directorySummaryNeedsRefresh=!0,console.warn("[Pi Desk][PiSessionCatalog] 更新 Pi 完整目录缓存失败",{errorName:b instanceof Error?b.name:"UnknownError"})}).finally(()=>{a.directorySummaryCache===b&&(a.directorySummaryCache=null)})}(),(0,l.xt)(a)}function v(a){(0,l.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:(0,g.readL4PiDeskSkills)(),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 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});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(),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,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(88277);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,{createL4PiDeskTool:()=>s,disposeL4PiDeskCommands:()=>p,executeL4PiDeskCommand:()=>r,initializeL4PiDeskCommands:()=>o,readL4PiDeskSkills:()=>q});var e=c(51455),f=c(76760),g=c(75430),h=c(60815),i=c(17691),j=c(16056),k=c(55574),l=c(84641),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)((0,i.M)(),b?"dev-skills":"skills","pi-desk");await (0,e.mkdir)((0,f.join)(m,"references"),{recursive:!0}),await Promise.all([(0,e.writeFile)((0,f.join)(m,"SKILL.md"),(0,l.i)({agentDir:n(c),sdkRoot:n(k),piDocs:n((0,g.getDocsPath)())}),"utf8"),(0,e.writeFile)((0,f.join)(m,"references","plugins.md"),(0,l._)(n(c)),"utf8")]);let p=(0,g.loadSkillsFromDir)({dir:m,source:"pidesk"}).skills.find(a=>"pi-desk"===a.name);if(!p)throw Error("Pi Desk Skill 生成后无法加载");let q={handler:a,skill:p,version:h.version,development:b,agentDir:c};globalThis.__piDeskCommandRuntime=q,console.info("[Pi Desk][Commands] 命令入口与 Skill 已准备完成",{skillPath:p.filePath})}function p(){globalThis.__piDeskCommandRuntime=void 0}function q(a=[]){let b=globalThis.__piDeskCommandRuntime?.skill;return b?[...a.filter(a=>a.name!==b.name),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,skillDirectory:c.skill.baseDir})};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}
|
|
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({matches:d.YO(g).max(100),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 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
|
+
`,"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:(0,g.readL4PiDeskSkills)(),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 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});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(),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,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(88277);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,{createL4PiDeskTool:()=>s,disposeL4PiDeskCommands:()=>p,executeL4PiDeskCommand:()=>r,initializeL4PiDeskCommands:()=>o,readL4PiDeskSkills:()=>q});var e=c(51455),f=c(76760),g=c(75430),h=c(60815),i=c(17691),j=c(16056),k=c(55574),l=c(84641),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)((0,i.M)(),b?"dev-skills":"skills","pi-desk");await (0,e.mkdir)((0,f.join)(m,"references"),{recursive:!0}),await Promise.all([(0,e.writeFile)((0,f.join)(m,"SKILL.md"),(0,l.i)({agentDir:n(c),sdkRoot:n(k),piDocs:n((0,g.getDocsPath)())}),"utf8"),(0,e.writeFile)((0,f.join)(m,"references","plugins.md"),(0,l._)(n(c)),"utf8")]);let p=(0,g.loadSkillsFromDir)({dir:m,source:"pidesk"}).skills.find(a=>"pi-desk"===a.name);if(!p)throw Error("Pi Desk Skill 生成后无法加载");let q={handler:a,skill:p,version:h.version,development:b,agentDir:c};globalThis.__piDeskCommandRuntime=q,console.info("[Pi Desk][Commands] 命令入口与 Skill 已准备完成",{skillPath:p.filePath})}function p(){globalThis.__piDeskCommandRuntime=void 0}function q(a=[]){let b=globalThis.__piDeskCommandRuntime?.skill;return b?[...a.filter(a=>a.name!==b.name),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,skillDirectory:c.skill.baseDir})};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
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:()=>o,nJ:()=>q,yO:()=>s});var e=c(44937),f=c(62695),g=c(43520),h=c(16056),i=c(6676),j=c(5340),k=c(33448),l=a([i,j,k]);[i,j,k]=l.then?(await l)():l;class o extends Error{constructor(a){super(`Chat source is not current: ${a.workId}/${a.sessionId}/${a.branchId}`),this.name="L2ChatSourceBindingError"}}class p extends Error{constructor(a){super(`Chat message was not found: ${a}`),this.name="L2ChatMessageNotFoundError"}}class q extends Error{constructor(a){super(`Chat commands are blocked by WorkSession lifecycle: ${a}`),this.name="L2ChatLifecycleBlockedError"}}class r extends Error{constructor(a,b){super(`工作会话 ${a} 阻止插件重载:${b}`),this.workId=a,this.reason=b,this.name="L2PluginReloadBlockedError"}}function m(a){try{return structuredClone(a)}catch{let{declaration:b,...c}=a;return structuredClone(c)}}function n(a,b){return JSON.stringify(a)===JSON.stringify(b)}class s{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,k.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,k.gb)(a.sessionId)}async pauseWorkSession(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,k.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 r(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 r(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=f.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);return void 0!==c&&this.matches(c.source,b)}refreshPluginMessages(){for(let a of this.recordsByWorkId.values())if("basic"!==a.state.runtime.presentationMode)try{this.reprojectRecord(a,a.state.runtime.presentationMode)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] 插件消息刷新失败,保留已有聊天",{workId:a.source.workId,message:b instanceof Error?b.message:String(b)})}}setPresentation(a,b){let c=this.currentRecord(a);return this.enqueueCommand(c,async()=>{if(((0,h.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,k.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,j.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,j.QS)(b.location.tempId,c,a.source,!1,"update",e)});a.state={messages:f,temporaryMessages:g,runtime:{...a.state.runtime,presentationMode:b}},a.forceFullSync=!0,a.sourceEventVersion+=1,this.publish({type:"source_event",source:a.source,version:a.sourceEventVersion,event:this.createSync(a.source,null).event})}prepareSource(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>this.syncRecordRuntime(b))}async syncRecordRuntime(a){let b=a.source,c=f.wf.parse({...await (0,k.ls)(b.sessionId).readChatRuntime(),presentationMode:a.state.runtime.presentationMode});this.isCurrentSource(b)&&(n(a.state.runtime,c)||this.applySourceEvent(b,{type:"runtime_update",runtime:c}),"basic"===c.extensionMode&&"basic"!==a.state.runtime.presentationMode&&this.reprojectRecord(a,"basic"))}createSync(a,b){let c=this.currentRecord(a),d=c.source,e=c.state.messages,f=c.state.temporaryMessages,g=c.state.runtime,h=null===b?void 0:e[b.index],i=null!==b&&h?.location.entryId===b.entryId;return null===b||i||console.warn("[Pi Desk][WorkSessionChatRuntime] 客户端消息 cursor 不匹配,回退全量",{workId:d.workId,sessionId:d.sessionId,branchId:d.branchId,clientCursorIndex:b.index,clientCursorEntryId:b.entryId,serverEntryIdAtIndex:h?.location.entryId??null,serverLatestIndex:e.at(-1)?.location.index??-1}),{event:null!==b&&i&&!c.forceFullSync?{type:"session_sync",mode:"incremental",baseCursor:b,messages:e.slice(b.index+1).map(j.NA),temporaryMessages:f,runtime:g}:{type:"session_sync",mode:"full",baseCursor:null,messages:e.map(j.NA),temporaryMessages:f,runtime:g},watermark:c.sourceEventVersion}}getImage(a){let b=f.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 p(`${b.entryId}/${b.imageIndex}`);return f.mB.parse((0,k.ls)(c.source.sessionId).readChatImage(b.entryId,b.imageIndex))}getMessageDetail(a){let b=f.VK.parse(a),c=this.recordForSession(b.sessionId,b.branchId).state.messages.find(a=>a.location.entryId===b.entryId);if(!c)throw new p(b.entryId);return f.ps.parse({index:c.location.index,entryId:c.location.entryId,detail:c.detail??null})}getModelContext(a){let b=e.FF.parse(a),c=this.currentRecord(b.source);return this.enqueueCommand(c,async()=>e.LK.parse(await (0,k.ls)(c.source.sessionId).readModelContext()))}send(a){let b=this.currentRecord(a.source);if((0,k.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 q(b.source.workId);return a?c():this.enqueueCommand(b,c)}):Promise.reject(new q(b.source.workId)):this.enqueueCommand(b,c)}interrupt(a){let b=this.currentRecord(a);return(0,k.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,k.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,k.ls)(a.sessionId).nativeUi.cancelAll(),this.enqueueCommand(c,async()=>{try{await (0,k.ls)(c.source.sessionId).reload(b)}finally{this.recordsByWorkId.get(a.workId)===c&&(await this.syncRecordRuntime(c),"basic"===c.state.runtime.extensionMode&&"basic"!==c.state.runtime.presentationMode&&this.reprojectRecord(c,"basic"))}})}restoreQueuedMessages(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>b.workSession.restoreQueuedMessages())}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,k.ls)(b.source.sessionId).setCapabilityMode(a.capabilityMode))}invokePluginMethod(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>(0,k.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,k.ls)(b.source.sessionId).listNativeCommands())}executeNativeCommand(a,b,c){let d=this.currentRecord(a);return this.enqueueCommand(d,()=>(0,k.ls)(d.source.sessionId).executeNativeCommand(b,c))}listNativeTools(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>(0,k.ls)(b.source.sessionId).listNativeTools())}executeDirectBash(a,b){let c=this.currentRecord(a);return c.directBashActive?Promise.reject(new i.yT):(c.directBashActive=!0,this.enqueueCommand(c,()=>(0,k.ls)(c.source.sessionId).executeDirectBash(b)).finally(()=>{c.directBashActive=!1}))}abortDirectBash(a){let b=this.currentRecord(a);return(0,k.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,k.ls)(a.sessionId),d=c.readChatSnapshot(),e=d.entries.map((a,c)=>(0,j.Cz)(c,a.entryId,a.timestampMs,a.message,b,(0,h.P)())),i=f.oc.parse({messages:e,temporaryMessages:[],runtime:{...g.L6,extensionMode:(0,h.P)()?"basic":"normal",presentationMode:(0,h.P)()?"basic":"normal"}}),l=i.messages.find(a=>"user"===a.fixed.type),m=l?f.xE.safeParse(l.summary):null,n=m?.success&&m.data.text.trim()||null,o={workSession:a,source:b,state:i,sourceEventVersion:0,forceFullSync:(0,h.P)(),rawTemporaryMessages:new Map,metadata:{sessionTitle:d.sessionName??n,messageCounts:{user:i.messages.filter(a=>"user"===a.fixed.type).length,total:i.messages.length},lastMessageUpdatedAt:i.messages.at(-1)?.fixed.timestampMs??null},mainRunning:!1,backgroundTaskIds:new Set(c.readChatBackgroundTaskIds()),completedPending:!1,acceptingCommands:!0,directBashActive:!1,compactionStart:null,commandTail:Promise.resolve(),unsubscribeWorker:()=>void 0};return o.unsubscribeWorker=c.subscribeChat(a=>this.handleWorkerEvent(o,a)),o}handleWorkerEvent(a,b){if(this.recordsByWorkId.get(a.source.workId)!==a)return;let c=a.metadata,d=this.statusForRecord(a);switch(b.type){case"message_start":a.rawTemporaryMessages.set(b.tempId,m(b.message)),this.applySourceEvent(a.source,{type:"message_start",snapshot:(0,j.QS)(b.tempId,b.message,a.source,!1,"temporary","basic"===a.state.runtime.presentationMode)});return;case"message_update":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);a.rawTemporaryMessages.set(b.tempId,m(b.message));let d=(0,j.Ht)(c,(0,j.QS)(b.tempId,b.message,a.source,!1,"update","basic"===a.state.runtime.presentationMode));d&&this.applySourceEvent(a.source,d);return}case"message_commit":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);let d=(0,j.QS)(b.tempId,b.message,a.source,!1,"final","basic"===a.state.runtime.presentationMode),e=(0,j.Ht)(c,d);e&&this.applySourceEvent(a.source,e),this.replaceCanonicalTemporary(a,b.tempId,b.message),a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_commit",location:{tempId:b.tempId},durable:{index:a.state.messages.length,entryId:b.entryId},fixed:{timestampMs:b.timestampMs}});return}case"message_discard":a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_discard",location:{tempId:b.tempId}});return;case"plugin_push":this.publishPluginPush({pluginName:b.pluginName,target:{scope:"session",source:a.source},event:b.event,data:structuredClone(b.data)});return;case"runtime_changed":{let c=f.wf.parse({...b.runtime,presentationMode:a.state.runtime.presentationMode});n(a.state.runtime,c)||this.applySourceEvent(a.source,{type:"runtime_update",runtime:c}),"basic"===c.extensionMode&&"basic"!==a.state.runtime.presentationMode&&this.reprojectRecord(a,"basic");return}case"agent_started":if(a.mainRunning)return;a.mainRunning=!0,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"main_operation_cancelled":case"main_operation_finished":if(!a.mainRunning)return;a.mainRunning=!1,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"agent_settled":{let b=a.mainRunning||a.backgroundTaskIds.size>0;a.mainRunning=!1,b&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"background_tasks_changed":{let e=a.mainRunning||a.backgroundTaskIds.size>0;a.backgroundTaskIds=new Set(b.taskIds),e&&!a.mainRunning&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"session_info_changed":a.metadata={...a.metadata,sessionTitle:b.sessionTitle},this.publishRecordChanged(a.source.workId,c,d);return}}replaceCanonicalTemporary(a,b,c){let d=a.state.temporaryMessages.findIndex(a=>a.location.tempId===b);if(d<0)throw Error(`Temporary chat message was not found: ${b}`);let e=[...a.state.temporaryMessages];e[d]=(0,j.QS)(b,c,a.source,!0,"final","basic"===a.state.runtime.presentationMode),a.state={...a.state,temporaryMessages:e}}applySourceEvent(a,b){let c=this.currentRecord(a),d=c.source;if(c.state=(0,g.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?f.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 q(a.source.workId));let c=a.commandTail.then(b,b);return a.commandTail=c.then(()=>void 0,()=>void 0),c}pluginReloadBlockReason(a){return(0,k.ls)(a.source.sessionId).nativeUi.hasPending?"原生插件问题正在等待回答":a.directBashActive?"Direct Bash 正在运行":a.mainRunning?"主 Agent 正在运行":a.backgroundTaskIds.size>0?"插件后台任务正在运行":(0,k.ls)(a.source.sessionId).readPluginReloadBlockReason()}async closeRecord(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,k.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 f.Pi.parse({workId:a.workId,sessionId:a.sessionId,branchId:a.branchId})}currentRecord(a){let b=f.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);if(!c||!this.matches(c.source,b))throw new o(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 o({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","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
27
|
${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
28
|
${e(i)}`)}if("required"===i.scope&&void 0===b)throw Error(`必须指定 --scope global
|
|
@@ -39,8 +39,8 @@ ${k(a.usage)}`;case"model_change":return`${a.provider}/${c?.getModel(a.provider,
|
|
|
39
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
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("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,{skillsOverride:a=>({...a,skills:(0,f.readL4PiDeskSkills)(a.skills)}),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
41
|
插件入口:${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)}})},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:()=>
|
|
43
|
-
`,"utf8"),(0,g.renameSync)(c,b);let d=
|
|
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)}})},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())})}
|
|
43
|
+
`,"utf8"),(0,g.renameSync)(c,b);let d=m(),e=(0,g.readdirSync)(d).filter(a=>/^[a-f0-9]{64}\.json$/u.test(a)).map(a=>{let b=(0,h.join)(d,a),c=(0,g.statSync)(b);return{path:b,size:c.size,modifiedAt:c.mtimeMs}}).sort((a,b)=>a.modifiedAt-b.modifiedAt),f=e.reduce((a,b)=>a+b.size,0);for(;e.length>1&&(e.length>8||f>0x4000000);){let a=e.shift();(0,g.unlinkSync)(a.path),f-=a.size}return!0}catch(a){return console.warn("[Pi Desk][PiSessionHistoryCatalog] 写入历史会话持久缓存失败",{path:b,errorName:a instanceof Error?a.name:"UnknownError"}),!1}finally{(0,g.existsSync)(c)&&(0,g.unlinkSync)(c)}}(b))return}(0,g.unlinkSync)(a),console.info("[Pi Desk][PiSessionHistoryCatalog] 已迁移历史会话缓存",{catalogCount:b.catalogs.length})}catch(b){console.warn("[Pi Desk][PiSessionHistoryCatalog] 迁移历史会话缓存失败",{path:a,errorName:b instanceof Error?b.name:"UnknownError"})}}(),globalThis.__piDeskPiSessionHistoryCatalogState={epochs:new Map,activeLoads:new Map,catalogs:new Map}),globalThis.__piDeskPiSessionHistoryCatalogState}function p(a){let b=(o().epochs.get(a)??0)+1;return o().epochs.set(a,b),b}function q(a,b){let c=o().catalogs.get((0,h.resolve)(a));if(c&&!c.dirty)return c.sessions.find(a=>a.sessionId===b)?.path}function r(a){let b=o();if(a){let c=(0,h.resolve)(a);p(c);let d=b.catalogs.get(c);d&&(d.dirty=!0);return}for(let a of new Set([...b.catalogs.keys(),...b.activeLoads.keys()])){p(a);let c=b.catalogs.get(a);c&&(c.dirty=!0)}}d()}catch(a){d(a)}})},78220:(a,b,c)=>{function d(a){if(!/^(0|[1-9]\d*)$/.test(a))return a;let b=Number(a);if(!Number.isSafeInteger(b))throw Error(`Increment array index is invalid: ${a}`);return b}function e(a){if(!a||a.length>1024)throw Error("Increment path length is invalid");let b=[],c="",e=!1;for(let d of a){if(e){if("."!==d&&"\\"!==d)throw Error(`Increment path contains an invalid escape: \\${d}`);c+=d,e=!1;continue}if("\\"===d){e=!0;continue}if("."===d){if(!c)throw Error("Increment path contains an empty segment");b.push(c),c="";continue}c+=d}if(e)throw Error("Increment path ends with an escape");if(!c)throw Error("Increment path contains an empty segment");b.push(c);let f=b.shift();if("summary"!==f&&"detail"!==f)throw Error("Increment path root must be summary or detail");return{root:f,segments:b.map(d)}}function f(a,b){return a.root===b.root&&!(a.segments.length>b.segments.length)&&a.segments.every((a,c)=>a===b.segments[c])}c.d(b,{U:()=>e,v:()=>f})},78555:(a,b,c)=>{c.d(b,{i:()=>n});var d=c(73024),e=c(51455),f=c(76760),g=c(88134);let h=/\u001b(?:\[[0-?]*[ -/]*[@-~]|\][^\u0007]*(?:\u0007|\u001b\\))/g;function i(a,b,c){for(let d of[...a])try{d(b)}catch(a){console.error("[Pi Desk][TextLogRuntime] 日志监听器执行失败",{path:c,errorName:a instanceof Error?a.name:"UnknownError"})}}async function j(a){let b;try{b=await (0,e.stat)(a)}catch(a){if("ENOENT"===a.code)return{text:"",truncated:!1};throw a}if(!b.isFile())throw Error(`Text log source is not a file: ${a}`);let c=Math.max(0,b.size-131072),d=b.size-c,f=await (0,e.open)(a,"r");try{let a=Buffer.alloc(d);d>0&&await f.read(a,0,d,c);let b=a.toString("utf8").replace(h,""),e=c>0;if(c>0){let a=b.indexOf("\n");a>=0&&(b=b.slice(a+1))}let g=b.split("\n");return g.length>1e3&&(b=g.slice(g.length-1e3).join("\n"),e=!0),{text:b,truncated:e}}finally{await f.close()}}class k{constructor(a,b){this.path=a,this.listeners=new Set,this.watcher=null,this.interval=null,this.refreshTimer=null,this.refreshPromise=null,this.disposed=!1,this.current=b}static async create(a){let b=new k(a,await j(a));return b.startWatching(),b}snapshot(){return{...this.current}}subscribe(a){if(this.disposed)throw Error("Text log runtime has been disposed");return this.listeners.add(a),()=>this.listeners.delete(a)}dispose(){this.disposed||(this.disposed=!0,this.watcher?.close(),this.interval&&clearInterval(this.interval),this.refreshTimer&&clearTimeout(this.refreshTimer),this.watcher=null,this.interval=null,this.refreshTimer=null,this.listeners.clear())}startWatching(){try{this.watcher=(0,d.watch)(this.path,()=>this.scheduleRefresh()),this.watcher.on("error",()=>this.scheduleRefresh())}catch{this.watcher=null}this.interval=setInterval(()=>this.scheduleRefresh(),500)}scheduleRefresh(){this.disposed||this.refreshTimer||(this.refreshTimer=setTimeout(()=>{this.refreshTimer=null,this.refresh()},40))}refresh(){return this.disposed?Promise.resolve():(this.refreshPromise||(this.refreshPromise=(async()=>{try{let a=await j(this.path);if(this.disposed||a.text===this.current.text&&a.truncated===this.current.truncated)return;let b=this.current;this.current=a;let c=a.text.startsWith(b.text)?a.text.slice(b.text.length):"";c&&a.truncated===b.truncated?i(this.listeners,{type:"text_append",text:c},this.path):i(this.listeners,{type:"snapshot",snapshot:{...a}},this.path)}catch(a){console.warn("[Pi Desk][TextLogRuntime] 刷新日志失败",{path:this.path,errorName:a instanceof Error?a.name:"UnknownError"}),i(this.listeners,{type:"unavailable"},this.path)}})().finally(()=>{this.refreshPromise=null})),this.refreshPromise)}}class l{async observe(a,b){if(this.disposed)throw Error("Text log pool has been disposed");let c=function(a){let b=a.trim();if(!b||b.length>32768||!(0,f.isAbsolute)(b))throw Error("Text log path must be an absolute path");return(0,f.resolve)(b)}(a),d=(0,g.b)(c),e=this.sharedByPath.get(d);if(!e){let a=this.pendingByPath.get(d);a||(a=k.create(c).then(a=>{if(this.disposed)throw a.dispose(),Error("Text log pool was disposed during initialization");let b={runtime:a,references:0};return this.sharedByPath.set(d,b),b}).finally(()=>{this.pendingByPath.delete(d)}),this.pendingByPath.set(d,a)),e=await a}e.references+=1;let h=e.runtime.subscribe(b),i=!1;return{snapshot:e.runtime.snapshot(),readSnapshot:()=>e.runtime.snapshot(),release:()=>{i||(i=!0,h(),e.references-=1,e.references>0||(this.sharedByPath.get(d)===e&&this.sharedByPath.delete(d),e.runtime.dispose()))}}}dispose(){if(!this.disposed){for(let a of(this.disposed=!0,this.sharedByPath.values()))a.runtime.dispose();this.sharedByPath.clear(),this.pendingByPath.clear()}}constructor(){this.sharedByPath=new Map,this.pendingByPath=new Map,this.disposed=!1}}let m=new l;function n(){return m}},80159:(a,b,c)=>{c.d(b,{Hj:()=>g,Nb:()=>f,O0:()=>h,Sl:()=>e,k0:()=>d}),c(77598),c(48180);let d="pi-desk:session-plugins",e="pi-desk:session-plugin-methods:v1",f="pi-desk:session-plugin-push:v1",g="pi-desk:session-capabilities",h="pi-desk:task-report:v1"},84641:(a,b,c)=>{function d(a){return`---
|
|
44
44
|
name: pi-desk
|
|
45
45
|
description: 管理 Pi Desk,或开发、安装、更新、加载供 Pi Desk 使用的插件时使用。
|
|
46
46
|
---
|