@qt4798/pi-web 0.18.4 → 0.18.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +18 -18
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/required-server-files.js +1 -1
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/_not-found.html +1 -1
  15. package/.next/server/app/_not-found.rsc +2 -2
  16. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  17. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  18. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  19. package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -1
  20. package/.next/server/app/api/agent/[id]/route.js +1 -1
  21. package/.next/server/app/api/agent/new/route.js +1 -1
  22. package/.next/server/app/api/app-update/route.js +1 -1
  23. package/.next/server/app/api/cwd/validate/route.js +1 -1
  24. package/.next/server/app/api/default-cwd/route.js +1 -1
  25. package/.next/server/app/api/files/[...path]/route.js +1 -1
  26. package/.next/server/app/api/git/diff/route.js +1 -1
  27. package/.next/server/app/api/git/push/route.js +1 -1
  28. package/.next/server/app/api/git/stash/route.js +1 -1
  29. package/.next/server/app/api/git/status/route.js +1 -1
  30. package/.next/server/app/api/import/discover/route.js +1 -1
  31. package/.next/server/app/api/logs/route.js +1 -1
  32. package/.next/server/app/api/mcp/restart/route.js +1 -1
  33. package/.next/server/app/api/mcp/route.js +1 -1
  34. package/.next/server/app/api/models-config/builtin/route.js +1 -1
  35. package/.next/server/app/api/models-config/catalog/route.js +1 -1
  36. package/.next/server/app/api/models-config/discover/route.js +1 -1
  37. package/.next/server/app/api/models-config/route.js +1 -1
  38. package/.next/server/app/api/models-config/test/route.js +1 -1
  39. package/.next/server/app/api/plugins/route.js +1 -1
  40. package/.next/server/app/api/project-state/route.js +1 -1
  41. package/.next/server/app/api/projects/visibility/route.js +1 -1
  42. package/.next/server/app/api/provider-usage/query/route.js +1 -1
  43. package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -1
  44. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  45. package/.next/server/app/api/settings/title-model/route.js +1 -1
  46. package/.next/server/app/api/skills/install/route.js +1 -1
  47. package/.next/server/app/api/skills/route.js +1 -1
  48. package/.next/server/app/api/snippets/[id]/route.js +1 -1
  49. package/.next/server/app/api/snippets/route.js +1 -1
  50. package/.next/server/app/api/subagents/settings/route.js +1 -1
  51. package/.next/server/app/api/tools/extension-tools/route.js +1 -1
  52. package/.next/server/app/api/tools/settings/route.js +1 -1
  53. package/.next/server/app/api/vision-config/route.js +1 -1
  54. package/.next/server/app/api/web-auth/route.js +1 -1
  55. package/.next/server/app/index.html +1 -1
  56. package/.next/server/app/index.rsc +4 -4
  57. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  58. package/.next/server/app/index.segments/_full.segment.rsc +4 -4
  59. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  60. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  61. package/.next/server/app/login.html +1 -1
  62. package/.next/server/app/login.rsc +2 -2
  63. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  64. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  65. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  66. package/.next/server/app/page.js +10 -8
  67. package/.next/server/app/page_client-reference-manifest.js +1 -1
  68. package/.next/server/app-paths-manifest.json +18 -18
  69. package/.next/server/chunks/154.js +12 -11
  70. package/.next/server/chunks/4253.js +14 -11
  71. package/.next/server/chunks/440.js +1 -1
  72. package/.next/server/chunks/5725.js +1 -1
  73. package/.next/server/chunks/6429.js +8 -5
  74. package/.next/server/chunks/7915.js +1 -1
  75. package/.next/server/chunks/9332.js +1 -1
  76. package/.next/server/middleware-build-manifest.js +1 -1
  77. package/.next/server/middleware.js +1 -1
  78. package/.next/server/pages/404.html +1 -1
  79. package/.next/server/pages/500.html +1 -1
  80. package/.next/server/server-reference-manifest.json +1 -1
  81. package/.next/static/chunks/app/{page-bd73baeec065cb84.js → page-3d2a6181302c97c6.js} +10 -8
  82. package/.next/static/css/2f7c89d02f957732.css +1 -0
  83. package/.next/trace +8 -83
  84. package/.next/trace-build +1 -1
  85. package/package.json +1 -1
  86. package/.next/static/css/5418f5ea5454ad72.css +0 -1
  87. /package/.next/static/{I_FDqLx_bV7v2QRYgPTtm → cehSWrMOmfjQYl29EblqZ}/_buildManifest.js +0 -0
  88. /package/.next/static/{I_FDqLx_bV7v2QRYgPTtm → cehSWrMOmfjQYl29EblqZ}/_ssgManifest.js +0 -0
@@ -1,9 +1,12 @@
1
- "use strict";exports.id=6429,exports.ids=[6429],exports.modules={305:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Up:()=>r,dp:()=>q,wQ:()=>m});var e=c(73024),f=c(76760),g=c(75430),h=c(80974),i=c.n(h),j=a([g]);g=(j.then?(await j)():j)[0];let s=["read","bash","edit","write"],t=new Set(["bash","powershell"]);function k(a,b=process.platform){return"win32"===b&&a?.includes("powershell")===!0&&!a.includes("bash")}function l(a,b){let c=b?"powershell":"bash",d=[];for(let b of a){let a=t.has(b)?c:b;d.includes(a)||d.push(a)}return d}function m(a,b,c=process.platform){return l(a,k(b,c))}function n(a=(0,g.getAgentDir)()){return(0,f.join)(a,"settings.json")}function o(a){if(!(0,e.existsSync)(a))return{};let b=JSON.parse((0,e.readFileSync)(a,"utf8"));if("object"!=typeof b||null===b||Array.isArray(b))throw Error("Invalid settings.json: expected an object");return b}function p(a){if(void 0!==a.defaultTools){if(!Array.isArray(a.defaultTools)||a.defaultTools.some(a=>"string"!=typeof a))throw Error("Invalid settings.json: defaultTools must be an array of strings");return a.defaultTools}}async function q(a=n(),b=process.platform){if(!(0,e.existsSync)(a))return!1;let c=await i().lock(a,{realpath:!1,retries:10});try{return k(p(o(a)),b)}finally{await c()}}async function r(a,b=n(),c=process.platform){if("win32"!==c)throw Error("PowerShell tool settings are only available on Windows");(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0});try{(0,e.writeFileSync)(b,"{}",{flag:"wx",mode:384})}catch(a){if("EEXIST"!==a.code)throw a}let d=await i().lock(b,{realpath:!1,retries:10});try{let c=o(b),d=p(c)??s,f=l(d,a);d.some(a=>t.has(a))||f.push(a?"powershell":"bash"),c.defaultTools=f,(0,e.writeFileSync)(b,JSON.stringify(c,null,2),"utf8"),(0,e.chmodSync)(b,384)}finally{await d()}return a}d()}catch(a){d(a)}})},4504:(a,b,c)=>{c.d(b,{LF:()=>e,aA:()=>j,bo:()=>g,eG:()=>i});var d=c(29021);let e=`Continue pursuing the active goal. Do the next useful work, then report your disposition:
1
+ "use strict";exports.id=6429,exports.ids=[6429],exports.modules={305:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Up:()=>r,dp:()=>q,wQ:()=>m});var e=c(73024),f=c(76760),g=c(75430),h=c(80974),i=c.n(h),j=a([g]);g=(j.then?(await j)():j)[0];let s=["read","bash","edit","write"],t=new Set(["bash","powershell"]);function k(a,b=process.platform){return"win32"===b&&a?.includes("powershell")===!0&&!a.includes("bash")}function l(a,b){let c=b?"powershell":"bash",d=[];for(let b of a){let a=t.has(b)?c:b;d.includes(a)||d.push(a)}return d}function m(a,b,c=process.platform){return l(a,k(b,c))}function n(a=(0,g.getAgentDir)()){return(0,f.join)(a,"settings.json")}function o(a){if(!(0,e.existsSync)(a))return{};let b=JSON.parse((0,e.readFileSync)(a,"utf8"));if("object"!=typeof b||null===b||Array.isArray(b))throw Error("Invalid settings.json: expected an object");return b}function p(a){if(void 0!==a.defaultTools){if(!Array.isArray(a.defaultTools)||a.defaultTools.some(a=>"string"!=typeof a))throw Error("Invalid settings.json: defaultTools must be an array of strings");return a.defaultTools}}async function q(a=n(),b=process.platform){if(!(0,e.existsSync)(a))return!1;let c=await i().lock(a,{realpath:!1,retries:10});try{return k(p(o(a)),b)}finally{await c()}}async function r(a,b=n(),c=process.platform){if("win32"!==c)throw Error("PowerShell tool settings are only available on Windows");(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0});try{(0,e.writeFileSync)(b,"{}",{flag:"wx",mode:384})}catch(a){if("EEXIST"!==a.code)throw a}let d=await i().lock(b,{realpath:!1,retries:10});try{let c=o(b),d=p(c)??s,f=l(d,a);d.some(a=>t.has(a))||f.push(a?"powershell":"bash"),c.defaultTools=f,(0,e.writeFileSync)(b,JSON.stringify(c,null,2),"utf8"),(0,e.chmodSync)(b,384)}finally{await d()}return a}d()}catch(a){d(a)}})},4504:(a,b,c)=>{c.d(b,{Sd:()=>g,aA:()=>k,bo:()=>h,bx:()=>f,eG:()=>j});var d=c(29021);let e=`Continue pursuing the active goal. Do the next useful work, then report your disposition:
2
2
  - "continue" with the next concrete step;
3
3
  - "complete" only when fully done and verified;
4
- - "blocked" when only the user can unblock you.`;function f(a){return`${a}.goal.json`}function g(a){let b=f(a);if(!(0,d.existsSync)(b))return h();try{var c;let a=JSON.parse((0,d.readFileSync)(b,"utf8"));if(!a||1!==a.version||!a.state||"object"!=typeof a.state)return h();let e=a.state;return{status:(c=e.status,["idle","running","paused","blocked","budget_limited","complete"].includes(c)?c:"idle"),goalText:"string"==typeof e.goalText?e.goalText:null,turnsUsed:Number.isFinite(e.turnsUsed)?e.turnsUsed:0,turnsLimit:Number.isFinite(e.turnsLimit)?e.turnsLimit:10,noProgressTurns:Number.isFinite(e.noProgressTurns)?e.noProgressTurns:0,noProgressLimit:Number.isFinite(e.noProgressLimit)?e.noProgressLimit:4,tokensUsed:Number.isFinite(e.tokensUsed)?e.tokensUsed:0,tokenBudget:null===e.tokenBudget||Number.isFinite(e.tokenBudget)?e.tokenBudget??null:null,timeUsedSeconds:Number.isFinite(e.timeUsedSeconds)?e.timeUsedSeconds:0,startedAt:Number.isFinite(e.startedAt)?e.startedAt:void 0,updatedAt:Number.isFinite(e.updatedAt)?e.updatedAt:void 0}}catch{return h()}}function h(){return{status:"idle",goalText:null,turnsUsed:0,turnsLimit:10,noProgressTurns:0,noProgressLimit:4,tokensUsed:0,tokenBudget:null,timeUsedSeconds:0}}function i(a,b){let c=f(a),e=`${c}.tmp`;try{(0,d.writeFileSync)(e,JSON.stringify({version:1,state:b}),{encoding:"utf8",mode:384}),(0,d.renameSync)(e,c)}catch{try{(0,d.rmSync)(e,{force:!0})}catch{}}}class j{constructor(a){this.continuationArmed=!1,this.turnStartMs=0,this.onChanged=null,this.state=a?g(a):h()}hydrate(a){this.state={...a}}getState(){return{...this.state}}isRunning(){return"running"===this.state.status}hasActiveGoal(){return"idle"!==this.state.status}isContinuable(){return"running"===this.state.status}isContinuationArmed(){return this.continuationArmed}armContinuation(){this.continuationArmed=!0}disarmContinuation(){this.continuationArmed=!1}onAgentStart(){this.continuationArmed=!1,this.turnStartMs=Date.now()}setOnChanged(a){this.onChanged=a}commit(a){a.updatedAt=Date.now(),this.state=a,this.onChanged?.(this.getState())}start(a,b=null){let c=Date.now(),d=b??this.state.tokenBudget??null,e={status:"running",goalText:a.trim(),turnsUsed:0,turnsLimit:this.state.turnsLimit,noProgressTurns:0,noProgressLimit:this.state.noProgressLimit,tokensUsed:0,tokenBudget:d,timeUsedSeconds:0,startedAt:c,updatedAt:c};return this.commit(e),this.getState()}pause(){return"running"!==this.state.status||this.commit({...this.state,status:"paused"}),this.getState()}resume(){return"paused"!==this.state.status&&"blocked"!==this.state.status||this.commit({...this.state,status:"running"}),this.getState()}stop(){if("idle"===this.state.status)return this.getState();let a=h();return a.turnsLimit=this.state.turnsLimit,a.noProgressLimit=this.state.noProgressLimit,this.commit(a),this.continuationArmed=!1,this.getState()}edit(a){if("idle"===this.state.status)return this.getState();let b="complete"===this.state.status||"budget_limited"===this.state.status?"running":this.state.status;return this.commit({...this.state,goalText:a.trim(),status:b}),this.getState()}settleTurn(a,b,c){if("running"!==this.state.status)return{verdict:{action:"continue"},state:this.getState()};let d=(a??"").toLowerCase(),e=this.turnStartMs>0?Math.max(0,Math.round((Date.now()-this.turnStartMs)/1e3)):0,f=this.state.tokensUsed+Math.max(0,b),g=this.state.timeUsedSeconds+e,h=this.state.turnsUsed+1;if(d.includes("[goal: complete]")||/(?:^|\n|[.!?]\s+)(?:goal(?:\s+is)?\s+complete|goal\s+complete)\b/.test(d)){let a={...this.state,turnsUsed:h,tokensUsed:f,timeUsedSeconds:g};return this.commit({...a,status:"complete"}),{verdict:{action:"complete"},state:this.getState()}}if(function(a){let b;if(a.includes("[goal: blocked]")||a.includes("goal blocked"))return!0;let c=/(?:^|[^a-z])blocked\s*:/g;for(;null!==(b=c.exec(a));){let c=a.slice(0,b.index).trimEnd();if(!/\bnot$/.test(c))return!0}return!1}(d)){let a={...this.state,turnsUsed:h,tokensUsed:f,timeUsedSeconds:g};return this.commit({...a,status:"blocked"}),{verdict:{action:"blocked"},state:this.getState()}}let i=0===c?this.state.noProgressTurns+1:0;return null!==this.state.tokenBudget&&f>=this.state.tokenBudget?(this.commit({...this.state,turnsUsed:h,tokensUsed:f,timeUsedSeconds:g,noProgressTurns:i,status:"budget_limited"}),{verdict:{action:"budget_limited"},state:this.getState()}):i>=this.state.noProgressLimit?(this.commit({...this.state,turnsUsed:h,tokensUsed:f,timeUsedSeconds:g,noProgressTurns:i,status:"blocked"}),{verdict:{action:"blocked"},state:this.getState()}):h>=this.state.turnsLimit?(this.commit({...this.state,turnsUsed:h,tokensUsed:f,timeUsedSeconds:g,noProgressTurns:i,status:"paused"}),{verdict:{action:"pause"},state:this.getState()}):(this.commit({...this.state,turnsUsed:h,tokensUsed:f,timeUsedSeconds:g,noProgressTurns:i}),{verdict:{action:"continue"},state:this.getState()})}}},7667:(a,b,c)=>{c.d(b,{V:()=>d});class d{enqueue(a,b,c,d,e){let f,g=this.parents.get(a)??{limit:1,active:0,items:[]};g.limit=Math.max(1,Math.floor(b)||1);let h=new Promise((a,b)=>{f={run:c,onState:d,onCancel:e,resolve:a,reject:b,state:"queued",cancelled:!1}});return g.items.push(f),this.parents.set(a,g),d("queued"),this.pump(a,g),{promise:h,cancel:()=>"queued"===f.state&&!f.cancelled&&(f.cancelled=!0,Promise.resolve(f.onCancel?.()).then(()=>f.resolve(void 0),a=>f.reject(a)),this.pump(a,g),!0)}}pump(a,b){for(;b.active<b.limit&&b.items.length>0;){let c=b.items.shift();c.cancelled||(c.state="running",c.onState("running"),b.active+=1,c.run().then(c.resolve,c.reject).finally(()=>{b.active-=1,this.pump(a,b),0===b.active&&0===b.items.length&&this.parents.delete(a)}))}}constructor(){this.parents=new Map}}},11301:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{hH:()=>s,oH:()=>r,wF:()=>q});var e=c(73024),f=c(76760),g=c(75430),h=c(8102),i=a([g]);g=(i.then?(await i)():i)[0];let t=new Set([400,401,402,403,404,406,408,409,413,422,429,451,500,502,503,504]),u=new Set(["opencode-zen-external","opencode-zen-switch","opencode-zen-runtime","opencode-zen-sync"]);function j(){return(0,f.join)((0,g.getAgentDir)(),"pi-web-error-log.json")}function k(){globalThis.__piErrorLogState||(globalThis.__piErrorLogState={loaded:!1,entries:[]});let a=globalThis.__piErrorLogState;if(!a.loaded){a.loaded=!0;try{if((0,e.existsSync)(j())){let b=JSON.parse((0,e.readFileSync)(j(),"utf8"));if(Array.isArray(b)){let c=b.filter(l).slice(-500),d=c.filter(a=>!u.has(a.source));d.length!==c.length&&p(d),a.entries=d}}}catch{a.entries=[]}}return a}function l(a){return!(!a||"object"!=typeof a||Array.isArray(a))&&"string"==typeof a.id&&"string"==typeof a.timestamp&&("error"===a.level||"warning"===a.level||"info"===a.level)&&"string"==typeof a.source&&"string"==typeof a.message}function m(a){return a.replace(/https?:\/\/[^\s/@]+:[^\s/@]+@/gi,"https://[redacted]@").replace(/Bearer\s+[A-Za-z0-9._~+/=-]+/gi,"Bearer [redacted]").replace(/\bsk-[A-Za-z0-9_-]{8,}\b/g,"sk-[redacted]").replace(/\b(?:oc|opencode|zen)[_-]?[A-Za-z0-9._~-]{12,}\b/gi,"[key-redacted]").replace(/((?:api[_-]?key|token|password|secret)\s*[:=]\s*)([^\s,;]+)/gi,"$1[redacted]")}function n(a){return a.length>2e4?`${a.slice(0,2e4)}…`:a}function o(a){let b=a.match(/\bHTTP\s+(\d{3})\b|\bstatus(?:\s+code)?\s*[:=]?\s*(\d{3})\b|\b(4\d{2}|5\d{2})\b/i),c=Number(b?.[1]??b?.[2]??b?.[3]);return t.has(c)?c:void 0}function p(a){try{(0,h.$)(j(),JSON.stringify(a,null,2))}catch{}}function q(a){let b=k(),c=n(m(a.message.trim())),d=a.details?n(m(a.details)):void 0,e={id:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),level:a.level??"error",source:a.source??"unknown",...void 0!==a.statusCode?{statusCode:a.statusCode}:void 0!==o(c)?{statusCode:o(c)}:{},...a.provider?{provider:a.provider}:{},...a.model?{model:a.model}:{},...a.sessionId?{sessionId:a.sessionId}:{},message:c||"Unknown error",...d?{details:d}:{}};return b.entries.push(e),b.entries.length>500&&b.entries.splice(0,b.entries.length-500),p(b.entries),e}function r(a={}){let b=a.query?.trim().toLocaleLowerCase(),c=Math.min(Math.max(a.limit??200,1),500),d=void 0!==a.source&&u.has(a.source);return k().entries.filter(a=>d||!u.has(a.source)).filter(b=>void 0===a.statusCode||b.statusCode===a.statusCode).filter(b=>!a.level||b.level===a.level).filter(b=>!a.source||b.source===a.source).filter(a=>!b||[a.message,a.details,a.provider,a.model,a.source].filter(Boolean).some(a=>a.toLocaleLowerCase().includes(b))).slice().reverse().slice(0,c)}function s(){k().entries=[],p([])}d()}catch(a){d(a)}})},12568:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{s:()=>t});var e=c(75430),f=c(46753),g=c(7048),h=c(20644),i=c(99324),j=c(72498),k=c(305),l=c(27367),m=c(7667),n=c(24923),o=c(77598),p=a([e,f,g,j,k,l]);[e,f,g,j,k,l]=p.then?(await p)():p;let u=new Set(["off","minimal","low","medium","high","xhigh","max"]);function q(){return globalThis.__piSubagentRuns||(globalThis.__piSubagentRuns=new Map),globalThis.__piSubagentRuns}function r(){return globalThis.__piSubagentQueue||(globalThis.__piSubagentQueue=new m.V),globalThis.__piSubagentQueue}async function s(a,b){if(b)try{await (0,n.IL)(a,b.path);return}catch(a){return`Worktree retained at ${b.path}: ${a instanceof Error?a.message:String(a)}`}}function t(a){async function b(b){let d;if(!(a.isBuiltInSubagentsEnabled??l.N)())throw Error("Pi Web built-in sub-agents are disabled");let e=b.parentContext.sessionManager.getSessionId(),f=await c(b.sessionId);if(!f)throw Error(`Subagent not found: ${b.sessionId}`);if(f.parentSessionId!==e)throw Error("Subagent does not belong to this parent session");if("running"===f.status||"queued"===f.status)throw Error("Subagent is already running");let h=a.getSession(e);if(!h?.isAlive())throw Error("Parent session is no longer available");let i=f.sessionPath||await a.resolveSessionPath(b.sessionId);if(!i)throw Error(`Subagent session file not found: ${b.sessionId}`);let j=a.getSession(b.sessionId);if(j?.isAlive()||(j=await a.reopenSession(b.sessionId,i)),!j.isAlive())throw Error("Subagent session is no longer available");if(j.isRunning())throw Error("Subagent is already running");let k=b.runInBackground??f.runInBackground,m={...f,parentToolCallId:b.parentToolCallId,task:b.task,description:b.description.trim()||f.description,runInBackground:k,status:"queued",completedAt:void 0,result:void 0,error:void 0},n=j.inner.sessionManager,o=new Promise(a=>{d=a}),p={run:m,completion:o,abortRequested:!1};q().set(b.sessionId,p),b.onUpdate?.(m),a.invalidateSessionList();let s=()=>{p.abortRequested=!0,"queued"===p.run.status?p.cancelQueued?.():j.inner.abort()};k||b.signal?.addEventListener("abort",s,{once:!0});let t=async()=>{let c;if(p.abortRequested){let a={...m,status:"aborted",completedAt:new Date().toISOString()};return n.appendCustomEntry(g.pv,{version:1,status:"aborted",completedAt:a.completedAt}),p.run=a,q().delete(b.sessionId),d(a),a}p.run={...p.run,status:"running"},n.appendCustomEntry(g.o2,{version:1,status:"running"}),b.onUpdate?.(p.run);try{await j.inner.prompt(b.task,{source:"rpc"});let a=j.inner.getLastAssistantText()?.trim();c={...m,status:p.abortRequested?"aborted":"completed",completedAt:new Date().toISOString(),...a?{result:a}:{}}}catch(a){c={...m,status:p.abortRequested||b.signal?.aborted?"aborted":"failed",completedAt:new Date().toISOString(),...!p.abortRequested&&!b.signal?.aborted?{error:a instanceof Error?a.message:String(a)}:{}}}finally{b.signal?.removeEventListener("abort",s)}return n.appendCustomEntry(g.pv,{version:1,status:c.status,completedAt:c.completedAt,...c.result?{result:c.result}:{},...c.error?{error:c.error}:{}}),p.run=c,b.onUpdate?.(c),q().delete(b.sessionId),a.invalidateSessionList(),a.notifyRunningChange?.(),c},u=r().enqueue(e,(0,l.hd)().maxConcurrent,t,c=>{"queued"===c&&n.appendCustomEntry(g.o2,{version:1,status:"queued"}),p.run={...p.run,status:c},b.onUpdate?.(p.run),a.invalidateSessionList()},()=>{if("queued"!==p.run.status)return;let c={...m,status:"aborted",completedAt:new Date().toISOString()};n.appendCustomEntry(g.pv,{version:1,status:"aborted",completedAt:c.completedAt}),p.run=c,b.onUpdate?.(c),q().delete(b.sessionId),a.invalidateSessionList(),a.notifyRunningChange?.(),d(c)});return p.cancelQueued=u.cancel,u.promise.then(d,a=>d({...m,status:"failed",completedAt:new Date().toISOString(),error:a instanceof Error?a.message:String(a)})),{run:p.run,completion:o}}async function c(b){let c=q().get(b);if(c)return c.run;let d=a.getSession(b);if(d?.isAlive()){let a=(0,g.$u)(d.inner.sessionManager.getEntries(),b,d.sessionFile);if(a&&d.isRunning())return{...a,status:"running"};if(a)return a}let f=await a.resolveSessionPath(b);if(!f)return null;let h=e.SessionManager.open(f);return(0,g.$u)(h.getEntries(),b,f)}async function d(b,c){let d=a.getSession(b);if(!d?.isAlive()||!d.isRunning())throw Error("Subagent is not running");if(!c.trim())throw Error("Steering message is required");await d.inner.steer(c.trim())}async function m(b){let c=a.getSession(b.parentSessionId);if(!c?.isAlive()){let d=await a.resolveSessionPath(b.parentSessionId);if(!d)throw Error(`Parent session not found: ${b.parentSessionId}`);c=await a.reopenSession(b.parentSessionId,d)}if(await c.waitUntilReady(),!c.isAlive())throw Error(`Parent session is no longer available: ${b.parentSessionId}`);await c.inner.sendCustomMessage({customType:"pi-web:subagent-notification",content:(0,f.J8)(b),display:!0,details:(0,f.o2)(b)},{deliverAs:"followUp",triggerTurn:!0})}async function p(b){let c=a.getSession(b),d=q().get(b);if(d?.run.status==="queued"){if(d.abortRequested=!0,!d.cancelQueued?.())throw Error("Subagent is no longer queued");return}if(!c?.isAlive()||!c.isRunning())throw Error("Subagent is not running");d&&(d.abortRequested=!0),await c.inner.abort()}return{extensionRuntime:{start:async function(b){let c;if(!(a.isBuiltInSubagentsEnabled??l.N)())throw Error("Pi Web built-in sub-agents are disabled");let d=b.parentContext.sessionManager.getSessionId(),f=a.getSession(d);if(!f?.isAlive())throw Error("Parent session is no longer available");if(!f.sessionFile)throw Error("Parent session must be persisted before starting a subagent");try{let m,p,t,v=(0,g.rh)(f.cwd,b.profile);if(!v)throw Error(`Unknown or disabled subagent profile: ${b.profile}`);let w=b.runInBackground??v.runInBackground,x="off"===v.isolation?void 0:b.isolation??v.isolation;"worktree"===x&&(c=await (0,n.l)(f.cwd,`pi-web-agent-${(0,o.randomUUID)()}`));let y=c?.path??f.cwd,z=b.inheritContext??v.inheritContext,A=b.maxTurns??v.maxTurns;if(void 0!==A&&(!Number.isFinite(A)||A<0))throw Error("max_turns must be a non-negative number");let B=A&&A>0?Math.floor(A):void 0,C=b.thinking??v.thinking??f.inner.agent.state?.thinkingLevel;if(C&&!u.has(C))throw Error(`Invalid subagent thinking level: ${C}`);let D=(0,e.getAgentDir)(),E=f.inner.modelRuntime,F=e.SettingsManager.create(y,D),G=z?`The following is the active conversation context from the parent session. Use it only as background for the delegated task:
5
- ${p=f.inner.sessionManager.buildSessionContext().messages,(t=JSON.stringify(p)).length<=5e4?t:`${t.slice(0,5e4)}
6
- [Parent context truncated]`}`:void 0,H=(0,i.vH)(f.cwd,b.inputFiles??[]),I=(0,h.r)({profileSystemPrompt:v.systemPrompt,tools:v.tools,loadSkills:v.loadSkills,loadExtensions:v.loadExtensions,promptMode:v.promptMode,task:(0,i.jN)(b.task,H),inheritedParentContext:G}),{chatOnly:J,appendSystemPrompt:K,delegatedTask:L}=I;J||(0,e.initTheme)();let M=await (0,e.createAgentSessionServices)({cwd:y,agentDir:D,modelRuntime:E,settingsManager:F,resourceLoaderOptions:{noExtensions:!v.loadExtensions,noSkills:!v.loadSkills,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,...J||void 0!==I.exactSystemPrompt?{systemPrompt:" ",systemPromptOverride:()=>void 0}:{},appendSystemPrompt:K},...v.loadExtensions||v.loadSkills?{resourceLoaderReloadOptions:(0,j.Fk)(y,D)}:{}}),N=v.loadExtensions?v.extensionTools?.length?(0,g.gY)(M.resourceLoader.getExtensions().extensions,v.extensionTools):M.resourceLoader.getExtensions().extensions.flatMap(a=>[...a.tools.keys()]):[],O=(0,k.wQ)((0,g.I6)(v.tools,N),F.getDefaultTools()),P=c?e.SessionManager.create(y,void 0,{parentSession:f.sessionFile}):e.SessionManager.create(f.cwd,void 0,{parentSession:f.sessionFile}),Q=new Date().toISOString(),R={version:1,parentSessionId:d,parentSessionPath:f.sessionFile,parentToolCallId:b.parentToolCallId,profile:v.name,description:b.description.trim()||v.displayName,task:b.task,runInBackground:w,createdAt:Q,resourceSnapshot:{version:1,appendSystemPrompt:[...K],tools:[...O],loadSkills:v.loadSkills,loadExtensions:v.loadExtensions,...void 0!==I.exactSystemPrompt?{exactSystemPrompt:I.exactSystemPrompt}:{}},...c?{worktreePath:c.path,worktreeBranch:c.branch}:{}};P.appendCustomEntry(g.tP,R),P.appendSessionInfo(R.description);let S=function(a,b){if(!b?.trim())return;let c=b.trim(),d=c.indexOf("/");if(d>0){let b=c.slice(0,d),e=c.slice(d+1),f=a.getModel(b,e);if(!f)throw Error(`Subagent model not found: ${c}`);return f}let e=a.getModels().filter(a=>a.id===c);if(1===e.length)return e[0];if(0===e.length)throw Error(`Subagent model not found: ${c}`);throw Error(`Subagent model is ambiguous; use provider/modelId: ${c}`)}(E,b.model??v.model),T=f.inner.model,{session:U}=await (0,e.createAgentSessionFromServices)({services:M,sessionManager:P,model:S??T,...C?{thinkingLevel:C}:{},tools:O,excludeTools:[...g.st]});a.registerSession(U,{...void 0!==I.exactSystemPrompt?{exactSystemPrompt:I.exactSystemPrompt}:{},chatOnly:J});let V={sessionId:U.sessionId,sessionPath:U.sessionFile??P.getSessionFile()??"",parentSessionId:d,parentToolCallId:b.parentToolCallId,profile:v.name,description:R.description,task:b.task,runInBackground:w,status:"queued",createdAt:Q,...c?{worktreePath:c.path,worktreeBranch:c.branch}:{}},W=0,X=!1,Y=!1,Z=B?U.subscribe(a=>{"turn_end"===a.type&&(W+=1,!Y&&W>=B?(Y=!0,U.steer("You have reached your turn limit. Wrap up immediately and provide your final answer now.")):Y&&W>=B+1&&(X=!0,U.abort()))}):()=>{},$=new Promise(a=>{m=a}),_={run:V,completion:$,abortRequested:!1};q().set(V.sessionId,_),b.onUpdate?.(V),a.invalidateSessionList();let aa=()=>{_.abortRequested=!0,"queued"===_.run.status?_.cancelQueued?.():U.abort()};w||b.signal?.addEventListener("abort",aa,{once:!0});let ab=async()=>{let d;if(_.abortRequested){let d={...V,status:"aborted",completedAt:new Date().toISOString()};return P.appendCustomEntry(g.pv,{version:1,status:"aborted",completedAt:d.completedAt}),await s(f.cwd,c),_.run=d,b.onUpdate?.(d),q().delete(V.sessionId),a.invalidateSessionList(),a.notifyRunningChange?.(),d}_.run={..._.run,status:"running"},P.appendCustomEntry(g.o2,{version:1,status:"running"}),b.onUpdate?.(_.run),a.invalidateSessionList();try{await U.prompt(L,{source:"rpc",...J?{preflightResult:a=>{a&&U.agent.state&&(U.agent.state.systemPrompt=v.systemPrompt)}}:{}});let a=U.getLastAssistantText()?.trim(),b=_.abortRequested&&!X;d={...V,status:b?"aborted":"completed",completedAt:new Date().toISOString(),...a?{result:a}:{}}}catch(e){let a=U.getLastAssistantText()?.trim(),c=_.abortRequested||b.signal?.aborted;d={...V,status:c?"aborted":X?"completed":"failed",completedAt:new Date().toISOString(),...a?{result:a}:{},...!c&&!X?{error:e instanceof Error?e.message:String(e)}:{}}}finally{Z(),b.signal?.removeEventListener("abort",aa)}let e=await s(f.cwd,c);e&&(d={...d,worktreeCleanupError:e});let h={version:1,status:d.status,completedAt:d.completedAt,...d.result?{result:d.result}:{},...d.error?{error:d.error}:{},...d.worktreeCleanupError?{worktreeCleanupError:d.worktreeCleanupError}:{}};return P.appendCustomEntry(g.pv,h),_.run=d,b.onUpdate?.(d),q().delete(V.sessionId),a.invalidateSessionList(),a.notifyRunningChange?.(),d},ac=async()=>{if("queued"!==_.run.status)return;let d={...V,status:"aborted",completedAt:new Date().toISOString()},e=await s(f.cwd,c),h=e?{...d,worktreeCleanupError:e}:d;P.appendCustomEntry(g.pv,{version:1,status:"aborted",completedAt:h.completedAt,...e?{worktreeCleanupError:e}:{}}),_.run=h,b.onUpdate?.(h),q().delete(V.sessionId),a.invalidateSessionList(),a.notifyRunningChange?.(),m(h)},ad=r().enqueue(d,(0,l.hd)().maxConcurrent,ab,c=>{"queued"===c&&P.appendCustomEntry(g.o2,{version:1,status:"queued"}),b.onUpdate?.({..._.run,status:c}),_.run={..._.run,status:c},a.invalidateSessionList()},ac);return _.cancelQueued=ad.cancel,ad.promise.then(m,a=>{m({...V,status:"failed",completedAt:new Date().toISOString(),error:a instanceof Error?a.message:String(a)})}),{run:_.run,completion:_.completion}}catch(a){if(c)try{await (0,n.IL)(f.cwd,c.path)}catch{}throw a}},resume:b,get:c,steer:d,notifyParent:m},get:c,steer:d,abort:p}}d()}catch(a){d(a)}})},20644:(a,b,c)=>{c.d(b,{r:()=>d});function d(a){let b=0===a.tools.length&&!a.loadSkills&&!a.loadExtensions,c="replace"===a.promptMode,d=[a.profileSystemPrompt];return a.inheritedParentContext&&!b&&d.push(a.inheritedParentContext),{chatOnly:b,appendSystemPrompt:d,delegatedTask:a.inheritedParentContext&&b?`${a.task}
4
+ - "blocked" when only the user can unblock you.`;function f(a){return`${e}
5
+
6
+ Current goal:
7
+ ${a}`}function g(a){return`${a}.goal.json`}function h(a){let b=g(a);if(!(0,d.existsSync)(b))return i();try{var c;let a=JSON.parse((0,d.readFileSync)(b,"utf8"));if(!a||1!==a.version||!a.state||"object"!=typeof a.state)return i();let e=a.state;return{status:(c=e.status,["idle","running","paused","blocked","budget_limited","complete"].includes(c)?c:"idle"),goalText:"string"==typeof e.goalText?e.goalText:null,turnsUsed:Number.isFinite(e.turnsUsed)?e.turnsUsed:0,turnsLimit:Number.isFinite(e.turnsLimit)?e.turnsLimit:10,noProgressTurns:Number.isFinite(e.noProgressTurns)?e.noProgressTurns:0,noProgressLimit:Number.isFinite(e.noProgressLimit)?e.noProgressLimit:4,tokensUsed:Number.isFinite(e.tokensUsed)?e.tokensUsed:0,tokenBudget:null===e.tokenBudget||Number.isFinite(e.tokenBudget)?e.tokenBudget??null:null,timeUsedSeconds:Number.isFinite(e.timeUsedSeconds)?e.timeUsedSeconds:0,startedAt:Number.isFinite(e.startedAt)?e.startedAt:void 0,updatedAt:Number.isFinite(e.updatedAt)?e.updatedAt:void 0}}catch{return i()}}function i(){return{status:"idle",goalText:null,turnsUsed:0,turnsLimit:10,noProgressTurns:0,noProgressLimit:4,tokensUsed:0,tokenBudget:null,timeUsedSeconds:0}}function j(a,b){let c=g(a),e=`${c}.tmp`;try{(0,d.writeFileSync)(e,JSON.stringify({version:1,state:b}),{encoding:"utf8",mode:384}),(0,d.renameSync)(e,c)}catch{try{(0,d.rmSync)(e,{force:!0})}catch{}}}class k{constructor(a){this.continuationArmed=!1,this.turnStartMs=0,this.onChanged=null,this.state=a?h(a):i()}hydrate(a){this.state={...a}}getState(){return{...this.state}}isRunning(){return"running"===this.state.status}hasActiveGoal(){return"idle"!==this.state.status}isContinuable(){return"running"===this.state.status}isContinuationArmed(){return this.continuationArmed}armContinuation(){this.continuationArmed=!0}disarmContinuation(){this.continuationArmed=!1}onAgentStart(){this.continuationArmed=!1,this.turnStartMs=Date.now()}setOnChanged(a){this.onChanged=a}commit(a){a.updatedAt=Date.now(),this.state=a,this.onChanged?.(this.getState())}start(a,b=null){let c=Date.now(),d=b??this.state.tokenBudget??null,e={status:"running",goalText:a.trim(),turnsUsed:0,turnsLimit:this.state.turnsLimit,noProgressTurns:0,noProgressLimit:this.state.noProgressLimit,tokensUsed:0,tokenBudget:d,timeUsedSeconds:0,startedAt:c,updatedAt:c};return this.commit(e),this.getState()}pause(){return"running"!==this.state.status||this.commit({...this.state,status:"paused"}),this.getState()}resume(){return"paused"!==this.state.status&&"blocked"!==this.state.status||this.commit({...this.state,status:"running"}),this.getState()}stop(){if("idle"===this.state.status)return this.getState();let a=i();return a.turnsLimit=this.state.turnsLimit,a.noProgressLimit=this.state.noProgressLimit,this.commit(a),this.continuationArmed=!1,this.getState()}edit(a){if("idle"===this.state.status)return this.getState();let b="complete"===this.state.status||"budget_limited"===this.state.status?"running":this.state.status;return this.commit({...this.state,goalText:a.trim(),status:b}),this.getState()}settleTurn(a,b,c){if("running"!==this.state.status)return{verdict:{action:"continue"},state:this.getState()};let d=(a??"").toLowerCase(),e=this.turnStartMs>0?Math.max(0,Math.round((Date.now()-this.turnStartMs)/1e3)):0,f=this.state.tokensUsed+Math.max(0,b),g=this.state.timeUsedSeconds+e,h=this.state.turnsUsed+1;if(d.includes("[goal: complete]")||/(?:^|\n|[.!?]\s+)(?:goal(?:\s+is)?\s+complete|goal\s+complete)\b/.test(d)){let a={...this.state,turnsUsed:h,tokensUsed:f,timeUsedSeconds:g};return this.commit({...a,status:"complete"}),{verdict:{action:"complete"},state:this.getState()}}if(function(a){let b;if(a.includes("[goal: blocked]")||a.includes("goal blocked"))return!0;let c=/(?:^|[^a-z])blocked\s*:/g;for(;null!==(b=c.exec(a));){let c=a.slice(0,b.index).trimEnd();if(!/\bnot$/.test(c))return!0}return!1}(d)){let a={...this.state,turnsUsed:h,tokensUsed:f,timeUsedSeconds:g};return this.commit({...a,status:"blocked"}),{verdict:{action:"blocked"},state:this.getState()}}let i=0===c?this.state.noProgressTurns+1:0;return null!==this.state.tokenBudget&&f>=this.state.tokenBudget?(this.commit({...this.state,turnsUsed:h,tokensUsed:f,timeUsedSeconds:g,noProgressTurns:i,status:"budget_limited"}),{verdict:{action:"budget_limited"},state:this.getState()}):i>=this.state.noProgressLimit?(this.commit({...this.state,turnsUsed:h,tokensUsed:f,timeUsedSeconds:g,noProgressTurns:i,status:"blocked"}),{verdict:{action:"blocked"},state:this.getState()}):h>=this.state.turnsLimit?(this.commit({...this.state,turnsUsed:h,tokensUsed:f,timeUsedSeconds:g,noProgressTurns:i,status:"paused"}),{verdict:{action:"pause"},state:this.getState()}):(this.commit({...this.state,turnsUsed:h,tokensUsed:f,timeUsedSeconds:g,noProgressTurns:i}),{verdict:{action:"continue"},state:this.getState()})}}},7667:(a,b,c)=>{c.d(b,{V:()=>d});class d{enqueue(a,b,c,d,e){let f,g=this.parents.get(a)??{limit:1,active:0,items:[]};g.limit=Math.max(1,Math.floor(b)||1);let h=new Promise((a,b)=>{f={run:c,onState:d,onCancel:e,resolve:a,reject:b,state:"queued",cancelled:!1}});return g.items.push(f),this.parents.set(a,g),d("queued"),this.pump(a,g),{promise:h,cancel:()=>"queued"===f.state&&!f.cancelled&&(f.cancelled=!0,Promise.resolve(f.onCancel?.()).then(()=>f.resolve(void 0),a=>f.reject(a)),this.pump(a,g),!0)}}pump(a,b){for(;b.active<b.limit&&b.items.length>0;){let c=b.items.shift();c.cancelled||(c.state="running",c.onState("running"),b.active+=1,c.run().then(c.resolve,c.reject).finally(()=>{b.active-=1,this.pump(a,b),0===b.active&&0===b.items.length&&this.parents.delete(a)}))}}constructor(){this.parents=new Map}}},11301:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{hH:()=>s,oH:()=>r,wF:()=>q});var e=c(73024),f=c(76760),g=c(75430),h=c(8102),i=a([g]);g=(i.then?(await i)():i)[0];let t=new Set([400,401,402,403,404,406,408,409,413,422,429,451,500,502,503,504]),u=new Set(["opencode-zen-external","opencode-zen-switch","opencode-zen-runtime","opencode-zen-sync"]);function j(){return(0,f.join)((0,g.getAgentDir)(),"pi-web-error-log.json")}function k(){globalThis.__piErrorLogState||(globalThis.__piErrorLogState={loaded:!1,entries:[]});let a=globalThis.__piErrorLogState;if(!a.loaded){a.loaded=!0;try{if((0,e.existsSync)(j())){let b=JSON.parse((0,e.readFileSync)(j(),"utf8"));if(Array.isArray(b)){let c=b.filter(l).slice(-500),d=c.filter(a=>!u.has(a.source));d.length!==c.length&&p(d),a.entries=d}}}catch{a.entries=[]}}return a}function l(a){return!(!a||"object"!=typeof a||Array.isArray(a))&&"string"==typeof a.id&&"string"==typeof a.timestamp&&("error"===a.level||"warning"===a.level||"info"===a.level)&&"string"==typeof a.source&&"string"==typeof a.message}function m(a){return a.replace(/https?:\/\/[^\s/@]+:[^\s/@]+@/gi,"https://[redacted]@").replace(/Bearer\s+[A-Za-z0-9._~+/=-]+/gi,"Bearer [redacted]").replace(/\bsk-[A-Za-z0-9_-]{8,}\b/g,"sk-[redacted]").replace(/\b(?:oc|opencode|zen)[_-]?[A-Za-z0-9._~-]{12,}\b/gi,"[key-redacted]").replace(/((?:api[_-]?key|token|password|secret)\s*[:=]\s*)([^\s,;]+)/gi,"$1[redacted]")}function n(a){return a.length>2e4?`${a.slice(0,2e4)}…`:a}function o(a){let b=a.match(/\bHTTP\s+(\d{3})\b|\bstatus(?:\s+code)?\s*[:=]?\s*(\d{3})\b|\b(4\d{2}|5\d{2})\b/i),c=Number(b?.[1]??b?.[2]??b?.[3]);return t.has(c)?c:void 0}function p(a){try{(0,h.$)(j(),JSON.stringify(a,null,2))}catch{}}function q(a){let b=k(),c=n(m(a.message.trim())),d=a.details?n(m(a.details)):void 0,e={id:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),level:a.level??"error",source:a.source??"unknown",...void 0!==a.statusCode?{statusCode:a.statusCode}:void 0!==o(c)?{statusCode:o(c)}:{},...a.provider?{provider:a.provider}:{},...a.model?{model:a.model}:{},...a.sessionId?{sessionId:a.sessionId}:{},message:c||"Unknown error",...d?{details:d}:{}};return b.entries.push(e),b.entries.length>500&&b.entries.splice(0,b.entries.length-500),p(b.entries),e}function r(a={}){let b=a.query?.trim().toLocaleLowerCase(),c=Math.min(Math.max(a.limit??200,1),500),d=void 0!==a.source&&u.has(a.source);return k().entries.filter(a=>d||!u.has(a.source)).filter(b=>void 0===a.statusCode||b.statusCode===a.statusCode).filter(b=>!a.level||b.level===a.level).filter(b=>!a.source||b.source===a.source).filter(a=>!b||[a.message,a.details,a.provider,a.model,a.source].filter(Boolean).some(a=>a.toLocaleLowerCase().includes(b))).slice().reverse().slice(0,c)}function s(){k().entries=[],p([])}d()}catch(a){d(a)}})},12568:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{s:()=>t});var e=c(75430),f=c(46753),g=c(7048),h=c(20644),i=c(99324),j=c(72498),k=c(305),l=c(27367),m=c(7667),n=c(24923),o=c(77598),p=a([e,f,g,j,k,l]);[e,f,g,j,k,l]=p.then?(await p)():p;let u=new Set(["off","minimal","low","medium","high","xhigh","max"]);function q(){return globalThis.__piSubagentRuns||(globalThis.__piSubagentRuns=new Map),globalThis.__piSubagentRuns}async function r(a,b){if(b)try{await (0,n.IL)(a,b.path);return}catch(a){return`Worktree retained at ${b.path}: ${a instanceof Error?a.message:String(a)}`}}function s(a){let b,c=!1,d=()=>{c||b?.()};a?.addEventListener("abort",d,{once:!0});let e={get aborted(){return!c&&a?.aborted===!0},throwIfAborted(){if(e.aborted)throw new DOMException("Subagent was stopped during setup","AbortError")},setHandler(a){b=a,e.aborted&&a()},dispose(){a?.removeEventListener("abort",d),b=void 0},ignore(){c=!0,e.dispose()}};return e}function t(a){async function b(b){let c=a.getSession(b.sessionId);c?.inner===b&&c.shutdown?await c.shutdown():b.dispose()}function c(b){let c,d,{initialRun:e,inner:f,request:h,cancellation:i}=b,j=new Promise(a=>{c=a}),k={run:e,completion:j,abortRequested:i.aborted},n=!1,o=()=>({...e,status:"aborted",completedAt:new Date().toISOString()}),p=a=>{try{h.onUpdate?.(a)}catch(a){console.error("[subagents] update listener failed:",a)}},r=h=>d||(k.run=h,k.cancelQueued=void 0,i.dispose(),b.unsubscribe?.(),d=Promise.resolve().then(async()=>{let d=h;try{let a=await b.cleanup?.(h);a&&(d={...h,worktreeCleanupError:a});let c={version:1,status:d.status,completedAt:d.completedAt,...d.result?{result:d.result}:{},...d.error?{error:d.error}:{},...d.worktreeCleanupError?{worktreeCleanupError:d.worktreeCleanupError}:{}};f.sessionManager.appendCustomEntry(g.pv,c)}catch(a){d={...d,error:a instanceof Error?a.message:String(a)},"aborted"!==d.status&&(d.status="failed")}finally{try{await b.close?.(d)}catch(a){console.error("[subagents] session shutdown failed:",a)}k.run=d,q().get(e.sessionId)===k&&q().delete(e.sessionId),p(d),a.invalidateSessionList(),a.notifyRunningChange?.(),c(d)}return d})),s=async()=>{let a;if(k.abortRequested||i.aborted)return r(o());try{n=!0,await b.prompt(()=>{if(k.abortRequested||i.aborted)throw new DOMException("Subagent was stopped before prompt preflight completed","AbortError")});let c=f.getLastAssistantText()?.trim();a={...e,status:k.abortRequested||i.aborted?"aborted":"completed",completedAt:new Date().toISOString(),...c?{result:c}:{}}}catch(h){let c=k.abortRequested||i.aborted,d=f.getLastAssistantText()?.trim(),g=b.maxTurnsReached?.()===!0;a={...e,status:c?"aborted":g?"completed":"failed",completedAt:new Date().toISOString(),...d?{result:d}:{},...!c&&!g?{error:h instanceof Error?h.message:String(h)}:{}}}finally{n=!1}return r(a)};if(q().set(e.sessionId,k),i.setHandler(()=>{k.abortRequested=!0,"queued"===k.run.status?k.cancelQueued?.():n&&f.abort().catch(()=>void 0)}),p(e),a.invalidateSessionList(),k.abortRequested||i.aborted)r(o());else try{let b=(!globalThis.__piSubagentQueue&&(globalThis.__piSubagentQueue=new m.V),globalThis.__piSubagentQueue).enqueue(e.parentSessionId,(0,l.hd)().maxConcurrent,s,b=>{d||(k.run={...k.run,status:b},f.sessionManager.appendCustomEntry(g.o2,{version:1,status:b}),p(k.run),a.invalidateSessionList())},async()=>{await r(o())});k.cancelQueued=b.cancel,(k.abortRequested||i.aborted)&&"queued"===k.run.status&&b.cancel(),b.promise.catch(a=>r(k.abortRequested||i.aborted?o():{...e,status:"failed",completedAt:new Date().toISOString(),error:a instanceof Error?a.message:String(a)}))}catch(a){r(k.abortRequested||i.aborted?o():{...e,status:"failed",completedAt:new Date().toISOString(),error:a instanceof Error?a.message:String(a)})}return{run:k.run,completion:j}}async function d(d){let e;if(!(a.isBuiltInSubagentsEnabled??l.N)())throw Error("Pi Web built-in sub-agents are disabled");let f=d.parentContext.sessionManager.getSessionId(),g=s(!0===d.runInBackground?void 0:d.signal);try{!1===d.runInBackground&&g.throwIfAborted();let h=await p(d.sessionId);if(!h)throw Error(`Subagent not found: ${d.sessionId}`);if(h.parentSessionId!==f)throw Error("Subagent does not belong to this parent session");let i=d.runInBackground??h.runInBackground;if(i&&g.ignore(),g.throwIfAborted(),"running"===h.status||"queued"===h.status)throw Error("Subagent is already running");let j=a.getSession(f);if(!j?.isAlive())throw Error("Parent session is no longer available");let k=h.sessionPath||await a.resolveSessionPath(d.sessionId);if(g.throwIfAborted(),!k)throw Error(`Subagent session file not found: ${d.sessionId}`);let l=a.getSession(d.sessionId);if(l?.isAlive()||(e=l=await a.reopenSession(d.sessionId,k),g.throwIfAborted()),!l.isAlive())throw Error("Subagent session is no longer available");if(l.isRunning()||q().has(d.sessionId))throw Error("Subagent is already running");let m={...h,parentToolCallId:d.parentToolCallId,task:d.task,description:d.description.trim()||h.description,runInBackground:i,status:"queued",completedAt:void 0,result:void 0,error:void 0},n=l.inner;return c({initialRun:m,inner:n,request:d,cancellation:g,prompt:a=>n.prompt(d.task,{source:"rpc",preflightResult:b=>{b&&a()}}),close:async a=>{"aborted"===a.status&&await b(n)}})}catch(a){throw g.dispose(),!e||e.isRunning()||q().has(d.sessionId)||await b(e.inner),g.throwIfAborted(),a}}async function p(b){let c=q().get(b);if(c)return c.run;let d=a.getSession(b);if(d?.isAlive()){let a=(0,g.$u)(d.inner.sessionManager.getEntries(),b,d.sessionFile);if(a&&d.isRunning())return{...a,status:"running"};if(a)return a}let f=await a.resolveSessionPath(b);if(!f)return null;let h=e.SessionManager.open(f);return(0,g.$u)(h.getEntries(),b,f)}async function t(b,c){let d=a.getSession(b);if(!d?.isAlive()||!d.isRunning())throw Error("Subagent is not running");if(!c.trim())throw Error("Steering message is required");await d.inner.steer(c.trim())}async function v(b){let c=a.getSession(b.parentSessionId);if(!c?.isAlive()){let d=await a.resolveSessionPath(b.parentSessionId);if(!d)throw Error(`Parent session not found: ${b.parentSessionId}`);c=await a.reopenSession(b.parentSessionId,d)}if(await c.waitUntilReady(),!c.isAlive())throw Error(`Parent session is no longer available: ${b.parentSessionId}`);await c.inner.sendCustomMessage({customType:"pi-web:subagent-notification",content:(0,f.J8)(b),display:!0,details:(0,f.o2)(b)},{deliverAs:"followUp",triggerTurn:!0})}async function w(b){let c=a.getSession(b),d=q().get(b);if(d?.run.status==="queued"){if(d.abortRequested=!0,!d.cancelQueued?.())throw Error("Subagent is no longer queued");return}if(!c?.isAlive()||!c.isRunning())throw Error("Subagent is not running");d&&(d.abortRequested=!0),await c.inner.abort()}return{extensionRuntime:{start:async function(d){let f,m,p;if(!(a.isBuiltInSubagentsEnabled??l.N)())throw Error("Pi Web built-in sub-agents are disabled");let q=d.parentContext.sessionManager.getSessionId(),t=a.getSession(q);if(!t?.isAlive())throw Error("Parent session is no longer available");if(!t.sessionFile)throw Error("Parent session must be persisted before starting a subagent");let v=(0,g.rh)(t.cwd,d.profile);if(!v)throw Error(`Unknown or disabled subagent profile: ${d.profile}`);let w=d.runInBackground??v.runInBackground,x=s(w?void 0:d.signal);try{let l,s;x.throwIfAborted();let y="off"===v.isolation?void 0:d.isolation??v.isolation;"worktree"===y&&(f=await (0,n.l)(t.cwd,`pi-web-agent-${(0,o.randomUUID)()}`),x.throwIfAborted());let z=f?.path??t.cwd,A=d.inheritContext??v.inheritContext,B=d.maxTurns??v.maxTurns;if(void 0!==B&&(!Number.isFinite(B)||B<0))throw Error("max_turns must be a non-negative number");let C=B&&B>0?Math.floor(B):void 0,D=d.thinking??v.thinking??t.inner.agent.state?.thinkingLevel;if(D&&!u.has(D))throw Error(`Invalid subagent thinking level: ${D}`);let E=(0,e.getAgentDir)(),F=t.inner.modelRuntime,G=e.SettingsManager.create(z,E),H=A?`The following is the active conversation context from the parent session. Use it only as background for the delegated task:
8
+ ${l=t.inner.sessionManager.buildSessionContext().messages,(s=JSON.stringify(l)).length<=5e4?s:`${s.slice(0,5e4)}
9
+ [Parent context truncated]`}`:void 0,I=(0,i.vH)(t.cwd,d.inputFiles??[]),J=(0,h.r)({profileSystemPrompt:v.systemPrompt,tools:v.tools,loadSkills:v.loadSkills,loadExtensions:v.loadExtensions,promptMode:v.promptMode,task:(0,i.jN)(d.task,I),inheritedParentContext:H}),{chatOnly:K,appendSystemPrompt:L,delegatedTask:M}=J;K||(0,e.initTheme)();let N=await (0,e.createAgentSessionServices)({cwd:z,agentDir:E,modelRuntime:F,settingsManager:G,resourceLoaderOptions:{noExtensions:!v.loadExtensions,noSkills:!v.loadSkills,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,...K||void 0!==J.exactSystemPrompt?{systemPrompt:" ",systemPromptOverride:()=>void 0}:{},appendSystemPrompt:L},...v.loadExtensions||v.loadSkills?{resourceLoaderReloadOptions:(0,j.Fk)(z,E)}:{}});x.throwIfAborted();let O=v.loadExtensions?v.extensionTools?.length?(0,g.gY)(N.resourceLoader.getExtensions().extensions,v.extensionTools):N.resourceLoader.getExtensions().extensions.flatMap(a=>[...a.tools.keys()]):[],P=(0,k.wQ)((0,g.I6)(v.tools,O),G.getDefaultTools()),Q=f?e.SessionManager.create(z,void 0,{parentSession:t.sessionFile}):e.SessionManager.create(t.cwd,void 0,{parentSession:t.sessionFile});p=Q;let R=new Date().toISOString(),S={version:1,parentSessionId:q,parentSessionPath:t.sessionFile,parentToolCallId:d.parentToolCallId,profile:v.name,description:d.description.trim()||v.displayName,task:d.task,runInBackground:w,createdAt:R,resourceSnapshot:{version:1,appendSystemPrompt:[...L],tools:[...P],loadSkills:v.loadSkills,loadExtensions:v.loadExtensions,...void 0!==J.exactSystemPrompt?{exactSystemPrompt:J.exactSystemPrompt}:{}},...f?{worktreePath:f.path,worktreeBranch:f.branch}:{}};Q.appendCustomEntry(g.tP,S),Q.appendSessionInfo(S.description);let T=function(a,b){if(!b?.trim())return;let c=b.trim(),d=c.indexOf("/");if(d>0){let b=c.slice(0,d),e=c.slice(d+1),f=a.getModel(b,e);if(!f)throw Error(`Subagent model not found: ${c}`);return f}let e=a.getModels().filter(a=>a.id===c);if(1===e.length)return e[0];if(0===e.length)throw Error(`Subagent model not found: ${c}`);throw Error(`Subagent model is ambiguous; use provider/modelId: ${c}`)}(F,d.model??v.model),U=t.inner.model,{session:V}=await (0,e.createAgentSessionFromServices)({services:N,sessionManager:Q,model:T??U,...D?{thinkingLevel:D}:{},tools:P,excludeTools:[...g.st]});m=V,x.throwIfAborted(),a.registerSession(V,{...void 0!==J.exactSystemPrompt?{exactSystemPrompt:J.exactSystemPrompt}:{},chatOnly:K});let W={sessionId:V.sessionId,sessionPath:V.sessionFile??Q.getSessionFile()??"",parentSessionId:q,parentToolCallId:d.parentToolCallId,profile:v.name,description:S.description,task:d.task,runInBackground:w,status:"queued",createdAt:R,...f?{worktreePath:f.path,worktreeBranch:f.branch}:{}},X=0,Y=!1,Z=!1,$=C?V.subscribe(a=>{"turn_end"===a.type&&(X+=1,!Z&&X>=C?(Z=!0,V.steer("You have reached your turn limit. Wrap up immediately and provide your final answer now.")):Z&&X>=C+1&&(Y=!0,V.abort()))}):()=>{};return c({initialRun:W,inner:m,request:d,cancellation:x,unsubscribe:$,maxTurnsReached:()=>Y,prompt:a=>V.prompt(M,{source:"rpc",preflightResult:b=>{b&&(a(),K&&V.agent.state&&(V.agent.state.systemPrompt=v.systemPrompt))}}),cleanup:()=>r(t.cwd,f),close:async a=>{(f||"aborted"===a.status)&&await b(m)}})}catch(d){x.dispose();let a=await r(t.cwd,f),c=x.aborted;try{p?.appendCustomEntry(g.pv,{version:1,status:c?"aborted":"failed",completedAt:new Date().toISOString(),...a?{worktreeCleanupError:a}:{}})}finally{m&&await b(m)}if(c)throw new DOMException(`Subagent was stopped during setup${a?`; ${a}`:""}`,"AbortError");if(a)throw Error(`${d instanceof Error?d.message:String(d)}; ${a}`,{cause:d});throw d}},resume:d,get:p,steer:t,notifyParent:v},get:p,steer:t,abort:w}}d()}catch(a){d(a)}})},20644:(a,b,c)=>{c.d(b,{r:()=>d});function d(a){let b=0===a.tools.length&&!a.loadSkills&&!a.loadExtensions,c="replace"===a.promptMode,d=[a.profileSystemPrompt];return a.inheritedParentContext&&!b&&d.push(a.inheritedParentContext),{chatOnly:b,appendSystemPrompt:d,delegatedTask:a.inheritedParentContext&&b?`${a.task}
7
10
 
8
11
  ${a.inheritedParentContext}`:a.task,...b||c?{exactSystemPrompt:a.profileSystemPrompt}:{}}}},21560:(a,b,c)=>{c.d(b,{b5:()=>j,dS:()=>h,vw:()=>i});var d=c(41761);let e="pi-web:tool-selection",f=new Set(d.C1);function g(a){if(!("object"!=typeof a||null===a||Array.isArray(a))&&!(1!==a.version||!Array.isArray(a.tools)||a.tools.some(a=>"string"!=typeof a||!f.has(a))))return[...new Set(a.tools)]}function h(a){for(let b=a.length-1;b>=0;b-=1){let c=a[b];if("custom"!==c.type||c.customType!==e)continue;let d=g(c.data);if(void 0!==d)return d}}function i(a){let b=g({version:1,tools:a});if(void 0===b)throw Error("toolNames must contain only built-in tool names");return b}function j(a,b){a.appendCustomEntry(e,{version:1,tools:[...b]})}},27367:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{M6:()=>j,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){let c=d(),e=c.entries.get(a);if(e&&e.expiresAt>Date.now())return Promise.resolve(e.data);if(e)return c.inFlight.has(a)||g(c,a,b).catch(()=>{}),Promise.resolve(e.data);let f=c.inFlight.get(a);return f||g(c,a,b)}function g(a,b,c){let d=a.inFlight.get(b);if(d)return d;let e=a.generation,f=Promise.resolve().then(c).then(c=>{if(a.generation===e&&a.inFlight.get(b)===f){let d=Date.now();for(let[b,c]of a.entries)c.expiresAt<=d&&a.entries.delete(b);for(;a.entries.size>=32;){let b=a.entries.keys().next().value;if(void 0===b)break;a.entries.delete(b)}a.entries.set(b,{data:c,expiresAt:d+6e4})}return c}).finally(()=>{a.inFlight.get(b)===f&&a.inFlight.delete(b)});return a.inFlight.set(b,f),f}c.d(b,{k:()=>e,r:()=>f})},30590:(a,b,c)=>{c.d(b,{o:()=>d});async function d(a,b,c){if(!b.model&&!b.thinkingLevel)return{modelDefaultChanged:!1};let d=!1;return b.model&&c.model&&b.model.provider===c.model.provider&&b.model.modelId===c.model.modelId&&(a.setDefaultModelAndProvider(c.model.provider,c.model.modelId),d=!0),b.thinkingLevel&&(c.supportsThinking||"off"!==c.thinkingLevel)&&a.setDefaultThinkingLevel(c.thinkingLevel),await a.flush(),{modelDefaultChanged:d}}},36193:(a,b,c)=>{c.d(b,{LD:()=>m,kP:()=>o,ni:()=>n});var d=c(67264);function e(a){if(!a)return[];let b=[];for(let c of a){let a=function(a){let b=a.trim();if(!b)return null;let c=b.indexOf("="),d=b.indexOf("(");if(c>0&&(d<0||c<d)){let a=b.slice(0,c).trim();return a?{tool:a,subject:b.slice(c+1),literal:!0}:null}if(d>=0&&b.endsWith(")")){let a=b.slice(0,d).trim();return a?{tool:a,subject:b.slice(d+1,-1)}:null}return{tool:b}}(c);a&&b.push(a)}return b}function f(a){return void 0===a.subject?a.tool:a.literal?`${a.tool}=${a.subject}`:`${a.tool}(${a.subject})`}function g(a){return a.includes("*")||a.includes("?")}function h(a,b){return void 0===b.subject||""!==a&&(b.literal||!g(b.subject)?a===b.subject:(function(a){let b="^";for(let c of a)"*"===c?b+=".*":"?"===c?b+=".":b+=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return RegExp(b+"$")})(b.subject).test(a))}function i(a,b){return a.toLowerCase()===b.toLowerCase()}function j(a,b,c){for(let d of a)if(i(d.tool,b)&&h(c,d))return!0;return!1}function k(a){let b=a.trim();return!!b&&!!(/\$\(/.test(b)||/`/.test(b)||/(^|\s)(python|python3|node|ruby|perl|php)\s+-[a-z]*c(\s|$)/i.test(b)||/(^|\s)(sh|bash|zsh)\s+-c(\s|$)/i.test(b)||/(^|\s)(sudo|su)\s/i.test(b)||/;\s*[a-z]/i.test(b)||/\|\s*(sh|bash|zsh|python|python3|node)\b/i.test(b)||/\|\s*tee\b/i.test(b))}let l=["ls","cat","head","tail","grep","rg","find","wc","echo","pwd","cd","git status","git diff","git log","git branch","git remote","git stash list","git show","git ls-files","which","type","env","file","stat","du","df","history","man","less","more","tree","git diff --","git log --","curl -I","curl --head"];function m(a,b,c={}){let e=c.mode??"auto",f=c.readOnly??d.MJ.has(b.toLowerCase()),n=function(a,b){if("bash"===a.toLowerCase()){let a=b?.command;return"string"==typeof a&&a.trim()?`command:${a.trim()}`:""}let c=b??{},d="string"==typeof c.source_path?c.source_path:"",e="string"==typeof c.destination_path?c.destination_path:"";if(d&&e)return e!==d?`${d}\u0000${e}`:d;for(let a of["path","file_path","file","glob","pattern","directory"]){let b=c[a];if("string"==typeof b&&b)return b}return""}(b,c.args),o="bash"===b.toLowerCase(),p=o&&n.startsWith("command:")?n.slice(8):"";if(j(a.deny,b,n))return"deny";if(o&&p){let c=k(p);return j(a.allow,b,n)&&!c?"allow":j(a.ask,b,n)?"ask":c?a.allow.some(a=>i(a.tool,b)&&void 0!==a.subject&&!g(a.subject)&&h(n,a))||"yolo"===e?"allow":"ask":!function(a){let b=a.trim();if(!b||k(b)||/[;&|>]/.test(b))return!1;let c=b.toLowerCase();for(let a of l)if(c===a||c.startsWith(a+" "))return!0;return!1}(p)?"ask"===e?"ask":"allow":"allow"}return j(a.allow,b,n)?"allow":j(a.ask,b,n)?"ask":f?"allow":"ask"===e?"ask":"allow"}function n(a){return{allow:e(a?.allow),ask:e(a?.ask),deny:e(a?.deny)}}function o(a){return{allow:a.allow.map(f),ask:a.ask.map(f),deny:a.deny.map(f)}}},43671:(a,b,c)=>{c.d(b,{Gc:()=>g,ov:()=>h,pj:()=>i,wx:()=>j});var d=c(55511),e=c(29021);function f(a){return`${a}.queue.json`}function g(a,b,c){return{id:(0,d.randomUUID)(),kind:a,text:b,...c&&c.length>0?{images:c}:{},queuedAt:Date.now()}}function h(a){let b=f(a);if(!(0,e.existsSync)(b))return[];try{let a=JSON.parse((0,e.readFileSync)(b,"utf8"));if(!a||1!==a.version||!Array.isArray(a.entries))return[];return a.entries.filter(a=>!!a&&("steer"===a.kind||"followUp"===a.kind)&&"string"==typeof a.text)}catch{return[]}}function i(a,b){if(!a)return;let c=f(a),g=`${c}.tmp-${process.pid}-${(0,d.randomUUID)()}`;try{(0,e.writeFileSync)(g,JSON.stringify({version:1,entries:b}),"utf8"),(0,e.renameSync)(g,c)}catch(a){try{(0,e.rmSync)(g,{force:!0})}catch{}console.error(`[pi-web] failed to persist queue sidecar ${c}:`,a instanceof Error?a.message:String(a))}}function j(a){try{(0,e.rmSync)(f(a),{force:!0})}catch{}}},44271:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{B:()=>p,createAsyncBashTools:()=>n});var e=c(31421),f=c(53303),g=c(75430),h=c(84229),i=a([f,g]);[f,g]=i.then?(await i)():i;class o{append(a){for(this.totalBytes+=a.length,this.tail.push(a),this.tailBytes+=a.length;this.tailBytes>258048&&this.tail.length>1;){let a=this.tail.shift();this.tailBytes-=a.length}if(this.headBytes<4096){let b=4096-this.headBytes;a.length<=b?(this.head.push(a),this.headBytes+=a.length):(this.head.push(a.subarray(0,b)),this.headBytes=4096)}}get hasOmission(){return this.totalBytes>this.headBytes+this.tailBytes}get omittedBytes(){return Math.max(0,this.totalBytes-this.headBytes-this.tailBytes)}toSnapshot(){if(!this.hasOmission)return Buffer.concat(this.tail).toString("utf-8");let a=[...this.head];return a.push(Buffer.from(`
9
12
  ... ${this.omittedBytes} bytes omitted ...
@@ -14,7 +17,7 @@ ${a.inheritedParentContext}`:a.task,...b||c?{exactSystemPrompt:a.profileSystemPr
14
17
  (spawning background process...)`}],details:{command:i,sessionId:h.id,spawning:!0}});let{output:o,exited:p,exitCode:q}=await a.poll(h.id,j),r=Date.now()-n;p&&a.remove(h.id);let s=m({output:o,exited:p,exitCode:q,sessionId:p?null:h.id,command:i,wallMs:r}),t={command:i,sessionId:p?null:h.id,exited:p,exitCode:p?q:null};return e&&e({content:[{type:"text",text:s}],details:t}),{content:[{type:"text",text:s}],details:t}}}),c=(0,g.defineTool)({name:"bash_io",label:"Interact with Background Process",description:'Interact with a background process started by bash. Can write text to the process\'s stdin, send Ctrl-C (use "\\u0003" as chars), or poll for new output (leave chars empty). Always waits yield_time_ms (default 5s) to collect output before returning. Use this to monitor long-running tasks, respond to prompts, or send additional commands.',parameters:h.ZUJ.Object({session_id:h.ZUJ.Integer({description:"The session_id returned by bash for the running process."}),chars:h.ZUJ.Optional(h.ZUJ.String({description:'Text to write to the process\'s stdin. Use "\\u0003" (Ctrl-C) to interrupt. Leave empty to just poll for output (no write). Defaults to empty.'})),yield_time_ms:h.ZUJ.Optional(h.ZUJ.Integer({description:"Milliseconds to wait for output after writing/polling (default: 5000, range: 250-30000)."}))}),promptSnippet:"bash_io(session_id, chars?, yield_time_ms?): poll or send input to a bash process",promptGuidelines:["`bash_io` interacts with a background process started by `bash` using its `session_id`.","Poll with empty `chars` to collect new output since the last poll.","Send input via `chars`; use `\\u0003` for Ctrl-C to interrupt the process.","If the process exited, `bash_io` reports the exit code and the process is cleaned up."],async execute(b,c,d,e){let f=c.session_id,g=c.chars??"",h=c.yield_time_ms?l(c.yield_time_ms,g?250:5e3):5e3,i=Date.now(),j=a.get(f);if(!j)throw Error(`No background process with session_id ${f}. The process may have exited and been cleaned up, or the ID is invalid. Use bash to start a new process.`);if(e){let a=""===g?"polling":"\x03"===g?"interrupting":"writing to";e({content:[{type:"text",text:`${a} process ${f} ($ ${j.command})`}],details:{sessionId:f,command:j.command,action:a}})}if(""!==g){let b=a.writeStdin(f,g);if(!b.ok)throw Error(b.error??"bash_io failed");await k(100)}let{output:n,exited:o,exitCode:p}=await a.poll(f,h),q=Date.now()-i;o&&a.remove(f);let r=m({output:n,exited:o,exitCode:p,sessionId:o?null:f,wallMs:q}),s={sessionId:o?null:f,exited:o,exitCode:o?p:null};return e&&e({content:[{type:"text",text:r}],details:s}),{content:[{type:"text",text:r}],details:s}}});return[b,c]}d()}catch(a){d(a)}})},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.
15
18
 
16
19
  Available agent types:
17
- ${(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,{$9:()=>h,J1:()=>i});var e=c(75430),f=c(76760),g=a([e]);function h(a,b=process.platform){let c={...a};for(let a of Object.keys(c))(function(a,b){let c="win32"===b?a.toUpperCase():a;return"PORT"===c||"NODE_ENV"===c||c.startsWith("NEXT_")})(a,b)&&delete c[a];return c}function i(a={}){let{agentBinDir:b=(0,f.join)((0,e.getAgentDir)(),"bin"),baseEnvironment:c=process.env,localOperations:d=(0,e.createLocalBashOperations)({shellPath:a.shellPath}),platform:g=process.platform}=a;return{exec(a,e,f){var i;let j,k,l,m=(i=h(f.env??c,g),j="win32"===g?Object.keys(i).find(a=>"PATH"===a.toUpperCase())??"PATH":"PATH",k="win32"===g?";":":",(l=i[j]??"").split(k).filter(Boolean).includes(b)||(i[j]=[b,l].filter(Boolean).join(k)),i);return d.exec(a,e,{...f,env:m})}}}e=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},56429:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{$Z:()=>R,A4:()=>L,Bp:()=>S,C4:()=>O,Fn:()=>P,HG:()=>U,OF:()=>aa,Zo:()=>W,_I:()=>M,d_:()=>V,iP:()=>$,l8:()=>Y,oA:()=>N,wW:()=>X,x8:()=>T});var e=c(75430),f=c(29862),g=c(55511),h=c(29021),i=c(33873),j=c(78970),k=c(43671),l=c(28967),m=c(18904),n=c(72498),o=c(40402),p=c(46753),q=c(7048),r=c(21560),s=c(95412),t=c(12568),u=c(27367),v=c(305),w=c(78963),x=c(53303),y=c(30590),z=c(64735),A=c(36193),B=c(67264),C=c(71069),D=c(11301),E=c(4504),F=c(44271),G=a([e,f,m,n,o,p,q,t,u,v,w,x,z,D,F]);[e,f,m,n,o,p,q,t,u,v,w,x,z,D,F]=G.then?(await G)():G;let ab=new Set(["off","minimal","low","medium","high","xhigh","max"]),ac=new Set(["agent_start","message_start","message_update","message_end","agent_end","entry_appended","session_info_changed","queue_update","prompt_done","agent_settled","auto_compaction_end","compaction_end"]),ad=function(a=process.env.PI_WEB_IDLE_TIMEOUT_MS){let b=(a??"").trim();if(""===b)return 6e5;let c=Number(b);return!Number.isFinite(c)||c<0||!Number.isInteger(c)||c>0x7fffffff?(console.warn(`[pi-web] invalid PI_WEB_IDLE_TIMEOUT_MS "${a}", falling back to 600000ms`),6e5):c}(),ae=new Set(["fork","clone"]),af=new Set(["get_state","abort","steer","follow_up_draft"]),ag=["read","bash","powershell","edit","write","grep","find","ls"];class ah extends e.Theme{constructor(){super({muted:"",text:"",thinkingXhigh:"",searchMatchText:""},{selectedBg:""},"truecolor")}fg(...[,a]){return a}bg(...[,a]){return a}bold(a){return a}italic(a){return a}underline(a){return a}inverse(a){return a}strikethrough(a){return a}getFgAnsi(){return""}getBgAnsi(){return""}getThinkingBorderColor(){return a=>a}getBashModeBorderColor(){return a=>a}}let ai=new ah,aj=new f.KeybindingsManager(f.TUI_KEYBINDINGS);function H(a,b){if(0===b.length)return[];let c=new Set(ag),d=(0,v.wQ)(b,a.settingsManager.getDefaultTools()),e=a.getAllTools().map(a=>a.name).filter(a=>!c.has(a));return(0,w.H4)([...new Set([...d,...e])],(0,w.t0)())}class ak{constructor(a,b=""){this.inner=a,this.listeners=[],this.activeToolEvents=new Map,this.pendingUiResponses=new Map,this.pendingUiRequests=new Map,this.activeCustomUis=new Map,this.extensionUiAbortController=new AbortController,this.extensionStatuses=new Map,this.extensionWidgets=new Map,this.promptRunning=!1,this.promptPhase=null,this.extensionsBound=!1,this.extensionBindingPromise=null,this.extensionBindingError=null,this.forceEmptySystemPrompt=!1,this.exactSystemPrompt=null,this.pendingPromptCount=0,this.activeMutatingCommands=0,this.agentRunNeedsCompletion=!1,this.promptAdmissionTail=Promise.resolve(),this.sessionReplacement=null,this.forceShutdownOnIdle=!1,this.unsubscribe=null,this.idleTimer=null,this.subscriberCount=0,this.disposeGraceTimer=null,this.lastActivityAt=Date.now(),this.queueMirror=[],this.queueRecovery=[],this.pendingQueueHints={steer:[],followUp:[]},this.queueMutationTail=Promise.resolve(),this.onDestroyCallback=null,this.shutdownPromise=null,this.sessionShutdownEmitted=!1,this._alive=!0,this.approvalPolicy=(0,A.ni)((0,z.lN)().permissionRules),this.approvalMode=(0,z.lN)().toolApprovalMode,this.pendingApprovals=new Map,this.approvalSeq=0,this.approvalHookInstalled=!1,this.goalEngine=new E.aA,this.goalTokensAccounted=0,this.goalToolCallsAccounted=0,this.goalContinuationInFlight=!1,this.goalContinuationPending=!1,this.goalDriveScheduled=!1,this.wrapperChatOnly=!1,this.wrapperSuppressNotifications=!1,this.cwd="string"==typeof b?b:"";const c="string"==typeof b?{}:b;c.onAgentRunComplete&&(this.onAgentRunComplete=c.onAgentRunComplete),c.suppressCompletionNotifications&&this.setSuppressCompletionNotifications(!0),c.chatOnly&&this.setChatOnly(!0),c.exactSystemPrompt&&(this.exactSystemPrompt=c.exactSystemPrompt(),this.installExactSystemPromptContinuation(),this.applyExactSystemPrompt());const d=(0,z.lN)(a.sessionId);if(this.approvalMode=d.toolApprovalMode,this.approvalPolicy=(0,A.ni)(d.permissionRules),a.sessionFile){const b=(0,E.bo)(a.sessionFile);"idle"!==b.status&&this.goalEngine.hydrate(b)}}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}isAlive(){return this._alive}async waitUntilReady(){}isShuttingDown(){return null!==this.shutdownPromise}whenShutdown(){return this.shutdownPromise}isRunning(){return this._alive&&(this.pendingPromptCount>0||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)}runtimeSnapshot(){let a=this.inner.isStreaming,b=this.promptRunning,c=this.inner.isCompacting,d=this.inner.isBashRunning;return{id:this.sessionId,running:this.isRunning(),isStreaming:a,isPromptRunning:b,isCompacting:c,isBashRunning:d,phase:d?"running_command":this.promptPhase??(a||b||c?"waiting_model":null)}}setChatOnly(a){this.wrapperChatOnly=a}setSuppressCompletionNotifications(a){this.wrapperSuppressNotifications=a}isChatOnly(){return this.wrapperChatOnly}hasSuppressedCompletionNotifications(){return this.wrapperSuppressNotifications}start(){this.installApprovalHook(),this.goalEngine.setOnChanged(a=>{this.sessionFile&&(0,E.eG)(this.sessionFile,a),this.emit({type:"goal_state_changed",goalState:a}),$("goal_state_changed",this.sessionId,{type:"goal_state_changed",goalState:a})}),this.goalEngine.isRunning()&&(this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()),this.unsubscribe=this.inner.subscribe(a=>{("agent_end"===a.type||"message_end"===a.type||"entry_appended"===a.type||"session_info_changed"===a.type)&&(0,o.mD)(),("agent_end"===a.type||"agent_settled"===a.type||"auto_compaction_end"===a.type||"compaction_end"===a.type)&&this.resetIdleTimer(),"agent_start"===a.type&&(this.goalEngine.onAgentStart(),this.agentRunNeedsCompletion=!0),"agent_settled"===a.type&&(this.handleGoalSettled(),this.notifyAgentRunCompleteIfIdle()),"queue_update"===a.type&&this.reconcileQueue(a.steering,a.followUp),ac.has(a.type)&&$(a.type,this.sessionId,a);let b=a.toolCallId;"string"==typeof b&&("tool_execution_start"===a.type||"tool_execution_update"===a.type?this.activeToolEvents.set(b,a):"tool_execution_end"===a.type&&this.activeToolEvents.delete(b)),this.emit(a),Q()}),this.resetIdleTimer()}loadQueueRecovery(){if(!this.sessionFile)return;let a=this.inner.getSteeringMessages(),b=this.inner.getFollowUpMessages();if(a.length||b.length){this.queueRecovery=[],this.reconcileQueue([...a],[...b]);return}this.queueRecovery=(0,k.ov)(this.sessionFile)}getGoalState(){return this.goalEngine.getState()}handleGoalSettled(){if(!this.goalEngine.isRunning()){this.goalEngine.disarmContinuation(),this.goalContinuationPending=!1;return}let a=this.inner.getLastAssistantText()??"",b=this.currentSessionUsageTotal(),c=Math.max(0,b-this.goalTokensAccounted);this.goalTokensAccounted=b;let d=this.currentSessionToolCallTotal(),e=Math.max(0,d-this.goalToolCallsAccounted);this.goalToolCallsAccounted=d;let{verdict:f}=this.goalEngine.settleTurn(a,c,e);if("continue"!==f.action){this.goalEngine.disarmContinuation(),this.goalContinuationPending=!1;return}this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()}maybeDriveGoalContinuation(){if(this.goalContinuationPending&&!this.goalDriveScheduled){if(!this.goalEngine.isRunning()){this.goalContinuationPending=!1;return}this.goalDriveScheduled=!0,setTimeout(()=>{this.goalDriveScheduled=!1,this.tryDriveGoalContinuation()},0)}}cancelGoalContinuation(){this.goalContinuationPending=!1,this.goalEngine.disarmContinuation()}tryDriveGoalContinuation(){if(this.goalContinuationPending){if(!this.goalEngine.isRunning()){this.goalContinuationPending=!1;return}this.goalContinuationInFlight||this.promptRunning||this.inner.isStreaming||this.inner.isBashRunning||(this.goalContinuationPending=!1,this.driveGoalContinuation())}}driveGoalContinuation(){if(!this.goalEngine.isRunning()||this.goalContinuationInFlight)return;this.goalContinuationInFlight=!0,this.promptRunning=!0,this.promptPhase="waiting_model",this.resetIdleTimer(),Q();let a=()=>{this.promptRunning=!1,this.promptPhase=null,this.resetIdleTimer(),Q()};this.acquirePromptAdmission().then(async b=>{try{if(!this.goalEngine.isRunning())return void a();await this.inner.prompt(E.LF),a(),this.emit({type:"prompt_done"}),this.maybeDriveGoalContinuation()}catch(b){a(),this.emit({type:"prompt_error",errorMessage:b instanceof Error?b.message:String(b)})}finally{b(),this.goalContinuationInFlight=!1}})}handleGoalStartCommand(a,b){let c=this.goalEngine.start(a,b);return this.goalTokensAccounted=this.currentSessionUsageTotal(),this.goalToolCallsAccounted=this.currentSessionToolCallTotal(),c}handleGoalStopCommand(){return this.goalEngine.stop(),this.goalTokensAccounted=0,this.goalToolCallsAccounted=0,this.goalEngine.getState()}currentSessionUsageTotal(){try{return function(a){let b=0;for(let c of a){let a=c?.message;if(!a||"assistant"!==a.role)continue;let d=a.usage;d&&(b+=(d.input??0)+(d.output??0)+(d.cacheRead??0)+(d.cacheWrite??0))}return b}(this.inner.sessionManager.getEntries())}catch{return 0}}currentSessionToolCallTotal(){try{return function(a){let b=0;for(let c of a){let a=c?.message;if(!a||"assistant"!==a.role)continue;let d=a.content;if(Array.isArray(d))for(let a of d)a&&"object"==typeof a&&"toolCall"===a.type&&(b+=1)}return b}(this.inner.sessionManager.getEntries())}catch{return 0}}setApprovalMode(a){this.approvalMode=a}setApprovalPolicy(a){this.approvalPolicy=a}installApprovalHook(){if(this.approvalHookInstalled||!this.inner.agent?.beforeToolCall)return;this.approvalHookInstalled=!0;let a=this.inner.agent.beforeToolCall;this.inner.agent.beforeToolCall=async b=>{let c=b.toolCall?.name??"",d=b.args,e=(0,A.LD)(this.approvalPolicy,c,{mode:this.approvalMode,readOnly:B.MJ.has(c.toLowerCase()),args:d});if("deny"===e)return{block:!0,reason:`Denied by policy rule: ${c} is not permitted.`};if("ask"===e){let a=await this.askForApproval(c,d);if(!a.approve)return{block:!0,reason:a.reason||`Rejected by user: ${c}`}}return a?a(b):void 0}}askForApproval(a,b){return new Promise(c=>{let d=`approval-${++this.approvalSeq}`,e=setTimeout(()=>{this.pendingApprovals.delete(d),this.emit({type:"tool_approval_resolved",id:d,approve:!1,reason:`Approval request timed out after 120s: ${a}`}),c({approve:!1,reason:`Approval request timed out after 120s: ${a}`})},12e4);this.pendingApprovals.set(d,{resolve:c,timer:e,toolName:a}),this.emit({type:"tool_approval_request",id:d,toolName:a,args:function(a){if(null===a||"object"!=typeof a)return a;let b={};for(let[c,d]of Object.entries(a))if(null!=d&&"content"!==c&&"data"!==c&&"newString"!==c&&"oldString"!==c){if("string"==typeof d){b[c]=d.length>200?`${d.slice(0,200)}…`:d;continue}if("number"==typeof d||"boolean"==typeof d){b[c]=d;continue}b[c]=Array.isArray(d)?`[array:${d.length}]`:"[object]"}return b}(b)})})}resolveApproval(a,b,c){let d=this.pendingApprovals.get(a);return!!d&&(this.pendingApprovals.delete(a),clearTimeout(d.timer),d.resolve({approve:b,reason:c}),!0)}rejectAllApprovals(a){for(let[b,c]of this.pendingApprovals)this.pendingApprovals.delete(b),clearTimeout(c.timer),c.resolve({approve:!1,reason:a})}getPendingApprovals(){return Array.from(this.pendingApprovals.entries()).map(([a,b])=>({id:a,toolName:b.toolName}))}pendingRecoveryView(){return this.queueRecovery.map(({id:a,kind:b,text:c,images:d,queuedAt:e})=>({id:a,kind:b,text:c,hasImages:!!d?.length,queuedAt:e}))}persistQueue(){if(!this.sessionFile)return;let a=[...this.queueRecovery,...this.queueMirror];a.length?(0,k.pj)(this.sessionFile,a):(0,k.wx)(this.sessionFile)}hintQueueImages(a,b){this.pendingQueueHints[a].push(b?.length?b:[])}reconcileQueue(a,b){let c=(a,b)=>{if(!b)return this.queueMirror.filter(b=>b.kind===a);let c=new Set;return b.map(b=>{let d=this.queueMirror.find(d=>d.kind===a&&d.text===b&&!c.has(d));if(d)return c.add(d),d;let e=(0,k.Gc)(a,b,this.pendingQueueHints[a].shift());return c.add(e),e})};this.queueMirror=[...c("steer",a),...c("followUp",b)],this.persistQueue()}validateImagesSupportedByCurrentModel(){let a=this.inner.model;return!a?.id||Array.isArray(a.input)&&a.input.includes("image")?null:`Model "${a.id}" does not accept image input. Switch to a model with image support.`}async requeueEntry(a){let b=(0,j.kc)(a.images);if(b)throw Error(b);if(a.images?.length){let a=this.validateImagesSupportedByCurrentModel();if(a)throw Error(a)}this.hintQueueImages(a.kind,a.images),"steer"===a.kind?await this.inner.steer(a.text,a.images):await this.inner.followUp(a.text,a.images)}ensureMirrored(a){this.queueMirror.find(b=>b.kind===a.kind&&b.text===a.text)||(this.queueMirror.push({...a}),this.pendingQueueHints[a.kind].pop())}async replaceLiveQueue(a,b){for(let b of(this.inner.clearQueue(),this.pendingQueueHints={steer:[],followUp:[]},a))await this.requeueEntry(b);for(let a of b)await this.requeueEntry(a);let c={steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]};return this.reconcileQueue(c.steering,c.followUp),c}async withQueueMutation(a){let b,c=this.queueMutationTail;this.queueMutationTail=new Promise(a=>{b=a}),await c;try{return await a()}finally{b()}}async mutateLiveQueue(a,b){return this.withQueueMutation(async()=>{let c=this.queueMirror.filter(a=>"steer"===a.kind),d=this.queueMirror.filter(a=>"followUp"===a.kind),e=b("steer"===a?c:d),f=await this.replaceLiveQueue(c,d);return{value:e,queues:f}})}validateQueueEntries(a){for(let b of a){if("steer"!==b.kind&&"followUp"!==b.kind||"string"!=typeof b.text)continue;let a=(0,j.kc)(b.images);if(a)throw Error(a)}}runAgentContinue(){if(this.inner.isStreaming||this.inner.isBashRunning||this.promptRunning)return;let a=[...this.queueMirror];0!==a.length&&(this.queueMirror=[],this.persistQueue(),this.promptRunning=!0,this.promptPhase="waiting_model",this.bootstrapQueuedRun(a))}async bootstrapQueuedRun(a){for(let b of(this.inner.clearQueue(),this.pendingQueueHints={steer:[],followUp:[]},a))try{await this.inner.prompt(b.text,b.images?.length?{images:b.images}:void 0)}catch(a){this.promptRunning=!1,this.promptPhase=null,this.resetIdleTimer(),(0,o.mD)(),this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),this.emit({type:"prompt_done"});return}this.promptRunning=!1,this.promptPhase=null,this.resetIdleTimer(),this.emit({type:"prompt_done"})}setForceEmptySystemPrompt(a){this.forceEmptySystemPrompt=a,this.applyForcedEmptySystemPrompt()}setExactSystemPrompt(a){this.exactSystemPrompt=a,this.applyExactSystemPrompt()}beginExtensionBinding(a={}){this.ensureExtensionsBound(a).catch(a=>{console.error("[pi-web] failed to dispatch session_start to extensions:",a instanceof Error?a.message:a)})}ensureExtensionsBound(a={}){return(a.forceEmptySystemPrompt&&(this.forceEmptySystemPrompt=!0),this.extensionsBound)?(this.applyExactSystemPrompt(),Promise.resolve()):(this.extensionBindingPromise||(this.extensionBindingError=null,this.extensionBindingPromise=(async()=>{if(!this._alive)return;let a=this.createExtensionUiContext();if("function"==typeof this.inner.bindExtensions){let b=this.inner.bindExtensions;await b.call(this.inner,{uiContext:a,mode:"rpc",commandContextActions:this.createExtensionCommandContextActions(),shutdownHandler:()=>this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",notifyType:"warning",message:"Extension requested shutdown, but shutdown is not supported in pi-web."}),onError:a=>this.emit({type:"extension_error",extensionPath:a.extensionPath,event:a.event,error:a.error})})}else this.inner.extensionRunner.setUIContext?.(a,"rpc");this.extensionsBound=!0,this.applyExactSystemPrompt(),console.log(`[pi-web] session_start dispatched to extensions for session ${this.inner.sessionId}`)})().catch(a=>{throw this.extensionBindingError=a,a})),this.extensionBindingPromise)}static{this.EXTENSION_BIND_TIMEOUT_MS=15e3}async waitForExtensionsBound(){let a=this.extensionBindingPromise;if(a)try{let b=new Promise((b,c)=>{let d=setTimeout(()=>c(Error("Extension binding timed out; continuing without waiting")),ak.EXTENSION_BIND_TIMEOUT_MS);a.finally(()=>clearTimeout(d))});await Promise.race([a,b])}catch{}this.extensionBindingError&&console.warn("[pi-web] extension binding failed, continuing:",this.extensionBindingError)}shouldWaitForExtensions(a){return"prompt"===a||"steer"===a||"follow_up"===a||"get_commands"===a||"get_state"===a}applyForcedEmptySystemPrompt(){this.inner.agent.state&&(this.forceEmptySystemPrompt?this.inner.agent.state.systemPrompt="":null!==this.exactSystemPrompt&&(this.inner.agent.state.systemPrompt=this.exactSystemPrompt))}applyExactSystemPrompt(){!this.forceEmptySystemPrompt&&null!==this.exactSystemPrompt&&this.inner.agent.state&&(this.inner.agent.state.systemPrompt=this.exactSystemPrompt)}emit(a){for(let b of this.listeners)try{b(a)}catch(a){console.error(`[pi-web] session ${this.sessionId} event listener threw:`,a instanceof Error?a.message:a)}}installExactSystemPromptContinuation(){if(!this.exactSystemPrompt)return;let a=this.inner.agent,b=a.prepareNextTurnWithContext;a.prepareNextTurnWithContext=async(a,c)=>{let d=await b?.(a,c);return{...d,context:{...d?.context??a.context,systemPrompt:this.exactSystemPrompt}}}}setActiveToolSelection(a){this.inner.setActiveToolsByName(H(this.inner,a)),this.applyExactSystemPrompt()}async acquirePromptAdmission(){let a,b=this.promptAdmissionTail;return this.promptAdmissionTail=new Promise(b=>{a=b}),await b,a}notifyAgentRunCompleteIfIdle(){if(!(!this.agentRunNeedsCompletion||this.isRunning())&&(this.agentRunNeedsCompletion=!1,!this.wrapperSuppressNotifications))try{this.onAgentRunComplete?.(this.sessionId)}catch(a){console.error("[pi-web] completion listener failed:",a instanceof Error?a.message:a)}}resetIdleTimer(){this.idleTimer&&clearTimeout(this.idleTimer),this._alive&&0!==ad&&(this.isRunning()||(this.forceShutdownOnIdle=!1),this.idleTimer=setTimeout(()=>{!this.forceShutdownOnIdle&&(this.isRunning()||(0,s.Vj)({sessionId:this.sessionId,sessionFile:this.sessionFile||void 0}))?this.resetIdleTimer():this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down idle session:",a instanceof Error?a.message:a)})},ad))}touch(){this.lastActivityAt=Date.now(),this.cancelPendingDispose()}hasSubscribers(){return this.subscriberCount>0}get activityTimestamp(){return this.lastActivityAt}cancelPendingDispose(){this.disposeGraceTimer&&(clearTimeout(this.disposeGraceTimer),this.disposeGraceTimer=null)}scheduleDisposeIfIdle(){this.cancelPendingDispose(),!(this.subscriberCount>0||this.isRunning())&&this._alive&&(this.disposeGraceTimer=setTimeout(()=>{this.disposeGraceTimer=null,!(this.subscriberCount>0||this.isRunning())&&this._alive&&this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down unwatched session:",a instanceof Error?a.message:a)})},6e4))}persistSessionFileIfMissing(){let a=this.inner.sessionManager,b=a.getSessionFile();if(!b||(0,h.existsSync)(b))return;let c=a.getHeader();if(!c)return;let d=[c,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";try{(0,h.writeFileSync)(b,d,{encoding:"utf8",flag:"wx"})}catch(c){if("EEXIST"===c.code||(0,h.existsSync)(b)){a.flushed=!0,(0,o.O8)(this.inner.sessionId,b);return}throw c}a.flushed=!0,(0,o.O8)(this.inner.sessionId,b)}onEvent(a){for(let b of(this.listeners.push(a),this.subscriberCount+=1,this.cancelPendingDispose(),this.pendingUiRequests.values()))a(b);for(let b of this.activeToolEvents.values())a(b);return()=>{let b=this.listeners.indexOf(a);-1!==b&&this.listeners.splice(b,1),this.subscriberCount>0&&(this.subscriberCount-=1),this.scheduleDisposeIfIdle()}}onDestroy(a){this.onDestroyCallback=a}async withSessionReplacement(a,b){if(this.sessionReplacement)throw Error("Session is already being copied");this.sessionReplacement=a;try{return await b()}finally{this._alive&&(this.sessionReplacement=null)}}isSessionRunningForReplacement(){return this.inner.isBashRunning||this.inner.isStreaming||this.inner.isCompacting||this.pendingPromptCount>0}async shutdownAfterSessionReplacement(a){try{await this.shutdown()}catch(b){console.error(`[pi-web] ${a} succeeded, but source session shutdown failed:`,b instanceof Error?b.message:b)}}async send(a){if(!this._alive)throw Error("Session is shutting down");this.touch(),this.resetIdleTimer();let b=a.type;if("prompt"===b||"steer"===b||"follow_up"===b||"requeue_at"===b){let b=(0,j.kc)(a.images);if(b)throw Error(b);if(Array.isArray(a.images)&&a.images.length>0){let a=this.validateImagesSupportedByCurrentModel();if(a)throw Error(a)}}let c=af.has(b);if(this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if(ae.has(b)&&this.activeMutatingCommands>0)throw Error(`Cannot ${b} while another session command is running`);this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound();let d=!c;d&&(this.activeMutatingCommands+=1);try{if("get_state"!==b&&this.resetIdleTimer(),this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound(),this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if("prompt"===b||"steer"===b||"follow_up"===b){let b=(0,j.kc)(a.images);if(b)throw Error(b)}switch(b){case"prompt":{let b=await this.acquirePromptAdmission();try{let b,c,d;if(this.inner.isBashRunning)throw Error("Cannot send a prompt while a shell command is running");this.extensionUiAbortController.signal.aborted&&(this.extensionUiAbortController=new AbortController);let e=a.images,f=a.streamingBehavior;f&&this.inner.isStreaming&&this.hintQueueImages("followUp"===f?"followUp":"steer",e);let g=!1,h=!1,i=!1,j=new Promise((a,d)=>{b=()=>{g=!0,this.agentRunNeedsCompletion=!0,h||(h=!0,a())},c=a=>{h||(h=!0,d(a))}}),k=()=>{i||(i=!0,this.pendingPromptCount=Math.max(0,this.pendingPromptCount-1),this.resetIdleTimer(),this.notifyAgentRunCompleteIfIdle())};this.pendingPromptCount+=1,this.promptRunning=!0,this.promptPhase=String(a.message??"").trimStart().startsWith("/")?"running_command":"waiting_model",Q();try{d=this.inner.prompt(a.message,{...e?.length?{images:e}:{},...f?{streamingBehavior:f}:{},source:"rpc",preflightResult:a=>{a&&(this.applyExactSystemPrompt(),b())}})}catch(a){throw k(),a}return d.then(()=>{b(),k(),this.promptRunning=!1,this.promptPhase=null,f||this.emit({type:"prompt_done"}),Q(),this.maybeDriveGoalContinuation()},a=>{c(a),k(),this.promptRunning=!1,this.promptPhase=null,(0,o.mD)(),g&&(this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),f||this.emit({type:"prompt_done"})),Q(),this.maybeDriveGoalContinuation()}).catch(a=>{console.error("[pi-web] prompt completion handler failed:",a instanceof Error?a.message:a)}),await j,null}finally{b()}}case"abort":this.forceShutdownOnIdle=!0,this.extensionUiAbortController.abort(new DOMException("Extension UI cancelled by Stop","AbortError"));try{await this.inner.abort()}finally{this.resetIdleTimer(),this.isRunning()||(this.forceShutdownOnIdle=!1)}return null;case"get_state":{let a=this.inner.model,b=this.inner.getContextUsage();return{sessionId:this.inner.sessionId,sessionFile:this.inner.sessionFile??"",isStreaming:this.inner.isStreaming,isPromptRunning:this.pendingPromptCount>0,isBashRunning:this.inner.isBashRunning,isCompacting:this.inner.isCompacting,phase:this.runtimeSnapshot().phase,model:a?{id:a.id,provider:a.provider}:void 0,messageCount:0,pendingMessageCount:this.inner.pendingMessageCount,queuedMessages:{steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]},pendingRecovery:this.pendingRecoveryView(),contextUsage:b?{percent:b.percent,contextWindow:b.contextWindow,tokens:b.tokens}:null,systemPrompt:this.inner.agent.state?.systemPrompt??"",thinkingLevel:this.inner.agent.state?.thinkingLevel??"off",extensionStatuses:this.getExtensionStatuses(),extensionWidgets:this.getExtensionWidgets(),goalState:this.goalEngine.getState()}}case"goal_start":{let b=String(a.goalText??"").trim();if(!b)throw Error("goal_start requires a non-empty goalText");let c=a.tokenBudget,d="number"==typeof c&&Number.isFinite(c)&&c>0?Math.floor(c):null,e=this.handleGoalStartCommand(b,d);return this.goalContinuationPending=!0,this.maybeDriveGoalContinuation(),{goalState:e}}case"goal_pause":return this.cancelGoalContinuation(),{goalState:this.goalEngine.pause()};case"goal_resume":{let a=this.goalEngine.resume();return"running"===a.status&&(this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()),{goalState:a}}case"goal_stop":return this.cancelGoalContinuation(),{goalState:this.handleGoalStopCommand()};case"goal_edit":{let b=String(a.goalText??"").trim();if(!b)throw Error("goal_edit requires a non-empty goalText");let c=this.goalEngine.edit(b);return"running"===c.status&&(this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()),{goalState:c}}case"get_goal_state":return{goalState:this.goalEngine.getState()};case"set_model":{let{provider:b,modelId:c}=a,d=this.inner.modelRuntime.getModel(b,c);if(!d)try{await this.inner.modelRuntime.refresh({allowNetwork:!1}),d=this.inner.modelRuntime.getModel(b,c)}catch{d=void 0}if(!d)throw Error(`Model not found: ${b}/${c}`);return await this.inner.setModel(d),(0,l.k)(),(0,o.mD)(),{id:d.id,provider:d.provider}}case"fork":{let b,c,d=a.entryId,f=this.inner.sessionManager,g=this.inner.sessionFile;if(!f.isPersisted())return{cancelled:!0};if(!g)throw Error("Persisted session is missing a session file");let i=f.getEntry(d);if(!i)throw Error("Invalid entry ID for forking");let j=f.getSessionDir();if(i.parentId){let a=(c=e.SessionManager.open(g,j)).createBranchedSession(i.parentId);if(!a)throw Error("Failed to create forked session");b=a}else b=(c=e.SessionManager.create(f.getCwd(),j,{parentSession:g})).getSessionFile();if(!(0,h.existsSync)(b)){let a=c.getHeader();if(!a)throw Error("Forked session is missing a session header");let d=[a,...c.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,h.writeFileSync)(b,d,{encoding:"utf8",flag:"wx"})}let k=c.getSessionId();return(0,o.O8)(k,b),(0,o.mD)(),{cancelled:!1,newSessionId:k}}case"clone":{if(this.isSessionRunningForReplacement())throw Error("Cannot clone while the session is running");let b=this.inner.sessionManager,c=this.inner.sessionFile,d="string"==typeof a.leafId?a.leafId:b.getLeafId(),f=d&&b.getBranch(d).some(a=>"message"===a.type&&"assistant"===a.message.role);if(!b.isPersisted()||!d||!f||!c||!(0,h.existsSync)(c))return{cancelled:!0};return this.withSessionReplacement("clone",async()=>{let a=b.getSessionDir(),f=e.SessionManager.open(c,a).createBranchedSession(d);if(!f||!(0,h.existsSync)(f))throw Error("Failed to clone current session branch");let g=e.SessionManager.open(f,a).getSessionId();return(0,o.O8)(g,f),(0,o.mD)(),await this.shutdownAfterSessionReplacement("clone"),{cancelled:!1,newSessionId:g}})}case"navigate_tree":return{cancelled:(await this.inner.navigateTree(a.targetId,{})).cancelled};case"set_thinking_level":{let b=a.level;return this.inner.setThinkingLevel(b),"xhigh"===b&&this.inner.model?.compat?.thinkingFormat==="deepseek"&&this.inner.agent?.state&&(this.inner.agent.state.thinkingLevel="xhigh"),(0,o.mD)(),null}case"compact":try{return await this.inner.compact(a.customInstructions)}finally{(0,o.mD)()}case"set_session_name":{let b=a.name?.trim();if(!b)throw Error("Session name cannot be empty");return this.inner.setSessionName(b),(0,o.mD)(),null}case"get_session_stats":return{...this.inner.getSessionStats(),sessionName:this.inner.sessionManager.getSessionName()};case"get_last_assistant_text":return{text:this.inner.getLastAssistantText()??""};case"clear_queue":return this.withQueueMutation(async()=>(this.queueMirror=[],this.pendingQueueHints={steer:[],followUp:[]},this.persistQueue(),this.inner.clearQueue()));case"move_queue":{let b=a.kind,c=Number(a.fromIndex),d=Number(a.toIndex);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c)||!Number.isInteger(d))throw Error("move_queue requires a queue kind and integer indexes");let{queues:e}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length||d<0||d>=a.length)throw Error("move_queue index out of range");let[b]=a.splice(c,1);a.splice(d,0,b)});return e}case"recall_queue_item":{let b=a.kind,c=Number(a.index);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c))throw Error("recall_queue_item requires a queue kind and integer index");let{value:d,queues:e}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length)throw Error("recall_queue_item index out of range");let[b]=a.splice(c,1);return b});return{entry:{text:d.text,images:d.images??[]},...e}}case"requeue_at":{let b=a.kind,c=Number(a.index),d=a.text;if("steer"!==b&&"followUp"!==b||!Number.isInteger(c)||!d?.trim())throw Error("requeue_at requires a queue kind, integer index, and text");let e=a.images,{queues:f}=await this.mutateLiveQueue(b,a=>{if(c<0||c>a.length)throw Error("requeue_at index out of range");a.splice(c,0,(0,k.Gc)(b,d,e))});return f}case"remove_queue_item":{let b=a.kind,c=Number(a.index);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c))throw Error("remove_queue_item requires a queue kind and integer index");let{queues:d}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length)throw Error("remove_queue_item index out of range");a.splice(c,1)});return d}case"resolve_recovery":return this.withQueueMutation(async()=>{let b=new Set(a.keep??[]),c=new Set(a.discard??[]),d=!0===a.continueRun,e=0;for(let a of this.queueRecovery)b.has(a.id)&&(await this.requeueEntry(a),this.ensureMirrored(a),e+=1);return this.queueRecovery=this.queueRecovery.filter(a=>!b.has(a.id)&&!c.has(a.id)),this.persistQueue(),d&&e>0&&this.runAgentContinue(),{remaining:this.pendingRecoveryView(),kept:e}});case"export_queue":return{live:this.queueMirror.map(a=>({...a})),recovery:this.queueRecovery.map(a=>({...a}))};case"import_queue":return this.withQueueMutation(async()=>{let b=a.entries;if(!Array.isArray(b))throw Error("import_queue requires entries[]");this.validateQueueEntries(b);let c=0;for(let a of b){if("steer"!==a.kind&&"followUp"!==a.kind||"string"!=typeof a.text)continue;let b=(0,k.Gc)(a.kind,a.text,a.images);await this.requeueEntry(b),this.ensureMirrored(b),c+=1}return this.persistQueue(),{imported:c,steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]}});case"stage_recovery":return this.withQueueMutation(async()=>{let b=a.entries;if(!Array.isArray(b))throw Error("stage_recovery requires entries[]");this.validateQueueEntries(b);let c=0;for(let a of b)("steer"===a.kind||"followUp"===a.kind)&&"string"==typeof a.text&&(this.queueRecovery.push((0,k.Gc)(a.kind,a.text,a.images)),c+=1);return this.persistQueue(),{staged:c,pendingRecovery:this.pendingRecoveryView()}});case"steer":{let b=a.images;this.hintQueueImages("steer",b),this.promptPhase="waiting_model",Q();try{await this.inner.steer(a.message,b?.length?b:void 0)}finally{this.promptPhase=null,Q()}return null}case"follow_up":{let b=a.images;this.hintQueueImages("followUp",b),this.promptPhase="waiting_model",Q();try{await this.inner.followUp(a.message,b?.length?b:void 0)}finally{this.promptPhase=null,Q()}return null}case"get_tools":{let a=this.inner.getAllTools(),b=new Set(this.inner.getActiveToolNames());return a.map(a=>({...a,active:b.has(a.name)}))}case"get_commands":{let a=[];for(let b of this.inner.extensionRunner.getRegisteredCommands())a.push({name:b.invocationName,description:b.description,source:"extension",sourceInfo:b.sourceInfo});for(let b of this.inner.promptTemplates)a.push({name:b.name,description:b.description,source:"prompt",sourceInfo:b.sourceInfo});for(let b of this.inner.resourceLoader.getSkills().skills)a.push({name:`skill:${b.name}`,description:b.description,source:"skill",sourceInfo:b.sourceInfo});return{commands:a}}case"set_tools":{let b=a.toolNames;return this.setActiveToolSelection(b),null}case"reload":{let a=this.inner.getActiveToolNames();return await this.waitForExtensionsBound(),this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.syncProjectTrust(),await this.inner.reload(),this.inner.setActiveToolsByName(H(this.inner,a)),"function"!=typeof this.inner.bindExtensions&&this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc"),this.applyForcedEmptySystemPrompt(),{success:!0}}case"abort_compaction":return this.inner.abortCompaction(),null;case"resolve_approval":return{resolved:this.resolveApproval(a.id,!!a.approve,a.reason)};case"set_approval_mode":{let b=a.mode;if("ask"!==b&&"auto"!==b&&"yolo"!==b)throw Error(`Invalid approval mode: ${String(b)}`);return this.setApprovalMode(b),null}case"set_approval_policy":{let b=a.policy;return this.setApprovalPolicy((0,A.ni)(b)),null}case"get_approval_state":return{mode:this.approvalMode,pending:this.getPendingApprovals()};case"extension_ui_response":return this.resolveExtensionUiResponse(a),null;case"extension_ui_input":return this.handleExtensionUiInput(a.id,a.data),null;case"bash":{if(this.promptRunning||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)throw Error("Cannot run a shell command while the session is busy");let b=this.inner.settingsManager?.getShellPath?.(),c=(0,x.J1)("string"==typeof b&&b?{shellPath:b}:{}),d=this.inner.executeBash(a.command,void 0,{excludeFromContext:a.excludeFromContext,operations:c});try{let a=await d;return this.persistSessionFileIfMissing(),a}finally{this.resetIdleTimer(),(0,o.mD)()}}case"abort_bash":return this.forceShutdownOnIdle=!0,this.inner.abortBash(),Q(),null;default:throw Error(`Unsupported command: ${b}`)}}finally{d&&(this.activeMutatingCommands=Math.max(0,this.activeMutatingCommands-1))}}destroy(){if(!this._alive)return;for(let a of(this._alive=!1,this.idleTimer&&clearTimeout(this.idleTimer),this.cancelPendingDispose(),this.inner.isBashRunning&&this.inner.abortBash(),this.unsubscribe?.(),this.sessionFile&&this.goalEngine.hasActiveGoal()&&(0,E.eG)(this.sessionFile,this.goalEngine.getState()),this.pendingUiResponses.values()))a.cancel();for(let a of Array.from(this.activeCustomUis.keys()))this.closeCustomUi(a,void 0);this.pendingUiResponses.clear(),this.pendingUiRequests.clear(),this.activeToolEvents.clear(),this.rejectAllApprovals("Session closed while approval was pending");let a=()=>{try{this.inner.dispose()}finally{try{this.onDestroyCallback?.()}finally{Q()}}};if(this.sessionShutdownEmitted)return void a();this.sessionShutdownEmitted=!0;let b=this.inner.extensionRunner?.emit;"function"!=typeof b?a():Promise.resolve().then(()=>b.call(this.inner.extensionRunner,{type:"session_shutdown",reason:"quit"})).catch(a=>{console.error("[pi-web] session_shutdown before dispose failed:",a instanceof Error?a.message:a)}).finally(a)}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)}this.sessionShutdownEmitted||(this.sessionShutdownEmitted=!0,await this.inner.extensionRunner.emit?.({type:"session_shutdown",reason:"quit"}))}finally{this.destroy()}})(),this.shutdownPromise):void 0}resolveExtensionUiResponse(a){let b=this.pendingUiResponses.get(a.id);b&&b.resolve(a)}getExtensionStatuses(){return Array.from(this.extensionStatuses,([a,b])=>({key:a,text:b}))}getExtensionWidgets(){return Array.from(this.extensionWidgets.values())}getCustomUiWidth(a){if(!a||"object"!=typeof a)return C.p1;let b=a.overlayOptions,c="function"==typeof b?b():b;if(!c||"object"!=typeof c)return C.p1;let d=c.width;return"number"==typeof d&&Number.isFinite(d)?Math.max(40,Math.min(140,Math.round(d))):C.p1}emitCustomUiRender(a,b){let c;try{c=b.component.render(b.width)}catch(a){c=[`Extension custom UI render failed: ${a instanceof Error?a.message:String(a)}`]}let d={type:"extension_ui_request",id:a,method:"custom",lines:c};this.pendingUiRequests.set(a,d),this.emit(d)}closeCustomUi(a,b){let c=this.activeCustomUis.get(a);if(c&&!c.settled){c.settled=!0,this.activeCustomUis.delete(a),this.pendingUiRequests.delete(a);try{c.component.dispose?.()}catch{}this.emit({type:"extension_ui_request",id:a,method:"custom",lines:[],closed:!0}),c.resolve(b)}}handleExtensionUiInput(a,b){let c=this.activeCustomUis.get(a);if(c&&"string"==typeof b)try{c.component.handleInput?.(b),this.activeCustomUis.has(a)&&this.emitCustomUiRender(a,c)}catch(b){this.closeCustomUi(a,void 0),this.emit({type:"extension_error",extensionPath:`custom-ui:${a}`,event:"custom_ui_input",error:b instanceof Error?b.message:String(b)})}}requestExtensionCustomUi(a,b){if("function"!=typeof a)return Promise.resolve(void 0);let c=this.extensionUiAbortController.signal;if(c.aborted)return Promise.reject(c.reason);let d=(0,g.randomUUID)(),e=this.getCustomUiWidth(b);return new Promise((b,f)=>{let g=!1,h=(0,C.TQ)(()=>{let a=this.activeCustomUis.get(d);a&&this.emitCustomUiRender(d,a)},e),i=a=>{g||(g=!0,c.removeEventListener("abort",k),c.aborted?f(c.reason):b(a))},j=a=>{this.activeCustomUis.has(d)?this.closeCustomUi(d,a):i(a)},k=()=>j(void 0);c.addEventListener("abort",k,{once:!0}),Promise.resolve().then(()=>g?void 0:a(h,ai,aj,j)).then(a=>{if(g){try{a?.dispose?.()}catch{}return}if(!a||"object"!=typeof a||"function"!=typeof a.render)return void i(void 0);let b={component:a,width:e,resolve:a=>i(a),settled:!1};this.activeCustomUis.set(d,b),this.emitCustomUiRender(d,b)}).catch(a=>{g||(this.emit({type:"extension_error",extensionPath:`custom-ui:${d}`,event:"custom_ui",error:a instanceof Error?a.message:String(a)}),i(void 0))})})}requestExtensionUi(a,b,c,d,e){if(e?.aborted)return Promise.resolve(b);let f=this.extensionUiAbortController.signal;if(f.aborted)return Promise.reject(f.reason);let h=e?AbortSignal.any([e,f]):f,i=(0,g.randomUUID)(),j={type:"extension_ui_request",id:i,...a,...d?{timeout:d,expiresAt:Date.now()+d}:{}};return new Promise((a,e)=>{let g,k=!1,l=()=>{g&&clearTimeout(g),h.removeEventListener("abort",n),this.pendingUiRequests.delete(i),this.pendingUiResponses.delete(i),this.emit({type:"extension_ui_closed",id:i})},m=b=>{k||(k=!0,l(),f.aborted?e(f.reason):a(b))},n=()=>m(b);d&&(g=setTimeout(()=>m(b),d)),h.addEventListener("abort",n,{once:!0}),this.pendingUiRequests.set(i,j),this.pendingUiResponses.set(i,{resolve:a=>m(c(a)),cancel:()=>m(b)}),this.emit(j)})}createExtensionUiContext(){return{select:(a,b,c)=>this.requestExtensionUi({method:"select",title:a,options:b,...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),confirm:(a,b,c)=>this.requestExtensionUi({method:"confirm",title:a,message:b,...c?.timeout?{timeout:c.timeout}:{}},!1,a=>"confirmed"in a&&a.confirmed,c?.timeout,c?.signal),input:(a,b,c)=>this.requestExtensionUi({method:"input",title:a,...void 0!==b?{placeholder:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),editor:(a,b,c)=>this.requestExtensionUi({method:"editor",title:a,...void 0!==b?{prefill:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),notify:(a,b)=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",message:a,notifyType:b})},onTerminalInput:()=>()=>{},setStatus:(a,b)=>{void 0===b?this.extensionStatuses.delete(a):this.extensionStatuses.set(a,b),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setStatus",statusKey:a,statusText:b})},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:(a,b,c)=>{(void 0===b||Array.isArray(b))&&(void 0===b?this.extensionWidgets.delete(a):this.extensionWidgets.set(a,{key:a,lines:b,placement:c?.placement??"aboveEditor"}),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:b,widgetPlacement:c?.placement}))},setFooter:()=>{},setHeader:()=>{},setTitle:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setTitle",title:a})},custom:(a,b)=>this.requestExtensionCustomUi(a,b),pasteToEditor:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},setEditorText:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},getEditorText:()=>"",addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>void 0,get theme(){return ai},getAllThemes:()=>[],getTheme:()=>void 0,setTheme:()=>({success:!1,error:"Theme switching is not supported in pi-web extension UI yet"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}}}syncProjectTrust(){this.inner.settingsManager.setProjectTrusted((0,n.Y1)(this.cwd,(0,e.getAgentDir)()).trusted)}createExtensionCommandContextActions(){return{waitForIdle:async()=>{let a=this.inner.agent;await a.waitForIdle?.()},newSession:async()=>({cancelled:!0}),fork:async()=>({cancelled:!0}),navigateTree:async(a,b)=>({cancelled:(await this.inner.navigateTree(a,{summarize:b?.summarize})).cancelled}),switchSession:async()=>({cancelled:!0}),reload:async()=>{this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.syncProjectTrust(),await this.inner.reload({beforeSessionStart:()=>{this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc")}}),this.applyExactSystemPrompt()}}}}function I(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let a=()=>Promise.allSettled(Array.from(globalThis.__piSessions?.values()??[],a=>a.shutdown()));process.once("exit",()=>globalThis.__piSessions?.forEach(a=>a.destroy())),process.once("SIGINT",()=>{a().finally(()=>process.exit(130))}),process.once("SIGTERM",()=>{a().finally(()=>process.exit(143))})}return globalThis.__piSessions}function J(a){let b=(0,i.resolve)(a);try{return(0,h.realpathSync)(b)}catch{return b}}function K(){return globalThis.__piStartingSessionCwds||(globalThis.__piStartingSessionCwds=new Map),globalThis.__piStartingSessionCwds}function L(a){return I().get(a)}function M(a){let b=J(a);return!!K().has(b)||Array.from(I().values()).some(a=>J(a.cwd)===b&&a.isRunning())}async function N(a){let b=J(a),c=Array.from(I().values()).filter(a=>J(a.cwd)===b);return await Promise.all(c.map(a=>a.shutdown())),c.length}function O(){let a=[];for(let[b,c]of I()){if(!c.isAlive())continue;let d=c.runtimeSnapshot();d.running&&a.push({...d,id:d.id||b})}return a}function P(a){return globalThis.__piRunningListeners??=new Set,globalThis.__piRunningListeners.add(a),()=>globalThis.__piRunningListeners?.delete(a)}let al="";function Q(){let a=globalThis.__piRunningListeners;if(!a||0===a.size){al="";return}let b=O(),c=JSON.stringify(b);if(c!==al)for(let d of(al=c,a))try{d(b)}catch{}}async function R(a,b,c){let d=(0,r.vw)(c),f=L(a);if(!f?.isAlive()){if(!b)throw Error("Session not found");let c=e.SessionManager.open(b,void 0);if((0,q.ph)(c.getEntries()))throw Error("Subagent tool selection is fixed by its profile");(0,r.b5)(c,d),(0,o.mD)();let f=await aa(a,b,void 0);return{session:f.session,sessionId:f.realSessionId,recreated:!1}}if(f.isRunning())throw Error("Cannot change tools while the session is running");if((0,q.ph)(f.inner.sessionManager.getEntries()))throw Error("Subagent tool selection is fixed by its profile");let i="function"!=typeof f.isChatOnly||"function"!=typeof f.setActiveToolSelection||f.isChatOnly()!==(0===d.length);if((0,r.b5)(f.inner.sessionManager,d),(0,o.mD)(),!i)return f.setActiveToolSelection(d),{session:f,sessionId:a,recreated:!1};let j=f.sessionFile&&(0,h.existsSync)(f.sessionFile)?f.sessionFile:void 0,k=f.cwd,l=f.inner.model,m=f.inner.agent.state?.thinkingLevel;if(await f.shutdown(),j){let b=await aa(a,j,void 0);return{session:b.session,sessionId:b.realSessionId,recreated:!0}}let n=await aa(`__recreate__${(0,g.randomUUID)()}`,"",k,{toolNames:d,...l?{initialModel:{provider:l.provider,modelId:l.id}}:{},allowInitialModelFallback:!0,...m&&ab.has(m)?{thinkingLevel:m}:{}});return{session:n.session,sessionId:n.realSessionId,recreated:!0}}function S(a={}){let b=[];for(let c of I().values()){if("function"!=typeof c.isAlive||!c.isAlive())continue;let d=c.inner?.sessionManager;if(!d)continue;let e=d.getHeader(),f=d.getEntries(),g=f.filter(a=>"message"===a.type),i=g.find(a=>"user"===a.message.role),j=d.getSessionFile()??c.sessionFile,k=!!(j&&(0,h.existsSync)(j)),l=(0,q.$u)(f,e?.id??c.sessionId,j??"");if(!k&&!a.includeTransient&&(!c.isRunning()||!i))continue;let m=e?.timestamp??f[0]?.timestamp??new Date().toISOString(),n=new Date(m).getTime(),o=Number.isNaN(n)?Date.now():n;for(let a of g){let b=function(a){if("user"!==a.message.role&&"assistant"!==a.message.role)return;if("number"==typeof a.message.timestamp)return a.message.timestamp;let b=new Date(a.timestamp).getTime();return Number.isNaN(b)?void 0:b}(a);void 0!==b&&(o=Math.max(o,b))}b.push({path:j??"",id:e?.id??c.sessionId,cwd:e?.cwd??c.cwd,name:d.getSessionName(),created:m,modified:new Date(o).toISOString(),messageCount:g.length,firstMessage:i&&function(a){if("bashExecution"===a.message.role)return"";let b=a.message.content;return"string"==typeof b?b:b.map(a=>"text"===a.type?a.text:"").filter(Boolean).join(" ")}(i)||"(no messages)",...l?{parentSessionId:l.parentSessionId,relation:{kind:"subagent",parentSessionId:l.parentSessionId,profile:l.profile,description:l.description,status:c.isRunning()?"running":l.status}}:{},transient:!k})}return b}function T(){let a=new Set;for(let[b,c]of I())c.isRunning()&&c.hasSuppressedCompletionNotifications()&&a.add(c.sessionId||b);return[...a]}function U(){return O().map(a=>a.id)}let am=(0,t.s)({getSession:a=>I().get(a),registerSession:(a,b)=>{let c,d,e;c=new ak(a,a.sessionManager.getCwd()),b?.chatOnly?c.setForceEmptySystemPrompt(!0):b?.exactSystemPrompt&&c.setExactSystemPrompt(b.exactSystemPrompt),c.setChatOnly(!!b?.chatOnly),c.setSuppressCompletionNotifications(!0),c.start(),d=a.sessionId,e=I(),c.onDestroy(()=>e.delete(d)),e.set(d,c)},reopenSession:async(a,b)=>(await aa(a,b,void 0)).session,resolveSessionPath:o.os,invalidateSessionList:o.mD,notifyRunningChange:Q,isBuiltInSubagentsEnabled:u.N});function V(a){return am.get(a)}function W(a,b){return am.steer(a,b)}function X(a){return am.abort(a)}function Y(a){return globalThis.__piSessionBusListeners??=new Set,globalThis.__piSessionBusListeners.add(a),()=>globalThis.__piSessionBusListeners?.delete(a)}!function(){try{let a=(0,u.M6)();if((0,h.existsSync)(a))return;(0,h.mkdirSync)(a.slice(0,a.lastIndexOf("/")),{recursive:!0}),(0,h.writeFileSync)(a,JSON.stringify({builtInEnabled:!0},null,2)+"\n")}catch(a){console.warn("[pi-web] failed to seed agents/settings.json:",a instanceof Error?a.message:a)}}();let an=new Map;function Z(a){let b=globalThis.__piSessionBusListeners;if(b&&0!==b.size)for(let c of b)try{c(a)}catch{}}function $(a,b,c){let d=globalThis.__piSessionBusListeners;if(!d||0===d.size)return;if("message_update"!==a)return void Z({type:a,sessionId:b,payload:c});let e=an.get(b),f={type:a,sessionId:b,payload:c};e?(clearTimeout(e.timer),e.event=f):an.set(b,{event:f,timer:setTimeout(()=>{let a=an.get(b);a&&(an.delete(b),Z(a.event))},80)})}function _(a,b){let c=Date.now(),{provider:d,modelId:e,sessionId:f}=b,g=a.result.bind(a);a.result=async()=>{let a,b,h,i,j,k=await g();return a=Date.now()-c,b="error"===k.stopReason||"aborted"===k.stopReason,h=k.errorMessage?.trim(),j=(i=h?.match(/\bHTTP\s+(\d{3})\b|\bstatus(?:\s+code)?\s*[:=]?\s*(\d{3})\b/))?Number(i[1]??i[2]):void 0,(0,D.wF)({level:b?"error":"info",source:"model-call",provider:d,model:e,sessionId:f,...void 0!==j?{statusCode:j}:{},message:b?`模型调用失败 ${d}/${e}${h?`:${h}`:""}`:`模型调用成功 ${d}/${e}`,details:b?void 0:`耗时 ${a}ms`}),k};let h=a[Symbol.asyncIterator].bind(a);return a[Symbol.asyncIterator]=()=>{let a=h();return{next:()=>a.next().catch(a=>{throw(0,D.wF)({level:"error",source:"model-call",provider:d,model:e,sessionId:f,message:`模型调用传输错误 ${d}/${e}:${a instanceof Error?a.message:String(a)}`}),a})}},a}async function aa(a,b,d,f={}){let g,h,i,j,{toolNames:k,initialModel:r,thinkingLevel:s,allowInitialModelFallback:t}=f,v=I(),w=(globalThis.__piStartLocks||(globalThis.__piStartLocks=new Map),globalThis.__piStartLocks),x=v.get(a);if(x?.isAlive()&&!x.isShuttingDown())return{session:x,realSessionId:a,created:!1};if(x){let a=x.whenShutdown();a&&await Promise.race([a,new Promise(a=>setTimeout(a,1e4))])}let z=w.get(a);if(z)return z;if(b)g=e.SessionManager.open(b,void 0);else{if(!d)throw Error("cwd is required for a new session");g=e.SessionManager.create(d,void 0)}let A=g.getCwd(),B=b?(0,q.ph)(g.getEntries()):null,C=(i=K(),j=J(A),i.set(j,(i.get(j)??0)+1),()=>{let a=(i.get(j)??1)-1;a>0?i.set(j,a):i.delete(j)}),D=new AbortController,E=setTimeout(()=>D.abort(),25e3),G=!1,L=!1,M=()=>{L||(L=!0,C())},N=(async()=>{let b,d=B?.tools??k??[],f=0===d.length;f||(0,e.initTheme)();let h=(0,e.getAgentDir)(),i=B?.tools;B||void 0===k||(i=0===d.length?[]:void 0);let j=B?void 0:(0,n.Fk)(A,h),w=await (0,e.createAgentSessionServices)({cwd:A,agentDir:h,modelRuntimeSignal:D.signal,resourceLoaderOptions:B?{noExtensions:!0,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,appendSystemPrompt:B.appendSystemPrompt}:{extensionFactories:[(0,p.Vj)(am.extensionRuntime,()=>(0,q.IR)(A),u.N)],extensionsOverride:a=>(0,p.U6)(a)},...j?{resourceLoaderReloadOptions:j}:{}}),{createAsyncBashTools:x}=await Promise.resolve().then(c.bind(c,44271)),z=new F.B,C=x(z),E=await (0,m.py)(w.modelRuntime,w.settingsManager.getEnabledModels(),{signal:D.signal}),J=r&&(!t||E.visible.some(a=>a.provider===r.provider&&a.id===r.modelId))?r:void 0,K=w.settingsManager.getDefaultProvider(),L=w.settingsManager.getDefaultModel(),M=g.getBranch(),N=M.some(a=>"message"===a.type),O=N?(0,o.Vg)(M):null,P=O?w.modelRuntime.getModel(O.provider,O.modelId):void 0,Q=N?null:(0,m.IR)(E,{...J?{requestedModel:J}:{},...K&&L?{defaultModel:{provider:K,modelId:L}}:{},...s?{thinkingLevel:s}:{}}),R=P&&w.modelRuntime.hasConfiguredAuth(P.provider)?P:Q?.model,S=!1,T=(0,e.createAgentSessionFromServices)({services:w,sessionManager:g,...R?{model:R}:{},...Q?.thinkingLevel?{thinkingLevel:Q.thinkingLevel}:{},...E.scopedModels.length>0?{scopedModels:[...E.scopedModels]}:{},...void 0!==i?{tools:i}:{},customTools:C}),{session:U}=await Promise.race([T,new Promise((a,c)=>{b=setTimeout(()=>{S=!0,D.abort(),c(Error("Session startup timed out while binding extensions/resources (40s)"))},4e4)})]);clearTimeout(b),T.then(({session:a})=>{if(S)try{a.dispose()}catch{}},()=>{});let V=z.cleanup.bind(z);try{let b=U.agent,c=b.streamFunction;if(b.streamFunction=(b,d,e)=>{let f=c(b,d,e);return f instanceof Promise?f.then(c=>_(c,{provider:b.provider,modelId:b.id,sessionId:a})):_(f,{provider:b.provider,modelId:b.id,sessionId:a})},(await (0,y.o)(w.settingsManager,{...r?{model:r}:{},...s?{thinkingLevel:s}:{}},{...U.model?{model:{provider:U.model.provider,modelId:U.model.id}}:{},thinkingLevel:U.agent.state?.thinkingLevel??"off",supportsThinking:U.supportsThinking()})).modelDefaultChanged&&(0,l.k)(),!B&&k&&k.length>0&&U.setActiveToolsByName(H(U,k)),G){try{U.dispose()}catch{}try{V()}catch{}throw Error("Session startup abandoned after hard timeout")}let d=new ak(U,A);d.setChatOnly(f),d.setSuppressCompletionNotifications(void 0!==B),k?.length===0||B?.tools.length===0?d.setForceEmptySystemPrompt(!0):B&&B.appendSystemPrompt.length>0&&d.setExactSystemPrompt(B.appendSystemPrompt[0]),d.start(),d.loadQueueRecovery();let e=U.sessionId,g=U.sessionFile;return g&&(0,o.O8)(e,g),d.persistSessionFileIfMissing(),d.onDestroy(()=>{V(),v.get(e)===d&&v.delete(e)}),v.set(e,d),d.beginExtensionBinding({forceEmptySystemPrompt:k?.length===0}),!function(){let a=I();if(a.size<=12)return;let b=Array.from(a.entries()).filter(([,a])=>a.isAlive()&&!a.isRunning()&&!a.hasSubscribers()).sort((a,b)=>a[1].activityTimestamp-b[1].activityTimestamp),c=a.size-12;for(let[d,e]of b){if(c<=0)break;a.has(d)&&(console.log(`[pi-web] evicting idle unwatched session ${d} (registry cap 12)`),e.shutdown().catch(a=>{console.error(`[pi-web] failed to evict session ${d}:`,a instanceof Error?a.message:a)}),c-=1)}}(),{session:d,realSessionId:e,created:!0}}catch(a){try{U.dispose()}catch{}try{V()}catch{}throw a}})().finally(()=>{clearTimeout(E),clearTimeout(h),w.delete(a),M()}),O=Promise.race([N,new Promise((b,c)=>{h=setTimeout(()=>{G=!0,D.abort(),w.delete(a),M(),c(Error("Session startup timed out after 60s (extension/resource binding may be hung); the start lock was released — retry the request to start over."))},6e4)})]);return N.then(()=>{},()=>{}),w.set(a,O),O}d()}catch(a){d(a)}})},64735:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{S3:()=>k,lN:()=>j});var e=c(6999),f=c(67264),g=c(36193),h=a([e]);e=(h.then?(await h)():h)[0];let l="modes",m="modesPerSession";function i(a){if(!a||"object"!=typeof a||Array.isArray(a))return null;let b=a.permissionRules,c=(0,g.kP)((0,g.ni)(b));return{collaborationMode:(0,f.UY)(a.collaborationMode),tokenMode:(0,f.wI)(a.tokenMode),toolApprovalMode:(0,f.g0)(a.toolApprovalMode),permissionRules:{allow:Array.isArray(c.allow)?c.allow:[],ask:Array.isArray(c.ask)?c.ask:[],deny:Array.isArray(c.deny)?c.deny:[]}}}function j(a){let b=(0,f.Md)(),c=(0,e.Tu)();if(a){let b=c[m];if(b&&"object"==typeof b&&!Array.isArray(b)){let c=i(b[a]);if(c)return c}}return i(c[l])??b}async function k(a,b){let c={collaborationMode:(0,f.UY)(a.collaborationMode),tokenMode:(0,f.wI)(a.tokenMode),toolApprovalMode:(0,f.g0)(a.toolApprovalMode),permissionRules:a.permissionRules};await (0,e.o$)(a=>{if(b){let d=a[m]??{};d[b]=c,a[m]=d}else a[l]=c;return{settings:a}})}d()}catch(a){d(a)}})},71069:(a,b,c)=>{c.d(b,{TQ:()=>e,p1:()=>d});let d=92;function e(a,b=d,c=40){return Object.freeze({terminal:Object.freeze({columns:b,rows:c,kittyProtocolActive:!1}),requestRender:a})}},72498:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Fk:()=>i,Y1:()=>g,er:()=>h});var e=c(75430),f=a([e]);function g(a,b){return a&&(0,e.hasTrustRequiringProjectResources)(a)?{requiresTrust:!0,trusted:!0===new e.ProjectTrustStore(b).get(a)}:{requiresTrust:!1,trusted:!0}}function h(a,b){let c=g(a,b);return c.requiresTrust?(new e.ProjectTrustStore(b).set(a,!0),{requiresTrust:!0,trusted:!0}):c}function i(a,b){if(!g(a,b).requiresTrust)return;let c=new e.ProjectTrustStore(b);return{resolveProjectTrust:async()=>!0===c.get(a)}}e=(f.then?(await f)():f)[0],d()}catch(a){d(a)}})},78963:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{H4:()=>m,kx:()=>k,qV:()=>o,t0:()=>n});var e=c(73024),f=c(76760),g=c(75430),h=c(80974),i=c.n(h),j=a([g]);function k(a=(0,g.getAgentDir)()){return(0,f.join)(a,"extension-tools.json")}function l(a){return"object"!=typeof a||null===a||Array.isArray(a)?{disabled:[]}:{disabled:Array.isArray(a.disabled)?[...new Set(a.disabled.filter(a=>"string"==typeof a&&""!==a.trim()).map(a=>a.trim()))]:[]}}function m(a,b){if(0===b.disabled.length)return[...a];let c=new Set(b.disabled);return a.filter(a=>!c.has(a))}function n(a=k()){if(!(0,e.existsSync)(a))return{disabled:[]};try{return l(JSON.parse((0,e.readFileSync)(a,"utf8")))}catch{return{disabled:[]}}}async function o(a,b=k()){let c=l(a);(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0});try{(0,e.writeFileSync)(b,JSON.stringify({version:1,disabled:[]},null,2),{flag:"wx",mode:384})}catch(a){if("EEXIST"!==a.code)throw a}let d=await i().lock(b,{realpath:!1,retries:10});try{(0,e.writeFileSync)(b,`${JSON.stringify({version:1,disabled:c.disabled},null,2)}
20
+ ${(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,{$9:()=>h,J1:()=>i});var e=c(75430),f=c(76760),g=a([e]);function h(a,b=process.platform){let c={...a};for(let a of Object.keys(c))(function(a,b){let c="win32"===b?a.toUpperCase():a;return"PORT"===c||"NODE_ENV"===c||c.startsWith("NEXT_")})(a,b)&&delete c[a];return c}function i(a={}){let{agentBinDir:b=(0,f.join)((0,e.getAgentDir)(),"bin"),baseEnvironment:c=process.env,localOperations:d=(0,e.createLocalBashOperations)({shellPath:a.shellPath}),platform:g=process.platform}=a;return{exec(a,e,f){var i;let j,k,l,m=(i=h(f.env??c,g),j="win32"===g?Object.keys(i).find(a=>"PATH"===a.toUpperCase())??"PATH":"PATH",k="win32"===g?";":":",(l=i[j]??"").split(k).filter(Boolean).includes(b)||(i[j]=[b,l].filter(Boolean).join(k)),i);return d.exec(a,e,{...f,env:m})}}}e=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},56429:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{$Z:()=>V,A4:()=>P,Bp:()=>W,C4:()=>S,Fn:()=>T,HG:()=>Y,OF:()=>ae,Zo:()=>$,_I:()=>Q,d_:()=>Z,iP:()=>ac,l8:()=>aa,mK:()=>L,oA:()=>R,wW:()=>_,x8:()=>X});var e=c(75430),f=c(29862),g=c(55511),h=c(29021),i=c(33873),j=c(78970),k=c(43671),l=c(28967),m=c(18904),n=c(72498),o=c(40402),p=c(46753),q=c(7048),r=c(21560),s=c(95412),t=c(12568),u=c(27367),v=c(305),w=c(78963),x=c(53303),y=c(30590),z=c(64735),A=c(36193),B=c(67264),C=c(71069),D=c(11301),E=c(4504),F=c(44271),G=a([e,f,m,n,o,p,q,t,u,v,w,x,z,D,F]);[e,f,m,n,o,p,q,t,u,v,w,x,z,D,F]=G.then?(await G)():G;let af=new Set(["off","minimal","low","medium","high","xhigh","max"]),ag=new Set(["agent_start","message_start","message_update","message_end","agent_end","entry_appended","session_info_changed","queue_update","prompt_done","agent_settled","auto_compaction_end","compaction_end"]),ah=function(a=process.env.PI_WEB_IDLE_TIMEOUT_MS){let b=(a??"").trim();if(""===b)return 6e5;let c=Number(b);return!Number.isFinite(c)||c<0||!Number.isInteger(c)||c>0x7fffffff?(console.warn(`[pi-web] invalid PI_WEB_IDLE_TIMEOUT_MS "${a}", falling back to 600000ms`),6e5):c}(),ai=new Set(["fork","clone"]),aj=new Set(["get_state","abort","steer","follow_up_draft"]),ak=["read","bash","powershell","edit","write","grep","find","ls"];class al extends e.Theme{constructor(){super({muted:"",text:"",thinkingXhigh:"",searchMatchText:""},{selectedBg:""},"truecolor")}fg(...[,a]){return a}bg(...[,a]){return a}bold(a){return a}italic(a){return a}underline(a){return a}inverse(a){return a}strikethrough(a){return a}getFgAnsi(){return""}getBgAnsi(){return""}getThinkingBorderColor(){return a=>a}getBashModeBorderColor(){return a=>a}}let am=new al,an=new f.KeybindingsManager(f.TUI_KEYBINDINGS);function H(a,b){if(0===b.length)return[];let c=new Set(ak),d=(0,v.wQ)(b,a.settingsManager.getDefaultTools()),e=a.getAllTools().map(a=>a.name).filter(a=>!c.has(a));return(0,w.H4)([...new Set([...d,...e])],(0,w.t0)())}class ao{constructor(a,b=""){this.inner=a,this.listeners=[],this.activeToolEvents=new Map,this.pendingUiResponses=new Map,this.pendingUiRequests=new Map,this.activeCustomUis=new Map,this.extensionUiAbortController=new AbortController,this.extensionStatuses=new Map,this.extensionWidgets=new Map,this.promptRunning=!1,this.promptPhase=null,this.extensionsBound=!1,this.extensionBindingPromise=null,this.extensionBindingError=null,this.forceEmptySystemPrompt=!1,this.exactSystemPrompt=null,this.pendingPromptCount=0,this.activeMutatingCommands=0,this.agentRunNeedsCompletion=!1,this.promptAdmissionTail=Promise.resolve(),this.sessionReplacement=null,this.forceShutdownOnIdle=!1,this.unsubscribe=null,this.idleTimer=null,this.subscriberCount=0,this.disposeGraceTimer=null,this.lastActivityAt=Date.now(),this.queueMirror=[],this.queueRecovery=[],this.persistenceRevoked=!1,this.queueBootstrap=null,this.pendingQueueHints={steer:[],followUp:[]},this.queueMutationTail=Promise.resolve(),this.onDestroyCallback=null,this.shutdownPromise=null,this.sessionShutdownEmitted=!1,this._alive=!0,this.approvalPolicy=(0,A.ni)((0,z.lN)().permissionRules),this.approvalMode=(0,z.lN)().toolApprovalMode,this.pendingApprovals=new Map,this.approvalSeq=0,this.approvalHookInstalled=!1,this.goalEngine=new E.aA,this.goalTokensAccounted=0,this.goalToolCallsAccounted=0,this.goalContinuationInFlight=!1,this.goalContinuationPending=!1,this.goalDriveScheduled=!1,this.wrapperChatOnly=!1,this.wrapperSuppressNotifications=!1,this.cwd="string"==typeof b?b:"";const c="string"==typeof b?{}:b;c.onAgentRunComplete&&(this.onAgentRunComplete=c.onAgentRunComplete),c.suppressCompletionNotifications&&this.setSuppressCompletionNotifications(!0),c.chatOnly&&this.setChatOnly(!0),c.exactSystemPrompt&&(this.exactSystemPrompt=c.exactSystemPrompt(),this.installExactSystemPromptContinuation(),this.applyExactSystemPrompt());const d=(0,z.lN)(a.sessionId);if(this.approvalMode=d.toolApprovalMode,this.approvalPolicy=(0,A.ni)(d.permissionRules),a.sessionFile){const b=(0,E.bo)(a.sessionFile);"idle"!==b.status&&this.goalEngine.hydrate(b)}}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}isAlive(){return this._alive}async waitUntilReady(){}isShuttingDown(){return null!==this.shutdownPromise}whenShutdown(){return this.shutdownPromise}isRunning(){return this._alive&&(this.pendingPromptCount>0||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)}runtimeSnapshot(){let a=this.inner.isStreaming,b=this.promptRunning,c=this.inner.isCompacting,d=this.inner.isBashRunning;return{id:this.sessionId,running:this.isRunning(),isStreaming:a,isPromptRunning:b,isCompacting:c,isBashRunning:d,phase:d?"running_command":this.promptPhase??(a||b||c?"waiting_model":null)}}setChatOnly(a){this.wrapperChatOnly=a}setSuppressCompletionNotifications(a){this.wrapperSuppressNotifications=a}isChatOnly(){return this.wrapperChatOnly}hasSuppressedCompletionNotifications(){return this.wrapperSuppressNotifications}start(){this.installApprovalHook(),this.goalEngine.setOnChanged(a=>{this.sessionFile&&!this.persistenceRevoked&&(0,E.eG)(this.sessionFile,a),this.emit({type:"goal_state_changed",goalState:a}),ac("goal_state_changed",this.sessionId,{type:"goal_state_changed",goalState:a})}),this.goalEngine.isRunning()&&(this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()),this.unsubscribe=this.inner.subscribe(a=>{("agent_end"===a.type||"message_end"===a.type||"entry_appended"===a.type||"session_info_changed"===a.type)&&(0,o.mD)(),("agent_end"===a.type||"agent_settled"===a.type||"auto_compaction_end"===a.type||"compaction_end"===a.type)&&this.resetIdleTimer(),"agent_start"===a.type&&(this.goalEngine.onAgentStart(),this.agentRunNeedsCompletion=!0),"agent_settled"===a.type&&(this.handleGoalSettled(),this.notifyAgentRunCompleteIfIdle()),"queue_update"===a.type&&this.reconcileQueue(a.steering,a.followUp),ag.has(a.type)&&ac(a.type,this.sessionId,a);let b=a.toolCallId;"string"==typeof b&&("tool_execution_start"===a.type||"tool_execution_update"===a.type?this.activeToolEvents.set(b,a):"tool_execution_end"===a.type&&this.activeToolEvents.delete(b)),this.emit(a),U()}),this.resetIdleTimer()}loadQueueRecovery(){if(!this.sessionFile)return;let a=this.inner.getSteeringMessages(),b=this.inner.getFollowUpMessages();if(a.length||b.length){this.queueRecovery=[],this.reconcileQueue([...a],[...b]);return}this.queueRecovery=(0,k.ov)(this.sessionFile)}getGoalState(){return this.goalEngine.getState()}handleGoalSettled(){if(!this.goalEngine.isRunning()){this.goalEngine.disarmContinuation(),this.goalContinuationPending=!1;return}let a=this.inner.getLastAssistantText()??"",b=this.currentSessionUsageTotal(),c=Math.max(0,b-this.goalTokensAccounted);this.goalTokensAccounted=b;let d=this.currentSessionToolCallTotal(),e=Math.max(0,d-this.goalToolCallsAccounted);this.goalToolCallsAccounted=d;let{verdict:f}=this.goalEngine.settleTurn(a,c,e);if("continue"!==f.action){this.goalEngine.disarmContinuation(),this.goalContinuationPending=!1;return}this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()}maybeDriveGoalContinuation(){if(this.goalContinuationPending&&!this.goalDriveScheduled){if(!this.goalEngine.isRunning()){this.goalContinuationPending=!1;return}this.goalDriveScheduled=!0,setTimeout(()=>{this.goalDriveScheduled=!1,this.tryDriveGoalContinuation()},0)}}cancelGoalContinuation(){this.goalContinuationPending=!1,this.goalEngine.disarmContinuation()}tryDriveGoalContinuation(){let a=J(this.sessionId);if(!this._alive||this.isShuttingDown()||a.deleted||a.barriers>0)return void this.cancelGoalContinuation();if(this.goalContinuationPending){if(!this.goalEngine.isRunning()){this.goalContinuationPending=!1;return}this.goalContinuationInFlight||this.promptRunning||this.inner.isStreaming||this.inner.isBashRunning||(this.goalContinuationPending=!1,this.driveGoalContinuation())}}driveGoalContinuation(){if(!this.goalEngine.isRunning()||this.goalContinuationInFlight)return;this.goalContinuationInFlight=!0,this.promptRunning=!0,this.promptPhase="waiting_model",this.resetIdleTimer(),U();let a=()=>{this.promptRunning=!1,this.promptPhase=null,this.resetIdleTimer(),U()};this.acquirePromptAdmission().then(async b=>{try{if(!this.goalEngine.isRunning())return void a();let b=this.goalEngine.getState().goalText;if(!this._alive||this.isShuttingDown()||!b)return void a();K(this.sessionId),await this.inner.prompt((0,E.bx)(b),{source:"rpc",preflightResult:a=>{if(a){if(!this._alive||this.isShuttingDown()||!this.goalEngine.isRunning())throw new DOMException("Goal continuation cancelled","AbortError");K(this.sessionId)}}}),a(),this.emit({type:"prompt_done"}),this.maybeDriveGoalContinuation()}catch(b){a(),this.emit({type:"prompt_error",errorMessage:b instanceof Error?b.message:String(b)})}finally{b(),this.goalContinuationInFlight=!1}})}handleGoalStartCommand(a,b){let c=this.goalEngine.start(a,b);return this.goalTokensAccounted=this.currentSessionUsageTotal(),this.goalToolCallsAccounted=this.currentSessionToolCallTotal(),c}handleGoalStopCommand(){return this.goalEngine.stop(),this.goalTokensAccounted=0,this.goalToolCallsAccounted=0,this.goalEngine.getState()}currentSessionUsageTotal(){try{return function(a){let b=0;for(let c of a){let a=c?.message;if(!a||"assistant"!==a.role)continue;let d=a.usage;d&&(b+=(d.input??0)+(d.output??0)+(d.cacheRead??0)+(d.cacheWrite??0))}return b}(this.inner.sessionManager.getEntries())}catch{return 0}}currentSessionToolCallTotal(){try{return function(a){let b=0;for(let c of a){let a=c?.message;if(!a||"assistant"!==a.role)continue;let d=a.content;if(Array.isArray(d))for(let a of d)a&&"object"==typeof a&&"toolCall"===a.type&&(b+=1)}return b}(this.inner.sessionManager.getEntries())}catch{return 0}}setApprovalMode(a){this.approvalMode=a}setApprovalPolicy(a){this.approvalPolicy=a}installApprovalHook(){if(this.approvalHookInstalled||!this.inner.agent?.beforeToolCall)return;this.approvalHookInstalled=!0;let a=this.inner.agent.beforeToolCall;this.inner.agent.beforeToolCall=async b=>{let c=b.toolCall?.name??"",d=b.args,e=(0,A.LD)(this.approvalPolicy,c,{mode:this.approvalMode,readOnly:B.MJ.has(c.toLowerCase()),args:d});if("deny"===e)return{block:!0,reason:`Denied by policy rule: ${c} is not permitted.`};if("ask"===e){let a=await this.askForApproval(c,d);if(!a.approve)return{block:!0,reason:a.reason||`Rejected by user: ${c}`}}return a?a(b):void 0}}askForApproval(a,b){return new Promise(c=>{let d=`approval-${++this.approvalSeq}`,e=setTimeout(()=>{this.pendingApprovals.delete(d),this.emit({type:"tool_approval_resolved",id:d,approve:!1,reason:`Approval request timed out after 120s: ${a}`}),c({approve:!1,reason:`Approval request timed out after 120s: ${a}`})},12e4);this.pendingApprovals.set(d,{resolve:c,timer:e,toolName:a}),this.emit({type:"tool_approval_request",id:d,toolName:a,args:function(a){if(null===a||"object"!=typeof a)return a;let b={};for(let[c,d]of Object.entries(a))if(null!=d&&"content"!==c&&"data"!==c&&"newString"!==c&&"oldString"!==c){if("string"==typeof d){b[c]=d.length>200?`${d.slice(0,200)}…`:d;continue}if("number"==typeof d||"boolean"==typeof d){b[c]=d;continue}b[c]=Array.isArray(d)?`[array:${d.length}]`:"[object]"}return b}(b)})})}resolveApproval(a,b,c){let d=this.pendingApprovals.get(a);return!!d&&(this.pendingApprovals.delete(a),clearTimeout(d.timer),d.resolve({approve:b,reason:c}),!0)}rejectAllApprovals(a){for(let[b,c]of this.pendingApprovals)this.pendingApprovals.delete(b),clearTimeout(c.timer),c.resolve({approve:!1,reason:a})}getPendingApprovals(){return Array.from(this.pendingApprovals.entries()).map(([a,b])=>({id:a,toolName:b.toolName}))}pendingRecoveryView(){return this.queueRecovery.map(({id:a,kind:b,text:c,images:d,queuedAt:e})=>({id:a,kind:b,text:c,hasImages:!!d?.length,queuedAt:e}))}persistQueue(){if(!this.sessionFile||this.persistenceRevoked)return;let a=[...this.queueRecovery,...this.queueBootstrap?.entries??[],...this.queueMirror];a.length?(0,k.pj)(this.sessionFile,a):(0,k.wx)(this.sessionFile)}hintQueueImages(a,b){this.pendingQueueHints[a].push(b?.length?b:[])}reconcileQueue(a,b){let c=(a,b)=>{if(!b)return this.queueMirror.filter(b=>b.kind===a);let c=new Set;return b.map(b=>{let d=this.queueMirror.find(d=>d.kind===a&&d.text===b&&!c.has(d));if(d)return c.add(d),d;let e=(0,k.Gc)(a,b,this.pendingQueueHints[a].shift());return c.add(e),e})};this.queueMirror=[...c("steer",a),...c("followUp",b)],this.persistQueue()}validateImagesSupportedByCurrentModel(){let a=this.inner.model;return!a?.id||Array.isArray(a.input)&&a.input.includes("image")?null:`Model "${a.id}" does not accept image input. Switch to a model with image support.`}async requeueEntry(a){let b=(0,j.kc)(a.images);if(b)throw Error(b);if(a.images?.length){let a=this.validateImagesSupportedByCurrentModel();if(a)throw Error(a)}this.hintQueueImages(a.kind,a.images),"steer"===a.kind?await this.inner.steer(a.text,a.images):await this.inner.followUp(a.text,a.images)}ensureMirrored(a){this.queueMirror.find(b=>b.kind===a.kind&&b.text===a.text)||(this.queueMirror.push({...a}),this.pendingQueueHints[a.kind].pop())}async replaceLiveQueue(a,b){for(let b of(this.inner.clearQueue(),this.pendingQueueHints={steer:[],followUp:[]},a))await this.requeueEntry(b);for(let a of b)await this.requeueEntry(a);let c={steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]};return this.reconcileQueue(c.steering,c.followUp),c}async withQueueMutation(a){let b,c=this.queueMutationTail;this.queueMutationTail=new Promise(a=>{b=a}),await c;try{if(!this._alive||this.isShuttingDown())throw Error("Session is shutting down");return K(this.sessionId),await a()}finally{b()}}async mutateLiveQueue(a,b){return this.withQueueMutation(async()=>{let c=this.queueMirror.filter(a=>"steer"===a.kind),d=this.queueMirror.filter(a=>"followUp"===a.kind),e=b("steer"===a?c:d),f=await this.replaceLiveQueue(c,d);return{value:e,queues:f}})}validateQueueEntries(a){for(let b of a){if("steer"!==b.kind&&"followUp"!==b.kind||"string"!=typeof b.text)continue;let a=(0,j.kc)(b.images);if(a)throw Error(a)}}runAgentContinue(){if(!this._alive||this.isShuttingDown()||this.queueBootstrap||this.isRunning()||this.promptRunning)return;let a=[...this.queueMirror];if(0===a.length)return;let b={entries:a,cancelled:!1};this.queueBootstrap=b,this.queueMirror=[],this.persistQueue(),this.inner.clearQueue(),this.pendingQueueHints={steer:[],followUp:[]},this.pendingPromptCount+=1,this.promptRunning=!0,this.promptPhase="waiting_model",U(),this.bootstrapQueuedRun(b)}cancelQueuedRun(){let a=this.queueBootstrap;a&&(a.cancelled=!0,this.queueRecovery.push(...a.entries),a.entries=[],this.persistQueue())}async bootstrapQueuedRun(a){try{for(let b of[...a.entries]){let c,d,e=await this.acquirePromptAdmission();try{let f,g;if(a.cancelled||!this._alive||this.isShuttingDown()||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)break;K(this.sessionId),this.extensionUiAbortController.signal.aborted&&(this.extensionUiAbortController=new AbortController);let h=!1,i=()=>{h=!0,e()},j=!1,k=this.inner.sessionManager,l=k.appendMessage,m=function(c){let d=l.call(this,c);return c===f&&(g=d),!j&&g&&k.isPersisted()&&k.flushed&&(j=!0,a.entries=a.entries.filter(a=>a.id!==b.id),n()),d},n=()=>{this.queueRecovery=this.queueRecovery.filter(a=>a.id!==b.id),this.persistQueue()};k.appendMessage=m,d=()=>{k.appendMessage===m&&(k.appendMessage=l)},c=this.inner.subscribe(b=>{"message_start"!==b.type&&"message_end"!==b.type||"user"!==b.message.role||f||!h&&a.cancelled||(f=b.message,i(),c?.(),c=void 0)}),await this.inner.prompt(b.text,{...b.images?.length?{images:b.images}:{},source:"rpc",preflightResult:b=>{if(b){if(a.cancelled||!this._alive||this.isShuttingDown())throw new DOMException("Queued run cancelled","AbortError");K(this.sessionId),this.applyExactSystemPrompt(),i()}}})}finally{c?.(),d?.(),e()}}}catch(b){!a.cancelled&&this._alive&&((0,o.mD)(),this.emit({type:"prompt_error",errorMessage:b instanceof Error?b.message:String(b)}))}finally{this.queueRecovery.push(...a.entries),a.entries=[],this.queueBootstrap===a&&(this.queueBootstrap=null),this.persistQueue(),this.pendingPromptCount=Math.max(0,this.pendingPromptCount-1),this.promptRunning=this.pendingPromptCount>0,this.promptRunning||(this.promptPhase=null),this.resetIdleTimer(),U(),this._alive&&this.emit({type:"prompt_done"})}}setForceEmptySystemPrompt(a){this.forceEmptySystemPrompt=a,this.applyForcedEmptySystemPrompt()}setExactSystemPrompt(a){this.exactSystemPrompt=a,this.applyExactSystemPrompt()}beginExtensionBinding(a={}){this.ensureExtensionsBound(a).catch(a=>{console.error("[pi-web] failed to dispatch session_start to extensions:",a instanceof Error?a.message:a)})}ensureExtensionsBound(a={}){return(a.forceEmptySystemPrompt&&(this.forceEmptySystemPrompt=!0),this.extensionsBound)?(this.applyExactSystemPrompt(),Promise.resolve()):(this.extensionBindingPromise||(this.extensionBindingError=null,this.extensionBindingPromise=(async()=>{if(!this._alive)return;let a=this.createExtensionUiContext();if("function"==typeof this.inner.bindExtensions){let b=this.inner.bindExtensions;await b.call(this.inner,{uiContext:a,mode:"rpc",commandContextActions:this.createExtensionCommandContextActions(),shutdownHandler:()=>this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",notifyType:"warning",message:"Extension requested shutdown, but shutdown is not supported in pi-web."}),onError:a=>this.emit({type:"extension_error",extensionPath:a.extensionPath,event:a.event,error:a.error})})}else this.inner.extensionRunner.setUIContext?.(a,"rpc");this.extensionsBound=!0,this.applyExactSystemPrompt(),console.log(`[pi-web] session_start dispatched to extensions for session ${this.inner.sessionId}`)})().catch(a=>{throw this.extensionBindingError=a,a})),this.extensionBindingPromise)}static{this.EXTENSION_BIND_TIMEOUT_MS=15e3}async waitForExtensionsBound(){let a=this.extensionBindingPromise;if(a)try{let b=new Promise((b,c)=>{let d=setTimeout(()=>c(Error("Extension binding timed out; continuing without waiting")),ao.EXTENSION_BIND_TIMEOUT_MS);a.finally(()=>clearTimeout(d))});await Promise.race([a,b])}catch{}this.extensionBindingError&&console.warn("[pi-web] extension binding failed, continuing:",this.extensionBindingError)}shouldWaitForExtensions(a){return"prompt"===a||"steer"===a||"follow_up"===a||"get_commands"===a||"get_state"===a}applyForcedEmptySystemPrompt(){this.inner.agent.state&&(this.forceEmptySystemPrompt?this.inner.agent.state.systemPrompt="":null!==this.exactSystemPrompt&&(this.inner.agent.state.systemPrompt=this.exactSystemPrompt))}applyExactSystemPrompt(){!this.forceEmptySystemPrompt&&null!==this.exactSystemPrompt&&this.inner.agent.state&&(this.inner.agent.state.systemPrompt=this.exactSystemPrompt)}emit(a){for(let b of this.listeners)try{b(a)}catch(a){console.error(`[pi-web] session ${this.sessionId} event listener threw:`,a instanceof Error?a.message:a)}}installExactSystemPromptContinuation(){if(!this.exactSystemPrompt)return;let a=this.inner.agent,b=a.prepareNextTurnWithContext;a.prepareNextTurnWithContext=async(a,c)=>{let d=await b?.(a,c);return{...d,context:{...d?.context??a.context,systemPrompt:this.exactSystemPrompt}}}}setActiveToolSelection(a){this.inner.setActiveToolsByName(H(this.inner,a)),this.applyExactSystemPrompt()}async acquirePromptAdmission(){let a,b=this.promptAdmissionTail;return this.promptAdmissionTail=new Promise(b=>{a=b}),await b,a}notifyAgentRunCompleteIfIdle(){if(!(!this.agentRunNeedsCompletion||this.isRunning())&&(this.agentRunNeedsCompletion=!1,!this.wrapperSuppressNotifications))try{this.onAgentRunComplete?.(this.sessionId)}catch(a){console.error("[pi-web] completion listener failed:",a instanceof Error?a.message:a)}}resetIdleTimer(){this.idleTimer&&clearTimeout(this.idleTimer),this._alive&&0!==ah&&(this.isRunning()||(this.forceShutdownOnIdle=!1),this.idleTimer=setTimeout(()=>{!this.forceShutdownOnIdle&&(this.isRunning()||(0,s.Vj)({sessionId:this.sessionId,sessionFile:this.sessionFile||void 0}))?this.resetIdleTimer():this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down idle session:",a instanceof Error?a.message:a)})},ah))}touch(){this.lastActivityAt=Date.now(),this.cancelPendingDispose()}hasSubscribers(){return this.subscriberCount>0}get activityTimestamp(){return this.lastActivityAt}cancelPendingDispose(){this.disposeGraceTimer&&(clearTimeout(this.disposeGraceTimer),this.disposeGraceTimer=null)}scheduleDisposeIfIdle(){this.cancelPendingDispose(),!(this.subscriberCount>0||this.isRunning())&&this._alive&&(this.disposeGraceTimer=setTimeout(()=>{this.disposeGraceTimer=null,!(this.subscriberCount>0||this.isRunning())&&this._alive&&this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down unwatched session:",a instanceof Error?a.message:a)})},6e4))}persistSessionFileIfMissing(){if(this.persistenceRevoked||!this._alive)return;let a=this.inner.sessionManager,b=a.getSessionFile();if(!b||(0,h.existsSync)(b))return;let c=a.getHeader();if(!c)return;let d=[c,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";try{(0,h.writeFileSync)(b,d,{encoding:"utf8",flag:"wx"})}catch(c){if("EEXIST"===c.code||(0,h.existsSync)(b)){a.flushed=!0,(0,o.O8)(this.inner.sessionId,b);return}throw c}a.flushed=!0,(0,o.O8)(this.inner.sessionId,b)}onEvent(a){for(let b of(this.listeners.push(a),this.subscriberCount+=1,this.cancelPendingDispose(),this.pendingUiRequests.values()))a(b);for(let b of this.activeToolEvents.values())a(b);return()=>{let b=this.listeners.indexOf(a);-1!==b&&this.listeners.splice(b,1),this.subscriberCount>0&&(this.subscriberCount-=1),this.scheduleDisposeIfIdle()}}onDestroy(a){this.onDestroyCallback=a}async withSessionReplacement(a,b){if(this.sessionReplacement)throw Error("Session is already being copied");this.sessionReplacement=a;try{return await b()}finally{this._alive&&(this.sessionReplacement=null)}}isSessionRunningForReplacement(){return this.inner.isBashRunning||this.inner.isStreaming||this.inner.isCompacting||this.pendingPromptCount>0}async shutdownAfterSessionReplacement(a){try{await this.shutdown()}catch(b){console.error(`[pi-web] ${a} succeeded, but source session shutdown failed:`,b instanceof Error?b.message:b)}}async send(a){if(!this._alive)throw Error("Session is shutting down");K(this.sessionId),this.touch();let b=a.type;if(b.startsWith("get_")||"export_queue"===b||this.resetIdleTimer(),"prompt"===b||"steer"===b||"follow_up"===b||"requeue_at"===b){let b=(0,j.kc)(a.images);if(b)throw Error(b);if(Array.isArray(a.images)&&a.images.length>0){let a=this.validateImagesSupportedByCurrentModel();if(a)throw Error(a)}}let c=aj.has(b);if(this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if(ai.has(b)&&this.activeMutatingCommands>0)throw Error(`Cannot ${b} while another session command is running`);this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound();let d=!c;d&&(this.activeMutatingCommands+=1);try{if(!this._alive||this.isShuttingDown())throw Error("Session is shutting down");if(K(this.sessionId),this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if("prompt"===b||"steer"===b||"follow_up"===b){let b=(0,j.kc)(a.images);if(b)throw Error(b)}switch(b){case"prompt":{let b=await this.acquirePromptAdmission();try{let b,c,d;if(!this._alive||this.isShuttingDown())throw Error("Session is shutting down");if(K(this.sessionId),this.inner.isBashRunning)throw Error("Cannot send a prompt while a shell command is running");this.extensionUiAbortController.signal.aborted&&(this.extensionUiAbortController=new AbortController);let e=a.images,f=a.streamingBehavior;f&&this.inner.isStreaming&&this.hintQueueImages("followUp"===f?"followUp":"steer",e);let g=!1,h=!1,i=!1,j=new Promise((a,d)=>{b=()=>{g=!0,this.agentRunNeedsCompletion=!0,h||(h=!0,a())},c=a=>{h||(h=!0,d(a))}}),k=()=>{i||(i=!0,this.pendingPromptCount=Math.max(0,this.pendingPromptCount-1),this.resetIdleTimer(),this.notifyAgentRunCompleteIfIdle())};this.pendingPromptCount+=1,this.promptRunning=!0,this.promptPhase=String(a.message??"").trimStart().startsWith("/")?"running_command":"waiting_model",U();try{d=this.inner.prompt(a.message,{...e?.length?{images:e}:{},...f?{streamingBehavior:f}:{},source:"rpc",preflightResult:a=>{if(a){if(!this._alive||this.isShuttingDown())throw Error("Session is shutting down");K(this.sessionId),this.applyExactSystemPrompt(),b()}}})}catch(a){throw k(),a}return d.then(()=>{b(),k(),this.promptRunning=!1,this.promptPhase=null,f||this.emit({type:"prompt_done"}),U(),this.maybeDriveGoalContinuation()},a=>{c(a),k(),this.promptRunning=!1,this.promptPhase=null,(0,o.mD)(),g&&(this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),f||this.emit({type:"prompt_done"})),U(),this.maybeDriveGoalContinuation()}).catch(a=>{console.error("[pi-web] prompt completion handler failed:",a instanceof Error?a.message:a)}),await j,null}finally{b()}}case"abort":this.cancelQueuedRun(),this.cancelGoalContinuation(),this.forceShutdownOnIdle=!0,this.extensionUiAbortController.abort(new DOMException("Extension UI cancelled by Stop","AbortError"));try{await this.inner.abort()}finally{this.resetIdleTimer(),this.isRunning()||(this.forceShutdownOnIdle=!1)}return null;case"get_state":{let a=this.inner.model,b=this.inner.getContextUsage();return{sessionId:this.inner.sessionId,sessionFile:this.inner.sessionFile??"",isStreaming:this.inner.isStreaming,isPromptRunning:this.pendingPromptCount>0,isBashRunning:this.inner.isBashRunning,isCompacting:this.inner.isCompacting,phase:this.runtimeSnapshot().phase,model:a?{id:a.id,provider:a.provider}:void 0,messageCount:0,pendingMessageCount:this.inner.pendingMessageCount,queuedMessages:{steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]},pendingRecovery:this.pendingRecoveryView(),contextUsage:b?{percent:b.percent,contextWindow:b.contextWindow,tokens:b.tokens}:null,systemPrompt:this.inner.agent.state?.systemPrompt??"",thinkingLevel:this.inner.agent.state?.thinkingLevel??"off",extensionStatuses:this.getExtensionStatuses(),extensionWidgets:this.getExtensionWidgets(),goalState:this.goalEngine.getState()}}case"goal_start":{let b=String(a.goalText??"").trim();if(!b)throw Error("goal_start requires a non-empty goalText");let c=a.tokenBudget,d="number"==typeof c&&Number.isFinite(c)&&c>0?Math.floor(c):null,e=this.handleGoalStartCommand(b,d);return this.goalContinuationPending=!0,this.maybeDriveGoalContinuation(),{goalState:e}}case"goal_pause":return this.cancelGoalContinuation(),{goalState:this.goalEngine.pause()};case"goal_resume":{let a=this.goalEngine.resume();return"running"===a.status&&(this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()),{goalState:a}}case"goal_stop":return this.cancelGoalContinuation(),{goalState:this.handleGoalStopCommand()};case"goal_edit":{let b=String(a.goalText??"").trim();if(!b)throw Error("goal_edit requires a non-empty goalText");let c=this.goalEngine.edit(b);return"running"===c.status&&(this.goalContinuationPending=!0,this.maybeDriveGoalContinuation()),{goalState:c}}case"get_goal_state":return{goalState:this.goalEngine.getState()};case"set_model":{let{provider:b,modelId:c}=a,d=this.inner.modelRuntime.getModel(b,c);if(!d)try{await this.inner.modelRuntime.refresh({allowNetwork:!1}),d=this.inner.modelRuntime.getModel(b,c)}catch{d=void 0}if(!d)throw Error(`Model not found: ${b}/${c}`);return await this.inner.setModel(d),(0,l.k)(),(0,o.mD)(),{id:d.id,provider:d.provider}}case"fork":{let b,c,d=a.entryId,f=this.inner.sessionManager,g=this.inner.sessionFile;if(!f.isPersisted())return{cancelled:!0};if(!g)throw Error("Persisted session is missing a session file");let i=f.getEntry(d);if(!i)throw Error("Invalid entry ID for forking");let j=f.getSessionDir();if(i.parentId){let a=(c=e.SessionManager.open(g,j)).createBranchedSession(i.parentId);if(!a)throw Error("Failed to create forked session");b=a}else b=(c=e.SessionManager.create(f.getCwd(),j,{parentSession:g})).getSessionFile();if(!(0,h.existsSync)(b)){let a=c.getHeader();if(!a)throw Error("Forked session is missing a session header");let d=[a,...c.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,h.writeFileSync)(b,d,{encoding:"utf8",flag:"wx"})}let k=c.getSessionId();return(0,o.O8)(k,b),(0,o.mD)(),{cancelled:!1,newSessionId:k}}case"clone":{if(this.isSessionRunningForReplacement())throw Error("Cannot clone while the session is running");let b=this.inner.sessionManager,c=this.inner.sessionFile,d="string"==typeof a.leafId?a.leafId:b.getLeafId(),f=d&&b.getBranch(d).some(a=>"message"===a.type&&"assistant"===a.message.role);if(!b.isPersisted()||!d||!f||!c||!(0,h.existsSync)(c))return{cancelled:!0};return this.withSessionReplacement("clone",async()=>{let a=b.getSessionDir(),f=e.SessionManager.open(c,a).createBranchedSession(d);if(!f||!(0,h.existsSync)(f))throw Error("Failed to clone current session branch");let g=e.SessionManager.open(f,a).getSessionId();return(0,o.O8)(g,f),(0,o.mD)(),await this.shutdownAfterSessionReplacement("clone"),{cancelled:!1,newSessionId:g}})}case"navigate_tree":return{cancelled:(await this.inner.navigateTree(a.targetId,{})).cancelled};case"set_thinking_level":{let b=a.level;return this.inner.setThinkingLevel(b),"xhigh"===b&&this.inner.model?.compat?.thinkingFormat==="deepseek"&&this.inner.agent?.state&&(this.inner.agent.state.thinkingLevel="xhigh"),(0,o.mD)(),null}case"compact":try{return await this.inner.compact(a.customInstructions)}finally{(0,o.mD)()}case"set_session_name":{let b=a.name?.trim();if(!b)throw Error("Session name cannot be empty");return this.inner.setSessionName(b),(0,o.mD)(),null}case"get_session_stats":return{...this.inner.getSessionStats(),sessionName:this.inner.sessionManager.getSessionName()};case"get_last_assistant_text":return{text:this.inner.getLastAssistantText()??""};case"clear_queue":return this.withQueueMutation(async()=>(this.queueMirror=[],this.pendingQueueHints={steer:[],followUp:[]},this.persistQueue(),this.inner.clearQueue()));case"move_queue":{let b=a.kind,c=Number(a.fromIndex),d=Number(a.toIndex);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c)||!Number.isInteger(d))throw Error("move_queue requires a queue kind and integer indexes");let{queues:e}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length||d<0||d>=a.length)throw Error("move_queue index out of range");let[b]=a.splice(c,1);a.splice(d,0,b)});return e}case"recall_queue_item":{let b=a.kind,c=Number(a.index);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c))throw Error("recall_queue_item requires a queue kind and integer index");let{value:d,queues:e}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length)throw Error("recall_queue_item index out of range");let[b]=a.splice(c,1);return b});return{entry:{text:d.text,images:d.images??[]},...e}}case"requeue_at":{let b=a.kind,c=Number(a.index),d=a.text;if("steer"!==b&&"followUp"!==b||!Number.isInteger(c)||!d?.trim())throw Error("requeue_at requires a queue kind, integer index, and text");let e=a.images,{queues:f}=await this.mutateLiveQueue(b,a=>{if(c<0||c>a.length)throw Error("requeue_at index out of range");a.splice(c,0,(0,k.Gc)(b,d,e))});return f}case"remove_queue_item":{let b=a.kind,c=Number(a.index);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c))throw Error("remove_queue_item requires a queue kind and integer index");let{queues:d}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length)throw Error("remove_queue_item index out of range");a.splice(c,1)});return d}case"resolve_recovery":return this.withQueueMutation(async()=>{let b=new Set(a.keep??[]),c=new Set(a.discard??[]),d=!0===a.continueRun,e=0;for(let a of this.queueRecovery)b.has(a.id)&&(await this.requeueEntry(a),this.ensureMirrored(a),e+=1);return this.queueRecovery=this.queueRecovery.filter(a=>!b.has(a.id)&&!c.has(a.id)),this.persistQueue(),d&&e>0&&this.runAgentContinue(),{remaining:this.pendingRecoveryView(),kept:e}});case"export_queue":return{live:this.queueMirror.map(a=>({...a})),recovery:this.queueRecovery.map(a=>({...a}))};case"import_queue":return this.withQueueMutation(async()=>{let b=a.entries;if(!Array.isArray(b))throw Error("import_queue requires entries[]");this.validateQueueEntries(b);let c=0;for(let a of b){if("steer"!==a.kind&&"followUp"!==a.kind||"string"!=typeof a.text)continue;let b=(0,k.Gc)(a.kind,a.text,a.images);await this.requeueEntry(b),this.ensureMirrored(b),c+=1}return this.persistQueue(),{imported:c,steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]}});case"stage_recovery":return this.withQueueMutation(async()=>{let b=a.entries;if(!Array.isArray(b))throw Error("stage_recovery requires entries[]");this.validateQueueEntries(b);let c=0;for(let a of b)("steer"===a.kind||"followUp"===a.kind)&&"string"==typeof a.text&&(this.queueRecovery.push((0,k.Gc)(a.kind,a.text,a.images)),c+=1);return this.persistQueue(),{staged:c,pendingRecovery:this.pendingRecoveryView()}});case"steer":return this.withQueueMutation(async()=>{let b=a.images;this.hintQueueImages("steer",b),this.promptPhase="waiting_model",U();try{await this.inner.steer(a.message,b?.length?b:void 0)}finally{this.promptPhase=null,U()}return null});case"follow_up":return this.withQueueMutation(async()=>{let b=a.images;this.hintQueueImages("followUp",b),this.promptPhase="waiting_model",U();try{await this.inner.followUp(a.message,b?.length?b:void 0)}finally{this.promptPhase=null,U()}return null});case"get_tools":{let a=this.inner.getAllTools(),b=new Set(this.inner.getActiveToolNames());return a.map(a=>({...a,active:b.has(a.name)}))}case"get_commands":{let a=[];for(let b of this.inner.extensionRunner.getRegisteredCommands())a.push({name:b.invocationName,description:b.description,source:"extension",sourceInfo:b.sourceInfo});for(let b of this.inner.promptTemplates)a.push({name:b.name,description:b.description,source:"prompt",sourceInfo:b.sourceInfo});for(let b of this.inner.resourceLoader.getSkills().skills)a.push({name:`skill:${b.name}`,description:b.description,source:"skill",sourceInfo:b.sourceInfo});return{commands:a}}case"set_tools":{let b=a.toolNames;return this.setActiveToolSelection(b),null}case"reload":{let a=this.inner.getActiveToolNames();return await this.waitForExtensionsBound(),this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.syncProjectTrust(),await this.inner.reload(),this.inner.setActiveToolsByName(H(this.inner,a)),"function"!=typeof this.inner.bindExtensions&&this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc"),this.applyForcedEmptySystemPrompt(),{success:!0}}case"abort_compaction":return this.inner.abortCompaction(),null;case"resolve_approval":return{resolved:this.resolveApproval(a.id,!!a.approve,a.reason)};case"set_approval_mode":{let b=a.mode;if("ask"!==b&&"auto"!==b&&"yolo"!==b)throw Error(`Invalid approval mode: ${String(b)}`);return this.setApprovalMode(b),null}case"set_approval_policy":{let b=a.policy;return this.setApprovalPolicy((0,A.ni)(b)),null}case"get_approval_state":return{mode:this.approvalMode,pending:this.getPendingApprovals()};case"extension_ui_response":return this.resolveExtensionUiResponse(a),null;case"extension_ui_input":return this.handleExtensionUiInput(a.id,a.data),null;case"bash":{if(this.promptRunning||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)throw Error("Cannot run a shell command while the session is busy");let b=this.inner.settingsManager?.getShellPath?.(),c=(0,x.J1)("string"==typeof b&&b?{shellPath:b}:{}),d=this.inner.executeBash(a.command,void 0,{excludeFromContext:a.excludeFromContext,operations:c});try{let a=await d;return this.persistSessionFileIfMissing(),a}finally{this.resetIdleTimer(),(0,o.mD)()}}case"abort_bash":return this.forceShutdownOnIdle=!0,this.inner.abortBash(),U(),null;default:throw Error(`Unsupported command: ${b}`)}}finally{d&&(this.activeMutatingCommands=Math.max(0,this.activeMutatingCommands-1))}}destroy(){if(!this._alive)return;for(let a of(this._alive=!1,this.cancelQueuedRun(),this.cancelGoalContinuation(),this.idleTimer&&clearTimeout(this.idleTimer),this.cancelPendingDispose(),this.inner.isBashRunning&&this.inner.abortBash(),this.unsubscribe?.(),this.sessionFile&&!this.persistenceRevoked&&this.goalEngine.hasActiveGoal()&&(0,E.eG)(this.sessionFile,this.goalEngine.getState()),this.pendingUiResponses.values()))a.cancel();for(let a of Array.from(this.activeCustomUis.keys()))this.closeCustomUi(a,void 0);this.pendingUiResponses.clear(),this.pendingUiRequests.clear(),this.activeToolEvents.clear(),this.rejectAllApprovals("Session closed while approval was pending");let a=()=>{try{this.inner.dispose()}finally{try{this.onDestroyCallback?.()}finally{U()}}};if(this.sessionShutdownEmitted)return void a();this.sessionShutdownEmitted=!0;let b=this.inner.extensionRunner?.emit;"function"!=typeof b?a():Promise.resolve().then(()=>b.call(this.inner.extensionRunner,{type:"session_shutdown",reason:"quit"})).catch(a=>{console.error("[pi-web] session_shutdown before dispose failed:",a instanceof Error?a.message:a)}).finally(a)}revokePersistenceForDeletion(){this.persistenceRevoked=!0,I(this.inner.sessionManager),this.cancelQueuedRun(),this.cancelGoalContinuation()}async drainForSessionRewrite(){this.cancelQueuedRun(),this.cancelGoalContinuation(),this.extensionUiAbortController.abort(new DOMException("Session is being changed","AbortError")),await this.inner.abort()}async shutdown(){return this.shutdownPromise?this.shutdownPromise:this._alive?(this.cancelQueuedRun(),this.cancelGoalContinuation(),this.shutdownPromise=(async()=>{try{try{await this.waitForExtensionsBound()}catch(a){console.error("[pi-web] extension binding failed before session shutdown:",a instanceof Error?a.message:a)}this.sessionShutdownEmitted||(this.sessionShutdownEmitted=!0,await this.inner.extensionRunner.emit?.({type:"session_shutdown",reason:"quit"}))}finally{this.destroy()}})(),this.shutdownPromise):void 0}resolveExtensionUiResponse(a){let b=this.pendingUiResponses.get(a.id);b&&b.resolve(a)}getExtensionStatuses(){return Array.from(this.extensionStatuses,([a,b])=>({key:a,text:b}))}getExtensionWidgets(){return Array.from(this.extensionWidgets.values())}getCustomUiWidth(a){if(!a||"object"!=typeof a)return C.p1;let b=a.overlayOptions,c="function"==typeof b?b():b;if(!c||"object"!=typeof c)return C.p1;let d=c.width;return"number"==typeof d&&Number.isFinite(d)?Math.max(40,Math.min(140,Math.round(d))):C.p1}emitCustomUiRender(a,b){let c;try{c=b.component.render(b.width)}catch(a){c=[`Extension custom UI render failed: ${a instanceof Error?a.message:String(a)}`]}let d={type:"extension_ui_request",id:a,method:"custom",lines:c};this.pendingUiRequests.set(a,d),this.emit(d)}closeCustomUi(a,b){let c=this.activeCustomUis.get(a);if(c&&!c.settled){c.settled=!0,this.activeCustomUis.delete(a),this.pendingUiRequests.delete(a);try{c.component.dispose?.()}catch{}this.emit({type:"extension_ui_request",id:a,method:"custom",lines:[],closed:!0}),c.resolve(b)}}handleExtensionUiInput(a,b){let c=this.activeCustomUis.get(a);if(c&&"string"==typeof b)try{c.component.handleInput?.(b),this.activeCustomUis.has(a)&&this.emitCustomUiRender(a,c)}catch(b){this.closeCustomUi(a,void 0),this.emit({type:"extension_error",extensionPath:`custom-ui:${a}`,event:"custom_ui_input",error:b instanceof Error?b.message:String(b)})}}requestExtensionCustomUi(a,b){if("function"!=typeof a)return Promise.resolve(void 0);let c=this.extensionUiAbortController.signal;if(c.aborted)return Promise.reject(c.reason);let d=(0,g.randomUUID)(),e=this.getCustomUiWidth(b);return new Promise((b,f)=>{let g=!1,h=(0,C.TQ)(()=>{let a=this.activeCustomUis.get(d);a&&this.emitCustomUiRender(d,a)},e),i=a=>{g||(g=!0,c.removeEventListener("abort",k),c.aborted?f(c.reason):b(a))},j=a=>{this.activeCustomUis.has(d)?this.closeCustomUi(d,a):i(a)},k=()=>j(void 0);c.addEventListener("abort",k,{once:!0}),Promise.resolve().then(()=>g?void 0:a(h,am,an,j)).then(a=>{if(g){try{a?.dispose?.()}catch{}return}if(!a||"object"!=typeof a||"function"!=typeof a.render)return void i(void 0);let b={component:a,width:e,resolve:a=>i(a),settled:!1};this.activeCustomUis.set(d,b),this.emitCustomUiRender(d,b)}).catch(a=>{g||(this.emit({type:"extension_error",extensionPath:`custom-ui:${d}`,event:"custom_ui",error:a instanceof Error?a.message:String(a)}),i(void 0))})})}requestExtensionUi(a,b,c,d,e){if(e?.aborted)return Promise.resolve(b);let f=this.extensionUiAbortController.signal;if(f.aborted)return Promise.reject(f.reason);let h=e?AbortSignal.any([e,f]):f,i=(0,g.randomUUID)(),j={type:"extension_ui_request",id:i,...a,...d?{timeout:d,expiresAt:Date.now()+d}:{}};return new Promise((a,e)=>{let g,k=!1,l=()=>{g&&clearTimeout(g),h.removeEventListener("abort",n),this.pendingUiRequests.delete(i),this.pendingUiResponses.delete(i),this.emit({type:"extension_ui_closed",id:i})},m=b=>{k||(k=!0,l(),f.aborted?e(f.reason):a(b))},n=()=>m(b);d&&(g=setTimeout(()=>m(b),d)),h.addEventListener("abort",n,{once:!0}),this.pendingUiRequests.set(i,j),this.pendingUiResponses.set(i,{resolve:a=>m(c(a)),cancel:()=>m(b)}),this.emit(j)})}createExtensionUiContext(){return{select:(a,b,c)=>this.requestExtensionUi({method:"select",title:a,options:b,...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),confirm:(a,b,c)=>this.requestExtensionUi({method:"confirm",title:a,message:b,...c?.timeout?{timeout:c.timeout}:{}},!1,a=>"confirmed"in a&&a.confirmed,c?.timeout,c?.signal),input:(a,b,c)=>this.requestExtensionUi({method:"input",title:a,...void 0!==b?{placeholder:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),editor:(a,b,c)=>this.requestExtensionUi({method:"editor",title:a,...void 0!==b?{prefill:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),notify:(a,b)=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",message:a,notifyType:b})},onTerminalInput:()=>()=>{},setStatus:(a,b)=>{void 0===b?this.extensionStatuses.delete(a):this.extensionStatuses.set(a,b),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setStatus",statusKey:a,statusText:b})},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:(a,b,c)=>{(void 0===b||Array.isArray(b))&&(void 0===b?this.extensionWidgets.delete(a):this.extensionWidgets.set(a,{key:a,lines:b,placement:c?.placement??"aboveEditor"}),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:b,widgetPlacement:c?.placement}))},setFooter:()=>{},setHeader:()=>{},setTitle:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setTitle",title:a})},custom:(a,b)=>this.requestExtensionCustomUi(a,b),pasteToEditor:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},setEditorText:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},getEditorText:()=>"",addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>void 0,get theme(){return am},getAllThemes:()=>[],getTheme:()=>void 0,setTheme:()=>({success:!1,error:"Theme switching is not supported in pi-web extension UI yet"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}}}syncProjectTrust(){this.inner.settingsManager.setProjectTrusted((0,n.Y1)(this.cwd,(0,e.getAgentDir)()).trusted)}createExtensionCommandContextActions(){return{waitForIdle:async()=>{let a=this.inner.agent;await a.waitForIdle?.()},newSession:async()=>({cancelled:!0}),fork:async()=>({cancelled:!0}),navigateTree:async(a,b)=>({cancelled:(await this.inner.navigateTree(a,{summarize:b?.summarize})).cancelled}),switchSession:async()=>({cancelled:!0}),reload:async()=>{this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.syncProjectTrust(),await this.inner.reload({beforeSessionStart:()=>{this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc")}}),this.applyExactSystemPrompt()}}}}function I(a){a&&(a.persist=!1)}function J(a){globalThis.__piSessionLifecycles??=new Map;let b=globalThis.__piSessionLifecycles.get(a);return b||(b={generation:0,barriers:0,deleted:!1,starts:new Set},globalThis.__piSessionLifecycles.set(a,b)),b}function K(a,b){let c=J(a);if(c.deleted||c.barriers>0||void 0!==b&&c.generation!==b)throw Error("Session was deleted or is being changed; retry after the operation finishes")}function L(a){let b=[...new Set(a)].map(a=>[a,J(a)]),c=new Set;for(let[,a]of b)for(let b of(a.generation+=1,a.barriers+=1,a.starts))c.add(b);for(let a of c)a.cancel(Error("Session startup cancelled: session is being deleted or changed"));let d=!1;return{ready:Promise.allSettled([...c].map(a=>a.settled)).then(()=>void 0),finish:(a=[])=>{if(d)return;d=!0;let c=new Set(a);for(let[a,d]of b)d.barriers-=1,c.has(a)&&(d.deleted=!0)}}}function M(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let a=()=>Promise.allSettled(Array.from(globalThis.__piSessions?.values()??[],a=>a.shutdown()));process.once("exit",()=>globalThis.__piSessions?.forEach(a=>a.destroy())),process.once("SIGINT",()=>{a().finally(()=>process.exit(130))}),process.once("SIGTERM",()=>{a().finally(()=>process.exit(143))})}return globalThis.__piSessions}function N(a){let b=(0,i.resolve)(a);try{return(0,h.realpathSync)(b)}catch{return b}}function O(){return globalThis.__piStartingSessionCwds||(globalThis.__piStartingSessionCwds=new Map),globalThis.__piStartingSessionCwds}function P(a){return M().get(a)}function Q(a){let b=N(a);return!!O().has(b)||Array.from(M().values()).some(a=>N(a.cwd)===b&&a.isRunning())}async function R(a){let b=N(a),c=Array.from(M().values()).filter(a=>N(a.cwd)===b);return await Promise.all(c.map(a=>a.shutdown())),c.length}function S(){let a=[];for(let[b,c]of M()){if(!c.isAlive())continue;let d=c.runtimeSnapshot();d.running&&a.push({...d,id:d.id||b})}return a}function T(a){return globalThis.__piRunningListeners??=new Set,globalThis.__piRunningListeners.add(a),()=>globalThis.__piRunningListeners?.delete(a)}let ap="";function U(){let a=globalThis.__piRunningListeners;if(!a||0===a.size){ap="";return}let b=S(),c=JSON.stringify(b);if(c!==ap)for(let d of(ap=c,a))try{d(b)}catch{}}async function V(a,b,c){let d=(0,r.vw)(c),f=P(a);if(!f?.isAlive()){if(!b)throw Error("Session not found");let c=e.SessionManager.open(b,void 0);if((0,q.ph)(c.getEntries()))throw Error("Subagent tool selection is fixed by its profile");(0,r.b5)(c,d),(0,o.mD)();let f=await ae(a,b,void 0);return{session:f.session,sessionId:f.realSessionId,recreated:!1}}if(f.isRunning())throw Error("Cannot change tools while the session is running");if((0,q.ph)(f.inner.sessionManager.getEntries()))throw Error("Subagent tool selection is fixed by its profile");let i="function"!=typeof f.isChatOnly||"function"!=typeof f.setActiveToolSelection||f.isChatOnly()!==(0===d.length);if((0,r.b5)(f.inner.sessionManager,d),(0,o.mD)(),!i)return f.setActiveToolSelection(d),{session:f,sessionId:a,recreated:!1};let j=f.sessionFile&&(0,h.existsSync)(f.sessionFile)?f.sessionFile:void 0,k=f.cwd,l=f.inner.model,m=f.inner.agent.state?.thinkingLevel;if(await f.shutdown(),j){let b=await ae(a,j,void 0);return{session:b.session,sessionId:b.realSessionId,recreated:!0}}let n=await ae(`__recreate__${(0,g.randomUUID)()}`,"",k,{toolNames:d,...l?{initialModel:{provider:l.provider,modelId:l.id}}:{},allowInitialModelFallback:!0,...m&&af.has(m)?{thinkingLevel:m}:{}});return{session:n.session,sessionId:n.realSessionId,recreated:!0}}function W(a={}){let b=[];for(let c of M().values()){if("function"!=typeof c.isAlive||!c.isAlive())continue;let d=c.inner?.sessionManager;if(!d)continue;let e=d.getHeader(),f=d.getEntries(),g=f.filter(a=>"message"===a.type),i=g.find(a=>"user"===a.message.role),j=d.getSessionFile()??c.sessionFile,k=!!(j&&(0,h.existsSync)(j)),l=(0,q.$u)(f,e?.id??c.sessionId,j??"");if(!k&&!a.includeTransient&&(!c.isRunning()||!i))continue;let m=e?.timestamp??f[0]?.timestamp??new Date().toISOString(),n=new Date(m).getTime(),o=Number.isNaN(n)?Date.now():n;for(let a of g){let b=function(a){if("user"!==a.message.role&&"assistant"!==a.message.role)return;if("number"==typeof a.message.timestamp)return a.message.timestamp;let b=new Date(a.timestamp).getTime();return Number.isNaN(b)?void 0:b}(a);void 0!==b&&(o=Math.max(o,b))}b.push({path:j??"",id:e?.id??c.sessionId,cwd:e?.cwd??c.cwd,name:d.getSessionName(),created:m,modified:new Date(o).toISOString(),messageCount:g.length,firstMessage:i&&function(a){if("bashExecution"===a.message.role)return"";let b=a.message.content;return"string"==typeof b?b:b.map(a=>"text"===a.type?a.text:"").filter(Boolean).join(" ")}(i)||"(no messages)",...l?{parentSessionId:l.parentSessionId,relation:{kind:"subagent",parentSessionId:l.parentSessionId,profile:l.profile,description:l.description,status:c.isRunning()?"running":l.status}}:{},transient:!k})}return b}function X(){let a=new Set;for(let[b,c]of M())c.isRunning()&&c.hasSuppressedCompletionNotifications()&&a.add(c.sessionId||b);return[...a]}function Y(){return S().map(a=>a.id)}let aq=(0,t.s)({getSession:a=>M().get(a),registerSession:(a,b)=>{let c,d,e;c=new ao(a,a.sessionManager.getCwd()),b?.chatOnly?c.setForceEmptySystemPrompt(!0):b?.exactSystemPrompt&&c.setExactSystemPrompt(b.exactSystemPrompt),c.setChatOnly(!!b?.chatOnly),c.setSuppressCompletionNotifications(!0),c.start(),d=a.sessionId,e=M(),c.onDestroy(()=>e.delete(d)),e.set(d,c)},reopenSession:async(a,b)=>(await ae(a,b,void 0)).session,resolveSessionPath:o.os,invalidateSessionList:o.mD,notifyRunningChange:U,isBuiltInSubagentsEnabled:u.N});function Z(a){return aq.get(a)}function $(a,b){return aq.steer(a,b)}function _(a){return aq.abort(a)}function aa(a){return globalThis.__piSessionBusListeners??=new Set,globalThis.__piSessionBusListeners.add(a),()=>globalThis.__piSessionBusListeners?.delete(a)}!function(){try{let a=(0,u.M6)();if((0,h.existsSync)(a))return;(0,h.mkdirSync)(a.slice(0,a.lastIndexOf("/")),{recursive:!0}),(0,h.writeFileSync)(a,JSON.stringify({builtInEnabled:!0},null,2)+"\n")}catch(a){console.warn("[pi-web] failed to seed agents/settings.json:",a instanceof Error?a.message:a)}}();let ar=new Map;function ab(a){let b=globalThis.__piSessionBusListeners;if(b&&0!==b.size)for(let c of b)try{c(a)}catch{}}function ac(a,b,c){let d=globalThis.__piSessionBusListeners;if(!d||0===d.size)return;if("message_update"!==a)return void ab({type:a,sessionId:b,payload:c});let e=ar.get(b),f={type:a,sessionId:b,payload:c};e?(clearTimeout(e.timer),e.event=f):ar.set(b,{event:f,timer:setTimeout(()=>{let a=ar.get(b);a&&(ar.delete(b),ab(a.event))},80)})}function ad(a,b){let c=Date.now(),{provider:d,modelId:e,sessionId:f}=b,g=a.result.bind(a);a.result=async()=>{let a,b,h,i,j,k=await g();return a=Date.now()-c,b="error"===k.stopReason||"aborted"===k.stopReason,h=k.errorMessage?.trim(),j=(i=h?.match(/\bHTTP\s+(\d{3})\b|\bstatus(?:\s+code)?\s*[:=]?\s*(\d{3})\b/))?Number(i[1]??i[2]):void 0,(0,D.wF)({level:b?"error":"info",source:"model-call",provider:d,model:e,sessionId:f,...void 0!==j?{statusCode:j}:{},message:b?`模型调用失败 ${d}/${e}${h?`:${h}`:""}`:`模型调用成功 ${d}/${e}`,details:b?void 0:`耗时 ${a}ms`}),k};let h=a[Symbol.asyncIterator].bind(a);return a[Symbol.asyncIterator]=()=>{let a=h();return{next:()=>a.next().catch(a=>{throw(0,D.wF)({level:"error",source:"model-call",provider:d,model:e,sessionId:f,message:`模型调用传输错误 ${d}/${e}:${a instanceof Error?a.message:String(a)}`}),a})}},a}async function ae(a,b,d,f={}){let g,i,j,k,r,s,t,v,w,x,{toolNames:z,initialModel:A,thinkingLevel:B,allowInitialModelFallback:C}=f,D=M(),E=(globalThis.__piStartLocks||(globalThis.__piStartLocks=new Map),globalThis.__piStartLocks),G=J(a),L=G.generation;K(a,L);let P=D.get(a);if(P?.isAlive()&&!P.isShuttingDown())return{session:P,realSessionId:a,created:!1};if(P){let a=P.whenShutdown();if(a){let b;try{await Promise.race([a,new Promise(a=>{b=setTimeout(a,1e4)})])}finally{clearTimeout(b)}}}K(a,L);let Q=E.get(a);if(Q)return Q;if(b){if(!(0,h.existsSync)(b))throw Error("Session not found");if((g=e.SessionManager.open(b,void 0)).getSessionId()!==a)throw Error("Session identity changed")}else{if(!d)throw Error("cwd is required for a new session");g=e.SessionManager.create(d,void 0)}let R=g.getSessionId(),S=J(R),T=S.generation;K(R,T);let U=g.getCwd(),V=b?(0,q.ph)(g.getEntries()):null,W=(w=O(),x=N(U),w.set(x,(w.get(x)??0)+1),()=>{let a=(w.get(x)??1)-1;a>0?w.set(x,a):w.delete(x)}),X=new AbortController,Y=setTimeout(()=>X.abort(),25e3),Z=!1,$=!1,_=()=>{if(k&&!$){$=!0;try{k.cleanup()}catch{}}},aa=()=>{I(g);let a=r;if(a&&t!==a)if(t=a,s)s.destroy();else try{a.dispose()}catch{}_()},ab=new Promise((a,b)=>{v=b}),ac={settled:Promise.resolve(),cancel:a=>{j||(j=a,X.abort(a),aa(),v(a))}};G.starts.add(ac),S.starts.add(ac);let af=()=>{if(j)throw j;K(a,L),K(R,T)},ag=(async()=>{let b=V?.tools??z??[],d=0===b.length;d||(0,e.initTheme)();let f=(0,e.getAgentDir)(),h=V?.tools;V||void 0===z||(h=0===b.length?[]:void 0);let t=V?void 0:(0,n.Fk)(U,f),v=await (0,e.createAgentSessionServices)({cwd:U,agentDir:f,modelRuntimeSignal:X.signal,resourceLoaderOptions:V?{noExtensions:!0,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,appendSystemPrompt:V.appendSystemPrompt}:{extensionFactories:[(0,p.Vj)(aq.extensionRuntime,()=>(0,q.IR)(U),u.N)],extensionsOverride:a=>(0,p.U6)(a)},...t?{resourceLoaderReloadOptions:t}:{}});af();let{createAsyncBashTools:w}=await Promise.resolve().then(c.bind(c,44271));af(),k=new F.B;let x=w(k),E=await (0,m.py)(v.modelRuntime,v.settingsManager.getEnabledModels(),{signal:X.signal});af();let G=A&&(!C||E.visible.some(a=>a.provider===A.provider&&a.id===A.modelId))?A:void 0,I=v.settingsManager.getDefaultProvider(),J=v.settingsManager.getDefaultModel(),K=g.getBranch(),L=K.some(a=>"message"===a.type),N=L?(0,o.Vg)(K):null,O=N?v.modelRuntime.getModel(N.provider,N.modelId):void 0,P=L?null:(0,m.IR)(E,{...G?{requestedModel:G}:{},...I&&J?{defaultModel:{provider:I,modelId:J}}:{},...B?{thinkingLevel:B}:{}}),Q=O&&v.modelRuntime.hasConfiguredAuth(O.provider)?O:P?.model;af();let R=(0,e.createAgentSessionFromServices)({services:v,sessionManager:g,...Q?{model:Q}:{},...P?.thinkingLevel?{thinkingLevel:P.thinkingLevel}:{},...E.scopedModels.length>0?{scopedModels:[...E.scopedModels]}:{},...void 0!==h?{tools:h}:{},customTools:x});R.then(({session:a})=>{r=a,j&&aa()},()=>{}),i=setTimeout(()=>{ac.cancel(Error("Session startup timed out while binding extensions/resources (40s)"))},4e4);let{session:S}=await Promise.race([R,ab]);clearTimeout(i),af();try{let b=S.agent,c=b.streamFunction;b.streamFunction=(b,d,e)=>{let f=c(b,d,e);return f instanceof Promise?f.then(c=>ad(c,{provider:b.provider,modelId:b.id,sessionId:a})):ad(f,{provider:b.provider,modelId:b.id,sessionId:a})},af();let e=await (0,y.o)(v.settingsManager,{...A?{model:A}:{},...B?{thinkingLevel:B}:{}},{...S.model?{model:{provider:S.model.provider,modelId:S.model.id}}:{},thinkingLevel:S.agent.state?.thinkingLevel??"off",supportsThinking:S.supportsThinking()});af(),e.modelDefaultChanged&&(0,l.k)(),!V&&z&&z.length>0&&S.setActiveToolsByName(H(S,z)),af();let f=new ao(S,U);s=f,f.setChatOnly(d),f.setSuppressCompletionNotifications(void 0!==V),z?.length===0||V?.tools.length===0?f.setForceEmptySystemPrompt(!0):V&&V.appendSystemPrompt.length>0&&f.setExactSystemPrompt(V.appendSystemPrompt[0]),f.start(),f.loadQueueRecovery();let g=S.sessionId,h=S.sessionFile;return h&&(0,o.O8)(g,h),f.persistSessionFileIfMissing(),f.onDestroy(()=>{_(),D.get(g)===f&&D.delete(g)}),D.set(g,f),f.beginExtensionBinding({forceEmptySystemPrompt:z?.length===0}),!function(){let a=M();if(a.size<=12)return;let b=Array.from(a.entries()).filter(([,a])=>a.isAlive()&&!a.isRunning()&&!a.hasSubscribers()).sort((a,b)=>a[1].activityTimestamp-b[1].activityTimestamp),c=a.size-12;for(let[d,e]of b){if(c<=0)break;a.has(d)&&(console.log(`[pi-web] evicting idle unwatched session ${d} (registry cap 12)`),e.shutdown().catch(a=>{console.error(`[pi-web] failed to evict session ${d}:`,a instanceof Error?a.message:a)}),c-=1)}}(),{session:f,realSessionId:g,created:!0}}catch(a){throw aa(),a}})().catch(a=>{throw aa(),a}),ah=setTimeout(()=>{ac.cancel(Error("Session startup timed out after 60s (extension/resource binding may be hung); the start lock was released — retry the request to start over."))},6e4),ai=Promise.race([ag,ab]).finally(()=>{E.get(a)===ai&&E.delete(a),Z||(Z=!0,clearTimeout(Y),clearTimeout(ah),clearTimeout(i),G.starts.delete(ac),S.starts.delete(ac),W())});return ac.settled=ai,E.set(a,ai),ai}d()}catch(a){d(a)}})},64735:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{S3:()=>k,lN:()=>j});var e=c(6999),f=c(67264),g=c(36193),h=a([e]);e=(h.then?(await h)():h)[0];let l="modes",m="modesPerSession";function i(a){if(!a||"object"!=typeof a||Array.isArray(a))return null;let b=a.permissionRules,c=(0,g.kP)((0,g.ni)(b));return{collaborationMode:(0,f.UY)(a.collaborationMode),tokenMode:(0,f.wI)(a.tokenMode),toolApprovalMode:(0,f.g0)(a.toolApprovalMode),permissionRules:{allow:Array.isArray(c.allow)?c.allow:[],ask:Array.isArray(c.ask)?c.ask:[],deny:Array.isArray(c.deny)?c.deny:[]}}}function j(a){let b=(0,f.Md)(),c=(0,e.Tu)();if(a){let b=c[m];if(b&&"object"==typeof b&&!Array.isArray(b)){let c=i(b[a]);if(c)return c}}return i(c[l])??b}async function k(a,b){let c={collaborationMode:(0,f.UY)(a.collaborationMode),tokenMode:(0,f.wI)(a.tokenMode),toolApprovalMode:(0,f.g0)(a.toolApprovalMode),permissionRules:a.permissionRules};await (0,e.o$)(a=>{if(b){let d=a[m]??{};d[b]=c,a[m]=d}else a[l]=c;return{settings:a}})}d()}catch(a){d(a)}})},71069:(a,b,c)=>{c.d(b,{TQ:()=>e,p1:()=>d});let d=92;function e(a,b=d,c=40){return Object.freeze({terminal:Object.freeze({columns:b,rows:c,kittyProtocolActive:!1}),requestRender:a})}},72498:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Fk:()=>i,Y1:()=>g,er:()=>h});var e=c(75430),f=a([e]);function g(a,b){return a&&(0,e.hasTrustRequiringProjectResources)(a)?{requiresTrust:!0,trusted:!0===new e.ProjectTrustStore(b).get(a)}:{requiresTrust:!1,trusted:!0}}function h(a,b){let c=g(a,b);return c.requiresTrust?(new e.ProjectTrustStore(b).set(a,!0),{requiresTrust:!0,trusted:!0}):c}function i(a,b){if(!g(a,b).requiresTrust)return;let c=new e.ProjectTrustStore(b);return{resolveProjectTrust:async()=>!0===c.get(a)}}e=(f.then?(await f)():f)[0],d()}catch(a){d(a)}})},78963:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{H4:()=>m,kx:()=>k,qV:()=>o,t0:()=>n});var e=c(73024),f=c(76760),g=c(75430),h=c(80974),i=c.n(h),j=a([g]);function k(a=(0,g.getAgentDir)()){return(0,f.join)(a,"extension-tools.json")}function l(a){return"object"!=typeof a||null===a||Array.isArray(a)?{disabled:[]}:{disabled:Array.isArray(a.disabled)?[...new Set(a.disabled.filter(a=>"string"==typeof a&&""!==a.trim()).map(a=>a.trim()))]:[]}}function m(a,b){if(0===b.disabled.length)return[...a];let c=new Set(b.disabled);return a.filter(a=>!c.has(a))}function n(a=k()){if(!(0,e.existsSync)(a))return{disabled:[]};try{return l(JSON.parse((0,e.readFileSync)(a,"utf8")))}catch{return{disabled:[]}}}async function o(a,b=k()){let c=l(a);(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0});try{(0,e.writeFileSync)(b,JSON.stringify({version:1,disabled:[]},null,2),{flag:"wx",mode:384})}catch(a){if("EEXIST"!==a.code)throw a}let d=await i().lock(b,{realpath:!1,retries:10});try{(0,e.writeFileSync)(b,`${JSON.stringify({version:1,disabled:c.disabled},null,2)}
18
21
  `,"utf8"),(0,e.chmodSync)(b,384)}finally{await d()}return c}g=(j.then?(await j)():j)[0],d()}catch(a){d(a)}})},78970:(a,b,c)=>{c.d(b,{kc:()=>d});function d(a){if(void 0===a)return null;if(!Array.isArray(a))return"images must be an array";if(a.length>10)return"A message can include at most 10 images";for(let b of a)if(!function(a){var b;if(!a||"object"!=typeof a||"image"!==a.type||"string"!=typeof a.data||"string"!=typeof a.mimeType||(b=a.mimeType,!/^image\/[A-Za-z0-9][A-Za-z0-9!#$&^_.+-]*$/.test(b)))return!1;let c=function(a){if(!a||a.length%4!=0)return null;let b=a.endsWith("==")?2:+!!a.endsWith("="),c=a.length-b,d=null;for(let b=0;b<c;b+=1){var e;let c=(e=a.charCodeAt(b))>=65&&e<=90?e-65:e>=97&&e<=122?e-97+26:e>=48&&e<=57?e-48+52:43===e?62:47===e?63:null;if(null===c)return null;d=c}for(let b=c;b<a.length;b+=1)if("="!==a[b])return null;return 2===b&&d%16!=0||1===b&&d%4!=0?null:a.length/4*3-b}(a.data);return null!==c&&c<=0xa00000}(b))return"Each image must be valid base64 image data with an image MIME type and be 10MB or smaller";return null}},95412:(a,b,c)=>{function d(a,b){if("string"!=typeof a||0===a.trim().length)throw Error(`Session liveness provider ${b} must be a non-empty string`)}c.d(b,{Vj:()=>j,mb:()=>h,u4:()=>i});let e=function(){let a,b=globalThis,c=Symbol.for("@agegr/pi-web/session-liveness/v1"),e=b[c];if(e&&"object"==typeof e&&1===e.version&&"function"==typeof e.register&&"function"==typeof e.hasActiveProvider)return e;let f=(a=new Map,{version:1,register(b){if(!b||"object"!=typeof b)throw Error("Session liveness provider must be an object");if(d(b.name,"name"),d(b.sessionId,"sessionId"),void 0!==b.sessionFile&&d(b.sessionFile,"sessionFile"),"function"!=typeof b.isActive)throw Error("Session liveness provider isActive must be a function");let c=Symbol(b.name);a.set(c,b);let e=!1;return()=>{e||(e=!0,a.delete(c))}},hasActiveProvider(b){let c=new Set([b.sessionId,b.sessionFile].filter(a=>!!a));for(let b of a.values())if(c.has(b.sessionId)||b.sessionFile&&c.has(b.sessionFile))try{let a=b.isActive();if("boolean"!=typeof a)throw Error("isActive() must return a boolean");if(a)return!0}catch(a){return console.error(`[pi-web] Session liveness provider '${b.name}' failed; preserving the session:`,a),!0}return!1}});return b[c]=f,f}();function f(){let a=globalThis,b=Symbol.for("@agegr/pi-web/session-liveness-leases/v1"),c=a[b];if(c instanceof Map)return c;let d=new Map;return a[b]=d,d}function g(a){a.timer&&clearTimeout(a.timer),a.timer=setTimeout(()=>{!a.released&&a.expiresAt<=Date.now()?a.release():a.released||g(a)},Math.max(1,a.expiresAt-Date.now()));let b=a.timer.unref;b?.call(a.timer)}function h(a){var b;let c=f(),d=(b={name:"pi-web-selected-session",sessionId:a,isActive:()=>!h.released&&h.expiresAt>Date.now()},e.register(b)),h={sessionId:a,expiresAt:Date.now()+9e4,released:!1,timer:null,renew:()=>{h.released||(h.expiresAt=Date.now()+9e4,g(h))},release:()=>{if(h.released)return;h.released=!0,h.timer&&clearTimeout(h.timer),d();let b=c.get(a);b?.delete(h),b?.size===0&&c.delete(a)}},i=c.get(a)??new Set;return i.add(h),c.set(a,i),g(h),h}function i(a){let b=f().get(a);if(!b)return 0;let c=0;for(let a of[...b]){if(a.released||a.expiresAt<=Date.now()){a.release();continue}a.renew(),c+=1}return c}function j(a){return e.hasActiveProvider(a)}},99324:(a,b,c)=>{c.d(b,{Wv:()=>h,jN:()=>j,vH:()=>i});var d=c(29021),e=c(33873),f=c(82536),g=c(58864);let h=8;function i(a,b){if(b.length>h)throw Error(`Agent input_files accepts at most ${h} files`);let c=(0,d.realpathSync)(a),i=new Set([c]),j=new TextDecoder("utf-8",{fatal:!0}),k=new Set,l=[],m=0;for(let h of b){let b,n;if(!h.trim())throw Error("Agent input_files paths must not be empty");try{b=(0,d.realpathSync)((0,e.resolve)(a,h))}catch{throw Error(`Agent input file does not exist: ${h}`)}if(!(0,f.o)(b,i))throw Error(`Agent input file is outside the session cwd: ${h}`);if(!(0,d.statSync)(b).isFile())throw Error(`Agent input path is not a file: ${h}`);if(k.has(b))continue;k.add(b);let o=(0,d.readFileSync)(b);if((m+=o.byteLength)>524288)throw Error("Agent input_files exceeds the 524288-byte total limit");try{n=j.decode(o)}catch{throw Error(`Agent input file is not valid UTF-8 text: ${h}`)}l.push({path:(0,g.W3)((0,e.relative)(c,b)),content:n})}return l}function j(a,b){if(0===b.length)return a;let c=b.map(a=>`<document path=${JSON.stringify(a.path)}>
19
22
  ${a.content}
20
23
  </document>`).join("\n\n");return`${a}