@qt4798/pi-web 0.18.11 → 0.18.12
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/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +6 -6
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.js +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/agent/[id]/events/route.js +3 -3
- package/.next/server/app/api/agent/running/events/route.js +2 -2
- package/.next/server/app/api/app-update/route.js +1 -1
- package/.next/server/app/api/auth/login/[provider]/route.js +1 -1
- package/.next/server/app/api/backup/import/route.js +1 -1
- package/.next/server/app/api/events/route.js +3 -3
- package/.next/server/app/api/files/[...path]/route.js +2 -2
- package/.next/server/app/api/git/diff/route.js +2 -2
- package/.next/server/app/api/git/status/route.js +2 -2
- package/.next/server/app/api/skills/install/route.js +1 -1
- package/.next/server/app/api/tasks/[id]/changed-files/route.js +2 -2
- package/.next/server/app/api/tasks/[id]/diff/route.js +2 -2
- package/.next/server/app/api/themes/[name]/route.js +1 -1
- package/.next/server/app/api/themes/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/themes/route.js +1 -1
- package/.next/server/app/api/themes/route.js.nft.json +1 -1
- package/.next/server/app/api/web-auth/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +3 -3
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login/page.js +1 -1
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +2 -2
- package/.next/server/app/login.segments/_full.segment.rsc +2 -2
- package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/page.js +7 -7
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +6 -6
- package/.next/server/chunks/4253.js +1 -1
- package/.next/server/chunks/6429.js +1 -1
- package/.next/server/chunks/{1213.js → 6593.js} +1 -1
- package/.next/server/chunks/7915.js +1 -1
- package/.next/server/chunks/8526.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/5170-6ee3710ea5c117f3.js +1 -0
- package/.next/static/chunks/app/login/{page-9e7302325b4e8bec.js → page-7d898795adddde04.js} +1 -1
- package/.next/static/chunks/app/{page-34c582c8b53234cc.js → page-abc85eb2cca48bce.js} +7 -7
- package/.next/trace +84 -84
- package/.next/trace-build +1 -1
- package/package.json +1 -1
- package/.next/server/chunks/8152.js +0 -1
- package/.next/static/chunks/2981-f36a0ad7528e24b1.js +0 -1
- /package/.next/static/{vqJU0DdnD5Laxw6J_7xzv → fs5JGinkTfT6aWXJqEdny}/_buildManifest.js +0 -0
- /package/.next/static/{vqJU0DdnD5Laxw6J_7xzv → fs5JGinkTfT6aWXJqEdny}/_ssgManifest.js +0 -0
|
@@ -21,7 +21,7 @@ ${b}`:`Subagent ${a.sessionId} completed without text output.`}return"aborted"==
|
|
|
21
21
|
${k(a)}`}function m(a,b,c=()=>!0){return{name:o,hidden:!0,factory:d=>{let g;if(!c())return;let i=b().filter(a=>a.enabled),l=i.map(a=>a.name),m=l.length>0?l.join(", "):"none";d.registerTool((0,f.defineTool)({name:"Agent",label:"Agent",description:`Delegate a focused task to a configured subagent. Each subagent runs as a full, inspectable Pi session. Use background mode for independent work and foreground mode when the result is needed immediately.
|
|
22
22
|
|
|
23
23
|
Available agent types:
|
|
24
|
-
${(g=i.filter(a=>a.enabled),0===g.length?"No subagent profiles are currently enabled.":g.map(a=>{let b=[`Tools: ${a.tools.length>0?a.tools.join(", "):"none"}`];return a.model&&b.push(`Model: ${a.model}`),`- ${a.name}: ${a.description} (${b.join("; ")})`}).join("\n"))}`,promptSnippet:"Delegate a focused task to an inspectable subagent session",promptGuidelines:["Use Agent for a focused task that benefits from an isolated context.","Use multiple background Agent calls in the same response for independent parallel work.","Do not duplicate work already delegated to a running subagent."],executionMode:"parallel",parameters:e.Type.Object({subagent_type:e.Type.Optional(e.Type.String({description:`Configured agent profile. Available types: ${m}. Default: general-purpose.`})),prompt:e.Type.String({description:"The complete task for the subagent."}),resume:e.Type.Optional(e.Type.String({description:"Existing subagent session ID to continue instead of creating a new session."})),input_files:e.Type.Optional(e.Type.Array(e.Type.String(),{description:"UTF-8 text files under the session cwd to include with the task.",maxItems:h.Wv})),description:e.Type.String({description:"Short activity label shown in the UI."}),run_in_background:e.Type.Optional(e.Type.Boolean({description:"Return immediately and notify this session when complete."})),model:e.Type.Optional(e.Type.String({description:"Optional provider/modelId override."})),thinking:e.Type.Optional(e.Type.String({description:"Optional thinking level override."})),max_turns:e.Type.Optional(e.Type.Number({description:"Optional positive agent turn limit."})),inherit_context:e.Type.Optional(e.Type.Boolean({description:"Include the parent session's active conversation context."})),isolation:e.Type.Optional(e.Type.String({description:"Run the subagent in an isolated git worktree."}))}),async execute(b,c,d,e,f){try{let g=c.resume?.trim(),h=g?await a.resume({parentContext:f,parentToolCallId:b,sessionId:g,task:c.prompt,description:c.description,...void 0!==c.run_in_background?{runInBackground:c.run_in_background}:{},signal:d,onUpdate:a=>e?.({content:[{type:"text",text:`${a.profile}: ${a.description} (${a.status})`}],details:j(a)})}):await a.start({parentContext:f,parentToolCallId:b,profile:c.subagent_type??"general-purpose",task:c.prompt,...c.input_files?{inputFiles:c.input_files}:{},description:c.description,...void 0!==c.run_in_background?{runInBackground:c.run_in_background}:{},...c.model?{model:c.model}:{},...c.thinking?{thinking:c.thinking}:{},...c.max_turns?{maxTurns:c.max_turns}:{},...void 0!==c.inherit_context?{inheritContext:c.inherit_context}:{},..."worktree"===c.isolation?{isolation:"worktree"}:{},signal:d,onUpdate:a=>e?.({content:[{type:"text",text:`${a.profile}: ${a.description} (${a.status})`}],details:j(a)})});if(h.run.runInBackground)return h.completion.then(b=>a.notifyParent(b)).catch(a=>{console.error("[pi-web] failed to deliver subagent completion:",a instanceof Error?a.message:a)}),{content:[{type:"text",text:`Subagent started in background. Session ID: ${h.run.sessionId}. You will be notified when it completes.`}],details:j(h.run)};let i=await h.completion;return{content:[{type:"text",text:k(i)}],details:j(i),..."failed"===i.status?{isError:!0}:{}}}catch(a){return{content:[{type:"text",text:a instanceof Error?a.message:String(a)}],details:void 0,isError:!0}}}})),d.registerTool((0,f.defineTool)({name:"get_subagent_result",label:"Get agent result",description:"Check an inspectable subagent session and retrieve its latest result.",parameters:e.Type.Object({agent_id:e.Type.String({description:"Subagent session ID."}),wait:e.Type.Optional(e.Type.Boolean({description:"Wait until the subagent finishes."}))}),async execute(b,c,d){let e=await a.get(c.agent_id);if(!e)return{content:[{type:"text",text:`Subagent not found: ${c.agent_id}`}],details:void 0,isError:!0};for(;c.wait&&("starting"===e.status||"running"===e.status);)if(await new Promise((a,b)=>{let c=()=>{clearTimeout(e),b(Error("Result wait aborted"))},e=setTimeout(()=>{d?.removeEventListener("abort",c),a()},500);d?.aborted?c():d?.addEventListener("abort",c,{once:!0})}),!(e=await a.get(c.agent_id)))return{content:[{type:"text",text:`Subagent not found: ${c.agent_id}`}],details:void 0,isError:!0};return e.runInBackground&&s.has(e.status)&&a.markResultConsumed(e.sessionId),{content:[{type:"text",text:k(e)}],details:j(e),..."failed"===e.status?{isError:!0}:{}}}})),d.registerTool((0,f.defineTool)({name:"steer_subagent",label:"Steer agent",description:"Send a steering message to a currently running subagent session.",parameters:e.Type.Object({agent_id:e.Type.String({description:"Subagent session ID."}),message:e.Type.String({description:"Instruction to inject after the current tool execution."})}),async execute(b,c){try{return await a.steer(c.agent_id,c.message),{content:[{type:"text",text:`Steering message sent to ${c.agent_id}.`}],details:void 0}}catch(a){return{content:[{type:"text",text:a instanceof Error?a.message:String(a)}],details:void 0,isError:!0}}}}))}}}function n(a){let b=a.extensions.find(a=>a.path===p);if(!b?.tools.has("Agent"))return a;let c=new Set(a.extensions.filter(a=>a.path!==p).filter(a=>{let b=(a.sourceInfo?.source??"").replace(/^npm:/,"").split("@")[0],c=a.path.replaceAll("\\","/").split("/");return b===r||c.some(a=>a===r)}).filter(a=>[...q].some(b=>a.tools.has(b))).map(a=>a.path));return 0===c.size?a:{...a,extensions:a.extensions.filter(a=>!c.has(a.path)),errors:a.errors.filter(a=>!c.has(a.path)&&(a.path!==p||![...c].some(b=>[...q].some(c=>a.error===`Tool "${c}" conflicts with ${b}`))))}}d()}catch(a){d(a)}})},53303:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{$9:()=>h,J1:()=>i});var e=c(75430),f=c(76760),g=a([e]);function h(a,b=process.platform){let c={...a};for(let a of Object.keys(c))(function(a,b){let c="win32"===b?a.toUpperCase():a;return"PORT"===c||"NODE_ENV"===c||c.startsWith("NEXT_")||"PI_WEB_PASSWORD"===c})(a,b)&&delete c[a];return c}function i(a={}){let{agentBinDir:b=(0,f.join)((0,e.getAgentDir)(),"bin"),baseEnvironment:c=process.env,localOperations:d=(0,e.createLocalBashOperations)({shellPath:a.shellPath}),platform:g=process.platform}=a;return{exec(a,e,f){var i;let j,k,l,m=(i=h(f.env??c,g),j="win32"===g?Object.keys(i).find(a=>"PATH"===a.toUpperCase())??"PATH":"PATH",k="win32"===g?";":":",(l=i[j]??"").split(k).filter(Boolean).includes(b)||(i[j]=[b,l].filter(Boolean).join(k)),i);return d.exec(a,e,{...f,env:m})}}}e=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},56429:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{$Z:()=>Y,A4:()=>S,Bp:()=>Z,C4:()=>V,Fn:()=>W,HG:()=>_,OF:()=>ah,Zo:()=>ab,_I:()=>T,d_:()=>aa,iP:()=>af,l8:()=>ad,mK:()=>O,oA:()=>U,wW:()=>ac,x8:()=>$});var e=c(75430),f=c(29862),g=c(55511),h=c(29021),i=c(33873),j=c(78970),k=c(43671),l=c(28967),m=c(18904),n=c(72498),o=c(40402),p=c(46753),q=c(7048),r=c(21560),s=c(5858),t=c(95412),u=c(12568),v=c(27367),w=c(305),x=c(78963),y=c(53303),z=c(30590),A=c(64735),B=c(36193),C=c(67264),D=c(36899),E=c(71212),F=c(71069),G=c(11301),H=c(4504),I=c(44271),J=a([e,f,m,n,o,p,q,u,v,w,x,y,A,G,I]);[e,f,m,n,o,p,q,u,v,w,x,y,A,G,I]=J.then?(await J)():J;let ai=new Set(["off","minimal","low","medium","high","xhigh","max"]),aj=new Set(["agent_start","message_start","message_update","message_end","agent_end","entry_appended","session_info_changed","queue_update","prompt_done","agent_settled","auto_compaction_end","compaction_end"]),ak=function(a=process.env.PI_WEB_IDLE_TIMEOUT_MS){let b=(a??"").trim();if(""===b)return 6e5;let c=Number(b);return!Number.isFinite(c)||c<0||!Number.isInteger(c)||c>0x7fffffff?(console.warn(`[pi-web] invalid PI_WEB_IDLE_TIMEOUT_MS "${a}", falling back to 600000ms`),6e5):c}(),al=new Set(["fork","clone"]),am=new Set(["get_state","abort","steer","follow_up_draft"]),an=["read","bash","powershell","edit","write","grep","find","ls"];class ao extends e.Theme{constructor(){super({muted:"",text:"",thinkingXhigh:"",searchMatchText:""},{selectedBg:""},"truecolor")}fg(...[,a]){return a}bg(...[,a]){return a}bold(a){return a}italic(a){return a}underline(a){return a}inverse(a){return a}strikethrough(a){return a}getFgAnsi(){return""}getBgAnsi(){return""}getThinkingBorderColor(){return a=>a}getBashModeBorderColor(){return a=>a}}let ap=new ao,aq=new f.KeybindingsManager(f.TUI_KEYBINDINGS);function K(a,b){if(0===b.length)return[];let c=new Set(an),d=(0,w.wQ)(b,a.settingsManager.getDefaultTools()),e=a.getAllTools().map(a=>a.name).filter(a=>!c.has(a));return(0,x.H4)([...new Set([...d,...e])],(0,x.t0)())}class ar{constructor(a,b=""){this.inner=a,this.listeners=[],this.activeToolEvents=new Map,this.pendingUiResponses=new Map,this.pendingUiRequests=new Map,this.activeCustomUis=new Map,this.extensionUiAbortController=new AbortController,this.extensionStatuses=new Map,this.extensionWidgets=new Map,this.promptRunning=!1,this.promptPhase=null,this.extensionsBound=!1,this.extensionBindingPromise=null,this.extensionBindingError=null,this.forceEmptySystemPrompt=!1,this.exactSystemPrompt=null,this.pendingPromptCount=0,this.activeMutatingCommands=0,this.agentRunNeedsCompletion=!1,this.promptAdmissionTail=Promise.resolve(),this.sessionReplacement=null,this.forceShutdownOnIdle=!1,this.unsubscribe=null,this.idleTimer=null,this.subscriberCount=0,this.disposeGraceTimer=null,this.lastActivityAt=Date.now(),this.queueMirror=[],this.queueRecovery=[],this.persistenceRevoked=!1,this.queueBootstrap=null,this.pendingQueueHints={steer:[],followUp:[]},this.queueMutationTail=Promise.resolve(),this.onDestroyCallback=null,this.shutdownPromise=null,this.sessionShutdownEmitted=!1,this._alive=!0,this.approvalPolicy=(0,B.ni)((0,A.lN)().permissionRules),this.approvalMode=(0,A.lN)().toolApprovalMode,this.pendingApprovals=new Map,this.approvalSeq=0,this.approvalHookInstalled=!1,this.goalEngine=new H.aA,this.goalTokensAccounted=0,this.goalToolCallsAccounted=0,this.goalContinuationInFlight=!1,this.goalContinuationPending=!1,this.goalDriveScheduled=!1,this.wrapperChatOnly=!1,this.wrapperSuppressNotifications=!1,this.cwd="string"==typeof b?b:"";const c="string"==typeof b?{}:b;c.onAgentRunComplete&&(this.onAgentRunComplete=c.onAgentRunComplete),c.suppressCompletionNotifications&&this.setSuppressCompletionNotifications(!0),c.chatOnly&&this.setChatOnly(!0),c.exactSystemPrompt&&(this.exactSystemPrompt=c.exactSystemPrompt(),this.applyExactSystemPrompt());const d=(0,A.lN)(a.sessionId);if(this.approvalMode=d.toolApprovalMode,this.approvalPolicy=(0,B.ni)(d.permissionRules),a.sessionFile){const b=(0,H.bo)(a.sessionFile);"idle"!==b.status&&this.goalEngine.hydrate(b)}}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}isAlive(){return this._alive}evictIfDiskAhead(){if(!this.isAlive()||this.isRunning())return!1;let a=(0,o.H6)(this.sessionFile);return!(!a||this.inner.sessionManager.getEntry(a)||this.isRunning())&&(this.destroy(),(0,o.mD)(),!0)}async waitUntilReady(){}isShuttingDown(){return null!==this.shutdownPromise}whenShutdown(){return this.shutdownPromise}isRunning(){return this._alive&&(this.pendingPromptCount>0||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)}runtimeSnapshot(){let a=this.inner.isStreaming,b=this.promptRunning,c=this.inner.isCompacting,d=this.inner.isBashRunning;return{id:this.sessionId,running:this.isRunning(),isStreaming:a,isPromptRunning:b,isCompacting:c,isBashRunning:d,phase:d?"running_command":this.promptPhase??(a||b||c?"waiting_model":null)}}setChatOnly(a){this.wrapperChatOnly=a}setSuppressCompletionNotifications(a){this.wrapperSuppressNotifications=a}isChatOnly(){return this.wrapperChatOnly}hasSuppressedCompletionNotifications(){return this.wrapperSuppressNotifications}start(){this.installApprovalHook(),this.goalEngine.setOnChanged(a=>{this.sessionFile&&!this.persistenceRevoked&&(0,H.eG)(this.sessionFile,a),this.emit({type:"goal_state_changed",goalState:a}),af("goal_state_changed",this.sessionId,{type:"goal_state_changed",goalState:a})}),this.goalEngine.isRunning()&&(this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()),this.unsubscribe=this.inner.subscribe(a=>{("agent_end"===a.type||"message_end"===a.type||"entry_appended"===a.type||"session_info_changed"===a.type)&&(0,o.mD)(),("agent_end"===a.type||"agent_settled"===a.type||"auto_compaction_end"===a.type||"compaction_end"===a.type)&&this.resetIdleTimer(),"agent_start"===a.type&&(this.goalEngine.onAgentStart(),this.agentRunNeedsCompletion=!0),"agent_settled"===a.type&&(this.handleGoalSettled(),this.notifyAgentRunCompleteIfIdle()),"queue_update"===a.type&&this.reconcileQueue(a.steering,a.followUp),aj.has(a.type)&&af(a.type,this.sessionId,a);let b=a.toolCallId;"string"==typeof b&&("tool_execution_start"===a.type||"tool_execution_update"===a.type?this.activeToolEvents.set(b,a):"tool_execution_end"===a.type&&this.activeToolEvents.delete(b)),this.emit(a),X()}),this.resetIdleTimer()}loadQueueRecovery(){if(!this.sessionFile)return;let a=this.inner.getSteeringMessages(),b=this.inner.getFollowUpMessages();if(a.length||b.length){this.queueRecovery=[],this.reconcileQueue([...a],[...b]);return}this.queueRecovery=(0,k.ov)(this.sessionFile)}getGoalState(){return this.goalEngine.getState()}handleGoalSettled(){if(!this.goalEngine.isRunning()){this.goalEngine.disarmContinuation(),this.goalContinuationPending=!1;return}let a=this.inner.getLastAssistantText()??"",b=this.currentSessionUsageTotal(),c=Math.max(0,b-this.goalTokensAccounted);this.goalTokensAccounted=b;let d=this.currentSessionToolCallTotal(),e=Math.max(0,d-this.goalToolCallsAccounted);this.goalToolCallsAccounted=d;let{verdict:f}=this.goalEngine.settleTurn(a,c,e);if("continue"!==f.action){this.goalEngine.disarmContinuation(),this.goalContinuationPending=!1;return}this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()}maybeDriveGoalContinuation(){if(this.goalContinuationPending&&!this.goalDriveScheduled){if(!this.goalEngine.isRunning()){this.goalContinuationPending=!1;return}this.goalDriveScheduled=!0,setTimeout(()=>{this.goalDriveScheduled=!1,this.tryDriveGoalContinuation()},0)}}cancelGoalContinuation(){this.goalContinuationPending=!1,this.goalEngine.disarmContinuation()}tryDriveGoalContinuation(){let a=M(this.sessionId);if(!this._alive||this.isShuttingDown()||a.deleted||a.barriers>0)return void this.cancelGoalContinuation();if(this.goalContinuationPending){if(!this.goalEngine.isRunning()){this.goalContinuationPending=!1;return}this.goalContinuationInFlight||this.promptRunning||this.inner.isStreaming||this.inner.isBashRunning||(this.goalContinuationPending=!1,this.driveGoalContinuation())}}driveGoalContinuation(){if(!this.goalEngine.isRunning()||this.goalContinuationInFlight)return;this.goalContinuationInFlight=!0,this.promptRunning=!0,this.promptPhase="waiting_model",this.resetIdleTimer(),X();let a=()=>{this.promptRunning=!1,this.promptPhase=null,this.resetIdleTimer(),X()};this.acquirePromptAdmission().then(async b=>{try{if(!this.goalEngine.isRunning())return void a();let b=this.goalEngine.getState().goalText;if(!this._alive||this.isShuttingDown()||!b)return void a();N(this.sessionId),await this.inner.prompt((0,H.bx)(b),{source:"rpc",preflightResult:a=>{if(a){if(!this._alive||this.isShuttingDown()||!this.goalEngine.isRunning())throw new DOMException("Goal continuation cancelled","AbortError");N(this.sessionId)}}}),a(),this.emit({type:"prompt_done"}),this.maybeDriveGoalContinuation()}catch(b){a(),this.emit({type:"prompt_error",errorMessage:b instanceof Error?b.message:String(b)})}finally{b(),this.goalContinuationInFlight=!1}})}handleGoalStartCommand(a,b){let c=this.goalEngine.start(a,b);return this.goalTokensAccounted=this.currentSessionUsageTotal(),this.goalToolCallsAccounted=this.currentSessionToolCallTotal(),c}handleGoalStopCommand(){return this.goalEngine.stop(),this.goalTokensAccounted=0,this.goalToolCallsAccounted=0,this.goalEngine.getState()}currentSessionUsageTotal(){try{return function(a){let b=0;for(let c of a){let a=c?.message;if(!a||"assistant"!==a.role)continue;let d=a.usage;d&&(b+=(d.input??0)+(d.output??0)+(d.cacheRead??0)+(d.cacheWrite??0))}return b}(this.inner.sessionManager.getEntries())}catch{return 0}}currentSessionToolCallTotal(){try{return function(a){let b=0;for(let c of a){let a=c?.message;if(!a||"assistant"!==a.role)continue;let d=a.content;if(Array.isArray(d))for(let a of d)a&&"object"==typeof a&&"toolCall"===a.type&&(b+=1)}return b}(this.inner.sessionManager.getEntries())}catch{return 0}}setApprovalMode(a){this.approvalMode=a}setApprovalPolicy(a){this.approvalPolicy=a}installApprovalHook(){if(this.approvalHookInstalled||!this.inner.agent?.beforeToolCall)return;this.approvalHookInstalled=!0;let a=this.inner.agent.beforeToolCall;this.inner.agent.beforeToolCall=async b=>{let c=b.toolCall?.name??"",d=b.args,e=(0,B.LD)(this.approvalPolicy,c,{mode:this.approvalMode,readOnly:C.MJ.has(c.toLowerCase()),args:d});if("deny"===e)return{block:!0,reason:`Denied by policy rule: ${c} is not permitted.`};if("ask"===e){let a=await this.askForApproval(c,d);if(!a.approve)return{block:!0,reason:a.reason||`Rejected by user: ${c}`}}return a?a(b):void 0}}askForApproval(a,b){return new Promise(c=>{let d=`approval-${++this.approvalSeq}`,e=setTimeout(()=>{this.pendingApprovals.delete(d),this.emit({type:"tool_approval_resolved",id:d,approve:!1,reason:`Approval request timed out after 120s: ${a}`}),c({approve:!1,reason:`Approval request timed out after 120s: ${a}`})},12e4);this.pendingApprovals.set(d,{resolve:c,timer:e,toolName:a}),this.emit({type:"tool_approval_request",id:d,toolName:a,args:function(a){if(null===a||"object"!=typeof a)return a;let b={};for(let[c,d]of Object.entries(a))if(null!=d&&"content"!==c&&"data"!==c&&"newString"!==c&&"oldString"!==c){if("string"==typeof d){b[c]=d.length>200?`${d.slice(0,200)}…`:d;continue}if("number"==typeof d||"boolean"==typeof d){b[c]=d;continue}b[c]=Array.isArray(d)?`[array:${d.length}]`:"[object]"}return b}(b)})})}resolveApproval(a,b,c){let d=this.pendingApprovals.get(a);return!!d&&(this.pendingApprovals.delete(a),clearTimeout(d.timer),d.resolve({approve:b,reason:c}),!0)}rejectAllApprovals(a){for(let[b,c]of this.pendingApprovals)this.pendingApprovals.delete(b),clearTimeout(c.timer),c.resolve({approve:!1,reason:a})}getPendingApprovals(){return Array.from(this.pendingApprovals.entries()).map(([a,b])=>({id:a,toolName:b.toolName}))}pendingRecoveryView(){return this.queueRecovery.map(({id:a,kind:b,text:c,images:d,queuedAt:e})=>({id:a,kind:b,text:c,hasImages:!!d?.length,queuedAt:e}))}persistQueue(){if(!this.sessionFile||this.persistenceRevoked)return;let a=[...this.queueRecovery,...this.queueBootstrap?.entries??[],...this.queueMirror];a.length?(0,k.pj)(this.sessionFile,a):(0,k.wx)(this.sessionFile)}hintQueueImages(a,b){this.pendingQueueHints[a].push(b?.length?b:[])}reconcileQueue(a,b){let c=(a,b)=>{if(!b)return this.queueMirror.filter(b=>b.kind===a);let c=new Set;return b.map(b=>{let d=this.queueMirror.find(d=>d.kind===a&&d.text===b&&!c.has(d));if(d)return c.add(d),d;let e=(0,k.Gc)(a,b,this.pendingQueueHints[a].shift());return c.add(e),e})};this.queueMirror=[...c("steer",a),...c("followUp",b)],this.persistQueue()}validateImagesSupportedByCurrentModel(){let a=this.inner.model;return!a?.id||Array.isArray(a.input)&&a.input.includes("image")?null:`Model "${a.id}" does not accept image input. Switch to a model with image support.`}async requeueEntry(a){let b=(0,j.kc)(a.images);if(b)throw Error(b);if(a.images?.length){let a=this.validateImagesSupportedByCurrentModel();if(a)throw Error(a)}this.hintQueueImages(a.kind,a.images),"steer"===a.kind?await this.inner.steer(a.text,a.images):await this.inner.followUp(a.text,a.images)}ensureMirrored(a){this.queueMirror.find(b=>b.kind===a.kind&&b.text===a.text)||(this.queueMirror.push({...a}),this.pendingQueueHints[a.kind].pop())}async replaceLiveQueue(a,b){for(let b of(this.inner.clearQueue(),this.pendingQueueHints={steer:[],followUp:[]},a))await this.requeueEntry(b);for(let a of b)await this.requeueEntry(a);let c={steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]};return this.reconcileQueue(c.steering,c.followUp),c}async withQueueMutation(a){let b,c=this.queueMutationTail;this.queueMutationTail=new Promise(a=>{b=a}),await c;try{if(!this._alive||this.isShuttingDown())throw Error("Session is shutting down");return N(this.sessionId),await a()}finally{b()}}async mutateLiveQueue(a,b){return this.withQueueMutation(async()=>{let c=this.queueMirror.filter(a=>"steer"===a.kind),d=this.queueMirror.filter(a=>"followUp"===a.kind),e=b("steer"===a?c:d),f=await this.replaceLiveQueue(c,d);return{value:e,queues:f}})}validateQueueEntries(a){for(let b of a){if("steer"!==b.kind&&"followUp"!==b.kind||"string"!=typeof b.text)continue;let a=(0,j.kc)(b.images);if(a)throw Error(a)}}runAgentContinue(){if(!this._alive||this.isShuttingDown()||this.queueBootstrap||this.isRunning()||this.promptRunning)return;let a=[...this.queueMirror];if(0===a.length)return;let b={entries:a,cancelled:!1};this.queueBootstrap=b,this.queueMirror=[],this.persistQueue(),this.inner.clearQueue(),this.pendingQueueHints={steer:[],followUp:[]},this.pendingPromptCount+=1,this.promptRunning=!0,this.promptPhase="waiting_model",X(),this.bootstrapQueuedRun(b)}cancelQueuedRun(){let a=this.queueBootstrap;a&&(a.cancelled=!0,this.queueRecovery.push(...a.entries),a.entries=[],this.persistQueue())}async bootstrapQueuedRun(a){try{for(let b of[...a.entries]){let c,d,e=await this.acquirePromptAdmission();try{let f,g;if(a.cancelled||!this._alive||this.isShuttingDown()||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)break;N(this.sessionId),this.extensionUiAbortController.signal.aborted&&(this.extensionUiAbortController=new AbortController);let h=!1,i=()=>{h=!0,e()},j=!1,k=this.inner.sessionManager,l=k.appendMessage,m=function(c){let d=l.call(this,c);return c===f&&(g=d),!j&&g&&k.isPersisted()&&k.flushed&&(j=!0,a.entries=a.entries.filter(a=>a.id!==b.id),n()),d},n=()=>{this.queueRecovery=this.queueRecovery.filter(a=>a.id!==b.id),this.persistQueue()};k.appendMessage=m,d=()=>{k.appendMessage===m&&(k.appendMessage=l)},c=this.inner.subscribe(b=>{"message_start"!==b.type&&"message_end"!==b.type||"user"!==b.message.role||f||!h&&a.cancelled||(f=b.message,i(),c?.(),c=void 0)}),await this.inner.prompt(b.text,{...b.images?.length?{images:b.images}:{},source:"rpc",preflightResult:b=>{if(b){if(a.cancelled||!this._alive||this.isShuttingDown())throw new DOMException("Queued run cancelled","AbortError");N(this.sessionId),this.applyExactSystemPrompt(),i()}}})}finally{c?.(),d?.(),e()}}}catch(b){!a.cancelled&&this._alive&&((0,o.mD)(),this.emit({type:"prompt_error",errorMessage:b instanceof Error?b.message:String(b)}))}finally{this.queueRecovery.push(...a.entries),a.entries=[],this.queueBootstrap===a&&(this.queueBootstrap=null),this.persistQueue(),this.pendingPromptCount=Math.max(0,this.pendingPromptCount-1),this.promptRunning=this.pendingPromptCount>0,this.promptRunning||(this.promptPhase=null),this.resetIdleTimer(),X(),this._alive&&this.emit({type:"prompt_done"})}}setForceEmptySystemPrompt(a){this.forceEmptySystemPrompt=a,this.applyForcedEmptySystemPrompt()}setExactSystemPrompt(a){this.exactSystemPrompt=a,this.applyExactSystemPrompt()}beginExtensionBinding(a={}){this.ensureExtensionsBound(a).catch(a=>{console.error("[pi-web] failed to dispatch session_start to extensions:",a instanceof Error?a.message:a)})}ensureExtensionsBound(a={}){return(a.forceEmptySystemPrompt&&(this.forceEmptySystemPrompt=!0),this.extensionsBound)?(this.applyExactSystemPrompt(),Promise.resolve()):(this.extensionBindingPromise||(this.extensionBindingError=null,this.extensionBindingPromise=(async()=>{if(!this._alive)return;let a=this.createExtensionUiContext();if("function"==typeof this.inner.bindExtensions){let b=this.inner.bindExtensions;await b.call(this.inner,{uiContext:a,mode:"rpc",commandContextActions:this.createExtensionCommandContextActions(),shutdownHandler:()=>this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",notifyType:"warning",message:"Extension requested shutdown, but shutdown is not supported in pi-web."}),onError:a=>this.emit({type:"extension_error",extensionPath:a.extensionPath,event:a.event,error:a.error})})}else this.inner.extensionRunner.setUIContext?.(a,"rpc");this.extensionsBound=!0,this.applyExactSystemPrompt(),console.log(`[pi-web] session_start dispatched to extensions for session ${this.inner.sessionId}`)})().catch(a=>{throw this.extensionBindingError=a,a})),this.extensionBindingPromise)}static{this.EXTENSION_BIND_TIMEOUT_MS=15e3}async waitForExtensionsBound(){let a=this.extensionBindingPromise;if(a)try{let b=new Promise((b,c)=>{let d=setTimeout(()=>c(Error("Extension binding timed out; continuing without waiting")),ar.EXTENSION_BIND_TIMEOUT_MS);a.finally(()=>clearTimeout(d))});await Promise.race([a,b])}catch{}this.extensionBindingError&&console.warn("[pi-web] extension binding failed, continuing:",this.extensionBindingError)}shouldWaitForExtensions(a){return"prompt"===a||"steer"===a||"follow_up"===a||"get_commands"===a||"get_state"===a}applyForcedEmptySystemPrompt(){}applyExactSystemPrompt(){}emit(a){for(let b of this.listeners)try{b(a)}catch(a){console.error(`[pi-web] session ${this.sessionId} event listener threw:`,a instanceof Error?a.message:a)}}setActiveToolSelection(a){this.inner.setActiveToolsByName(K(this.inner,a)),this.applyExactSystemPrompt()}async acquirePromptAdmission(){let a,b=this.promptAdmissionTail;return this.promptAdmissionTail=new Promise(b=>{a=b}),await b,a}notifyAgentRunCompleteIfIdle(){if(!(!this.agentRunNeedsCompletion||this.isRunning())&&(this.agentRunNeedsCompletion=!1,!this.wrapperSuppressNotifications))try{this.onAgentRunComplete?.(this.sessionId)}catch(a){console.error("[pi-web] completion listener failed:",a instanceof Error?a.message:a)}}resetIdleTimer(){this.idleTimer&&clearTimeout(this.idleTimer),this._alive&&0!==ak&&(this.isRunning()||(this.forceShutdownOnIdle=!1),this.idleTimer=setTimeout(()=>{!this.forceShutdownOnIdle&&(this.isRunning()||(0,t.Vj)({sessionId:this.sessionId,sessionFile:this.sessionFile||void 0}))?this.resetIdleTimer():this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down idle session:",a instanceof Error?a.message:a)})},ak))}touch(){this.lastActivityAt=Date.now(),this.cancelPendingDispose()}hasSubscribers(){return this.subscriberCount>0}get activityTimestamp(){return this.lastActivityAt}cancelPendingDispose(){this.disposeGraceTimer&&(clearTimeout(this.disposeGraceTimer),this.disposeGraceTimer=null)}scheduleDisposeIfIdle(){this.cancelPendingDispose(),!(this.subscriberCount>0||this.isRunning())&&this._alive&&(this.disposeGraceTimer=setTimeout(()=>{this.disposeGraceTimer=null,!(this.subscriberCount>0||this.isRunning())&&this._alive&&this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down unwatched session:",a instanceof Error?a.message:a)})},6e4))}persistSessionFileIfMissing(){if(this.persistenceRevoked||!this._alive)return;let a=this.inner.sessionManager,b=a.getSessionFile();if(!b||(0,h.existsSync)(b))return;let c=a.getHeader();if(!c)return;let d=[c,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";try{(0,h.writeFileSync)(b,d,{encoding:"utf8",flag:"wx"})}catch(c){if("EEXIST"===c.code||(0,h.existsSync)(b)){a.flushed=!0,(0,o.O8)(this.inner.sessionId,b);return}throw c}a.flushed=!0,(0,o.O8)(this.inner.sessionId,b)}onEvent(a){for(let b of(this.listeners.push(a),this.subscriberCount+=1,this.cancelPendingDispose(),this.pendingUiRequests.values()))a(b);for(let b of this.activeToolEvents.values())a(b);return()=>{queueMicrotask(()=>{let b=this.listeners.indexOf(a);-1!==b&&this.listeners.splice(b,1)}),this.subscriberCount>0&&(this.subscriberCount-=1),this.scheduleDisposeIfIdle()}}onDestroy(a){this.onDestroyCallback=a}async withSessionReplacement(a,b){if(this.sessionReplacement)throw Error("Session is already being copied");this.sessionReplacement=a;try{return await b()}finally{this._alive&&(this.sessionReplacement=null)}}isSessionRunningForReplacement(){return this.inner.isBashRunning||this.inner.isStreaming||this.inner.isCompacting||this.pendingPromptCount>0}async shutdownAfterSessionReplacement(a){try{await this.shutdown()}catch(b){console.error(`[pi-web] ${a} succeeded, but source session shutdown failed:`,b instanceof Error?b.message:b)}}async send(a){if(!this._alive)throw Error("Session is shutting down");N(this.sessionId),this.touch();let b=a.type;if(b.startsWith("get_")||"export_queue"===b||this.resetIdleTimer(),"prompt"===b||"steer"===b||"follow_up"===b||"requeue_at"===b){let b=(0,j.kc)(a.images);if(b)throw Error(b);if(Array.isArray(a.images)&&a.images.length>0){let a=this.validateImagesSupportedByCurrentModel();if(a)throw Error(a)}}let c=am.has(b);if(this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if(al.has(b)&&this.activeMutatingCommands>0)throw Error(`Cannot ${b} while another session command is running`);this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound();let d=!c;d&&(this.activeMutatingCommands+=1);try{if(!this._alive||this.isShuttingDown())throw Error("Session is shutting down");if(N(this.sessionId),this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if("prompt"===b||"steer"===b||"follow_up"===b){let b=(0,j.kc)(a.images);if(b)throw Error(b)}switch(b){case"prompt":{let b=await this.acquirePromptAdmission();try{let b,c,d;if(!this._alive||this.isShuttingDown())throw Error("Session is shutting down");if(N(this.sessionId),this.inner.isBashRunning)throw Error("Cannot send a prompt while a shell command is running");this.extensionUiAbortController.signal.aborted&&(this.extensionUiAbortController=new AbortController);let e=a.images,f=a.streamingBehavior;f&&this.inner.isStreaming&&this.hintQueueImages("followUp"===f?"followUp":"steer",e);let g=!1,h=!1,i=!1,j=new Promise((a,d)=>{b=()=>{g=!0,this.agentRunNeedsCompletion=!0,h||(h=!0,a())},c=a=>{h||(h=!0,d(a))}}),k=()=>{i||(i=!0,this.pendingPromptCount=Math.max(0,this.pendingPromptCount-1),this.resetIdleTimer(),this.notifyAgentRunCompleteIfIdle())};this.pendingPromptCount+=1,this.promptRunning=!0,this.promptPhase=String(a.message??"").trimStart().startsWith("/")?"running_command":"waiting_model",X();try{d=this.inner.prompt(a.message,{...e?.length?{images:e}:{},...f?{streamingBehavior:f}:{},source:"rpc",preflightResult:a=>{if(a){if(!this._alive||this.isShuttingDown())throw Error("Session is shutting down");N(this.sessionId),this.applyExactSystemPrompt(),b()}}})}catch(a){throw k(),a}return d.then(()=>{b(),k(),this.promptRunning=!1,this.promptPhase=null,f||this.emit({type:"prompt_done"}),X(),this.maybeDriveGoalContinuation()},a=>{c(a),k(),this.promptRunning=!1,this.promptPhase=null,(0,o.mD)(),g&&(this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),f||this.emit({type:"prompt_done"})),X(),this.maybeDriveGoalContinuation()}).catch(a=>{console.error("[pi-web] prompt completion handler failed:",a instanceof Error?a.message:a)}),await j,null}finally{b()}}case"abort":this.cancelQueuedRun(),this.cancelGoalContinuation(),this.forceShutdownOnIdle=!0,this.extensionUiAbortController.abort(new DOMException("Extension UI cancelled by Stop","AbortError"));try{await this.inner.abort()}finally{this.resetIdleTimer(),this.isRunning()||(this.forceShutdownOnIdle=!1)}return null;case"get_state":{let a=this.inner.model,b=this.inner.getContextUsage();return{sessionId:this.inner.sessionId,sessionFile:this.inner.sessionFile??"",isStreaming:this.inner.isStreaming,isPromptRunning:this.pendingPromptCount>0,isBashRunning:this.inner.isBashRunning,isCompacting:this.inner.isCompacting,phase:this.runtimeSnapshot().phase,model:a?{id:a.id,provider:a.provider}:void 0,messageCount:0,pendingMessageCount:this.inner.pendingMessageCount,queuedMessages:{steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]},pendingRecovery:this.pendingRecoveryView(),contextUsage:b?{percent:b.percent,contextWindow:b.contextWindow,tokens:b.tokens}:null,systemPrompt:this.exactSystemPrompt??this.inner.agent.state?.systemPrompt??"",thinkingLevel:this.inner.agent.state?.thinkingLevel??"off",extensionStatuses:this.getExtensionStatuses(),extensionWidgets:this.getExtensionWidgets(),goalState:this.goalEngine.getState()}}case"goal_start":{let b=String(a.goalText??"").trim();if(!b)throw Error("goal_start requires a non-empty goalText");let c=a.tokenBudget,d="number"==typeof c&&Number.isFinite(c)&&c>0?Math.floor(c):null,e=this.handleGoalStartCommand(b,d);return this.goalContinuationPending=!0,this.maybeDriveGoalContinuation(),{goalState:e}}case"goal_pause":return this.cancelGoalContinuation(),{goalState:this.goalEngine.pause()};case"goal_resume":{let a=this.goalEngine.resume();return"running"===a.status&&(this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()),{goalState:a}}case"goal_stop":return this.cancelGoalContinuation(),{goalState:this.handleGoalStopCommand()};case"goal_edit":{let b=String(a.goalText??"").trim();if(!b)throw Error("goal_edit requires a non-empty goalText");let c=this.goalEngine.edit(b);return"running"===c.status&&(this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()),{goalState:c}}case"get_goal_state":return{goalState:this.goalEngine.getState()};case"set_model":{let{provider:b,modelId:c}=a,d=this.inner.modelRuntime.getModel(b,c);if(!d)try{await this.inner.modelRuntime.refresh({allowNetwork:!1}),d=this.inner.modelRuntime.getModel(b,c)}catch{d=void 0}if(!d)throw Error(`Model not found: ${b}/${c}`);return await this.inner.setModel(d),(0,l.k)(),(0,o.mD)(),{id:d.id,provider:d.provider}}case"fork":if(this.isSessionRunningForReplacement())throw Error("Cannot fork while the session is running");return this.withSessionReplacement("fork",async()=>{let b,c,d=a.entryId,f=this.inner.sessionManager,g=this.inner.sessionFile;if(!f.isPersisted())return{cancelled:!0};if(!g)throw Error("Persisted session is missing a session file");let i=f.getEntry(d);if(!i)throw Error("Invalid entry ID for forking");let j=f.getSessionDir();if(i.parentId){let a=(c=e.SessionManager.open(g,j)).createBranchedSession(i.parentId);if(!a)throw Error("Failed to create forked session");b=a}else b=(c=e.SessionManager.create(f.getCwd(),j,{parentSession:g})).getSessionFile();if(!(0,h.existsSync)(b)){let a=c.getHeader();if(!a)throw Error("Forked session is missing a session header");let d=[a,...c.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,h.writeFileSync)(b,d,{encoding:"utf8",flag:"wx"})}let k=c.getSessionId();return(0,o.O8)(k,b),(0,o.mD)(),await this.shutdownAfterSessionReplacement("fork"),{cancelled:!1,newSessionId:k}});case"fork_branch":{if(this.isSessionRunningForReplacement())throw Error("Cannot fork while the session is running");let b=a.entryId,c=this.inner.sessionManager,d=this.inner.sessionFile;if(!c.isPersisted())return{cancelled:!0};if(!d)throw Error("Persisted session is missing a session file");if(!c.getEntry(b))throw Error("Invalid entry ID for forking");let f=c.getSessionDir(),g=e.SessionManager.open(d,f).createBranchedSession(b);if(!g)throw Error("Failed to create forked session");let h=e.SessionManager.open(g,f).getSessionId();return(0,o.O8)(h,g),(0,o.mD)(),{cancelled:!1,newSessionId:h}}case"clone":{if(this.isSessionRunningForReplacement())throw Error("Cannot clone while the session is running");let b=this.inner.sessionManager,c=this.inner.sessionFile,d="string"==typeof a.leafId?a.leafId:b.getLeafId(),f=d&&b.getBranch(d).some(a=>"message"===a.type&&"assistant"===a.message.role);if(!b.isPersisted()||!d||!f||!c||!(0,h.existsSync)(c))return{cancelled:!0};return this.withSessionReplacement("clone",async()=>{let a=b.getSessionDir(),f=e.SessionManager.open(c,a).createBranchedSession(d);if(!f||!(0,h.existsSync)(f))throw Error("Failed to clone current session branch");let g=e.SessionManager.open(f,a).getSessionId();return(0,o.O8)(g,f),(0,o.mD)(),await this.shutdownAfterSessionReplacement("clone"),{cancelled:!1,newSessionId:g}})}case"navigate_tree":return{cancelled:(await this.inner.navigateTree(a.targetId,{})).cancelled};case"set_thinking_level":{let b=a.level;return this.inner.setThinkingLevel(b),"xhigh"===b&&this.inner.model?.compat?.thinkingFormat==="deepseek"&&this.inner.agent?.state&&(this.inner.agent.state.thinkingLevel="xhigh"),(0,o.mD)(),null}case"compact":try{return await this.inner.compact(a.customInstructions)}finally{(0,o.mD)()}case"set_session_name":{let b=a.name?.trim();if(!b)throw Error("Session name cannot be empty");return this.inner.setSessionName(b),(0,o.mD)(),null}case"get_session_stats":return{...this.inner.getSessionStats(),sessionName:this.inner.sessionManager.getSessionName()};case"get_last_assistant_text":return{text:this.inner.getLastAssistantText()??""};case"clear_queue":return this.withQueueMutation(async()=>(this.queueMirror=[],this.pendingQueueHints={steer:[],followUp:[]},this.persistQueue(),this.inner.clearQueue()));case"move_queue":{let b=a.kind,c=Number(a.fromIndex),d=Number(a.toIndex);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c)||!Number.isInteger(d))throw Error("move_queue requires a queue kind and integer indexes");let{queues:e}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length||d<0||d>=a.length)throw Error("move_queue index out of range");let[b]=a.splice(c,1);a.splice(d,0,b)});return e}case"recall_queue_item":{let b=a.kind,c=Number(a.index);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c))throw Error("recall_queue_item requires a queue kind and integer index");let{value:d,queues:e}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length)throw Error("recall_queue_item index out of range");let[b]=a.splice(c,1);return b});return{entry:{text:d.text,images:d.images??[]},...e}}case"requeue_at":{let b=a.kind,c=Number(a.index),d=a.text;if("steer"!==b&&"followUp"!==b||!Number.isInteger(c)||!d?.trim())throw Error("requeue_at requires a queue kind, integer index, and text");let e=a.images,{queues:f}=await this.mutateLiveQueue(b,a=>{if(c<0||c>a.length)throw Error("requeue_at index out of range");a.splice(c,0,(0,k.Gc)(b,d,e))});return f}case"remove_queue_item":{let b=a.kind,c=Number(a.index);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c))throw Error("remove_queue_item requires a queue kind and integer index");let{queues:d}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length)throw Error("remove_queue_item index out of range");a.splice(c,1)});return d}case"resolve_recovery":return this.withQueueMutation(async()=>{let b=new Set(a.keep??[]),c=new Set(a.discard??[]),d=!0===a.continueRun,e=0;for(let a of this.queueRecovery)b.has(a.id)&&(await this.requeueEntry(a),this.ensureMirrored(a),e+=1);return this.queueRecovery=this.queueRecovery.filter(a=>!b.has(a.id)&&!c.has(a.id)),this.persistQueue(),d&&e>0&&this.runAgentContinue(),{remaining:this.pendingRecoveryView(),kept:e}});case"export_queue":return{live:this.queueMirror.map(a=>({...a})),recovery:this.queueRecovery.map(a=>({...a}))};case"import_queue":return this.withQueueMutation(async()=>{let b=a.entries;if(!Array.isArray(b))throw Error("import_queue requires entries[]");this.validateQueueEntries(b);let c=0;for(let a of b){if("steer"!==a.kind&&"followUp"!==a.kind||"string"!=typeof a.text)continue;let b=(0,k.Gc)(a.kind,a.text,a.images);await this.requeueEntry(b),this.ensureMirrored(b),c+=1}return this.persistQueue(),{imported:c,steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]}});case"stage_recovery":return this.withQueueMutation(async()=>{let b=a.entries;if(!Array.isArray(b))throw Error("stage_recovery requires entries[]");this.validateQueueEntries(b);let c=0;for(let a of b)("steer"===a.kind||"followUp"===a.kind)&&"string"==typeof a.text&&(this.queueRecovery.push((0,k.Gc)(a.kind,a.text,a.images)),c+=1);return this.persistQueue(),{staged:c,pendingRecovery:this.pendingRecoveryView()}});case"steer":return this.withQueueMutation(async()=>{let b=a.images;this.hintQueueImages("steer",b),this.promptPhase="waiting_model",X();try{await this.inner.steer(a.message,b?.length?b:void 0)}finally{this.promptPhase=null,X()}return null});case"follow_up":return this.withQueueMutation(async()=>{let b=a.images;this.hintQueueImages("followUp",b),this.promptPhase="waiting_model",X();try{await this.inner.followUp(a.message,b?.length?b:void 0)}finally{this.promptPhase=null,X()}return null});case"get_tools":{let a=this.inner.getAllTools(),b=new Set(this.inner.getActiveToolNames());return a.map(a=>({...a,active:b.has(a.name)}))}case"get_commands":{let a=[];for(let b of this.inner.extensionRunner.getRegisteredCommands())a.push({name:b.invocationName,description:b.description,source:"extension",sourceInfo:b.sourceInfo});for(let b of this.inner.promptTemplates)a.push({name:b.name,description:b.description,source:"prompt",sourceInfo:b.sourceInfo});for(let b of this.inner.resourceLoader.getSkills().skills)a.push({name:`skill:${b.name}`,description:b.description,source:"skill",sourceInfo:b.sourceInfo});return{commands:a}}case"set_tools":{let b=a.toolNames;return this.setActiveToolSelection(b),null}case"reload":{let a=this.inner.getActiveToolNames();return await this.waitForExtensionsBound(),this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.syncProjectTrust(),await this.inner.reload(),this.inner.setActiveToolsByName(K(this.inner,a)),"function"!=typeof this.inner.bindExtensions&&this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc"),this.applyForcedEmptySystemPrompt(),{success:!0}}case"abort_compaction":return this.inner.abortCompaction(),null;case"resolve_approval":return{resolved:this.resolveApproval(a.id,!!a.approve,a.reason)};case"set_approval_mode":{let b=a.mode;if("ask"!==b&&"auto"!==b&&"yolo"!==b)throw Error(`Invalid approval mode: ${String(b)}`);return this.setApprovalMode(b),null}case"set_approval_policy":{let b=a.policy;return this.setApprovalPolicy((0,B.ni)(b)),null}case"get_approval_state":return{mode:this.approvalMode,pending:this.getPendingApprovals()};case"extension_ui_response":return this.resolveExtensionUiResponse(a),null;case"extension_ui_input":return this.handleExtensionUiInput(a.id,a.data),null;case"set_auto_retry":return this.inner.setAutoRetryEnabled?.(a.enabled),null;case"bash":{if(this.promptRunning||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)throw Error("Cannot run a shell command while the session is busy");let b=this.inner.settingsManager?.getShellPath?.(),c=(0,y.J1)("string"==typeof b&&b?{shellPath:b}:{}),d=this.inner.executeBash(a.command,void 0,{excludeFromContext:a.excludeFromContext,operations:c});try{let a=await d;return this.persistSessionFileIfMissing(),a}finally{this.resetIdleTimer(),(0,o.mD)()}}case"abort_bash":return this.forceShutdownOnIdle=!0,this.inner.abortBash(),X(),null;default:throw Error(`Unsupported command: ${b}`)}}finally{d&&(this.activeMutatingCommands=Math.max(0,this.activeMutatingCommands-1))}}destroy(){if(!this._alive)return;for(let a of(this._alive=!1,this.cancelQueuedRun(),this.cancelGoalContinuation(),this.idleTimer&&clearTimeout(this.idleTimer),this.cancelPendingDispose(),this.inner.isBashRunning&&this.inner.abortBash(),this.unsubscribe?.(),this.emit({type:"session_shutdown"}),this.sessionFile&&!this.persistenceRevoked&&this.goalEngine.hasActiveGoal()&&(0,H.eG)(this.sessionFile,this.goalEngine.getState()),this.pendingUiResponses.values()))a.cancel();for(let a of Array.from(this.activeCustomUis.keys()))this.closeCustomUi(a,void 0);this.pendingUiResponses.clear(),this.pendingUiRequests.clear(),this.activeToolEvents.clear(),this.rejectAllApprovals("Session closed while approval was pending");let a=()=>{try{this.inner.dispose()}finally{try{this.onDestroyCallback?.()}finally{X()}}};if(this.sessionShutdownEmitted)return void a();this.sessionShutdownEmitted=!0;let b=this.inner.extensionRunner?.emit;"function"!=typeof b?a():Promise.resolve().then(()=>b.call(this.inner.extensionRunner,{type:"session_shutdown",reason:"quit"})).catch(a=>{console.error("[pi-web] session_shutdown before dispose failed:",a instanceof Error?a.message:a)}).finally(a)}revokePersistenceForDeletion(){this.persistenceRevoked=!0,L(this.inner.sessionManager),this.cancelQueuedRun(),this.cancelGoalContinuation()}async drainForSessionRewrite(){this.cancelQueuedRun(),this.cancelGoalContinuation(),this.extensionUiAbortController.abort(new DOMException("Session is being changed","AbortError")),await this.inner.abort()}async shutdown(){return this.shutdownPromise?this.shutdownPromise:this._alive?(this.cancelQueuedRun(),this.cancelGoalContinuation(),this.shutdownPromise=(async()=>{try{try{await this.waitForExtensionsBound()}catch(a){console.error("[pi-web] extension binding failed before session shutdown:",a instanceof Error?a.message:a)}this.sessionShutdownEmitted||(this.sessionShutdownEmitted=!0,await this.inner.extensionRunner.emit?.({type:"session_shutdown",reason:"quit"}))}finally{this.destroy()}})(),this.shutdownPromise):void 0}resolveExtensionUiResponse(a){let b=this.pendingUiResponses.get(a.id);b&&b.resolve(a)}getExtensionStatuses(){return Array.from(this.extensionStatuses,([a,b])=>({key:a,text:b}))}getExtensionWidgets(){return Array.from(this.extensionWidgets.values())}getCustomUiWidth(a){if(!a||"object"!=typeof a)return F.p1;let b=a.overlayOptions,c="function"==typeof b?b():b;if(!c||"object"!=typeof c)return F.p1;let d=c.width;return"number"==typeof d&&Number.isFinite(d)?Math.max(40,Math.min(140,Math.round(d))):F.p1}emitCustomUiRender(a,b){let c;try{c=b.component.render(b.width)}catch(a){c=[`Extension custom UI render failed: ${a instanceof Error?a.message:String(a)}`]}let d={type:"extension_ui_request",id:a,method:"custom",lines:c};this.pendingUiRequests.set(a,d),this.emit(d)}closeCustomUi(a,b){let c=this.activeCustomUis.get(a);if(c&&!c.settled){c.settled=!0,this.activeCustomUis.delete(a),this.pendingUiRequests.delete(a);try{c.component.dispose?.()}catch{}this.emit({type:"extension_ui_request",id:a,method:"custom",lines:[],closed:!0}),c.resolve(b)}}handleExtensionUiInput(a,b){let c=this.activeCustomUis.get(a);if(c&&"string"==typeof b)try{c.component.handleInput?.(b),this.activeCustomUis.has(a)&&this.emitCustomUiRender(a,c)}catch(b){this.closeCustomUi(a,void 0),this.emit({type:"extension_error",extensionPath:`custom-ui:${a}`,event:"custom_ui_input",error:b instanceof Error?b.message:String(b)})}}requestExtensionCustomUi(a,b){if("function"!=typeof a)return Promise.resolve(void 0);let c=this.extensionUiAbortController.signal;if(c.aborted)return Promise.reject(c.reason);let d=(0,g.randomUUID)(),e=this.getCustomUiWidth(b);return new Promise((b,f)=>{let g=!1,h=(0,F.TQ)(()=>{let a=this.activeCustomUis.get(d);a&&this.emitCustomUiRender(d,a)},e),i=a=>{g||(g=!0,c.removeEventListener("abort",k),c.aborted?f(c.reason):b(a))},j=a=>{this.activeCustomUis.has(d)?this.closeCustomUi(d,a):i(a)},k=()=>j(void 0);c.addEventListener("abort",k,{once:!0}),Promise.resolve().then(()=>g?void 0:a(h,ap,aq,j)).then(a=>{if(g){try{a?.dispose?.()}catch{}return}if(!a||"object"!=typeof a||"function"!=typeof a.render)return void i(void 0);let b={component:a,width:e,resolve:a=>i(a),settled:!1};this.activeCustomUis.set(d,b),this.emitCustomUiRender(d,b)}).catch(a=>{g||(this.emit({type:"extension_error",extensionPath:`custom-ui:${d}`,event:"custom_ui",error:a instanceof Error?a.message:String(a)}),i(void 0))})})}requestExtensionUi(a,b,c,d,e){if(e?.aborted)return Promise.resolve(b);let f=this.extensionUiAbortController.signal;if(f.aborted)return Promise.reject(f.reason);let h=e?AbortSignal.any([e,f]):f,i=(0,g.randomUUID)(),j={type:"extension_ui_request",id:i,...a,...d?{timeout:d,expiresAt:Date.now()+d}:{}};return new Promise((a,e)=>{let g,k=!1,l=()=>{g&&clearTimeout(g),h.removeEventListener("abort",n),this.pendingUiRequests.delete(i),this.pendingUiResponses.delete(i),this.emit({type:"extension_ui_closed",id:i})},m=b=>{k||(k=!0,l(),f.aborted?e(f.reason):a(b))},n=()=>m(b);d&&(g=setTimeout(()=>m(b),d)),h.addEventListener("abort",n,{once:!0}),this.pendingUiRequests.set(i,j),this.pendingUiResponses.set(i,{resolve:a=>m(c(a)),cancel:()=>m(b)}),this.emit(j)})}createExtensionUiContext(){return{select:(a,b,c)=>this.requestExtensionUi({method:"select",title:a,options:b,...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),confirm:(a,b,c)=>this.requestExtensionUi({method:"confirm",title:a,message:b,...c?.timeout?{timeout:c.timeout}:{}},!1,a=>"confirmed"in a&&a.confirmed,c?.timeout,c?.signal),input:(a,b,c)=>this.requestExtensionUi({method:"input",title:a,...void 0!==b?{placeholder:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),editor:(a,b,c)=>this.requestExtensionUi({method:"editor",title:a,...void 0!==b?{prefill:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),notify:(a,b)=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",message:a,notifyType:b})},onTerminalInput:()=>()=>{},setStatus:(a,b)=>{void 0===b?this.extensionStatuses.delete(a):this.extensionStatuses.set(a,b),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setStatus",statusKey:a,statusText:b})},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:(a,b,c)=>{(void 0===b||Array.isArray(b))&&(void 0===b?this.extensionWidgets.delete(a):this.extensionWidgets.set(a,{key:a,lines:b,placement:c?.placement??"aboveEditor"}),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:b,widgetPlacement:c?.placement}))},setFooter:()=>{},setHeader:()=>{},setTitle:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setTitle",title:a})},custom:(a,b)=>this.requestExtensionCustomUi(a,b),pasteToEditor:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},setEditorText:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},getEditorText:()=>"",addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>void 0,get theme(){return ap},getAllThemes:()=>[],getTheme:()=>void 0,setTheme:()=>({success:!1,error:"Theme switching is not supported in pi-web extension UI yet"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}}}syncProjectTrust(){this.inner.settingsManager.setProjectTrusted((0,n.Y1)(this.cwd,(0,e.getAgentDir)()).trusted)}createExtensionCommandContextActions(){return{waitForIdle:async()=>{let a=this.inner.agent;await a.waitForIdle?.()},newSession:async()=>({cancelled:!0}),fork:async()=>({cancelled:!0}),navigateTree:async(a,b)=>({cancelled:(await this.inner.navigateTree(a,{summarize:b?.summarize})).cancelled}),switchSession:async()=>({cancelled:!0}),reload:async()=>{this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.syncProjectTrust(),await this.inner.reload({beforeSessionStart:()=>{this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc")}}),this.applyExactSystemPrompt()}}}}function L(a){a&&(a.persist=!1)}function M(a){globalThis.__piSessionLifecycles??=new Map;let b=globalThis.__piSessionLifecycles.get(a);return b||(b={generation:0,barriers:0,deleted:!1,starts:new Set},globalThis.__piSessionLifecycles.set(a,b)),b}function N(a,b){let c=M(a);if(c.deleted||c.barriers>0||void 0!==b&&c.generation!==b)throw Error("Session was deleted or is being changed; retry after the operation finishes")}function O(a){let b=[...new Set(a)].map(a=>[a,M(a)]),c=new Set;for(let[,a]of b)for(let b of(a.generation+=1,a.barriers+=1,a.starts))c.add(b);for(let a of c)a.cancel(Error("Session startup cancelled: session is being deleted or changed"));let d=!1;return{ready:Promise.allSettled([...c].map(a=>a.settled)).then(()=>void 0),finish:(a=[])=>{if(d)return;d=!0;let c=new Set(a);for(let[a,d]of b)d.barriers-=1,c.has(a)&&(d.deleted=!0)}}}function P(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let a=()=>Promise.allSettled(Array.from(globalThis.__piSessions?.values()??[],a=>a.shutdown()));process.once("exit",()=>globalThis.__piSessions?.forEach(a=>a.destroy())),process.once("SIGINT",()=>{a().finally(()=>process.exit(130))}),process.once("SIGTERM",()=>{a().finally(()=>process.exit(143))})}return globalThis.__piSessions}function Q(a){let b=(0,i.resolve)(a);try{return(0,h.realpathSync)(b)}catch{return b}}function R(){return globalThis.__piStartingSessionCwds||(globalThis.__piStartingSessionCwds=new Map),globalThis.__piStartingSessionCwds}function S(a){return P().get(a)}function T(a){let b=Q(a);return!!R().has(b)||Array.from(P().values()).some(a=>Q(a.cwd)===b&&a.isRunning())}async function U(a){let b=Q(a),c=Array.from(P().values()).filter(a=>Q(a.cwd)===b);return await Promise.all(c.map(a=>a.shutdown())),c.length}function V(){let a=[];for(let[b,c]of P()){if(!c.isAlive())continue;let d=c.runtimeSnapshot();d.running&&a.push({...d,id:d.id||b})}return a}function W(a){return globalThis.__piRunningListeners??=new Set,globalThis.__piRunningListeners.add(a),()=>globalThis.__piRunningListeners?.delete(a)}let as="";function X(){let a=globalThis.__piRunningListeners;if(!a||0===a.size){as="";return}let b=V(),c=JSON.stringify(b);if(c!==as)for(let d of(as=c,a))try{d(b)}catch{}}async function Y(a,b,c){let d=void 0===c?void 0:(0,r.vw)(c),f=S(a);if(!f?.isAlive()){if(!b)throw Error("Session not found");let c=e.SessionManager.open(b,void 0);if((0,q.ph)(c.getEntries()))throw Error("Subagent tool selection is fixed by its profile");void 0===d?(0,r.lp)(c):(0,r.b5)(c,d),(0,o.mD)();let f=await ah(a,b,void 0);return{session:f.session,sessionId:f.realSessionId,recreated:!1}}if(f.isRunning())throw Error("Cannot change tools while the session is running");if((0,q.ph)(f.inner.sessionManager.getEntries()))throw Error("Subagent tool selection is fixed by its profile");let i="function"==typeof f.isChatOnly&&"function"==typeof f.setActiveToolSelection,j=void 0===d||!i||(0,s.r3)({currentChatOnly:f.isChatOnly(),nextTools:d});if(void 0===d?(0,r.lp)(f.inner.sessionManager):(0,r.b5)(f.inner.sessionManager,d),(0,o.mD)(),void 0!==d&&!j)return f.setActiveToolSelection(d),{session:f,sessionId:a,recreated:!1};let k=f.sessionFile&&(0,h.existsSync)(f.sessionFile)?f.sessionFile:void 0,l=f.cwd,m=f.inner.model,n=f.inner.agent.state?.thinkingLevel;if(await f.shutdown(),k){let b=await ah(a,k,void 0);return{session:b.session,sessionId:b.realSessionId,recreated:!0}}let p=await ah(`__recreate__${(0,g.randomUUID)()}`,"",l,{...void 0!==d?{toolNames:d}:{},...m?{initialModel:{provider:m.provider,modelId:m.id}}:{},allowInitialModelFallback:!0,...n&&ai.has(n)?{thinkingLevel:n}:{}});return{session:p.session,sessionId:p.realSessionId,recreated:!0}}function Z(a={}){let b=[];for(let c of P().values()){if("function"!=typeof c.isAlive||!c.isAlive())continue;let d=c.inner?.sessionManager;if(!d)continue;let e=d.getHeader(),f=d.getEntries(),g=f.filter(a=>"message"===a.type),i=g.find(a=>"user"===a.message.role),j=d.getSessionFile()??c.sessionFile,k=!!(j&&(0,h.existsSync)(j)),l=(0,q.$u)(f,e?.id??c.sessionId,j??"");if(!k&&!a.includeTransient&&(!c.isRunning()||!i))continue;let m=e?.timestamp??f[0]?.timestamp??new Date().toISOString(),n=new Date(m).getTime(),o=Number.isNaN(n)?Date.now():n;for(let a of g){let b=function(a){if("user"!==a.message.role&&"assistant"!==a.message.role)return;if("number"==typeof a.message.timestamp)return a.message.timestamp;let b=new Date(a.timestamp).getTime();return Number.isNaN(b)?void 0:b}(a);void 0!==b&&(o=Math.max(o,b))}b.push({path:j??"",id:e?.id??c.sessionId,cwd:e?.cwd??c.cwd,name:d.getSessionName(),created:m,modified:new Date(o).toISOString(),messageCount:g.length,firstMessage:i&&function(a){if("bashExecution"===a.message.role)return"";let b=a.message.content;return"string"==typeof b?b:b.map(a=>"text"===a.type?a.text:"").filter(Boolean).join(" ")}(i)||"(no messages)",...l?{parentSessionId:l.parentSessionId,relation:{kind:"subagent",parentSessionId:l.parentSessionId,profile:l.profile,description:l.description,status:c.isRunning()?"running":l.status}}:{},transient:!k})}return b}function $(){let a=new Set;for(let[b,c]of P())c.isRunning()&&c.hasSuppressedCompletionNotifications()&&a.add(c.sessionId||b);return[...a]}function _(){return V().map(a=>a.id)}let at=(0,u.s)({getSession:a=>P().get(a),registerSession:(a,b)=>{let c,d,e;c=new ar(a,a.sessionManager.getCwd()),b?.chatOnly?c.setForceEmptySystemPrompt(!0):b?.exactSystemPrompt&&c.setExactSystemPrompt(b.exactSystemPrompt),c.setChatOnly(!!b?.chatOnly),c.setSuppressCompletionNotifications(!0),c.start(),d=a.sessionId,e=P(),c.onDestroy(()=>e.delete(d)),e.set(d,c)},reopenSession:async(a,b)=>(await ah(a,b,void 0)).session,resolveSessionPath:o.os,invalidateSessionList:o.mD,notifyRunningChange:X,isBuiltInSubagentsEnabled:v.N});function aa(a){return at.get(a)}function ab(a,b){return at.steer(a,b)}function ac(a){return at.abort(a)}function ad(a){return globalThis.__piSessionBusListeners??=new Set,globalThis.__piSessionBusListeners.add(a),()=>globalThis.__piSessionBusListeners?.delete(a)}!function(){try{let a=(0,v.M6)();if((0,h.existsSync)(a))return;(0,h.mkdirSync)(a.slice(0,a.lastIndexOf("/")),{recursive:!0}),(0,h.writeFileSync)(a,JSON.stringify({builtInEnabled:!0},null,2)+"\n")}catch(a){console.warn("[pi-web] failed to seed agents/settings.json:",a instanceof Error?a.message:a)}}();let au=new Map;function ae(a){let b=globalThis.__piSessionBusListeners;if(b&&0!==b.size)for(let c of b)try{c(a)}catch{}}function af(a,b,c){let d=globalThis.__piSessionBusListeners;if(!d||0===d.size)return;if("message_update"!==a)return void ae({type:a,sessionId:b,payload:c});let e=au.get(b),f={type:a,sessionId:b,payload:c};e?(clearTimeout(e.timer),e.event=f):au.set(b,{event:f,timer:setTimeout(()=>{let a=au.get(b);a&&(au.delete(b),ae(a.event))},80)})}function ag(a,b){let c=Date.now(),{provider:d,modelId:e,sessionId:f}=b,g=a.result.bind(a);a.result=async()=>{let a,b,h,i,j,k=await g();return a=Date.now()-c,b="error"===k.stopReason||"aborted"===k.stopReason,h=k.errorMessage?.trim(),j=(i=h?.match(/\bHTTP\s+(\d{3})\b|\bstatus(?:\s+code)?\s*[:=]?\s*(\d{3})\b/))?Number(i[1]??i[2]):void 0,(0,G.wF)({level:b?"error":"info",source:"model-call",provider:d,model:e,sessionId:f,...void 0!==j?{statusCode:j}:{},message:b?`模型调用失败 ${d}/${e}${h?`:${h}`:""}`:`模型调用成功 ${d}/${e}`,details:b?void 0:`耗时 ${a}ms`}),k};let h=a[Symbol.asyncIterator].bind(a);return a[Symbol.asyncIterator]=()=>{let a=h();return{next:()=>a.next().catch(a=>{throw(0,G.wF)({level:"error",source:"model-call",provider:d,model:e,sessionId:f,message:`模型调用传输错误 ${d}/${e}:${a instanceof Error?a.message:String(a)}`}),a})}},a}async function ah(a,b,d,f={}){let g,i,j,k,t,u,w,x,y,A,{toolNames:B,initialModel:C,thinkingLevel:F,allowInitialModelFallback:G}=f,H=P(),J=(globalThis.__piStartLocks||(globalThis.__piStartLocks=new Map),globalThis.__piStartLocks),O=M(a),S=O.generation;N(a,S);let T=H.get(a);if(T?.isAlive()&&!T.isShuttingDown())return{session:T,realSessionId:a,created:!1};if(T){let a=T.whenShutdown();if(a){let b;try{await Promise.race([a,new Promise(a=>{b=setTimeout(a,1e4)})])}finally{clearTimeout(b)}}}N(a,S);let U=J.get(a);if(U)return U;if(b){if(!(0,h.existsSync)(b))throw Error("Session not found");if((g=e.SessionManager.open(b,void 0)).getSessionId()!==a)throw Error("Session identity changed")}else{if(!d)throw Error("cwd is required for a new session");g=e.SessionManager.create(d,void 0)}let V=g.getSessionId(),W=M(V),X=W.generation;N(V,X);let Y=g.getCwd(),Z=g.getEntries(),$=b?(0,q.ph)(Z):null,_=$?void 0:(0,r.dS)(Z);$||void 0!==_||void 0===B||(0,r.b5)(g,B);let aa=(y=R(),A=Q(Y),y.set(A,(y.get(A)??0)+1),()=>{let a=(y.get(A)??1)-1;a>0?y.set(A,a):y.delete(A)}),ab=new AbortController,ac=setTimeout(()=>ab.abort(),25e3),ad=!1,ae=!1,af=()=>{if(k&&!ae){ae=!0;try{k.cleanup()}catch{}}},ai=()=>{L(g);let a=t;if(a&&w!==a)if(w=a,u)u.destroy();else try{a.dispose()}catch{}af()},aj=new Promise((a,b)=>{x=b}),ak={settled:Promise.resolve(),cancel:a=>{j||(j=a,ab.abort(a),ai(),x(a))}};O.starts.add(ak),W.starts.add(ak);let al=()=>{if(j)throw j;N(a,S),N(V,X)},am=(async()=>{let b=(0,s.Qf)({subagentTools:$?.tools,persistedTools:_,requestedTools:B}),d=(0,s.J7)({toolSelection:b,subagentLoadsResources:!!($?.loadExtensions||$?.loadSkills)});d||(0,e.initTheme)();let f=(0,e.getAgentDir)(),h=$?.tools;$||void 0===b||(h=0===b.length?[]:void 0);let r=!!($?.loadExtensions||$?.loadSkills),w=$?r?(0,n.Fk)(Y,f):void 0:(0,n.Fk)(Y,f),x={},y=(0,E.Q)(()=>x.current?.()),A=d||$?.exactSystemPrompt!==void 0,J=await (0,e.createAgentSessionServices)({cwd:Y,agentDir:f,modelRuntimeSignal:ab.signal,resourceLoaderOptions:$?{noExtensions:!0,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,appendSystemPrompt:$.appendSystemPrompt,...A?{extensionFactories:[y]}:{}}:d?{...D.M,extensionFactories:[y]}:{extensionFactories:[(0,p.Vj)(at.extensionRuntime,()=>(0,q.IR)(Y),v.N)],extensionsOverride:a=>(0,p.U6)(a)},...w?{resourceLoaderReloadOptions:w}:{}});al();let{createAsyncBashTools:L}=await Promise.resolve().then(c.bind(c,44271));al(),k=new I.B;let M=L(k),N=await (0,m.py)(J.modelRuntime,J.settingsManager.getEnabledModels(),{signal:ab.signal});al();let O=C&&(!G||N.visible.some(a=>a.provider===C.provider&&a.id===C.modelId))?C:void 0,Q=J.settingsManager.getDefaultProvider(),R=J.settingsManager.getDefaultModel(),S=g.getBranch(),T=S.some(a=>"message"===a.type&&"system"!==a.message.role),U=T?(0,o.Vg)(S):null,V=U?J.modelRuntime.getModel(U.provider,U.modelId):void 0,W=T?null:(0,m.IR)(N,{...O?{requestedModel:O}:{},...Q&&R?{defaultModel:{provider:Q,modelId:R}}:{},...F?{thinkingLevel:F}:{}}),X=V&&J.modelRuntime.hasConfiguredAuth(V.provider)?V:W?.model;al();let Z=(0,e.createAgentSessionFromServices)({services:J,sessionManager:g,...X?{model:X}:{},...W?.thinkingLevel?{thinkingLevel:W.thinkingLevel}:{},...N.scopedModels.length>0?{scopedModels:[...N.scopedModels]}:{},...void 0!==h?{tools:h}:{},customTools:M});Z.then(({session:a})=>{t=a,j&&ai()},()=>{}),i=setTimeout(()=>{ak.cancel(Error("Session startup timed out while binding extensions/resources (40s)"))},4e4);let{session:aa}=await Promise.race([Z,aj]);clearTimeout(i),al();try{let c=aa.agent,e=c.streamFunction;c.streamFunction=(b,c,d)=>{let f=e(b,c,d);return f instanceof Promise?f.then(c=>ag(c,{provider:b.provider,modelId:b.id,sessionId:a})):ag(f,{provider:b.provider,modelId:b.id,sessionId:a})},al();let f=await (0,z.o)(J.settingsManager,{...C?{model:C}:{},...F?{thinkingLevel:F}:{}},{...aa.model?{model:{provider:aa.model.provider,modelId:aa.model.id}}:{},thinkingLevel:aa.agent.state?.thinkingLevel??"off",supportsThinking:aa.supportsThinking()});al(),f.modelDefaultChanged&&(0,l.k)(),$||d||void 0===b||aa.setActiveToolsByName(K(aa,b)),al();let g=new ar(aa,Y);u=g,g.setChatOnly(d),g.setSuppressCompletionNotifications(void 0!==$),b?.length===0?g.setForceEmptySystemPrompt(!0):$&&$.appendSystemPrompt.length>0&&g.setExactSystemPrompt($.appendSystemPrompt[0]);let h=$?.exactSystemPrompt!==void 0?$.exactSystemPrompt:d?$?$.appendSystemPrompt[0]??"":(0,D.c)(aa.resourceLoader.getAgentsFiles().agentsFiles):null;x.current=null===h?void 0:()=>h,null!==h&&g.setExactSystemPrompt(h),g.start(),g.loadQueueRecovery();let i=aa.sessionId,j=aa.sessionFile;return j&&(0,o.O8)(i,j),g.persistSessionFileIfMissing(),g.onDestroy(()=>{af(),H.get(i)===g&&H.delete(i)}),H.set(i,g),g.beginExtensionBinding({forceEmptySystemPrompt:b?.length===0}),!function(){let a=P();if(a.size<=12)return;let b=Array.from(a.entries()).filter(([,a])=>a.isAlive()&&!a.isRunning()&&!a.hasSubscribers()).sort((a,b)=>a[1].activityTimestamp-b[1].activityTimestamp),c=a.size-12;for(let[d,e]of b){if(c<=0)break;a.has(d)&&(console.log(`[pi-web] evicting idle unwatched session ${d} (registry cap 12)`),e.shutdown().catch(a=>{console.error(`[pi-web] failed to evict session ${d}:`,a instanceof Error?a.message:a)}),c-=1)}}(),{session:g,realSessionId:i,created:!0}}catch(a){throw ai(),a}})().catch(a=>{throw ai(),a}),an=setTimeout(()=>{ak.cancel(Error("Session startup timed out after 60s (extension/resource binding may be hung); the start lock was released — retry the request to start over."))},6e4),ao=Promise.race([am,aj]).finally(()=>{J.get(a)===ao&&J.delete(a),ad||(ad=!0,clearTimeout(ac),clearTimeout(an),clearTimeout(i),O.starts.delete(ak),W.starts.delete(ak),aa())});return ak.settled=ao,J.set(a,ao),ao}d()}catch(a){d(a)}})},64735:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{S3:()=>k,lN:()=>j});var e=c(6999),f=c(67264),g=c(36193),h=a([e]);e=(h.then?(await h)():h)[0];let l="modes",m="modesPerSession";function i(a){if(!a||"object"!=typeof a||Array.isArray(a))return null;let b=a.permissionRules,c=(0,g.kP)((0,g.ni)(b));return{collaborationMode:(0,f.UY)(a.collaborationMode),tokenMode:(0,f.wI)(a.tokenMode),toolApprovalMode:(0,f.g0)(a.toolApprovalMode),permissionRules:{allow:Array.isArray(c.allow)?c.allow:[],ask:Array.isArray(c.ask)?c.ask:[],deny:Array.isArray(c.deny)?c.deny:[]}}}function j(a){let b=(0,f.Md)(),c=(0,e.Tu)();if(a){let b=c[m];if(b&&"object"==typeof b&&!Array.isArray(b)){let c=i(b[a]);if(c)return c}}return i(c[l])??b}async function k(a,b){let c={collaborationMode:(0,f.UY)(a.collaborationMode),tokenMode:(0,f.wI)(a.tokenMode),toolApprovalMode:(0,f.g0)(a.toolApprovalMode),permissionRules:a.permissionRules};await (0,e.o$)(a=>{if(b){let d=a[m]??{};d[b]=c,a[m]=d}else a[l]=c;return{settings:a}})}d()}catch(a){d(a)}})},71069:(a,b,c)=>{c.d(b,{TQ:()=>e,p1:()=>d});let d=92;function e(a,b=d,c=40){return Object.freeze({terminal:Object.freeze({columns:b,rows:c,kittyProtocolActive:!1}),requestRender:a})}},71212:(a,b,c)=>{c.d(b,{Q:()=>d});function d(a){return{name:"pi-web-exact-system-prompt",hidden:!0,factory:b=>{b.on("before_agent_start",()=>{let b=a();return void 0===b?void 0:{systemPrompt:b}})}}}},72498:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Fk:()=>i,Y1:()=>g,er:()=>h});var e=c(75430),f=a([e]);function g(a,b){return a&&(0,e.hasTrustRequiringProjectResources)(a)?{requiresTrust:!0,trusted:!0===new e.ProjectTrustStore(b).get(a)}:{requiresTrust:!1,trusted:!0}}function h(a,b){let c=g(a,b);return c.requiresTrust?(new e.ProjectTrustStore(b).set(a,!0),{requiresTrust:!0,trusted:!0}):c}function i(a,b){if(!g(a,b).requiresTrust)return;let c=new e.ProjectTrustStore(b);return{resolveProjectTrust:async()=>!0===c.get(a)}}e=(f.then?(await f)():f)[0],d()}catch(a){d(a)}})},78963:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{H4:()=>m,kx:()=>k,qV:()=>o,t0:()=>n});var e=c(73024),f=c(76760),g=c(75430),h=c(80974),i=c.n(h),j=a([g]);function k(a=(0,g.getAgentDir)()){return(0,f.join)(a,"extension-tools.json")}function l(a){return"object"!=typeof a||null===a||Array.isArray(a)?{disabled:[]}:{disabled:Array.isArray(a.disabled)?[...new Set(a.disabled.filter(a=>"string"==typeof a&&""!==a.trim()).map(a=>a.trim()))]:[]}}function m(a,b){if(0===b.disabled.length)return[...a];let c=new Set(b.disabled);return a.filter(a=>!c.has(a))}function n(a=k()){if(!(0,e.existsSync)(a))return{disabled:[]};try{return l(JSON.parse((0,e.readFileSync)(a,"utf8")))}catch{return{disabled:[]}}}async function o(a,b=k()){let c=l(a);(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0});try{(0,e.writeFileSync)(b,JSON.stringify({version:1,disabled:[]},null,2),{flag:"wx",mode:384})}catch(a){if("EEXIST"!==a.code)throw a}let d=await i().lock(b,{realpath:!1,retries:10});try{(0,e.writeFileSync)(b,`${JSON.stringify({version:1,disabled:c.disabled},null,2)}
|
|
24
|
+
${(g=i.filter(a=>a.enabled),0===g.length?"No subagent profiles are currently enabled.":g.map(a=>{let b=[`Tools: ${a.tools.length>0?a.tools.join(", "):"none"}`];return a.model&&b.push(`Model: ${a.model}`),`- ${a.name}: ${a.description} (${b.join("; ")})`}).join("\n"))}`,promptSnippet:"Delegate a focused task to an inspectable subagent session",promptGuidelines:["Use Agent for a focused task that benefits from an isolated context.","Use multiple background Agent calls in the same response for independent parallel work.","Do not duplicate work already delegated to a running subagent."],executionMode:"parallel",parameters:e.Type.Object({subagent_type:e.Type.Optional(e.Type.String({description:`Configured agent profile. Available types: ${m}. Default: general-purpose.`})),prompt:e.Type.String({description:"The complete task for the subagent."}),resume:e.Type.Optional(e.Type.String({description:"Existing subagent session ID to continue instead of creating a new session."})),input_files:e.Type.Optional(e.Type.Array(e.Type.String(),{description:"UTF-8 text files under the session cwd to include with the task.",maxItems:h.Wv})),description:e.Type.String({description:"Short activity label shown in the UI."}),run_in_background:e.Type.Optional(e.Type.Boolean({description:"Return immediately and notify this session when complete."})),model:e.Type.Optional(e.Type.String({description:"Optional provider/modelId override."})),thinking:e.Type.Optional(e.Type.String({description:"Optional thinking level override."})),max_turns:e.Type.Optional(e.Type.Number({description:"Optional positive agent turn limit."})),inherit_context:e.Type.Optional(e.Type.Boolean({description:"Include the parent session's active conversation context."})),isolation:e.Type.Optional(e.Type.String({description:"Run the subagent in an isolated git worktree."}))}),async execute(b,c,d,e,f){try{let g=c.resume?.trim(),h=g?await a.resume({parentContext:f,parentToolCallId:b,sessionId:g,task:c.prompt,description:c.description,...void 0!==c.run_in_background?{runInBackground:c.run_in_background}:{},signal:d,onUpdate:a=>e?.({content:[{type:"text",text:`${a.profile}: ${a.description} (${a.status})`}],details:j(a)})}):await a.start({parentContext:f,parentToolCallId:b,profile:c.subagent_type??"general-purpose",task:c.prompt,...c.input_files?{inputFiles:c.input_files}:{},description:c.description,...void 0!==c.run_in_background?{runInBackground:c.run_in_background}:{},...c.model?{model:c.model}:{},...c.thinking?{thinking:c.thinking}:{},...c.max_turns?{maxTurns:c.max_turns}:{},...void 0!==c.inherit_context?{inheritContext:c.inherit_context}:{},..."worktree"===c.isolation?{isolation:"worktree"}:{},signal:d,onUpdate:a=>e?.({content:[{type:"text",text:`${a.profile}: ${a.description} (${a.status})`}],details:j(a)})});if(h.run.runInBackground)return h.completion.then(b=>a.notifyParent(b)).catch(a=>{console.error("[pi-web] failed to deliver subagent completion:",a instanceof Error?a.message:a)}),{content:[{type:"text",text:`Subagent started in background. Session ID: ${h.run.sessionId}. You will be notified when it completes.`}],details:j(h.run)};let i=await h.completion;return{content:[{type:"text",text:k(i)}],details:j(i),..."failed"===i.status?{isError:!0}:{}}}catch(a){return{content:[{type:"text",text:a instanceof Error?a.message:String(a)}],details:void 0,isError:!0}}}})),d.registerTool((0,f.defineTool)({name:"get_subagent_result",label:"Get agent result",description:"Check an inspectable subagent session and retrieve its latest result.",parameters:e.Type.Object({agent_id:e.Type.String({description:"Subagent session ID."}),wait:e.Type.Optional(e.Type.Boolean({description:"Wait until the subagent finishes."}))}),async execute(b,c,d){let e=await a.get(c.agent_id);if(!e)return{content:[{type:"text",text:`Subagent not found: ${c.agent_id}`}],details:void 0,isError:!0};for(;c.wait&&("starting"===e.status||"running"===e.status);)if(await new Promise((a,b)=>{let c=()=>{clearTimeout(e),b(Error("Result wait aborted"))},e=setTimeout(()=>{d?.removeEventListener("abort",c),a()},500);d?.aborted?c():d?.addEventListener("abort",c,{once:!0})}),!(e=await a.get(c.agent_id)))return{content:[{type:"text",text:`Subagent not found: ${c.agent_id}`}],details:void 0,isError:!0};return e.runInBackground&&s.has(e.status)&&a.markResultConsumed(e.sessionId),{content:[{type:"text",text:k(e)}],details:j(e),..."failed"===e.status?{isError:!0}:{}}}})),d.registerTool((0,f.defineTool)({name:"steer_subagent",label:"Steer agent",description:"Send a steering message to a currently running subagent session.",parameters:e.Type.Object({agent_id:e.Type.String({description:"Subagent session ID."}),message:e.Type.String({description:"Instruction to inject after the current tool execution."})}),async execute(b,c){try{return await a.steer(c.agent_id,c.message),{content:[{type:"text",text:`Steering message sent to ${c.agent_id}.`}],details:void 0}}catch(a){return{content:[{type:"text",text:a instanceof Error?a.message:String(a)}],details:void 0,isError:!0}}}}))}}}function n(a){let b=a.extensions.find(a=>a.path===p);if(!b?.tools.has("Agent"))return a;let c=new Set(a.extensions.filter(a=>a.path!==p).filter(a=>{let b=(a.sourceInfo?.source??"").replace(/^npm:/,"").split("@")[0],c=a.path.replaceAll("\\","/").split("/");return b===r||c.some(a=>a===r)}).filter(a=>[...q].some(b=>a.tools.has(b))).map(a=>a.path));return 0===c.size?a:{...a,extensions:a.extensions.filter(a=>!c.has(a.path)),errors:a.errors.filter(a=>!c.has(a.path)&&(a.path!==p||![...c].some(b=>[...q].some(c=>a.error===`Tool "${c}" conflicts with ${b}`))))}}d()}catch(a){d(a)}})},53303:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{$9:()=>h,J1:()=>i});var e=c(75430),f=c(76760),g=a([e]);function h(a,b=process.platform){let c={...a};for(let a of Object.keys(c))(function(a,b){let c="win32"===b?a.toUpperCase():a;return"PORT"===c||"NODE_ENV"===c||c.startsWith("NEXT_")||"PI_WEB_PASSWORD"===c})(a,b)&&delete c[a];return c}function i(a={}){let{agentBinDir:b=(0,f.join)((0,e.getAgentDir)(),"bin"),baseEnvironment:c=process.env,localOperations:d=(0,e.createLocalBashOperations)({shellPath:a.shellPath}),platform:g=process.platform}=a;return{exec(a,e,f){var i;let j,k,l,m=(i=h(f.env??c,g),j="win32"===g?Object.keys(i).find(a=>"PATH"===a.toUpperCase())??"PATH":"PATH",k="win32"===g?";":":",(l=i[j]??"").split(k).filter(Boolean).includes(b)||(i[j]=[b,l].filter(Boolean).join(k)),i);return d.exec(a,e,{...f,env:m})}}}e=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},56429:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{$Z:()=>Y,A4:()=>S,Bp:()=>Z,C4:()=>V,Fn:()=>W,HG:()=>_,OF:()=>ah,Zo:()=>ab,_I:()=>T,d_:()=>aa,iP:()=>af,l8:()=>ad,mK:()=>O,oA:()=>U,wW:()=>ac,x8:()=>$});var e=c(75430),f=c(29862),g=c(55511),h=c(29021),i=c(33873),j=c(78970),k=c(43671),l=c(28967),m=c(18904),n=c(72498),o=c(40402),p=c(46753),q=c(7048),r=c(21560),s=c(5858),t=c(95412),u=c(12568),v=c(27367),w=c(305),x=c(78963),y=c(53303),z=c(30590),A=c(64735),B=c(36193),C=c(67264),D=c(36899),E=c(71212),F=c(71069),G=c(11301),H=c(4504),I=c(44271),J=a([e,f,m,n,o,p,q,u,v,w,x,y,A,G,I]);[e,f,m,n,o,p,q,u,v,w,x,y,A,G,I]=J.then?(await J)():J;let ai=new Set(["off","minimal","low","medium","high","xhigh","max"]),aj=new Set(["agent_start","message_start","message_update","message_end","agent_end","entry_appended","session_info_changed","queue_update","prompt_done","agent_settled","auto_compaction_end","compaction_end"]),ak=function(a=process.env.PI_WEB_IDLE_TIMEOUT_MS){let b=(a??"").trim();if(""===b)return 6e5;let c=Number(b);return!Number.isFinite(c)||c<0||!Number.isInteger(c)||c>0x7fffffff?(console.warn(`[pi-web] invalid PI_WEB_IDLE_TIMEOUT_MS "${a}", falling back to 600000ms`),6e5):c}(),al=new Set(["fork","clone"]),am=new Set(["get_state","abort","steer","follow_up_draft"]),an=["read","bash","powershell","edit","write","grep","find","ls"];class ao extends e.Theme{constructor(){super({muted:"",text:"",thinkingXhigh:"",searchMatchText:""},{selectedBg:""},"truecolor")}fg(...[,a]){return a}bg(...[,a]){return a}bold(a){return a}italic(a){return a}underline(a){return a}inverse(a){return a}strikethrough(a){return a}getFgAnsi(){return""}getBgAnsi(){return""}getThinkingBorderColor(){return a=>a}getBashModeBorderColor(){return a=>a}}let ap=new ao,aq=new f.KeybindingsManager(f.TUI_KEYBINDINGS);function K(a,b){if(0===b.length)return[];let c=new Set(an),d=(0,w.wQ)(b,a.settingsManager.getDefaultTools()),e=a.getAllTools().map(a=>a.name).filter(a=>!c.has(a));return(0,x.H4)([...new Set([...d,...e])],(0,x.t0)())}class ar{constructor(a,b=""){this.inner=a,this.listeners=[],this.activeToolEvents=new Map,this.pendingUiResponses=new Map,this.pendingUiRequests=new Map,this.activeCustomUis=new Map,this.extensionUiAbortController=new AbortController,this.extensionStatuses=new Map,this.extensionWidgets=new Map,this.promptRunning=!1,this.promptPhase=null,this.extensionsBound=!1,this.extensionBindingPromise=null,this.extensionBindingError=null,this.forceEmptySystemPrompt=!1,this.exactSystemPrompt=null,this.freshRuntimeProbe=null,this.pendingPromptCount=0,this.activeMutatingCommands=0,this.agentRunNeedsCompletion=!1,this.promptAdmissionTail=Promise.resolve(),this.sessionReplacement=null,this.forceShutdownOnIdle=!1,this.unsubscribe=null,this.idleTimer=null,this.subscriberCount=0,this.disposeGraceTimer=null,this.lastActivityAt=Date.now(),this.queueMirror=[],this.queueRecovery=[],this.persistenceRevoked=!1,this.queueBootstrap=null,this.pendingQueueHints={steer:[],followUp:[]},this.queueMutationTail=Promise.resolve(),this.onDestroyCallback=null,this.shutdownPromise=null,this.sessionShutdownEmitted=!1,this._alive=!0,this.approvalPolicy=(0,B.ni)((0,A.lN)().permissionRules),this.approvalMode=(0,A.lN)().toolApprovalMode,this.pendingApprovals=new Map,this.approvalSeq=0,this.approvalHookInstalled=!1,this.goalEngine=new H.aA,this.goalTokensAccounted=0,this.goalToolCallsAccounted=0,this.goalContinuationInFlight=!1,this.goalContinuationPending=!1,this.goalDriveScheduled=!1,this.wrapperChatOnly=!1,this.wrapperSuppressNotifications=!1,this.cwd="string"==typeof b?b:"";const c="string"==typeof b?{}:b;c.onAgentRunComplete&&(this.onAgentRunComplete=c.onAgentRunComplete),c.suppressCompletionNotifications&&this.setSuppressCompletionNotifications(!0),c.chatOnly&&this.setChatOnly(!0),c.exactSystemPrompt&&(this.exactSystemPrompt=c.exactSystemPrompt(),this.applyExactSystemPrompt());const d=(0,A.lN)(a.sessionId);if(this.approvalMode=d.toolApprovalMode,this.approvalPolicy=(0,B.ni)(d.permissionRules),a.sessionFile){const b=(0,H.bo)(a.sessionFile);"idle"!==b.status&&this.goalEngine.hydrate(b)}}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}isAlive(){return this._alive}evictIfDiskAhead(){if(!this.isAlive()||this.isRunning())return!1;let a=(0,o.H6)(this.sessionFile);return!(!a||this.inner.sessionManager.getEntry(a)||this.isRunning())&&(this.destroy(),(0,o.mD)(),!0)}async waitUntilReady(){}isShuttingDown(){return null!==this.shutdownPromise}whenShutdown(){return this.shutdownPromise}isRunning(){return this._alive&&(this.pendingPromptCount>0||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)}runtimeSnapshot(){let a=this.inner.isStreaming,b=this.promptRunning,c=this.inner.isCompacting,d=this.inner.isBashRunning;return{id:this.sessionId,running:this.isRunning(),isStreaming:a,isPromptRunning:b,isCompacting:c,isBashRunning:d,phase:d?"running_command":this.promptPhase??(a||b||c?"waiting_model":null)}}setChatOnly(a){this.wrapperChatOnly=a}setSuppressCompletionNotifications(a){this.wrapperSuppressNotifications=a}isChatOnly(){return this.wrapperChatOnly}hasSuppressedCompletionNotifications(){return this.wrapperSuppressNotifications}start(){this.installApprovalHook(),this.goalEngine.setOnChanged(a=>{this.sessionFile&&!this.persistenceRevoked&&(0,H.eG)(this.sessionFile,a),this.emit({type:"goal_state_changed",goalState:a}),af("goal_state_changed",this.sessionId,{type:"goal_state_changed",goalState:a})}),this.goalEngine.isRunning()&&(this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()),this.unsubscribe=this.inner.subscribe(a=>{("agent_end"===a.type||"message_end"===a.type||"entry_appended"===a.type||"session_info_changed"===a.type)&&(0,o.mD)(),("agent_end"===a.type||"agent_settled"===a.type||"auto_compaction_end"===a.type||"compaction_end"===a.type)&&this.resetIdleTimer(),"agent_start"===a.type&&(this.goalEngine.onAgentStart(),this.agentRunNeedsCompletion=!0),"agent_settled"===a.type&&(this.handleGoalSettled(),this.notifyAgentRunCompleteIfIdle()),"queue_update"===a.type&&this.reconcileQueue(a.steering,a.followUp),aj.has(a.type)&&af(a.type,this.sessionId,a);let b=a.toolCallId;"string"==typeof b&&("tool_execution_start"===a.type||"tool_execution_update"===a.type?this.activeToolEvents.set(b,a):"tool_execution_end"===a.type&&this.activeToolEvents.delete(b)),this.emit(a),X()}),this.resetIdleTimer()}loadQueueRecovery(){if(!this.sessionFile)return;let a=this.inner.getSteeringMessages(),b=this.inner.getFollowUpMessages();if(a.length||b.length){this.queueRecovery=[],this.reconcileQueue([...a],[...b]);return}this.queueRecovery=(0,k.ov)(this.sessionFile)}getGoalState(){return this.goalEngine.getState()}handleGoalSettled(){if(!this.goalEngine.isRunning()){this.goalEngine.disarmContinuation(),this.goalContinuationPending=!1;return}let a=this.inner.getLastAssistantText()??"",b=this.currentSessionUsageTotal(),c=Math.max(0,b-this.goalTokensAccounted);this.goalTokensAccounted=b;let d=this.currentSessionToolCallTotal(),e=Math.max(0,d-this.goalToolCallsAccounted);this.goalToolCallsAccounted=d;let{verdict:f}=this.goalEngine.settleTurn(a,c,e);if("continue"!==f.action){this.goalEngine.disarmContinuation(),this.goalContinuationPending=!1;return}this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()}maybeDriveGoalContinuation(){if(this.goalContinuationPending&&!this.goalDriveScheduled){if(!this.goalEngine.isRunning()){this.goalContinuationPending=!1;return}this.goalDriveScheduled=!0,setTimeout(()=>{this.goalDriveScheduled=!1,this.tryDriveGoalContinuation()},0)}}cancelGoalContinuation(){this.goalContinuationPending=!1,this.goalEngine.disarmContinuation()}tryDriveGoalContinuation(){let a=M(this.sessionId);if(!this._alive||this.isShuttingDown()||a.deleted||a.barriers>0)return void this.cancelGoalContinuation();if(this.goalContinuationPending){if(!this.goalEngine.isRunning()){this.goalContinuationPending=!1;return}this.goalContinuationInFlight||this.promptRunning||this.inner.isStreaming||this.inner.isBashRunning||(this.goalContinuationPending=!1,this.driveGoalContinuation())}}driveGoalContinuation(){if(!this.goalEngine.isRunning()||this.goalContinuationInFlight)return;this.goalContinuationInFlight=!0,this.promptRunning=!0,this.promptPhase="waiting_model",this.resetIdleTimer(),X();let a=()=>{this.promptRunning=!1,this.promptPhase=null,this.resetIdleTimer(),X()};this.acquirePromptAdmission().then(async b=>{try{if(!this.goalEngine.isRunning())return void a();let b=this.goalEngine.getState().goalText;if(!this._alive||this.isShuttingDown()||!b)return void a();N(this.sessionId),await this.inner.prompt((0,H.bx)(b),{source:"rpc",preflightResult:a=>{if(a){if(!this._alive||this.isShuttingDown()||!this.goalEngine.isRunning())throw new DOMException("Goal continuation cancelled","AbortError");N(this.sessionId)}}}),a(),this.emit({type:"prompt_done"}),this.maybeDriveGoalContinuation()}catch(b){a(),this.emit({type:"prompt_error",errorMessage:b instanceof Error?b.message:String(b)})}finally{b(),this.goalContinuationInFlight=!1}})}handleGoalStartCommand(a,b){let c=this.goalEngine.start(a,b);return this.goalTokensAccounted=this.currentSessionUsageTotal(),this.goalToolCallsAccounted=this.currentSessionToolCallTotal(),c}handleGoalStopCommand(){return this.goalEngine.stop(),this.goalTokensAccounted=0,this.goalToolCallsAccounted=0,this.goalEngine.getState()}currentSessionUsageTotal(){try{return function(a){let b=0;for(let c of a){let a=c?.message;if(!a||"assistant"!==a.role)continue;let d=a.usage;d&&(b+=(d.input??0)+(d.output??0)+(d.cacheRead??0)+(d.cacheWrite??0))}return b}(this.inner.sessionManager.getEntries())}catch{return 0}}currentSessionToolCallTotal(){try{return function(a){let b=0;for(let c of a){let a=c?.message;if(!a||"assistant"!==a.role)continue;let d=a.content;if(Array.isArray(d))for(let a of d)a&&"object"==typeof a&&"toolCall"===a.type&&(b+=1)}return b}(this.inner.sessionManager.getEntries())}catch{return 0}}setApprovalMode(a){this.approvalMode=a}setApprovalPolicy(a){this.approvalPolicy=a}installApprovalHook(){if(this.approvalHookInstalled||!this.inner.agent?.beforeToolCall)return;this.approvalHookInstalled=!0;let a=this.inner.agent.beforeToolCall;this.inner.agent.beforeToolCall=async b=>{let c=b.toolCall?.name??"",d=b.args,e=(0,B.LD)(this.approvalPolicy,c,{mode:this.approvalMode,readOnly:C.MJ.has(c.toLowerCase()),args:d});if("deny"===e)return{block:!0,reason:`Denied by policy rule: ${c} is not permitted.`};if("ask"===e){let a=await this.askForApproval(c,d);if(!a.approve)return{block:!0,reason:a.reason||`Rejected by user: ${c}`}}return a?a(b):void 0}}askForApproval(a,b){return new Promise(c=>{let d=`approval-${++this.approvalSeq}`,e=setTimeout(()=>{this.pendingApprovals.delete(d),this.emit({type:"tool_approval_resolved",id:d,approve:!1,reason:`Approval request timed out after 120s: ${a}`}),c({approve:!1,reason:`Approval request timed out after 120s: ${a}`})},12e4);this.pendingApprovals.set(d,{resolve:c,timer:e,toolName:a}),this.emit({type:"tool_approval_request",id:d,toolName:a,args:function(a){if(null===a||"object"!=typeof a)return a;let b={};for(let[c,d]of Object.entries(a))if(null!=d&&"content"!==c&&"data"!==c&&"newString"!==c&&"oldString"!==c){if("string"==typeof d){b[c]=d.length>200?`${d.slice(0,200)}…`:d;continue}if("number"==typeof d||"boolean"==typeof d){b[c]=d;continue}b[c]=Array.isArray(d)?`[array:${d.length}]`:"[object]"}return b}(b)})})}resolveApproval(a,b,c){let d=this.pendingApprovals.get(a);return!!d&&(this.pendingApprovals.delete(a),clearTimeout(d.timer),d.resolve({approve:b,reason:c}),!0)}rejectAllApprovals(a){for(let[b,c]of this.pendingApprovals)this.pendingApprovals.delete(b),clearTimeout(c.timer),c.resolve({approve:!1,reason:a})}getPendingApprovals(){return Array.from(this.pendingApprovals.entries()).map(([a,b])=>({id:a,toolName:b.toolName}))}pendingRecoveryView(){return this.queueRecovery.map(({id:a,kind:b,text:c,images:d,queuedAt:e})=>({id:a,kind:b,text:c,hasImages:!!d?.length,queuedAt:e}))}persistQueue(){if(!this.sessionFile||this.persistenceRevoked)return;let a=[...this.queueRecovery,...this.queueBootstrap?.entries??[],...this.queueMirror];a.length?(0,k.pj)(this.sessionFile,a):(0,k.wx)(this.sessionFile)}hintQueueImages(a,b){this.pendingQueueHints[a].push(b?.length?b:[])}reconcileQueue(a,b){let c=(a,b)=>{if(!b)return this.queueMirror.filter(b=>b.kind===a);let c=new Set;return b.map(b=>{let d=this.queueMirror.find(d=>d.kind===a&&d.text===b&&!c.has(d));if(d)return c.add(d),d;let e=(0,k.Gc)(a,b,this.pendingQueueHints[a].shift());return c.add(e),e})};this.queueMirror=[...c("steer",a),...c("followUp",b)],this.persistQueue()}validateImagesSupportedByCurrentModel(){let a=this.inner.model;return!a?.id||Array.isArray(a.input)&&a.input.includes("image")?null:`Model "${a.id}" does not accept image input. Switch to a model with image support.`}async requeueEntry(a){let b=(0,j.kc)(a.images);if(b)throw Error(b);if(a.images?.length){let a=this.validateImagesSupportedByCurrentModel();if(a)throw Error(a)}this.hintQueueImages(a.kind,a.images),"steer"===a.kind?await this.inner.steer(a.text,a.images):await this.inner.followUp(a.text,a.images)}ensureMirrored(a){this.queueMirror.find(b=>b.kind===a.kind&&b.text===a.text)||(this.queueMirror.push({...a}),this.pendingQueueHints[a.kind].pop())}async replaceLiveQueue(a,b){for(let b of(this.inner.clearQueue(),this.pendingQueueHints={steer:[],followUp:[]},a))await this.requeueEntry(b);for(let a of b)await this.requeueEntry(a);let c={steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]};return this.reconcileQueue(c.steering,c.followUp),c}async withQueueMutation(a){let b,c=this.queueMutationTail;this.queueMutationTail=new Promise(a=>{b=a}),await c;try{if(!this._alive||this.isShuttingDown())throw Error("Session is shutting down");return N(this.sessionId),await a()}finally{b()}}async mutateLiveQueue(a,b){return this.withQueueMutation(async()=>{let c=this.queueMirror.filter(a=>"steer"===a.kind),d=this.queueMirror.filter(a=>"followUp"===a.kind),e=b("steer"===a?c:d),f=await this.replaceLiveQueue(c,d);return{value:e,queues:f}})}validateQueueEntries(a){for(let b of a){if("steer"!==b.kind&&"followUp"!==b.kind||"string"!=typeof b.text)continue;let a=(0,j.kc)(b.images);if(a)throw Error(a)}}runAgentContinue(){if(!this._alive||this.isShuttingDown()||this.queueBootstrap||this.isRunning()||this.promptRunning)return;let a=[...this.queueMirror];if(0===a.length)return;let b={entries:a,cancelled:!1};this.queueBootstrap=b,this.queueMirror=[],this.persistQueue(),this.inner.clearQueue(),this.pendingQueueHints={steer:[],followUp:[]},this.pendingPromptCount+=1,this.promptRunning=!0,this.promptPhase="waiting_model",X(),this.bootstrapQueuedRun(b)}cancelQueuedRun(){let a=this.queueBootstrap;a&&(a.cancelled=!0,this.queueRecovery.push(...a.entries),a.entries=[],this.persistQueue())}async bootstrapQueuedRun(a){try{for(let b of[...a.entries]){let c,d,e=await this.acquirePromptAdmission();try{let f,g;if(a.cancelled||!this._alive||this.isShuttingDown()||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)break;N(this.sessionId),this.extensionUiAbortController.signal.aborted&&(this.extensionUiAbortController=new AbortController);let h=!1,i=()=>{h=!0,e()},j=!1,k=this.inner.sessionManager,l=k.appendMessage,m=function(c){let d=l.call(this,c);return c===f&&(g=d),!j&&g&&k.isPersisted()&&k.flushed&&(j=!0,a.entries=a.entries.filter(a=>a.id!==b.id),n()),d},n=()=>{this.queueRecovery=this.queueRecovery.filter(a=>a.id!==b.id),this.persistQueue()};k.appendMessage=m,d=()=>{k.appendMessage===m&&(k.appendMessage=l)},c=this.inner.subscribe(b=>{"message_start"!==b.type&&"message_end"!==b.type||"user"!==b.message.role||f||!h&&a.cancelled||(f=b.message,i(),c?.(),c=void 0)}),await this.inner.prompt(b.text,{...b.images?.length?{images:b.images}:{},source:"rpc",preflightResult:b=>{if(b){if(a.cancelled||!this._alive||this.isShuttingDown())throw new DOMException("Queued run cancelled","AbortError");N(this.sessionId),this.applyExactSystemPrompt(),i()}}})}finally{c?.(),d?.(),e()}}}catch(b){!a.cancelled&&this._alive&&((0,o.mD)(),this.emit({type:"prompt_error",errorMessage:b instanceof Error?b.message:String(b)}))}finally{this.queueRecovery.push(...a.entries),a.entries=[],this.queueBootstrap===a&&(this.queueBootstrap=null),this.persistQueue(),this.pendingPromptCount=Math.max(0,this.pendingPromptCount-1),this.promptRunning=this.pendingPromptCount>0,this.promptRunning||(this.promptPhase=null),this.resetIdleTimer(),X(),this._alive&&this.emit({type:"prompt_done"})}}setForceEmptySystemPrompt(a){this.forceEmptySystemPrompt=a,this.applyForcedEmptySystemPrompt()}setExactSystemPrompt(a){this.exactSystemPrompt=a,this.applyExactSystemPrompt()}beginExtensionBinding(a={}){this.ensureExtensionsBound(a).catch(a=>{console.error("[pi-web] failed to dispatch session_start to extensions:",a instanceof Error?a.message:a)})}ensureExtensionsBound(a={}){return(a.forceEmptySystemPrompt&&(this.forceEmptySystemPrompt=!0),this.extensionsBound)?(this.applyExactSystemPrompt(),Promise.resolve()):(this.extensionBindingPromise||(this.extensionBindingError=null,this.extensionBindingPromise=(async()=>{if(!this._alive)return;let a=this.createExtensionUiContext();if("function"==typeof this.inner.bindExtensions){let b=this.inner.bindExtensions;await b.call(this.inner,{uiContext:a,mode:"rpc",commandContextActions:this.createExtensionCommandContextActions(),shutdownHandler:()=>this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",notifyType:"warning",message:"Extension requested shutdown, but shutdown is not supported in pi-web."}),onError:a=>this.emit({type:"extension_error",extensionPath:a.extensionPath,event:a.event,error:a.error})})}else this.inner.extensionRunner.setUIContext?.(a,"rpc");this.extensionsBound=!0,this.applyExactSystemPrompt(),console.log(`[pi-web] session_start dispatched to extensions for session ${this.inner.sessionId}`)})().catch(a=>{throw this.extensionBindingError=a,a})),this.extensionBindingPromise)}static{this.EXTENSION_BIND_TIMEOUT_MS=15e3}async waitForExtensionsBound(){let a=this.extensionBindingPromise;if(a)try{let b=new Promise((b,c)=>{let d=setTimeout(()=>c(Error("Extension binding timed out; continuing without waiting")),ar.EXTENSION_BIND_TIMEOUT_MS);a.finally(()=>clearTimeout(d))});await Promise.race([a,b])}catch{}this.extensionBindingError&&console.warn("[pi-web] extension binding failed, continuing:",this.extensionBindingError)}shouldWaitForExtensions(a){return"prompt"===a||"steer"===a||"follow_up"===a||"get_commands"===a||"get_state"===a}applyForcedEmptySystemPrompt(){}applyExactSystemPrompt(){}emit(a){for(let b of this.listeners)try{b(a)}catch(a){console.error(`[pi-web] session ${this.sessionId} event listener threw:`,a instanceof Error?a.message:a)}}setActiveToolSelection(a){this.inner.setActiveToolsByName(K(this.inner,a)),this.applyExactSystemPrompt()}async acquirePromptAdmission(){let a,b=this.promptAdmissionTail;return this.promptAdmissionTail=new Promise(b=>{a=b}),await b,a}notifyAgentRunCompleteIfIdle(){if(!(!this.agentRunNeedsCompletion||this.isRunning())&&(this.agentRunNeedsCompletion=!1,!this.wrapperSuppressNotifications))try{this.onAgentRunComplete?.(this.sessionId)}catch(a){console.error("[pi-web] completion listener failed:",a instanceof Error?a.message:a)}}resetIdleTimer(){this.idleTimer&&clearTimeout(this.idleTimer),this._alive&&0!==ak&&(this.isRunning()||(this.forceShutdownOnIdle=!1),this.idleTimer=setTimeout(()=>{!this.forceShutdownOnIdle&&(this.isRunning()||(0,t.Vj)({sessionId:this.sessionId,sessionFile:this.sessionFile||void 0}))?this.resetIdleTimer():this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down idle session:",a instanceof Error?a.message:a)})},ak))}touch(){this.lastActivityAt=Date.now(),this.cancelPendingDispose()}hasSubscribers(){return this.subscriberCount>0}get activityTimestamp(){return this.lastActivityAt}cancelPendingDispose(){this.disposeGraceTimer&&(clearTimeout(this.disposeGraceTimer),this.disposeGraceTimer=null)}scheduleDisposeIfIdle(){this.cancelPendingDispose(),!(this.subscriberCount>0||this.isRunning())&&this._alive&&(this.disposeGraceTimer=setTimeout(()=>{this.disposeGraceTimer=null,!(this.subscriberCount>0||this.isRunning())&&this._alive&&this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down unwatched session:",a instanceof Error?a.message:a)})},6e4))}persistSessionFileIfMissing(){if(this.persistenceRevoked||!this._alive)return;let a=this.inner.sessionManager,b=a.getSessionFile();if(!b||(0,h.existsSync)(b))return;let c=a.getHeader();if(!c)return;let d=[c,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";try{(0,h.writeFileSync)(b,d,{encoding:"utf8",flag:"wx"})}catch(c){if("EEXIST"===c.code||(0,h.existsSync)(b)){a.flushed=!0,(0,o.O8)(this.inner.sessionId,b);return}throw c}a.flushed=!0,(0,o.O8)(this.inner.sessionId,b)}onEvent(a){for(let b of(this.listeners.push(a),this.subscriberCount+=1,this.cancelPendingDispose(),this.pendingUiRequests.values()))a(b);for(let b of this.activeToolEvents.values())a(b);return()=>{queueMicrotask(()=>{let b=this.listeners.indexOf(a);-1!==b&&this.listeners.splice(b,1)}),this.subscriberCount>0&&(this.subscriberCount-=1),this.scheduleDisposeIfIdle()}}onDestroy(a){this.onDestroyCallback=a}async withSessionReplacement(a,b){if(this.sessionReplacement)throw Error("Session is already being copied");this.sessionReplacement=a;try{return await b()}finally{this._alive&&(this.sessionReplacement=null)}}isSessionRunningForReplacement(){return this.inner.isBashRunning||this.inner.isStreaming||this.inner.isCompacting||this.pendingPromptCount>0}async shutdownAfterSessionReplacement(a){try{await this.shutdown()}catch(b){console.error(`[pi-web] ${a} succeeded, but source session shutdown failed:`,b instanceof Error?b.message:b)}}async send(a){if(!this._alive)throw Error("Session is shutting down");N(this.sessionId),this.touch();let b=a.type;if(b.startsWith("get_")||"export_queue"===b||this.resetIdleTimer(),"prompt"===b||"steer"===b||"follow_up"===b||"requeue_at"===b){let b=(0,j.kc)(a.images);if(b)throw Error(b);if(Array.isArray(a.images)&&a.images.length>0){let a=this.validateImagesSupportedByCurrentModel();if(a)throw Error(a)}}let c=am.has(b);if(this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if(al.has(b)&&this.activeMutatingCommands>0)throw Error(`Cannot ${b} while another session command is running`);this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound();let d=!c;d&&(this.activeMutatingCommands+=1);try{if(!this._alive||this.isShuttingDown())throw Error("Session is shutting down");if(N(this.sessionId),this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if("prompt"===b||"steer"===b||"follow_up"===b){let b=(0,j.kc)(a.images);if(b)throw Error(b)}switch(b){case"prompt":{let b=await this.acquirePromptAdmission();try{let b,c,d;if(!this._alive||this.isShuttingDown())throw Error("Session is shutting down");if(N(this.sessionId),this.inner.isBashRunning)throw Error("Cannot send a prompt while a shell command is running");this.extensionUiAbortController.signal.aborted&&(this.extensionUiAbortController=new AbortController);let e=a.images,f=a.streamingBehavior;f&&this.inner.isStreaming&&this.hintQueueImages("followUp"===f?"followUp":"steer",e);let g=!1,h=!1,i=!1,j=new Promise((a,d)=>{b=()=>{g=!0,this.agentRunNeedsCompletion=!0,h||(h=!0,a())},c=a=>{h||(h=!0,d(a))}}),k=()=>{i||(i=!0,this.pendingPromptCount=Math.max(0,this.pendingPromptCount-1),this.resetIdleTimer(),this.notifyAgentRunCompleteIfIdle())};this.pendingPromptCount+=1,this.promptRunning=!0,this.promptPhase=String(a.message??"").trimStart().startsWith("/")?"running_command":"waiting_model",X();try{d=this.inner.prompt(a.message,{...e?.length?{images:e}:{},...f?{streamingBehavior:f}:{},source:"rpc",preflightResult:a=>{if(a){if(!this._alive||this.isShuttingDown())throw Error("Session is shutting down");N(this.sessionId),this.applyExactSystemPrompt(),b()}}})}catch(a){throw k(),a}return d.then(()=>{b(),k(),this.promptRunning=!1,this.promptPhase=null,f||this.emit({type:"prompt_done"}),X(),this.maybeDriveGoalContinuation()},a=>{c(a),k(),this.promptRunning=!1,this.promptPhase=null,(0,o.mD)(),g&&(this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),f||this.emit({type:"prompt_done"})),X(),this.maybeDriveGoalContinuation()}).catch(a=>{console.error("[pi-web] prompt completion handler failed:",a instanceof Error?a.message:a)}),await j,null}finally{b()}}case"abort":this.cancelQueuedRun(),this.cancelGoalContinuation(),this.forceShutdownOnIdle=!0,this.extensionUiAbortController.abort(new DOMException("Extension UI cancelled by Stop","AbortError"));try{await this.inner.abort()}finally{this.resetIdleTimer(),this.isRunning()||(this.forceShutdownOnIdle=!1)}return null;case"get_state":{let a=this.inner.model,b=this.inner.getContextUsage();return{sessionId:this.inner.sessionId,sessionFile:this.inner.sessionFile??"",isStreaming:this.inner.isStreaming,isPromptRunning:this.pendingPromptCount>0,isBashRunning:this.inner.isBashRunning,isCompacting:this.inner.isCompacting,phase:this.runtimeSnapshot().phase,model:a?{id:a.id,provider:a.provider}:void 0,messageCount:0,pendingMessageCount:this.inner.pendingMessageCount,queuedMessages:{steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]},pendingRecovery:this.pendingRecoveryView(),contextUsage:b?{percent:b.percent,contextWindow:b.contextWindow,tokens:b.tokens}:null,systemPrompt:this.exactSystemPrompt??this.inner.agent.state?.systemPrompt??"",thinkingLevel:this.inner.agent.state?.thinkingLevel??"off",extensionStatuses:this.getExtensionStatuses(),extensionWidgets:this.getExtensionWidgets(),goalState:this.goalEngine.getState()}}case"goal_start":{let b=String(a.goalText??"").trim();if(!b)throw Error("goal_start requires a non-empty goalText");let c=a.tokenBudget,d="number"==typeof c&&Number.isFinite(c)&&c>0?Math.floor(c):null,e=this.handleGoalStartCommand(b,d);return this.goalContinuationPending=!0,this.maybeDriveGoalContinuation(),{goalState:e}}case"goal_pause":return this.cancelGoalContinuation(),{goalState:this.goalEngine.pause()};case"goal_resume":{let a=this.goalEngine.resume();return"running"===a.status&&(this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()),{goalState:a}}case"goal_stop":return this.cancelGoalContinuation(),{goalState:this.handleGoalStopCommand()};case"goal_edit":{let b=String(a.goalText??"").trim();if(!b)throw Error("goal_edit requires a non-empty goalText");let c=this.goalEngine.edit(b);return"running"===c.status&&(this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()),{goalState:c}}case"get_goal_state":return{goalState:this.goalEngine.getState()};case"set_model":{let{provider:b,modelId:c}=a,d=this.inner.modelRuntime.getModel(b,c);if(!d)try{await this.inner.modelRuntime.refresh({allowNetwork:!1}),d=this.inner.modelRuntime.getModel(b,c)}catch{d=void 0}if(!d)try{let a=Date.now();(!this.freshRuntimeProbe||a-this.freshRuntimeProbe.at>6e4)&&(this.freshRuntimeProbe={runtime:await e.ModelRuntime.create(),at:a}),d=this.freshRuntimeProbe.runtime.getModel(b,c)}catch{this.freshRuntimeProbe=null,d=void 0}if(!d)throw Error(`Model not found: ${b}/${c}`);return await this.inner.setModel(d),(0,l.k)(),(0,o.mD)(),{id:d.id,provider:d.provider}}case"fork":if(this.isSessionRunningForReplacement())throw Error("Cannot fork while the session is running");return this.withSessionReplacement("fork",async()=>{let b,c,d=a.entryId,f=this.inner.sessionManager,g=this.inner.sessionFile;if(!f.isPersisted())return{cancelled:!0};if(!g)throw Error("Persisted session is missing a session file");let i=f.getEntry(d);if(!i)throw Error("Invalid entry ID for forking");let j=f.getSessionDir();if(i.parentId){let a=(c=e.SessionManager.open(g,j)).createBranchedSession(i.parentId);if(!a)throw Error("Failed to create forked session");b=a}else b=(c=e.SessionManager.create(f.getCwd(),j,{parentSession:g})).getSessionFile();if(!(0,h.existsSync)(b)){let a=c.getHeader();if(!a)throw Error("Forked session is missing a session header");let d=[a,...c.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,h.writeFileSync)(b,d,{encoding:"utf8",flag:"wx"})}let k=c.getSessionId();return(0,o.O8)(k,b),(0,o.mD)(),await this.shutdownAfterSessionReplacement("fork"),{cancelled:!1,newSessionId:k}});case"fork_branch":{if(this.isSessionRunningForReplacement())throw Error("Cannot fork while the session is running");let b=a.entryId,c=this.inner.sessionManager,d=this.inner.sessionFile;if(!c.isPersisted())return{cancelled:!0};if(!d)throw Error("Persisted session is missing a session file");if(!c.getEntry(b))throw Error("Invalid entry ID for forking");let f=c.getSessionDir(),g=e.SessionManager.open(d,f).createBranchedSession(b);if(!g)throw Error("Failed to create forked session");let h=e.SessionManager.open(g,f).getSessionId();return(0,o.O8)(h,g),(0,o.mD)(),{cancelled:!1,newSessionId:h}}case"clone":{if(this.isSessionRunningForReplacement())throw Error("Cannot clone while the session is running");let b=this.inner.sessionManager,c=this.inner.sessionFile,d="string"==typeof a.leafId?a.leafId:b.getLeafId(),f=d&&b.getBranch(d).some(a=>"message"===a.type&&"assistant"===a.message.role);if(!b.isPersisted()||!d||!f||!c||!(0,h.existsSync)(c))return{cancelled:!0};return this.withSessionReplacement("clone",async()=>{let a=b.getSessionDir(),f=e.SessionManager.open(c,a).createBranchedSession(d);if(!f||!(0,h.existsSync)(f))throw Error("Failed to clone current session branch");let g=e.SessionManager.open(f,a).getSessionId();return(0,o.O8)(g,f),(0,o.mD)(),await this.shutdownAfterSessionReplacement("clone"),{cancelled:!1,newSessionId:g}})}case"navigate_tree":return{cancelled:(await this.inner.navigateTree(a.targetId,{})).cancelled};case"set_thinking_level":{let b=a.level;return this.inner.setThinkingLevel(b),"xhigh"===b&&this.inner.model?.compat?.thinkingFormat==="deepseek"&&this.inner.agent?.state&&(this.inner.agent.state.thinkingLevel="xhigh"),(0,o.mD)(),null}case"compact":try{return await this.inner.compact(a.customInstructions)}finally{(0,o.mD)()}case"set_session_name":{let b=a.name?.trim();if(!b)throw Error("Session name cannot be empty");return this.inner.setSessionName(b),(0,o.mD)(),null}case"get_session_stats":return{...this.inner.getSessionStats(),sessionName:this.inner.sessionManager.getSessionName()};case"get_last_assistant_text":return{text:this.inner.getLastAssistantText()??""};case"clear_queue":return this.withQueueMutation(async()=>(this.queueMirror=[],this.pendingQueueHints={steer:[],followUp:[]},this.persistQueue(),this.inner.clearQueue()));case"move_queue":{let b=a.kind,c=Number(a.fromIndex),d=Number(a.toIndex);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c)||!Number.isInteger(d))throw Error("move_queue requires a queue kind and integer indexes");let{queues:e}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length||d<0||d>=a.length)throw Error("move_queue index out of range");let[b]=a.splice(c,1);a.splice(d,0,b)});return e}case"recall_queue_item":{let b=a.kind,c=Number(a.index);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c))throw Error("recall_queue_item requires a queue kind and integer index");let{value:d,queues:e}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length)throw Error("recall_queue_item index out of range");let[b]=a.splice(c,1);return b});return{entry:{text:d.text,images:d.images??[]},...e}}case"requeue_at":{let b=a.kind,c=Number(a.index),d=a.text;if("steer"!==b&&"followUp"!==b||!Number.isInteger(c)||!d?.trim())throw Error("requeue_at requires a queue kind, integer index, and text");let e=a.images,{queues:f}=await this.mutateLiveQueue(b,a=>{if(c<0||c>a.length)throw Error("requeue_at index out of range");a.splice(c,0,(0,k.Gc)(b,d,e))});return f}case"remove_queue_item":{let b=a.kind,c=Number(a.index);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c))throw Error("remove_queue_item requires a queue kind and integer index");let{queues:d}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length)throw Error("remove_queue_item index out of range");a.splice(c,1)});return d}case"resolve_recovery":return this.withQueueMutation(async()=>{let b=new Set(a.keep??[]),c=new Set(a.discard??[]),d=!0===a.continueRun,e=0;for(let a of this.queueRecovery)b.has(a.id)&&(await this.requeueEntry(a),this.ensureMirrored(a),e+=1);return this.queueRecovery=this.queueRecovery.filter(a=>!b.has(a.id)&&!c.has(a.id)),this.persistQueue(),d&&e>0&&this.runAgentContinue(),{remaining:this.pendingRecoveryView(),kept:e}});case"export_queue":return{live:this.queueMirror.map(a=>({...a})),recovery:this.queueRecovery.map(a=>({...a}))};case"import_queue":return this.withQueueMutation(async()=>{let b=a.entries;if(!Array.isArray(b))throw Error("import_queue requires entries[]");this.validateQueueEntries(b);let c=0;for(let a of b){if("steer"!==a.kind&&"followUp"!==a.kind||"string"!=typeof a.text)continue;let b=(0,k.Gc)(a.kind,a.text,a.images);await this.requeueEntry(b),this.ensureMirrored(b),c+=1}return this.persistQueue(),{imported:c,steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]}});case"stage_recovery":return this.withQueueMutation(async()=>{let b=a.entries;if(!Array.isArray(b))throw Error("stage_recovery requires entries[]");this.validateQueueEntries(b);let c=0;for(let a of b)("steer"===a.kind||"followUp"===a.kind)&&"string"==typeof a.text&&(this.queueRecovery.push((0,k.Gc)(a.kind,a.text,a.images)),c+=1);return this.persistQueue(),{staged:c,pendingRecovery:this.pendingRecoveryView()}});case"steer":return this.withQueueMutation(async()=>{let b=a.images;this.hintQueueImages("steer",b),this.promptPhase="waiting_model",X();try{await this.inner.steer(a.message,b?.length?b:void 0)}finally{this.promptPhase=null,X()}return null});case"follow_up":return this.withQueueMutation(async()=>{let b=a.images;this.hintQueueImages("followUp",b),this.promptPhase="waiting_model",X();try{await this.inner.followUp(a.message,b?.length?b:void 0)}finally{this.promptPhase=null,X()}return null});case"get_tools":{let a=this.inner.getAllTools(),b=new Set(this.inner.getActiveToolNames());return a.map(a=>({...a,active:b.has(a.name)}))}case"get_commands":{let a=[];for(let b of this.inner.extensionRunner.getRegisteredCommands())a.push({name:b.invocationName,description:b.description,source:"extension",sourceInfo:b.sourceInfo});for(let b of this.inner.promptTemplates)a.push({name:b.name,description:b.description,source:"prompt",sourceInfo:b.sourceInfo});for(let b of this.inner.resourceLoader.getSkills().skills)a.push({name:`skill:${b.name}`,description:b.description,source:"skill",sourceInfo:b.sourceInfo});return{commands:a}}case"set_tools":{let b=a.toolNames;return this.setActiveToolSelection(b),null}case"reload":{let a=this.inner.getActiveToolNames();return await this.waitForExtensionsBound(),this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.syncProjectTrust(),await this.inner.reload(),this.inner.setActiveToolsByName(K(this.inner,a)),"function"!=typeof this.inner.bindExtensions&&this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc"),this.applyForcedEmptySystemPrompt(),{success:!0}}case"abort_compaction":return this.inner.abortCompaction(),null;case"resolve_approval":return{resolved:this.resolveApproval(a.id,!!a.approve,a.reason)};case"set_approval_mode":{let b=a.mode;if("ask"!==b&&"auto"!==b&&"yolo"!==b)throw Error(`Invalid approval mode: ${String(b)}`);return this.setApprovalMode(b),null}case"set_approval_policy":{let b=a.policy;return this.setApprovalPolicy((0,B.ni)(b)),null}case"get_approval_state":return{mode:this.approvalMode,pending:this.getPendingApprovals()};case"extension_ui_response":return this.resolveExtensionUiResponse(a),null;case"extension_ui_input":return this.handleExtensionUiInput(a.id,a.data),null;case"set_auto_retry":return this.inner.setAutoRetryEnabled?.(a.enabled),null;case"bash":{if(this.promptRunning||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)throw Error("Cannot run a shell command while the session is busy");let b=this.inner.settingsManager?.getShellPath?.(),c=(0,y.J1)("string"==typeof b&&b?{shellPath:b}:{}),d=this.inner.executeBash(a.command,void 0,{excludeFromContext:a.excludeFromContext,operations:c});try{let a=await d;return this.persistSessionFileIfMissing(),a}finally{this.resetIdleTimer(),(0,o.mD)()}}case"abort_bash":return this.forceShutdownOnIdle=!0,this.inner.abortBash(),X(),null;default:throw Error(`Unsupported command: ${b}`)}}finally{d&&(this.activeMutatingCommands=Math.max(0,this.activeMutatingCommands-1))}}destroy(){if(!this._alive)return;for(let a of(this._alive=!1,this.cancelQueuedRun(),this.cancelGoalContinuation(),this.idleTimer&&clearTimeout(this.idleTimer),this.cancelPendingDispose(),this.inner.isBashRunning&&this.inner.abortBash(),this.unsubscribe?.(),this.emit({type:"session_shutdown"}),this.sessionFile&&!this.persistenceRevoked&&this.goalEngine.hasActiveGoal()&&(0,H.eG)(this.sessionFile,this.goalEngine.getState()),this.pendingUiResponses.values()))a.cancel();for(let a of Array.from(this.activeCustomUis.keys()))this.closeCustomUi(a,void 0);this.pendingUiResponses.clear(),this.pendingUiRequests.clear(),this.activeToolEvents.clear(),this.rejectAllApprovals("Session closed while approval was pending");let a=()=>{try{this.inner.dispose()}finally{try{this.onDestroyCallback?.()}finally{X()}}};if(this.sessionShutdownEmitted)return void a();this.sessionShutdownEmitted=!0;let b=this.inner.extensionRunner?.emit;"function"!=typeof b?a():Promise.resolve().then(()=>b.call(this.inner.extensionRunner,{type:"session_shutdown",reason:"quit"})).catch(a=>{console.error("[pi-web] session_shutdown before dispose failed:",a instanceof Error?a.message:a)}).finally(a)}revokePersistenceForDeletion(){this.persistenceRevoked=!0,L(this.inner.sessionManager),this.cancelQueuedRun(),this.cancelGoalContinuation()}async drainForSessionRewrite(){this.cancelQueuedRun(),this.cancelGoalContinuation(),this.extensionUiAbortController.abort(new DOMException("Session is being changed","AbortError")),await this.inner.abort()}async shutdown(){return this.shutdownPromise?this.shutdownPromise:this._alive?(this.cancelQueuedRun(),this.cancelGoalContinuation(),this.shutdownPromise=(async()=>{try{try{await this.waitForExtensionsBound()}catch(a){console.error("[pi-web] extension binding failed before session shutdown:",a instanceof Error?a.message:a)}this.sessionShutdownEmitted||(this.sessionShutdownEmitted=!0,await this.inner.extensionRunner.emit?.({type:"session_shutdown",reason:"quit"}))}finally{this.destroy()}})(),this.shutdownPromise):void 0}resolveExtensionUiResponse(a){let b=this.pendingUiResponses.get(a.id);b&&b.resolve(a)}getExtensionStatuses(){return Array.from(this.extensionStatuses,([a,b])=>({key:a,text:b}))}getExtensionWidgets(){return Array.from(this.extensionWidgets.values())}getCustomUiWidth(a){if(!a||"object"!=typeof a)return F.p1;let b=a.overlayOptions,c="function"==typeof b?b():b;if(!c||"object"!=typeof c)return F.p1;let d=c.width;return"number"==typeof d&&Number.isFinite(d)?Math.max(40,Math.min(140,Math.round(d))):F.p1}emitCustomUiRender(a,b){let c;try{c=b.component.render(b.width)}catch(a){c=[`Extension custom UI render failed: ${a instanceof Error?a.message:String(a)}`]}let d={type:"extension_ui_request",id:a,method:"custom",lines:c};this.pendingUiRequests.set(a,d),this.emit(d)}closeCustomUi(a,b){let c=this.activeCustomUis.get(a);if(c&&!c.settled){c.settled=!0,this.activeCustomUis.delete(a),this.pendingUiRequests.delete(a);try{c.component.dispose?.()}catch{}this.emit({type:"extension_ui_request",id:a,method:"custom",lines:[],closed:!0}),c.resolve(b)}}handleExtensionUiInput(a,b){let c=this.activeCustomUis.get(a);if(c&&"string"==typeof b)try{c.component.handleInput?.(b),this.activeCustomUis.has(a)&&this.emitCustomUiRender(a,c)}catch(b){this.closeCustomUi(a,void 0),this.emit({type:"extension_error",extensionPath:`custom-ui:${a}`,event:"custom_ui_input",error:b instanceof Error?b.message:String(b)})}}requestExtensionCustomUi(a,b){if("function"!=typeof a)return Promise.resolve(void 0);let c=this.extensionUiAbortController.signal;if(c.aborted)return Promise.reject(c.reason);let d=(0,g.randomUUID)(),e=this.getCustomUiWidth(b);return new Promise((b,f)=>{let g=!1,h=(0,F.TQ)(()=>{let a=this.activeCustomUis.get(d);a&&this.emitCustomUiRender(d,a)},e),i=a=>{g||(g=!0,c.removeEventListener("abort",k),c.aborted?f(c.reason):b(a))},j=a=>{this.activeCustomUis.has(d)?this.closeCustomUi(d,a):i(a)},k=()=>j(void 0);c.addEventListener("abort",k,{once:!0}),Promise.resolve().then(()=>g?void 0:a(h,ap,aq,j)).then(a=>{if(g){try{a?.dispose?.()}catch{}return}if(!a||"object"!=typeof a||"function"!=typeof a.render)return void i(void 0);let b={component:a,width:e,resolve:a=>i(a),settled:!1};this.activeCustomUis.set(d,b),this.emitCustomUiRender(d,b)}).catch(a=>{g||(this.emit({type:"extension_error",extensionPath:`custom-ui:${d}`,event:"custom_ui",error:a instanceof Error?a.message:String(a)}),i(void 0))})})}requestExtensionUi(a,b,c,d,e){if(e?.aborted)return Promise.resolve(b);let f=this.extensionUiAbortController.signal;if(f.aborted)return Promise.reject(f.reason);let h=e?AbortSignal.any([e,f]):f,i=(0,g.randomUUID)(),j={type:"extension_ui_request",id:i,...a,...d?{timeout:d,expiresAt:Date.now()+d}:{}};return new Promise((a,e)=>{let g,k=!1,l=()=>{g&&clearTimeout(g),h.removeEventListener("abort",n),this.pendingUiRequests.delete(i),this.pendingUiResponses.delete(i),this.emit({type:"extension_ui_closed",id:i})},m=b=>{k||(k=!0,l(),f.aborted?e(f.reason):a(b))},n=()=>m(b);d&&(g=setTimeout(()=>m(b),d)),h.addEventListener("abort",n,{once:!0}),this.pendingUiRequests.set(i,j),this.pendingUiResponses.set(i,{resolve:a=>m(c(a)),cancel:()=>m(b)}),this.emit(j)})}createExtensionUiContext(){return{select:(a,b,c)=>this.requestExtensionUi({method:"select",title:a,options:b,...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),confirm:(a,b,c)=>this.requestExtensionUi({method:"confirm",title:a,message:b,...c?.timeout?{timeout:c.timeout}:{}},!1,a=>"confirmed"in a&&a.confirmed,c?.timeout,c?.signal),input:(a,b,c)=>this.requestExtensionUi({method:"input",title:a,...void 0!==b?{placeholder:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),editor:(a,b,c)=>this.requestExtensionUi({method:"editor",title:a,...void 0!==b?{prefill:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),notify:(a,b)=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",message:a,notifyType:b})},onTerminalInput:()=>()=>{},setStatus:(a,b)=>{void 0===b?this.extensionStatuses.delete(a):this.extensionStatuses.set(a,b),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setStatus",statusKey:a,statusText:b})},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:(a,b,c)=>{(void 0===b||Array.isArray(b))&&(void 0===b?this.extensionWidgets.delete(a):this.extensionWidgets.set(a,{key:a,lines:b,placement:c?.placement??"aboveEditor"}),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:b,widgetPlacement:c?.placement}))},setFooter:()=>{},setHeader:()=>{},setTitle:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setTitle",title:a})},custom:(a,b)=>this.requestExtensionCustomUi(a,b),pasteToEditor:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},setEditorText:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},getEditorText:()=>"",addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>void 0,get theme(){return ap},getAllThemes:()=>[],getTheme:()=>void 0,setTheme:()=>({success:!1,error:"Theme switching is not supported in pi-web extension UI yet"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}}}syncProjectTrust(){this.inner.settingsManager.setProjectTrusted((0,n.Y1)(this.cwd,(0,e.getAgentDir)()).trusted)}createExtensionCommandContextActions(){return{waitForIdle:async()=>{let a=this.inner.agent;await a.waitForIdle?.()},newSession:async()=>({cancelled:!0}),fork:async()=>({cancelled:!0}),navigateTree:async(a,b)=>({cancelled:(await this.inner.navigateTree(a,{summarize:b?.summarize})).cancelled}),switchSession:async()=>({cancelled:!0}),reload:async()=>{this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.syncProjectTrust(),await this.inner.reload({beforeSessionStart:()=>{this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc")}}),this.applyExactSystemPrompt()}}}}function L(a){a&&(a.persist=!1)}function M(a){globalThis.__piSessionLifecycles??=new Map;let b=globalThis.__piSessionLifecycles.get(a);return b||(b={generation:0,barriers:0,deleted:!1,starts:new Set},globalThis.__piSessionLifecycles.set(a,b)),b}function N(a,b){let c=M(a);if(c.deleted||c.barriers>0||void 0!==b&&c.generation!==b)throw Error("Session was deleted or is being changed; retry after the operation finishes")}function O(a){let b=[...new Set(a)].map(a=>[a,M(a)]),c=new Set;for(let[,a]of b)for(let b of(a.generation+=1,a.barriers+=1,a.starts))c.add(b);for(let a of c)a.cancel(Error("Session startup cancelled: session is being deleted or changed"));let d=!1;return{ready:Promise.allSettled([...c].map(a=>a.settled)).then(()=>void 0),finish:(a=[])=>{if(d)return;d=!0;let c=new Set(a);for(let[a,d]of b)d.barriers-=1,c.has(a)&&(d.deleted=!0)}}}function P(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let a=()=>Promise.allSettled(Array.from(globalThis.__piSessions?.values()??[],a=>a.shutdown()));process.once("exit",()=>globalThis.__piSessions?.forEach(a=>a.destroy())),process.once("SIGINT",()=>{a().finally(()=>process.exit(130))}),process.once("SIGTERM",()=>{a().finally(()=>process.exit(143))})}return globalThis.__piSessions}function Q(a){let b=(0,i.resolve)(a);try{return(0,h.realpathSync)(b)}catch{return b}}function R(){return globalThis.__piStartingSessionCwds||(globalThis.__piStartingSessionCwds=new Map),globalThis.__piStartingSessionCwds}function S(a){return P().get(a)}function T(a){let b=Q(a);return!!R().has(b)||Array.from(P().values()).some(a=>Q(a.cwd)===b&&a.isRunning())}async function U(a){let b=Q(a),c=Array.from(P().values()).filter(a=>Q(a.cwd)===b);return await Promise.all(c.map(a=>a.shutdown())),c.length}function V(){let a=[];for(let[b,c]of P()){if(!c.isAlive())continue;let d=c.runtimeSnapshot();d.running&&a.push({...d,id:d.id||b})}return a}function W(a){return globalThis.__piRunningListeners??=new Set,globalThis.__piRunningListeners.add(a),()=>globalThis.__piRunningListeners?.delete(a)}let as="";function X(){let a=globalThis.__piRunningListeners;if(!a||0===a.size){as="";return}let b=V(),c=JSON.stringify(b);if(c!==as)for(let d of(as=c,a))try{d(b)}catch{}}async function Y(a,b,c){let d=void 0===c?void 0:(0,r.vw)(c),f=S(a);if(!f?.isAlive()){if(!b)throw Error("Session not found");let c=e.SessionManager.open(b,void 0);if((0,q.ph)(c.getEntries()))throw Error("Subagent tool selection is fixed by its profile");void 0===d?(0,r.lp)(c):(0,r.b5)(c,d),(0,o.mD)();let f=await ah(a,b,void 0);return{session:f.session,sessionId:f.realSessionId,recreated:!1}}if(f.isRunning())throw Error("Cannot change tools while the session is running");if((0,q.ph)(f.inner.sessionManager.getEntries()))throw Error("Subagent tool selection is fixed by its profile");let i="function"==typeof f.isChatOnly&&"function"==typeof f.setActiveToolSelection,j=void 0===d||!i||(0,s.r3)({currentChatOnly:f.isChatOnly(),nextTools:d});if(void 0===d?(0,r.lp)(f.inner.sessionManager):(0,r.b5)(f.inner.sessionManager,d),(0,o.mD)(),void 0!==d&&!j)return f.setActiveToolSelection(d),{session:f,sessionId:a,recreated:!1};let k=f.sessionFile&&(0,h.existsSync)(f.sessionFile)?f.sessionFile:void 0,l=f.cwd,m=f.inner.model,n=f.inner.agent.state?.thinkingLevel;if(await f.shutdown(),k){let b=await ah(a,k,void 0);return{session:b.session,sessionId:b.realSessionId,recreated:!0}}let p=await ah(`__recreate__${(0,g.randomUUID)()}`,"",l,{...void 0!==d?{toolNames:d}:{},...m?{initialModel:{provider:m.provider,modelId:m.id}}:{},allowInitialModelFallback:!0,...n&&ai.has(n)?{thinkingLevel:n}:{}});return{session:p.session,sessionId:p.realSessionId,recreated:!0}}function Z(a={}){let b=[];for(let c of P().values()){if("function"!=typeof c.isAlive||!c.isAlive())continue;let d=c.inner?.sessionManager;if(!d)continue;let e=d.getHeader(),f=d.getEntries(),g=f.filter(a=>"message"===a.type),i=g.find(a=>"user"===a.message.role),j=d.getSessionFile()??c.sessionFile,k=!!(j&&(0,h.existsSync)(j)),l=(0,q.$u)(f,e?.id??c.sessionId,j??"");if(!k&&!a.includeTransient&&(!c.isRunning()||!i))continue;let m=e?.timestamp??f[0]?.timestamp??new Date().toISOString(),n=new Date(m).getTime(),o=Number.isNaN(n)?Date.now():n;for(let a of g){let b=function(a){if("user"!==a.message.role&&"assistant"!==a.message.role)return;if("number"==typeof a.message.timestamp)return a.message.timestamp;let b=new Date(a.timestamp).getTime();return Number.isNaN(b)?void 0:b}(a);void 0!==b&&(o=Math.max(o,b))}b.push({path:j??"",id:e?.id??c.sessionId,cwd:e?.cwd??c.cwd,name:d.getSessionName(),created:m,modified:new Date(o).toISOString(),messageCount:g.length,firstMessage:i&&function(a){if("bashExecution"===a.message.role)return"";let b=a.message.content;return"string"==typeof b?b:b.map(a=>"text"===a.type?a.text:"").filter(Boolean).join(" ")}(i)||"(no messages)",...l?{parentSessionId:l.parentSessionId,relation:{kind:"subagent",parentSessionId:l.parentSessionId,profile:l.profile,description:l.description,status:c.isRunning()?"running":l.status}}:{},transient:!k})}return b}function $(){let a=new Set;for(let[b,c]of P())c.isRunning()&&c.hasSuppressedCompletionNotifications()&&a.add(c.sessionId||b);return[...a]}function _(){return V().map(a=>a.id)}let at=(0,u.s)({getSession:a=>P().get(a),registerSession:(a,b)=>{let c,d,e;c=new ar(a,a.sessionManager.getCwd()),b?.chatOnly?c.setForceEmptySystemPrompt(!0):b?.exactSystemPrompt&&c.setExactSystemPrompt(b.exactSystemPrompt),c.setChatOnly(!!b?.chatOnly),c.setSuppressCompletionNotifications(!0),c.start(),d=a.sessionId,e=P(),c.onDestroy(()=>e.delete(d)),e.set(d,c)},reopenSession:async(a,b)=>(await ah(a,b,void 0)).session,resolveSessionPath:o.os,invalidateSessionList:o.mD,notifyRunningChange:X,isBuiltInSubagentsEnabled:v.N});function aa(a){return at.get(a)}function ab(a,b){return at.steer(a,b)}function ac(a){return at.abort(a)}function ad(a){return globalThis.__piSessionBusListeners??=new Set,globalThis.__piSessionBusListeners.add(a),()=>globalThis.__piSessionBusListeners?.delete(a)}!function(){try{let a=(0,v.M6)();if((0,h.existsSync)(a))return;(0,h.mkdirSync)(a.slice(0,a.lastIndexOf("/")),{recursive:!0}),(0,h.writeFileSync)(a,JSON.stringify({builtInEnabled:!0},null,2)+"\n")}catch(a){console.warn("[pi-web] failed to seed agents/settings.json:",a instanceof Error?a.message:a)}}();let au=new Map;function ae(a){let b=globalThis.__piSessionBusListeners;if(b&&0!==b.size)for(let c of b)try{c(a)}catch{}}function af(a,b,c){let d=globalThis.__piSessionBusListeners;if(!d||0===d.size)return;if("message_update"!==a)return void ae({type:a,sessionId:b,payload:c});let e=au.get(b),f={type:a,sessionId:b,payload:c};e?(clearTimeout(e.timer),e.event=f):au.set(b,{event:f,timer:setTimeout(()=>{let a=au.get(b);a&&(au.delete(b),ae(a.event))},80)})}function ag(a,b){let c=Date.now(),{provider:d,modelId:e,sessionId:f}=b,g=a.result.bind(a);a.result=async()=>{let a,b,h,i,j,k=await g();return a=Date.now()-c,b="error"===k.stopReason||"aborted"===k.stopReason,h=k.errorMessage?.trim(),j=(i=h?.match(/\bHTTP\s+(\d{3})\b|\bstatus(?:\s+code)?\s*[:=]?\s*(\d{3})\b/))?Number(i[1]??i[2]):void 0,(0,G.wF)({level:b?"error":"info",source:"model-call",provider:d,model:e,sessionId:f,...void 0!==j?{statusCode:j}:{},message:b?`模型调用失败 ${d}/${e}${h?`:${h}`:""}`:`模型调用成功 ${d}/${e}`,details:b?void 0:`耗时 ${a}ms`}),k};let h=a[Symbol.asyncIterator].bind(a);return a[Symbol.asyncIterator]=()=>{let a=h();return{next:()=>a.next().catch(a=>{throw(0,G.wF)({level:"error",source:"model-call",provider:d,model:e,sessionId:f,message:`模型调用传输错误 ${d}/${e}:${a instanceof Error?a.message:String(a)}`}),a})}},a}async function ah(a,b,d,f={}){let g,i,j,k,t,u,w,x,y,A,{toolNames:B,initialModel:C,thinkingLevel:F,allowInitialModelFallback:G}=f,H=P(),J=(globalThis.__piStartLocks||(globalThis.__piStartLocks=new Map),globalThis.__piStartLocks),O=M(a),S=O.generation;N(a,S);let T=H.get(a);if(T?.isAlive()&&!T.isShuttingDown())return{session:T,realSessionId:a,created:!1};if(T){let a=T.whenShutdown();if(a){let b;try{await Promise.race([a,new Promise(a=>{b=setTimeout(a,1e4)})])}finally{clearTimeout(b)}}}N(a,S);let U=J.get(a);if(U)return U;if(b){if(!(0,h.existsSync)(b))throw Error("Session not found");if((g=e.SessionManager.open(b,void 0)).getSessionId()!==a)throw Error("Session identity changed")}else{if(!d)throw Error("cwd is required for a new session");g=e.SessionManager.create(d,void 0)}let V=g.getSessionId(),W=M(V),X=W.generation;N(V,X);let Y=g.getCwd(),Z=g.getEntries(),$=b?(0,q.ph)(Z):null,_=$?void 0:(0,r.dS)(Z);$||void 0!==_||void 0===B||(0,r.b5)(g,B);let aa=(y=R(),A=Q(Y),y.set(A,(y.get(A)??0)+1),()=>{let a=(y.get(A)??1)-1;a>0?y.set(A,a):y.delete(A)}),ab=new AbortController,ac=setTimeout(()=>ab.abort(),25e3),ad=!1,ae=!1,af=()=>{if(k&&!ae){ae=!0;try{k.cleanup()}catch{}}},ai=()=>{L(g);let a=t;if(a&&w!==a)if(w=a,u)u.destroy();else try{a.dispose()}catch{}af()},aj=new Promise((a,b)=>{x=b}),ak={settled:Promise.resolve(),cancel:a=>{j||(j=a,ab.abort(a),ai(),x(a))}};O.starts.add(ak),W.starts.add(ak);let al=()=>{if(j)throw j;N(a,S),N(V,X)},am=(async()=>{let b=(0,s.Qf)({subagentTools:$?.tools,persistedTools:_,requestedTools:B}),d=(0,s.J7)({toolSelection:b,subagentLoadsResources:!!($?.loadExtensions||$?.loadSkills)});d||(0,e.initTheme)();let f=(0,e.getAgentDir)(),h=$?.tools;$||void 0===b||(h=0===b.length?[]:void 0);let r=!!($?.loadExtensions||$?.loadSkills),w=$?r?(0,n.Fk)(Y,f):void 0:(0,n.Fk)(Y,f),x={},y=(0,E.Q)(()=>x.current?.()),A=d||$?.exactSystemPrompt!==void 0,J=await (0,e.createAgentSessionServices)({cwd:Y,agentDir:f,modelRuntimeSignal:ab.signal,resourceLoaderOptions:$?{noExtensions:!0,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,appendSystemPrompt:$.appendSystemPrompt,...A?{extensionFactories:[y]}:{}}:d?{...D.M,extensionFactories:[y]}:{extensionFactories:[(0,p.Vj)(at.extensionRuntime,()=>(0,q.IR)(Y),v.N)],extensionsOverride:a=>(0,p.U6)(a)},...w?{resourceLoaderReloadOptions:w}:{}});al();let{createAsyncBashTools:L}=await Promise.resolve().then(c.bind(c,44271));al(),k=new I.B;let M=L(k),N=await (0,m.py)(J.modelRuntime,J.settingsManager.getEnabledModels(),{signal:ab.signal});al();let O=C&&(!G||N.visible.some(a=>a.provider===C.provider&&a.id===C.modelId))?C:void 0,Q=J.settingsManager.getDefaultProvider(),R=J.settingsManager.getDefaultModel(),S=g.getBranch(),T=S.some(a=>"message"===a.type&&"system"!==a.message.role),U=T?(0,o.Vg)(S):null,V=U?J.modelRuntime.getModel(U.provider,U.modelId):void 0,W=T?null:(0,m.IR)(N,{...O?{requestedModel:O}:{},...Q&&R?{defaultModel:{provider:Q,modelId:R}}:{},...F?{thinkingLevel:F}:{}}),X=V&&J.modelRuntime.hasConfiguredAuth(V.provider)?V:W?.model;al();let Z=(0,e.createAgentSessionFromServices)({services:J,sessionManager:g,...X?{model:X}:{},...W?.thinkingLevel?{thinkingLevel:W.thinkingLevel}:{},...N.scopedModels.length>0?{scopedModels:[...N.scopedModels]}:{},...void 0!==h?{tools:h}:{},customTools:M});Z.then(({session:a})=>{t=a,j&&ai()},()=>{}),i=setTimeout(()=>{ak.cancel(Error("Session startup timed out while binding extensions/resources (40s)"))},4e4);let{session:aa}=await Promise.race([Z,aj]);clearTimeout(i),al();try{let c=aa.agent,e=c.streamFunction;c.streamFunction=(b,c,d)=>{let f=e(b,c,d);return f instanceof Promise?f.then(c=>ag(c,{provider:b.provider,modelId:b.id,sessionId:a})):ag(f,{provider:b.provider,modelId:b.id,sessionId:a})},al();let f=await (0,z.o)(J.settingsManager,{...C?{model:C}:{},...F?{thinkingLevel:F}:{}},{...aa.model?{model:{provider:aa.model.provider,modelId:aa.model.id}}:{},thinkingLevel:aa.agent.state?.thinkingLevel??"off",supportsThinking:aa.supportsThinking()});al(),f.modelDefaultChanged&&(0,l.k)(),$||d||void 0===b||aa.setActiveToolsByName(K(aa,b)),al();let g=new ar(aa,Y);u=g,g.setChatOnly(d),g.setSuppressCompletionNotifications(void 0!==$),b?.length===0?g.setForceEmptySystemPrompt(!0):$&&$.appendSystemPrompt.length>0&&g.setExactSystemPrompt($.appendSystemPrompt[0]);let h=$?.exactSystemPrompt!==void 0?$.exactSystemPrompt:d?$?$.appendSystemPrompt[0]??"":(0,D.c)(aa.resourceLoader.getAgentsFiles().agentsFiles):null;x.current=null===h?void 0:()=>h,null!==h&&g.setExactSystemPrompt(h),g.start(),g.loadQueueRecovery();let i=aa.sessionId,j=aa.sessionFile;return j&&(0,o.O8)(i,j),g.persistSessionFileIfMissing(),g.onDestroy(()=>{af(),H.get(i)===g&&H.delete(i)}),H.set(i,g),g.beginExtensionBinding({forceEmptySystemPrompt:b?.length===0}),!function(){!function(){let a=globalThis.__piSessionLifecycles;if(!a||0===a.size)return;let b=P();for(let[c,d]of a)d.deleted||d.barriers>0||d.starts.size>0||b.has(c)||a.delete(c)}();let a=P();if(a.size<=12)return;let b=Array.from(a.entries()).filter(([,a])=>a.isAlive()&&!a.isRunning()&&!a.hasSubscribers()).sort((a,b)=>a[1].activityTimestamp-b[1].activityTimestamp),c=a.size-12;for(let[d,e]of b){if(c<=0)break;a.has(d)&&(console.log(`[pi-web] evicting idle unwatched session ${d} (registry cap 12)`),e.shutdown().catch(a=>{console.error(`[pi-web] failed to evict session ${d}:`,a instanceof Error?a.message:a)}),c-=1)}}(),{session:g,realSessionId:i,created:!0}}catch(a){throw ai(),a}})().catch(a=>{throw ai(),a}),an=setTimeout(()=>{ak.cancel(Error("Session startup timed out after 60s (extension/resource binding may be hung); the start lock was released — retry the request to start over."))},6e4),ao=Promise.race([am,aj]).finally(()=>{J.get(a)===ao&&J.delete(a),ad||(ad=!0,clearTimeout(ac),clearTimeout(an),clearTimeout(i),O.starts.delete(ak),W.starts.delete(ak),aa())});return ak.settled=ao,J.set(a,ao),ao}d()}catch(a){d(a)}})},64735:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{S3:()=>k,lN:()=>j});var e=c(6999),f=c(67264),g=c(36193),h=a([e]);e=(h.then?(await h)():h)[0];let l="modes",m="modesPerSession";function i(a){if(!a||"object"!=typeof a||Array.isArray(a))return null;let b=a.permissionRules,c=(0,g.kP)((0,g.ni)(b));return{collaborationMode:(0,f.UY)(a.collaborationMode),tokenMode:(0,f.wI)(a.tokenMode),toolApprovalMode:(0,f.g0)(a.toolApprovalMode),permissionRules:{allow:Array.isArray(c.allow)?c.allow:[],ask:Array.isArray(c.ask)?c.ask:[],deny:Array.isArray(c.deny)?c.deny:[]}}}function j(a){let b=(0,f.Md)(),c=(0,e.Tu)();if(a){let b=c[m];if(b&&"object"==typeof b&&!Array.isArray(b)){let c=i(b[a]);if(c)return c}}return i(c[l])??b}async function k(a,b){let c={collaborationMode:(0,f.UY)(a.collaborationMode),tokenMode:(0,f.wI)(a.tokenMode),toolApprovalMode:(0,f.g0)(a.toolApprovalMode),permissionRules:a.permissionRules};await (0,e.o$)(a=>{if(b){let d=a[m]??{};d[b]=c,a[m]=d}else a[l]=c;return{settings:a}})}d()}catch(a){d(a)}})},71069:(a,b,c)=>{c.d(b,{TQ:()=>e,p1:()=>d});let d=92;function e(a,b=d,c=40){return Object.freeze({terminal:Object.freeze({columns:b,rows:c,kittyProtocolActive:!1}),requestRender:a})}},71212:(a,b,c)=>{c.d(b,{Q:()=>d});function d(a){return{name:"pi-web-exact-system-prompt",hidden:!0,factory:b=>{b.on("before_agent_start",()=>{let b=a();return void 0===b?void 0:{systemPrompt:b}})}}}},72498:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Fk:()=>i,Y1:()=>g,er:()=>h});var e=c(75430),f=a([e]);function g(a,b){return a&&(0,e.hasTrustRequiringProjectResources)(a)?{requiresTrust:!0,trusted:!0===new e.ProjectTrustStore(b).get(a)}:{requiresTrust:!1,trusted:!0}}function h(a,b){let c=g(a,b);return c.requiresTrust?(new e.ProjectTrustStore(b).set(a,!0),{requiresTrust:!0,trusted:!0}):c}function i(a,b){if(!g(a,b).requiresTrust)return;let c=new e.ProjectTrustStore(b);return{resolveProjectTrust:async()=>!0===c.get(a)}}e=(f.then?(await f)():f)[0],d()}catch(a){d(a)}})},78963:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{H4:()=>m,kx:()=>k,qV:()=>o,t0:()=>n});var e=c(73024),f=c(76760),g=c(75430),h=c(80974),i=c.n(h),j=a([g]);function k(a=(0,g.getAgentDir)()){return(0,f.join)(a,"extension-tools.json")}function l(a){return"object"!=typeof a||null===a||Array.isArray(a)?{disabled:[]}:{disabled:Array.isArray(a.disabled)?[...new Set(a.disabled.filter(a=>"string"==typeof a&&""!==a.trim()).map(a=>a.trim()))]:[]}}function m(a,b){if(0===b.disabled.length)return[...a];let c=new Set(b.disabled);return a.filter(a=>!c.has(a))}function n(a=k()){if(!(0,e.existsSync)(a))return{disabled:[]};try{return l(JSON.parse((0,e.readFileSync)(a,"utf8")))}catch{return{disabled:[]}}}async function o(a,b=k()){let c=l(a);(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0});try{(0,e.writeFileSync)(b,JSON.stringify({version:1,disabled:[]},null,2),{flag:"wx",mode:384})}catch(a){if("EEXIST"!==a.code)throw a}let d=await i().lock(b,{realpath:!1,retries:10});try{(0,e.writeFileSync)(b,`${JSON.stringify({version:1,disabled:c.disabled},null,2)}
|
|
25
25
|
`,"utf8"),(0,e.chmodSync)(b,384)}finally{await d()}return c}g=(j.then?(await j)():j)[0],d()}catch(a){d(a)}})},78970:(a,b,c)=>{c.d(b,{kc:()=>d});function d(a){if(void 0===a)return null;if(!Array.isArray(a))return"images must be an array";if(a.length>10)return"A message can include at most 10 images";for(let b of a)if(!function(a){var b;if(!a||"object"!=typeof a||"image"!==a.type||"string"!=typeof a.data||"string"!=typeof a.mimeType||(b=a.mimeType,!/^image\/[A-Za-z0-9][A-Za-z0-9!#$&^_.+-]*$/.test(b)))return!1;let c=function(a){if(!a||a.length%4!=0)return null;let b=a.endsWith("==")?2:+!!a.endsWith("="),c=a.length-b,d=null;for(let b=0;b<c;b+=1){var e;let c=(e=a.charCodeAt(b))>=65&&e<=90?e-65:e>=97&&e<=122?e-97+26:e>=48&&e<=57?e-48+52:43===e?62:47===e?63:null;if(null===c)return null;d=c}for(let b=c;b<a.length;b+=1)if("="!==a[b])return null;return 2===b&&d%16!=0||1===b&&d%4!=0?null:a.length/4*3-b}(a.data);return null!==c&&c<=0xa00000}(b))return"Each image must be valid base64 image data with an image MIME type and be 10MB or smaller";return null}},95412:(a,b,c)=>{function d(a,b){if("string"!=typeof a||0===a.trim().length)throw Error(`Session liveness provider ${b} must be a non-empty string`)}c.d(b,{Vj:()=>j,mb:()=>h,u4:()=>i});let e=function(){let a,b=globalThis,c=Symbol.for("@agegr/pi-web/session-liveness/v1"),e=b[c];if(e&&"object"==typeof e&&1===e.version&&"function"==typeof e.register&&"function"==typeof e.hasActiveProvider)return e;let f=(a=new Map,{version:1,register(b){if(!b||"object"!=typeof b)throw Error("Session liveness provider must be an object");if(d(b.name,"name"),d(b.sessionId,"sessionId"),void 0!==b.sessionFile&&d(b.sessionFile,"sessionFile"),"function"!=typeof b.isActive)throw Error("Session liveness provider isActive must be a function");let c=Symbol(b.name);a.set(c,b);let e=!1;return()=>{e||(e=!0,a.delete(c))}},hasActiveProvider(b){let c=new Set([b.sessionId,b.sessionFile].filter(a=>!!a));for(let b of a.values())if(c.has(b.sessionId)||b.sessionFile&&c.has(b.sessionFile))try{let a=b.isActive();if("boolean"!=typeof a)throw Error("isActive() must return a boolean");if(a)return!0}catch(a){return console.error(`[pi-web] Session liveness provider '${b.name}' failed; preserving the session:`,a),!0}return!1}});return b[c]=f,f}();function f(){let a=globalThis,b=Symbol.for("@agegr/pi-web/session-liveness-leases/v1"),c=a[b];if(c instanceof Map)return c;let d=new Map;return a[b]=d,d}function g(a){a.timer&&clearTimeout(a.timer),a.timer=setTimeout(()=>{!a.released&&a.expiresAt<=Date.now()?a.release():a.released||g(a)},Math.max(1,a.expiresAt-Date.now()));let b=a.timer.unref;b?.call(a.timer)}function h(a){var b;let c=f(),d=(b={name:"pi-web-selected-session",sessionId:a,isActive:()=>!h.released&&h.expiresAt>Date.now()},e.register(b)),h={sessionId:a,expiresAt:Date.now()+9e4,released:!1,timer:null,renew:()=>{h.released||(h.expiresAt=Date.now()+9e4,g(h))},release:()=>{if(h.released)return;h.released=!0,h.timer&&clearTimeout(h.timer),d();let b=c.get(a);b?.delete(h),b?.size===0&&c.delete(a)}},i=c.get(a)??new Set;return i.add(h),c.set(a,i),g(h),h}function i(a){let b=f().get(a);if(!b)return 0;let c=0;for(let a of[...b]){if(a.released||a.expiresAt<=Date.now()){a.release();continue}a.renew(),c+=1}return c}function j(a){return e.hasActiveProvider(a)}},99324:(a,b,c)=>{c.d(b,{Wv:()=>h,jN:()=>j,vH:()=>i});var d=c(29021),e=c(33873),f=c(82536),g=c(58864);let h=8;function i(a,b){if(b.length>h)throw Error(`Agent input_files accepts at most ${h} files`);let c=(0,d.realpathSync)(a),i=new Set([c]),j=new TextDecoder("utf-8",{fatal:!0}),k=new Set,l=[],m=0;for(let h of b){let b,n;if(!h.trim())throw Error("Agent input_files paths must not be empty");try{b=(0,d.realpathSync)((0,e.resolve)(a,h))}catch{throw Error(`Agent input file does not exist: ${h}`)}if(!(0,f.o)(b,i))throw Error(`Agent input file is outside the session cwd: ${h}`);if(!(0,d.statSync)(b).isFile())throw Error(`Agent input path is not a file: ${h}`);if(k.has(b))continue;k.add(b);let o=(0,d.readFileSync)(b);if((m+=o.byteLength)>524288)throw Error("Agent input_files exceeds the 524288-byte total limit");try{n=j.decode(o)}catch{throw Error(`Agent input file is not valid UTF-8 text: ${h}`)}l.push({path:(0,g.W3)((0,e.relative)(c,b)),content:n})}return l}function j(a,b){if(0===b.length)return a;let c=b.map(a=>`<document path=${JSON.stringify(a.path)}>
|
|
26
26
|
${a.content}
|
|
27
27
|
</document>`).join("\n\n");return`${a}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
exports.id=1213,exports.ids=[1213],exports.modules={16593:(a,b,c)=>{"use strict";c.d(b,{eW:()=>B,h9:()=>z,pj:()=>A});var d=c(29021),e=c(33873),f=c(21820);let g=(0,e.join)(process.cwd(),"lib","theme","openchamber"),h={...function(){let a={};try{if(!(0,d.existsSync)(g))return a;for(let b of(0,d.readdirSync)(g)){if(!b.endsWith(".json"))continue;let c=(0,e.join)(g,b);try{let f=JSON.parse((0,d.readFileSync)(c,"utf8"));if(!f||"object"!=typeof f)continue;a[(0,e.basename)(b,".json")]=f}catch{}}}catch{}return a}(),gruvbox:{displayName:"Gruvbox",light:{bg:"#fbf1c7",panel:"#f2e5bc",hover:"#ebdbb2",selected:"#d5c4a1",border:"#bdae93",text:"#3c3836",muted:"#7c6f64",dim:"#a89984",accent:"#458588",accentHover:"#076678",userBg:"#ebdbb2",assistantBg:"#fbf1c7",toolBg:"#f2e5bc",subtle:"rgba(0,0,0,0.04)",red:"#cc241d",green:"#689d6a",orange:"#d65d0e"},dark:{bg:"#1d2021",panel:"#282828",hover:"#3c3836",selected:"#504945",border:"#665c54",text:"#ebdbb2",muted:"#a89984",dim:"#7c6f64",accent:"#83a598",accentHover:"#8ec07c",userBg:"#3c3836",assistantBg:"#282828",toolBg:"#32302f",subtle:"rgba(255,255,255,0.04)",red:"#fb4934",green:"#b8bb26",orange:"#d65d0e"}},nord:{displayName:"Nord",light:{bg:"#e5e9f0",panel:"#eceff4",hover:"#d8dee9",selected:"#c8d0dd",border:"#b6c2d2",text:"#2e3440",muted:"#4c566a",dim:"#6c7890",accent:"#5e81ac",accentHover:"#81a1c1",userBg:"#d8dee9",assistantBg:"#e5e9f0",toolBg:"#eceff4",subtle:"rgba(46,52,64,0.05)",red:"#bf616a",green:"#a3be8c",orange:"#d08770"},dark:{bg:"#2e3440",panel:"#3b4252",hover:"#434c5e",selected:"#4c566a",border:"#5e6680",text:"#eceff4",muted:"#a0aec4",dim:"#7c88a0",accent:"#88c0d0",accentHover:"#81a1c1",userBg:"#434c5e",assistantBg:"#3b4252",toolBg:"#3a4252",subtle:"rgba(236,239,244,0.05)",red:"#bf616a",green:"#a3be8c",orange:"#d08770"}},tokyo:{displayName:"Tokyo Night",light:{bg:"#d5d6db",panel:"#e3e4e9",hover:"#c9cad1",selected:"#b8b9c2",border:"#a6a7b5",text:"#343b59",muted:"#4f5670",dim:"#6f7691",accent:"#565f89",accentHover:"#7aa2f7",userBg:"#c9cad1",assistantBg:"#d5d6db",toolBg:"#e3e4e9",subtle:"rgba(52,59,89,0.05)",red:"#f7768e",green:"#9ece6a",orange:"#e0af68"},dark:{bg:"#1a1b26",panel:"#24283b",hover:"#2f3549",selected:"#3b4261",border:"#414868",text:"#c0caf5",muted:"#7c83b3",dim:"#565f89",accent:"#7aa2f7",accentHover:"#89ddff",userBg:"#2f3549",assistantBg:"#24283b",toolBg:"#1f2335",subtle:"rgba(192,202,245,0.05)",red:"#f7768e",green:"#9ece6a",orange:"#e0af68"}},solarized:{displayName:"Solarized",light:{bg:"#fdf6e3",panel:"#eee8d5",hover:"#e4ddc7",selected:"#d9d2b8",border:"#c3bda8",text:"#586e75",muted:"#7a8a8a",dim:"#93a1a1",accent:"#268bd2",accentHover:"#2aa198",userBg:"#eee8d5",assistantBg:"#fdf6e3",toolBg:"#eee8d5",subtle:"rgba(88,110,117,0.06)",red:"#dc322f",green:"#859900",orange:"#b58900"},dark:{bg:"#002b36",panel:"#073642",hover:"#0e4250",selected:"#14505e",border:"#2c5c66",text:"#839496",muted:"#6d8284",dim:"#586e75",accent:"#268bd2",accentHover:"#2aa198",userBg:"#0e4250",assistantBg:"#073642",toolBg:"#05313c",subtle:"rgba(131,148,150,0.08)",red:"#dc322f",green:"#859900",orange:"#b58900"}},onedark:{displayName:"One Dark",light:{bg:"#fafafa",panel:"#f0f0f0",hover:"#e5e5e5",selected:"#d8d8d8",border:"#c8c8c8",text:"#383a42",muted:"#7f848e",dim:"#a0a1a7",accent:"#4078f2",accentHover:"#005cc5",userBg:"#e8e8f0",assistantBg:"#fafafa",toolBg:"#f0f0f0",subtle:"rgba(56,58,66,0.04)",red:"#e06c75",green:"#98c379",orange:"#d19a66"},dark:{bg:"#282c34",panel:"#21252b",hover:"#2c313a",selected:"#3b4048",border:"#4b5263",text:"#abb2bf",muted:"#7d8799",dim:"#5c6370",accent:"#61afef",accentHover:"#528bff",userBg:"#2c313a",assistantBg:"#21252b",toolBg:"#1e2227",subtle:"rgba(171,178,191,0.06)",red:"#e06c75",green:"#98c379",orange:"#d19a66"}},dracula:{displayName:"Dracula",light:{bg:"#f8f8f2",panel:"#f0f0ea",hover:"#e6e6de",selected:"#d8d8cf",border:"#c6c6bb",text:"#282a36",muted:"#5f6380",dim:"#8a8fae",accent:"#6272a4",accentHover:"#44475a",userBg:"#e6e6de",assistantBg:"#f8f8f2",toolBg:"#f0f0ea",subtle:"rgba(40,42,54,0.05)",red:"#ff5555",green:"#50fa7b",orange:"#ffb86c"},dark:{bg:"#282a36",panel:"#21222c",hover:"#343746",selected:"#44475a",border:"#4a4d63",text:"#f8f8f2",muted:"#9094ad",dim:"#6272a4",accent:"#bd93f9",accentHover:"#ff79c6",userBg:"#343746",assistantBg:"#21222c",toolBg:"#1e1f29",subtle:"rgba(248,248,242,0.05)",red:"#ff5555",green:"#50fa7b",orange:"#ffb86c"}},catppuccin:{displayName:"Catppuccin",light:{bg:"#eff1f5",panel:"#e6e9ef",hover:"#dce0e8",selected:"#ccd0da",border:"#bcc0cc",text:"#4c4f69",muted:"#6c6f85",dim:"#8c8fa1",accent:"#1e66f5",accentHover:"#7287fd",userBg:"#dce0e8",assistantBg:"#eff1f5",toolBg:"#e6e9ef",subtle:"rgba(76,79,105,0.05)",red:"#d20f39",green:"#40a02b",orange:"#df8e1d"},dark:{bg:"#1e1e2e",panel:"#181825",hover:"#313244",selected:"#45475a",border:"#585b70",text:"#cdd6f4",muted:"#8f93b2",dim:"#6c7086",accent:"#89b4fa",accentHover:"#b4befe",userBg:"#313244",assistantBg:"#181825",toolBg:"#14141f",subtle:"rgba(205,214,244,0.05)",red:"#f38ba8",green:"#a6e3a1",orange:"#fab387"}}};function i(a){let b={0:"#000000",1:"#800000",2:"#008000",3:"#808000",4:"#000080",5:"#800080",6:"#008080",7:"#c0c0c0",8:"#808080",9:"#ff0000",10:"#00ff00",11:"#ffff00",12:"#0000ff",13:"#ff00ff",14:"#00ffff",15:"#ffffff"};if(a in b)return b[a];if(a>=16&&a<=231){let b=a-16,c=Math.round(Math.floor(b/36)%6*51),d=Math.round(Math.floor(b/6)%6*51),e=Math.round(b%6*51);return`#${c.toString(16).padStart(2,"0")}${d.toString(16).padStart(2,"0")}${e.toString(16).padStart(2,"0")}`}if(a>=232&&a<=255){let b=Math.round((a-232)/23*255).toString(16).padStart(2,"0");return`#${b}${b}${b}`}return"#000000"}function j(a,b){if(null==a)return"";if("number"==typeof a)return i(a);if("string"==typeof a){let c=a.trim();if(""===c)return"";if(c.startsWith("#"))return c.toLowerCase();if(b[c])return b[c].toLowerCase();let d=Number(c);return isNaN(d)||c!==String(d)?/^[0-9a-fA-F]{6}$/.test(c)?`#${c.toLowerCase()}`:c.toLowerCase():i(d)}return""}function k(a){let b={};if(!a)return b;for(let[c,d]of Object.entries(a))b[c]=j(d,{});return b}function l(a,b){let c={};for(let[d,e]of Object.entries(a))c[d]=j(e,b);return c}function m(a){let b=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/.exec(a);return b?[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]:null}function n(a,b,c){return`#${a.toString(16).padStart(2,"0")}${b.toString(16).padStart(2,"0")}${c.toString(16).padStart(2,"0")}`}function o(a,b){let c=m(a);if(!c)return a;let[d,e,f]=c;return n(Math.round(d+(255-d)*b),Math.round(e+(255-e)*b),Math.round(f+(255-f)*b))}function p(a,b){let c=m(a);if(!c)return a;let[d,e,f]=c;return n(Math.round(d*(1-b)),Math.round(e*(1-b)),Math.round(f*(1-b)))}function q(a,b,c){let d=m(a),e=m(b);return d&&e?n(Math.round(d[0]+(e[0]-d[0])*c),Math.round(d[1]+(e[1]-d[1])*c),Math.round(d[2]+(e[2]-d[2])*c)):a}function r(a){let b=m(a);if(!b)return .5;let[c,d,e]=b.map(a=>{let b=a/255;return b<=.03928?b/12.92:Math.pow((b+.055)/1.055,2.4)});return .2126*c+.7152*d+.0722*e}function s(a,b){let c=r(a),d=r(b);return(Math.max(c,d)+.05)/(Math.min(c,d)+.05)}function t(a,b,c){return s(b,a)>=s(c,a)?b:c}function u(a,b,c=3){if(!m(a)||!m(b)||s(a,b)>=c)return a;let d=r(b)>r(a);for(let e=1;e<=20;e+=1){let f=d?p(a,.05*e):o(a,.05*e);if(s(f,b)>=c)return f}return d?"#000000":"#ffffff"}function v(a,b){let c=b.bg0||"#1a1a1a",d=b.bg1||"#242424",e=b.bg2||"#2e2e2e",f=b.bg3||"#383838",g=b.fg0||"#e8e8e8",h=b.fg3||"#888888",i=b.fg4||"#555555",j=b.red||"#dc2626",k=b.green||"#16a34a",l=b.orange||"#d97706",n=a.accent||l,s=a.text||g,v=a.muted||h,w=a.dim||i,x=a.border||f,y=a.borderAccent||n,z=a.selectedBg||e,A=a.success||k,B=a.error||j,C=a.warning||l,D=a.toolDiffAdded||A,E=a.toolDiffRemoved||B,F=a.userMessageBg||d,G=a.toolSuccessBg||d,H=.5>r(c),I={};I["--bg"]=c,I["--bg-panel"]=d,I["--bg-secondary"]=d,I["--bg-card"]=d,I["--bg-hover"]=e,I["--bg-selected"]=z===d?e:z,I["--bg-card-hover"]=q(d,e,.5),I["--bg-subtle"]=H?"rgba(255,255,255,0.035)":"rgba(15,23,42,0.035)",I["--border"]=x,I["--border-hover"]=y,I["--text"]=s,I["--text-muted"]=v,I["--text-dim"]=w,I["--accent"]=n,I["--accent-hover"]=H?o(n,.2):p(n,.15),I["--accent-fg"]=t(n,s,c),I["--accent-blue"]=b.blue||n,I["--accent-red"]=B,I["--accent-green"]=A,I["--accent-orange"]=C;let J=H?.24:.18;return I["--git-status-added"]=u(D,d),I["--git-status-modified"]=u(C,d),I["--git-status-deleted"]=u(E,d),I["--git-status-added-bg"]=q(d,D,J),I["--git-status-modified-bg"]=q(d,C,J),I["--git-status-deleted-bg"]=q(d,E,J),I["--user-bg"]=F,I["--assistant-bg"]=c,I["--tool-bg"]=G,I["--hatch-color"]=H?`rgba(${m(n)?.join(",")||"100,193,182"},0.16)`:`rgba(${m(n)?.join(",")||"13,148,136"},0.12)`,I["--status-error"]=B,I["--status-warning"]=C,I["--status-success"]=A,I["--status-info"]=n,I["--status-error-bg"]=`color-mix(in srgb, ${B} 14%, var(--bg))`,I["--status-warning-bg"]=`color-mix(in srgb, ${C} 14%, var(--bg))`,I["--status-success-bg"]=`color-mix(in srgb, ${A} 14%, var(--bg))`,I["--status-info-bg"]=`color-mix(in srgb, ${n} 14%, var(--bg))`,I["--status-error-border"]=`color-mix(in srgb, ${B} 45%, var(--bg))`,I["--status-warning-border"]=`color-mix(in srgb, ${C} 45%, var(--bg))`,I["--status-success-border"]=`color-mix(in srgb, ${A} 45%, var(--bg))`,I["--status-info-border"]=`color-mix(in srgb, ${n} 45%, var(--bg))`,I["--syntax-keyword"]=a.syntaxKeyword||a.keyword||n,I["--syntax-string"]=a.syntaxString||a.string||l,I["--syntax-number"]=a.syntaxNumber||a.number||n,I["--syntax-function"]=a.syntaxFunction||a.function||n,I["--syntax-comment"]=a.syntaxComment||a.comment||w,I}let w=["accent","border","borderAccent","borderMuted","success","error","warning","muted","dim","text","thinkingText","selectedBg","userMessageBg","userMessageText","customMessageBg","customMessageText","customMessageLabel","toolPendingBg","toolSuccessBg","toolErrorBg","toolTitle","toolOutput","mdHeading","mdLink","mdLinkUrl","mdCode","mdCodeBlock","mdCodeBlockBorder","mdQuote","mdQuoteBorder","mdHr","mdListBullet","toolDiffAdded","toolDiffRemoved","toolDiffContext","syntaxComment","syntaxKeyword","syntaxFunction","syntaxVariable","syntaxString","syntaxNumber","syntaxType","syntaxOperator","syntaxPunctuation","thinkingOff","thinkingMinimal","thinkingLow","thinkingMedium","thinkingHigh","thinkingXhigh","thinkingMax","bashMode"];function x(a){try{let c=(0,d.readFileSync)(a,"utf-8"),e=JSON.parse(c);if(e.metadata&&"object"==typeof e.metadata&&("light"===e.metadata.variant||"dark"===e.metadata.variant)&&e.colors&&"object"==typeof e.colors&&e.colors.primary){var b;let a,c,d,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w;return c=(a=(b=e).colors).surface??{},d=a.interactive??{},f=a.primary??{},g=a.status??{},h=a.chat??{},i=a.tools??{},k=(j=a=>"string"==typeof a&&/^#[0-9a-fA-F]{3,8}$/.test(a)?a:"")(c.background)||"#1a1a1a",l=j(c.elevated),m=j(c.muted),n=j(c.subtle),o=j(c.foreground)||"#e8e8e8",p=j(c.mutedForeground),q=j(f.base),r=j(f.hover)||q,s=j(d.border)||"#404040",u=(t=(a,b)=>{if(/^#[0-9a-fA-F]{8}$/.test(a)){let c=parseInt(a.slice(7,9),16)/255,d=a.slice(1,7),e=Math.round(parseInt(d.slice(0,2),16)*c+parseInt(b.slice(1,3),16)*(1-c)),f=Math.round(parseInt(d.slice(2,4),16)*c+parseInt(b.slice(3,5),16)*(1-c)),g=Math.round(parseInt(d.slice(4,6),16)*c+parseInt(b.slice(5,7),16)*(1-c));return`#${[e,f,g].map(a=>a.toString(16).padStart(2,"0")).join("")}`}return a})(j(h.userMessageBackground)||(q?`${q}26`:""),k),v=t(j(i.background)||m||n||k,k),w=b.metadata&&"object"==typeof b.metadata?b.metadata:{},{name:"string"==typeof w.name?w.name:"custom",vars:{bg0:k,bg1:l||m||k,bg2:m||n||k,bg3:n||m||k,fg0:o,fg3:p||"#888888",fg4:p||"#777777"},colors:{accent:q,accentHover:r,text:o,muted:p||o,dim:p||"#888888",border:s,borderAccent:q||s,selectedBg:n||m||"",success:j(g.success)||"#16a34a",error:j(g.error)||"#dc2626",warning:j(g.warning)||"#d97706",userMessageBg:u||k,toolSuccessBg:v||k,keyword:j(a.syntax?.base?.keyword)||q,string:j(a.syntax?.base?.string)||"",number:j(a.syntax?.base?.number)||"",function:j(a.syntax?.base?.function)||"",comment:j(a.syntax?.base?.comment)||""}}}if(!e.name||"string"!=typeof e.name||!e.colors||"object"!=typeof e.colors)return null;let f={};for(let a of w)f[a]=e.colors[a]??"";return{name:e.name,vars:e.vars,colors:f}}catch{return null}}function y(a){let b=[];try{if(!(0,d.existsSync)(a))return b;for(let c of(0,d.readdirSync)(a)){if(".json"!==(0,e.extname)(c))continue;let f=(0,e.join)(a,c);try{if(!(0,d.statSync)(f).isFile())continue}catch{continue}let g=function(a){let b=(0,e.basename)(a,(0,e.extname)(a)),c=/^(.+)-dark$/i.exec(b);if(c)return{base:c[1],variant:"dark"};let d=/^(.+)-light$/i.exec(b);return d?{base:d[1],variant:"light"}:{base:b,variant:null}}(c),h=x(f);if(!h)continue;let i=k(h.vars).bg0||"#1a1a1a",j=.5>r(i),l=g.variant??(j?"dark":"light");b.push({path:f,base:g.base,variant:l,isDark:j})}}catch{}return b}function z(a){return a?{bg:"#1a1a1a",panel:"#242424",border:"#3a3a3a",text:"#e8e8e8",muted:"#888888",accent:"#64c1b6",userBg:"#1e2a2b",toolBg:"#171c1c"}:{bg:"#ffffff",panel:"#f5f5f5",border:"#e0e0e0",text:"#1a1a1a",muted:"#555555",accent:"#0d9488",userBg:"#eff6ff",toolBg:"#f9fafb"}}function A(a,b=!0){let c=Object.entries(h).map(([a,c])=>({name:a,displayName:c.displayName,hasDark:!!c.dark,hasLight:!!c.light,builtin:!0,accent:c.dark?.accent,accentLight:c.light?.accent,...function(a,b){let c=b?!!a.dark:!a.light,d=c?a.dark:a.light;if(d)return{previewIsDark:c,preview:{bg:d.bg,panel:d.panel,border:d.border,text:d.text,muted:d.muted,accent:d.accent,userBg:d.userBg,toolBg:d.toolBg}}}(c,b)})),g=new Set(Object.keys(h)),i=[],j=(0,e.join)((0,f.homedir)(),".pi","agent","themes");if(i.push(...y(j)),a){let b=(0,e.join)(a,".pi","themes");i.push(...y(b))}let m=new Map;for(let a of i){let b=m.get(a.base)||[];b.push(a),m.set(a.base,b)}for(let[a,e]of m){if(g.has(a))continue;g.add(a);let f=!1,h=!1;for(let a of e)"dark"===a.variant&&(f=!0),"light"===a.variant&&(h=!0);c.push({name:a,displayName:a.split(/[-_]/).map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join(" "),hasDark:f,hasLight:h,builtin:!1,...function(a){let b=(a,b)=>{if(a)try{let b=JSON.parse((0,d.readFileSync)(a.path,"utf8"));if(!b.colors||"object"!=typeof b.colors)return;let c=b.colors,e="string"==typeof c.accent?c.accent:"object"==typeof c.primary&&null!==c.primary?c.primary.base:void 0;if("string"==typeof e&&/^#[0-9a-fA-F]{3,8}$/.test(e))return e.toLowerCase();let f=JSON.parse((0,d.readFileSync)(a.path,"utf8")),g=f.vars?.primary;if("string"==typeof g&&/^#[0-9a-fA-F]{3,8}$/.test(g))return g.toLowerCase()}catch{}},c=a.find(a=>"dark"===a.variant),e=a.find(a=>"light"===a.variant);return{accent:b(c,"dark"),accentLight:b(e,"light")}}(e),...function(a,b){let c=b?"dark":"light",d=a.find(a=>a.variant===c)??a[0];if(!d)return{};let e=x(d.path);if(!e)return{};let f=k(e.vars),g=v(l(e.colors,f),f);return{previewIsDark:.5>r(f.bg0||"#1a1a1a"),preview:{bg:g["--bg"],panel:g["--bg-panel"],border:g["--border"],text:g["--text"],muted:g["--text-muted"],accent:g["--accent"],userBg:g["--user-bg"],toolBg:g["--tool-bg"]}}}(e,b)})}return c}function B(a,b,c){if(!a)return null;let g=function(a,b){let c=h[a];if(!c)return null;let d=c[b];return d?{name:a,isDark:"dark"===b,cssVars:{"--bg":d.bg,"--bg-panel":d.panel,"--bg-secondary":d.panel,"--bg-card":d.panel,"--bg-hover":d.hover,"--bg-selected":d.selected,"--bg-card-hover":d.hover,"--bg-subtle":d.subtle,"--border":d.border,"--border-hover":d.accentHover,"--text":d.text,"--text-muted":d.muted,"--text-dim":d.dim,"--accent":d.accent,"--accent-hover":d.accentHover,"--accent-fg":t(d.accent,d.text,d.bg),"--accent-blue":d.accent,"--accent-red":d.red,"--accent-green":d.green,"--accent-orange":d.orange,"--git-status-added":d.green,"--git-status-modified":d.orange,"--git-status-deleted":d.red,"--git-status-added-bg":d.userBg,"--git-status-modified-bg":d.hover,"--git-status-deleted-bg":d.hover,"--user-bg":d.userBg,"--assistant-bg":d.assistantBg,"--tool-bg":d.toolBg,"--hatch-color":d.subtle,"--status-error":d.red,"--status-warning":d.orange,"--status-success":d.green,"--status-info":d.accent,"--status-error-bg":`color-mix(in srgb, ${d.red} 14%, var(--bg))`,"--status-warning-bg":`color-mix(in srgb, ${d.orange} 14%, var(--bg))`,"--status-success-bg":`color-mix(in srgb, ${d.green} 14%, var(--bg))`,"--status-info-bg":`color-mix(in srgb, ${d.accent} 14%, var(--bg))`,"--status-error-border":`color-mix(in srgb, ${d.red} 45%, var(--bg))`,"--status-warning-border":`color-mix(in srgb, ${d.orange} 45%, var(--bg))`,"--status-success-border":`color-mix(in srgb, ${d.green} 45%, var(--bg))`,"--status-info-border":`color-mix(in srgb, ${d.accent} 45%, var(--bg))`,"--syntax-keyword":d.accent,"--syntax-string":d.orange,"--syntax-number":d.accent,"--syntax-function":d.accent,"--syntax-comment":d.dim}}:null}(a,b);if(g)return g;let i=[(0,e.join)((0,f.homedir)(),".pi","agent","themes")];c&&i.push((0,e.join)(c,".pi","themes"));let j=[`${a}-${b}.json`,`${a}.json`,`${a}-${"dark"===b?"light":"dark"}.json`];for(let b of i)for(let c of j){let f=(0,e.join)(b,c);if(!(0,d.existsSync)(f))continue;let g=x(f);if(!g)continue;let h=k(g.vars),i=v(l(g.colors,h),h);return{name:a,isDark:.5>r(h.bg0||"#1a1a1a"),cssVars:i}}if((0,d.existsSync)(a)){let b=x(a);if(b){let c=k(b.vars),d=v(l(b.colors,c),c),f=c.bg0||"#1a1a1a";return{name:(0,e.basename)(a,(0,e.extname)(a)),isDark:.5>r(f),cssVars:d}}}return null}},78335:()=>{},96487:()=>{}};
|
|
1
|
+
"use strict";exports.id=6593,exports.ids=[6593],exports.modules={16593:(a,b,c)=>{c.d(b,{eW:()=>B,h9:()=>z,pj:()=>A});var d=c(29021),e=c(33873),f=c(21820);let g=(0,e.join)(process.cwd(),"lib","theme","openchamber"),h={...function(){let a={};try{if(!(0,d.existsSync)(g))return a;for(let b of(0,d.readdirSync)(g)){if(!b.endsWith(".json"))continue;let c=(0,e.join)(g,b);try{let f=JSON.parse((0,d.readFileSync)(c,"utf8"));if(!f||"object"!=typeof f)continue;a[(0,e.basename)(b,".json")]=f}catch{}}}catch{}return a}(),gruvbox:{displayName:"Gruvbox",light:{bg:"#fbf1c7",panel:"#f2e5bc",hover:"#ebdbb2",selected:"#d5c4a1",border:"#bdae93",text:"#3c3836",muted:"#7c6f64",dim:"#a89984",accent:"#458588",accentHover:"#076678",userBg:"#ebdbb2",assistantBg:"#fbf1c7",toolBg:"#f2e5bc",subtle:"rgba(0,0,0,0.04)",red:"#cc241d",green:"#689d6a",orange:"#d65d0e"},dark:{bg:"#1d2021",panel:"#282828",hover:"#3c3836",selected:"#504945",border:"#665c54",text:"#ebdbb2",muted:"#a89984",dim:"#7c6f64",accent:"#83a598",accentHover:"#8ec07c",userBg:"#3c3836",assistantBg:"#282828",toolBg:"#32302f",subtle:"rgba(255,255,255,0.04)",red:"#fb4934",green:"#b8bb26",orange:"#d65d0e"}},nord:{displayName:"Nord",light:{bg:"#e5e9f0",panel:"#eceff4",hover:"#d8dee9",selected:"#c8d0dd",border:"#b6c2d2",text:"#2e3440",muted:"#4c566a",dim:"#6c7890",accent:"#5e81ac",accentHover:"#81a1c1",userBg:"#d8dee9",assistantBg:"#e5e9f0",toolBg:"#eceff4",subtle:"rgba(46,52,64,0.05)",red:"#bf616a",green:"#a3be8c",orange:"#d08770"},dark:{bg:"#2e3440",panel:"#3b4252",hover:"#434c5e",selected:"#4c566a",border:"#5e6680",text:"#eceff4",muted:"#a0aec4",dim:"#7c88a0",accent:"#88c0d0",accentHover:"#81a1c1",userBg:"#434c5e",assistantBg:"#3b4252",toolBg:"#3a4252",subtle:"rgba(236,239,244,0.05)",red:"#bf616a",green:"#a3be8c",orange:"#d08770"}},tokyo:{displayName:"Tokyo Night",light:{bg:"#d5d6db",panel:"#e3e4e9",hover:"#c9cad1",selected:"#b8b9c2",border:"#a6a7b5",text:"#343b59",muted:"#4f5670",dim:"#6f7691",accent:"#565f89",accentHover:"#7aa2f7",userBg:"#c9cad1",assistantBg:"#d5d6db",toolBg:"#e3e4e9",subtle:"rgba(52,59,89,0.05)",red:"#f7768e",green:"#9ece6a",orange:"#e0af68"},dark:{bg:"#1a1b26",panel:"#24283b",hover:"#2f3549",selected:"#3b4261",border:"#414868",text:"#c0caf5",muted:"#7c83b3",dim:"#565f89",accent:"#7aa2f7",accentHover:"#89ddff",userBg:"#2f3549",assistantBg:"#24283b",toolBg:"#1f2335",subtle:"rgba(192,202,245,0.05)",red:"#f7768e",green:"#9ece6a",orange:"#e0af68"}},solarized:{displayName:"Solarized",light:{bg:"#fdf6e3",panel:"#eee8d5",hover:"#e4ddc7",selected:"#d9d2b8",border:"#c3bda8",text:"#586e75",muted:"#7a8a8a",dim:"#93a1a1",accent:"#268bd2",accentHover:"#2aa198",userBg:"#eee8d5",assistantBg:"#fdf6e3",toolBg:"#eee8d5",subtle:"rgba(88,110,117,0.06)",red:"#dc322f",green:"#859900",orange:"#b58900"},dark:{bg:"#002b36",panel:"#073642",hover:"#0e4250",selected:"#14505e",border:"#2c5c66",text:"#839496",muted:"#6d8284",dim:"#586e75",accent:"#268bd2",accentHover:"#2aa198",userBg:"#0e4250",assistantBg:"#073642",toolBg:"#05313c",subtle:"rgba(131,148,150,0.08)",red:"#dc322f",green:"#859900",orange:"#b58900"}},onedark:{displayName:"One Dark",light:{bg:"#fafafa",panel:"#f0f0f0",hover:"#e5e5e5",selected:"#d8d8d8",border:"#c8c8c8",text:"#383a42",muted:"#7f848e",dim:"#a0a1a7",accent:"#4078f2",accentHover:"#005cc5",userBg:"#e8e8f0",assistantBg:"#fafafa",toolBg:"#f0f0f0",subtle:"rgba(56,58,66,0.04)",red:"#e06c75",green:"#98c379",orange:"#d19a66"},dark:{bg:"#282c34",panel:"#21252b",hover:"#2c313a",selected:"#3b4048",border:"#4b5263",text:"#abb2bf",muted:"#7d8799",dim:"#5c6370",accent:"#61afef",accentHover:"#528bff",userBg:"#2c313a",assistantBg:"#21252b",toolBg:"#1e2227",subtle:"rgba(171,178,191,0.06)",red:"#e06c75",green:"#98c379",orange:"#d19a66"}},dracula:{displayName:"Dracula",light:{bg:"#f8f8f2",panel:"#f0f0ea",hover:"#e6e6de",selected:"#d8d8cf",border:"#c6c6bb",text:"#282a36",muted:"#5f6380",dim:"#8a8fae",accent:"#6272a4",accentHover:"#44475a",userBg:"#e6e6de",assistantBg:"#f8f8f2",toolBg:"#f0f0ea",subtle:"rgba(40,42,54,0.05)",red:"#ff5555",green:"#50fa7b",orange:"#ffb86c"},dark:{bg:"#282a36",panel:"#21222c",hover:"#343746",selected:"#44475a",border:"#4a4d63",text:"#f8f8f2",muted:"#9094ad",dim:"#6272a4",accent:"#bd93f9",accentHover:"#ff79c6",userBg:"#343746",assistantBg:"#21222c",toolBg:"#1e1f29",subtle:"rgba(248,248,242,0.05)",red:"#ff5555",green:"#50fa7b",orange:"#ffb86c"}},catppuccin:{displayName:"Catppuccin",light:{bg:"#eff1f5",panel:"#e6e9ef",hover:"#dce0e8",selected:"#ccd0da",border:"#bcc0cc",text:"#4c4f69",muted:"#6c6f85",dim:"#8c8fa1",accent:"#1e66f5",accentHover:"#7287fd",userBg:"#dce0e8",assistantBg:"#eff1f5",toolBg:"#e6e9ef",subtle:"rgba(76,79,105,0.05)",red:"#d20f39",green:"#40a02b",orange:"#df8e1d"},dark:{bg:"#1e1e2e",panel:"#181825",hover:"#313244",selected:"#45475a",border:"#585b70",text:"#cdd6f4",muted:"#8f93b2",dim:"#6c7086",accent:"#89b4fa",accentHover:"#b4befe",userBg:"#313244",assistantBg:"#181825",toolBg:"#14141f",subtle:"rgba(205,214,244,0.05)",red:"#f38ba8",green:"#a6e3a1",orange:"#fab387"}}};function i(a){let b={0:"#000000",1:"#800000",2:"#008000",3:"#808000",4:"#000080",5:"#800080",6:"#008080",7:"#c0c0c0",8:"#808080",9:"#ff0000",10:"#00ff00",11:"#ffff00",12:"#0000ff",13:"#ff00ff",14:"#00ffff",15:"#ffffff"};if(a in b)return b[a];if(a>=16&&a<=231){let b=a-16,c=Math.round(Math.floor(b/36)%6*51),d=Math.round(Math.floor(b/6)%6*51),e=Math.round(b%6*51);return`#${c.toString(16).padStart(2,"0")}${d.toString(16).padStart(2,"0")}${e.toString(16).padStart(2,"0")}`}if(a>=232&&a<=255){let b=Math.round((a-232)/23*255).toString(16).padStart(2,"0");return`#${b}${b}${b}`}return"#000000"}function j(a,b){if(null==a)return"";if("number"==typeof a)return i(a);if("string"==typeof a){let c=a.trim();if(""===c)return"";if(c.startsWith("#"))return c.toLowerCase();if(b[c])return b[c].toLowerCase();let d=Number(c);return isNaN(d)||c!==String(d)?/^[0-9a-fA-F]{6}$/.test(c)?`#${c.toLowerCase()}`:c.toLowerCase():i(d)}return""}function k(a){let b={};if(!a)return b;for(let[c,d]of Object.entries(a))b[c]=j(d,{});return b}function l(a,b){let c={};for(let[d,e]of Object.entries(a))c[d]=j(e,b);return c}function m(a){let b=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/.exec(a);return b?[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]:null}function n(a,b,c){return`#${a.toString(16).padStart(2,"0")}${b.toString(16).padStart(2,"0")}${c.toString(16).padStart(2,"0")}`}function o(a,b){let c=m(a);if(!c)return a;let[d,e,f]=c;return n(Math.round(d+(255-d)*b),Math.round(e+(255-e)*b),Math.round(f+(255-f)*b))}function p(a,b){let c=m(a);if(!c)return a;let[d,e,f]=c;return n(Math.round(d*(1-b)),Math.round(e*(1-b)),Math.round(f*(1-b)))}function q(a,b,c){let d=m(a),e=m(b);return d&&e?n(Math.round(d[0]+(e[0]-d[0])*c),Math.round(d[1]+(e[1]-d[1])*c),Math.round(d[2]+(e[2]-d[2])*c)):a}function r(a){let b=m(a);if(!b)return .5;let[c,d,e]=b.map(a=>{let b=a/255;return b<=.03928?b/12.92:Math.pow((b+.055)/1.055,2.4)});return .2126*c+.7152*d+.0722*e}function s(a,b){let c=r(a),d=r(b);return(Math.max(c,d)+.05)/(Math.min(c,d)+.05)}function t(a,b,c){return s(b,a)>=s(c,a)?b:c}function u(a,b,c=3){if(!m(a)||!m(b)||s(a,b)>=c)return a;let d=r(b)>r(a);for(let e=1;e<=20;e+=1){let f=d?p(a,.05*e):o(a,.05*e);if(s(f,b)>=c)return f}return d?"#000000":"#ffffff"}function v(a,b){let c=b.bg0||"#1a1a1a",d=b.bg1||"#242424",e=b.bg2||"#2e2e2e",f=b.bg3||"#383838",g=b.fg0||"#e8e8e8",h=b.fg3||"#888888",i=b.fg4||"#555555",j=b.red||"#dc2626",k=b.green||"#16a34a",l=b.orange||"#d97706",n=a.accent||l,s=a.text||g,v=a.muted||h,w=a.dim||i,x=a.border||f,y=a.borderAccent||n,z=a.selectedBg||e,A=a.success||k,B=a.error||j,C=a.warning||l,D=a.toolDiffAdded||A,E=a.toolDiffRemoved||B,F=a.userMessageBg||d,G=a.toolSuccessBg||d,H=.5>r(c),I={};I["--bg"]=c,I["--bg-panel"]=d,I["--bg-secondary"]=d,I["--bg-card"]=d,I["--bg-hover"]=e,I["--bg-selected"]=z===d?e:z,I["--bg-card-hover"]=q(d,e,.5),I["--bg-subtle"]=H?"rgba(255,255,255,0.035)":"rgba(15,23,42,0.035)",I["--border"]=x,I["--border-hover"]=y,I["--text"]=s,I["--text-muted"]=v,I["--text-dim"]=w,I["--accent"]=n,I["--accent-hover"]=H?o(n,.2):p(n,.15),I["--accent-fg"]=t(n,s,c),I["--accent-blue"]=b.blue||n,I["--accent-red"]=B,I["--accent-green"]=A,I["--accent-orange"]=C;let J=H?.24:.18;return I["--git-status-added"]=u(D,d),I["--git-status-modified"]=u(C,d),I["--git-status-deleted"]=u(E,d),I["--git-status-added-bg"]=q(d,D,J),I["--git-status-modified-bg"]=q(d,C,J),I["--git-status-deleted-bg"]=q(d,E,J),I["--user-bg"]=F,I["--assistant-bg"]=c,I["--tool-bg"]=G,I["--hatch-color"]=H?`rgba(${m(n)?.join(",")||"100,193,182"},0.16)`:`rgba(${m(n)?.join(",")||"13,148,136"},0.12)`,I["--status-error"]=B,I["--status-warning"]=C,I["--status-success"]=A,I["--status-info"]=n,I["--status-error-bg"]=`color-mix(in srgb, ${B} 14%, var(--bg))`,I["--status-warning-bg"]=`color-mix(in srgb, ${C} 14%, var(--bg))`,I["--status-success-bg"]=`color-mix(in srgb, ${A} 14%, var(--bg))`,I["--status-info-bg"]=`color-mix(in srgb, ${n} 14%, var(--bg))`,I["--status-error-border"]=`color-mix(in srgb, ${B} 45%, var(--bg))`,I["--status-warning-border"]=`color-mix(in srgb, ${C} 45%, var(--bg))`,I["--status-success-border"]=`color-mix(in srgb, ${A} 45%, var(--bg))`,I["--status-info-border"]=`color-mix(in srgb, ${n} 45%, var(--bg))`,I["--syntax-keyword"]=a.syntaxKeyword||a.keyword||n,I["--syntax-string"]=a.syntaxString||a.string||l,I["--syntax-number"]=a.syntaxNumber||a.number||n,I["--syntax-function"]=a.syntaxFunction||a.function||n,I["--syntax-comment"]=a.syntaxComment||a.comment||w,I}let w=["accent","border","borderAccent","borderMuted","success","error","warning","muted","dim","text","thinkingText","selectedBg","userMessageBg","userMessageText","customMessageBg","customMessageText","customMessageLabel","toolPendingBg","toolSuccessBg","toolErrorBg","toolTitle","toolOutput","mdHeading","mdLink","mdLinkUrl","mdCode","mdCodeBlock","mdCodeBlockBorder","mdQuote","mdQuoteBorder","mdHr","mdListBullet","toolDiffAdded","toolDiffRemoved","toolDiffContext","syntaxComment","syntaxKeyword","syntaxFunction","syntaxVariable","syntaxString","syntaxNumber","syntaxType","syntaxOperator","syntaxPunctuation","thinkingOff","thinkingMinimal","thinkingLow","thinkingMedium","thinkingHigh","thinkingXhigh","thinkingMax","bashMode"];function x(a){try{let c=(0,d.readFileSync)(a,"utf-8"),e=JSON.parse(c);if(e.metadata&&"object"==typeof e.metadata&&("light"===e.metadata.variant||"dark"===e.metadata.variant)&&e.colors&&"object"==typeof e.colors&&e.colors.primary){var b;let a,c,d,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w;return c=(a=(b=e).colors).surface??{},d=a.interactive??{},f=a.primary??{},g=a.status??{},h=a.chat??{},i=a.tools??{},k=(j=a=>"string"==typeof a&&/^#[0-9a-fA-F]{3,8}$/.test(a)?a:"")(c.background)||"#1a1a1a",l=j(c.elevated),m=j(c.muted),n=j(c.subtle),o=j(c.foreground)||"#e8e8e8",p=j(c.mutedForeground),q=j(f.base),r=j(f.hover)||q,s=j(d.border)||"#404040",u=(t=(a,b)=>{if(/^#[0-9a-fA-F]{8}$/.test(a)){let c=parseInt(a.slice(7,9),16)/255,d=a.slice(1,7),e=Math.round(parseInt(d.slice(0,2),16)*c+parseInt(b.slice(1,3),16)*(1-c)),f=Math.round(parseInt(d.slice(2,4),16)*c+parseInt(b.slice(3,5),16)*(1-c)),g=Math.round(parseInt(d.slice(4,6),16)*c+parseInt(b.slice(5,7),16)*(1-c));return`#${[e,f,g].map(a=>a.toString(16).padStart(2,"0")).join("")}`}return a})(j(h.userMessageBackground)||(q?`${q}26`:""),k),v=t(j(i.background)||m||n||k,k),w=b.metadata&&"object"==typeof b.metadata?b.metadata:{},{name:"string"==typeof w.name?w.name:"custom",vars:{bg0:k,bg1:l||m||k,bg2:m||n||k,bg3:n||m||k,fg0:o,fg3:p||"#888888",fg4:p||"#777777"},colors:{accent:q,accentHover:r,text:o,muted:p||o,dim:p||"#888888",border:s,borderAccent:q||s,selectedBg:n||m||"",success:j(g.success)||"#16a34a",error:j(g.error)||"#dc2626",warning:j(g.warning)||"#d97706",userMessageBg:u||k,toolSuccessBg:v||k,keyword:j(a.syntax?.base?.keyword)||q,string:j(a.syntax?.base?.string)||"",number:j(a.syntax?.base?.number)||"",function:j(a.syntax?.base?.function)||"",comment:j(a.syntax?.base?.comment)||""}}}if(!e.name||"string"!=typeof e.name||!e.colors||"object"!=typeof e.colors)return null;let f={};for(let a of w)f[a]=e.colors[a]??"";return{name:e.name,vars:e.vars,colors:f}}catch{return null}}function y(a){let b=[];try{if(!(0,d.existsSync)(a))return b;for(let c of(0,d.readdirSync)(a)){if(".json"!==(0,e.extname)(c))continue;let f=(0,e.join)(a,c);try{if(!(0,d.statSync)(f).isFile())continue}catch{continue}let g=function(a){let b=(0,e.basename)(a,(0,e.extname)(a)),c=/^(.+)-dark$/i.exec(b);if(c)return{base:c[1],variant:"dark"};let d=/^(.+)-light$/i.exec(b);return d?{base:d[1],variant:"light"}:{base:b,variant:null}}(c),h=x(f);if(!h)continue;let i=k(h.vars).bg0||"#1a1a1a",j=.5>r(i),l=g.variant??(j?"dark":"light");b.push({path:f,base:g.base,variant:l,isDark:j})}}catch{}return b}function z(a){return a?{bg:"#1a1a1a",panel:"#242424",border:"#3a3a3a",text:"#e8e8e8",muted:"#888888",accent:"#64c1b6",userBg:"#1e2a2b",toolBg:"#171c1c"}:{bg:"#ffffff",panel:"#f5f5f5",border:"#e0e0e0",text:"#1a1a1a",muted:"#555555",accent:"#0d9488",userBg:"#eff6ff",toolBg:"#f9fafb"}}function A(a,b=!0){let c=Object.entries(h).map(([a,c])=>({name:a,displayName:c.displayName,hasDark:!!c.dark,hasLight:!!c.light,builtin:!0,accent:c.dark?.accent,accentLight:c.light?.accent,...function(a,b){let c=b?!!a.dark:!a.light,d=c?a.dark:a.light;if(d)return{previewIsDark:c,preview:{bg:d.bg,panel:d.panel,border:d.border,text:d.text,muted:d.muted,accent:d.accent,userBg:d.userBg,toolBg:d.toolBg}}}(c,b)})),g=new Set(Object.keys(h)),i=[],j=(0,e.join)((0,f.homedir)(),".pi","agent","themes");if(i.push(...y(j)),a){let b=(0,e.join)(a,".pi","themes");i.push(...y(b))}let m=new Map;for(let a of i){let b=m.get(a.base)||[];b.push(a),m.set(a.base,b)}for(let[a,e]of m){if(g.has(a))continue;g.add(a);let f=!1,h=!1;for(let a of e)"dark"===a.variant&&(f=!0),"light"===a.variant&&(h=!0);c.push({name:a,displayName:a.split(/[-_]/).map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join(" "),hasDark:f,hasLight:h,builtin:!1,...function(a){let b=(a,b)=>{if(a)try{let b=JSON.parse((0,d.readFileSync)(a.path,"utf8"));if(!b.colors||"object"!=typeof b.colors)return;let c=b.colors,e="string"==typeof c.accent?c.accent:"object"==typeof c.primary&&null!==c.primary?c.primary.base:void 0;if("string"==typeof e&&/^#[0-9a-fA-F]{3,8}$/.test(e))return e.toLowerCase();let f=JSON.parse((0,d.readFileSync)(a.path,"utf8")),g=f.vars?.primary;if("string"==typeof g&&/^#[0-9a-fA-F]{3,8}$/.test(g))return g.toLowerCase()}catch{}},c=a.find(a=>"dark"===a.variant),e=a.find(a=>"light"===a.variant);return{accent:b(c,"dark"),accentLight:b(e,"light")}}(e),...function(a,b){let c=b?"dark":"light",d=a.find(a=>a.variant===c)??a[0];if(!d)return{};let e=x(d.path);if(!e)return{};let f=k(e.vars),g=v(l(e.colors,f),f);return{previewIsDark:.5>r(f.bg0||"#1a1a1a"),preview:{bg:g["--bg"],panel:g["--bg-panel"],border:g["--border"],text:g["--text"],muted:g["--text-muted"],accent:g["--accent"],userBg:g["--user-bg"],toolBg:g["--tool-bg"]}}}(e,b)})}return c}function B(a,b,c){if(!a)return null;let g=function(a,b){let c=h[a];if(!c)return null;let d=c[b];return d?{name:a,isDark:"dark"===b,cssVars:{"--bg":d.bg,"--bg-panel":d.panel,"--bg-secondary":d.panel,"--bg-card":d.panel,"--bg-hover":d.hover,"--bg-selected":d.selected,"--bg-card-hover":d.hover,"--bg-subtle":d.subtle,"--border":d.border,"--border-hover":d.accentHover,"--text":d.text,"--text-muted":d.muted,"--text-dim":d.dim,"--accent":d.accent,"--accent-hover":d.accentHover,"--accent-fg":t(d.accent,d.text,d.bg),"--accent-blue":d.accent,"--accent-red":d.red,"--accent-green":d.green,"--accent-orange":d.orange,"--git-status-added":d.green,"--git-status-modified":d.orange,"--git-status-deleted":d.red,"--git-status-added-bg":d.userBg,"--git-status-modified-bg":d.hover,"--git-status-deleted-bg":d.hover,"--user-bg":d.userBg,"--assistant-bg":d.assistantBg,"--tool-bg":d.toolBg,"--hatch-color":d.subtle,"--status-error":d.red,"--status-warning":d.orange,"--status-success":d.green,"--status-info":d.accent,"--status-error-bg":`color-mix(in srgb, ${d.red} 14%, var(--bg))`,"--status-warning-bg":`color-mix(in srgb, ${d.orange} 14%, var(--bg))`,"--status-success-bg":`color-mix(in srgb, ${d.green} 14%, var(--bg))`,"--status-info-bg":`color-mix(in srgb, ${d.accent} 14%, var(--bg))`,"--status-error-border":`color-mix(in srgb, ${d.red} 45%, var(--bg))`,"--status-warning-border":`color-mix(in srgb, ${d.orange} 45%, var(--bg))`,"--status-success-border":`color-mix(in srgb, ${d.green} 45%, var(--bg))`,"--status-info-border":`color-mix(in srgb, ${d.accent} 45%, var(--bg))`,"--syntax-keyword":d.accent,"--syntax-string":d.orange,"--syntax-number":d.accent,"--syntax-function":d.accent,"--syntax-comment":d.dim}}:null}(a,b);if(g)return g;let i=[(0,e.join)((0,f.homedir)(),".pi","agent","themes")];c&&i.push((0,e.join)(c,".pi","themes"));let j=[`${a}-${b}.json`,`${a}.json`,`${a}-${"dark"===b?"light":"dark"}.json`];for(let b of i)for(let c of j){let f=(0,e.join)(b,c);if(!(0,d.existsSync)(f))continue;let g=x(f);if(!g)continue;let h=k(g.vars),i=v(l(g.colors,h),h);return{name:a,isDark:.5>r(h.bg0||"#1a1a1a"),cssVars:i}}if((0,d.existsSync)(a)){let b=x(a);if(b){let c=k(b.vars),d=v(l(b.colors,c),c),f=c.bg0||"#1a1a1a";return{name:(0,e.basename)(a,(0,e.extname)(a)),isDark:.5>r(f),cssVars:d}}}return null}}};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
exports.id=7915,exports.ids=[7915],exports.modules={8102:(a,b,c)=>{"use strict";c.d(b,{$:()=>g});var d=c(55511),e=c(29021),f=c(33873);function g(a,b){let c=(0,f.dirname)(a),g=(0,f.join)(c,`.${(0,f.basename)(a)}-${(0,d.randomUUID)()}.tmp`),h=!1;try{(0,e.writeFileSync)(g,b,{encoding:"utf8",flag:"wx",mode:384,flush:!0}),(0,e.renameSync)(g,a)}catch(a){throw h=!0,a}finally{try{(0,e.unlinkSync)(g)}catch(a){if("ENOENT"!==a.code&&!h)throw a}}}},39006:a=>{"use strict";a.exports=JSON.parse('{"name":"@qt4798/pi-web","version":"0.18.11","description":"Web workspace for the pi coding agent","homepage":"https://github.com/t479842598/pi-web-QT#readme","repository":{"type":"git","url":"git+https://github.com/t479842598/pi-web-QT.git"},"bugs":{"url":"https://github.com/t479842598/pi-web-QT/issues"},"license":"MIT","engines":{"node":">=22.19.0"},"bin":{"pi-web":"bin/pi-web.js"},"files":["bin",".next","!.next/cache","!.next/dev","!.next/standalone","!.next/**/*.js.map","lib/theme","public","next.config.ts","package.json"],"scripts":{"dev":"node bin/fix-pi-agent-undici.js && node bin/with-memory-limit.js node_modules/.bin/next dev -H 127.0.0.1 -p 0 --turbopack","dev:lan":"node bin/fix-pi-agent-undici.js && node bin/with-memory-limit.js node_modules/.bin/next dev -H 0.0.0.0 -p 0 --turbopack","postinstall":"node bin/prepare-terminal.js","theme:css":"node scripts/generate-theme-css.mjs","prebuild":"node scripts/generate-theme-css.mjs","build":"env -u TURBOPACK -u __NEXT_PRIVATE_STANDALONE_CONFIG next build --webpack","bundle:backend":"node scripts/bundle-backend.mjs","start":"node bin/fix-pi-agent-undici.js && node bin/with-memory-limit.js node_modules/.bin/next start -H 127.0.0.1 -p 0","start:lan":"node bin/fix-pi-agent-undici.js && node bin/with-memory-limit.js node_modules/.bin/next start -H 0.0.0.0 -p 0","lint":"eslint .","release":"npm version patch --no-git-tag-version && npm run build && npm publish --access public","test":"node --experimental-strip-types --test $(find app components hooks lib -name \'*.test.mjs\' -print)","test:e2e":"node e2e/run.mjs","test:terminal":"node e2e/terminal.mjs"},"dependencies":{"@earendil-works/pi-agent-core":"0.87.1","@earendil-works/pi-ai":"0.87.1","@earendil-works/pi-coding-agent":"0.87.1","@earendil-works/pi-tui":"0.87.1","@fontsource/ia-writer-quattro":"^5.3.0","@fontsource/lilex":"^5.3.0","@phosphor-icons/react":"^2.1.10","@radix-ui/react-dialog":"^1.1.23","@tanstack/react-virtual":"^3.14.9","@tauri-apps/api":"^2.11.1","@xterm/addon-fit":"0.11.0","@xterm/xterm":"6.0.0","adm-zip":"^0.6.0","ansi_up":"^6.0.6","cmdk":"^1.1.1","js-yaml":"^5.2.3","katex":"^0.16.47","lucide-react":"^1.37.0","mammoth":"^1.12.0","mermaid":"^11.16.1","next":"16.3.6","node-pty":"1.2.0-beta.15","proper-lockfile":"4.1.2","qrcode":"^1.5.4","react":"^19.2.4","react-dom":"^19.2.4","react-markdown":"^10.1.0","react-syntax-highlighter":"^16.1.1","rehype-katex":"^7.0.1","rehype-raw":"^7.0.0","rehype-sanitize":"^6.0.0","remark-frontmatter":"^5.0.0","remark-gfm":"^4.0.1","remark-math":"^6.0.0","semver":"7.8.5","undici":"^8.11.0"},"overrides":{"undici":"^8.11.0","@earendil-works/pi-coding-agent":{"undici":"^8.11.0"},"intersection-observer":"npm:noop2@2.0.0","node-domexception":"npm:@profoundlogic/node-domexception@1.0.2"},"allowScripts":{"@google/genai@1.52.0":true,"protobufjs@7.6.5":true,"sharp@0.34.5":true,"unrs-resolver@1.12.2":true},"devDependencies":{"@resvg/resvg-js":"^2.6.2","@tailwindcss/postcss":"^4.2.2","@types/js-yaml":"^4.0.9","@types/node":"^25","@types/proper-lockfile":"4.1.4","@types/qrcode":"^1.5.6","@types/react":"^19","@types/react-dom":"^19","@types/react-syntax-highlighter":"^15.5.13","@types/semver":"7.8.0","eslint":"^9.39.5","eslint-config-next":"16.3.5","jiti":"^2.7.0","lightningcss":"^1.33.0","playwright":"^1.63.0","postcss":"^8","tailwindcss":"^4.2.2","to-ico":"^1.1.5","typescript":"^5.9.3"}}')},50593:(a,b,c)=>{"use strict";function d(a){return/^[a-zA-Z]:[\\/]/.test(a)||a.startsWith("\\\\")?a.replace(/\\/g,"/"):a}c.d(b,{A0:()=>d})},66544:(a,b,c)=>{"use strict";c.d(b,{E2:()=>l,EN:()=>k});var d=c(77030);function e(a){return(a.startsWith("[")&&a.endsWith("]")?a.slice(1,-1):a).toLowerCase().replace(/\.$/,"")}function f(a){if(!a||/[\s/@\\]/.test(a))return null;try{let b=new URL(`http://${a}`);if(b.username||b.password||"/"!==b.pathname||b.search||b.hash)return null;return e(b.hostname)}catch{return null}}function g(a){if(!a||/[\s/@\\]/.test(a))return null;try{let b=new URL(`http://${a}`);if(b.username||b.password||"/"!==b.pathname||b.search||b.hash)return null;let c=e(b.hostname);return b.port?`${c}:${b.port}`:c}catch{return null}}function h(){return[process.env.PI_WEB_HOSTNAME,...process.env.PI_WEB_ALLOWED_HOSTS?.split(",")??[]].filter(a=>!!a?.trim())}function i(a){try{return new URL(a).origin}catch{return null}}let j=new Set(["POST","PUT","PATCH","DELETE"]);function k(a,b=h()){if(!function(a,b=h()){let c=a.headers.get("host"),g=c?f(c):null;return!!g&&(!!("localhost"===g||g.endsWith(".localhost")||(0,d.isIP)(g))||b.some(a=>{let b;return((b=a?.trim())?(0,d.isIP)(b)?e(b):f(b):null)===g}))}(a,b))return!1;if(function(a){if("GET"!==a.method||"navigate"!==a.headers.get("sec-fetch-mode")||"document"!==a.headers.get("sec-fetch-dest")||"?1"!==a.headers.get("sec-fetch-user"))return!1;try{return/^\/api\/sessions\/[^/]+\/export$/.test(new URL(a.url).pathname)}catch{return!1}}(a))return!0;if(!(a.headers.has("origin")||a.headers.has("sec-fetch-site"))){if(j.has((a.method??"GET").toUpperCase())){let b=a.headers.get("host"),c=b?f(b):null;return null!==c&&!!("localhost"===c||c.endsWith(".localhost")||/^127\./.test(c)||"::1"===c||"[::1]"===c)}return!0}return function(a){let b,c,d;if("cross-site"===a.headers.get("sec-fetch-site"))return!1;let e=a.headers.get("origin");if(!e)return!0;let f=(b=new URL(a.url),(c=a.headers.get("host"))?i(`${b.protocol}//${c}`):null);if(null!==f&&(i(e)===f||function(a,b,c){let d,e;try{d=new URL(a),e=new URL(b)}catch{return!1}if(d.protocol!==e.protocol||d.hostname.toLowerCase()!==e.hostname.toLowerCase())return!1;if(!d.port)return"same-origin"===c;let f=e.port||("https:"===e.protocol?"443":"80");return d.port===f}(e,f,a.headers.get("sec-fetch-site"))))return!0;if("same-origin"!==a.headers.get("sec-fetch-site")||!a.headers.get("x-forwarded-proto"))return!1;let h=a.headers.get("host");if(!h)return!1;try{d=new URL(e).host}catch{return!1}let j=g(d);return null!==j&&j===g(h)}(a)}function l(a){let b=a.headers.get("content-type")?.split(";",1)[0]?.trim().toLowerCase();return"application/json"===b||!!(b?.startsWith("application/")&&b.endsWith("+json"))}},78335:()=>{},89628:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{DT:()=>y,dH:()=>A,g3:()=>z,jE:()=>v,lz:()=>B,uj:()=>t});var e=c(26106),f=c.n(e),g=c(29021),h=c(21820),i=c(33873),j=c(75430),k=c(50593),l=c(8102),m=a([j]);j=(m.then?(await m)():m)[0];let D="pi-backup",E="${agentDir}",F="${home}";function n(a){if(!(0,g.existsSync)(a))return null;try{let b=JSON.parse((0,g.readFileSync)(a,"utf8"));return null!==b&&"object"==typeof b?b:null}catch{return null}}function o(a){let b=[],c=[""];for(;c.length>0;){let d,e=c.pop(),f=(0,i.join)(a,e);try{d=(0,g.readdirSync)(f)}catch{continue}for(let a of d){let d;if("node_modules"===a||".git"===a)continue;let h=e?`${e}/${a}`:a,j=(0,i.join)(f,a);try{d=(0,g.statSync)(j)}catch{continue}d.isDirectory()?c.push(h):d.isFile()&&b.push(h)}}return b}function p(a){let b=(0,k.A0)((0,j.getAgentDir)()),c=(0,k.A0)((0,h.homedir)());return r(a,a=>{let d=(0,k.A0)(a);return d===b?E:d===c?F:d.startsWith(b+"/")?E+d.slice(b.length):d.startsWith(c+"/")?F+d.slice(c.length):a})}function q(a){let b=(0,j.getAgentDir)(),c=(0,h.homedir)();return r(a,a=>a===E?b:a===F?c:a.startsWith(E+"/")?(0,i.join)(b,...a.slice(E.length+1).split("/")):a.startsWith(F+"/")?(0,i.join)(c,...a.slice(F.length+1).split("/")):a)}function r(a,b){if("string"==typeof a)return b(a);if(Array.isArray(a))return a.map(a=>r(a,b));if(null!==a&&"object"==typeof a){let c={};for(let[d,e]of Object.entries(a))c[d]=r(e,b);return c}return a}function s(a,b,c){a.addFile(`${D}/${b}`,Buffer.isBuffer(c)?c:Buffer.from(c,"utf8"))}function t(a){let b=(0,j.getAgentDir)(),d=new(f()),e={formatVersion:1,createdAt:new Date().toISOString(),...function(){try{return{piWebVersion:c(39006).version??"unknown",piSdkVersion:"unknown"}}catch{return{piWebVersion:"unknown",piSdkVersion:"unknown"}}}(),sourcePlatform:process.platform,includeSecrets:a.includeSecrets,includeSessions:a.includeSessions,files:[],mcpBinScripts:[],localPackages:[],absolutePaths:[],warnings:[]};for(let c of["models.json","auth.json","settings.json","mcp.json","models-store.json","AGENTS.md","APPEND_SYSTEM.md"]){let f=(0,i.join)(b,c);if(!(0,g.existsSync)(f)||"auth.json"===c&&!a.includeSecrets)continue;let h=(0,g.readFileSync)(f,"utf8");if("models.json"!==c||a.includeSecrets){if("settings.json"===c||"mcp.json"===c||"models.json"===c){let a=n(f);a&&(h=JSON.stringify(p(a),null,2))}}else{let a=n(f);a&&(h=JSON.stringify(function(a){let b=a.providers??{},c={};for(let[a,d]of Object.entries(b))c[a]={...d},"string"==typeof c[a].apiKey&&(c[a].apiKey="");return{...a,providers:c}}(a),null,2))}s(d,c,String(h)),e.files.push(`${D}/${c}`)}let h=(0,i.join)(b,"skills");if((0,g.existsSync)(h))for(let a of o(h))d.addFile(`${D}/skills/${a}`,(0,g.readFileSync)((0,i.join)(h,a))),e.files.push(`${D}/skills/${a}`);let l=n((0,i.join)(b,"settings.json"));for(let a of l?.packages??[]){let b="string"==typeof a?a:a?.source;if(!b||b.startsWith("npm:"))continue;let c=(0,k.A0)(b);if((0,i.isAbsolute)(c)&&(0,g.existsSync)(c)){let a=(0,i.basename)(c);for(let b of o(c))d.addFile(`${D}/local-packages/${a}/${b}`,(0,g.readFileSync)((0,i.join)(c,b))),e.files.push(`${D}/local-packages/${a}/${b}`);e.localPackages.push(a)}else e.warnings.push(`Local package skipped (not found or not absolute): ${b}`)}let m=n((0,i.join)(b,"mcp.json")),q=new Set;if(m?.mcpServers)for(let a of Object.values(m.mcpServers))!function a(b,c){if("string"==typeof b){let a=`${E}/bin/`;if(b.startsWith(a)){let d=b.slice(a.length).split("/")[0];d&&c.add(d)}return}if(Array.isArray(b)){for(let d of b)a(d,c);return}if(null!==b&&"object"==typeof b)for(let d of Object.values(b))a(d,c)}(p(a),q);for(let a of q){let c=(0,i.join)(b,"bin",a);(0,g.existsSync)(c)&&(0,g.statSync)(c).isFile()?(d.addFile(`${D}/bin/${a}`,(0,g.readFileSync)(c)),e.files.push(`${D}/bin/${a}`),e.mcpBinScripts.push(a)):e.warnings.push(`MCP bin script referenced but missing: ${a}`)}if(a.includeSessions){let a=(0,i.join)(b,"sessions");if((0,g.existsSync)(a))for(let b of o(a))d.addFile(`${D}/sessions/${b}`,(0,g.readFileSync)((0,i.join)(a,b))),e.files.push(`${D}/sessions/${b}`)}return s(d,"manifest.json",JSON.stringify(e,null,2)),d.toBuffer()}let G=new Set(["npx","uvx","node","uv","npm","git","python3","python","bun","deno"]);function u(a){let b=a.toString("utf8",0,256).split(/\r?\n/,1)[0]??"";return b.startsWith("#!")?b:null}function v(a,b,c){let d=(0,j.getAgentDir)(),e=c??process.platform,f="win32"===e,g=[],h=[];for(let[c,j]of Object.entries(a)){let a,l=q(j),m="string"==typeof l.command?l.command:"",n=Array.isArray(l.args)?l.args.map(String):[],o={command:m,args:n};if(!m){h.push({name:c,original:o,adapted:null,action:"keep",platform:e});continue}let p=function(a,b){if(!a)return"manual";if((0,k.A0)(a).startsWith((0,k.A0)(b)+"/bin/"))return"restore-script";if(a.includes("/")||a.includes("\\")||a.includes(":"))return"keep-with-warning";let c=a.split(/[\s]/)[0];return G.has(c),"keep"}(m,d),r=null;if("restore-script"===p){let j=(0,i.basename)((0,k.A0)(m)),l=b.get(j);if(!l){r=null,a=`bin script ${j} missing from backup`,h.push({name:c,original:o,adapted:r,action:"manual",platform:e,reason:a,installPrompt:C({name:c,original:o,adapted:r,action:"manual",platform:e,reason:a})});continue}if(!w(j)){a=`bin script name rejected (unsafe): ${j}`;let b={name:c,original:o,adapted:null,action:"manual",platform:e,reason:a};h.push({...b,installPrompt:C(b)}),g.push(`${c}: ${a}`);continue}if(!x(l)){a="bin script content rejected (unrecognized shebang)";let b={name:c,original:o,adapted:null,action:"manual",platform:e,reason:a};h.push({...b,installPrompt:C(b)}),g.push(`${c}: ${a}`);continue}if(f){let b=u(l);if(b&&b.includes("node"))r={command:(0,i.join)(d,"bin",`${j}.cmd`),args:n},h.push({name:c,original:o,adapted:r,action:"generate-cmd",platform:e,reason:(0,i.join)(d,"bin",j)});else{a="bash/other shebang wrapper cannot run on Windows; reinstall or adjust manually";let b={name:c,original:o,adapted:null,action:"manual",platform:e,reason:a};h.push({...b,installPrompt:C(b)}),g.push(`${c}: ${a}`)}}else r={command:(0,i.join)(d,"bin",j),args:n},h.push({name:c,original:o,adapted:r,action:"restore-script",platform:e});continue}if("keep-with-warning"===p){r={command:m,args:n},a="absolute path outside agentDir/bin — verify it exists on this machine",h.push({name:c,original:o,adapted:r,action:"keep-with-warning",platform:e,reason:a}),g.push(`${c}: ${a}`);continue}r={command:m,args:n},h.push({name:c,original:o,adapted:r,action:"keep",platform:e})}return{servers:h,warnings:g}}function w(a){return/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(a)&&!a.includes("..")}function x(a){let b=u(a);if(!b)return!1;let c=b.slice(2).trim().split(/\s+/);if(0===c.length)return!1;let d=c[0],e=d.split("/").pop()??d;return!!["node","bash","sh","python3","python","zsh"].includes(e)||"env"===e&&c.length>1&&["node","bash","sh","python3","python"].includes(c[1].split("/").pop()??"")}function y(a){let b;try{b=new(f())(a)}catch(a){throw Error(`Not a valid zip archive: ${a instanceof Error?a.message:String(a)}`)}let c=b.getEntries(),d=(0,g.mkdtempSync)((0,i.join)((0,h.tmpdir)(),"pi-backup-")),e=(0,i.join)(d,D);(0,g.mkdirSync)(e,{recursive:!0});let j=0,k=0;for(let a of c){if(a.isDirectory)continue;let c=a.entryName.replace(/\\/g,"/");if(!c.startsWith(`${D}/`))throw(0,g.rmSync)(d,{recursive:!0,force:!0}),Error(`Unexpected entry outside ${D}/: ${c}`);let f=(0,i.resolve)(e,c.slice(D.length+1));if(!f.startsWith((0,i.resolve)(e)+i.sep))throw(0,g.rmSync)(d,{recursive:!0,force:!0}),Error(`Path traversal blocked: ${c}`);let h="number"==typeof a.header.size?a.header.size:0;if(j+=h,h>0x20000000||j>0x40000000)throw(0,g.rmSync)(d,{recursive:!0,force:!0}),Error(`Backup archive too large when extracted (entry: ${c})`);(0,g.mkdirSync)((0,i.dirname)(f),{recursive:!0}),b.extractEntryTo(a,(0,i.dirname)(f),!1,!0);let l=(0,g.statSync)(f).size;if(k+=l,l>0x20000000||k>0x40000000)throw(0,g.rmSync)(d,{recursive:!0,force:!0}),Error(`Backup archive too large when extracted (entry: ${c})`)}let l=(0,i.join)(e,"manifest.json");if(!(0,g.existsSync)(l))throw(0,g.rmSync)(d,{recursive:!0,force:!0}),Error("Backup manifest.json missing — not a pi-web backup");let m=n(l);if(!m||1!==m.formatVersion)throw(0,g.rmSync)(d,{recursive:!0,force:!0}),Error(`Unsupported backup format version: ${m?.formatVersion??"unknown"} (expected 1)`);let o=n((0,i.join)(e,"mcp.json"))?.mcpServers??{},p=new Map;for(let a of m.mcpBinScripts??[]){let b=(0,i.join)(e,"bin",a);(0,g.existsSync)(b)&&p.set(a,(0,g.readFileSync)(b))}let q=["core","skills","packages","mcp"];return m.includeSessions&&q.push("sessions"),{manifest:m,tempDir:d,servers:o,binScripts:p,categories:q}}function z(a){(0,g.rmSync)(a.tempDir,{recursive:!0,force:!0})}function A(a,b){let c=(0,j.getAgentDir)(),{manifest:d}=a,e={restored:[],needsRestart:[],manual:[],warnings:[]},f=new Set(b.categories),h=new Set(b.skippedMcpServers),m=b=>{let d=(0,i.join)(c,b),f=(0,i.join)(a.tempDir,D,b);(0,g.existsSync)(f)&&((0,g.mkdirSync)((0,i.dirname)(d),{recursive:!0}),(0,l.$)(d,(0,g.readFileSync)(f,"utf8")),e.restored.push(b))};if(f.has("core"))for(let a of["models.json","auth.json","settings.json","mcp.json","models-store.json","AGENTS.md","APPEND_SYSTEM.md"])("auth.json"!==a||d.includeSecrets)&&(m(a),e.needsRestart.push(a));if(f.has("skills")){let b=(0,i.join)(a.tempDir,D,"skills");if((0,g.existsSync)(b)){for(let a of o(b)){let d=(0,i.join)(c,"skills",a);(0,g.mkdirSync)((0,i.dirname)(d),{recursive:!0}),(0,l.$)(d,(0,g.readFileSync)((0,i.join)(b,a),"utf8"))}e.restored.push("skills/")}}if(f.has("packages")){let b=(0,i.join)(c,"settings.json"),f=n(b)??{},h=f.packages??[],j=d.localPackages??[],m=(0,i.join)(a.tempDir,D,"local-packages");for(let a of j){if(!w(a)){e.warnings.push(`Local package ${a} not restored (unsafe name)`);continue}let b=(0,i.join)(m,a);if(!(0,g.existsSync)(b)){e.warnings.push(`Local package ${a} missing from backup`);continue}let d=(0,i.join)(c,"local-packages",a);for(let a of o(b)){let c=(0,i.join)(d,a);(0,g.mkdirSync)((0,i.dirname)(c),{recursive:!0}),(0,l.$)(c,(0,g.readFileSync)((0,i.join)(b,a),"utf8"))}e.restored.push(`local-packages/${a}`)}let p=!1,q=h.map(a=>{let b="string"==typeof a?a:a?.source;if("string"!=typeof b||b.startsWith("npm:"))return a;let d=(0,i.basename)((0,k.A0)(b));if(j.includes(d)){p=!0;let b=(0,i.join)(c,"local-packages",d);return"string"==typeof a?b:{...a,source:b}}return a});if(p){let a={...f,packages:q};(0,l.$)(b,JSON.stringify(a,null,2)),e.restored.push("settings.json (packages paths)"),e.needsRestart.push("settings.json (packages paths)")}for(let a of h.map(a=>"string"==typeof a?a:a?.source).filter(a=>"string"==typeof a&&a.startsWith("npm:")))e.restored.push(`npm package ${a} (queued for reinstall)`)}if(f.has("mcp")){let b=v(a.servers,a.binScripts);e.warnings.push(...b.warnings);let d=n((0,i.join)(c,"mcp.json"))??{},f={};for(let d of b.servers){if(h.has(d.name))continue;if("manual"===d.action){e.manual.push({server:d.name,message:d.reason??"cannot be adapted automatically"});continue}let b=a.servers[d.name]??{},j=q(b);if(f[d.name]={...j,command:d.adapted?.command??j.command,...d.adapted?{args:d.adapted.args}:{}},"restore-script"===d.action){let b=(0,i.basename)((0,k.A0)(String(d.adapted?.command??""))),f=a.binScripts.get(b);if(f&&w(b)&&x(f)){let a=(0,i.join)(c,"bin",b);(0,g.mkdirSync)((0,i.dirname)(a),{recursive:!0}),(0,l.$)(a,f.toString("utf8"));try{(0,g.chmodSync)(a,493)}catch{}e.restored.push(`bin/${b}`)}else e.warnings.push(`bin script ${b} not restored (unsafe name or content)`)}if("generate-cmd"===d.action){let b=(0,i.basename)((0,k.A0)(String(d.adapted?.command??""))).replace(/\.cmd$/,""),f=a.binScripts.get(b);if(f&&w(b)&&x(f)){let a=(0,i.join)(c,"bin",b);(0,g.mkdirSync)((0,i.dirname)(a),{recursive:!0}),(0,l.$)(a,f.toString("utf8"));let d=(0,i.join)(c,"bin",`${b}.cmd`),h=`%~dp0${b}`;(0,l.$)(d,`@node "${h}" %*\r
|
|
1
|
+
exports.id=7915,exports.ids=[7915],exports.modules={8102:(a,b,c)=>{"use strict";c.d(b,{$:()=>g});var d=c(55511),e=c(29021),f=c(33873);function g(a,b){let c=(0,f.dirname)(a),g=(0,f.join)(c,`.${(0,f.basename)(a)}-${(0,d.randomUUID)()}.tmp`),h=!1;try{(0,e.writeFileSync)(g,b,{encoding:"utf8",flag:"wx",mode:384,flush:!0}),(0,e.renameSync)(g,a)}catch(a){throw h=!0,a}finally{try{(0,e.unlinkSync)(g)}catch(a){if("ENOENT"!==a.code&&!h)throw a}}}},39006:a=>{"use strict";a.exports=JSON.parse('{"name":"@qt4798/pi-web","version":"0.18.12","description":"Web workspace for the pi coding agent","homepage":"https://github.com/t479842598/pi-web-QT#readme","repository":{"type":"git","url":"git+https://github.com/t479842598/pi-web-QT.git"},"bugs":{"url":"https://github.com/t479842598/pi-web-QT/issues"},"license":"MIT","engines":{"node":">=22.19.0"},"bin":{"pi-web":"bin/pi-web.js"},"files":["bin",".next","!.next/cache","!.next/dev","!.next/standalone","!.next/**/*.js.map","lib/theme","public","next.config.ts","package.json"],"scripts":{"dev":"node bin/fix-pi-agent-undici.js && node bin/with-memory-limit.js node_modules/.bin/next dev -H 127.0.0.1 -p 0 --turbopack","dev:lan":"node bin/fix-pi-agent-undici.js && node bin/with-memory-limit.js node_modules/.bin/next dev -H 0.0.0.0 -p 0 --turbopack","postinstall":"node bin/prepare-terminal.js","theme:css":"node scripts/generate-theme-css.mjs","prebuild":"node scripts/generate-theme-css.mjs","build":"env -u TURBOPACK -u __NEXT_PRIVATE_STANDALONE_CONFIG next build --webpack","bundle:backend":"node scripts/bundle-backend.mjs","start":"node bin/fix-pi-agent-undici.js && node bin/with-memory-limit.js node_modules/.bin/next start -H 127.0.0.1 -p 0","start:lan":"node bin/fix-pi-agent-undici.js && node bin/with-memory-limit.js node_modules/.bin/next start -H 0.0.0.0 -p 0","lint":"eslint .","release":"npm version patch --no-git-tag-version && npm run build && npm publish --access public","test":"node --experimental-strip-types --test $(find app components hooks lib -name \'*.test.mjs\' -print)","test:e2e":"node e2e/run.mjs","test:terminal":"node e2e/terminal.mjs"},"dependencies":{"@earendil-works/pi-agent-core":"0.87.1","@earendil-works/pi-ai":"0.87.1","@earendil-works/pi-coding-agent":"0.87.1","@earendil-works/pi-tui":"0.87.1","@fontsource/ia-writer-quattro":"^5.3.0","@fontsource/lilex":"^5.3.0","@phosphor-icons/react":"^2.1.10","@radix-ui/react-dialog":"^1.1.23","@tanstack/react-virtual":"^3.14.9","@tauri-apps/api":"^2.11.1","@xterm/addon-fit":"0.11.0","@xterm/xterm":"6.0.0","adm-zip":"^0.6.0","ansi_up":"^6.0.6","cmdk":"^1.1.1","js-yaml":"^5.2.3","katex":"^0.16.47","lucide-react":"^1.37.0","mammoth":"^1.12.0","mermaid":"^11.16.1","next":"16.3.6","node-pty":"1.2.0-beta.15","proper-lockfile":"4.1.2","qrcode":"^1.5.4","react":"^19.2.4","react-dom":"^19.2.4","react-markdown":"^10.1.0","react-syntax-highlighter":"^16.1.1","rehype-katex":"^7.0.1","rehype-raw":"^7.0.0","rehype-sanitize":"^6.0.0","remark-frontmatter":"^5.0.0","remark-gfm":"^4.0.1","remark-math":"^6.0.0","semver":"7.8.5","undici":"^8.11.0"},"overrides":{"undici":"^8.11.0","@earendil-works/pi-coding-agent":{"undici":"^8.11.0"},"intersection-observer":"npm:noop2@2.0.0","node-domexception":"npm:@profoundlogic/node-domexception@1.0.2"},"allowScripts":{"@google/genai@1.52.0":true,"protobufjs@7.6.5":true,"sharp@0.34.5":true,"unrs-resolver@1.12.2":true},"devDependencies":{"@resvg/resvg-js":"^2.6.2","@tailwindcss/postcss":"^4.2.2","@types/js-yaml":"^4.0.9","@types/node":"^25","@types/proper-lockfile":"4.1.4","@types/qrcode":"^1.5.6","@types/react":"^19","@types/react-dom":"^19","@types/react-syntax-highlighter":"^15.5.13","@types/semver":"7.8.0","eslint":"^9.39.5","eslint-config-next":"16.3.5","jiti":"^2.7.0","lightningcss":"^1.33.0","playwright":"^1.63.0","postcss":"^8","tailwindcss":"^4.2.2","to-ico":"^1.1.5","typescript":"^5.9.3"}}')},50593:(a,b,c)=>{"use strict";function d(a){return/^[a-zA-Z]:[\\/]/.test(a)||a.startsWith("\\\\")?a.replace(/\\/g,"/"):a}c.d(b,{A0:()=>d})},66544:(a,b,c)=>{"use strict";c.d(b,{E2:()=>l,EN:()=>k});var d=c(77030);function e(a){return(a.startsWith("[")&&a.endsWith("]")?a.slice(1,-1):a).toLowerCase().replace(/\.$/,"")}function f(a){if(!a||/[\s/@\\]/.test(a))return null;try{let b=new URL(`http://${a}`);if(b.username||b.password||"/"!==b.pathname||b.search||b.hash)return null;return e(b.hostname)}catch{return null}}function g(a){if(!a||/[\s/@\\]/.test(a))return null;try{let b=new URL(`http://${a}`);if(b.username||b.password||"/"!==b.pathname||b.search||b.hash)return null;let c=e(b.hostname);return b.port?`${c}:${b.port}`:c}catch{return null}}function h(){return[process.env.PI_WEB_HOSTNAME,...process.env.PI_WEB_ALLOWED_HOSTS?.split(",")??[]].filter(a=>!!a?.trim())}function i(a){try{return new URL(a).origin}catch{return null}}let j=new Set(["POST","PUT","PATCH","DELETE"]);function k(a,b=h()){if(!function(a,b=h()){let c=a.headers.get("host"),g=c?f(c):null;return!!g&&(!!("localhost"===g||g.endsWith(".localhost")||(0,d.isIP)(g))||b.some(a=>{let b;return((b=a?.trim())?(0,d.isIP)(b)?e(b):f(b):null)===g}))}(a,b))return!1;if(function(a){if("GET"!==a.method||"navigate"!==a.headers.get("sec-fetch-mode")||"document"!==a.headers.get("sec-fetch-dest")||"?1"!==a.headers.get("sec-fetch-user"))return!1;try{return/^\/api\/sessions\/[^/]+\/export$/.test(new URL(a.url).pathname)}catch{return!1}}(a))return!0;if(!(a.headers.has("origin")||a.headers.has("sec-fetch-site"))){if(j.has((a.method??"GET").toUpperCase())){let b=a.headers.get("host"),c=b?f(b):null;return null!==c&&!!("localhost"===c||c.endsWith(".localhost")||/^127\./.test(c)||"::1"===c||"[::1]"===c)}return!0}return function(a){let b,c,d;if("cross-site"===a.headers.get("sec-fetch-site"))return!1;let e=a.headers.get("origin");if(!e)return!0;let f=(b=new URL(a.url),(c=a.headers.get("host"))?i(`${b.protocol}//${c}`):null);if(null!==f&&(i(e)===f||function(a,b,c){let d,e;try{d=new URL(a),e=new URL(b)}catch{return!1}if(d.protocol!==e.protocol||d.hostname.toLowerCase()!==e.hostname.toLowerCase())return!1;if(!d.port)return"same-origin"===c;let f=e.port||("https:"===e.protocol?"443":"80");return d.port===f}(e,f,a.headers.get("sec-fetch-site"))))return!0;if("same-origin"!==a.headers.get("sec-fetch-site")||!a.headers.get("x-forwarded-proto"))return!1;let h=a.headers.get("host");if(!h)return!1;try{d=new URL(e).host}catch{return!1}let j=g(d);return null!==j&&j===g(h)}(a)}function l(a){let b=a.headers.get("content-type")?.split(";",1)[0]?.trim().toLowerCase();return"application/json"===b||!!(b?.startsWith("application/")&&b.endsWith("+json"))}},78335:()=>{},89628:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{DT:()=>y,dH:()=>A,g3:()=>z,jE:()=>v,lz:()=>B,uj:()=>t});var e=c(26106),f=c.n(e),g=c(29021),h=c(21820),i=c(33873),j=c(75430),k=c(50593),l=c(8102),m=a([j]);j=(m.then?(await m)():m)[0];let D="pi-backup",E="${agentDir}",F="${home}";function n(a){if(!(0,g.existsSync)(a))return null;try{let b=JSON.parse((0,g.readFileSync)(a,"utf8"));return null!==b&&"object"==typeof b?b:null}catch{return null}}function o(a){let b=[],c=[""];for(;c.length>0;){let d,e=c.pop(),f=(0,i.join)(a,e);try{d=(0,g.readdirSync)(f)}catch{continue}for(let a of d){let d;if("node_modules"===a||".git"===a)continue;let h=e?`${e}/${a}`:a,j=(0,i.join)(f,a);try{d=(0,g.statSync)(j)}catch{continue}d.isDirectory()?c.push(h):d.isFile()&&b.push(h)}}return b}function p(a){let b=(0,k.A0)((0,j.getAgentDir)()),c=(0,k.A0)((0,h.homedir)());return r(a,a=>{let d=(0,k.A0)(a);return d===b?E:d===c?F:d.startsWith(b+"/")?E+d.slice(b.length):d.startsWith(c+"/")?F+d.slice(c.length):a})}function q(a){let b=(0,j.getAgentDir)(),c=(0,h.homedir)();return r(a,a=>a===E?b:a===F?c:a.startsWith(E+"/")?(0,i.join)(b,...a.slice(E.length+1).split("/")):a.startsWith(F+"/")?(0,i.join)(c,...a.slice(F.length+1).split("/")):a)}function r(a,b){if("string"==typeof a)return b(a);if(Array.isArray(a))return a.map(a=>r(a,b));if(null!==a&&"object"==typeof a){let c={};for(let[d,e]of Object.entries(a))c[d]=r(e,b);return c}return a}function s(a,b,c){a.addFile(`${D}/${b}`,Buffer.isBuffer(c)?c:Buffer.from(c,"utf8"))}function t(a){let b=(0,j.getAgentDir)(),d=new(f()),e={formatVersion:1,createdAt:new Date().toISOString(),...function(){try{return{piWebVersion:c(39006).version??"unknown",piSdkVersion:"unknown"}}catch{return{piWebVersion:"unknown",piSdkVersion:"unknown"}}}(),sourcePlatform:process.platform,includeSecrets:a.includeSecrets,includeSessions:a.includeSessions,files:[],mcpBinScripts:[],localPackages:[],absolutePaths:[],warnings:[]};for(let c of["models.json","auth.json","settings.json","mcp.json","models-store.json","AGENTS.md","APPEND_SYSTEM.md"]){let f=(0,i.join)(b,c);if(!(0,g.existsSync)(f)||"auth.json"===c&&!a.includeSecrets)continue;let h=(0,g.readFileSync)(f,"utf8");if("models.json"!==c||a.includeSecrets){if("settings.json"===c||"mcp.json"===c||"models.json"===c){let a=n(f);a&&(h=JSON.stringify(p(a),null,2))}}else{let a=n(f);a&&(h=JSON.stringify(function(a){let b=a.providers??{},c={};for(let[a,d]of Object.entries(b))c[a]={...d},"string"==typeof c[a].apiKey&&(c[a].apiKey="");return{...a,providers:c}}(a),null,2))}s(d,c,String(h)),e.files.push(`${D}/${c}`)}let h=(0,i.join)(b,"skills");if((0,g.existsSync)(h))for(let a of o(h))d.addFile(`${D}/skills/${a}`,(0,g.readFileSync)((0,i.join)(h,a))),e.files.push(`${D}/skills/${a}`);let l=n((0,i.join)(b,"settings.json"));for(let a of l?.packages??[]){let b="string"==typeof a?a:a?.source;if(!b||b.startsWith("npm:"))continue;let c=(0,k.A0)(b);if((0,i.isAbsolute)(c)&&(0,g.existsSync)(c)){let a=(0,i.basename)(c);for(let b of o(c))d.addFile(`${D}/local-packages/${a}/${b}`,(0,g.readFileSync)((0,i.join)(c,b))),e.files.push(`${D}/local-packages/${a}/${b}`);e.localPackages.push(a)}else e.warnings.push(`Local package skipped (not found or not absolute): ${b}`)}let m=n((0,i.join)(b,"mcp.json")),q=new Set;if(m?.mcpServers)for(let a of Object.values(m.mcpServers))!function a(b,c){if("string"==typeof b){let a=`${E}/bin/`;if(b.startsWith(a)){let d=b.slice(a.length).split("/")[0];d&&c.add(d)}return}if(Array.isArray(b)){for(let d of b)a(d,c);return}if(null!==b&&"object"==typeof b)for(let d of Object.values(b))a(d,c)}(p(a),q);for(let a of q){let c=(0,i.join)(b,"bin",a);(0,g.existsSync)(c)&&(0,g.statSync)(c).isFile()?(d.addFile(`${D}/bin/${a}`,(0,g.readFileSync)(c)),e.files.push(`${D}/bin/${a}`),e.mcpBinScripts.push(a)):e.warnings.push(`MCP bin script referenced but missing: ${a}`)}if(a.includeSessions){let a=(0,i.join)(b,"sessions");if((0,g.existsSync)(a))for(let b of o(a))d.addFile(`${D}/sessions/${b}`,(0,g.readFileSync)((0,i.join)(a,b))),e.files.push(`${D}/sessions/${b}`)}return s(d,"manifest.json",JSON.stringify(e,null,2)),d.toBuffer()}let G=new Set(["npx","uvx","node","uv","npm","git","python3","python","bun","deno"]);function u(a){let b=a.toString("utf8",0,256).split(/\r?\n/,1)[0]??"";return b.startsWith("#!")?b:null}function v(a,b,c){let d=(0,j.getAgentDir)(),e=c??process.platform,f="win32"===e,g=[],h=[];for(let[c,j]of Object.entries(a)){let a,l=q(j),m="string"==typeof l.command?l.command:"",n=Array.isArray(l.args)?l.args.map(String):[],o={command:m,args:n};if(!m){h.push({name:c,original:o,adapted:null,action:"keep",platform:e});continue}let p=function(a,b){if(!a)return"manual";if((0,k.A0)(a).startsWith((0,k.A0)(b)+"/bin/"))return"restore-script";if(a.includes("/")||a.includes("\\")||a.includes(":"))return"keep-with-warning";let c=a.split(/[\s]/)[0];return G.has(c),"keep"}(m,d),r=null;if("restore-script"===p){let j=(0,i.basename)((0,k.A0)(m)),l=b.get(j);if(!l){r=null,a=`bin script ${j} missing from backup`,h.push({name:c,original:o,adapted:r,action:"manual",platform:e,reason:a,installPrompt:C({name:c,original:o,adapted:r,action:"manual",platform:e,reason:a})});continue}if(!w(j)){a=`bin script name rejected (unsafe): ${j}`;let b={name:c,original:o,adapted:null,action:"manual",platform:e,reason:a};h.push({...b,installPrompt:C(b)}),g.push(`${c}: ${a}`);continue}if(!x(l)){a="bin script content rejected (unrecognized shebang)";let b={name:c,original:o,adapted:null,action:"manual",platform:e,reason:a};h.push({...b,installPrompt:C(b)}),g.push(`${c}: ${a}`);continue}if(f){let b=u(l);if(b&&b.includes("node"))r={command:(0,i.join)(d,"bin",`${j}.cmd`),args:n},h.push({name:c,original:o,adapted:r,action:"generate-cmd",platform:e,reason:(0,i.join)(d,"bin",j)});else{a="bash/other shebang wrapper cannot run on Windows; reinstall or adjust manually";let b={name:c,original:o,adapted:null,action:"manual",platform:e,reason:a};h.push({...b,installPrompt:C(b)}),g.push(`${c}: ${a}`)}}else r={command:(0,i.join)(d,"bin",j),args:n},h.push({name:c,original:o,adapted:r,action:"restore-script",platform:e});continue}if("keep-with-warning"===p){r={command:m,args:n},a="absolute path outside agentDir/bin — verify it exists on this machine",h.push({name:c,original:o,adapted:r,action:"keep-with-warning",platform:e,reason:a}),g.push(`${c}: ${a}`);continue}r={command:m,args:n},h.push({name:c,original:o,adapted:r,action:"keep",platform:e})}return{servers:h,warnings:g}}function w(a){return/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(a)&&!a.includes("..")}function x(a){let b=u(a);if(!b)return!1;let c=b.slice(2).trim().split(/\s+/);if(0===c.length)return!1;let d=c[0],e=d.split("/").pop()??d;return!!["node","bash","sh","python3","python","zsh"].includes(e)||"env"===e&&c.length>1&&["node","bash","sh","python3","python"].includes(c[1].split("/").pop()??"")}function y(a){let b;try{b=new(f())(a)}catch(a){throw Error(`Not a valid zip archive: ${a instanceof Error?a.message:String(a)}`)}let c=b.getEntries(),d=(0,g.mkdtempSync)((0,i.join)((0,h.tmpdir)(),"pi-backup-")),e=(0,i.join)(d,D);(0,g.mkdirSync)(e,{recursive:!0});let j=0,k=0;for(let a of c){if(a.isDirectory)continue;let c=a.entryName.replace(/\\/g,"/");if(!c.startsWith(`${D}/`))throw(0,g.rmSync)(d,{recursive:!0,force:!0}),Error(`Unexpected entry outside ${D}/: ${c}`);let f=(0,i.resolve)(e,c.slice(D.length+1));if(!f.startsWith((0,i.resolve)(e)+i.sep))throw(0,g.rmSync)(d,{recursive:!0,force:!0}),Error(`Path traversal blocked: ${c}`);let h="number"==typeof a.header.size?a.header.size:0;if(j+=h,h>0x20000000||j>0x40000000)throw(0,g.rmSync)(d,{recursive:!0,force:!0}),Error(`Backup archive too large when extracted (entry: ${c})`);(0,g.mkdirSync)((0,i.dirname)(f),{recursive:!0}),b.extractEntryTo(a,(0,i.dirname)(f),!1,!0);let l=(0,g.statSync)(f).size;if(k+=l,l>0x20000000||k>0x40000000)throw(0,g.rmSync)(d,{recursive:!0,force:!0}),Error(`Backup archive too large when extracted (entry: ${c})`)}let l=(0,i.join)(e,"manifest.json");if(!(0,g.existsSync)(l))throw(0,g.rmSync)(d,{recursive:!0,force:!0}),Error("Backup manifest.json missing — not a pi-web backup");let m=n(l);if(!m||1!==m.formatVersion)throw(0,g.rmSync)(d,{recursive:!0,force:!0}),Error(`Unsupported backup format version: ${m?.formatVersion??"unknown"} (expected 1)`);let o=n((0,i.join)(e,"mcp.json"))?.mcpServers??{},p=new Map;for(let a of m.mcpBinScripts??[]){let b=(0,i.join)(e,"bin",a);(0,g.existsSync)(b)&&p.set(a,(0,g.readFileSync)(b))}let q=["core","skills","packages","mcp"];return m.includeSessions&&q.push("sessions"),{manifest:m,tempDir:d,servers:o,binScripts:p,categories:q}}function z(a){(0,g.rmSync)(a.tempDir,{recursive:!0,force:!0})}function A(a,b){let c=(0,j.getAgentDir)(),{manifest:d}=a,e={restored:[],needsRestart:[],manual:[],warnings:[]},f=new Set(b.categories),h=new Set(b.skippedMcpServers),m=b=>{let d=(0,i.join)(c,b),f=(0,i.join)(a.tempDir,D,b);(0,g.existsSync)(f)&&((0,g.mkdirSync)((0,i.dirname)(d),{recursive:!0}),(0,l.$)(d,(0,g.readFileSync)(f,"utf8")),e.restored.push(b))};if(f.has("core"))for(let a of["models.json","auth.json","settings.json","mcp.json","models-store.json","AGENTS.md","APPEND_SYSTEM.md"])("auth.json"!==a||d.includeSecrets)&&(m(a),e.needsRestart.push(a));if(f.has("skills")){let b=(0,i.join)(a.tempDir,D,"skills");if((0,g.existsSync)(b)){for(let a of o(b)){let d=(0,i.join)(c,"skills",a);(0,g.mkdirSync)((0,i.dirname)(d),{recursive:!0}),(0,l.$)(d,(0,g.readFileSync)((0,i.join)(b,a),"utf8"))}e.restored.push("skills/")}}if(f.has("packages")){let b=(0,i.join)(c,"settings.json"),f=n(b)??{},h=f.packages??[],j=d.localPackages??[],m=(0,i.join)(a.tempDir,D,"local-packages");for(let a of j){if(!w(a)){e.warnings.push(`Local package ${a} not restored (unsafe name)`);continue}let b=(0,i.join)(m,a);if(!(0,g.existsSync)(b)){e.warnings.push(`Local package ${a} missing from backup`);continue}let d=(0,i.join)(c,"local-packages",a);for(let a of o(b)){let c=(0,i.join)(d,a);(0,g.mkdirSync)((0,i.dirname)(c),{recursive:!0}),(0,l.$)(c,(0,g.readFileSync)((0,i.join)(b,a),"utf8"))}e.restored.push(`local-packages/${a}`)}let p=!1,q=h.map(a=>{let b="string"==typeof a?a:a?.source;if("string"!=typeof b||b.startsWith("npm:"))return a;let d=(0,i.basename)((0,k.A0)(b));if(j.includes(d)){p=!0;let b=(0,i.join)(c,"local-packages",d);return"string"==typeof a?b:{...a,source:b}}return a});if(p){let a={...f,packages:q};(0,l.$)(b,JSON.stringify(a,null,2)),e.restored.push("settings.json (packages paths)"),e.needsRestart.push("settings.json (packages paths)")}for(let a of h.map(a=>"string"==typeof a?a:a?.source).filter(a=>"string"==typeof a&&a.startsWith("npm:")))e.restored.push(`npm package ${a} (queued for reinstall)`)}if(f.has("mcp")){let b=v(a.servers,a.binScripts);e.warnings.push(...b.warnings);let d=n((0,i.join)(c,"mcp.json"))??{},f={};for(let d of b.servers){if(h.has(d.name))continue;if("manual"===d.action){e.manual.push({server:d.name,message:d.reason??"cannot be adapted automatically"});continue}let b=a.servers[d.name]??{},j=q(b);if(f[d.name]={...j,command:d.adapted?.command??j.command,...d.adapted?{args:d.adapted.args}:{}},"restore-script"===d.action){let b=(0,i.basename)((0,k.A0)(String(d.adapted?.command??""))),f=a.binScripts.get(b);if(f&&w(b)&&x(f)){let a=(0,i.join)(c,"bin",b);(0,g.mkdirSync)((0,i.dirname)(a),{recursive:!0}),(0,l.$)(a,f.toString("utf8"));try{(0,g.chmodSync)(a,493)}catch{}e.restored.push(`bin/${b}`)}else e.warnings.push(`bin script ${b} not restored (unsafe name or content)`)}if("generate-cmd"===d.action){let b=(0,i.basename)((0,k.A0)(String(d.adapted?.command??""))).replace(/\.cmd$/,""),f=a.binScripts.get(b);if(f&&w(b)&&x(f)){let a=(0,i.join)(c,"bin",b);(0,g.mkdirSync)((0,i.dirname)(a),{recursive:!0}),(0,l.$)(a,f.toString("utf8"));let d=(0,i.join)(c,"bin",`${b}.cmd`),h=`%~dp0${b}`;(0,l.$)(d,`@node "${h}" %*\r
|
|
2
2
|
`),e.restored.push(`bin/${b}`,`bin/${b}.cmd`)}else e.warnings.push(`bin script ${b} not restored (unsafe name or content)`)}}(0,l.$)((0,i.join)(c,"mcp.json"),JSON.stringify({...d,mcpServers:f},null,2)),e.restored.push("mcp.json"),e.needsRestart.push("mcp.json")}return{report:e,npmPackages:B(a)}}function B(a){let b=n((0,i.join)(a.tempDir,D,"settings.json"));return(b?.packages??[]).map(a=>"string"==typeof a?a:a?.source).filter(a=>"string"==typeof a&&a.startsWith("npm:"))}function C(a){let b=(0,j.getAgentDir)(),c="win32"===process.platform?"Windows":"darwin"===process.platform?"macOS":"Linux",d=JSON.stringify(a.original,null,2);return[`请在当前环境(${c})安装 MCP server「${a.name}」。`,"\n## 原始配置(来自备份)\n```json",d,"```\n\n## 统一安装约定",`- 脚本类工具统一安装到 \`${(0,i.join)(b,"bin")}\`(Windows 上同时生成同名 \`.cmd\` 包装)。`,`- npm 类工具统一通过 \`npx <pkg>\` 运行,或安装到 \`${(0,i.join)(b,"npm")}\` 后引用。`,"- 依赖(node/npx/uv 等)统一从 PATH 解析,不要硬编码本机绝对路径。\n- 安装完成后,输出可直接写入 `~/.pi/agent/mcp.json` 的完整 server 配置片段(含 command/args/transport/lifecycle)。\n- 不要修改 mcp.json 中其它 server 的配置。\n\n安装过程中如遇障碍,请说明原因并给出替代方案。"].join("\n")}d()}catch(a){d(a)}})},96487:()=>{}};
|