pi-webapp 0.1.24 → 0.1.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/extension.js CHANGED
@@ -1,44 +1,44 @@
1
- (function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new r.Error().stack;e&&(r._sentryDebugIds=r._sentryDebugIds||{},r._sentryDebugIds[e]="0154e117-4e78-4f70-8313-bc1dd639a757",r._sentryDebugIdIdentifier="sentry-dbid-0154e117-4e78-4f70-8313-bc1dd639a757")}catch{}})();import{delimiter as Do,dirname as Oo,join as Xe,resolve as Ct}from"node:path";import{realpathSync as gi,watch as Fo}from"node:fs";import{fileURLToPath as Bo}from"node:url";import{DefaultPackageManager as yi,getAgentDir as ae,ModelRuntime as $o,SessionManager as bi,SettingsManager as jo,VERSION as Ye}from"@earendil-works/pi-coding-agent";import{getSupportedThinkingLevels as Lo}from"@earendil-works/pi-ai";import{randomBytes as jr,randomUUID as pt,timingSafeEqual as ms}from"node:crypto";import{readFile as gs,readdir as hs}from"node:fs/promises";import{createServer as ws}from"node:http";import{join as ut}from"node:path";import{getAgentDir as ys}from"@earendil-works/pi-coding-agent";import{isAbsolute as tn,relative as rn}from"node:path";var de={git:"@pi-webapp/git",files:"@pi-webapp/files",terminal:"@pi-webapp/terminal"};var _t={id:de.git,kind:"builtin",version:"1.0.0",name:{zh:"Git",en:"Git"},description:{zh:"\u5BA1\u9605\u5DE5\u4F5C\u533A\u6539\u52A8\u4E0E\u63D0\u4EA4\u5386\u53F2\uFF0C\u6682\u5B58\u6587\u4EF6\u3001\u63D0\u4EA4\u5E76\u7BA1\u7406\u672C\u5730\u5206\u652F\u3002",en:"Review workspace changes and history, stage files, commit and manage local branches."}};import{execFile as Si}from"node:child_process";import{realpath as xi}from"node:fs/promises";import{isAbsolute as Tt,relative as Ii,sep as Ci,win32 as _i}from"node:path";var P=class extends Error{status;reason;constructor(e,t=400,i="git_failed"){super(e),this.name="WorkspaceGitError",this.status=t,this.reason=i}};function T(r,e,t=2*1024*1024,i={}){let n=Object.fromEntries(Object.entries(process.env).filter(([s])=>!s.startsWith("GIT_")));return new Promise((s,a)=>{let l,p=Si("git",["--no-pager","--literal-pathspecs","-c","core.fsmonitor=false",...e],{cwd:r,env:{...n,LC_ALL:"C",GIT_OPTIONAL_LOCKS:"0",GIT_TERMINAL_PROMPT:"0",GIT_NO_REPLACE_OBJECTS:"1"},encoding:"utf8",timeout:i.write?3e4:1e4,maxBuffer:t,windowsHide:!0},(h,u,c)=>{if(!h){if(l){a(new P("Git \u8F93\u5165\u4F20\u8F93\u5931\u8D25\uFF0C\u64CD\u4F5C\u7ED3\u679C\u672A\u786E\u8BA4\uFF0C\u8BF7\u5237\u65B0\u68C0\u67E5\u4ED3\u5E93\u72B6\u6001\uFF1B\u4E0D\u8981\u81EA\u52A8\u91CD\u8BD5",503,i.write?"outcome_unknown":"git_failed"));return}s(u);return}if(i.write){let m=h.killed||h.code==="ERR_CHILD_PROCESS_STDIO_MAXBUFFER"?"outcome_unknown":/index\.lock|cannot lock ref|could not lock/i.test(c)?"index_locked":/already exists/i.test(c)?"branch_exists":/already checked out|used by worktree/i.test(c)?"branch_in_use":/would be overwritten|local changes/i.test(c)?"dirty_worktree":/identity unknown|unable to auto-detect email|empty ident/i.test(c)?"identity_missing":"git_failed";a(new P("Git \u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u68C0\u67E5\u4ED3\u5E93\u72B6\u6001\u3001\u8EAB\u4EFD\u6216 hooks \u914D\u7F6E",m==="outcome_unknown"?503:409,m));return}let f=h.code;f==="ENOENT"?a(new P("Git \u672A\u5B89\u88C5\u6216\u5DE5\u4F5C\u533A\u4E0D\u53EF\u7528",503)):f==="ERR_CHILD_PROCESS_STDIO_MAXBUFFER"?a(new P("Git \u8F93\u51FA\u8FC7\u5927\uFF0C\u8BF7\u7F29\u5C0F\u8BFB\u53D6\u8303\u56F4",413)):/not a git repository/.test(c)?a(new P("\u5F53\u524D\u76EE\u5F55\u4E0D\u662F Git \u4ED3\u5E93",404)):a(new P(h.killed?"Git \u8BFB\u53D6\u8D85\u65F6\uFF0C\u8BF7\u91CD\u8BD5":"Git \u8BFB\u53D6\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u4ED3\u5E93\u72B6\u6001\u548C\u76EE\u5F55\u6743\u9650",503))});p.stdin?.on("error",h=>{l=h}),i.input!==void 0&&p.stdin?.end(i.input)})}async function X(r){let e=await xi(r),t;try{t=(await T(e,["rev-parse","--show-toplevel"])).replace(/\n$/,"")}catch(n){if(n instanceof P&&n.status===404)return{kind:"not-repository"};if(n instanceof P&&n.message==="Git \u672A\u5B89\u88C5\u6216\u5DE5\u4F5C\u533A\u4E0D\u53EF\u7528")return{kind:"unavailable"};throw n}let i=Ii(t,e).split(Ci).join("/");if(i===".."||i.startsWith("../")||Tt(i))throw new P("\u4ED3\u5E93\u4F4D\u4E8E\u5DE5\u4F5C\u533A\u4E4B\u5916",403);return{kind:"repository",cwd:e,root:t,scope:i?`${i}/`:""}}function te(r){if(typeof r!="string"||!r||r.length>4096||r.includes("\0")||r.includes("\\")||Tt(r)||_i.isAbsolute(r)||r.split("/").some(e=>!e||e==="."||e===".."))throw new P("\u5DE5\u4F5C\u533A\u6587\u4EF6\u8DEF\u5F84\u65E0\u6548",403)}import{createHash as Vi}from"node:crypto";import{lstat as it,realpath as Gt}from"node:fs/promises";import{dirname as Lt,isAbsolute as Ui,relative as zi,resolve as ve}from"node:path";import{lstat as ji}from"node:fs/promises";import{resolve as Li}from"node:path";import{constants as et}from"node:fs";import{open as Ti,opendir as Mi,realpath as Mt,stat as Wt}from"node:fs/promises";import{isAbsolute as Nt,relative as Ai,resolve as Ri,sep as Wi,win32 as Ni}from"node:path";var Di=1e3,Oi=512*1024,Fi=8*1024*1024,At=1e4,Bi=new Intl.Collator("en",{numeric:!0,sensitivity:"base"}),W=class extends Error{status;constructor(e,t=400){super(e),this.name="WorkspaceFileError",this.status=t}};function Rt(r,e){let t=Ai(r,e);return t!==".."&&!t.startsWith(`..${Wi}`)&&!Nt(t)}async function tt(r,e){if(typeof e!="string"||e.length>4096||e.includes("\0")||e.includes("\\")||Nt(e)||Ni.isAbsolute(e))throw new W("\u5DE5\u4F5C\u533A\u6587\u4EF6\u8DEF\u5F84\u65E0\u6548");let t=await Mt(r),i=Ri(t,e);if(!Rt(t,i))throw new W("\u6587\u4EF6\u4F4D\u4E8E\u5DE5\u4F5C\u533A\u4E4B\u5916",403);let n=await Mt(i);if(!Rt(t,n))throw new W("\u6587\u4EF6\u4F4D\u4E8E\u5DE5\u4F5C\u533A\u4E4B\u5916",403);return n}async function Dt(r){try{return await r()}catch(e){if(e instanceof W)throw e;let t=e.code;throw t==="ENOENT"||t==="ENOTDIR"?new W("\u6587\u4EF6\u6216\u76EE\u5F55\u5DF2\u4E0D\u5B58\u5728",404):t==="EACCES"||t==="EPERM"?new W("\u6CA1\u6709\u6743\u9650\u8BFB\u53D6\u6587\u4EF6\u6216\u76EE\u5F55",403):e}}async function Ot(r,e){return Dt(async()=>{let t=await tt(r,e),i=[],n=!1;for await(let s of await Mi(t)){if(i.length===Di){n=!0;break}let a=e?`${e}/${s.name}`:s.name,l=s.isDirectory()?"directory":s.isFile()?"file":"other";if(s.isSymbolicLink())try{let p=await Wt(await tt(r,a));l=p.isDirectory()?"directory":p.isFile()?"file":"other"}catch{}i.push({name:s.name,path:a,kind:l})}return i.sort((s,a)=>+(a.kind==="directory")-+(s.kind==="directory")||Bi.compare(s.name,a.name)||s.name.localeCompare(a.name)),{path:e,entries:i,truncated:n}})}function $i(r){if(r.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])))return"image/png";if(r[0]===255&&r[1]===216&&r[2]===255)return"image/jpeg";if(["GIF87a","GIF89a"].includes(r.subarray(0,6).toString("ascii")))return"image/gif";if(r.subarray(0,4).toString("ascii")==="RIFF"&&r.subarray(8,12).toString("ascii")==="WEBP")return"image/webp"}async function be(r,e){return Dt(async()=>{let t=await tt(r,e);if(!(await Wt(t)).isFile())throw new W("\u8FD9\u4E0D\u662F\u53EF\u9884\u89C8\u7684\u666E\u901A\u6587\u4EF6");let i=await Ti(t,et.O_RDONLY|et.O_NONBLOCK|(et.O_NOFOLLOW??0));try{let n=await i.stat();if(!n.isFile())throw new W("\u8FD9\u4E0D\u662F\u53EF\u9884\u89C8\u7684\u666E\u901A\u6587\u4EF6");let s={path:e,size:n.size},a=Buffer.alloc(16);await i.read(a,0,a.length,0);let l=$i(a),p=l?Fi:Oi;if(n.size>p)return{...s,kind:"too-large",limit:p,unit:"bytes"};let h=Buffer.alloc(Math.min(n.size+1,p+1)),u=0;for(;u<h.length;){let{bytesRead:m}=await i.read(h,u,h.length-u,u);if(!m)break;u+=m}if(u>n.size)throw new W("\u6587\u4EF6\u6B63\u5728\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u8BFB\u53D6",409);let c=h.subarray(0,u);if(l)return{...s,kind:"image",mimeType:l,data:c.toString("base64")};if(c.some(m=>m===0||m<32&&![9,10,12,13,27].includes(m)))return{...s,kind:"unsupported"};let f=1;for(let m=0;m<c.length-1;m++)if(c[m]===10&&++f>At)return{...s,kind:"too-large",limit:At,unit:"lines"};try{return{...s,kind:"text",text:new TextDecoder("utf-8",{fatal:!0}).decode(c)}}catch{return{...s,kind:"unsupported"}}}finally{await i.close()}})}var Gi=1e3,Ft=512*1024,Bt=1e4;function $t(r,e){return e.startsWith(r)&&e.slice(r.length)||void 0}async function pe(r){let e=await X(r);if(e.kind!=="repository")return e;let{root:t,scope:i}=e,n=await T(e.cwd,["status","--porcelain=v2","--branch","-z","--untracked-files=all","--","."]),s={kind:"repository",root:t,scope:i,branch:null,head:null,upstream:null,ahead:null,behind:null,entries:[],truncated:!1},a=n.split("\0");for(let l=0;l<a.length;l++){let p=a[l];if(p.startsWith("# branch.oid ")){let I=p.slice(13);s.head=I==="(initial)"?null:I;continue}if(p.startsWith("# branch.head ")){let I=p.slice(14);s.branch=I==="(detached)"?null:I;continue}if(p.startsWith("# branch.upstream ")){s.upstream=p.slice(18);continue}if(p.startsWith("# branch.ab ")){let I=p.match(/\+(\d+) -(\d+)/);I&&(s.ahead=Number(I[1]),s.behind=Number(I[2]));continue}let h=p[0];if(!["1","2","u","?"].includes(h??""))continue;let u=h==="?"?1:h==="1"?8:h==="2"?9:10,c=0;for(let I=0;I<u;I++)c=p.indexOf(" ",c)+1;let f=$t(i,p.slice(c)),m=h==="2"?a[++l]:void 0;if(!f)continue;if(s.entries.length===Gi){s.truncated=!0;continue}let g=p.slice(0,c).split(" "),E={path:f,index:h==="?"?"?":g[1][0],worktree:h==="?"?"?":g[1][1],conflict:h==="u",untracked:h==="?",submodule:h!=="?"&&g[2]!=="N..."},x=m===void 0?void 0:$t(i,m);x&&(E.originalPath=x),s.entries.push(E)}return s}async function jt(r,e,t){if(te(e),!["staged","unstaged","untracked"].includes(t))throw new P("Git \u5DEE\u5F02\u8303\u56F4\u65E0\u6548");let i=await pe(r);if(i.kind!=="repository")throw new P("\u5F53\u524D\u5DE5\u4F5C\u533A\u6CA1\u6709\u53EF\u8BFB\u53D6\u7684 Git \u4ED3\u5E93",404);let n={path:e,area:t},s=i.entries.find(l=>l.path===e);if(!s)return{...n,kind:"empty"};if(s.conflict)return{...n,kind:"conflict"};if(s.submodule)return{...n,kind:"submodule"};if(t==="untracked"){if(!s.untracked)return{...n,kind:"empty"};if(!(await ji(Li(r,e))).isFile())return{...n,kind:"unsupported"};let l=await be(r,e);if(l.kind==="too-large")return{...n,kind:"too-large"};if(l.kind!=="text")return{...n,kind:"binary"};if(!l.text)return{...n,kind:"empty"};let p=l.text.split(`
2
- `),h=p.at(-1)==="";h&&p.pop();let u=`--- /dev/null
1
+ (function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new r.Error().stack;e&&(r._sentryDebugIds=r._sentryDebugIds||{},r._sentryDebugIds[e]="241d65c8-d36a-4c12-ae74-f1b6257dc4ef",r._sentryDebugIdIdentifier="sentry-dbid-241d65c8-d36a-4c12-ae74-f1b6257dc4ef")}catch{}})();import{delimiter as Ho,dirname as Jo,join as Ye,resolve as _t}from"node:path";import{realpathSync as ki,watch as qo}from"node:fs";import{fileURLToPath as Ko}from"node:url";import{DefaultPackageManager as Si,getAgentDir as ce,ModelRuntime as Xo,SessionManager as xi,SettingsManager as Yo,VERSION as Ze}from"@earendil-works/pi-coding-agent";import{getSupportedThinkingLevels as Zo}from"@earendil-works/pi-ai";import{randomBytes as Hr,randomUUID as ut,timingSafeEqual as xs}from"node:crypto";import{readFile as Is,readdir as Cs}from"node:fs/promises";import{createServer as _s}from"node:http";import{join as ft}from"node:path";import{getAgentDir as Ts}from"@earendil-works/pi-coding-agent";import{isAbsolute as cn,relative as ln}from"node:path";var pe={git:"@pi-webapp/git",files:"@pi-webapp/files",terminal:"@pi-webapp/terminal"};var Tt={id:pe.git,kind:"builtin",version:"1.0.0",name:{zh:"Git",en:"Git"},description:{zh:"\u5BA1\u9605\u5DE5\u4F5C\u533A\u6539\u52A8\u4E0E\u63D0\u4EA4\u5386\u53F2\uFF0C\u6682\u5B58\u6587\u4EF6\u3001\u63D0\u4EA4\u5E76\u7BA1\u7406\u672C\u5730\u5206\u652F\u3002",en:"Review workspace changes and history, stage files, commit and manage local branches."}};import{execFile as Mi}from"node:child_process";import{realpath as Ai}from"node:fs/promises";import{isAbsolute as Mt,relative as Ri,sep as Ni,win32 as Wi}from"node:path";var P=class extends Error{status;reason;constructor(e,t=400,i="git_failed"){super(e),this.name="WorkspaceGitError",this.status=t,this.reason=i}};function T(r,e,t=2*1024*1024,i={}){let n=Object.fromEntries(Object.entries(process.env).filter(([s])=>!s.startsWith("GIT_")));return new Promise((s,a)=>{let l,p=Mi("git",["--no-pager","--literal-pathspecs","-c","core.fsmonitor=false",...e],{cwd:r,env:{...n,LC_ALL:"C",GIT_OPTIONAL_LOCKS:"0",GIT_TERMINAL_PROMPT:"0",GIT_NO_REPLACE_OBJECTS:"1"},encoding:"utf8",timeout:i.write?3e4:1e4,maxBuffer:t,windowsHide:!0},(g,u,c)=>{if(!g){if(l){a(new P("Git \u8F93\u5165\u4F20\u8F93\u5931\u8D25\uFF0C\u64CD\u4F5C\u7ED3\u679C\u672A\u786E\u8BA4\uFF0C\u8BF7\u5237\u65B0\u68C0\u67E5\u4ED3\u5E93\u72B6\u6001\uFF1B\u4E0D\u8981\u81EA\u52A8\u91CD\u8BD5",503,i.write?"outcome_unknown":"git_failed"));return}s(u);return}if(i.write){let m=g.killed||g.code==="ERR_CHILD_PROCESS_STDIO_MAXBUFFER"?"outcome_unknown":/index\.lock|cannot lock ref|could not lock/i.test(c)?"index_locked":/already exists/i.test(c)?"branch_exists":/already checked out|used by worktree/i.test(c)?"branch_in_use":/would be overwritten|local changes/i.test(c)?"dirty_worktree":/identity unknown|unable to auto-detect email|empty ident/i.test(c)?"identity_missing":"git_failed";a(new P("Git \u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u68C0\u67E5\u4ED3\u5E93\u72B6\u6001\u3001\u8EAB\u4EFD\u6216 hooks \u914D\u7F6E",m==="outcome_unknown"?503:409,m));return}let f=g.code;f==="ENOENT"?a(new P("Git \u672A\u5B89\u88C5\u6216\u5DE5\u4F5C\u533A\u4E0D\u53EF\u7528",503)):f==="ERR_CHILD_PROCESS_STDIO_MAXBUFFER"?a(new P("Git \u8F93\u51FA\u8FC7\u5927\uFF0C\u8BF7\u7F29\u5C0F\u8BFB\u53D6\u8303\u56F4",413)):/not a git repository/.test(c)?a(new P("\u5F53\u524D\u76EE\u5F55\u4E0D\u662F Git \u4ED3\u5E93",404)):a(new P(g.killed?"Git \u8BFB\u53D6\u8D85\u65F6\uFF0C\u8BF7\u91CD\u8BD5":"Git \u8BFB\u53D6\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u4ED3\u5E93\u72B6\u6001\u548C\u76EE\u5F55\u6743\u9650",503))});p.stdin?.on("error",g=>{l=g}),i.input!==void 0&&p.stdin?.end(i.input)})}async function X(r){let e=await Ai(r),t;try{t=(await T(e,["rev-parse","--show-toplevel"])).replace(/\n$/,"")}catch(n){if(n instanceof P&&n.status===404)return{kind:"not-repository"};if(n instanceof P&&n.message==="Git \u672A\u5B89\u88C5\u6216\u5DE5\u4F5C\u533A\u4E0D\u53EF\u7528")return{kind:"unavailable"};throw n}let i=Ri(t,e).split(Ni).join("/");if(i===".."||i.startsWith("../")||Mt(i))throw new P("\u4ED3\u5E93\u4F4D\u4E8E\u5DE5\u4F5C\u533A\u4E4B\u5916",403);return{kind:"repository",cwd:e,root:t,scope:i?`${i}/`:""}}function re(r){if(typeof r!="string"||!r||r.length>4096||r.includes("\0")||r.includes("\\")||Mt(r)||Wi.isAbsolute(r)||r.split("/").some(e=>!e||e==="."||e===".."))throw new P("\u5DE5\u4F5C\u533A\u6587\u4EF6\u8DEF\u5F84\u65E0\u6548",403)}import{createHash as Ki}from"node:crypto";import{lstat as nt,realpath as Vt}from"node:fs/promises";import{dirname as Gt,isAbsolute as Xi,relative as Yi,resolve as ke}from"node:path";import{lstat as Hi}from"node:fs/promises";import{resolve as Ji}from"node:path";import{constants as tt}from"node:fs";import{open as Di,opendir as Oi,realpath as At,stat as Wt}from"node:fs/promises";import{isAbsolute as Dt,relative as Fi,resolve as Bi,sep as $i,win32 as ji}from"node:path";var Li=1e3,Gi=512*1024,Vi=8*1024*1024,Rt=1e4,Ui=new Intl.Collator("en",{numeric:!0,sensitivity:"base"}),N=class extends Error{status;constructor(e,t=400){super(e),this.name="WorkspaceFileError",this.status=t}};function Nt(r,e){let t=Fi(r,e);return t!==".."&&!t.startsWith(`..${$i}`)&&!Dt(t)}async function rt(r,e){if(typeof e!="string"||e.length>4096||e.includes("\0")||e.includes("\\")||Dt(e)||ji.isAbsolute(e))throw new N("\u5DE5\u4F5C\u533A\u6587\u4EF6\u8DEF\u5F84\u65E0\u6548");let t=await At(r),i=Bi(t,e);if(!Nt(t,i))throw new N("\u6587\u4EF6\u4F4D\u4E8E\u5DE5\u4F5C\u533A\u4E4B\u5916",403);let n=await At(i);if(!Nt(t,n))throw new N("\u6587\u4EF6\u4F4D\u4E8E\u5DE5\u4F5C\u533A\u4E4B\u5916",403);return n}async function Ot(r){try{return await r()}catch(e){if(e instanceof N)throw e;let t=e.code;throw t==="ENOENT"||t==="ENOTDIR"?new N("\u6587\u4EF6\u6216\u76EE\u5F55\u5DF2\u4E0D\u5B58\u5728",404):t==="EACCES"||t==="EPERM"?new N("\u6CA1\u6709\u6743\u9650\u8BFB\u53D6\u6587\u4EF6\u6216\u76EE\u5F55",403):e}}async function Ft(r,e){return Ot(async()=>{let t=await rt(r,e),i=[],n=!1;for await(let s of await Oi(t)){if(i.length===Li){n=!0;break}let a=e?`${e}/${s.name}`:s.name,l=s.isDirectory()?"directory":s.isFile()?"file":"other";if(s.isSymbolicLink())try{let p=await Wt(await rt(r,a));l=p.isDirectory()?"directory":p.isFile()?"file":"other"}catch{}i.push({name:s.name,path:a,kind:l})}return i.sort((s,a)=>+(a.kind==="directory")-+(s.kind==="directory")||Ui.compare(s.name,a.name)||s.name.localeCompare(a.name)),{path:e,entries:i,truncated:n}})}function zi(r){if(r.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])))return"image/png";if(r[0]===255&&r[1]===216&&r[2]===255)return"image/jpeg";if(["GIF87a","GIF89a"].includes(r.subarray(0,6).toString("ascii")))return"image/gif";if(r.subarray(0,4).toString("ascii")==="RIFF"&&r.subarray(8,12).toString("ascii")==="WEBP")return"image/webp"}async function ve(r,e){return Ot(async()=>{let t=await rt(r,e);if(!(await Wt(t)).isFile())throw new N("\u8FD9\u4E0D\u662F\u53EF\u9884\u89C8\u7684\u666E\u901A\u6587\u4EF6");let i=await Di(t,tt.O_RDONLY|tt.O_NONBLOCK|(tt.O_NOFOLLOW??0));try{let n=await i.stat();if(!n.isFile())throw new N("\u8FD9\u4E0D\u662F\u53EF\u9884\u89C8\u7684\u666E\u901A\u6587\u4EF6");let s={path:e,size:n.size},a=Buffer.alloc(16);await i.read(a,0,a.length,0);let l=zi(a),p=l?Vi:Gi;if(n.size>p)return{...s,kind:"too-large",limit:p,unit:"bytes"};let g=Buffer.alloc(Math.min(n.size+1,p+1)),u=0;for(;u<g.length;){let{bytesRead:m}=await i.read(g,u,g.length-u,u);if(!m)break;u+=m}if(u>n.size)throw new N("\u6587\u4EF6\u6B63\u5728\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u8BFB\u53D6",409);let c=g.subarray(0,u);if(l)return{...s,kind:"image",mimeType:l,data:c.toString("base64")};if(c.some(m=>m===0||m<32&&![9,10,12,13,27].includes(m)))return{...s,kind:"unsupported"};let f=1;for(let m=0;m<c.length-1;m++)if(c[m]===10&&++f>Rt)return{...s,kind:"too-large",limit:Rt,unit:"lines"};try{return{...s,kind:"text",text:new TextDecoder("utf-8",{fatal:!0}).decode(c)}}catch{return{...s,kind:"unsupported"}}}finally{await i.close()}})}var qi=1e3,Bt=512*1024,$t=1e4;function jt(r,e){return e.startsWith(r)&&e.slice(r.length)||void 0}async function ue(r){let e=await X(r);if(e.kind!=="repository")return e;let{root:t,scope:i}=e,n=await T(e.cwd,["status","--porcelain=v2","--branch","-z","--untracked-files=all","--","."]),s={kind:"repository",root:t,scope:i,branch:null,head:null,upstream:null,ahead:null,behind:null,entries:[],truncated:!1},a=n.split("\0");for(let l=0;l<a.length;l++){let p=a[l];if(p.startsWith("# branch.oid ")){let I=p.slice(13);s.head=I==="(initial)"?null:I;continue}if(p.startsWith("# branch.head ")){let I=p.slice(14);s.branch=I==="(detached)"?null:I;continue}if(p.startsWith("# branch.upstream ")){s.upstream=p.slice(18);continue}if(p.startsWith("# branch.ab ")){let I=p.match(/\+(\d+) -(\d+)/);I&&(s.ahead=Number(I[1]),s.behind=Number(I[2]));continue}let g=p[0];if(!["1","2","u","?"].includes(g??""))continue;let u=g==="?"?1:g==="1"?8:g==="2"?9:10,c=0;for(let I=0;I<u;I++)c=p.indexOf(" ",c)+1;let f=jt(i,p.slice(c)),m=g==="2"?a[++l]:void 0;if(!f)continue;if(s.entries.length===qi){s.truncated=!0;continue}let h=p.slice(0,c).split(" "),E={path:f,index:g==="?"?"?":h[1][0],worktree:g==="?"?"?":h[1][1],conflict:g==="u",untracked:g==="?",submodule:g!=="?"&&h[2]!=="N..."},x=m===void 0?void 0:jt(i,m);x&&(E.originalPath=x),s.entries.push(E)}return s}async function Lt(r,e,t){if(re(e),!["staged","unstaged","untracked"].includes(t))throw new P("Git \u5DEE\u5F02\u8303\u56F4\u65E0\u6548");let i=await ue(r);if(i.kind!=="repository")throw new P("\u5F53\u524D\u5DE5\u4F5C\u533A\u6CA1\u6709\u53EF\u8BFB\u53D6\u7684 Git \u4ED3\u5E93",404);let n={path:e,area:t},s=i.entries.find(l=>l.path===e);if(!s)return{...n,kind:"empty"};if(s.conflict)return{...n,kind:"conflict"};if(s.submodule)return{...n,kind:"submodule"};if(t==="untracked"){if(!s.untracked)return{...n,kind:"empty"};if(!(await Hi(Ji(r,e))).isFile())return{...n,kind:"unsupported"};let l=await ve(r,e);if(l.kind==="too-large")return{...n,kind:"too-large"};if(l.kind!=="text")return{...n,kind:"binary"};if(!l.text)return{...n,kind:"empty"};let p=l.text.split(`
2
+ `),g=p.at(-1)==="";g&&p.pop();let u=`--- /dev/null
3
3
  +++ b/${e.replace(/[\r\n]/g," ")}
4
4
  @@ -0,0 +1,${p.length} @@
5
5
  ${p.map(c=>`+${c}`).join(`
6
6
  `)}
7
- ${h?"":`\
8
- `}`;return Buffer.byteLength(u)>Ft||p.length>Bt?{...n,kind:"too-large"}:{...n,kind:"text",patch:u}}if(s.untracked||(t==="staged"?s.index:s.worktree)===".")return{...n,kind:"empty"};let a=t==="staged"&&s.originalPath?[e,s.originalPath]:[e];try{let l=await T(r,["diff","--no-ext-diff","--no-textconv","--no-color","--no-renames","--relative","--src-prefix=a/","--dst-prefix=b/",...t==="staged"?["--cached"]:[],"--",...a],Ft);return l?l.split(`
9
- `).length>Bt?{...n,kind:"too-large"}:/^Binary files /m.test(l)?{...n,kind:"binary"}:{...n,kind:"text",patch:l}:{...n,kind:"empty"}}catch(l){if(l instanceof P&&l.status===413)return{...n,kind:"too-large"};throw l}}var rt=new Set,M=(r,e=409)=>{throw new P("Git \u72B6\u6001\u4E0D\u5141\u8BB8\u6B64\u64CD\u4F5C\uFF0C\u8BF7\u5237\u65B0\u540E\u68C0\u67E5",e,r)};async function Hi(r){return Gt(ve(r,(await T(r,["rev-parse","--git-common-dir"])).replace(/\n$/,"")))}async function nt(r,e,t=!1){let i=null;try{let n=await X(r);n.kind==="repository"&&(i=await Hi(n.cwd))}catch(n){if(!t)throw n}if(!i)return e();if(rt.has(i))return M("busy");rt.add(i);try{return await e()}finally{rt.delete(i)}}async function Te(r){let e=await X(r),t={kind:e.kind,root:null,scope:"",head:null,branch:null,version:"",staged:0,dirty:!1,blocked:null,branches:[]};if(e.kind!=="repository")return t;let i=await pe(e.root);if(i.kind!=="repository")return t;let[n,s,a]=await Promise.all([T(e.cwd,["ls-files","--stage","-z"]),T(e.cwd,["for-each-ref","--format=%(refname:short)%00%(objectname)%00%(worktreepath)","refs/heads"]),T(e.cwd,["rev-parse","--absolute-git-dir"])]),l=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","rebase-merge","rebase-apply","sequencer","BISECT_LOG","index.lock"],p=(await Promise.all(l.map(async m=>{try{return await it(ve(a.replace(/\n$/,""),m)),m}catch(g){if(g.code==="ENOENT")return null;throw g}}))).filter(Boolean),h=await Promise.all(i.entries.map(async m=>{try{let g=await it(ve(e.root,m.path));return[m.path,g.size,g.mtimeMs,g.ctimeMs,g.ino,g.mode]}catch(g){if(["ENOENT","ENOTDIR"].includes(g.code??""))return[m.path,"missing"];throw g}})),u=s.split(`
10
- `).filter(Boolean).map(m=>{let[g,,E]=m.split("\0");return{name:g,current:g===i.branch,occupied:!!E&&g!==i.branch}}),c=i.truncated||u.length>512?"too_many_changes":p.includes("index.lock")?"index_locked":p.length||i.entries.some(m=>m.conflict)?"operation_in_progress":null,f=Vi("sha256").update(JSON.stringify({head:i.head,branch:i.branch,index:n,refs:s,entries:i.entries,files:h,present:p})).digest("hex");return{kind:"repository",root:e.root,scope:e.scope,head:i.head,branch:i.branch,version:f,staged:i.entries.filter(m=>!m.untracked&&m.index!==".").length,dirty:i.entries.length>0,blocked:c,branches:u.slice(0,512)}}async function Ji(r,e){te(e);let t=Lt(ve(r.cwd,e));for(;;)try{let s=await Gt(t),a=zi(r.cwd,s);if(a===".."||a.startsWith(`..${process.platform==="win32"?"\\":"/"}`)||Ui(a))return M("invalid_path",403);break}catch(s){if(s.code!=="ENOENT")throw s;t=Lt(t)}let i=await pe(r.cwd),n=i.kind==="repository"?i.entries.find(s=>s.path===e):void 0;if(!n||n.submodule||n.conflict)return M("invalid_path",400);try{let s=await it(ve(r.cwd,e));if(!s.isFile()&&!s.isSymbolicLink())return M("invalid_path",400)}catch(s){if(s.code!=="ENOENT")throw s}return n}async function Vt(r,e,t){let i=e.action;if(!["stage","unstage","commit","create-branch","switch-branch"].includes(i)||typeof e.expected!="string"||!/^[a-f0-9]{64}$/.test(e.expected))throw new P("Git \u64CD\u4F5C\u53C2\u6570\u65E0\u6548");return nt(r,async()=>{let n=await X(r);if(n.kind!=="repository")return M("invalid_path",404);t(n.root);let s=await Te(n.cwd);if(s.version!==e.expected)return M("state_changed");if(s.blocked)return M(s.blocked);let a,l;if(i==="stage"||i==="unstage"){if(typeof e.path!="string")return M("invalid_path",400);let u=await Ji(n,e.path);if(i==="stage"&&!u.untracked&&u.worktree==="."||i==="unstage"&&(u.untracked||u.index==="."))return M("state_changed");let c=[e.path];i==="unstage"&&u.originalPath&&(te(u.originalPath),c.push(u.originalPath)),a=i==="stage"?["add","--",...c]:s.head?["restore","--staged","--",...c]:["rm","--cached","-f","--ignore-unmatch","--",...c]}else if(i==="commit"){if(n.scope)return M("root_required",400);if(typeof e.message!="string"||!e.message.trim()||e.message.includes("\0")||Buffer.byteLength(e.message)>8192)return M("invalid_message",400);if(!s.staged)return M("nothing_staged",400);l=e.message,a=["commit","--file=-","--cleanup=verbatim"]}else{if(!s.head)return M("no_commits",400);if(typeof e.branch!="string"||!e.branch||e.branch.length>256||e.branch.startsWith("-")||e.branch.startsWith("refs/")||["HEAD","@"].includes(e.branch)||/[\0\r\n]|@\{/.test(e.branch))return M("invalid_branch",400);try{await T(n.cwd,["check-ref-format","--branch",e.branch])}catch{return M("invalid_branch",400)}if(e.checkout!==void 0&&typeof e.checkout!="boolean")return M("invalid_branch",400);let u=s.branches.find(f=>f.name===e.branch),c=i==="switch-branch"||e.checkout===!0;if(i==="create-branch"&&u)return M("branch_exists");if(i==="switch-branch"&&(!u||u.current))return M("invalid_branch",400);if(c&&n.scope)return M("root_required",400);if(c&&s.dirty)return M("dirty_worktree");if(u?.occupied)return M("branch_in_use");a=i==="switch-branch"?["switch","--no-guess","--no-overwrite-ignore","--",e.branch]:c?["switch","--no-guess","--no-overwrite-ignore","-c",e.branch,"--","HEAD"]:["branch","--",e.branch,"HEAD"]}let p=await Te(n.cwd);if(p.version!==e.expected||p.blocked)return M(p.blocked??"state_changed");t(n.root),await T(n.cwd,a,2*1024*1024,{write:!0,input:l});let h=(await T(n.cwd,["rev-parse","--verify","--quiet","HEAD"]).catch(()=>"")).trim()||null;return{action:i,head:h}})}import{createHash as qi}from"node:crypto";var ke=/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/,Ut="%H%x00%P%x00%an%x00%aI%x00%s",zt=["--no-ext-diff","--no-textconv","--no-renames","--no-color","--relative"];async function Ht(r){let[e,t,i]=await Promise.all([T(r,["for-each-ref","--format=%(refname)%00%(objecttype)%00%(objectname)%00%(*objecttype)%00%(*objectname)","refs/heads","refs/remotes","refs/tags"]),T(r,["rev-parse","--verify","--quiet","HEAD"]).then(l=>l.trim(),()=>null),T(r,["symbolic-ref","-q","HEAD"]).then(l=>l.trim(),()=>null)]),n=[];for(let l of e.split(`
11
- `).filter(Boolean)){let[p,h,u,c,f]=l.split("\0"),m=h==="commit"?u:c==="commit"?f:void 0;if(!m||!ke.test(m))continue;let g=p.startsWith("refs/heads/")?"branch":p.startsWith("refs/remotes/")?"remote":"tag";n.push({name:p.replace(/^refs\/(?:heads|remotes|tags)\//,""),hash:m,kind:g})}if(n.length>512)throw new P("\u4ED3\u5E93\u5F15\u7528\u8FC7\u591A\uFF0C\u6682\u4E0D\u652F\u6301\u8BFB\u53D6\u5386\u53F2",413);let s=[...new Set([...n.map(l=>l.hash),...t&&ke.test(t)?[t]:[]])].sort(),a=qi("sha256").update(JSON.stringify({refs:n,head:t,symbolic:i})).digest("hex");return{refs:n,tips:s,head:t,snapshot:a}}function Jt(r){let[e,t,i,n,s]=r;if(!e||!ke.test(e)||!t?.split(" ").filter(Boolean).every(a=>ke.test(a)))throw new P("\u63D0\u4EA4\u683C\u5F0F\u65E0\u6548",422);return{hash:e,parents:t.split(" ").filter(Boolean),author:i,authoredAt:n,subject:s}}async function qt(r,e={}){let t=e.limit??50;if(!Number.isInteger(t)||t<1||t>100||e.cursor!==void 0&&(typeof e.cursor!="string"||e.cursor.length>256))throw new P("\u5386\u53F2\u5206\u9875\u53C2\u6570\u65E0\u6548");let i=await X(r),n={kind:i.kind,root:null,scope:"",head:null,snapshot:"",refs:[],commits:[],nextCursor:null};if(i.kind!=="repository")return n;let s=await Ht(i.cwd),a=0;if(e.cursor!==void 0){let c;try{c=JSON.parse(Buffer.from(e.cursor,"base64url").toString("utf8"))}catch{throw new P("\u5386\u53F2\u5206\u9875\u53C2\u6570\u65E0\u6548")}if(!c||typeof c.snapshot!="string"||!/^[a-f0-9]{64}$/.test(c.snapshot)||!Number.isInteger(c.offset)||c.offset<1||c.offset>1e4)throw new P("\u5386\u53F2\u5206\u9875\u53C2\u6570\u65E0\u6548");if(c.snapshot!==s.snapshot)throw new P("\u4ED3\u5E93\u5F15\u7528\u5DF2\u53D8\u5316\uFF0C\u8BF7\u5237\u65B0\u5386\u53F2",409);a=c.offset}let l={...n,root:i.root,scope:i.scope,head:s.head,snapshot:s.snapshot,refs:s.refs};if(!s.tips.length)return l;let h=(await T(i.cwd,["log","--no-notes","--no-show-signature","--encoding=UTF-8","--topo-order","-z",`--format=${Ut}`,`--max-count=${t+1}`,`--skip=${a}`,...s.tips,"--"])).split("\0");if(h.at(-1)===""&&h.pop(),h.length%5)throw new P("\u63D0\u4EA4\u683C\u5F0F\u65E0\u6548",422);let u=[];for(let c=0;c<h.length;c+=5)u.push(Jt(h.slice(c,c+5)));return l.commits=u.slice(0,t),u.length>t&&a+t<=1e4&&(l.nextCursor=Buffer.from(JSON.stringify({snapshot:s.snapshot,offset:a+t})).toString("base64url")),l}async function Kt(r,e){if(typeof e!="string"||!ke.test(e))throw new P("\u63D0\u4EA4\u6807\u8BC6\u65E0\u6548");let t=await X(r);if(t.kind!=="repository")throw new P("\u5F53\u524D\u5DE5\u4F5C\u533A\u6CA1\u6709\u53EF\u8BFB\u53D6\u7684 Git \u4ED3\u5E93",404);let i=await Ht(t.cwd);if(!i.tips.length)throw new P("\u63D0\u4EA4\u4E0D\u5B58\u5728\u6216\u5DF2\u4E0D\u53EF\u8FBE",404);if((await T(t.cwd,["cat-file","-t",e]).catch(()=>"")).trim()!=="commit"||(await T(t.cwd,["rev-list","--max-count=1",e,"--not",...i.tips,"--"])).trim())throw new P("\u63D0\u4EA4\u4E0D\u5B58\u5728\u6216\u5DF2\u4E0D\u53EF\u8FBE",404);return t}function Xt(r,e,t){if(!Number.isInteger(t)||t<0||t>=Math.max(1,e.length))throw new P("\u7236\u63D0\u4EA4\u9009\u62E9\u65E0\u6548");return e.length?[e[t],r]:[r]}async function Yt(r,e,t){let n=(await T(r.cwd,["show","-s","--no-notes","--no-show-signature","--encoding=UTF-8","-z",`--format=${Ut}%x00%ae%x00%cn%x00%ce%x00%cI%x00%B`,e,"--"],262144)).split("\0");if(n.at(-1)===""&&n.pop(),n.length!==10)throw new P("\u63D0\u4EA4\u683C\u5F0F\u65E0\u6548",422);let s=Jt(n.slice(0,5)),a=Xt(e,s.parents,t),l=["diff-tree","--root","-r","--no-commit-id",...zt],[p,h]=await Promise.all([T(r.cwd,[...l,"--name-status","-z",...a,"--","."]),T(r.cwd,[...l,"--numstat","-z",...a,"--","."])]),u=new Map;for(let m of h.split("\0").filter(Boolean)){let g=m.match(/^(\d+|-)\t(\d+|-)\t([\s\S]+)$/);g&&u.set(g[3],[g[1]==="-"?null:Number(g[1]),g[2]==="-"?null:Number(g[2])])}let c=p.split("\0");if(c.at(-1)===""&&c.pop(),c.length%2)throw new P("\u63D0\u4EA4\u6587\u4EF6\u683C\u5F0F\u65E0\u6548",422);let f=[];for(let m=0;m<c.length&&f.length<1e3;m+=2){let g=c[m+1],[E,x]=u.get(g)??[null,null];f.push({path:g,status:c[m],additions:E,deletions:x})}return{...s,email:n[5],committer:n[6],committerEmail:n[7],committedAt:n[8],message:n[9],root:r.root,scope:r.scope,parentIndex:t,files:f,truncated:c.length>2e3}}async function Zt(r,e,t=0){return Yt(await Kt(r,e),e,t)}async function Qt(r,e,t,i=0){te(t);let n=await Kt(r,e),s=await Yt(n,e,i),a=s.files.find(p=>p.path===t);if(!a)throw new P("\u6587\u4EF6\u4E0D\u5728\u5F53\u524D\u76EE\u5F55\u7684\u63D0\u4EA4\u6539\u52A8\u4E2D",404);let l={hash:e,path:t,parentIndex:i,parentHash:s.parents[i]??null};if(a.additions===null)return{...l,kind:"binary"};try{let p=await T(n.cwd,["diff-tree","--root","-r","--no-commit-id",...zt,"--src-prefix=a/","--dst-prefix=b/","-p",...Xt(e,s.parents,i),"--",t],524288);return p.split(`
12
- `).length>1e4?{...l,kind:"too-large"}:p?{...l,kind:"text",patch:p}:{...l,kind:"empty"}}catch(p){if(p instanceof P&&p.status===413)return{...l,kind:"too-large"};throw p}}var er=["/api/workspace/git/control","/api/workspace/git/write","/api/workspace/git/status","/api/workspace/git/diff","/api/workspace/git/history","/api/workspace/git/commit-detail","/api/workspace/git/commit-diff"];function tr(r,e,t){if(r.endsWith("/control"))return Te(e);if(r.endsWith("/status"))return pe(e);if(r.endsWith("/history")){if(t.limit!==void 0&&typeof t.limit!="number"||t.cursor!==void 0&&typeof t.cursor!="string")throw new P("\u5386\u53F2\u5206\u9875\u53C2\u6570\u65E0\u6548");return qt(e,{limit:t.limit,cursor:t.cursor})}if(r.endsWith("/diff")){if(typeof t.path!="string"||!["staged","unstaged","untracked"].includes(t.area))throw new P("Git \u5DEE\u5F02\u53C2\u6570\u65E0\u6548");return jt(e,t.path,t.area)}if(typeof t.hash!="string"||t.parentIndex!==void 0&&(!Number.isInteger(t.parentIndex)||t.parentIndex<0))throw new P("\u63D0\u4EA4\u53C2\u6570\u65E0\u6548");let i=t.parentIndex;if(r.endsWith("/commit-detail"))return Zt(e,t.hash,i);if(r.endsWith("/commit-diff")&&typeof t.path=="string")return Qt(e,t.hash,t.path,i);throw new P("Git \u5DEE\u5F02\u53C2\u6570\u65E0\u6548")}var Ae=new Set(["bash","powershell","read","write","edit","grep","find","ls"]),Ki=new Set(["cancelled","blocked","validation","not_found","permission","timeout","process_exit","unknown"]),rr={userInfo:!1,cookies:!1,httpHeaders:!1,httpBodies:[],urlQueryParams:!1,genAI:{inputs:!1,outputs:!1},graphQL:{document:!1,variables:!1},databaseQueryData:!1,queues:!1,stackFrameVariables:!1,frameContextLines:0},Xi=new Set(["stage","route","method","status","durationMs","connection","idle","model","thinkingLevel","messageCount","attachmentCount","session","requestId","operationId","errorId","repeats","dropped","componentStack","eventType","sequence","nodeVersion","piVersion","platform","browser","buildId","code","toolName","toolId","toolCallId","failureKind","errorCode","exitCode","timeoutMs","diagnosticSource","originalStackAvailable","errorSummary","summaryOmitted","summaryOmittedReason","level"]),Yi=new Set(["/api/workspace/git/control","/api/workspace/git/write","/api/workspace/git/status","/api/workspace/git/diff","/api/workspace/git/history","/api/workspace/git/commit-detail","/api/workspace/git/commit-diff","/api/workspace/files/list","/api/workspace/files/preview","/api/plugins","/api/plugin-action","/api/plugin-interaction","/api/resume","/api/update","/api/update/version","/api/provider/models","/api/provider/logout","/api/provider/login/active","/api/telemetry/config","/api/image","/api/attachment","/api/attachment/remove","/api/session","/api/providers","/api/models","/api/config","/api/workspaces","/api/commands","/api/events","/api/message","/api/abort","/api/compact","/api/new-session","/api/model","/api/thinking-level","/api/provider/login","/api/provider/login/respond","/api/provider/login/cancel","/api/provider/custom","/api/workspace/add","/api/workspace/select","/api/workspace/new-session","/api/workspace/remove","/api/session/select","/api/directory/capability","/api/directory/list","/api/directory/create","/api/directory/pick"]);function ir(r){return r==="/api/message"||r.startsWith("/api/provider/")||r.startsWith("/api/workspace/files/")||r.startsWith("/api/workspace/git/")||["/api/plugin-action","/api/plugin-interaction","/api/resume","/api/compact"].includes(r)}function L(r){return r.slice(0,8192).replace(/-----BEGIN [^-\n]+-----[\s\S]*?(?:-----END [^-\n]+-----|$)/g,"[redacted]").replace(/(["'`])[\s\S]*?\1/g,"[quoted]").replace(/(?:Bearer\s+\S+|(?:api[_-]?key|token|password|secret|authorization)\s*[=:]\s*\S+)/gi,"[redacted]").replace(/\b(?:sk-|sntrys_|eyJ)[A-Za-z0-9_.-]+/g,"[redacted]").replace(/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g,"[email]").replace(/https?:\/\/[^\s)]+/gi,"[url]").replace(/(?:file:\/\/)?(?:\/[\w.~-]+){2,}(?::\d+(?::\d+)?)?/g,"[path]").replace(/[A-Za-z]:\\[^\s)]+/g,"[path]").replace(/(?:^|\s)(?:\.\.?[\\/]|~[\\/])[^\s)]+/g," [path]").replace(/\b(?:[\w.-]+[\\/])+[\w.-]+/g,"[path]").replace(/\{[^\n]*\}/g,"[object]").replace(/\b[A-Za-z0-9_-]{24,}\b/g,"[redacted]").slice(0,1024)}function q(r){let e={};for(let t of Xi){let i=r[t];t==="toolName"?typeof i=="string"&&(Ae.has(i)||i==="custom")&&(e[t]=i):t==="failureKind"?Ki.has(i)&&(e[t]=i):t==="level"?(i==="warning"||i==="error")&&(e[t]=i):t==="diagnosticSource"?(i==="tool_execution_end"||i==="message_end")&&(e[t]=i):t==="errorCode"?typeof i=="string"&&/^(?:E[A-Z0-9]{1,20}|nonzero_exit|timeout|cancelled|blocked|invalid_arguments|tool_not_found|unknown)$/.test(i)&&(e[t]=i):t==="toolId"?typeof i=="string"&&/^[a-f0-9]{16}$/.test(i)&&(e[t]=i):t==="route"&&typeof i=="string"?e[t]=Yi.has(i.split("?")[0])?i.split("?")[0]:"[route]":t==="model"&&typeof i=="string"&&/^[\w.-]+\/[\w.-]+$/.test(i)?e[t]=i.split("/").map(L).join("/"):typeof i=="string"?e[t]=["requestId","operationId","errorId","session","buildId","toolId","toolCallId"].includes(t)&&/^[\w-]{1,80}$/.test(i)?i:L(i).slice(0,t==="errorSummary"?512:1024):(typeof i=="boolean"||typeof i=="number"&&Number.isFinite(i)||i===null)&&(e[t]=i)}return e}function st(r){let e=r.replace(/\\/g,"/").split(/[?#]/)[0];return e.startsWith("node:")?e.slice(0,150):`app:///${(e.match(/(?:^|\/)((?:web\/src|extension|shared|dist|assets)\/[^\s:)]+)$/)?.[1]??e.split("/").pop()??"unknown").replace(/[^\w./-]/g,"_").slice(-200)}`}function ue(r,e=0){let t=r instanceof Error?r:new Error(typeof r=="string"?r:"Non-Error rejection"),i=new Error(L(t.message));if(i.name=L(t.name).slice(0,100),t.stack){let n=t.stack.split(`
7
+ ${g?"":`\
8
+ `}`;return Buffer.byteLength(u)>Bt||p.length>$t?{...n,kind:"too-large"}:{...n,kind:"text",patch:u}}if(s.untracked||(t==="staged"?s.index:s.worktree)===".")return{...n,kind:"empty"};let a=t==="staged"&&s.originalPath?[e,s.originalPath]:[e];try{let l=await T(r,["diff","--no-ext-diff","--no-textconv","--no-color","--no-renames","--relative","--src-prefix=a/","--dst-prefix=b/",...t==="staged"?["--cached"]:[],"--",...a],Bt);return l?l.split(`
9
+ `).length>$t?{...n,kind:"too-large"}:/^Binary files /m.test(l)?{...n,kind:"binary"}:{...n,kind:"text",patch:l}:{...n,kind:"empty"}}catch(l){if(l instanceof P&&l.status===413)return{...n,kind:"too-large"};throw l}}var it=new Set,M=(r,e=409)=>{throw new P("Git \u72B6\u6001\u4E0D\u5141\u8BB8\u6B64\u64CD\u4F5C\uFF0C\u8BF7\u5237\u65B0\u540E\u68C0\u67E5",e,r)};async function Zi(r){return Vt(ke(r,(await T(r,["rev-parse","--git-common-dir"])).replace(/\n$/,"")))}async function st(r,e,t=!1){let i=null;try{let n=await X(r);n.kind==="repository"&&(i=await Zi(n.cwd))}catch(n){if(!t)throw n}if(!i)return e();if(it.has(i))return M("busy");it.add(i);try{return await e()}finally{it.delete(i)}}async function Me(r){let e=await X(r),t={kind:e.kind,root:null,scope:"",head:null,branch:null,version:"",staged:0,dirty:!1,blocked:null,branches:[]};if(e.kind!=="repository")return t;let i=await ue(e.root);if(i.kind!=="repository")return t;let[n,s,a]=await Promise.all([T(e.cwd,["ls-files","--stage","-z"]),T(e.cwd,["for-each-ref","--format=%(refname:short)%00%(objectname)%00%(worktreepath)","refs/heads"]),T(e.cwd,["rev-parse","--absolute-git-dir"])]),l=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","rebase-merge","rebase-apply","sequencer","BISECT_LOG","index.lock"],p=(await Promise.all(l.map(async m=>{try{return await nt(ke(a.replace(/\n$/,""),m)),m}catch(h){if(h.code==="ENOENT")return null;throw h}}))).filter(Boolean),g=await Promise.all(i.entries.map(async m=>{try{let h=await nt(ke(e.root,m.path));return[m.path,h.size,h.mtimeMs,h.ctimeMs,h.ino,h.mode]}catch(h){if(["ENOENT","ENOTDIR"].includes(h.code??""))return[m.path,"missing"];throw h}})),u=s.split(`
10
+ `).filter(Boolean).map(m=>{let[h,,E]=m.split("\0");return{name:h,current:h===i.branch,occupied:!!E&&h!==i.branch}}),c=i.truncated||u.length>512?"too_many_changes":p.includes("index.lock")?"index_locked":p.length||i.entries.some(m=>m.conflict)?"operation_in_progress":null,f=Ki("sha256").update(JSON.stringify({head:i.head,branch:i.branch,index:n,refs:s,entries:i.entries,files:g,present:p})).digest("hex");return{kind:"repository",root:e.root,scope:e.scope,head:i.head,branch:i.branch,version:f,staged:i.entries.filter(m=>!m.untracked&&m.index!==".").length,dirty:i.entries.length>0,blocked:c,branches:u.slice(0,512)}}async function Qi(r,e){re(e);let t=Gt(ke(r.cwd,e));for(;;)try{let s=await Vt(t),a=Yi(r.cwd,s);if(a===".."||a.startsWith(`..${process.platform==="win32"?"\\":"/"}`)||Xi(a))return M("invalid_path",403);break}catch(s){if(s.code!=="ENOENT")throw s;t=Gt(t)}let i=await ue(r.cwd),n=i.kind==="repository"?i.entries.find(s=>s.path===e):void 0;if(!n||n.submodule||n.conflict)return M("invalid_path",400);try{let s=await nt(ke(r.cwd,e));if(!s.isFile()&&!s.isSymbolicLink())return M("invalid_path",400)}catch(s){if(s.code!=="ENOENT")throw s}return n}async function Ut(r,e,t){let i=e.action;if(!["stage","unstage","commit","create-branch","switch-branch"].includes(i)||typeof e.expected!="string"||!/^[a-f0-9]{64}$/.test(e.expected))throw new P("Git \u64CD\u4F5C\u53C2\u6570\u65E0\u6548");return st(r,async()=>{let n=await X(r);if(n.kind!=="repository")return M("invalid_path",404);t(n.root);let s=await Me(n.cwd);if(s.version!==e.expected)return M("state_changed");if(s.blocked)return M(s.blocked);let a,l;if(i==="stage"||i==="unstage"){if(typeof e.path!="string")return M("invalid_path",400);let u=await Qi(n,e.path);if(i==="stage"&&!u.untracked&&u.worktree==="."||i==="unstage"&&(u.untracked||u.index==="."))return M("state_changed");let c=[e.path];i==="unstage"&&u.originalPath&&(re(u.originalPath),c.push(u.originalPath)),a=i==="stage"?["add","--",...c]:s.head?["restore","--staged","--",...c]:["rm","--cached","-f","--ignore-unmatch","--",...c]}else if(i==="commit"){if(n.scope)return M("root_required",400);if(typeof e.message!="string"||!e.message.trim()||e.message.includes("\0")||Buffer.byteLength(e.message)>8192)return M("invalid_message",400);if(!s.staged)return M("nothing_staged",400);l=e.message,a=["commit","--file=-","--cleanup=verbatim"]}else{if(!s.head)return M("no_commits",400);if(typeof e.branch!="string"||!e.branch||e.branch.length>256||e.branch.startsWith("-")||e.branch.startsWith("refs/")||["HEAD","@"].includes(e.branch)||/[\0\r\n]|@\{/.test(e.branch))return M("invalid_branch",400);try{await T(n.cwd,["check-ref-format","--branch",e.branch])}catch{return M("invalid_branch",400)}if(e.checkout!==void 0&&typeof e.checkout!="boolean")return M("invalid_branch",400);let u=s.branches.find(f=>f.name===e.branch),c=i==="switch-branch"||e.checkout===!0;if(i==="create-branch"&&u)return M("branch_exists");if(i==="switch-branch"&&(!u||u.current))return M("invalid_branch",400);if(c&&n.scope)return M("root_required",400);if(c&&s.dirty)return M("dirty_worktree");if(u?.occupied)return M("branch_in_use");a=i==="switch-branch"?["switch","--no-guess","--no-overwrite-ignore","--",e.branch]:c?["switch","--no-guess","--no-overwrite-ignore","-c",e.branch,"--","HEAD"]:["branch","--",e.branch,"HEAD"]}let p=await Me(n.cwd);if(p.version!==e.expected||p.blocked)return M(p.blocked??"state_changed");t(n.root),await T(n.cwd,a,2*1024*1024,{write:!0,input:l});let g=(await T(n.cwd,["rev-parse","--verify","--quiet","HEAD"]).catch(()=>"")).trim()||null;return{action:i,head:g}})}import{createHash as en}from"node:crypto";var Ee=/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/,zt="%H%x00%P%x00%an%x00%aI%x00%s",Ht=["--no-ext-diff","--no-textconv","--no-renames","--no-color","--relative"];async function Jt(r){let[e,t,i]=await Promise.all([T(r,["for-each-ref","--format=%(refname)%00%(objecttype)%00%(objectname)%00%(*objecttype)%00%(*objectname)","refs/heads","refs/remotes","refs/tags"]),T(r,["rev-parse","--verify","--quiet","HEAD"]).then(l=>l.trim(),()=>null),T(r,["symbolic-ref","-q","HEAD"]).then(l=>l.trim(),()=>null)]),n=[];for(let l of e.split(`
11
+ `).filter(Boolean)){let[p,g,u,c,f]=l.split("\0"),m=g==="commit"?u:c==="commit"?f:void 0;if(!m||!Ee.test(m))continue;let h=p.startsWith("refs/heads/")?"branch":p.startsWith("refs/remotes/")?"remote":"tag";n.push({name:p.replace(/^refs\/(?:heads|remotes|tags)\//,""),hash:m,kind:h})}if(n.length>512)throw new P("\u4ED3\u5E93\u5F15\u7528\u8FC7\u591A\uFF0C\u6682\u4E0D\u652F\u6301\u8BFB\u53D6\u5386\u53F2",413);let s=[...new Set([...n.map(l=>l.hash),...t&&Ee.test(t)?[t]:[]])].sort(),a=en("sha256").update(JSON.stringify({refs:n,head:t,symbolic:i})).digest("hex");return{refs:n,tips:s,head:t,snapshot:a}}function qt(r){let[e,t,i,n,s]=r;if(!e||!Ee.test(e)||!t?.split(" ").filter(Boolean).every(a=>Ee.test(a)))throw new P("\u63D0\u4EA4\u683C\u5F0F\u65E0\u6548",422);return{hash:e,parents:t.split(" ").filter(Boolean),author:i,authoredAt:n,subject:s}}async function Kt(r,e={}){let t=e.limit??50;if(!Number.isInteger(t)||t<1||t>100||e.cursor!==void 0&&(typeof e.cursor!="string"||e.cursor.length>256))throw new P("\u5386\u53F2\u5206\u9875\u53C2\u6570\u65E0\u6548");let i=await X(r),n={kind:i.kind,root:null,scope:"",head:null,snapshot:"",refs:[],commits:[],nextCursor:null};if(i.kind!=="repository")return n;let s=await Jt(i.cwd),a=0;if(e.cursor!==void 0){let c;try{c=JSON.parse(Buffer.from(e.cursor,"base64url").toString("utf8"))}catch{throw new P("\u5386\u53F2\u5206\u9875\u53C2\u6570\u65E0\u6548")}if(!c||typeof c.snapshot!="string"||!/^[a-f0-9]{64}$/.test(c.snapshot)||!Number.isInteger(c.offset)||c.offset<1||c.offset>1e4)throw new P("\u5386\u53F2\u5206\u9875\u53C2\u6570\u65E0\u6548");if(c.snapshot!==s.snapshot)throw new P("\u4ED3\u5E93\u5F15\u7528\u5DF2\u53D8\u5316\uFF0C\u8BF7\u5237\u65B0\u5386\u53F2",409);a=c.offset}let l={...n,root:i.root,scope:i.scope,head:s.head,snapshot:s.snapshot,refs:s.refs};if(!s.tips.length)return l;let g=(await T(i.cwd,["log","--no-notes","--no-show-signature","--encoding=UTF-8","--topo-order","-z",`--format=${zt}`,`--max-count=${t+1}`,`--skip=${a}`,...s.tips,"--"])).split("\0");if(g.at(-1)===""&&g.pop(),g.length%5)throw new P("\u63D0\u4EA4\u683C\u5F0F\u65E0\u6548",422);let u=[];for(let c=0;c<g.length;c+=5)u.push(qt(g.slice(c,c+5)));return l.commits=u.slice(0,t),u.length>t&&a+t<=1e4&&(l.nextCursor=Buffer.from(JSON.stringify({snapshot:s.snapshot,offset:a+t})).toString("base64url")),l}async function Xt(r,e){if(typeof e!="string"||!Ee.test(e))throw new P("\u63D0\u4EA4\u6807\u8BC6\u65E0\u6548");let t=await X(r);if(t.kind!=="repository")throw new P("\u5F53\u524D\u5DE5\u4F5C\u533A\u6CA1\u6709\u53EF\u8BFB\u53D6\u7684 Git \u4ED3\u5E93",404);let i=await Jt(t.cwd);if(!i.tips.length)throw new P("\u63D0\u4EA4\u4E0D\u5B58\u5728\u6216\u5DF2\u4E0D\u53EF\u8FBE",404);if((await T(t.cwd,["cat-file","-t",e]).catch(()=>"")).trim()!=="commit"||(await T(t.cwd,["rev-list","--max-count=1",e,"--not",...i.tips,"--"])).trim())throw new P("\u63D0\u4EA4\u4E0D\u5B58\u5728\u6216\u5DF2\u4E0D\u53EF\u8FBE",404);return t}function Yt(r,e,t){if(!Number.isInteger(t)||t<0||t>=Math.max(1,e.length))throw new P("\u7236\u63D0\u4EA4\u9009\u62E9\u65E0\u6548");return e.length?[e[t],r]:[r]}async function Zt(r,e,t){let n=(await T(r.cwd,["show","-s","--no-notes","--no-show-signature","--encoding=UTF-8","-z",`--format=${zt}%x00%ae%x00%cn%x00%ce%x00%cI%x00%B`,e,"--"],262144)).split("\0");if(n.at(-1)===""&&n.pop(),n.length!==10)throw new P("\u63D0\u4EA4\u683C\u5F0F\u65E0\u6548",422);let s=qt(n.slice(0,5)),a=Yt(e,s.parents,t),l=["diff-tree","--root","-r","--no-commit-id",...Ht],[p,g]=await Promise.all([T(r.cwd,[...l,"--name-status","-z",...a,"--","."]),T(r.cwd,[...l,"--numstat","-z",...a,"--","."])]),u=new Map;for(let m of g.split("\0").filter(Boolean)){let h=m.match(/^(\d+|-)\t(\d+|-)\t([\s\S]+)$/);h&&u.set(h[3],[h[1]==="-"?null:Number(h[1]),h[2]==="-"?null:Number(h[2])])}let c=p.split("\0");if(c.at(-1)===""&&c.pop(),c.length%2)throw new P("\u63D0\u4EA4\u6587\u4EF6\u683C\u5F0F\u65E0\u6548",422);let f=[];for(let m=0;m<c.length&&f.length<1e3;m+=2){let h=c[m+1],[E,x]=u.get(h)??[null,null];f.push({path:h,status:c[m],additions:E,deletions:x})}return{...s,email:n[5],committer:n[6],committerEmail:n[7],committedAt:n[8],message:n[9],root:r.root,scope:r.scope,parentIndex:t,files:f,truncated:c.length>2e3}}async function Qt(r,e,t=0){return Zt(await Xt(r,e),e,t)}async function er(r,e,t,i=0){re(t);let n=await Xt(r,e),s=await Zt(n,e,i),a=s.files.find(p=>p.path===t);if(!a)throw new P("\u6587\u4EF6\u4E0D\u5728\u5F53\u524D\u76EE\u5F55\u7684\u63D0\u4EA4\u6539\u52A8\u4E2D",404);let l={hash:e,path:t,parentIndex:i,parentHash:s.parents[i]??null};if(a.additions===null)return{...l,kind:"binary"};try{let p=await T(n.cwd,["diff-tree","--root","-r","--no-commit-id",...Ht,"--src-prefix=a/","--dst-prefix=b/","-p",...Yt(e,s.parents,i),"--",t],524288);return p.split(`
12
+ `).length>1e4?{...l,kind:"too-large"}:p?{...l,kind:"text",patch:p}:{...l,kind:"empty"}}catch(p){if(p instanceof P&&p.status===413)return{...l,kind:"too-large"};throw p}}var tr=["/api/workspace/git/control","/api/workspace/git/write","/api/workspace/git/status","/api/workspace/git/diff","/api/workspace/git/history","/api/workspace/git/commit-detail","/api/workspace/git/commit-diff"];function rr(r,e,t){if(r.endsWith("/control"))return Me(e);if(r.endsWith("/status"))return ue(e);if(r.endsWith("/history")){if(t.limit!==void 0&&typeof t.limit!="number"||t.cursor!==void 0&&typeof t.cursor!="string")throw new P("\u5386\u53F2\u5206\u9875\u53C2\u6570\u65E0\u6548");return Kt(e,{limit:t.limit,cursor:t.cursor})}if(r.endsWith("/diff")){if(typeof t.path!="string"||!["staged","unstaged","untracked"].includes(t.area))throw new P("Git \u5DEE\u5F02\u53C2\u6570\u65E0\u6548");return Lt(e,t.path,t.area)}if(typeof t.hash!="string"||t.parentIndex!==void 0&&(!Number.isInteger(t.parentIndex)||t.parentIndex<0))throw new P("\u63D0\u4EA4\u53C2\u6570\u65E0\u6548");let i=t.parentIndex;if(r.endsWith("/commit-detail"))return Qt(e,t.hash,i);if(r.endsWith("/commit-diff")&&typeof t.path=="string")return er(e,t.hash,t.path,i);throw new P("Git \u5DEE\u5F02\u53C2\u6570\u65E0\u6548")}var Re=new Set(["bash","powershell","read","write","edit","grep","find","ls"]),tn=new Set(["cancelled","blocked","validation","not_found","permission","timeout","process_exit","unknown"]),ir={userInfo:!1,cookies:!1,httpHeaders:!1,httpBodies:[],urlQueryParams:!1,genAI:{inputs:!1,outputs:!1},graphQL:{document:!1,variables:!1},databaseQueryData:!1,queues:!1,stackFrameVariables:!1,frameContextLines:0},rn=new Set(["stage","route","method","status","durationMs","connection","idle","model","thinkingLevel","messageCount","attachmentCount","session","requestId","operationId","errorId","repeats","dropped","componentStack","eventType","sequence","nodeVersion","piVersion","platform","browser","buildId","code","toolName","toolId","toolCallId","failureKind","errorCode","exitCode","timeoutMs","diagnosticSource","originalStackAvailable","errorSummary","summaryOmitted","summaryOmittedReason","level"]),nn=new Set(["/api/workspace/git/control","/api/workspace/git/write","/api/workspace/git/status","/api/workspace/git/diff","/api/workspace/git/history","/api/workspace/git/commit-detail","/api/workspace/git/commit-diff","/api/workspace/files/list","/api/workspace/files/preview","/api/plugins","/api/plugin-action","/api/plugin-interaction","/api/resume","/api/update","/api/update/version","/api/provider/models","/api/provider/logout","/api/provider/login/active","/api/telemetry/config","/api/image","/api/attachment","/api/attachment/remove","/api/session","/api/providers","/api/models","/api/config","/api/workspaces","/api/commands","/api/events","/api/message","/api/abort","/api/compact","/api/new-session","/api/model","/api/thinking-level","/api/provider/login","/api/provider/login/respond","/api/provider/login/cancel","/api/provider/custom","/api/workspace/add","/api/workspace/select","/api/workspace/new-session","/api/workspace/remove","/api/session/select","/api/directory/capability","/api/directory/list","/api/directory/create","/api/directory/pick"]);function nr(r){return r==="/api/message"||r.startsWith("/api/provider/")||r.startsWith("/api/workspace/files/")||r.startsWith("/api/workspace/git/")||["/api/plugin-action","/api/plugin-interaction","/api/resume","/api/compact"].includes(r)}function L(r){return r.slice(0,8192).replace(/-----BEGIN [^-\n]+-----[\s\S]*?(?:-----END [^-\n]+-----|$)/g,"[redacted]").replace(/(["'`])[\s\S]*?\1/g,"[quoted]").replace(/(?:Bearer\s+\S+|(?:api[_-]?key|token|password|secret|authorization)\s*[=:]\s*\S+)/gi,"[redacted]").replace(/\b(?:sk-|sntrys_|eyJ)[A-Za-z0-9_.-]+/g,"[redacted]").replace(/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g,"[email]").replace(/https?:\/\/[^\s)]+/gi,"[url]").replace(/(?:file:\/\/)?(?:\/[\w.~-]+){2,}(?::\d+(?::\d+)?)?/g,"[path]").replace(/[A-Za-z]:\\[^\s)]+/g,"[path]").replace(/(?:^|\s)(?:\.\.?[\\/]|~[\\/])[^\s)]+/g," [path]").replace(/\b(?:[\w.-]+[\\/])+[\w.-]+/g,"[path]").replace(/\{[^\n]*\}/g,"[object]").replace(/\b[A-Za-z0-9_-]{24,}\b/g,"[redacted]").slice(0,1024)}function q(r){let e={};for(let t of rn){let i=r[t];t==="toolName"?typeof i=="string"&&(Re.has(i)||i==="custom")&&(e[t]=i):t==="failureKind"?tn.has(i)&&(e[t]=i):t==="level"?(i==="warning"||i==="error")&&(e[t]=i):t==="diagnosticSource"?(i==="tool_execution_end"||i==="message_end")&&(e[t]=i):t==="errorCode"?typeof i=="string"&&/^(?:E[A-Z0-9]{1,20}|nonzero_exit|timeout|cancelled|blocked|invalid_arguments|tool_not_found|unknown)$/.test(i)&&(e[t]=i):t==="toolId"?typeof i=="string"&&/^[a-f0-9]{16}$/.test(i)&&(e[t]=i):t==="route"&&typeof i=="string"?e[t]=nn.has(i.split("?")[0])?i.split("?")[0]:"[route]":t==="model"&&typeof i=="string"&&/^[\w.-]+\/[\w.-]+$/.test(i)?e[t]=i.split("/").map(L).join("/"):typeof i=="string"?e[t]=["requestId","operationId","errorId","session","buildId","toolId","toolCallId"].includes(t)&&/^[\w-]{1,80}$/.test(i)?i:L(i).slice(0,t==="errorSummary"?512:1024):(typeof i=="boolean"||typeof i=="number"&&Number.isFinite(i)||i===null)&&(e[t]=i)}return e}function ot(r){let e=r.replace(/\\/g,"/").split(/[?#]/)[0];return e.startsWith("node:")?e.slice(0,150):`app:///${(e.match(/(?:^|\/)((?:web\/src|extension|shared|dist|assets)\/[^\s:)]+)$/)?.[1]??e.split("/").pop()??"unknown").replace(/[^\w./-]/g,"_").slice(-200)}`}function fe(r,e=0){let t=r instanceof Error?r:new Error(typeof r=="string"?r:"Non-Error rejection"),i=new Error(L(t.message));if(i.name=L(t.name).slice(0,100),t.stack){let n=t.stack.split(`
13
13
  `).slice(1,31).map(s=>{let a=s.match(/((?:file:\/\/|https?:\/\/|\/|[A-Za-z]:\\)[^\s()]+):(\d+):(\d+)(\)?)$/);return a?`${L(s.slice(0,a.index))}${a[1]}:${a[2]}:${a[3]}${a[4]}`:L(s)});i.stack=`${i.name}: ${i.message}
14
14
  ${n.join(`
15
- `)}`}else i.stack=void 0;return e<3&&t.cause!==void 0&&(i.cause=ue(t.cause,e+1)),i}function Y(r,e){let t=new Error(e);return r instanceof Error&&(t.name=r.name,r.stack&&(t.stack=`${t.name}: ${e}
15
+ `)}`}else i.stack=void 0;return e<3&&t.cause!==void 0&&(i.cause=fe(t.cause,e+1)),i}function Y(r,e){let t=new Error(e);return r instanceof Error&&(t.name=r.name,r.stack&&(t.stack=`${t.name}: ${e}
16
16
  ${r.stack.split(`
17
17
  `).slice(1).join(`
18
- `)}`)),t}function Zi(r){return{...r.filename?{filename:st(r.filename)}:{},...r.abs_path?{abs_path:st(r.abs_path)}:{},...r.function?{function:L(r.function)}:{},lineno:r.lineno,colno:r.colno,in_app:r.in_app}}function Qi(r){let e=q(r.contexts?.diagnostic??{}),t=nr(e);return{event_id:r.event_id,timestamp:r.timestamp,platform:r.platform,level:r.level,release:r.release,dist:r.dist,environment:L(r.environment??"production"),...r.message?{message:L(r.message)}:{},exception:r.exception?{values:r.exception.values?.slice(0,4).map(i=>({type:L(i.type??"Error"),value:L(i.value??""),...i.stacktrace?{stacktrace:{frames:i.stacktrace.frames?.slice(-30).map(Zi)}}:{},...i.mechanism?{mechanism:{type:i.mechanism.type,handled:i.mechanism.handled}}:{}}))}:void 0,tags:{side:r.tags?.side,buildId:r.tags?.buildId,...e.toolName?{toolName:e.toolName}:{},...e.failureKind?{failureKind:e.failureKind}:{},...e.errorCode?{errorCode:e.errorCode}:{}},...t?{fingerprint:t}:{},contexts:{diagnostic:e},breadcrumbs:r.breadcrumbs?.slice(-100).map(i=>({timestamp:i.timestamp,category:L(i.category??"app"),data:q(i.data??{})})),debug_meta:r.debug_meta?{images:r.debug_meta.images?.slice(0,10).map(i=>({type:i.type,debug_id:i.debug_id,...i.code_file?{code_file:st(i.code_file)}:{}}))}:void 0}}function nr(r){if(!(r.stage!=="tool"||r.originalStackAvailable!==!1||!r.toolName||!r.failureKind))return["pi-webapp-tool-result",String(r.toolName),String(r.toolId??"builtin"),String(r.failureKind),String(r.errorCode??"unknown")]}function sr(r,e){return e.attachments=[],Qi(r)}var Ee=class{items=[];bytes=0;encoder=new TextEncoder;add(e,t={}){let i={timestamp:Date.now()/1e3,category:L(e),data:q(t)},n=this.encoder.encode(JSON.stringify(i)).byteLength+1;for(this.items.push({item:i,size:n}),this.bytes+=n;this.items.length>100||this.bytes>64*1024-2;)this.bytes-=this.items.shift().size}snapshot(){return this.items.map(({item:e})=>e)}},ot=class{windowAt=-1;total=0;seen=new Map;take(e,t=Date.now()){(this.windowAt<0||t-this.windowAt>=6e4)&&(this.windowAt=t,this.total=0);let i=this.seen.get(e);if(i&&t-i.at<6e4){i.repeats++;return}if(!(this.total>=20))return this.total++,this.seen.size>=64&&!i&&this.seen.delete(this.seen.keys().next().value),this.seen.set(e,{at:t,repeats:0}),{repeats:i?.repeats??0}}},en=new Set(["\u76EE\u5F55\u8DEF\u5F84\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84","\u7236\u76EE\u5F55\u8DEF\u5F84\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84","\u6587\u4EF6\u5939\u540D\u79F0\u65E0\u6548","\u5DE5\u4F5C\u533A\u76EE\u5F55\u4E0D\u53EF\u7528\uFF0C\u8BF7\u6062\u590D\u76EE\u5F55\u6216\u4ECE\u5217\u8868\u79FB\u9664\u540E\u91CD\u65B0\u6DFB\u52A0","\u4F1A\u8BDD\u5DF2\u5207\u6362","Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F","\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F","\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u5DE5\u4F5C\u533A","\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u4F1A\u8BDD","\u8BF7\u5148\u5207\u6362\u5230\u5176\u4ED6\u5DE5\u4F5C\u533A","\u65B0\u4F1A\u8BDD\u5DF2\u53D6\u6D88","\u5DF2\u6709\u767B\u5F55\u6B63\u5728\u8FDB\u884C","\u6A21\u578B\u4E0D\u53EF\u7528","\u6A21\u578B\u63D0\u4F9B\u65B9\u672A\u914D\u7F6E\u8BA4\u8BC1","\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u6B64\u63A8\u7406\u5F3A\u5EA6","\u5176\u4ED6\u63D0\u4F9B\u65B9\u7684\u767B\u5F55\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u5148\u5B8C\u6210\u6216\u53D6\u6D88\u5F53\u524D\u767B\u5F55","\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6682\u505C\u7684\u4EFB\u52A1","\u8BF7\u5148\u5B8C\u6210\u5F53\u524D\u4EA4\u4E92\u6216\u5BA1\u6279","\u8BF7\u5148\u9009\u62E9\u6A21\u578B","\u8BF7\u5148\u8FDE\u63A5\u5F53\u524D\u6A21\u578B","\u63D2\u4EF6\u672A\u542F\u7528","\u4F1A\u8BDD\u8FD0\u884C\u5B9E\u4F8B\u5DF2\u5207\u6362","\u63D0\u4F9B\u65B9\u5DF2\u5B58\u5728","\u6587\u4EF6\u8D85\u8FC7 20 MB","\u8BF7\u6C42\u5185\u5BB9\u8FC7\u5927","\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A","\u63A8\u7406\u5F3A\u5EA6\u65E0\u6548"]);function re(r){return r instanceof Error&&(r.name==="AbortError"||en.has(r.message))}var Me=class{budget=new ot;breadcrumbs;scopeClass;seen=new WeakSet;state={};client;side;buildId;constructor(e,t,i,n,s=new Ee){this.client=e,this.side=t,this.buildId=i,this.scopeClass=n.Scope,this.breadcrumbs=s,e.addIntegration(n.linkedErrorsIntegration({limit:4}))}setState(e){this.state=q(e)}capture(e,t={},i){try{if(re(e))return;if(typeof e=="object"&&e!==null){if(this.seen.has(e))return;this.seen.add(e)}let n=ue(e),s=q({...this.state,...t}),a=nr(s),l=a?JSON.stringify(a):`${n.name}:${n.message}:${n.stack?.split(`
19
- `)[1]??""}:${t.stage??""}`,p=this.budget.take(l);if(!p)return;let h=new this.scopeClass;h.setClient(this.client),h.setTags({side:this.side,buildId:this.buildId}),s.level==="warning"&&h.setLevel("warning"),a&&h.setFingerprint(a),h.setContext("diagnostic",{...s,repeats:p.repeats});for(let u of this.breadcrumbs.snapshot())h.addBreadcrumb(u,100);return h.captureException(n,i?{event_id:i}:void 0)}catch{return}}ignore(e){this.seen.add(e)}};function or(r,e){return r({...e,bufferSize:20},async({body:t})=>{let i=await fetch(e.url,{method:"POST",body:t,signal:AbortSignal.timeout(3e3),credentials:"omit",referrerPolicy:"no-referrer",redirect:"error",headers:{"Content-Type":"application/x-sentry-envelope"}});return{statusCode:i.status,headers:{"x-sentry-rate-limits":i.headers.get("x-sentry-rate-limits"),"retry-after":i.headers.get("retry-after")}}})}var ar={metadata:_t,routes:er,coordinateStart:(r,e)=>nt(r,e,!0),requestFailure:r=>r instanceof P?{status:r.status,body:{error:r.message,errorCode:"validation_error",reason:r.reason}}:null,async handle({path:r,body:e,snapshot:t,busyWorkspaces:i,json:n}){let s=t();if(e.sessionId!==s.sessionId){n(409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}try{let a=u=>!t().idle||i().some(c=>{let f=(m,g)=>{let E=rn(m,g);return E!==".."&&!E.startsWith("../")&&!E.startsWith("..\\")&&!tn(E)};return f(u,c)||f(c,u)}),l=u=>{let c=t();if(c.sessionId!==s.sessionId||c.cwd!==s.cwd)throw new P("\u4F1A\u8BDD\u5DF2\u5207\u6362",409,"session_changed");if(a(u))throw new P("\u5171\u7528\u6B64\u5DE5\u4F5C\u6811\u7684\u804A\u5929\u6B63\u5728\u8FD0\u884C",409,"agent_busy")},p=r.endsWith("/write"),h=p?await Vt(s.cwd,e,l):await tr(r,s.cwd,e);if(!p){let u=t();if(u.sessionId!==s.sessionId||u.cwd!==s.cwd){n(409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(r.endsWith("/control")){let c=h;c.root&&a(c.root)&&(c.blocked??="agent_busy")}}n(200,h)}catch(a){if(a instanceof P||a instanceof W)n(a.status,{error:a.message,errorCode:"validation_error",...a instanceof P?{reason:a.reason}:{}});else throw Y(a,"Git \u64CD\u4F5C\u5931\u8D25")}}};var cr={id:de.files,kind:"builtin",version:"1.0.0",name:{zh:"\u5DE5\u4F5C\u533A\u6587\u4EF6",en:"Workspace files"},description:{zh:"\u6D4F\u89C8\u5DE5\u4F5C\u533A\u76EE\u5F55\uFF0C\u53EA\u8BFB\u9884\u89C8\u4EE3\u7801\u3001Markdown \u4E0E\u56FE\u7247\u3002",en:"Browse workspace directories and preview code, Markdown and images read-only."}};var lr={metadata:cr,routes:["/api/workspace/files/list","/api/workspace/files/preview"],async handle({path:r,body:e,snapshot:t,json:i}){let n=t();if(e.sessionId!==n.sessionId){i(409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(typeof e.path!="string"||e.path.length>4096){i(400,{error:"\u5DE5\u4F5C\u533A\u6587\u4EF6\u8DEF\u5F84\u65E0\u6548"});return}try{let s=r.endsWith("/list")?await Ot(n.cwd,e.path):await be(n.cwd,e.path),a=t();if(a.sessionId!==n.sessionId||a.cwd!==n.cwd){i(409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}i(200,s)}catch(s){if(s instanceof W)i(s.status,{error:s.message,errorCode:"validation_error"});else throw Y(s,"\u5DE5\u4F5C\u533A\u6587\u4EF6\u8BFB\u53D6\u5931\u8D25")}}};var dr={id:de.terminal,kind:"builtin",version:"1.0.0",name:{zh:"\u7EC8\u7AEF",en:"Terminal"},description:{zh:"\u5728\u5DE5\u4F5C\u533A\u8FD0\u884C\u4EA4\u4E92\u5F0F Shell\u3002\u505C\u7528\u4F1A\u7ED3\u675F\u6B64\u670D\u52A1\u7684\u6240\u6709\u7EC8\u7AEF\u8FDB\u7A0B\u3002",en:"Run an interactive shell in the workspace. Disabling ends all terminals on this service."}};import{accessSync as nn,constants as sn,statSync as on}from"node:fs";import{createRequire as an}from"node:module";import{execFile as pr}from"node:child_process";var at=an(import.meta.url),ct=class{pid;pty;screen;serializer;followers=new Set;pending=Promise.resolve();exit;disposed=!1;done;expire;closing;sessionId;abandoned;graceMs;constructor(e,t,i,n,s,a,l,p){this.sessionId=e,this.abandoned=l,this.graceMs=p;let{Terminal:h}=at("@xterm/headless"),{SerializeAddon:u}=at("@xterm/addon-serialize");this.screen=new h({cols:i,rows:n,scrollback:2e3,allowProposedApi:!0}),this.serializer=new u,this.screen.loadAddon(this.serializer);let c=Object.fromEntries(Object.entries(process.env).filter(([f,m])=>m!==void 0&&!/^PI_WEBAPP_RESTART_/.test(f)));try{this.pty=at("node-pty").spawn(s,a,{name:"xterm-256color",cwd:t,cols:i,rows:n,env:{...c,TERM:"xterm-256color",COLORTERM:"truecolor"}})}catch(f){throw this.screen.dispose(),f}this.pid=this.pty.pid,this.screen.onData(f=>{!this.followers.size&&!this.exit&&!this.disposed&&this.pty.write(f)}),this.pty.onData(f=>{this.disposed||(this.pty.pause(),this.pending=this.pending.then(()=>new Promise(m=>{if(this.disposed){m();return}this.screen.write(f,()=>{this.broadcast({type:"output",data:f}),m()})})).finally(()=>{!this.exit&&!this.disposed&&this.pty.resume()}))}),this.done=new Promise(f=>this.pty.onExit(({exitCode:m,signal:g})=>{this.exit={type:"exit",exitCode:m,signal:g},this.pending.then(()=>{this.broadcast(this.exit),f()})})),this.scheduleExpiry()}broadcast(e){for(let t of this.followers)t(e)||this.followers.delete(t);this.followers.size||this.scheduleExpiry()}scheduleExpiry(){this.expire||this.disposed||(this.expire=setTimeout(this.abandoned,this.graceMs).unref())}async attach(e){if(await this.pending,this.disposed)throw new Error("\u7EC8\u7AEF\u5DF2\u5173\u95ED");return clearTimeout(this.expire),this.expire=void 0,e({type:"snapshot",screen:this.serializer.serialize(),cols:this.screen.cols,rows:this.screen.rows})?(this.exit&&e(this.exit),this.followers.add(e)):this.scheduleExpiry(),()=>{this.followers.delete(e),this.followers.size||this.scheduleExpiry()}}write(e){if(this.exit||this.disposed)throw new Error("\u7EC8\u7AEF\u5DF2\u9000\u51FA");this.pty.write(e)}resize(e,t){this.exit||this.disposed||(this.pty.resize(e,t),this.pending=this.pending.then(()=>{this.disposed||(this.screen.resize(e,t),this.broadcast({type:"resize",cols:e,rows:t}))}))}close(){return this.closing??=this.dispose()}async dispose(){if(this.disposed=!0,clearTimeout(this.expire),!this.exit){if(process.platform==="win32")await new Promise(e=>pr("taskkill",["/pid",String(this.pid),"/T","/F"],()=>e()));else{let t=(await new Promise(n=>pr("ps",["-axo","pid=,ppid="],(s,a)=>n(s?"":a)))).trim().split(`
20
- `).map(n=>n.trim().split(/\s+/).map(Number)),i=n=>t.filter(([,s])=>s===n).flatMap(([s])=>[...i(s),s]);for(let n of[...i(this.pid),this.pid])try{process.kill(n,"SIGKILL")}catch{}}this.pty.kill(),this.pty.resume(),await this.done}await this.pending,this.followers.clear(),this.screen.dispose()}},Re=class{terminals=new Map;stopped=!1;options;constructor(e={}){this.options=e}create(e,t,i,n,s){if(this.stopped)throw new Error("\u7EC8\u7AEF\u670D\u52A1\u5DF2\u505C\u6B62");if(this.terminals.has(e))return this.get(e,t);if(this.terminals.size>=32||[...this.terminals.values()].filter(h=>h.sessionId===t).length>=8)throw new Error("\u7EC8\u7AEF\u6570\u91CF\u5DF2\u8FBE\u4E0A\u9650\uFF0C\u8BF7\u5173\u95ED\u4E0D\u7528\u7684\u7EC8\u7AEF");let a=this.options.shell??(process.platform==="win32"?process.env.COMSPEC||"cmd.exe":process.env.SHELL||"/bin/sh");if(nn(a,sn.X_OK),!on(i).isDirectory())throw new Error("\u5DE5\u4F5C\u533A\u76EE\u5F55\u4E0D\u53EF\u7528");let l=this.options.shellArgs??(process.platform==="win32"?[]:["-i"]),p=new ct(t,i,n,s,a,l,()=>{this.remove(e,t)},this.options.graceMs??5*6e4);return this.terminals.set(e,p),p}get(e,t){let i=this.terminals.get(e);if(!i||i.sessionId!==t)throw new Error("\u7EC8\u7AEF\u4E0D\u5B58\u5728\u6216\u4E0D\u5C5E\u4E8E\u6B64\u4F1A\u8BDD");return i}async remove(e,t){let i=this.terminals.get(e);if(i){if(i.sessionId!==t)throw new Error("\u7EC8\u7AEF\u4E0D\u5C5E\u4E8E\u6B64\u4F1A\u8BDD");await i.close(),this.terminals.get(e)===i&&this.terminals.delete(e)}}async clear(){await Promise.all([...this.terminals.values()].map(e=>e.close())),this.terminals.clear()}async close(){this.stopped=!0,await this.clear()}};var ur=(r,e)=>Number.isInteger(r)&&Number.isInteger(e)&&Number(r)>=2&&Number(r)<=500&&Number(e)>=1&&Number(e)<=300;async function fr(r,e,t,i,n,s){let a=(h,u)=>{t.writeHead(h,{"Content-Type":"application/json","Cache-Control":"no-store"}),t.end(JSON.stringify(u))};if(typeof e.id!="string"||!/^[a-f0-9-]{36}$/i.test(e.id)){a(400,{error:"\u7EC8\u7AEF\u6807\u8BC6\u65E0\u6548"});return}let l=r.slice(14),p=i();if(l!=="close"&&e.sessionId!==p.sessionId){a(409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if((l==="create"||l==="resize")&&!ur(e.cols,e.rows)){a(400,{error:"\u7EC8\u7AEF\u5C3A\u5BF8\u65E0\u6548"});return}if(l==="input"&&(typeof e.data!="string"||Buffer.byteLength(e.data)>16384)){a(400,{error:"\u7EC8\u7AEF\u8F93\u5165\u65E0\u6548\u6216\u8FC7\u5927"});return}try{if(l==="create"){n.create(e.id,e.sessionId,p.cwd,e.cols,e.rows),a(201,{id:e.id});return}if(l==="close"){await n.remove(e.id,e.sessionId),a(200,{closed:!0});return}let h=n.get(e.id,e.sessionId);if(l==="attach"){let u=!1,c;t.once("close",()=>{u=!0,c?.(),s.delete(t)}),c=await h.attach(f=>u?!1:(t.headersSent||t.writeHead(200,{"Content-Type":"application/x-ndjson","Cache-Control":"no-store","X-Accel-Buffering":"no"}),t.writableLength>1024*1024?(t.destroy(),!1):(t.write(`${JSON.stringify(f)}
21
- `),!0))),u?c():s.add(t);return}if(l==="input")h.write(e.data);else if(l==="resize")h.resize(e.cols,e.rows);else{a(404,{error:"\u672A\u77E5\u7EC8\u7AEF\u64CD\u4F5C"});return}a(200,{accepted:!0})}catch{t.headersSent?t.end():a(400,{error:l==="create"?"\u7EC8\u7AEF\u542F\u52A8\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u9ED8\u8BA4 shell\u3001\u5DE5\u4F5C\u533A\u76EE\u5F55\u6216\u7EC8\u7AEF\u6570\u91CF\u4E0A\u9650":"\u7EC8\u7AEF\u4E0D\u53EF\u7528\u6216\u4E0D\u5C5E\u4E8E\u6B64\u4F1A\u8BDD\uFF0C\u8BF7\u91CD\u65B0\u6253\u5F00\u7EC8\u7AEF"})}}function mr(){let r=new Re,e=new Set,t=async()=>{for(let i of e)i.end();e.clear(),await r.clear()};return{metadata:dr,routes:["create","attach","input","resize","close"].map(i=>`/api/terminal/${i}`),handle:i=>fr(i.path,i.body,i.res,i.snapshot,r,e),disable:t,async close(){await t(),await r.close()}}}function gr(){return[lr,mr(),ar]}import{createHash as cn,randomUUID as ln}from"node:crypto";import{mkdir as dn,open as pn,readFile as un,rename as fn,rm as hr,writeFile as mn}from"node:fs/promises";import{dirname as gn}from"node:path";var N=class extends Error{status;constructor(e,t=409){super(e),this.status=t}},We=class r{disabled=new Set;changing=!1;file;constructor(e){this.file=e}async load(){try{let e=JSON.parse(await un(this.file,"utf8"));if(!e||typeof e!="object"||!("version"in e)||e.version!==1||!("disabled"in e)||!Array.isArray(e.disabled)||!e.disabled.every(t=>typeof t=="string"&&t.length>0&&t.length<=200))throw new N("\u63D2\u4EF6\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u4FEE\u590D\u914D\u7F6E\u540E\u91CD\u542F",503);this.disabled=new Set(e.disabled)}catch(e){if(e.code!=="ENOENT")throw e}}enabled(e){return!this.disabled.has(e)}revision(){return cn("sha256").update(JSON.stringify([...this.disabled].sort())).digest("hex")}async set(e,t,i,n){if(this.changing)throw new N("\u63D2\u4EF6\u914D\u7F6E\u6B63\u5728\u4FDD\u5B58\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");this.changing=!0;let s=`${this.file}.${ln()}.tmp`,a=`${this.file}.lock`,l;try{if(i!==this.revision())throw new N("\u63D2\u4EF6\u914D\u7F6E\u5DF2\u53D8\u5316\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5");n();let p=new Set(this.disabled);t?p.delete(e):p.add(e),await dn(gn(this.file),{recursive:!0});try{l=await pn(a,"wx",384)}catch(u){throw u.code==="EEXIST"?new N("\u63D2\u4EF6\u914D\u7F6E\u9501\u5B9A\u6587\u4EF6\u4ECD\u5B58\u5728\uFF0C\u5237\u65B0\u4E0D\u4F1A\u89E3\u9664\u3002\u8BF7\u5148\u505C\u6B62\u4F7F\u7528\u6B64\u914D\u7F6E\u7684\u5168\u90E8 Pi \u670D\u52A1\uFF0C\u518D\u5220\u9664 pi-web/plugins.json.lock \u540E\u91CD\u542F\uFF1B\u4E0D\u8981\u5220\u9664\u6D3B\u8DC3\u670D\u52A1\u7684\u9501"):u}await l.writeFile(JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()})+`
22
- `);let h=new r(this.file);if(await h.load(),h.revision()!==i)throw new N("\u63D2\u4EF6\u914D\u7F6E\u5DF2\u7531\u5176\u4ED6\u670D\u52A1\u4FEE\u6539\uFF0C\u8BF7\u91CD\u542F\u5F53\u524D\u670D\u52A1\u540E\u91CD\u8BD5");await mn(s,JSON.stringify({version:1,disabled:[...p].sort()},null,2)+`
23
- `,{mode:384}),n(),await fn(s,this.file),this.disabled=p}finally{this.changing=!1;try{await hr(s,{force:!0})}finally{l&&(await l.close(),await hr(a,{force:!0}))}}}};var Ne=class{routes;running=new Map;changing=!1;plugins;preferences;constructor(e,t){if(this.plugins=e,this.preferences=t,this.routes=e.flatMap(i=>[...i.routes]),new Set(e.map(i=>i.metadata.id)).size!==e.length||new Set(this.routes).size!==this.routes.length)throw new Error("Duplicate server plugin registration")}get mutating(){return this.changing}actionRoute(e,t){return this.plugins.find(i=>i.metadata.id===e)?.routes.find(i=>i.split("/").at(-1)===t&&!i.endsWith("/attach"))}external(e){let t=new Set(this.plugins.map(i=>i.metadata.id));return{plugins:e.plugins.filter(i=>!t.has(i.id)),errors:[...e.errors,...e.plugins.filter(i=>t.has(i.id)).map(i=>`Plugin ID reserved by host: ${i.id}`)]}}catalog(e){let t=this.external(e);return{...t,plugins:[...this.plugins.filter(i=>this.preferences.enabled(i.metadata.id)).map(i=>({id:i.metadata.id,client:`builtin:${i.metadata.id}`})),...t.plugins]}}inventory(e){return{revision:this.preferences.revision(),scope:"global",items:[...this.plugins.map(t=>({...t.metadata,enabled:this.preferences.enabled(t.metadata.id),managed:!0})),...this.external(e).plugins.map(t=>({id:t.id,name:t.id,description:{zh:"\u7531 Pi \u8F6F\u4EF6\u5305\u63D0\u4F9B\u7684 Web \u63D2\u4EF6\u3002\u8BF7\u5728\u5305\u4E0E\u6269\u5C55\u4E2D\u7BA1\u7406\u5176\u8FD0\u884C\u65F6\u3002",en:"Web plugin supplied by a Pi package. Manage its runtime under Packages & extensions."},version:"",kind:"external",enabled:!0,managed:!1,reason:"pi-runtime-owned"}))]}}async toggle(e,t,i,n){if(!this.plugins.some(s=>s.metadata.id===e))throw new N("\u6B64\u63D2\u4EF6\u9700\u8981\u901A\u8FC7 Pi \u8F6F\u4EF6\u5305\u7BA1\u7406",400);if(this.changing||[...this.running.values()].some(s=>s>0))throw new N("\u63D2\u4EF6\u64CD\u4F5C\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210");this.changing=!0;try{await this.preferences.set(e,t,i,n),t||await this.plugins.find(s=>s.metadata.id===e)?.disable?.()}finally{this.changing=!1}}async dispatch(e){let t=this.plugins.find(n=>n.routes.includes(e.path));if(!t)return!1;if(this.changing)return e.json(409,{error:"\u63D2\u4EF6\u914D\u7F6E\u6B63\u5728\u4FDD\u5B58\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5"}),!0;if(!this.preferences.enabled(t.metadata.id))return e.json(403,{error:"\u63D2\u4EF6\u5DF2\u505C\u7528",errorCode:"plugin_disabled"}),!0;let i=t.metadata.id;this.running.set(i,(this.running.get(i)??0)+1);try{await t.handle(e)}finally{this.running.set(i,this.running.get(i)-1)}return!0}async coordinateStart(e,t){if(this.changing)throw new N("\u63D2\u4EF6\u914D\u7F6E\u6B63\u5728\u4FDD\u5B58\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");let i="@host/start";this.running.set(i,(this.running.get(i)??0)+1);let n=t;for(let s of this.plugins)if(s.coordinateStart&&this.preferences.enabled(s.metadata.id)){let a=n;n=()=>s.coordinateStart(e,a)}try{return await n()}finally{this.running.set(i,this.running.get(i)-1)}}requestFailure(e){if(e instanceof N)return{status:e.status,body:{error:e.message,errorCode:"validation_error",reason:"plugin_busy"}};for(let t of this.plugins){let i=t.requestFailure?.(e);if(i)return i}return null}async close(){await Promise.all(this.plugins.map(e=>e.close?.()))}};import{mkdir as hn,opendir as wn,stat as yn}from"node:fs/promises";import{homedir as bn}from"node:os";import{basename as vn,dirname as wr,join as yr,posix as kn,resolve as br,win32 as En}from"node:path";function vr(r){return process.platform==="win32"?En.isAbsolute(r)&&/^(?:[A-Za-z]:[\\/]|[\\/]{2}[^\\/]+[\\/]+[^\\/]+)/.test(r):kn.isAbsolute(r)}function Pn(r,e,t){if(r.length===t&&e.name.localeCompare(r[r.length-1].name)>=0)return!0;let i=0,n=r.length;for(;i<n;){let s=i+n>>>1;e.name.localeCompare(r[s].name)<0?n=s:i=s+1}return r.splice(i,0,e),r.length<=t?!1:(r.pop(),!0)}async function kr(r){if(r!==void 0&&!vr(r))throw new Error("\u76EE\u5F55\u8DEF\u5F84\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84");let e=bn(),t=br(r??e),i=[];for(let p=t;;p=wr(p)){let h=wr(p);if(i.unshift({name:h===p?p:vn(p),path:p,hidden:!1}),h===p)break}let n=[],s=!1,a=await wn(t);for await(let p of a)!p.isDirectory()&&!p.isSymbolicLink()||Pn(n,{name:p.name,isDirectory:p.isDirectory(),isSymbolicLink:p.isSymbolicLink()},1001)&&(s=!0);let l=[];for(let p of n){let h=yr(t,p.name);if(!p.isDirectory&&p.isSymbolicLink)try{if(!(await yn(h)).isDirectory())continue}catch{continue}if(l.length===1e3){s=!0;break}l.push({name:p.name,path:h,hidden:p.name.startsWith(".")})}return{path:t,home:e,crumbs:i,entries:l,truncated:s}}async function Er(r,e){if(!vr(r))throw new Error("\u7236\u76EE\u5F55\u8DEF\u5F84\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84");if(!e.trim()||e==="."||e===".."||/[/\\]/.test(e))throw new Error("\u6587\u4EF6\u5939\u540D\u79F0\u65E0\u6548");let t=yr(br(r),e);return await hn(t),t}import{execFile as Sn}from"node:child_process";import{accessSync as xn,constants as In}from"node:fs";import{delimiter as Cn,join as _n}from"node:path";var Tn=(r,e,t)=>new Promise((i,n)=>{Sn(r,[...e],{encoding:"utf8",signal:t,windowsHide:!0},(s,a,l)=>{s?n(Object.assign(new Error(s.message,{cause:s}),{code:s.code,stdout:a,stderr:l})):i({stdout:a,stderr:l})})});function Mn(r){for(let e of(r??"").split(Cn))if(e)for(let t of["zenity","kdialog"])try{return xn(_n(e,t),In.X_OK),!0}catch{}return!1}function Pr(r=process.platform,e=process.env){return e.SSH_CONNECTION||e.SSH_TTY?"browse":r==="darwin"||r==="linux"&&(e.DISPLAY||e.WAYLAND_DISPLAY)&&Mn(e.PATH)?"native":"browse"}function De(r){if(!(typeof r!="object"||r===null||!("code"in r)))return typeof r.code=="string"||typeof r.code=="number"?r.code:void 0}function An(r){return typeof r=="object"&&r!==null&&"stderr"in r&&typeof r.stderr=="string"?r.stderr:""}function lt(r){return r.replace(/[\r\n]+$/,"")||null}async function Sr(r,e=process.platform,t=Tn){if(e==="darwin")try{let i=await t("osascript",["-e",'set selectedFolder to choose folder with prompt "Select Workspace Directory"',"-e","POSIX path of selectedFolder"],r);return lt(i.stdout)}catch(i){if(!r.aborted&&De(i)===1&&/(?:User canceled|-128)/i.test(An(i)))return null;throw i}if(e==="linux"){try{return lt((await t("zenity",["--file-selection","--directory","--title=Select Workspace Directory"],r)).stdout)}catch(i){if(r.aborted)throw i;if(De(i)===1)return null;if(De(i)!=="ENOENT")throw i}try{return lt((await t("kdialog",["--getexistingdirectory",".","--title","Select Workspace Directory"],r)).stdout)}catch(i){if(r.aborted)throw i;if(De(i)===1)return null;throw i}}throw new Error(`\u5F53\u524D\u7CFB\u7EDF\u4E0D\u652F\u6301\u672C\u5730\u76EE\u5F55\u9009\u62E9\u5668\uFF1A${e}`)}import{createHash as Rn,randomUUID as Wn}from"node:crypto";import{mkdir as Nn,readFile as Dn,writeFile as On}from"node:fs/promises";import{join as xr}from"node:path";import{getAgentDir as Fn}from"@earendil-works/pi-coding-agent";var Oe=20*1024*1024,Ir=20,Bn=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/iu;function $n(r){let e=r.indexOf("."),t=(e<0?r:r.slice(0,e)).replace(/[. ]+$/u,"");return Bn.test(t)}function jn(r,e){let t=0,i="";for(let n of Buffer.from(r).toString("utf8")){let s=Buffer.byteLength(n);if(t+s>e)break;i+=n,t+=s}return i}function Ln(r){if(r===void 0)return"file";let t=r.slice(Math.max(r.lastIndexOf("/"),r.lastIndexOf("\\"))+1).replace(/[\u0000-\u001f\u007f]/g,"").replace(/[<>:"|?*]/g,"_").trim().replace(/[. ]+$/u,"");return $n(t)&&(t=`_${t}`),t=jn(t,255).replace(/[. ]+$/u,""),t===""||t==="."||t===".."?"file":t}function Gn(r){return r.length>=8&&r.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?"image/png":r.length>=3&&r.subarray(0,3).equals(Buffer.from([255,216,255]))?"image/jpeg":r.length>=6&&["GIF87a","GIF89a"].includes(r.toString("ascii",0,6))?"image/gif":r.length>=12&&r.toString("ascii",0,4)==="RIFF"&&r.toString("ascii",8,12)==="WEBP"?"image/webp":null}async function Cr(r,e,t,i){if(i.byteLength===0||i.byteLength>Oe)throw new Error("\u6587\u4EF6\u4E3A\u7A7A\u6216\u8D85\u8FC7 20 MB");let n=Ln(e),s=Rn("sha256").update(i).digest("hex"),a=xr(Fn(),"pi-web","attachments",s);await Nn(a,{recursive:!0});let l=xr(a,n);try{await On(l,i,{flag:"wx",mode:384})}catch(p){if(!(p instanceof Error&&"code"in p&&p.code==="EEXIST"))throw p}return{id:Wn(),name:n,bytes:i.byteLength,path:l,mediaType:Gn(i)??t.replace(/^image\//,"application/"),sessionId:r}}async function _r(r){return{type:"image",data:(await Dn(r.path)).toString("base64"),mimeType:r.mediaType}}import{randomBytes as Vn}from"node:crypto";function Tr(r,e,t){return r!=="openai-codex"||e!=="oauth"?t:{...t,prompt:i=>i.type==="select"&&i.options.some(n=>n.id==="browser")&&i.options.some(n=>n.id==="device_code")?Promise.resolve("browser"):t.prompt(i)}}var Fe=class{flows=new Map;reportError;constructor(e=()=>{}){this.reportError=e}start(e,t,i,n,s){let a=this.getActive();if(a){if(a.providerId===e&&a.method===t&&n===void 0)return a;throw new Error("\u5176\u4ED6\u63D0\u4F9B\u65B9\u7684\u767B\u5F55\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u5148\u5B8C\u6210\u6216\u53D6\u6D88\u5F53\u524D\u767B\u5F55")}this.flows.clear();let l=Vn(18).toString("base64url"),p={view:{id:l,providerId:e,method:t,status:"running"},controller:new AbortController};return this.flows.set(l,p),i(e,t,{signal:p.controller.signal,notify:h=>{p.view={...p.view,event:h,...h.type==="auth_url"||h.type==="device_code"?{authorization:h}:{}}},prompt:h=>{if(h.type==="secret"&&n!==void 0){let u=n;return n=void 0,Promise.resolve(u)}return new Promise((u,c)=>{let{signal:f,...m}=h;p.answer=u,p.reject=c,p.view={...p.view,status:"waiting",prompt:m},f?.aborted?c(new Error("\u767B\u5F55\u8F93\u5165\u5DF2\u53D6\u6D88")):f?.addEventListener("abort",()=>c(new Error("\u767B\u5F55\u8F93\u5165\u5DF2\u53D6\u6D88")),{once:!0})})}}).then(()=>{p.view.status!=="cancelled"&&(p.view={id:l,providerId:e,method:t,status:"done"})}).catch(h=>{if(p.view.status!=="cancelled"){let u=new Error("Provider login failed");h instanceof Error&&h.stack&&(u.stack=`${u.message}
24
- ${h.stack.split(`
18
+ `)}`)),t}function sn(r){return{...r.filename?{filename:ot(r.filename)}:{},...r.abs_path?{abs_path:ot(r.abs_path)}:{},...r.function?{function:L(r.function)}:{},lineno:r.lineno,colno:r.colno,in_app:r.in_app}}function on(r){let e=q(r.contexts?.diagnostic??{}),t=sr(e);return{event_id:r.event_id,timestamp:r.timestamp,platform:r.platform,level:r.level,release:r.release,dist:r.dist,environment:L(r.environment??"production"),...r.message?{message:L(r.message)}:{},exception:r.exception?{values:r.exception.values?.slice(0,4).map(i=>({type:L(i.type??"Error"),value:L(i.value??""),...i.stacktrace?{stacktrace:{frames:i.stacktrace.frames?.slice(-30).map(sn)}}:{},...i.mechanism?{mechanism:{type:i.mechanism.type,handled:i.mechanism.handled}}:{}}))}:void 0,tags:{side:r.tags?.side,buildId:r.tags?.buildId,...e.toolName?{toolName:e.toolName}:{},...e.failureKind?{failureKind:e.failureKind}:{},...e.errorCode?{errorCode:e.errorCode}:{}},...t?{fingerprint:t}:{},contexts:{diagnostic:e},breadcrumbs:r.breadcrumbs?.slice(-100).map(i=>({timestamp:i.timestamp,category:L(i.category??"app"),data:q(i.data??{})})),debug_meta:r.debug_meta?{images:r.debug_meta.images?.slice(0,10).map(i=>({type:i.type,debug_id:i.debug_id,...i.code_file?{code_file:ot(i.code_file)}:{}}))}:void 0}}function sr(r){if(!(r.stage!=="tool"||r.originalStackAvailable!==!1||!r.toolName||!r.failureKind))return["pi-webapp-tool-result",String(r.toolName),String(r.toolId??"builtin"),String(r.failureKind),String(r.errorCode??"unknown")]}function or(r,e){return e.attachments=[],on(r)}var Pe=class{items=[];bytes=0;encoder=new TextEncoder;add(e,t={}){let i={timestamp:Date.now()/1e3,category:L(e),data:q(t)},n=this.encoder.encode(JSON.stringify(i)).byteLength+1;for(this.items.push({item:i,size:n}),this.bytes+=n;this.items.length>100||this.bytes>64*1024-2;)this.bytes-=this.items.shift().size}snapshot(){return this.items.map(({item:e})=>e)}},at=class{windowAt=-1;total=0;seen=new Map;take(e,t=Date.now()){(this.windowAt<0||t-this.windowAt>=6e4)&&(this.windowAt=t,this.total=0);let i=this.seen.get(e);if(i&&t-i.at<6e4){i.repeats++;return}if(!(this.total>=20))return this.total++,this.seen.size>=64&&!i&&this.seen.delete(this.seen.keys().next().value),this.seen.set(e,{at:t,repeats:0}),{repeats:i?.repeats??0}}},an=new Set(["\u76EE\u5F55\u8DEF\u5F84\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84","\u7236\u76EE\u5F55\u8DEF\u5F84\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84","\u6587\u4EF6\u5939\u540D\u79F0\u65E0\u6548","\u5DE5\u4F5C\u533A\u76EE\u5F55\u4E0D\u53EF\u7528\uFF0C\u8BF7\u6062\u590D\u76EE\u5F55\u6216\u4ECE\u5217\u8868\u79FB\u9664\u540E\u91CD\u65B0\u6DFB\u52A0","\u4F1A\u8BDD\u5DF2\u5207\u6362","Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F","\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F","\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u5DE5\u4F5C\u533A","\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u4F1A\u8BDD","\u8BF7\u5148\u5207\u6362\u5230\u5176\u4ED6\u5DE5\u4F5C\u533A","\u65B0\u4F1A\u8BDD\u5DF2\u53D6\u6D88","\u5DF2\u6709\u767B\u5F55\u6B63\u5728\u8FDB\u884C","\u6A21\u578B\u4E0D\u53EF\u7528","\u6A21\u578B\u63D0\u4F9B\u65B9\u672A\u914D\u7F6E\u8BA4\u8BC1","\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u6B64\u63A8\u7406\u5F3A\u5EA6","\u5176\u4ED6\u63D0\u4F9B\u65B9\u7684\u767B\u5F55\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u5148\u5B8C\u6210\u6216\u53D6\u6D88\u5F53\u524D\u767B\u5F55","\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6682\u505C\u7684\u4EFB\u52A1","\u8BF7\u5148\u5B8C\u6210\u5F53\u524D\u4EA4\u4E92\u6216\u5BA1\u6279","\u8BF7\u5148\u9009\u62E9\u6A21\u578B","\u8BF7\u5148\u8FDE\u63A5\u5F53\u524D\u6A21\u578B","\u63D2\u4EF6\u672A\u542F\u7528","\u4F1A\u8BDD\u8FD0\u884C\u5B9E\u4F8B\u5DF2\u5207\u6362","\u63D0\u4F9B\u65B9\u5DF2\u5B58\u5728","\u6587\u4EF6\u8D85\u8FC7 20 MB","\u8BF7\u6C42\u5185\u5BB9\u8FC7\u5927","\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A","\u63A8\u7406\u5F3A\u5EA6\u65E0\u6548"]);function ie(r){return r instanceof Error&&(r.name==="AbortError"||an.has(r.message))}var Ae=class{budget=new at;breadcrumbs;scopeClass;seen=new WeakSet;state={};client;side;buildId;constructor(e,t,i,n,s=new Pe){this.client=e,this.side=t,this.buildId=i,this.scopeClass=n.Scope,this.breadcrumbs=s,e.addIntegration(n.linkedErrorsIntegration({limit:4}))}setState(e){this.state=q(e)}capture(e,t={},i){try{if(ie(e))return;if(typeof e=="object"&&e!==null){if(this.seen.has(e))return;this.seen.add(e)}let n=fe(e),s=q({...this.state,...t}),a=sr(s),l=a?JSON.stringify(a):`${n.name}:${n.message}:${n.stack?.split(`
19
+ `)[1]??""}:${t.stage??""}`,p=this.budget.take(l);if(!p)return;let g=new this.scopeClass;g.setClient(this.client),g.setTags({side:this.side,buildId:this.buildId}),s.level==="warning"&&g.setLevel("warning"),a&&g.setFingerprint(a),g.setContext("diagnostic",{...s,repeats:p.repeats});for(let u of this.breadcrumbs.snapshot())g.addBreadcrumb(u,100);return g.captureException(n,i?{event_id:i}:void 0)}catch{return}}ignore(e){this.seen.add(e)}};function ar(r,e){return r({...e,bufferSize:20},async({body:t})=>{let i=await fetch(e.url,{method:"POST",body:t,signal:AbortSignal.timeout(3e3),credentials:"omit",referrerPolicy:"no-referrer",redirect:"error",headers:{"Content-Type":"application/x-sentry-envelope"}});return{statusCode:i.status,headers:{"x-sentry-rate-limits":i.headers.get("x-sentry-rate-limits"),"retry-after":i.headers.get("retry-after")}}})}var cr={metadata:Tt,routes:tr,coordinateStart:(r,e)=>st(r,e,!0),requestFailure:r=>r instanceof P?{status:r.status,body:{error:r.message,errorCode:"validation_error",reason:r.reason}}:null,async handle({path:r,body:e,snapshot:t,busyWorkspaces:i,json:n}){let s=t();if(e.sessionId!==s.sessionId){n(409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}try{let a=u=>!t().idle||i().some(c=>{let f=(m,h)=>{let E=ln(m,h);return E!==".."&&!E.startsWith("../")&&!E.startsWith("..\\")&&!cn(E)};return f(u,c)||f(c,u)}),l=u=>{let c=t();if(c.sessionId!==s.sessionId||c.cwd!==s.cwd)throw new P("\u4F1A\u8BDD\u5DF2\u5207\u6362",409,"session_changed");if(a(u))throw new P("\u5171\u7528\u6B64\u5DE5\u4F5C\u6811\u7684\u804A\u5929\u6B63\u5728\u8FD0\u884C",409,"agent_busy")},p=r.endsWith("/write"),g=p?await Ut(s.cwd,e,l):await rr(r,s.cwd,e);if(!p){let u=t();if(u.sessionId!==s.sessionId||u.cwd!==s.cwd){n(409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(r.endsWith("/control")){let c=g;c.root&&a(c.root)&&(c.blocked??="agent_busy")}}n(200,g)}catch(a){if(a instanceof P||a instanceof N)n(a.status,{error:a.message,errorCode:"validation_error",...a instanceof P?{reason:a.reason}:{}});else throw Y(a,"Git \u64CD\u4F5C\u5931\u8D25")}}};var lr={id:pe.files,kind:"builtin",version:"1.0.0",name:{zh:"\u5DE5\u4F5C\u533A\u6587\u4EF6",en:"Workspace files"},description:{zh:"\u6D4F\u89C8\u5DE5\u4F5C\u533A\u76EE\u5F55\uFF0C\u53EA\u8BFB\u9884\u89C8\u4EE3\u7801\u3001Markdown \u4E0E\u56FE\u7247\u3002",en:"Browse workspace directories and preview code, Markdown and images read-only."}};var dr={metadata:lr,routes:["/api/workspace/files/list","/api/workspace/files/preview"],async handle({path:r,body:e,snapshot:t,json:i}){let n=t();if(e.sessionId!==n.sessionId){i(409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(typeof e.path!="string"||e.path.length>4096){i(400,{error:"\u5DE5\u4F5C\u533A\u6587\u4EF6\u8DEF\u5F84\u65E0\u6548"});return}try{let s=r.endsWith("/list")?await Ft(n.cwd,e.path):await ve(n.cwd,e.path),a=t();if(a.sessionId!==n.sessionId||a.cwd!==n.cwd){i(409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}i(200,s)}catch(s){if(s instanceof N)i(s.status,{error:s.message,errorCode:"validation_error"});else throw Y(s,"\u5DE5\u4F5C\u533A\u6587\u4EF6\u8BFB\u53D6\u5931\u8D25")}}};var pr={id:pe.terminal,kind:"builtin",version:"1.0.0",name:{zh:"\u7EC8\u7AEF",en:"Terminal"},description:{zh:"\u5728\u5DE5\u4F5C\u533A\u8FD0\u884C\u4EA4\u4E92\u5F0F Shell\u3002\u505C\u7528\u4F1A\u7ED3\u675F\u6B64\u670D\u52A1\u7684\u6240\u6709\u7EC8\u7AEF\u8FDB\u7A0B\u3002",en:"Run an interactive shell in the workspace. Disabling ends all terminals on this service."}};import{accessSync as mr,constants as ct,statSync as gr}from"node:fs";import{createRequire as yn}from"node:module";import{execFile as hr}from"node:child_process";import{accessSync as dn,chmodSync as pn,constants as un,statSync as fn}from"node:fs";import{createRequire as mn}from"node:module";import{dirname as gn,join as hn}from"node:path";var ur=mn(import.meta.url);function wn(r){if(process.platform==="darwin")for(let e of["build/Release","build/Debug",`prebuilds/darwin-${process.arch}`]){let t=hn(r,e,"spawn-helper"),i;try{i=fn(t).mode}catch(n){if(n.code==="ENOENT")continue;throw n}try{dn(t,un.X_OK)}catch{pn(t,i|73)}}}function fr(...r){return wn(gn(ur.resolve("node-pty/package.json"))),ur("node-pty").spawn(...r)}var Z=class extends Error{reason;constructor(e,t,i){super(t,{cause:i}),this.reason=e}},wr=yn(import.meta.url),lt=class{pid;pty;screen;serializer;followers=new Set;pending=Promise.resolve();exit;disposed=!1;done;expire;closing;sessionId;abandoned;graceMs;constructor(e,t,i,n,s,a,l,p){this.sessionId=e,this.abandoned=l,this.graceMs=p;let{Terminal:g}=wr("@xterm/headless"),{SerializeAddon:u}=wr("@xterm/addon-serialize");this.screen=new g({cols:i,rows:n,scrollback:2e3,allowProposedApi:!0}),this.serializer=new u,this.screen.loadAddon(this.serializer);let c=Object.fromEntries(Object.entries(process.env).filter(([f,m])=>m!==void 0&&!/^PI_WEBAPP_RESTART_/.test(f)));try{this.pty=fr(s,a,{name:"xterm-256color",cwd:t,cols:i,rows:n,env:{...c,TERM:"xterm-256color",COLORTERM:"truecolor"}})}catch(f){throw this.screen.dispose(),new Z("terminal_runtime_unavailable","\u672C\u673A\u7EC8\u7AEF\u7EC4\u4EF6\u542F\u52A8\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\u6216\u4FEE\u590D\u5E94\u7528\u7684 node-pty \u4F9D\u8D56",f)}this.pid=this.pty.pid,this.screen.onData(f=>{!this.followers.size&&!this.exit&&!this.disposed&&this.pty.write(f)}),this.pty.onData(f=>{this.disposed||(this.pty.pause(),this.pending=this.pending.then(()=>new Promise(m=>{if(this.disposed){m();return}this.screen.write(f,()=>{this.broadcast({type:"output",data:f}),m()})})).finally(()=>{!this.exit&&!this.disposed&&this.pty.resume()}))}),this.done=new Promise(f=>this.pty.onExit(({exitCode:m,signal:h})=>{this.exit={type:"exit",exitCode:m,signal:h},this.pending.then(()=>{this.broadcast(this.exit),f()})})),this.scheduleExpiry()}broadcast(e){for(let t of this.followers)t(e)||this.followers.delete(t);this.followers.size||this.scheduleExpiry()}scheduleExpiry(){this.expire||this.disposed||(this.expire=setTimeout(this.abandoned,this.graceMs).unref())}async attach(e){if(await this.pending,this.disposed)throw new Error("\u7EC8\u7AEF\u5DF2\u5173\u95ED");return clearTimeout(this.expire),this.expire=void 0,e({type:"snapshot",screen:this.serializer.serialize(),cols:this.screen.cols,rows:this.screen.rows})?(this.exit&&e(this.exit),this.followers.add(e)):this.scheduleExpiry(),()=>{this.followers.delete(e),this.followers.size||this.scheduleExpiry()}}write(e){if(this.exit||this.disposed)throw new Error("\u7EC8\u7AEF\u5DF2\u9000\u51FA");this.pty.write(e)}resize(e,t){this.exit||this.disposed||(this.pty.resize(e,t),this.pending=this.pending.then(()=>{this.disposed||(this.screen.resize(e,t),this.broadcast({type:"resize",cols:e,rows:t}))}))}close(){return this.closing??=this.dispose()}async dispose(){if(this.disposed=!0,clearTimeout(this.expire),!this.exit){if(process.platform==="win32")await new Promise(e=>hr("taskkill",["/pid",String(this.pid),"/T","/F"],()=>e()));else{let t=(await new Promise(n=>hr("ps",["-axo","pid=,ppid="],(s,a)=>n(s?"":a)))).trim().split(`
20
+ `).map(n=>n.trim().split(/\s+/).map(Number)),i=n=>t.filter(([,s])=>s===n).flatMap(([s])=>[...i(s),s]);for(let n of[...i(this.pid),this.pid])try{process.kill(n,"SIGKILL")}catch{}}this.pty.kill(),this.pty.resume(),await this.done}await this.pending,this.followers.clear(),this.screen.dispose()}},Ne=class{terminals=new Map;stopped=!1;options;constructor(e={}){this.options=e}create(e,t,i,n,s){if(this.stopped)throw new Error("\u7EC8\u7AEF\u670D\u52A1\u5DF2\u505C\u6B62");if(this.terminals.has(e))return this.get(e,t);if(this.terminals.size>=32||[...this.terminals.values()].filter(g=>g.sessionId===t).length>=8)throw new Z("terminal_limit","\u7EC8\u7AEF\u6570\u91CF\u5DF2\u8FBE\u4E0A\u9650\uFF0C\u8BF7\u5173\u95ED\u4E0D\u7528\u7684\u7EC8\u7AEF");let a=this.options.shell??(process.platform==="win32"?process.env.COMSPEC||"cmd.exe":process.env.SHELL||"/bin/sh");try{if(mr(a,ct.X_OK),!gr(a).isFile())throw new Error("Not a shell file")}catch(g){throw new Z("terminal_shell_unavailable","\u9ED8\u8BA4 shell \u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u6267\u884C\uFF0C\u8BF7\u4FEE\u6B63 SHELL\uFF08Windows \u4E3A COMSPEC\uFF09\u540E\u91CD\u542F\u5E94\u7528",g)}try{if(!gr(i).isDirectory())throw new Error("Not a directory");mr(i,ct.R_OK|ct.X_OK)}catch(g){throw new Z("terminal_workspace_unavailable","\u5DE5\u4F5C\u533A\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u8BBF\u95EE\uFF0C\u8BF7\u5207\u6362\u5230\u6709\u6548\u5DE5\u4F5C\u533A\u540E\u65B0\u5EFA\u7EC8\u7AEF",g)}let l=this.options.shellArgs??(process.platform==="win32"?[]:["-i"]),p=new lt(t,i,n,s,a,l,()=>{this.remove(e,t)},this.options.graceMs??5*6e4);return this.terminals.set(e,p),p}get(e,t){let i=this.terminals.get(e);if(!i||i.sessionId!==t)throw new Error("\u7EC8\u7AEF\u4E0D\u5B58\u5728\u6216\u4E0D\u5C5E\u4E8E\u6B64\u4F1A\u8BDD");return i}async remove(e,t){let i=this.terminals.get(e);if(i){if(i.sessionId!==t)throw new Error("\u7EC8\u7AEF\u4E0D\u5C5E\u4E8E\u6B64\u4F1A\u8BDD");await i.close(),this.terminals.get(e)===i&&this.terminals.delete(e)}}async clear(){await Promise.all([...this.terminals.values()].map(e=>e.close())),this.terminals.clear()}async close(){this.stopped=!0,await this.clear()}};var yr=(r,e)=>Number.isInteger(r)&&Number.isInteger(e)&&Number(r)>=2&&Number(r)<=500&&Number(e)>=1&&Number(e)<=300;async function br(r,e,t,i,n,s){let a=(g,u)=>{t.writeHead(g,{"Content-Type":"application/json","Cache-Control":"no-store"}),t.end(JSON.stringify(u))};if(typeof e.id!="string"||!/^[a-f0-9-]{36}$/i.test(e.id)){a(400,{error:"\u7EC8\u7AEF\u6807\u8BC6\u65E0\u6548"});return}let l=r.slice(14),p=i();if(l!=="close"&&e.sessionId!==p.sessionId){a(409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if((l==="create"||l==="resize")&&!yr(e.cols,e.rows)){a(400,{error:"\u7EC8\u7AEF\u5C3A\u5BF8\u65E0\u6548"});return}if(l==="input"&&(typeof e.data!="string"||Buffer.byteLength(e.data)>16384)){a(400,{error:"\u7EC8\u7AEF\u8F93\u5165\u65E0\u6548\u6216\u8FC7\u5927"});return}try{if(l==="create"){n.create(e.id,e.sessionId,p.cwd,e.cols,e.rows),a(201,{id:e.id});return}if(l==="close"){await n.remove(e.id,e.sessionId),a(200,{closed:!0});return}let g=n.get(e.id,e.sessionId);if(l==="attach"){let u=!1,c;t.once("close",()=>{u=!0,c?.(),s.delete(t)}),c=await g.attach(f=>u?!1:(t.headersSent||t.writeHead(200,{"Content-Type":"application/x-ndjson","Cache-Control":"no-store","X-Accel-Buffering":"no"}),t.writableLength>1024*1024?(t.destroy(),!1):(t.write(`${JSON.stringify(f)}
21
+ `),!0))),u?c():s.add(t);return}if(l==="input")g.write(e.data);else if(l==="resize")g.resize(e.cols,e.rows);else{a(404,{error:"\u672A\u77E5\u7EC8\u7AEF\u64CD\u4F5C"});return}a(200,{accepted:!0})}catch(g){t.headersSent?t.end():a(400,{error:g instanceof Z?g.message:l==="create"?"\u672C\u673A\u7EC8\u7AEF\u7EC4\u4EF6\u542F\u52A8\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\u6216\u4FEE\u590D\u5E94\u7528\u7684\u7EC8\u7AEF\u4F9D\u8D56":"\u7EC8\u7AEF\u4E0D\u53EF\u7528\u6216\u4E0D\u5C5E\u4E8E\u6B64\u4F1A\u8BDD\uFF0C\u8BF7\u91CD\u65B0\u6253\u5F00\u7EC8\u7AEF",reason:g instanceof Z?g.reason:l==="create"?"terminal_runtime_unavailable":void 0})}}function vr(){let r=new Ne,e=new Set,t=async()=>{for(let i of e)i.end();e.clear(),await r.clear()};return{metadata:pr,routes:["create","attach","input","resize","close"].map(i=>`/api/terminal/${i}`),handle:i=>br(i.path,i.body,i.res,i.snapshot,r,e),disable:t,async close(){await t(),await r.close()}}}function kr(){return[dr,vr(),cr]}import{createHash as bn,randomUUID as vn}from"node:crypto";import{mkdir as kn,open as En,readFile as Pn,rename as Sn,rm as Er,writeFile as xn}from"node:fs/promises";import{dirname as In}from"node:path";var W=class extends Error{status;constructor(e,t=409){super(e),this.status=t}},We=class r{disabled=new Set;changing=!1;file;constructor(e){this.file=e}async load(){try{let e=JSON.parse(await Pn(this.file,"utf8"));if(!e||typeof e!="object"||!("version"in e)||e.version!==1||!("disabled"in e)||!Array.isArray(e.disabled)||!e.disabled.every(t=>typeof t=="string"&&t.length>0&&t.length<=200))throw new W("\u63D2\u4EF6\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u4FEE\u590D\u914D\u7F6E\u540E\u91CD\u542F",503);this.disabled=new Set(e.disabled)}catch(e){if(e.code!=="ENOENT")throw e}}enabled(e){return!this.disabled.has(e)}revision(){return bn("sha256").update(JSON.stringify([...this.disabled].sort())).digest("hex")}async set(e,t,i,n){if(this.changing)throw new W("\u63D2\u4EF6\u914D\u7F6E\u6B63\u5728\u4FDD\u5B58\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");this.changing=!0;let s=`${this.file}.${vn()}.tmp`,a=`${this.file}.lock`,l;try{if(i!==this.revision())throw new W("\u63D2\u4EF6\u914D\u7F6E\u5DF2\u53D8\u5316\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5");n();let p=new Set(this.disabled);t?p.delete(e):p.add(e),await kn(In(this.file),{recursive:!0});try{l=await En(a,"wx",384)}catch(u){throw u.code==="EEXIST"?new W("\u63D2\u4EF6\u914D\u7F6E\u9501\u5B9A\u6587\u4EF6\u4ECD\u5B58\u5728\uFF0C\u5237\u65B0\u4E0D\u4F1A\u89E3\u9664\u3002\u8BF7\u5148\u505C\u6B62\u4F7F\u7528\u6B64\u914D\u7F6E\u7684\u5168\u90E8 Pi \u670D\u52A1\uFF0C\u518D\u5220\u9664 pi-web/plugins.json.lock \u540E\u91CD\u542F\uFF1B\u4E0D\u8981\u5220\u9664\u6D3B\u8DC3\u670D\u52A1\u7684\u9501"):u}await l.writeFile(JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()})+`
22
+ `);let g=new r(this.file);if(await g.load(),g.revision()!==i)throw new W("\u63D2\u4EF6\u914D\u7F6E\u5DF2\u7531\u5176\u4ED6\u670D\u52A1\u4FEE\u6539\uFF0C\u8BF7\u91CD\u542F\u5F53\u524D\u670D\u52A1\u540E\u91CD\u8BD5");await xn(s,JSON.stringify({version:1,disabled:[...p].sort()},null,2)+`
23
+ `,{mode:384}),n(),await Sn(s,this.file),this.disabled=p}finally{this.changing=!1;try{await Er(s,{force:!0})}finally{l&&(await l.close(),await Er(a,{force:!0}))}}}};var De=class{routes;running=new Map;changing=!1;plugins;preferences;constructor(e,t){if(this.plugins=e,this.preferences=t,this.routes=e.flatMap(i=>[...i.routes]),new Set(e.map(i=>i.metadata.id)).size!==e.length||new Set(this.routes).size!==this.routes.length)throw new Error("Duplicate server plugin registration")}get mutating(){return this.changing}actionRoute(e,t){return this.plugins.find(i=>i.metadata.id===e)?.routes.find(i=>i.split("/").at(-1)===t&&!i.endsWith("/attach"))}external(e){let t=new Set(this.plugins.map(i=>i.metadata.id));return{plugins:e.plugins.filter(i=>!t.has(i.id)),errors:[...e.errors,...e.plugins.filter(i=>t.has(i.id)).map(i=>`Plugin ID reserved by host: ${i.id}`)]}}catalog(e){let t=this.external(e);return{...t,plugins:[...this.plugins.filter(i=>this.preferences.enabled(i.metadata.id)).map(i=>({id:i.metadata.id,client:`builtin:${i.metadata.id}`})),...t.plugins]}}inventory(e){return{revision:this.preferences.revision(),scope:"global",items:[...this.plugins.map(t=>({...t.metadata,enabled:this.preferences.enabled(t.metadata.id),managed:!0})),...this.external(e).plugins.map(t=>({id:t.id,name:t.id,description:{zh:"\u7531 Pi \u8F6F\u4EF6\u5305\u63D0\u4F9B\u7684 Web \u63D2\u4EF6\u3002\u8BF7\u5728\u5305\u4E0E\u6269\u5C55\u4E2D\u7BA1\u7406\u5176\u8FD0\u884C\u65F6\u3002",en:"Web plugin supplied by a Pi package. Manage its runtime under Packages & extensions."},version:"",kind:"external",enabled:!0,managed:!1,reason:"pi-runtime-owned"}))]}}async toggle(e,t,i,n){if(!this.plugins.some(s=>s.metadata.id===e))throw new W("\u6B64\u63D2\u4EF6\u9700\u8981\u901A\u8FC7 Pi \u8F6F\u4EF6\u5305\u7BA1\u7406",400);if(this.changing||[...this.running.values()].some(s=>s>0))throw new W("\u63D2\u4EF6\u64CD\u4F5C\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210");this.changing=!0;try{await this.preferences.set(e,t,i,n),t||await this.plugins.find(s=>s.metadata.id===e)?.disable?.()}finally{this.changing=!1}}async dispatch(e){let t=this.plugins.find(n=>n.routes.includes(e.path));if(!t)return!1;if(this.changing)return e.json(409,{error:"\u63D2\u4EF6\u914D\u7F6E\u6B63\u5728\u4FDD\u5B58\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5"}),!0;if(!this.preferences.enabled(t.metadata.id))return e.json(403,{error:"\u63D2\u4EF6\u5DF2\u505C\u7528",errorCode:"plugin_disabled"}),!0;let i=t.metadata.id;this.running.set(i,(this.running.get(i)??0)+1);try{await t.handle(e)}finally{this.running.set(i,this.running.get(i)-1)}return!0}async coordinateStart(e,t){if(this.changing)throw new W("\u63D2\u4EF6\u914D\u7F6E\u6B63\u5728\u4FDD\u5B58\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");let i="@host/start";this.running.set(i,(this.running.get(i)??0)+1);let n=t;for(let s of this.plugins)if(s.coordinateStart&&this.preferences.enabled(s.metadata.id)){let a=n;n=()=>s.coordinateStart(e,a)}try{return await n()}finally{this.running.set(i,this.running.get(i)-1)}}requestFailure(e){if(e instanceof W)return{status:e.status,body:{error:e.message,errorCode:"validation_error",reason:"plugin_busy"}};for(let t of this.plugins){let i=t.requestFailure?.(e);if(i)return i}return null}async close(){await Promise.all(this.plugins.map(e=>e.close?.()))}};import{mkdir as Cn,opendir as _n,stat as Tn}from"node:fs/promises";import{homedir as Mn}from"node:os";import{basename as An,dirname as Pr,join as Sr,posix as Rn,resolve as xr,win32 as Nn}from"node:path";function Ir(r){return process.platform==="win32"?Nn.isAbsolute(r)&&/^(?:[A-Za-z]:[\\/]|[\\/]{2}[^\\/]+[\\/]+[^\\/]+)/.test(r):Rn.isAbsolute(r)}function Wn(r,e,t){if(r.length===t&&e.name.localeCompare(r[r.length-1].name)>=0)return!0;let i=0,n=r.length;for(;i<n;){let s=i+n>>>1;e.name.localeCompare(r[s].name)<0?n=s:i=s+1}return r.splice(i,0,e),r.length<=t?!1:(r.pop(),!0)}async function Cr(r){if(r!==void 0&&!Ir(r))throw new Error("\u76EE\u5F55\u8DEF\u5F84\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84");let e=Mn(),t=xr(r??e),i=[];for(let p=t;;p=Pr(p)){let g=Pr(p);if(i.unshift({name:g===p?p:An(p),path:p,hidden:!1}),g===p)break}let n=[],s=!1,a=await _n(t);for await(let p of a)!p.isDirectory()&&!p.isSymbolicLink()||Wn(n,{name:p.name,isDirectory:p.isDirectory(),isSymbolicLink:p.isSymbolicLink()},1001)&&(s=!0);let l=[];for(let p of n){let g=Sr(t,p.name);if(!p.isDirectory&&p.isSymbolicLink)try{if(!(await Tn(g)).isDirectory())continue}catch{continue}if(l.length===1e3){s=!0;break}l.push({name:p.name,path:g,hidden:p.name.startsWith(".")})}return{path:t,home:e,crumbs:i,entries:l,truncated:s}}async function _r(r,e){if(!Ir(r))throw new Error("\u7236\u76EE\u5F55\u8DEF\u5F84\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84");if(!e.trim()||e==="."||e===".."||/[/\\]/.test(e))throw new Error("\u6587\u4EF6\u5939\u540D\u79F0\u65E0\u6548");let t=Sr(xr(r),e);return await Cn(t),t}import{execFile as Dn}from"node:child_process";import{accessSync as On,constants as Fn}from"node:fs";import{delimiter as Bn,join as $n}from"node:path";var jn=(r,e,t)=>new Promise((i,n)=>{Dn(r,[...e],{encoding:"utf8",signal:t,windowsHide:!0},(s,a,l)=>{s?n(Object.assign(new Error(s.message,{cause:s}),{code:s.code,stdout:a,stderr:l})):i({stdout:a,stderr:l})})});function Ln(r){for(let e of(r??"").split(Bn))if(e)for(let t of["zenity","kdialog"])try{return On($n(e,t),Fn.X_OK),!0}catch{}return!1}function Tr(r=process.platform,e=process.env){return e.SSH_CONNECTION||e.SSH_TTY?"browse":r==="darwin"||r==="linux"&&(e.DISPLAY||e.WAYLAND_DISPLAY)&&Ln(e.PATH)?"native":"browse"}function Oe(r){if(!(typeof r!="object"||r===null||!("code"in r)))return typeof r.code=="string"||typeof r.code=="number"?r.code:void 0}function Gn(r){return typeof r=="object"&&r!==null&&"stderr"in r&&typeof r.stderr=="string"?r.stderr:""}function dt(r){return r.replace(/[\r\n]+$/,"")||null}async function Mr(r,e=process.platform,t=jn){if(e==="darwin")try{let i=await t("osascript",["-e",'set selectedFolder to choose folder with prompt "Select Workspace Directory"',"-e","POSIX path of selectedFolder"],r);return dt(i.stdout)}catch(i){if(!r.aborted&&Oe(i)===1&&/(?:User canceled|-128)/i.test(Gn(i)))return null;throw i}if(e==="linux"){try{return dt((await t("zenity",["--file-selection","--directory","--title=Select Workspace Directory"],r)).stdout)}catch(i){if(r.aborted)throw i;if(Oe(i)===1)return null;if(Oe(i)!=="ENOENT")throw i}try{return dt((await t("kdialog",["--getexistingdirectory",".","--title","Select Workspace Directory"],r)).stdout)}catch(i){if(r.aborted)throw i;if(Oe(i)===1)return null;throw i}}throw new Error(`\u5F53\u524D\u7CFB\u7EDF\u4E0D\u652F\u6301\u672C\u5730\u76EE\u5F55\u9009\u62E9\u5668\uFF1A${e}`)}import{createHash as Vn,randomUUID as Un}from"node:crypto";import{mkdir as zn,readFile as Hn,writeFile as Jn}from"node:fs/promises";import{join as Ar}from"node:path";import{getAgentDir as qn}from"@earendil-works/pi-coding-agent";var Fe=20*1024*1024,Rr=20,Kn=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/iu;function Xn(r){let e=r.indexOf("."),t=(e<0?r:r.slice(0,e)).replace(/[. ]+$/u,"");return Kn.test(t)}function Yn(r,e){let t=0,i="";for(let n of Buffer.from(r).toString("utf8")){let s=Buffer.byteLength(n);if(t+s>e)break;i+=n,t+=s}return i}function Zn(r){if(r===void 0)return"file";let t=r.slice(Math.max(r.lastIndexOf("/"),r.lastIndexOf("\\"))+1).replace(/[\u0000-\u001f\u007f]/g,"").replace(/[<>:"|?*]/g,"_").trim().replace(/[. ]+$/u,"");return Xn(t)&&(t=`_${t}`),t=Yn(t,255).replace(/[. ]+$/u,""),t===""||t==="."||t===".."?"file":t}function Qn(r){return r.length>=8&&r.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?"image/png":r.length>=3&&r.subarray(0,3).equals(Buffer.from([255,216,255]))?"image/jpeg":r.length>=6&&["GIF87a","GIF89a"].includes(r.toString("ascii",0,6))?"image/gif":r.length>=12&&r.toString("ascii",0,4)==="RIFF"&&r.toString("ascii",8,12)==="WEBP"?"image/webp":null}async function Nr(r,e,t,i){if(i.byteLength===0||i.byteLength>Fe)throw new Error("\u6587\u4EF6\u4E3A\u7A7A\u6216\u8D85\u8FC7 20 MB");let n=Zn(e),s=Vn("sha256").update(i).digest("hex"),a=Ar(qn(),"pi-web","attachments",s);await zn(a,{recursive:!0});let l=Ar(a,n);try{await Jn(l,i,{flag:"wx",mode:384})}catch(p){if(!(p instanceof Error&&"code"in p&&p.code==="EEXIST"))throw p}return{id:Un(),name:n,bytes:i.byteLength,path:l,mediaType:Qn(i)??t.replace(/^image\//,"application/"),sessionId:r}}async function Wr(r){return{type:"image",data:(await Hn(r.path)).toString("base64"),mimeType:r.mediaType}}import{randomBytes as es}from"node:crypto";function Dr(r,e,t){return r!=="openai-codex"||e!=="oauth"?t:{...t,prompt:i=>i.type==="select"&&i.options.some(n=>n.id==="browser")&&i.options.some(n=>n.id==="device_code")?Promise.resolve("browser"):t.prompt(i)}}var Be=class{flows=new Map;reportError;constructor(e=()=>{}){this.reportError=e}start(e,t,i,n,s){let a=this.getActive();if(a){if(a.providerId===e&&a.method===t&&n===void 0)return a;throw new Error("\u5176\u4ED6\u63D0\u4F9B\u65B9\u7684\u767B\u5F55\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u5148\u5B8C\u6210\u6216\u53D6\u6D88\u5F53\u524D\u767B\u5F55")}this.flows.clear();let l=es(18).toString("base64url"),p={view:{id:l,providerId:e,method:t,status:"running"},controller:new AbortController};return this.flows.set(l,p),i(e,t,{signal:p.controller.signal,notify:g=>{p.view={...p.view,event:g,...g.type==="auth_url"||g.type==="device_code"?{authorization:g}:{}}},prompt:g=>{if(g.type==="secret"&&n!==void 0){let u=n;return n=void 0,Promise.resolve(u)}return new Promise((u,c)=>{let{signal:f,...m}=g;p.answer=u,p.reject=c,p.view={...p.view,status:"waiting",prompt:m},f?.aborted?c(new Error("\u767B\u5F55\u8F93\u5165\u5DF2\u53D6\u6D88")):f?.addEventListener("abort",()=>c(new Error("\u767B\u5F55\u8F93\u5165\u5DF2\u53D6\u6D88")),{once:!0})})}}).then(()=>{p.view.status!=="cancelled"&&(p.view={id:l,providerId:e,method:t,status:"done"})}).catch(g=>{if(p.view.status!=="cancelled"){let u=new Error("Provider login failed");g instanceof Error&&g.stack&&(u.stack=`${u.message}
24
+ ${g.stack.split(`
25
25
  `).slice(1).join(`
26
- `)}`);let c=this.reportError(u,{...s,stage:"provider_login"});p.view={id:l,providerId:e,method:t,status:"error",error:"\u767B\u5F55\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u63D0\u4F9B\u65B9\u63D0\u793A\u5E76\u91CD\u8BD5\u3002",errorId:c}}}),{...p.view}}get(e){let t=this.flows.get(e)?.view;return t?{...t}:void 0}getActive(){let e=[...this.flows.values()].find(({view:t})=>t.status==="running"||t.status==="waiting")?.view;return e?{...e}:void 0}respond(e,t){let i=this.flows.get(e);if(!i?.answer||i.view.status!=="waiting"||i.view.prompt?.type==="select"&&!i.view.prompt.options.some(s=>s.id===t))return!1;let n=i.answer;return i.answer=void 0,i.reject=void 0,i.view={...i.view,status:"running",prompt:void 0},n(t),!0}cancel(e){let t=this.flows.get(e);return!t||t.view.status==="done"||t.view.status==="error"?!1:(t.view={...t.view,status:"cancelled",prompt:void 0},t.controller.abort(),t.reject?.(new Error("\u767B\u5F55\u5DF2\u53D6\u6D88")),t.answer=void 0,t.reject=void 0,!0)}close(){for(let e of this.flows.keys())this.cancel(e);this.flows.clear()}};import{randomBytes as Un}from"node:crypto";import{readFile as zn,rename as Hn,rm as Jn,stat as qn,writeFile as Kn,mkdir as Xn}from"node:fs/promises";import{dirname as Yn}from"node:path";var Zn=["openai-completions","openai-responses","anthropic-messages"];function dt(r){if(!r||typeof r!="object")return!1;let e=r;if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id)||typeof e.name!="string"||!e.name.trim()||e.name.length>100||typeof e.modelId!="string"||!e.modelId.trim()||e.modelId.length>200||!Zn.includes(e.api)||typeof e.baseUrl!="string"||e.baseUrl.length>2048)return!1;try{let t=new URL(e.baseUrl);return(t.protocol==="https:"||t.protocol==="http:")&&!!t.hostname&&!t.username&&!t.password&&!t.hash}catch{return!1}}async function Mr(r,e){if(!dt(e))throw new Error("\u81EA\u5B9A\u4E49\u63D0\u4F9B\u65B9\u540D\u79F0\u3001\u5730\u5740\u6216\u6A21\u578B\u65E0\u6548");let t;try{t=await zn(r,"utf8")}catch(l){if(l.code!=="ENOENT")throw l}let i;if(t===void 0)i={providers:{}};else{try{i=JSON.parse(t)}catch{throw new Error("models.json \u542B\u6CE8\u91CA\u6216\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u624B\u52A8\u6DFB\u52A0\u63D0\u4F9B\u65B9")}if(!i||typeof i!="object"||!i.providers||typeof i.providers!="object"||Array.isArray(i.providers))throw new Error("models.json \u7ED3\u6784\u65E0\u6548")}if(Object.hasOwn(i.providers,e.id))throw new Error("\u63D0\u4F9B\u65B9\u5DF2\u5B58\u5728");let n={...i,providers:{...i.providers,[e.id]:{name:e.name.trim(),baseUrl:e.baseUrl,api:e.api,models:[{id:e.modelId.trim()}]}}};await Xn(Yn(r),{recursive:!0});let s=t===void 0?384:(await qn(r)).mode&511,a=`${r}.pi-web-${Un(6).toString("hex")}.tmp`;try{await Kn(a,`${JSON.stringify(n,null,2)}
27
- `,{mode:s,flag:"wx"}),await Hn(a,r)}finally{await Jn(a,{force:!0})}}import{randomBytes as Qn}from"node:crypto";import{mkdir as es,readFile as ts,rename as rs,rm as is,stat as ns,writeFile as ss}from"node:fs/promises";import{dirname as os}from"node:path";function Ar(r){if(!r||r.length>2048)return!1;try{let e=new URL(r);return(e.protocol==="https:"||e.protocol==="http:")&&!!e.hostname&&!e.username&&!e.password&&!e.search&&!e.hash}catch{return!1}}function Rr(r){if(!r||typeof r!="object")return!1;let e=r;return e.action==="save"?(e.originalId===void 0||typeof e.originalId=="string")&&Wr(e.model):e.action==="base_url"?e.baseUrl===null||typeof e.baseUrl=="string"&&Ar(e.baseUrl):e.action==="remove"&&typeof e.id=="string"&&e.id.length>0&&e.id.length<=200}function Wr(r){if(!r||typeof r!="object")return!1;let e=r;if(typeof e.id!="string"||!e.id.trim()||e.id.length>200||e.name!==void 0&&(typeof e.name!="string"||!e.name.trim()||e.name.length>200))return!1;for(let t of[e.contextWindow,e.maxTokens])if(t!==void 0&&(!Number.isSafeInteger(t)||t<=0))return!1;return e.input===void 0||Array.isArray(e.input)&&e.input.length>0&&e.input.every(t=>t==="text"||t==="image")&&new Set(e.input).size===e.input.length}async function Nr(r){let e;try{e=await ts(r,"utf8")}catch(i){if(i.code!=="ENOENT")throw i}if(e===void 0)return{config:{providers:{}}};let t;try{t=JSON.parse(e)}catch{throw new Error("models.json \u542B\u6CE8\u91CA\u6216\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u624B\u52A8\u4FEE\u6539")}if(!t||typeof t!="object"||!t.providers||typeof t.providers!="object"||Array.isArray(t.providers))throw new Error("models.json \u7ED3\u6784\u65E0\u6548");return{config:t,existing:e}}async function as(r,e,t){await es(os(r),{recursive:!0});let i=t===void 0?384:(await ns(r)).mode&511,n=`${r}.pi-web-${Qn(6).toString("hex")}.tmp`;try{await ss(n,`${JSON.stringify(e,null,2)}
28
- `,{mode:i,flag:"wx"}),await rs(n,r)}finally{await is(n,{force:!0})}}async function Dr(r,e,t){if(!t.getProvider(e))throw new Error("\u63D0\u4F9B\u65B9\u4E0D\u5B58\u5728");let{config:i}=await Nr(r),n=i.providers[e],s=new Set(n?.models?.map(a=>a.id)??[]);return{providerId:e,baseUrl:n?.baseUrl,models:t.getModels(e).map(a=>({id:a.id,name:a.name,contextWindow:a.contextWindow,maxTokens:a.maxTokens,input:[...a.input],source:s.has(a.id)?"custom":"builtin",overridden:!!n?.modelOverrides?.[a.id]}))}}async function Or(r,e,t,i){if(!i.getProvider(e))throw new Error("\u63D0\u4F9B\u65B9\u4E0D\u5B58\u5728");let{config:n,existing:s}=await Nr(r),a={...n.providers[e]??{}},l=[...a.models??[]],p={...a.modelOverrides??{}};if(t.action==="base_url"){if(t.baseUrl!==null&&!Ar(t.baseUrl))throw new Error("API \u5730\u5740\u65E0\u6548");t.baseUrl===null?delete a.baseUrl:a.baseUrl=t.baseUrl}else if(t.action==="save"){if(!Wr(t.model))throw new Error("\u6A21\u578B\u53C2\u6570\u65E0\u6548");let h={id:t.model.id.trim(),...t.model.name===void 0?{}:{name:t.model.name},...t.model.contextWindow===void 0?{}:{contextWindow:t.model.contextWindow},...t.model.maxTokens===void 0?{}:{maxTokens:t.model.maxTokens},...t.model.input===void 0?{}:{input:t.model.input}},u=t.originalId,c=u===void 0?-1:l.findIndex(f=>f.id===u);if(u===void 0&&(l.some(f=>f.id===h.id)||i.getModel(e,h.id)))throw new Error("\u6A21\u578B ID \u5DF2\u5B58\u5728");if(c>=0){if(h.id!==u&&(l.some(m=>m.id===h.id)||i.getModel(e,h.id)))throw new Error("\u6A21\u578B ID \u5DF2\u5B58\u5728");let f={...l[c],...h};for(let m of["name","contextWindow","maxTokens","input"])h[m]===void 0&&delete f[m];l[c]=f}else if(u!==void 0&&i.getModel(e,u)){if(h.id!==u)throw new Error("\u5185\u7F6E\u6A21\u578B ID \u4E0D\u53EF\u4FEE\u6539");let{id:f,...m}=h;p[u]={...p[u],...m};for(let g of["name","contextWindow","maxTokens","input"])h[g]===void 0&&delete p[u][g]}else{if(u!==void 0)throw new Error("\u6A21\u578B\u4E0D\u5B58\u5728");l.push(h)}}else{let h=l.findIndex(u=>u.id===t.id);if(h>=0)l.splice(h,1);else if(Object.hasOwn(p,t.id))delete p[t.id];else throw new Error("\u53EA\u80FD\u79FB\u9664\u81EA\u5B9A\u4E49\u6A21\u578B\u6216\u6062\u590D\u5DF2\u4FEE\u6539\u7684\u5185\u7F6E\u6A21\u578B")}l.length?a.models=l:delete a.models,Object.keys(p).length?a.modelOverrides=p:delete a.modelOverrides,Object.keys(a).length?n.providers[e]=a:delete n.providers[e],await as(r,n,s)}function Fr(r){return/^(?:npm:|git:|https?:\/\/|ssh:\/\/|git@)/i.test(r.trim())}import{randomBytes as Br,createHash as cs}from"node:crypto";import{fileURLToPath as ls}from"node:url";var Be="pi-webapp@0.1.24+3298bbb5efd1dad75bf6",K="3298bbb5efd1dad75bf6";var ds="https://070c0b7c5ac18d940c294e63ecfa0793@o4506663318716416.ingest.us.sentry.io/4512191040716800";function ps(r=process.env,e=console.warn){let t=i=>{let n={enabled:!1,environment:r.PI_WEB_SENTRY_ENVIRONMENT||"production",release:Be,buildId:K},s=r[`PI_WEB_SENTRY_${i}_DSN`]??r.PI_WEB_SENTRY_DSN??ds;if(r.PI_WEB_SENTRY_ENABLED==="false"||!s)return n;try{let a=new URL(s);if(a.protocol!=="https:"||!/^[\w-]+$/.test(a.username)||a.password||a.search||a.hash||!/\/(?:[\w-]+\/)*\d+$/.test(a.pathname))throw new Error;return{...n,enabled:!0,dsn:s}}catch{return e(`pi-webapp: invalid ${i.toLowerCase()} Sentry DSN; error reporting disabled for this side.`),n}};return{browser:t("BROWSER"),node:t("NODE")}}var Z=class{config;ready;reporter;client;salt=Br(16);breadcrumbs=new Ee;seen=new WeakSet;early=[];state={nodeVersion:process.version,platform:process.platform};fatal;closed=!1;failed=!1;get enabled(){return this.config.node.enabled&&!this.closed&&!this.failed}constructor(e={}){if(this.config=ps(e.env),!this.config.node.enabled){this.ready=Promise.resolve();return}if(e.monitor!==!1){let t=ls(import.meta.url).replace(/\\/g,"/"),i=t.lastIndexOf("/src/"),n=i>=0?t.slice(0,i+5):t.slice(0,t.lastIndexOf("/")+1);this.fatal=s=>{s.stack?.replace(/\\/g,"/").includes(t.endsWith("extension.js")?t:n)&&this.capture(s,{stage:"fatal"})},process.on("uncaughtExceptionMonitor",this.fatal)}this.ready=import("@sentry/node").then(t=>{if(!this.closed){this.client=new t.NodeClient({...this.config.node,dist:K,integrations:[],transport:e.transport??(i=>or(t.createTransport,i)),stackParser:t.defaultStackParser,beforeSend:sr,sendClientReports:!1,dataCollection:{...rr,httpBodies:[]},includeServerName:!1,enableRuntimeChannelInjection:!1,beforeSendLog:()=>null,beforeSendMetric:()=>null,enableOpenTelemetrySetup:!1,maxBreadcrumbs:100}),this.reporter=new Me(this.client,"node",K,t,this.breadcrumbs),this.reporter.setState(this.state);for(let i of this.early)this.reporter.capture(i.error,i.context,i.eventId)}}).catch(()=>{this.failed=!0,console.warn("pi-webapp: Sentry initialization failed; error reporting disabled.")}).finally(()=>{this.early=[]})}capture(e,t={}){try{if(!this.enabled||re(e))return;if(typeof e=="object"&&e!==null){if(this.seen.has(e))return;this.seen.add(e)}if(this.reporter)return this.reporter.capture(e,t);if(this.early.length>=20)return;let i=Br(16).toString("hex");return this.early.push({error:ue(e),context:q(t),eventId:i}),i}catch{return}}setState(e){this.state=q({...this.state,...e}),this.reporter?.setState(this.state)}breadcrumb(e,t={}){this.enabled&&this.breadcrumbs.add(e,t)}session(e){return cs("sha256").update(this.salt).update(e).digest("hex").slice(0,16)}async flush(e=3e3){await this.ready;try{return this.enabled&&!!await this.client?.flush(e)}catch{return!1}}async close(){let e=performance.now(),t;try{await Promise.race([this.ready,new Promise(i=>{t=setTimeout(i,500)})])}finally{clearTimeout(t),this.closed=!0,this.fatal&&process.off("uncaughtExceptionMonitor",this.fatal)}try{await this.client?.close(Math.max(1,500-(performance.now()-e)))}catch{}}};import{VERSION as bs}from"@earendil-works/pi-coding-agent";import{readFile as us}from"node:fs/promises";import{join as fs}from"node:path";async function $r(r){try{let e=JSON.parse(await us(fs(r,".vite/manifest.json"),"utf8"));if(!e||typeof e!="object")return{};let t=new Set;for(let n of Object.values(e))if(!(!n||typeof n!="object"))for(let s of[n.file,...Array.isArray(n.css)?n.css:[],...Array.isArray(n.assets)?n.assets:[]])typeof s=="string"&&/^assets\/[\w.-]+\.(?:js|css|woff2?|ttf|png|jpe?g|svg|webp)$/.test(s)&&t.add(s);let i={js:"text/javascript; charset=utf-8",css:"text/css; charset=utf-8",svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",webp:"image/webp",woff:"font/woff",woff2:"font/woff2",ttf:"font/ttf"};return Object.fromEntries([...t].map(n=>[`/${n}`,{path:n,type:i[n.split(".").pop()]}]))}catch{return{}}}var vs={"/":{path:"index.html",type:"text/html; charset=utf-8"},"/assets/app.js":{path:"assets/app.js",type:"text/javascript; charset=utf-8"},"/assets/style.css":{path:"assets/style.css",type:"text/css; charset=utf-8"}};function y(r,e,t){typeof t=="object"&&t!==null&&"error"in t&&(t={errorCode:e>=500?"server_error":"validation_error",...t,requestId:r.getHeader("X-Request-ID"),operationId:r.getHeader("X-Operation-ID")}),r.writeHead(e,{"Content-Type":"application/json; charset=utf-8","Cache-Control":"no-store"}),r.end(JSON.stringify(t))}function ks(r,e){let t=r.headers.authorization;if(typeof t!="string"||!t.startsWith("Bearer "))return!1;let i=Buffer.from(t.slice(7),"utf8");return i.length===e.length&&ms(i,e)}async function Es(r){let e=0,t=[];for await(let i of r){let n=Buffer.isBuffer(i)?i:Buffer.from(i);if(e+=n.length,e>64*1024)throw new Error("\u8BF7\u6C42\u5185\u5BB9\u8FC7\u5927");t.push(n)}return JSON.parse(Buffer.concat(t).toString("utf8"))}async function Ps(r){let e=0,t=[];for await(let i of r){let n=Buffer.isBuffer(i)?i:Buffer.from(i);if(e+=n.length,e>Oe)throw new Error("\u6587\u4EF6\u8D85\u8FC7 20 MB");t.push(n)}return Buffer.concat(t)}async function Ss(r,e=0){await new Promise((i,n)=>{r.once("error",n),r.listen(e,"127.0.0.1",()=>{r.off("error",n),i()})});let t=r.address();if(t===null||typeof t=="string")throw new Error("\u65E0\u6CD5\u786E\u5B9A\u76D1\u542C\u7AEF\u53E3");return t.port}async function Lr(r,e,t=new Z,i={}){t.setState({piVersion:bs});let n=process.env.PI_WEBAPP_RESTART_TOKEN,s=n&&/^[A-Za-z0-9_-]{32}$/.test(n)?n:jr(24).toString("base64url"),a=Buffer.from(s),l=Pr(),p=new Set,h=new We(i.pluginSettingsFile??ut(ys(),"pi-web","plugins.json"));try{await h.load()}catch(b){throw await t.close(),b}let u=new Ne(gr(),h),c=async()=>await r.plugins?.()??{plugins:[],errors:[]},f=()=>({type:"plugin_state",disabled:u.plugins.filter(b=>!h.enabled(b.metadata.id)).map(b=>b.metadata.id)}),m=()=>{for(let b of p)b.write(`${JSON.stringify(f())}
29
- `)},g=new Map,E=new Fe((b,w)=>t.capture(b,w)),x=b=>t.setState({nodeVersion:process.version,platform:process.platform,session:t.session(b.sessionId),idle:b.idle,model:b.model,thinkingLevel:b.thinkingLevel,messageCount:b.messages.length}),I="",J=!1,Q={...vs,...await $r(e)};for(let b of await hs(ut(e,"assets")).catch(()=>[])){let w=/^[\w.-]+\.(js|css|woff2?|ttf)$/.exec(b);if(!w)continue;let U={js:"text/javascript; charset=utf-8",css:"text/css; charset=utf-8",woff:"font/woff",woff2:"font/woff2",ttf:"font/ttf"};Q[`/assets/${b}`]={path:`assets/${b}`,type:U[w[1]]}}let ce=ws(async(b,w)=>{let U=jr(18).toString("base64"),le=j=>typeof j=="string"&&/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(j),we=le(b.headers["x-request-id"])?b.headers["x-request-id"]:pt(),B={requestId:we,operationId:le(b.headers["x-operation-id"])?b.headers["x-operation-id"]:void 0};w.setHeader("X-Request-ID",we),B.operationId&&w.setHeader("X-Operation-ID",B.operationId);let k="/",Pi=performance.now(),$=(j,d,v)=>{let C=!re(j)&&ir(k)?Y(j,"Agent or provider operation failed"):j,A=t.capture(C,{...B,route:k,method:b.method,status:d,stage:"http"});y(w,d,{error:v,errorId:A,errorReported:t.enabled,errorCode:re(j)?"validation_error":"unexpected_error"})};w.once("finish",()=>{k.startsWith("/api/telemetry/")||t.breadcrumb("request",{...B,route:k,method:b.method,status:w.statusCode,durationMs:Math.round(performance.now()-Pi)})});try{w.setHeader("X-Content-Type-Options","nosniff"),w.setHeader("Referrer-Policy","no-referrer"),w.setHeader("Content-Security-Policy",`default-src 'self'; script-src 'self'; style-src 'self' 'nonce-${U}'; style-src-attr 'unsafe-inline'; font-src 'self' data:; connect-src 'self'${t.config.browser.dsn?` ${new URL(t.config.browser.dsn).origin}`:""}; img-src 'self' data: blob:; object-src 'none'; base-uri 'none'; frame-ancestors 'none'`);try{k=new URL(b.url??"/",I).pathname}catch{y(w,400,{error:"\u8BF7\u6C42\u5730\u5740\u65E0\u6548"});return}let j=Q[k];if(b.method==="GET"&&j){try{let d=await gs(ut(e,j.path));w.writeHead(200,{"Content-Type":j.type,"Cache-Control":"no-store"}),w.end(k==="/"?d.toString("utf8").replace("<head>",`<head><meta name="pi-style-nonce" content="${U}">`):d)}catch(d){$(d,500,"\u9875\u9762\u6587\u4EF6\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k.startsWith("/plugins/")){try{let d=await r.pluginAsset?.(b.url??k);if(!d){y(w,404,{error:"\u63D2\u4EF6\u8D44\u6E90\u4E0D\u5B58\u5728"});return}w.writeHead(200,{"Content-Type":d.type,"Cache-Control":"no-store"}),w.end(d.bytes)}catch(d){$(d,404,"\u63D2\u4EF6\u8D44\u6E90\u4E0D\u53EF\u7528")}return}if(!k.startsWith("/api/")){y(w,404,{error:"\u672A\u627E\u5230"});return}if(!ks(b,a)){y(w,401,{error:"\u8BBF\u95EE\u4EE4\u724C\u65E0\u6548"});return}if(b.method==="GET"&&k==="/api/telemetry/config"){y(w,200,t.config.browser);return}if(b.method==="GET"&&k==="/api/update/version"){try{y(w,200,{current:await r.selfUpdate?.runningVersion()??null})}catch(d){$(d,503,d instanceof Error?d.message:"\u65E0\u6CD5\u8BFB\u53D6\u7248\u672C")}return}if(b.method==="GET"&&k==="/api/update"){try{y(w,200,await r.selfUpdate?.check()??{canRestart:!1,reason:"\u5F53\u524D\u6269\u5C55\u4E0D\u652F\u6301\u5728\u7EBF\u5347\u7EA7"})}catch(d){$(d,503,d instanceof Error?d.message:"\u68C0\u67E5\u66F4\u65B0\u5931\u8D25")}return}if(b.method==="GET"&&k==="/api/image"){let d=new URL(b.url??k,I),v=d.searchParams.get("sessionId")??"",_=d.searchParams.get("messageId")??"",C=Number(d.searchParams.get("index"));if(!v||v!==r.snapshot().sessionId||!_||!Number.isInteger(C)||C<0||C>100){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362\u6216\u56FE\u7247\u5730\u5740\u65E0\u6548"});return}let A=r.image?.(v,_,C);if(!A||!["image/png","image/jpeg","image/webp","image/gif"].includes(A.mimeType)){y(w,404,{error:"\u56FE\u7247\u4E0D\u53EF\u7528"});return}w.writeHead(200,{"Content-Type":A.mimeType,"Cache-Control":"private, no-store"}),w.end(A.data);return}if(b.method==="POST"&&k==="/api/attachment"){if(b.headers.origin!==void 0&&b.headers.origin!==I){y(w,403,{error:"\u6765\u6E90\u4E0D\u5339\u914D"});return}let d=new URL(b.url??k,I),v=d.searchParams.get("sessionId"),_=d.searchParams.get("name");try{if(!v||!_||_.length>1024||v!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362\u6216\u6587\u4EF6\u540D\u65E0\u6548"});return}if(Number(b.headers["content-length"]??0)>Oe){y(w,413,{error:"\u6587\u4EF6\u8D85\u8FC7 20 MB"});return}let C=await Cr(v,_,b.headers["content-type"]??"application/octet-stream",await Ps(b));if(v!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}g.set(C.id,C),y(w,201,{id:C.id,name:C.name,bytes:C.bytes})}catch(C){$(C,400,C instanceof Error?C.message:"\u4E0A\u4F20\u5931\u8D25")}return}if(b.method==="GET"&&k==="/api/session"){try{let d=r.snapshot();x(d),y(w,200,d)}catch(d){$(d,503,"\u5F53\u524D\u4F1A\u8BDD\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k==="/api/plugin-management"){try{y(w,200,u.inventory(await c()))}catch(d){$(d,503,"\u63D2\u4EF6\u76EE\u5F55\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k==="/api/plugins"){try{y(w,200,u.catalog(await c()))}catch(d){$(d,503,"\u63D2\u4EF6\u76EE\u5F55\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k==="/api/providers"){try{y(w,200,await r.providers?.()??[])}catch(d){$(d,503,"\u6A21\u578B\u63D0\u4F9B\u65B9\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k==="/api/provider/models"){let d=new URL(b.url??k,I).searchParams.get("providerId")??"";try{if(!d||!r.providerModels){y(w,400,{error:"\u63D0\u4F9B\u65B9\u65E0\u6548"});return}y(w,200,await r.providerModels(d))}catch(v){$(v,400,v instanceof Error?v.message:"\u6A21\u578B\u76EE\u5F55\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k==="/api/provider/login/active"){y(w,200,{active:E.getActive()??null});return}if(b.method==="GET"&&k==="/api/provider/login"){let d=new URL(b.url??k,I).searchParams.get("id")??"",v=E.get(d);y(w,v?200:404,v??{error:"\u767B\u5F55\u6D41\u7A0B\u4E0D\u5B58\u5728"});return}if(b.method==="GET"&&(k==="/api/models"||k==="/api/config"||k==="/api/workspaces"||k==="/api/commands")){try{y(w,200,k==="/api/models"?await r.models():k==="/api/config"?await r.config():k==="/api/commands"?r.commands?.()??[]:await r.workspaces())}catch(d){$(d,503,"Pi \u914D\u7F6E\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k==="/api/directory/capability"){y(w,200,{kind:l});return}if(b.method==="GET"&&k==="/api/events"){let d;try{d=r.snapshot(),x(d)}catch(v){$(v,503,"\u5F53\u524D\u4F1A\u8BDD\u4E0D\u53EF\u7528");return}w.writeHead(200,{"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"no-store",Connection:"keep-alive","X-Accel-Buffering":"no"}),p.add(w),w.write(`${JSON.stringify({type:"snapshot",session:d})}
30
- `),w.on("close",()=>p.delete(w));return}if(b.method==="POST"&&[...u.routes,"/api/plugin-management","/api/plugin-interaction","/api/plugin-action","/api/update","/api/message","/api/attachment/remove","/api/abort","/api/resume","/api/compact","/api/new-session","/api/model","/api/thinking-level","/api/config","/api/provider/login","/api/provider/login/respond","/api/provider/login/cancel","/api/provider/custom","/api/provider/models","/api/provider/logout","/api/workspace/add","/api/workspace/select","/api/workspace/new-session","/api/workspace/remove","/api/session/select","/api/directory/list","/api/directory/create","/api/directory/pick"].includes(k)){if(b.headers.origin!==void 0&&b.headers.origin!==I){y(w,403,{error:"\u6765\u6E90\u4E0D\u5339\u914D"});return}if(!b.headers["content-type"]?.startsWith("application/json")){y(w,415,{error:"\u9700\u8981 JSON \u8BF7\u6C42"});return}try{let d;try{d=await Es(b)}catch(v){if(v instanceof SyntaxError||re(v)){y(w,400,{error:"\u8BF7\u6C42\u5185\u5BB9\u65E0\u6548"});return}throw v}if(typeof d!="object"||d===null||!("sessionId"in d)||typeof d.sessionId!="string"){y(w,400,{error:"\u7F3A\u5C11\u4F1A\u8BDD\u6807\u8BC6"});return}if(k==="/api/plugin-management"){let v=d;if(typeof v.id!="string"||v.id.length>200||typeof v.enabled!="boolean"||typeof v.expected!="string"){y(w,400,{error:"\u63D2\u4EF6\u5F00\u5173\u53C2\u6570\u65E0\u6548"});return}let _=()=>{if(r.snapshot().sessionId!==d.sessionId)throw new N("\u4F1A\u8BDD\u5DF2\u5207\u6362");if(!r.snapshot().idle||(r.busyGitWorkspaces?.()??[]).length)throw new N("\u8BF7\u7B49\u5F85\u6240\u6709\u804A\u5929\u7A7A\u95F2\u540E\u4FEE\u6539\u5168\u5C40\u63D2\u4EF6\u5F00\u5173")};try{await u.toggle(v.id,v.enabled,v.expected,_),y(w,200,u.inventory(await c()))}catch(C){if(C instanceof N)y(w,C.status,{error:C.message});else throw C}finally{m()}return}if(u.mutating&&k!=="/api/abort"){y(w,409,{error:"\u63D2\u4EF6\u914D\u7F6E\u6B63\u5728\u4FDD\u5B58\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5"});return}if(await u.dispatch({path:k,body:d,res:w,snapshot:()=>r.snapshot(),busyWorkspaces:()=>r.busyGitWorkspaces?.()??[],json:(v,_)=>y(w,v,_)}))return;if(k==="/api/plugin-interaction"){if(d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("pluginId"in d)||typeof d.pluginId!="string"||d.pluginId.length>200||!("requestId"in d)||typeof d.requestId!="string"||d.requestId.length>200||!r.resolvePluginInteraction||!("value"in d)){y(w,400,{error:"\u63D2\u4EF6\u4EA4\u4E92\u54CD\u5E94\u65E0\u6548"});return}await u.coordinateStart(r.snapshot().cwd,async()=>r.resolvePluginInteraction(d.sessionId,d.pluginId,d.requestId,d.value)),y(w,200,{accepted:!0});return}if(k==="/api/plugin-action"){if(d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("pluginId"in d)||typeof d.pluginId!="string"||d.pluginId.length>200||!("action"in d)||typeof d.action!="string"||d.action.length>100){y(w,400,{error:"\u63D2\u4EF6\u52A8\u4F5C\u65E0\u6548"});return}if(u.plugins.some(C=>C.metadata.id===d.pluginId)){let C=u.actionRoute(d.pluginId,d.action);if(!C){y(w,400,{error:"\u63D2\u4EF6\u52A8\u4F5C\u4E0D\u5B58\u5728"});return}let A="input"in d?d.input:{};if(!A||typeof A!="object"||Array.isArray(A)){y(w,400,{error:"\u63D2\u4EF6\u52A8\u4F5C\u53C2\u6570\u65E0\u6548"});return}await u.dispatch({path:C,body:{...A,sessionId:d.sessionId},res:w,snapshot:()=>r.snapshot(),busyWorkspaces:()=>r.busyGitWorkspaces?.()??[],json:(ye,R)=>y(w,ye,ye>=200&&ye<300?{value:R}:R)});return}if(!r.invokePluginAction){y(w,400,{error:"\u63D2\u4EF6\u52A8\u4F5C\u4E0D\u53EF\u7528"});return}let _=await u.coordinateStart(r.snapshot().cwd,async()=>r.invokePluginAction(d.sessionId,d.pluginId,d.action,"input"in d?d.input:void 0));y(w,200,{value:_});return}if(k==="/api/update"){if(d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!r.snapshot().idle){y(w,409,{error:"\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u540E\u518D\u5347\u7EA7"});return}if(!r.selfUpdate){y(w,409,{error:"\u5F53\u524D\u6269\u5C55\u4E0D\u652F\u6301\u5728\u7EBF\u5347\u7EA7"});return}let v=await r.selfUpdate.prepare();J=!0,y(w,202,{accepted:!0,version:v.version}),setTimeout(()=>{r.selfUpdate?.requestRestart(v).catch(_=>{J=!1,t.capture(_,{stage:"restart"}),console.error("pi-webapp restart:",_)})},500).unref();return}if(k==="/api/provider/custom"){if(d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("provider"in d)||!dt(d.provider)||!r.addCustomProvider){y(w,400,{error:"\u81EA\u5B9A\u4E49\u63D0\u4F9B\u65B9\u65E0\u6548"});return}await r.addCustomProvider(d.sessionId,d.provider),y(w,201,{accepted:!0});return}if(k==="/api/provider/models"||k==="/api/provider/logout"){if(d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("providerId"in d)||typeof d.providerId!="string"){y(w,400,{error:"\u63D0\u4F9B\u65B9\u65E0\u6548"});return}if(k==="/api/provider/models"){if(!("change"in d)||!Rr(d.change)||!r.updateProviderModel){y(w,400,{error:"\u6A21\u578B\u53C2\u6570\u65E0\u6548"});return}await r.updateProviderModel(d.sessionId,d.providerId,d.change)}else{if(!r.logoutProvider){y(w,400,{error:"\u65E0\u6CD5\u79FB\u9664\u8BA4\u8BC1"});return}await r.logoutProvider(d.sessionId,d.providerId)}y(w,200,{accepted:!0});return}if(k.startsWith("/api/provider/login")){if(d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(k==="/api/provider/login"){if(!("providerId"in d)||typeof d.providerId!="string"||!("method"in d)||d.method!=="api_key"&&d.method!=="oauth"||!r.loginProvider||!r.providers){y(w,400,{error:"\u767B\u5F55\u65B9\u5F0F\u65E0\u6548"});return}if(!(await r.providers()).some(A=>A.id===d.providerId&&A.methods.includes(d.method))){y(w,400,{error:"\u63D0\u4F9B\u65B9\u4E0D\u652F\u6301\u6B64\u767B\u5F55\u65B9\u5F0F"});return}let _="initialSecret"in d?d.initialSecret:void 0;if(_!==void 0&&(d.method!=="api_key"||typeof _!="string"||!_.trim()||_.length>16384)){y(w,400,{error:"API Key \u65E0\u6548"});return}let C=E.start(d.providerId,d.method,r.loginProvider,_,B);y(w,202,{id:C.id});return}if(!("id"in d)||typeof d.id!="string"){y(w,400,{error:"\u767B\u5F55\u6D41\u7A0B\u65E0\u6548"});return}if(k==="/api/provider/login/cancel"){y(w,E.cancel(d.id)?202:404,{accepted:!0});return}if(!("value"in d)||typeof d.value!="string"||d.value.length>16384||!E.respond(d.id,d.value)){y(w,400,{error:"\u767B\u5F55\u8F93\u5165\u65E0\u6548"});return}y(w,202,{accepted:!0});return}if(k==="/api/attachment/remove"){if(!("id"in d)||typeof d.id!="string"||d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362\u6216\u9644\u4EF6\u65E0\u6548"});return}g.get(d.id)?.sessionId===d.sessionId&&g.delete(d.id),y(w,202,{accepted:!0});return}if(k==="/api/directory/pick"){if(l!=="native"){y(w,409,{error:"\u672C\u5730\u76EE\u5F55\u9009\u62E9\u5668\u4E0D\u53EF\u7528"});return}let v=new AbortController;w.once("close",()=>v.abort()),y(w,200,{path:await Sr(v.signal)});return}if(k==="/api/directory/list"){if("path"in d&&(typeof d.path!="string"||d.path.length>4096)){y(w,400,{error:"\u76EE\u5F55\u8DEF\u5F84\u65E0\u6548"});return}y(w,200,await kr("path"in d?d.path:void 0));return}if(k==="/api/directory/create"){if(!("path"in d)||typeof d.path!="string"||d.path.length>4096||!("name"in d)||typeof d.name!="string"||d.name.length>255){y(w,400,{error:"\u6587\u4EF6\u5939\u540D\u79F0\u6216\u8DEF\u5F84\u65E0\u6548"});return}y(w,200,{path:await Er(d.path,d.name)});return}if(k==="/api/workspace/add"){if(!("path"in d)||typeof d.path!="string"||d.path.length>4096||!("create"in d)||typeof d.create!="boolean"){y(w,400,{error:"\u5DE5\u4F5C\u533A\u8DEF\u5F84\u65E0\u6548"});return}await r.addWorkspace(d.path,d.create),y(w,202,{accepted:!0});return}if(k==="/api/workspace/select"||k==="/api/workspace/remove"||k==="/api/workspace/new-session"){if(!("id"in d)||typeof d.id!="string"){y(w,400,{error:"\u5DE5\u4F5C\u533A\u65E0\u6548"});return}k==="/api/workspace/select"?await r.selectWorkspace(d.id):k==="/api/workspace/new-session"?await r.newSessionInWorkspace(d.id):await r.removeWorkspace(d.id),y(w,202,{accepted:!0});return}if(k==="/api/session/select"){if(!("workspaceId"in d)||typeof d.workspaceId!="string"||!("id"in d)||typeof d.id!="string"||!("path"in d)||typeof d.path!="string"){y(w,400,{error:"\u4F1A\u8BDD\u65E0\u6548"});return}await r.selectSession(d.workspaceId,d.id,d.path),y(w,202,{accepted:!0});return}if(k==="/api/thinking-level"){if(!("level"in d)||typeof d.level!="string"){y(w,400,{error:"\u63A8\u7406\u5F3A\u5EA6\u65E0\u6548"});return}await r.setThinkingLevel(d.sessionId,d.level)}else if(k==="/api/model"){if(!("provider"in d)||typeof d.provider!="string"||!("id"in d)||typeof d.id!="string"){y(w,400,{error:"\u6A21\u578B\u65E0\u6548"});return}await r.setModel(d.sessionId,d.provider,d.id)}else if(k==="/api/config"){let v=d;if(!["packages","extensions","skills"].includes(v.kind)||!["global","project"].includes(v.scope)||!["add","remove"].includes(v.action)||typeof v.value!="string"||!v.value.trim()||v.value.length>2048){y(w,400,{error:"\u914D\u7F6E\u9879\u65E0\u6548"});return}if(v.action==="add"&&v.kind!=="packages"&&Fr(v.value)){y(w,400,{error:"npm \u6216 Git \u6765\u6E90\u8BF7\u5728\u300C\u5305\u300D\u4E2D\u6DFB\u52A0\uFF1B\u6269\u5C55\u548C\u6280\u80FD\u53EA\u63A5\u53D7\u6587\u4EF6\u6216\u76EE\u5F55\u8DEF\u5F84"});return}y(w,200,await r.updateConfig(v));return}else if(k==="/api/message"){let v="attachments"in d?d.attachments:[];if(!Array.isArray(v)||v.length>Ir||v.some(R=>typeof R!="string")||new Set(v).size!==v.length){y(w,400,{error:"\u9644\u4EF6\u65E0\u6548\u6216\u8FC7\u591A"});return}let _=v.map(R=>g.get(R));if(_.some(R=>!R||R.sessionId!==d.sessionId)){y(w,400,{error:"\u9644\u4EF6\u4E0D\u53EF\u7528"});return}if(!("text"in d)||typeof d.text!="string"||!d.text.trim()&&v.length===0||d.text.length>32e3){y(w,400,{error:"\u6D88\u606F\u65E0\u6548\u6216\u8FC7\u957F"});return}let C=_,A=[d.text.trim(),...C.map(R=>`\u9644\u4EF6 ${JSON.stringify(R.name)}\uFF1A${R.path}`)].filter(Boolean).join(`
26
+ `)}`);let c=this.reportError(u,{...s,stage:"provider_login"});p.view={id:l,providerId:e,method:t,status:"error",error:"\u767B\u5F55\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u63D0\u4F9B\u65B9\u63D0\u793A\u5E76\u91CD\u8BD5\u3002",errorId:c}}}),{...p.view}}get(e){let t=this.flows.get(e)?.view;return t?{...t}:void 0}getActive(){let e=[...this.flows.values()].find(({view:t})=>t.status==="running"||t.status==="waiting")?.view;return e?{...e}:void 0}respond(e,t){let i=this.flows.get(e);if(!i?.answer||i.view.status!=="waiting"||i.view.prompt?.type==="select"&&!i.view.prompt.options.some(s=>s.id===t))return!1;let n=i.answer;return i.answer=void 0,i.reject=void 0,i.view={...i.view,status:"running",prompt:void 0},n(t),!0}cancel(e){let t=this.flows.get(e);return!t||t.view.status==="done"||t.view.status==="error"?!1:(t.view={...t.view,status:"cancelled",prompt:void 0},t.controller.abort(),t.reject?.(new Error("\u767B\u5F55\u5DF2\u53D6\u6D88")),t.answer=void 0,t.reject=void 0,!0)}close(){for(let e of this.flows.keys())this.cancel(e);this.flows.clear()}};import{randomBytes as ts}from"node:crypto";import{readFile as rs,rename as is,rm as ns,stat as ss,writeFile as os,mkdir as as}from"node:fs/promises";import{dirname as cs}from"node:path";var ls=["openai-completions","openai-responses","anthropic-messages"];function pt(r){if(!r||typeof r!="object")return!1;let e=r;if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id)||typeof e.name!="string"||!e.name.trim()||e.name.length>100||typeof e.modelId!="string"||!e.modelId.trim()||e.modelId.length>200||!ls.includes(e.api)||typeof e.baseUrl!="string"||e.baseUrl.length>2048)return!1;try{let t=new URL(e.baseUrl);return(t.protocol==="https:"||t.protocol==="http:")&&!!t.hostname&&!t.username&&!t.password&&!t.hash}catch{return!1}}async function Or(r,e){if(!pt(e))throw new Error("\u81EA\u5B9A\u4E49\u63D0\u4F9B\u65B9\u540D\u79F0\u3001\u5730\u5740\u6216\u6A21\u578B\u65E0\u6548");let t;try{t=await rs(r,"utf8")}catch(l){if(l.code!=="ENOENT")throw l}let i;if(t===void 0)i={providers:{}};else{try{i=JSON.parse(t)}catch{throw new Error("models.json \u542B\u6CE8\u91CA\u6216\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u624B\u52A8\u6DFB\u52A0\u63D0\u4F9B\u65B9")}if(!i||typeof i!="object"||!i.providers||typeof i.providers!="object"||Array.isArray(i.providers))throw new Error("models.json \u7ED3\u6784\u65E0\u6548")}if(Object.hasOwn(i.providers,e.id))throw new Error("\u63D0\u4F9B\u65B9\u5DF2\u5B58\u5728");let n={...i,providers:{...i.providers,[e.id]:{name:e.name.trim(),baseUrl:e.baseUrl,api:e.api,models:[{id:e.modelId.trim()}]}}};await as(cs(r),{recursive:!0});let s=t===void 0?384:(await ss(r)).mode&511,a=`${r}.pi-web-${ts(6).toString("hex")}.tmp`;try{await os(a,`${JSON.stringify(n,null,2)}
27
+ `,{mode:s,flag:"wx"}),await is(a,r)}finally{await ns(a,{force:!0})}}import{randomBytes as ds}from"node:crypto";import{mkdir as ps,readFile as us,rename as fs,rm as ms,stat as gs,writeFile as hs}from"node:fs/promises";import{dirname as ws}from"node:path";function Fr(r){if(!r||r.length>2048)return!1;try{let e=new URL(r);return(e.protocol==="https:"||e.protocol==="http:")&&!!e.hostname&&!e.username&&!e.password&&!e.search&&!e.hash}catch{return!1}}function Br(r){if(!r||typeof r!="object")return!1;let e=r;return e.action==="save"?(e.originalId===void 0||typeof e.originalId=="string")&&$r(e.model):e.action==="base_url"?e.baseUrl===null||typeof e.baseUrl=="string"&&Fr(e.baseUrl):e.action==="remove"&&typeof e.id=="string"&&e.id.length>0&&e.id.length<=200}function $r(r){if(!r||typeof r!="object")return!1;let e=r;if(typeof e.id!="string"||!e.id.trim()||e.id.length>200||e.name!==void 0&&(typeof e.name!="string"||!e.name.trim()||e.name.length>200))return!1;for(let t of[e.contextWindow,e.maxTokens])if(t!==void 0&&(!Number.isSafeInteger(t)||t<=0))return!1;return e.input===void 0||Array.isArray(e.input)&&e.input.length>0&&e.input.every(t=>t==="text"||t==="image")&&new Set(e.input).size===e.input.length}async function jr(r){let e;try{e=await us(r,"utf8")}catch(i){if(i.code!=="ENOENT")throw i}if(e===void 0)return{config:{providers:{}}};let t;try{t=JSON.parse(e)}catch{throw new Error("models.json \u542B\u6CE8\u91CA\u6216\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u624B\u52A8\u4FEE\u6539")}if(!t||typeof t!="object"||!t.providers||typeof t.providers!="object"||Array.isArray(t.providers))throw new Error("models.json \u7ED3\u6784\u65E0\u6548");return{config:t,existing:e}}async function ys(r,e,t){await ps(ws(r),{recursive:!0});let i=t===void 0?384:(await gs(r)).mode&511,n=`${r}.pi-web-${ds(6).toString("hex")}.tmp`;try{await hs(n,`${JSON.stringify(e,null,2)}
28
+ `,{mode:i,flag:"wx"}),await fs(n,r)}finally{await ms(n,{force:!0})}}async function Lr(r,e,t){if(!t.getProvider(e))throw new Error("\u63D0\u4F9B\u65B9\u4E0D\u5B58\u5728");let{config:i}=await jr(r),n=i.providers[e],s=new Set(n?.models?.map(a=>a.id)??[]);return{providerId:e,baseUrl:n?.baseUrl,models:t.getModels(e).map(a=>({id:a.id,name:a.name,contextWindow:a.contextWindow,maxTokens:a.maxTokens,input:[...a.input],source:s.has(a.id)?"custom":"builtin",overridden:!!n?.modelOverrides?.[a.id]}))}}async function Gr(r,e,t,i){if(!i.getProvider(e))throw new Error("\u63D0\u4F9B\u65B9\u4E0D\u5B58\u5728");let{config:n,existing:s}=await jr(r),a={...n.providers[e]??{}},l=[...a.models??[]],p={...a.modelOverrides??{}};if(t.action==="base_url"){if(t.baseUrl!==null&&!Fr(t.baseUrl))throw new Error("API \u5730\u5740\u65E0\u6548");t.baseUrl===null?delete a.baseUrl:a.baseUrl=t.baseUrl}else if(t.action==="save"){if(!$r(t.model))throw new Error("\u6A21\u578B\u53C2\u6570\u65E0\u6548");let g={id:t.model.id.trim(),...t.model.name===void 0?{}:{name:t.model.name},...t.model.contextWindow===void 0?{}:{contextWindow:t.model.contextWindow},...t.model.maxTokens===void 0?{}:{maxTokens:t.model.maxTokens},...t.model.input===void 0?{}:{input:t.model.input}},u=t.originalId,c=u===void 0?-1:l.findIndex(f=>f.id===u);if(u===void 0&&(l.some(f=>f.id===g.id)||i.getModel(e,g.id)))throw new Error("\u6A21\u578B ID \u5DF2\u5B58\u5728");if(c>=0){if(g.id!==u&&(l.some(m=>m.id===g.id)||i.getModel(e,g.id)))throw new Error("\u6A21\u578B ID \u5DF2\u5B58\u5728");let f={...l[c],...g};for(let m of["name","contextWindow","maxTokens","input"])g[m]===void 0&&delete f[m];l[c]=f}else if(u!==void 0&&i.getModel(e,u)){if(g.id!==u)throw new Error("\u5185\u7F6E\u6A21\u578B ID \u4E0D\u53EF\u4FEE\u6539");let{id:f,...m}=g;p[u]={...p[u],...m};for(let h of["name","contextWindow","maxTokens","input"])g[h]===void 0&&delete p[u][h]}else{if(u!==void 0)throw new Error("\u6A21\u578B\u4E0D\u5B58\u5728");l.push(g)}}else{let g=l.findIndex(u=>u.id===t.id);if(g>=0)l.splice(g,1);else if(Object.hasOwn(p,t.id))delete p[t.id];else throw new Error("\u53EA\u80FD\u79FB\u9664\u81EA\u5B9A\u4E49\u6A21\u578B\u6216\u6062\u590D\u5DF2\u4FEE\u6539\u7684\u5185\u7F6E\u6A21\u578B")}l.length?a.models=l:delete a.models,Object.keys(p).length?a.modelOverrides=p:delete a.modelOverrides,Object.keys(a).length?n.providers[e]=a:delete n.providers[e],await ys(r,n,s)}function Vr(r){return/^(?:npm:|git:|https?:\/\/|ssh:\/\/|git@)/i.test(r.trim())}import{randomBytes as Ur,createHash as bs}from"node:crypto";import{fileURLToPath as vs}from"node:url";var $e="pi-webapp@0.1.25+dc4757ff3b1efb1b2215",K="dc4757ff3b1efb1b2215";var ks="https://070c0b7c5ac18d940c294e63ecfa0793@o4506663318716416.ingest.us.sentry.io/4512191040716800";function Es(r=process.env,e=console.warn){let t=i=>{let n={enabled:!1,environment:r.PI_WEB_SENTRY_ENVIRONMENT||"production",release:$e,buildId:K},s=r[`PI_WEB_SENTRY_${i}_DSN`]??r.PI_WEB_SENTRY_DSN??ks;if(r.PI_WEB_SENTRY_ENABLED==="false"||!s)return n;try{let a=new URL(s);if(a.protocol!=="https:"||!/^[\w-]+$/.test(a.username)||a.password||a.search||a.hash||!/\/(?:[\w-]+\/)*\d+$/.test(a.pathname))throw new Error;return{...n,enabled:!0,dsn:s}}catch{return e(`pi-webapp: invalid ${i.toLowerCase()} Sentry DSN; error reporting disabled for this side.`),n}};return{browser:t("BROWSER"),node:t("NODE")}}var Q=class{config;ready;reporter;client;salt=Ur(16);breadcrumbs=new Pe;seen=new WeakSet;early=[];state={nodeVersion:process.version,platform:process.platform};fatal;closed=!1;failed=!1;get enabled(){return this.config.node.enabled&&!this.closed&&!this.failed}constructor(e={}){if(this.config=Es(e.env),!this.config.node.enabled){this.ready=Promise.resolve();return}if(e.monitor!==!1){let t=vs(import.meta.url).replace(/\\/g,"/"),i=t.lastIndexOf("/src/"),n=i>=0?t.slice(0,i+5):t.slice(0,t.lastIndexOf("/")+1);this.fatal=s=>{s.stack?.replace(/\\/g,"/").includes(t.endsWith("extension.js")?t:n)&&this.capture(s,{stage:"fatal"})},process.on("uncaughtExceptionMonitor",this.fatal)}this.ready=import("@sentry/node").then(t=>{if(!this.closed){this.client=new t.NodeClient({...this.config.node,dist:K,integrations:[],transport:e.transport??(i=>ar(t.createTransport,i)),stackParser:t.defaultStackParser,beforeSend:or,sendClientReports:!1,dataCollection:{...ir,httpBodies:[]},includeServerName:!1,enableRuntimeChannelInjection:!1,beforeSendLog:()=>null,beforeSendMetric:()=>null,enableOpenTelemetrySetup:!1,maxBreadcrumbs:100}),this.reporter=new Ae(this.client,"node",K,t,this.breadcrumbs),this.reporter.setState(this.state);for(let i of this.early)this.reporter.capture(i.error,i.context,i.eventId)}}).catch(()=>{this.failed=!0,console.warn("pi-webapp: Sentry initialization failed; error reporting disabled.")}).finally(()=>{this.early=[]})}capture(e,t={}){try{if(!this.enabled||ie(e))return;if(typeof e=="object"&&e!==null){if(this.seen.has(e))return;this.seen.add(e)}if(this.reporter)return this.reporter.capture(e,t);if(this.early.length>=20)return;let i=Ur(16).toString("hex");return this.early.push({error:fe(e),context:q(t),eventId:i}),i}catch{return}}setState(e){this.state=q({...this.state,...e}),this.reporter?.setState(this.state)}breadcrumb(e,t={}){this.enabled&&this.breadcrumbs.add(e,t)}session(e){return bs("sha256").update(this.salt).update(e).digest("hex").slice(0,16)}async flush(e=3e3){await this.ready;try{return this.enabled&&!!await this.client?.flush(e)}catch{return!1}}async close(){let e=performance.now(),t;try{await Promise.race([this.ready,new Promise(i=>{t=setTimeout(i,500)})])}finally{clearTimeout(t),this.closed=!0,this.fatal&&process.off("uncaughtExceptionMonitor",this.fatal)}try{await this.client?.close(Math.max(1,500-(performance.now()-e)))}catch{}}};import{VERSION as Ms}from"@earendil-works/pi-coding-agent";import{readFile as Ps}from"node:fs/promises";import{join as Ss}from"node:path";async function zr(r){try{let e=JSON.parse(await Ps(Ss(r,".vite/manifest.json"),"utf8"));if(!e||typeof e!="object")return{};let t=new Set;for(let n of Object.values(e))if(!(!n||typeof n!="object"))for(let s of[n.file,...Array.isArray(n.css)?n.css:[],...Array.isArray(n.assets)?n.assets:[]])typeof s=="string"&&/^assets\/[\w.-]+\.(?:js|css|woff2?|ttf|png|jpe?g|svg|webp)$/.test(s)&&t.add(s);let i={js:"text/javascript; charset=utf-8",css:"text/css; charset=utf-8",svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",webp:"image/webp",woff:"font/woff",woff2:"font/woff2",ttf:"font/ttf"};return Object.fromEntries([...t].map(n=>[`/${n}`,{path:n,type:i[n.split(".").pop()]}]))}catch{return{}}}var As={"/":{path:"index.html",type:"text/html; charset=utf-8"},"/assets/app.js":{path:"assets/app.js",type:"text/javascript; charset=utf-8"},"/assets/style.css":{path:"assets/style.css",type:"text/css; charset=utf-8"}};function y(r,e,t){typeof t=="object"&&t!==null&&"error"in t&&(t={errorCode:e>=500?"server_error":"validation_error",...t,requestId:r.getHeader("X-Request-ID"),operationId:r.getHeader("X-Operation-ID")}),r.writeHead(e,{"Content-Type":"application/json; charset=utf-8","Cache-Control":"no-store"}),r.end(JSON.stringify(t))}function Rs(r,e){let t=r.headers.authorization;if(typeof t!="string"||!t.startsWith("Bearer "))return!1;let i=Buffer.from(t.slice(7),"utf8");return i.length===e.length&&xs(i,e)}async function Ns(r){let e=0,t=[];for await(let i of r){let n=Buffer.isBuffer(i)?i:Buffer.from(i);if(e+=n.length,e>64*1024)throw new Error("\u8BF7\u6C42\u5185\u5BB9\u8FC7\u5927");t.push(n)}return JSON.parse(Buffer.concat(t).toString("utf8"))}async function Ws(r){let e=0,t=[];for await(let i of r){let n=Buffer.isBuffer(i)?i:Buffer.from(i);if(e+=n.length,e>Fe)throw new Error("\u6587\u4EF6\u8D85\u8FC7 20 MB");t.push(n)}return Buffer.concat(t)}async function Ds(r,e=0){await new Promise((i,n)=>{r.once("error",n),r.listen(e,"127.0.0.1",()=>{r.off("error",n),i()})});let t=r.address();if(t===null||typeof t=="string")throw new Error("\u65E0\u6CD5\u786E\u5B9A\u76D1\u542C\u7AEF\u53E3");return t.port}async function Jr(r,e,t=new Q,i={}){t.setState({piVersion:Ms});let n=process.env.PI_WEBAPP_RESTART_TOKEN,s=n&&/^[A-Za-z0-9_-]{32}$/.test(n)?n:Hr(24).toString("base64url"),a=Buffer.from(s),l=Tr(),p=new Set,g=new We(i.pluginSettingsFile??ft(Ts(),"pi-web","plugins.json"));try{await g.load()}catch(b){throw await t.close(),b}let u=new De(kr(),g),c=async()=>await r.plugins?.()??{plugins:[],errors:[]},f=()=>({type:"plugin_state",disabled:u.plugins.filter(b=>!g.enabled(b.metadata.id)).map(b=>b.metadata.id)}),m=()=>{for(let b of p)b.write(`${JSON.stringify(f())}
29
+ `)},h=new Map,E=new Be((b,w)=>t.capture(b,w)),x=b=>t.setState({nodeVersion:process.version,platform:process.platform,session:t.session(b.sessionId),idle:b.idle,model:b.model,thinkingLevel:b.thinkingLevel,messageCount:b.messages.length}),I="",J=!1,ee={...As,...await zr(e)};for(let b of await Cs(ft(e,"assets")).catch(()=>[])){let w=/^[\w.-]+\.(js|css|woff2?|ttf)$/.exec(b);if(!w)continue;let U={js:"text/javascript; charset=utf-8",css:"text/css; charset=utf-8",woff:"font/woff",woff2:"font/woff2",ttf:"font/ttf"};ee[`/assets/${b}`]={path:`assets/${b}`,type:U[w[1]]}}let le=_s(async(b,w)=>{let U=Hr(18).toString("base64"),de=j=>typeof j=="string"&&/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(j),ye=de(b.headers["x-request-id"])?b.headers["x-request-id"]:ut(),B={requestId:ye,operationId:de(b.headers["x-operation-id"])?b.headers["x-operation-id"]:void 0};w.setHeader("X-Request-ID",ye),B.operationId&&w.setHeader("X-Operation-ID",B.operationId);let k="/",Ti=performance.now(),$=(j,d,v)=>{let C=!ie(j)&&nr(k)?Y(j,"Agent or provider operation failed"):j,A=t.capture(C,{...B,route:k,method:b.method,status:d,stage:"http"});y(w,d,{error:v,errorId:A,errorReported:t.enabled,errorCode:ie(j)?"validation_error":"unexpected_error"})};w.once("finish",()=>{k.startsWith("/api/telemetry/")||t.breadcrumb("request",{...B,route:k,method:b.method,status:w.statusCode,durationMs:Math.round(performance.now()-Ti)})});try{w.setHeader("X-Content-Type-Options","nosniff"),w.setHeader("Referrer-Policy","no-referrer"),w.setHeader("Content-Security-Policy",`default-src 'self'; script-src 'self'; style-src 'self' 'nonce-${U}'; style-src-attr 'unsafe-inline'; font-src 'self' data:; connect-src 'self'${t.config.browser.dsn?` ${new URL(t.config.browser.dsn).origin}`:""}; img-src 'self' data: blob:; object-src 'none'; base-uri 'none'; frame-ancestors 'none'`);try{k=new URL(b.url??"/",I).pathname}catch{y(w,400,{error:"\u8BF7\u6C42\u5730\u5740\u65E0\u6548"});return}let j=ee[k];if(b.method==="GET"&&j){try{let d=await Is(ft(e,j.path));w.writeHead(200,{"Content-Type":j.type,"Cache-Control":"no-store"}),w.end(k==="/"?d.toString("utf8").replace("<head>",`<head><meta name="pi-style-nonce" content="${U}">`):d)}catch(d){$(d,500,"\u9875\u9762\u6587\u4EF6\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k.startsWith("/plugins/")){try{let d=await r.pluginAsset?.(b.url??k);if(!d){y(w,404,{error:"\u63D2\u4EF6\u8D44\u6E90\u4E0D\u5B58\u5728"});return}w.writeHead(200,{"Content-Type":d.type,"Cache-Control":"no-store"}),w.end(d.bytes)}catch(d){$(d,404,"\u63D2\u4EF6\u8D44\u6E90\u4E0D\u53EF\u7528")}return}if(!k.startsWith("/api/")){y(w,404,{error:"\u672A\u627E\u5230"});return}if(!Rs(b,a)){y(w,401,{error:"\u8BBF\u95EE\u4EE4\u724C\u65E0\u6548"});return}if(b.method==="GET"&&k==="/api/telemetry/config"){y(w,200,t.config.browser);return}if(b.method==="GET"&&k==="/api/update/version"){try{y(w,200,{current:await r.selfUpdate?.runningVersion()??null})}catch(d){$(d,503,d instanceof Error?d.message:"\u65E0\u6CD5\u8BFB\u53D6\u7248\u672C")}return}if(b.method==="GET"&&k==="/api/update"){try{y(w,200,await r.selfUpdate?.check()??{canRestart:!1,reason:"\u5F53\u524D\u6269\u5C55\u4E0D\u652F\u6301\u5728\u7EBF\u5347\u7EA7"})}catch(d){$(d,503,d instanceof Error?d.message:"\u68C0\u67E5\u66F4\u65B0\u5931\u8D25")}return}if(b.method==="GET"&&k==="/api/image"){let d=new URL(b.url??k,I),v=d.searchParams.get("sessionId")??"",_=d.searchParams.get("messageId")??"",C=Number(d.searchParams.get("index"));if(!v||v!==r.snapshot().sessionId||!_||!Number.isInteger(C)||C<0||C>100){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362\u6216\u56FE\u7247\u5730\u5740\u65E0\u6548"});return}let A=r.image?.(v,_,C);if(!A||!["image/png","image/jpeg","image/webp","image/gif"].includes(A.mimeType)){y(w,404,{error:"\u56FE\u7247\u4E0D\u53EF\u7528"});return}w.writeHead(200,{"Content-Type":A.mimeType,"Cache-Control":"private, no-store"}),w.end(A.data);return}if(b.method==="POST"&&k==="/api/attachment"){if(b.headers.origin!==void 0&&b.headers.origin!==I){y(w,403,{error:"\u6765\u6E90\u4E0D\u5339\u914D"});return}let d=new URL(b.url??k,I),v=d.searchParams.get("sessionId"),_=d.searchParams.get("name");try{if(!v||!_||_.length>1024||v!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362\u6216\u6587\u4EF6\u540D\u65E0\u6548"});return}if(Number(b.headers["content-length"]??0)>Fe){y(w,413,{error:"\u6587\u4EF6\u8D85\u8FC7 20 MB"});return}let C=await Nr(v,_,b.headers["content-type"]??"application/octet-stream",await Ws(b));if(v!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}h.set(C.id,C),y(w,201,{id:C.id,name:C.name,bytes:C.bytes})}catch(C){$(C,400,C instanceof Error?C.message:"\u4E0A\u4F20\u5931\u8D25")}return}if(b.method==="GET"&&k==="/api/session"){try{let d=r.snapshot();x(d),y(w,200,d)}catch(d){$(d,503,"\u5F53\u524D\u4F1A\u8BDD\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k==="/api/plugin-management"){try{y(w,200,u.inventory(await c()))}catch(d){$(d,503,"\u63D2\u4EF6\u76EE\u5F55\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k==="/api/plugins"){try{y(w,200,u.catalog(await c()))}catch(d){$(d,503,"\u63D2\u4EF6\u76EE\u5F55\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k==="/api/providers"){try{y(w,200,await r.providers?.()??[])}catch(d){$(d,503,"\u6A21\u578B\u63D0\u4F9B\u65B9\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k==="/api/provider/models"){let d=new URL(b.url??k,I).searchParams.get("providerId")??"";try{if(!d||!r.providerModels){y(w,400,{error:"\u63D0\u4F9B\u65B9\u65E0\u6548"});return}y(w,200,await r.providerModels(d))}catch(v){$(v,400,v instanceof Error?v.message:"\u6A21\u578B\u76EE\u5F55\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k==="/api/provider/login/active"){y(w,200,{active:E.getActive()??null});return}if(b.method==="GET"&&k==="/api/provider/login"){let d=new URL(b.url??k,I).searchParams.get("id")??"",v=E.get(d);y(w,v?200:404,v??{error:"\u767B\u5F55\u6D41\u7A0B\u4E0D\u5B58\u5728"});return}if(b.method==="GET"&&(k==="/api/models"||k==="/api/config"||k==="/api/workspaces"||k==="/api/commands")){try{y(w,200,k==="/api/models"?await r.models():k==="/api/config"?await r.config():k==="/api/commands"?r.commands?.()??[]:await r.workspaces())}catch(d){$(d,503,"Pi \u914D\u7F6E\u4E0D\u53EF\u7528")}return}if(b.method==="GET"&&k==="/api/directory/capability"){y(w,200,{kind:l});return}if(b.method==="GET"&&k==="/api/events"){let d;try{d=r.snapshot(),x(d)}catch(v){$(v,503,"\u5F53\u524D\u4F1A\u8BDD\u4E0D\u53EF\u7528");return}w.writeHead(200,{"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"no-store",Connection:"keep-alive","X-Accel-Buffering":"no"}),p.add(w),w.write(`${JSON.stringify({type:"snapshot",session:d})}
30
+ `),w.on("close",()=>p.delete(w));return}if(b.method==="POST"&&[...u.routes,"/api/plugin-management","/api/plugin-interaction","/api/plugin-action","/api/update","/api/message","/api/attachment/remove","/api/abort","/api/resume","/api/compact","/api/new-session","/api/model","/api/thinking-level","/api/config","/api/provider/login","/api/provider/login/respond","/api/provider/login/cancel","/api/provider/custom","/api/provider/models","/api/provider/logout","/api/workspace/add","/api/workspace/select","/api/workspace/new-session","/api/workspace/remove","/api/session/select","/api/directory/list","/api/directory/create","/api/directory/pick"].includes(k)){if(b.headers.origin!==void 0&&b.headers.origin!==I){y(w,403,{error:"\u6765\u6E90\u4E0D\u5339\u914D"});return}if(!b.headers["content-type"]?.startsWith("application/json")){y(w,415,{error:"\u9700\u8981 JSON \u8BF7\u6C42"});return}try{let d;try{d=await Ns(b)}catch(v){if(v instanceof SyntaxError||ie(v)){y(w,400,{error:"\u8BF7\u6C42\u5185\u5BB9\u65E0\u6548"});return}throw v}if(typeof d!="object"||d===null||!("sessionId"in d)||typeof d.sessionId!="string"){y(w,400,{error:"\u7F3A\u5C11\u4F1A\u8BDD\u6807\u8BC6"});return}if(k==="/api/plugin-management"){let v=d;if(typeof v.id!="string"||v.id.length>200||typeof v.enabled!="boolean"||typeof v.expected!="string"){y(w,400,{error:"\u63D2\u4EF6\u5F00\u5173\u53C2\u6570\u65E0\u6548"});return}let _=()=>{if(r.snapshot().sessionId!==d.sessionId)throw new W("\u4F1A\u8BDD\u5DF2\u5207\u6362");if(!r.snapshot().idle||(r.busyGitWorkspaces?.()??[]).length)throw new W("\u8BF7\u7B49\u5F85\u6240\u6709\u804A\u5929\u7A7A\u95F2\u540E\u4FEE\u6539\u5168\u5C40\u63D2\u4EF6\u5F00\u5173")};try{await u.toggle(v.id,v.enabled,v.expected,_),y(w,200,u.inventory(await c()))}catch(C){if(C instanceof W)y(w,C.status,{error:C.message});else throw C}finally{m()}return}if(u.mutating&&k!=="/api/abort"){y(w,409,{error:"\u63D2\u4EF6\u914D\u7F6E\u6B63\u5728\u4FDD\u5B58\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5"});return}if(await u.dispatch({path:k,body:d,res:w,snapshot:()=>r.snapshot(),busyWorkspaces:()=>r.busyGitWorkspaces?.()??[],json:(v,_)=>y(w,v,_)}))return;if(k==="/api/plugin-interaction"){if(d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("pluginId"in d)||typeof d.pluginId!="string"||d.pluginId.length>200||!("requestId"in d)||typeof d.requestId!="string"||d.requestId.length>200||!r.resolvePluginInteraction||!("value"in d)){y(w,400,{error:"\u63D2\u4EF6\u4EA4\u4E92\u54CD\u5E94\u65E0\u6548"});return}await u.coordinateStart(r.snapshot().cwd,async()=>r.resolvePluginInteraction(d.sessionId,d.pluginId,d.requestId,d.value)),y(w,200,{accepted:!0});return}if(k==="/api/plugin-action"){if(d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("pluginId"in d)||typeof d.pluginId!="string"||d.pluginId.length>200||!("action"in d)||typeof d.action!="string"||d.action.length>100){y(w,400,{error:"\u63D2\u4EF6\u52A8\u4F5C\u65E0\u6548"});return}if(u.plugins.some(C=>C.metadata.id===d.pluginId)){let C=u.actionRoute(d.pluginId,d.action);if(!C){y(w,400,{error:"\u63D2\u4EF6\u52A8\u4F5C\u4E0D\u5B58\u5728"});return}let A="input"in d?d.input:{};if(!A||typeof A!="object"||Array.isArray(A)){y(w,400,{error:"\u63D2\u4EF6\u52A8\u4F5C\u53C2\u6570\u65E0\u6548"});return}await u.dispatch({path:C,body:{...A,sessionId:d.sessionId},res:w,snapshot:()=>r.snapshot(),busyWorkspaces:()=>r.busyGitWorkspaces?.()??[],json:(be,R)=>y(w,be,be>=200&&be<300?{value:R}:R)});return}if(!r.invokePluginAction){y(w,400,{error:"\u63D2\u4EF6\u52A8\u4F5C\u4E0D\u53EF\u7528"});return}let _=await u.coordinateStart(r.snapshot().cwd,async()=>r.invokePluginAction(d.sessionId,d.pluginId,d.action,"input"in d?d.input:void 0));y(w,200,{value:_});return}if(k==="/api/update"){if(d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!r.snapshot().idle){y(w,409,{error:"\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u540E\u518D\u5347\u7EA7"});return}if(!r.selfUpdate){y(w,409,{error:"\u5F53\u524D\u6269\u5C55\u4E0D\u652F\u6301\u5728\u7EBF\u5347\u7EA7"});return}let v=await r.selfUpdate.prepare();J=!0,y(w,202,{accepted:!0,version:v.version}),setTimeout(()=>{r.selfUpdate?.requestRestart(v).catch(_=>{J=!1,t.capture(_,{stage:"restart"}),console.error("pi-webapp restart:",_)})},500).unref();return}if(k==="/api/provider/custom"){if(d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("provider"in d)||!pt(d.provider)||!r.addCustomProvider){y(w,400,{error:"\u81EA\u5B9A\u4E49\u63D0\u4F9B\u65B9\u65E0\u6548"});return}await r.addCustomProvider(d.sessionId,d.provider),y(w,201,{accepted:!0});return}if(k==="/api/provider/models"||k==="/api/provider/logout"){if(d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("providerId"in d)||typeof d.providerId!="string"){y(w,400,{error:"\u63D0\u4F9B\u65B9\u65E0\u6548"});return}if(k==="/api/provider/models"){if(!("change"in d)||!Br(d.change)||!r.updateProviderModel){y(w,400,{error:"\u6A21\u578B\u53C2\u6570\u65E0\u6548"});return}await r.updateProviderModel(d.sessionId,d.providerId,d.change)}else{if(!r.logoutProvider){y(w,400,{error:"\u65E0\u6CD5\u79FB\u9664\u8BA4\u8BC1"});return}await r.logoutProvider(d.sessionId,d.providerId)}y(w,200,{accepted:!0});return}if(k.startsWith("/api/provider/login")){if(d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(k==="/api/provider/login"){if(!("providerId"in d)||typeof d.providerId!="string"||!("method"in d)||d.method!=="api_key"&&d.method!=="oauth"||!r.loginProvider||!r.providers){y(w,400,{error:"\u767B\u5F55\u65B9\u5F0F\u65E0\u6548"});return}if(!(await r.providers()).some(A=>A.id===d.providerId&&A.methods.includes(d.method))){y(w,400,{error:"\u63D0\u4F9B\u65B9\u4E0D\u652F\u6301\u6B64\u767B\u5F55\u65B9\u5F0F"});return}let _="initialSecret"in d?d.initialSecret:void 0;if(_!==void 0&&(d.method!=="api_key"||typeof _!="string"||!_.trim()||_.length>16384)){y(w,400,{error:"API Key \u65E0\u6548"});return}let C=E.start(d.providerId,d.method,r.loginProvider,_,B);y(w,202,{id:C.id});return}if(!("id"in d)||typeof d.id!="string"){y(w,400,{error:"\u767B\u5F55\u6D41\u7A0B\u65E0\u6548"});return}if(k==="/api/provider/login/cancel"){y(w,E.cancel(d.id)?202:404,{accepted:!0});return}if(!("value"in d)||typeof d.value!="string"||d.value.length>16384||!E.respond(d.id,d.value)){y(w,400,{error:"\u767B\u5F55\u8F93\u5165\u65E0\u6548"});return}y(w,202,{accepted:!0});return}if(k==="/api/attachment/remove"){if(!("id"in d)||typeof d.id!="string"||d.sessionId!==r.snapshot().sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362\u6216\u9644\u4EF6\u65E0\u6548"});return}h.get(d.id)?.sessionId===d.sessionId&&h.delete(d.id),y(w,202,{accepted:!0});return}if(k==="/api/directory/pick"){if(l!=="native"){y(w,409,{error:"\u672C\u5730\u76EE\u5F55\u9009\u62E9\u5668\u4E0D\u53EF\u7528"});return}let v=new AbortController;w.once("close",()=>v.abort()),y(w,200,{path:await Mr(v.signal)});return}if(k==="/api/directory/list"){if("path"in d&&(typeof d.path!="string"||d.path.length>4096)){y(w,400,{error:"\u76EE\u5F55\u8DEF\u5F84\u65E0\u6548"});return}y(w,200,await Cr("path"in d?d.path:void 0));return}if(k==="/api/directory/create"){if(!("path"in d)||typeof d.path!="string"||d.path.length>4096||!("name"in d)||typeof d.name!="string"||d.name.length>255){y(w,400,{error:"\u6587\u4EF6\u5939\u540D\u79F0\u6216\u8DEF\u5F84\u65E0\u6548"});return}y(w,200,{path:await _r(d.path,d.name)});return}if(k==="/api/workspace/add"){if(!("path"in d)||typeof d.path!="string"||d.path.length>4096||!("create"in d)||typeof d.create!="boolean"){y(w,400,{error:"\u5DE5\u4F5C\u533A\u8DEF\u5F84\u65E0\u6548"});return}await r.addWorkspace(d.path,d.create),y(w,202,{accepted:!0});return}if(k==="/api/workspace/select"||k==="/api/workspace/remove"||k==="/api/workspace/new-session"){if(!("id"in d)||typeof d.id!="string"){y(w,400,{error:"\u5DE5\u4F5C\u533A\u65E0\u6548"});return}k==="/api/workspace/select"?await r.selectWorkspace(d.id):k==="/api/workspace/new-session"?await r.newSessionInWorkspace(d.id):await r.removeWorkspace(d.id),y(w,202,{accepted:!0});return}if(k==="/api/session/select"){if(!("workspaceId"in d)||typeof d.workspaceId!="string"||!("id"in d)||typeof d.id!="string"||!("path"in d)||typeof d.path!="string"){y(w,400,{error:"\u4F1A\u8BDD\u65E0\u6548"});return}await r.selectSession(d.workspaceId,d.id,d.path),y(w,202,{accepted:!0});return}if(k==="/api/thinking-level"){if(!("level"in d)||typeof d.level!="string"){y(w,400,{error:"\u63A8\u7406\u5F3A\u5EA6\u65E0\u6548"});return}await r.setThinkingLevel(d.sessionId,d.level)}else if(k==="/api/model"){if(!("provider"in d)||typeof d.provider!="string"||!("id"in d)||typeof d.id!="string"){y(w,400,{error:"\u6A21\u578B\u65E0\u6548"});return}await r.setModel(d.sessionId,d.provider,d.id)}else if(k==="/api/config"){let v=d;if(!["packages","extensions","skills"].includes(v.kind)||!["global","project"].includes(v.scope)||!["add","remove"].includes(v.action)||typeof v.value!="string"||!v.value.trim()||v.value.length>2048){y(w,400,{error:"\u914D\u7F6E\u9879\u65E0\u6548"});return}if(v.action==="add"&&v.kind!=="packages"&&Vr(v.value)){y(w,400,{error:"npm \u6216 Git \u6765\u6E90\u8BF7\u5728\u300C\u5305\u300D\u4E2D\u6DFB\u52A0\uFF1B\u6269\u5C55\u548C\u6280\u80FD\u53EA\u63A5\u53D7\u6587\u4EF6\u6216\u76EE\u5F55\u8DEF\u5F84"});return}y(w,200,await r.updateConfig(v));return}else if(k==="/api/message"){let v="attachments"in d?d.attachments:[];if(!Array.isArray(v)||v.length>Rr||v.some(R=>typeof R!="string")||new Set(v).size!==v.length){y(w,400,{error:"\u9644\u4EF6\u65E0\u6548\u6216\u8FC7\u591A"});return}let _=v.map(R=>h.get(R));if(_.some(R=>!R||R.sessionId!==d.sessionId)){y(w,400,{error:"\u9644\u4EF6\u4E0D\u53EF\u7528"});return}if(!("text"in d)||typeof d.text!="string"||!d.text.trim()&&v.length===0||d.text.length>32e3){y(w,400,{error:"\u6D88\u606F\u65E0\u6548\u6216\u8FC7\u957F"});return}let C=_,A=[d.text.trim(),...C.map(R=>`\u9644\u4EF6 ${JSON.stringify(R.name)}\uFF1A${R.path}`)].filter(Boolean).join(`
31
31
 
32
- `),ye=await Promise.all(C.filter(R=>["image/png","image/jpeg","image/webp","image/gif"].includes(R.mediaType)).map(_r));B.operationId??=pt(),w.setHeader("X-Operation-ID",B.operationId),t.breadcrumb("send",{...B,attachmentCount:C.length}),await u.coordinateStart(r.snapshot().cwd,async()=>r.send(d.sessionId,A,ye,B));for(let R of v)g.delete(R)}else if(k==="/api/compact"){if(!r.compact)throw new Error("\u5F53\u524D\u4F1A\u8BDD\u4E0D\u652F\u6301\u538B\u7F29");await r.compact(d.sessionId)}else if(k==="/api/resume"){let v=r.snapshot();if(d.sessionId!==v.sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!v.idle){y(w,409,{error:"Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F"});return}if(!v.paused){y(w,409,{error:"\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6682\u505C\u7684\u4EFB\u52A1"});return}if(v.interactions?.length){y(w,409,{error:"\u8BF7\u5148\u5B8C\u6210\u5F53\u524D\u4EA4\u4E92\u6216\u5BA1\u6279"});return}if(!r.resume)throw new Error("\u5F53\u524D\u670D\u52A1\u4E0D\u652F\u6301\u7EE7\u7EED\uFF0C\u8BF7\u91CD\u8F7D Pi");B.operationId??=pt(),w.setHeader("X-Operation-ID",B.operationId),t.breadcrumb("resume",{...B}),await u.coordinateStart(v.cwd,async()=>r.resume(d.sessionId,B))}else k==="/api/abort"?await r.abort(d.sessionId):await r.newSession(d.sessionId);y(w,202,{accepted:!0})}catch(d){let v=u.requestFailure(d);if(v){y(w,v.status,v.body);return}let _=d instanceof Error?d.message:"\u8BF7\u6C42\u5931\u8D25";$(d,_==="\u4F1A\u8BDD\u5DF2\u5207\u6362"?409:400,_)}return}y(w,404,{error:"\u672A\u627E\u5230"})}catch(j){w.headersSent?(t.capture(j,{...B,route:k,stage:"http_stream"}),w.end()):$(j,500,"\u8BF7\u6C42\u5931\u8D25")}}),S=Number(process.env.PI_WEBAPP_RESTART_PORT),V;try{V=await Ss(ce,Number.isInteger(S)&&S>0&&S<65536&&n===s?S:0)}catch(b){throw t.capture(b,{stage:"listen"}),await t.close(),b}return I=`http://127.0.0.1:${V}`,{protocolVersion:7,buildId:K,reportError(b,w){return t.capture(b,w)},breadcrumb(b,w){t.breadcrumb(b,w)},url:`${I}/#${s}`,publish(b){if(b.type==="snapshot"&&x(b.session),b.type==="error"&&!b.errorCode&&(b={...b,errorCode:"unexpected_error",errorId:t.capture(new Error("Agent execution failed"),{stage:"agent",requestId:b.requestId,operationId:b.operationId})}),b.type==="error"&&(b={...b,errorReported:b.errorReported??t.enabled}),b.type==="snapshot")for(let[U,le]of g)le.sessionId!==b.session.sessionId&&g.delete(U);let w=`${JSON.stringify(b)}
32
+ `),be=await Promise.all(C.filter(R=>["image/png","image/jpeg","image/webp","image/gif"].includes(R.mediaType)).map(Wr));B.operationId??=ut(),w.setHeader("X-Operation-ID",B.operationId),t.breadcrumb("send",{...B,attachmentCount:C.length}),await u.coordinateStart(r.snapshot().cwd,async()=>r.send(d.sessionId,A,be,B));for(let R of v)h.delete(R)}else if(k==="/api/compact"){if(!r.compact)throw new Error("\u5F53\u524D\u4F1A\u8BDD\u4E0D\u652F\u6301\u538B\u7F29");await r.compact(d.sessionId)}else if(k==="/api/resume"){let v=r.snapshot();if(d.sessionId!==v.sessionId){y(w,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!v.idle){y(w,409,{error:"Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F"});return}if(!v.paused){y(w,409,{error:"\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6682\u505C\u7684\u4EFB\u52A1"});return}if(v.interactions?.length){y(w,409,{error:"\u8BF7\u5148\u5B8C\u6210\u5F53\u524D\u4EA4\u4E92\u6216\u5BA1\u6279"});return}if(!r.resume)throw new Error("\u5F53\u524D\u670D\u52A1\u4E0D\u652F\u6301\u7EE7\u7EED\uFF0C\u8BF7\u91CD\u8F7D Pi");B.operationId??=ut(),w.setHeader("X-Operation-ID",B.operationId),t.breadcrumb("resume",{...B}),await u.coordinateStart(v.cwd,async()=>r.resume(d.sessionId,B))}else k==="/api/abort"?await r.abort(d.sessionId):await r.newSession(d.sessionId);y(w,202,{accepted:!0})}catch(d){let v=u.requestFailure(d);if(v){y(w,v.status,v.body);return}let _=d instanceof Error?d.message:"\u8BF7\u6C42\u5931\u8D25";$(d,_==="\u4F1A\u8BDD\u5DF2\u5207\u6362"?409:400,_)}return}y(w,404,{error:"\u672A\u627E\u5230"})}catch(j){w.headersSent?(t.capture(j,{...B,route:k,stage:"http_stream"}),w.end()):$(j,500,"\u8BF7\u6C42\u5931\u8D25")}}),S=Number(process.env.PI_WEBAPP_RESTART_PORT),V;try{V=await Ds(le,Number.isInteger(S)&&S>0&&S<65536&&n===s?S:0)}catch(b){throw t.capture(b,{stage:"listen"}),await t.close(),b}return I=`http://127.0.0.1:${V}`,{protocolVersion:7,buildId:K,reportError(b,w){return t.capture(b,w)},breadcrumb(b,w){t.breadcrumb(b,w)},url:`${I}/#${s}`,publish(b){if(b.type==="snapshot"&&x(b.session),b.type==="error"&&!b.errorCode&&(b={...b,errorCode:"unexpected_error",errorId:t.capture(new Error("Agent execution failed"),{stage:"agent",requestId:b.requestId,operationId:b.operationId})}),b.type==="error"&&(b={...b,errorReported:b.errorReported??t.enabled}),b.type==="snapshot")for(let[U,de]of h)de.sessionId!==b.session.sessionId&&h.delete(U);let w=`${JSON.stringify(b)}
33
33
  `;for(let U of p)U.write(w)},async close(b){E.close(),await u.close();for(let U of p)U.end(`${JSON.stringify({type:"shutdown",reconnect:b?.reconnect??J})}
34
- `);p.clear();let w;try{await new Promise((U,le)=>{ce.close(we=>we?le(we):U()),w=setTimeout(()=>ce.closeAllConnections(),50).unref()})}finally{clearTimeout(w),await t.close()}}}}import{getSupportedThinkingLevels as xs}from"@earendil-works/pi-ai";function Gr(r){let e=[],t=r;for(;;){let i=/(^|\n\n)附件 ("(?:\\.|[^"\\])*"):([^\n]+)$/u.exec(t);if(!i||!/[\\/]pi-web[\\/]attachments[\\/][a-f0-9]{64}[\\/]/u.test(i[3]))break;let n;try{n=JSON.parse(i[2])}catch{break}e.unshift({name:n,image:/\.(?:png|jpe?g|webp|gif)$/iu.test(n)}),t=t.slice(0,i.index)}return{text:t,attachments:e}}var Pe="pi-webapp/paused",ft="pi-webapp/resume";function Se(r){for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.type==="custom_message"&&t.customType===ft)return!1;if(t.type==="custom"&&t.customType===Pe)return!0;if(t.type==="message"){if(t.message.role==="user")return!1;if(t.message.role==="assistant"){if(t.message.stopReason==="aborted")return!0;if(t.message.stopReason==="stop"||t.message.stopReason==="length"||t.message.stopReason==="error")return!1}}}return!1}function mt(r,e){let t=[],i;for(let n of r){if(n.type==="message"&&(i=n.id),n.type!=="custom")continue;let s=e.find(a=>n.customType.startsWith(`${a}/`));if(s){try{if(JSON.stringify(n.data).length>128*1024)continue}catch{continue}t.push({id:n.id,pluginId:s,kind:n.customType,data:n.data,timestamp:n.timestamp,...i?{afterMessageId:i}:{}})}}return t}function ie(r){return typeof r=="string"?[{kind:"text",text:r}]:r.flatMap(e=>e.type==="text"?[{kind:"text",text:e.text}]:e.type==="thinking"?[{kind:"thinking",text:e.thinking}]:e.type==="image"?[{kind:"image",text:"\u56FE\u7247\u9644\u4EF6"}]:e.type==="toolCall"?[{kind:"toolCall",text:JSON.stringify(e.arguments??{}),toolName:e.name,toolCallId:e.id}]:[])}function $e(r){if(r.type==="custom_message")return r.display?{id:r.id,role:"notice",timestamp:r.timestamp,blocks:ie(r.content)}:null;if(r.type!=="message")return null;let{message:e}=r;return e.role==="user"||e.role==="assistant"?{id:r.id,role:e.role,timestamp:r.timestamp,blocks:ie(e.content),...e.role==="assistant"?{...e.stopReason==="error"&&e.errorMessage?{error:e.errorMessage}:{},usage:{input:e.usage.input,output:e.usage.output,cacheRead:e.usage.cacheRead,cacheWrite:e.usage.cacheWrite,...e.usage.reasoning===void 0?{}:{reasoning:e.usage.reasoning},totalTokens:e.usage.totalTokens,cost:e.usage.cost.total},model:`${e.provider}/${e.model}`}:{}}:e.role==="toolResult"?{id:r.id,role:"tool",timestamp:r.timestamp,blocks:ie(e.content),isError:e.isError,toolCallId:e.toolCallId,toolName:e.toolName}:null}function je(r,e){let t=r?.trim();if(t)return t;let i=e.find(s=>s.role==="user"),n=Gr(i?.blocks.find(s=>s.kind==="text")?.text??"").text.replace(/\s+/g," ").trim();return n?n.slice(0,50):"\u5F53\u524D\u4F1A\u8BDD"}function gt(r,e,t=[]){let i=r.sessionManager.getBranch().flatMap(n=>{let s=$e(n);return s?[s]:[]});return{schemaVersion:1,sessionId:r.sessionManager.getSessionId(),cwd:r.cwd,name:je(e,i),model:r.model?`${r.model.provider}/${r.model.id}`:null,thinkingLevel:r.thinkingLevel??null,thinkingLevels:r.model?xs(r.model):["off"],idle:r.isIdle(),paused:Se(r.sessionManager.getBranch()),contextUsage:r.getContextUsage()??null,messages:i,pluginEntries:mt(r.sessionManager.getBranch(),t)}}import{randomUUID as ht}from"node:crypto";import{mkdir as Vr,readFile as Is,realpath as wt,rename as Cs,rm as _s,stat as yt,writeFile as Ts}from"node:fs/promises";import{basename as Ur,dirname as Ms,isAbsolute as zr,join as As}from"node:path";var xe=class extends Error{constructor(){super("\u5DE5\u4F5C\u533A\u76EE\u5F55\u4E0D\u53EF\u7528\uFF0C\u8BF7\u6062\u590D\u76EE\u5F55\u6216\u4ECE\u5217\u8868\u79FB\u9664\u540E\u91CD\u65B0\u6DFB\u52A0")}};async function fe(r){try{let e=await wt(r);return(await yt(e)).isDirectory()?e:null}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return null;throw e}}async function ne(r){let e=await fe(r);if(e===null)throw new xe;return e}var Le=class{items=[];hiddenPaths=[];mutationChain=Promise.resolve();file;constructor(e){this.file=e}async load(){try{let e=JSON.parse(await Is(this.file,"utf8")),t,i=[];if(Array.isArray(e)?t=e:e&&typeof e=="object"&&"version"in e&&e.version===2&&"items"in e&&"hiddenPaths"in e&&(t=e.items,i=e.hiddenPaths),!Array.isArray(t)||!Array.isArray(i))throw new Error("\u5DE5\u4F5C\u533A\u8BB0\u5F55\u65E0\u6548");this.items=t.filter(n=>typeof n=="object"&&n!==null&&typeof n.id=="string"&&typeof n.path=="string"&&typeof n.title=="string"),this.hiddenPaths=i.filter(n=>typeof n=="string")}catch(e){if(e.code!=="ENOENT")throw e}}list(){return[...this.items]}get(e){return this.items.find(t=>t.id===e)}async add(e,t=!1){if(!zr(e)||e.includes("\0"))throw new Error("\u8BF7\u8F93\u5165\u5B8C\u6574\u7684\u76EE\u5F55\u8DEF\u5F84");t&&await Vr(e,{recursive:!0});let i=await wt(e);if(!(await yt(i)).isDirectory())throw new Error("\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55");return this.mutate(async()=>{let n=this.hiddenPaths.filter(p=>p!==i),s=this.items.find(p=>p.path===i);if(s)return n.length!==this.hiddenPaths.length&&(await this.save(this.items,n),this.hiddenPaths=n),s;let a={id:ht(),path:i,title:Ur(i)||i},l=[a,...this.items];return await this.save(l,n),this.items=l,this.hiddenPaths=n,a})}async discover(e){let t=(await Promise.all([...new Set(e)].filter(zr).map(async i=>{try{let n=await wt(i);return(await yt(n)).isDirectory()?n:null}catch{return null}}))).filter(i=>i!==null);await this.mutate(async()=>{let i=new Set([...this.items.map(a=>a.path),...this.hiddenPaths]),n=[];for(let a of t)i.has(a)||(i.add(a),n.push({id:ht(),path:a,title:Ur(a)||a}));if(n.length===0)return;let s=[...this.items,...n];await this.save(s,this.hiddenPaths),this.items=s})}async remove(e){await this.mutate(async()=>{let t=this.get(e);if(!t)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");let i=this.items.filter(s=>s.id!==e),n=[...new Set([...this.hiddenPaths,t.path])];await this.save(i,n),this.items=i,this.hiddenPaths=n})}mutate(e){let t=this.mutationChain.then(e,e);return this.mutationChain=t.then(()=>{},()=>{}),t}async save(e,t){await Vr(Ms(this.file),{recursive:!0});let i=`${this.file}.${ht()}.tmp`;try{await Ts(i,JSON.stringify({version:2,items:e,hiddenPaths:t},null,2),{mode:384}),await Cs(i,this.file)}catch(n){throw await _s(i,{force:!0}),n}}};function Hr(r){return As(r,"pi-web","workspaces.json")}import{createAgentSession as fo,createEventBus as mo,DefaultResourceLoader as go,getAgentDir as ho,SessionManager as ze,VERSION as He}from"@earendil-works/pi-coding-agent";var Rs="pi-webapp:interaction-open:v1",Ws="pi-webapp:interaction-accept:v1",Jr="pi-webapp:interaction-settle:v1",Ns="pi-webapp:interaction-cancel:v1";var me=class{bus;accepts;changed;requests=new Map;detach;constructor(e,t,i){this.bus=e,this.accepts=t,this.changed=i,this.detach=[e.on(Rs,n=>{!Ds(n)||!t(n)||this.requests.has(n.requestId)||(this.requests.set(n.requestId,n),e.emit(Ws,{requestId:n.requestId}),i())}),e.on(Ns,n=>{let s=n,a=this.requests.get(s?.requestId);a&&a.sessionId===s.sessionId&&a.pluginId===s.pluginId&&(this.requests.delete(s.requestId),i())})]}pending(e){return[...this.requests.values()].filter(t=>t.sessionId===e)}resolve(e,t,i,n){let s=this.requests.get(i);if(!s||s.sessionId!==e||s.pluginId!==t||!this.accepts(s))throw new Error("Interaction expired or session changed");this.requests.delete(i),this.bus.emit(Jr,{requestId:i,value:n}),this.changed()}cancelAll(e="Session changed"){for(let t of this.requests.values())this.bus.emit(Jr,{requestId:t.requestId,error:e});this.requests.clear(),this.changed()}dispose(){for(let e of this.detach)e();this.cancelAll("Interaction host unloaded")}};function Ds(r){if(!r||typeof r!="object")return!1;let e=r;for(let t of["requestId","sessionId","pluginId","kind"])if(typeof e[t]!="string"||!e[t]||e[t].length>200)return!1;try{return JSON.stringify(e.data).length<=128*1024}catch{return!1}}var Os=1,Fs="pi-webapp:action:v1",Bs="pi-webapp:action-response:v1",Ge="pi-webapp:plugin-changed:v1";function qr(r){if(!r||typeof r!="object")return!1;let e=r;return e.apiVersion===Os&&typeof e.client=="string"&&/^\.\/dist\/[\w.-]+\.js$/.test(e.client)&&(e.style===void 0||typeof e.style=="string"&&/^\.\/dist\/[\w.-]+\.css$/.test(e.style))}function Ve(r,e,t=15e3,i){return new Promise((n,s)=>{let a=!1,l=(c,f)=>{a||(a=!0,clearTimeout(h),p(),i?.removeEventListener("abort",u),c?s(c):n(f))},p=r.on(Bs,c=>{let f=c;f?.requestId===e.requestId&&l(f.ok?null:new Error(f.error??"Plugin action failed"),f.value)}),h=setTimeout(()=>l(new Error(`Plugin action timed out: ${e.pluginId}/${e.action}`)),t),u=()=>l(new Error("Plugin action runtime unloaded"));if(i?.addEventListener("abort",u,{once:!0}),i?.aborted)u();else try{r.emit(Fs,e)}catch(c){l(c instanceof Error?c:new Error(String(c)))}})}import{realpath as wo}from"node:fs/promises";import{readFile as bt,realpath as Zr,stat as Qr}from"node:fs/promises";import{createHash as $s}from"node:crypto";import{dirname as Kr,isAbsolute as js,join as vt,parse as Ls,resolve as Gs,sep as Vs,delimiter as Us}from"node:path";import{DefaultPackageManager as zs,getAgentDir as Hs,SettingsManager as Js}from"@earendil-works/pi-coding-agent";async function Xr(r,e){let t=await bt(r),i=e?await bt(e):void 0;if(t.length>8*1024*1024||(i?.length??0)>8*1024*1024)throw new Error("Plugin asset exceeds 8 MB");let n=$s("sha256").update(t).update("\0").update(i??"").digest("hex");return{clientBytes:t,styleBytes:i,revision:n}}function qs(){return(process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS??"").split(Us).filter(Boolean).map(r=>Gs(r))}async function Ks(r){let e=Kr(r);for(;e!==Ls(e).root;)try{return await Qr(vt(e,"package.json")),e}catch{e=Kr(e)}return null}async function Yr(r,e){let t=await Zr(vt(r,e));if(!t.startsWith(r+Vs))throw new Error("Asset escapes package root");let i=await Qr(t);if(!i.isFile()||i.size>8*1024*1024)throw new Error("Plugin asset is not a regular file under 8 MB");return t}var se=class r{plugins;errors;extensionRoots;constructor(e,t,i){this.plugins=e,this.errors=t,this.extensionRoots=i}static async discover(e,t,i=qs()){let n=Js.create(e,void 0,{projectTrusted:t}),s=new zs({cwd:e,agentDir:Hs(),settingsManager:n}),a=await s.resolve(async()=>"skip"),l=i.length?await s.resolveExtensionSources(i,{temporary:!0}):{extensions:[]},p=new Set;for(let m of[...a.extensions,...l.extensions]){if(!m.enabled)continue;let g=await Ks(m.path);g&&p.add(g)}for(let m of i)js(m)&&p.add(m);let h=[],u=[],c=[],f=new Set;for(let m of p)try{let g=await Zr(m),E=JSON.parse(await bt(vt(g,"package.json"),"utf8"));if(E.piWebapp===void 0)continue;if(typeof E.name!="string"||!E.name)throw new Error("Missing package name");if(!qr(E.piWebapp))throw new Error("Unsupported piWebapp manifest or asset path");if(f.has(E.name))throw new Error(`Duplicate plugin id: ${E.name}`);let x=await Yr(g,E.piWebapp.client),I=E.piWebapp.style?await Yr(g,E.piWebapp.style):void 0;f.add(E.name),h.push({id:E.name,root:g,manifest:E.piWebapp,clientPath:x,stylePath:I,...await Xr(x,I)}),c.push(g)}catch(g){u.push(`${m}: ${g instanceof Error?g.message:String(g)}`)}return h.sort((m,g)=>m.id.localeCompare(g.id)),new r(h,u,c)}has(e){return this.plugins.some(t=>t.id===e)}ids(){return this.plugins.map(e=>e.id)}async refreshAssets(){for(let e of this.plugins)Object.assign(e,await Xr(e.clientPath,e.stylePath))}view(){return{plugins:this.plugins.map(e=>({id:e.id,client:`/plugins/${encodeURIComponent(e.id)}/client.js?v=${e.revision}`,...e.stylePath?{style:`/plugins/${encodeURIComponent(e.id)}/client.css?v=${e.revision}`}:{}})),errors:this.errors}}async asset(e){let t=new URL(e,"http://localhost"),i=/^\/plugins\/([^/]+)\/(client\.js|client\.css)$/.exec(t.pathname);if(!i)return null;let n;try{n=decodeURIComponent(i[1])}catch{return null}let s=this.plugins.find(l=>l.id===n);if(!s||t.searchParams.has("v")&&t.searchParams.get("v")!==s.revision)return null;let a=i[2]==="client.js"?s.clientBytes:s.styleBytes;return a?{bytes:a,type:i[2]==="client.js"?"text/javascript; charset=utf-8":"text/css; charset=utf-8"}:null}};import{realpath as Xs}from"node:fs/promises";import{SessionManager as Ys}from"@earendil-works/pi-coding-agent";async function Ie(r,e){let t=await ne(r),i=e??await Ys.listAll(),n=await Promise.all(i.map(async s=>s.cwd!==""&&await Xs(s.cwd).catch(()=>null)===t));return i.filter((s,a)=>n[a])}var oe=class{tail=Promise.resolve();run(e){let t=this.tail.then(e);return this.tail=t.catch(()=>{}),t}wrap(e){return(...t)=>this.run(()=>e(...t))}},ei=new WeakMap;function ti(r,e,t,i=5e3,n=()=>{}){let s=ei.get(r);if(s)return s;let a=(async()=>{let l;try{await Promise.race([r.extensionRunner.emit({type:"session_shutdown",reason:e}),new Promise((p,h)=>{l=setTimeout(()=>h(new Error("Plugin shutdown timed out")),i)})])}catch(p){t(p instanceof Error?p.message:String(p))}finally{clearTimeout(l);try{n()}finally{r.dispose()}}})();return ei.set(r,a),a}function Ue(r){let t=[...r].reverse().find(i=>i.role==="assistant")?.blocks.filter(i=>i.kind==="text").map(i=>i.text).join(`
35
- `);return{customType:ft,display:!1,details:{action:"resume"},content:"The user clicked Continue for the interrupted turn. Continue the response to the latest user request from the interrupted point. Preserve completed work and do not repeat text already delivered. Check existing task progress when needed."+(t?`
34
+ `);p.clear();let w;try{await new Promise((U,de)=>{le.close(ye=>ye?de(ye):U()),w=setTimeout(()=>le.closeAllConnections(),50).unref()})}finally{clearTimeout(w),await t.close()}}}}import{getSupportedThinkingLevels as Os}from"@earendil-works/pi-ai";function qr(r){let e=[],t=r;for(;;){let i=/(^|\n\n)附件 ("(?:\\.|[^"\\])*"):([^\n]+)$/u.exec(t);if(!i||!/[\\/]pi-web[\\/]attachments[\\/][a-f0-9]{64}[\\/]/u.test(i[3]))break;let n;try{n=JSON.parse(i[2])}catch{break}e.unshift({name:n,image:/\.(?:png|jpe?g|webp|gif)$/iu.test(n)}),t=t.slice(0,i.index)}return{text:t,attachments:e}}var Se="pi-webapp/paused",mt="pi-webapp/resume";function xe(r){for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.type==="custom_message"&&t.customType===mt)return!1;if(t.type==="custom"&&t.customType===Se)return!0;if(t.type==="message"){if(t.message.role==="user")return!1;if(t.message.role==="assistant"){if(t.message.stopReason==="aborted")return!0;if(t.message.stopReason==="stop"||t.message.stopReason==="length"||t.message.stopReason==="error")return!1}}}return!1}function gt(r,e){let t=[],i;for(let n of r){if(n.type==="message"&&(i=n.id),n.type!=="custom")continue;let s=e.find(a=>n.customType.startsWith(`${a}/`));if(s){try{if(JSON.stringify(n.data).length>128*1024)continue}catch{continue}t.push({id:n.id,pluginId:s,kind:n.customType,data:n.data,timestamp:n.timestamp,...i?{afterMessageId:i}:{}})}}return t}function ne(r){return typeof r=="string"?[{kind:"text",text:r}]:r.flatMap(e=>e.type==="text"?[{kind:"text",text:e.text}]:e.type==="thinking"?[{kind:"thinking",text:e.thinking}]:e.type==="image"?[{kind:"image",text:"\u56FE\u7247\u9644\u4EF6"}]:e.type==="toolCall"?[{kind:"toolCall",text:JSON.stringify(e.arguments??{}),toolName:e.name,toolCallId:e.id}]:[])}function je(r){if(r.type==="custom_message")return r.display?{id:r.id,role:"notice",timestamp:r.timestamp,blocks:ne(r.content)}:null;if(r.type!=="message")return null;let{message:e}=r;return e.role==="user"||e.role==="assistant"?{id:r.id,role:e.role,timestamp:r.timestamp,blocks:ne(e.content),...e.role==="assistant"?{...e.stopReason==="error"&&e.errorMessage?{error:e.errorMessage}:{},usage:{input:e.usage.input,output:e.usage.output,cacheRead:e.usage.cacheRead,cacheWrite:e.usage.cacheWrite,...e.usage.reasoning===void 0?{}:{reasoning:e.usage.reasoning},totalTokens:e.usage.totalTokens,cost:e.usage.cost.total},model:`${e.provider}/${e.model}`}:{}}:e.role==="toolResult"?{id:r.id,role:"tool",timestamp:r.timestamp,blocks:ne(e.content),isError:e.isError,toolCallId:e.toolCallId,toolName:e.toolName}:null}function Le(r,e){let t=r?.trim();if(t)return t;let i=e.find(s=>s.role==="user"),n=qr(i?.blocks.find(s=>s.kind==="text")?.text??"").text.replace(/\s+/g," ").trim();return n?n.slice(0,50):"\u5F53\u524D\u4F1A\u8BDD"}function ht(r,e,t=[]){let i=r.sessionManager.getBranch().flatMap(n=>{let s=je(n);return s?[s]:[]});return{schemaVersion:1,sessionId:r.sessionManager.getSessionId(),cwd:r.cwd,name:Le(e,i),model:r.model?`${r.model.provider}/${r.model.id}`:null,thinkingLevel:r.thinkingLevel??null,thinkingLevels:r.model?Os(r.model):["off"],idle:r.isIdle(),paused:xe(r.sessionManager.getBranch()),contextUsage:r.getContextUsage()??null,messages:i,pluginEntries:gt(r.sessionManager.getBranch(),t)}}import{randomUUID as wt}from"node:crypto";import{mkdir as Kr,readFile as Fs,realpath as yt,rename as Bs,rm as $s,stat as bt,writeFile as js}from"node:fs/promises";import{basename as Xr,dirname as Ls,isAbsolute as Yr,join as Gs}from"node:path";var Ie=class extends Error{constructor(){super("\u5DE5\u4F5C\u533A\u76EE\u5F55\u4E0D\u53EF\u7528\uFF0C\u8BF7\u6062\u590D\u76EE\u5F55\u6216\u4ECE\u5217\u8868\u79FB\u9664\u540E\u91CD\u65B0\u6DFB\u52A0")}};async function me(r){try{let e=await yt(r);return(await bt(e)).isDirectory()?e:null}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return null;throw e}}async function se(r){let e=await me(r);if(e===null)throw new Ie;return e}var Ge=class{items=[];hiddenPaths=[];mutationChain=Promise.resolve();file;constructor(e){this.file=e}async load(){try{let e=JSON.parse(await Fs(this.file,"utf8")),t,i=[];if(Array.isArray(e)?t=e:e&&typeof e=="object"&&"version"in e&&e.version===2&&"items"in e&&"hiddenPaths"in e&&(t=e.items,i=e.hiddenPaths),!Array.isArray(t)||!Array.isArray(i))throw new Error("\u5DE5\u4F5C\u533A\u8BB0\u5F55\u65E0\u6548");this.items=t.filter(n=>typeof n=="object"&&n!==null&&typeof n.id=="string"&&typeof n.path=="string"&&typeof n.title=="string"),this.hiddenPaths=i.filter(n=>typeof n=="string")}catch(e){if(e.code!=="ENOENT")throw e}}list(){return[...this.items]}get(e){return this.items.find(t=>t.id===e)}async add(e,t=!1){if(!Yr(e)||e.includes("\0"))throw new Error("\u8BF7\u8F93\u5165\u5B8C\u6574\u7684\u76EE\u5F55\u8DEF\u5F84");t&&await Kr(e,{recursive:!0});let i=await yt(e);if(!(await bt(i)).isDirectory())throw new Error("\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55");return this.mutate(async()=>{let n=this.hiddenPaths.filter(p=>p!==i),s=this.items.find(p=>p.path===i);if(s)return n.length!==this.hiddenPaths.length&&(await this.save(this.items,n),this.hiddenPaths=n),s;let a={id:wt(),path:i,title:Xr(i)||i},l=[a,...this.items];return await this.save(l,n),this.items=l,this.hiddenPaths=n,a})}async discover(e){let t=(await Promise.all([...new Set(e)].filter(Yr).map(async i=>{try{let n=await yt(i);return(await bt(n)).isDirectory()?n:null}catch{return null}}))).filter(i=>i!==null);await this.mutate(async()=>{let i=new Set([...this.items.map(a=>a.path),...this.hiddenPaths]),n=[];for(let a of t)i.has(a)||(i.add(a),n.push({id:wt(),path:a,title:Xr(a)||a}));if(n.length===0)return;let s=[...this.items,...n];await this.save(s,this.hiddenPaths),this.items=s})}async remove(e){await this.mutate(async()=>{let t=this.get(e);if(!t)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");let i=this.items.filter(s=>s.id!==e),n=[...new Set([...this.hiddenPaths,t.path])];await this.save(i,n),this.items=i,this.hiddenPaths=n})}mutate(e){let t=this.mutationChain.then(e,e);return this.mutationChain=t.then(()=>{},()=>{}),t}async save(e,t){await Kr(Ls(this.file),{recursive:!0});let i=`${this.file}.${wt()}.tmp`;try{await js(i,JSON.stringify({version:2,items:e,hiddenPaths:t},null,2),{mode:384}),await Bs(i,this.file)}catch(n){throw await $s(i,{force:!0}),n}}};function Zr(r){return Gs(r,"pi-web","workspaces.json")}import{createAgentSession as So,createEventBus as xo,DefaultResourceLoader as Io,getAgentDir as Co,SessionManager as He,VERSION as Je}from"@earendil-works/pi-coding-agent";var Vs="pi-webapp:interaction-open:v1",Us="pi-webapp:interaction-accept:v1",Qr="pi-webapp:interaction-settle:v1",zs="pi-webapp:interaction-cancel:v1";var ge=class{bus;accepts;changed;requests=new Map;detach;constructor(e,t,i){this.bus=e,this.accepts=t,this.changed=i,this.detach=[e.on(Vs,n=>{!Hs(n)||!t(n)||this.requests.has(n.requestId)||(this.requests.set(n.requestId,n),e.emit(Us,{requestId:n.requestId}),i())}),e.on(zs,n=>{let s=n,a=this.requests.get(s?.requestId);a&&a.sessionId===s.sessionId&&a.pluginId===s.pluginId&&(this.requests.delete(s.requestId),i())})]}pending(e){return[...this.requests.values()].filter(t=>t.sessionId===e)}resolve(e,t,i,n){let s=this.requests.get(i);if(!s||s.sessionId!==e||s.pluginId!==t||!this.accepts(s))throw new Error("Interaction expired or session changed");this.requests.delete(i),this.bus.emit(Qr,{requestId:i,value:n}),this.changed()}cancelAll(e="Session changed"){for(let t of this.requests.values())this.bus.emit(Qr,{requestId:t.requestId,error:e});this.requests.clear(),this.changed()}dispose(){for(let e of this.detach)e();this.cancelAll("Interaction host unloaded")}};function Hs(r){if(!r||typeof r!="object")return!1;let e=r;for(let t of["requestId","sessionId","pluginId","kind"])if(typeof e[t]!="string"||!e[t]||e[t].length>200)return!1;try{return JSON.stringify(e.data).length<=128*1024}catch{return!1}}var Js=1,qs="pi-webapp:action:v1",Ks="pi-webapp:action-response:v1",Ve="pi-webapp:plugin-changed:v1";function ei(r){if(!r||typeof r!="object")return!1;let e=r;return e.apiVersion===Js&&typeof e.client=="string"&&/^\.\/dist\/[\w.-]+\.js$/.test(e.client)&&(e.style===void 0||typeof e.style=="string"&&/^\.\/dist\/[\w.-]+\.css$/.test(e.style))}function Ue(r,e,t=15e3,i){return new Promise((n,s)=>{let a=!1,l=(c,f)=>{a||(a=!0,clearTimeout(g),p(),i?.removeEventListener("abort",u),c?s(c):n(f))},p=r.on(Ks,c=>{let f=c;f?.requestId===e.requestId&&l(f.ok?null:new Error(f.error??"Plugin action failed"),f.value)}),g=setTimeout(()=>l(new Error(`Plugin action timed out: ${e.pluginId}/${e.action}`)),t),u=()=>l(new Error("Plugin action runtime unloaded"));if(i?.addEventListener("abort",u,{once:!0}),i?.aborted)u();else try{r.emit(qs,e)}catch(c){l(c instanceof Error?c:new Error(String(c)))}})}import{realpath as _o}from"node:fs/promises";import{readFile as vt,realpath as ni,stat as si}from"node:fs/promises";import{createHash as Xs}from"node:crypto";import{dirname as ti,isAbsolute as Ys,join as kt,parse as Zs,resolve as Qs,sep as eo,delimiter as to}from"node:path";import{DefaultPackageManager as ro,getAgentDir as io,SettingsManager as no}from"@earendil-works/pi-coding-agent";async function ri(r,e){let t=await vt(r),i=e?await vt(e):void 0;if(t.length>8*1024*1024||(i?.length??0)>8*1024*1024)throw new Error("Plugin asset exceeds 8 MB");let n=Xs("sha256").update(t).update("\0").update(i??"").digest("hex");return{clientBytes:t,styleBytes:i,revision:n}}function so(){return(process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS??"").split(to).filter(Boolean).map(r=>Qs(r))}async function oo(r){let e=ti(r);for(;e!==Zs(e).root;)try{return await si(kt(e,"package.json")),e}catch{e=ti(e)}return null}async function ii(r,e){let t=await ni(kt(r,e));if(!t.startsWith(r+eo))throw new Error("Asset escapes package root");let i=await si(t);if(!i.isFile()||i.size>8*1024*1024)throw new Error("Plugin asset is not a regular file under 8 MB");return t}var oe=class r{plugins;errors;extensionRoots;constructor(e,t,i){this.plugins=e,this.errors=t,this.extensionRoots=i}static async discover(e,t,i=so()){let n=no.create(e,void 0,{projectTrusted:t}),s=new ro({cwd:e,agentDir:io(),settingsManager:n}),a=await s.resolve(async()=>"skip"),l=i.length?await s.resolveExtensionSources(i,{temporary:!0}):{extensions:[]},p=new Set;for(let m of[...a.extensions,...l.extensions]){if(!m.enabled)continue;let h=await oo(m.path);h&&p.add(h)}for(let m of i)Ys(m)&&p.add(m);let g=[],u=[],c=[],f=new Set;for(let m of p)try{let h=await ni(m),E=JSON.parse(await vt(kt(h,"package.json"),"utf8"));if(E.piWebapp===void 0)continue;if(typeof E.name!="string"||!E.name)throw new Error("Missing package name");if(!ei(E.piWebapp))throw new Error("Unsupported piWebapp manifest or asset path");if(f.has(E.name))throw new Error(`Duplicate plugin id: ${E.name}`);let x=await ii(h,E.piWebapp.client),I=E.piWebapp.style?await ii(h,E.piWebapp.style):void 0;f.add(E.name),g.push({id:E.name,root:h,manifest:E.piWebapp,clientPath:x,stylePath:I,...await ri(x,I)}),c.push(h)}catch(h){u.push(`${m}: ${h instanceof Error?h.message:String(h)}`)}return g.sort((m,h)=>m.id.localeCompare(h.id)),new r(g,u,c)}has(e){return this.plugins.some(t=>t.id===e)}ids(){return this.plugins.map(e=>e.id)}async refreshAssets(){for(let e of this.plugins)Object.assign(e,await ri(e.clientPath,e.stylePath))}view(){return{plugins:this.plugins.map(e=>({id:e.id,client:`/plugins/${encodeURIComponent(e.id)}/client.js?v=${e.revision}`,...e.stylePath?{style:`/plugins/${encodeURIComponent(e.id)}/client.css?v=${e.revision}`}:{}})),errors:this.errors}}async asset(e){let t=new URL(e,"http://localhost"),i=/^\/plugins\/([^/]+)\/(client\.js|client\.css)$/.exec(t.pathname);if(!i)return null;let n;try{n=decodeURIComponent(i[1])}catch{return null}let s=this.plugins.find(l=>l.id===n);if(!s||t.searchParams.has("v")&&t.searchParams.get("v")!==s.revision)return null;let a=i[2]==="client.js"?s.clientBytes:s.styleBytes;return a?{bytes:a,type:i[2]==="client.js"?"text/javascript; charset=utf-8":"text/css; charset=utf-8"}:null}};import{realpath as ao}from"node:fs/promises";import{SessionManager as co}from"@earendil-works/pi-coding-agent";async function Ce(r,e){let t=await se(r),i=e??await co.listAll(),n=await Promise.all(i.map(async s=>s.cwd!==""&&await ao(s.cwd).catch(()=>null)===t));return i.filter((s,a)=>n[a])}var ae=class{tail=Promise.resolve();run(e){let t=this.tail.then(e);return this.tail=t.catch(()=>{}),t}wrap(e){return(...t)=>this.run(()=>e(...t))}},oi=new WeakMap;function ai(r,e,t,i=5e3,n=()=>{}){let s=oi.get(r);if(s)return s;let a=(async()=>{let l;try{await Promise.race([r.extensionRunner.emit({type:"session_shutdown",reason:e}),new Promise((p,g)=>{l=setTimeout(()=>g(new Error("Plugin shutdown timed out")),i)})])}catch(p){t(p instanceof Error?p.message:String(p))}finally{clearTimeout(l);try{n()}finally{r.dispose()}}})();return oi.set(r,a),a}function ze(r){let t=[...r].reverse().find(i=>i.role==="assistant")?.blocks.filter(i=>i.kind==="text").map(i=>i.text).join(`
35
+ `);return{customType:mt,display:!1,details:{action:"resume"},content:"The user clicked Continue for the interrupted turn. Continue the response to the latest user request from the interrupted point. Preserve completed work and do not repeat text already delivered. Check existing task progress when needed."+(t?`
36
36
  Already displayed assistant text (reference data):
37
- ${JSON.stringify(t)}`:"")}}import{createHash as Zs}from"node:crypto";import{readFile as Qs,writeFile as eo,unlink as to}from"node:fs/promises";import{basename as ro,dirname as io,extname as no,join as so}from"node:path";import{DefaultPackageManager as oo,getAgentDir as ao,SettingsManager as co}from"@earendil-works/pi-coding-agent";var Ce=new Map;async function ri(r,e){let i=await new oo({cwd:r,agentDir:ao(),settingsManager:co.create(r)}).resolveExtensionSources([...e],{temporary:!0}),n=[],s=[],a=async()=>{for(let l of n.splice(0)){let p=(Ce.get(l)??1)-1;p?Ce.set(l,p):(Ce.delete(l),await to(l).catch(()=>{}))}};try{for(let l of i.extensions){if(!l.enabled)continue;let p=no(l.path);if(![".js",".mjs"].includes(p)){s.push(l.path);continue}let h=await Qs(l.path),u=Zs("sha256").update(h).digest("hex"),c=so(io(l.path),`.pi-web-runtime-${ro(l.path,p)}-${u}${p}`);await eo(c,h,{flag:"wx"}).catch(f=>{if(f.code!=="EEXIST")throw f}),Ce.set(c,(Ce.get(c)??0)+1),n.push(c),s.push(c)}return{paths:s,release:a}}catch(l){throw await a(),l}}import{createHash as lo}from"node:crypto";var kt={ENOENT:{kind:"not_found",summary:"no such file or directory"},ENOTDIR:{kind:"not_found",summary:"not a directory"},EACCES:{kind:"permission",summary:"permission denied"},EPERM:{kind:"permission",summary:"operation not permitted"},ETIMEDOUT:{kind:"timeout",summary:"operation timed out"},EINVAL:{kind:"validation",summary:"invalid argument"}},ee=r=>r!==null&&typeof r=="object"?r:void 0,po=[{pattern:/^Could not find (?:the exact text in [^\r\n]+\. The old text|edits\[\d+\] in [^\r\n]+\. The oldText) must match exactly including all whitespace and newlines\.$/,code:"edit_text_not_found",summary:"Edit text does not match the file"},{pattern:/^Found \d+ occurrences of (?:the text in [^\r\n]+\. The text|edits\[\d+\] in [^\r\n]+\. Each oldText) must be unique\. Please provide more context to make it unique\.$/,code:"edit_text_ambiguous",summary:"Edit text matches multiple locations"},{pattern:/^(?:edits\[\d+\]\.)?oldText must not be empty in [^\r\n]+\.$/,code:"invalid_arguments",summary:"Edit oldText must not be empty"},{pattern:/^No changes made to [^\r\n]+\. (?:The replacement produced identical content\. This might indicate an issue with special characters or the text not existing as expected\.|The replacements produced identical content\.)$/,code:"edit_no_change",summary:"Edit replacement produced no changes"},{pattern:/^edits\[\d+\] and edits\[\d+\] overlap in [^\r\n]+\. Merge them into one edit or target disjoint regions\.$/,code:"edit_overlap",summary:"Edit replacements overlap"}];function ni(r,e){let t=r instanceof Error?r:ee(r)?.error instanceof Error?ee(r).error:void 0,i={failureKind:"unknown",summaryOmitted:!0,summaryOmittedReason:"unrecognized_diagnostic",originalStackAvailable:!!t?.stack,level:"error"},n=(u,c,f)=>{Object.assign(i,{failureKind:u,errorCode:c,errorSummary:f.slice(0,512),summaryOmitted:!1,level:t?"error":"warning"}),delete i.summaryOmittedReason},s=ee(t)?.code;if(typeof s=="string"&&kt[s]){let u=kt[s];return n(u.kind,s,`${s}: ${u.summary}`),i}let a=t?.message??"";if(!t){let u=ee(r)?.content;Array.isArray(u)&&(a=u.slice(0,8).flatMap(c=>{let f=ee(c);return f?.type==="text"&&typeof f.text=="string"?[f.text.length>16384?`${f.text.slice(0,8192)}
37
+ ${JSON.stringify(t)}`:"")}}import{createHash as lo}from"node:crypto";import{readFile as po,writeFile as uo,unlink as fo}from"node:fs/promises";import{basename as mo,dirname as go,extname as ho,join as wo}from"node:path";import{DefaultPackageManager as yo,getAgentDir as bo,SettingsManager as vo}from"@earendil-works/pi-coding-agent";var _e=new Map;async function ci(r,e){let i=await new yo({cwd:r,agentDir:bo(),settingsManager:vo.create(r)}).resolveExtensionSources([...e],{temporary:!0}),n=[],s=[],a=async()=>{for(let l of n.splice(0)){let p=(_e.get(l)??1)-1;p?_e.set(l,p):(_e.delete(l),await fo(l).catch(()=>{}))}};try{for(let l of i.extensions){if(!l.enabled)continue;let p=ho(l.path);if(![".js",".mjs"].includes(p)){s.push(l.path);continue}let g=await po(l.path),u=lo("sha256").update(g).digest("hex"),c=wo(go(l.path),`.pi-web-runtime-${mo(l.path,p)}-${u}${p}`);await uo(c,g,{flag:"wx"}).catch(f=>{if(f.code!=="EEXIST")throw f}),_e.set(c,(_e.get(c)??0)+1),n.push(c),s.push(c)}return{paths:s,release:a}}catch(l){throw await a(),l}}import{createHash as ko}from"node:crypto";var Et={ENOENT:{kind:"not_found",summary:"no such file or directory"},ENOTDIR:{kind:"not_found",summary:"not a directory"},EACCES:{kind:"permission",summary:"permission denied"},EPERM:{kind:"permission",summary:"operation not permitted"},ETIMEDOUT:{kind:"timeout",summary:"operation timed out"},EINVAL:{kind:"validation",summary:"invalid argument"}},te=r=>r!==null&&typeof r=="object"?r:void 0,Eo=[{pattern:/^Could not find (?:the exact text in [^\r\n]+\. The old text|edits\[\d+\] in [^\r\n]+\. The oldText) must match exactly including all whitespace and newlines\.$/,code:"edit_text_not_found",summary:"Edit text does not match the file"},{pattern:/^Found \d+ occurrences of (?:the text in [^\r\n]+\. The text|edits\[\d+\] in [^\r\n]+\. Each oldText) must be unique\. Please provide more context to make it unique\.$/,code:"edit_text_ambiguous",summary:"Edit text matches multiple locations"},{pattern:/^(?:edits\[\d+\]\.)?oldText must not be empty in [^\r\n]+\.$/,code:"invalid_arguments",summary:"Edit oldText must not be empty"},{pattern:/^No changes made to [^\r\n]+\. (?:The replacement produced identical content\. This might indicate an issue with special characters or the text not existing as expected\.|The replacements produced identical content\.)$/,code:"edit_no_change",summary:"Edit replacement produced no changes"},{pattern:/^edits\[\d+\] and edits\[\d+\] overlap in [^\r\n]+\. Merge them into one edit or target disjoint regions\.$/,code:"edit_overlap",summary:"Edit replacements overlap"}];function di(r,e){let t=r instanceof Error?r:te(r)?.error instanceof Error?te(r).error:void 0,i={failureKind:"unknown",summaryOmitted:!0,summaryOmittedReason:"unrecognized_diagnostic",originalStackAvailable:!!t?.stack,level:"error"},n=(u,c,f)=>{Object.assign(i,{failureKind:u,errorCode:c,errorSummary:f.slice(0,512),summaryOmitted:!1,level:t?"error":"warning"}),delete i.summaryOmittedReason},s=te(t)?.code;if(typeof s=="string"&&Et[s]){let u=Et[s];return n(u.kind,s,`${s}: ${u.summary}`),i}let a=t?.message??"";if(!t){let u=te(r)?.content;Array.isArray(u)&&(a=u.slice(0,8).flatMap(c=>{let f=te(c);return f?.type==="text"&&typeof f.text=="string"?[f.text.length>16384?`${f.text.slice(0,8192)}
38
38
  [truncated]
39
39
  ${f.text.slice(-8192)}`:f.text]:[]}).join(`
40
- `))}let l=e==="bash"||e==="powershell",p=a.slice(-8192).trimEnd().split(/\r?\n/).at(-1)??"";if(l){let u=p.match(/^Command exited with code (-?\d{1,10})$/),c=p.match(/^Command timed out after (\d+(?:\.\d+)?) seconds$/);if(u&&Number.isSafeInteger(Number(u[1]))&&Number(u[1])!==0)return n("process_exit","nonzero_exit",p),i.exitCode=Number(u[1]),i;if(c&&Number.isFinite(Number(c[1]))&&Number(c[1])>0)return n("timeout","timeout",p),i.timeoutMs=Number(c[1])*1e3,i;if(p==="Command aborted")return n("cancelled","cancelled",p),i}let h=a.slice(0,8192).split(/\r?\n/,1)[0]??"";if(a==="Operation aborted"||t?.name==="AbortError")n("cancelled","cancelled","Operation aborted");else if(a==="Tool execution was blocked")n("blocked","blocked",a);else if(/^Working directory does not exist: [^\n]+\nCannot execute (?:bash|powershell) commands\.$/.test(a))n("not_found","ENOENT","Working directory does not exist");else if(!l||!a.includes(`
41
- `)||/^Validation failed for tool\b/.test(h)){let u=h.match(/^(ENOENT|ENOTDIR|EACCES|EPERM|ETIMEDOUT|EINVAL):/);if(u){let c=kt[u[1]],f=h.match(/, (open|access|stat|lstat|scandir|spawn|read|write|rename|mkdir|unlink)\s/);n(c.kind,u[1],`${u[1]}: ${c.summary}${f?`; operation=${f[1]}`:""}`)}else if(/^Tool [^\r\n]+ not found$/.test(a))n("not_found","tool_not_found","Tool not found");else if(/^Validation failed for tool\b/.test(h)||h==="Edit tool input is invalid. edits must contain at least one replacement."||/^Invalid timeout:/.test(h))n("validation","invalid_arguments",h.startsWith("Invalid timeout:")?"Invalid timeout argument":"Invalid tool arguments");else if(/^Offset \d+ is beyond end of file \(\d+ lines total\)$/.test(a))n("validation","invalid_arguments","Read offset is beyond end of file");else if(e==="edit"){let c=po.find(f=>f.pattern.test(a));c&&n("validation",c.code,c.summary)}}return i}var uo=256;function ii(r,e,t){r.delete(e),r.set(e,t),r.size>uo&&r.delete(r.keys().next().value)}var ge=class{options;pending=new Map;completed=new Map;constructor(e){this.options=e}enabled(){return this.options.enabled()?!0:(this.clear(),!1)}identity(e){return{toolName:Ae.has(e.toolName)?e.toolName:"custom",...Ae.has(e.toolName)?{}:{toolId:lo("sha256").update(e.toolName).digest("hex").slice(0,16)},toolCallId:this.options.anonymize(`tool-call:${e.toolCallId}`)}}breadcrumb(e,t){try{this.options.breadcrumb(e,t)}catch{}}start(e,t={}){try{if(!this.enabled()||this.pending.has(e.toolCallId)||this.completed.has(e.toolCallId))return;let i=e.toolName==="bash"||e.toolName==="powershell"?ee(e.args)?.timeout:void 0,n=typeof i=="number"&&i>0&&Number.isFinite(i*1e3)?i*1e3:void 0,s={...q(t),...this.identity(e),stage:"tool"};ii(this.pending,e.toolCallId,{context:s,started:(this.options.now??performance.now.bind(performance))(),cancelled:!1,timeoutMs:n}),this.breadcrumb("tool_start",s)}catch{}}end(e,t={}){this.finish(e,t,"tool_execution_end")}message(e,t={}){try{if(!this.enabled()||!e.isError)return;this.finish({toolCallId:e.toolCallId,toolName:e.toolName,isError:e.isError,result:{content:e.content}},t,"message_end")}catch{}}finish(e,t,i){try{if(!this.enabled()||this.completed.has(e.toolCallId))return;let n=this.pending.get(e.toolCallId);this.pending.delete(e.toolCallId),ii(this.completed,e.toolCallId,!0);let s={...n?.context??{...q(t),...this.identity(e),stage:"tool"},diagnosticSource:i};if(n&&(s.durationMs=Math.max(0,Math.round((this.options.now??performance.now.bind(performance))()-n.started)),n.timeoutMs!==void 0&&(s.timeoutMs=n.timeoutMs)),!e.isError){this.breadcrumb("tool_end",s);return}let a=e.result instanceof Error?e.result:ee(e.result)?.error instanceof Error?ee(e.result).error:void 0,l=n?.cancelled&&!a?{failureKind:"cancelled",errorCode:"cancelled",level:"warning",originalStackAvailable:!1,summaryOmitted:!0,summaryOmittedReason:"cancelled"}:ni(e.result,e.toolName);if(Object.assign(s,l,{code:"tool_failed"}),this.breadcrumb(l.failureKind==="cancelled"?"tool_cancelled":l.failureKind==="blocked"?"tool_blocked":"tool_failed",s),l.failureKind==="cancelled"||l.failureKind==="blocked")return;let p;a?p=si(a,e.toolName):(p=new Error(`${s.toolName}: ${l.failureKind} (${l.errorCode??"unknown"})`),p.name="ToolResultFailure",p.stack=void 0),this.options.capture(p,s)}catch{}}cancel(){try{if(!this.enabled())return;for(let e of this.pending.values())e.cancelled=!0}catch{}}clear(){this.pending.clear(),this.completed.clear()}};function si(r,e,t=0){let i=ni(r,e),n=new Error(i.errorSummary??"Tool exception (diagnostic text unavailable)");return n.name=r.name,n.stack=r.stack?`${n.name}: ${n.message}
40
+ `))}let l=e==="bash"||e==="powershell",p=a.slice(-8192).trimEnd().split(/\r?\n/).at(-1)??"";if(l){let u=p.match(/^Command exited with code (-?\d{1,10})$/),c=p.match(/^Command timed out after (\d+(?:\.\d+)?) seconds$/);if(u&&Number.isSafeInteger(Number(u[1]))&&Number(u[1])!==0)return n("process_exit","nonzero_exit",p),i.exitCode=Number(u[1]),i;if(c&&Number.isFinite(Number(c[1]))&&Number(c[1])>0)return n("timeout","timeout",p),i.timeoutMs=Number(c[1])*1e3,i;if(p==="Command aborted")return n("cancelled","cancelled",p),i}let g=a.slice(0,8192).split(/\r?\n/,1)[0]??"";if(a==="Operation aborted"||t?.name==="AbortError")n("cancelled","cancelled","Operation aborted");else if(a==="Tool execution was blocked")n("blocked","blocked",a);else if(/^Working directory does not exist: [^\n]+\nCannot execute (?:bash|powershell) commands\.$/.test(a))n("not_found","ENOENT","Working directory does not exist");else if(!l||!a.includes(`
41
+ `)||/^Validation failed for tool\b/.test(g)){let u=g.match(/^(ENOENT|ENOTDIR|EACCES|EPERM|ETIMEDOUT|EINVAL):/);if(u){let c=Et[u[1]],f=g.match(/, (open|access|stat|lstat|scandir|spawn|read|write|rename|mkdir|unlink)\s/);n(c.kind,u[1],`${u[1]}: ${c.summary}${f?`; operation=${f[1]}`:""}`)}else if(/^Tool [^\r\n]+ not found$/.test(a))n("not_found","tool_not_found","Tool not found");else if(/^Validation failed for tool\b/.test(g)||g==="Edit tool input is invalid. edits must contain at least one replacement."||/^Invalid timeout:/.test(g))n("validation","invalid_arguments",g.startsWith("Invalid timeout:")?"Invalid timeout argument":"Invalid tool arguments");else if(/^Offset \d+ is beyond end of file \(\d+ lines total\)$/.test(a))n("validation","invalid_arguments","Read offset is beyond end of file");else if(e==="edit"){let c=Eo.find(f=>f.pattern.test(a));c&&n("validation",c.code,c.summary)}}return i}var Po=256;function li(r,e,t){r.delete(e),r.set(e,t),r.size>Po&&r.delete(r.keys().next().value)}var he=class{options;pending=new Map;completed=new Map;constructor(e){this.options=e}enabled(){return this.options.enabled()?!0:(this.clear(),!1)}identity(e){return{toolName:Re.has(e.toolName)?e.toolName:"custom",...Re.has(e.toolName)?{}:{toolId:ko("sha256").update(e.toolName).digest("hex").slice(0,16)},toolCallId:this.options.anonymize(`tool-call:${e.toolCallId}`)}}breadcrumb(e,t){try{this.options.breadcrumb(e,t)}catch{}}start(e,t={}){try{if(!this.enabled()||this.pending.has(e.toolCallId)||this.completed.has(e.toolCallId))return;let i=e.toolName==="bash"||e.toolName==="powershell"?te(e.args)?.timeout:void 0,n=typeof i=="number"&&i>0&&Number.isFinite(i*1e3)?i*1e3:void 0,s={...q(t),...this.identity(e),stage:"tool"};li(this.pending,e.toolCallId,{context:s,started:(this.options.now??performance.now.bind(performance))(),cancelled:!1,timeoutMs:n}),this.breadcrumb("tool_start",s)}catch{}}end(e,t={}){this.finish(e,t,"tool_execution_end")}message(e,t={}){try{if(!this.enabled()||!e.isError)return;this.finish({toolCallId:e.toolCallId,toolName:e.toolName,isError:e.isError,result:{content:e.content}},t,"message_end")}catch{}}finish(e,t,i){try{if(!this.enabled()||this.completed.has(e.toolCallId))return;let n=this.pending.get(e.toolCallId);this.pending.delete(e.toolCallId),li(this.completed,e.toolCallId,!0);let s={...n?.context??{...q(t),...this.identity(e),stage:"tool"},diagnosticSource:i};if(n&&(s.durationMs=Math.max(0,Math.round((this.options.now??performance.now.bind(performance))()-n.started)),n.timeoutMs!==void 0&&(s.timeoutMs=n.timeoutMs)),!e.isError){this.breadcrumb("tool_end",s);return}let a=e.result instanceof Error?e.result:te(e.result)?.error instanceof Error?te(e.result).error:void 0,l=n?.cancelled&&!a?{failureKind:"cancelled",errorCode:"cancelled",level:"warning",originalStackAvailable:!1,summaryOmitted:!0,summaryOmittedReason:"cancelled"}:di(e.result,e.toolName);if(Object.assign(s,l,{code:"tool_failed"}),this.breadcrumb(l.failureKind==="cancelled"?"tool_cancelled":l.failureKind==="blocked"?"tool_blocked":"tool_failed",s),l.failureKind==="cancelled"||l.failureKind==="blocked")return;let p;a?p=pi(a,e.toolName):(p=new Error(`${s.toolName}: ${l.failureKind} (${l.errorCode??"unknown"})`),p.name="ToolResultFailure",p.stack=void 0),this.options.capture(p,s)}catch{}}cancel(){try{if(!this.enabled())return;for(let e of this.pending.values())e.cancelled=!0}catch{}}clear(){this.pending.clear(),this.completed.clear()}};function pi(r,e,t=0){let i=di(r,e),n=new Error(i.errorSummary??"Tool exception (diagnostic text unavailable)");return n.name=r.name,n.stack=r.stack?`${n.name}: ${n.message}
42
42
  ${r.stack.split(`
43
43
  `).slice(1).join(`
44
- `)}`:void 0,t<3&&r.cause instanceof Error&&(n.cause=si(r.cause,e,t+1)),ue(n)}var Je=class{telemetryVersion=2;runtimeVersion=1;active=null;runtimes=new Map;selectedByWorkspace=new Map;queue=new oe;generation=0;disposed=!1;publish;fallbackModel;isProjectTrusted;reportError;telemetry;onSessionsChanged;constructor(e,t,i=()=>!1,n=()=>{},s={enabled:()=>!1,breadcrumb:()=>{},anonymize:()=>"unavailable"},a=()=>{}){this.publish=e,this.fallbackModel=t,this.isProjectTrusted=i,this.reportError=n,this.onSessionsChanged=a,this.telemetry={enabled:()=>{try{return s.enabled()}catch{return!1}},breadcrumb:(l,p)=>{try{s.enabled()&&s.breadcrumb(l,p)}catch{}},anonymize:l=>{try{return s.enabled()?s.anonymize(l):"unavailable"}catch{return"unavailable"}}}}get session(){return this.active?.session??null}get path(){return this.active?.cwd??null}get catalog(){return this.active?.catalog??null}open(e,t){return this.queue.run(async()=>{this.ensureAvailable();let i=await ne(e),n=t==="continue"?this.selectedByWorkspace.get(i):typeof t=="object"&&"sessionId"in t?this.runtimes.get(t.sessionId):void 0;if(n){if(n.cwd!==i)throw new Error("\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A");this.activate(n);return}if(typeof t=="object"&&"sessionId"in t)throw new Error("\u4F1A\u8BDD\u4E0D\u5B58\u5728");let s;if(t==="new")s=ze.create(i);else if(t==="continue"){let l=(await Ie(i))[0];s=l?ze.open(l.path):ze.create(i)}else s="sessionManager"in t?t.sessionManager:ze.open(t.sessionFile);if(await wo(s.getCwd())!==i)throw new Error("\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A");let a=this.runtimes.get(s.getSessionId());if(a){if(a.cwd!==i)throw new Error("\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A");this.activate(a);return}await this.replace(i,s,t==="new"?"new":"resume")})}reload(){return this.queue.run(async()=>{this.ensureAvailable();let e=this.active;if(!e)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u5DE5\u4F5C\u533A\u4F1A\u8BDD");if(!e.session.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");await this.replace(e.cwd,e.session.sessionManager,"reload")})}ensureAvailable(){if(this.disposed)throw new Error("\u5DE5\u4F5C\u533A\u670D\u52A1\u5DF2\u5173\u95ED")}hasSession(e,t){return this.runtimes.get(t)?.cwd===e}hasWorkspace(e){return this.selectedByWorkspace.has(e)}retainedSessions(){return[...this.runtimes.values()].map(({session:e,cwd:t})=>{let i=e.sessionManager.getBranch(),n=i.flatMap(s=>{let a=$e(s);return a?[a]:[]});return{sessionId:e.sessionManager.getSessionId(),cwd:t,path:e.sessionManager.getSessionFile()??null,idle:e.isIdle,name:je(e.sessionManager.getSessionName(),n),modified:i.at(-1)?.timestamp??new Date().toISOString()}})}activate(e){this.ensureAvailable(),this.active=e,this.selectedByWorkspace.set(e.cwd,e),this.publish({type:"snapshot",session:this.snapshotOf(e)}),this.onSessionsChanged()}publishFor(e,t){!this.disposed&&this.active===e&&!e.closing&&this.publish(t)}diagnostic(e,t,i,n){let s=`plugin=${t} session=${e.session.sessionManager.getSessionId()} generation=${e.generation} stage=${i}: ${n}`;console.error(s),this.publishFor(e,{type:"error",message:s})}async replace(e,t,i){let n=this.runtimes.get(t.getSessionId()),s=await se.discover(e,this.isProjectTrusted(e)),a=mo(),l=await ri(e,s.extensionRoots),p=new go({cwd:e,agentDir:ho(),noExtensions:!0,additionalExtensionPaths:l.paths,eventBus:a}),h=null;try{await p.reload();let u=p.getExtensions().errors;if(u.length)throw new Error(u.map(S=>`${S.path}: ${S.error}`).join("; "));let c=t.buildSessionProjection().model?void 0:this.active?.session.model??this.fallbackModel(),{session:f}=await fo({cwd:e,sessionManager:t,model:c,resourceLoader:p}),m=new ge({enabled:()=>this.telemetry.enabled(),capture:this.reportError,breadcrumb:(S,V)=>this.telemetry.breadcrumb(S,V),anonymize:S=>this.telemetry.anonymize(S)}),g={session:f,cwd:e,catalog:s,bus:a,generation:++this.generation,closing:!1,waitController:new AbortController,interactions:null,detach:()=>{},releasePaths:l.release,tools:m,streaming:null};h=g;let E=S=>this.publishFor(g,S);g.interactions=new me(a,S=>!g.closing&&S.sessionId===f.sessionManager.getSessionId()&&s.has(S.pluginId),()=>E({type:"snapshot",session:this.snapshotOf(g)}));let x=0,I=a.on(Ge,()=>E({type:"snapshot",session:this.snapshotOf(g)})),J=f.subscribe(S=>{if(!this.disposed&&!g.closing){let V={...g.operation,session:this.telemetry.anonymize(f.sessionManager.getSessionId()),piVersion:He,model:f.model?`${f.model.provider}/${f.model.id}`:null,thinkingLevel:f.thinkingLevel};if(S.type==="agent_start"&&this.telemetry.breadcrumb("agent_start",V),S.type==="tool_execution_start"&&m.start(S,V),S.type==="tool_execution_end"&&m.end(S,V),S.type==="message_end"&&S.message.role==="assistant"&&S.message.stopReason==="error"){g.agentErrorReported=!0;let b=this.reportError(new Error("Agent response failed"),{...g.operation,stage:"agent",code:"agent_failed",piVersion:He});E({type:"error",message:S.message.errorMessage??"Agent response failed",errorCode:"unexpected_error",errorId:b,...g.operation})}S.type==="message_end"&&S.message.role==="toolResult"&&m.message(S.message,V),S.type==="agent_settled"&&(this.telemetry.breadcrumb("agent_end",V),m.clear(),g.operation=void 0)}S.type==="message_update"&&S.message.role==="assistant"&&(g.streaming={id:"stream",role:"assistant",timestamp:new Date(S.message.timestamp).toISOString(),blocks:ie(S.message.content)},Date.now()-x>=60&&(x=Date.now(),E({type:"stream",message:g.streaming}))),["message_end","agent_start","agent_settled","session_info_changed","entry_appended"].includes(S.type)&&((S.type==="message_end"&&S.message.role==="assistant"||S.type==="agent_settled")&&(g.streaming=null,E({type:"stream",message:null})),E({type:"snapshot",session:this.snapshotOf(g)}),!this.disposed&&!g.closing&&["message_end","agent_start","agent_settled","session_info_changed"].includes(S.type)&&this.onSessionsChanged())});g.detach=()=>{I(),J()};let Q=[],ce=!0;if(await f.bindExtensions({mode:"print",shutdownHandler:()=>{},onError:S=>{ce&&Q.push(S.error),this.diagnostic(g,s.plugins.find(V=>S.extensionPath.startsWith(V.root+"/"))?.id??S.extensionPath,S.event??"runtime",S.error)}}),ce=!1,Q.length)throw new Error(Q.join("; "));if(this.ensureAvailable(),n&&!n.session.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(n&&await this.close(n,i),this.disposed)throw new Error("\u5DE5\u4F5C\u533A\u670D\u52A1\u5DF2\u5173\u95ED");this.runtimes.set(f.sessionManager.getSessionId(),g),h=null,this.activate(g)}catch(u){throw h?await this.close(h,"quit"):(a.clear(),await l.release()),u}}async close(e,t){e.closing||(e.closing=!0,e.tools.clear(),e.waitController.abort(),e.interactions.dispose(),await ti(e.session,t,i=>this.diagnostic(e,"host","shutdown",i),5e3,()=>{e.detach(),e.bus.clear()}),await e.releasePaths())}snapshotOf(e){let{session:t,cwd:i,catalog:n}=e,s=t.sessionManager.getBranch().flatMap(a=>{let l=$e(a);return l?[l]:[]});return{schemaVersion:1,sessionId:t.sessionManager.getSessionId(),cwd:i,name:je(t.sessionManager.getSessionName(),s),model:t.model?`${t.model.provider}/${t.model.id}`:null,thinkingLevel:t.thinkingLevel,thinkingLevels:t.getAvailableThinkingLevels(),idle:t.isIdle,paused:Se(t.sessionManager.getBranch()),contextUsage:t.getContextUsage()??null,messages:s,streaming:e.streaming,interactions:e.interactions.pending(t.sessionManager.getSessionId()),pluginEntries:mt(t.sessionManager.getBranch(),n.ids())}}snapshot(){if(!this.active)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u5DE5\u4F5C\u533A\u4F1A\u8BDD");return this.snapshotOf(this.active)}async invokePluginAction(e){let t=this.active;if(this.disposed||!t||t.closing||e.sessionId!==t.session.sessionManager.getSessionId())throw new Error("\u4F1A\u8BDD\u5DF2\u5207\u6362");if(!t.catalog.has(e.pluginId))throw new Error("\u63D2\u4EF6\u672A\u542F\u7528");let i=t.session.extensionRunner,n=await Ve(t.bus,e,15e3,t.waitController.signal);if(this.active!==t||t.closing||i!==t.session.extensionRunner)throw new Error("\u4F1A\u8BDD\u8FD0\u884C\u5B9E\u4F8B\u5DF2\u5207\u6362");return this.publish({type:"snapshot",session:this.snapshot()}),n}resolveInteraction(e,t,i,n){if(this.disposed||!this.active||this.active.closing)throw new Error("Interaction host unavailable");this.active.interactions.resolve(e,t,i,n)}async send(e,t=[],i){if(this.disposed||!this.session||this.active?.closing||!this.session.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let n=this.session,s=this.active;s.operation=i,this.telemetry.breadcrumb("send",{...i,piVersion:He}),s.agentErrorReported=!1;let a=!1,l,p,h=new Promise((u,c)=>{l=u,p=c});n.prompt(e,{images:t,preflightResult:u=>{u&&(a=!0,l())}}).then(()=>{a||l()}).catch(u=>{if(!a)p(u);else if(!this.disposed&&!s.closing&&!s.agentErrorReported){let c=this.reportError(Y(u,"Agent response failed"),{...i,stage:"agent",code:"agent_failed",piVersion:He});this.publishFor(s,{type:"error",message:u instanceof Error?u.message:"Pi \u8BF7\u6C42\u5931\u8D25",errorCode:"unexpected_error",errorId:c,...i})}});try{await h}catch(u){throw s.operation=void 0,u}}async stop(){let e=this.active;!e||e.session.isIdle||(e.tools.cancel(),this.telemetry.breadcrumb("cancel",{...e.operation}),e.session.sessionManager.appendCustomEntry(Pe),await e.session.abort(),this.active===e&&!e.closing&&this.publish({type:"snapshot",session:this.snapshotOf(e)}))}async resume(e){let t=this.active;if(this.disposed||!t||t.closing)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");let i=t.session;if(!i.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(!Se(i.sessionManager.getBranch()))throw new Error("\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6682\u505C\u7684\u4EFB\u52A1");if(!i.model)throw new Error("\u8BF7\u5148\u9009\u62E9\u6A21\u578B");if(!(i.modelRuntime.hasConfiguredAuth(i.model.provider)||await i.modelRuntime.checkAuth(i.model.provider)!==void 0))throw new Error("\u8BF7\u5148\u8FDE\u63A5\u5F53\u524D\u6A21\u578B");if(this.active!==t||t.closing)throw new Error("\u4F1A\u8BDD\u5DF2\u5207\u6362");if(!i.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(!Se(i.sessionManager.getBranch()))throw new Error("\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6682\u505C\u7684\u4EFB\u52A1");let s=Ue(this.snapshotOf(t).messages);t.operation=e,t.agentErrorReported=!1,this.telemetry.breadcrumb("resume",{...e}),i.sendCustomMessage(s,{triggerTurn:!0}).catch(a=>{if(!this.disposed&&!t.closing&&!t.agentErrorReported){let l=this.reportError(Y(a,"Agent resume failed"),{...e,stage:"agent",code:"agent_failed"});this.publishFor(t,{type:"error",message:a instanceof Error?a.message:"\u7EE7\u7EED\u5931\u8D25",errorId:l,...e})}})}async models(){return(await this.session?.modelRuntime.getAvailable()??[]).map(t=>({provider:t.provider,id:t.id,name:t.name}))}async setModel(e,t){let i=this.active;if(this.disposed||!i||i.closing||!i.session.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let n=i.session.modelRuntime.getModel(e,t);if(!n)throw new Error("\u6A21\u578B\u4E0D\u53EF\u7528");await i.session.setModel(n),this.publishFor(i,{type:"snapshot",session:this.snapshotOf(i)})}dispose(){return this.disposed=!0,this.queue.run(async()=>{let e=[...this.runtimes.values()];this.active=null,this.runtimes.clear(),this.selectedByWorkspace.clear(),await Promise.all(e.map(t=>this.close(t,"quit")))})}};import{basename as Et,dirname as yo}from"node:path";function oi(r,e){let t=i=>e[i].map(n=>({name:i==="skills"&&Et(n.path).toLowerCase()==="skill.md"?Et(yo(n.path)):Et(n.path),path:n.path,source:n.metadata.source,scope:n.metadata.scope,enabled:n.enabled}));return{packages:r.map(i=>({name:i.source,path:i.installedPath??"",source:i.source,scope:i.scope,enabled:!!i.installedPath})),extensions:t("extensions"),skills:t("skills")}}import{execFile as bo}from"node:child_process";var vo=(r,e)=>new Promise((t,i)=>{bo(r,[...e],{windowsHide:!0},n=>{n?i(n):t()})});async function Pt(r,e=process.platform,t=process.env,i=vo){if(t.PI_WEBAPP_AUTO_OPEN==="0"||t.PI_WEBAPP_RUNTIME==="desktop"||t.SSH_CONNECTION||t.SSH_TTY||t.SSH_CLIENT||e==="linux"&&!t.DISPLAY&&!t.WAYLAND_DISPLAY)return!1;let n=e==="darwin"?"open":e==="linux"?"xdg-open":e==="win32"?"explorer.exe":null;return n===null?!1:(await i(n,[r]),!0)}import{execFile as Io}from"node:child_process";import{randomUUID as Co}from"node:crypto";import{existsSync as pi}from"node:fs";import{access as _o,mkdir as To,readFile as ui,rename as Mo,rm as xt,writeFile as fi}from"node:fs/promises";import{join as G}from"node:path";import{promisify as Ao}from"node:util";import{realpathSync as li,statSync as ko}from"node:fs";import{basename as Eo,delimiter as Po,dirname as ai,join as St,resolve as So}from"node:path";function ci(r){if(!r)return null;try{let e=li(r);return Eo(e)==="npm-cli.js"&&ko(e).isFile()?e:null}catch{return null}}function xo({execPath:r=process.execPath,env:e=process.env}={}){let t=ci(e.npm_execpath);if(t)return t;let i=new Set([ai(r)]);try{i.add(ai(li(r)))}catch{}let n=Object.entries(e).find(([s])=>s.toLowerCase()==="path")?.[1]??"";for(let s of n.split(Po).filter(Boolean))i.add(So(s));for(let s of i)for(let a of[St(s,"node_modules","npm","bin","npm-cli.js"),St(s,"..","lib","node_modules","npm","bin","npm-cli.js"),St(s,"npm")]){let l=ci(a);if(l)return l}throw new Error("\u627E\u4E0D\u5230 npm \u5165\u53E3 npm-cli.js\uFF1B\u8BF7\u5B89\u88C5\u5305\u542B npm \u7684 Node.js\uFF0C\u6216\u5C06 npm \u6240\u5728\u76EE\u5F55\u52A0\u5165 PATH \u540E\u91CD\u542F\u670D\u52A1\u3002")}function di(r){return{file:process.execPath,args:[xo(),...r]}}var Ro=Ao(Io),qe=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/;function Wo(r,e){let t=qe.exec(r),i=qe.exec(e);if(!t||!i)throw new Error("\u7248\u672C\u53F7\u65E0\u6548");for(let n=1;n<=3;n++){let s=Number(t[n])-Number(i[n]);if(s)return s}return!t[4]&&i[4]?1:t[4]&&!i[4]?-1:(t[4]??"").localeCompare(i[4]??"",void 0,{numeric:!0})}async function No(r){try{let e=di(r),{stdout:t}=await Ro(e.file,e.args,{timeout:18e4,maxBuffer:1024*1024,encoding:"utf8",windowsHide:!0});return t}catch(e){let t=e;throw new Error(t.stderr?.trim()||t.message)}}var Ke=class{agentDir;packageRoot;launcherNonce;runNpm;desktopManaged;preparing=!1;restartPending=!1;constructor(e){this.agentDir=e.agentDir,this.packageRoot=e.packageRoot,this.launcherNonce=e.launcherNonce,this.runNpm=e.runNpm??No,this.desktopManaged=e.desktopManaged??process.env.PI_WEBAPP_RUNTIME==="desktop"}async current(){let e=JSON.parse(await ui(G(this.packageRoot,"package.json"),"utf8"));if(e.name!=="pi-webapp"||typeof e.version!="string"||!qe.test(e.version))throw new Error("\u5F53\u524D pi-webapp \u7248\u672C\u65E0\u6548");return e.version}async runningVersion(){return this.current()}async check(){let e=await this.current();if(this.desktopManaged)return{current:e,latest:null,available:!1,canRestart:!1,reason:"\u5F53\u524D\u7531\u684C\u9762\u5E94\u7528\u7BA1\u7406\uFF0C\u8BF7\u5B89\u88C5\u65B0\u7248\u684C\u9762\u5E94\u7528\u8FDB\u884C\u5347\u7EA7\uFF1B\u4E0D\u4F1A\u901A\u8FC7 npm \u4FEE\u6539\u968F\u5305\u8FD0\u884C\u73AF\u5883\u3002"};let t=pi(G(this.packageRoot,".git")),i={current:e,latest:null,available:!1,canRestart:!!this.launcherNonce&&!t};t?i.reason="\u5F53\u524D\u4ECE\u6E90\u7801\u76EE\u5F55\u8FD0\u884C\u3002\u7F51\u9875\u5347\u7EA7\u4EC5\u652F\u6301 npm \u5B89\u88C5\u7684\u7248\u672C\uFF0C\u4EE5\u514D\u8986\u76D6\u672C\u5730\u4EE3\u7801\u3002":i.canRestart||(i.reason="\u5F53\u524D\u9875\u9762\u7531 Pi \u7EC8\u7AEF\u6253\u5F00\uFF0C\u65E0\u6CD5\u4ECE\u7F51\u9875\u81EA\u52A8\u91CD\u542F Pi\uFF1B\u8BF7\u4F7F\u7528 pi-webapp \u542F\u52A8\u5668\u3002");try{let n=JSON.parse((await this.runNpm(["view","pi-webapp","dist-tags.latest","--json","--prefer-online"])).trim()),s=Array.isArray(n)&&n.length===1?n[0]:n;if(typeof s!="string"||!qe.test(s))throw new Error("npm \u8FD4\u56DE\u7684\u7248\u672C\u53F7\u65E0\u6548");i.latest=s,i.available=Wo(s,e)>0}catch(n){throw new Error(`\u68C0\u67E5 npm \u66F4\u65B0\u5931\u8D25\uFF1A${n instanceof Error?n.message:String(n)}`)}return i}async prepare(){if(this.desktopManaged)throw new Error("\u684C\u9762\u5E94\u7528\u7684\u8FD0\u884C\u73AF\u5883\u4E0D\u80FD\u901A\u8FC7\u7F51\u9875\u5347\u7EA7\uFF0C\u8BF7\u5B89\u88C5\u65B0\u7248\u684C\u9762\u5E94\u7528");if(!this.launcherNonce)throw new Error("\u5F53\u524D\u9875\u9762\u65E0\u6CD5\u81EA\u52A8\u91CD\u542F Pi");if(pi(G(this.packageRoot,".git")))throw new Error("\u6E90\u7801\u76EE\u5F55\u4E0D\u80FD\u901A\u8FC7\u7F51\u9875\u5347\u7EA7");if(this.restartPending)throw new Error("\u5347\u7EA7\u5DF2\u5B8C\u6210\uFF0C\u6B63\u5728\u91CD\u542F");if(this.preparing)throw new Error("\u5347\u7EA7\u6B63\u5728\u8FDB\u884C\u4E2D");this.preparing=!0;try{let e=await this.check();if(!e.available||!e.latest)throw new Error("\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C");let t=G(this.agentDir,"pi-web","releases",e.latest);await xt(t,{recursive:!0,force:!0}),await To(t,{recursive:!0});try{await this.runNpm(["install",`pi-webapp@${e.latest}`,"--prefix",t,"--ignore-scripts","--no-save","--no-audit","--no-fund"]);let i=G(t,"node_modules","pi-webapp"),n=JSON.parse(await ui(G(i,"package.json"),"utf8"));if(n.name!=="pi-webapp"||n.version!==e.latest)throw new Error("\u4E0B\u8F7D\u7684\u5305\u4E0E\u76EE\u6807\u7248\u672C\u4E0D\u7B26");let s=G(i,"bin","pi-webapp.mjs");await Promise.all([s,G(i,"dist","extension.js"),G(i,"web","dist","index.html")].map(p=>_o(p)));let a=G(this.agentDir,"pi-web"),l=G(a,`update.${Co()}.tmp`);try{await fi(l,JSON.stringify({version:e.latest,launcher:s}),{mode:384}),await Mo(l,G(a,"update.json"))}finally{await xt(l,{force:!0})}return this.restartPending=!0,{version:e.latest,launcher:s}}catch(i){throw await xt(t,{recursive:!0,force:!0}),i}}finally{this.preparing=!1}}async requestRestart(e){if(this.desktopManaged)throw new Error("\u684C\u9762\u5E94\u7528\u7684\u8FD0\u884C\u73AF\u5883\u4E0D\u80FD\u901A\u8FC7\u7F51\u9875\u91CD\u542F\u5347\u7EA7");if(!this.launcherNonce)throw new Error("\u5F53\u524D\u9875\u9762\u65E0\u6CD5\u81EA\u52A8\u91CD\u542F Pi");try{await fi(G(this.agentDir,"pi-web","launcher.restart"),JSON.stringify({nonce:this.launcherNonce,launcher:e.launcher}),{mode:384})}catch(t){throw this.restartPending=!1,t}}};import{randomUUID as Go}from"node:crypto";async function mi(){if(process.env.PI_WEB_SENTRY_VERIFY_RELEASE!=="true"||process.env.PI_WEB_SENTRY_ENVIRONMENT!=="sentry-verification")throw new Error("Sentry release verification is not enabled");let r=new Z({monitor:!1});try{if(await r.ready,!r.enabled)throw new Error("Sentry verification transport is disabled");let e=r.capture(new Error("Sentry Node release verification"),{stage:"release_verification",code:"sentry_release_probe"});if(!e||!await r.flush(3e3))throw new Error("Sentry verification event was not delivered");return{eventId:e,release:Be,buildId:K}}finally{await r.close()}}var hi=Ct(Oo(Bo(import.meta.url)),import.meta.url.endsWith("/pi-host.ts")?"../../../../web/dist":"../web/dist"),Vo=Symbol.for(`pi-web.bridge-state:${import.meta.url}`),o=globalThis[Vo]??={bridge:null,current:null,commandContext:null,pi:null,replacementContext:null,replacementSessionId:null,lastStreamAt:0,tuiStreaming:null,workspaces:null,workspaceSessions:null,selected:"tui",activeWorkspaceId:null,autoOpened:!1,tuiCatalog:null,stopPluginWatch:null,interactions:null,lifecycle:new oe,tuiGeneration:0,stopChanged:null,tuiWaitController:new AbortController};o.lifecycle??=new oe;o.tuiGeneration??=0;o.stopChanged??=null;o.tuiWaitController??=new AbortController;o.tuiStreaming??=null;function _e(){return o.selected==="sdk"?o.workspaceSessions?.catalog??null:o.tuiCatalog}var Uo=null;function zo(){return Uo??=$o.create({refreshOnCreate:!1})}var Ze=new Map;async function he(){let r=await zo(),e=o.selected==="tui"?o.current?.modelRegistry:void 0,t=new Set(e?.getRegisteredProviderIds()??[]);for(let i of Ze.keys())t.has(i)||(r.unregisterProvider(i),Ze.delete(i));for(let i of t){let n=e?.getRegisteredNativeProvider(i),s=e?.getRegisteredProviderConfig(i),a=n??s;!a||Ze.get(i)===a||(n?r.registerNativeProvider(n):s&&r.registerProvider(i,s),Ze.set(i,a))}return await r.refresh({allowNetwork:!1}),r}function F(){if(o.selected==="sdk")return o.workspaceSessions?.snapshot()??(()=>{throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD")})();if(o.current===null)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD");return{...gt(o.current,o.current.sessionManager.getSessionName(),_e()?.ids()??[]),streaming:o.tuiStreaming,interactions:o.interactions?.pending(o.current.sessionManager.getSessionId())??[]}}function D(r){if(F().sessionId!==r)throw new Error("\u4F1A\u8BDD\u5DF2\u5207\u6362")}async function vi(){let r=(o.workspaces?.list()??[]).map(u=>({...u})),e=o.activeWorkspaceId,t=F(),i=o.current,n=i?gt(i,i.sessionManager.getSessionName(),o.tuiCatalog?.ids()??[]):null,s=await fe(t.cwd).catch(u=>(o.bridge?.reportError?.(u,{stage:"workspace_path"}),null)),a=n?await fe(n.cwd).catch(u=>(o.bridge?.reportError?.(u,{stage:"workspace_path"}),null)):null,l=await bi.listAll(),p=o.workspaceSessions?.retainedSessions()??[];n&&a&&p.push({sessionId:n.sessionId,cwd:a,path:null,name:n.name,modified:n.messages.at(-1)?.timestamp??new Date().toISOString(),idle:n.idle});let h=(await Promise.all(r.map(async u=>{let f=(await Ie(u.path,l).catch(m=>(m instanceof xe?u.available=!1:o.bridge?.reportError?.(m,{stage:"workspace_sessions"}),[]))).map(m=>({id:m.id,workspaceId:u.id,path:m.path,name:m.name||m.firstMessage?.slice(0,50)||"\u5F53\u524D\u4F1A\u8BDD",modified:m.modified.toISOString(),idle:!0}));for(let m of p.filter(g=>g.cwd===u.path)){let g=f.findIndex(x=>x.id===m.sessionId),E={id:m.sessionId,workspaceId:u.id,path:m.path??f[g]?.path??null,name:m.name,modified:m.modified,idle:m.idle};g<0?f.unshift(E):f[g]=E}return u.path===s&&!f.some(m=>m.id===t.sessionId)&&f.unshift({id:t.sessionId,workspaceId:u.id,path:null,name:t.name,modified:new Date().toISOString(),idle:t.idle}),f}))).flat();return{items:r,activeId:e,sessions:h}}var wi=0;async function z(){if(!o.bridge)return;let r=++wi;try{let e=await vi();r===wi&&o.bridge?.publish({type:"workspaces",value:e})}catch(e){o.bridge?.reportError?.(e,{stage:"workspace_list"})}}async function It(r,e=!1){let t=o.workspaces?.get(r);if(!t)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");if(await ne(t.path),!e&&o.current&&t.path===await fe(o.current.cwd)&&!o.workspaceSessions?.hasWorkspace(t.path))o.selected="tui",o.activeWorkspaceId=r,o.bridge?.publish({type:"stream",message:null}),o.bridge?.publish({type:"snapshot",session:F()});else{if(!o.workspaceSessions)throw new Error("Pi \u5DE5\u4F5C\u533A\u670D\u52A1\u4E0D\u53EF\u7528");await o.workspaceSessions.open(t.path,e?"new":"continue"),o.selected="sdk",o.activeWorkspaceId=r,o.bridge?.publish({type:"snapshot",session:F()})}await z()}function H(r){let e=o.current;if(e===null||e.sessionManager.getSessionId()!==r)throw new Error("\u4F1A\u8BDD\u5DF2\u5207\u6362");return e}function O(r){o.current=r,o.selected==="tui"&&o.bridge?.publish({type:"snapshot",session:F()})}function ki(){if(o.current===null)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD");let r=o.selected==="sdk"?o.workspaceSessions?.path:o.current.cwd;if(!r)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u5DE5\u4F5C\u533A");let e=o.selected==="tui"?o.current.isProjectTrusted():o.workspaceSessions?.session?.settingsManager.isProjectTrusted()??!1;return jo.create(r,void 0,{projectTrusted:e})}async function Ei(){let r=ki(),e=n=>({packages:(n.packages??[]).map(s=>typeof s=="string"?s:s.source),extensions:n.extensions??[],skills:n.skills??[]}),t=new yi({cwd:F().cwd,agentDir:ae(),settingsManager:r}),i=oi(t.listConfiguredPackages(),await t.resolve(async()=>"skip"));return{projectTrusted:r.isProjectTrusted(),global:e(r.getGlobalSettings()),project:e(r.getProjectSettings()),installed:i}}async function Ho(r){D(r.sessionId);let e=o.selected==="tui"?H(r.sessionId):null;if(e?!e.isIdle():!o.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let t=ki();if(r.scope==="project"&&!t.isProjectTrusted())throw new Error("\u5F53\u524D\u9879\u76EE\u5C1A\u672A\u53D7\u4FE1\u4EFB\uFF0C\u65E0\u6CD5\u4FEE\u6539\u9879\u76EE\u8BBE\u7F6E");let i=r.value.trim(),n=r.scope==="project"?t.getProjectSettings():t.getGlobalSettings();if(r.kind==="packages"){let s=new yi({cwd:F().cwd,agentDir:ae(),settingsManager:t});r.action==="add"?await s.installAndPersist(i,{local:r.scope==="project"}):await s.removeAndPersist(i,{local:r.scope==="project"})}else if(r.kind==="extensions"){let s=n.extensions??[],a=r.action==="add"?[...new Set([...s,i])]:s.filter(l=>l!==i);r.scope==="project"?t.setProjectExtensionPaths(a):t.setExtensionPaths(a)}else{let s=n.skills??[],a=r.action==="add"?[...new Set([...s,i])]:s.filter(l=>l!==i);r.scope==="project"?t.setProjectSkillPaths(a):t.setSkillPaths(a)}return await t.flush(),o.selected==="tui"?(o.commandContext&&await o.commandContext.reload(),o.current&&O(o.current)):(await o.workspaceSessions?.reload(),o.bridge?.publish({type:"plugins_changed"})),await Ei()}function Qe(r,e=Pt){o.pi=r,o.tools?.clear(),o.tools=new ge({enabled:()=>!!o.telemetry?.enabled&&!!o.bridge,capture:(s,a)=>o.bridge?.reportError?.(s,a),breadcrumb:(s,a)=>o.bridge?.breadcrumb?.(s,a),anonymize:s=>o.telemetry?.session(s)??"unavailable"});let t=s=>({...o.operation,session:o.telemetry?.session(s.sessionManager.getSessionId()),piVersion:Ye,model:s.model?`${s.model.provider}/${s.model.id}`:null,thinkingLevel:s.thinkingLevel});o.interactions?.dispose(),o.interactions=new me(r.events,s=>!!o.bridge&&s.sessionId===o.current?.sessionManager.getSessionId()&&!!o.tuiCatalog?.has(s.pluginId),()=>{o.current&&o.selected==="tui"&&O(o.current)});let i=()=>{o.stopChanged?.(),o.stopChanged=r.events.on(Ge,()=>{o.selected==="tui"&&o.current&&O(o.current)})};i(),r.on("session_start",async(s,a)=>{if(o.tuiStreaming=null,o.tools?.clear(),o.operation=void 0,o.tuiWaitController.abort(),o.tuiWaitController=new AbortController,o.tuiGeneration++,i(),o.current=a,o.bridge){let l=await se.discover(a.cwd,a.isProjectTrusted?.()??!1);if(o.current!==a)return;o.tuiCatalog=l}o.replacementSessionId!==a.sessionManager.getSessionId()&&(o.replacementContext=null,o.replacementSessionId=null),O(a),o.bridge&&o.selected==="tui"&&o.bridge.publish({type:"plugins_changed"}),o.selected==="tui"&&o.workspaces&&o.workspaces.add(a.cwd).then(async l=>{o.selected!=="tui"||o.current?.sessionManager.getSessionId()!==a.sessionManager.getSessionId()||(o.activeWorkspaceId=l.id,await z())}).catch(l=>{o.bridge?.publish({type:"error",message:l instanceof Error?l.message:"\u65E0\u6CD5\u6CE8\u518C\u5F53\u524D\u5DE5\u4F5C\u533A",errorCode:"unexpected_error",errorId:o.bridge.reportError?.(l,{stage:"workspace_register"})})}),process.env.PI_WEBAPP_AUTO_OPEN==="1"&&a.mode==="tui"&&!o.autoOpened&&(o.autoOpened=!0,n(a).catch(l=>{a.ui.notify(l instanceof Error?l.message:"Web \u542F\u52A8\u5931\u8D25","error")}))}),r.on("agent_start",(s,a)=>{o.bridge?.breadcrumb?.("agent_start",t(a)),O(a),z()}),r.on("agent_end",(s,a)=>O(a)),r.on("agent_settled",(s,a)=>{o.bridge?.breadcrumb?.("agent_end",t(a)),o.tools?.clear(),o.operation=void 0,o.tuiStreaming=null,O(a),z()}),r.on("tool_execution_start",(s,a)=>{o.tools?.start(s,t(a))}),r.on("tool_execution_end",(s,a)=>{o.tools?.end(s,t(a))}),r.on("model_select",(s,a)=>O(a)),r.on("thinking_level_select",(s,a)=>O(a)),r.on("message_end",(s,a)=>{if(s.message.role==="assistant"&&s.message.stopReason==="error"){let l=o.bridge?.reportError?.(new Error("Agent response failed"),{...o.operation,stage:"agent",code:"agent_failed",piVersion:Ye});o.selected==="tui"&&o.bridge?.publish({type:"error",message:s.message.errorMessage??"Agent response failed",errorCode:"unexpected_error",errorId:l,...o.operation})}s.message.role==="toolResult"&&o.tools?.message(s.message,t(a)),s.message.role==="assistant"&&(o.tuiStreaming=null),o.selected==="tui"&&s.message.role==="assistant"&&o.bridge?.publish({type:"stream",message:null}),O(a),z()}),r.on("session_info_changed",(s,a)=>O(a)),r.on("message_update",(s,a)=>{if(o.current=a,s.message.role!=="assistant"||(o.tuiStreaming={id:"stream",role:"assistant",timestamp:new Date(s.message.timestamp).toISOString(),blocks:ie(s.message.content)},o.selected!=="tui"||o.bridge===null))return;let l=Date.now();l-o.lastStreamAt<60||(o.lastStreamAt=l,o.bridge.publish({type:"stream",message:o.tuiStreaming}))}),r.on("session_shutdown",async s=>{if(o.tuiStreaming=null,o.tools?.clear(),o.operation=void 0,o.tuiWaitController.abort(),o.tuiGeneration++,o.stopChanged?.(),o.stopChanged=null,o.interactions?.cancelAll(),o.current=null,s.reason==="new"||s.reason==="resume"||s.reason==="fork"||s.reason==="reload")return;let a=o.bridge,l=o.telemetry;o.bridge=null,o.commandContext=null,o.replacementContext=null,o.replacementSessionId=null,o.pi=null;let p=o.workspaceSessions;o.workspaceSessions=null,await p?.dispose(),o.selected="tui",o.activeWorkspaceId=null,o.autoOpened=!1,o.tuiCatalog=null,o.stopPluginWatch?.(),o.stopPluginWatch=null,o.operation=void 0,o.telemetry=null,a?await a.close():await l?.close()});let n=async s=>{o.telemetry??=new Z;try{o.current=s,o.commandContext="newSession"in s?s:null,o.pi=r,o.tuiCatalog=await se.discover(s.cwd,s.isProjectTrusted?.()??!1),o.workspaces===null&&(o.workspaces=new Le(Hr(ae())),await o.workspaces.load());try{await o.workspaces.discover((await bi.listAll()).map(p=>p.cwd))}catch(p){s.ui.notify(`\u65E0\u6CD5\u8BFB\u53D6\u90E8\u5206 Pi \u5386\u53F2\u5DE5\u4F5C\u533A\uFF1A${p instanceof Error?p.message:String(p)}`,"warning")}let a=await o.workspaces.add(s.cwd);if(o.selected==="tui"&&(o.activeWorkspaceId=a.id),o.bridge&&(o.bridge.protocolVersion!==7||o.bridge.buildId!==K||typeof o.bridge.reportError!="function")){let p=o.bridge;if(o.workspaceSessions&&(o.workspaceSessions.telemetryVersion!==2||o.workspaceSessions.runtimeVersion!==1)&&o.workspaceSessions.session&&!o.workspaceSessions.session.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u5DE5\u4F5C\u533A");o.bridge=null,await p.close(),await o.telemetry.close(),o.telemetry=new Z}if(o.bridge===null){let p=o.workspaceSessions&&(o.workspaceSessions.telemetryVersion!==2||o.workspaceSessions.runtimeVersion!==1)?o.workspaceSessions:null,h=p?.session&&p.path?{path:p.path,sessionManager:p.session.sessionManager}:null;p&&(await p.dispose(),o.workspaceSessions=null),o.workspaceSessions??=new Je(c=>{o.selected==="sdk"&&o.bridge?.publish(c)},()=>o.current?.model,c=>{try{return!!o.current&&gi(o.current.cwd)===c&&(o.current.isProjectTrusted?.()??!1)}catch{return!1}},(c,f)=>o.bridge?.reportError?.(c,f),{enabled:()=>!!o.telemetry?.enabled&&!!o.bridge,breadcrumb:(c,f)=>o.bridge?.breadcrumb?.(c,f),anonymize:c=>o.telemetry?.session(c)??"unavailable"},()=>{z()}),h&&await o.workspaceSessions.open(h.path,{sessionManager:h.sessionManager});let u={selfUpdate:new Ke({agentDir:ae(),packageRoot:Ct(hi,"../.."),launcherNonce:process.env.PI_WEBAPP_LAUNCHER_NONCE}),snapshot:F,busyGitWorkspaces:()=>{let c=(o.workspaceSessions?.retainedSessions()??[]).filter(f=>!f.idle).map(f=>f.cwd);if(o.current&&!o.current.isIdle())try{c.push(gi(o.current.cwd))}catch{c.push(o.current.cwd)}return c},plugins:async()=>{let c=_e();return await c?.refreshAssets(),c?.view()??{plugins:[],errors:[]}},pluginAsset:async c=>_e()?.asset(c)??null,async invokePluginAction(c,f,m,g){if(D(c),!_e()?.has(f))throw new Error("\u63D2\u4EF6\u672A\u542F\u7528");let E=o.selected,x=o.tuiGeneration,I=o.workspaceSessions?.session,J={requestId:Go(),sessionId:c,pluginId:f,action:m,input:g},Q=o.selected==="sdk"?await o.workspaceSessions.invokePluginAction(J):await Ve(o.pi.events,J,15e3,o.tuiWaitController.signal);if(D(c),E!==o.selected||(E==="tui"?x!==o.tuiGeneration:I!==o.workspaceSessions?.session))throw new Error("\u4F1A\u8BDD\u8FD0\u884C\u5B9E\u4F8B\u5DF2\u5207\u6362");return o.selected==="tui"&&o.current&&O(o.current),Q},async resolvePluginInteraction(c,f,m,g){if(D(c),!_e()?.has(f))throw new Error("\u63D2\u4EF6\u672A\u542F\u7528");o.selected==="sdk"?o.workspaceSessions.resolveInteraction(c,f,m,g):o.interactions.resolve(c,f,m,g)},image(c,f,m){D(c);let E=(o.selected==="sdk"?o.workspaceSessions?.session?.sessionManager.getBranch():o.current?.sessionManager.getBranch())?.find(I=>I.id===f);if(E?.type!=="message"||E.message.role!=="user"||!Array.isArray(E.message.content))return null;let x=E.message.content[m];return x?.type!=="image"?null:{data:Buffer.from(x.data,"base64"),mimeType:x.mimeType}},async workspaces(){return vi()},async addWorkspace(c,f){let m=await o.workspaces.add(c,f);try{await It(m.id,!0)}catch(g){throw await z(),g}},async selectWorkspace(c){await It(c)},async newSessionInWorkspace(c){await It(c,!0)},async removeWorkspace(c){if(c===o.activeWorkspaceId)throw new Error("\u8BF7\u5148\u5207\u6362\u5230\u5176\u4ED6\u5DE5\u4F5C\u533A");await o.workspaces.remove(c),await z()},async selectSession(c,f,m){let g=o.workspaces?.get(c);if(!g)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");if(await ne(g.path),f===o.current?.sessionManager.getSessionId()&&g.path===await fe(o.current.cwd))o.selected="tui",o.activeWorkspaceId=c,o.bridge?.publish({type:"stream",message:null}),o.bridge?.publish({type:"snapshot",session:F()});else{if(o.selected==="sdk"&&o.workspaceSessions?.session?.sessionManager.getSessionId()===f&&o.workspaceSessions.path===g.path)return;if(o.workspaceSessions?.hasSession(g.path,f))await o.workspaceSessions.open(g.path,{sessionId:f});else{if(!(await Ie(g.path)).some(x=>x.id===f&&x.path===m))throw new Error("\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A");await o.workspaceSessions.open(g.path,{sessionFile:m})}o.selected="sdk",o.activeWorkspaceId=c,o.bridge?.publish({type:"snapshot",session:F()})}await z()},async models(){if(o.selected==="sdk")return o.workspaceSessions?.models()??[];let c=o.current;if(!c)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD");let f=c.scopedModels?.map(m=>`${m.model.provider}/${m.model.id}`)??[];return c.modelRegistry.getAvailable().filter(m=>f.length===0||f.includes(`${m.provider}/${m.id}`)).map(m=>({provider:m.provider,id:m.id,name:m.name}))},async providers(){let c=await he(),f=new Set((await c.listCredentials()).map(m=>m.providerId));return c.getProviders().map(m=>({id:m.id,name:m.name,configured:c.getProviderAuthStatus(m.id).configured,storedCredential:f.has(m.id),methods:[m.auth.apiKey?.login?"api_key":null,m.auth.oauth?"oauth":null].filter(g=>g!==null)}))},async providerModels(c){let f=await he();return Dr(Xe(ae(),"models.json"),c,f)},async updateProviderModel(c,f,m){if(D(c),o.selected==="tui"?!H(c).isIdle():!o.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let g=F().model;if(m.action==="remove"&&g===`${f}/${m.id}`)throw new Error("\u8BF7\u5148\u5207\u6362\u5F53\u524D\u4F7F\u7528\u7684\u6A21\u578B");if(m.action==="save"&&m.originalId&&m.originalId!==m.model.id&&g===`${f}/${m.originalId}`)throw new Error("\u8BF7\u5148\u5207\u6362\u5F53\u524D\u4F7F\u7528\u7684\u6A21\u578B");let E=await he();await Or(Xe(ae(),"models.json"),f,m,E),await E.refresh({providers:[f],allowNetwork:!1}),await o.current?.modelRegistry.refresh({providers:[f],allowNetwork:!1}),await o.workspaceSessions?.session?.modelRuntime.refresh({providers:[f],allowNetwork:!1});let x=m.action==="save"?m.model.id:m.action==="base_url"&&g?.startsWith(`${f}/`)?g.slice(f.length+1):null;if(x&&g===`${f}/${x}`)if(o.selected==="sdk")try{await o.workspaceSessions.setModel(f,x)}catch{throw new Error("\u6A21\u578B\u5DF2\u4FDD\u5B58\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\u8BE5\u6A21\u578B\u4EE5\u5E94\u7528\u65B0\u53C2\u6570")}else{let I=H(c),J=I.modelRegistry.find(f,x);if(!J||!o.pi||!await o.pi.setModel(J))throw new Error("\u6A21\u578B\u5DF2\u4FDD\u5B58\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\u8BE5\u6A21\u578B\u4EE5\u5E94\u7528\u65B0\u53C2\u6570");O(I)}},async logoutProvider(c,f){if(D(c),o.selected==="tui"?!H(c).isIdle():!o.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let m=await he();if(!(await m.listCredentials()).some(g=>g.providerId===f))throw new Error("\u8BE5\u63D0\u4F9B\u65B9\u6CA1\u6709\u5DF2\u4FDD\u5B58\u7684\u8BA4\u8BC1");await m.logout(f),await o.current?.modelRegistry.refresh({providers:[f],allowNetwork:!1}),await o.workspaceSessions?.session?.modelRuntime.refresh({providers:[f],allowNetwork:!1})},async loginProvider(c,f,m){let g=await he();await g.login(c,f,Tr(c,f,m)),await g.refresh({providers:[c],allowNetwork:!1}),await o.current?.modelRegistry.refresh({providers:[c],allowNetwork:!1}),await o.workspaceSessions?.session?.modelRuntime.refresh({providers:[c],allowNetwork:!1})},async addCustomProvider(c,f){if(D(c),o.selected==="tui"?!H(c).isIdle():!o.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let m=await he();if(m.getProvider(f.id))throw new Error("\u63D0\u4F9B\u65B9\u5DF2\u5B58\u5728");await Mr(Xe(ae(),"models.json"),f),await m.refresh({allowNetwork:!1}),await o.current?.modelRegistry.refresh({allowNetwork:!1}),await o.workspaceSessions?.session?.modelRuntime.refresh({allowNetwork:!1})},commands(){return o.selected==="tui"?(o.pi?.getCommands()??[]).filter(c=>c.name!=="web"&&c.name!=="web-dev-reload").map(c=>({name:c.name,description:c.description})):[]},async compact(c){if(D(c),o.selected==="sdk"){let m=o.workspaceSessions?.session;if(!m||!m.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");await m.compact(),o.bridge?.publish({type:"snapshot",session:F()});return}let f=H(c);if(!f.isIdle())throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");f.compact()},async setModel(c,f,m){if(D(c),o.selected==="sdk"){await o.workspaceSessions.setModel(f,m);return}let g=H(c);if(!g.isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let E=g.modelRegistry.find(f,m);if(!E||!g.modelRegistry.getAvailable().some(x=>x.provider===f&&x.id===m))throw new Error("\u6A21\u578B\u4E0D\u53EF\u7528");if(!o.pi||!await o.pi.setModel(E))throw new Error("\u6A21\u578B\u63D0\u4F9B\u65B9\u672A\u914D\u7F6E\u8BA4\u8BC1");O(g)},async setThinkingLevel(c,f){if(D(c),!["off","minimal","low","medium","high","xhigh"].includes(f))throw new Error("\u63A8\u7406\u5F3A\u5EA6\u65E0\u6548");if(o.selected==="sdk"){let E=o.workspaceSessions?.session;if(!E||!E.isIdle||!E.getAvailableThinkingLevels().includes(f))throw new Error("\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u6B64\u63A8\u7406\u5F3A\u5EA6");E.setThinkingLevel(f),o.bridge?.publish({type:"snapshot",session:F()});return}let g=H(c);if(!g.isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(!g.model||!Lo(g.model).includes(f))throw new Error("\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u6B64\u63A8\u7406\u5F3A\u5EA6");if(!o.pi)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");o.pi.setThinkingLevel(f),O(g)},config:Ei,updateConfig:Ho,async send(c,f,m=[],g){if(D(c),o.selected==="sdk"){await o.workspaceSessions.send(f,m,g);return}if(!H(c).isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");o.operation=g;try{if(o.bridge?.breadcrumb?.("send",{...g,piVersion:Ye}),o.replacementContext!==null&&o.replacementSessionId===c){await o.replacementContext.sendUserMessage(m.length?[{type:"text",text:f},...m]:f,{expandPromptTemplates:!0});return}if(o.pi===null)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");o.pi.sendUserMessage(m.length?[{type:"text",text:f},...m]:f,{expandPromptTemplates:!0})}catch(x){throw o.operation=void 0,x}},async abort(c){if(D(c),o.selected==="sdk")await o.workspaceSessions.stop();else{let f=H(c);if(f.isIdle())return;if(!o.pi)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");o.tools?.cancel(),o.bridge?.breadcrumb?.("cancel",{...o.operation}),o.pi.appendEntry(Pe),f.abort()}},async resume(c,f){if(D(c),o.selected==="sdk"){await o.workspaceSessions.resume(f);return}let m=H(c);if(!m.isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(!m.model||!o.pi)throw new Error("\u8BF7\u5148\u9009\u62E9\u6A21\u578B");if(!m.modelRegistry.hasConfiguredAuth(m.model))throw new Error("\u8BF7\u5148\u8FDE\u63A5\u5F53\u524D\u6A21\u578B");o.operation=f;try{o.pi.sendMessage(Ue(F().messages),{triggerTurn:!0})}catch(g){throw o.operation=void 0,g}},async newSession(c){if(D(c),o.selected==="sdk"){let g=o.workspaces?.get(o.activeWorkspaceId??"");if(!g)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");await o.workspaceSessions.open(g.path,"new"),await z();return}let f=H(c);if(!f.isIdle()||o.commandContext===null){await o.workspaceSessions.open(f.cwd,"new"),o.selected="sdk",o.bridge?.publish({type:"snapshot",session:F()}),await z();return}if((await o.commandContext.newSession({withSession:async g=>{o.commandContext=g,o.replacementContext=g,o.replacementSessionId=g.sessionManager.getSessionId(),o.current=g}})).cancelled)throw new Error("\u65B0\u4F1A\u8BDD\u5DF2\u53D6\u6D88");await z()}};u.addWorkspace=o.lifecycle.wrap(u.addWorkspace),u.selectWorkspace=o.lifecycle.wrap(u.selectWorkspace),u.newSessionInWorkspace=o.lifecycle.wrap(u.newSessionInWorkspace),u.removeWorkspace=o.lifecycle.wrap(u.removeWorkspace),u.selectSession=o.lifecycle.wrap(u.selectSession),u.newSession=o.lifecycle.wrap(u.newSession),u.updateConfig=o.lifecycle.wrap(u.updateConfig),o.bridge=await Lr(u,hi,o.telemetry)}if(o.stopPluginWatch===null&&process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS){let p=[],h=null;for(let u of(process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS??"").split(Do).filter(Boolean))try{p.push(Fo(Xe(Ct(u),"dist"),(c,f)=>{let m=String(f??"");["client.js","client.css"].includes(m)&&(h&&clearTimeout(h),h=setTimeout(()=>o.bridge?.publish({type:"plugins_changed"}),180))}))}catch(c){o.bridge?.publish({type:"error",message:`\u63D2\u4EF6\u76D1\u542C\u5931\u8D25\uFF1A${u}: ${String(c)}`})}o.stopPluginWatch=()=>{for(let u of p)u.close();h&&clearTimeout(h)}}let l=await e(o.bridge.url).catch(()=>!1);s.ui.notify(`pi-webapp: ${o.bridge.url}`,l?"info":"warning"),s.ui.setStatus("pi-webapp","Web \u5DF2\u542F\u52A8 \xB7 /web \u91CD\u65B0\u6253\u5F00")}catch(a){throw o.telemetry?.capture(a,{stage:"open_web",piVersion:Ye}),o.bridge||(await o.telemetry?.close(),o.telemetry=null),a}};r.registerCommand("web",{description:"Open the current Pi session in a local web interface",handler:async(s,a)=>n(a)}),r.registerCommand("web-dev-reload",{description:"Reload local pi-webapp plugins during development",handler:async(s,a)=>{process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS&&(await a.waitForIdle(),await o.lifecycle.run(async()=>{let l=o.workspaceSessions?.session;l&&(await l.waitForIdle(),await o.workspaceSessions.reload()),await a.reload()}))}})}var Zd=Qe;export{Zd as default,mi as verifySentryNodeRelease};
44
+ `)}`:void 0,t<3&&r.cause instanceof Error&&(n.cause=pi(r.cause,e,t+1)),fe(n)}var qe=class{telemetryVersion=2;runtimeVersion=1;active=null;runtimes=new Map;selectedByWorkspace=new Map;queue=new ae;generation=0;disposed=!1;publish;fallbackModel;isProjectTrusted;reportError;telemetry;onSessionsChanged;constructor(e,t,i=()=>!1,n=()=>{},s={enabled:()=>!1,breadcrumb:()=>{},anonymize:()=>"unavailable"},a=()=>{}){this.publish=e,this.fallbackModel=t,this.isProjectTrusted=i,this.reportError=n,this.onSessionsChanged=a,this.telemetry={enabled:()=>{try{return s.enabled()}catch{return!1}},breadcrumb:(l,p)=>{try{s.enabled()&&s.breadcrumb(l,p)}catch{}},anonymize:l=>{try{return s.enabled()?s.anonymize(l):"unavailable"}catch{return"unavailable"}}}}get session(){return this.active?.session??null}get path(){return this.active?.cwd??null}get catalog(){return this.active?.catalog??null}open(e,t){return this.queue.run(async()=>{this.ensureAvailable();let i=await se(e),n=t==="continue"?this.selectedByWorkspace.get(i):typeof t=="object"&&"sessionId"in t?this.runtimes.get(t.sessionId):void 0;if(n){if(n.cwd!==i)throw new Error("\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A");this.activate(n);return}if(typeof t=="object"&&"sessionId"in t)throw new Error("\u4F1A\u8BDD\u4E0D\u5B58\u5728");let s;if(t==="new")s=He.create(i);else if(t==="continue"){let l=(await Ce(i))[0];s=l?He.open(l.path):He.create(i)}else s="sessionManager"in t?t.sessionManager:He.open(t.sessionFile);if(await _o(s.getCwd())!==i)throw new Error("\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A");let a=this.runtimes.get(s.getSessionId());if(a){if(a.cwd!==i)throw new Error("\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A");this.activate(a);return}await this.replace(i,s,t==="new"?"new":"resume")})}reload(){return this.queue.run(async()=>{this.ensureAvailable();let e=this.active;if(!e)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u5DE5\u4F5C\u533A\u4F1A\u8BDD");if(!e.session.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");await this.replace(e.cwd,e.session.sessionManager,"reload")})}ensureAvailable(){if(this.disposed)throw new Error("\u5DE5\u4F5C\u533A\u670D\u52A1\u5DF2\u5173\u95ED")}hasSession(e,t){return this.runtimes.get(t)?.cwd===e}hasWorkspace(e){return this.selectedByWorkspace.has(e)}retainedSessions(){return[...this.runtimes.values()].map(({session:e,cwd:t})=>{let i=e.sessionManager.getBranch(),n=i.flatMap(s=>{let a=je(s);return a?[a]:[]});return{sessionId:e.sessionManager.getSessionId(),cwd:t,path:e.sessionManager.getSessionFile()??null,idle:e.isIdle,name:Le(e.sessionManager.getSessionName(),n),modified:i.at(-1)?.timestamp??new Date().toISOString()}})}activate(e){this.ensureAvailable(),this.active=e,this.selectedByWorkspace.set(e.cwd,e),this.publish({type:"snapshot",session:this.snapshotOf(e)}),this.onSessionsChanged()}publishFor(e,t){!this.disposed&&this.active===e&&!e.closing&&this.publish(t)}diagnostic(e,t,i,n){let s=`plugin=${t} session=${e.session.sessionManager.getSessionId()} generation=${e.generation} stage=${i}: ${n}`;console.error(s),this.publishFor(e,{type:"error",message:s})}async replace(e,t,i){let n=this.runtimes.get(t.getSessionId()),s=await oe.discover(e,this.isProjectTrusted(e)),a=xo(),l=await ci(e,s.extensionRoots),p=new Io({cwd:e,agentDir:Co(),noExtensions:!0,additionalExtensionPaths:l.paths,eventBus:a}),g=null;try{await p.reload();let u=p.getExtensions().errors;if(u.length)throw new Error(u.map(S=>`${S.path}: ${S.error}`).join("; "));let c=t.buildSessionProjection().model?void 0:this.active?.session.model??this.fallbackModel(),{session:f}=await So({cwd:e,sessionManager:t,model:c,resourceLoader:p}),m=new he({enabled:()=>this.telemetry.enabled(),capture:this.reportError,breadcrumb:(S,V)=>this.telemetry.breadcrumb(S,V),anonymize:S=>this.telemetry.anonymize(S)}),h={session:f,cwd:e,catalog:s,bus:a,generation:++this.generation,closing:!1,waitController:new AbortController,interactions:null,detach:()=>{},releasePaths:l.release,tools:m,streaming:null};g=h;let E=S=>this.publishFor(h,S);h.interactions=new ge(a,S=>!h.closing&&S.sessionId===f.sessionManager.getSessionId()&&s.has(S.pluginId),()=>E({type:"snapshot",session:this.snapshotOf(h)}));let x=0,I=a.on(Ve,()=>E({type:"snapshot",session:this.snapshotOf(h)})),J=f.subscribe(S=>{if(!this.disposed&&!h.closing){let V={...h.operation,session:this.telemetry.anonymize(f.sessionManager.getSessionId()),piVersion:Je,model:f.model?`${f.model.provider}/${f.model.id}`:null,thinkingLevel:f.thinkingLevel};if(S.type==="agent_start"&&this.telemetry.breadcrumb("agent_start",V),S.type==="tool_execution_start"&&m.start(S,V),S.type==="tool_execution_end"&&m.end(S,V),S.type==="message_end"&&S.message.role==="assistant"&&S.message.stopReason==="error"){h.agentErrorReported=!0;let b=this.reportError(new Error("Agent response failed"),{...h.operation,stage:"agent",code:"agent_failed",piVersion:Je});E({type:"error",message:S.message.errorMessage??"Agent response failed",errorCode:"unexpected_error",errorId:b,...h.operation})}S.type==="message_end"&&S.message.role==="toolResult"&&m.message(S.message,V),S.type==="agent_settled"&&(this.telemetry.breadcrumb("agent_end",V),m.clear(),h.operation=void 0)}S.type==="message_update"&&S.message.role==="assistant"&&(h.streaming={id:"stream",role:"assistant",timestamp:new Date(S.message.timestamp).toISOString(),blocks:ne(S.message.content)},Date.now()-x>=60&&(x=Date.now(),E({type:"stream",message:h.streaming}))),["message_end","agent_start","agent_settled","session_info_changed","entry_appended"].includes(S.type)&&((S.type==="message_end"&&S.message.role==="assistant"||S.type==="agent_settled")&&(h.streaming=null,E({type:"stream",message:null})),E({type:"snapshot",session:this.snapshotOf(h)}),!this.disposed&&!h.closing&&["message_end","agent_start","agent_settled","session_info_changed"].includes(S.type)&&this.onSessionsChanged())});h.detach=()=>{I(),J()};let ee=[],le=!0;if(await f.bindExtensions({mode:"print",shutdownHandler:()=>{},onError:S=>{le&&ee.push(S.error),this.diagnostic(h,s.plugins.find(V=>S.extensionPath.startsWith(V.root+"/"))?.id??S.extensionPath,S.event??"runtime",S.error)}}),le=!1,ee.length)throw new Error(ee.join("; "));if(this.ensureAvailable(),n&&!n.session.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(n&&await this.close(n,i),this.disposed)throw new Error("\u5DE5\u4F5C\u533A\u670D\u52A1\u5DF2\u5173\u95ED");this.runtimes.set(f.sessionManager.getSessionId(),h),g=null,this.activate(h)}catch(u){throw g?await this.close(g,"quit"):(a.clear(),await l.release()),u}}async close(e,t){e.closing||(e.closing=!0,e.tools.clear(),e.waitController.abort(),e.interactions.dispose(),await ai(e.session,t,i=>this.diagnostic(e,"host","shutdown",i),5e3,()=>{e.detach(),e.bus.clear()}),await e.releasePaths())}snapshotOf(e){let{session:t,cwd:i,catalog:n}=e,s=t.sessionManager.getBranch().flatMap(a=>{let l=je(a);return l?[l]:[]});return{schemaVersion:1,sessionId:t.sessionManager.getSessionId(),cwd:i,name:Le(t.sessionManager.getSessionName(),s),model:t.model?`${t.model.provider}/${t.model.id}`:null,thinkingLevel:t.thinkingLevel,thinkingLevels:t.getAvailableThinkingLevels(),idle:t.isIdle,paused:xe(t.sessionManager.getBranch()),contextUsage:t.getContextUsage()??null,messages:s,streaming:e.streaming,interactions:e.interactions.pending(t.sessionManager.getSessionId()),pluginEntries:gt(t.sessionManager.getBranch(),n.ids())}}snapshot(){if(!this.active)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u5DE5\u4F5C\u533A\u4F1A\u8BDD");return this.snapshotOf(this.active)}async invokePluginAction(e){let t=this.active;if(this.disposed||!t||t.closing||e.sessionId!==t.session.sessionManager.getSessionId())throw new Error("\u4F1A\u8BDD\u5DF2\u5207\u6362");if(!t.catalog.has(e.pluginId))throw new Error("\u63D2\u4EF6\u672A\u542F\u7528");let i=t.session.extensionRunner,n=await Ue(t.bus,e,15e3,t.waitController.signal);if(this.active!==t||t.closing||i!==t.session.extensionRunner)throw new Error("\u4F1A\u8BDD\u8FD0\u884C\u5B9E\u4F8B\u5DF2\u5207\u6362");return this.publish({type:"snapshot",session:this.snapshot()}),n}resolveInteraction(e,t,i,n){if(this.disposed||!this.active||this.active.closing)throw new Error("Interaction host unavailable");this.active.interactions.resolve(e,t,i,n)}async send(e,t=[],i){if(this.disposed||!this.session||this.active?.closing||!this.session.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let n=this.session,s=this.active;s.operation=i,this.telemetry.breadcrumb("send",{...i,piVersion:Je}),s.agentErrorReported=!1;let a=!1,l,p,g=new Promise((u,c)=>{l=u,p=c});n.prompt(e,{images:t,preflightResult:u=>{u&&(a=!0,l())}}).then(()=>{a||l()}).catch(u=>{if(!a)p(u);else if(!this.disposed&&!s.closing&&!s.agentErrorReported){let c=this.reportError(Y(u,"Agent response failed"),{...i,stage:"agent",code:"agent_failed",piVersion:Je});this.publishFor(s,{type:"error",message:u instanceof Error?u.message:"Pi \u8BF7\u6C42\u5931\u8D25",errorCode:"unexpected_error",errorId:c,...i})}});try{await g}catch(u){throw s.operation=void 0,u}}async stop(){let e=this.active;!e||e.session.isIdle||(e.tools.cancel(),this.telemetry.breadcrumb("cancel",{...e.operation}),e.session.sessionManager.appendCustomEntry(Se),await e.session.abort(),this.active===e&&!e.closing&&this.publish({type:"snapshot",session:this.snapshotOf(e)}))}async resume(e){let t=this.active;if(this.disposed||!t||t.closing)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");let i=t.session;if(!i.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(!xe(i.sessionManager.getBranch()))throw new Error("\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6682\u505C\u7684\u4EFB\u52A1");if(!i.model)throw new Error("\u8BF7\u5148\u9009\u62E9\u6A21\u578B");if(!(i.modelRuntime.hasConfiguredAuth(i.model.provider)||await i.modelRuntime.checkAuth(i.model.provider)!==void 0))throw new Error("\u8BF7\u5148\u8FDE\u63A5\u5F53\u524D\u6A21\u578B");if(this.active!==t||t.closing)throw new Error("\u4F1A\u8BDD\u5DF2\u5207\u6362");if(!i.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(!xe(i.sessionManager.getBranch()))throw new Error("\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6682\u505C\u7684\u4EFB\u52A1");let s=ze(this.snapshotOf(t).messages);t.operation=e,t.agentErrorReported=!1,this.telemetry.breadcrumb("resume",{...e}),i.sendCustomMessage(s,{triggerTurn:!0}).catch(a=>{if(!this.disposed&&!t.closing&&!t.agentErrorReported){let l=this.reportError(Y(a,"Agent resume failed"),{...e,stage:"agent",code:"agent_failed"});this.publishFor(t,{type:"error",message:a instanceof Error?a.message:"\u7EE7\u7EED\u5931\u8D25",errorId:l,...e})}})}async models(){return(await this.session?.modelRuntime.getAvailable()??[]).map(t=>({provider:t.provider,id:t.id,name:t.name}))}async setModel(e,t){let i=this.active;if(this.disposed||!i||i.closing||!i.session.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let n=i.session.modelRuntime.getModel(e,t);if(!n)throw new Error("\u6A21\u578B\u4E0D\u53EF\u7528");await i.session.setModel(n),this.publishFor(i,{type:"snapshot",session:this.snapshotOf(i)})}dispose(){return this.disposed=!0,this.queue.run(async()=>{let e=[...this.runtimes.values()];this.active=null,this.runtimes.clear(),this.selectedByWorkspace.clear(),await Promise.all(e.map(t=>this.close(t,"quit")))})}};import{basename as Pt,dirname as To}from"node:path";function ui(r,e){let t=i=>e[i].map(n=>({name:i==="skills"&&Pt(n.path).toLowerCase()==="skill.md"?Pt(To(n.path)):Pt(n.path),path:n.path,source:n.metadata.source,scope:n.metadata.scope,enabled:n.enabled}));return{packages:r.map(i=>({name:i.source,path:i.installedPath??"",source:i.source,scope:i.scope,enabled:!!i.installedPath})),extensions:t("extensions"),skills:t("skills")}}import{execFile as Mo}from"node:child_process";var Ao=(r,e)=>new Promise((t,i)=>{Mo(r,[...e],{windowsHide:!0},n=>{n?i(n):t()})});async function St(r,e=process.platform,t=process.env,i=Ao){if(t.PI_WEBAPP_AUTO_OPEN==="0"||t.PI_WEBAPP_RUNTIME==="desktop"||t.SSH_CONNECTION||t.SSH_TTY||t.SSH_CLIENT||e==="linux"&&!t.DISPLAY&&!t.WAYLAND_DISPLAY)return!1;let n=e==="darwin"?"open":e==="linux"?"xdg-open":e==="win32"?"explorer.exe":null;return n===null?!1:(await i(n,[r]),!0)}import{execFile as Fo}from"node:child_process";import{randomUUID as Bo}from"node:crypto";import{existsSync as wi}from"node:fs";import{access as $o,mkdir as jo,readFile as yi,rename as Lo,rm as It,writeFile as bi}from"node:fs/promises";import{join as G}from"node:path";import{promisify as Go}from"node:util";import{realpathSync as gi,statSync as Ro}from"node:fs";import{basename as No,delimiter as Wo,dirname as fi,join as xt,resolve as Do}from"node:path";function mi(r){if(!r)return null;try{let e=gi(r);return No(e)==="npm-cli.js"&&Ro(e).isFile()?e:null}catch{return null}}function Oo({execPath:r=process.execPath,env:e=process.env}={}){let t=mi(e.npm_execpath);if(t)return t;let i=new Set([fi(r)]);try{i.add(fi(gi(r)))}catch{}let n=Object.entries(e).find(([s])=>s.toLowerCase()==="path")?.[1]??"";for(let s of n.split(Wo).filter(Boolean))i.add(Do(s));for(let s of i)for(let a of[xt(s,"node_modules","npm","bin","npm-cli.js"),xt(s,"..","lib","node_modules","npm","bin","npm-cli.js"),xt(s,"npm")]){let l=mi(a);if(l)return l}throw new Error("\u627E\u4E0D\u5230 npm \u5165\u53E3 npm-cli.js\uFF1B\u8BF7\u5B89\u88C5\u5305\u542B npm \u7684 Node.js\uFF0C\u6216\u5C06 npm \u6240\u5728\u76EE\u5F55\u52A0\u5165 PATH \u540E\u91CD\u542F\u670D\u52A1\u3002")}function hi(r){return{file:process.execPath,args:[Oo(),...r]}}var Vo=Go(Fo),Ke=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/;function Uo(r,e){let t=Ke.exec(r),i=Ke.exec(e);if(!t||!i)throw new Error("\u7248\u672C\u53F7\u65E0\u6548");for(let n=1;n<=3;n++){let s=Number(t[n])-Number(i[n]);if(s)return s}return!t[4]&&i[4]?1:t[4]&&!i[4]?-1:(t[4]??"").localeCompare(i[4]??"",void 0,{numeric:!0})}async function zo(r){try{let e=hi(r),{stdout:t}=await Vo(e.file,e.args,{timeout:18e4,maxBuffer:1024*1024,encoding:"utf8",windowsHide:!0});return t}catch(e){let t=e;throw new Error(t.stderr?.trim()||t.message)}}var Xe=class{agentDir;packageRoot;launcherNonce;runNpm;desktopManaged;preparing=!1;restartPending=!1;constructor(e){this.agentDir=e.agentDir,this.packageRoot=e.packageRoot,this.launcherNonce=e.launcherNonce,this.runNpm=e.runNpm??zo,this.desktopManaged=e.desktopManaged??process.env.PI_WEBAPP_RUNTIME==="desktop"}async current(){let e=JSON.parse(await yi(G(this.packageRoot,"package.json"),"utf8"));if(e.name!=="pi-webapp"||typeof e.version!="string"||!Ke.test(e.version))throw new Error("\u5F53\u524D pi-webapp \u7248\u672C\u65E0\u6548");return e.version}async runningVersion(){return this.current()}async check(){let e=await this.current();if(this.desktopManaged)return{current:e,latest:null,available:!1,canRestart:!1,reason:"\u5F53\u524D\u7531\u684C\u9762\u5E94\u7528\u7BA1\u7406\uFF0C\u8BF7\u5B89\u88C5\u65B0\u7248\u684C\u9762\u5E94\u7528\u8FDB\u884C\u5347\u7EA7\uFF1B\u4E0D\u4F1A\u901A\u8FC7 npm \u4FEE\u6539\u968F\u5305\u8FD0\u884C\u73AF\u5883\u3002"};let t=wi(G(this.packageRoot,".git")),i={current:e,latest:null,available:!1,canRestart:!!this.launcherNonce&&!t};t?i.reason="\u5F53\u524D\u4ECE\u6E90\u7801\u76EE\u5F55\u8FD0\u884C\u3002\u7F51\u9875\u5347\u7EA7\u4EC5\u652F\u6301 npm \u5B89\u88C5\u7684\u7248\u672C\uFF0C\u4EE5\u514D\u8986\u76D6\u672C\u5730\u4EE3\u7801\u3002":i.canRestart||(i.reason="\u5F53\u524D\u9875\u9762\u7531 Pi \u7EC8\u7AEF\u6253\u5F00\uFF0C\u65E0\u6CD5\u4ECE\u7F51\u9875\u81EA\u52A8\u91CD\u542F Pi\uFF1B\u8BF7\u4F7F\u7528 pi-webapp \u542F\u52A8\u5668\u3002");try{let n=JSON.parse((await this.runNpm(["view","pi-webapp","dist-tags.latest","--json","--prefer-online"])).trim()),s=Array.isArray(n)&&n.length===1?n[0]:n;if(typeof s!="string"||!Ke.test(s))throw new Error("npm \u8FD4\u56DE\u7684\u7248\u672C\u53F7\u65E0\u6548");i.latest=s,i.available=Uo(s,e)>0}catch(n){throw new Error(`\u68C0\u67E5 npm \u66F4\u65B0\u5931\u8D25\uFF1A${n instanceof Error?n.message:String(n)}`)}return i}async prepare(){if(this.desktopManaged)throw new Error("\u684C\u9762\u5E94\u7528\u7684\u8FD0\u884C\u73AF\u5883\u4E0D\u80FD\u901A\u8FC7\u7F51\u9875\u5347\u7EA7\uFF0C\u8BF7\u5B89\u88C5\u65B0\u7248\u684C\u9762\u5E94\u7528");if(!this.launcherNonce)throw new Error("\u5F53\u524D\u9875\u9762\u65E0\u6CD5\u81EA\u52A8\u91CD\u542F Pi");if(wi(G(this.packageRoot,".git")))throw new Error("\u6E90\u7801\u76EE\u5F55\u4E0D\u80FD\u901A\u8FC7\u7F51\u9875\u5347\u7EA7");if(this.restartPending)throw new Error("\u5347\u7EA7\u5DF2\u5B8C\u6210\uFF0C\u6B63\u5728\u91CD\u542F");if(this.preparing)throw new Error("\u5347\u7EA7\u6B63\u5728\u8FDB\u884C\u4E2D");this.preparing=!0;try{let e=await this.check();if(!e.available||!e.latest)throw new Error("\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C");let t=G(this.agentDir,"pi-web","releases",e.latest);await It(t,{recursive:!0,force:!0}),await jo(t,{recursive:!0});try{await this.runNpm(["install",`pi-webapp@${e.latest}`,"--prefix",t,"--ignore-scripts","--no-save","--no-audit","--no-fund"]);let i=G(t,"node_modules","pi-webapp"),n=JSON.parse(await yi(G(i,"package.json"),"utf8"));if(n.name!=="pi-webapp"||n.version!==e.latest)throw new Error("\u4E0B\u8F7D\u7684\u5305\u4E0E\u76EE\u6807\u7248\u672C\u4E0D\u7B26");let s=G(i,"bin","pi-webapp.mjs");await Promise.all([s,G(i,"dist","extension.js"),G(i,"web","dist","index.html")].map(p=>$o(p)));let a=G(this.agentDir,"pi-web"),l=G(a,`update.${Bo()}.tmp`);try{await bi(l,JSON.stringify({version:e.latest,launcher:s}),{mode:384}),await Lo(l,G(a,"update.json"))}finally{await It(l,{force:!0})}return this.restartPending=!0,{version:e.latest,launcher:s}}catch(i){throw await It(t,{recursive:!0,force:!0}),i}}finally{this.preparing=!1}}async requestRestart(e){if(this.desktopManaged)throw new Error("\u684C\u9762\u5E94\u7528\u7684\u8FD0\u884C\u73AF\u5883\u4E0D\u80FD\u901A\u8FC7\u7F51\u9875\u91CD\u542F\u5347\u7EA7");if(!this.launcherNonce)throw new Error("\u5F53\u524D\u9875\u9762\u65E0\u6CD5\u81EA\u52A8\u91CD\u542F Pi");try{await bi(G(this.agentDir,"pi-web","launcher.restart"),JSON.stringify({nonce:this.launcherNonce,launcher:e.launcher}),{mode:384})}catch(t){throw this.restartPending=!1,t}}};import{randomUUID as Qo}from"node:crypto";async function vi(){if(process.env.PI_WEB_SENTRY_VERIFY_RELEASE!=="true"||process.env.PI_WEB_SENTRY_ENVIRONMENT!=="sentry-verification")throw new Error("Sentry release verification is not enabled");let r=new Q({monitor:!1});try{if(await r.ready,!r.enabled)throw new Error("Sentry verification transport is disabled");let e=r.capture(new Error("Sentry Node release verification"),{stage:"release_verification",code:"sentry_release_probe"});if(!e||!await r.flush(3e3))throw new Error("Sentry verification event was not delivered");return{eventId:e,release:$e,buildId:K}}finally{await r.close()}}var Ei=_t(Jo(Ko(import.meta.url)),import.meta.url.endsWith("/pi-host.ts")?"../../../../web/dist":"../web/dist"),ea=Symbol.for(`pi-web.bridge-state:${import.meta.url}`),o=globalThis[ea]??={bridge:null,current:null,commandContext:null,pi:null,replacementContext:null,replacementSessionId:null,lastStreamAt:0,tuiStreaming:null,workspaces:null,workspaceSessions:null,selected:"tui",activeWorkspaceId:null,autoOpened:!1,tuiCatalog:null,stopPluginWatch:null,interactions:null,lifecycle:new ae,tuiGeneration:0,stopChanged:null,tuiWaitController:new AbortController};o.lifecycle??=new ae;o.tuiGeneration??=0;o.stopChanged??=null;o.tuiWaitController??=new AbortController;o.tuiStreaming??=null;function Te(){return o.selected==="sdk"?o.workspaceSessions?.catalog??null:o.tuiCatalog}var ta=null;function ra(){return ta??=Xo.create({refreshOnCreate:!1})}var Qe=new Map;async function we(){let r=await ra(),e=o.selected==="tui"?o.current?.modelRegistry:void 0,t=new Set(e?.getRegisteredProviderIds()??[]);for(let i of Qe.keys())t.has(i)||(r.unregisterProvider(i),Qe.delete(i));for(let i of t){let n=e?.getRegisteredNativeProvider(i),s=e?.getRegisteredProviderConfig(i),a=n??s;!a||Qe.get(i)===a||(n?r.registerNativeProvider(n):s&&r.registerProvider(i,s),Qe.set(i,a))}return await r.refresh({allowNetwork:!1}),r}function F(){if(o.selected==="sdk")return o.workspaceSessions?.snapshot()??(()=>{throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD")})();if(o.current===null)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD");return{...ht(o.current,o.current.sessionManager.getSessionName(),Te()?.ids()??[]),streaming:o.tuiStreaming,interactions:o.interactions?.pending(o.current.sessionManager.getSessionId())??[]}}function D(r){if(F().sessionId!==r)throw new Error("\u4F1A\u8BDD\u5DF2\u5207\u6362")}async function Ii(){let r=(o.workspaces?.list()??[]).map(u=>({...u})),e=o.activeWorkspaceId,t=F(),i=o.current,n=i?ht(i,i.sessionManager.getSessionName(),o.tuiCatalog?.ids()??[]):null,s=await me(t.cwd).catch(u=>(o.bridge?.reportError?.(u,{stage:"workspace_path"}),null)),a=n?await me(n.cwd).catch(u=>(o.bridge?.reportError?.(u,{stage:"workspace_path"}),null)):null,l=await xi.listAll(),p=o.workspaceSessions?.retainedSessions()??[];n&&a&&p.push({sessionId:n.sessionId,cwd:a,path:null,name:n.name,modified:n.messages.at(-1)?.timestamp??new Date().toISOString(),idle:n.idle});let g=(await Promise.all(r.map(async u=>{let f=(await Ce(u.path,l).catch(m=>(m instanceof Ie?u.available=!1:o.bridge?.reportError?.(m,{stage:"workspace_sessions"}),[]))).map(m=>({id:m.id,workspaceId:u.id,path:m.path,name:m.name||m.firstMessage?.slice(0,50)||"\u5F53\u524D\u4F1A\u8BDD",modified:m.modified.toISOString(),idle:!0}));for(let m of p.filter(h=>h.cwd===u.path)){let h=f.findIndex(x=>x.id===m.sessionId),E={id:m.sessionId,workspaceId:u.id,path:m.path??f[h]?.path??null,name:m.name,modified:m.modified,idle:m.idle};h<0?f.unshift(E):f[h]=E}return u.path===s&&!f.some(m=>m.id===t.sessionId)&&f.unshift({id:t.sessionId,workspaceId:u.id,path:null,name:t.name,modified:new Date().toISOString(),idle:t.idle}),f}))).flat();return{items:r,activeId:e,sessions:g}}var Pi=0;async function z(){if(!o.bridge)return;let r=++Pi;try{let e=await Ii();r===Pi&&o.bridge?.publish({type:"workspaces",value:e})}catch(e){o.bridge?.reportError?.(e,{stage:"workspace_list"})}}async function Ct(r,e=!1){let t=o.workspaces?.get(r);if(!t)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");if(await se(t.path),!e&&o.current&&t.path===await me(o.current.cwd)&&!o.workspaceSessions?.hasWorkspace(t.path))o.selected="tui",o.activeWorkspaceId=r,o.bridge?.publish({type:"stream",message:null}),o.bridge?.publish({type:"snapshot",session:F()});else{if(!o.workspaceSessions)throw new Error("Pi \u5DE5\u4F5C\u533A\u670D\u52A1\u4E0D\u53EF\u7528");await o.workspaceSessions.open(t.path,e?"new":"continue"),o.selected="sdk",o.activeWorkspaceId=r,o.bridge?.publish({type:"snapshot",session:F()})}await z()}function H(r){let e=o.current;if(e===null||e.sessionManager.getSessionId()!==r)throw new Error("\u4F1A\u8BDD\u5DF2\u5207\u6362");return e}function O(r){o.current=r,o.selected==="tui"&&o.bridge?.publish({type:"snapshot",session:F()})}function Ci(){if(o.current===null)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD");let r=o.selected==="sdk"?o.workspaceSessions?.path:o.current.cwd;if(!r)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u5DE5\u4F5C\u533A");let e=o.selected==="tui"?o.current.isProjectTrusted():o.workspaceSessions?.session?.settingsManager.isProjectTrusted()??!1;return Yo.create(r,void 0,{projectTrusted:e})}async function _i(){let r=Ci(),e=n=>({packages:(n.packages??[]).map(s=>typeof s=="string"?s:s.source),extensions:n.extensions??[],skills:n.skills??[]}),t=new Si({cwd:F().cwd,agentDir:ce(),settingsManager:r}),i=ui(t.listConfiguredPackages(),await t.resolve(async()=>"skip"));return{projectTrusted:r.isProjectTrusted(),global:e(r.getGlobalSettings()),project:e(r.getProjectSettings()),installed:i}}async function ia(r){D(r.sessionId);let e=o.selected==="tui"?H(r.sessionId):null;if(e?!e.isIdle():!o.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let t=Ci();if(r.scope==="project"&&!t.isProjectTrusted())throw new Error("\u5F53\u524D\u9879\u76EE\u5C1A\u672A\u53D7\u4FE1\u4EFB\uFF0C\u65E0\u6CD5\u4FEE\u6539\u9879\u76EE\u8BBE\u7F6E");let i=r.value.trim(),n=r.scope==="project"?t.getProjectSettings():t.getGlobalSettings();if(r.kind==="packages"){let s=new Si({cwd:F().cwd,agentDir:ce(),settingsManager:t});r.action==="add"?await s.installAndPersist(i,{local:r.scope==="project"}):await s.removeAndPersist(i,{local:r.scope==="project"})}else if(r.kind==="extensions"){let s=n.extensions??[],a=r.action==="add"?[...new Set([...s,i])]:s.filter(l=>l!==i);r.scope==="project"?t.setProjectExtensionPaths(a):t.setExtensionPaths(a)}else{let s=n.skills??[],a=r.action==="add"?[...new Set([...s,i])]:s.filter(l=>l!==i);r.scope==="project"?t.setProjectSkillPaths(a):t.setSkillPaths(a)}return await t.flush(),o.selected==="tui"?(o.commandContext&&await o.commandContext.reload(),o.current&&O(o.current)):(await o.workspaceSessions?.reload(),o.bridge?.publish({type:"plugins_changed"})),await _i()}function et(r,e=St){o.pi=r,o.tools?.clear(),o.tools=new he({enabled:()=>!!o.telemetry?.enabled&&!!o.bridge,capture:(s,a)=>o.bridge?.reportError?.(s,a),breadcrumb:(s,a)=>o.bridge?.breadcrumb?.(s,a),anonymize:s=>o.telemetry?.session(s)??"unavailable"});let t=s=>({...o.operation,session:o.telemetry?.session(s.sessionManager.getSessionId()),piVersion:Ze,model:s.model?`${s.model.provider}/${s.model.id}`:null,thinkingLevel:s.thinkingLevel});o.interactions?.dispose(),o.interactions=new ge(r.events,s=>!!o.bridge&&s.sessionId===o.current?.sessionManager.getSessionId()&&!!o.tuiCatalog?.has(s.pluginId),()=>{o.current&&o.selected==="tui"&&O(o.current)});let i=()=>{o.stopChanged?.(),o.stopChanged=r.events.on(Ve,()=>{o.selected==="tui"&&o.current&&O(o.current)})};i(),r.on("session_start",async(s,a)=>{if(o.tuiStreaming=null,o.tools?.clear(),o.operation=void 0,o.tuiWaitController.abort(),o.tuiWaitController=new AbortController,o.tuiGeneration++,i(),o.current=a,o.bridge){let l=await oe.discover(a.cwd,a.isProjectTrusted?.()??!1);if(o.current!==a)return;o.tuiCatalog=l}o.replacementSessionId!==a.sessionManager.getSessionId()&&(o.replacementContext=null,o.replacementSessionId=null),O(a),o.bridge&&o.selected==="tui"&&o.bridge.publish({type:"plugins_changed"}),o.selected==="tui"&&o.workspaces&&o.workspaces.add(a.cwd).then(async l=>{o.selected!=="tui"||o.current?.sessionManager.getSessionId()!==a.sessionManager.getSessionId()||(o.activeWorkspaceId=l.id,await z())}).catch(l=>{o.bridge?.publish({type:"error",message:l instanceof Error?l.message:"\u65E0\u6CD5\u6CE8\u518C\u5F53\u524D\u5DE5\u4F5C\u533A",errorCode:"unexpected_error",errorId:o.bridge.reportError?.(l,{stage:"workspace_register"})})}),process.env.PI_WEBAPP_AUTO_OPEN==="1"&&a.mode==="tui"&&!o.autoOpened&&(o.autoOpened=!0,n(a).catch(l=>{a.ui.notify(l instanceof Error?l.message:"Web \u542F\u52A8\u5931\u8D25","error")}))}),r.on("agent_start",(s,a)=>{o.bridge?.breadcrumb?.("agent_start",t(a)),O(a),z()}),r.on("agent_end",(s,a)=>O(a)),r.on("agent_settled",(s,a)=>{o.bridge?.breadcrumb?.("agent_end",t(a)),o.tools?.clear(),o.operation=void 0,o.tuiStreaming=null,O(a),z()}),r.on("tool_execution_start",(s,a)=>{o.tools?.start(s,t(a))}),r.on("tool_execution_end",(s,a)=>{o.tools?.end(s,t(a))}),r.on("model_select",(s,a)=>O(a)),r.on("thinking_level_select",(s,a)=>O(a)),r.on("message_end",(s,a)=>{if(s.message.role==="assistant"&&s.message.stopReason==="error"){let l=o.bridge?.reportError?.(new Error("Agent response failed"),{...o.operation,stage:"agent",code:"agent_failed",piVersion:Ze});o.selected==="tui"&&o.bridge?.publish({type:"error",message:s.message.errorMessage??"Agent response failed",errorCode:"unexpected_error",errorId:l,...o.operation})}s.message.role==="toolResult"&&o.tools?.message(s.message,t(a)),s.message.role==="assistant"&&(o.tuiStreaming=null),o.selected==="tui"&&s.message.role==="assistant"&&o.bridge?.publish({type:"stream",message:null}),O(a),z()}),r.on("session_info_changed",(s,a)=>O(a)),r.on("message_update",(s,a)=>{if(o.current=a,s.message.role!=="assistant"||(o.tuiStreaming={id:"stream",role:"assistant",timestamp:new Date(s.message.timestamp).toISOString(),blocks:ne(s.message.content)},o.selected!=="tui"||o.bridge===null))return;let l=Date.now();l-o.lastStreamAt<60||(o.lastStreamAt=l,o.bridge.publish({type:"stream",message:o.tuiStreaming}))}),r.on("session_shutdown",async s=>{if(o.tuiStreaming=null,o.tools?.clear(),o.operation=void 0,o.tuiWaitController.abort(),o.tuiGeneration++,o.stopChanged?.(),o.stopChanged=null,o.interactions?.cancelAll(),o.current=null,s.reason==="new"||s.reason==="resume"||s.reason==="fork"||s.reason==="reload")return;let a=o.bridge,l=o.telemetry;o.bridge=null,o.commandContext=null,o.replacementContext=null,o.replacementSessionId=null,o.pi=null;let p=o.workspaceSessions;o.workspaceSessions=null,await p?.dispose(),o.selected="tui",o.activeWorkspaceId=null,o.autoOpened=!1,o.tuiCatalog=null,o.stopPluginWatch?.(),o.stopPluginWatch=null,o.operation=void 0,o.telemetry=null,a?await a.close():await l?.close()});let n=async s=>{o.telemetry??=new Q;try{o.current=s,o.commandContext="newSession"in s?s:null,o.pi=r,o.tuiCatalog=await oe.discover(s.cwd,s.isProjectTrusted?.()??!1),o.workspaces===null&&(o.workspaces=new Ge(Zr(ce())),await o.workspaces.load());try{await o.workspaces.discover((await xi.listAll()).map(p=>p.cwd))}catch(p){s.ui.notify(`\u65E0\u6CD5\u8BFB\u53D6\u90E8\u5206 Pi \u5386\u53F2\u5DE5\u4F5C\u533A\uFF1A${p instanceof Error?p.message:String(p)}`,"warning")}let a=await o.workspaces.add(s.cwd);if(o.selected==="tui"&&(o.activeWorkspaceId=a.id),o.bridge&&(o.bridge.protocolVersion!==7||o.bridge.buildId!==K||typeof o.bridge.reportError!="function")){let p=o.bridge;if(o.workspaceSessions&&(o.workspaceSessions.telemetryVersion!==2||o.workspaceSessions.runtimeVersion!==1)&&o.workspaceSessions.session&&!o.workspaceSessions.session.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u5DE5\u4F5C\u533A");o.bridge=null,await p.close(),await o.telemetry.close(),o.telemetry=new Q}if(o.bridge===null){let p=o.workspaceSessions&&(o.workspaceSessions.telemetryVersion!==2||o.workspaceSessions.runtimeVersion!==1)?o.workspaceSessions:null,g=p?.session&&p.path?{path:p.path,sessionManager:p.session.sessionManager}:null;p&&(await p.dispose(),o.workspaceSessions=null),o.workspaceSessions??=new qe(c=>{o.selected==="sdk"&&o.bridge?.publish(c)},()=>o.current?.model,c=>{try{return!!o.current&&ki(o.current.cwd)===c&&(o.current.isProjectTrusted?.()??!1)}catch{return!1}},(c,f)=>o.bridge?.reportError?.(c,f),{enabled:()=>!!o.telemetry?.enabled&&!!o.bridge,breadcrumb:(c,f)=>o.bridge?.breadcrumb?.(c,f),anonymize:c=>o.telemetry?.session(c)??"unavailable"},()=>{z()}),g&&await o.workspaceSessions.open(g.path,{sessionManager:g.sessionManager});let u={selfUpdate:new Xe({agentDir:ce(),packageRoot:_t(Ei,"../.."),launcherNonce:process.env.PI_WEBAPP_LAUNCHER_NONCE}),snapshot:F,busyGitWorkspaces:()=>{let c=(o.workspaceSessions?.retainedSessions()??[]).filter(f=>!f.idle).map(f=>f.cwd);if(o.current&&!o.current.isIdle())try{c.push(ki(o.current.cwd))}catch{c.push(o.current.cwd)}return c},plugins:async()=>{let c=Te();return await c?.refreshAssets(),c?.view()??{plugins:[],errors:[]}},pluginAsset:async c=>Te()?.asset(c)??null,async invokePluginAction(c,f,m,h){if(D(c),!Te()?.has(f))throw new Error("\u63D2\u4EF6\u672A\u542F\u7528");let E=o.selected,x=o.tuiGeneration,I=o.workspaceSessions?.session,J={requestId:Qo(),sessionId:c,pluginId:f,action:m,input:h},ee=o.selected==="sdk"?await o.workspaceSessions.invokePluginAction(J):await Ue(o.pi.events,J,15e3,o.tuiWaitController.signal);if(D(c),E!==o.selected||(E==="tui"?x!==o.tuiGeneration:I!==o.workspaceSessions?.session))throw new Error("\u4F1A\u8BDD\u8FD0\u884C\u5B9E\u4F8B\u5DF2\u5207\u6362");return o.selected==="tui"&&o.current&&O(o.current),ee},async resolvePluginInteraction(c,f,m,h){if(D(c),!Te()?.has(f))throw new Error("\u63D2\u4EF6\u672A\u542F\u7528");o.selected==="sdk"?o.workspaceSessions.resolveInteraction(c,f,m,h):o.interactions.resolve(c,f,m,h)},image(c,f,m){D(c);let E=(o.selected==="sdk"?o.workspaceSessions?.session?.sessionManager.getBranch():o.current?.sessionManager.getBranch())?.find(I=>I.id===f);if(E?.type!=="message"||E.message.role!=="user"||!Array.isArray(E.message.content))return null;let x=E.message.content[m];return x?.type!=="image"?null:{data:Buffer.from(x.data,"base64"),mimeType:x.mimeType}},async workspaces(){return Ii()},async addWorkspace(c,f){let m=await o.workspaces.add(c,f);try{await Ct(m.id,!0)}catch(h){throw await z(),h}},async selectWorkspace(c){await Ct(c)},async newSessionInWorkspace(c){await Ct(c,!0)},async removeWorkspace(c){if(c===o.activeWorkspaceId)throw new Error("\u8BF7\u5148\u5207\u6362\u5230\u5176\u4ED6\u5DE5\u4F5C\u533A");await o.workspaces.remove(c),await z()},async selectSession(c,f,m){let h=o.workspaces?.get(c);if(!h)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");if(await se(h.path),f===o.current?.sessionManager.getSessionId()&&h.path===await me(o.current.cwd))o.selected="tui",o.activeWorkspaceId=c,o.bridge?.publish({type:"stream",message:null}),o.bridge?.publish({type:"snapshot",session:F()});else{if(o.selected==="sdk"&&o.workspaceSessions?.session?.sessionManager.getSessionId()===f&&o.workspaceSessions.path===h.path)return;if(o.workspaceSessions?.hasSession(h.path,f))await o.workspaceSessions.open(h.path,{sessionId:f});else{if(!(await Ce(h.path)).some(x=>x.id===f&&x.path===m))throw new Error("\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A");await o.workspaceSessions.open(h.path,{sessionFile:m})}o.selected="sdk",o.activeWorkspaceId=c,o.bridge?.publish({type:"snapshot",session:F()})}await z()},async models(){if(o.selected==="sdk")return o.workspaceSessions?.models()??[];let c=o.current;if(!c)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD");let f=c.scopedModels?.map(m=>`${m.model.provider}/${m.model.id}`)??[];return c.modelRegistry.getAvailable().filter(m=>f.length===0||f.includes(`${m.provider}/${m.id}`)).map(m=>({provider:m.provider,id:m.id,name:m.name}))},async providers(){let c=await we(),f=new Set((await c.listCredentials()).map(m=>m.providerId));return c.getProviders().map(m=>({id:m.id,name:m.name,configured:c.getProviderAuthStatus(m.id).configured,storedCredential:f.has(m.id),methods:[m.auth.apiKey?.login?"api_key":null,m.auth.oauth?"oauth":null].filter(h=>h!==null)}))},async providerModels(c){let f=await we();return Lr(Ye(ce(),"models.json"),c,f)},async updateProviderModel(c,f,m){if(D(c),o.selected==="tui"?!H(c).isIdle():!o.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let h=F().model;if(m.action==="remove"&&h===`${f}/${m.id}`)throw new Error("\u8BF7\u5148\u5207\u6362\u5F53\u524D\u4F7F\u7528\u7684\u6A21\u578B");if(m.action==="save"&&m.originalId&&m.originalId!==m.model.id&&h===`${f}/${m.originalId}`)throw new Error("\u8BF7\u5148\u5207\u6362\u5F53\u524D\u4F7F\u7528\u7684\u6A21\u578B");let E=await we();await Gr(Ye(ce(),"models.json"),f,m,E),await E.refresh({providers:[f],allowNetwork:!1}),await o.current?.modelRegistry.refresh({providers:[f],allowNetwork:!1}),await o.workspaceSessions?.session?.modelRuntime.refresh({providers:[f],allowNetwork:!1});let x=m.action==="save"?m.model.id:m.action==="base_url"&&h?.startsWith(`${f}/`)?h.slice(f.length+1):null;if(x&&h===`${f}/${x}`)if(o.selected==="sdk")try{await o.workspaceSessions.setModel(f,x)}catch{throw new Error("\u6A21\u578B\u5DF2\u4FDD\u5B58\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\u8BE5\u6A21\u578B\u4EE5\u5E94\u7528\u65B0\u53C2\u6570")}else{let I=H(c),J=I.modelRegistry.find(f,x);if(!J||!o.pi||!await o.pi.setModel(J))throw new Error("\u6A21\u578B\u5DF2\u4FDD\u5B58\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\u8BE5\u6A21\u578B\u4EE5\u5E94\u7528\u65B0\u53C2\u6570");O(I)}},async logoutProvider(c,f){if(D(c),o.selected==="tui"?!H(c).isIdle():!o.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let m=await we();if(!(await m.listCredentials()).some(h=>h.providerId===f))throw new Error("\u8BE5\u63D0\u4F9B\u65B9\u6CA1\u6709\u5DF2\u4FDD\u5B58\u7684\u8BA4\u8BC1");await m.logout(f),await o.current?.modelRegistry.refresh({providers:[f],allowNetwork:!1}),await o.workspaceSessions?.session?.modelRuntime.refresh({providers:[f],allowNetwork:!1})},async loginProvider(c,f,m){let h=await we();await h.login(c,f,Dr(c,f,m)),await h.refresh({providers:[c],allowNetwork:!1}),await o.current?.modelRegistry.refresh({providers:[c],allowNetwork:!1}),await o.workspaceSessions?.session?.modelRuntime.refresh({providers:[c],allowNetwork:!1})},async addCustomProvider(c,f){if(D(c),o.selected==="tui"?!H(c).isIdle():!o.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let m=await we();if(m.getProvider(f.id))throw new Error("\u63D0\u4F9B\u65B9\u5DF2\u5B58\u5728");await Or(Ye(ce(),"models.json"),f),await m.refresh({allowNetwork:!1}),await o.current?.modelRegistry.refresh({allowNetwork:!1}),await o.workspaceSessions?.session?.modelRuntime.refresh({allowNetwork:!1})},commands(){return o.selected==="tui"?(o.pi?.getCommands()??[]).filter(c=>c.name!=="web"&&c.name!=="web-dev-reload").map(c=>({name:c.name,description:c.description})):[]},async compact(c){if(D(c),o.selected==="sdk"){let m=o.workspaceSessions?.session;if(!m||!m.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");await m.compact(),o.bridge?.publish({type:"snapshot",session:F()});return}let f=H(c);if(!f.isIdle())throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");f.compact()},async setModel(c,f,m){if(D(c),o.selected==="sdk"){await o.workspaceSessions.setModel(f,m);return}let h=H(c);if(!h.isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let E=h.modelRegistry.find(f,m);if(!E||!h.modelRegistry.getAvailable().some(x=>x.provider===f&&x.id===m))throw new Error("\u6A21\u578B\u4E0D\u53EF\u7528");if(!o.pi||!await o.pi.setModel(E))throw new Error("\u6A21\u578B\u63D0\u4F9B\u65B9\u672A\u914D\u7F6E\u8BA4\u8BC1");O(h)},async setThinkingLevel(c,f){if(D(c),!["off","minimal","low","medium","high","xhigh"].includes(f))throw new Error("\u63A8\u7406\u5F3A\u5EA6\u65E0\u6548");if(o.selected==="sdk"){let E=o.workspaceSessions?.session;if(!E||!E.isIdle||!E.getAvailableThinkingLevels().includes(f))throw new Error("\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u6B64\u63A8\u7406\u5F3A\u5EA6");E.setThinkingLevel(f),o.bridge?.publish({type:"snapshot",session:F()});return}let h=H(c);if(!h.isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(!h.model||!Zo(h.model).includes(f))throw new Error("\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u6B64\u63A8\u7406\u5F3A\u5EA6");if(!o.pi)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");o.pi.setThinkingLevel(f),O(h)},config:_i,updateConfig:ia,async send(c,f,m=[],h){if(D(c),o.selected==="sdk"){await o.workspaceSessions.send(f,m,h);return}if(!H(c).isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");o.operation=h;try{if(o.bridge?.breadcrumb?.("send",{...h,piVersion:Ze}),o.replacementContext!==null&&o.replacementSessionId===c){await o.replacementContext.sendUserMessage(m.length?[{type:"text",text:f},...m]:f,{expandPromptTemplates:!0});return}if(o.pi===null)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");o.pi.sendUserMessage(m.length?[{type:"text",text:f},...m]:f,{expandPromptTemplates:!0})}catch(x){throw o.operation=void 0,x}},async abort(c){if(D(c),o.selected==="sdk")await o.workspaceSessions.stop();else{let f=H(c);if(f.isIdle())return;if(!o.pi)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");o.tools?.cancel(),o.bridge?.breadcrumb?.("cancel",{...o.operation}),o.pi.appendEntry(Se),f.abort()}},async resume(c,f){if(D(c),o.selected==="sdk"){await o.workspaceSessions.resume(f);return}let m=H(c);if(!m.isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(!m.model||!o.pi)throw new Error("\u8BF7\u5148\u9009\u62E9\u6A21\u578B");if(!m.modelRegistry.hasConfiguredAuth(m.model))throw new Error("\u8BF7\u5148\u8FDE\u63A5\u5F53\u524D\u6A21\u578B");o.operation=f;try{o.pi.sendMessage(ze(F().messages),{triggerTurn:!0})}catch(h){throw o.operation=void 0,h}},async newSession(c){if(D(c),o.selected==="sdk"){let h=o.workspaces?.get(o.activeWorkspaceId??"");if(!h)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");await o.workspaceSessions.open(h.path,"new"),await z();return}let f=H(c);if(!f.isIdle()||o.commandContext===null){await o.workspaceSessions.open(f.cwd,"new"),o.selected="sdk",o.bridge?.publish({type:"snapshot",session:F()}),await z();return}if((await o.commandContext.newSession({withSession:async h=>{o.commandContext=h,o.replacementContext=h,o.replacementSessionId=h.sessionManager.getSessionId(),o.current=h}})).cancelled)throw new Error("\u65B0\u4F1A\u8BDD\u5DF2\u53D6\u6D88");await z()}};u.addWorkspace=o.lifecycle.wrap(u.addWorkspace),u.selectWorkspace=o.lifecycle.wrap(u.selectWorkspace),u.newSessionInWorkspace=o.lifecycle.wrap(u.newSessionInWorkspace),u.removeWorkspace=o.lifecycle.wrap(u.removeWorkspace),u.selectSession=o.lifecycle.wrap(u.selectSession),u.newSession=o.lifecycle.wrap(u.newSession),u.updateConfig=o.lifecycle.wrap(u.updateConfig),o.bridge=await Jr(u,Ei,o.telemetry)}if(o.stopPluginWatch===null&&process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS){let p=[],g=null;for(let u of(process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS??"").split(Ho).filter(Boolean))try{p.push(qo(Ye(_t(u),"dist"),(c,f)=>{let m=String(f??"");["client.js","client.css"].includes(m)&&(g&&clearTimeout(g),g=setTimeout(()=>o.bridge?.publish({type:"plugins_changed"}),180))}))}catch(c){o.bridge?.publish({type:"error",message:`\u63D2\u4EF6\u76D1\u542C\u5931\u8D25\uFF1A${u}: ${String(c)}`})}o.stopPluginWatch=()=>{for(let u of p)u.close();g&&clearTimeout(g)}}let l=await e(o.bridge.url).catch(()=>!1);s.ui.notify(`pi-webapp: ${o.bridge.url}`,l?"info":"warning"),s.ui.setStatus("pi-webapp","Web \u5DF2\u542F\u52A8 \xB7 /web \u91CD\u65B0\u6253\u5F00")}catch(a){throw o.telemetry?.capture(a,{stage:"open_web",piVersion:Ze}),o.bridge||(await o.telemetry?.close(),o.telemetry=null),a}};r.registerCommand("web",{description:"Open the current Pi session in a local web interface",handler:async(s,a)=>n(a)}),r.registerCommand("web-dev-reload",{description:"Reload local pi-webapp plugins during development",handler:async(s,a)=>{process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS&&(await a.waitForIdle(),await o.lifecycle.run(async()=>{let l=o.workspaceSessions?.session;l&&(await l.waitForIdle(),await o.workspaceSessions.reload()),await a.reload()}))}})}var hp=et;export{hp as default,vi as verifySentryNodeRelease};