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