pi-yun 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +18 -18
- package/.next/build-manifest.json +3 -3
- package/.next/required-server-files.js +2 -2
- package/.next/required-server-files.json +2 -2
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/agent/[id]/bash-output/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/running/route.js.nft.json +1 -1
- package/.next/server/app/api/app-update/route.js +1 -1
- package/.next/server/app/api/auth/api-key/[provider]/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/login/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/login/[provider]/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/logout/[provider]/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/providers/route.js +1 -1
- package/.next/server/app/api/auth/providers/route.js.nft.json +1 -1
- package/.next/server/app/api/cache-miss-notices/route.js.nft.json +1 -1
- package/.next/server/app/api/cwd/browse/route.js.nft.json +2 -2
- package/.next/server/app/api/cwd/validate/route.js.nft.json +2 -2
- package/.next/server/app/api/file-index/route.js.nft.json +1 -1
- package/.next/server/app/api/files/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/git/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/git/status/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js +1 -1
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/sign-in/[flowId]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/sign-in/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/test/route.js.nft.json +1 -1
- package/.next/server/app/api/models/default/route.js.nft.json +2 -2
- package/.next/server/app/api/models/enabled/route.js.nft.json +2 -2
- package/.next/server/app/api/models/refresh/route.js +1 -1
- package/.next/server/app/api/models/refresh/route.js.nft.json +1 -1
- package/.next/server/app/api/models/route.js +1 -1
- package/.next/server/app/api/models/route.js.nft.json +1 -1
- package/.next/server/app/api/models-config/discover/route.js.nft.json +1 -1
- package/.next/server/app/api/models-config/route.js.nft.json +1 -1
- package/.next/server/app/api/models-config/test/route.js.nft.json +1 -1
- package/.next/server/app/api/open-in-explorer/route.js.nft.json +1 -1
- package/.next/server/app/api/plugins/check/route.js.nft.json +1 -1
- package/.next/server/app/api/plugins/route.js +1 -1
- package/.next/server/app/api/plugins/route.js.nft.json +1 -1
- package/.next/server/app/api/project-trust/route.js.nft.json +1 -1
- package/.next/server/app/api/provider-usage/query/route.js.nft.json +1 -1
- package/.next/server/app/api/push/config/route.js.nft.json +1 -1
- package/.next/server/app/api/push/subscribe/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/auto-name/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/context/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/tool-result-image/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/fork/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/state/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/search/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/stats/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/ui-state/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/check/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/content/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/install/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/update/route.js.nft.json +1 -1
- package/.next/server/app/api/subagents/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/subagents/profiles/route.js.nft.json +1 -1
- package/.next/server/app/api/subagents/settings/route.js.nft.json +1 -1
- package/.next/server/app/api/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/tools/settings/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +5 -5
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +5 -5
- package/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +3 -3
- package/.next/server/app/login.segments/_full.segment.rsc +3 -3
- package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/page.js +18 -17
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/pet-preview/page_client-reference-manifest.js +1 -1
- package/.next/server/app/pet-preview.html +1 -1
- package/.next/server/app/pet-preview.rsc +3 -3
- package/.next/server/app/pet-preview.segments/_full.segment.rsc +3 -3
- package/.next/server/app/pet-preview.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/pet-preview.segments/pet-preview/__PAGE__.segment.rsc +3 -3
- package/.next/server/app-paths-manifest.json +18 -18
- package/.next/server/chunks/2243.js +1 -1
- package/.next/server/chunks/27.js +1 -1
- package/.next/server/chunks/3757.js +1 -1
- package/.next/server/chunks/3824.js +1 -1
- package/.next/server/chunks/4698.js +1 -1
- package/.next/server/chunks/5787.js +1 -1
- package/.next/server/chunks/9165.js +1 -1
- package/.next/server/instrumentation.js.nft.json +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/1278-d1fbbce2d49aaaee.js +1 -0
- package/.next/static/chunks/app/{layout-b707963fa7205d6d.js → layout-da4ac400e5da80b9.js} +1 -1
- package/.next/static/chunks/app/{page-4232d828a32cfeb9.js → page-a778cbf1fb8bc4e8.js} +7 -6
- package/.next/static/chunks/{webpack-7f5c25954b44b5fb.js → webpack-03add08f717df51e.js} +1 -1
- package/.next/static/css/{40f42d513e985a7c.css → edd81c2e355e9677.css} +1 -1
- package/.next/trace +8 -8
- package/.next/trace-build +1 -1
- package/package.json +8 -8
- package/.next/static/chunks/1278-887d8dd9f4ab60fa.js +0 -1
- /package/.next/static/{iKNuUVRZa7JT6IPMMtnRe → iyZXp7lQacfoeCqiVEtJ1}/_buildManifest.js +0 -0
- /package/.next/static/{iKNuUVRZa7JT6IPMMtnRe → iyZXp7lQacfoeCqiVEtJ1}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=9165,exports.ids=[9165],exports.modules={10879:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{$q:()=>x,Vy:()=>v,bA:()=>y,ej:()=>u,yh:()=>C});var e=c(73024),f=c(76760),g=c(75430),h=c(80974),i=c.n(h),j=c(8102),k=c(63108),l=c(37431),m=c(12069),n=a([g]);g=(n.then?(await n)():n)[0];let z=new Set(["version","revision","sessions","projects","removedProjects","projectOrder","projectNames","__proto__"]),A=Symbol.for("pi-web:session-ui-state-write-queue"),B={realpath:!1,stale:1e4,retries:{retries:10,factor:2,minTimeout:25,maxTimeout:500},onCompromised:a=>{console.warn(`[pi-web] the session UI state lock was compromised: ${a.message}`)}};class C extends Error{constructor(a="Another process holds the session UI state lock"){super(a),this.name="SessionUiStateLockedError"}}function o(){return globalThis.__piWebSessionUiStateCache??={reads:new Map,revisions:new Map}}function p(a,b){let c=o().revisions;b>(c.get(a)??-1)&&c.set(a,b)}function q(a){return structuredClone(a)}function r(a=(0,g.getAgentDir)()){return(0,f.join)(a,"pi-web-session-state.json")}function s(a){let b;try{b=JSON.parse(a)}catch{return{ok:!1}}let c=(0,m.Jx)(b);return c?{ok:!0,state:c,raw:b}:{ok:!1}}function t(a){let b,c;try{b=(0,e.statSync)(a)}catch(c){let b=c?.code;if("ENOENT"===b||"ENOTDIR"===b)return o().reads.delete(a),(0,m.ly)();throw c}let d=o().reads.get(a);if(d&&d.mtimeMs===b.mtimeMs&&d.size===b.size&&d.ino===b.ino)return d.state;let f=(0,l.y)(a,4194304);if(void 0===f)return o().reads.delete(a),(0,m.ly)();let g=s(f);return g.ok?(c=g.state,p(a,c.revision)):(console.warn(`[pi-web] ${a} is not valid session UI state; reading it as empty until the next change sets it aside`),c=(0,m.ly)()),o().reads.set(a,{mtimeMs:b.mtimeMs,size:b.size,ino:b.ino,state:c}),c}function u(a){try{return q(t(a??r()))}catch(a){return console.warn(`[pi-web] could not read the session UI state: ${a instanceof Error?a.message:String(a)}`),(0,m.ly)()}}function v(a){try{return t(a??r()).revision}catch{return null}}function w(a,b){return(0,k.T)(A,a,async()=>{let c;(0,e.mkdirSync)((0,f.dirname)(a),{recursive:!0});try{c=await i().lock(a,B)}catch(a){if("ELOCKED"===a?.code)throw new C;throw a}try{let c,d=o().revisions.get(a)??0,f=(0,l.y)(a,4194304),g={},h=!1;if(void 0===f)c={...(0,m.ly)(),revision:d};else{let b=s(f);if(b.ok)for(let[a,d]of(c=b.state,Object.entries(b.raw)))z.has(a)||(g[a]=d);else{let b=`${a}.corrupt-${Date.now()}`;try{(0,e.renameSync)(a,b),console.warn(`[pi-web] ${a} could not be parsed; moved it to ${b} and started from an empty session UI state`)}catch(b){console.warn(`[pi-web] ${a} could not be parsed and could not be moved aside (${b instanceof Error?b.message:String(b)}); starting from an empty session UI state`)}c={...(0,m.ly)(),revision:d+1},h=!0}}let i=b(c);if(!i.changed&&!h)return q(c);let k={...i.state,version:m.fS,revision:c.revision+ +!!i.changed},n={version:k.version,revision:k.revision,sessions:k.sessions,projects:k.projects,...k.removedProjects&&Object.keys(k.removedProjects).length>0?{removedProjects:k.removedProjects}:{},...k.projectOrder?.length?{projectOrder:k.projectOrder}:{},...k.projectNames&&Object.keys(k.projectNames).length>0?{projectNames:k.projectNames}:{},...g};(0,j.$)(a,JSON.stringify(n,null,2)+"\n"),p(a,k.revision);try{let b=(0,e.statSync)(a);o().reads.set(a,{mtimeMs:b.mtimeMs,size:b.size,ino:b.ino,state:q(k)})}catch{o().reads.delete(a)}return q(k)}finally{try{await c()}catch{}}})}function x(a,b){let c;try{c=b??r()}catch(a){return Promise.reject(a)}return w(c,b=>(0,m.D7)(b,a,Date.now()))}async function y(a,b){let c=b??r(),d=[...new Set(a)];if(0===d.length)return;let e=a=>d.some(b=>Object.prototype.hasOwnProperty.call(a.sessions,b));e(t(c))&&await w(c,a=>{if(!e(a))return{state:a,changed:!1};let b={...a.sessions};for(let a of d)delete b[a];return{state:{...a,sessions:b},changed:!0}})}d()}catch(a){d(a)}})},29165:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Dr:()=>y,Kb:()=>u,X2:()=>t,eD:()=>w,eP:()=>x,ks:()=>v});var e=c(73024),f=c(48161),g=c(76760),h=c(75430),i=c(2650),j=c(80547),k=c(57736),l=c(43084),m=c(49507),n=c(72498),o=c(66544),p=a([h,i,j,k,l,m,n]);function q(a){return a instanceof Error?a.message:String(a)}function r(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function s(a,b,c,d={}){return{status:a,body:{error:c,reason:b,...d}}}function t(a){return r(a)&&"number"==typeof a.status&&r(a.body)}function u(a){let{agentDir:b,project:c,internals:d,scope:e,name:f}=a,g=(0,k.vf)({agentDir:b,project:c,internals:d,scope:e,name:f});return g?void 0!==g.info.invalidError?g.info.invalidError:g.config?{config:g.config,configKey:g.info.configKey}:`MCP server "${f}" cannot be read`:`MCP server "${f}" is not listed`}async function v(a){if("string"!=typeof a||!a.trim()||!(0,g.isAbsolute)(a))return s(400,"cwd-invalid","cwd must be an absolute path");let b=await (0,j.mc)();if(!(0,j.B7)(a,b))return s(403,"cwd-denied","Access denied");let c=(0,g.resolve)(a),d=!1;try{d=(0,e.statSync)(c).isDirectory()}catch{}return d?{cwd:c,allowedRoots:b}:s(400,"cwd-not-directory","cwd must be a directory")}async function w(a){if((0,i.cu)())return s(409,"mcp-off",`${i.B6} is set, so Pi Web ${a}`);let b=await (0,m.U)();return b.ok?b:s(409,"mcp-off",`Pi Web cannot load the SDK's MCP modules: ${b.reason}`)}function x(a,b,c="The project is not trusted, so Pi Web does not start its MCP servers"){try{let d=(0,n.Y1)(a,b);if(void 0!==d.decisionError)return s(409,"trust-unreadable",d.decisionError);if(!0!==d.decision)return s(403,"project-untrusted",c);return}catch(a){return s(409,"trust-unreadable",q(a))}}async function y(a){var b;let c,d;if(!(0,o.EN)(a))return s(403,"request-denied","Untrusted API request");if(!(0,o.E2)(a))return s(415,"content-type","Content-Type must be application/json");try{c=await a.json()}catch{return s(400,"invalid-request","Invalid JSON body")}if(!r(c))return s(400,"invalid-request","Expected a JSON object");let e=(b=c.scope,"global"===b||"project"===b?b:void 0),g="string"==typeof c.name&&c.name.length>0&&c.name.length<=1024?c.name:void 0;if(!e||void 0===g)return s(400,"invalid-request",'scope must be "global" or "project", and name a server name');if(void 0!==c.cwd&&null!==c.cwd){let a=await v(c.cwd);if(t(a))return a;d=a}if("project"===e&&!d)return s(400,"invalid-request","A project server needs the project's cwd");let i=await w("connects no MCP server");if(t(i))return i;let j=(0,h.getAgentDir)();if("project"===e&&d){let a=x(d.cwd,j);if(a)return a}try{let a=(0,k.eS)({agentDir:j,scope:e,name:g,project:d});if(!a.ok){let b={path:a.path,..."server-missing"===a.reason?{name:g}:{}};if("unreadable"===a.reason)return s(500,"internal",a.error,b);return s(409,a.reason,a.error,b)}if(!r(a.value))return s(409,"entry-not-object",`${a.sourcePath} defines MCP server "${g}" as something other than an object`,{name:g});let b=u({agentDir:j,project:d,internals:i,scope:e,name:g});if("string"==typeof b)return s(409,"server-invalid",b,{name:g});let{config:c,configKey:h}=b;if((0,l.tF)(c,i))return s(409,"web-password",`"${g}" references PI_WEB_PASSWORD, so Pi Web does not connect it`,{name:g});return{scope:e,name:g,...d?{project:d}:{},agentDir:j,internals:i,sourcePath:a.sourcePath,configKey:h,config:c,cwd:d?.cwd??(0,f.homedir)()}}catch(a){return s(500,"internal",q(a))}}[h,i,j,k,l,m,n]=p.then?(await p)():p,d()}catch(a){d(a)}})},57736:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{B1:()=>w,Nv:()=>P,UQ:()=>F,Vy:()=>V,Y6:()=>S,Y_:()=>l.Y,eS:()=>R,fz:()=>B,nu:()=>G,q_:()=>U,vN:()=>m.vN,vf:()=>Q});var e=c(73024),f=c(76760),g=c(75430),h=c(2650),i=c(41228),j=c(10674),k=c(76609),l=c(11784),m=c(85825),n=c(3140),o=c(9993),p=c(66479),q=c(43084),r=c(58864),s=c(82536),t=c(49507),u=c(72498),v=a([g,h,i,j,q,t,u]);function w(a){return(0,f.join)(a,"mcp.json")}[g,h,i,j,q,t,u]=v.then?(await v)():v;let V=1048576,W=e.constants.O_RDONLY|(e.constants.O_NONBLOCK||0)|(e.constants.O_NOFOLLOW||0);function x(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function y(a){return a instanceof Error?a.message:String(a)}function z(a){try{return(0,e.realpathSync)(a)}catch{return(0,f.resolve)(a)}}function A(a,b,c){a.problems.push({reason:b,error:c})}function B(a,b){let c;try{c=(0,e.openSync)(a,W);let d=(0,e.fstatSync)(c),f=511&d.mode;if(!d.isFile())return{ok:!1,reason:"not-a-file",error:"not a regular file"};if(void 0===b)return{ok:!0,text:(0,e.readFileSync)(c,"utf8"),mode:f};if(d.size>b)return{ok:!1,reason:"too-large",error:`larger than ${b} bytes`};let g=b+1,h=[],i=0;for(;i<g;){let a=Buffer.alloc(Math.min(g-i,65536)),b=(0,e.readSync)(c,a,0,a.length,null);if(0===b)break;h.push(a.subarray(0,b)),i+=b}if(i>b)return{ok:!1,reason:"too-large",error:`larger than ${b} bytes`};return{ok:!0,text:Buffer.concat(h,i).toString("utf8"),mode:f}}catch(b){let a=b?.code;return{ok:!1,reason:"unreadable",error:y(b),...a?{code:a}:{}}}finally{void 0!==c&&(0,e.closeSync)(c)}}function C(a,b,c){let d=B(a,c);if(b.exists=!0,d.ok)return d.text;A(b,d.reason,d.error)}function D(a){let b,c=w(a),d={scope:"global",path:c,exists:!1,problems:[]};try{b=(0,e.realpathSync)(c)}catch(a){return"ENOENT"!==a?.code&&(d.exists=!0,A(d,"unreadable",y(a))),{info:d}}return(0,r.Eb)(b,(0,f.join)(z(a),"mcp.json"))||(d.realPath=b),{info:d,text:C(b,d,void 0)}}function E(a){try{return(0,e.lstatSync)(a).isSymbolicLink()}catch{return!1}}function F(a,b){let c,d=(0,f.join)(a,g.CONFIG_DIR_NAME,"mcp.json");if((0,s.TU)(d))return{kind:"refused",path:d,reason:"unreadable",error:"the path has a .. segment"};try{c=(0,e.realpathSync)(d)}catch(a){if(E(d))return{kind:"refused",path:d,reason:"link-dangling",error:"a symbolic link to nothing"};if("ENOENT"!==a?.code)return{kind:"refused",path:d,reason:"unreadable",error:y(a)};return{kind:"missing",path:d}}return(0,s.o4)(c,(0,s.qy)(b))?{kind:"found",path:d,realPath:c}:{kind:"refused",path:d,realPath:c,reason:"link-outside",error:"a symbolic link outside the folders Pi Web may read"}}function G(a,b){let c,d=(0,f.join)(a,g.CONFIG_DIR_NAME);if((0,s.TU)(d))return{ok:!1,reason:"unreadable",error:"the path has a .. segment"};try{c=(0,e.realpathSync)(d)}catch(b){if(E(d))return{ok:!1,reason:"link-dangling",error:"a symbolic link to nothing"};if("ENOENT"!==b?.code)return{ok:!1,reason:"unreadable",error:y(b)};try{c=(0,f.join)((0,e.realpathSync)(a),g.CONFIG_DIR_NAME)}catch(a){return{ok:!1,reason:"unreadable",error:y(a)}}}return(0,s.o4)(c,(0,s.qy)(b))?{ok:!0,realPath:(0,f.join)(c,"mcp.json")}:{ok:!1,reason:"link-outside",error:"a symbolic link outside the folders Pi Web may read"}}function H(a,b){let c=F(a,b),d={scope:"project",path:c.path,exists:!1,problems:[]};if("missing"===c.kind)return{info:d};let e=c.realPath;return(void 0===e||(0,r.Eb)(e,(0,f.join)(z(a),g.CONFIG_DIR_NAME,"mcp.json"))||(d.realPath=e),"refused"===c.kind)?(d.exists=!0,A(d,c.reason,c.error),{info:d}):{info:d,text:C(c.realPath,d,V)}}function I(a,b){let c;try{c=JSON.parse(b)}catch(c){return A(a,"unparsable",(0,l.Y)(c,b)),[]}if(!x(c)||void 0!==c.mcpServers&&!x(c.mcpServers))return A(a,"invalid-shape",'expected an object with an "mcpServers" object'),[];"boolean"==typeof c.autoEnableCodemode?a.autoEnableCodemode=c.autoEnableCodemode:void 0!==c.autoEnableCodemode&&A(a,"auto-enable-codemode-invalid","autoEnableCodemode must be a boolean");let d=Object.entries(x(c.mcpServers)?c.mcpServers:{});return"project"===a.scope&&d.length>200?(A(a,"too-many-servers",`declares ${d.length} servers, more than 200`),[]):d}let X=/\$(?:[$!]|\{([^}]*)\}|([A-Za-z_][A-Za-z0-9_]*))/g,Y=/^[A-Za-z_][A-Za-z0-9_]*$/;function J(a){let b=[];for(let[,c,d]of a.matchAll(X)){let a=void 0!==c?Y.test(c)?c:void 0:d;void 0===a||b.includes(a)||b.push(a)}return b}function K({kind:a,name:b}){return void 0===b?{kind:a}:{kind:a,name:b}}function L(a,b,c,d,{internals:e,authState:f,revealProjectCommands:g}){let h,i=e?.validateMcpServerConfig(a,b),j=x(b)?b:{},l="";try{l=(0,k.U2)(b,i)}catch(b){h=`server "${a}": cannot be read: ${y(b)}`}let m={name:a,scope:c,sourcePath:d,configKey:l,enabled:!1!==j.enabled,validated:void 0!==e,envNames:x(j.env)?Object.keys(j.env):[],headerNames:x(j.headers)?Object.keys(j.headers):[],usesOAuth:!1,commandFields:[],variableReferences:[],masked:!1};"string"==typeof i&&(m.invalidError=i),x(b)||(m.notAnObject=!0);let p=function(a,b){if(b){let{type:b}=a;return"string"==typeof a.url&&(void 0===b||"http"===b||"streamable-http"===b)?"http":"string"==typeof a.command&&(void 0===b||"stdio"===b)?"stdio":void 0}return"url"in a?"http":"command"in a?"stdio":void 0}(j,"string"==typeof i);if(p&&(m.transport=p),void 0!==i&&"string"!=typeof i){m.exposure=i.exposure??"codemode";let a=i.toolExposure?Object.keys(i.toolExposure).length:0;a>0&&(m.toolExposureCount=a)}"string"==typeof j.description&&j.description.trim()&&(m.description=j.description);let r="project"===c&&g;if("string"==typeof j.command){let a=r?{value:j.command,masked:!1}:(0,n.Iq)(j.command);m.command=a.value,m.masked||=a.masked}if(Array.isArray(j.args)){let a=j.args.filter(a=>"string"==typeof a),b=r?{args:a,masked:!1}:(0,n.oF)(a);m.args=b.args,m.masked||=b.masked}if("string"==typeof j.cwd&&(m.cwd=j.cwd),"string"==typeof j.url){let a=(0,n.yP)(j.url);m.url=a.value,m.masked||=a.masked}if("http"===p&&x(j.auth)&&"string"==typeof j.auth.provider&&j.auth.provider&&(m.authProvider=j.auth.provider),m.usesOAuth="http"===p&&!j.auth&&!m.headerNames.some(a=>"authorization"===a.toLowerCase()),m.usesOAuth&&f&&"string"==typeof j.url){let b=function(a,b,c){let d;try{d=(0,o.n_)(b,c)}catch{return}let e=a.get(d.key)??a.get(d.legacyKey);return{signedIn:e?.signedIn??!1,stored:void 0!==e}}(f,a,j.url);b&&(m.signedIn=b.signedIn,m.oauthStateStored=b.stored)}let s=e?a=>e.isCommandConfigValue(a):a=>a.startsWith("!"),t=(0,q.xW)(j);m.commandFields=t.filter(a=>s(a.value)).map(K);let u=e?a=>e.getConfigValueEnvVarNames(a):J;m.variableReferences=t.filter(a=>!s(a.value)).map(a=>({...K(a),variables:u(a.value)})).filter(a=>a.variables.length>0);let v=e?(0,q.tF)(j,e):t.find(a=>a.value.toUpperCase().includes(q.aS));v&&(m.webPasswordField=K(v));let w="url"in j&&!!j.auth,z={info:m,sendsProviderToken:w,value:b,...void 0!==i&&"string"!=typeof i?{config:i}:{}};return void 0!==h?(m.invalidError??=h,{...z,loads:!1}):{...z,loads:e?"string"!=typeof i:x(b)}}function M(a){return`mcp__${a.replace(/-/g,"_")}`}function N(a){let b=new Set;for(let c of a){if(!c.loads||c.info.override)continue;let{info:a}=c,d=[...b].find(b=>b!==a.name&&M(b)===M(a.name));if(void 0!==d){a.invalidError=`server "${a.name}" conflicts with "${d}"`,c.loads=!1;continue}if("project"===a.scope&&c.sendsProviderToken){a.invalidError=`server "${a.name}": auth is only allowed in the global mcp.json`,c.loads=!1;continue}b.add(a.name)}}function O(a){let b={internals:a.internals,authState:function(a){let b=(0,f.join)(a,"mcp-auth.json"),c=new Map;if(!(0,e.existsSync)(b))return c;try{let a=(0,e.readFileSync)(b,"utf8");if(!a.trim())return c;let d=JSON.parse(a);if(!x(d))return c;for(let[a,b]of Object.entries(d))c.set(a,{signedIn:x(b)&&x(b.tokens)&&"string"==typeof b.tokens.access_token});return c}catch{return}}(a.agentDir),revealProjectCommands:!0===a.projectUntrusted},c=[],d=[],g=D(a.agentDir);if(c.push(g.info),void 0!==g.text)for(let[a,c]of I(g.info,g.text))d.push(L(a,c,"global",g.info.path,b));if(a.internals&&N(d),a.project){let e=new Map(d.filter(a=>a.loads).map(a=>[a.info.name,a])),f=H(a.project.cwd,a.project.allowedRoots);if(c.push(f.info),void 0!==f.text)for(let[a,c]of I(f.info,f.text))d.push(x(c)&&(0,m.vN)(c)?function(a,b,c,d,e){let f=m.lW.filter(a=>Object.hasOwn(b,a)),g=(0,m.vR)(a,b,void 0!==c);if(void 0!==g||void 0===c){let c=L(a,b,"project",d,e);return c.info.invalidError=g,c.info.override={keys:f},{...c,loads:!1}}let h={...c.config??(x(c.value)?c.value:{}),...b},i=L(a,h,"project",d,{...e,revealProjectCommands:!1});return i.info.override={keys:f},i}(a,c,e.get(a),f.info.path,b):L(a,c,"project",f.info.path,b));a.internals&&N(d)}let h=d.filter(({info:a,loads:b})=>"project"===a.scope&&b),i=new Set(h.filter(({info:a})=>!a.override).map(({info:a})=>a.name)),j=new Set(h.filter(({info:a})=>a.override).map(({info:a})=>a.name)),k=new Set;for(let{info:a}of d)"global"===a.scope&&(i.has(a.name)&&(a.shadowedByProject=!0,k.add(a.name)),j.has(a.name)&&(a.overriddenByProject=!0));for(let{info:a}of d)"project"===a.scope&&k.has(a.name)&&(a.replacesGlobal=!0);return{files:c,described:d}}function P(a){let{files:b,described:c}=O(a);return{files:b,servers:c.map(({info:a})=>a)}}function Q(a){let b=O(a).described.find(({info:b})=>b.scope===a.scope&&b.name===a.name);if(b)return void 0===b.info.invalidError&&b.config?{info:b.info,config:b.config}:{info:b.info}}function R(a){let{scope:b,name:c,project:d}=a;if("project"===b&&!d)throw Error("a project entry needs the project");let{info:e,text:f}="global"!==b&&d?H(d.cwd,d.allowedRoots):D(a.agentDir),g=void 0===f?[]:I(e,f);for(let a of e.problems)if("auto-enable-codemode-invalid"!==a.reason)return{ok:!1,reason:a.reason,error:a.error,path:e.path};let h=g.find(([a])=>a===c);return h?{ok:!0,value:h[1],sourcePath:e.path}:{ok:!1,reason:"server-missing",error:`${e.path} does not define MCP server "${c}"`,path:e.path}}async function S(a){let b=await (0,t.U)(),{files:c,servers:d}=P({agentDir:a.agentDir,project:{cwd:a.cwd,allowedRoots:a.allowedRoots},internals:b.ok?b:void 0,projectUntrusted:!function(a,b){try{return!0===(0,u.Y1)(a,b).decision}catch{return!1}}(a.cwd,a.agentDir)}),e=c.find(a=>"project"===a.scope);if(!e)throw Error("the project file was not read");return{file:e,servers:d.filter(a=>"project"===a.scope)}}async function T(a,b,c){let d=await (0,h.t1)(),e={sandbox:d.checked?d.available?{state:"available"}:{state:"unavailable",error:d.reason}:{state:"not-checked"},builtinDisabled:b?.enabled===!1};b?.settingsPath&&(e.builtinSettingsPath=b.settingsPath);let f=b?.global??b;f?.enabled===!1&&(e.globalBuiltinSettingsPath=f.settingsPath??(0,j.WD)(a));try{e.preference=await (0,i.wS)((0,j.WD)(a))}catch(a){e.preferenceError=y(a)}let g=void 0===c?void 0:(0,i.Gc)(c);g&&(e.projectOverride=g);try{let b=(0,j.WD)(a),{mode:d,inlineBudget:f}=await (0,i.yH)(b);e.mode={...d,settingsPath:b};let g=void 0===c?void 0:(0,i.Rt)(c);g&&(e.mode.projectOverride=g),e.inlineBudget={...f,settingsPath:b,default:i.lU,max:i.mz};let h=void 0===c?void 0:(0,i.Uf)(c);h&&(e.inlineBudget.projectOverride=h)}catch(a){e.modeError=y(a),e.inlineBudgetError=e.modeError}return e}async function U(a){var b,c;let d,e,f,{agentDir:g,project:i,environment:j=process.env}=a,k=await (0,t.U)();if(i){d={cwd:i.cwd};try{d.trust=(0,u.Y1)(i.cwd,g)}catch(a){d.trustError=y(a)}let a=d.trust;if(a&&!a.requiresTrust&&null===a.decision&&void 0===a.decisionError){let a=(0,u.$C)(i.cwd,{agentDir:g,knownFolders:i.allowedRoots});d.trustFolder=a?{allowed:!1,reason:"trust-too-broad",breadth:a}:(0,u.mT)(i.cwd)?{allowed:!1,reason:"folder-not-fresh"}:{allowed:!0}}}let l=d?.trust?.trusted===!0;try{e=await (0,h.Vq)({agentDir:g,cwd:i?.cwd,projectTrusted:l})}catch(a){console.warn(`[pi-web] cannot read the extensions settings for Settings › MCP: ${y(a)}`)}let{files:m,servers:n}=P({agentDir:g,project:i,internals:k.ok?k:void 0,projectUntrusted:d?.trust?.decision!==!0}),o=m.filter(a=>!a.problems.some(a=>"auto-enable-codemode-invalid"!==a.reason));return{mcp:(b=e?.mcp,(0,h.cu)(j)?{available:!1,reason:"operator-disabled",error:`${h.B6} is set`}:k.ok?b&&!b.enabled?{available:!1,reason:"builtin-disabled",error:"the extensions setting turns builtin:mcp off",...b.settingsPath?{settingsPath:b.settingsPath}:{}}:{available:!0}:{available:!1,reason:"internals-unavailable",error:"Pi Web cannot load the SDK's MCP modules",detail:k.reason}),codemode:await T(g,e?.codemode,i&&l?i.cwd:void 0),files:m,servers:(0,p.Tx)(n,o),...e?.["tool-search"].enabled===!1?{toolSearchDisabled:e["tool-search"].settingsPath?{settingsPath:e["tool-search"].settingsPath}:{}}:{},...d?{project:d}:{},...(c=i?.cwd,(f=(0,p.Ul)(c))?{hostInactive:f}:{})}}d()}catch(a){d(a)}})},80547:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{A$:()=>m,B7:()=>n,mc:()=>l,uK:()=>j.uK,wz:()=>e.wz});var e=c(25252),f=c(82536),g=c(40402),h=c(10879),i=c(12069),j=c(58864),k=a([g,h]);async function l(){let a=Date.now(),b=globalThis.__piAllowedRootsCache;if(b&&b.expiresAt>a)return b.roots;let c=await (0,g.dQ)(),d=new Set;for(let a of c)a.cwd&&d.add((0,e.Nw)(a.cwd)),a.projectRoot&&d.add((0,e.Nw)(a.projectRoot));for(let a of(0,e.HM)())d.add(a);let f=(0,h.ej)();for(let[a,b]of Object.entries(f.projects))(0,i.KV)(f,a)||d.add((0,e.Nw)(b.root));return globalThis.__piAllowedRootsCache={roots:d,expiresAt:a+5e3},d}function m(a,b){return(0,f.o4)(a,b)}function n(a,b){return(0,f.xk)(a,b)}[g,h]=k.then?(await k)():k,d()}catch(a){d(a)}})}};
|
|
1
|
+
"use strict";exports.id=9165,exports.ids=[9165],exports.modules={10879:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{$q:()=>x,Vy:()=>v,bA:()=>y,ej:()=>u,yh:()=>C});var e=c(73024),f=c(76760),g=c(75430),h=c(80974),i=c.n(h),j=c(8102),k=c(63108),l=c(37431),m=c(12069),n=a([g]);g=(n.then?(await n)():n)[0];let z=new Set(["version","revision","sessions","projects","removedProjects","projectOrder","projectNames","__proto__"]),A=Symbol.for("pi-web:session-ui-state-write-queue"),B={realpath:!1,stale:1e4,retries:{retries:10,factor:2,minTimeout:25,maxTimeout:500},onCompromised:a=>{console.warn(`[pi-web] the session UI state lock was compromised: ${a.message}`)}};class C extends Error{constructor(a="Another process holds the session UI state lock"){super(a),this.name="SessionUiStateLockedError"}}function o(){return globalThis.__piWebSessionUiStateCache??={reads:new Map,revisions:new Map}}function p(a,b){let c=o().revisions;b>(c.get(a)??-1)&&c.set(a,b)}function q(a){return structuredClone(a)}function r(a=(0,g.getAgentDir)()){return(0,f.join)(a,"pi-web-session-state.json")}function s(a){let b;try{b=JSON.parse(a)}catch{return{ok:!1}}let c=(0,m.Jx)(b);return c?{ok:!0,state:c,raw:b}:{ok:!1}}function t(a){let b,c;try{b=(0,e.statSync)(a)}catch(c){let b=c?.code;if("ENOENT"===b||"ENOTDIR"===b)return o().reads.delete(a),(0,m.ly)();throw c}let d=o().reads.get(a);if(d&&d.mtimeMs===b.mtimeMs&&d.size===b.size&&d.ino===b.ino)return d.state;let f=(0,l.y)(a,4194304);if(void 0===f)return o().reads.delete(a),(0,m.ly)();let g=s(f);return g.ok?(c=g.state,p(a,c.revision)):(console.warn(`[pi-web] ${a} is not valid session UI state; reading it as empty until the next change sets it aside`),c=(0,m.ly)()),o().reads.set(a,{mtimeMs:b.mtimeMs,size:b.size,ino:b.ino,state:c}),c}function u(a){try{return q(t(a??r()))}catch(a){return console.warn(`[pi-web] could not read the session UI state: ${a instanceof Error?a.message:String(a)}`),(0,m.ly)()}}function v(a){try{return t(a??r()).revision}catch{return null}}function w(a,b){return(0,k.T)(A,a,async()=>{let c;(0,e.mkdirSync)((0,f.dirname)(a),{recursive:!0});try{c=await i().lock(a,B)}catch(a){if("ELOCKED"===a?.code)throw new C;throw a}try{let c,d=o().revisions.get(a)??0,f=(0,l.y)(a,4194304),g={},h=!1;if(void 0===f)c={...(0,m.ly)(),revision:d};else{let b=s(f);if(b.ok)for(let[a,d]of(c=b.state,Object.entries(b.raw)))z.has(a)||(g[a]=d);else{let b=`${a}.corrupt-${Date.now()}`;try{(0,e.renameSync)(a,b),console.warn(`[pi-web] ${a} could not be parsed; moved it to ${b} and started from an empty session UI state`)}catch(b){console.warn(`[pi-web] ${a} could not be parsed and could not be moved aside (${b instanceof Error?b.message:String(b)}); starting from an empty session UI state`)}c={...(0,m.ly)(),revision:d+1},h=!0}}let i=b(c);if(!i.changed&&!h)return q(c);let k={...i.state,version:m.fS,revision:c.revision+ +!!i.changed},n={version:k.version,revision:k.revision,sessions:k.sessions,projects:k.projects,...k.removedProjects&&Object.keys(k.removedProjects).length>0?{removedProjects:k.removedProjects}:{},...k.projectOrder?.length?{projectOrder:k.projectOrder}:{},...k.projectNames&&Object.keys(k.projectNames).length>0?{projectNames:k.projectNames}:{},...g};(0,j.$)(a,JSON.stringify(n,null,2)+"\n"),p(a,k.revision);try{let b=(0,e.statSync)(a);o().reads.set(a,{mtimeMs:b.mtimeMs,size:b.size,ino:b.ino,state:q(k)})}catch{o().reads.delete(a)}return q(k)}finally{try{await c()}catch{}}})}function x(a,b){let c;try{c=b??r()}catch(a){return Promise.reject(a)}return w(c,b=>(0,m.D7)(b,a,Date.now()))}async function y(a,b){let c=b??r(),d=[...new Set(a)];if(0===d.length)return;let e=a=>d.some(b=>Object.prototype.hasOwnProperty.call(a.sessions,b));e(t(c))&&await w(c,a=>{if(!e(a))return{state:a,changed:!1};let b={...a.sessions};for(let a of d)delete b[a];return{state:{...a,sessions:b},changed:!0}})}d()}catch(a){d(a)}})},29165:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Dr:()=>y,Kb:()=>u,X2:()=>t,eD:()=>w,eP:()=>x,ks:()=>v});var e=c(73024),f=c(48161),g=c(76760),h=c(75430),i=c(2650),j=c(80547),k=c(57736),l=c(43084),m=c(49507),n=c(72498),o=c(66544),p=a([h,i,j,k,l,m,n]);function q(a){return a instanceof Error?a.message:String(a)}function r(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function s(a,b,c,d={}){return{status:a,body:{error:c,reason:b,...d}}}function t(a){return r(a)&&"number"==typeof a.status&&r(a.body)}function u(a){let{agentDir:b,project:c,internals:d,scope:e,name:f}=a,g=(0,k.vf)({agentDir:b,project:c,internals:d,scope:e,name:f});return g?void 0!==g.info.invalidError?g.info.invalidError:g.config?{config:g.config,configKey:g.info.configKey}:`MCP server "${f}" cannot be read`:`MCP server "${f}" is not listed`}async function v(a){if("string"!=typeof a||!a.trim()||!(0,g.isAbsolute)(a))return s(400,"cwd-invalid","cwd must be an absolute path");let b=await (0,j.mc)();if(!(0,j.B7)(a,b))return s(403,"cwd-denied","Access denied");let c=(0,g.resolve)(a),d=!1;try{d=(0,e.statSync)(c).isDirectory()}catch{}return d?{cwd:c,allowedRoots:b}:s(400,"cwd-not-directory","cwd must be a directory")}async function w(a){if((0,i.cu)())return s(409,"mcp-off",`${i.B6} is set, so Pi Web ${a}`);let b=await (0,m.U)();return b.ok?b:s(409,"mcp-off",`Pi Web cannot load the SDK's MCP modules: ${b.reason}`)}function x(a,b,c="The project is not trusted, so Pi Web does not start its MCP servers"){try{let d=(0,n.Y1)(a,b);if(void 0!==d.decisionError)return s(409,"trust-unreadable",d.decisionError);if(!0!==d.decision)return s(403,"project-untrusted",c);return}catch(a){return s(409,"trust-unreadable",q(a))}}async function y(a){var b;let c,d;if(!(0,o.EN)(a))return s(403,"request-denied","Untrusted API request");if(!(0,o.E2)(a))return s(415,"content-type","Content-Type must be application/json");try{c=await a.json()}catch{return s(400,"invalid-request","Invalid JSON body")}if(!r(c))return s(400,"invalid-request","Expected a JSON object");let e=(b=c.scope,"global"===b||"project"===b?b:void 0),g="string"==typeof c.name&&c.name.length>0&&c.name.length<=1024?c.name:void 0;if(!e||void 0===g)return s(400,"invalid-request",'scope must be "global" or "project", and name a server name');if(void 0!==c.cwd&&null!==c.cwd){let a=await v(c.cwd);if(t(a))return a;d=a}if("project"===e&&!d)return s(400,"invalid-request","A project server needs the project's cwd");let i=await w("connects no MCP server");if(t(i))return i;let j=(0,h.getAgentDir)();if("project"===e&&d){let a=x(d.cwd,j);if(a)return a}try{let a=(0,k.eS)({agentDir:j,scope:e,name:g,project:d});if(!a.ok){let b={path:a.path,..."server-missing"===a.reason?{name:g}:{}};if("unreadable"===a.reason)return s(500,"internal",a.error,b);return s(409,a.reason,a.error,b)}if(!r(a.value))return s(409,"entry-not-object",`${a.sourcePath} defines MCP server "${g}" as something other than an object`,{name:g});let b=u({agentDir:j,project:d,internals:i,scope:e,name:g});if("string"==typeof b)return s(409,"server-invalid",b,{name:g});let{config:c,configKey:h}=b;if((0,l.tF)(c,i))return s(409,"web-password",`"${g}" references PI_WEB_PASSWORD, so Pi Web does not connect it`,{name:g});return{scope:e,name:g,...d?{project:d}:{},agentDir:j,internals:i,sourcePath:a.sourcePath,configKey:h,config:c,cwd:d?.cwd??(0,f.homedir)()}}catch(a){return s(500,"internal",q(a))}}[h,i,j,k,l,m,n]=p.then?(await p)():p,d()}catch(a){d(a)}})},57736:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{B1:()=>w,Nv:()=>P,UQ:()=>F,Vy:()=>V,Y6:()=>S,Y_:()=>l.Y,eS:()=>R,fz:()=>B,nu:()=>G,q_:()=>U,vN:()=>m.vN,vf:()=>Q});var e=c(73024),f=c(76760),g=c(75430),h=c(2650),i=c(41228),j=c(10674),k=c(76609),l=c(11784),m=c(85825),n=c(3140),o=c(9993),p=c(66479),q=c(43084),r=c(58864),s=c(82536),t=c(49507),u=c(72498),v=a([g,h,i,j,q,t,u]);function w(a){return(0,f.join)(a,"mcp.json")}[g,h,i,j,q,t,u]=v.then?(await v)():v;let V=1048576,W=e.constants.O_RDONLY|(e.constants.O_NONBLOCK||0)|(e.constants.O_NOFOLLOW||0);function x(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function y(a){return a instanceof Error?a.message:String(a)}function z(a){try{return(0,e.realpathSync)(a)}catch{return(0,f.resolve)(a)}}function A(a,b,c){a.problems.push({reason:b,error:c})}function B(a,b){let c;try{c=(0,e.openSync)(a,W);let d=(0,e.fstatSync)(c),f=511&d.mode;if(!d.isFile())return{ok:!1,reason:"not-a-file",error:"not a regular file"};if(void 0===b)return{ok:!0,text:(0,e.readFileSync)(c,"utf8"),mode:f};if(d.size>b)return{ok:!1,reason:"too-large",error:`larger than ${b} bytes`};let g=b+1,h=[],i=0;for(;i<g;){let a=Buffer.alloc(Math.min(g-i,65536)),b=(0,e.readSync)(c,a,0,a.length,null);if(0===b)break;h.push(a.subarray(0,b)),i+=b}if(i>b)return{ok:!1,reason:"too-large",error:`larger than ${b} bytes`};return{ok:!0,text:Buffer.concat(h,i).toString("utf8"),mode:f}}catch(b){let a=b?.code;return{ok:!1,reason:"unreadable",error:y(b),...a?{code:a}:{}}}finally{void 0!==c&&(0,e.closeSync)(c)}}function C(a,b,c){let d=B(a,c);if(b.exists=!0,d.ok)return d.text;A(b,d.reason,d.error)}function D(a){let b,c=w(a),d={scope:"global",path:c,exists:!1,problems:[]};try{b=(0,e.realpathSync)(c)}catch(a){return"ENOENT"!==a?.code&&(d.exists=!0,A(d,"unreadable",y(a))),{info:d}}return(0,r.Eb)(b,(0,f.join)(z(a),"mcp.json"))||(d.realPath=b),{info:d,text:C(b,d,void 0)}}function E(a){try{return(0,e.lstatSync)(a).isSymbolicLink()}catch{return!1}}function F(a,b){let c,d=(0,f.join)(a,g.CONFIG_DIR_NAME,"mcp.json");if((0,s.TU)(d))return{kind:"refused",path:d,reason:"unreadable",error:"the path has a .. segment"};try{c=(0,e.realpathSync)(d)}catch(a){if(E(d))return{kind:"refused",path:d,reason:"link-dangling",error:"a symbolic link to nothing"};if("ENOENT"!==a?.code)return{kind:"refused",path:d,reason:"unreadable",error:y(a)};return{kind:"missing",path:d}}return(0,s.o4)(c,(0,s.qy)(b))?{kind:"found",path:d,realPath:c}:{kind:"refused",path:d,realPath:c,reason:"link-outside",error:"a symbolic link outside the folders Pi Web may read"}}function G(a,b){let c,d=(0,f.join)(a,g.CONFIG_DIR_NAME);if((0,s.TU)(d))return{ok:!1,reason:"unreadable",error:"the path has a .. segment"};try{c=(0,e.realpathSync)(d)}catch(b){if(E(d))return{ok:!1,reason:"link-dangling",error:"a symbolic link to nothing"};if("ENOENT"!==b?.code)return{ok:!1,reason:"unreadable",error:y(b)};try{c=(0,f.join)((0,e.realpathSync)(a),g.CONFIG_DIR_NAME)}catch(a){return{ok:!1,reason:"unreadable",error:y(a)}}}return(0,s.o4)(c,(0,s.qy)(b))?{ok:!0,realPath:(0,f.join)(c,"mcp.json")}:{ok:!1,reason:"link-outside",error:"a symbolic link outside the folders Pi Web may read"}}function H(a,b){let c=F(a,b),d={scope:"project",path:c.path,exists:!1,problems:[]};if("missing"===c.kind)return{info:d};let e=c.realPath;return(void 0===e||(0,r.Eb)(e,(0,f.join)(z(a),g.CONFIG_DIR_NAME,"mcp.json"))||(d.realPath=e),"refused"===c.kind)?(d.exists=!0,A(d,c.reason,c.error),{info:d}):{info:d,text:C(c.realPath,d,V)}}function I(a,b){let c;b=b.replace(/^\uFEFF/,"");try{c=JSON.parse(b)}catch(c){return A(a,"unparsable",(0,l.Y)(c,b)),[]}if(!x(c)||void 0!==c.mcpServers&&!x(c.mcpServers))return A(a,"invalid-shape",'expected an object with an "mcpServers" object'),[];"boolean"==typeof c.autoEnableCodemode?a.autoEnableCodemode=c.autoEnableCodemode:void 0!==c.autoEnableCodemode&&A(a,"auto-enable-codemode-invalid","autoEnableCodemode must be a boolean");let d=Object.entries(x(c.mcpServers)?c.mcpServers:{});return"project"===a.scope&&d.length>200?(A(a,"too-many-servers",`declares ${d.length} servers, more than 200`),[]):d}let X=/\$(?:[$!]|\{([^}]*)\}|([A-Za-z_][A-Za-z0-9_]*))/g,Y=/^[A-Za-z_][A-Za-z0-9_]*$/;function J(a){let b=[];for(let[,c,d]of a.matchAll(X)){let a=void 0!==c?Y.test(c)?c:void 0:d;void 0===a||b.includes(a)||b.push(a)}return b}function K({kind:a,name:b}){return void 0===b?{kind:a}:{kind:a,name:b}}function L(a,b,c,d,{internals:e,authState:f,revealProjectCommands:g}){let h,i=e?.validateMcpServerConfig(a,b),j=x(b)?b:{},l="";try{l=(0,k.U2)(b,i)}catch(b){h=`server "${a}": cannot be read: ${y(b)}`}let m={name:a,scope:c,sourcePath:d,configKey:l,enabled:!1!==j.enabled,validated:void 0!==e,envNames:x(j.env)?Object.keys(j.env):[],headerNames:x(j.headers)?Object.keys(j.headers):[],usesOAuth:!1,commandFields:[],variableReferences:[],masked:!1};"string"==typeof i&&(m.invalidError=i),x(b)||(m.notAnObject=!0);let p=function(a,b){if(b){let{type:b}=a;return"string"==typeof a.url&&(void 0===b||"http"===b||"streamable-http"===b)?"http":"string"==typeof a.command&&(void 0===b||"stdio"===b)?"stdio":void 0}return"url"in a?"http":"command"in a?"stdio":void 0}(j,"string"==typeof i);if(p&&(m.transport=p),void 0!==i&&"string"!=typeof i){m.exposure=i.exposure??"codemode";let a=i.toolExposure?Object.keys(i.toolExposure).length:0;a>0&&(m.toolExposureCount=a)}"string"==typeof j.description&&j.description.trim()&&(m.description=j.description);let r="project"===c&&g;if("string"==typeof j.command){let a=r?{value:j.command,masked:!1}:(0,n.Iq)(j.command);m.command=a.value,m.masked||=a.masked}if(Array.isArray(j.args)){let a=j.args.filter(a=>"string"==typeof a),b=r?{args:a,masked:!1}:(0,n.oF)(a);m.args=b.args,m.masked||=b.masked}if("string"==typeof j.cwd&&(m.cwd=j.cwd),"string"==typeof j.url){let a=(0,n.yP)(j.url);m.url=a.value,m.masked||=a.masked}if("http"===p&&x(j.auth)&&"string"==typeof j.auth.provider&&j.auth.provider&&(m.authProvider=j.auth.provider),m.usesOAuth="http"===p&&!j.auth&&!m.headerNames.some(a=>"authorization"===a.toLowerCase()),m.usesOAuth&&f&&"string"==typeof j.url){let b=function(a,b,c){let d;try{d=(0,o.n_)(b,c)}catch{return}let e=a.get(d.key)??a.get(d.legacyKey);return{signedIn:e?.signedIn??!1,stored:void 0!==e}}(f,a,j.url);b&&(m.signedIn=b.signedIn,m.oauthStateStored=b.stored)}let s=e?a=>e.isCommandConfigValue(a):a=>a.startsWith("!"),t=(0,q.xW)(j);m.commandFields=t.filter(a=>s(a.value)).map(K);let u=e?a=>e.getConfigValueEnvVarNames(a):J;m.variableReferences=t.filter(a=>!s(a.value)).map(a=>({...K(a),variables:u(a.value)})).filter(a=>a.variables.length>0);let v=e?(0,q.tF)(j,e):t.find(a=>a.value.toUpperCase().includes(q.aS));v&&(m.webPasswordField=K(v));let w="url"in j&&!!j.auth,z={info:m,sendsProviderToken:w,value:b,...void 0!==i&&"string"!=typeof i?{config:i}:{}};return void 0!==h?(m.invalidError??=h,{...z,loads:!1}):{...z,loads:e?"string"!=typeof i:x(b)}}function M(a){return`mcp__${a.replace(/-/g,"_")}`}function N(a){let b=new Set;for(let c of a){if(!c.loads||c.info.override)continue;let{info:a}=c,d=[...b].find(b=>b!==a.name&&M(b)===M(a.name));if(void 0!==d){a.invalidError=`server "${a.name}" conflicts with "${d}"`,c.loads=!1;continue}if("project"===a.scope&&c.sendsProviderToken){a.invalidError=`server "${a.name}": auth is only allowed in the global mcp.json`,c.loads=!1;continue}b.add(a.name)}}function O(a){let b={internals:a.internals,authState:function(a){let b=(0,f.join)(a,"mcp-auth.json"),c=new Map;if(!(0,e.existsSync)(b))return c;try{let a=(0,e.readFileSync)(b,"utf8");if(!a.trim())return c;let d=JSON.parse(a);if(!x(d))return c;for(let[a,b]of Object.entries(d))c.set(a,{signedIn:x(b)&&x(b.tokens)&&"string"==typeof b.tokens.access_token});return c}catch{return}}(a.agentDir),revealProjectCommands:!0===a.projectUntrusted},c=[],d=[],g=D(a.agentDir);if(c.push(g.info),void 0!==g.text)for(let[a,c]of I(g.info,g.text))d.push(L(a,c,"global",g.info.path,b));if(a.internals&&N(d),a.project){let e=new Map(d.filter(a=>a.loads).map(a=>[a.info.name,a])),f=H(a.project.cwd,a.project.allowedRoots);if(c.push(f.info),void 0!==f.text)for(let[a,c]of I(f.info,f.text))d.push(x(c)&&(0,m.vN)(c)?function(a,b,c,d,e){let f=m.lW.filter(a=>Object.hasOwn(b,a)),g=(0,m.vR)(a,b,void 0!==c);if(void 0!==g||void 0===c){let c=L(a,b,"project",d,e);return c.info.invalidError=g,c.info.override={keys:f},{...c,loads:!1}}let h={...c.config??(x(c.value)?c.value:{}),...b},i=L(a,h,"project",d,{...e,revealProjectCommands:!1});return i.info.override={keys:f},i}(a,c,e.get(a),f.info.path,b):L(a,c,"project",f.info.path,b));a.internals&&N(d)}let h=d.filter(({info:a,loads:b})=>"project"===a.scope&&b),i=new Set(h.filter(({info:a})=>!a.override).map(({info:a})=>a.name)),j=new Set(h.filter(({info:a})=>a.override).map(({info:a})=>a.name)),k=new Set;for(let{info:a}of d)"global"===a.scope&&(i.has(a.name)&&(a.shadowedByProject=!0,k.add(a.name)),j.has(a.name)&&(a.overriddenByProject=!0));for(let{info:a}of d)"project"===a.scope&&k.has(a.name)&&(a.replacesGlobal=!0);return{files:c,described:d}}function P(a){let{files:b,described:c}=O(a);return{files:b,servers:c.map(({info:a})=>a)}}function Q(a){let b=O(a).described.find(({info:b})=>b.scope===a.scope&&b.name===a.name);if(b)return void 0===b.info.invalidError&&b.config?{info:b.info,config:b.config}:{info:b.info}}function R(a){let{scope:b,name:c,project:d}=a;if("project"===b&&!d)throw Error("a project entry needs the project");let{info:e,text:f}="global"!==b&&d?H(d.cwd,d.allowedRoots):D(a.agentDir),g=void 0===f?[]:I(e,f);for(let a of e.problems)if("auto-enable-codemode-invalid"!==a.reason)return{ok:!1,reason:a.reason,error:a.error,path:e.path};let h=g.find(([a])=>a===c);return h?{ok:!0,value:h[1],sourcePath:e.path}:{ok:!1,reason:"server-missing",error:`${e.path} does not define MCP server "${c}"`,path:e.path}}async function S(a){let b=await (0,t.U)(),{files:c,servers:d}=P({agentDir:a.agentDir,project:{cwd:a.cwd,allowedRoots:a.allowedRoots},internals:b.ok?b:void 0,projectUntrusted:!function(a,b){try{return!0===(0,u.Y1)(a,b).decision}catch{return!1}}(a.cwd,a.agentDir)}),e=c.find(a=>"project"===a.scope);if(!e)throw Error("the project file was not read");return{file:e,servers:d.filter(a=>"project"===a.scope)}}async function T(a,b,c){let d=await (0,h.t1)(),e={sandbox:d.checked?d.available?{state:"available"}:{state:"unavailable",error:d.reason}:{state:"not-checked"},builtinDisabled:b?.enabled===!1};b?.settingsPath&&(e.builtinSettingsPath=b.settingsPath);let f=b?.global??b;f?.enabled===!1&&(e.globalBuiltinSettingsPath=f.settingsPath??(0,j.WD)(a));try{e.preference=await (0,i.wS)((0,j.WD)(a))}catch(a){e.preferenceError=y(a)}let g=void 0===c?void 0:(0,i.Gc)(c);g&&(e.projectOverride=g);try{let b=(0,j.WD)(a),{mode:d,inlineBudget:f}=await (0,i.yH)(b);e.mode={...d,settingsPath:b};let g=void 0===c?void 0:(0,i.Rt)(c);g&&(e.mode.projectOverride=g),e.inlineBudget={...f,settingsPath:b,default:i.lU,max:i.mz};let h=void 0===c?void 0:(0,i.Uf)(c);h&&(e.inlineBudget.projectOverride=h)}catch(a){e.modeError=y(a),e.inlineBudgetError=e.modeError}return e}async function U(a){var b,c;let d,e,f,{agentDir:g,project:i,environment:j=process.env}=a,k=await (0,t.U)();if(i){d={cwd:i.cwd};try{d.trust=(0,u.Y1)(i.cwd,g)}catch(a){d.trustError=y(a)}let a=d.trust;if(a&&!a.requiresTrust&&null===a.decision&&void 0===a.decisionError){let a=(0,u.$C)(i.cwd,{agentDir:g,knownFolders:i.allowedRoots});d.trustFolder=a?{allowed:!1,reason:"trust-too-broad",breadth:a}:(0,u.mT)(i.cwd)?{allowed:!1,reason:"folder-not-fresh"}:{allowed:!0}}}let l=d?.trust?.trusted===!0;try{e=await (0,h.Vq)({agentDir:g,cwd:i?.cwd,projectTrusted:l})}catch(a){console.warn(`[pi-web] cannot read the extensions settings for Settings › MCP: ${y(a)}`)}let{files:m,servers:n}=P({agentDir:g,project:i,internals:k.ok?k:void 0,projectUntrusted:d?.trust?.decision!==!0}),o=m.filter(a=>!a.problems.some(a=>"auto-enable-codemode-invalid"!==a.reason));return{mcp:(b=e?.mcp,(0,h.cu)(j)?{available:!1,reason:"operator-disabled",error:`${h.B6} is set`}:k.ok?b&&!b.enabled?{available:!1,reason:"builtin-disabled",error:"the extensions setting turns builtin:mcp off",...b.settingsPath?{settingsPath:b.settingsPath}:{}}:{available:!0}:{available:!1,reason:"internals-unavailable",error:"Pi Web cannot load the SDK's MCP modules",detail:k.reason}),codemode:await T(g,e?.codemode,i&&l?i.cwd:void 0),files:m,servers:(0,p.Tx)(n,o),...e?.["tool-search"].enabled===!1?{toolSearchDisabled:e["tool-search"].settingsPath?{settingsPath:e["tool-search"].settingsPath}:{}}:{},...d?{project:d}:{},...(c=i?.cwd,(f=(0,p.Ul)(c))?{hostInactive:f}:{})}}d()}catch(a){d(a)}})},80547:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{A$:()=>m,B7:()=>n,mc:()=>l,uK:()=>j.uK,wz:()=>e.wz});var e=c(25252),f=c(82536),g=c(40402),h=c(10879),i=c(12069),j=c(58864),k=a([g,h]);async function l(){let a=Date.now(),b=globalThis.__piAllowedRootsCache;if(b&&b.expiresAt>a)return b.roots;let c=await (0,g.dQ)(),d=new Set;for(let a of c)a.cwd&&d.add((0,e.Nw)(a.cwd)),a.projectRoot&&d.add((0,e.Nw)(a.projectRoot));for(let a of(0,e.HM)())d.add(a);let f=(0,h.ej)();for(let[a,b]of Object.entries(f.projects))(0,i.KV)(f,a)||d.add((0,e.Nw)(b.root));return globalThis.__piAllowedRootsCache={roots:d,expiresAt:a+5e3},d}function m(a,b){return(0,f.o4)(a,b)}function n(a,b){return(0,f.xk)(a,b)}[g,h]=k.then?(await k)():k,d()}catch(a){d(a)}})}};
|