@baique/pi-web-sky 0.1.59 → 0.1.61
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 +7 -7
- package/.next/build-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +1 -1
- 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 +3 -3
- package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/agent/running/route.js +1 -1
- package/.next/server/app/api/app-update/route.js +1 -1
- package/.next/server/app/api/sessions/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +5 -5
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +5 -5
- package/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/page.js +8 -8
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +7 -7
- package/.next/server/chunks/1937.js +1 -1
- package/.next/server/chunks/402.js +8 -8
- package/.next/server/chunks/542.js +1 -1
- package/.next/server/chunks/6429.js +1 -1
- package/.next/server/chunks/6525.js +4 -4
- package/.next/server/chunks/6583.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/{8088.39866dc5f1d15868.js → 8088.a8a689f302a4f56d.js} +1 -1
- package/.next/static/chunks/app/{layout-15b8d7ddfb49a19d.js → layout-58dd6111497e161d.js} +1 -1
- package/.next/static/chunks/app/page-9bbf25bd34fa91f1.js +256 -0
- package/.next/static/chunks/{webpack-1ce35e1249cfd931.js → webpack-4b8e9412e72f86c0.js} +1 -1
- package/.next/static/css/21bd3ff21f2866ac.css +1 -0
- package/.next/trace +7 -8
- package/.next/trace-build +1 -1
- package/lib/board-types.ts +6 -0
- package/lib/rpc-manager.title.test.mjs +128 -0
- package/lib/rpc-manager.ts +25 -0
- package/lib/session-index-scanner.test.mjs +25 -0
- package/lib/session-index-scanner.ts +9 -0
- package/lib/session-list-signal.test.mjs +50 -0
- package/lib/session-list-signal.ts +32 -0
- package/lib/session-reader.ts +5 -6
- package/lib/task-store.ts +5 -3
- package/lib/transcript.test.mjs +186 -0
- package/lib/transcript.ts +304 -0
- package/lib/turn-merge.ts +1 -1
- package/package.json +1 -1
- package/.next/static/chunks/app/page-06102d7540ccaf75.js +0 -256
- package/.next/static/css/c7d127e07b1a786c.css +0 -1
- /package/.next/static/{qD0gvlcxBrjwm2vdTuA1h → ImiqQqbpF4KxeBm1KeB5N}/_buildManifest.js +0 -0
- /package/.next/static/{qD0gvlcxBrjwm2vdTuA1h → ImiqQqbpF4KxeBm1KeB5N}/_ssgManifest.js +0 -0
|
@@ -5,7 +5,7 @@ ${x=f.inner.sessionManager.buildSessionContext().messages,(y=JSON.stringify(x)).
|
|
|
5
5
|
${a.inheritedParentContext}`:a.task,...b||c?{exactSystemPrompt:a.profileSystemPrompt}:{}}}},27367:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{N:()=>m,UF:()=>p,UM:()=>o,ef:()=>n,hd:()=>l});var e=c(73024),f=c(76760),g=c(75430),h=c(8102),i=a([g]);g=(i.then?(await i)():i)[0];let p=32;function j(a=(0,g.getAgentDir)()){return(0,f.join)(a,"agents","settings.json")}function k(a){if(!(0,e.existsSync)(a))return{};let b=JSON.parse((0,e.readFileSync)(a,"utf8"));if(null===b||"object"!=typeof b||Array.isArray(b))throw Error("Invalid subagent settings: expected an object");return b}function l(a=j()){var b,c,d;let e=k(a);return c=!0===e.builtInEnabled,b=e.maxConcurrent,d="number"==typeof b&&Number.isInteger(b)&&b>=1&&b<=p?b:10,Object.defineProperty({builtInEnabled:c},"maxConcurrent",{value:d,enumerable:!1,configurable:!0})}function m(a=j()){try{return l(a).builtInEnabled}catch{return!1}}function n(a,b=j()){let c=k(b);return(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0}),(0,h.$)(b,JSON.stringify({...c,version:1,builtInEnabled:a},null,2)),l(b)}function o(a,b=j()){if(!Number.isInteger(a)||a<1||a>p)throw Error(`maxConcurrent must be an integer between 1 and ${p}`);let c=k(b);return(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0}),(0,h.$)(b,JSON.stringify({...c,version:1,maxConcurrent:a},null,2)),l(b)}d()}catch(a){d(a)}})},28967:(a,b,c)=>{function d(){return globalThis.__piModelsCacheState||(globalThis.__piModelsCacheState={entries:new Map,inFlight:new Map,generation:0}),globalThis.__piModelsCacheState}function e(){let a=d();a.generation+=1,a.entries.clear(),a.inFlight.clear()}function f(a,b){return b?{...a,modelError:b}:a}function g(a){return{...a,modelError:"Model list is temporarily unavailable. Check your configuration and try again."}}function h(a,b){let c=d(),e=c.entries.get(a);if(e){if(e.expiresAt>Date.now())return Promise.resolve(e.data);c.entries.delete(a)}let f=c.inFlight.get(a);if(f)return f;let g=c.generation,h=Promise.resolve().then(b).then(b=>{if(c.generation===g&&c.inFlight.get(a)===h){let d=Date.now();for(let[a,b]of c.entries)b.expiresAt<=d&&c.entries.delete(a);for(;c.entries.size>=32;){let a=c.entries.keys().next().value;if(void 0===a)break;c.entries.delete(a)}c.entries.set(a,{data:b,expiresAt:d+6e4})}return b}).finally(()=>{c.inFlight.get(a)===h&&c.inFlight.delete(a)});return c.inFlight.set(a,h),h}c.d(b,{Fw:()=>g,Mx:()=>f,kn:()=>e,rC:()=>h})},30590:(a,b,c)=>{c.d(b,{o:()=>e});let d=new Set(["off","minimal","low","medium","high","xhigh","max"]);async function e(a,b,c){if(!b.model&&!b.thinkingLevel)return{modelDefaultChanged:!1};let e=!1;if(b.model&&c.model&&b.model.provider===c.model.provider&&b.model.modelId===c.model.modelId&&(a.setDefaultModelAndProvider(c.model.provider,c.model.modelId),e=!0),b.thinkingLevel&&(c.supportsThinking||"off"!==c.thinkingLevel)){var f;let b=(f=c.thinkingLevel,d.has(f))?c.thinkingLevel:void 0;a.setDefaultThinkingLevel(b)}return await a.flush(),{modelDefaultChanged:e}}},36899:(a,b,c)=>{c.d(b,{M:()=>d});let d={noExtensions:!0,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!1,systemPrompt:" ",appendSystemPrompt:[" "],systemPromptOverride:()=>void 0,appendSystemPromptOverride:()=>[]}},46753:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{J8:()=>k,U6:()=>m,Vj:()=>l,o2:()=>j});var e=c(28802),f=c(75430),g=c(7048),h=c(99324),i=a([e,f,g]);[e,f,g]=i.then?(await i)():i;let n="pi-web-subagents",o=`<inline:${n}>`,p=new Set(g.st),q="pi-subagents";function j(a){return{kind:"pi-web-subagent",sessionId:a.sessionId,profile:a.profile,description:a.description,status:a.status,runInBackground:a.runInBackground,createdAt:a.createdAt,...a.completedAt?{completedAt:a.completedAt}:{},...a.error?{error:a.error}:{},...a.worktreePath?{worktreePath:a.worktreePath}:{},...a.worktreeBranch?{worktreeBranch:a.worktreeBranch}:{},...a.worktreeCleanupError?{worktreeCleanupError:a.worktreeCleanupError}:{}}}function k(a){return"starting"===a.status||"running"===a.status?`Subagent ${a.sessionId} is ${a.status}.`:"completed"===a.status?a.result?.trim()||"Subagent completed without text output.":"aborted"===a.status?`Subagent ${a.sessionId} was stopped.`:"interrupted"===a.status?`Subagent ${a.sessionId} was interrupted before completion.`:`Subagent ${a.sessionId} failed: ${a.error??"Unknown error"}`}function l(a,b,c=()=>!0){return{name:n,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.
|
|
6
6
|
|
|
7
7
|
Available agent types:
|
|
8
|
-
${(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{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 m(a){let b=a.extensions.find(a=>a.path===o);if(!b?.tools.has("Agent"))return a;let c=new Set(a.extensions.filter(a=>a.path!==o).filter(a=>{let b=(a.sourceInfo?.source??"").replace(/^npm:/,"").split("@")[0],c=a.path.replaceAll("\\","/").split("/");return b===q||c.some(a=>a===q)}).filter(a=>[...p].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!==o||![...c].some(b=>[...p].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,{Ds:()=>j,J1:()=>h,eD:()=>i});var e=c(75430),f=c(76760),g=a([e]);e=(g.then?(await g)():g)[0];let k="pi-web-project-command-environment",l=`<inline:${k}>`;function h(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 h;let i,j,k,l=(h=function(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_")})(a,b)&&delete c[a];return c}(f.env??c,g),i="win32"===g?Object.keys(h).find(a=>"PATH"===a.toUpperCase())??"PATH":"PATH",j="win32"===g?";":":",(k=h[i]??"").split(j).filter(Boolean).includes(b)||(h[i]=[b,k].filter(Boolean).join(j)),h);return d.exec(a,e,{...f,env:l})}}}function i(a){return{name:k,hidden:!0,factory:b=>{let c=(0,e.createBashToolDefinition)(a.cwd);b.registerTool({...c,execute:(b,c,d,f,g)=>(0,e.createBashToolDefinition)(a.cwd,{commandPrefix:a.settings.getShellCommandPrefix(),operations:h({shellPath:a.settings.getShellPath()})}).execute(b,c,d,f,g)})}}}function j(a){let b=a.extensions.findIndex(a=>a.path===l);if(b<0)return a;let c=a.extensions.slice(0,b).find(a=>a.tools.has("bash"));return c?{...a,extensions:a.extensions.filter((a,c)=>c!==b),errors:a.errors.filter(a=>a.path!==l||a.error!==`Tool "bash" conflicts with ${c.path}`)}:a}d()}catch(a){d(a)}})},56429:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{A4:()=>L,Bp:()=>N,HG:()=>Q,OF:()=>S,Zo:()=>U,_I:()=>O,_e:()=>R,d_:()=>T,oA:()=>P,wW:()=>V});var e=c(75430),f=c(31239),g=c(29862),h=c(55511),i=c(29021),j=c(33873),k=c(78970),l=c(28967),m=c(18904),n=c(53303),o=c(98986),p=c(46753),q=c(7048),r=c(12568),s=c(27367),t=c(36899),u=c(40402),v=c(41306),w=c(85664),x=c(27631),y=c(74244),z=c(24923),A=c(46583),B=c(20861),C=c(72498),D=c(30590),E=c(71069),F=a([e,f,g,m,n,o,p,q,r,s,u,v,x,A,B,C]);[e,f,g,m,n,o,p,q,r,s,u,v,x,A,B,C]=F.then?(await F)():F;let W=new Set(["agent_end","agent_settled","auto_compaction_end","compaction_end"]),X=function(a=process.env.PI_WEB_IDLE_TIMEOUT_MS){if(void 0!==a&&""!==a.trim()){let b=Number(a);if(Number.isFinite(b)&&b>=0&&b<=0x7fffffff)return b;console.warn(`[pi-web] invalid PI_WEB_IDLE_TIMEOUT_MS "${a}", falling back to 10 minutes`)}return 6e5}(),Y=["read","bash","edit","write","grep","find","ls"],Z={accent:"",border:"",borderAccent:"",borderMuted:"",success:"",error:"",warning:"",muted:"",dim:"",text:"",thinkingText:"",scrollbarTrack:"",scrollbarThumb:"",searchMatchText:"",userMessageText:"",customMessageText:"",customMessageLabel:"",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:""},$={selectedBg:"",searchMatchBg:"",userMessageBg:"",customMessageBg:"",toolPendingBg:"",toolSuccessBg:"",toolErrorBg:""};class _ extends e.Theme{constructor(){super(Z,$,"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 aa=new _,ab=new g.KeybindingsManager(g.TUI_KEYBINDINGS);function G(a,b){if(0===b.length)return[];let c=new Set(Y),d=a.getAllTools().map(a=>a.name).filter(a=>!c.has(a));return[...new Set([...b,...d])]}class ac{constructor(a,b={}){this.inner=a,this.listeners=[],this.pendingUiResponses=new Map,this.pendingUiRequests=new Map,this.activeCustomUis=new Map,this.extensionStatuses=new Map,this.extensionWidgets=new Map,this.activeExtensionWidgets=new Map,this.extensionWidgetGenerations=new Map,this.extensionWidgetsResetting=!1,this.pendingPromptCount=0,this.promptAdmissionTail=Promise.resolve(),this.extensionsBound=!1,this.extensionBindingPromise=null,this.extensionBindingError=null,this.forceEmptySystemPrompt=!1,this.unsubscribe=null,this.idleTimer=null,this.onDestroyCallback=null,this.shutdownPromise=null,this._alive=!0,this.lastAgentStart=0,this.activityTracker=(0,w.S)(),this.forcedPromptProjectionInstalled=!1,this.exactSystemPrompt=b.exactSystemPrompt,this.chatOnly=b.chatOnly??!1,this.installForcedPromptProjection()}hasPendingUiRequest(){return this.pendingUiRequests.size>0}lastAgentStartAt(){return this.lastAgentStart}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}get cwd(){return this.inner.sessionManager.getCwd()}get streamingMessage(){return this.inner.agent.state?.streamingMessage}get isStreaming(){return this.inner.isStreaming}isAlive(){return this._alive}isChatOnly(){return this.chatOnly}isRunning(){return this._alive&&(this.pendingPromptCount>0||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)}start(){this.unsubscribe=this.inner.subscribe(a=>{"agent_start"===a.type&&(this.lastAgentStart=Date.now()),"agent_end"===a.type&&(0,u.mD)(),W.has(a.type)&&this.resetIdleTimer();try{this.persistSessionActivity(a)}catch(b){console.error(`[pi-web] 会话活跃写库失败(${a.type}):`,b instanceof Error?b.message:String(b))}this.emit(a)}),this.resetIdleTimer()}persistSessionActivity(a){let b=this.activityTracker.handle(a);if(!b)return;let c=this.inner.sessionId;if(c){if("touch"===b.kind)return void(0,A.xE)(c);(0,A.YZ)(c,b),(0,A.HO)(c,function(a){for(let b of a){if(b?.type!=="message"||b.message?.role!=="user")continue;let a=M(b).trim();if(a)return a.slice(0,x.XK)}return""}(this.inner.sessionManager.getEntries()))}}setForceEmptySystemPrompt(a){this.forceEmptySystemPrompt=a,this.ensureForcedPromptProjection()}beginExtensionBinding(a={}){this.ensureExtensionsBound(a).catch(a=>{console.error("[pi-web] failed to dispatch session_start to extensions:",a instanceof Error?a.message:a)})}async waitUntilReady(){await this.waitForExtensionsBound()}installForcedPromptProjection(){if(this.forcedPromptProjectionInstalled)return;let a=this.inner.agent;if(!a)return;this.forcedPromptProjectionInstalled=!0;let b=a.transformContext;a.transformContext=async(a,c)=>{let d=b?await b(a,c):a,e=this.forceEmptySystemPrompt?"":this.exactSystemPrompt?.();if(void 0===e)return d;let g=(0,f.getCurrentSystemMessage)(d);return[{role:"system",content:e,...g?.toolsAdded?{toolsAdded:g.toolsAdded}:{},timestamp:g?.timestamp??Date.now()},...d.filter(a=>"system"!==a.role)]}}ensureForcedPromptProjection(){this.installForcedPromptProjection()}ensureExtensionsBound(a={}){return(a.forceEmptySystemPrompt&&(this.forceEmptySystemPrompt=!0),this.extensionsBound)?(this.ensureForcedPromptProjection(),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,h.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.ensureForcedPromptProjection(),console.log(`[pi-web] session_start dispatched to extensions for session ${this.inner.sessionId}`)})().catch(a=>{throw this.extensionBindingError=a,a})),this.extensionBindingPromise)}async waitForExtensionsBound(){try{this.extensionBindingPromise&&await this.extensionBindingPromise}catch(a){throw a instanceof Error?a:Error(String(a))}if(this.extensionBindingError)throw this.extensionBindingError instanceof Error?this.extensionBindingError:Error(String(this.extensionBindingError))}shouldWaitForExtensions(a){return"prompt"===a||"steer"===a||"follow_up"===a||"get_commands"===a||"get_state"===a}async withFinalRunningNotification(a){try{return await a()}finally{this.resetIdleTimer()}}emit(a){for(let b of this.listeners)try{b(a)}catch(b){console.error(`[pi-web] failed to deliver ${a.type} event:`,b instanceof Error?b.message:b)}}async acquirePromptAdmission(){let a,b=this.promptAdmissionTail;return this.promptAdmissionTail=new Promise(b=>{a=b}),await b,a}resetIdleTimer(){0!==X&&(this.idleTimer&&clearTimeout(this.idleTimer),this.idleTimer=setTimeout(()=>{this.isRunning()?this.resetIdleTimer():this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down idle session:",a instanceof Error?a.message:a)})},X))}onEvent(a){for(let b of(this.listeners.push(a),this.pendingUiRequests.values()))a(b);return()=>{let b=this.listeners.indexOf(a);-1!==b&&this.listeners.splice(b,1)}}onDestroy(a){this.onDestroyCallback=a}async send(a){this.resetIdleTimer();let b=a.type;if(this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound(),"prompt"===b||"steer"===b||"follow_up"===b){let b=(0,k.kc)(a.images);if(b)throw Error(b)}switch(b){case"prompt":{let b=await this.acquirePromptAdmission();try{let b,c,d;if(this.inner.isBashRunning)throw Error("Cannot send a prompt while a shell command is running");let e=a.images,f=a.streamingBehavior,g=!1,h=!1,i=!1,j=new Promise((a,d)=>{b=()=>{g=!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.pendingPromptCount+=1;try{d=this.inner.prompt(a.message,{...e?.length?{images:e}:{},...f?{streamingBehavior:f}:{},source:"rpc",preflightResult:a=>{a&&b()}})}catch(a){throw k(),a}return d.then(()=>{b(),k(),f||this.emit({type:"prompt_done"})},a=>{c(a),k(),(0,u.mD)(),g&&(this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),f||this.emit({type:"prompt_done"}))}).catch(a=>{console.error("[pi-web] prompt completion handler failed:",a instanceof Error?a.message:a)}),await j,null}finally{b()}}case"abort":return await this.withFinalRunningNotification(()=>this.inner.abort()),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,autoCompactionEnabled:this.inner.autoCompactionEnabled,autoRetryEnabled:this.inner.autoRetryEnabled,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()]},contextUsage:b?{percent:b.percent,contextWindow:b.contextWindow,tokens:b.tokens}:null,systemPrompt:this.inner.agent.state?.systemPrompt??"",thinkingLevel:this.inner.agent.state?.thinkingLevel??"off",extensionStatuses:this.getExtensionStatuses(),extensionWidgets:this.getExtensionWidgets()}}case"set_model":{let{provider:b,modelId:c}=a,d=this.inner.modelRuntime.getModel(b,c);if(d||(await this.inner.modelRuntime.refresh({allowNetwork:!1}),d=this.inner.modelRuntime.getModel(b,c)),!d)throw Error(`Model not found: ${b}/${c}`);return await this.inner.setModel(d),(0,l.kn)(),(0,u.mD)(),{id:d.id,provider:d.provider}}case"fork_branch":{if(this.isRunning())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),h=g.createBranchedSession(b);if(!h)throw Error("Failed to create forked session");if(!(0,i.existsSync)(h)){let a=[g.getHeader(),...g.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,i.writeFileSync)(h,a,{encoding:"utf8",flag:"wx"}),g.flushed=!0}let j=e.SessionManager.open(h,f).getSessionId();(0,u.O8)(j,h),(0,u.mD)();let k=c.getSessionId();return await (0,v.Pv)(h,k,(0,A.l6)(k)),{cancelled:!1,newSessionId:j}}case"fork":{let b;if(this.inner.isBashRunning)throw Error("Cannot fork while a shell command is running");let c=this.inner.sessionId,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 h=f.getEntry(d);if(!h)throw Error("Invalid entry ID for forking");let j=f.getSessionDir();if(h.parentId){let a=e.SessionManager.open(g,j),c=a.createBranchedSession(h.parentId);if(!c)throw Error("Failed to create forked session");if(b=c,!(0,i.existsSync)(b)){let c=[a.getHeader(),...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,i.writeFileSync)(b,c,{encoding:"utf8",flag:"wx"}),a.flushed=!0}}else{let a=e.SessionManager.create(f.getCwd(),j);a.newSession({parentSession:g}),a.getSessionFile()&&a._rewriteFile(),b=a.getSessionFile()}let k=e.SessionManager.open(b,j).getSessionId();(0,u.O8)(k,b),(0,u.mD)();let l=f.getCwd(),m=(0,A.l6)(c);await this.shutdown();try{let a=await (0,z.KI)(l??"");(0,A.YH)(k,{path:b,cwd:l??"",projectKey:(0,y.z)(a?.projectRoot??l??""),parentId:c,taskId:m})}catch(a){console.error(`[pi-web] fork 建行失败 session=${k}:`,a instanceof Error?a.message:String(a))}try{await (0,B.BC)(c)}catch(a){console.error(`[pi-web] fork 入板失败 source=${c}:`,a instanceof Error?a.message:String(a))}return{cancelled:!1,newSessionId:k}}case"navigate_tree":if(this.inner.isBashRunning)throw Error("Cannot navigate while a shell command is running");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,u.mD)(),null}case"compact":try{return await this.withFinalRunningNotification(()=>this.inner.compact(a.customInstructions))}finally{(0,u.mD)()}case"set_session_name":{let b=a.name?.trim();if(!b)throw Error("Session name cannot be empty");this.inner.setSessionName(b);try{await (0,A.Bm)(this.inner.sessionId,b)}catch(a){console.error("[pi-web] 会话标题写库失败:",a)}return(0,u.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"set_auto_compaction":return this.inner.setAutoCompactionEnabled(a.enabled),null;case"clear_queue":return this.inner.clearQueue();case"steer":{let b=a.images;return await this.inner.steer(a.message,b?.length?b:void 0),null}case"follow_up":{let b=a.images;return await this.inner.followUp(a.message,b?.length?b:void 0),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;if((0,q.ph)(this.inner.sessionManager.getEntries()))throw Error("Subagent tool selection is fixed by its profile");return this.setForceEmptySystemPrompt(0===b.length),this.inner.setActiveToolsByName(G(this.inner,b)),null}case"reload":return await this.waitForExtensionsBound(),this.extensionStatuses.clear(),this.resetExtensionWidgetsForReload(),this.syncProjectTrust(),await this.inner.reload(),"function"!=typeof this.inner.bindExtensions&&this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc"),(0,l.kn)(),{success:!0};case"abort_compaction":return this.inner.abortCompaction(),null;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.pendingPromptCount>0||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.executeBash(a.command,void 0,{excludeFromContext:a.excludeFromContext,operations:(0,n.J1)({shellPath:this.inner.settingsManager.getShellPath()})});try{return await b}finally{this.resetIdleTimer(),(0,u.mD)()}}case"abort_bash":return this.inner.abortBash(),null;default:throw Error(`Unsupported command: ${b}`)}}destroy(){if(this._alive){for(let a of(this._alive=!1,this.idleTimer&&clearTimeout(this.idleTimer),this.inner.isBashRunning&&this.inner.abortBash(),this.unsubscribe?.(),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.clearExtensionWidgets(!1);try{this.inner.dispose()}finally{this.onDestroyCallback?.()}}}async shutdown(){return this.shutdownPromise?this.shutdownPromise:this._alive?(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)}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())}nextExtensionWidgetGeneration(a){let b=(this.extensionWidgetGenerations.get(a)??0)+1;return this.extensionWidgetGenerations.set(a,b),b}disposeExtensionWidgetComponent(a){if(!a||"object"!=typeof a&&"function"!=typeof a)return;let b=a.dispose;if("function"==typeof b)try{b.call(a)}catch{}}emitExtensionWidgetClear(a){this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:void 0,widgetPlacement:void 0})}clearExtensionWidget(a,b=!0){let c=this.nextExtensionWidgetGeneration(a),d=this.activeExtensionWidgets.get(a);return this.activeExtensionWidgets.delete(a),this.extensionWidgets.delete(a),d&&this.disposeExtensionWidgetComponent(d.component),this.extensionWidgetGenerations.get(a)!==c||b&&this.emitExtensionWidgetClear(a),c}clearExtensionWidgets(a){for(let b of new Set([...this.extensionWidgets.keys(),...this.activeExtensionWidgets.keys()]))this.clearExtensionWidget(b,a)}resetExtensionWidgetsForReload(){this.extensionWidgetsResetting=!0;try{for(let a of[...this.activeExtensionWidgets.keys()])this.clearExtensionWidget(a);this.extensionWidgets.clear()}finally{this.extensionWidgetsResetting=!1}}emitExtensionWidgetError(a,b){this.emit({type:"extension_error",extensionPath:`extension-widget:${a}`,event:"setWidget",error:b instanceof Error?b.message:String(b)})}failExtensionWidget(a,b,c,d,e){if(this.extensionWidgetGenerations.get(a)!==b)return void this.disposeExtensionWidgetComponent(e);let f=this.activeExtensionWidgets.get(a),g=!d;f?.generation===b?(g=f.rendered||!f.clearEmitted,this.activeExtensionWidgets.delete(a),this.disposeExtensionWidgetComponent(f.component)):this.disposeExtensionWidgetComponent(e),this.extensionWidgetGenerations.get(a)!==b||(this.extensionWidgets.delete(a),g&&this.emitExtensionWidgetClear(a)),this.emitExtensionWidgetError(a,c)}renderExtensionWidget(a){let b;if(this.activeExtensionWidgets.get(a.key)!==a||this.extensionWidgetGenerations.get(a.key)!==a.generation)return;try{b=a.component.render(E.p1)}catch(b){this.failExtensionWidget(a.key,a.generation,b,a.clearEmitted);return}if(!Array.isArray(b)||!b.every(a=>"string"==typeof a))return void this.failExtensionWidget(a.key,a.generation,Error("Extension widget render must return string[]"),a.clearEmitted);if(this.activeExtensionWidgets.get(a.key)!==a||this.extensionWidgetGenerations.get(a.key)!==a.generation)return;let c=b;this.extensionWidgets.set(a.key,{key:a.key,lines:c,placement:a.placement}),a.rendered=!0,this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setWidget",widgetKey:a.key,widgetLines:c,widgetPlacement:a.placement})}setExtensionWidgetFactory(a,b,c){let d,e=this.extensionWidgets.has(a)||this.activeExtensionWidgets.has(a),f=this.clearExtensionWidget(a,e);if(this.extensionWidgetGenerations.get(a)!==f)return;let g=(0,E.TQ)(()=>{let b=this.activeExtensionWidgets.get(a);b?.generation===f&&this.renderExtensionWidget(b)},E.p1);try{d=b(g,aa)}catch(b){this.failExtensionWidget(a,f,b,e);return}if(this.extensionWidgetGenerations.get(a)!==f)return void this.disposeExtensionWidgetComponent(d);if(!d||"object"!=typeof d&&"function"!=typeof d||"function"!=typeof d.render)return void this.failExtensionWidget(a,f,Error("Extension widget factory must return a component with render(width)"),e,d);let h={key:a,component:d,placement:c?.placement??"aboveEditor",generation:f,clearEmitted:e,rendered:!1};this.activeExtensionWidgets.set(a,h),this.renderExtensionWidget(h)}getCustomUiWidth(a){if(!a||"object"!=typeof a)return E.p1;let b=a.overlayOptions,c="function"==typeof b?b():b;if(!c||"object"!=typeof c)return E.p1;let d=c.width;return"number"==typeof d&&Number.isFinite(d)?Math.max(40,Math.min(140,Math.round(d))):92}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=(0,h.randomUUID)(),d=this.getCustomUiWidth(b);return new Promise(b=>{let e=!1,f=(0,E.TQ)(()=>{let a=this.activeCustomUis.get(c);a&&this.emitCustomUiRender(c,a)},d),g=a=>{e||(e=!0,b(a))},h=a=>{this.activeCustomUis.has(c)?this.closeCustomUi(c,a):g(a)};Promise.resolve().then(()=>a(f,aa,ab,h)).then(a=>{if(e){try{a?.dispose?.()}catch{}return}if(!a||"object"!=typeof a||"function"!=typeof a.render)return void g(void 0);let b={component:a,width:d,resolve:a=>g(a),settled:!1};this.activeCustomUis.set(c,b),this.emitCustomUiRender(c,b)}).catch(a=>{e||(this.emit({type:"extension_error",extensionPath:`custom-ui:${c}`,event:"custom_ui",error:a instanceof Error?a.message:String(a)}),g(void 0))})})}requestExtensionUi(a,b,c,d,e){if(e?.aborted)return Promise.resolve(b);let f=(0,h.randomUUID)(),g={type:"extension_ui_request",id:f,...a,...d?{timeout:d,expiresAt:Date.now()+d}:{}};return new Promise(a=>{let h,i=()=>{h&&clearTimeout(h),e?.removeEventListener("abort",k),this.pendingUiRequests.delete(f),this.pendingUiResponses.delete(f)},j=b=>{i(),a(b)},k=()=>j(b);d&&(h=setTimeout(()=>j(b),d)),e?.addEventListener("abort",k,{once:!0}),this.pendingUiRequests.set(f,g),this.pendingUiResponses.set(f,{resolve:a=>j(c(a)),cancel:()=>j(b)}),this.emit(g)})}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,h.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,h.randomUUID)(),method:"setStatus",statusKey:a,statusText:b})},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:(a,b,c)=>{if(!this._alive||this.extensionWidgetsResetting)return;if("function"==typeof b)return void this.setExtensionWidgetFactory(a,b,c);if(void 0!==b&&!Array.isArray(b))return;if(void 0===b)return void this.clearExtensionWidget(a);let d=this.activeExtensionWidgets.has(a)?this.clearExtensionWidget(a):this.nextExtensionWidgetGeneration(a);this.extensionWidgetGenerations.get(a)===d&&(this.extensionWidgets.set(a,{key:a,lines:b,placement:c?.placement??"aboveEditor"}),this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:b,widgetPlacement:c?.placement}))},setFooter:()=>{},setHeader:()=>{},setTitle:a=>{this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setTitle",title:a})},custom:(a,b)=>this.requestExtensionCustomUi(a,b),pasteToEditor:a=>{this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"set_editor_text",text:a})},setEditorText:a=>{this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"set_editor_text",text:a})},getEditorText:()=>"",addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>void 0,get theme(){return aa},getAllThemes:()=>[],getTheme:()=>void 0,setTheme:()=>({success:!1,error:"Theme switching is not supported in Pi Web extension UI yet"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}}}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.resetExtensionWidgetsForReload(),this.syncProjectTrust(),await this.inner.reload({beforeSessionStart:()=>{this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc")}})}}}syncProjectTrust(){let a=(0,C.Y1)(this.cwd,(0,e.getAgentDir)());this.inner.settingsManager.setProjectTrusted(a.trusted)}}function H(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let a=()=>globalThis.__piSessions?.forEach(a=>a.destroy());process.once("exit",a),process.once("SIGINT",a),process.once("SIGTERM",a)}return globalThis.__piSessions}function I(a){let b=(0,j.resolve)(a);try{return(0,i.realpathSync)(b)}catch{return b}}function J(){return globalThis.__piStartingSessionCwds||(globalThis.__piStartingSessionCwds=new Map),globalThis.__piStartingSessionCwds}async function K(a,b){let c=a.getSessionFile();if(!c||(0,i.existsSync)(c))return;let d=a.getHeader();if(!d)return;let e=[d,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,i.writeFileSync)(c,e,{encoding:"utf8",flag:"wx"}),a.flushed=!0,(0,u.O8)(b,c);let f=a.getCwd();try{let a=await (0,z.KI)(f??"");(0,A.YH)(b,{path:c,cwd:f??"",projectKey:(0,y.z)(a?.projectRoot??f??"")})}catch(a){console.error(`[pi-web] 新会话建行失败 session=${b}:`,a instanceof Error?a.message:String(a))}}function L(a){return H().get(a)}function M(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(" ")}function N(){let a=[];for(let b of H().values()){if(!b.isAlive())continue;let c=b.inner.sessionManager,d=c.getHeader(),e=c.getEntries(),f=e.filter(a=>"message"===a.type),g=f.find(a=>"user"===a.message.role),h=c.getSessionFile()??b.sessionFile,j=!!(h&&(0,i.existsSync)(h));if(!j&&(!b.isRunning()||!g))continue;let k=(0,q.$u)(e,d?.id??b.sessionId,h??""),l=d?.timestamp??e[0]?.timestamp??new Date().toISOString(),m=new Date(l).getTime(),n=Number.isNaN(m)?Date.now():m;for(let a of f){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&&(n=Math.max(n,b))}a.push({path:h??"",id:d?.id??b.sessionId,cwd:d?.cwd??b.cwd,name:c.getSessionName(),created:l,modified:new Date(n).toISOString(),messageCount:f.length,firstMessage:g&&M(g)||"(no messages)",...k?{parentSessionId:k.parentSessionId,relation:{kind:"subagent",parentSessionId:k.parentSessionId,profile:k.profile,description:k.description,status:b.isRunning()?"running":k.status}}:{},transient:!j})}return a}function O(a){let b=I(a);return!!J().has(b)||Array.from(H().values()).some(a=>I(a.cwd)===b&&a.isRunning())}async function P(a){let b=I(a),c=Array.from(H().values()).filter(a=>I(a.cwd)===b);return await Promise.all(c.map(a=>a.shutdown())),c.length}function Q(){let a=new Set;for(let[b,c]of H())c.isRunning()&&a.add(c.sessionId||b);return[...a]}function R(){let a={};for(let[b,c]of H()){let d,e=c.sessionId||b;if(!c.isRunning())continue;let f=c.inner,g=f.agent.state,h=g?.pendingToolCalls;d=f.isStreaming&&h&&h.size>0?"running_tools":f.isBashRunning?"running_command":f.isStreaming?"waiting_model":c.hasPendingUiRequest()?"waiting_input":"waiting_model",a[e]={phase:d,model:f.model?`${f.model.provider}/${f.model.id}`:null,startedAt:c.lastAgentStartAt()}}return a}async function S(a,b,c,d={}){let f,g,h,{toolNames:i,initialModel:j,thinkingLevel:k}=d,r=H(),v=(globalThis.__piStartLocks||(globalThis.__piStartLocks=new Map),globalThis.__piStartLocks),w=r.get(a);if(w?.isAlive())return{session:w,realSessionId:a};let x=v.get(a);if(x)return x;if(b)f=e.SessionManager.open(b,void 0);else{if(!c)throw Error("cwd is required for a new session");let b=a.length>0&&!a.startsWith("__");f=e.SessionManager.create(c,void 0,b?{id:a}:void 0),b&&await K(f,a)}let y=f.getCwd(),z=(g=J(),h=I(y),g.set(h,(g.get(h)??0)+1),()=>{let a=(g.get(h)??1)-1;a>0?g.set(h,a):g.delete(h)}),A=(async()=>{let a=b?(0,q.ph)(f.getEntries()):null,c=!!(a?.loadExtensions||a?.loadSkills),d=a?0===a.tools.length&&!c:i?.length===0;d||(0,e.initTheme)();let g=(0,e.getAgentDir)(),h=a?.tools;a||void 0===i||(h=0===i.length?[]:void 0);let v=(0,C.Fk)(y,g),w=e.SettingsManager.create(y,g),x=await (0,e.createAgentSessionServices)({cwd:y,agentDir:g,settingsManager:w,resourceLoaderOptions:a?{noExtensions:!a.loadExtensions,noSkills:!a.loadSkills,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,systemPrompt:" ",appendSystemPrompt:a.appendSystemPrompt}:d?t.M:{extensionFactories:[(0,n.eD)({cwd:y,settings:w}),(0,o.U)(),(0,p.Vj)(ad.extensionRuntime,()=>(0,q.IR)(y),s.N)],extensionsOverride:a=>(0,n.Ds)((0,p.U6)(a))},...v?{resourceLoaderReloadOptions:v}:{}}),z=await (0,m.p)(x.modelRuntime,x.settingsManager.getEnabledModels()),A=x.settingsManager.getDefaultProvider(),B=x.settingsManager.getDefaultModel(),E=f.getBranch().some(a=>"message"===a.type)?{scopedModels:[...z.scopedModels]}:(0,m.I)(z,{...j?{requestedModel:j}:{},...A&&B?{defaultModel:{provider:A,modelId:B}}:{},...k?{thinkingLevel:k}:{}}),{session:F}=await (0,e.createAgentSessionFromServices)({services:x,sessionManager:f,...E.model?{model:E.model}:{},...E.thinkingLevel?{thinkingLevel:E.thinkingLevel}:{},...E.scopedModels.length>0?{scopedModels:E.scopedModels}:{},...void 0!==h?{tools:h}:{}});(await (0,D.o)(x.settingsManager,{...j?{model:j}:{},...k?{thinkingLevel:k}:{}},{...F.model?{model:{provider:F.model.provider,modelId:F.model.id}}:{},thinkingLevel:F.thinkingLevel,supportsThinking:F.supportsThinking()})).modelDefaultChanged&&(0,l.kn)(),i&&i.length>0&&F.setActiveToolsByName(G(F,i));let H=new ac(F);i?.length===0&&H.setForceEmptySystemPrompt(!0),H.start();let I=F.sessionId,J=F.sessionFile;return J&&(0,u.O8)(I,J),H.onDestroy(()=>r.delete(I)),r.set(I,H),d||H.beginExtensionBinding({forceEmptySystemPrompt:i?.length===0}),{session:H,realSessionId:I}})().finally(()=>{v.delete(a),z()});return v.set(a,A),A}let ad=(0,r.s)({getSession:a=>H().get(a),registerSession:(a,b)=>{let c=new ac(a,{...b?.exactSystemPrompt!==void 0?{exactSystemPrompt:()=>b.exactSystemPrompt}:{},chatOnly:b?.chatOnly}),d=a.sessionId,e=a.sessionFile;e&&(0,u.O8)(d,e),c.onDestroy(()=>H().delete(d)),H().set(d,c),c.start(),c.isChatOnly()||c.beginExtensionBinding()},reopenSession:async(a,b)=>(await S(a,b,void 0)).session,resolveSessionPath:u.resolveSessionPath,invalidateSessionList:u.mD,isBuiltInSubagentsEnabled:s.N});function T(a){return ad.get(a)}function U(a,b){return ad.steer(a,b)}function V(a){return ad.abort(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})}},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){if(!(a&&(0,e.hasTrustRequiringProjectResources)(a)))return{requiresTrust:!1,trusted:!0};let c=new e.ProjectTrustStore(b);return{requiresTrust:!0,trusted:!0===c.get(a)}}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)}})},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(!b||"object"!=typeof b||"image"!==b.type)return"Each attachment must be an image";if(!function(a){if(!a||"object"!=typeof a||"string"!=typeof a.data||"string"!=typeof a.mimeType||!a.mimeType.startsWith("image/"))return!1;let b=function(a){if(!a||a.length%4!=0)return null;let b=a.endsWith("==")?2:+!!a.endsWith("="),c=a.length-b;for(let b=0;b<c;b+=1){var d;if(!((d=a.charCodeAt(b))>=65&&d<=90||d>=97&&d<=122||d>=48&&d<=57||43===d||47===d))return null}for(let b=c;b<a.length;b+=1)if("="!==a[b])return null;return a.length/4*3-b}(a.data);return null!==b&&b<=0xa00000}(b))return"Each image must be valid base64 image data of 10MB or smaller"}return null}},85664:(a,b,c)=>{c.d(b,{S:()=>d});function d(){let a=null;return{handle(b){if("agent_start"===b.type)return{kind:"touch"};if("message_end"===b.type){let c=b.message;if(c?.role==="assistant"){let b,d="string"==typeof(b=c.content)?b.trim():Array.isArray(b)?b.filter(a=>!!a&&"object"==typeof a).filter(a=>"text"===a.type&&"string"==typeof a.text).map(a=>a.text).join("\n").trim():"";d&&(a={lastReply:d,at:"number"==typeof c.timestamp?c.timestamp:Date.now()})}return null}if("agent_settled"===b.type){let b=a;return a=null,b?{kind:"outcome",...b}:{kind:"touch"}}return null}}}},98986:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{U:()=>j});var e=c(28802),f=c(84229),g=c(9202),h=a([e]);function i(){return{currentTurn:0,lastTodoToolUseTurn:0}}e=(h.then?(await h)():h)[0];let k=f.ZUJ.Object({action:f.ZUJ.Union([f.ZUJ.Literal("list"),f.ZUJ.Literal("add"),f.ZUJ.Literal("update"),f.ZUJ.Literal("delete")],{description:"list | add | update | delete"}),text:f.ZUJ.Optional(f.ZUJ.String({description:"新文本,仅 update 使用(trim 后不可为空)"})),texts:f.ZUJ.Optional(f.ZUJ.Array(f.ZUJ.String(),{description:"待添加的 todo 文本数组(仅 add 使用)"})),id:f.ZUJ.Optional(f.ZUJ.Number({description:"要更新的 todo id"})),ids:f.ZUJ.Optional(f.ZUJ.Array(f.ZUJ.Number(),{description:"要删除的 todo id 数组"})),status:f.ZUJ.Optional((0,e.StringEnum)(g.cn,{description:"pending | in_progress | completed"})),updates:f.ZUJ.Optional(f.ZUJ.Array(f.ZUJ.Object({id:f.ZUJ.Number({description:"要更新的 todo id"}),status:f.ZUJ.Optional((0,e.StringEnum)(g.cn)),text:f.ZUJ.Optional(f.ZUJ.String({description:"新文本(trim 后不可为空)"}))},{additionalProperties:!1}),{description:"批量更新数组(优先于单条 id/status/text)"}))},{additionalProperties:!1});function j(){return{name:"pi-web-todo",hidden:!0,factory:a=>{let b={todos:[],nextId:1},c=i(),d=()=>{a.appendEntry(g.sT,{todos:b.todos,nextId:b.nextId})},e=a=>{let d=a.sessionManager.getBranch();for(let a of(b.todos=[],b.nextId=1,Object.assign(c,i()),d)){if("custom"!==a.type||a.customType!==g.sT)continue;let c=(0,g.aO)(a.data);c&&(b.todos=c.todos,b.nextId=c.nextId)}c.currentTurn=function(a){let b=0;for(let c of a){if("custom"===c.type&&c.customType===g.sT){b=0;continue}c.message?.role==="assistant"&&b++}return b}(d)};a.on("session_start",async(a,b)=>e(b)),a.on("session_tree",async(a,b)=>e(b)),a.on("agent_end",async(a,c)=>{0===b.todos.length||(0,g.Ql)(b.todos)||function(a){let b,c=0,d=0;for(let e of a)"custom"===e.type&&e.customType===g.sT?(b=e.data,d=c):e.message?.role==="user"&&c++;let e=(0,g.aO)(b);return!(!e||0===e.todos.length||(0,g.Ql)(e.todos))&&c-d>=2}(c.sessionManager.getBranch())&&(b.todos=[],b.nextId=1,d())}),a.on("turn_start",async()=>{c.currentTurn++}),a.on("tool_result",async a=>{String(a.toolName??"")===g.Y0&&(c.lastTodoToolUseTurn=c.currentTurn)}),a.on("context",async a=>{if(!(0,g.Ql)(b.todos)||c.currentTurn-c.lastTodoToolUseTurn<4||(c.lastTodoToolUseTurn=c.currentTurn,0))return;let d=function(a){let b=a.filter(a=>"completed"!==a.status);if(0===b.length)return null;let c=b.filter(a=>"in_progress"===a.status),d=c.length>0?`#${c[0].id}("${c[0].content}")仍标记为 in_progress。这一步如果已经做完,立刻用 todo update 把它标成 completed,并在同一次调用里把下一项 pending 置为 in_progress,不要留下过期的 [~]。`:"还有 pending 项但没有任何 in_progress。准备继续动手前,先用 todo update 把其中一项置为 in_progress。";return["<system-reminder>","todo 工具已连续 4 轮没有被使用,但仍有未完成任务:","",...b.map(g.mU),"",d,"","只在与本轮工作相关时行动;这是一条温和提醒,不适用就忽略。绝不要向用户提及这条提醒,也不要为了回应它而新造任务。","</system-reminder>"].join("\n")}(b.todos);if(d)return{messages:[...a.messages,{role:"user",content:[{type:"text",text:d}],timestamp:Date.now()}]}}),a.registerTool({name:g.Y0,label:"Todo",description:"管理当前会话的 todo 列表。\n\n动作:\n- list: 查看全部 todo\n- add: 批量添加 todo(texts 数组)\n- update: 按 id 更新 todo——status 和/或 text;批量用 updates[]\n- delete: 按 id 删除 todo(ids 数组)\n\n规则:\n- 同一时间只有一个 todo 处于 in_progress\n- 完成一个 todo 立即标记 completed,不要攒到最后批量标记\n- 未真正完成不得标记 completed:被阻塞或测试失败时保持 in_progress",promptSnippet:"用 todo 跟踪多步骤工作;记得为验证步骤(测试、类型检查)单独建 todo。",promptGuidelines:["[Usage] 多步骤工作(3+步)时使用,AI 自发创建,无需用户触发","[验证任务] 为测试 / 类型检查等验证步骤单独建 todo,完成前确保验证通过","[批量优先] 完成多项任务时使用 updates[] 批量更新,减少工具调用次数","[自动闭合] 全部完成后自动清理,无需手动 delete","[Not for] 单步操作、简单对话"],executionMode:"sequential",parameters:k,async execute(a,c,e){if(e?.aborted)throw Error("Todo call aborted by signal.");let f=(0,g.xw)(c,b),h="list"!==f.action;h&&(b.todos=f.snapshot.todos,b.nextId=f.snapshot.nextId,d());let i=h?`${f.resultText}
|
|
8
|
+
${(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{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 m(a){let b=a.extensions.find(a=>a.path===o);if(!b?.tools.has("Agent"))return a;let c=new Set(a.extensions.filter(a=>a.path!==o).filter(a=>{let b=(a.sourceInfo?.source??"").replace(/^npm:/,"").split("@")[0],c=a.path.replaceAll("\\","/").split("/");return b===q||c.some(a=>a===q)}).filter(a=>[...p].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!==o||![...c].some(b=>[...p].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,{Ds:()=>j,J1:()=>h,eD:()=>i});var e=c(75430),f=c(76760),g=a([e]);e=(g.then?(await g)():g)[0];let k="pi-web-project-command-environment",l=`<inline:${k}>`;function h(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 h;let i,j,k,l=(h=function(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_")})(a,b)&&delete c[a];return c}(f.env??c,g),i="win32"===g?Object.keys(h).find(a=>"PATH"===a.toUpperCase())??"PATH":"PATH",j="win32"===g?";":":",(k=h[i]??"").split(j).filter(Boolean).includes(b)||(h[i]=[b,k].filter(Boolean).join(j)),h);return d.exec(a,e,{...f,env:l})}}}function i(a){return{name:k,hidden:!0,factory:b=>{let c=(0,e.createBashToolDefinition)(a.cwd);b.registerTool({...c,execute:(b,c,d,f,g)=>(0,e.createBashToolDefinition)(a.cwd,{commandPrefix:a.settings.getShellCommandPrefix(),operations:h({shellPath:a.settings.getShellPath()})}).execute(b,c,d,f,g)})}}}function j(a){let b=a.extensions.findIndex(a=>a.path===l);if(b<0)return a;let c=a.extensions.slice(0,b).find(a=>a.tools.has("bash"));return c?{...a,extensions:a.extensions.filter((a,c)=>c!==b),errors:a.errors.filter(a=>a.path!==l||a.error!==`Tool "bash" conflicts with ${c.path}`)}:a}d()}catch(a){d(a)}})},56429:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{A4:()=>L,Bp:()=>O,HG:()=>R,OF:()=>T,Zo:()=>V,_I:()=>P,_e:()=>S,d_:()=>U,oA:()=>Q,wW:()=>W});var e=c(75430),f=c(31239),g=c(29862),h=c(55511),i=c(29021),j=c(33873),k=c(78970),l=c(28967),m=c(18904),n=c(53303),o=c(98986),p=c(46753),q=c(7048),r=c(12568),s=c(27367),t=c(36899),u=c(40402),v=c(41306),w=c(85664),x=c(27631),y=c(74244),z=c(24923),A=c(46583),B=c(20861),C=c(72498),D=c(30590),E=c(71069),F=a([e,f,g,m,n,o,p,q,r,s,u,v,x,A,B,C]);[e,f,g,m,n,o,p,q,r,s,u,v,x,A,B,C]=F.then?(await F)():F;let X=new Set(["agent_end","agent_settled","auto_compaction_end","compaction_end"]),Y=function(a=process.env.PI_WEB_IDLE_TIMEOUT_MS){if(void 0!==a&&""!==a.trim()){let b=Number(a);if(Number.isFinite(b)&&b>=0&&b<=0x7fffffff)return b;console.warn(`[pi-web] invalid PI_WEB_IDLE_TIMEOUT_MS "${a}", falling back to 10 minutes`)}return 6e5}(),Z=["read","bash","edit","write","grep","find","ls"],$={accent:"",border:"",borderAccent:"",borderMuted:"",success:"",error:"",warning:"",muted:"",dim:"",text:"",thinkingText:"",scrollbarTrack:"",scrollbarThumb:"",searchMatchText:"",userMessageText:"",customMessageText:"",customMessageLabel:"",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:""},_={selectedBg:"",searchMatchBg:"",userMessageBg:"",customMessageBg:"",toolPendingBg:"",toolSuccessBg:"",toolErrorBg:""};class aa extends e.Theme{constructor(){super($,_,"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 ab=new aa,ac=new g.KeybindingsManager(g.TUI_KEYBINDINGS);function G(a,b){if(0===b.length)return[];let c=new Set(Z),d=a.getAllTools().map(a=>a.name).filter(a=>!c.has(a));return[...new Set([...b,...d])]}class ad{constructor(a,b={}){this.inner=a,this.listeners=[],this.pendingUiResponses=new Map,this.pendingUiRequests=new Map,this.activeCustomUis=new Map,this.extensionStatuses=new Map,this.extensionWidgets=new Map,this.activeExtensionWidgets=new Map,this.extensionWidgetGenerations=new Map,this.extensionWidgetsResetting=!1,this.pendingPromptCount=0,this.promptAdmissionTail=Promise.resolve(),this.extensionsBound=!1,this.extensionBindingPromise=null,this.extensionBindingError=null,this.forceEmptySystemPrompt=!1,this.unsubscribe=null,this.idleTimer=null,this.onDestroyCallback=null,this.shutdownPromise=null,this._alive=!0,this.lastAgentStart=0,this.activityTracker=(0,w.S)(),this.forcedPromptProjectionInstalled=!1,this.exactSystemPrompt=b.exactSystemPrompt,this.chatOnly=b.chatOnly??!1,this.installForcedPromptProjection()}hasPendingUiRequest(){return this.pendingUiRequests.size>0}lastAgentStartAt(){return this.lastAgentStart}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}get cwd(){return this.inner.sessionManager.getCwd()}get streamingMessage(){return this.inner.agent.state?.streamingMessage}get isStreaming(){return this.inner.isStreaming}isAlive(){return this._alive}isChatOnly(){return this.chatOnly}isRunning(){return this._alive&&(this.pendingPromptCount>0||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)}start(){this.unsubscribe=this.inner.subscribe(a=>{"agent_start"===a.type&&(this.lastAgentStart=Date.now()),"agent_end"===a.type&&(0,u.mD)(),X.has(a.type)&&this.resetIdleTimer();try{this.persistSessionActivity(a)}catch(b){console.error(`[pi-web] 会话活跃写库失败(${a.type}):`,b instanceof Error?b.message:String(b))}this.emit(a)}),this.resetIdleTimer()}persistSessionActivity(a){let b=this.activityTracker.handle(a);if(!b)return;let c=this.inner.sessionId;if(c){if("touch"===b.kind)return void(0,A.xE)(c);(0,A.YZ)(c,b),(0,A.HO)(c,N(this.inner.sessionManager.getEntries()))}}setForceEmptySystemPrompt(a){this.forceEmptySystemPrompt=a,this.ensureForcedPromptProjection()}beginExtensionBinding(a={}){this.ensureExtensionsBound(a).catch(a=>{console.error("[pi-web] failed to dispatch session_start to extensions:",a instanceof Error?a.message:a)})}async waitUntilReady(){await this.waitForExtensionsBound()}installForcedPromptProjection(){if(this.forcedPromptProjectionInstalled)return;let a=this.inner.agent;if(!a)return;this.forcedPromptProjectionInstalled=!0;let b=a.transformContext;a.transformContext=async(a,c)=>{let d=b?await b(a,c):a,e=this.forceEmptySystemPrompt?"":this.exactSystemPrompt?.();if(void 0===e)return d;let g=(0,f.getCurrentSystemMessage)(d);return[{role:"system",content:e,...g?.toolsAdded?{toolsAdded:g.toolsAdded}:{},timestamp:g?.timestamp??Date.now()},...d.filter(a=>"system"!==a.role)]}}ensureForcedPromptProjection(){this.installForcedPromptProjection()}ensureExtensionsBound(a={}){return(a.forceEmptySystemPrompt&&(this.forceEmptySystemPrompt=!0),this.extensionsBound)?(this.ensureForcedPromptProjection(),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,h.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.ensureForcedPromptProjection(),console.log(`[pi-web] session_start dispatched to extensions for session ${this.inner.sessionId}`)})().catch(a=>{throw this.extensionBindingError=a,a})),this.extensionBindingPromise)}async waitForExtensionsBound(){try{this.extensionBindingPromise&&await this.extensionBindingPromise}catch(a){throw a instanceof Error?a:Error(String(a))}if(this.extensionBindingError)throw this.extensionBindingError instanceof Error?this.extensionBindingError:Error(String(this.extensionBindingError))}shouldWaitForExtensions(a){return"prompt"===a||"steer"===a||"follow_up"===a||"get_commands"===a||"get_state"===a}async withFinalRunningNotification(a){try{return await a()}finally{this.resetIdleTimer()}}emit(a){for(let b of this.listeners)try{b(a)}catch(b){console.error(`[pi-web] failed to deliver ${a.type} event:`,b instanceof Error?b.message:b)}}async acquirePromptAdmission(){let a,b=this.promptAdmissionTail;return this.promptAdmissionTail=new Promise(b=>{a=b}),await b,a}resetIdleTimer(){0!==Y&&(this.idleTimer&&clearTimeout(this.idleTimer),this.idleTimer=setTimeout(()=>{this.isRunning()?this.resetIdleTimer():this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down idle session:",a instanceof Error?a.message:a)})},Y))}onEvent(a){for(let b of(this.listeners.push(a),this.pendingUiRequests.values()))a(b);return()=>{let b=this.listeners.indexOf(a);-1!==b&&this.listeners.splice(b,1)}}onDestroy(a){this.onDestroyCallback=a}async send(a){this.resetIdleTimer();let b=a.type;if(this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound(),"prompt"===b||"steer"===b||"follow_up"===b){let b=(0,k.kc)(a.images);if(b)throw Error(b)}switch(b){case"prompt":{let b=await this.acquirePromptAdmission();try{let b,c,d;if(this.inner.isBashRunning)throw Error("Cannot send a prompt while a shell command is running");let e=a.images,f=a.streamingBehavior,g=!1,h=!1,i=!1,j=new Promise((a,d)=>{b=()=>{g=!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.pendingPromptCount+=1;try{d=this.inner.prompt(a.message,{...e?.length?{images:e}:{},...f?{streamingBehavior:f}:{},source:"rpc",preflightResult:a=>{a&&b()}})}catch(a){throw k(),a}d.then(()=>{b(),k(),f||this.emit({type:"prompt_done"})},a=>{c(a),k(),(0,u.mD)(),g&&(this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),f||this.emit({type:"prompt_done"}))}).catch(a=>{console.error("[pi-web] prompt completion handler failed:",a instanceof Error?a.message:a)}),await j;let l="string"==typeof a.message?a.message.trim():"",m=this.inner.sessionId;if(l&&m&&!N(this.inner.sessionManager.getEntries()))try{(0,A.HO)(m,l.slice(0,x.XK))}catch(a){console.error(`[pi-web] 首条消息写库失败 session=${m}:`,a instanceof Error?a.message:String(a))}return null}finally{b()}}case"abort":return await this.withFinalRunningNotification(()=>this.inner.abort()),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,autoCompactionEnabled:this.inner.autoCompactionEnabled,autoRetryEnabled:this.inner.autoRetryEnabled,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()]},contextUsage:b?{percent:b.percent,contextWindow:b.contextWindow,tokens:b.tokens}:null,systemPrompt:this.inner.agent.state?.systemPrompt??"",thinkingLevel:this.inner.agent.state?.thinkingLevel??"off",extensionStatuses:this.getExtensionStatuses(),extensionWidgets:this.getExtensionWidgets()}}case"set_model":{let{provider:b,modelId:c}=a,d=this.inner.modelRuntime.getModel(b,c);if(d||(await this.inner.modelRuntime.refresh({allowNetwork:!1}),d=this.inner.modelRuntime.getModel(b,c)),!d)throw Error(`Model not found: ${b}/${c}`);return await this.inner.setModel(d),(0,l.kn)(),(0,u.mD)(),{id:d.id,provider:d.provider}}case"fork_branch":{if(this.isRunning())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),h=g.createBranchedSession(b);if(!h)throw Error("Failed to create forked session");if(!(0,i.existsSync)(h)){let a=[g.getHeader(),...g.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,i.writeFileSync)(h,a,{encoding:"utf8",flag:"wx"}),g.flushed=!0}let j=e.SessionManager.open(h,f).getSessionId();(0,u.O8)(j,h),(0,u.mD)();let k=c.getSessionId();return await (0,v.Pv)(h,k,(0,A.l6)(k)),{cancelled:!1,newSessionId:j}}case"fork":{let b;if(this.inner.isBashRunning)throw Error("Cannot fork while a shell command is running");let c=this.inner.sessionId,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 h=f.getEntry(d);if(!h)throw Error("Invalid entry ID for forking");let j=f.getSessionDir();if(h.parentId){let a=e.SessionManager.open(g,j),c=a.createBranchedSession(h.parentId);if(!c)throw Error("Failed to create forked session");if(b=c,!(0,i.existsSync)(b)){let c=[a.getHeader(),...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,i.writeFileSync)(b,c,{encoding:"utf8",flag:"wx"}),a.flushed=!0}}else{let a=e.SessionManager.create(f.getCwd(),j);a.newSession({parentSession:g}),a.getSessionFile()&&a._rewriteFile(),b=a.getSessionFile()}let k=e.SessionManager.open(b,j).getSessionId();(0,u.O8)(k,b),(0,u.mD)();let l=f.getCwd(),m=(0,A.l6)(c);await this.shutdown();try{let a=await (0,z.KI)(l??"");(0,A.YH)(k,{path:b,cwd:l??"",projectKey:(0,y.z)(a?.projectRoot??l??""),parentId:c,taskId:m})}catch(a){console.error(`[pi-web] fork 建行失败 session=${k}:`,a instanceof Error?a.message:String(a))}try{await (0,B.BC)(c)}catch(a){console.error(`[pi-web] fork 入板失败 source=${c}:`,a instanceof Error?a.message:String(a))}return{cancelled:!1,newSessionId:k}}case"navigate_tree":if(this.inner.isBashRunning)throw Error("Cannot navigate while a shell command is running");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,u.mD)(),null}case"compact":try{return await this.withFinalRunningNotification(()=>this.inner.compact(a.customInstructions))}finally{(0,u.mD)()}case"set_session_name":{let b=a.name?.trim();if(!b)throw Error("Session name cannot be empty");this.inner.setSessionName(b);try{await (0,A.Bm)(this.inner.sessionId,b)}catch(a){console.error("[pi-web] 会话标题写库失败:",a)}return(0,u.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"set_auto_compaction":return this.inner.setAutoCompactionEnabled(a.enabled),null;case"clear_queue":return this.inner.clearQueue();case"steer":{let b=a.images;return await this.inner.steer(a.message,b?.length?b:void 0),null}case"follow_up":{let b=a.images;return await this.inner.followUp(a.message,b?.length?b:void 0),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;if((0,q.ph)(this.inner.sessionManager.getEntries()))throw Error("Subagent tool selection is fixed by its profile");return this.setForceEmptySystemPrompt(0===b.length),this.inner.setActiveToolsByName(G(this.inner,b)),null}case"reload":return await this.waitForExtensionsBound(),this.extensionStatuses.clear(),this.resetExtensionWidgetsForReload(),this.syncProjectTrust(),await this.inner.reload(),"function"!=typeof this.inner.bindExtensions&&this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc"),(0,l.kn)(),{success:!0};case"abort_compaction":return this.inner.abortCompaction(),null;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.pendingPromptCount>0||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.executeBash(a.command,void 0,{excludeFromContext:a.excludeFromContext,operations:(0,n.J1)({shellPath:this.inner.settingsManager.getShellPath()})});try{return await b}finally{this.resetIdleTimer(),(0,u.mD)()}}case"abort_bash":return this.inner.abortBash(),null;default:throw Error(`Unsupported command: ${b}`)}}destroy(){if(this._alive){for(let a of(this._alive=!1,this.idleTimer&&clearTimeout(this.idleTimer),this.inner.isBashRunning&&this.inner.abortBash(),this.unsubscribe?.(),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.clearExtensionWidgets(!1);try{this.inner.dispose()}finally{this.onDestroyCallback?.()}}}async shutdown(){return this.shutdownPromise?this.shutdownPromise:this._alive?(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)}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())}nextExtensionWidgetGeneration(a){let b=(this.extensionWidgetGenerations.get(a)??0)+1;return this.extensionWidgetGenerations.set(a,b),b}disposeExtensionWidgetComponent(a){if(!a||"object"!=typeof a&&"function"!=typeof a)return;let b=a.dispose;if("function"==typeof b)try{b.call(a)}catch{}}emitExtensionWidgetClear(a){this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:void 0,widgetPlacement:void 0})}clearExtensionWidget(a,b=!0){let c=this.nextExtensionWidgetGeneration(a),d=this.activeExtensionWidgets.get(a);return this.activeExtensionWidgets.delete(a),this.extensionWidgets.delete(a),d&&this.disposeExtensionWidgetComponent(d.component),this.extensionWidgetGenerations.get(a)!==c||b&&this.emitExtensionWidgetClear(a),c}clearExtensionWidgets(a){for(let b of new Set([...this.extensionWidgets.keys(),...this.activeExtensionWidgets.keys()]))this.clearExtensionWidget(b,a)}resetExtensionWidgetsForReload(){this.extensionWidgetsResetting=!0;try{for(let a of[...this.activeExtensionWidgets.keys()])this.clearExtensionWidget(a);this.extensionWidgets.clear()}finally{this.extensionWidgetsResetting=!1}}emitExtensionWidgetError(a,b){this.emit({type:"extension_error",extensionPath:`extension-widget:${a}`,event:"setWidget",error:b instanceof Error?b.message:String(b)})}failExtensionWidget(a,b,c,d,e){if(this.extensionWidgetGenerations.get(a)!==b)return void this.disposeExtensionWidgetComponent(e);let f=this.activeExtensionWidgets.get(a),g=!d;f?.generation===b?(g=f.rendered||!f.clearEmitted,this.activeExtensionWidgets.delete(a),this.disposeExtensionWidgetComponent(f.component)):this.disposeExtensionWidgetComponent(e),this.extensionWidgetGenerations.get(a)!==b||(this.extensionWidgets.delete(a),g&&this.emitExtensionWidgetClear(a)),this.emitExtensionWidgetError(a,c)}renderExtensionWidget(a){let b;if(this.activeExtensionWidgets.get(a.key)!==a||this.extensionWidgetGenerations.get(a.key)!==a.generation)return;try{b=a.component.render(E.p1)}catch(b){this.failExtensionWidget(a.key,a.generation,b,a.clearEmitted);return}if(!Array.isArray(b)||!b.every(a=>"string"==typeof a))return void this.failExtensionWidget(a.key,a.generation,Error("Extension widget render must return string[]"),a.clearEmitted);if(this.activeExtensionWidgets.get(a.key)!==a||this.extensionWidgetGenerations.get(a.key)!==a.generation)return;let c=b;this.extensionWidgets.set(a.key,{key:a.key,lines:c,placement:a.placement}),a.rendered=!0,this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setWidget",widgetKey:a.key,widgetLines:c,widgetPlacement:a.placement})}setExtensionWidgetFactory(a,b,c){let d,e=this.extensionWidgets.has(a)||this.activeExtensionWidgets.has(a),f=this.clearExtensionWidget(a,e);if(this.extensionWidgetGenerations.get(a)!==f)return;let g=(0,E.TQ)(()=>{let b=this.activeExtensionWidgets.get(a);b?.generation===f&&this.renderExtensionWidget(b)},E.p1);try{d=b(g,ab)}catch(b){this.failExtensionWidget(a,f,b,e);return}if(this.extensionWidgetGenerations.get(a)!==f)return void this.disposeExtensionWidgetComponent(d);if(!d||"object"!=typeof d&&"function"!=typeof d||"function"!=typeof d.render)return void this.failExtensionWidget(a,f,Error("Extension widget factory must return a component with render(width)"),e,d);let h={key:a,component:d,placement:c?.placement??"aboveEditor",generation:f,clearEmitted:e,rendered:!1};this.activeExtensionWidgets.set(a,h),this.renderExtensionWidget(h)}getCustomUiWidth(a){if(!a||"object"!=typeof a)return E.p1;let b=a.overlayOptions,c="function"==typeof b?b():b;if(!c||"object"!=typeof c)return E.p1;let d=c.width;return"number"==typeof d&&Number.isFinite(d)?Math.max(40,Math.min(140,Math.round(d))):92}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=(0,h.randomUUID)(),d=this.getCustomUiWidth(b);return new Promise(b=>{let e=!1,f=(0,E.TQ)(()=>{let a=this.activeCustomUis.get(c);a&&this.emitCustomUiRender(c,a)},d),g=a=>{e||(e=!0,b(a))},h=a=>{this.activeCustomUis.has(c)?this.closeCustomUi(c,a):g(a)};Promise.resolve().then(()=>a(f,ab,ac,h)).then(a=>{if(e){try{a?.dispose?.()}catch{}return}if(!a||"object"!=typeof a||"function"!=typeof a.render)return void g(void 0);let b={component:a,width:d,resolve:a=>g(a),settled:!1};this.activeCustomUis.set(c,b),this.emitCustomUiRender(c,b)}).catch(a=>{e||(this.emit({type:"extension_error",extensionPath:`custom-ui:${c}`,event:"custom_ui",error:a instanceof Error?a.message:String(a)}),g(void 0))})})}requestExtensionUi(a,b,c,d,e){if(e?.aborted)return Promise.resolve(b);let f=(0,h.randomUUID)(),g={type:"extension_ui_request",id:f,...a,...d?{timeout:d,expiresAt:Date.now()+d}:{}};return new Promise(a=>{let h,i=()=>{h&&clearTimeout(h),e?.removeEventListener("abort",k),this.pendingUiRequests.delete(f),this.pendingUiResponses.delete(f)},j=b=>{i(),a(b)},k=()=>j(b);d&&(h=setTimeout(()=>j(b),d)),e?.addEventListener("abort",k,{once:!0}),this.pendingUiRequests.set(f,g),this.pendingUiResponses.set(f,{resolve:a=>j(c(a)),cancel:()=>j(b)}),this.emit(g)})}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,h.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,h.randomUUID)(),method:"setStatus",statusKey:a,statusText:b})},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:(a,b,c)=>{if(!this._alive||this.extensionWidgetsResetting)return;if("function"==typeof b)return void this.setExtensionWidgetFactory(a,b,c);if(void 0!==b&&!Array.isArray(b))return;if(void 0===b)return void this.clearExtensionWidget(a);let d=this.activeExtensionWidgets.has(a)?this.clearExtensionWidget(a):this.nextExtensionWidgetGeneration(a);this.extensionWidgetGenerations.get(a)===d&&(this.extensionWidgets.set(a,{key:a,lines:b,placement:c?.placement??"aboveEditor"}),this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:b,widgetPlacement:c?.placement}))},setFooter:()=>{},setHeader:()=>{},setTitle:a=>{this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setTitle",title:a})},custom:(a,b)=>this.requestExtensionCustomUi(a,b),pasteToEditor:a=>{this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"set_editor_text",text:a})},setEditorText:a=>{this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"set_editor_text",text:a})},getEditorText:()=>"",addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>void 0,get theme(){return ab},getAllThemes:()=>[],getTheme:()=>void 0,setTheme:()=>({success:!1,error:"Theme switching is not supported in Pi Web extension UI yet"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}}}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.resetExtensionWidgetsForReload(),this.syncProjectTrust(),await this.inner.reload({beforeSessionStart:()=>{this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc")}})}}}syncProjectTrust(){let a=(0,C.Y1)(this.cwd,(0,e.getAgentDir)());this.inner.settingsManager.setProjectTrusted(a.trusted)}}function H(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let a=()=>globalThis.__piSessions?.forEach(a=>a.destroy());process.once("exit",a),process.once("SIGINT",a),process.once("SIGTERM",a)}return globalThis.__piSessions}function I(a){let b=(0,j.resolve)(a);try{return(0,i.realpathSync)(b)}catch{return b}}function J(){return globalThis.__piStartingSessionCwds||(globalThis.__piStartingSessionCwds=new Map),globalThis.__piStartingSessionCwds}async function K(a,b){let c=a.getSessionFile();if(!c||(0,i.existsSync)(c))return;let d=a.getHeader();if(!d)return;let e=[d,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,i.writeFileSync)(c,e,{encoding:"utf8",flag:"wx"}),a.flushed=!0,(0,u.O8)(b,c);let f=a.getCwd();try{let a=await (0,z.KI)(f??"");(0,A.YH)(b,{path:c,cwd:f??"",projectKey:(0,y.z)(a?.projectRoot??f??"")})}catch(a){console.error(`[pi-web] 新会话建行失败 session=${b}:`,a instanceof Error?a.message:String(a))}}function L(a){return H().get(a)}function M(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(" ")}function N(a){for(let b of a){if(b?.type!=="message"||b.message?.role!=="user")continue;let a=M(b).trim();if(a)return a.slice(0,x.XK)}return""}function O(){let a=[];for(let b of H().values()){if(!b.isAlive())continue;let c=b.inner.sessionManager,d=c.getHeader(),e=c.getEntries(),f=e.filter(a=>"message"===a.type),g=f.find(a=>"user"===a.message.role),h=c.getSessionFile()??b.sessionFile,j=!!(h&&(0,i.existsSync)(h));if(!j&&(!b.isRunning()||!g))continue;let k=(0,q.$u)(e,d?.id??b.sessionId,h??""),l=d?.timestamp??e[0]?.timestamp??new Date().toISOString(),m=new Date(l).getTime(),n=Number.isNaN(m)?Date.now():m;for(let a of f){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&&(n=Math.max(n,b))}a.push({path:h??"",id:d?.id??b.sessionId,cwd:d?.cwd??b.cwd,name:c.getSessionName(),created:l,modified:new Date(n).toISOString(),messageCount:f.length,firstMessage:g&&M(g)||"(no messages)",...k?{parentSessionId:k.parentSessionId,relation:{kind:"subagent",parentSessionId:k.parentSessionId,profile:k.profile,description:k.description,status:b.isRunning()?"running":k.status}}:{},transient:!j})}return a}function P(a){let b=I(a);return!!J().has(b)||Array.from(H().values()).some(a=>I(a.cwd)===b&&a.isRunning())}async function Q(a){let b=I(a),c=Array.from(H().values()).filter(a=>I(a.cwd)===b);return await Promise.all(c.map(a=>a.shutdown())),c.length}function R(){let a=new Set;for(let[b,c]of H())c.isRunning()&&a.add(c.sessionId||b);return[...a]}function S(){let a={};for(let[b,c]of H()){let d,e=c.sessionId||b;if(!c.isRunning())continue;let f=c.inner,g=f.agent.state,h=g?.pendingToolCalls;d=f.isStreaming&&h&&h.size>0?"running_tools":f.isBashRunning?"running_command":f.isStreaming?"waiting_model":c.hasPendingUiRequest()?"waiting_input":"waiting_model",a[e]={phase:d,model:f.model?`${f.model.provider}/${f.model.id}`:null,startedAt:c.lastAgentStartAt()}}return a}async function T(a,b,c,d={}){let f,g,h,{toolNames:i,initialModel:j,thinkingLevel:k}=d,r=H(),v=(globalThis.__piStartLocks||(globalThis.__piStartLocks=new Map),globalThis.__piStartLocks),w=r.get(a);if(w?.isAlive())return{session:w,realSessionId:a};let x=v.get(a);if(x)return x;if(b)f=e.SessionManager.open(b,void 0);else{if(!c)throw Error("cwd is required for a new session");let b=a.length>0&&!a.startsWith("__");f=e.SessionManager.create(c,void 0,b?{id:a}:void 0),b&&await K(f,a)}let y=f.getCwd(),z=(g=J(),h=I(y),g.set(h,(g.get(h)??0)+1),()=>{let a=(g.get(h)??1)-1;a>0?g.set(h,a):g.delete(h)}),A=(async()=>{let a=b?(0,q.ph)(f.getEntries()):null,c=!!(a?.loadExtensions||a?.loadSkills),d=a?0===a.tools.length&&!c:i?.length===0;d||(0,e.initTheme)();let g=(0,e.getAgentDir)(),h=a?.tools;a||void 0===i||(h=0===i.length?[]:void 0);let v=(0,C.Fk)(y,g),w=e.SettingsManager.create(y,g),x=await (0,e.createAgentSessionServices)({cwd:y,agentDir:g,settingsManager:w,resourceLoaderOptions:a?{noExtensions:!a.loadExtensions,noSkills:!a.loadSkills,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,systemPrompt:" ",appendSystemPrompt:a.appendSystemPrompt}:d?t.M:{extensionFactories:[(0,n.eD)({cwd:y,settings:w}),(0,o.U)(),(0,p.Vj)(ae.extensionRuntime,()=>(0,q.IR)(y),s.N)],extensionsOverride:a=>(0,n.Ds)((0,p.U6)(a))},...v?{resourceLoaderReloadOptions:v}:{}}),z=await (0,m.p)(x.modelRuntime,x.settingsManager.getEnabledModels()),A=x.settingsManager.getDefaultProvider(),B=x.settingsManager.getDefaultModel(),E=f.getBranch().some(a=>"message"===a.type)?{scopedModels:[...z.scopedModels]}:(0,m.I)(z,{...j?{requestedModel:j}:{},...A&&B?{defaultModel:{provider:A,modelId:B}}:{},...k?{thinkingLevel:k}:{}}),{session:F}=await (0,e.createAgentSessionFromServices)({services:x,sessionManager:f,...E.model?{model:E.model}:{},...E.thinkingLevel?{thinkingLevel:E.thinkingLevel}:{},...E.scopedModels.length>0?{scopedModels:E.scopedModels}:{},...void 0!==h?{tools:h}:{}});(await (0,D.o)(x.settingsManager,{...j?{model:j}:{},...k?{thinkingLevel:k}:{}},{...F.model?{model:{provider:F.model.provider,modelId:F.model.id}}:{},thinkingLevel:F.thinkingLevel,supportsThinking:F.supportsThinking()})).modelDefaultChanged&&(0,l.kn)(),i&&i.length>0&&F.setActiveToolsByName(G(F,i));let H=new ad(F);i?.length===0&&H.setForceEmptySystemPrompt(!0),H.start();let I=F.sessionId,J=F.sessionFile;return J&&(0,u.O8)(I,J),H.onDestroy(()=>r.delete(I)),r.set(I,H),d||H.beginExtensionBinding({forceEmptySystemPrompt:i?.length===0}),{session:H,realSessionId:I}})().finally(()=>{v.delete(a),z()});return v.set(a,A),A}let ae=(0,r.s)({getSession:a=>H().get(a),registerSession:(a,b)=>{let c=new ad(a,{...b?.exactSystemPrompt!==void 0?{exactSystemPrompt:()=>b.exactSystemPrompt}:{},chatOnly:b?.chatOnly}),d=a.sessionId,e=a.sessionFile;e&&(0,u.O8)(d,e),c.onDestroy(()=>H().delete(d)),H().set(d,c),c.start(),c.isChatOnly()||c.beginExtensionBinding()},reopenSession:async(a,b)=>(await T(a,b,void 0)).session,resolveSessionPath:u.resolveSessionPath,invalidateSessionList:u.mD,isBuiltInSubagentsEnabled:s.N});function U(a){return ae.get(a)}function V(a,b){return ae.steer(a,b)}function W(a){return ae.abort(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})}},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){if(!(a&&(0,e.hasTrustRequiringProjectResources)(a)))return{requiresTrust:!1,trusted:!0};let c=new e.ProjectTrustStore(b);return{requiresTrust:!0,trusted:!0===c.get(a)}}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)}})},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(!b||"object"!=typeof b||"image"!==b.type)return"Each attachment must be an image";if(!function(a){if(!a||"object"!=typeof a||"string"!=typeof a.data||"string"!=typeof a.mimeType||!a.mimeType.startsWith("image/"))return!1;let b=function(a){if(!a||a.length%4!=0)return null;let b=a.endsWith("==")?2:+!!a.endsWith("="),c=a.length-b;for(let b=0;b<c;b+=1){var d;if(!((d=a.charCodeAt(b))>=65&&d<=90||d>=97&&d<=122||d>=48&&d<=57||43===d||47===d))return null}for(let b=c;b<a.length;b+=1)if("="!==a[b])return null;return a.length/4*3-b}(a.data);return null!==b&&b<=0xa00000}(b))return"Each image must be valid base64 image data of 10MB or smaller"}return null}},85664:(a,b,c)=>{c.d(b,{S:()=>d});function d(){let a=null;return{handle(b){if("agent_start"===b.type)return{kind:"touch"};if("message_end"===b.type){let c=b.message;if(c?.role==="assistant"){let b,d="string"==typeof(b=c.content)?b.trim():Array.isArray(b)?b.filter(a=>!!a&&"object"==typeof a).filter(a=>"text"===a.type&&"string"==typeof a.text).map(a=>a.text).join("\n").trim():"";d&&(a={lastReply:d,at:"number"==typeof c.timestamp?c.timestamp:Date.now()})}return null}if("agent_settled"===b.type){let b=a;return a=null,b?{kind:"outcome",...b}:{kind:"touch"}}return null}}}},98986:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{U:()=>j});var e=c(28802),f=c(84229),g=c(9202),h=a([e]);function i(){return{currentTurn:0,lastTodoToolUseTurn:0}}e=(h.then?(await h)():h)[0];let k=f.ZUJ.Object({action:f.ZUJ.Union([f.ZUJ.Literal("list"),f.ZUJ.Literal("add"),f.ZUJ.Literal("update"),f.ZUJ.Literal("delete")],{description:"list | add | update | delete"}),text:f.ZUJ.Optional(f.ZUJ.String({description:"新文本,仅 update 使用(trim 后不可为空)"})),texts:f.ZUJ.Optional(f.ZUJ.Array(f.ZUJ.String(),{description:"待添加的 todo 文本数组(仅 add 使用)"})),id:f.ZUJ.Optional(f.ZUJ.Number({description:"要更新的 todo id"})),ids:f.ZUJ.Optional(f.ZUJ.Array(f.ZUJ.Number(),{description:"要删除的 todo id 数组"})),status:f.ZUJ.Optional((0,e.StringEnum)(g.cn,{description:"pending | in_progress | completed"})),updates:f.ZUJ.Optional(f.ZUJ.Array(f.ZUJ.Object({id:f.ZUJ.Number({description:"要更新的 todo id"}),status:f.ZUJ.Optional((0,e.StringEnum)(g.cn)),text:f.ZUJ.Optional(f.ZUJ.String({description:"新文本(trim 后不可为空)"}))},{additionalProperties:!1}),{description:"批量更新数组(优先于单条 id/status/text)"}))},{additionalProperties:!1});function j(){return{name:"pi-web-todo",hidden:!0,factory:a=>{let b={todos:[],nextId:1},c=i(),d=()=>{a.appendEntry(g.sT,{todos:b.todos,nextId:b.nextId})},e=a=>{let d=a.sessionManager.getBranch();for(let a of(b.todos=[],b.nextId=1,Object.assign(c,i()),d)){if("custom"!==a.type||a.customType!==g.sT)continue;let c=(0,g.aO)(a.data);c&&(b.todos=c.todos,b.nextId=c.nextId)}c.currentTurn=function(a){let b=0;for(let c of a){if("custom"===c.type&&c.customType===g.sT){b=0;continue}c.message?.role==="assistant"&&b++}return b}(d)};a.on("session_start",async(a,b)=>e(b)),a.on("session_tree",async(a,b)=>e(b)),a.on("agent_end",async(a,c)=>{0===b.todos.length||(0,g.Ql)(b.todos)||function(a){let b,c=0,d=0;for(let e of a)"custom"===e.type&&e.customType===g.sT?(b=e.data,d=c):e.message?.role==="user"&&c++;let e=(0,g.aO)(b);return!(!e||0===e.todos.length||(0,g.Ql)(e.todos))&&c-d>=2}(c.sessionManager.getBranch())&&(b.todos=[],b.nextId=1,d())}),a.on("turn_start",async()=>{c.currentTurn++}),a.on("tool_result",async a=>{String(a.toolName??"")===g.Y0&&(c.lastTodoToolUseTurn=c.currentTurn)}),a.on("context",async a=>{if(!(0,g.Ql)(b.todos)||c.currentTurn-c.lastTodoToolUseTurn<4||(c.lastTodoToolUseTurn=c.currentTurn,0))return;let d=function(a){let b=a.filter(a=>"completed"!==a.status);if(0===b.length)return null;let c=b.filter(a=>"in_progress"===a.status),d=c.length>0?`#${c[0].id}("${c[0].content}")仍标记为 in_progress。这一步如果已经做完,立刻用 todo update 把它标成 completed,并在同一次调用里把下一项 pending 置为 in_progress,不要留下过期的 [~]。`:"还有 pending 项但没有任何 in_progress。准备继续动手前,先用 todo update 把其中一项置为 in_progress。";return["<system-reminder>","todo 工具已连续 4 轮没有被使用,但仍有未完成任务:","",...b.map(g.mU),"",d,"","只在与本轮工作相关时行动;这是一条温和提醒,不适用就忽略。绝不要向用户提及这条提醒,也不要为了回应它而新造任务。","</system-reminder>"].join("\n")}(b.todos);if(d)return{messages:[...a.messages,{role:"user",content:[{type:"text",text:d}],timestamp:Date.now()}]}}),a.registerTool({name:g.Y0,label:"Todo",description:"管理当前会话的 todo 列表。\n\n动作:\n- list: 查看全部 todo\n- add: 批量添加 todo(texts 数组)\n- update: 按 id 更新 todo——status 和/或 text;批量用 updates[]\n- delete: 按 id 删除 todo(ids 数组)\n\n规则:\n- 同一时间只有一个 todo 处于 in_progress\n- 完成一个 todo 立即标记 completed,不要攒到最后批量标记\n- 未真正完成不得标记 completed:被阻塞或测试失败时保持 in_progress",promptSnippet:"用 todo 跟踪多步骤工作;记得为验证步骤(测试、类型检查)单独建 todo。",promptGuidelines:["[Usage] 多步骤工作(3+步)时使用,AI 自发创建,无需用户触发","[验证任务] 为测试 / 类型检查等验证步骤单独建 todo,完成前确保验证通过","[批量优先] 完成多项任务时使用 updates[] 批量更新,减少工具调用次数","[自动闭合] 全部完成后自动清理,无需手动 delete","[Not for] 单步操作、简单对话"],executionMode:"sequential",parameters:k,async execute(a,c,e){if(e?.aborted)throw Error("Todo call aborted by signal.");let f=(0,g.xw)(c,b),h="list"!==f.action;h&&(b.todos=f.snapshot.todos,b.nextId=f.snapshot.nextId,d());let i=h?`${f.resultText}
|
|
9
9
|
${b.todos.map(a=>(0,g.mU)(a)).join("\n")||"No todos"}`:f.resultText;return{content:[{type:"text",text:i}],details:{action:f.action,todos:[...b.todos],nextId:b.nextId}}}})}}}d()}catch(a){d(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)}>
|
|
10
10
|
${a.content}
|
|
11
11
|
</document>`).join("\n\n");return`${a}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";exports.id=6525,exports.ids=[6525],exports.modules={7535:(a,b,c)=>{c.d(b,{z:()=>f});var d=c(76760),e=c.n(d);function f(a,b=process.platform){if(!a)return a;let c="win32"===b?e().win32:e().posix,d=c.normalize(a),g=c.parse(d).root.length,h=d.length;for(;h>g&&d[h-1]===c.sep;)h--;let i=d.slice(0,h);return"win32"===b?i.toLowerCase():i}},7561:(a,b,c)=>{c.d(b,{$:()=>f});var d=c(76760),e=c.n(d);function f(a,b=process.platform){let c="win32"===b?e().win32.normalize(a):e().posix.normalize(a);return"win32"===b?c.toLowerCase():c}},9210:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{GL:()=>l,Jp:()=>o,XK:()=>p,pu:()=>m});var e=c(29021),f=c(79748),g=c(33873),h=c(75430),i=a([h]);h=(i.then?(await i)():i)[0];let p=300;function j(a){if(!a.trim())return null;try{return JSON.parse(a)}catch{return null}}function k(a){let b=a.content;return"string"==typeof b?b:Array.isArray(b)?b.filter(a=>a&&"text"===a.type&&"string"==typeof a.text).map(a=>a.text).join(" "):""}function l(a){let b;try{b=(0,e.statSync)(a)}catch{return null}if(!b.isFile()||0===b.size)return null;let c=function(a,b){let c;try{c=(0,e.openSync)(a,"r")}catch{return null}try{let a=Math.min(4096,b),d="",f=null,g="";for(;;){let h=Buffer.alloc(a);(0,e.readSync)(c,h,0,a,0);let i=h.toString("utf8"),l=i.lastIndexOf("\n"),m=-1===l?i.length:l+1;for(let a of(d+=i.slice(0,m)).split("\n")){let b=j(a);if(b){if(!f){if("session"!==b.type)return null;f=b;continue}if("message"===b.type&&b.message?.role==="user"){let a=k(b.message).trim();if(a){g=a.slice(0,p);break}}}}if(!f)return null;if(g||a>=49152||a>=b||(a=Math.min(2*a,49152,b))<=0)break}return{header:f,firstMessage:g}}catch(b){return console.warn(`[pi-web] 会话头部读取失败 path=${a}:`,b instanceof Error?b.message:String(b)),null}finally{try{(0,e.closeSync)(c)}catch{}}}(a,b.size);if(!c)return null;let{header:d,firstMessage:f}=c,g="string"==typeof d.id?d.id:"";if(!g)return null;let h=new Date("string"==typeof d.timestamp?d.timestamp:"");return Number.isNaN(h.getTime())&&h.setTime(b.mtime.getTime()),{path:a,id:g,cwd:"string"==typeof d.cwd?d.cwd:"",created:h,firstMessage:f||"",parentSessionPath:"string"==typeof d.parentSession?d.parentSession:void 0}}function m(a){try{let b=(0,e.statSync)(a);if(!b.isFile()||0===b.size)return null;return function(a,b){let c,d={name:void 0,lastReply:""};if(b<=0)return d;try{c=(0,e.openSync)(a,"r")}catch{return null}try{let a=b;for(let b=0;b<256&&a>0;b++){let b=Math.max(0,a-65536),f=a-b,g=Buffer.alloc(f);(0,e.readSync)(c,g,0,f,b);let h=g.toString("utf8").split("\n");for(let a=h.length-1;a>=1;a--){if(void 0!==d.name&&d.lastReply)continue;let b=j(h[a]);if(b){if(void 0===d.name&&"session_info"===b.type&&"string"==typeof b.name){let a=b.name.trim();a&&(d.name=a)}else if(!d.lastReply&&"message"===b.type&&b.message?.role==="assistant"){let a=k(b.message).trim();a&&(d.lastReply=a)}if(void 0!==d.name&&d.lastReply)break}}a=b}return d}catch(b){return console.warn(`[pi-web] 会话尾部读取失败 path=${a}:`,b instanceof Error?b.message:String(b)),null}finally{try{(0,e.closeSync)(c)}catch{}}}(a,b.size)}catch{return null}}async function n(a,b,c){let d;try{d=await (0,f.readdir)(a,{withFileTypes:!0})}catch{return}for(let f of d){let d;if(f.name.startsWith("."))continue;let h=(0,g.join)(a,f.name);if(f.isDirectory()){b<6&&await n(h,b+1,c);continue}if(f.name.endsWith(".jsonl")){try{d=(0,e.statSync)(h)}catch{continue}d.isFile()&&0!==d.size&&c.push({path:h,id:function(a){let b=a.slice(0,-6).split("_");if(b.length<2)return"";let c=b[b.length-1];return/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(c)&&!/^[0-9]+$/.test(c)?c:""}(f.name),modified:d.mtime})}}}async function o(a){let b,c=a??(0,g.join)((0,h.getAgentDir)(),"sessions");try{b=(await (0,f.readdir)(c,{withFileTypes:!0})).filter(a=>a.isDirectory()||a.isSymbolicLink()).map(a=>(0,g.join)(c,a.name))}catch{return[]}let d=[];for(let a of b)await n(a,1,d);return d.sort((a,b)=>b.modified.getTime()-a.modified.getTime()),d}d()}catch(a){d(a)}})},15011:(a,b,c)=>{c.d(b,{Eb:()=>j,W3:()=>h,gB:()=>g,uK:()=>f});var d=c(33873);let e=/^[a-zA-Z]:[\\/]/;function f(a){return e.test(a)||a.startsWith("\\\\")||a.startsWith("//")}function g(a){return a&&"win32"===process.platform?(0,d.normalize)(a):a}function h(a){return a.replace(/\\/g,"/")}function i(a){let b=(0,d.normalize)(g(a)),c=(0,d.parse)(b).root.length,e=b.length;for(;e>c&&b[e-1]===d.sep;)e--;return b.slice(0,e)}function j(a,b){if(a===b)return!0;if(!a||!b)return!1;let c=i(a),d=i(b);return"win32"===process.platform?c.toLowerCase()===d.toLowerCase():c===d}},16525:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Pv:()=>
|
|
1
|
+
"use strict";exports.id=6525,exports.ids=[6525],exports.modules={7535:(a,b,c)=>{c.d(b,{z:()=>f});var d=c(76760),e=c.n(d);function f(a,b=process.platform){if(!a)return a;let c="win32"===b?e().win32:e().posix,d=c.normalize(a),g=c.parse(d).root.length,h=d.length;for(;h>g&&d[h-1]===c.sep;)h--;let i=d.slice(0,h);return"win32"===b?i.toLowerCase():i}},7561:(a,b,c)=>{c.d(b,{$:()=>f});var d=c(76760),e=c.n(d);function f(a,b=process.platform){let c="win32"===b?e().win32.normalize(a):e().posix.normalize(a);return"win32"===b?c.toLowerCase():c}},9210:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{GL:()=>l,Jp:()=>o,XK:()=>p,pu:()=>m});var e=c(29021),f=c(79748),g=c(33873),h=c(75430),i=a([h]);h=(i.then?(await i)():i)[0];let p=300;function j(a){if(!a.trim())return null;try{return JSON.parse(a)}catch{return null}}function k(a){let b=a.content;return"string"==typeof b?b:Array.isArray(b)?b.filter(a=>a&&"text"===a.type&&"string"==typeof a.text).map(a=>a.text).join(" "):""}function l(a){let b;try{b=(0,e.statSync)(a)}catch{return null}if(!b.isFile()||0===b.size)return null;let c=function(a,b){let c;try{c=(0,e.openSync)(a,"r")}catch{return null}try{let a=Math.min(4096,b),d="",f=null,g="";for(;;){let h=Buffer.alloc(a);(0,e.readSync)(c,h,0,a,0);let i=h.toString("utf8"),l=i.lastIndexOf("\n"),m=-1===l?i.length:l+1;for(let a of(d+=i.slice(0,m)).split("\n")){let b=j(a);if(b){if(!f){if("session"!==b.type)return null;f=b;continue}if("message"===b.type&&b.message?.role==="user"){let a=k(b.message).trim();if(a){g=a.slice(0,p);break}}}}if(!f)return null;if(g||a>=49152||a>=b||(a=Math.min(2*a,49152,b))<=0)break}return{header:f,firstMessage:g}}catch(b){return console.warn(`[pi-web] 会话头部读取失败 path=${a}:`,b instanceof Error?b.message:String(b)),null}finally{try{(0,e.closeSync)(c)}catch{}}}(a,b.size);if(!c)return null;let{header:d,firstMessage:f}=c,g="string"==typeof d.id?d.id:"";if(!g)return null;let h=new Date("string"==typeof d.timestamp?d.timestamp:"");return Number.isNaN(h.getTime())&&h.setTime(b.mtime.getTime()),{path:a,id:g,cwd:"string"==typeof d.cwd?d.cwd:"",created:h,firstMessage:f||"",parentSessionPath:"string"==typeof d.parentSession?d.parentSession:void 0}}function m(a){try{let b=(0,e.statSync)(a);if(!b.isFile()||0===b.size)return null;return function(a,b){let c,d={name:void 0,lastReply:""};if(b<=0)return d;try{c=(0,e.openSync)(a,"r")}catch{return null}try{let a=b;for(let b=0;b<256&&a>0;b++){let b=Math.max(0,a-65536),f=a-b,g=Buffer.alloc(f);(0,e.readSync)(c,g,0,f,b);let h=g.toString("utf8").split("\n");for(let a=h.length-1;a>=1;a--){if(void 0!==d.name&&d.lastReply)continue;let b=j(h[a]);if(b){if(void 0===d.name&&"session_info"===b.type&&"string"==typeof b.name){let a=b.name.trim();a&&(d.name=a)}else if(!d.lastReply&&"message"===b.type&&b.message?.role==="assistant"){let a=k(b.message).trim();a&&(d.lastReply=a)}if(void 0!==d.name&&d.lastReply)break}}a=b}return d}catch(b){return console.warn(`[pi-web] 会话尾部读取失败 path=${a}:`,b instanceof Error?b.message:String(b)),null}finally{try{(0,e.closeSync)(c)}catch{}}}(a,b.size)}catch{return null}}async function n(a,b,c){let d;try{d=await (0,f.readdir)(a,{withFileTypes:!0})}catch{return}for(let f of d){let d;if(f.name.startsWith("."))continue;let h=(0,g.join)(a,f.name);if(f.isDirectory()){b<6&&await n(h,b+1,c);continue}if(f.name.endsWith(".jsonl")){try{d=(0,e.statSync)(h)}catch{continue}d.isFile()&&0!==d.size&&c.push({path:h,id:function(a){let b=a.slice(0,-6).split("_");if(b.length<2)return"";let c=b[b.length-1];return/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(c)&&!/^[0-9]+$/.test(c)?c:""}(f.name),modified:d.mtime})}}}async function o(a){let b,c=a??(0,g.join)((0,h.getAgentDir)(),"sessions");try{b=(await (0,f.readdir)(c,{withFileTypes:!0})).filter(a=>a.isDirectory()||a.isSymbolicLink()).map(a=>(0,g.join)(c,a.name))}catch{return[]}let d=[];for(let a of b)await n(a,1,d);return d.sort((a,b)=>b.modified.getTime()-a.modified.getTime()),d}d()}catch(a){d(a)}})},15011:(a,b,c)=>{c.d(b,{Eb:()=>j,W3:()=>h,gB:()=>g,uK:()=>f});var d=c(33873);let e=/^[a-zA-Z]:[\\/]/;function f(a){return e.test(a)||a.startsWith("\\\\")||a.startsWith("//")}function g(a){return a&&"win32"===process.platform?(0,d.normalize)(a):a}function h(a){return a.replace(/\\/g,"/")}function i(a){let b=(0,d.normalize)(g(a)),c=(0,d.parse)(b).root.length,e=b.length;for(;e>c&&b[e-1]===d.sep;)e--;return b.slice(0,e)}function j(a,b){if(a===b)return!0;if(!a||!b)return!1;let c=i(a),d=i(b);return"win32"===process.platform?c.toLowerCase()===d.toLowerCase():c===d}},16525:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Pv:()=>m,startSessionIndexScanner:()=>o});var e=c(29021),f=c(90596),g=c(7535),h=c(7561),i=c(9210),j=c(84377),k=c(88002),l=a([i]);async function m(a,b,c=null){let d=(0,i.GL)(a);if(!d)return;let e=await (0,k.KI)(d.cwd).then(a=>(0,g.z)(a?.projectRoot??d.cwd));(0,f.Lf)().prepare(`INSERT INTO session_meta
|
|
2
2
|
(session_id, task_id, updated, pinned, path, cwd, project_key, title, first_message, parent_id, created, modified)
|
|
3
3
|
VALUES (?, ?, ?, 0, ?, ?, ?, NULL, ?, ?, ?, ?)
|
|
4
4
|
ON CONFLICT(session_id) DO UPDATE SET
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
first_message = COALESCE(session_meta.first_message, excluded.first_message),
|
|
10
10
|
parent_id = excluded.parent_id,
|
|
11
11
|
created = excluded.created,
|
|
12
|
-
modified = excluded.modified`).run(d.id,c,Date.now(),a,d.cwd,e,d.firstMessage||null,b,d.created.getTime(),Date.now())}async function
|
|
12
|
+
modified = excluded.modified`).run(d.id,c,Date.now(),a,d.cwd,e,d.firstMessage||null,b,d.created.getTime(),Date.now()),(0,j.o)()}async function n(a){let b=await (0,i.Jp)(a),c=(0,f.Lf)(),d=c.prepare("SELECT session_id, modified, updated, path, parent_id, first_message FROM session_meta").all(),l=new Map(d.map(a=>[a.session_id,a])),m=new Map(d.filter(a=>a.path).map(a=>[(0,h.$)(a.path),a.session_id])),n=new Map,o=new Set,p=(a,b,c)=>{let d=n.get(a);d&&d.file.modified.getTime()>=b.modified.getTime()||n.set(a,{file:b,head:c})};for(let a of b){let b=m.get((0,h.$)(a.path));if(void 0!==b){p(b,a);continue}let c=(0,i.GL)(a.path);if(c){p(c.id,a,c);continue}a.id&&l.has(a.id)&&o.add(a.id)}let q={scanned:n.size,inserted:0,updated:0,deleted:0},r=new Map;for(let[a,b]of n)r.set((0,h.$)(b.file.path),a);let s=new Map,t=c.prepare(`INSERT INTO session_meta
|
|
13
13
|
(session_id, task_id, updated, pinned, path, cwd, project_key, title, first_message, parent_id, created, modified)
|
|
14
14
|
VALUES (?, NULL, ?, 0, ?, ?, ?, NULL, ?, ?, ?, ?)
|
|
15
15
|
ON CONFLICT(session_id) DO UPDATE SET
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
-- 链路刚写的「现在就活跃」拉回去(与 updateModifiedStmt 同一约定)。
|
|
26
26
|
modified = CASE
|
|
27
27
|
WHEN session_meta.modified IS NULL OR excluded.modified > session_meta.modified
|
|
28
|
-
THEN excluded.modified ELSE session_meta.modified END`),
|
|
28
|
+
THEN excluded.modified ELSE session_meta.modified END`),u=c.prepare("UPDATE session_meta SET modified = ? WHERE session_id = ? AND (modified IS NULL OR modified < ?)"),v=c.prepare("UPDATE session_meta SET parent_id = ? WHERE session_id = ?"),w=c.prepare("UPDATE session_meta SET first_message = ? WHERE session_id = ?"),x=c.prepare("DELETE FROM session_meta WHERE session_id = ?"),y=async(a,b,c)=>{let d=s.get(b.cwd);d||(d=(0,k.KI)(b.cwd).then(a=>(0,g.z)(a?.projectRoot??b.cwd)),s.set(b.cwd,d));let e=await d,f=b.parentSessionPath?r.get((0,h.$)(b.parentSessionPath))??null:null;t.run(c,Date.now(),a.path,b.cwd,e,b.firstMessage||null,f,b.created.getTime(),a.modified.getTime())},z=(a,b,c)=>{let d=(0,i.GL)(a.path);if(!d)return!1;let e=d.parentSessionPath?r.get((0,h.$)(d.parentSessionPath))??null:null;return e!==b.parent_id&&v.run(e,c),!!d.firstMessage&&d.firstMessage!==b.first_message&&(w.run(d.firstMessage,c),!0)};for(let[a,b]of n){let{file:c}=b;o.add(a);let d=l.get(a);if(void 0!==d&&d.path&&d.path===c.path)null===d.modified||c.modified.getTime()>d.modified?(z(c,d,a),u.run(c.modified.getTime(),a,c.modified.getTime()),q.updated+=1):!d.first_message&&z(c,d,a)&&(q.updated+=1);else{let d=b.head??(0,i.GL)(c.path);if(!d)continue;await y(c,d,a),q.inserted+=1}}let A=Date.now();for(let a of d)!(o.has(a.session_id)||a.path&&(0,e.existsSync)(a.path))&&(A-a.updated<6e4||(x.run(a.session_id),q.deleted+=1));let B=c.prepare(`UPDATE session_meta AS c
|
|
29
29
|
SET task_id = (SELECT p.task_id FROM session_meta AS p WHERE p.session_id = c.parent_id)
|
|
30
30
|
WHERE c.task_id IS NULL
|
|
31
31
|
AND c.parent_id IS NOT NULL
|
|
32
|
-
AND EXISTS (SELECT 1 FROM session_meta AS p WHERE p.session_id = c.parent_id AND p.task_id IS NOT NULL)`);for(let a=0;a<8;a+=1){let a=Number(
|
|
32
|
+
AND EXISTS (SELECT 1 FROM session_meta AS p WHERE p.session_id = c.parent_id AND p.task_id IS NOT NULL)`);for(let a=0;a<8;a+=1){let a=Number(B.run().changes);if(0===a)break;q.updated+=a}let C=c.prepare("SELECT session_id, path FROM session_meta WHERE last_reply IS NULL AND path IS NOT NULL").all();if(C.length>0){let a=c.prepare("UPDATE session_meta SET last_reply = ? WHERE session_id = ? AND last_reply IS NULL");for(let b of C){let c=(0,i.pu)(b.path);c&&(a.run(c.lastReply||"",b.session_id),q.updated+=1)}}return(q.inserted>0||q.updated>0||q.deleted>0)&&(0,j.o)(),q}function o(){if(globalThis.__piSessionIndexScanner?.timer)return;let a=!1,b=n().then(a=>(console.log(`[pi-web] session index scan: +${a.inserted} ~${a.updated} -${a.deleted} (${a.scanned} sessions)`),{ok:!0})).catch(a=>(console.error("[pi-web] session index first scan error:",a?.message??a),{ok:!1})),c=setInterval(()=>{a||(a=!0,n().catch(a=>console.error("[pi-web] session index tick error:",a?.message??a)).finally(()=>{a=!1}))},3e4);c.unref?.();let d={timer:c,firstScanDone:!1,firstScanPromise:b.then(a=>{a.ok&&(d.firstScanDone=!0)})};globalThis.__piSessionIndexScanner=d,console.log("[pi-web] session index scanner started (interval 30000ms)")}i=(l.then?(await l)():l)[0],d()}catch(a){d(a)}})},84377:(a,b,c)=>{c.d(b,{o:()=>d});function d(){globalThis.__piSessionListGeneration=(globalThis.__piSessionListGeneration??0)+1}},88002:(a,b,c)=>{c.d(b,{l:()=>p,IL:()=>q,KI:()=>m});var d=c(79646),e=c(29021),f=c(33873),g=c(28354),h=c(15011);let i=(0,g.promisify)(d.execFile);function j(){globalThis.__piProjectCache?.clear()}async function k(a,b){let{stdout:c}=await i("git",["-C",a,...b],{timeout:1e4,maxBuffer:1048576,env:{...process.env,LC_ALL:"C"}});return c.trim()}function l(a){try{return(0,e.realpathSync)(a)}catch{return a}}async function m(a){let b,c=(globalThis.__piProjectCache||(globalThis.__piProjectCache=new Map),globalThis.__piProjectCache),d=c.get(a);if(d&&d.expiresAt>Date.now())return d.info;try{if(!(0,e.existsSync)(a))return b=function(a){let b=(0,f.dirname)(a);if(!b.endsWith("-worktrees"))return null;let c=b.slice(0,-10);return c&&(0,e.existsSync)((0,f.join)(c,".git"))?{projectRoot:l(c),branch:(0,f.basename)(a),isWorktree:!0,isTopLevel:!0}:null}(a)??{projectRoot:a,branch:null,isWorktree:!1,isTopLevel:!1},c.set(a,{info:b,expiresAt:Date.now()+6e4}),b;let[d,g,i,j]=(await k(a,["rev-parse","--path-format=absolute","--git-common-dir","--git-dir","--show-toplevel","--abbrev-ref","HEAD"])).split("\n").map(a=>a.trim()),[m,n,o]=[d,g,i].map(h.gB),p=l(a),q=(0,h.Eb)(o,p),r=!(0,h.Eb)(n,m)&&q,s=r?(0,f.dirname)(m):o;b={projectRoot:q?l(s):a,branch:j&&"HEAD"!==j?j:null,isWorktree:r,isTopLevel:q}}catch{b={projectRoot:a,branch:null,isWorktree:!1,isTopLevel:!1}}return c.set(a,{info:b,expiresAt:Date.now()+6e4}),b}async function n(a){let b=await k(a,["rev-parse","--path-format=absolute","--git-common-dir"]);return l((0,f.dirname)((0,h.gB)(b)))}async function o(a){let b=await k(a,["worktree","list","--porcelain"]),c=[],d=null,f=()=>{d?.path&&!d.prunable&&(0,e.existsSync)(d.path)&&c.push({path:d.path,branch:d.branch??null,isMain:0===c.length}),d=null};for(let a of b.split("\n"))a.startsWith("worktree ")?(f(),d={path:(0,h.gB)(a.slice(9).trim())}):a.startsWith("branch ")&&d?d.branch=a.slice(7).trim().replace(/^refs\/heads\//,""):a.startsWith("prunable")&&d?d.prunable=!0:""===a.trim()&&f();return f(),c}async function p(a,b){let c=b.trim();if(!c)throw Error("Branch name is required");let d=c.replace(/[\/\\:*?"<>|\s]+/g,"-").replace(/^-+|-+$/g,"");if(!d)throw Error(`Invalid branch name: ${b}`);let g=await n(a),i=`${(0,f.resolve)(g)}-worktrees`,l=(0,f.join)(i,d);if((0,e.existsSync)(l))throw Error(`Directory already exists: ${l}`);(0,e.mkdirSync)(i,{recursive:!0});let m=!1;try{await k(g,["rev-parse","--verify","--quiet",`refs/heads/${c}`]),m=!0}catch{m=!1}try{m?await k(g,["worktree","add","--",l,c]):await k(g,["worktree","add","-b",c,"--",l])}catch(a){throw Error(r(a))}return!function(a){if(!a)return;let b=(0,h.W3)(a);(!globalThis.__piAdditionalAllowedRoots&&(globalThis.__piAdditionalAllowedRoots=new Set),globalThis.__piAdditionalAllowedRoots).add(b),globalThis.__piAllowedRootsCache?.roots.add(b)}(l),j(),{path:l,branch:c}}async function q(a,b,c=!1){var d;let e=(d=await o(a),d.find(a=>(0,h.Eb)(a.path,b)));if(!e)throw Error(`Not a worktree of this repository: ${b}`);if(e.isMain)throw Error("Cannot remove the main worktree");try{await k(a,["worktree","remove",...c?["--force"]:[],e.path])}catch(a){throw Error(r(a))}j()}function r(a){let b=a.stderr;return"string"==typeof b&&b.trim()?b.trim():a instanceof Error?a.message:String(a)}},90596:(a,b,c)=>{c.d(b,{Lf:()=>i});var d=c(79868),e=c(29021),f=c(21820),g=c(33873);function h(){let a=process.env.PI_CODING_AGENT_DIR;if(a){let b=a.startsWith("~")?(0,g.join)((0,f.homedir)(),a.slice(1)):a;return(0,g.normalize)(b)}return(0,g.join)((0,f.homedir)(),".pi","agent")}function i(){var a;if(globalThis.__piWebDb)return globalThis.__piWebDb;(0,e.mkdirSync)(h(),{recursive:!0});let b=new d.DatabaseSync((0,g.join)(h(),"pi-web.db"));return b.exec("PRAGMA journal_mode = WAL;"),b.exec("PRAGMA foreign_keys = ON;"),(a=b).exec(`
|
|
33
33
|
CREATE TABLE IF NOT EXISTS tasks (
|
|
34
34
|
id TEXT PRIMARY KEY,
|
|
35
35
|
project_key TEXT NOT NULL,
|
|
@@ -9,4 +9,4 @@
|
|
|
9
9
|
first_message = COALESCE(session_meta.first_message, excluded.first_message),
|
|
10
10
|
parent_id = excluded.parent_id,
|
|
11
11
|
created = excluded.created,
|
|
12
|
-
modified = excluded.modified`).run(a,b.taskId??null,Date.now(),b.path,b.cwd,b.projectKey,b.title??null,b.firstMessage??null,b.parentId??null,Date.now(),Date.now()),l()}async function D(a){if((0,f.Lf)().prepare("SELECT 1 FROM session_meta WHERE session_id = ?").get(a))return!0;let{resolveSessionPath:b,resolveSessionIdByPath:d}=await Promise.resolve().then(c.bind(c,40402)),e=await b(a);if(!e)return console.error(`[pi-web] 会话行补建失败:找不到会话文件 session=${a}`),!1;let g=(0,i.GL)(e);if(!g)return console.error(`[pi-web] 会话行补建失败:会话文件无有效 header session=${a} path=${e}`),!1;let k=await (0,j.KI)(g.cwd),l=g.parentSessionPath?await d(g.parentSessionPath)??void 0:void 0;return C(a,{path:e,cwd:g.cwd,projectKey:(0,h.z)(k?.projectRoot??g.cwd),parentId:l,firstMessage:g.firstMessage||void 0}),!0}async function E(a){for(let b of a)try{await D(b)}catch(a){console.error(`[pi-web] 会话行补建异常 session=${b}:`,a instanceof Error?a.message:String(a))}}function F(a,b){let c=new Map,d=new Map;for(let a of(0,f.Lf)().prepare("SELECT session_id, parent_id, task_id FROM session_meta").all())c.set(a.session_id,a.parent_id),d.set(a.session_id,a.task_id);let e=new Set([a]),g=c.get(a)??null;for(;g&&!e.has(g);){e.add(g);let a=d.get(g)??null;if(null!==a&&a!==b)return!0;g=c.get(g)??null}return!1}async function G(a,b){let c=(0,f.Lf)();if(!r(b)||!await D(a))return!1;if(F(a,b))return console.error(`[pi-web] 归属被拒绝:祖先属于其它任务 session=${a} task=${b}`),!1;let d=Date.now();c.exec("BEGIN");try{c.prepare("UPDATE session_meta SET task_id = ?, updated = ? WHERE session_id = ?").run(b,d,a),c.prepare("UPDATE tasks SET updated = ? WHERE id = ?").run(d,b),c.exec("COMMIT")}catch(a){throw c.exec("ROLLBACK"),a}return l(),!0}async function H(a,b){if(!r(b)||!await D(a))return!1;if(F(a,b))return console.error(`[pi-web] 子树归属被拒绝:祖先属于其它任务 session=${a} task=${b}`),!1;let c=Date.now(),d=(0,f.Lf)();d.exec("BEGIN");try{let e=d.prepare("UPDATE session_meta SET task_id = ?, updated = ? WHERE session_id = ?");for(let d of[a,...q(a)])e.run(b,c,d);d.prepare("UPDATE tasks SET updated = ? WHERE id = ?").run(c,b),d.exec("COMMIT")}catch(a){throw d.exec("ROLLBACK"),a}return l(),!0}function I(a){return(0,f.Lf)().prepare("SELECT path FROM session_meta WHERE parent_id = ? AND path IS NOT NULL AND path != ''").all(a).map(a=>a.path)}function J(a,b){(0,f.Lf)().prepare("UPDATE session_meta SET parent_id = ? WHERE parent_id = ?").run(b,a),l()}async function K(a,b){await D(a)&&((0,f.Lf)().prepare("UPDATE session_meta SET pinned = ? WHERE session_id = ?").run(+!!b,a),l())}async function L(a,b){await D(a)&&((0,f.Lf)().prepare("UPDATE session_meta SET title = ?, updated = ? WHERE session_id = ?").run(b,Date.now(),a),l())}function M(a){(0,f.Lf)().prepare("DELETE FROM session_meta WHERE session_id = ?").run(a),l()}function N(a,b=Date.now()){(0,f.Lf)().prepare("UPDATE session_meta SET modified = ? WHERE session_id = ?").run(b,a),l()}function O(a,b){let c=b.lastReply.trim();if(!c)return void N(a,b.at);let d=c.length>4e3?c.slice(0,4e3):c;(0,f.Lf)().prepare("UPDATE session_meta SET last_reply = ?, modified = ? WHERE session_id = ?").run(d,b.at,a),l()}function P(a,b){let c=b.trim();c
|
|
12
|
+
modified = excluded.modified`).run(a,b.taskId??null,Date.now(),b.path,b.cwd,b.projectKey,b.title??null,b.firstMessage??null,b.parentId??null,Date.now(),Date.now()),l()}async function D(a){if((0,f.Lf)().prepare("SELECT 1 FROM session_meta WHERE session_id = ?").get(a))return!0;let{resolveSessionPath:b,resolveSessionIdByPath:d}=await Promise.resolve().then(c.bind(c,40402)),e=await b(a);if(!e)return console.error(`[pi-web] 会话行补建失败:找不到会话文件 session=${a}`),!1;let g=(0,i.GL)(e);if(!g)return console.error(`[pi-web] 会话行补建失败:会话文件无有效 header session=${a} path=${e}`),!1;let k=await (0,j.KI)(g.cwd),l=g.parentSessionPath?await d(g.parentSessionPath)??void 0:void 0;return C(a,{path:e,cwd:g.cwd,projectKey:(0,h.z)(k?.projectRoot??g.cwd),parentId:l,firstMessage:g.firstMessage||void 0}),!0}async function E(a){for(let b of a)try{await D(b)}catch(a){console.error(`[pi-web] 会话行补建异常 session=${b}:`,a instanceof Error?a.message:String(a))}}function F(a,b){let c=new Map,d=new Map;for(let a of(0,f.Lf)().prepare("SELECT session_id, parent_id, task_id FROM session_meta").all())c.set(a.session_id,a.parent_id),d.set(a.session_id,a.task_id);let e=new Set([a]),g=c.get(a)??null;for(;g&&!e.has(g);){e.add(g);let a=d.get(g)??null;if(null!==a&&a!==b)return!0;g=c.get(g)??null}return!1}async function G(a,b){let c=(0,f.Lf)();if(!r(b)||!await D(a))return!1;if(F(a,b))return console.error(`[pi-web] 归属被拒绝:祖先属于其它任务 session=${a} task=${b}`),!1;let d=Date.now();c.exec("BEGIN");try{c.prepare("UPDATE session_meta SET task_id = ?, updated = ? WHERE session_id = ?").run(b,d,a),c.prepare("UPDATE tasks SET updated = ? WHERE id = ?").run(d,b),c.exec("COMMIT")}catch(a){throw c.exec("ROLLBACK"),a}return l(),!0}async function H(a,b){if(!r(b)||!await D(a))return!1;if(F(a,b))return console.error(`[pi-web] 子树归属被拒绝:祖先属于其它任务 session=${a} task=${b}`),!1;let c=Date.now(),d=(0,f.Lf)();d.exec("BEGIN");try{let e=d.prepare("UPDATE session_meta SET task_id = ?, updated = ? WHERE session_id = ?");for(let d of[a,...q(a)])e.run(b,c,d);d.prepare("UPDATE tasks SET updated = ? WHERE id = ?").run(c,b),d.exec("COMMIT")}catch(a){throw d.exec("ROLLBACK"),a}return l(),!0}function I(a){return(0,f.Lf)().prepare("SELECT path FROM session_meta WHERE parent_id = ? AND path IS NOT NULL AND path != ''").all(a).map(a=>a.path)}function J(a,b){(0,f.Lf)().prepare("UPDATE session_meta SET parent_id = ? WHERE parent_id = ?").run(b,a),l()}async function K(a,b){await D(a)&&((0,f.Lf)().prepare("UPDATE session_meta SET pinned = ? WHERE session_id = ?").run(+!!b,a),l())}async function L(a,b){await D(a)&&((0,f.Lf)().prepare("UPDATE session_meta SET title = ?, updated = ? WHERE session_id = ?").run(b,Date.now(),a),l())}function M(a){(0,f.Lf)().prepare("DELETE FROM session_meta WHERE session_id = ?").run(a),l()}function N(a,b=Date.now()){(0,f.Lf)().prepare("UPDATE session_meta SET modified = ? WHERE session_id = ?").run(b,a),l()}function O(a,b){let c=b.lastReply.trim();if(!c)return void N(a,b.at);let d=c.length>4e3?c.slice(0,4e3):c;(0,f.Lf)().prepare("UPDATE session_meta SET last_reply = ?, modified = ? WHERE session_id = ?").run(d,b.at,a),l()}function P(a,b){let c=b.trim();if(!c)return;let d=(0,f.Lf)().prepare("UPDATE session_meta SET first_message = ? WHERE session_id = ? AND (first_message IS NULL OR first_message = '')").run(c,a);Number(d.changes)>0&&l()}i=(k.then?(await k)():k)[0],d()}catch(a){d(a)}})}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],lowPriorityFiles:["static/
|
|
1
|
+
globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],lowPriorityFiles:["static/ImiqQqbpF4KxeBm1KeB5N/_buildManifest.js","static/ImiqQqbpF4KxeBm1KeB5N/_ssgManifest.js"],rootMainFiles:["static/chunks/webpack-4b8e9412e72f86c0.js","static/chunks/4bd1b696-8a4ab4fdf0ae305a.js","static/chunks/3794-d29203733ca4633c.js","static/chunks/main-app-1f89e7ad7ae1ff87.js"],rootMainFilesTree:{},pages:{"/_app":[]}};
|