pi-webapp 0.1.11 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/extension.js CHANGED
@@ -1,28 +1,28 @@
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]="b4db0824-99f5-43dd-addd-16c991e8ec14",r._sentryDebugIdIdentifier="sentry-dbid-b4db0824-99f5-43dd-addd-16c991e8ec14")}catch{}})();import{delimiter as Mn,dirname as Rn,join as Ie,resolve as Je}from"node:path";import{realpathSync as Nn,watch as Wn}from"node:fs";import{fileURLToPath as Dn}from"node:url";import{DefaultPackageManager as er,getAgentDir as q,ModelRuntime as jn,SessionManager as tr,SettingsManager as On,VERSION as xe}from"@earendil-works/pi-coding-agent";import{getSupportedThinkingLevels as Bn}from"@earendil-works/pi-ai";import{randomBytes as di,randomUUID as Re,timingSafeEqual as pi}from"node:crypto";import{readFile as ui,readdir as fi}from"node:fs/promises";import{createServer as gi}from"node:http";import{join as It}from"node:path";import{mkdir as or,opendir as ar,stat as lr}from"node:fs/promises";import{homedir as cr}from"node:os";import{basename as dr,dirname as Ye,join as Xe,posix as pr,resolve as Ze,win32 as ur}from"node:path";function Qe(r){return process.platform==="win32"?ur.isAbsolute(r)&&/^(?:[A-Za-z]:[\\/]|[\\/]{2}[^\\/]+[\\/]+[^\\/]+)/.test(r):pr.isAbsolute(r)}function fr(r,e,t){if(r.length===t&&e.name.localeCompare(r[r.length-1].name)>=0)return!0;let i=0,s=r.length;for(;i<s;){let o=i+s>>>1;e.name.localeCompare(r[o].name)<0?s=o:i=o+1}return r.splice(i,0,e),r.length<=t?!1:(r.pop(),!0)}async function et(r){if(r!==void 0&&!Qe(r))throw new Error("\u76EE\u5F55\u8DEF\u5F84\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84");let e=cr(),t=Ze(r??e),i=[];for(let d=t;;d=Ye(d)){let y=Ye(d);if(i.unshift({name:y===d?d:dr(d),path:d,hidden:!1}),y===d)break}let s=[],o=!1,a=await ar(t);for await(let d of a)!d.isDirectory()&&!d.isSymbolicLink()||fr(s,{name:d.name,isDirectory:d.isDirectory(),isSymbolicLink:d.isSymbolicLink()},1001)&&(o=!0);let p=[];for(let d of s){let y=Xe(t,d.name);if(!d.isDirectory&&d.isSymbolicLink)try{if(!(await lr(y)).isDirectory())continue}catch{continue}if(p.length===1e3){o=!0;break}p.push({name:d.name,path:y,hidden:d.name.startsWith(".")})}return{path:t,home:e,crumbs:i,entries:p,truncated:o}}async function tt(r,e){if(!Qe(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=Xe(Ze(r),e);return await or(t),t}import{execFile as gr}from"node:child_process";import{accessSync as mr,constants as hr}from"node:fs";import{delimiter as wr,join as yr}from"node:path";var br=(r,e,t)=>new Promise((i,s)=>{gr(r,[...e],{encoding:"utf8",signal:t,windowsHide:!0},(o,a,p)=>{o?s(Object.assign(new Error(o.message,{cause:o}),{code:o.code,stdout:a,stderr:p})):i({stdout:a,stderr:p})})});function vr(r){for(let e of(r??"").split(wr))if(e)for(let t of["zenity","kdialog"])try{return mr(yr(e,t),hr.X_OK),!0}catch{}return!1}function rt(r=process.platform,e=process.env){return e.SSH_CONNECTION||e.SSH_TTY?"browse":r==="darwin"||r==="linux"&&(e.DISPLAY||e.WAYLAND_DISPLAY)&&vr(e.PATH)?"native":"browse"}function ce(r){if(!(typeof r!="object"||r===null||!("code"in r)))return typeof r.code=="string"||typeof r.code=="number"?r.code:void 0}function kr(r){return typeof r=="object"&&r!==null&&"stderr"in r&&typeof r.stderr=="string"?r.stderr:""}function _e(r){return r.replace(/[\r\n]+$/,"")||null}async function it(r,e=process.platform,t=br){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 _e(i.stdout)}catch(i){if(!r.aborted&&ce(i)===1&&/(?:User canceled|-128)/i.test(kr(i)))return null;throw i}if(e==="linux"){try{return _e((await t("zenity",["--file-selection","--directory","--title=Select Workspace Directory"],r)).stdout)}catch(i){if(r.aborted)throw i;if(ce(i)===1)return null;if(ce(i)!=="ENOENT")throw i}try{return _e((await t("kdialog",["--getexistingdirectory",".","--title","Select Workspace Directory"],r)).stdout)}catch(i){if(r.aborted)throw i;if(ce(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 Er,randomUUID as Pr}from"node:crypto";import{mkdir as Ir,readFile as xr,writeFile as Sr}from"node:fs/promises";import{join as nt}from"node:path";import{getAgentDir as Cr}from"@earendil-works/pi-coding-agent";var de=20*1024*1024,st=20,_r=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/iu;function Tr(r){let e=r.indexOf("."),t=(e<0?r:r.slice(0,e)).replace(/[. ]+$/u,"");return _r.test(t)}function Ar(r,e){let t=0,i="";for(let s of Buffer.from(r).toString("utf8")){let o=Buffer.byteLength(s);if(t+o>e)break;i+=s,t+=o}return i}function Mr(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 Tr(t)&&(t=`_${t}`),t=Ar(t,255).replace(/[. ]+$/u,""),t===""||t==="."||t===".."?"file":t}function Rr(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 ot(r,e,t,i){if(i.byteLength===0||i.byteLength>de)throw new Error("\u6587\u4EF6\u4E3A\u7A7A\u6216\u8D85\u8FC7 20 MB");let s=Mr(e),o=Er("sha256").update(i).digest("hex"),a=nt(Cr(),"pi-web","attachments",o);await Ir(a,{recursive:!0});let p=nt(a,s);try{await Sr(p,i,{flag:"wx",mode:384})}catch(d){if(!(d instanceof Error&&"code"in d&&d.code==="EEXIST"))throw d}return{id:Pr(),name:s,bytes:i.byteLength,path:p,mediaType:Rr(i)??t.replace(/^image\//,"application/"),sessionId:r}}async function at(r){return{type:"image",data:(await xr(r.path)).toString("base64"),mimeType:r.mediaType}}import{randomBytes as Nr}from"node:crypto";function lt(r,e,t){return r!=="openai-codex"||e!=="oauth"?t:{...t,prompt:i=>i.type==="select"&&i.options.some(s=>s.id==="browser")&&i.options.some(s=>s.id==="device_code")?Promise.resolve("browser"):t.prompt(i)}}var pe=class{flows=new Map;reportError;constructor(e=()=>{}){this.reportError=e}start(e,t,i,s,o){let a=this.getActive();if(a){if(a.providerId===e&&a.method===t&&s===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 p=Nr(18).toString("base64url"),d={view:{id:p,providerId:e,method:t,status:"running"},controller:new AbortController};return this.flows.set(p,d),i(e,t,{signal:d.controller.signal,notify:y=>{d.view={...d.view,event:y,...y.type==="auth_url"||y.type==="device_code"?{authorization:y}:{}}},prompt:y=>{if(y.type==="secret"&&s!==void 0){let h=s;return s=void 0,Promise.resolve(h)}return new Promise((h,c)=>{let{signal:u,...g}=y;d.answer=h,d.reject=c,d.view={...d.view,status:"waiting",prompt:g},u?.aborted?c(new Error("\u767B\u5F55\u8F93\u5165\u5DF2\u53D6\u6D88")):u?.addEventListener("abort",()=>c(new Error("\u767B\u5F55\u8F93\u5165\u5DF2\u53D6\u6D88")),{once:!0})})}}).then(()=>{d.view.status!=="cancelled"&&(d.view={id:p,providerId:e,method:t,status:"done"})}).catch(y=>{if(d.view.status!=="cancelled"){let h=new Error("Provider login failed");y instanceof Error&&y.stack&&(h.stack=`${h.message}
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]="3043920c-83fe-4998-ac8b-a5bb77649c1d",r._sentryDebugIdIdentifier="sentry-dbid-3043920c-83fe-4998-ac8b-a5bb77649c1d")}catch{}})();import{delimiter as Ri,dirname as Ni,join as xe,resolve as Je}from"node:path";import{realpathSync as Wi,watch as Di}from"node:fs";import{fileURLToPath as ji}from"node:url";import{DefaultPackageManager as er,getAgentDir as q,ModelRuntime as Oi,SessionManager as tr,SettingsManager as $i,VERSION as Ie}from"@earendil-works/pi-coding-agent";import{getSupportedThinkingLevels as Bi}from"@earendil-works/pi-ai";import{randomBytes as pn,randomUUID as Re,timingSafeEqual as un}from"node:crypto";import{readFile as fn,readdir as gn}from"node:fs/promises";import{createServer as mn}from"node:http";import{join as xt}from"node:path";import{mkdir as or,opendir as ar,stat as lr}from"node:fs/promises";import{homedir as cr}from"node:os";import{basename as dr,dirname as Ye,join as Xe,posix as pr,resolve as Ze,win32 as ur}from"node:path";function Qe(r){return process.platform==="win32"?ur.isAbsolute(r)&&/^(?:[A-Za-z]:[\\/]|[\\/]{2}[^\\/]+[\\/]+[^\\/]+)/.test(r):pr.isAbsolute(r)}function fr(r,e,t){if(r.length===t&&e.name.localeCompare(r[r.length-1].name)>=0)return!0;let n=0,s=r.length;for(;n<s;){let o=n+s>>>1;e.name.localeCompare(r[o].name)<0?s=o:n=o+1}return r.splice(n,0,e),r.length<=t?!1:(r.pop(),!0)}async function et(r){if(r!==void 0&&!Qe(r))throw new Error("\u76EE\u5F55\u8DEF\u5F84\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84");let e=cr(),t=Ze(r??e),n=[];for(let d=t;;d=Ye(d)){let y=Ye(d);if(n.unshift({name:y===d?d:dr(d),path:d,hidden:!1}),y===d)break}let s=[],o=!1,a=await ar(t);for await(let d of a)!d.isDirectory()&&!d.isSymbolicLink()||fr(s,{name:d.name,isDirectory:d.isDirectory(),isSymbolicLink:d.isSymbolicLink()},1001)&&(o=!0);let u=[];for(let d of s){let y=Xe(t,d.name);if(!d.isDirectory&&d.isSymbolicLink)try{if(!(await lr(y)).isDirectory())continue}catch{continue}if(u.length===1e3){o=!0;break}u.push({name:d.name,path:y,hidden:d.name.startsWith(".")})}return{path:t,home:e,crumbs:n,entries:u,truncated:o}}async function tt(r,e){if(!Qe(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=Xe(Ze(r),e);return await or(t),t}import{execFile as gr}from"node:child_process";import{accessSync as mr,constants as hr}from"node:fs";import{delimiter as wr,join as yr}from"node:path";var br=(r,e,t)=>new Promise((n,s)=>{gr(r,[...e],{encoding:"utf8",signal:t,windowsHide:!0},(o,a,u)=>{o?s(Object.assign(new Error(o.message,{cause:o}),{code:o.code,stdout:a,stderr:u})):n({stdout:a,stderr:u})})});function vr(r){for(let e of(r??"").split(wr))if(e)for(let t of["zenity","kdialog"])try{return mr(yr(e,t),hr.X_OK),!0}catch{}return!1}function rt(r=process.platform,e=process.env){return e.SSH_CONNECTION||e.SSH_TTY?"browse":r==="darwin"||r==="linux"&&(e.DISPLAY||e.WAYLAND_DISPLAY)&&vr(e.PATH)?"native":"browse"}function ce(r){if(!(typeof r!="object"||r===null||!("code"in r)))return typeof r.code=="string"||typeof r.code=="number"?r.code:void 0}function kr(r){return typeof r=="object"&&r!==null&&"stderr"in r&&typeof r.stderr=="string"?r.stderr:""}function _e(r){return r.replace(/[\r\n]+$/,"")||null}async function nt(r,e=process.platform,t=br){if(e==="darwin")try{let n=await t("osascript",["-e",'set selectedFolder to choose folder with prompt "Select Workspace Directory"',"-e","POSIX path of selectedFolder"],r);return _e(n.stdout)}catch(n){if(!r.aborted&&ce(n)===1&&/(?:User canceled|-128)/i.test(kr(n)))return null;throw n}if(e==="linux"){try{return _e((await t("zenity",["--file-selection","--directory","--title=Select Workspace Directory"],r)).stdout)}catch(n){if(r.aborted)throw n;if(ce(n)===1)return null;if(ce(n)!=="ENOENT")throw n}try{return _e((await t("kdialog",["--getexistingdirectory",".","--title","Select Workspace Directory"],r)).stdout)}catch(n){if(r.aborted)throw n;if(ce(n)===1)return null;throw n}}throw new Error(`\u5F53\u524D\u7CFB\u7EDF\u4E0D\u652F\u6301\u672C\u5730\u76EE\u5F55\u9009\u62E9\u5668\uFF1A${e}`)}import{createHash as Er,randomUUID as Pr}from"node:crypto";import{mkdir as xr,readFile as Ir,writeFile as Sr}from"node:fs/promises";import{join as it}from"node:path";import{getAgentDir as Cr}from"@earendil-works/pi-coding-agent";var de=20*1024*1024,st=20,_r=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/iu;function Tr(r){let e=r.indexOf("."),t=(e<0?r:r.slice(0,e)).replace(/[. ]+$/u,"");return _r.test(t)}function Ar(r,e){let t=0,n="";for(let s of Buffer.from(r).toString("utf8")){let o=Buffer.byteLength(s);if(t+o>e)break;n+=s,t+=o}return n}function Mr(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 Tr(t)&&(t=`_${t}`),t=Ar(t,255).replace(/[. ]+$/u,""),t===""||t==="."||t===".."?"file":t}function Rr(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 ot(r,e,t,n){if(n.byteLength===0||n.byteLength>de)throw new Error("\u6587\u4EF6\u4E3A\u7A7A\u6216\u8D85\u8FC7 20 MB");let s=Mr(e),o=Er("sha256").update(n).digest("hex"),a=it(Cr(),"pi-web","attachments",o);await xr(a,{recursive:!0});let u=it(a,s);try{await Sr(u,n,{flag:"wx",mode:384})}catch(d){if(!(d instanceof Error&&"code"in d&&d.code==="EEXIST"))throw d}return{id:Pr(),name:s,bytes:n.byteLength,path:u,mediaType:Rr(n)??t.replace(/^image\//,"application/"),sessionId:r}}async function at(r){return{type:"image",data:(await Ir(r.path)).toString("base64"),mimeType:r.mediaType}}import{randomBytes as Nr}from"node:crypto";function lt(r,e,t){return r!=="openai-codex"||e!=="oauth"?t:{...t,prompt:n=>n.type==="select"&&n.options.some(s=>s.id==="browser")&&n.options.some(s=>s.id==="device_code")?Promise.resolve("browser"):t.prompt(n)}}var pe=class{flows=new Map;reportError;constructor(e=()=>{}){this.reportError=e}start(e,t,n,s,o){let a=this.getActive();if(a){if(a.providerId===e&&a.method===t&&s===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 u=Nr(18).toString("base64url"),d={view:{id:u,providerId:e,method:t,status:"running"},controller:new AbortController};return this.flows.set(u,d),n(e,t,{signal:d.controller.signal,notify:y=>{d.view={...d.view,event:y,...y.type==="auth_url"||y.type==="device_code"?{authorization:y}:{}}},prompt:y=>{if(y.type==="secret"&&s!==void 0){let h=s;return s=void 0,Promise.resolve(h)}return new Promise((h,c)=>{let{signal:p,...g}=y;d.answer=h,d.reject=c,d.view={...d.view,status:"waiting",prompt:g},p?.aborted?c(new Error("\u767B\u5F55\u8F93\u5165\u5DF2\u53D6\u6D88")):p?.addEventListener("abort",()=>c(new Error("\u767B\u5F55\u8F93\u5165\u5DF2\u53D6\u6D88")),{once:!0})})}}).then(()=>{d.view.status!=="cancelled"&&(d.view={id:u,providerId:e,method:t,status:"done"})}).catch(y=>{if(d.view.status!=="cancelled"){let h=new Error("Provider login failed");y instanceof Error&&y.stack&&(h.stack=`${h.message}
2
2
  ${y.stack.split(`
3
3
  `).slice(1).join(`
4
- `)}`);let c=this.reportError(h,{...o,stage:"provider_login"});d.view={id:p,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}}}),{...d.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(o=>o.id===t))return!1;let s=i.answer;return i.answer=void 0,i.reject=void 0,i.view={...i.view,status:"running",prompt:void 0},s(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 Wr}from"node:crypto";import{readFile as Dr,rename as jr,rm as Or,stat as Br,writeFile as $r,mkdir as Fr}from"node:fs/promises";import{dirname as Lr}from"node:path";var Vr=["openai-completions","openai-responses","anthropic-messages"];function Te(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||!Vr.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 ct(r,e){if(!Te(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 Dr(r,"utf8")}catch(p){if(p.code!=="ENOENT")throw p}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 s={...i,providers:{...i.providers,[e.id]:{name:e.name.trim(),baseUrl:e.baseUrl,api:e.api,models:[{id:e.modelId.trim()}]}}};await Fr(Lr(r),{recursive:!0});let o=t===void 0?384:(await Br(r)).mode&511,a=`${r}.pi-web-${Wr(6).toString("hex")}.tmp`;try{await $r(a,`${JSON.stringify(s,null,2)}
5
- `,{mode:o,flag:"wx"}),await jr(a,r)}finally{await Or(a,{force:!0})}}import{randomBytes as Ur}from"node:crypto";import{mkdir as zr,readFile as Hr,rename as Kr,rm as Gr,stat as Jr,writeFile as qr}from"node:fs/promises";import{dirname as Yr}from"node:path";function dt(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 pt(r){if(!r||typeof r!="object")return!1;let e=r;return e.action==="save"?(e.originalId===void 0||typeof e.originalId=="string")&&ut(e.model):e.action==="base_url"?e.baseUrl===null||typeof e.baseUrl=="string"&&dt(e.baseUrl):e.action==="remove"&&typeof e.id=="string"&&e.id.length>0&&e.id.length<=200}function ut(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 ft(r){let e;try{e=await Hr(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 Xr(r,e,t){await zr(Yr(r),{recursive:!0});let i=t===void 0?384:(await Jr(r)).mode&511,s=`${r}.pi-web-${Ur(6).toString("hex")}.tmp`;try{await qr(s,`${JSON.stringify(e,null,2)}
6
- `,{mode:i,flag:"wx"}),await Kr(s,r)}finally{await Gr(s,{force:!0})}}async function gt(r,e,t){if(!t.getProvider(e))throw new Error("\u63D0\u4F9B\u65B9\u4E0D\u5B58\u5728");let{config:i}=await ft(r),s=i.providers[e],o=new Set(s?.models?.map(a=>a.id)??[]);return{providerId:e,baseUrl:s?.baseUrl,models:t.getModels(e).map(a=>({id:a.id,name:a.name,contextWindow:a.contextWindow,maxTokens:a.maxTokens,input:[...a.input],source:o.has(a.id)?"custom":"builtin",overridden:!!s?.modelOverrides?.[a.id]}))}}async function mt(r,e,t,i){if(!i.getProvider(e))throw new Error("\u63D0\u4F9B\u65B9\u4E0D\u5B58\u5728");let{config:s,existing:o}=await ft(r),a={...s.providers[e]??{}},p=[...a.models??[]],d={...a.modelOverrides??{}};if(t.action==="base_url"){if(t.baseUrl!==null&&!dt(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(!ut(t.model))throw new Error("\u6A21\u578B\u53C2\u6570\u65E0\u6548");let y={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}},h=t.originalId,c=h===void 0?-1:p.findIndex(u=>u.id===h);if(h===void 0&&(p.some(u=>u.id===y.id)||i.getModel(e,y.id)))throw new Error("\u6A21\u578B ID \u5DF2\u5B58\u5728");if(c>=0){if(y.id!==h&&(p.some(g=>g.id===y.id)||i.getModel(e,y.id)))throw new Error("\u6A21\u578B ID \u5DF2\u5B58\u5728");let u={...p[c],...y};for(let g of["name","contextWindow","maxTokens","input"])y[g]===void 0&&delete u[g];p[c]=u}else if(h!==void 0&&i.getModel(e,h)){if(y.id!==h)throw new Error("\u5185\u7F6E\u6A21\u578B ID \u4E0D\u53EF\u4FEE\u6539");let{id:u,...g}=y;d[h]={...d[h],...g};for(let m of["name","contextWindow","maxTokens","input"])y[m]===void 0&&delete d[h][m]}else{if(h!==void 0)throw new Error("\u6A21\u578B\u4E0D\u5B58\u5728");p.push(y)}}else{let y=p.findIndex(h=>h.id===t.id);if(y>=0)p.splice(y,1);else if(Object.hasOwn(d,t.id))delete d[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")}p.length?a.models=p:delete a.models,Object.keys(d).length?a.modelOverrides=d:delete a.modelOverrides,Object.keys(a).length?s.providers[e]=a:delete s.providers[e],await Xr(r,s,o)}function ht(r){return/^(?:npm:|git:|https?:\/\/|ssh:\/\/|git@)/i.test(r.trim())}import{randomBytes as Et,createHash as ni}from"node:crypto";import{fileURLToPath as si}from"node:url";var ue="pi-webapp@0.1.11+38ddfcb270c3b48355d8",$="38ddfcb270c3b48355d8";var ge=new Set(["bash","powershell","read","write","edit","grep","find","ls"]),Zr=new Set(["cancelled","blocked","validation","not_found","permission","timeout","process_exit","unknown"]),wt={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},Qr=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"]),ei=new Set(["/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 yt(r){return r==="/api/message"||r.startsWith("/api/provider/")||["/api/plugin-action","/api/plugin-interaction","/api/resume","/api/compact"].includes(r)}function W(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 B(r){let e={};for(let t of Qr){let i=r[t];t==="toolName"?typeof i=="string"&&(ge.has(i)||i==="custom")&&(e[t]=i):t==="failureKind"?Zr.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]=ei.has(i.split("?")[0])?i.split("?")[0]:"[route]":t==="model"&&typeof i=="string"&&/^[\w.-]+\/[\w.-]+$/.test(i)?e[t]=i.split("/").map(W).join("/"):typeof i=="string"?e[t]=["requestId","operationId","errorId","session","buildId","toolId","toolCallId"].includes(t)&&/^[\w-]{1,80}$/.test(i)?i:W(i).slice(0,t==="errorSummary"?512:1024):(typeof i=="boolean"||typeof i=="number"&&Number.isFinite(i)||i===null)&&(e[t]=i)}return e}function Ae(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 Y(r,e=0){let t=r instanceof Error?r:new Error(typeof r=="string"?r:"Non-Error rejection"),i=new Error(W(t.message));if(i.name=W(t.name).slice(0,100),t.stack){let s=t.stack.split(`
7
- `).slice(1,31).map(o=>{let a=o.match(/((?:file:\/\/|https?:\/\/|\/|[A-Za-z]:\\)[^\s()]+):(\d+):(\d+)(\)?)$/);return a?`${W(o.slice(0,a.index))}${a[1]}:${a[2]}:${a[3]}${a[4]}`:W(o)});i.stack=`${i.name}: ${i.message}
4
+ `)}`);let c=this.reportError(h,{...o,stage:"provider_login"});d.view={id:u,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}}}),{...d.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 n=this.flows.get(e);if(!n?.answer||n.view.status!=="waiting"||n.view.prompt?.type==="select"&&!n.view.prompt.options.some(o=>o.id===t))return!1;let s=n.answer;return n.answer=void 0,n.reject=void 0,n.view={...n.view,status:"running",prompt:void 0},s(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 Wr}from"node:crypto";import{readFile as Dr,rename as jr,rm as Or,stat as $r,writeFile as Br,mkdir as Fr}from"node:fs/promises";import{dirname as Lr}from"node:path";var Vr=["openai-completions","openai-responses","anthropic-messages"];function Te(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||!Vr.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 ct(r,e){if(!Te(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 Dr(r,"utf8")}catch(u){if(u.code!=="ENOENT")throw u}let n;if(t===void 0)n={providers:{}};else{try{n=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(!n||typeof n!="object"||!n.providers||typeof n.providers!="object"||Array.isArray(n.providers))throw new Error("models.json \u7ED3\u6784\u65E0\u6548")}if(Object.hasOwn(n.providers,e.id))throw new Error("\u63D0\u4F9B\u65B9\u5DF2\u5B58\u5728");let s={...n,providers:{...n.providers,[e.id]:{name:e.name.trim(),baseUrl:e.baseUrl,api:e.api,models:[{id:e.modelId.trim()}]}}};await Fr(Lr(r),{recursive:!0});let o=t===void 0?384:(await $r(r)).mode&511,a=`${r}.pi-web-${Wr(6).toString("hex")}.tmp`;try{await Br(a,`${JSON.stringify(s,null,2)}
5
+ `,{mode:o,flag:"wx"}),await jr(a,r)}finally{await Or(a,{force:!0})}}import{randomBytes as Ur}from"node:crypto";import{mkdir as zr,readFile as Hr,rename as Kr,rm as Gr,stat as Jr,writeFile as qr}from"node:fs/promises";import{dirname as Yr}from"node:path";function dt(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 pt(r){if(!r||typeof r!="object")return!1;let e=r;return e.action==="save"?(e.originalId===void 0||typeof e.originalId=="string")&&ut(e.model):e.action==="base_url"?e.baseUrl===null||typeof e.baseUrl=="string"&&dt(e.baseUrl):e.action==="remove"&&typeof e.id=="string"&&e.id.length>0&&e.id.length<=200}function ut(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 ft(r){let e;try{e=await Hr(r,"utf8")}catch(n){if(n.code!=="ENOENT")throw n}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 Xr(r,e,t){await zr(Yr(r),{recursive:!0});let n=t===void 0?384:(await Jr(r)).mode&511,s=`${r}.pi-web-${Ur(6).toString("hex")}.tmp`;try{await qr(s,`${JSON.stringify(e,null,2)}
6
+ `,{mode:n,flag:"wx"}),await Kr(s,r)}finally{await Gr(s,{force:!0})}}async function gt(r,e,t){if(!t.getProvider(e))throw new Error("\u63D0\u4F9B\u65B9\u4E0D\u5B58\u5728");let{config:n}=await ft(r),s=n.providers[e],o=new Set(s?.models?.map(a=>a.id)??[]);return{providerId:e,baseUrl:s?.baseUrl,models:t.getModels(e).map(a=>({id:a.id,name:a.name,contextWindow:a.contextWindow,maxTokens:a.maxTokens,input:[...a.input],source:o.has(a.id)?"custom":"builtin",overridden:!!s?.modelOverrides?.[a.id]}))}}async function mt(r,e,t,n){if(!n.getProvider(e))throw new Error("\u63D0\u4F9B\u65B9\u4E0D\u5B58\u5728");let{config:s,existing:o}=await ft(r),a={...s.providers[e]??{}},u=[...a.models??[]],d={...a.modelOverrides??{}};if(t.action==="base_url"){if(t.baseUrl!==null&&!dt(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(!ut(t.model))throw new Error("\u6A21\u578B\u53C2\u6570\u65E0\u6548");let y={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}},h=t.originalId,c=h===void 0?-1:u.findIndex(p=>p.id===h);if(h===void 0&&(u.some(p=>p.id===y.id)||n.getModel(e,y.id)))throw new Error("\u6A21\u578B ID \u5DF2\u5B58\u5728");if(c>=0){if(y.id!==h&&(u.some(g=>g.id===y.id)||n.getModel(e,y.id)))throw new Error("\u6A21\u578B ID \u5DF2\u5B58\u5728");let p={...u[c],...y};for(let g of["name","contextWindow","maxTokens","input"])y[g]===void 0&&delete p[g];u[c]=p}else if(h!==void 0&&n.getModel(e,h)){if(y.id!==h)throw new Error("\u5185\u7F6E\u6A21\u578B ID \u4E0D\u53EF\u4FEE\u6539");let{id:p,...g}=y;d[h]={...d[h],...g};for(let m of["name","contextWindow","maxTokens","input"])y[m]===void 0&&delete d[h][m]}else{if(h!==void 0)throw new Error("\u6A21\u578B\u4E0D\u5B58\u5728");u.push(y)}}else{let y=u.findIndex(h=>h.id===t.id);if(y>=0)u.splice(y,1);else if(Object.hasOwn(d,t.id))delete d[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")}u.length?a.models=u:delete a.models,Object.keys(d).length?a.modelOverrides=d:delete a.modelOverrides,Object.keys(a).length?s.providers[e]=a:delete s.providers[e],await Xr(r,s,o)}function ht(r){return/^(?:npm:|git:|https?:\/\/|ssh:\/\/|git@)/i.test(r.trim())}import{randomBytes as Et,createHash as sn}from"node:crypto";import{fileURLToPath as on}from"node:url";var ue="pi-webapp@0.1.12+17af25c649a02416e3a0",B="17af25c649a02416e3a0";var ge=new Set(["bash","powershell","read","write","edit","grep","find","ls"]),Zr=new Set(["cancelled","blocked","validation","not_found","permission","timeout","process_exit","unknown"]),wt={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},Qr=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"]),en=new Set(["/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 yt(r){return r==="/api/message"||r.startsWith("/api/provider/")||["/api/plugin-action","/api/plugin-interaction","/api/resume","/api/compact"].includes(r)}function W(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 $(r){let e={};for(let t of Qr){let n=r[t];t==="toolName"?typeof n=="string"&&(ge.has(n)||n==="custom")&&(e[t]=n):t==="failureKind"?Zr.has(n)&&(e[t]=n):t==="level"?(n==="warning"||n==="error")&&(e[t]=n):t==="diagnosticSource"?(n==="tool_execution_end"||n==="message_end")&&(e[t]=n):t==="errorCode"?typeof n=="string"&&/^(?:E[A-Z0-9]{1,20}|nonzero_exit|timeout|cancelled|blocked|invalid_arguments|tool_not_found|unknown)$/.test(n)&&(e[t]=n):t==="toolId"?typeof n=="string"&&/^[a-f0-9]{16}$/.test(n)&&(e[t]=n):t==="route"&&typeof n=="string"?e[t]=en.has(n.split("?")[0])?n.split("?")[0]:"[route]":t==="model"&&typeof n=="string"&&/^[\w.-]+\/[\w.-]+$/.test(n)?e[t]=n.split("/").map(W).join("/"):typeof n=="string"?e[t]=["requestId","operationId","errorId","session","buildId","toolId","toolCallId"].includes(t)&&/^[\w-]{1,80}$/.test(n)?n:W(n).slice(0,t==="errorSummary"?512:1024):(typeof n=="boolean"||typeof n=="number"&&Number.isFinite(n)||n===null)&&(e[t]=n)}return e}function Ae(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 Y(r,e=0){let t=r instanceof Error?r:new Error(typeof r=="string"?r:"Non-Error rejection"),n=new Error(W(t.message));if(n.name=W(t.name).slice(0,100),t.stack){let s=t.stack.split(`
7
+ `).slice(1,31).map(o=>{let a=o.match(/((?:file:\/\/|https?:\/\/|\/|[A-Za-z]:\\)[^\s()]+):(\d+):(\d+)(\)?)$/);return a?`${W(o.slice(0,a.index))}${a[1]}:${a[2]}:${a[3]}${a[4]}`:W(o)});n.stack=`${n.name}: ${n.message}
8
8
  ${s.join(`
9
- `)}`}else i.stack=void 0;return e<3&&t.cause!==void 0&&(i.cause=Y(t.cause,e+1)),i}function te(r,e){let t=new Error(e);return r instanceof Error&&(t.name=r.name,r.stack&&(t.stack=`${t.name}: ${e}
9
+ `)}`}else n.stack=void 0;return e<3&&t.cause!==void 0&&(n.cause=Y(t.cause,e+1)),n}function te(r,e){let t=new Error(e);return r instanceof Error&&(t.name=r.name,r.stack&&(t.stack=`${t.name}: ${e}
10
10
  ${r.stack.split(`
11
11
  `).slice(1).join(`
12
- `)}`)),t}function ti(r){return{...r.filename?{filename:Ae(r.filename)}:{},...r.abs_path?{abs_path:Ae(r.abs_path)}:{},...r.function?{function:W(r.function)}:{},lineno:r.lineno,colno:r.colno,in_app:r.in_app}}function ri(r){let e=B(r.contexts?.diagnostic??{}),t=bt(e);return{event_id:r.event_id,timestamp:r.timestamp,platform:r.platform,level:r.level,release:r.release,dist:r.dist,environment:W(r.environment??"production"),...r.message?{message:W(r.message)}:{},exception:r.exception?{values:r.exception.values?.slice(0,4).map(i=>({type:W(i.type??"Error"),value:W(i.value??""),...i.stacktrace?{stacktrace:{frames:i.stacktrace.frames?.slice(-30).map(ti)}}:{},...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:W(i.category??"app"),data:B(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:Ae(i.code_file)}:{}}))}:void 0}}function bt(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 vt(r,e){return e.attachments=[],ri(r)}var ee=class{items=[];bytes=0;encoder=new TextEncoder;add(e,t={}){let i={timestamp:Date.now()/1e3,category:W(e),data:B(t)},s=this.encoder.encode(JSON.stringify(i)).byteLength+1;for(this.items.push({item:i,size:s}),this.bytes+=s;this.items.length>100||this.bytes>64*1024-2;)this.bytes-=this.items.shift().size}snapshot(){return this.items.map(({item:e})=>e)}},Me=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}}},ii=new Set(["\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 z(r){return r instanceof Error&&(r.name==="AbortError"||ii.has(r.message))}var fe=class{budget=new Me;breadcrumbs;scopeClass;seen=new WeakSet;state={};client;side;buildId;constructor(e,t,i,s,o=new ee){this.client=e,this.side=t,this.buildId=i,this.scopeClass=s.Scope,this.breadcrumbs=o,e.addIntegration(s.linkedErrorsIntegration({limit:4}))}setState(e){this.state=B(e)}capture(e,t={},i){try{if(z(e))return;if(typeof e=="object"&&e!==null){if(this.seen.has(e))return;this.seen.add(e)}let s=Y(e),o=B({...this.state,...t}),a=bt(o),p=a?JSON.stringify(a):`${s.name}:${s.message}:${s.stack?.split(`
13
- `)[1]??""}:${t.stage??""}`,d=this.budget.take(p);if(!d)return;let y=new this.scopeClass;y.setClient(this.client),y.setTags({side:this.side,buildId:this.buildId}),o.level==="warning"&&y.setLevel("warning"),a&&y.setFingerprint(a),y.setContext("diagnostic",{...o,repeats:d.repeats});for(let h of this.breadcrumbs.snapshot())y.addBreadcrumb(h,100);return y.captureException(s,i?{event_id:i}:void 0)}catch{return}}ignore(e){this.seen.add(e)}};function kt(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 oi="https://070c0b7c5ac18d940c294e63ecfa0793@o4506663318716416.ingest.us.sentry.io/4512191040716800";function ai(r=process.env,e=console.warn){let t=i=>{let s={enabled:!1,environment:r.PI_WEB_SENTRY_ENVIRONMENT||"production",release:ue,buildId:$},o=r[`PI_WEB_SENTRY_${i}_DSN`]??r.PI_WEB_SENTRY_DSN??oi;if(r.PI_WEB_SENTRY_ENABLED==="false"||!o)return s;try{let a=new URL(o);if(a.protocol!=="https:"||!/^[\w-]+$/.test(a.username)||a.password||a.search||a.hash||!/\/(?:[\w-]+\/)*\d+$/.test(a.pathname))throw new Error;return{...s,enabled:!0,dsn:o}}catch{return e(`pi-webapp: invalid ${i.toLowerCase()} Sentry DSN; error reporting disabled for this side.`),s}};return{browser:t("BROWSER"),node:t("NODE")}}var V=class{config;ready;reporter;client;salt=Et(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=ai(e.env),!this.config.node.enabled){this.ready=Promise.resolve();return}if(e.monitor!==!1){let t=si(import.meta.url).replace(/\\/g,"/"),i=t.slice(0,t.lastIndexOf("/")+1);this.fatal=s=>{s.stack?.replace(/\\/g,"/").includes(t.endsWith("extension.js")?t:i)&&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:$,integrations:[],transport:e.transport??(i=>kt(t.createTransport,i)),stackParser:t.defaultStackParser,beforeSend:vt,sendClientReports:!1,dataCollection:{...wt,httpBodies:[]},includeServerName:!1,enableRuntimeChannelInjection:!1,beforeSendLog:()=>null,beforeSendMetric:()=>null,enableOpenTelemetrySetup:!1,maxBreadcrumbs:100}),this.reporter=new fe(this.client,"node",$,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||z(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=Et(16).toString("hex");return this.early.push({error:Y(e),context:B(t),eventId:i}),i}catch{return}}setState(e){this.state=B({...this.state,...e}),this.reporter?.setState(this.state)}breadcrumb(e,t={}){this.enabled&&this.breadcrumbs.add(e,t)}session(e){return ni("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 mi}from"@earendil-works/pi-coding-agent";import{readFile as li}from"node:fs/promises";import{join as ci}from"node:path";async function Pt(r){try{let e=JSON.parse(await li(ci(r,".vite/manifest.json"),"utf8"));if(!e||typeof e!="object")return{};let t=new Set;for(let s of Object.values(e))if(!(!s||typeof s!="object"))for(let o of[s.file,...Array.isArray(s.css)?s.css:[],...Array.isArray(s.assets)?s.assets:[]])typeof o=="string"&&/^assets\/[\w.-]+\.(?:js|css|woff2?|ttf|png|jpe?g|svg|webp)$/.test(o)&&t.add(o);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(s=>[`/${s}`,{path:s,type:i[s.split(".").pop()]}]))}catch{return{}}}var hi={"/":{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 b(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 wi(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&&pi(i,e)}async function yi(r){let e=0,t=[];for await(let i of r){let s=Buffer.isBuffer(i)?i:Buffer.from(i);if(e+=s.length,e>64*1024)throw new Error("\u8BF7\u6C42\u5185\u5BB9\u8FC7\u5927");t.push(s)}return JSON.parse(Buffer.concat(t).toString("utf8"))}async function bi(r){let e=0,t=[];for await(let i of r){let s=Buffer.isBuffer(i)?i:Buffer.from(i);if(e+=s.length,e>de)throw new Error("\u6587\u4EF6\u8D85\u8FC7 20 MB");t.push(s)}return Buffer.concat(t)}async function vi(r,e=0){await new Promise((i,s)=>{r.once("error",s),r.listen(e,"127.0.0.1",()=>{r.off("error",s),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 xt(r,e,t=new V){t.setState({piVersion:mi});let i=process.env.PI_WEBAPP_RESTART_TOKEN,s=i&&/^[A-Za-z0-9_-]{32}$/.test(i)?i:di(24).toString("base64url"),o=Buffer.from(s),a=rt(),p=new Set,d=new Map,y=new pe((w,f)=>t.capture(w,f)),h=w=>t.setState({nodeVersion:process.version,platform:process.platform,session:t.session(w.sessionId),idle:w.idle,model:w.model,thinkingLevel:w.thinkingLevel,messageCount:w.messages.length}),c="",u=!1,g={...hi,...await Pt(e)};for(let w of await fi(It(e,"assets")).catch(()=>[])){let f=/^[\w.-]+\.(js|css|woff2?|ttf)$/.exec(w);if(!f)continue;let C={js:"text/javascript; charset=utf-8",css:"text/css; charset=utf-8",woff:"font/woff",woff2:"font/woff2",ttf:"font/ttf"};g[`/assets/${w}`]={path:`assets/${w}`,type:C[f[1]]}}let m=gi(async(w,f)=>{let C=M=>typeof M=="string"&&/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(M),L=C(w.headers["x-request-id"])?w.headers["x-request-id"]:Re(),E={requestId:L,operationId:C(w.headers["x-operation-id"])?w.headers["x-operation-id"]:void 0};f.setHeader("X-Request-ID",L),E.operationId&&f.setHeader("X-Operation-ID",E.operationId);let v="/",Ce=performance.now(),R=(M,l,k)=>{let x=!z(M)&&yt(v)?te(M,"Agent or provider operation failed"):M,O=t.capture(x,{...E,route:v,method:w.method,status:l,stage:"http"});b(f,l,{error:k,errorId:O,errorReported:t.enabled,errorCode:z(M)?"validation_error":"unexpected_error"})};f.once("finish",()=>{v.startsWith("/api/telemetry/")||t.breadcrumb("request",{...E,route:v,method:w.method,status:f.statusCode,durationMs:Math.round(performance.now()-Ce)})});try{f.setHeader("X-Content-Type-Options","nosniff"),f.setHeader("Referrer-Policy","no-referrer"),f.setHeader("Content-Security-Policy",`default-src 'self'; script-src 'self'; style-src 'self'; 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{v=new URL(w.url??"/",c).pathname}catch{b(f,400,{error:"\u8BF7\u6C42\u5730\u5740\u65E0\u6548"});return}let M=g[v];if(w.method==="GET"&&M){try{let l=await ui(It(e,M.path));f.writeHead(200,{"Content-Type":M.type,"Cache-Control":"no-store"}),f.end(l)}catch(l){R(l,500,"\u9875\u9762\u6587\u4EF6\u4E0D\u53EF\u7528")}return}if(w.method==="GET"&&v.startsWith("/plugins/")){try{let l=await r.pluginAsset?.(w.url??v);if(!l){b(f,404,{error:"\u63D2\u4EF6\u8D44\u6E90\u4E0D\u5B58\u5728"});return}f.writeHead(200,{"Content-Type":l.type,"Cache-Control":"no-store"}),f.end(l.bytes)}catch(l){R(l,404,"\u63D2\u4EF6\u8D44\u6E90\u4E0D\u53EF\u7528")}return}if(!v.startsWith("/api/")){b(f,404,{error:"\u672A\u627E\u5230"});return}if(!wi(w,o)){b(f,401,{error:"\u8BBF\u95EE\u4EE4\u724C\u65E0\u6548"});return}if(w.method==="GET"&&v==="/api/telemetry/config"){b(f,200,t.config.browser);return}if(w.method==="GET"&&v==="/api/update/version"){try{b(f,200,{current:await r.selfUpdate?.runningVersion()??null})}catch(l){R(l,503,l instanceof Error?l.message:"\u65E0\u6CD5\u8BFB\u53D6\u7248\u672C")}return}if(w.method==="GET"&&v==="/api/update"){try{b(f,200,await r.selfUpdate?.check()??{canRestart:!1,reason:"\u5F53\u524D\u6269\u5C55\u4E0D\u652F\u6301\u5728\u7EBF\u5347\u7EA7"})}catch(l){R(l,503,l instanceof Error?l.message:"\u68C0\u67E5\u66F4\u65B0\u5931\u8D25")}return}if(w.method==="GET"&&v==="/api/image"){let l=new URL(w.url??v,c),k=l.searchParams.get("sessionId")??"",S=l.searchParams.get("messageId")??"",x=Number(l.searchParams.get("index"));if(!k||k!==r.snapshot().sessionId||!S||!Number.isInteger(x)||x<0||x>100){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362\u6216\u56FE\u7247\u5730\u5740\u65E0\u6548"});return}let O=r.image?.(k,S,x);if(!O||!["image/png","image/jpeg","image/webp","image/gif"].includes(O.mimeType)){b(f,404,{error:"\u56FE\u7247\u4E0D\u53EF\u7528"});return}f.writeHead(200,{"Content-Type":O.mimeType,"Cache-Control":"private, no-store"}),f.end(O.data);return}if(w.method==="POST"&&v==="/api/attachment"){if(w.headers.origin!==void 0&&w.headers.origin!==c){b(f,403,{error:"\u6765\u6E90\u4E0D\u5339\u914D"});return}let l=new URL(w.url??v,c),k=l.searchParams.get("sessionId"),S=l.searchParams.get("name");try{if(!k||!S||S.length>1024||k!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362\u6216\u6587\u4EF6\u540D\u65E0\u6548"});return}if(Number(w.headers["content-length"]??0)>de){b(f,413,{error:"\u6587\u4EF6\u8D85\u8FC7 20 MB"});return}let x=await ot(k,S,w.headers["content-type"]??"application/octet-stream",await bi(w));if(k!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}d.set(x.id,x),b(f,201,{id:x.id,name:x.name,bytes:x.bytes})}catch(x){R(x,400,x instanceof Error?x.message:"\u4E0A\u4F20\u5931\u8D25")}return}if(w.method==="GET"&&v==="/api/session"){try{let l=r.snapshot();h(l),b(f,200,l)}catch(l){R(l,503,"\u5F53\u524D\u4F1A\u8BDD\u4E0D\u53EF\u7528")}return}if(w.method==="GET"&&v==="/api/plugins"){try{b(f,200,await r.plugins?.()??{plugins:[],errors:[]})}catch(l){R(l,503,"\u63D2\u4EF6\u76EE\u5F55\u4E0D\u53EF\u7528")}return}if(w.method==="GET"&&v==="/api/providers"){try{b(f,200,await r.providers?.()??[])}catch(l){R(l,503,"\u6A21\u578B\u63D0\u4F9B\u65B9\u4E0D\u53EF\u7528")}return}if(w.method==="GET"&&v==="/api/provider/models"){let l=new URL(w.url??v,c).searchParams.get("providerId")??"";try{if(!l||!r.providerModels){b(f,400,{error:"\u63D0\u4F9B\u65B9\u65E0\u6548"});return}b(f,200,await r.providerModels(l))}catch(k){R(k,400,k instanceof Error?k.message:"\u6A21\u578B\u76EE\u5F55\u4E0D\u53EF\u7528")}return}if(w.method==="GET"&&v==="/api/provider/login/active"){b(f,200,{active:y.getActive()??null});return}if(w.method==="GET"&&v==="/api/provider/login"){let l=new URL(w.url??v,c).searchParams.get("id")??"",k=y.get(l);b(f,k?200:404,k??{error:"\u767B\u5F55\u6D41\u7A0B\u4E0D\u5B58\u5728"});return}if(w.method==="GET"&&(v==="/api/models"||v==="/api/config"||v==="/api/workspaces"||v==="/api/commands")){try{b(f,200,v==="/api/models"?await r.models():v==="/api/config"?await r.config():v==="/api/commands"?r.commands?.()??[]:await r.workspaces())}catch(l){R(l,503,"Pi \u914D\u7F6E\u4E0D\u53EF\u7528")}return}if(w.method==="GET"&&v==="/api/directory/capability"){b(f,200,{kind:a});return}if(w.method==="GET"&&v==="/api/events"){let l;try{l=r.snapshot(),h(l)}catch(k){R(k,503,"\u5F53\u524D\u4F1A\u8BDD\u4E0D\u53EF\u7528");return}f.writeHead(200,{"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"no-store",Connection:"keep-alive","X-Accel-Buffering":"no"}),p.add(f),f.write(`${JSON.stringify({type:"snapshot",session:l})}
14
- `),f.on("close",()=>p.delete(f));return}if(w.method==="POST"&&["/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(v)){if(w.headers.origin!==void 0&&w.headers.origin!==c){b(f,403,{error:"\u6765\u6E90\u4E0D\u5339\u914D"});return}if(!w.headers["content-type"]?.startsWith("application/json")){b(f,415,{error:"\u9700\u8981 JSON \u8BF7\u6C42"});return}try{let l;try{l=await yi(w)}catch(k){if(k instanceof SyntaxError||z(k)){b(f,400,{error:"\u8BF7\u6C42\u5185\u5BB9\u65E0\u6548"});return}throw k}if(typeof l!="object"||l===null||!("sessionId"in l)||typeof l.sessionId!="string"){b(f,400,{error:"\u7F3A\u5C11\u4F1A\u8BDD\u6807\u8BC6"});return}if(v==="/api/plugin-interaction"){if(l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("pluginId"in l)||typeof l.pluginId!="string"||l.pluginId.length>200||!("requestId"in l)||typeof l.requestId!="string"||l.requestId.length>200||!r.resolvePluginInteraction||!("value"in l)){b(f,400,{error:"\u63D2\u4EF6\u4EA4\u4E92\u54CD\u5E94\u65E0\u6548"});return}await r.resolvePluginInteraction(l.sessionId,l.pluginId,l.requestId,l.value),b(f,200,{accepted:!0});return}if(v==="/api/plugin-action"){if(l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("pluginId"in l)||typeof l.pluginId!="string"||l.pluginId.length>200||!("action"in l)||typeof l.action!="string"||l.action.length>100||!r.invokePluginAction){b(f,400,{error:"\u63D2\u4EF6\u52A8\u4F5C\u65E0\u6548"});return}let k=await r.invokePluginAction(l.sessionId,l.pluginId,l.action,"input"in l?l.input:void 0);b(f,200,{value:k});return}if(v==="/api/update"){if(l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!r.snapshot().idle){b(f,409,{error:"\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u540E\u518D\u5347\u7EA7"});return}if(!r.selfUpdate){b(f,409,{error:"\u5F53\u524D\u6269\u5C55\u4E0D\u652F\u6301\u5728\u7EBF\u5347\u7EA7"});return}let k=await r.selfUpdate.prepare();u=!0,b(f,202,{accepted:!0,version:k.version}),setTimeout(()=>{r.selfUpdate?.requestRestart(k).catch(S=>{u=!1,t.capture(S,{stage:"restart"}),console.error("pi-webapp restart:",S)})},500).unref();return}if(v==="/api/provider/custom"){if(l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("provider"in l)||!Te(l.provider)||!r.addCustomProvider){b(f,400,{error:"\u81EA\u5B9A\u4E49\u63D0\u4F9B\u65B9\u65E0\u6548"});return}await r.addCustomProvider(l.sessionId,l.provider),b(f,201,{accepted:!0});return}if(v==="/api/provider/models"||v==="/api/provider/logout"){if(l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("providerId"in l)||typeof l.providerId!="string"){b(f,400,{error:"\u63D0\u4F9B\u65B9\u65E0\u6548"});return}if(v==="/api/provider/models"){if(!("change"in l)||!pt(l.change)||!r.updateProviderModel){b(f,400,{error:"\u6A21\u578B\u53C2\u6570\u65E0\u6548"});return}await r.updateProviderModel(l.sessionId,l.providerId,l.change)}else{if(!r.logoutProvider){b(f,400,{error:"\u65E0\u6CD5\u79FB\u9664\u8BA4\u8BC1"});return}await r.logoutProvider(l.sessionId,l.providerId)}b(f,200,{accepted:!0});return}if(v.startsWith("/api/provider/login")){if(l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(v==="/api/provider/login"){if(!("providerId"in l)||typeof l.providerId!="string"||!("method"in l)||l.method!=="api_key"&&l.method!=="oauth"||!r.loginProvider||!r.providers){b(f,400,{error:"\u767B\u5F55\u65B9\u5F0F\u65E0\u6548"});return}if(!(await r.providers()).some(O=>O.id===l.providerId&&O.methods.includes(l.method))){b(f,400,{error:"\u63D0\u4F9B\u65B9\u4E0D\u652F\u6301\u6B64\u767B\u5F55\u65B9\u5F0F"});return}let S="initialSecret"in l?l.initialSecret:void 0;if(S!==void 0&&(l.method!=="api_key"||typeof S!="string"||!S.trim()||S.length>16384)){b(f,400,{error:"API Key \u65E0\u6548"});return}let x=y.start(l.providerId,l.method,r.loginProvider,S,E);b(f,202,{id:x.id});return}if(!("id"in l)||typeof l.id!="string"){b(f,400,{error:"\u767B\u5F55\u6D41\u7A0B\u65E0\u6548"});return}if(v==="/api/provider/login/cancel"){b(f,y.cancel(l.id)?202:404,{accepted:!0});return}if(!("value"in l)||typeof l.value!="string"||l.value.length>16384||!y.respond(l.id,l.value)){b(f,400,{error:"\u767B\u5F55\u8F93\u5165\u65E0\u6548"});return}b(f,202,{accepted:!0});return}if(v==="/api/attachment/remove"){if(!("id"in l)||typeof l.id!="string"||l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362\u6216\u9644\u4EF6\u65E0\u6548"});return}d.get(l.id)?.sessionId===l.sessionId&&d.delete(l.id),b(f,202,{accepted:!0});return}if(v==="/api/directory/pick"){if(a!=="native"){b(f,409,{error:"\u672C\u5730\u76EE\u5F55\u9009\u62E9\u5668\u4E0D\u53EF\u7528"});return}let k=new AbortController;f.once("close",()=>k.abort()),b(f,200,{path:await it(k.signal)});return}if(v==="/api/directory/list"){if("path"in l&&(typeof l.path!="string"||l.path.length>4096)){b(f,400,{error:"\u76EE\u5F55\u8DEF\u5F84\u65E0\u6548"});return}b(f,200,await et("path"in l?l.path:void 0));return}if(v==="/api/directory/create"){if(!("path"in l)||typeof l.path!="string"||l.path.length>4096||!("name"in l)||typeof l.name!="string"||l.name.length>255){b(f,400,{error:"\u6587\u4EF6\u5939\u540D\u79F0\u6216\u8DEF\u5F84\u65E0\u6548"});return}b(f,200,{path:await tt(l.path,l.name)});return}if(v==="/api/workspace/add"){if(!("path"in l)||typeof l.path!="string"||l.path.length>4096||!("create"in l)||typeof l.create!="boolean"){b(f,400,{error:"\u5DE5\u4F5C\u533A\u8DEF\u5F84\u65E0\u6548"});return}await r.addWorkspace(l.path,l.create),b(f,202,{accepted:!0});return}if(v==="/api/workspace/select"||v==="/api/workspace/remove"||v==="/api/workspace/new-session"){if(!("id"in l)||typeof l.id!="string"){b(f,400,{error:"\u5DE5\u4F5C\u533A\u65E0\u6548"});return}v==="/api/workspace/select"?await r.selectWorkspace(l.id):v==="/api/workspace/new-session"?await r.newSessionInWorkspace(l.id):await r.removeWorkspace(l.id),b(f,202,{accepted:!0});return}if(v==="/api/session/select"){if(!("workspaceId"in l)||typeof l.workspaceId!="string"||!("id"in l)||typeof l.id!="string"||!("path"in l)||typeof l.path!="string"){b(f,400,{error:"\u4F1A\u8BDD\u65E0\u6548"});return}await r.selectSession(l.workspaceId,l.id,l.path),b(f,202,{accepted:!0});return}if(v==="/api/thinking-level"){if(!("level"in l)||typeof l.level!="string"){b(f,400,{error:"\u63A8\u7406\u5F3A\u5EA6\u65E0\u6548"});return}await r.setThinkingLevel(l.sessionId,l.level)}else if(v==="/api/model"){if(!("provider"in l)||typeof l.provider!="string"||!("id"in l)||typeof l.id!="string"){b(f,400,{error:"\u6A21\u578B\u65E0\u6548"});return}await r.setModel(l.sessionId,l.provider,l.id)}else if(v==="/api/config"){let k=l;if(!["packages","extensions","skills"].includes(k.kind)||!["global","project"].includes(k.scope)||!["add","remove"].includes(k.action)||typeof k.value!="string"||!k.value.trim()||k.value.length>2048){b(f,400,{error:"\u914D\u7F6E\u9879\u65E0\u6548"});return}if(k.action==="add"&&k.kind!=="packages"&&ht(k.value)){b(f,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}b(f,200,await r.updateConfig(k));return}else if(v==="/api/message"){let k="attachments"in l?l.attachments:[];if(!Array.isArray(k)||k.length>st||k.some(N=>typeof N!="string")||new Set(k).size!==k.length){b(f,400,{error:"\u9644\u4EF6\u65E0\u6548\u6216\u8FC7\u591A"});return}let S=k.map(N=>d.get(N));if(S.some(N=>!N||N.sessionId!==l.sessionId)){b(f,400,{error:"\u9644\u4EF6\u4E0D\u53EF\u7528"});return}if(!("text"in l)||typeof l.text!="string"||!l.text.trim()&&k.length===0||l.text.length>32e3){b(f,400,{error:"\u6D88\u606F\u65E0\u6548\u6216\u8FC7\u957F"});return}let x=S,O=[l.text.trim(),...x.map(N=>`\u9644\u4EF6 ${JSON.stringify(N.name)}\uFF1A${N.path}`)].filter(Boolean).join(`
12
+ `)}`)),t}function tn(r){return{...r.filename?{filename:Ae(r.filename)}:{},...r.abs_path?{abs_path:Ae(r.abs_path)}:{},...r.function?{function:W(r.function)}:{},lineno:r.lineno,colno:r.colno,in_app:r.in_app}}function rn(r){let e=$(r.contexts?.diagnostic??{}),t=bt(e);return{event_id:r.event_id,timestamp:r.timestamp,platform:r.platform,level:r.level,release:r.release,dist:r.dist,environment:W(r.environment??"production"),...r.message?{message:W(r.message)}:{},exception:r.exception?{values:r.exception.values?.slice(0,4).map(n=>({type:W(n.type??"Error"),value:W(n.value??""),...n.stacktrace?{stacktrace:{frames:n.stacktrace.frames?.slice(-30).map(tn)}}:{},...n.mechanism?{mechanism:{type:n.mechanism.type,handled:n.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(n=>({timestamp:n.timestamp,category:W(n.category??"app"),data:$(n.data??{})})),debug_meta:r.debug_meta?{images:r.debug_meta.images?.slice(0,10).map(n=>({type:n.type,debug_id:n.debug_id,...n.code_file?{code_file:Ae(n.code_file)}:{}}))}:void 0}}function bt(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 vt(r,e){return e.attachments=[],rn(r)}var ee=class{items=[];bytes=0;encoder=new TextEncoder;add(e,t={}){let n={timestamp:Date.now()/1e3,category:W(e),data:$(t)},s=this.encoder.encode(JSON.stringify(n)).byteLength+1;for(this.items.push({item:n,size:s}),this.bytes+=s;this.items.length>100||this.bytes>64*1024-2;)this.bytes-=this.items.shift().size}snapshot(){return this.items.map(({item:e})=>e)}},Me=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 n=this.seen.get(e);if(n&&t-n.at<6e4){n.repeats++;return}if(!(this.total>=20))return this.total++,this.seen.size>=64&&!n&&this.seen.delete(this.seen.keys().next().value),this.seen.set(e,{at:t,repeats:0}),{repeats:n?.repeats??0}}},nn=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 z(r){return r instanceof Error&&(r.name==="AbortError"||nn.has(r.message))}var fe=class{budget=new Me;breadcrumbs;scopeClass;seen=new WeakSet;state={};client;side;buildId;constructor(e,t,n,s,o=new ee){this.client=e,this.side=t,this.buildId=n,this.scopeClass=s.Scope,this.breadcrumbs=o,e.addIntegration(s.linkedErrorsIntegration({limit:4}))}setState(e){this.state=$(e)}capture(e,t={},n){try{if(z(e))return;if(typeof e=="object"&&e!==null){if(this.seen.has(e))return;this.seen.add(e)}let s=Y(e),o=$({...this.state,...t}),a=bt(o),u=a?JSON.stringify(a):`${s.name}:${s.message}:${s.stack?.split(`
13
+ `)[1]??""}:${t.stage??""}`,d=this.budget.take(u);if(!d)return;let y=new this.scopeClass;y.setClient(this.client),y.setTags({side:this.side,buildId:this.buildId}),o.level==="warning"&&y.setLevel("warning"),a&&y.setFingerprint(a),y.setContext("diagnostic",{...o,repeats:d.repeats});for(let h of this.breadcrumbs.snapshot())y.addBreadcrumb(h,100);return y.captureException(s,n?{event_id:n}:void 0)}catch{return}}ignore(e){this.seen.add(e)}};function kt(r,e){return r({...e,bufferSize:20},async({body:t})=>{let n=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:n.status,headers:{"x-sentry-rate-limits":n.headers.get("x-sentry-rate-limits"),"retry-after":n.headers.get("retry-after")}}})}var an="https://070c0b7c5ac18d940c294e63ecfa0793@o4506663318716416.ingest.us.sentry.io/4512191040716800";function ln(r=process.env,e=console.warn){let t=n=>{let s={enabled:!1,environment:r.PI_WEB_SENTRY_ENVIRONMENT||"production",release:ue,buildId:B},o=r[`PI_WEB_SENTRY_${n}_DSN`]??r.PI_WEB_SENTRY_DSN??an;if(r.PI_WEB_SENTRY_ENABLED==="false"||!o)return s;try{let a=new URL(o);if(a.protocol!=="https:"||!/^[\w-]+$/.test(a.username)||a.password||a.search||a.hash||!/\/(?:[\w-]+\/)*\d+$/.test(a.pathname))throw new Error;return{...s,enabled:!0,dsn:o}}catch{return e(`pi-webapp: invalid ${n.toLowerCase()} Sentry DSN; error reporting disabled for this side.`),s}};return{browser:t("BROWSER"),node:t("NODE")}}var V=class{config;ready;reporter;client;salt=Et(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=ln(e.env),!this.config.node.enabled){this.ready=Promise.resolve();return}if(e.monitor!==!1){let t=on(import.meta.url).replace(/\\/g,"/"),n=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:B,integrations:[],transport:e.transport??(n=>kt(t.createTransport,n)),stackParser:t.defaultStackParser,beforeSend:vt,sendClientReports:!1,dataCollection:{...wt,httpBodies:[]},includeServerName:!1,enableRuntimeChannelInjection:!1,beforeSendLog:()=>null,beforeSendMetric:()=>null,enableOpenTelemetrySetup:!1,maxBreadcrumbs:100}),this.reporter=new fe(this.client,"node",B,t,this.breadcrumbs),this.reporter.setState(this.state);for(let n of this.early)this.reporter.capture(n.error,n.context,n.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||z(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 n=Et(16).toString("hex");return this.early.push({error:Y(e),context:$(t),eventId:n}),n}catch{return}}setState(e){this.state=$({...this.state,...e}),this.reporter?.setState(this.state)}breadcrumb(e,t={}){this.enabled&&this.breadcrumbs.add(e,t)}session(e){return sn("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(n=>{t=setTimeout(n,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 hn}from"@earendil-works/pi-coding-agent";import{readFile as cn}from"node:fs/promises";import{join as dn}from"node:path";async function Pt(r){try{let e=JSON.parse(await cn(dn(r,".vite/manifest.json"),"utf8"));if(!e||typeof e!="object")return{};let t=new Set;for(let s of Object.values(e))if(!(!s||typeof s!="object"))for(let o of[s.file,...Array.isArray(s.css)?s.css:[],...Array.isArray(s.assets)?s.assets:[]])typeof o=="string"&&/^assets\/[\w.-]+\.(?:js|css|woff2?|ttf|png|jpe?g|svg|webp)$/.test(o)&&t.add(o);let n={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(s=>[`/${s}`,{path:s,type:n[s.split(".").pop()]}]))}catch{return{}}}var wn={"/":{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 b(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 yn(r,e){let t=r.headers.authorization;if(typeof t!="string"||!t.startsWith("Bearer "))return!1;let n=Buffer.from(t.slice(7),"utf8");return n.length===e.length&&un(n,e)}async function bn(r){let e=0,t=[];for await(let n of r){let s=Buffer.isBuffer(n)?n:Buffer.from(n);if(e+=s.length,e>64*1024)throw new Error("\u8BF7\u6C42\u5185\u5BB9\u8FC7\u5927");t.push(s)}return JSON.parse(Buffer.concat(t).toString("utf8"))}async function vn(r){let e=0,t=[];for await(let n of r){let s=Buffer.isBuffer(n)?n:Buffer.from(n);if(e+=s.length,e>de)throw new Error("\u6587\u4EF6\u8D85\u8FC7 20 MB");t.push(s)}return Buffer.concat(t)}async function kn(r,e=0){await new Promise((n,s)=>{r.once("error",s),r.listen(e,"127.0.0.1",()=>{r.off("error",s),n()})});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 It(r,e,t=new V){t.setState({piVersion:hn});let n=process.env.PI_WEBAPP_RESTART_TOKEN,s=n&&/^[A-Za-z0-9_-]{32}$/.test(n)?n:pn(24).toString("base64url"),o=Buffer.from(s),a=rt(),u=new Set,d=new Map,y=new pe((w,f)=>t.capture(w,f)),h=w=>t.setState({nodeVersion:process.version,platform:process.platform,session:t.session(w.sessionId),idle:w.idle,model:w.model,thinkingLevel:w.thinkingLevel,messageCount:w.messages.length}),c="",p=!1,g={...wn,...await Pt(e)};for(let w of await gn(xt(e,"assets")).catch(()=>[])){let f=/^[\w.-]+\.(js|css|woff2?|ttf)$/.exec(w);if(!f)continue;let C={js:"text/javascript; charset=utf-8",css:"text/css; charset=utf-8",woff:"font/woff",woff2:"font/woff2",ttf:"font/ttf"};g[`/assets/${w}`]={path:`assets/${w}`,type:C[f[1]]}}let m=mn(async(w,f)=>{let C=M=>typeof M=="string"&&/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(M),L=C(w.headers["x-request-id"])?w.headers["x-request-id"]:Re(),E={requestId:L,operationId:C(w.headers["x-operation-id"])?w.headers["x-operation-id"]:void 0};f.setHeader("X-Request-ID",L),E.operationId&&f.setHeader("X-Operation-ID",E.operationId);let v="/",Ce=performance.now(),R=(M,l,k)=>{let I=!z(M)&&yt(v)?te(M,"Agent or provider operation failed"):M,O=t.capture(I,{...E,route:v,method:w.method,status:l,stage:"http"});b(f,l,{error:k,errorId:O,errorReported:t.enabled,errorCode:z(M)?"validation_error":"unexpected_error"})};f.once("finish",()=>{v.startsWith("/api/telemetry/")||t.breadcrumb("request",{...E,route:v,method:w.method,status:f.statusCode,durationMs:Math.round(performance.now()-Ce)})});try{f.setHeader("X-Content-Type-Options","nosniff"),f.setHeader("Referrer-Policy","no-referrer"),f.setHeader("Content-Security-Policy",`default-src 'self'; script-src 'self'; style-src 'self'; 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{v=new URL(w.url??"/",c).pathname}catch{b(f,400,{error:"\u8BF7\u6C42\u5730\u5740\u65E0\u6548"});return}let M=g[v];if(w.method==="GET"&&M){try{let l=await fn(xt(e,M.path));f.writeHead(200,{"Content-Type":M.type,"Cache-Control":"no-store"}),f.end(l)}catch(l){R(l,500,"\u9875\u9762\u6587\u4EF6\u4E0D\u53EF\u7528")}return}if(w.method==="GET"&&v.startsWith("/plugins/")){try{let l=await r.pluginAsset?.(w.url??v);if(!l){b(f,404,{error:"\u63D2\u4EF6\u8D44\u6E90\u4E0D\u5B58\u5728"});return}f.writeHead(200,{"Content-Type":l.type,"Cache-Control":"no-store"}),f.end(l.bytes)}catch(l){R(l,404,"\u63D2\u4EF6\u8D44\u6E90\u4E0D\u53EF\u7528")}return}if(!v.startsWith("/api/")){b(f,404,{error:"\u672A\u627E\u5230"});return}if(!yn(w,o)){b(f,401,{error:"\u8BBF\u95EE\u4EE4\u724C\u65E0\u6548"});return}if(w.method==="GET"&&v==="/api/telemetry/config"){b(f,200,t.config.browser);return}if(w.method==="GET"&&v==="/api/update/version"){try{b(f,200,{current:await r.selfUpdate?.runningVersion()??null})}catch(l){R(l,503,l instanceof Error?l.message:"\u65E0\u6CD5\u8BFB\u53D6\u7248\u672C")}return}if(w.method==="GET"&&v==="/api/update"){try{b(f,200,await r.selfUpdate?.check()??{canRestart:!1,reason:"\u5F53\u524D\u6269\u5C55\u4E0D\u652F\u6301\u5728\u7EBF\u5347\u7EA7"})}catch(l){R(l,503,l instanceof Error?l.message:"\u68C0\u67E5\u66F4\u65B0\u5931\u8D25")}return}if(w.method==="GET"&&v==="/api/image"){let l=new URL(w.url??v,c),k=l.searchParams.get("sessionId")??"",S=l.searchParams.get("messageId")??"",I=Number(l.searchParams.get("index"));if(!k||k!==r.snapshot().sessionId||!S||!Number.isInteger(I)||I<0||I>100){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362\u6216\u56FE\u7247\u5730\u5740\u65E0\u6548"});return}let O=r.image?.(k,S,I);if(!O||!["image/png","image/jpeg","image/webp","image/gif"].includes(O.mimeType)){b(f,404,{error:"\u56FE\u7247\u4E0D\u53EF\u7528"});return}f.writeHead(200,{"Content-Type":O.mimeType,"Cache-Control":"private, no-store"}),f.end(O.data);return}if(w.method==="POST"&&v==="/api/attachment"){if(w.headers.origin!==void 0&&w.headers.origin!==c){b(f,403,{error:"\u6765\u6E90\u4E0D\u5339\u914D"});return}let l=new URL(w.url??v,c),k=l.searchParams.get("sessionId"),S=l.searchParams.get("name");try{if(!k||!S||S.length>1024||k!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362\u6216\u6587\u4EF6\u540D\u65E0\u6548"});return}if(Number(w.headers["content-length"]??0)>de){b(f,413,{error:"\u6587\u4EF6\u8D85\u8FC7 20 MB"});return}let I=await ot(k,S,w.headers["content-type"]??"application/octet-stream",await vn(w));if(k!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}d.set(I.id,I),b(f,201,{id:I.id,name:I.name,bytes:I.bytes})}catch(I){R(I,400,I instanceof Error?I.message:"\u4E0A\u4F20\u5931\u8D25")}return}if(w.method==="GET"&&v==="/api/session"){try{let l=r.snapshot();h(l),b(f,200,l)}catch(l){R(l,503,"\u5F53\u524D\u4F1A\u8BDD\u4E0D\u53EF\u7528")}return}if(w.method==="GET"&&v==="/api/plugins"){try{b(f,200,await r.plugins?.()??{plugins:[],errors:[]})}catch(l){R(l,503,"\u63D2\u4EF6\u76EE\u5F55\u4E0D\u53EF\u7528")}return}if(w.method==="GET"&&v==="/api/providers"){try{b(f,200,await r.providers?.()??[])}catch(l){R(l,503,"\u6A21\u578B\u63D0\u4F9B\u65B9\u4E0D\u53EF\u7528")}return}if(w.method==="GET"&&v==="/api/provider/models"){let l=new URL(w.url??v,c).searchParams.get("providerId")??"";try{if(!l||!r.providerModels){b(f,400,{error:"\u63D0\u4F9B\u65B9\u65E0\u6548"});return}b(f,200,await r.providerModels(l))}catch(k){R(k,400,k instanceof Error?k.message:"\u6A21\u578B\u76EE\u5F55\u4E0D\u53EF\u7528")}return}if(w.method==="GET"&&v==="/api/provider/login/active"){b(f,200,{active:y.getActive()??null});return}if(w.method==="GET"&&v==="/api/provider/login"){let l=new URL(w.url??v,c).searchParams.get("id")??"",k=y.get(l);b(f,k?200:404,k??{error:"\u767B\u5F55\u6D41\u7A0B\u4E0D\u5B58\u5728"});return}if(w.method==="GET"&&(v==="/api/models"||v==="/api/config"||v==="/api/workspaces"||v==="/api/commands")){try{b(f,200,v==="/api/models"?await r.models():v==="/api/config"?await r.config():v==="/api/commands"?r.commands?.()??[]:await r.workspaces())}catch(l){R(l,503,"Pi \u914D\u7F6E\u4E0D\u53EF\u7528")}return}if(w.method==="GET"&&v==="/api/directory/capability"){b(f,200,{kind:a});return}if(w.method==="GET"&&v==="/api/events"){let l;try{l=r.snapshot(),h(l)}catch(k){R(k,503,"\u5F53\u524D\u4F1A\u8BDD\u4E0D\u53EF\u7528");return}f.writeHead(200,{"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"no-store",Connection:"keep-alive","X-Accel-Buffering":"no"}),u.add(f),f.write(`${JSON.stringify({type:"snapshot",session:l})}
14
+ `),f.on("close",()=>u.delete(f));return}if(w.method==="POST"&&["/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(v)){if(w.headers.origin!==void 0&&w.headers.origin!==c){b(f,403,{error:"\u6765\u6E90\u4E0D\u5339\u914D"});return}if(!w.headers["content-type"]?.startsWith("application/json")){b(f,415,{error:"\u9700\u8981 JSON \u8BF7\u6C42"});return}try{let l;try{l=await bn(w)}catch(k){if(k instanceof SyntaxError||z(k)){b(f,400,{error:"\u8BF7\u6C42\u5185\u5BB9\u65E0\u6548"});return}throw k}if(typeof l!="object"||l===null||!("sessionId"in l)||typeof l.sessionId!="string"){b(f,400,{error:"\u7F3A\u5C11\u4F1A\u8BDD\u6807\u8BC6"});return}if(v==="/api/plugin-interaction"){if(l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("pluginId"in l)||typeof l.pluginId!="string"||l.pluginId.length>200||!("requestId"in l)||typeof l.requestId!="string"||l.requestId.length>200||!r.resolvePluginInteraction||!("value"in l)){b(f,400,{error:"\u63D2\u4EF6\u4EA4\u4E92\u54CD\u5E94\u65E0\u6548"});return}await r.resolvePluginInteraction(l.sessionId,l.pluginId,l.requestId,l.value),b(f,200,{accepted:!0});return}if(v==="/api/plugin-action"){if(l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("pluginId"in l)||typeof l.pluginId!="string"||l.pluginId.length>200||!("action"in l)||typeof l.action!="string"||l.action.length>100||!r.invokePluginAction){b(f,400,{error:"\u63D2\u4EF6\u52A8\u4F5C\u65E0\u6548"});return}let k=await r.invokePluginAction(l.sessionId,l.pluginId,l.action,"input"in l?l.input:void 0);b(f,200,{value:k});return}if(v==="/api/update"){if(l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!r.snapshot().idle){b(f,409,{error:"\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u540E\u518D\u5347\u7EA7"});return}if(!r.selfUpdate){b(f,409,{error:"\u5F53\u524D\u6269\u5C55\u4E0D\u652F\u6301\u5728\u7EBF\u5347\u7EA7"});return}let k=await r.selfUpdate.prepare();p=!0,b(f,202,{accepted:!0,version:k.version}),setTimeout(()=>{r.selfUpdate?.requestRestart(k).catch(S=>{p=!1,t.capture(S,{stage:"restart"}),console.error("pi-webapp restart:",S)})},500).unref();return}if(v==="/api/provider/custom"){if(l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("provider"in l)||!Te(l.provider)||!r.addCustomProvider){b(f,400,{error:"\u81EA\u5B9A\u4E49\u63D0\u4F9B\u65B9\u65E0\u6548"});return}await r.addCustomProvider(l.sessionId,l.provider),b(f,201,{accepted:!0});return}if(v==="/api/provider/models"||v==="/api/provider/logout"){if(l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!("providerId"in l)||typeof l.providerId!="string"){b(f,400,{error:"\u63D0\u4F9B\u65B9\u65E0\u6548"});return}if(v==="/api/provider/models"){if(!("change"in l)||!pt(l.change)||!r.updateProviderModel){b(f,400,{error:"\u6A21\u578B\u53C2\u6570\u65E0\u6548"});return}await r.updateProviderModel(l.sessionId,l.providerId,l.change)}else{if(!r.logoutProvider){b(f,400,{error:"\u65E0\u6CD5\u79FB\u9664\u8BA4\u8BC1"});return}await r.logoutProvider(l.sessionId,l.providerId)}b(f,200,{accepted:!0});return}if(v.startsWith("/api/provider/login")){if(l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(v==="/api/provider/login"){if(!("providerId"in l)||typeof l.providerId!="string"||!("method"in l)||l.method!=="api_key"&&l.method!=="oauth"||!r.loginProvider||!r.providers){b(f,400,{error:"\u767B\u5F55\u65B9\u5F0F\u65E0\u6548"});return}if(!(await r.providers()).some(O=>O.id===l.providerId&&O.methods.includes(l.method))){b(f,400,{error:"\u63D0\u4F9B\u65B9\u4E0D\u652F\u6301\u6B64\u767B\u5F55\u65B9\u5F0F"});return}let S="initialSecret"in l?l.initialSecret:void 0;if(S!==void 0&&(l.method!=="api_key"||typeof S!="string"||!S.trim()||S.length>16384)){b(f,400,{error:"API Key \u65E0\u6548"});return}let I=y.start(l.providerId,l.method,r.loginProvider,S,E);b(f,202,{id:I.id});return}if(!("id"in l)||typeof l.id!="string"){b(f,400,{error:"\u767B\u5F55\u6D41\u7A0B\u65E0\u6548"});return}if(v==="/api/provider/login/cancel"){b(f,y.cancel(l.id)?202:404,{accepted:!0});return}if(!("value"in l)||typeof l.value!="string"||l.value.length>16384||!y.respond(l.id,l.value)){b(f,400,{error:"\u767B\u5F55\u8F93\u5165\u65E0\u6548"});return}b(f,202,{accepted:!0});return}if(v==="/api/attachment/remove"){if(!("id"in l)||typeof l.id!="string"||l.sessionId!==r.snapshot().sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362\u6216\u9644\u4EF6\u65E0\u6548"});return}d.get(l.id)?.sessionId===l.sessionId&&d.delete(l.id),b(f,202,{accepted:!0});return}if(v==="/api/directory/pick"){if(a!=="native"){b(f,409,{error:"\u672C\u5730\u76EE\u5F55\u9009\u62E9\u5668\u4E0D\u53EF\u7528"});return}let k=new AbortController;f.once("close",()=>k.abort()),b(f,200,{path:await nt(k.signal)});return}if(v==="/api/directory/list"){if("path"in l&&(typeof l.path!="string"||l.path.length>4096)){b(f,400,{error:"\u76EE\u5F55\u8DEF\u5F84\u65E0\u6548"});return}b(f,200,await et("path"in l?l.path:void 0));return}if(v==="/api/directory/create"){if(!("path"in l)||typeof l.path!="string"||l.path.length>4096||!("name"in l)||typeof l.name!="string"||l.name.length>255){b(f,400,{error:"\u6587\u4EF6\u5939\u540D\u79F0\u6216\u8DEF\u5F84\u65E0\u6548"});return}b(f,200,{path:await tt(l.path,l.name)});return}if(v==="/api/workspace/add"){if(!("path"in l)||typeof l.path!="string"||l.path.length>4096||!("create"in l)||typeof l.create!="boolean"){b(f,400,{error:"\u5DE5\u4F5C\u533A\u8DEF\u5F84\u65E0\u6548"});return}await r.addWorkspace(l.path,l.create),b(f,202,{accepted:!0});return}if(v==="/api/workspace/select"||v==="/api/workspace/remove"||v==="/api/workspace/new-session"){if(!("id"in l)||typeof l.id!="string"){b(f,400,{error:"\u5DE5\u4F5C\u533A\u65E0\u6548"});return}v==="/api/workspace/select"?await r.selectWorkspace(l.id):v==="/api/workspace/new-session"?await r.newSessionInWorkspace(l.id):await r.removeWorkspace(l.id),b(f,202,{accepted:!0});return}if(v==="/api/session/select"){if(!("workspaceId"in l)||typeof l.workspaceId!="string"||!("id"in l)||typeof l.id!="string"||!("path"in l)||typeof l.path!="string"){b(f,400,{error:"\u4F1A\u8BDD\u65E0\u6548"});return}await r.selectSession(l.workspaceId,l.id,l.path),b(f,202,{accepted:!0});return}if(v==="/api/thinking-level"){if(!("level"in l)||typeof l.level!="string"){b(f,400,{error:"\u63A8\u7406\u5F3A\u5EA6\u65E0\u6548"});return}await r.setThinkingLevel(l.sessionId,l.level)}else if(v==="/api/model"){if(!("provider"in l)||typeof l.provider!="string"||!("id"in l)||typeof l.id!="string"){b(f,400,{error:"\u6A21\u578B\u65E0\u6548"});return}await r.setModel(l.sessionId,l.provider,l.id)}else if(v==="/api/config"){let k=l;if(!["packages","extensions","skills"].includes(k.kind)||!["global","project"].includes(k.scope)||!["add","remove"].includes(k.action)||typeof k.value!="string"||!k.value.trim()||k.value.length>2048){b(f,400,{error:"\u914D\u7F6E\u9879\u65E0\u6548"});return}if(k.action==="add"&&k.kind!=="packages"&&ht(k.value)){b(f,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}b(f,200,await r.updateConfig(k));return}else if(v==="/api/message"){let k="attachments"in l?l.attachments:[];if(!Array.isArray(k)||k.length>st||k.some(N=>typeof N!="string")||new Set(k).size!==k.length){b(f,400,{error:"\u9644\u4EF6\u65E0\u6548\u6216\u8FC7\u591A"});return}let S=k.map(N=>d.get(N));if(S.some(N=>!N||N.sessionId!==l.sessionId)){b(f,400,{error:"\u9644\u4EF6\u4E0D\u53EF\u7528"});return}if(!("text"in l)||typeof l.text!="string"||!l.text.trim()&&k.length===0||l.text.length>32e3){b(f,400,{error:"\u6D88\u606F\u65E0\u6548\u6216\u8FC7\u957F"});return}let I=S,O=[l.text.trim(),...I.map(N=>`\u9644\u4EF6 ${JSON.stringify(N.name)}\uFF1A${N.path}`)].filter(Boolean).join(`
15
15
 
16
- `),sr=await Promise.all(x.filter(N=>["image/png","image/jpeg","image/webp","image/gif"].includes(N.mediaType)).map(at));E.operationId??=Re(),f.setHeader("X-Operation-ID",E.operationId),t.breadcrumb("send",{...E,attachmentCount:x.length}),await r.send(l.sessionId,O,sr,E);for(let N of k)d.delete(N)}else if(v==="/api/compact"){if(!r.compact)throw new Error("\u5F53\u524D\u4F1A\u8BDD\u4E0D\u652F\u6301\u538B\u7F29");await r.compact(l.sessionId)}else if(v==="/api/resume"){let k=r.snapshot();if(l.sessionId!==k.sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!k.idle){b(f,409,{error:"Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F"});return}if(!k.paused){b(f,409,{error:"\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6682\u505C\u7684\u4EFB\u52A1"});return}if(k.interactions?.length){b(f,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");E.operationId??=Re(),f.setHeader("X-Operation-ID",E.operationId),t.breadcrumb("resume",{...E}),await r.resume(l.sessionId,E)}else v==="/api/abort"?await r.abort(l.sessionId):await r.newSession(l.sessionId);b(f,202,{accepted:!0})}catch(l){let k=l instanceof Error?l.message:"\u8BF7\u6C42\u5931\u8D25";R(l,k==="\u4F1A\u8BDD\u5DF2\u5207\u6362"?409:400,k)}return}b(f,404,{error:"\u672A\u627E\u5230"})}catch(M){f.headersSent?(t.capture(M,{...E,route:v,stage:"http_stream"}),f.end()):R(M,500,"\u8BF7\u6C42\u5931\u8D25")}}),P=Number(process.env.PI_WEBAPP_RESTART_PORT),I;try{I=await vi(m,Number.isInteger(P)&&P>0&&P<65536&&i===s?P:0)}catch(w){throw t.capture(w,{stage:"listen"}),await t.close(),w}return c=`http://127.0.0.1:${I}`,{protocolVersion:7,buildId:$,reportError(w,f){return t.capture(w,f)},breadcrumb(w,f){t.breadcrumb(w,f)},url:`${c}/#${s}`,publish(w){if(w.type==="snapshot"&&h(w.session),w.type==="error"&&!w.errorCode&&(w={...w,errorCode:"unexpected_error",errorId:t.capture(new Error("Agent execution failed"),{stage:"agent",requestId:w.requestId,operationId:w.operationId})}),w.type==="error"&&(w={...w,errorReported:w.errorReported??t.enabled}),w.type==="snapshot")for(let[C,L]of d)L.sessionId!==w.session.sessionId&&d.delete(C);let f=`${JSON.stringify(w)}
17
- `;for(let C of p)C.write(f)},async close(w){y.close();for(let C of p)C.end(`${JSON.stringify({type:"shutdown",reconnect:w?.reconnect??u})}
18
- `);p.clear();let f;try{await new Promise((C,L)=>{m.close(E=>E?L(E):C()),f=setTimeout(()=>m.closeAllConnections(),50).unref()})}finally{clearTimeout(f),await t.close()}}}}import{getSupportedThinkingLevels as ki}from"@earendil-works/pi-ai";function St(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 s;try{s=JSON.parse(i[2])}catch{break}e.unshift({name:s,image:/\.(?:png|jpe?g|webp|gif)$/iu.test(s)}),t=t.slice(0,i.index)}return{text:t,attachments:e}}var re="pi-webapp/paused",Ne="pi-webapp/resume";function ie(r){for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.type==="custom_message"&&t.customType===Ne)return!1;if(t.type==="custom"&&t.customType===re)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 We(r,e){let t=[],i;for(let s of r){if(s.type==="message"&&(i=s.id),s.type!=="custom")continue;let o=e.find(a=>s.customType.startsWith(`${a}/`));if(o){try{if(JSON.stringify(s.data).length>128*1024)continue}catch{continue}t.push({id:s.id,pluginId:o,kind:s.customType,data:s.data,timestamp:s.timestamp,...i?{afterMessageId:i}:{}})}}return t}function H(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 De(r){if(r.type==="custom_message")return r.display?{id:r.id,role:"notice",timestamp:r.timestamp,blocks:H(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:H(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:H(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(o=>o.role==="user"),s=St(i?.blocks.find(o=>o.kind==="text")?.text??"").text.replace(/\s+/g," ").trim();return s?s.slice(0,50):"\u5F53\u524D\u4F1A\u8BDD"}function Ct(r,e,t=[]){let i=r.sessionManager.getBranch().flatMap(s=>{let o=De(s);return o?[o]:[]});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?ki(r.model):["off"],idle:r.isIdle(),paused:ie(r.sessionManager.getBranch()),contextUsage:r.getContextUsage()??null,messages:i,pluginEntries:We(r.sessionManager.getBranch(),t)}}import{randomUUID as Oe}from"node:crypto";import{mkdir as _t,readFile as Ei,realpath as Be,rename as Pi,rm as Ii,stat as $e,writeFile as xi}from"node:fs/promises";import{basename as Tt,dirname as Si,isAbsolute as At,join as Ci}from"node:path";var ne=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 se(r){try{let e=await Be(r);return(await $e(e)).isDirectory()?e:null}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return null;throw e}}async function K(r){let e=await se(r);if(e===null)throw new ne;return e}var me=class{items=[];hiddenPaths=[];mutationChain=Promise.resolve();file;constructor(e){this.file=e}async load(){try{let e=JSON.parse(await Ei(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(s=>typeof s=="object"&&s!==null&&typeof s.id=="string"&&typeof s.path=="string"&&typeof s.title=="string"),this.hiddenPaths=i.filter(s=>typeof s=="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(!At(e)||e.includes("\0"))throw new Error("\u8BF7\u8F93\u5165\u5B8C\u6574\u7684\u76EE\u5F55\u8DEF\u5F84");t&&await _t(e,{recursive:!0});let i=await Be(e);if(!(await $e(i)).isDirectory())throw new Error("\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55");return this.mutate(async()=>{let s=this.hiddenPaths.filter(d=>d!==i),o=this.items.find(d=>d.path===i);if(o)return s.length!==this.hiddenPaths.length&&(await this.save(this.items,s),this.hiddenPaths=s),o;let a={id:Oe(),path:i,title:Tt(i)||i},p=[a,...this.items];return await this.save(p,s),this.items=p,this.hiddenPaths=s,a})}async discover(e){let t=(await Promise.all([...new Set(e)].filter(At).map(async i=>{try{let s=await Be(i);return(await $e(s)).isDirectory()?s:null}catch{return null}}))).filter(i=>i!==null);await this.mutate(async()=>{let i=new Set([...this.items.map(a=>a.path),...this.hiddenPaths]),s=[];for(let a of t)i.has(a)||(i.add(a),s.push({id:Oe(),path:a,title:Tt(a)||a}));if(s.length===0)return;let o=[...this.items,...s];await this.save(o,this.hiddenPaths),this.items=o})}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(o=>o.id!==e),s=[...new Set([...this.hiddenPaths,t.path])];await this.save(i,s),this.items=i,this.hiddenPaths=s})}mutate(e){let t=this.mutationChain.then(e,e);return this.mutationChain=t.then(()=>{},()=>{}),t}async save(e,t){await _t(Si(this.file),{recursive:!0});let i=`${this.file}.${Oe()}.tmp`;try{await xi(i,JSON.stringify({version:2,items:e,hiddenPaths:t},null,2),{mode:384}),await Pi(i,this.file)}catch(s){throw await Ii(i,{force:!0}),s}}};function Mt(r){return Ci(r,"pi-web","workspaces.json")}import{createAgentSession as ln,createEventBus as cn,DefaultResourceLoader as dn,getAgentDir as pn,SessionManager as be,VERSION as ve}from"@earendil-works/pi-coding-agent";var _i="pi-webapp:interaction-open:v1",Ti="pi-webapp:interaction-accept:v1",Rt="pi-webapp:interaction-settle:v1",Ai="pi-webapp:interaction-cancel:v1";var X=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(_i,s=>{!Mi(s)||!t(s)||this.requests.has(s.requestId)||(this.requests.set(s.requestId,s),e.emit(Ti,{requestId:s.requestId}),i())}),e.on(Ai,s=>{let o=s,a=this.requests.get(o?.requestId);a&&a.sessionId===o.sessionId&&a.pluginId===o.pluginId&&(this.requests.delete(o.requestId),i())})]}pending(e){return[...this.requests.values()].filter(t=>t.sessionId===e)}resolve(e,t,i,s){let o=this.requests.get(i);if(!o||o.sessionId!==e||o.pluginId!==t||!this.accepts(o))throw new Error("Interaction expired or session changed");this.requests.delete(i),this.bus.emit(Rt,{requestId:i,value:s}),this.changed()}cancelAll(e="Session changed"){for(let t of this.requests.values())this.bus.emit(Rt,{requestId:t.requestId,error:e});this.requests.clear(),this.changed()}dispose(){for(let e of this.detach)e();this.cancelAll("Interaction host unloaded")}};function Mi(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 Ri=1,Ni="pi-webapp:action:v1",Wi="pi-webapp:action-response:v1",he="pi-webapp:plugin-changed:v1";function Nt(r){if(!r||typeof r!="object")return!1;let e=r;return e.apiVersion===Ri&&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 we(r,e,t=15e3,i){return new Promise((s,o)=>{let a=!1,p=(c,u)=>{a||(a=!0,clearTimeout(y),d(),i?.removeEventListener("abort",h),c?o(c):s(u))},d=r.on(Wi,c=>{let u=c;u?.requestId===e.requestId&&p(u.ok?null:new Error(u.error??"Plugin action failed"),u.value)}),y=setTimeout(()=>p(new Error(`Plugin action timed out: ${e.pluginId}/${e.action}`)),t),h=()=>p(new Error("Plugin action runtime unloaded"));if(i?.addEventListener("abort",h,{once:!0}),i?.aborted)h();else try{r.emit(Ni,e)}catch(c){p(c instanceof Error?c:new Error(String(c)))}})}import{realpath as un}from"node:fs/promises";import{readFile as Fe,realpath as Ot,stat as Bt}from"node:fs/promises";import{createHash as Di}from"node:crypto";import{dirname as Wt,isAbsolute as ji,join as Le,parse as Oi,resolve as Bi,sep as $i,delimiter as Fi}from"node:path";import{DefaultPackageManager as Li,getAgentDir as Vi,SettingsManager as Ui}from"@earendil-works/pi-coding-agent";async function Dt(r,e){let t=await Fe(r),i=e?await Fe(e):void 0;if(t.length>8*1024*1024||(i?.length??0)>8*1024*1024)throw new Error("Plugin asset exceeds 8 MB");let s=Di("sha256").update(t).update("\0").update(i??"").digest("hex");return{clientBytes:t,styleBytes:i,revision:s}}function zi(){return(process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS??"").split(Fi).filter(Boolean).map(r=>Bi(r))}async function Hi(r){let e=Wt(r);for(;e!==Oi(e).root;)try{return await Bt(Le(e,"package.json")),e}catch{e=Wt(e)}return null}async function jt(r,e){let t=await Ot(Le(r,e));if(!t.startsWith(r+$i))throw new Error("Asset escapes package root");let i=await Bt(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 G=class r{plugins;errors;extensionRoots;constructor(e,t,i){this.plugins=e,this.errors=t,this.extensionRoots=i}static async discover(e,t,i=zi()){let s=Ui.create(e,void 0,{projectTrusted:t}),o=new Li({cwd:e,agentDir:Vi(),settingsManager:s}),a=await o.resolve(async()=>"skip"),p=i.length?await o.resolveExtensionSources(i,{temporary:!0}):{extensions:[]},d=new Set;for(let g of[...a.extensions,...p.extensions]){if(!g.enabled)continue;let m=await Hi(g.path);m&&d.add(m)}for(let g of i)ji(g)&&d.add(g);let y=[],h=[],c=[],u=new Set;for(let g of d)try{let m=await Ot(g),P=JSON.parse(await Fe(Le(m,"package.json"),"utf8"));if(P.piWebapp===void 0)continue;if(typeof P.name!="string"||!P.name)throw new Error("Missing package name");if(!Nt(P.piWebapp))throw new Error("Unsupported piWebapp manifest or asset path");if(u.has(P.name))throw new Error(`Duplicate plugin id: ${P.name}`);let I=await jt(m,P.piWebapp.client),w=P.piWebapp.style?await jt(m,P.piWebapp.style):void 0;u.add(P.name),y.push({id:P.name,root:m,manifest:P.piWebapp,clientPath:I,stylePath:w,...await Dt(I,w)}),c.push(m)}catch(m){h.push(`${g}: ${m instanceof Error?m.message:String(m)}`)}return y.sort((g,m)=>g.id.localeCompare(m.id)),new r(y,h,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 Dt(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 s;try{s=decodeURIComponent(i[1])}catch{return null}let o=this.plugins.find(p=>p.id===s);if(!o||t.searchParams.has("v")&&t.searchParams.get("v")!==o.revision)return null;let a=i[2]==="client.js"?o.clientBytes:o.styleBytes;return a?{bytes:a,type:i[2]==="client.js"?"text/javascript; charset=utf-8":"text/css; charset=utf-8"}:null}};import{realpath as Ki}from"node:fs/promises";import{SessionManager as Gi}from"@earendil-works/pi-coding-agent";async function oe(r,e){let t=await K(r),i=e??await Gi.listAll(),s=await Promise.all(i.map(async o=>o.cwd!==""&&await Ki(o.cwd).catch(()=>null)===t));return i.filter((o,a)=>s[a])}var J=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))}},$t=new WeakMap;function Ft(r,e,t,i=5e3,s=()=>{}){let o=$t.get(r);if(o)return o;let a=(async()=>{let p;try{await Promise.race([r.extensionRunner.emit({type:"session_shutdown",reason:e}),new Promise((d,y)=>{p=setTimeout(()=>y(new Error("Plugin shutdown timed out")),i)})])}catch(d){t(d instanceof Error?d.message:String(d))}finally{clearTimeout(p);try{s()}finally{r.dispose()}}})();return $t.set(r,a),a}function ye(r){let t=[...r].reverse().find(i=>i.role==="assistant")?.blocks.filter(i=>i.kind==="text").map(i=>i.text).join(`
16
+ `),sr=await Promise.all(I.filter(N=>["image/png","image/jpeg","image/webp","image/gif"].includes(N.mediaType)).map(at));E.operationId??=Re(),f.setHeader("X-Operation-ID",E.operationId),t.breadcrumb("send",{...E,attachmentCount:I.length}),await r.send(l.sessionId,O,sr,E);for(let N of k)d.delete(N)}else if(v==="/api/compact"){if(!r.compact)throw new Error("\u5F53\u524D\u4F1A\u8BDD\u4E0D\u652F\u6301\u538B\u7F29");await r.compact(l.sessionId)}else if(v==="/api/resume"){let k=r.snapshot();if(l.sessionId!==k.sessionId){b(f,409,{error:"\u4F1A\u8BDD\u5DF2\u5207\u6362"});return}if(!k.idle){b(f,409,{error:"Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F"});return}if(!k.paused){b(f,409,{error:"\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6682\u505C\u7684\u4EFB\u52A1"});return}if(k.interactions?.length){b(f,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");E.operationId??=Re(),f.setHeader("X-Operation-ID",E.operationId),t.breadcrumb("resume",{...E}),await r.resume(l.sessionId,E)}else v==="/api/abort"?await r.abort(l.sessionId):await r.newSession(l.sessionId);b(f,202,{accepted:!0})}catch(l){let k=l instanceof Error?l.message:"\u8BF7\u6C42\u5931\u8D25";R(l,k==="\u4F1A\u8BDD\u5DF2\u5207\u6362"?409:400,k)}return}b(f,404,{error:"\u672A\u627E\u5230"})}catch(M){f.headersSent?(t.capture(M,{...E,route:v,stage:"http_stream"}),f.end()):R(M,500,"\u8BF7\u6C42\u5931\u8D25")}}),P=Number(process.env.PI_WEBAPP_RESTART_PORT),x;try{x=await kn(m,Number.isInteger(P)&&P>0&&P<65536&&n===s?P:0)}catch(w){throw t.capture(w,{stage:"listen"}),await t.close(),w}return c=`http://127.0.0.1:${x}`,{protocolVersion:7,buildId:B,reportError(w,f){return t.capture(w,f)},breadcrumb(w,f){t.breadcrumb(w,f)},url:`${c}/#${s}`,publish(w){if(w.type==="snapshot"&&h(w.session),w.type==="error"&&!w.errorCode&&(w={...w,errorCode:"unexpected_error",errorId:t.capture(new Error("Agent execution failed"),{stage:"agent",requestId:w.requestId,operationId:w.operationId})}),w.type==="error"&&(w={...w,errorReported:w.errorReported??t.enabled}),w.type==="snapshot")for(let[C,L]of d)L.sessionId!==w.session.sessionId&&d.delete(C);let f=`${JSON.stringify(w)}
17
+ `;for(let C of u)C.write(f)},async close(w){y.close();for(let C of u)C.end(`${JSON.stringify({type:"shutdown",reconnect:w?.reconnect??p})}
18
+ `);u.clear();let f;try{await new Promise((C,L)=>{m.close(E=>E?L(E):C()),f=setTimeout(()=>m.closeAllConnections(),50).unref()})}finally{clearTimeout(f),await t.close()}}}}import{getSupportedThinkingLevels as En}from"@earendil-works/pi-ai";function St(r){let e=[],t=r;for(;;){let n=/(^|\n\n)附件 ("(?:\\.|[^"\\])*"):([^\n]+)$/u.exec(t);if(!n||!/[\\/]pi-web[\\/]attachments[\\/][a-f0-9]{64}[\\/]/u.test(n[3]))break;let s;try{s=JSON.parse(n[2])}catch{break}e.unshift({name:s,image:/\.(?:png|jpe?g|webp|gif)$/iu.test(s)}),t=t.slice(0,n.index)}return{text:t,attachments:e}}var re="pi-webapp/paused",Ne="pi-webapp/resume";function ne(r){for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.type==="custom_message"&&t.customType===Ne)return!1;if(t.type==="custom"&&t.customType===re)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 We(r,e){let t=[],n;for(let s of r){if(s.type==="message"&&(n=s.id),s.type!=="custom")continue;let o=e.find(a=>s.customType.startsWith(`${a}/`));if(o){try{if(JSON.stringify(s.data).length>128*1024)continue}catch{continue}t.push({id:s.id,pluginId:o,kind:s.customType,data:s.data,timestamp:s.timestamp,...n?{afterMessageId:n}:{}})}}return t}function H(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 De(r){if(r.type==="custom_message")return r.display?{id:r.id,role:"notice",timestamp:r.timestamp,blocks:H(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:H(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:H(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 n=e.find(o=>o.role==="user"),s=St(n?.blocks.find(o=>o.kind==="text")?.text??"").text.replace(/\s+/g," ").trim();return s?s.slice(0,50):"\u5F53\u524D\u4F1A\u8BDD"}function Ct(r,e,t=[]){let n=r.sessionManager.getBranch().flatMap(s=>{let o=De(s);return o?[o]:[]});return{schemaVersion:1,sessionId:r.sessionManager.getSessionId(),cwd:r.cwd,name:je(e,n),model:r.model?`${r.model.provider}/${r.model.id}`:null,thinkingLevel:r.thinkingLevel??null,thinkingLevels:r.model?En(r.model):["off"],idle:r.isIdle(),paused:ne(r.sessionManager.getBranch()),contextUsage:r.getContextUsage()??null,messages:n,pluginEntries:We(r.sessionManager.getBranch(),t)}}import{randomUUID as Oe}from"node:crypto";import{mkdir as _t,readFile as Pn,realpath as $e,rename as xn,rm as In,stat as Be,writeFile as Sn}from"node:fs/promises";import{basename as Tt,dirname as Cn,isAbsolute as At,join as _n}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 se(r){try{let e=await $e(r);return(await Be(e)).isDirectory()?e:null}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return null;throw e}}async function K(r){let e=await se(r);if(e===null)throw new ie;return e}var me=class{items=[];hiddenPaths=[];mutationChain=Promise.resolve();file;constructor(e){this.file=e}async load(){try{let e=JSON.parse(await Pn(this.file,"utf8")),t,n=[];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,n=e.hiddenPaths),!Array.isArray(t)||!Array.isArray(n))throw new Error("\u5DE5\u4F5C\u533A\u8BB0\u5F55\u65E0\u6548");this.items=t.filter(s=>typeof s=="object"&&s!==null&&typeof s.id=="string"&&typeof s.path=="string"&&typeof s.title=="string"),this.hiddenPaths=n.filter(s=>typeof s=="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(!At(e)||e.includes("\0"))throw new Error("\u8BF7\u8F93\u5165\u5B8C\u6574\u7684\u76EE\u5F55\u8DEF\u5F84");t&&await _t(e,{recursive:!0});let n=await $e(e);if(!(await Be(n)).isDirectory())throw new Error("\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55");return this.mutate(async()=>{let s=this.hiddenPaths.filter(d=>d!==n),o=this.items.find(d=>d.path===n);if(o)return s.length!==this.hiddenPaths.length&&(await this.save(this.items,s),this.hiddenPaths=s),o;let a={id:Oe(),path:n,title:Tt(n)||n},u=[a,...this.items];return await this.save(u,s),this.items=u,this.hiddenPaths=s,a})}async discover(e){let t=(await Promise.all([...new Set(e)].filter(At).map(async n=>{try{let s=await $e(n);return(await Be(s)).isDirectory()?s:null}catch{return null}}))).filter(n=>n!==null);await this.mutate(async()=>{let n=new Set([...this.items.map(a=>a.path),...this.hiddenPaths]),s=[];for(let a of t)n.has(a)||(n.add(a),s.push({id:Oe(),path:a,title:Tt(a)||a}));if(s.length===0)return;let o=[...this.items,...s];await this.save(o,this.hiddenPaths),this.items=o})}async remove(e){await this.mutate(async()=>{let t=this.get(e);if(!t)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");let n=this.items.filter(o=>o.id!==e),s=[...new Set([...this.hiddenPaths,t.path])];await this.save(n,s),this.items=n,this.hiddenPaths=s})}mutate(e){let t=this.mutationChain.then(e,e);return this.mutationChain=t.then(()=>{},()=>{}),t}async save(e,t){await _t(Cn(this.file),{recursive:!0});let n=`${this.file}.${Oe()}.tmp`;try{await Sn(n,JSON.stringify({version:2,items:e,hiddenPaths:t},null,2),{mode:384}),await xn(n,this.file)}catch(s){throw await In(n,{force:!0}),s}}};function Mt(r){return _n(r,"pi-web","workspaces.json")}import{createAgentSession as ci,createEventBus as di,DefaultResourceLoader as pi,getAgentDir as ui,SessionManager as be,VERSION as ve}from"@earendil-works/pi-coding-agent";var Tn="pi-webapp:interaction-open:v1",An="pi-webapp:interaction-accept:v1",Rt="pi-webapp:interaction-settle:v1",Mn="pi-webapp:interaction-cancel:v1";var X=class{bus;accepts;changed;requests=new Map;detach;constructor(e,t,n){this.bus=e,this.accepts=t,this.changed=n,this.detach=[e.on(Tn,s=>{!Rn(s)||!t(s)||this.requests.has(s.requestId)||(this.requests.set(s.requestId,s),e.emit(An,{requestId:s.requestId}),n())}),e.on(Mn,s=>{let o=s,a=this.requests.get(o?.requestId);a&&a.sessionId===o.sessionId&&a.pluginId===o.pluginId&&(this.requests.delete(o.requestId),n())})]}pending(e){return[...this.requests.values()].filter(t=>t.sessionId===e)}resolve(e,t,n,s){let o=this.requests.get(n);if(!o||o.sessionId!==e||o.pluginId!==t||!this.accepts(o))throw new Error("Interaction expired or session changed");this.requests.delete(n),this.bus.emit(Rt,{requestId:n,value:s}),this.changed()}cancelAll(e="Session changed"){for(let t of this.requests.values())this.bus.emit(Rt,{requestId:t.requestId,error:e});this.requests.clear(),this.changed()}dispose(){for(let e of this.detach)e();this.cancelAll("Interaction host unloaded")}};function Rn(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 Nn=1,Wn="pi-webapp:action:v1",Dn="pi-webapp:action-response:v1",he="pi-webapp:plugin-changed:v1";function Nt(r){if(!r||typeof r!="object")return!1;let e=r;return e.apiVersion===Nn&&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 we(r,e,t=15e3,n){return new Promise((s,o)=>{let a=!1,u=(c,p)=>{a||(a=!0,clearTimeout(y),d(),n?.removeEventListener("abort",h),c?o(c):s(p))},d=r.on(Dn,c=>{let p=c;p?.requestId===e.requestId&&u(p.ok?null:new Error(p.error??"Plugin action failed"),p.value)}),y=setTimeout(()=>u(new Error(`Plugin action timed out: ${e.pluginId}/${e.action}`)),t),h=()=>u(new Error("Plugin action runtime unloaded"));if(n?.addEventListener("abort",h,{once:!0}),n?.aborted)h();else try{r.emit(Wn,e)}catch(c){u(c instanceof Error?c:new Error(String(c)))}})}import{realpath as fi}from"node:fs/promises";import{readFile as Fe,realpath as Ot,stat as $t}from"node:fs/promises";import{createHash as jn}from"node:crypto";import{dirname as Wt,isAbsolute as On,join as Le,parse as $n,resolve as Bn,sep as Fn,delimiter as Ln}from"node:path";import{DefaultPackageManager as Vn,getAgentDir as Un,SettingsManager as zn}from"@earendil-works/pi-coding-agent";async function Dt(r,e){let t=await Fe(r),n=e?await Fe(e):void 0;if(t.length>8*1024*1024||(n?.length??0)>8*1024*1024)throw new Error("Plugin asset exceeds 8 MB");let s=jn("sha256").update(t).update("\0").update(n??"").digest("hex");return{clientBytes:t,styleBytes:n,revision:s}}function Hn(){return(process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS??"").split(Ln).filter(Boolean).map(r=>Bn(r))}async function Kn(r){let e=Wt(r);for(;e!==$n(e).root;)try{return await $t(Le(e,"package.json")),e}catch{e=Wt(e)}return null}async function jt(r,e){let t=await Ot(Le(r,e));if(!t.startsWith(r+Fn))throw new Error("Asset escapes package root");let n=await $t(t);if(!n.isFile()||n.size>8*1024*1024)throw new Error("Plugin asset is not a regular file under 8 MB");return t}var G=class r{plugins;errors;extensionRoots;constructor(e,t,n){this.plugins=e,this.errors=t,this.extensionRoots=n}static async discover(e,t,n=Hn()){let s=zn.create(e,void 0,{projectTrusted:t}),o=new Vn({cwd:e,agentDir:Un(),settingsManager:s}),a=await o.resolve(async()=>"skip"),u=n.length?await o.resolveExtensionSources(n,{temporary:!0}):{extensions:[]},d=new Set;for(let g of[...a.extensions,...u.extensions]){if(!g.enabled)continue;let m=await Kn(g.path);m&&d.add(m)}for(let g of n)On(g)&&d.add(g);let y=[],h=[],c=[],p=new Set;for(let g of d)try{let m=await Ot(g),P=JSON.parse(await Fe(Le(m,"package.json"),"utf8"));if(P.piWebapp===void 0)continue;if(typeof P.name!="string"||!P.name)throw new Error("Missing package name");if(!Nt(P.piWebapp))throw new Error("Unsupported piWebapp manifest or asset path");if(p.has(P.name))throw new Error(`Duplicate plugin id: ${P.name}`);let x=await jt(m,P.piWebapp.client),w=P.piWebapp.style?await jt(m,P.piWebapp.style):void 0;p.add(P.name),y.push({id:P.name,root:m,manifest:P.piWebapp,clientPath:x,stylePath:w,...await Dt(x,w)}),c.push(m)}catch(m){h.push(`${g}: ${m instanceof Error?m.message:String(m)}`)}return y.sort((g,m)=>g.id.localeCompare(m.id)),new r(y,h,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 Dt(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"),n=/^\/plugins\/([^/]+)\/(client\.js|client\.css)$/.exec(t.pathname);if(!n)return null;let s;try{s=decodeURIComponent(n[1])}catch{return null}let o=this.plugins.find(u=>u.id===s);if(!o||t.searchParams.has("v")&&t.searchParams.get("v")!==o.revision)return null;let a=n[2]==="client.js"?o.clientBytes:o.styleBytes;return a?{bytes:a,type:n[2]==="client.js"?"text/javascript; charset=utf-8":"text/css; charset=utf-8"}:null}};import{realpath as Gn}from"node:fs/promises";import{SessionManager as Jn}from"@earendil-works/pi-coding-agent";async function oe(r,e){let t=await K(r),n=e??await Jn.listAll(),s=await Promise.all(n.map(async o=>o.cwd!==""&&await Gn(o.cwd).catch(()=>null)===t));return n.filter((o,a)=>s[a])}var J=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))}},Bt=new WeakMap;function Ft(r,e,t,n=5e3,s=()=>{}){let o=Bt.get(r);if(o)return o;let a=(async()=>{let u;try{await Promise.race([r.extensionRunner.emit({type:"session_shutdown",reason:e}),new Promise((d,y)=>{u=setTimeout(()=>y(new Error("Plugin shutdown timed out")),n)})])}catch(d){t(d instanceof Error?d.message:String(d))}finally{clearTimeout(u);try{s()}finally{r.dispose()}}})();return Bt.set(r,a),a}function ye(r){let t=[...r].reverse().find(n=>n.role==="assistant")?.blocks.filter(n=>n.kind==="text").map(n=>n.text).join(`
19
19
  `);return{customType:Ne,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?`
20
20
  Already displayed assistant text (reference data):
21
- ${JSON.stringify(t)}`:"")}}import{createHash as Ji}from"node:crypto";import{readFile as qi,writeFile as Yi,unlink as Xi}from"node:fs/promises";import{basename as Zi,dirname as Qi,extname as en,join as tn}from"node:path";import{DefaultPackageManager as rn,getAgentDir as nn,SettingsManager as sn}from"@earendil-works/pi-coding-agent";var ae=new Map;async function Lt(r,e){let i=await new rn({cwd:r,agentDir:nn(),settingsManager:sn.create(r)}).resolveExtensionSources([...e],{temporary:!0}),s=[],o=[],a=async()=>{for(let p of s.splice(0)){let d=(ae.get(p)??1)-1;d?ae.set(p,d):(ae.delete(p),await Xi(p).catch(()=>{}))}};try{for(let p of i.extensions){if(!p.enabled)continue;let d=en(p.path);if(![".js",".mjs"].includes(d)){o.push(p.path);continue}let y=await qi(p.path),h=Ji("sha256").update(y).digest("hex"),c=tn(Qi(p.path),`.pi-web-runtime-${Zi(p.path,d)}-${h}${d}`);await Yi(c,y,{flag:"wx"}).catch(u=>{if(u.code!=="EEXIST")throw u}),ae.set(c,(ae.get(c)??0)+1),s.push(c),o.push(c)}return{paths:o,release:a}}catch(p){throw await a(),p}}import{createHash as on}from"node:crypto";var Ve={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"}},U=r=>r!==null&&typeof r=="object"?r:void 0;function Ut(r,e){let t=r instanceof Error?r:U(r)?.error instanceof Error?U(r).error:void 0,i={failureKind:"unknown",summaryOmitted:!0,summaryOmittedReason:"unrecognized_diagnostic",originalStackAvailable:!!t?.stack,level:"error"},s=(h,c,u)=>{Object.assign(i,{failureKind:h,errorCode:c,errorSummary:u.slice(0,512),summaryOmitted:!1,level:t?"error":"warning"}),delete i.summaryOmittedReason},o=U(t)?.code;if(typeof o=="string"&&Ve[o]){let h=Ve[o];return s(h.kind,o,`${o}: ${h.summary}`),i}let a=t?.message??"";if(!t){let h=U(r)?.content;Array.isArray(h)&&(a=h.slice(0,8).flatMap(c=>{let u=U(c);return u?.type==="text"&&typeof u.text=="string"?[u.text.length>16384?`${u.text.slice(0,8192)}
21
+ ${JSON.stringify(t)}`:"")}}import{createHash as qn}from"node:crypto";import{readFile as Yn,writeFile as Xn,unlink as Zn}from"node:fs/promises";import{basename as Qn,dirname as ei,extname as ti,join as ri}from"node:path";import{DefaultPackageManager as ni,getAgentDir as ii,SettingsManager as si}from"@earendil-works/pi-coding-agent";var ae=new Map;async function Lt(r,e){let n=await new ni({cwd:r,agentDir:ii(),settingsManager:si.create(r)}).resolveExtensionSources([...e],{temporary:!0}),s=[],o=[],a=async()=>{for(let u of s.splice(0)){let d=(ae.get(u)??1)-1;d?ae.set(u,d):(ae.delete(u),await Zn(u).catch(()=>{}))}};try{for(let u of n.extensions){if(!u.enabled)continue;let d=ti(u.path);if(![".js",".mjs"].includes(d)){o.push(u.path);continue}let y=await Yn(u.path),h=qn("sha256").update(y).digest("hex"),c=ri(ei(u.path),`.pi-web-runtime-${Qn(u.path,d)}-${h}${d}`);await Xn(c,y,{flag:"wx"}).catch(p=>{if(p.code!=="EEXIST")throw p}),ae.set(c,(ae.get(c)??0)+1),s.push(c),o.push(c)}return{paths:o,release:a}}catch(u){throw await a(),u}}import{createHash as oi}from"node:crypto";var Ve={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"}},U=r=>r!==null&&typeof r=="object"?r:void 0,ai=[{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 Ut(r,e){let t=r instanceof Error?r:U(r)?.error instanceof Error?U(r).error:void 0,n={failureKind:"unknown",summaryOmitted:!0,summaryOmittedReason:"unrecognized_diagnostic",originalStackAvailable:!!t?.stack,level:"error"},s=(h,c,p)=>{Object.assign(n,{failureKind:h,errorCode:c,errorSummary:p.slice(0,512),summaryOmitted:!1,level:t?"error":"warning"}),delete n.summaryOmittedReason},o=U(t)?.code;if(typeof o=="string"&&Ve[o]){let h=Ve[o];return s(h.kind,o,`${o}: ${h.summary}`),n}let a=t?.message??"";if(!t){let h=U(r)?.content;Array.isArray(h)&&(a=h.slice(0,8).flatMap(c=>{let p=U(c);return p?.type==="text"&&typeof p.text=="string"?[p.text.length>16384?`${p.text.slice(0,8192)}
22
22
  [truncated]
23
- ${u.text.slice(-8192)}`:u.text]:[]}).join(`
24
- `))}let p=e==="bash"||e==="powershell",d=a.slice(-8192).trimEnd().split(/\r?\n/).at(-1)??"";if(p){let h=d.match(/^Command exited with code (-?\d{1,10})$/),c=d.match(/^Command timed out after (\d+(?:\.\d+)?) seconds$/);if(h&&Number.isSafeInteger(Number(h[1]))&&Number(h[1])!==0)return s("process_exit","nonzero_exit",d),i.exitCode=Number(h[1]),i;if(c&&Number.isFinite(Number(c[1]))&&Number(c[1])>0)return s("timeout","timeout",d),i.timeoutMs=Number(c[1])*1e3,i;if(d==="Command aborted")return s("cancelled","cancelled",d),i}let y=a.slice(0,8192).split(/\r?\n/,1)[0]??"";if(a==="Operation aborted"||t?.name==="AbortError")s("cancelled","cancelled","Operation aborted");else if(a==="Tool execution was blocked")s("blocked","blocked",a);else if(/^Working directory does not exist: [^\n]+\nCannot execute (?:bash|powershell) commands\.$/.test(a))s("not_found","ENOENT","Working directory does not exist");else if(!p||!a.includes(`
25
- `)||/^Validation failed for tool\b/.test(y)){let h=y.match(/^(ENOENT|ENOTDIR|EACCES|EPERM|ETIMEDOUT|EINVAL):/);if(h){let c=Ve[h[1]],u=y.match(/, (open|access|stat|lstat|scandir|spawn|read|write|rename|mkdir|unlink)\s/);s(c.kind,h[1],`${h[1]}: ${c.summary}${u?`; operation=${u[1]}`:""}`)}else/^Tool [^\r\n]+ not found$/.test(a)?s("not_found","tool_not_found","Tool not found"):/^Validation failed for tool\b/.test(y)||y==="Edit tool input is invalid. edits must contain at least one replacement."||/^Invalid timeout:/.test(y)?s("validation","invalid_arguments",y.startsWith("Invalid timeout:")?"Invalid timeout argument":"Invalid tool arguments"):/^Offset \d+ is beyond end of file \(\d+ lines total\)$/.test(a)&&s("validation","invalid_arguments","Read offset is beyond end of file")}return i}var an=256;function Vt(r,e,t){r.delete(e),r.set(e,t),r.size>an&&r.delete(r.keys().next().value)}var Z=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:ge.has(e.toolName)?e.toolName:"custom",...ge.has(e.toolName)?{}:{toolId:on("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"?U(e.args)?.timeout:void 0,s=typeof i=="number"&&i>0&&Number.isFinite(i*1e3)?i*1e3:void 0,o={...B(t),...this.identity(e),stage:"tool"};Vt(this.pending,e.toolCallId,{context:o,started:(this.options.now??performance.now.bind(performance))(),cancelled:!1,timeoutMs:s}),this.breadcrumb("tool_start",o)}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 s=this.pending.get(e.toolCallId);this.pending.delete(e.toolCallId),Vt(this.completed,e.toolCallId,!0);let o={...s?.context??{...B(t),...this.identity(e),stage:"tool"},diagnosticSource:i};if(s&&(o.durationMs=Math.max(0,Math.round((this.options.now??performance.now.bind(performance))()-s.started)),s.timeoutMs!==void 0&&(o.timeoutMs=s.timeoutMs)),!e.isError){this.breadcrumb("tool_end",o);return}let a=e.result instanceof Error?e.result:U(e.result)?.error instanceof Error?U(e.result).error:void 0,p=s?.cancelled&&!a?{failureKind:"cancelled",errorCode:"cancelled",level:"warning",originalStackAvailable:!1,summaryOmitted:!0,summaryOmittedReason:"cancelled"}:Ut(e.result,e.toolName);if(Object.assign(o,p,{code:"tool_failed"}),this.breadcrumb(p.failureKind==="cancelled"?"tool_cancelled":p.failureKind==="blocked"?"tool_blocked":"tool_failed",o),p.failureKind==="cancelled"||p.failureKind==="blocked")return;let d;a?d=zt(a,e.toolName):(d=new Error(`${o.toolName}: ${p.failureKind} (${p.errorCode??"unknown"})`),d.name="ToolResultFailure",d.stack=void 0),this.options.capture(d,o)}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 zt(r,e,t=0){let i=Ut(r,e),s=new Error(i.errorSummary??"Tool exception (diagnostic text unavailable)");return s.name=r.name,s.stack=r.stack?`${s.name}: ${s.message}
23
+ ${p.text.slice(-8192)}`:p.text]:[]}).join(`
24
+ `))}let u=e==="bash"||e==="powershell",d=a.slice(-8192).trimEnd().split(/\r?\n/).at(-1)??"";if(u){let h=d.match(/^Command exited with code (-?\d{1,10})$/),c=d.match(/^Command timed out after (\d+(?:\.\d+)?) seconds$/);if(h&&Number.isSafeInteger(Number(h[1]))&&Number(h[1])!==0)return s("process_exit","nonzero_exit",d),n.exitCode=Number(h[1]),n;if(c&&Number.isFinite(Number(c[1]))&&Number(c[1])>0)return s("timeout","timeout",d),n.timeoutMs=Number(c[1])*1e3,n;if(d==="Command aborted")return s("cancelled","cancelled",d),n}let y=a.slice(0,8192).split(/\r?\n/,1)[0]??"";if(a==="Operation aborted"||t?.name==="AbortError")s("cancelled","cancelled","Operation aborted");else if(a==="Tool execution was blocked")s("blocked","blocked",a);else if(/^Working directory does not exist: [^\n]+\nCannot execute (?:bash|powershell) commands\.$/.test(a))s("not_found","ENOENT","Working directory does not exist");else if(!u||!a.includes(`
25
+ `)||/^Validation failed for tool\b/.test(y)){let h=y.match(/^(ENOENT|ENOTDIR|EACCES|EPERM|ETIMEDOUT|EINVAL):/);if(h){let c=Ve[h[1]],p=y.match(/, (open|access|stat|lstat|scandir|spawn|read|write|rename|mkdir|unlink)\s/);s(c.kind,h[1],`${h[1]}: ${c.summary}${p?`; operation=${p[1]}`:""}`)}else if(/^Tool [^\r\n]+ not found$/.test(a))s("not_found","tool_not_found","Tool not found");else if(/^Validation failed for tool\b/.test(y)||y==="Edit tool input is invalid. edits must contain at least one replacement."||/^Invalid timeout:/.test(y))s("validation","invalid_arguments",y.startsWith("Invalid timeout:")?"Invalid timeout argument":"Invalid tool arguments");else if(/^Offset \d+ is beyond end of file \(\d+ lines total\)$/.test(a))s("validation","invalid_arguments","Read offset is beyond end of file");else if(e==="edit"){let c=ai.find(p=>p.pattern.test(a));c&&s("validation",c.code,c.summary)}}return n}var li=256;function Vt(r,e,t){r.delete(e),r.set(e,t),r.size>li&&r.delete(r.keys().next().value)}var Z=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:ge.has(e.toolName)?e.toolName:"custom",...ge.has(e.toolName)?{}:{toolId:oi("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 n=e.toolName==="bash"||e.toolName==="powershell"?U(e.args)?.timeout:void 0,s=typeof n=="number"&&n>0&&Number.isFinite(n*1e3)?n*1e3:void 0,o={...$(t),...this.identity(e),stage:"tool"};Vt(this.pending,e.toolCallId,{context:o,started:(this.options.now??performance.now.bind(performance))(),cancelled:!1,timeoutMs:s}),this.breadcrumb("tool_start",o)}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,n){try{if(!this.enabled()||this.completed.has(e.toolCallId))return;let s=this.pending.get(e.toolCallId);this.pending.delete(e.toolCallId),Vt(this.completed,e.toolCallId,!0);let o={...s?.context??{...$(t),...this.identity(e),stage:"tool"},diagnosticSource:n};if(s&&(o.durationMs=Math.max(0,Math.round((this.options.now??performance.now.bind(performance))()-s.started)),s.timeoutMs!==void 0&&(o.timeoutMs=s.timeoutMs)),!e.isError){this.breadcrumb("tool_end",o);return}let a=e.result instanceof Error?e.result:U(e.result)?.error instanceof Error?U(e.result).error:void 0,u=s?.cancelled&&!a?{failureKind:"cancelled",errorCode:"cancelled",level:"warning",originalStackAvailable:!1,summaryOmitted:!0,summaryOmittedReason:"cancelled"}:Ut(e.result,e.toolName);if(Object.assign(o,u,{code:"tool_failed"}),this.breadcrumb(u.failureKind==="cancelled"?"tool_cancelled":u.failureKind==="blocked"?"tool_blocked":"tool_failed",o),u.failureKind==="cancelled"||u.failureKind==="blocked")return;let d;a?d=zt(a,e.toolName):(d=new Error(`${o.toolName}: ${u.failureKind} (${u.errorCode??"unknown"})`),d.name="ToolResultFailure",d.stack=void 0),this.options.capture(d,o)}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 zt(r,e,t=0){let n=Ut(r,e),s=new Error(n.errorSummary??"Tool exception (diagnostic text unavailable)");return s.name=r.name,s.stack=r.stack?`${s.name}: ${s.message}
26
26
  ${r.stack.split(`
27
27
  `).slice(1).join(`
28
- `)}`:void 0,t<3&&r.cause instanceof Error&&(s.cause=zt(r.cause,e,t+1)),Y(s)}var ke=class{telemetryVersion=2;active=null;queue=new J;generation=0;disposed=!1;publish;fallbackModel;isProjectTrusted;reportError;telemetry;constructor(e,t,i=()=>!1,s=()=>{},o={enabled:()=>!1,breadcrumb:()=>{},anonymize:()=>"unavailable"}){this.publish=e,this.fallbackModel=t,this.isProjectTrusted=i,this.reportError=s,this.telemetry={enabled:()=>{try{return o.enabled()}catch{return!1}},breadcrumb:(a,p)=>{try{o.enabled()&&o.breadcrumb(a,p)}catch{}},anonymize:a=>{try{return o.enabled()?o.anonymize(a):"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 K(e),s;if(t==="new")s=be.create(i);else if(t==="continue"){let o=(await oe(i))[0];s=o?be.open(o.path):be.create(i)}else s="sessionManager"in t?t.sessionManager:be.open(t.sessionFile);if(await un(s.getCwd())!==i)throw new Error("\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A");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");await this.replace(e.cwd,e.session.sessionManager,"reload")})}ensureAvailable(){if(this.disposed)throw new Error("\u5DE5\u4F5C\u533A\u670D\u52A1\u5DF2\u5173\u95ED");if(this.active&&!this.active.session.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u5DE5\u4F5C\u533A")}diagnostic(e,t,i,s){let o=`plugin=${t} session=${e.session.sessionManager.getSessionId()} generation=${e.generation} stage=${i}: ${s}`;console.error(o),this.disposed||this.publish({type:"error",message:o})}async replace(e,t,i){let s=this.active,o=await G.discover(e,this.isProjectTrusted(e)),a=cn(),p=await Lt(e,o.extensionRoots),d=new dn({cwd:e,agentDir:pn(),noExtensions:!0,additionalExtensionPaths:p.paths,eventBus:a}),y=null;try{await d.reload();let h=d.getExtensions().errors;if(h.length)throw new Error(h.map(E=>`${E.path}: ${E.error}`).join("; "));let c=t.buildSessionProjection().model?void 0:s?.session.model??this.fallbackModel(),{session:u}=await ln({cwd:e,sessionManager:t,model:c,resourceLoader:d}),g=new Z({enabled:()=>this.telemetry.enabled(),capture:this.reportError,breadcrumb:(E,v)=>this.telemetry.breadcrumb(E,v),anonymize:E=>this.telemetry.anonymize(E)}),m={session:u,cwd:e,catalog:o,bus:a,generation:++this.generation,closing:!1,waitController:new AbortController,interactions:null,detach:()=>{},releasePaths:p.release,tools:g};y=m;let P=E=>{!this.disposed&&this.active===m&&!m.closing&&this.publish(E)};m.interactions=new X(a,E=>!m.closing&&E.sessionId===u.sessionManager.getSessionId()&&o.has(E.pluginId),()=>P({type:"snapshot",session:this.snapshotOf(m)}));let I=0,w=a.on(he,()=>P({type:"snapshot",session:this.snapshotOf(m)})),f=u.subscribe(E=>{if(this.active===m&&!m.closing){let v={...m.operation,session:this.telemetry.anonymize(u.sessionManager.getSessionId()),piVersion:ve,model:u.model?`${u.model.provider}/${u.model.id}`:null,thinkingLevel:u.thinkingLevel};if(E.type==="agent_start"&&this.telemetry.breadcrumb("agent_start",v),E.type==="tool_execution_start"&&g.start(E,v),E.type==="tool_execution_end"&&g.end(E,v),E.type==="message_end"&&E.message.role==="assistant"&&E.message.stopReason==="error"){m.agentErrorReported=!0;let Ce=this.reportError(new Error("Agent response failed"),{...m.operation,stage:"agent",code:"agent_failed",piVersion:ve});P({type:"error",message:E.message.errorMessage??"Agent response failed",errorCode:"unexpected_error",errorId:Ce,...m.operation})}E.type==="message_end"&&E.message.role==="toolResult"&&g.message(E.message,v),E.type==="agent_settled"&&(this.telemetry.breadcrumb("agent_end",v),g.clear(),m.operation=void 0)}E.type==="message_update"&&E.message.role==="assistant"&&Date.now()-I>=60&&(I=Date.now(),P({type:"stream",message:{id:"stream",role:"assistant",timestamp:new Date(E.message.timestamp).toISOString(),blocks:H(E.message.content)}})),["message_end","agent_start","agent_settled","session_info_changed","entry_appended"].includes(E.type)&&(E.type==="message_end"&&E.message.role==="assistant"&&P({type:"stream",message:null}),P({type:"snapshot",session:this.snapshotOf(m)}))});m.detach=()=>{w(),f()};let C=[],L=!0;if(await u.bindExtensions({mode:"print",shutdownHandler:()=>{},onError:E=>{L&&C.push(E.error),this.diagnostic(m,o.plugins.find(v=>E.extensionPath.startsWith(v.root+"/"))?.id??E.extensionPath,E.event??"runtime",E.error)}}),L=!1,C.length)throw new Error(C.join("; "));if(this.ensureAvailable(),s&&await this.close(s,i),this.disposed)throw new Error("\u5DE5\u4F5C\u533A\u670D\u52A1\u5DF2\u5173\u95ED");this.active=m,y=null,this.publish({type:"stream",message:null}),this.publish({type:"snapshot",session:this.snapshot()})}catch(h){throw y?await this.close(y,"quit"):(a.clear(),await p.release()),h}}async close(e,t){e.closing||(e.closing=!0,e.tools.clear(),e.waitController.abort(),e.interactions.dispose(),await Ft(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:s}=e,o=t.sessionManager.getBranch().flatMap(a=>{let p=De(a);return p?[p]:[]});return{schemaVersion:1,sessionId:t.sessionManager.getSessionId(),cwd:i,name:je(t.sessionManager.getSessionName(),o),model:t.model?`${t.model.provider}/${t.model.id}`:null,thinkingLevel:t.thinkingLevel,thinkingLevels:t.getAvailableThinkingLevels(),idle:t.isIdle,paused:ie(t.sessionManager.getBranch()),contextUsage:t.getContextUsage()??null,messages:o,interactions:e.interactions.pending(t.sessionManager.getSessionId()),pluginEntries:We(t.sessionManager.getBranch(),s.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,s=await we(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()}),s}resolveInteraction(e,t,i,s){if(this.disposed||!this.active||this.active.closing)throw new Error("Interaction host unavailable");this.active.interactions.resolve(e,t,i,s)}async send(e,t=[],i){if(this.disposed||!this.session||!this.session.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let s=this.session,o=this.active;o.operation=i,this.telemetry.breadcrumb("send",{...i,piVersion:ve}),o.agentErrorReported=!1;let a=!1,p,d,y=new Promise((h,c)=>{p=h,d=c});s.prompt(e,{images:t,preflightResult:h=>{h&&(a=!0,p())}}).then(()=>{a||p()}).catch(h=>{if(!a)d(h);else if(this.active===o&&!o.closing&&!o.agentErrorReported){let c=this.reportError(te(h,"Agent response failed"),{...i,stage:"agent",code:"agent_failed",piVersion:ve});this.publish({type:"error",message:h instanceof Error?h.message:"Pi \u8BF7\u6C42\u5931\u8D25",errorCode:"unexpected_error",errorId:c,...i})}});try{await y}catch(h){throw o.operation=void 0,h}}async stop(){let e=this.active;!e||e.session.isIdle||(e.tools.cancel(),this.telemetry.breadcrumb("cancel",{...e.operation}),e.session.sessionManager.appendCustomEntry(re),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(!ie(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(!ie(i.sessionManager.getBranch()))throw new Error("\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6682\u505C\u7684\u4EFB\u52A1");let o=ye(this.snapshotOf(t).messages);t.operation=e,t.agentErrorReported=!1,this.telemetry.breadcrumb("resume",{...e}),i.sendCustomMessage(o,{triggerTurn:!0}).catch(a=>{if(this.active===t&&!t.closing&&!t.agentErrorReported){let p=this.reportError(te(a,"Agent resume failed"),{...e,stage:"agent",code:"agent_failed"});this.publish({type:"error",message:a instanceof Error?a.message:"\u7EE7\u7EED\u5931\u8D25",errorId:p,...e})}})}async models(){return(await this.session?.modelRuntime.getAvailable()??[]).map(t=>({provider:t.provider,id:t.id,name:t.name}))}async setModel(e,t){if(this.disposed||!this.session||!this.session.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let i=this.session.modelRuntime.getModel(e,t);if(!i)throw new Error("\u6A21\u578B\u4E0D\u53EF\u7528");await this.session.setModel(i),this.publish({type:"snapshot",session:this.snapshot()})}dispose(){return this.disposed=!0,this.queue.run(async()=>{let e=this.active;this.active=null,e&&await this.close(e,"quit")})}};import{basename as Ue,dirname as fn}from"node:path";function Ht(r,e){let t=i=>e[i].map(s=>({name:i==="skills"&&Ue(s.path).toLowerCase()==="skill.md"?Ue(fn(s.path)):Ue(s.path),path:s.path,source:s.metadata.source,scope:s.metadata.scope,enabled:s.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 gn}from"node:child_process";var mn=(r,e)=>new Promise((t,i)=>{gn(r,[...e],{windowsHide:!0},s=>{s?i(s):t()})});async function ze(r,e=process.platform,t=process.env,i=mn){if(t.SSH_CONNECTION||t.SSH_TTY||t.SSH_CLIENT||e==="linux"&&!t.DISPLAY&&!t.WAYLAND_DISPLAY)return!1;let s=e==="darwin"?"open":e==="linux"?"xdg-open":e==="win32"?"explorer.exe":null;return s===null?!1:(await i(s,[r]),!0)}import{execFile as kn}from"node:child_process";import{randomUUID as En}from"node:crypto";import{existsSync as Yt}from"node:fs";import{access as Pn,mkdir as In,readFile as Xt,rename as xn,rm as Ke,writeFile as Zt}from"node:fs/promises";import{join as D}from"node:path";import{promisify as Sn}from"node:util";import{realpathSync as Jt,statSync as hn}from"node:fs";import{basename as wn,delimiter as yn,dirname as Kt,join as He,resolve as bn}from"node:path";function Gt(r){if(!r)return null;try{let e=Jt(r);return wn(e)==="npm-cli.js"&&hn(e).isFile()?e:null}catch{return null}}function vn({execPath:r=process.execPath,env:e=process.env}={}){let t=Gt(e.npm_execpath);if(t)return t;let i=new Set([Kt(r)]);try{i.add(Kt(Jt(r)))}catch{}let s=Object.entries(e).find(([o])=>o.toLowerCase()==="path")?.[1]??"";for(let o of s.split(yn).filter(Boolean))i.add(bn(o));for(let o of i)for(let a of[He(o,"node_modules","npm","bin","npm-cli.js"),He(o,"..","lib","node_modules","npm","bin","npm-cli.js"),He(o,"npm")]){let p=Gt(a);if(p)return p}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 qt(r){return{file:process.execPath,args:[vn(),...r]}}var Cn=Sn(kn),Ee=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/;function _n(r,e){let t=Ee.exec(r),i=Ee.exec(e);if(!t||!i)throw new Error("\u7248\u672C\u53F7\u65E0\u6548");for(let s=1;s<=3;s++){let o=Number(t[s])-Number(i[s]);if(o)return o}return!t[4]&&i[4]?1:t[4]&&!i[4]?-1:(t[4]??"").localeCompare(i[4]??"",void 0,{numeric:!0})}async function Tn(r){try{let e=qt(r),{stdout:t}=await Cn(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 Pe=class{agentDir;packageRoot;launcherNonce;runNpm;preparing=!1;restartPending=!1;constructor(e){this.agentDir=e.agentDir,this.packageRoot=e.packageRoot,this.launcherNonce=e.launcherNonce,this.runNpm=e.runNpm??Tn}async current(){let e=JSON.parse(await Xt(D(this.packageRoot,"package.json"),"utf8"));if(e.name!=="pi-webapp"||typeof e.version!="string"||!Ee.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(),t=Yt(D(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 s=JSON.parse((await this.runNpm(["view","pi-webapp","dist-tags.latest","--json","--prefer-online"])).trim());if(typeof s!="string"||!Ee.test(s))throw new Error("npm \u8FD4\u56DE\u7684\u7248\u672C\u53F7\u65E0\u6548");i.latest=s,i.available=_n(s,e)>0}catch(s){throw new Error(`\u68C0\u67E5 npm \u66F4\u65B0\u5931\u8D25\uFF1A${s instanceof Error?s.message:String(s)}`)}return i}async prepare(){if(!this.launcherNonce)throw new Error("\u5F53\u524D\u9875\u9762\u65E0\u6CD5\u81EA\u52A8\u91CD\u542F Pi");if(Yt(D(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=D(this.agentDir,"pi-web","releases",e.latest);await Ke(t,{recursive:!0,force:!0}),await In(t,{recursive:!0});try{await this.runNpm(["install",`pi-webapp@${e.latest}`,"--prefix",t,"--ignore-scripts","--no-save","--no-audit","--no-fund"]);let i=D(t,"node_modules","pi-webapp"),s=JSON.parse(await Xt(D(i,"package.json"),"utf8"));if(s.name!=="pi-webapp"||s.version!==e.latest)throw new Error("\u4E0B\u8F7D\u7684\u5305\u4E0E\u76EE\u6807\u7248\u672C\u4E0D\u7B26");let o=D(i,"bin","pi-webapp.mjs");await Promise.all([o,D(i,"dist","extension.js"),D(i,"web","dist","index.html")].map(d=>Pn(d)));let a=D(this.agentDir,"pi-web"),p=D(a,`update.${En()}.tmp`);try{await Zt(p,JSON.stringify({version:e.latest,launcher:o}),{mode:384}),await xn(p,D(a,"update.json"))}finally{await Ke(p,{force:!0})}return this.restartPending=!0,{version:e.latest,launcher:o}}catch(i){throw await Ke(t,{recursive:!0,force:!0}),i}}finally{this.preparing=!1}}async requestRestart(e){if(!this.launcherNonce)throw new Error("\u5F53\u524D\u9875\u9762\u65E0\u6CD5\u81EA\u52A8\u91CD\u542F Pi");try{await Zt(D(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 $n}from"node:crypto";async function An(){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 V({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:ue,buildId:$}}finally{await r.close()}}var Qt=Je(Rn(Dn(import.meta.url)),"../web/dist"),Fn=Symbol.for(`pi-web.bridge-state:${import.meta.url}`),n=globalThis[Fn]??={bridge:null,current:null,commandContext:null,pi:null,replacementContext:null,replacementSessionId:null,lastStreamAt:0,workspaces:null,workspaceSessions:null,selected:"tui",activeWorkspaceId:null,autoOpened:!1,tuiCatalog:null,stopPluginWatch:null,interactions:null,lifecycle:new J,tuiGeneration:0,stopChanged:null,tuiWaitController:new AbortController};n.lifecycle??=new J;n.tuiGeneration??=0;n.stopChanged??=null;n.tuiWaitController??=new AbortController;function le(){return n.selected==="sdk"?n.workspaceSessions?.catalog??null:n.tuiCatalog}var Ln=null;function Vn(){return Ln??=jn.create({refreshOnCreate:!1})}var Se=new Map;async function Q(){let r=await Vn(),e=n.selected==="tui"?n.current?.modelRegistry:void 0,t=new Set(e?.getRegisteredProviderIds()??[]);for(let i of Se.keys())t.has(i)||(r.unregisterProvider(i),Se.delete(i));for(let i of t){let s=e?.getRegisteredNativeProvider(i),o=e?.getRegisteredProviderConfig(i),a=s??o;!a||Se.get(i)===a||(s?r.registerNativeProvider(s):o&&r.registerProvider(i,o),Se.set(i,a))}return await r.refresh({allowNetwork:!1}),r}function A(){if(n.selected==="sdk")return n.workspaceSessions?.snapshot()??(()=>{throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD")})();if(n.current===null)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD");return{...Ct(n.current,n.current.sessionManager.getSessionName(),le()?.ids()??[]),interactions:n.interactions?.pending(n.current.sessionManager.getSessionId())??[]}}function _(r){if(A().sessionId!==r)throw new Error("\u4F1A\u8BDD\u5DF2\u5207\u6362")}async function rr(){let r=(n.workspaces?.list()??[]).map(o=>({...o})),e=A(),t=await se(e.cwd).catch(o=>(n.bridge?.reportError?.(o,{stage:"workspace_path"}),null)),i=await tr.listAll(),s=(await Promise.all(r.map(async o=>{let p=(await oe(o.path,i).catch(d=>(d instanceof ne?o.available=!1:n.bridge?.reportError?.(d,{stage:"workspace_sessions"}),[]))).map(d=>({id:d.id,workspaceId:o.id,path:d.path,name:d.name||d.firstMessage?.slice(0,50)||"\u5F53\u524D\u4F1A\u8BDD",modified:d.modified.toISOString()}));return o.path===t&&!p.some(d=>d.id===e.sessionId)&&p.unshift({id:e.sessionId,workspaceId:o.id,path:null,name:e.name,modified:new Date().toISOString()}),p}))).flat();return{items:r,activeId:n.activeWorkspaceId,sessions:s}}async function F(){try{n.bridge&&n.bridge.publish({type:"workspaces",value:await rr()})}catch(r){n.bridge?.reportError?.(r,{stage:"workspace_list"})}}async function Ge(r,e=!1){let t=n.workspaces?.get(r);if(!t)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");if(await K(t.path),!e&&n.current&&t.path===await se(n.current.cwd)){if(n.selected==="sdk"&&n.workspaceSessions?.session&&!n.workspaceSessions.session.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u5DE5\u4F5C\u533A");n.selected="tui",n.activeWorkspaceId=r,n.bridge?.publish({type:"stream",message:null}),n.bridge?.publish({type:"snapshot",session:A()})}else{if(!n.workspaceSessions)throw new Error("Pi \u5DE5\u4F5C\u533A\u670D\u52A1\u4E0D\u53EF\u7528");await n.workspaceSessions.open(t.path,e?"new":"continue"),n.selected="sdk",n.activeWorkspaceId=r,n.bridge?.publish({type:"snapshot",session:A()})}await F()}function j(r){let e=n.current;if(e===null||e.sessionManager.getSessionId()!==r)throw new Error("\u4F1A\u8BDD\u5DF2\u5207\u6362");return e}function T(r){n.current=r,n.selected==="tui"&&n.bridge?.publish({type:"snapshot",session:A()})}function ir(){if(n.current===null)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD");let r=n.selected==="sdk"?n.workspaceSessions?.path:n.current.cwd;if(!r)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u5DE5\u4F5C\u533A");let e=n.selected==="tui"?n.current.isProjectTrusted():n.workspaceSessions?.session?.settingsManager.isProjectTrusted()??!1;return On.create(r,void 0,{projectTrusted:e})}async function nr(){let r=ir(),e=s=>({packages:(s.packages??[]).map(o=>typeof o=="string"?o:o.source),extensions:s.extensions??[],skills:s.skills??[]}),t=new er({cwd:A().cwd,agentDir:q(),settingsManager:r}),i=Ht(t.listConfiguredPackages(),await t.resolve(async()=>"skip"));return{projectTrusted:r.isProjectTrusted(),global:e(r.getGlobalSettings()),project:e(r.getProjectSettings()),installed:i}}async function Un(r){_(r.sessionId);let e=n.selected==="tui"?j(r.sessionId):null;if(e?!e.isIdle():!n.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let t=ir();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(),s=r.scope==="project"?t.getProjectSettings():t.getGlobalSettings();if(r.kind==="packages"){let o=new er({cwd:A().cwd,agentDir:q(),settingsManager:t});r.action==="add"?await o.installAndPersist(i,{local:r.scope==="project"}):await o.removeAndPersist(i,{local:r.scope==="project"})}else if(r.kind==="extensions"){let o=s.extensions??[],a=r.action==="add"?[...new Set([...o,i])]:o.filter(p=>p!==i);r.scope==="project"?t.setProjectExtensionPaths(a):t.setExtensionPaths(a)}else{let o=s.skills??[],a=r.action==="add"?[...new Set([...o,i])]:o.filter(p=>p!==i);r.scope==="project"?t.setProjectSkillPaths(a):t.setSkillPaths(a)}return await t.flush(),n.selected==="tui"?(n.commandContext&&await n.commandContext.reload(),n.current&&T(n.current)):(await n.workspaceSessions?.reload(),n.bridge?.publish({type:"plugins_changed"})),await nr()}function qe(r,e=ze){n.pi=r,n.tools?.clear(),n.tools=new Z({enabled:()=>!!n.telemetry?.enabled&&!!n.bridge,capture:(o,a)=>n.bridge?.reportError?.(o,a),breadcrumb:(o,a)=>n.bridge?.breadcrumb?.(o,a),anonymize:o=>n.telemetry?.session(o)??"unavailable"});let t=o=>({...n.operation,session:n.telemetry?.session(o.sessionManager.getSessionId()),piVersion:xe,model:o.model?`${o.model.provider}/${o.model.id}`:null,thinkingLevel:o.thinkingLevel});n.interactions?.dispose(),n.interactions=new X(r.events,o=>!!n.bridge&&n.selected==="tui"&&o.sessionId===n.current?.sessionManager.getSessionId()&&!!n.tuiCatalog?.has(o.pluginId),()=>{n.current&&n.selected==="tui"&&T(n.current)});let i=()=>{n.stopChanged?.(),n.stopChanged=r.events.on(he,()=>{n.selected==="tui"&&n.current&&T(n.current)})};i(),r.on("session_start",async(o,a)=>{if(n.tools?.clear(),n.operation=void 0,n.tuiWaitController.abort(),n.tuiWaitController=new AbortController,n.tuiGeneration++,i(),n.current=a,n.bridge){let p=await G.discover(a.cwd,a.isProjectTrusted?.()??!1);if(n.current!==a)return;n.tuiCatalog=p}n.replacementSessionId!==a.sessionManager.getSessionId()&&(n.replacementContext=null,n.replacementSessionId=null),T(a),n.bridge&&n.bridge.publish({type:"plugins_changed"}),n.selected==="tui"&&n.workspaces&&n.workspaces.add(a.cwd).then(async p=>{n.selected!=="tui"||n.current?.sessionManager.getSessionId()!==a.sessionManager.getSessionId()||(n.activeWorkspaceId=p.id,await F())}).catch(p=>{n.bridge?.publish({type:"error",message:p instanceof Error?p.message:"\u65E0\u6CD5\u6CE8\u518C\u5F53\u524D\u5DE5\u4F5C\u533A",errorCode:"unexpected_error",errorId:n.bridge.reportError?.(p,{stage:"workspace_register"})})}),process.env.PI_WEBAPP_AUTO_OPEN==="1"&&a.mode==="tui"&&!n.autoOpened&&(n.autoOpened=!0,s(a).catch(p=>{a.ui.notify(p instanceof Error?p.message:"Web \u542F\u52A8\u5931\u8D25","error")}))}),r.on("agent_start",(o,a)=>{n.selected==="tui"&&n.bridge?.breadcrumb?.("agent_start",t(a)),T(a)}),r.on("agent_end",(o,a)=>T(a)),r.on("agent_settled",(o,a)=>{n.selected==="tui"&&(n.bridge?.breadcrumb?.("agent_end",t(a)),n.tools?.clear(),n.operation=void 0),T(a)}),r.on("tool_execution_start",(o,a)=>{n.selected==="tui"&&n.tools?.start(o,t(a))}),r.on("tool_execution_end",(o,a)=>{n.selected==="tui"&&n.tools?.end(o,t(a))}),r.on("model_select",(o,a)=>T(a)),r.on("thinking_level_select",(o,a)=>T(a)),r.on("message_end",(o,a)=>{if(n.selected==="tui"&&o.message.role==="assistant"&&o.message.stopReason==="error"){let p=n.bridge?.reportError?.(new Error("Agent response failed"),{...n.operation,stage:"agent",code:"agent_failed",piVersion:xe});n.bridge?.publish({type:"error",message:o.message.errorMessage??"Agent response failed",errorCode:"unexpected_error",errorId:p,...n.operation})}n.selected==="tui"&&o.message.role==="toolResult"&&n.tools?.message(o.message,t(a)),n.selected==="tui"&&o.message.role==="assistant"&&n.bridge?.publish({type:"stream",message:null}),T(a),n.selected==="tui"&&F()}),r.on("session_info_changed",(o,a)=>T(a)),r.on("message_update",(o,a)=>{if(n.current=a,n.selected!=="tui"||o.message.role!=="assistant"||n.bridge===null)return;let p=Date.now();p-n.lastStreamAt<60||(n.lastStreamAt=p,n.bridge.publish({type:"stream",message:{id:"stream",role:"assistant",timestamp:new Date(o.message.timestamp).toISOString(),blocks:H(o.message.content)}}))}),r.on("session_shutdown",async o=>{if(n.tools?.clear(),n.operation=void 0,n.tuiWaitController.abort(),n.tuiGeneration++,n.stopChanged?.(),n.stopChanged=null,n.interactions?.cancelAll(),n.current=null,o.reason==="new"||o.reason==="resume"||o.reason==="fork"||o.reason==="reload")return;let a=n.bridge,p=n.telemetry;n.bridge=null,n.commandContext=null,n.replacementContext=null,n.replacementSessionId=null,n.pi=null;let d=n.workspaceSessions;n.workspaceSessions=null,await d?.dispose(),n.selected="tui",n.activeWorkspaceId=null,n.autoOpened=!1,n.tuiCatalog=null,n.stopPluginWatch?.(),n.stopPluginWatch=null,n.operation=void 0,n.telemetry=null,a?await a.close():await p?.close()});let s=async o=>{n.telemetry??=new V;try{n.current=o,n.commandContext="newSession"in o?o:null,n.pi=r,n.tuiCatalog=await G.discover(o.cwd,o.isProjectTrusted?.()??!1),n.workspaces===null&&(n.workspaces=new me(Mt(q())),await n.workspaces.load());try{await n.workspaces.discover((await tr.listAll()).map(d=>d.cwd))}catch(d){o.ui.notify(`\u65E0\u6CD5\u8BFB\u53D6\u90E8\u5206 Pi \u5386\u53F2\u5DE5\u4F5C\u533A\uFF1A${d instanceof Error?d.message:String(d)}`,"warning")}let a=await n.workspaces.add(o.cwd);if(n.selected==="tui"&&(n.activeWorkspaceId=a.id),n.bridge&&(n.bridge.protocolVersion!==7||n.bridge.buildId!==$||typeof n.bridge.reportError!="function")){let d=n.bridge;if(n.workspaceSessions&&n.workspaceSessions.telemetryVersion!==2&&n.workspaceSessions.session&&!n.workspaceSessions.session.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u5DE5\u4F5C\u533A");n.bridge=null,await d.close(),await n.telemetry.close(),n.telemetry=new V}if(n.bridge===null){let d=n.workspaceSessions?.telemetryVersion!==2?n.workspaceSessions:null,y=d?.session&&d.path?{path:d.path,sessionManager:d.session.sessionManager}:null;d&&(await d.dispose(),n.workspaceSessions=null),n.workspaceSessions??=new ke(c=>{n.selected==="sdk"&&(n.bridge?.publish(c),c.type==="snapshot"&&c.session.idle&&F())},()=>n.current?.model,c=>{try{return!!n.current&&Nn(n.current.cwd)===c&&(n.current.isProjectTrusted?.()??!1)}catch{return!1}},(c,u)=>n.bridge?.reportError?.(c,u),{enabled:()=>!!n.telemetry?.enabled&&!!n.bridge,breadcrumb:(c,u)=>n.bridge?.breadcrumb?.(c,u),anonymize:c=>n.telemetry?.session(c)??"unavailable"}),y&&await n.workspaceSessions.open(y.path,{sessionManager:y.sessionManager});let h={selfUpdate:new Pe({agentDir:q(),packageRoot:Je(Qt,"../.."),launcherNonce:process.env.PI_WEBAPP_LAUNCHER_NONCE}),snapshot:A,plugins:async()=>{let c=le();return await c?.refreshAssets(),c?.view()??{plugins:[],errors:[]}},pluginAsset:async c=>le()?.asset(c)??null,async invokePluginAction(c,u,g,m){if(_(c),!le()?.has(u))throw new Error("\u63D2\u4EF6\u672A\u542F\u7528");let P=n.selected,I=n.tuiGeneration,w=n.workspaceSessions?.session,f={requestId:$n(),sessionId:c,pluginId:u,action:g,input:m},C=n.selected==="sdk"?await n.workspaceSessions.invokePluginAction(f):await we(n.pi.events,f,15e3,n.tuiWaitController.signal);if(_(c),P!==n.selected||(P==="tui"?I!==n.tuiGeneration:w!==n.workspaceSessions?.session))throw new Error("\u4F1A\u8BDD\u8FD0\u884C\u5B9E\u4F8B\u5DF2\u5207\u6362");return n.selected==="tui"&&n.current&&T(n.current),C},async resolvePluginInteraction(c,u,g,m){if(_(c),!le()?.has(u))throw new Error("\u63D2\u4EF6\u672A\u542F\u7528");n.selected==="sdk"?n.workspaceSessions.resolveInteraction(c,u,g,m):n.interactions.resolve(c,u,g,m)},image(c,u,g){_(c);let P=(n.selected==="sdk"?n.workspaceSessions?.session?.sessionManager.getBranch():n.current?.sessionManager.getBranch())?.find(w=>w.id===u);if(P?.type!=="message"||P.message.role!=="user"||!Array.isArray(P.message.content))return null;let I=P.message.content[g];return I?.type!=="image"?null:{data:Buffer.from(I.data,"base64"),mimeType:I.mimeType}},async workspaces(){return rr()},async addWorkspace(c,u){let g=await n.workspaces.add(c,u);try{await Ge(g.id,!0)}catch(m){throw await F(),m}},async selectWorkspace(c){await Ge(c)},async newSessionInWorkspace(c){await Ge(c,!0)},async removeWorkspace(c){if(c===n.activeWorkspaceId)throw new Error("\u8BF7\u5148\u5207\u6362\u5230\u5176\u4ED6\u5DE5\u4F5C\u533A");await n.workspaces.remove(c),await F()},async selectSession(c,u,g){let m=n.workspaces?.get(c);if(!m)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");if(await K(m.path),u===n.current?.sessionManager.getSessionId()&&m.path===await se(n.current.cwd)){if(n.selected==="sdk"&&n.workspaceSessions?.session&&!n.workspaceSessions.session.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u4F1A\u8BDD");n.selected="tui",n.activeWorkspaceId=c,n.bridge?.publish({type:"snapshot",session:A()})}else{if(n.selected==="sdk"&&n.workspaceSessions?.session?.sessionManager.getSessionId()===u&&n.workspaceSessions.path===m.path)return;if(!(await oe(m.path)).some(I=>I.id===u&&I.path===g))throw new Error("\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A");await n.workspaceSessions.open(m.path,{sessionFile:g}),n.selected="sdk",n.activeWorkspaceId=c,n.bridge?.publish({type:"snapshot",session:A()})}await F()},async models(){if(n.selected==="sdk")return n.workspaceSessions?.models()??[];let c=n.current;if(!c)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD");let u=c.scopedModels?.map(g=>`${g.model.provider}/${g.model.id}`)??[];return c.modelRegistry.getAvailable().filter(g=>u.length===0||u.includes(`${g.provider}/${g.id}`)).map(g=>({provider:g.provider,id:g.id,name:g.name}))},async providers(){let c=await Q(),u=new Set((await c.listCredentials()).map(g=>g.providerId));return c.getProviders().map(g=>({id:g.id,name:g.name,configured:c.getProviderAuthStatus(g.id).configured,storedCredential:u.has(g.id),methods:[g.auth.apiKey?.login?"api_key":null,g.auth.oauth?"oauth":null].filter(m=>m!==null)}))},async providerModels(c){let u=await Q();return gt(Ie(q(),"models.json"),c,u)},async updateProviderModel(c,u,g){if(_(c),n.selected==="tui"?!j(c).isIdle():!n.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let m=A().model;if(g.action==="remove"&&m===`${u}/${g.id}`)throw new Error("\u8BF7\u5148\u5207\u6362\u5F53\u524D\u4F7F\u7528\u7684\u6A21\u578B");if(g.action==="save"&&g.originalId&&g.originalId!==g.model.id&&m===`${u}/${g.originalId}`)throw new Error("\u8BF7\u5148\u5207\u6362\u5F53\u524D\u4F7F\u7528\u7684\u6A21\u578B");let P=await Q();await mt(Ie(q(),"models.json"),u,g,P),await P.refresh({providers:[u],allowNetwork:!1}),await n.current?.modelRegistry.refresh({providers:[u],allowNetwork:!1}),await n.workspaceSessions?.session?.modelRuntime.refresh({providers:[u],allowNetwork:!1});let I=g.action==="save"?g.model.id:g.action==="base_url"&&m?.startsWith(`${u}/`)?m.slice(u.length+1):null;if(I&&m===`${u}/${I}`)if(n.selected==="sdk")try{await n.workspaceSessions.setModel(u,I)}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 w=j(c),f=w.modelRegistry.find(u,I);if(!f||!n.pi||!await n.pi.setModel(f))throw new Error("\u6A21\u578B\u5DF2\u4FDD\u5B58\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\u8BE5\u6A21\u578B\u4EE5\u5E94\u7528\u65B0\u53C2\u6570");T(w)}},async logoutProvider(c,u){if(_(c),n.selected==="tui"?!j(c).isIdle():!n.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let g=await Q();if(!(await g.listCredentials()).some(m=>m.providerId===u))throw new Error("\u8BE5\u63D0\u4F9B\u65B9\u6CA1\u6709\u5DF2\u4FDD\u5B58\u7684\u8BA4\u8BC1");await g.logout(u),await n.current?.modelRegistry.refresh({providers:[u],allowNetwork:!1}),await n.workspaceSessions?.session?.modelRuntime.refresh({providers:[u],allowNetwork:!1})},async loginProvider(c,u,g){let m=await Q();await m.login(c,u,lt(c,u,g)),await m.refresh({providers:[c],allowNetwork:!1}),await n.current?.modelRegistry.refresh({providers:[c],allowNetwork:!1}),await n.workspaceSessions?.session?.modelRuntime.refresh({providers:[c],allowNetwork:!1})},async addCustomProvider(c,u){if(_(c),n.selected==="tui"?!j(c).isIdle():!n.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let g=await Q();if(g.getProvider(u.id))throw new Error("\u63D0\u4F9B\u65B9\u5DF2\u5B58\u5728");await ct(Ie(q(),"models.json"),u),await g.refresh({allowNetwork:!1}),await n.current?.modelRegistry.refresh({allowNetwork:!1}),await n.workspaceSessions?.session?.modelRuntime.refresh({allowNetwork:!1})},commands(){return n.selected==="tui"?(n.pi?.getCommands()??[]).filter(c=>c.name!=="web"&&c.name!=="web-dev-reload").map(c=>({name:c.name,description:c.description})):[]},async compact(c){if(_(c),n.selected==="sdk"){let g=n.workspaceSessions?.session;if(!g||!g.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");await g.compact(),n.bridge?.publish({type:"snapshot",session:A()});return}let u=j(c);if(!u.isIdle())throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");u.compact()},async setModel(c,u,g){if(_(c),n.selected==="sdk"){await n.workspaceSessions.setModel(u,g);return}let m=j(c);if(!m.isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let P=m.modelRegistry.find(u,g);if(!P||!m.modelRegistry.getAvailable().some(I=>I.provider===u&&I.id===g))throw new Error("\u6A21\u578B\u4E0D\u53EF\u7528");if(!n.pi||!await n.pi.setModel(P))throw new Error("\u6A21\u578B\u63D0\u4F9B\u65B9\u672A\u914D\u7F6E\u8BA4\u8BC1");T(m)},async setThinkingLevel(c,u){if(_(c),!["off","minimal","low","medium","high","xhigh"].includes(u))throw new Error("\u63A8\u7406\u5F3A\u5EA6\u65E0\u6548");if(n.selected==="sdk"){let P=n.workspaceSessions?.session;if(!P||!P.isIdle||!P.getAvailableThinkingLevels().includes(u))throw new Error("\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u6B64\u63A8\u7406\u5F3A\u5EA6");P.setThinkingLevel(u),n.bridge?.publish({type:"snapshot",session:A()});return}let m=j(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||!Bn(m.model).includes(u))throw new Error("\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u6B64\u63A8\u7406\u5F3A\u5EA6");if(!n.pi)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");n.pi.setThinkingLevel(u),T(m)},config:nr,updateConfig:Un,async send(c,u,g=[],m){if(_(c),n.selected==="sdk"){await n.workspaceSessions.send(u,g,m);return}if(!j(c).isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");n.operation=m;try{if(n.bridge?.breadcrumb?.("send",{...m,piVersion:xe}),n.replacementContext!==null&&n.replacementSessionId===c){await n.replacementContext.sendUserMessage(g.length?[{type:"text",text:u},...g]:u,{expandPromptTemplates:!0});return}if(n.pi===null)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");n.pi.sendUserMessage(g.length?[{type:"text",text:u},...g]:u,{expandPromptTemplates:!0})}catch(I){throw n.operation=void 0,I}},async abort(c){if(_(c),n.selected==="sdk")await n.workspaceSessions.stop();else{let u=j(c);if(u.isIdle())return;if(!n.pi)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");n.tools?.cancel(),n.bridge?.breadcrumb?.("cancel",{...n.operation}),n.pi.appendEntry(re),u.abort()}},async resume(c,u){if(_(c),n.selected==="sdk"){await n.workspaceSessions.resume(u);return}let g=j(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||!n.pi)throw new Error("\u8BF7\u5148\u9009\u62E9\u6A21\u578B");if(!g.modelRegistry.hasConfiguredAuth(g.model))throw new Error("\u8BF7\u5148\u8FDE\u63A5\u5F53\u524D\u6A21\u578B");n.operation=u;try{n.pi.sendMessage(ye(A().messages),{triggerTurn:!0})}catch(m){throw n.operation=void 0,m}},async newSession(c){if(_(c),n.selected==="sdk"){let m=n.workspaces?.get(n.activeWorkspaceId??"");if(!m)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");await n.workspaceSessions.open(m.path,"new"),await F();return}let u=j(c);if(!u.isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(n.commandContext===null){await n.workspaceSessions.open(u.cwd,"new"),n.selected="sdk",n.bridge?.publish({type:"snapshot",session:A()}),await F();return}if((await n.commandContext.newSession({withSession:async m=>{n.commandContext=m,n.replacementContext=m,n.replacementSessionId=m.sessionManager.getSessionId(),n.current=m}})).cancelled)throw new Error("\u65B0\u4F1A\u8BDD\u5DF2\u53D6\u6D88");await F()}};h.addWorkspace=n.lifecycle.wrap(h.addWorkspace),h.selectWorkspace=n.lifecycle.wrap(h.selectWorkspace),h.newSessionInWorkspace=n.lifecycle.wrap(h.newSessionInWorkspace),h.removeWorkspace=n.lifecycle.wrap(h.removeWorkspace),h.selectSession=n.lifecycle.wrap(h.selectSession),h.newSession=n.lifecycle.wrap(h.newSession),h.updateConfig=n.lifecycle.wrap(h.updateConfig),n.bridge=await xt(h,Qt,n.telemetry)}if(n.stopPluginWatch===null&&process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS){let d=[],y=null;for(let h of(process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS??"").split(Mn).filter(Boolean))try{d.push(Wn(Ie(Je(h),"dist"),(c,u)=>{let g=String(u??"");["client.js","client.css"].includes(g)&&(y&&clearTimeout(y),y=setTimeout(()=>n.bridge?.publish({type:"plugins_changed"}),180))}))}catch(c){n.bridge?.publish({type:"error",message:`\u63D2\u4EF6\u76D1\u542C\u5931\u8D25\uFF1A${h}: ${String(c)}`})}n.stopPluginWatch=()=>{for(let h of d)h.close();y&&clearTimeout(y)}}let p=await e(n.bridge.url).catch(()=>!1);o.ui.notify(`pi-webapp: ${n.bridge.url}`,p?"info":"warning"),o.ui.setStatus("pi-webapp","Web \u5DF2\u542F\u52A8 \xB7 /web \u91CD\u65B0\u6253\u5F00")}catch(a){throw n.telemetry?.capture(a,{stage:"open_web",piVersion:xe}),n.bridge||(await n.telemetry?.close(),n.telemetry=null),a}};r.registerCommand("web",{description:"Open the current Pi session in a local web interface",handler:async(o,a)=>s(a)}),r.registerCommand("web-dev-reload",{description:"Reload local pi-webapp plugins during development",handler:async(o,a)=>{process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS&&(await a.waitForIdle(),await n.lifecycle.run(async()=>{let p=n.workspaceSessions?.session;p&&(await p.waitForIdle(),await n.workspaceSessions.reload()),await a.reload()}))}})}var Sa=qe;export{Sa as default,An as verifySentryNodeRelease};
28
+ `)}`:void 0,t<3&&r.cause instanceof Error&&(s.cause=zt(r.cause,e,t+1)),Y(s)}var ke=class{telemetryVersion=2;active=null;queue=new J;generation=0;disposed=!1;publish;fallbackModel;isProjectTrusted;reportError;telemetry;constructor(e,t,n=()=>!1,s=()=>{},o={enabled:()=>!1,breadcrumb:()=>{},anonymize:()=>"unavailable"}){this.publish=e,this.fallbackModel=t,this.isProjectTrusted=n,this.reportError=s,this.telemetry={enabled:()=>{try{return o.enabled()}catch{return!1}},breadcrumb:(a,u)=>{try{o.enabled()&&o.breadcrumb(a,u)}catch{}},anonymize:a=>{try{return o.enabled()?o.anonymize(a):"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 n=await K(e),s;if(t==="new")s=be.create(n);else if(t==="continue"){let o=(await oe(n))[0];s=o?be.open(o.path):be.create(n)}else s="sessionManager"in t?t.sessionManager:be.open(t.sessionFile);if(await fi(s.getCwd())!==n)throw new Error("\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A");await this.replace(n,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");await this.replace(e.cwd,e.session.sessionManager,"reload")})}ensureAvailable(){if(this.disposed)throw new Error("\u5DE5\u4F5C\u533A\u670D\u52A1\u5DF2\u5173\u95ED");if(this.active&&!this.active.session.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u5DE5\u4F5C\u533A")}diagnostic(e,t,n,s){let o=`plugin=${t} session=${e.session.sessionManager.getSessionId()} generation=${e.generation} stage=${n}: ${s}`;console.error(o),this.disposed||this.publish({type:"error",message:o})}async replace(e,t,n){let s=this.active,o=await G.discover(e,this.isProjectTrusted(e)),a=di(),u=await Lt(e,o.extensionRoots),d=new pi({cwd:e,agentDir:ui(),noExtensions:!0,additionalExtensionPaths:u.paths,eventBus:a}),y=null;try{await d.reload();let h=d.getExtensions().errors;if(h.length)throw new Error(h.map(E=>`${E.path}: ${E.error}`).join("; "));let c=t.buildSessionProjection().model?void 0:s?.session.model??this.fallbackModel(),{session:p}=await ci({cwd:e,sessionManager:t,model:c,resourceLoader:d}),g=new Z({enabled:()=>this.telemetry.enabled(),capture:this.reportError,breadcrumb:(E,v)=>this.telemetry.breadcrumb(E,v),anonymize:E=>this.telemetry.anonymize(E)}),m={session:p,cwd:e,catalog:o,bus:a,generation:++this.generation,closing:!1,waitController:new AbortController,interactions:null,detach:()=>{},releasePaths:u.release,tools:g};y=m;let P=E=>{!this.disposed&&this.active===m&&!m.closing&&this.publish(E)};m.interactions=new X(a,E=>!m.closing&&E.sessionId===p.sessionManager.getSessionId()&&o.has(E.pluginId),()=>P({type:"snapshot",session:this.snapshotOf(m)}));let x=0,w=a.on(he,()=>P({type:"snapshot",session:this.snapshotOf(m)})),f=p.subscribe(E=>{if(this.active===m&&!m.closing){let v={...m.operation,session:this.telemetry.anonymize(p.sessionManager.getSessionId()),piVersion:ve,model:p.model?`${p.model.provider}/${p.model.id}`:null,thinkingLevel:p.thinkingLevel};if(E.type==="agent_start"&&this.telemetry.breadcrumb("agent_start",v),E.type==="tool_execution_start"&&g.start(E,v),E.type==="tool_execution_end"&&g.end(E,v),E.type==="message_end"&&E.message.role==="assistant"&&E.message.stopReason==="error"){m.agentErrorReported=!0;let Ce=this.reportError(new Error("Agent response failed"),{...m.operation,stage:"agent",code:"agent_failed",piVersion:ve});P({type:"error",message:E.message.errorMessage??"Agent response failed",errorCode:"unexpected_error",errorId:Ce,...m.operation})}E.type==="message_end"&&E.message.role==="toolResult"&&g.message(E.message,v),E.type==="agent_settled"&&(this.telemetry.breadcrumb("agent_end",v),g.clear(),m.operation=void 0)}E.type==="message_update"&&E.message.role==="assistant"&&Date.now()-x>=60&&(x=Date.now(),P({type:"stream",message:{id:"stream",role:"assistant",timestamp:new Date(E.message.timestamp).toISOString(),blocks:H(E.message.content)}})),["message_end","agent_start","agent_settled","session_info_changed","entry_appended"].includes(E.type)&&(E.type==="message_end"&&E.message.role==="assistant"&&P({type:"stream",message:null}),P({type:"snapshot",session:this.snapshotOf(m)}))});m.detach=()=>{w(),f()};let C=[],L=!0;if(await p.bindExtensions({mode:"print",shutdownHandler:()=>{},onError:E=>{L&&C.push(E.error),this.diagnostic(m,o.plugins.find(v=>E.extensionPath.startsWith(v.root+"/"))?.id??E.extensionPath,E.event??"runtime",E.error)}}),L=!1,C.length)throw new Error(C.join("; "));if(this.ensureAvailable(),s&&await this.close(s,n),this.disposed)throw new Error("\u5DE5\u4F5C\u533A\u670D\u52A1\u5DF2\u5173\u95ED");this.active=m,y=null,this.publish({type:"stream",message:null}),this.publish({type:"snapshot",session:this.snapshot()})}catch(h){throw y?await this.close(y,"quit"):(a.clear(),await u.release()),h}}async close(e,t){e.closing||(e.closing=!0,e.tools.clear(),e.waitController.abort(),e.interactions.dispose(),await Ft(e.session,t,n=>this.diagnostic(e,"host","shutdown",n),5e3,()=>{e.detach(),e.bus.clear()}),await e.releasePaths())}snapshotOf(e){let{session:t,cwd:n,catalog:s}=e,o=t.sessionManager.getBranch().flatMap(a=>{let u=De(a);return u?[u]:[]});return{schemaVersion:1,sessionId:t.sessionManager.getSessionId(),cwd:n,name:je(t.sessionManager.getSessionName(),o),model:t.model?`${t.model.provider}/${t.model.id}`:null,thinkingLevel:t.thinkingLevel,thinkingLevels:t.getAvailableThinkingLevels(),idle:t.isIdle,paused:ne(t.sessionManager.getBranch()),contextUsage:t.getContextUsage()??null,messages:o,interactions:e.interactions.pending(t.sessionManager.getSessionId()),pluginEntries:We(t.sessionManager.getBranch(),s.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 n=t.session.extensionRunner,s=await we(t.bus,e,15e3,t.waitController.signal);if(this.active!==t||t.closing||n!==t.session.extensionRunner)throw new Error("\u4F1A\u8BDD\u8FD0\u884C\u5B9E\u4F8B\u5DF2\u5207\u6362");return this.publish({type:"snapshot",session:this.snapshot()}),s}resolveInteraction(e,t,n,s){if(this.disposed||!this.active||this.active.closing)throw new Error("Interaction host unavailable");this.active.interactions.resolve(e,t,n,s)}async send(e,t=[],n){if(this.disposed||!this.session||!this.session.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let s=this.session,o=this.active;o.operation=n,this.telemetry.breadcrumb("send",{...n,piVersion:ve}),o.agentErrorReported=!1;let a=!1,u,d,y=new Promise((h,c)=>{u=h,d=c});s.prompt(e,{images:t,preflightResult:h=>{h&&(a=!0,u())}}).then(()=>{a||u()}).catch(h=>{if(!a)d(h);else if(this.active===o&&!o.closing&&!o.agentErrorReported){let c=this.reportError(te(h,"Agent response failed"),{...n,stage:"agent",code:"agent_failed",piVersion:ve});this.publish({type:"error",message:h instanceof Error?h.message:"Pi \u8BF7\u6C42\u5931\u8D25",errorCode:"unexpected_error",errorId:c,...n})}});try{await y}catch(h){throw o.operation=void 0,h}}async stop(){let e=this.active;!e||e.session.isIdle||(e.tools.cancel(),this.telemetry.breadcrumb("cancel",{...e.operation}),e.session.sessionManager.appendCustomEntry(re),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 n=t.session;if(!n.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(!ne(n.sessionManager.getBranch()))throw new Error("\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6682\u505C\u7684\u4EFB\u52A1");if(!n.model)throw new Error("\u8BF7\u5148\u9009\u62E9\u6A21\u578B");if(!(n.modelRuntime.hasConfiguredAuth(n.model.provider)||await n.modelRuntime.checkAuth(n.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(!n.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(!ne(n.sessionManager.getBranch()))throw new Error("\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6682\u505C\u7684\u4EFB\u52A1");let o=ye(this.snapshotOf(t).messages);t.operation=e,t.agentErrorReported=!1,this.telemetry.breadcrumb("resume",{...e}),n.sendCustomMessage(o,{triggerTurn:!0}).catch(a=>{if(this.active===t&&!t.closing&&!t.agentErrorReported){let u=this.reportError(te(a,"Agent resume failed"),{...e,stage:"agent",code:"agent_failed"});this.publish({type:"error",message:a instanceof Error?a.message:"\u7EE7\u7EED\u5931\u8D25",errorId:u,...e})}})}async models(){return(await this.session?.modelRuntime.getAvailable()??[]).map(t=>({provider:t.provider,id:t.id,name:t.name}))}async setModel(e,t){if(this.disposed||!this.session||!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.modelRuntime.getModel(e,t);if(!n)throw new Error("\u6A21\u578B\u4E0D\u53EF\u7528");await this.session.setModel(n),this.publish({type:"snapshot",session:this.snapshot()})}dispose(){return this.disposed=!0,this.queue.run(async()=>{let e=this.active;this.active=null,e&&await this.close(e,"quit")})}};import{basename as Ue,dirname as gi}from"node:path";function Ht(r,e){let t=n=>e[n].map(s=>({name:n==="skills"&&Ue(s.path).toLowerCase()==="skill.md"?Ue(gi(s.path)):Ue(s.path),path:s.path,source:s.metadata.source,scope:s.metadata.scope,enabled:s.enabled}));return{packages:r.map(n=>({name:n.source,path:n.installedPath??"",source:n.source,scope:n.scope,enabled:!!n.installedPath})),extensions:t("extensions"),skills:t("skills")}}import{execFile as mi}from"node:child_process";var hi=(r,e)=>new Promise((t,n)=>{mi(r,[...e],{windowsHide:!0},s=>{s?n(s):t()})});async function ze(r,e=process.platform,t=process.env,n=hi){if(t.SSH_CONNECTION||t.SSH_TTY||t.SSH_CLIENT||e==="linux"&&!t.DISPLAY&&!t.WAYLAND_DISPLAY)return!1;let s=e==="darwin"?"open":e==="linux"?"xdg-open":e==="win32"?"explorer.exe":null;return s===null?!1:(await n(s,[r]),!0)}import{execFile as Ei}from"node:child_process";import{randomUUID as Pi}from"node:crypto";import{existsSync as Yt}from"node:fs";import{access as xi,mkdir as Ii,readFile as Xt,rename as Si,rm as Ke,writeFile as Zt}from"node:fs/promises";import{join as D}from"node:path";import{promisify as Ci}from"node:util";import{realpathSync as Jt,statSync as wi}from"node:fs";import{basename as yi,delimiter as bi,dirname as Kt,join as He,resolve as vi}from"node:path";function Gt(r){if(!r)return null;try{let e=Jt(r);return yi(e)==="npm-cli.js"&&wi(e).isFile()?e:null}catch{return null}}function ki({execPath:r=process.execPath,env:e=process.env}={}){let t=Gt(e.npm_execpath);if(t)return t;let n=new Set([Kt(r)]);try{n.add(Kt(Jt(r)))}catch{}let s=Object.entries(e).find(([o])=>o.toLowerCase()==="path")?.[1]??"";for(let o of s.split(bi).filter(Boolean))n.add(vi(o));for(let o of n)for(let a of[He(o,"node_modules","npm","bin","npm-cli.js"),He(o,"..","lib","node_modules","npm","bin","npm-cli.js"),He(o,"npm")]){let u=Gt(a);if(u)return u}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 qt(r){return{file:process.execPath,args:[ki(),...r]}}var _i=Ci(Ei),Ee=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/;function Ti(r,e){let t=Ee.exec(r),n=Ee.exec(e);if(!t||!n)throw new Error("\u7248\u672C\u53F7\u65E0\u6548");for(let s=1;s<=3;s++){let o=Number(t[s])-Number(n[s]);if(o)return o}return!t[4]&&n[4]?1:t[4]&&!n[4]?-1:(t[4]??"").localeCompare(n[4]??"",void 0,{numeric:!0})}async function Ai(r){try{let e=qt(r),{stdout:t}=await _i(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 Pe=class{agentDir;packageRoot;launcherNonce;runNpm;preparing=!1;restartPending=!1;constructor(e){this.agentDir=e.agentDir,this.packageRoot=e.packageRoot,this.launcherNonce=e.launcherNonce,this.runNpm=e.runNpm??Ai}async current(){let e=JSON.parse(await Xt(D(this.packageRoot,"package.json"),"utf8"));if(e.name!=="pi-webapp"||typeof e.version!="string"||!Ee.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(),t=Yt(D(this.packageRoot,".git")),n={current:e,latest:null,available:!1,canRestart:!!this.launcherNonce&&!t};t?n.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":n.canRestart||(n.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 s=JSON.parse((await this.runNpm(["view","pi-webapp","dist-tags.latest","--json","--prefer-online"])).trim()),o=Array.isArray(s)&&s.length===1?s[0]:s;if(typeof o!="string"||!Ee.test(o))throw new Error("npm \u8FD4\u56DE\u7684\u7248\u672C\u53F7\u65E0\u6548");n.latest=o,n.available=Ti(o,e)>0}catch(s){throw new Error(`\u68C0\u67E5 npm \u66F4\u65B0\u5931\u8D25\uFF1A${s instanceof Error?s.message:String(s)}`)}return n}async prepare(){if(!this.launcherNonce)throw new Error("\u5F53\u524D\u9875\u9762\u65E0\u6CD5\u81EA\u52A8\u91CD\u542F Pi");if(Yt(D(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=D(this.agentDir,"pi-web","releases",e.latest);await Ke(t,{recursive:!0,force:!0}),await Ii(t,{recursive:!0});try{await this.runNpm(["install",`pi-webapp@${e.latest}`,"--prefix",t,"--ignore-scripts","--no-save","--no-audit","--no-fund"]);let n=D(t,"node_modules","pi-webapp"),s=JSON.parse(await Xt(D(n,"package.json"),"utf8"));if(s.name!=="pi-webapp"||s.version!==e.latest)throw new Error("\u4E0B\u8F7D\u7684\u5305\u4E0E\u76EE\u6807\u7248\u672C\u4E0D\u7B26");let o=D(n,"bin","pi-webapp.mjs");await Promise.all([o,D(n,"dist","extension.js"),D(n,"web","dist","index.html")].map(d=>xi(d)));let a=D(this.agentDir,"pi-web"),u=D(a,`update.${Pi()}.tmp`);try{await Zt(u,JSON.stringify({version:e.latest,launcher:o}),{mode:384}),await Si(u,D(a,"update.json"))}finally{await Ke(u,{force:!0})}return this.restartPending=!0,{version:e.latest,launcher:o}}catch(n){throw await Ke(t,{recursive:!0,force:!0}),n}}finally{this.preparing=!1}}async requestRestart(e){if(!this.launcherNonce)throw new Error("\u5F53\u524D\u9875\u9762\u65E0\u6CD5\u81EA\u52A8\u91CD\u542F Pi");try{await Zt(D(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 Fi}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 V({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:ue,buildId:B}}finally{await r.close()}}var Qt=Je(Ni(ji(import.meta.url)),"../web/dist"),Li=Symbol.for(`pi-web.bridge-state:${import.meta.url}`),i=globalThis[Li]??={bridge:null,current:null,commandContext:null,pi:null,replacementContext:null,replacementSessionId:null,lastStreamAt:0,workspaces:null,workspaceSessions:null,selected:"tui",activeWorkspaceId:null,autoOpened:!1,tuiCatalog:null,stopPluginWatch:null,interactions:null,lifecycle:new J,tuiGeneration:0,stopChanged:null,tuiWaitController:new AbortController};i.lifecycle??=new J;i.tuiGeneration??=0;i.stopChanged??=null;i.tuiWaitController??=new AbortController;function le(){return i.selected==="sdk"?i.workspaceSessions?.catalog??null:i.tuiCatalog}var Vi=null;function Ui(){return Vi??=Oi.create({refreshOnCreate:!1})}var Se=new Map;async function Q(){let r=await Ui(),e=i.selected==="tui"?i.current?.modelRegistry:void 0,t=new Set(e?.getRegisteredProviderIds()??[]);for(let n of Se.keys())t.has(n)||(r.unregisterProvider(n),Se.delete(n));for(let n of t){let s=e?.getRegisteredNativeProvider(n),o=e?.getRegisteredProviderConfig(n),a=s??o;!a||Se.get(n)===a||(s?r.registerNativeProvider(s):o&&r.registerProvider(n,o),Se.set(n,a))}return await r.refresh({allowNetwork:!1}),r}function A(){if(i.selected==="sdk")return i.workspaceSessions?.snapshot()??(()=>{throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD")})();if(i.current===null)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD");return{...Ct(i.current,i.current.sessionManager.getSessionName(),le()?.ids()??[]),interactions:i.interactions?.pending(i.current.sessionManager.getSessionId())??[]}}function _(r){if(A().sessionId!==r)throw new Error("\u4F1A\u8BDD\u5DF2\u5207\u6362")}async function rr(){let r=(i.workspaces?.list()??[]).map(o=>({...o})),e=A(),t=await se(e.cwd).catch(o=>(i.bridge?.reportError?.(o,{stage:"workspace_path"}),null)),n=await tr.listAll(),s=(await Promise.all(r.map(async o=>{let u=(await oe(o.path,n).catch(d=>(d instanceof ie?o.available=!1:i.bridge?.reportError?.(d,{stage:"workspace_sessions"}),[]))).map(d=>({id:d.id,workspaceId:o.id,path:d.path,name:d.name||d.firstMessage?.slice(0,50)||"\u5F53\u524D\u4F1A\u8BDD",modified:d.modified.toISOString()}));return o.path===t&&!u.some(d=>d.id===e.sessionId)&&u.unshift({id:e.sessionId,workspaceId:o.id,path:null,name:e.name,modified:new Date().toISOString()}),u}))).flat();return{items:r,activeId:i.activeWorkspaceId,sessions:s}}async function F(){try{i.bridge&&i.bridge.publish({type:"workspaces",value:await rr()})}catch(r){i.bridge?.reportError?.(r,{stage:"workspace_list"})}}async function Ge(r,e=!1){let t=i.workspaces?.get(r);if(!t)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");if(await K(t.path),!e&&i.current&&t.path===await se(i.current.cwd)){if(i.selected==="sdk"&&i.workspaceSessions?.session&&!i.workspaceSessions.session.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u5DE5\u4F5C\u533A");i.selected="tui",i.activeWorkspaceId=r,i.bridge?.publish({type:"stream",message:null}),i.bridge?.publish({type:"snapshot",session:A()})}else{if(!i.workspaceSessions)throw new Error("Pi \u5DE5\u4F5C\u533A\u670D\u52A1\u4E0D\u53EF\u7528");await i.workspaceSessions.open(t.path,e?"new":"continue"),i.selected="sdk",i.activeWorkspaceId=r,i.bridge?.publish({type:"snapshot",session:A()})}await F()}function j(r){let e=i.current;if(e===null||e.sessionManager.getSessionId()!==r)throw new Error("\u4F1A\u8BDD\u5DF2\u5207\u6362");return e}function T(r){i.current=r,i.selected==="tui"&&i.bridge?.publish({type:"snapshot",session:A()})}function nr(){if(i.current===null)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD");let r=i.selected==="sdk"?i.workspaceSessions?.path:i.current.cwd;if(!r)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u5DE5\u4F5C\u533A");let e=i.selected==="tui"?i.current.isProjectTrusted():i.workspaceSessions?.session?.settingsManager.isProjectTrusted()??!1;return $i.create(r,void 0,{projectTrusted:e})}async function ir(){let r=nr(),e=s=>({packages:(s.packages??[]).map(o=>typeof o=="string"?o:o.source),extensions:s.extensions??[],skills:s.skills??[]}),t=new er({cwd:A().cwd,agentDir:q(),settingsManager:r}),n=Ht(t.listConfiguredPackages(),await t.resolve(async()=>"skip"));return{projectTrusted:r.isProjectTrusted(),global:e(r.getGlobalSettings()),project:e(r.getProjectSettings()),installed:n}}async function zi(r){_(r.sessionId);let e=i.selected==="tui"?j(r.sessionId):null;if(e?!e.isIdle():!i.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let t=nr();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 n=r.value.trim(),s=r.scope==="project"?t.getProjectSettings():t.getGlobalSettings();if(r.kind==="packages"){let o=new er({cwd:A().cwd,agentDir:q(),settingsManager:t});r.action==="add"?await o.installAndPersist(n,{local:r.scope==="project"}):await o.removeAndPersist(n,{local:r.scope==="project"})}else if(r.kind==="extensions"){let o=s.extensions??[],a=r.action==="add"?[...new Set([...o,n])]:o.filter(u=>u!==n);r.scope==="project"?t.setProjectExtensionPaths(a):t.setExtensionPaths(a)}else{let o=s.skills??[],a=r.action==="add"?[...new Set([...o,n])]:o.filter(u=>u!==n);r.scope==="project"?t.setProjectSkillPaths(a):t.setSkillPaths(a)}return await t.flush(),i.selected==="tui"?(i.commandContext&&await i.commandContext.reload(),i.current&&T(i.current)):(await i.workspaceSessions?.reload(),i.bridge?.publish({type:"plugins_changed"})),await ir()}function qe(r,e=ze){i.pi=r,i.tools?.clear(),i.tools=new Z({enabled:()=>!!i.telemetry?.enabled&&!!i.bridge,capture:(o,a)=>i.bridge?.reportError?.(o,a),breadcrumb:(o,a)=>i.bridge?.breadcrumb?.(o,a),anonymize:o=>i.telemetry?.session(o)??"unavailable"});let t=o=>({...i.operation,session:i.telemetry?.session(o.sessionManager.getSessionId()),piVersion:Ie,model:o.model?`${o.model.provider}/${o.model.id}`:null,thinkingLevel:o.thinkingLevel});i.interactions?.dispose(),i.interactions=new X(r.events,o=>!!i.bridge&&i.selected==="tui"&&o.sessionId===i.current?.sessionManager.getSessionId()&&!!i.tuiCatalog?.has(o.pluginId),()=>{i.current&&i.selected==="tui"&&T(i.current)});let n=()=>{i.stopChanged?.(),i.stopChanged=r.events.on(he,()=>{i.selected==="tui"&&i.current&&T(i.current)})};n(),r.on("session_start",async(o,a)=>{if(i.tools?.clear(),i.operation=void 0,i.tuiWaitController.abort(),i.tuiWaitController=new AbortController,i.tuiGeneration++,n(),i.current=a,i.bridge){let u=await G.discover(a.cwd,a.isProjectTrusted?.()??!1);if(i.current!==a)return;i.tuiCatalog=u}i.replacementSessionId!==a.sessionManager.getSessionId()&&(i.replacementContext=null,i.replacementSessionId=null),T(a),i.bridge&&i.bridge.publish({type:"plugins_changed"}),i.selected==="tui"&&i.workspaces&&i.workspaces.add(a.cwd).then(async u=>{i.selected!=="tui"||i.current?.sessionManager.getSessionId()!==a.sessionManager.getSessionId()||(i.activeWorkspaceId=u.id,await F())}).catch(u=>{i.bridge?.publish({type:"error",message:u instanceof Error?u.message:"\u65E0\u6CD5\u6CE8\u518C\u5F53\u524D\u5DE5\u4F5C\u533A",errorCode:"unexpected_error",errorId:i.bridge.reportError?.(u,{stage:"workspace_register"})})}),process.env.PI_WEBAPP_AUTO_OPEN==="1"&&a.mode==="tui"&&!i.autoOpened&&(i.autoOpened=!0,s(a).catch(u=>{a.ui.notify(u instanceof Error?u.message:"Web \u542F\u52A8\u5931\u8D25","error")}))}),r.on("agent_start",(o,a)=>{i.selected==="tui"&&i.bridge?.breadcrumb?.("agent_start",t(a)),T(a)}),r.on("agent_end",(o,a)=>T(a)),r.on("agent_settled",(o,a)=>{i.selected==="tui"&&(i.bridge?.breadcrumb?.("agent_end",t(a)),i.tools?.clear(),i.operation=void 0),T(a)}),r.on("tool_execution_start",(o,a)=>{i.selected==="tui"&&i.tools?.start(o,t(a))}),r.on("tool_execution_end",(o,a)=>{i.selected==="tui"&&i.tools?.end(o,t(a))}),r.on("model_select",(o,a)=>T(a)),r.on("thinking_level_select",(o,a)=>T(a)),r.on("message_end",(o,a)=>{if(i.selected==="tui"&&o.message.role==="assistant"&&o.message.stopReason==="error"){let u=i.bridge?.reportError?.(new Error("Agent response failed"),{...i.operation,stage:"agent",code:"agent_failed",piVersion:Ie});i.bridge?.publish({type:"error",message:o.message.errorMessage??"Agent response failed",errorCode:"unexpected_error",errorId:u,...i.operation})}i.selected==="tui"&&o.message.role==="toolResult"&&i.tools?.message(o.message,t(a)),i.selected==="tui"&&o.message.role==="assistant"&&i.bridge?.publish({type:"stream",message:null}),T(a),i.selected==="tui"&&F()}),r.on("session_info_changed",(o,a)=>T(a)),r.on("message_update",(o,a)=>{if(i.current=a,i.selected!=="tui"||o.message.role!=="assistant"||i.bridge===null)return;let u=Date.now();u-i.lastStreamAt<60||(i.lastStreamAt=u,i.bridge.publish({type:"stream",message:{id:"stream",role:"assistant",timestamp:new Date(o.message.timestamp).toISOString(),blocks:H(o.message.content)}}))}),r.on("session_shutdown",async o=>{if(i.tools?.clear(),i.operation=void 0,i.tuiWaitController.abort(),i.tuiGeneration++,i.stopChanged?.(),i.stopChanged=null,i.interactions?.cancelAll(),i.current=null,o.reason==="new"||o.reason==="resume"||o.reason==="fork"||o.reason==="reload")return;let a=i.bridge,u=i.telemetry;i.bridge=null,i.commandContext=null,i.replacementContext=null,i.replacementSessionId=null,i.pi=null;let d=i.workspaceSessions;i.workspaceSessions=null,await d?.dispose(),i.selected="tui",i.activeWorkspaceId=null,i.autoOpened=!1,i.tuiCatalog=null,i.stopPluginWatch?.(),i.stopPluginWatch=null,i.operation=void 0,i.telemetry=null,a?await a.close():await u?.close()});let s=async o=>{i.telemetry??=new V;try{i.current=o,i.commandContext="newSession"in o?o:null,i.pi=r,i.tuiCatalog=await G.discover(o.cwd,o.isProjectTrusted?.()??!1),i.workspaces===null&&(i.workspaces=new me(Mt(q())),await i.workspaces.load());try{await i.workspaces.discover((await tr.listAll()).map(d=>d.cwd))}catch(d){o.ui.notify(`\u65E0\u6CD5\u8BFB\u53D6\u90E8\u5206 Pi \u5386\u53F2\u5DE5\u4F5C\u533A\uFF1A${d instanceof Error?d.message:String(d)}`,"warning")}let a=await i.workspaces.add(o.cwd);if(i.selected==="tui"&&(i.activeWorkspaceId=a.id),i.bridge&&(i.bridge.protocolVersion!==7||i.bridge.buildId!==B||typeof i.bridge.reportError!="function")){let d=i.bridge;if(i.workspaceSessions&&i.workspaceSessions.telemetryVersion!==2&&i.workspaceSessions.session&&!i.workspaceSessions.session.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u5DE5\u4F5C\u533A");i.bridge=null,await d.close(),await i.telemetry.close(),i.telemetry=new V}if(i.bridge===null){let d=i.workspaceSessions?.telemetryVersion!==2?i.workspaceSessions:null,y=d?.session&&d.path?{path:d.path,sessionManager:d.session.sessionManager}:null;d&&(await d.dispose(),i.workspaceSessions=null),i.workspaceSessions??=new ke(c=>{i.selected==="sdk"&&(i.bridge?.publish(c),c.type==="snapshot"&&c.session.idle&&F())},()=>i.current?.model,c=>{try{return!!i.current&&Wi(i.current.cwd)===c&&(i.current.isProjectTrusted?.()??!1)}catch{return!1}},(c,p)=>i.bridge?.reportError?.(c,p),{enabled:()=>!!i.telemetry?.enabled&&!!i.bridge,breadcrumb:(c,p)=>i.bridge?.breadcrumb?.(c,p),anonymize:c=>i.telemetry?.session(c)??"unavailable"}),y&&await i.workspaceSessions.open(y.path,{sessionManager:y.sessionManager});let h={selfUpdate:new Pe({agentDir:q(),packageRoot:Je(Qt,"../.."),launcherNonce:process.env.PI_WEBAPP_LAUNCHER_NONCE}),snapshot:A,plugins:async()=>{let c=le();return await c?.refreshAssets(),c?.view()??{plugins:[],errors:[]}},pluginAsset:async c=>le()?.asset(c)??null,async invokePluginAction(c,p,g,m){if(_(c),!le()?.has(p))throw new Error("\u63D2\u4EF6\u672A\u542F\u7528");let P=i.selected,x=i.tuiGeneration,w=i.workspaceSessions?.session,f={requestId:Fi(),sessionId:c,pluginId:p,action:g,input:m},C=i.selected==="sdk"?await i.workspaceSessions.invokePluginAction(f):await we(i.pi.events,f,15e3,i.tuiWaitController.signal);if(_(c),P!==i.selected||(P==="tui"?x!==i.tuiGeneration:w!==i.workspaceSessions?.session))throw new Error("\u4F1A\u8BDD\u8FD0\u884C\u5B9E\u4F8B\u5DF2\u5207\u6362");return i.selected==="tui"&&i.current&&T(i.current),C},async resolvePluginInteraction(c,p,g,m){if(_(c),!le()?.has(p))throw new Error("\u63D2\u4EF6\u672A\u542F\u7528");i.selected==="sdk"?i.workspaceSessions.resolveInteraction(c,p,g,m):i.interactions.resolve(c,p,g,m)},image(c,p,g){_(c);let P=(i.selected==="sdk"?i.workspaceSessions?.session?.sessionManager.getBranch():i.current?.sessionManager.getBranch())?.find(w=>w.id===p);if(P?.type!=="message"||P.message.role!=="user"||!Array.isArray(P.message.content))return null;let x=P.message.content[g];return x?.type!=="image"?null:{data:Buffer.from(x.data,"base64"),mimeType:x.mimeType}},async workspaces(){return rr()},async addWorkspace(c,p){let g=await i.workspaces.add(c,p);try{await Ge(g.id,!0)}catch(m){throw await F(),m}},async selectWorkspace(c){await Ge(c)},async newSessionInWorkspace(c){await Ge(c,!0)},async removeWorkspace(c){if(c===i.activeWorkspaceId)throw new Error("\u8BF7\u5148\u5207\u6362\u5230\u5176\u4ED6\u5DE5\u4F5C\u533A");await i.workspaces.remove(c),await F()},async selectSession(c,p,g){let m=i.workspaces?.get(c);if(!m)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");if(await K(m.path),p===i.current?.sessionManager.getSessionId()&&m.path===await se(i.current.cwd)){if(i.selected==="sdk"&&i.workspaceSessions?.session&&!i.workspaceSessions.session.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u518D\u5207\u6362\u4F1A\u8BDD");i.selected="tui",i.activeWorkspaceId=c,i.bridge?.publish({type:"snapshot",session:A()})}else{if(i.selected==="sdk"&&i.workspaceSessions?.session?.sessionManager.getSessionId()===p&&i.workspaceSessions.path===m.path)return;if(!(await oe(m.path)).some(x=>x.id===p&&x.path===g))throw new Error("\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u8BE5\u5DE5\u4F5C\u533A");await i.workspaceSessions.open(m.path,{sessionFile:g}),i.selected="sdk",i.activeWorkspaceId=c,i.bridge?.publish({type:"snapshot",session:A()})}await F()},async models(){if(i.selected==="sdk")return i.workspaceSessions?.models()??[];let c=i.current;if(!c)throw new Error("\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD");let p=c.scopedModels?.map(g=>`${g.model.provider}/${g.model.id}`)??[];return c.modelRegistry.getAvailable().filter(g=>p.length===0||p.includes(`${g.provider}/${g.id}`)).map(g=>({provider:g.provider,id:g.id,name:g.name}))},async providers(){let c=await Q(),p=new Set((await c.listCredentials()).map(g=>g.providerId));return c.getProviders().map(g=>({id:g.id,name:g.name,configured:c.getProviderAuthStatus(g.id).configured,storedCredential:p.has(g.id),methods:[g.auth.apiKey?.login?"api_key":null,g.auth.oauth?"oauth":null].filter(m=>m!==null)}))},async providerModels(c){let p=await Q();return gt(xe(q(),"models.json"),c,p)},async updateProviderModel(c,p,g){if(_(c),i.selected==="tui"?!j(c).isIdle():!i.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let m=A().model;if(g.action==="remove"&&m===`${p}/${g.id}`)throw new Error("\u8BF7\u5148\u5207\u6362\u5F53\u524D\u4F7F\u7528\u7684\u6A21\u578B");if(g.action==="save"&&g.originalId&&g.originalId!==g.model.id&&m===`${p}/${g.originalId}`)throw new Error("\u8BF7\u5148\u5207\u6362\u5F53\u524D\u4F7F\u7528\u7684\u6A21\u578B");let P=await Q();await mt(xe(q(),"models.json"),p,g,P),await P.refresh({providers:[p],allowNetwork:!1}),await i.current?.modelRegistry.refresh({providers:[p],allowNetwork:!1}),await i.workspaceSessions?.session?.modelRuntime.refresh({providers:[p],allowNetwork:!1});let x=g.action==="save"?g.model.id:g.action==="base_url"&&m?.startsWith(`${p}/`)?m.slice(p.length+1):null;if(x&&m===`${p}/${x}`)if(i.selected==="sdk")try{await i.workspaceSessions.setModel(p,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 w=j(c),f=w.modelRegistry.find(p,x);if(!f||!i.pi||!await i.pi.setModel(f))throw new Error("\u6A21\u578B\u5DF2\u4FDD\u5B58\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\u8BE5\u6A21\u578B\u4EE5\u5E94\u7528\u65B0\u53C2\u6570");T(w)}},async logoutProvider(c,p){if(_(c),i.selected==="tui"?!j(c).isIdle():!i.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let g=await Q();if(!(await g.listCredentials()).some(m=>m.providerId===p))throw new Error("\u8BE5\u63D0\u4F9B\u65B9\u6CA1\u6709\u5DF2\u4FDD\u5B58\u7684\u8BA4\u8BC1");await g.logout(p),await i.current?.modelRegistry.refresh({providers:[p],allowNetwork:!1}),await i.workspaceSessions?.session?.modelRuntime.refresh({providers:[p],allowNetwork:!1})},async loginProvider(c,p,g){let m=await Q();await m.login(c,p,lt(c,p,g)),await m.refresh({providers:[c],allowNetwork:!1}),await i.current?.modelRegistry.refresh({providers:[c],allowNetwork:!1}),await i.workspaceSessions?.session?.modelRuntime.refresh({providers:[c],allowNetwork:!1})},async addCustomProvider(c,p){if(_(c),i.selected==="tui"?!j(c).isIdle():!i.workspaceSessions?.session?.isIdle)throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let g=await Q();if(g.getProvider(p.id))throw new Error("\u63D0\u4F9B\u65B9\u5DF2\u5B58\u5728");await ct(xe(q(),"models.json"),p),await g.refresh({allowNetwork:!1}),await i.current?.modelRegistry.refresh({allowNetwork:!1}),await i.workspaceSessions?.session?.modelRuntime.refresh({allowNetwork:!1})},commands(){return i.selected==="tui"?(i.pi?.getCommands()??[]).filter(c=>c.name!=="web"&&c.name!=="web-dev-reload").map(c=>({name:c.name,description:c.description})):[]},async compact(c){if(_(c),i.selected==="sdk"){let g=i.workspaceSessions?.session;if(!g||!g.isIdle)throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");await g.compact(),i.bridge?.publish({type:"snapshot",session:A()});return}let p=j(c);if(!p.isIdle())throw new Error("\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");p.compact()},async setModel(c,p,g){if(_(c),i.selected==="sdk"){await i.workspaceSessions.setModel(p,g);return}let m=j(c);if(!m.isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");let P=m.modelRegistry.find(p,g);if(!P||!m.modelRegistry.getAvailable().some(x=>x.provider===p&&x.id===g))throw new Error("\u6A21\u578B\u4E0D\u53EF\u7528");if(!i.pi||!await i.pi.setModel(P))throw new Error("\u6A21\u578B\u63D0\u4F9B\u65B9\u672A\u914D\u7F6E\u8BA4\u8BC1");T(m)},async setThinkingLevel(c,p){if(_(c),!["off","minimal","low","medium","high","xhigh"].includes(p))throw new Error("\u63A8\u7406\u5F3A\u5EA6\u65E0\u6548");if(i.selected==="sdk"){let P=i.workspaceSessions?.session;if(!P||!P.isIdle||!P.getAvailableThinkingLevels().includes(p))throw new Error("\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u6B64\u63A8\u7406\u5F3A\u5EA6");P.setThinkingLevel(p),i.bridge?.publish({type:"snapshot",session:A()});return}let m=j(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||!Bi(m.model).includes(p))throw new Error("\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u6B64\u63A8\u7406\u5F3A\u5EA6");if(!i.pi)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");i.pi.setThinkingLevel(p),T(m)},config:ir,updateConfig:zi,async send(c,p,g=[],m){if(_(c),i.selected==="sdk"){await i.workspaceSessions.send(p,g,m);return}if(!j(c).isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");i.operation=m;try{if(i.bridge?.breadcrumb?.("send",{...m,piVersion:Ie}),i.replacementContext!==null&&i.replacementSessionId===c){await i.replacementContext.sendUserMessage(g.length?[{type:"text",text:p},...g]:p,{expandPromptTemplates:!0});return}if(i.pi===null)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");i.pi.sendUserMessage(g.length?[{type:"text",text:p},...g]:p,{expandPromptTemplates:!0})}catch(x){throw i.operation=void 0,x}},async abort(c){if(_(c),i.selected==="sdk")await i.workspaceSessions.stop();else{let p=j(c);if(p.isIdle())return;if(!i.pi)throw new Error("Pi \u4F1A\u8BDD\u4E0D\u53EF\u7528");i.tools?.cancel(),i.bridge?.breadcrumb?.("cancel",{...i.operation}),i.pi.appendEntry(re),p.abort()}},async resume(c,p){if(_(c),i.selected==="sdk"){await i.workspaceSessions.resume(p);return}let g=j(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||!i.pi)throw new Error("\u8BF7\u5148\u9009\u62E9\u6A21\u578B");if(!g.modelRegistry.hasConfiguredAuth(g.model))throw new Error("\u8BF7\u5148\u8FDE\u63A5\u5F53\u524D\u6A21\u578B");i.operation=p;try{i.pi.sendMessage(ye(A().messages),{triggerTurn:!0})}catch(m){throw i.operation=void 0,m}},async newSession(c){if(_(c),i.selected==="sdk"){let m=i.workspaces?.get(i.activeWorkspaceId??"");if(!m)throw new Error("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728");await i.workspaceSessions.open(m.path,"new"),await F();return}let p=j(c);if(!p.isIdle())throw new Error("Pi \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u7ED3\u675F");if(i.commandContext===null){await i.workspaceSessions.open(p.cwd,"new"),i.selected="sdk",i.bridge?.publish({type:"snapshot",session:A()}),await F();return}if((await i.commandContext.newSession({withSession:async m=>{i.commandContext=m,i.replacementContext=m,i.replacementSessionId=m.sessionManager.getSessionId(),i.current=m}})).cancelled)throw new Error("\u65B0\u4F1A\u8BDD\u5DF2\u53D6\u6D88");await F()}};h.addWorkspace=i.lifecycle.wrap(h.addWorkspace),h.selectWorkspace=i.lifecycle.wrap(h.selectWorkspace),h.newSessionInWorkspace=i.lifecycle.wrap(h.newSessionInWorkspace),h.removeWorkspace=i.lifecycle.wrap(h.removeWorkspace),h.selectSession=i.lifecycle.wrap(h.selectSession),h.newSession=i.lifecycle.wrap(h.newSession),h.updateConfig=i.lifecycle.wrap(h.updateConfig),i.bridge=await It(h,Qt,i.telemetry)}if(i.stopPluginWatch===null&&process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS){let d=[],y=null;for(let h of(process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS??"").split(Ri).filter(Boolean))try{d.push(Di(xe(Je(h),"dist"),(c,p)=>{let g=String(p??"");["client.js","client.css"].includes(g)&&(y&&clearTimeout(y),y=setTimeout(()=>i.bridge?.publish({type:"plugins_changed"}),180))}))}catch(c){i.bridge?.publish({type:"error",message:`\u63D2\u4EF6\u76D1\u542C\u5931\u8D25\uFF1A${h}: ${String(c)}`})}i.stopPluginWatch=()=>{for(let h of d)h.close();y&&clearTimeout(y)}}let u=await e(i.bridge.url).catch(()=>!1);o.ui.notify(`pi-webapp: ${i.bridge.url}`,u?"info":"warning"),o.ui.setStatus("pi-webapp","Web \u5DF2\u542F\u52A8 \xB7 /web \u91CD\u65B0\u6253\u5F00")}catch(a){throw i.telemetry?.capture(a,{stage:"open_web",piVersion:Ie}),i.bridge||(await i.telemetry?.close(),i.telemetry=null),a}};r.registerCommand("web",{description:"Open the current Pi session in a local web interface",handler:async(o,a)=>s(a)}),r.registerCommand("web-dev-reload",{description:"Reload local pi-webapp plugins during development",handler:async(o,a)=>{process.env.PI_WEBAPP_PLUGIN_DEV_ROOTS&&(await a.waitForIdle(),await i.lifecycle.run(async()=>{let u=i.workspaceSessions?.session;u&&(await u.waitForIdle(),await i.workspaceSessions.reload()),await a.reload()}))}})}var Ca=qe;export{Ca as default,Mi as verifySentryNodeRelease};